Skip to contentSkip to conversation

mxc nand: Add support for i.MX5

PATCH Superseded Benoît Thébaudeau 8 participants 62 messages Aug 13, 2012 – Jan 8, 2013

Subsystems (4)

v1 of 7 Superseded Latest is v7 →

lore
Share & tools
lore
#0 lore raw

cover mxc nand: Add support for i.MX5

Hi all,

This series aims at adding support for i.MX5 to the mxc nand mtd and spl drivers. It also fixes several issues and cleans up the code a little bit.

Best regards,
Beno?t

#1 lore raw

PATCH 1/13 mxc nand: Merge mtd and spl register definitions

This patches fixes the TODO to use same register definitions in mtd mxc_nand and nand_spl fsl nfc drivers.

---
 .../drivers/mtd/nand/mxc_nand.c                    |  247 ++++----------------
 .../include/fsl_nfc.h                              |   97 ++++----
 .../nand_spl/nand_boot_fsl_nfc.c                   |   58 ++---
 3 files changed, 128 insertions(+), 274 deletions(-)
drivers/mtd/nand/mxc_nand.c +51 -196
index 936186f..9a9260c 100644
@@ -25,168 +25,23 @@
 #if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX35)
 #include <asm/arch/imx-regs.h>
 #endif
+#include <fsl_nfc.h>
 
 #define DRIVER_NAME "mxc_nand"
 
-/*
- * TODO: Use same register defs here as nand_spl mxc nand driver.
- */
-/*
- * Register map and bit definitions for the Freescale NAND Flash Controller
- * present in various i.MX devices.
- *
- * MX31 and MX27 have version 1 which has
- * 	4 512 byte main buffers and
- * 	4 16 byte spare buffers
- * 	to support up to 2K byte pagesize nand.
- * 	Reading or writing a 2K page requires 4 FDI/FDO cycles.
- *
- * MX25 has version 1.1 which has
- * 	8 512 byte main buffers and
- * 	8 64 byte spare buffers
- * 	to support up to 4K byte pagesize nand.
- * 	Reading or writing a 2K or 4K page requires only 1 FDI/FDO cycle.
- *      Also some of registers are moved and/or changed meaning as seen below.
- */
-#if defined(CONFIG_MX31) || defined(CONFIG_MX27)
-#define MXC_NFC_V1
-#elif defined(CONFIG_MX25) || defined(CONFIG_MX35)
-#define MXC_NFC_V1_1
-#else
-#warning "MXC NFC version not defined"
-#endif
-
-#if defined(MXC_NFC_V1)
-#define NAND_MXC_NR_BUFS		4
-#define NAND_MXC_SPARE_BUF_SIZE		16
-#define NAND_MXC_REG_OFFSET		0xe00
-#define is_mxc_nfc_11() 		0
-#elif defined(MXC_NFC_V1_1)
-#define NAND_MXC_NR_BUFS		8
-#define NAND_MXC_SPARE_BUF_SIZE		64
-#define NAND_MXC_REG_OFFSET		0x1e00
-#define is_mxc_nfc_11() 		1
-#else
-#error "define CONFIG_NAND_MXC_VXXX to use mtd mxc nand driver"
-#endif
-struct nfc_regs {
-	uint8_t main_area[NAND_MXC_NR_BUFS][0x200];
-	uint8_t spare_area[NAND_MXC_NR_BUFS][NAND_MXC_SPARE_BUF_SIZE];
-	/*
-	 * reserved size is offset of nfc registers
-	 * minus total main and spare sizes
-	 */
-	uint8_t reserved1[NAND_MXC_REG_OFFSET
-		- NAND_MXC_NR_BUFS * (512 + NAND_MXC_SPARE_BUF_SIZE)];
-#if defined(MXC_NFC_V1)
-	uint16_t nfc_buf_size;
-	uint16_t reserved2;
-	uint16_t nfc_buf_addr;
-	uint16_t nfc_flash_addr;
-	uint16_t nfc_flash_cmd;
-	uint16_t nfc_config;
-	uint16_t nfc_ecc_status_result;
-	uint16_t nfc_rsltmain_area;
-	uint16_t nfc_rsltspare_area;
-	uint16_t nfc_wrprot;
-	uint16_t nfc_unlockstart_blkaddr;
-	uint16_t nfc_unlockend_blkaddr;
-	uint16_t nfc_nf_wrprst;
-	uint16_t nfc_config1;
-	uint16_t nfc_config2;
-#elif defined(MXC_NFC_V1_1)
-	uint16_t reserved2[2];
-	uint16_t nfc_buf_addr;
-	uint16_t nfc_flash_addr;
-	uint16_t nfc_flash_cmd;
-	uint16_t nfc_config;
-	uint16_t nfc_ecc_status_result;
-	uint16_t nfc_ecc_status_result2;
-	uint16_t nfc_spare_area_size;
-	uint16_t nfc_wrprot;
-	uint16_t reserved3[2];
-	uint16_t nfc_nf_wrprst;
-	uint16_t nfc_config1;
-	uint16_t nfc_config2;
-	uint16_t reserved4;
-	uint16_t nfc_unlockstart_blkaddr;
-	uint16_t nfc_unlockend_blkaddr;
-	uint16_t nfc_unlockstart_blkaddr1;
-	uint16_t nfc_unlockend_blkaddr1;
-	uint16_t nfc_unlockstart_blkaddr2;
-	uint16_t nfc_unlockend_blkaddr2;
-	uint16_t nfc_unlockstart_blkaddr3;
-	uint16_t nfc_unlockend_blkaddr3;
-#endif
-};
-
-/*
- * Set INT to 0, FCMD to 1, rest to 0 in NFC_CONFIG2 Register
- * for Command operation
- */
-#define NFC_CMD            0x1
-
-/*
- * Set INT to 0, FADD to 1, rest to 0 in NFC_CONFIG2 Register
- * for Address operation
- */
-#define NFC_ADDR           0x2
-
-/*
- * Set INT to 0, FDI to 1, rest to 0 in NFC_CONFIG2 Register
- * for Input operation
- */
-#define NFC_INPUT          0x4
-
-/*
- * Set INT to 0, FDO to 001, rest to 0 in NFC_CONFIG2 Register
- * for Data Output operation
- */
-#define NFC_OUTPUT         0x8
-
-/*
- * Set INT to 0, FD0 to 010, rest to 0 in NFC_CONFIG2 Register
- * for Read ID operation
- */
-#define NFC_ID             0x10
-
-/*
- * Set INT to 0, FDO to 100, rest to 0 in NFC_CONFIG2 Register
- * for Read Status operation
- */
-#define NFC_STATUS         0x20
-
-/*
- * Set INT to 1, rest to 0 in NFC_CONFIG2 Register for Read
- * Status operation
- */
-#define NFC_INT            0x8000
-
-#ifdef MXC_NFC_V1_1
-#define NFC_4_8N_ECC	(1 << 0)
-#else
-#define NFC_4_8N_ECC	0
-#endif
-#define NFC_SP_EN           (1 << 2)
-#define NFC_ECC_EN          (1 << 3)
-#define NFC_BIG             (1 << 5)
-#define NFC_RST             (1 << 6)
-#define NFC_CE              (1 << 7)
-#define NFC_ONE_CYCLE       (1 << 8)
-
 typedef enum {false, true} bool;
 
 struct mxc_nand_host {
-	struct mtd_info		mtd;
-	struct nand_chip	*nand;
-
-	struct nfc_regs __iomem	*regs;
-	int			spare_only;
-	int			status_request;
-	int			pagesize_2k;
-	int			clk_act;
-	uint16_t		col_addr;
-	unsigned int		page_addr;
+	struct mtd_info			mtd;
+	struct nand_chip		*nand;
+
+	struct fsl_nfc_regs __iomem	*regs;
+	int				spare_only;
+	int				status_request;
+	int				pagesize_2k;
+	int				clk_act;
+	uint16_t			col_addr;
+	unsigned int			page_addr;
 };
 
 static struct mxc_nand_host mxc_host;
@@ -304,10 +159,10 @@ static void wait_op_done(struct mxc_nand_host *host, int max_retries,
 	uint32_t tmp;
 
 	while (max_retries-- > 0) {
-		if (readw(&host->regs->nfc_config2) & NFC_INT) {
-			tmp = readw(&host->regs->nfc_config2);
+		if (readw(&host->regs->config2) & NFC_INT) {
+			tmp = readw(&host->regs->config2);
 			tmp  &= ~NFC_INT;
-			writew(tmp, &host->regs->nfc_config2);
+			writew(tmp, &host->regs->config2);
 			break;
 		}
 		udelay(1);
@@ -326,8 +181,8 @@ static void send_cmd(struct mxc_nand_host *host, uint16_t cmd)
 {
 	MTDDEBUG(MTD_DEBUG_LEVEL3, "send_cmd(host, 0x%x)\n", cmd);
 
-	writew(cmd, &host->regs->nfc_flash_cmd);
-	writew(NFC_CMD, &host->regs->nfc_config2);
+	writew(cmd, &host->regs->flash_cmd);
+	writew(NFC_CMD, &host->regs->config2);
 
 	/* Wait for operation to complete */
 	wait_op_done(host, TROP_US_DELAY, cmd);
@@ -342,8 +197,8 @@ static void send_addr(struct mxc_nand_host *host, uint16_t addr)
 {
 	MTDDEBUG(MTD_DEBUG_LEVEL3, "send_addr(host, 0x%x)\n", addr);
 
-	writew(addr, &host->regs->nfc_flash_addr);
-	writew(NFC_ADDR, &host->regs->nfc_config2);
+	writew(addr, &host->regs->flash_addr);
+	writew(NFC_ADDR, &host->regs->config2);
 
 	/* Wait for operation to complete */
 	wait_op_done(host, TROP_US_DELAY, addr);
@@ -375,19 +230,19 @@ static void send_prog_page(struct mxc_nand_host *host, uint8_t buf_id,
 		}
 	}
 
-	writew(buf_id, &host->regs->nfc_buf_addr);
+	writew(buf_id, &host->regs->buf_addr);
 
 	/* Configure spare or page+spare access */
 	if (!host->pagesize_2k) {
-		uint16_t config1 = readw(&host->regs->nfc_config1);
+		uint16_t config1 = readw(&host->regs->config1);
 		if (spare_only)
 			config1 |= NFC_SP_EN;
 		else
 			config1 &= ~(NFC_SP_EN);
-		writew(config1, &host->regs->nfc_config1);
+		writew(config1, &host->regs->config1);
 	}
 
-	writew(NFC_INPUT, &host->regs->nfc_config2);
+	writew(NFC_INPUT, &host->regs->config2);
 
 	/* Wait for operation to complete */
 	wait_op_done(host, TROP_US_DELAY, spare_only);
@@ -402,19 +257,19 @@ static void send_read_page(struct mxc_nand_host *host, uint8_t buf_id,
 {
 	MTDDEBUG(MTD_DEBUG_LEVEL3, "send_read_page (%d)\n", spare_only);
 
-	writew(buf_id, &host->regs->nfc_buf_addr);
+	writew(buf_id, &host->regs->buf_addr);
 
 	/* Configure spare or page+spare access */
 	if (!host->pagesize_2k) {
-		uint32_t config1 = readw(&host->regs->nfc_config1);
+		uint32_t config1 = readw(&host->regs->config1);
 		if (spare_only)
 			config1 |= NFC_SP_EN;
 		else
 			config1 &= ~NFC_SP_EN;
-		writew(config1, &host->regs->nfc_config1);
+		writew(config1, &host->regs->config1);
 	}
 
-	writew(NFC_OUTPUT, &host->regs->nfc_config2);
+	writew(NFC_OUTPUT, &host->regs->config2);
 
 	/* Wait for operation to complete */
 	wait_op_done(host, TROP_US_DELAY, spare_only);
@@ -442,14 +297,14 @@ static void send_read_id(struct mxc_nand_host *host)
 	uint16_t tmp;
 
 	/* NANDFC buffer 0 is used for device ID output */
-	writew(0x0, &host->regs->nfc_buf_addr);
+	writew(0x0, &host->regs->buf_addr);
 
 	/* Read ID into main buffer */
-	tmp = readw(&host->regs->nfc_config1);
+	tmp = readw(&host->regs->config1);
 	tmp &= ~NFC_SP_EN;
-	writew(tmp, &host->regs->nfc_config1);
+	writew(tmp, &host->regs->config1);
 
-	writew(NFC_ID, &host->regs->nfc_config2);
+	writew(NFC_ID, &host->regs->config2);
 
 	/* Wait for operation to complete */
 	wait_op_done(host, TROP_US_DELAY, 0);
@@ -469,14 +324,14 @@ static uint16_t get_dev_status(struct mxc_nand_host *host)
 	/* store the main area1 first word, later do recovery */
 	store = readl(main_buf);
 	/* NANDFC buffer 1 is used for device status */
-	writew(1, &host->regs->nfc_buf_addr);
+	writew(1, &host->regs->buf_addr);
 
 	/* Read status into main buffer */
-	tmp = readw(&host->regs->nfc_config1);
+	tmp = readw(&host->regs->config1);
 	tmp &= ~NFC_SP_EN;
-	writew(tmp, &host->regs->nfc_config1);
+	writew(tmp, &host->regs->config1);
 
-	writew(NFC_STATUS, &host->regs->nfc_config2);
+	writew(NFC_STATUS, &host->regs->config2);
 
 	/* Wait for operation to complete */
 	wait_op_done(host, TROP_US_DELAY, 0);
@@ -515,13 +370,13 @@ static void _mxc_nand_enable_hwecc(struct mtd_info *mtd, int on)
 {
 	struct nand_chip *nand_chip = mtd->priv;
 	struct mxc_nand_host *host = nand_chip->priv;
-	uint16_t tmp = readw(&host->regs->nfc_config1);
+	uint16_t tmp = readw(&host->regs->config1);
 
 	if (on)
 		tmp |= NFC_ECC_EN;
 	else
 		tmp &= ~NFC_ECC_EN;
-	writew(tmp, &host->regs->nfc_config1);
+	writew(tmp, &host->regs->config1);
 }
 
 static int mxc_nand_read_oob_syndrome(struct mtd_info *mtd,
@@ -799,7 +654,7 @@ static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
 {
 	struct nand_chip *nand_chip = mtd->priv;
 	struct mxc_nand_host *host = nand_chip->priv;
-	uint16_t ecc_status = readw(&host->regs->nfc_ecc_status_result);
+	uint16_t ecc_status = readw(&host->regs->ecc_status_result);
 	int subpages = mtd->writesize / nand_chip->subpagesize;
 	int pg2blk_shift = nand_chip->phys_erase_shift -
 			   nand_chip->page_shift;
@@ -845,7 +700,7 @@ static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
 	 * additional correction.  2-Bit errors cannot be corrected by
 	 * HW ECC, so we need to return failure
 	 */
-	uint16_t ecc_status = readw(&host->regs->nfc_ecc_status_result);
+	uint16_t ecc_status = readw(&host->regs->ecc_status_result);
 
 	if (((ecc_status & 0x3) == 2) || ((ecc_status >> 2) == 2)) {
 		MTDDEBUG(MTD_DEBUG_LEVEL0,
@@ -1289,14 +1144,14 @@ static void mxc_setup_config1(void)
 {
 	uint16_t tmp;
 
-	tmp = readw(&host->regs->nfc_config1);
+	tmp = readw(&host->regs->config1);
 	tmp |= NFC_ONE_CYCLE;
 	tmp |= NFC_4_8N_ECC;
-	writew(tmp, &host->regs->nfc_config1);
+	writew(tmp, &host->regs->config1);
 	if (host->pagesize_2k)
-		writew(64/2, &host->regs->nfc_spare_area_size);
+		writew(64/2, &host->regs->spare_area_size);
 	else
-		writew(16/2, &host->regs->nfc_spare_area_size);
+		writew(16/2, &host->regs->spare_area_size);
 }
 #else
 #define mxc_setup_config1()
@@ -1359,7 +1214,7 @@ int board_nand_init(struct nand_chip *this)
 	this->read_buf = mxc_nand_read_buf;
 	this->verify_buf = mxc_nand_verify_buf;
 
-	host->regs = (struct nfc_regs __iomem *)CONFIG_MXC_NAND_REGS_BASE;
+	host->regs = (struct fsl_nfc_regs __iomem *)CONFIG_MXC_NAND_REGS_BASE;
 	host->clk_act = 1;
 
 #ifdef CONFIG_MXC_NAND_HWECC
@@ -1383,15 +1238,15 @@ int board_nand_init(struct nand_chip *this)
 	host->pagesize_2k = 0;
 
 	this->ecc.size = 512;
-	tmp = readw(&host->regs->nfc_config1);
+	tmp = readw(&host->regs->config1);
 	tmp |= NFC_ECC_EN;
-	writew(tmp, &host->regs->nfc_config1);
+	writew(tmp, &host->regs->config1);
 #else
 	this->ecc.layout = &nand_soft_eccoob;
 	this->ecc.mode = NAND_ECC_SOFT;
-	tmp = readw(&host->regs->nfc_config1);
+	tmp = readw(&host->regs->config1);
 	tmp &= ~NFC_ECC_EN;
-	writew(tmp, &host->regs->nfc_config1);
+	writew(tmp, &host->regs->config1);
 #endif
 	/* Reset NAND */
 	this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
@@ -1400,10 +1255,10 @@ int board_nand_init(struct nand_chip *this)
 	 * preset operation
 	 * Unlock the internal RAM Buffer
 	 */
-	writew(0x2, &host->regs->nfc_config);
+	writew(0x2, &host->regs->config);
 
 	/* Blocks to be unlocked */
-	writew(0x0, &host->regs->nfc_unlockstart_blkaddr);
+	writew(0x0, &host->regs->unlockstart_blkaddr);
 	/* Originally (Freescale LTIB 2.6.21) 0x4000 was written to the
 	 * unlockend_blkaddr, but the magic 0x4000 does not always work
 	 * when writing more than some 32 megabytes (on 2k page nands)
@@ -1415,10 +1270,10 @@ int board_nand_init(struct nand_chip *this)
 	 * This might be NAND chip specific and the i.MX31 datasheet is
 	 * extremely vague about the semantics of this register.
 	 */
-	writew(0xFFFF, &host->regs->nfc_unlockend_blkaddr);
+	writew(0xFFFF, &host->regs->unlockend_blkaddr);
 
 	/* Unlock Block Command for given address range */
-	writew(0x4, &host->regs->nfc_wrprot);
+	writew(0x4, &host->regs->wrprot);
 
 	/* NAND bus width determines access functions used by upper layer */
 	if (is_16bit_nand())
include/fsl_nfc.h +48 -49

138 lines not on this page · raw message

nand_spl/nand_boot_fsl_nfc.c +29 -29

155 lines not on this page · raw message

#2 lore raw

PATCH 1/13 mxc nand: Merge mtd and spl register definitions

Quoted 7 lines · Beno?t Th?baudeau

This patches fixes the TODO to use same register definitions in mtd mxc_nand and nand_spl fsl nfc drivers.

---

Hi Beno?t,

before going deeper in the review there is a general issue.

nand_spl was used in the past and it was the first implementation to have a first loader able to copy u-boot into RAM when the SOC boots from NAND. It is replaced by the general SPL framework. All new implementations must use the new SPL framework, What you see under nand_spl is referred to already supported boards.

With general SPL, we do not have two drivers for NAND, and we are able to boot from other devices, too. So it makes no sense to try to uniform the driver under nand_spl with the main driver, we want to use only the main driver.

Best regards,
Stefano Babic

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
#3 lore raw

PATCH 1/13 mxc nand: Merge mtd and spl register definitions

Hi Stefano,

Quoted 21 lines · Beno?t Th?baudeau
Quoted 8 lines

This patches fixes the TODO to use same register definitions in mtd mxc_nand and
nand_spl fsl nfc drivers.

---

Hi Beno?t,

before going deeper in the review there is a general issue.

nand_spl was used in the past and it was the first implementation to have a first loader able to copy u-boot into RAM when the SOC boots from
NAND. It is replaced by the general SPL framework. All new implementations must use the new SPL framework, What you see under nand_spl is referred to already supported boards.

Quoted 7 lines

With general SPL, we do not have two drivers for NAND, and we are able
to boot from other devices, too. So it makes no sense to try to uniform
the driver under nand_spl with the main driver, we want to use only the
main driver.

Then, I don't know what to do with these patches.

Note that this is not a new implementation, but only an enhancement of the existing one. But I understand your point.

I don't see any i.MX board using the general SPL for NAND. So we can't say that it's usable with the current mtd mxc_nand driver in its current state. Moreover, with the general SPL, I'd be very concerned as to the code size of mxc_nand (the target size of the whole SPL code is only 2 kiB for current i.MX users of nand_spl).

IMHO, we could improve and fix the nand_spl code while it's still there and used. This does not prevent from moving to the general SPL once ready for mxc_nand. These are two different topics.

Best regards,
Beno?t

#4 lore raw

PATCH 1/13 mxc nand: Merge mtd and spl register definitions

Quoted 1 line · Beno?t Th?baudeau

Then, I don't know what to do with these patches.

I see two main points in your patches. You cleanup mxc-nand code and add support for i.MX5. This is one topic, and it can go on.

Quoted 3 lines

Note that this is not a new implementation, but only an enhancement of the existing one. But I understand your point.

;-)

Quoted 2 lines

I don't see any i.MX board using the general SPL for NAND.

At least the MX28, and using nand_spl with MX28 was rejected for the same reason when it was pushed. Then it was switched to SPL.

But surely it should be better to have more examples - I am working to get a MX35 booting from external SD, and using the SPL.

Quoted 5 lines

So we can't say that
it's usable with the current mtd mxc_nand driver in its current state. Moreover, with the general SPL, I'd be very concerned as to the code size of mxc_nand (the target size of the whole SPL code is only 2 kiB for current i.MX users of nand_spl).

Mainly because the restriction came from the original implementation, that was for PowerPC 4xx with only a small buffer (NFC buffer) to copy data from NAND.

We have currently only two boards supporting this mechanismus, using MX25 (karo tx25) and MX31. Both MX25 and MX31 have an internal RAM (128KB) that is is suitable for installing the SPL. Note that TI SOCs have less RAM available, and they support SPL.

IMHO the fact that only two IMX boards are using this mechanism (nand_spl) is also due the fact that is not very flexible. And moving to SPL we are not fixed to boot exclusively from NAND,

Quoted 3 lines

IMHO, we could improve and fix the nand_spl code while it's still there and used.

However, as you say, if the code is still available, this makes people think that is the correct way to do and we will have two distinct implementation (the old one and the new one), both to be supported.

Not to forget that the SPL is thought to work with different SOCs, even if currently it is mainly used by TI, and with different media storage. All features taht we discussed previously in the ML if we had to add them to nand_spl, before the new implementation was pushed.

Quoted 2 lines

This does not prevent from moving to the general SPL once ready for mxc_nand. These are two different topics.

The fact is it will be nice if also the two supported boards will move to SPL. Of couse, we cannot break these boards, but a move will be more difficult if we increase the number of boards using nand_spl.

Best regards,
Stefano Babic

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
#5 lore raw

PATCH 1/13 mxc nand: Merge mtd and spl register definitions

Hi Stefano,

Quoted 6 lines · Beno?t Th?baudeau
Quoted 1 line

Then, I don't know what to do with these patches.

I see two main points in your patches. You cleanup mxc-nand code and add
support for i.MX5. This is one topic, and it can go on.

OK, but then do you want to keep the register definitions inside mxc_nand?

Quoted 11 lines
Quoted 3 lines

Note that this is not a new implementation, but only an enhancement of the
existing one. But I understand your point.

;-)

Quoted 2 lines

I don't see any i.MX board using the general SPL for NAND.

At least the MX28, and using nand_spl with MX28 was rejected for the same reason when it was pushed. Then it was switched to SPL.

OK. But I meant MXC. MXS does not use the same NAND driver.

Quoted 3 lines

But surely it should be better to have more examples - I am working to
get a MX35 booting from external SD, and using the SPL.

Great! Having mxc_nand examples would be great too.

Quoted 14 lines
Quoted 8 lines

So we can't say that
it's usable with the current mtd mxc_nand driver in its current state. Moreover,
with the general SPL, I'd be very concerned as to the code size of mxc_nand (the
target size of the whole SPL code is only 2 kiB for current i.MX users of
nand_spl).

Mainly because the restriction came from the original implementation, that was for PowerPC 4xx with only a small buffer (NFC buffer) to copy
data from NAND.

Quoted 4 lines

We have currently only two boards supporting this mechanismus, using MX25 (karo tx25) and MX31. Both MX25 and MX31 have an internal RAM (128KB) that is is suitable for installing the SPL. Note that TI SOCs have less RAM available, and they support SPL.

The available RAM size is not the issue. i.MX boards using nand_spl can use internal or external RAM. The issue comes from the i.MX ROM bootloader that only uses the NFC buffer. On i.MX31, that means max 2 kiB for SPL, and 4 kiB on i.MX25/35/51. What can be done on the latter if using internal boot (with DCD header) is to use at most one NF block (more is not possible because the i.MX bootloader goes back to serial mode if any bad block is found, and one of the 1st or 2nd block has to be good).

Quoted 4 lines

IMHO the fact that only two IMX boards are using this mechanism (nand_spl) is also due the fact that is not very flexible. And moving to
SPL we are not fixed to boot exclusively from NAND,

Sure.

Quoted 8 lines
Quoted 3 lines

IMHO, we could improve and fix the nand_spl code while it's still there and
used.

However, as you say, if the code is still available, this makes people
think that is the correct way to do and we will have two distinct implementation (the old one and the new one), both to be supported.

Right.

Quoted 6 lines

Not to forget that the SPL is thought to work with different SOCs, even
if currently it is mainly used by TI, and with different media storage.
All features taht we discussed previously in the ML if we had to add them to nand_spl, before the new implementation was pushed.

OK.

Quoted 6 lines
Quoted 2 lines

This does not prevent from moving to the general SPL once ready for mxc_nand. These are two different topics.

The fact is it will be nice if also the two supported boards will move
to SPL.

Sure, but I don't have time to do that.

Quoted 1 line

Of couse, we cannot break these boards,

They're already broken with the current nand_spl. See my 07/13.

Quoted 3 lines

but a move will be
more
difficult if we increase the number of boards using nand_spl.

Sure, but my series does not add new boards.

Just tell me what to do. I don't have time to port nand_spl boards to general SPL. The only thing I may find time for is to refactor the series in an acceptable way for you.

Best regards,
Beno?t

#6 lore raw

PATCH 1/13 mxc nand: Merge mtd and spl register definitions

Quoted 2 lines · Beno?t Th?baudeau

Hi Stefano,

Hi Beno?t,

Quoted 5 lines
Quoted 4 lines

We have currently only two boards supporting this mechanismus, using MX25 (karo tx25) and MX31. Both MX25 and MX31 have an internal RAM (128KB) that is is suitable for installing the SPL. Note that TI SOCs have less RAM available, and they support SPL.

Quoted 7 lines

The available RAM size is not the issue. i.MX boards using nand_spl can use internal or external RAM. The issue comes from the i.MX ROM bootloader that only uses the NFC buffer. On i.MX31, that means max 2 kiB for SPL, and 4 kiB on i.MX25/35/51. What can be done on the latter if using internal boot (with DCD header) is to use at most one NF block (more is not possible because the i.MX bootloader goes back to serial mode if any bad block is found, and one of the 1st or 2nd block has to be good).

We are both a little off-topic here, but because we are reading probably the same part of the manuals I would like to clear this point.

What you are saying is not exactly what I read from the manual - I checked it now in mx35, I will take a look also on the other ones.

In 7.4.1.6 NAND Flash Boot Operation, I read:

"1. On device power-on, the boot ROM copies the first 4 Kbytes of boot code from the NAND Flash to the NFC buffer."

So this correspond to your statement - and DCD tables go into NFC buffer. DCD table must be smaller as 4KB, but this is always the case.

"2. ROM code checks the first 4 Kbytes of boot data copied in step 1 above.
a) If no ECC error, then DCD is verified.
? If DCD verification is successful, then the rest of the boot code image is copied to destination RAM (internal RAM or SDRAM) and secure boot is performed."

I understand this part as the mx35 goes on to copy the whole image, depending on the size set into the header, to the address specified in the table itself. There is no limitation. Exactly in the same way it works on i.MX5 (I know, this does not mean nothing, but..)

I think the limitation of 2KB or 4KB is not correct and is valid only for the DCD data. Do you agree ?

Quoted 5 lines
Quoted 2 lines

Of couse, we cannot break these boards,

They're already broken with the current nand_spl. See my 07/13.

Mmmhh...a bug is a bug, and should be fixed, I agree with you on this point.

Quoted 5 lines
Quoted 3 lines

but a move will be
more
difficult if we increase the number of boards using nand_spl.

Sure, but my series does not add new boards.

Right. Maybe I was expecting a new patch series from you adding a new board, because I thought you have a "use case" for i.MX5, (that means, support for NAND in i.MX5). In other words, a new board based on nand_spl will be not accepted.

But again, fixing current issues is another thing. I will go on on to review the rest of patches (I admit I skip the rest of nand_spl related patches).

Quoted 3 lines

Just tell me what to do. I don't have time to port nand_spl boards to general SPL. The only thing I may find time for is to refactor the series in an acceptable way for you.

You convinced me that you are fixing current issues in already supported boards - then it is fine with me to go on with this patchset.

Best regards,
Stefano

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
#7 lore raw

PATCH 1/13 mxc nand: Merge mtd and spl register definitions

Hi Stefano,

Quoted 27 lines · Beno?t Th?baudeau
Quoted 2 lines

Hi Stefano,

Hi Beno?t,

Quoted 7 lines
Quoted 6 lines

We have currently only two boards supporting this mechanismus, using
MX25 (karo tx25) and MX31. Both MX25 and MX31 have an internal RAM (128KB) that is is suitable for installing the SPL. Note that TI SOCs
have less RAM available, and they support SPL.

Quoted 13 lines

The available RAM size is not the issue. i.MX boards using nand_spl can use
internal or external RAM. The issue comes from the i.MX ROM bootloader that only
uses the NFC buffer. On i.MX31, that means max 2 kiB for SPL, and 4 kiB on
i.MX25/35/51. What can be done on the latter if using internal boot (with DCD
header) is to use at most one NF block (more is not possible because the i.MX
bootloader goes back to serial mode if any bad block is found, and one of the
1st or 2nd block has to be good).

Quoted 3 lines

We are both a little off-topic here, but because we are reading probably
the same part of the manuals I would like to clear this point.

OK.

Quoted 5 lines

What you are saying is not exactly what I read from the manual - I checked it now in mx35, I will take a look also on the other ones.

In 7.4.1.6 NAND Flash Boot Operation, I read:

Quoted 7 lines

"1. On device power-on, the boot ROM copies the first 4 Kbytes of boot
code from the NAND Flash to the NFC buffer."

So this correspond to your statement - and DCD tables go into NFC buffer. DCD table must be smaller as 4KB, but this is always the case.

Indeed.

Quoted 7 lines

"2. ROM code checks the first 4 Kbytes of boot data copied in step 1 above.
a) If no ECC error, then DCD is verified.
? If DCD verification is successful, then the rest of the boot code image is copied to destination RAM (internal RAM or SDRAM) and secure boot is performed."

Quoted 8 lines

I understand this part as the mx35 goes on to copy the whole image, depending on the size set into the header, to the address specified in
the table itself. There is no limitation. Exactly in the same way it works on i.MX5 (I know, this does not mean nothing, but..)

I think the limitation of 2KB or 4KB is not correct and is valid only for the DCD data. Do you agree ?

No, it's way more complicated than that.

First, there various boot modes available depending on the device for NAND:
i.MX31: external only
i.MX25 and i.MX35: internal or external
i.MX51: internal only

External means that the NFC buffer is filled from NAND and executed without any DCD or flash header. The limit is 2 kiB on i.MX31. On i.MX25 and i.MX35, it is not clear from the RMs if only a single NF page is read, or if the NFC buffer is fully filled (4 kiB). This is the use case for mx31pdk and tx25.

Internal means that 4 kiB are read from NF. If this fails from the 1st block, it is retried with the 2nd block. If it fails again, boot is aborted. If it succeeds, DCD and Flash headers are checked and executed. The behavior of the ROM bootloader while loading the image indicated by the headers is not clear from the RMs in case of bad blocks, so I asked FSL support which told me that as soon as a bad block is found, the boot is aborted. This means that an SPL is required for NAND boot to be reliable, even with internal boot. This also means that this SPL can not be larger than a single block.

Quoted 7 lines
Quoted 4 lines
Quoted 1 line

Of couse, we cannot break these boards,

They're already broken with the current nand_spl. See my 07/13.

Mmmhh...a bug is a bug, and should be fixed, I agree with you on this point.

OK.

Quoted 11 lines
Quoted 5 lines
Quoted 3 lines

but a move will be
more
difficult if we increase the number of boards using nand_spl.

Sure, but my series does not add new boards.

Right. Maybe I was expecting a new patch series from you adding a new board, because I thought you have a "use case" for i.MX5, (that means,
support for NAND in i.MX5). In other words, a new board based on nand_spl will be not accepted.

I indeed have such boards supported locally, but they are not yet ready for upstream, and I did not intend to post patches for them before the other i.MX nand_spl boards have moved to generic SPL.

Quoted 4 lines

But again, fixing current issues is another thing. I will go on on to review the rest of patches (I admit I skip the rest of nand_spl related
patches).

OK.

Quoted 9 lines
Quoted 5 lines

Just tell me what to do. I don't have time to port nand_spl boards to general
SPL. The only thing I may find time for is to refactor the series in an
acceptable way for you.

You convinced me that you are fixing current issues in already supported
boards - then it is fine with me to go on with this patchset.

Great.

Best regards,
Beno?t

#8 lore raw

PATCH 1/13 mxc nand: Merge mtd and spl register definitions

Hi Stefano,

Quoted 75 lines · Beno?t Th?baudeau

Hi Stefano,

Quoted 32 lines · Beno?t Th?baudeau
Quoted 2 lines

Hi Stefano,

Hi Beno?t,

Quoted 17 lines
Quoted 7 lines

We have currently only two boards supporting this mechanismus, using
MX25 (karo tx25) and MX31. Both MX25 and MX31 have an internal RAM
(128KB) that is is suitable for installing the SPL. Note that TI SOCs
have less RAM available, and they support SPL.

The available RAM size is not the issue. i.MX boards using nand_spl
can use
internal or external RAM. The issue comes from the i.MX ROM bootloader that only
uses the NFC buffer. On i.MX31, that means max 2 kiB for SPL, and 4
kiB on
i.MX25/35/51. What can be done on the latter if using internal

Quoted 8 lines

boot
(with DCD
header) is to use at most one NF block (more is not possible because the i.MX
bootloader goes back to serial mode if any bad block is found, and
one of the
1st or 2nd block has to be good).

Quoted 3 lines

We are both a little off-topic here, but because we are reading probably
the same part of the manuals I would like to clear this point.

OK.

Quoted 5 lines

What you are saying is not exactly what I read from the manual - I checked it now in mx35, I will take a look also on the other ones.

In 7.4.1.6 NAND Flash Boot Operation, I read:

Quoted 7 lines

"1. On device power-on, the boot ROM copies the first 4 Kbytes of boot
code from the NAND Flash to the NFC buffer."

So this correspond to your statement - and DCD tables go into NFC buffer. DCD table must be smaller as 4KB, but this is always the case.

Indeed.

Quoted 16 lines

"2. ROM code checks the first 4 Kbytes of boot data copied in step 1
above.
a) If no ECC error, then DCD is verified.
? If DCD verification is successful, then the rest of the boot code image is copied to destination RAM (internal RAM or SDRAM) and secure
boot is performed."

I understand this part as the mx35 goes on to copy the whole image, depending on the size set into the header, to the address specified in
the table itself. There is no limitation. Exactly in the same way it
works on i.MX5 (I know, this does not mean nothing, but..)

Quoted 3 lines

I think the limitation of 2KB or 4KB is not correct and is valid only
for the DCD data. Do you agree ?

Quoted 5 lines

No, it's way more complicated than that.

First, there various boot modes available depending on the device for NAND:
i.MX31: external only

Note that internal NAND Flash boot is also mentioned in the RM, but without further details. FSL should be contacted to know more. But the RM refers to secure boot and HAB, so it's probably something close to the internal boot modes of i.MX25 and i.MX35. Anyway, it does not seem to be used by U-Boot i.MX31 boards.

Quoted 10 lines

i.MX25 and i.MX35: internal or external
i.MX51: internal only

External means that the NFC buffer is filled from NAND and executed without any
DCD or flash header. The limit is 2 kiB on i.MX31. On i.MX25 and i.MX35, it is
not clear from the RMs if only a single NF page is read, or if the NFC buffer is
fully filled (4 kiB). This is the use case for mx31pdk and tx25.

The details about external NF boot are in the NFC chapter of the RMs. For i.MX31, it's perfectly clear: The whole 2-kiB NFC buffer is filled whether the NF pages are 512-B or 2-kiB. For i.MX25 and i.MX35, it's more difficult to find the details, but I interpret the RMs as meaning that the whole 4-kiB NFC buffer is filled whatever the NF page sizes. In both cases, the code is run from the NFC buffer, so that the SPL size cannot exceed 2 kiB for mx31pdk, and 4 kiB for tx25.

Quoted 7 lines

Internal means that 4 kiB are read from NF. If this fails from the 1st block, it
is retried with the 2nd block. If it fails again, boot is aborted. If it
succeeds, DCD and Flash headers are checked and executed. The behavior of the
ROM bootloader while loading the image indicated by the headers is

Quoted 8 lines

not clear
from the RMs in case of bad blocks, so I asked FSL support which told me that
as soon as a bad block is found, the boot is aborted. This means that an SPL is
required for NAND boot to be reliable, even with internal boot. This also means
that this SPL can not be larger than a single block.

Best regards,
Beno?t

#9 lore raw

PATCH 1/13 mxc nand: Merge mtd and spl register definitions

Quoted 1 line · Beno?t Th?baudeau

Hi Stefano,

Hi Beno?t,

Quoted 11 lines
Quoted 11 lines
Quoted 10 lines

I understand this part as the mx35 goes on to copy the whole image, depending on the size set into the header, to the address specified in
the table itself. There is no limitation. Exactly in the same way it
works on i.MX5 (I know, this does not mean nothing, but..)

I think the limitation of 2KB or 4KB is not correct and is valid only
for the DCD data. Do you agree ?

Quoted 8 lines
Quoted 5 lines

No, it's way more complicated than that.

First, there various boot modes available depending on the device for NAND:
i.MX31: external only

Note that internal NAND Flash boot is also mentioned in the RM, but without further details.

I know - thanks for sharing your information.

Quoted 5 lines

FSL should be contacted to know more. But the RM refers to
secure boot and HAB, so it's probably something close to the internal boot modes of i.MX25 and i.MX35.
Anyway, it does not seem to be used by U-Boot i.MX31
boards.

I have the same feeling.

Quoted 7 lines

The details about external NF boot are in the NFC chapter of the RMs. For i.MX31, it's perfectly clear: The whole 2-kiB NFC buffer is filled whether the NF pages are 512-B or 2-kiB. For i.MX25 and i.MX35, it's more difficult to find the details, but I interpret the RMs as meaning that the whole 4-kiB NFC buffer is filled whatever the NF page sizes. In both cases, the code is run from the NFC buffer, so that the SPL size cannot exceed 2 kiB for mx31pdk, and 4 kiB for tx25.

I have the same interpretation - for this reason it was interesting for me to understand the behavior with internal boot, where I can set the size of the whole image in the imx header.

However, if the boot stops after a bad block is found instead of skipping it and reading the next one, it seems to me that this feature cannot be really used. It will be also interesting to know if the behavior is the same also for the newer i.MX, I mean MX5 and MX6.

Quoted 17 lines
Quoted 6 lines

Internal means that 4 kiB are read from NF. If this fails from the 1st block, it
is retried with the 2nd block. If it fails again, boot is aborted. If it
succeeds, DCD and Flash headers are checked and executed.

The

Quoted 10 lines

behavior of the
ROM bootloader while loading the image indicated by the headers is not clear
from the RMs in case of bad blocks, so I asked FSL support which told me that
as soon as a bad block is found, the boot is aborted. This means that an SPL is
required for NAND boot to be reliable, even with internal boot. This also means
that this SPL can not be larger than a single block.

The other way that a project can take is to use SLC NAND (or in any case, NAND where is guaranted that the first sector cannot be bad). A hard limitation, anyway.

Best regards,
Stefano

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
#10 lore raw

PATCH 1/13 mxc nand: Merge mtd and spl register definitions

In reply to Stefano Babic
Quoted 19 lines · Stefano Babic
Quoted 7 lines · Beno?t Th?baudeau

This patches fixes the TODO to use same register definitions in mtd mxc_nand and nand_spl fsl nfc drivers.

---

Hi Beno?t,

before going deeper in the review there is a general issue.

nand_spl was used in the past and it was the first implementation to have a first loader able to copy u-boot into RAM when the SOC boots from NAND. It is replaced by the general SPL framework. All new implementations must use the new SPL framework, What you see under nand_spl is referred to already supported boards.

Quoted 4 lines

With general SPL, we do not have two drivers for NAND, and we are able to boot from other devices, too. So it makes no sense to try to uniform the driver under nand_spl with the main driver, we want to use only the main driver.

It is not true that new-SPL will always have one uniform NAND driver, nor is it true that nand_spl always has separate NAND drivers (it always has a separate NAND subsystem, but the basic nand_spl/nand_boot.c does use the standard device-specific driver).

It depends on space constraints of the target, and how big the standard device-specific driver is. With Wolfgang's mandate that no new boards be added to nand_spl, we're going to have to support boards with a small buffer for NAND booting in new SPL (even if it turns out this isn't one of them). It's not just 4xx; Freescale PPC chips are like this too, including some that have not yet had NAND boot support added to mainline U-Boot and thus can't use nand_spl.

-Scott

#11 lore raw

PATCH 2/13 mxc nand: cosmectic: Light cleanup

In reply to Benoît Thébaudeau
---
 .../drivers/mtd/nand/mxc_nand.c                    |    9 +++------
 .../include/fsl_nfc.h                              |    1 +
 .../nand_spl/nand_boot_fsl_nfc.c                   |   14 +++++++-------
 3 files changed, 11 insertions(+), 13 deletions(-)
drivers/mtd/nand/mxc_nand.c +3 -6
index 9a9260c..62d8c6b 100644
@@ -123,8 +123,7 @@ static int is_16bit_nand(void)
 #elif defined(CONFIG_MX25) || defined(CONFIG_MX35)
 static int is_16bit_nand(void)
 {
-	struct ccm_regs *ccm =
-		(struct ccm_regs *)IMX_CCM_BASE;
+	struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE;
 
 	if (readl(&ccm->rcsr) & CCM_RCSR_NF_16BIT_SEL)
 		return 1;
@@ -238,7 +237,7 @@ static void send_prog_page(struct mxc_nand_host *host, uint8_t buf_id,
 		if (spare_only)
 			config1 |= NFC_SP_EN;
 		else
-			config1 &= ~(NFC_SP_EN);
+			config1 &= ~NFC_SP_EN;
 		writew(config1, &host->regs->config1);
 	}
 
@@ -687,7 +686,6 @@ static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
 #define mxc_nand_write_page_syndrome NULL
 #define mxc_nand_write_page_raw_syndrome NULL
 #define mxc_nand_write_oob_syndrome NULL
-#define mxc_nfc_11_nand_correct_data NULL
 
 static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
 				 u_char *read_ecc, u_char *calc_ecc)
@@ -1188,7 +1186,6 @@ int board_nand_init(struct nand_chip *this)
 {
 	struct mtd_info *mtd;
 	uint16_t tmp;
-	int err = 0;
 
 #ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
 	this->options |= NAND_USE_FLASH_BBT;
@@ -1287,5 +1284,5 @@ int board_nand_init(struct nand_chip *this)
 	this->ecc.layout = &nand_hw_eccoob;
 #endif
 	mxc_setup_config1();
-	return err;
+	return 0;
 }
include/fsl_nfc.h +1 -0
index 6691e41..1c16c71 100644
@@ -166,5 +166,6 @@ struct fsl_nfc_regs {
 #define NFC_RST		(1 << 6)
 #define NFC_CE		(1 << 7)
 #define NFC_ONE_CYCLE	(1 << 8)
+#define NFC_FP_INT	(1 << 11)
 
 #endif /* __FSL_NFC_H */
nand_spl/nand_boot_fsl_nfc.c +7 -7
index f437deb..b90f93e 100644
@@ -45,10 +45,10 @@ static void nfc_wait_ready(void)
 	writew(tmp, &nfc->config2);
 }
 
-void nfc_nand_init(void)
+static void nfc_nand_init(void)
 {
 #if defined(MXC_NFC_V1_1)
-	int ecc_per_page  = CONFIG_SYS_NAND_PAGE_SIZE / 512;
+	int ecc_per_page = CONFIG_SYS_NAND_PAGE_SIZE / 512;
 	int config1;
 
 	writew(CONFIG_SYS_NAND_SPARE_SIZE / 2, &nfc->spare_area_size);
@@ -57,12 +57,12 @@ void nfc_nand_init(void)
 	writew(0x2, &nfc->config);
 
 	/* hardware ECC checking and correct */
-	config1 = readw(&nfc->config1) | NFC_ECC_EN | 0x800;
+	config1 = readw(&nfc->config1) | NFC_ECC_EN | NFC_FP_INT;
 	/*
 	 * if spare size is larger that 16 bytes per 512 byte hunk
 	 * then use 8 symbol correction instead of 4
 	 */
-	if ((CONFIG_SYS_NAND_SPARE_SIZE / ecc_per_page) > 16)
+	if (CONFIG_SYS_NAND_SPARE_SIZE / ecc_per_page > 16)
 		config1 &= ~NFC_4_8N_ECC;
 	else
 		config1 |= NFC_4_8N_ECC;
@@ -133,7 +133,7 @@ static void nfc_nand_data_output(void)
 	 * This NAND controller requires multiple input commands
 	 * for pages larger than 512 bytes.
 	 */
-	for (i = 1; i < (CONFIG_SYS_NAND_PAGE_SIZE / 512); i++) {
+	for (i = 1; i < CONFIG_SYS_NAND_PAGE_SIZE / 512; i++) {
 		config1 = readw(&nfc->config1);
 		config1 |= NFC_ECC_EN | NFC_INT_MSK;
 		writew(config1, &nfc->config1);
@@ -171,7 +171,7 @@ static int nfc_read_page(unsigned int page_address, unsigned char *buf)
 	dst = (u32 *)buf;
 
 	/* main copy loop from NAND-buffer to SDRAM memory */
-	for (i = 0; i < (CONFIG_SYS_NAND_PAGE_SIZE / 4); i++) {
+	for (i = 0; i < CONFIG_SYS_NAND_PAGE_SIZE / 4; i++) {
 		writel(readl(src), dst);
 		src++;
 		dst++;
@@ -230,7 +230,7 @@ static int nand_load(unsigned int from, unsigned int size, unsigned char *buf)
 	page = from / CONFIG_SYS_NAND_PAGE_SIZE;
 	i = 0;
 
-	while (i < (size / CONFIG_SYS_NAND_PAGE_SIZE)) {
+	while (i < size / CONFIG_SYS_NAND_PAGE_SIZE) {
 		if (nfc_read_page(page, buf) < 0)
 			return -1;
 
#12 lore raw

PATCH 2/13 mxc nand: cosmectic: Light cleanup

Quoted 118 lines · Beno?t Th?baudeau
---
 .../drivers/mtd/nand/mxc_nand.c                    |    9 +++------
 .../include/fsl_nfc.h                              |    1 +
 .../nand_spl/nand_boot_fsl_nfc.c                   |   14 +++++++-------
 3 files changed, 11 insertions(+), 13 deletions(-)
drivers/mtd/nand/mxc_nand.c +3 -6
index 9a9260c..62d8c6b 100644
@@ -123,8 +123,7 @@ static int is_16bit_nand(void)
 #elif defined(CONFIG_MX25) || defined(CONFIG_MX35)
 static int is_16bit_nand(void)
 {
-	struct ccm_regs *ccm =
-		(struct ccm_regs *)IMX_CCM_BASE;
+	struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE;
 
 	if (readl(&ccm->rcsr) & CCM_RCSR_NF_16BIT_SEL)
 		return 1;
@@ -238,7 +237,7 @@ static void send_prog_page(struct mxc_nand_host *host, uint8_t buf_id,
 		if (spare_only)
 			config1 |= NFC_SP_EN;
 		else
-			config1 &= ~(NFC_SP_EN);
+			config1 &= ~NFC_SP_EN;
 		writew(config1, &host->regs->config1);
 	}
 
@@ -687,7 +686,6 @@ static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
 #define mxc_nand_write_page_syndrome NULL
 #define mxc_nand_write_page_raw_syndrome NULL
 #define mxc_nand_write_oob_syndrome NULL
-#define mxc_nfc_11_nand_correct_data NULL
 
 static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
 				 u_char *read_ecc, u_char *calc_ecc)
@@ -1188,7 +1186,6 @@ int board_nand_init(struct nand_chip *this)
 {
 	struct mtd_info *mtd;
 	uint16_t tmp;
-	int err = 0;
 
 #ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
 	this->options |= NAND_USE_FLASH_BBT;
@@ -1287,5 +1284,5 @@ int board_nand_init(struct nand_chip *this)
 	this->ecc.layout = &nand_hw_eccoob;
 #endif
 	mxc_setup_config1();
-	return err;
+	return 0;
 }
include/fsl_nfc.h +1 -0
index 6691e41..1c16c71 100644
@@ -166,5 +166,6 @@ struct fsl_nfc_regs {
 #define NFC_RST		(1 << 6)
 #define NFC_CE		(1 << 7)
 #define NFC_ONE_CYCLE	(1 << 8)
+#define NFC_FP_INT	(1 << 11)
 
 #endif /* __FSL_NFC_H */
nand_spl/nand_boot_fsl_nfc.c +6 -6
index f437deb..b90f93e 100644
@@ -45,10 +45,10 @@ static void nfc_wait_ready(void)
 	writew(tmp, &nfc->config2);
 }
 
-void nfc_nand_init(void)
+static void nfc_nand_init(void)
 {
 #if defined(MXC_NFC_V1_1)
-	int ecc_per_page  = CONFIG_SYS_NAND_PAGE_SIZE / 512;
+	int ecc_per_page = CONFIG_SYS_NAND_PAGE_SIZE / 512;
 	int config1;
 
 	writew(CONFIG_SYS_NAND_SPARE_SIZE / 2, &nfc->spare_area_size);
@@ -57,12 +57,12 @@ void nfc_nand_init(void)
 	writew(0x2, &nfc->config);
 
 	/* hardware ECC checking and correct */
-	config1 = readw(&nfc->config1) | NFC_ECC_EN | 0x800;
+	config1 = readw(&nfc->config1) | NFC_ECC_EN | NFC_FP_INT;
 	/*
 	 * if spare size is larger that 16 bytes per 512 byte hunk
 	 * then use 8 symbol correction instead of 4
 	 */
-	if ((CONFIG_SYS_NAND_SPARE_SIZE / ecc_per_page) > 16)
+	if (CONFIG_SYS_NAND_SPARE_SIZE / ecc_per_page > 16)
 		config1 &= ~NFC_4_8N_ECC;
 	else
 		config1 |= NFC_4_8N_ECC;
@@ -133,7 +133,7 @@ static void nfc_nand_data_output(void)
 	 * This NAND controller requires multiple input commands
 	 * for pages larger than 512 bytes.
 	 */
-	for (i = 1; i < (CONFIG_SYS_NAND_PAGE_SIZE / 512); i++) {
+	for (i = 1; i < CONFIG_SYS_NAND_PAGE_SIZE / 512; i++) {
 		config1 = readw(&nfc->config1);
 		config1 |= NFC_ECC_EN | NFC_INT_MSK;
 		writew(config1, &nfc->config1);
@@ -171,7 +171,7 @@ static int nfc_read_page(unsigned int page_address, unsigned char *buf)
 	dst = (u32 *)buf;
 
 	/* main copy loop from NAND-buffer to SDRAM memory */
-	for (i = 0; i < (CONFIG_SYS_NAND_PAGE_SIZE / 4); i++) {
+	for (i = 0; i < CONFIG_SYS_NAND_PAGE_SIZE / 4; i++) {
 		writel(readl(src), dst);
 		src++;
 		dst++;

nand_spl/nand_boot_fsl_nfc.c static int nand_load(unsigned int from, unsigned int size, unsigned char *buf) · line 236

Quoted 8 lines
nand_spl/nand_boot_fsl_nfc.c +1 -1
@@ -230,7 +230,7 @@ static int nand_load(unsigned int from, unsigned int size, unsigned char *buf)
 	page = from / CONFIG_SYS_NAND_PAGE_SIZE;
 	i = 0;
 
-	while (i < (size / CONFIG_SYS_NAND_PAGE_SIZE)) {
+	while (i < size / CONFIG_SYS_NAND_PAGE_SIZE) {
 		if (nfc_read_page(page, buf) < 0)
 			return -1;
 

Best regards,
Stefano Babic

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
#13 lore raw

PATCH 3/13 spl mxc nand: Merge duplicated code

In reply to Benoît Thébaudeau

Merge duplicated code into functions, which is better for SPL size too.

---
 .../nand_spl/nand_boot_fsl_nfc.c                   |   50 +++++++++-----------
 1 file changed, 23 insertions(+), 27 deletions(-)
nand_spl/nand_boot_fsl_nfc.c +23 -27
index b90f93e..b98fe41 100644
@@ -83,37 +83,35 @@ static void nfc_nand_command(unsigned short command)
 	nfc_wait_ready();
 }
 
+static void nfc_nand_address(unsigned short address)
+{
+	writew(address, &nfc->flash_addr);
+	writew(NFC_ADDR, &nfc->config2);
+	nfc_wait_ready();
+}
+
 static void nfc_nand_page_address(unsigned int page_address)
 {
 	unsigned int page_count;
 
-	writew(0x00, &nfc->flash_addr);
-	writew(NFC_ADDR, &nfc->config2);
-	nfc_wait_ready();
+	nfc_nand_address(0x00);
 
 	/* code only for large page flash */
-	if (CONFIG_SYS_NAND_PAGE_SIZE > 512) {
-		writew(0x00, &nfc->flash_addr);
-		writew(NFC_ADDR, &nfc->config2);
-		nfc_wait_ready();
-	}
+	if (CONFIG_SYS_NAND_PAGE_SIZE > 512)
+		nfc_nand_address(0x00);
 
 	page_count = CONFIG_SYS_NAND_SIZE / CONFIG_SYS_NAND_PAGE_SIZE;
 
 	if (page_address <= page_count) {
 		page_count--; /* transform 0x01000000 to 0x00ffffff */
 		do {
-			writew(page_address & 0xff, &nfc->flash_addr);
-			writew(NFC_ADDR, &nfc->config2);
-			nfc_wait_ready();
+			nfc_nand_address(page_address & 0xff);
 			page_address = page_address >> 8;
 			page_count = page_count >> 8;
 		} while (page_count);
 	}
 
-	writew(0x00, &nfc->flash_addr);
-	writew(NFC_ADDR, &nfc->config2);
-	nfc_wait_ready();
+	nfc_nand_address(0x00);
 }
 
 static void nfc_nand_data_output(void)
@@ -149,12 +147,8 @@ static int nfc_nand_check_ecc(void)
 	return readw(&nfc->ecc_status_result);
 }
 
-static int nfc_read_page(unsigned int page_address, unsigned char *buf)
+static void nfc_nand_read_page(unsigned int page_address)
 {
-	int i;
-	u32 *src;
-	u32 *dst;
-
 	writew(0, &nfc->buf_addr); /* read in first 0 buffer */
 	nfc_nand_command(NAND_CMD_READ0);
 	nfc_nand_page_address(page_address);
@@ -163,6 +157,15 @@ static int nfc_read_page(unsigned int page_address, unsigned char *buf)
 		nfc_nand_command(NAND_CMD_READSTART);
 
 	nfc_nand_data_output(); /* fill the main buffer 0 */
+}
+
+static int nfc_read_page(unsigned int page_address, unsigned char *buf)
+{
+	int i;
+	u32 *src;
+	u32 *dst;
+
+	nfc_nand_read_page(page_address);
 
 	if (nfc_nand_check_ecc())
 		return -1;
@@ -188,14 +191,7 @@ static int is_badblock(int pagenumber)
 
 	/* Check the first two pages for bad block markers */
 	for (page = pagenumber; page < pagenumber + 2; page++) {
-		writew(0, &nfc->buf_addr); /* read in first 0 buffer */
-		nfc_nand_command(NAND_CMD_READ0);
-		nfc_nand_page_address(page);
-
-		if (CONFIG_SYS_NAND_PAGE_SIZE > 512)
-			nfc_nand_command(NAND_CMD_READSTART);
-
-		nfc_nand_data_output(); /* fill the main buffer 0 */
+		nfc_nand_read_page(page);
 
 		src = (u32 *)&nfc->spare_area[0][0];
 
#14 lore raw

PATCH 3/13 spl mxc nand: Merge duplicated code

Quoted 6 lines · Beno?t Th?baudeau

Merge duplicated code into functions, which is better for SPL size too.

---

Hi Beno?t,

nand_spl/nand_boot_fsl_nfc.c static void nfc_nand_command(unsigned short command) · line 84

Quoted 10 lines
 .../nand_spl/nand_boot_fsl_nfc.c                   |   50 +++++++++-----------
 1 file changed, 23 insertions(+), 27 deletions(-)
nand_spl/nand_boot_fsl_nfc.c +0 -0
index b90f93e..b98fe41 100644
@@ -83,37 +83,35 @@ static void nfc_nand_command(unsigned short command)
 	nfc_wait_ready();
 }

Surely a good issue to fix if we go on using nand_spl - however, as I said in my previous e-mail, nand_spl is obsolete and we move to the SPL framework.

Best regards,
Stefano Babic

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
#15 lore raw

PATCH 4/13 spl mxc nand: Remove duplicated code

In reply to Benoît Thébaudeau

The ECC_EN and INT_MSK bits of CONFIG1 are not volatile, so it is sufficient to set them once in nfc_nand_init().

---
 .../nand_spl/nand_boot_fsl_nfc.c                   |   10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)
nand_spl/nand_boot_fsl_nfc.c +2 -8
index b98fe41..059969b 100644
@@ -57,7 +57,7 @@ static void nfc_nand_init(void)
 	writew(0x2, &nfc->config);
 
 	/* hardware ECC checking and correct */
-	config1 = readw(&nfc->config1) | NFC_ECC_EN | NFC_FP_INT;
+	config1 = readw(&nfc->config1) | NFC_ECC_EN | NFC_INT_MSK | NFC_FP_INT;
 	/*
 	 * if spare size is larger that 16 bytes per 512 byte hunk
 	 * then use 8 symbol correction instead of 4
@@ -72,7 +72,7 @@ static void nfc_nand_init(void)
 	writew(0x2, &nfc->config);
 
 	/* hardware ECC checking and correct */
-	writew(NFC_ECC_EN, &nfc->config1);
+	writew(NFC_ECC_EN | NFC_INT_MSK, &nfc->config1);
 #endif
 }
 
@@ -116,13 +116,10 @@ static void nfc_nand_page_address(unsigned int page_address)
 
 static void nfc_nand_data_output(void)
 {
-	int config1 = readw(&nfc->config1);
 #ifdef NAND_MXC_2K_MULTI_CYCLE
 	int i;
 #endif
 
-	config1 |= NFC_ECC_EN | NFC_INT_MSK;
-	writew(config1, &nfc->config1);
 	writew(0, &nfc->buf_addr);
 	writew(NFC_OUTPUT, &nfc->config2);
 	nfc_wait_ready();
@@ -132,9 +129,6 @@ static void nfc_nand_data_output(void)
 	 * for pages larger than 512 bytes.
 	 */
 	for (i = 1; i < CONFIG_SYS_NAND_PAGE_SIZE / 512; i++) {
-		config1 = readw(&nfc->config1);
-		config1 |= NFC_ECC_EN | NFC_INT_MSK;
-		writew(config1, &nfc->config1);
 		writew(i, &nfc->buf_addr);
 		writew(NFC_OUTPUT, &nfc->config2);
 		nfc_wait_ready();
#16 lore raw

PATCH 5/13 spl mxc nand: Set symmetric mode

In reply to Benoît Thébaudeau

Set the spl mxc nand driver for IP 1.1 in symmetric mode, like the mtd driver. In this way, for both drivers, one input clock period of the NFC IP will produce one R/W cycle.

---
 .../nand_spl/nand_boot_fsl_nfc.c                   |    3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
nand_spl/nand_boot_fsl_nfc.c +2 -1
index 059969b..842943c 100644
@@ -57,7 +57,8 @@ static void nfc_nand_init(void)
 	writew(0x2, &nfc->config);
 
 	/* hardware ECC checking and correct */
-	config1 = readw(&nfc->config1) | NFC_ECC_EN | NFC_INT_MSK | NFC_FP_INT;
+	config1 = readw(&nfc->config1) | NFC_ECC_EN | NFC_INT_MSK |
+			NFC_ONE_CYCLE | NFC_FP_INT;
 	/*
 	 * if spare size is larger that 16 bytes per 512 byte hunk
 	 * then use 8 symbol correction instead of 4
#17 lore raw

PATCH 6/13 mxc nand: Access all ecc_status_result fields

In reply to Benoît Thébaudeau

On the NFC IP 1.1, the 32-bit ecc_status_result value comes from 2 consecutive 16-bit registers. This patch reads all the fields of this value, which makes a difference for 4-kiB NF pages.

---
 .../drivers/mtd/nand/mxc_nand.c                    |    2 +-
 .../include/fsl_nfc.h                              |    3 +--
 .../nand_spl/nand_boot_fsl_nfc.c                   |    4 ++++
 3 files changed, 6 insertions(+), 3 deletions(-)
drivers/mtd/nand/mxc_nand.c +1 -1
index 62d8c6b..4564b25 100644
@@ -653,7 +653,7 @@ static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
 {
 	struct nand_chip *nand_chip = mtd->priv;
 	struct mxc_nand_host *host = nand_chip->priv;
-	uint16_t ecc_status = readw(&host->regs->ecc_status_result);
+	uint32_t ecc_status = readl(&host->regs->ecc_status_result);
 	int subpages = mtd->writesize / nand_chip->subpagesize;
 	int pg2blk_shift = nand_chip->phys_erase_shift -
 			   nand_chip->page_shift;
include/fsl_nfc.h +1 -2
index 1c16c71..c248cef 100644
@@ -94,8 +94,7 @@ struct fsl_nfc_regs {
 	u16 flash_addr;
 	u16 flash_cmd;
 	u16 config;
-	u16 ecc_status_result;
-	u16 ecc_status_result2;
+	u32 ecc_status_result;
 	u16 spare_area_size;
 	u16 wrprot;
 	u16 reserved3[2];
nand_spl/nand_boot_fsl_nfc.c +4 -0
index 842943c..4c5a7fe 100644
@@ -139,7 +139,11 @@ static void nfc_nand_data_output(void)
 
 static int nfc_nand_check_ecc(void)
 {
+#if defined(MXC_NFC_V1)
 	return readw(&nfc->ecc_status_result);
+#elif defined(MXC_NFC_V1_1)
+	return readl(&nfc->ecc_status_result);
+#endif
 }
 
 static void nfc_nand_read_page(unsigned int page_address)
#18 lore raw

PATCH 6/13 mxc nand: Access all ecc_status_result fields

Quoted 45 lines · Beno?t Th?baudeau

On the NFC IP 1.1, the 32-bit ecc_status_result value comes from 2 consecutive 16-bit registers. This patch reads all the fields of this value, which makes a difference for 4-kiB NF pages.

---
 .../drivers/mtd/nand/mxc_nand.c                    |    2 +-
 .../include/fsl_nfc.h                              |    3 +--
 .../nand_spl/nand_boot_fsl_nfc.c                   |    4 ++++
 3 files changed, 6 insertions(+), 3 deletions(-)
drivers/mtd/nand/mxc_nand.c +1 -1
index 62d8c6b..4564b25 100644
@@ -653,7 +653,7 @@ static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
 {
 	struct nand_chip *nand_chip = mtd->priv;
 	struct mxc_nand_host *host = nand_chip->priv;
-	uint16_t ecc_status = readw(&host->regs->ecc_status_result);
+	uint32_t ecc_status = readl(&host->regs->ecc_status_result);
 	int subpages = mtd->writesize / nand_chip->subpagesize;
 	int pg2blk_shift = nand_chip->phys_erase_shift -
 			   nand_chip->page_shift;
include/fsl_nfc.h +1 -2
index 1c16c71..c248cef 100644
@@ -94,8 +94,7 @@ struct fsl_nfc_regs {
 	u16 flash_addr;
 	u16 flash_cmd;
 	u16 config;
-	u16 ecc_status_result;
-	u16 ecc_status_result2;
+	u32 ecc_status_result;
 	u16 spare_area_size;
 	u16 wrprot;
 	u16 reserved3[2];
nand_spl/nand_boot_fsl_nfc.c +0 -0
index 842943c..4c5a7fe 100644

nand_spl/nand_boot_fsl_nfc.c static void nfc_nand_data_output(void) · line 147

Quoted 9 lines
nand_spl/nand_boot_fsl_nfc.c +4 -0
@@ -139,7 +139,11 @@ static void nfc_nand_data_output(void)
 
 static int nfc_nand_check_ecc(void)
 {
+#if defined(MXC_NFC_V1)
 	return readw(&nfc->ecc_status_result);
+#elif defined(MXC_NFC_V1_1)
+	return readl(&nfc->ecc_status_result);
+#endif
 }

On MXC_NFC_V1 you're using readw() on a u32 -- that's not OK, even if the ARM accessors let you get away with it. Use a union or #ifdef the struct definition, or just always readl() if you can get away with it, or do two readw()s on V1_1.

-Scott

#19 lore raw

PATCH 6/13 mxc nand: Access all ecc_status_result fields

Quoted 52 lines · Scott Wood
Quoted 2 lines · Beno?t Th?baudeau

On the NFC IP 1.1, the 32-bit ecc_status_result value comes from 2 consecutive 16-bit registers. This patch reads all the fields of

this value,

Quoted 5 lines

which makes a difference for 4-kiB NF pages.

Review

Quoted 7 lines
---
 .../drivers/mtd/nand/mxc_nand.c                    |    2 +-
 .../include/fsl_nfc.h                              |    3 +--
 .../nand_spl/nand_boot_fsl_nfc.c                   |    4 ++++
 3 files changed, 6 insertions(+), 3 deletions(-)
(quoted diff) +0 -0

u-boot-4d3c95f/drivers/mtd/nand/mxc_nand.c

drivers/mtd/nand/mxc_nand.c static int mxc_nand_correct_data(struct

Quoted 4 lines

index 62d8c6b..4564b25 100644

drivers/mtd/nand/mxc_nand.c +0 -0
@@ -653,7 +653,7 @@ static int mxc_nand_correct_data(struct  

mtd_info *mtd, u_char *dat,

Review

Quoted 9 lines
drivers/mtd/nand/mxc_nand.c +1 -1
 {
 	struct nand_chip *nand_chip = mtd->priv;
 	struct mxc_nand_host *host = nand_chip->priv;
-	uint16_t ecc_status = readw(&host->regs->ecc_status_result);
+	uint32_t ecc_status = readl(&host->regs->ecc_status_result);
 	int subpages = mtd->writesize / nand_chip->subpagesize;
 	int pg2blk_shift = nand_chip->phys_erase_shift -
 			   nand_chip->page_shift;
(quoted diff) +0 -0

u-boot-4d3c95f/include/fsl_nfc.h

Review

Quoted 14 lines

index 1c16c71..c248cef 100644

include/fsl_nfc.h +1 -2
@@ -94,8 +94,7 @@ struct fsl_nfc_regs {
 	u16 flash_addr;
 	u16 flash_cmd;
 	u16 config;
-	u16 ecc_status_result;
-	u16 ecc_status_result2;
+	u32 ecc_status_result;
 	u16 spare_area_size;
 	u16 wrprot;
 	u16 reserved3[2];
(quoted diff) +0 -0

u-boot-4d3c95f/nand_spl/nand_boot_fsl_nfc.c

Quoted 5 lines

index 842943c..4c5a7fe 100644

nand_spl/nand_boot_fsl_nfc.c +0 -0
@@ -139,7 +139,11 @@ static void nfc_nand_data_output(void)
 
Quoted 16 lines

nand_spl/nand_boot_fsl_nfc.c static void nfc_nand_data_output(void) · line 147

Quoted 8 lines
nand_spl/nand_boot_fsl_nfc.c +4 -0
 static int nfc_nand_check_ecc(void)
 {
+#if defined(MXC_NFC_V1)
 	return readw(&nfc->ecc_status_result);
+#elif defined(MXC_NFC_V1_1)
+	return readl(&nfc->ecc_status_result);
+#endif
 }

On MXC_NFC_V1 you're using readw() on a u32 -- that's not OK, even if the
ARM accessors let you get away with it. Use a union or #ifdef the struct
definition, or just always readl() if you can get away with it, or do two
readw()s on V1_1.

Never mind, didn't notice that the struct definition is under #ifdef MXC_NFC_V1_1.

The ARM accessors still should be fixed to do type checking...

-Scott

#20 lore raw

PATCH 7/13 spl mxc nand: Fix broken boot for correctable ECC errors

In reply to Benoît Thébaudeau

Do not stop boot as soon as an ECC error is detected. Only stop boot for uncorrectable ECC errors.

This fixes boards no longer booting after some time because a NAND Flash bit has flipped.

---
 .../nand_spl/nand_boot_fsl_nfc.c                   |   16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)
nand_spl/nand_boot_fsl_nfc.c +14 -2
index 4c5a7fe..ea05952 100644
@@ -140,9 +140,21 @@ static void nfc_nand_data_output(void)
 static int nfc_nand_check_ecc(void)
 {
 #if defined(MXC_NFC_V1)
-	return readw(&nfc->ecc_status_result);
+	u16 ecc_status = readw(&nfc->ecc_status_result);
+	return (ecc_status & 0x3) == 2 || (ecc_status >> 2) == 2;
 #elif defined(MXC_NFC_V1_1)
-	return readl(&nfc->ecc_status_result);
+	u32 ecc_status = readl(&nfc->ecc_status_result);
+	int ecc_per_page = CONFIG_SYS_NAND_PAGE_SIZE / 512;
+	int err_limit = CONFIG_SYS_NAND_SPARE_SIZE / ecc_per_page > 16 ? 8 : 4;
+	int subpages = CONFIG_SYS_NAND_PAGE_SIZE / 512;
+
+	do {
+		if ((ecc_status & 0xf) > err_limit)
+			return 1;
+		ecc_status >>= 4;
+	} while (--subpages);
+
+	return 0;
 #endif
 }
 
#21 lore raw

PATCH 8/13 mtd mxc nand: Use _mxc_nand_enable_hwecc()

In reply to Benoît Thébaudeau

Use _mxc_nand_enable_hwecc() instead of duplicating its code.

---
 .../drivers/mtd/nand/mxc_nand.c                    |   28 +++++++++-----------
 1 file changed, 12 insertions(+), 16 deletions(-)
drivers/mtd/nand/mxc_nand.c +12 -16
index 4564b25..7a180e1 100644
@@ -355,16 +355,6 @@ static int mxc_nand_dev_ready(struct mtd_info *mtd)
 	return 1;
 }
 
-#ifdef CONFIG_MXC_NAND_HWECC
-static void mxc_nand_enable_hwecc(struct mtd_info *mtd, int mode)
-{
-	/*
-	 * If HW ECC is enabled, we turn it on during init. There is
-	 * no need to enable again here.
-	 */
-}
-
-#ifdef MXC_NFC_V1_1
 static void _mxc_nand_enable_hwecc(struct mtd_info *mtd, int on)
 {
 	struct nand_chip *nand_chip = mtd->priv;
@@ -378,6 +368,16 @@ static void _mxc_nand_enable_hwecc(struct mtd_info *mtd, int on)
 	writew(tmp, &host->regs->config1);
 }
 
+#ifdef CONFIG_MXC_NAND_HWECC
+static void mxc_nand_enable_hwecc(struct mtd_info *mtd, int mode)
+{
+	/*
+	 * If HW ECC is enabled, we turn it on during init. There is
+	 * no need to enable again here.
+	 */
+}
+
+#ifdef MXC_NFC_V1_1
 static int mxc_nand_read_oob_syndrome(struct mtd_info *mtd,
 				      struct nand_chip *chip,
 				      int page, int sndcmd)
@@ -1235,15 +1235,11 @@ int board_nand_init(struct nand_chip *this)
 	host->pagesize_2k = 0;
 
 	this->ecc.size = 512;
-	tmp = readw(&host->regs->config1);
-	tmp |= NFC_ECC_EN;
-	writew(tmp, &host->regs->config1);
+	_mxc_nand_enable_hwecc(mtd, 1);
 #else
 	this->ecc.layout = &nand_soft_eccoob;
 	this->ecc.mode = NAND_ECC_SOFT;
-	tmp = readw(&host->regs->config1);
-	tmp &= ~NFC_ECC_EN;
-	writew(tmp, &host->regs->config1);
+	_mxc_nand_enable_hwecc(mtd, 0);
 #endif
 	/* Reset NAND */
 	this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
#22 lore raw

PATCH 8/13 mtd mxc nand: Use _mxc_nand_enable_hwecc()

Quoted 6 lines · Beno?t Th?baudeau

Use _mxc_nand_enable_hwecc() instead of duplicating its code.

---

Hi Beno?t,

drivers/mtd/nand/mxc_nand.c static void _mxc_nand_enable_hwecc(struct mtd_info *mtd, int on) · line 378

Quoted 9 lines
drivers/mtd/nand/mxc_nand.c +8 -0
+#ifdef CONFIG_MXC_NAND_HWECC
+static void mxc_nand_enable_hwecc(struct mtd_info *mtd, int mode)
+{
+	/*
+	 * If HW ECC is enabled, we turn it on during init. There is
+	 * no need to enable again here.
+	 */
+}

mxc_nand_enable_hwecc is still empty after your changes...

drivers/mtd/nand/mxc_nand.c int board_nand_init(struct nand_chip *this) · line 1238

Quoted 13 lines
drivers/mtd/nand/mxc_nand.c +3 -3
+
+#ifdef MXC_NFC_V1_1
 static int mxc_nand_read_oob_syndrome(struct mtd_info *mtd,
 				      struct nand_chip *chip,
 				      int page, int sndcmd)
@@ -1235,15 +1235,11 @@ int board_nand_init(struct nand_chip *this)
 	host->pagesize_2k = 0;
 
 	this->ecc.size = 512;
-	tmp = readw(&host->regs->config1);
-	tmp |= NFC_ECC_EN;
-	writew(tmp, &host->regs->config1);
+	_mxc_nand_enable_hwecc(mtd, 1);

...but you are calling it after removing the code in the init function, and I do not understand how ECC is enabled.

Best regards,
Stefano Babic

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
#23 lore raw

PATCH 8/13 mtd mxc nand: Use _mxc_nand_enable_hwecc()

Hi Stefano,

Quoted 11 lines · Beno?t Th?baudeau
Quoted 6 lines

Use _mxc_nand_enable_hwecc() instead of duplicating its code.

---

Hi Beno?t,

Quoted 1 line
Quoted 10 lines

drivers/mtd/nand/mxc_nand.c static void _mxc_nand_enable_hwecc(struct mtd_info *mtd, int on) · line 378

Quoted 8 lines
drivers/mtd/nand/mxc_nand.c +8 -0
+#ifdef CONFIG_MXC_NAND_HWECC
+static void mxc_nand_enable_hwecc(struct mtd_info *mtd, int mode)
+{
+	/*
+	 * If HW ECC is enabled, we turn it on during init. There is
+	 * no need to enable again here.
+	 */
+}

mxc_nand_enable_hwecc is still empty after your changes...

Yes, and it's normal. The change is a move of the _mxc_nand_enable_hwecc() function, not a filling of the mxc_nand_enable_hwecc() function (note the differing underscore). For some reason, the patch looks weird because it moves mxc_nand_enable_hwecc(), but the result is the same.

Quoted 8 lines
Quoted 8 lines
drivers/mtd/nand/mxc_nand.c +2 -0
+
+#ifdef MXC_NFC_V1_1
 static int mxc_nand_read_oob_syndrome(struct mtd_info *mtd,
 				      struct nand_chip *chip,
 				      int page, int sndcmd)
@@ -1235,15 +1235,11 @@ int board_nand_init(struct nand_chip *this)
 	host->pagesize_2k = 0;
 
Quoted 9 lines

drivers/mtd/nand/mxc_nand.c int board_nand_init(struct nand_chip *this) · line 1238

Quoted 5 lines
drivers/mtd/nand/mxc_nand.c +1 -3
 	this->ecc.size = 512;
-	tmp = readw(&host->regs->config1);
-	tmp |= NFC_ECC_EN;
-	writew(tmp, &host->regs->config1);
+	_mxc_nand_enable_hwecc(mtd, 1);

...but you are calling it after removing the code in the init function,
and I do not understand how ECC is enabled.

It's not the same function.

Best regards,
Beno?t

#24 lore raw

PATCH 9/13 mtd mxc nand: Fix ECC state after read_page_raw_syndrome()

In reply to Benoît Thébaudeau

mxc_nand_read_page_raw_syndrome() should reenable ECC upon exit. This fixes ECC errors left uncorrected after a call to this function.

---
 .../drivers/mtd/nand/mxc_nand.c                    |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/mxc_nand.c +1 -1
index 7a180e1..2ae41dc 100644
@@ -470,7 +470,7 @@ static int mxc_nand_read_page_raw_syndrome(struct mtd_info *mtd,
 	size = mtd->oobsize - (oob - chip->oob_poi);
 	if (size)
 		chip->read_buf(mtd, oob, size);
-	_mxc_nand_enable_hwecc(mtd, 0);
+	_mxc_nand_enable_hwecc(mtd, 1);
 
 	return 0;
 }
#25 lore raw

PATCH 10/13 mtd mxc nand: Merge init functions

In reply to Benoît Thébaudeau

Merge mxc_setup_config1() into board_nand_init() in order to ease the addition of i.MX5 support in the following patches.

---
 .../drivers/mtd/nand/mxc_nand.c                    |   53 +++++++++-----------
 1 file changed, 23 insertions(+), 30 deletions(-)
drivers/mtd/nand/mxc_nand.c +23 -30
index 2ae41dc..e743796 100644
@@ -1137,24 +1137,6 @@ void mxc_nand_command(struct mtd_info *mtd, unsigned command,
 	}
 }
 
-#ifdef MXC_NFC_V1_1
-static void mxc_setup_config1(void)
-{
-	uint16_t tmp;
-
-	tmp = readw(&host->regs->config1);
-	tmp |= NFC_ONE_CYCLE;
-	tmp |= NFC_4_8N_ECC;
-	writew(tmp, &host->regs->config1);
-	if (host->pagesize_2k)
-		writew(64/2, &host->regs->spare_area_size);
-	else
-		writew(16/2, &host->regs->spare_area_size);
-}
-#else
-#define mxc_setup_config1()
-#endif
-
 #ifdef CONFIG_SYS_NAND_USE_FLASH_BBT
 
 static u8 bbt_pattern[] = {'B', 'b', 't', '0' };
@@ -1244,6 +1226,29 @@ int board_nand_init(struct nand_chip *this)
 	/* Reset NAND */
 	this->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
 
+	/* NAND bus width determines access functions used by upper layer */
+	if (is_16bit_nand())
+		this->options |= NAND_BUSWIDTH_16;
+
+#ifdef CONFIG_SYS_NAND_LARGEPAGE
+	host->pagesize_2k = 1;
+	this->ecc.layout = &nand_hw_eccoob2k;
+#else
+	host->pagesize_2k = 0;
+	this->ecc.layout = &nand_hw_eccoob;
+#endif
+
+#ifdef MXC_NFC_V1_1
+	tmp = readw(&host->regs->config1);
+	tmp |= NFC_ONE_CYCLE;
+	tmp |= NFC_4_8N_ECC;
+	writew(tmp, &host->regs->config1);
+	if (host->pagesize_2k)
+		writew(64/2, &host->regs->spare_area_size);
+	else
+		writew(16/2, &host->regs->spare_area_size);
+#endif
+
 	/*
 	 * preset operation
 	 * Unlock the internal RAM Buffer
@@ -1268,17 +1273,5 @@ int board_nand_init(struct nand_chip *this)
 	/* Unlock Block Command for given address range */
 	writew(0x4, &host->regs->wrprot);
 
-	/* NAND bus width determines access functions used by upper layer */
-	if (is_16bit_nand())
-		this->options |= NAND_BUSWIDTH_16;
-
-#ifdef CONFIG_SYS_NAND_LARGEPAGE
-	host->pagesize_2k = 1;
-	this->ecc.layout = &nand_hw_eccoob2k;
-#else
-	host->pagesize_2k = 0;
-	this->ecc.layout = &nand_hw_eccoob;
-#endif
-	mxc_setup_config1();
 	return 0;
 }
#26 lore raw

PATCH 11/13 mxc nand: Let driver detect IP revision

In reply to Benoît Thébaudeau

There is no reason to have board configs to select the NFC IP revision. Just let the driver detect it. BTW, remove broken NFC IP revision configs from board config files.

---
 .../include/configs/flea3.h                        |    1 -
 .../include/configs/mx35pdk.h                      |    1 -
 .../include/configs/tx25.h                         |    1 -
 .../include/fsl_nfc.h                              |    8 +++-----
 4 files changed, 3 insertions(+), 8 deletions(-)
include/configs/flea3.h +0 -1
index 46939d4..43cadbc 100644
@@ -221,7 +221,6 @@
  * NAND FLASH driver setup
  */
 #define CONFIG_NAND_MXC
-#define CONFIG_NAND_MXC_V1_1
 #define CONFIG_MXC_NAND_REGS_BASE	(NFC_BASE_ADDR)
 #define CONFIG_SYS_MAX_NAND_DEVICE	1
 #define CONFIG_SYS_NAND_BASE		(NFC_BASE_ADDR)
include/configs/mx35pdk.h +0 -1
index 6eb5da5..93a9dd7 100644
@@ -239,7 +239,6 @@
  * NAND FLASH driver setup
  */
 #define CONFIG_NAND_MXC
-#define CONFIG_NAND_MXC_V1_1
 #define CONFIG_MXC_NAND_REGS_BASE	(NFC_BASE_ADDR)
 #define CONFIG_SYS_MAX_NAND_DEVICE	1
 #define CONFIG_SYS_NAND_BASE		(NFC_BASE_ADDR)
include/configs/tx25.h +0 -1
index 6821528..870e863 100644
@@ -108,7 +108,6 @@
 
 /* NAND */
 #define CONFIG_NAND_MXC
-#define CONFIG_NAND_MXC_V1_1
 #define CONFIG_MXC_NAND_REGS_BASE	(0xBB000000)
 #define CONFIG_SYS_MAX_NAND_DEVICE	1
 #define CONFIG_SYS_NAND_BASE		(0xBB000000)
include/fsl_nfc.h +3 -5
index c248cef..6618089 100644
@@ -42,10 +42,12 @@
  */
 #if defined(CONFIG_MX27) || defined(CONFIG_MX31)
 #define MXC_NFC_V1
+#define is_mxc_nfc_11()		0
 #elif defined(CONFIG_MX25) || defined(CONFIG_MX35)
 #define MXC_NFC_V1_1
+#define is_mxc_nfc_11()		1
 #else
-#warning "MXC NFC version not defined"
+#error "MXC NFC implementation not supported"
 #endif
 
 #if defined(MXC_NFC_V1)
@@ -53,14 +55,10 @@
 #define NAND_MXC_SPARE_BUF_SIZE		16
 #define NAND_MXC_REG_OFFSET		0xe00
 #define NAND_MXC_2K_MULTI_CYCLE
-#define is_mxc_nfc_11()			0
 #elif defined(MXC_NFC_V1_1)
 #define NAND_MXC_NR_BUFS		8
 #define NAND_MXC_SPARE_BUF_SIZE		64
 #define NAND_MXC_REG_OFFSET		0x1e00
-#define is_mxc_nfc_11()			1
-#else
-#error "define CONFIG_NAND_MXC_VXXX to use the mxc nand driver"
 #endif
 
 struct fsl_nfc_regs {
#27 lore raw

PATCH 11/13 mxc nand: Let driver detect IP revision

Quoted 8 lines · Beno?t Th?baudeau

There is no reason to have board configs to select the NFC IP revision. Just let the driver detect it. BTW, remove broken NFC IP revision configs from board config files.

---

Hi Beno?t,

Quoted 66 lines
 .../include/configs/flea3.h                        |    1 -
 .../include/configs/mx35pdk.h                      |    1 -
 .../include/configs/tx25.h                         |    1 -
 .../include/fsl_nfc.h                              |    8 +++-----
 4 files changed, 3 insertions(+), 8 deletions(-)
include/configs/flea3.h +0 -1
index 46939d4..43cadbc 100644
@@ -221,7 +221,6 @@
  * NAND FLASH driver setup
  */
 #define CONFIG_NAND_MXC
-#define CONFIG_NAND_MXC_V1_1
 #define CONFIG_MXC_NAND_REGS_BASE	(NFC_BASE_ADDR)
 #define CONFIG_SYS_MAX_NAND_DEVICE	1
 #define CONFIG_SYS_NAND_BASE		(NFC_BASE_ADDR)
include/configs/mx35pdk.h +0 -1
index 6eb5da5..93a9dd7 100644
@@ -239,7 +239,6 @@
  * NAND FLASH driver setup
  */
 #define CONFIG_NAND_MXC
-#define CONFIG_NAND_MXC_V1_1
 #define CONFIG_MXC_NAND_REGS_BASE	(NFC_BASE_ADDR)
 #define CONFIG_SYS_MAX_NAND_DEVICE	1
 #define CONFIG_SYS_NAND_BASE		(NFC_BASE_ADDR)
include/configs/tx25.h +0 -1
index 6821528..870e863 100644
@@ -108,7 +108,6 @@
 
 /* NAND */
 #define CONFIG_NAND_MXC
-#define CONFIG_NAND_MXC_V1_1
 #define CONFIG_MXC_NAND_REGS_BASE	(0xBB000000)
 #define CONFIG_SYS_MAX_NAND_DEVICE	1
 #define CONFIG_SYS_NAND_BASE		(0xBB000000)
include/fsl_nfc.h +3 -2
index c248cef..6618089 100644
@@ -42,10 +42,12 @@
  */
 #if defined(CONFIG_MX27) || defined(CONFIG_MX31)
 #define MXC_NFC_V1
+#define is_mxc_nfc_11()		0
 #elif defined(CONFIG_MX25) || defined(CONFIG_MX35)
 #define MXC_NFC_V1_1
+#define is_mxc_nfc_11()		1
 #else
-#warning "MXC NFC version not defined"
+#error "MXC NFC implementation not supported"
 #endif
 
 #if defined(MXC_NFC_V1)
@@ -53,14 +55,10 @@
 #define NAND_MXC_SPARE_BUF_SIZE		16
 #define NAND_MXC_REG_OFFSET		0xe00
 #define NAND_MXC_2K_MULTI_CYCLE
-#define is_mxc_nfc_11()			0

include/fsl_nfc.h line 64

Quoted 10 lines
include/fsl_nfc.h +0 -3
 #elif defined(MXC_NFC_V1_1)
 #define NAND_MXC_NR_BUFS		8
 #define NAND_MXC_SPARE_BUF_SIZE		64
 #define NAND_MXC_REG_OFFSET		0x1e00
-#define is_mxc_nfc_11()			1
-#else
-#error "define CONFIG_NAND_MXC_VXXX to use the mxc nand driver"
 #endif
 
 struct fsl_nfc_regs {

Agree on this change. The NAND controller version belongs to the SOC, and not to the board. It should be not here.

Best regards,
Stefano Babic

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
#28 lore raw

PATCH 12/13 mxc nand: Homogenize IP revisions with Linux

In reply to Benoît Thébaudeau

Use the same IP revisions as in Linux in order to make the comparison more clear.

---
 .../drivers/mtd/nand/mxc_nand.c                    |   16 ++++++++--------
 .../include/fsl_nfc.h                              |   16 +++++++++-------
 .../nand_spl/nand_boot_fsl_nfc.c                   |    4 ++--
 3 files changed, 19 insertions(+), 17 deletions(-)
drivers/mtd/nand/mxc_nand.c +8 -8
index e743796..cf2a7b0 100644
@@ -77,7 +77,7 @@ static struct nand_ecclayout nand_hw_eccoob2k = {
 	.oobfree = { {2, 4}, {11, 11}, {27, 11}, {43, 11}, {59, 5} },
 };
 #endif
-#elif defined(MXC_NFC_V1_1)
+#elif defined(MXC_NFC_V2_1)
 #ifndef CONFIG_SYS_NAND_LARGEPAGE
 static struct nand_ecclayout nand_hw_eccoob = {
 	.eccbytes = 9,
@@ -213,7 +213,7 @@ static void send_prog_page(struct mxc_nand_host *host, uint8_t buf_id,
 	if (spare_only)
 		MTDDEBUG(MTD_DEBUG_LEVEL1, "send_prog_page (%d)\n", spare_only);
 
-	if (is_mxc_nfc_11()) {
+	if (is_mxc_nfc_21()) {
 		int i;
 		/*
 		 *  The controller copies the 64 bytes of spare data from
@@ -273,7 +273,7 @@ static void send_read_page(struct mxc_nand_host *host, uint8_t buf_id,
 	/* Wait for operation to complete */
 	wait_op_done(host, TROP_US_DELAY, spare_only);
 
-	if (is_mxc_nfc_11()) {
+	if (is_mxc_nfc_21()) {
 		int i;
 
 		/*
@@ -377,7 +377,7 @@ static void mxc_nand_enable_hwecc(struct mtd_info *mtd, int mode)
 	 */
 }
 
-#ifdef MXC_NFC_V1_1
+#ifdef MXC_NFC_V2_1
 static int mxc_nand_read_oob_syndrome(struct mtd_info *mtd,
 				      struct nand_chip *chip,
 				      int page, int sndcmd)
@@ -1061,7 +1061,7 @@ void mxc_nand_command(struct mtd_info *mtd, unsigned command,
 	case NAND_CMD_PAGEPROG:
 		send_prog_page(host, 0, host->spare_only);
 
-		if (host->pagesize_2k && !is_mxc_nfc_11()) {
+		if (host->pagesize_2k && is_mxc_nfc_1()) {
 			/* data in 4 areas */
 			send_prog_page(host, 1, host->spare_only);
 			send_prog_page(host, 2, host->spare_only);
@@ -1111,7 +1111,7 @@ void mxc_nand_command(struct mtd_info *mtd, unsigned command,
 			send_cmd(host, NAND_CMD_READSTART);
 			/* read for each AREA */
 			send_read_page(host, 0, host->spare_only);
-			if (!is_mxc_nfc_11()) {
+			if (is_mxc_nfc_1()) {
 				send_read_page(host, 1, host->spare_only);
 				send_read_page(host, 2, host->spare_only);
 				send_read_page(host, 3, host->spare_only);
@@ -1200,7 +1200,7 @@ int board_nand_init(struct nand_chip *this)
 	this->ecc.calculate = mxc_nand_calculate_ecc;
 	this->ecc.hwctl = mxc_nand_enable_hwecc;
 	this->ecc.correct = mxc_nand_correct_data;
-	if (is_mxc_nfc_11()) {
+	if (is_mxc_nfc_21()) {
 		this->ecc.mode = NAND_ECC_HW_SYNDROME;
 		this->ecc.read_page = mxc_nand_read_page_syndrome;
 		this->ecc.read_page_raw = mxc_nand_read_page_raw_syndrome;
@@ -1238,7 +1238,7 @@ int board_nand_init(struct nand_chip *this)
 	this->ecc.layout = &nand_hw_eccoob;
 #endif
 
-#ifdef MXC_NFC_V1_1
+#ifdef MXC_NFC_V2_1
 	tmp = readw(&host->regs->config1);
 	tmp |= NFC_ONE_CYCLE;
 	tmp |= NFC_4_8N_ECC;
include/fsl_nfc.h +9 -7
index 6618089..ff537b4 100644
@@ -33,7 +33,7 @@
  *	to support up to 2K byte pagesize nand.
  *	Reading or writing a 2K page requires 4 FDI/FDO cycles.
  *
- * MX25 and MX35 have version 1.1, which has:
+ * MX25 and MX35 have version 2.1, which has:
  *	8 512-byte main buffers and
  *	8 64-byte spare buffers
  *	to support up to 4K byte pagesize nand.
@@ -42,10 +42,12 @@
  */
 #if defined(CONFIG_MX27) || defined(CONFIG_MX31)
 #define MXC_NFC_V1
-#define is_mxc_nfc_11()		0
+#define is_mxc_nfc_1()		1
+#define is_mxc_nfc_21()		0
 #elif defined(CONFIG_MX25) || defined(CONFIG_MX35)
-#define MXC_NFC_V1_1
-#define is_mxc_nfc_11()		1
+#define MXC_NFC_V2_1
+#define is_mxc_nfc_1()		0
+#define is_mxc_nfc_21()		1
 #else
 #error "MXC NFC implementation not supported"
 #endif
@@ -55,7 +57,7 @@
 #define NAND_MXC_SPARE_BUF_SIZE		16
 #define NAND_MXC_REG_OFFSET		0xe00
 #define NAND_MXC_2K_MULTI_CYCLE
-#elif defined(MXC_NFC_V1_1)
+#elif defined(MXC_NFC_V2_1)
 #define NAND_MXC_NR_BUFS		8
 #define NAND_MXC_SPARE_BUF_SIZE		64
 #define NAND_MXC_REG_OFFSET		0x1e00
@@ -86,7 +88,7 @@ struct fsl_nfc_regs {
 	u16 nf_wrprst;
 	u16 config1;
 	u16 config2;
-#elif defined(MXC_NFC_V1_1)
+#elif defined(MXC_NFC_V2_1)
 	u16 reserved2[2];
 	u16 buf_addr;
 	u16 flash_addr;
@@ -153,7 +155,7 @@ struct fsl_nfc_regs {
  */
 #define NFC_INT		0x8000
 
-#ifdef MXC_NFC_V1_1
+#ifdef MXC_NFC_V2_1
 #define NFC_4_8N_ECC	(1 << 0)
 #endif
 #define NFC_SP_EN	(1 << 2)
nand_spl/nand_boot_fsl_nfc.c +2 -2
index ea05952..a40c998 100644
@@ -47,7 +47,7 @@ static void nfc_wait_ready(void)
 
 static void nfc_nand_init(void)
 {
-#if defined(MXC_NFC_V1_1)
+#if defined(MXC_NFC_V2_1)
 	int ecc_per_page = CONFIG_SYS_NAND_PAGE_SIZE / 512;
 	int config1;
 
@@ -142,7 +142,7 @@ static int nfc_nand_check_ecc(void)
 #if defined(MXC_NFC_V1)
 	u16 ecc_status = readw(&nfc->ecc_status_result);
 	return (ecc_status & 0x3) == 2 || (ecc_status >> 2) == 2;
-#elif defined(MXC_NFC_V1_1)
+#elif defined(MXC_NFC_V2_1)
 	u32 ecc_status = readl(&nfc->ecc_status_result);
 	int ecc_per_page = CONFIG_SYS_NAND_PAGE_SIZE / 512;
 	int err_limit = CONFIG_SYS_NAND_SPARE_SIZE / ecc_per_page > 16 ? 8 : 4;
#29 lore raw

PATCH 13/13 mxc nand: Add support for i.MX5

In reply to Benoît Thébaudeau
---
 .../arch/arm/include/asm/arch-mx5/imx-regs.h       |    9 +
 .../drivers/mtd/nand/mxc_nand.c                    |  217 +++++++++++++++-----
 .../include/fsl_nfc.h                              |  149 +++++++++-----
 .../nand_spl/nand_boot_fsl_nfc.c                   |  114 +++++++---
 4 files changed, 363 insertions(+), 126 deletions(-)
arch/arm/include/asm/arch-mx5/imx-regs.h +9 -0
index 7f66b61..55e9660 100644
@@ -232,6 +232,15 @@
 #define CS0_32M_CS1_32M_CS2_32M_CS3_32M		3
 
 /*
+ * SRC register definitions
+ */
+#if defined(CONFIG_MX51)
+#define SRC_SBMR_NF16B		(1 << 2)
+#elif defined(CONFIG_MX53)
+#define SRC_SBMR_NF16B		(1 << 13)
+#endif
+
+/*
  * CSPI register definitions
  */
 #define MXC_ECSPI
drivers/mtd/nand/mxc_nand.c +162 -55

402 lines not on this page · raw message

include/fsl_nfc.h +102 -47

190 lines not on this page · raw message

nand_spl/nand_boot_fsl_nfc.c +90 -24

184 lines not on this page · raw message

#30 lore raw

PATCH 13/13 mxc nand: Add support for i.MX5

Quoted 17 lines · Beno?t Th?baudeau
---
  .../arch/arm/include/asm/arch-mx5/imx-regs.h       |    9 +
  .../drivers/mtd/nand/mxc_nand.c                    |  217 +++++++++++++++-----
  .../include/fsl_nfc.h                              |  149 +++++++++-----
  .../nand_spl/nand_boot_fsl_nfc.c                   |  114 +++++++---
  4 files changed, 363 insertions(+), 126 deletions(-)
arch/arm/include/asm/arch-mx5/imx-regs.h +0 -0
index 7f66b61..55e9660 100644
@@ -232,6 +232,15 @@
  #define CS0_32M_CS1_32M_CS2_32M_CS3_32M		3
 

arch/arm/include/asm/arch-mx5/imx-regs.h line 243

Quoted 10 lines
arch/arm/include/asm/arch-mx5/imx-regs.h +8 -0
  /*
+ * SRC register definitions
+ */
+#if defined(CONFIG_MX51)
+#define SRC_SBMR_NF16B		(1 << 2)
+#elif defined(CONFIG_MX53)
+#define SRC_SBMR_NF16B		(1 << 13)
+#endif
+
 

You could give an error if a multi-platform kernel has both defined, if a run-time check is too difficult.

#31 lore raw

PATCH 13/13 mxc nand: Add support for i.MX5

Quoted 25 lines · Troy Kisky
Quoted 24 lines · Beno?t Th?baudeau
---
  .../arch/arm/include/asm/arch-mx5/imx-regs.h       |    9 +
  .../drivers/mtd/nand/mxc_nand.c                    |  217 
+++++++++++++++-----
  .../include/fsl_nfc.h                              |  149 
+++++++++-----
  .../nand_spl/nand_boot_fsl_nfc.c                   |  114 +++++++---
  4 files changed, 363 insertions(+), 126 deletions(-)
(quoted diff) +0 -0

u-boot-4d3c95f.orig/arch/arm/include/asm/arch-mx5/imx-regs.h u-boot-4d3c95f/arch/arm/include/asm/arch-mx5/imx-regs.h index 7f66b61..55e9660 100644

arch/arm/include/asm/arch-mx5/imx-regs.h +3 -0
@@ -232,6 +232,15 @@
  #define CS0_32M_CS1_32M_CS2_32M_CS3_32M        3
    /*
+ * SRC register definitions
+ */
+#if defined(CONFIG_MX51)
Quoted 10 lines

arch/arm/include/asm/arch-mx5/imx-regs.h

Quoted 6 lines
arch/arm/include/asm/arch-mx5/imx-regs.h +5 -0
+#define SRC_SBMR_NF16B        (1 << 2)
+#elif defined(CONFIG_MX53)
+#define SRC_SBMR_NF16B        (1 << 13)
+#endif
+
 

You could give an error if a multi-platform kernel has both defined, if a run-time check is too difficult.

Please ignore my stupid ramblings!!!!

#32 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

In reply to Benoît Thébaudeau

---
Changes for v2:
- Fix warning for unused tmp variable in board_nand_init() for NFC V1.

 .../arch/arm/include/asm/arch-mx5/imx-regs.h       |    9 +
 .../drivers/mtd/nand/mxc_nand.c                    |  219 +++++++++++++++-----
 .../include/fsl_nfc.h                              |  149 ++++++++-----
 .../nand_spl/nand_boot_fsl_nfc.c                   |  114 +++++++---
 4 files changed, 365 insertions(+), 126 deletions(-)
arch/arm/include/asm/arch-mx5/imx-regs.h +9 -0
index c53465f..ca73dea 100644
@@ -232,6 +232,15 @@
 #define CS0_32M_CS1_32M_CS2_32M_CS3_32M		3
 
 /*
+ * SRC register definitions
+ */
+#if defined(CONFIG_MX51)
+#define SRC_SBMR_NF16B		(1 << 2)
+#elif defined(CONFIG_MX53)
+#define SRC_SBMR_NF16B		(1 << 13)
+#endif
+
+/*
  * CSPI register definitions
  */
 #define MXC_ECSPI
drivers/mtd/nand/mxc_nand.c +164 -55

404 lines not on this page · raw message

include/fsl_nfc.h +102 -47

190 lines not on this page · raw message

nand_spl/nand_boot_fsl_nfc.c +90 -24

184 lines not on this page · raw message

#33 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

Quoted 5 lines · Beno?t Th?baudeau
nand_spl/nand_boot_fsl_nfc.c +0 -0
index a40c998..1096727 100644

nand_spl/nand_boot_fsl_nfc.c line 38

Quoted 9 lines
nand_spl/nand_boot_fsl_nfc.c +5 -0
@@ -30,64 +30,117 @@
 #include <asm/io.h>
 #include <fsl_nfc.h>
 
+#if defined(MXC_NFC_V1) || defined(MXC_NFC_V2_1)
 static struct fsl_nfc_regs *const nfc = (void *)NFC_BASE_ADDR;
+#elif defined(MXC_NFC_V3_2)
+static struct fsl_nfc_regs *const nfc = (void *)NFC_BASE_ADDR_AXI;
+static struct fsl_nfc_ip_regs *const nfc_ip = (void *)NFC_BASE_ADDR;
+#endif

Please migrate to the new SPL.

nand_spl/nand_boot_fsl_nfc.c line 73

Quoted 5 lines
nand_spl/nand_boot_fsl_nfc.c +5 -0
+	tmp = (readnfc(&nfc_ip->config2) & ~(NFC_V3_CONFIG2_SPAS_MASK |
+			NFC_V3_CONFIG2_EDC_MASK | NFC_V3_CONFIG2_PS_MASK)) |
+		NFC_V3_CONFIG2_SPAS(CONFIG_SYS_NAND_SPARE_SIZE / 2) |
+		NFC_V3_CONFIG2_INT_MSK | NFC_V3_CONFIG2_ECC_EN |
+		NFC_V3_CONFIG2_ONE_CYCLE;

CONFIG_SYS_NAND_SPARE_SIZE needs to go in the README.

-Scott

#34 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

In reply to Benoît Thébaudeau
Quoted 7 lines · Beno?t Th?baudeau

---
Changes for v2:
- Fix warning for unused tmp variable in board_nand_init() for NFC V1.

Quoted 5 lines
 .../arch/arm/include/asm/arch-mx5/imx-regs.h       |    9 +
 .../drivers/mtd/nand/mxc_nand.c                    |  219 +++++++++++++++-----
 .../include/fsl_nfc.h                              |  149 ++++++++-----
 .../nand_spl/nand_boot_fsl_nfc.c                   |  114 +++++++---
 4 files changed, 365 insertions(+), 126 deletions(-)

Unless Tom or Wolfgang object, I'm inclined to drop the objection to adding new hardware support to nand_spl in this case. I'd rather see the support be merged rather than ignored because a contributor has time for a small job but not a large one. Plus, this code will likely be reused by the new SPL support, if this platform is space constrained, so it's not dead-end effort.

It would be nice, though, if the writenfc/readnfc conversion, comment reformatting, etc. were separate from the behavioral changes.

-Scott

#35 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 14 lines · Scott Wood
Quoted 6 lines · Beno?t Th?baudeau

Signed-off-by: Beno?t Th?baudeau <[email protected]> Cc: Scott Wood <[email protected]> Cc: Stefano Babic <[email protected]> --- Changes for v2: - Fix warning for unused tmp variable in board_nand_init() for NFC V1.

Quoted 6 lines

.../arch/arm/include/asm/arch-mx5/imx-regs.h | 9 +
.../drivers/mtd/nand/mxc_nand.c | 219
+++++++++++++++----- .../include/fsl_nfc.h

|  149 ++++++++----- .../nand_spl/nand_boot_fsl_nfc.c
|  114 +++++++--- 4 files changed, 365 insertions(+), 126

deletions(-)

Quoted 6 lines

Unless Tom or Wolfgang object, I'm inclined to drop the objection to adding new hardware support to nand_spl in this case. I'd rather see the support be merged rather than ignored because a contributor has time for a small job but not a large one. Plus, this code will likely be reused by the new SPL support, if this platform is space constrained, so it's not dead-end effort.

I'm OK with pulling this in while providing an on-the-record prod to please find some time to do a conversion or two in time for v2013.01.

- --
Tom
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://www.enigmail.net/

iQIcBAEBAgAGBQJQWLlIAAoJENk4IS6UOR1WjL8P/Rj2jUnLXeMCgn4FJu7KfrXt 3g5HHGgvupmkiPXalwb5/MhID3Jpl+hjpt2Qw+TNqASU36kyqUXi/tx+G143Y+Jp v3hYpwfrCQJLBvC5TI9Bq8gcW7DosggNlyfGtdXPtn8XjxIi+13NDONnL4VOIRHc GsJAnPofFhFtxtKoHcHAZe5hFIi/7davYUhmAPxCOZduPkUpwZNkc8XJJid+sSvt C5/PLIeQqaYcDiaXbw4TE8t/y1ju7ovCzkLsGlLh1yT8QAjxgh+wtuArYz+fpK7p q7zHlcOcLmAKc2mkOMdpOV/iLgC+kFKxJQ7DKANb5dL9wFtRBVR8jRhjGMqfySsp LgsbhdUBHg0dhP4M8CgDCbO53vOYAp/5cV8qhbB3sAAKEVbFM+ZSjXJNAy7Ty6hJ 09QCcPhcmXf7THgDm5r0j6eudcAfAMNyoP0pvFWdBqfzNLpnXoUwBGo58pM1yErw ZWLIlSgnU7rtG6IXQH3RHj0Jy706KellkVFlc/Mp+21OYkhaUJDelEaXWWXrJYYl VdlfgE98fXgJR3NxyMwHBzu1wDDidTLxNiMss/kW+O+718eHSq6OQUVmsCjhNJ4P HoLeV8Cr8oGlThVJw3TQfvY7y2MK4cmD0F8pRxAJGvvH7WSFw+KoBo38477+0Tpc yYKh71HPQ3IbnmGXADmI
=0DGS
-----END PGP SIGNATURE-----

#36 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

Quoted 25 lines · Tom Rini

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 14 lines · Scott Wood
Quoted 6 lines · Beno?t Th?baudeau

Signed-off-by: Beno?t Th?baudeau <[email protected]> Cc: Scott Wood <[email protected]> Cc: Stefano Babic <[email protected]> --- Changes for v2: - Fix warning for unused tmp variable in board_nand_init() for NFC V1.

Quoted 6 lines

.../arch/arm/include/asm/arch-mx5/imx-regs.h | 9 +
.../drivers/mtd/nand/mxc_nand.c | 219
+++++++++++++++----- .../include/fsl_nfc.h

|  149 ++++++++----- .../nand_spl/nand_boot_fsl_nfc.c
|  114 +++++++--- 4 files changed, 365 insertions(+), 126

deletions(-)

Quoted 6 lines

Unless Tom or Wolfgang object, I'm inclined to drop the objection to adding new hardware support to nand_spl in this case. I'd rather see the support be merged rather than ignored because a contributor has time for a small job but not a large one. Plus, this code will likely be reused by the new SPL support, if this platform is space constrained, so it's not dead-end effort.

Quoted 2 lines

I'm OK with pulling this in while providing an on-the-record prod to please find some time to do a conversion or two in time for v2013.01.

I'm going to leave this one until there's a config added that uses it, so that we at least get compile-testing.

-Scott

#37 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

Hi Scott,

Quoted 27 lines · Scott Wood
Quoted 26 lines · Tom Rini

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 21 lines · Scott Wood
Quoted 6 lines · Beno?t Th?baudeau

Signed-off-by: Beno?t Th?baudeau <[email protected]> Cc: Scott Wood <[email protected]> Cc: Stefano Babic <[email protected]> --- Changes for v2: - Fix warning for unused tmp variable in board_nand_init() for NFC V1.

Quoted 6 lines

.../arch/arm/include/asm/arch-mx5/imx-regs.h | 9 +
.../drivers/mtd/nand/mxc_nand.c | 219
+++++++++++++++----- .../include/fsl_nfc.h

|  149 ++++++++----- .../nand_spl/nand_boot_fsl_nfc.c
|  114 +++++++--- 4 files changed, 365 insertions(+), 126

deletions(-)

Unless Tom or Wolfgang object, I'm inclined to drop the objection to adding new hardware support to nand_spl in this case. I'd rather see the support be merged rather than ignored because a contributor has time for a small job but not a large one. Plus, this code will likely be reused by the new SPL support, if this platform is space constrained, so it's not dead-end effort.

Quoted 8 lines
Quoted 4 lines

I'm OK with pulling this in while providing an on-the-record prod to
please find some time to do a conversion or two in time for v2013.01.

I'm going to leave this one until there's a config added that uses it,
so that we at least get compile-testing.

OK.

I won't be able to add my i.MX51 board to mainline before at least a few months.

It's hard to find the schematics of all the i.MX5 boards supported by mainline U-Boot. According to the links below, at least the Genesi EFIKA MX Smartbook and the Freescale MX53 ARD boards have embedded NAND. Matt, Fabio, is it possible to find the schematics of these boards somewhere?
http://www.genesi-tech.com/products/smartbook
https://community.freescale.com/thread/289468

The EFIKA MX Smartbook probably has MLC if we consider its NAND size. 4-kiB pages should be supported by nand_spl/nand_boot_fsl_nfc.c, but not yet by drivers/mtd/nand/mxc_nand.c. The latter currently has a CONFIG_SYS_NAND_LARGEPAGE to differentiate 512-B and 2-kiB pages. If we were to add support for 4-kiB pages to this driver, I think that this should be replaced with a CONFIG_SYS_NAND_PAGE_SIZE like in nand_boot_fsl_nfc.c. Do you agree?

Best regards,
Beno?t

#38 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

Quoted 4 lines · Beno?t Th?baudeau

The EFIKA MX Smartbook probably has MLC if we consider its NAND size. 4-kiB
pages should be supported by nand_spl/nand_boot_fsl_nfc.c, but not yet by

Quoted 8 lines

drivers/mtd/nand/mxc_nand.c. The latter currently has a CONFIG_SYS_NAND_LARGEPAGE to differentiate 512-B and 2-kiB pages. If we were to
add support for 4-kiB pages to this driver, I think that this should be
replaced with a CONFIG_SYS_NAND_PAGE_SIZE like in nand_boot_fsl_nfc.c. Do you
agree?

Yes.

-Scott

#39 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

Quoted 14 lines · Scott Wood
Quoted 4 lines · Beno?t Th?baudeau

The EFIKA MX Smartbook probably has MLC if we consider its NAND size. 4-kiB
pages should be supported by nand_spl/nand_boot_fsl_nfc.c, but not yet by

Quoted 8 lines

drivers/mtd/nand/mxc_nand.c. The latter currently has a CONFIG_SYS_NAND_LARGEPAGE to differentiate 512-B and 2-kiB pages. If we were to
add support for 4-kiB pages to this driver, I think that this should be
replaced with a CONFIG_SYS_NAND_PAGE_SIZE like in nand_boot_fsl_nfc.c. Do you
agree?

Quoted 1 line

Yes.

...or use the runtime detection if practical.

-Scott

#40 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

In reply to Benoît Thébaudeau
Quoted 57 lines · Beno?t Th?baudeau

Hi Scott,

Quoted 30 lines · Scott Wood
Quoted 29 lines · Tom Rini

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 24 lines · Scott Wood
Quoted 7 lines · Beno?t Th?baudeau

Signed-off-by: Beno?t Th?baudeau <[email protected]> Cc: Scott Wood <[email protected]> Cc: Stefano Babic <[email protected]>
---
Changes for v2: - Fix warning for unused tmp variable in board_nand_init() for NFC V1.

Quoted 6 lines

.../arch/arm/include/asm/arch-mx5/imx-regs.h | 9 +
.../drivers/mtd/nand/mxc_nand.c | 219
+++++++++++++++----- .../include/fsl_nfc.h

|  149 ++++++++----- .../nand_spl/nand_boot_fsl_nfc.c
|  114 +++++++--- 4 files changed, 365 insertions(+), 126

deletions(-)

Unless Tom or Wolfgang object, I'm inclined to drop the objection
to adding new hardware support to nand_spl in this case. I'd rather see the support be merged rather than ignored because a contributor has time for a small job but not a large one.
Plus,
this code will likely be reused by the new SPL support, if this platform is space constrained, so it's not dead-end effort.

Quoted 8 lines
Quoted 4 lines

I'm OK with pulling this in while providing an on-the-record prod to
please find some time to do a conversion or two in time for v2013.01.

I'm going to leave this one until there's a config added that uses it,
so that we at least get compile-testing.

OK.

I won't be able to add my i.MX51 board to mainline before at least a few months.

It's hard to find the schematics of all the i.MX5 boards supported by mainline
U-Boot. According to the links below, at least the Genesi EFIKA MX Smartbook and
the Freescale MX53 ARD boards have embedded NAND. Matt, Fabio, is it possible to
find the schematics of these boards somewhere?
http://www.genesi-tech.com/products/smartbook
https://community.freescale.com/thread/289468

Quoted 12 lines

The EFIKA MX Smartbook probably has MLC if we consider its NAND size. 4-kiB
pages should be supported by nand_spl/nand_boot_fsl_nfc.c, but not yet by
drivers/mtd/nand/mxc_nand.c. The latter currently has a CONFIG_SYS_NAND_LARGEPAGE to differentiate 512-B and 2-kiB pages. If we were to
add support for 4-kiB pages to this driver, I think that this should be
replaced with a CONFIG_SYS_NAND_PAGE_SIZE like in nand_boot_fsl_nfc.c. Do you
agree?

Also, I've noticed that some of the oobfree fields of the nand_ecclayout structures in mxc_nand.c are slightly different from what can be found in Linux. Any idea about which one is correct (if any)?

This field does not even always start at offset 0 when it looks free according to the ECC info. Is this normal?

Best regards,
Beno?t

#41 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

Quoted 5 lines · Beno?t Th?baudeau

Also, I've noticed that some of the oobfree fields of the nand_ecclayout
structures in mxc_nand.c are slightly different from what can be found in Linux.
Any idea about which one is correct (if any)?

Unless there's an obvious error such as overlap with ECC or a bad block marker, there isn't really a right answer (except to the extent that you're wasting bytes) -- but it's important that everyone agree. So the answer is basically, "which compatibility would it hurt more to break?"

That said, the U-Boot ones make more sense to me in terms of not having strange missing bytes.

Quoted 3 lines

This field does not even always start at offset 0 when it looks free according
to the ECC info. Is this normal?

Yes. Bad block markers are at offset zero except on 8-bit 512b-page chips.

-Scott

#42 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

Hi Scott,

Quoted 14 lines · Scott Wood
Quoted 5 lines · Beno?t Th?baudeau

Also, I've noticed that some of the oobfree fields of the nand_ecclayout
structures in mxc_nand.c are slightly different from what can be found in Linux.
Any idea about which one is correct (if any)?

Unless there's an obvious error such as overlap with ECC or a bad block
marker, there isn't really a right answer (except to the extent that you're wasting bytes) -- but it's important that everyone agree. So the answer is basically, "which compatibility would it hurt more to break?"

Quoted 3 lines

That said, the U-Boot ones make more sense to me in terms of not having
strange missing bytes.

I've just found this commit, which explains what's going on:
http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=commitdiff;h=8c1fd89a85f898384df02217c09c98c2f39b4832

It looks like Linux is correct here because each structure is used for both 8- and 16-bit NFs, which seem to have different locations for bad block markers.

This fix is also missing from U-Boot:
http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=commitdiff;h=6c49939869c20550512386610ece45aceb65e7f4
It would help to drop some of the pagesize_2k that are weirdly mixed with writesize.

Best regards,
Beno?t

#43 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

Quoted 17 lines · Beno?t Th?baudeau

Hi Scott,

Quoted 14 lines · Scott Wood
Quoted 5 lines · Beno?t Th?baudeau

Also, I've noticed that some of the oobfree fields of the nand_ecclayout
structures in mxc_nand.c are slightly different from what can be found in Linux.
Any idea about which one is correct (if any)?

Unless there's an obvious error such as overlap with ECC or a bad block
marker, there isn't really a right answer (except to the extent that you're wasting bytes) -- but it's important that everyone agree. So the answer is basically, "which compatibility would it hurt more to break?"

Quoted 6 lines
Quoted 3 lines

That said, the U-Boot ones make more sense to me in terms of not having
strange missing bytes.

I've just found this commit, which explains what's going on:
http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=commitdiff;h=8c1fd89a85f898384df02217c09c98c2f39b4832

I don't understand the bit about "on 16bit flashes it is on byte 11" -- I thought with 16-bit NAND the bad block marker was always at offset zero, even on small-page NAND.

-Scott

#44 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

Quoted 26 lines · Scott Wood
Quoted 25 lines · Beno?t Th?baudeau

Hi Scott,

Quoted 21 lines · Scott Wood
Quoted 6 lines · Beno?t Th?baudeau

Also, I've noticed that some of the oobfree fields of the nand_ecclayout
structures in mxc_nand.c are slightly different from what can be
found in Linux.
Any idea about which one is correct (if any)?

Unless there's an obvious error such as overlap with ECC or a bad block
marker, there isn't really a right answer (except to the extent that
you're wasting bytes) -- but it's important that everyone agree.
So
the answer is basically, "which compatibility would it hurt more to
break?"

That said, the U-Boot ones make more sense to me in terms of not having
strange missing bytes.

Quoted 7 lines
Quoted 2 lines

I've just found this commit, which explains what's going on:
http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=commitdiff;h=8c1fd89a85f898384df02217c09c98c2f39b4832

I don't understand the bit about "on 16bit flashes it is on byte 11" --
I thought with 16-bit NAND the bad block marker was always at offset zero, even on small-page NAND.

Indeed, you're right. After having seen this comment, I've looked for 16-bit NANDs with a bad block marker on byte 11, but haven't found any. However, for NFC v1 (e.g. i.MX31's), the reference manual gives this position for bad block information for 16-bit spare area layout. I don't know why. This is really weird. And the RM also says not to use this byte as general purpose, just like ECC bytes, as if it were used by the NFC itself. Even if some NANDs exist somewhere using this offset, they're far from being the most common, so I don't know why the reference manual would mention this byte and not bytes 0 and 1.

Best regards,
Beno?t

reviewer
#45 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

In reply to Benoît Thébaudeau
Quoted 4 lines · Beno?t Th?baudeau

It's hard to find the schematics of all the i.MX5 boards supported by mainline U-Boot. According to the links below, at least the Genesi EFIKA MX Smartbook and the Freescale MX53 ARD boards have embedded NAND. Matt, Fabio, is it possible to find the schematics of these boards somewhere?

Yes, will send you offline.

Regards,

Fabio Estevam

#46 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

Hi Benoit,

Just a FYI the Efika MX products use PATA devices (Sandisk pSSD-P2 or similar) so it's not a good test. We do have an MX53 board with NAND on the NFC - but we're sticking with Freescale's BSP U-Boot for the time being on that particular product. If I can schedule some time for it I will test it.

Matt Sealey <[email protected]>
Product Development Analyst, Genesi USA, Inc.

Quoted 21 lines · Fabio Estevam
Quoted 1 line · Beno?t Th?baudeau

It's hard to find the schematics of all the i.MX5 boards supported by

mainline

Quoted 1 line

U-Boot. According to the links below, at least the Genesi EFIKA MX

Smartbook and

Quoted 1 line

the Freescale MX53 ARD boards have embedded NAND. Matt, Fabio, is it

possible to

Quoted 1 line

find the schematics of these boards somewhere?

Yes, will send you offline.

Regards,

Fabio Estevam
_______________________________________________
U-Boot mailing list
U-Boot at lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

#47 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

In reply to Benoît Thébaudeau
Quoted 7 lines · Beno?t Th?baudeau

---
Changes for v2:
- Fix warning for unused tmp variable in board_nand_init() for NFC V1.

Quoted 5 lines
 .../arch/arm/include/asm/arch-mx5/imx-regs.h       |    9 +
 .../drivers/mtd/nand/mxc_nand.c                    |  219 +++++++++++++++-----
 .../include/fsl_nfc.h                              |  149 ++++++++-----
 .../nand_spl/nand_boot_fsl_nfc.c                   |  114 +++++++---
 4 files changed, 365 insertions(+), 126 deletions(-)

Is there a board that uses this?

-Scott

#48 lore raw

PATCH v2 13/13 mxc nand: Add support for i.MX5

Hi Scott,

Quoted 18 lines · Scott Wood
Quoted 8 lines · Beno?t Th?baudeau

---
Changes for v2:
- Fix warning for unused tmp variable in board_nand_init() for NFC V1.

Quoted 8 lines
 .../arch/arm/include/asm/arch-mx5/imx-regs.h       |    9 +
 .../drivers/mtd/nand/mxc_nand.c                    |  219
 +++++++++++++++-----
 .../include/fsl_nfc.h                              |  149
 ++++++++-----
 .../nand_spl/nand_boot_fsl_nfc.c                   |  114
 +++++++---
 4 files changed, 365 insertions(+), 126 deletions(-)
Quoted 1 line

Is there a board that uses this?

I have one, but it's not yet ready for mainline.

Some of the current mx51 and mx53 mainline boards could also probably use that as an alternate boot option, but I don't have them to test.

Best regards,
Beno?t

#49 lore raw

cover mxc nand: Add support for i.MX5

In reply to Benoît Thébaudeau
Quoted 4 lines · Beno?t Th?baudeau

Hi all,

This series aims at adding support for i.MX5 to the mxc nand mtd and spl drivers. It also fixes several issues and cleans up the code a little bit.

Applied patches 1-12 to u-boot-nand-flash. For patch 13 I'm waiting to see what Tom says, and for an answer regarding what board uses this (i.e. how can I build-test it?).

-Scott

#50 lore raw

cover mxc nand: Add support for i.MX5

In reply to Benoît Thébaudeau

Dear Beno?t Th?baudeau,

Quoted 7 lines

Hi all,

This series aims at adding support for i.MX5 to the mxc nand mtd and spl drivers. It also fixes several issues and cleans up the code a little bit.

Best regards,
Beno?t

Did this patchset advance any further? Any chance we can see this applied? Anything I can help with to make it applied?

Best regards,
Marek Vasut

#51 lore raw

cover mxc nand: Add support for i.MX5

Dear Marek Vasut,

Quoted 9 lines · Marek Vasut

Dear Beno?t Th?baudeau,

Quoted 7 lines

Hi all,

This series aims at adding support for i.MX5 to the mxc nand mtd and spl
drivers. It also fixes several issues and cleans up the code a little bit.

Quoted 6 lines
Quoted 2 lines

Best regards,
Beno?t

Did this patchset advance any further? Any chance we can see this applied?
Anything I can help with to make it applied?

Only 13/13 has not yet been applied. I still have to add NFC support to one i.MX5 board for the patch to be accepted. Fabio has confirmed that mx53ard would be fine.

Fabio, can you give me the reference of the NAND Flash that you will use for testing on i.MX53? That will allow me to adjust the NFC clock and to know if I also have to add support for 4-kiB pages or multi-CS.

Marek, I hope to find some time soon to finish this, but if you can work on the remaining tasks, that's also fine with me. Thanks.

Best regards,
Beno?t

#52 lore raw

cover mxc nand: Add support for i.MX5

Dear Beno?t Th?baudeau,

Quoted 15 lines

Dear Marek Vasut,

Quoted 12 lines · Marek Vasut

Dear Beno?t Th?baudeau,

Quoted 9 lines

Hi all,

This series aims at adding support for i.MX5 to the mxc nand mtd and spl
drivers. It also fixes several issues and cleans up the code a little bit.

Best regards,
Beno?t

Quoted 7 lines
Quoted 3 lines

Did this patchset advance any further? Any chance we can see this applied?
Anything I can help with to make it applied?

Only 13/13 has not yet been applied. I still have to add NFC support to one i.MX5 board for the patch to be accepted. Fabio has confirmed that mx53ard would be fine.

Sigh ... I have board with NAND pending, so Scott, please apply.

Quoted 6 lines

Fabio, can you give me the reference of the NAND Flash that you will use for testing on i.MX53? That will allow me to adjust the NFC clock and to know if I also have to add support for 4-kiB pages or multi-CS.

Marek, I hope to find some time soon to finish this, but if you can work on the remaining tasks, that's also fine with me. Thanks.

I'll test it in a bit.

Quoted 2 lines

Best regards,
Beno?t

Best regards,
Marek Vasut

#53 lore raw

cover mxc nand: Add support for i.MX5

Quoted 21 lines · Marek Vasut

Dear Beno?t Th?baudeau,

Quoted 19 lines

Dear Marek Vasut,

Quoted 15 lines · Marek Vasut

Dear Beno?t Th?baudeau,

Quoted 9 lines

Hi all,

This series aims at adding support for i.MX5 to the mxc nand mtd and spl
drivers. It also fixes several issues and cleans up the code a little bit.

Best regards,
Beno?t

Did this patchset advance any further? Any chance we can see this applied?
Anything I can help with to make it applied?

Quoted 7 lines
Quoted 1 line

Only 13/13 has not yet been applied. I still have to add NFC

support to one

Quoted 1 line

i.MX5 board for the patch to be accepted. Fabio has confirmed that

mx53ard

Quoted 1 line

would be fine.

Sigh ... I have board with NAND pending, so Scott, please apply.

Can you repost it as part of a patchset with that board, and I'll ack so they can go together?

Does this board do NAND boot? If so, new-SPL rather than nand_spl would be nice. Tom's comment at the time was, "I'm OK with pulling this in while providing an on-the-record prod to please find some time to do a conversion or two in time for v2013.01." If this patch is applied now, it would be for the release after v2013.01...

-Scott

#54 lore raw

cover mxc nand: Add support for i.MX5

Dear Scott Wood,

Quoted 28 lines · Marek Vasut
Quoted 27 lines

Dear Beno?t Th?baudeau,

Quoted 12 lines

Dear Marek Vasut,

Quoted 9 lines · Marek Vasut

Dear Beno?t Th?baudeau,

Quoted 7 lines

Hi all,

This series aims at adding support for i.MX5 to the mxc nand mtd and spl
drivers. It also fixes several issues and cleans up the code a little bit.

Quoted 8 lines
Quoted 6 lines
Quoted 2 lines

Best regards,
Beno?t

Did this patchset advance any further? Any chance we can see this applied?
Anything I can help with to make it applied?

Only 13/13 has not yet been applied. I still have to add NFC

support to one

Quoted 1 line

i.MX5 board for the patch to be accepted. Fabio has confirmed that

Quoted 8 lines
Quoted 5 lines

mx53ard

Quoted 1 line

would be fine.

Sigh ... I have board with NAND pending, so Scott, please apply.

Can you repost it as part of a patchset with that board, and I'll ack so they can go together?

I found an issue with the patch, so will do.

Quoted 1 line

Does this board do NAND boot?

No, boots from other means.

Quoted 5 lines

If so, new-SPL rather than nand_spl
would be nice. Tom's comment at the time was, "I'm OK with pulling this in while providing an on-the-record prod to please find some time to do a conversion or two in time for v2013.01." If this patch is applied now, it would be for the release after v2013.01...

No prob.

Quoted 1 line

-Scott

Best regards,
Marek Vasut

reviewer
#55 lore raw

cover mxc nand: Add support for i.MX5

In reply to Benoît Thébaudeau

Hi Beno?t,

Quoted 3 lines · Beno?t Th?baudeau

Fabio, can you give me the reference of the NAND Flash that you will use for testing on i.MX53? That will allow me to adjust the NFC clock and to know if I also have to add support for 4-kiB pages or multi-CS.

The NAND I have is a K9LAG08U0M.

Thanks,

Fabio Estevam

#56 lore raw

cover mxc nand: Add support for i.MX5

Dear Fabio Estevam,

Quoted 10 lines

Hi Beno?t,

On Mon, Jan 7, 2013 at 11:37 AM, Beno?t Th?baudeau

Quoted 3 lines · <[email protected]> wrote:

Fabio, can you give me the reference of the NAND Flash that you will use for testing on i.MX53? That will allow me to adjust the NFC clock and to know if I also have to add support for 4-kiB pages or multi-CS.

The NAND I have is a K9LAG08U0M.

Do you guys happen to have include/config/<config>.h section for the MX5 NFC ? esp. this CONFIG_MXC_NAND_IP_REGS_BASE is what I don't quite get how it fits in.

Thanks!

Best regards,
Marek Vasut

#57 lore raw

cover mxc nand: Add support for i.MX5

Dear Marek Vasut,

Quoted 13 lines · Marek Vasut

Dear Fabio Estevam,

Quoted 11 lines

Hi Beno?t,

On Mon, Jan 7, 2013 at 11:37 AM, Beno?t Th?baudeau

Quoted 5 lines · <[email protected]> wrote:

Fabio, can you give me the reference of the NAND Flash that you will use
for testing on i.MX53? That will allow me to adjust the NFC clock and to
know if I also have to add support for 4-kiB pages or multi-CS.

Quoted 6 lines
Quoted 1 line

The NAND I have is a K9LAG08U0M.

Do you guys happen to have include/config/<config>.h section for the MX5 NFC ?
esp. this CONFIG_MXC_NAND_IP_REGS_BASE is what I don't quite get how it fits in.

Here is this section for my custom i.MX51 board:

#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE NFC_BASE_ADDR_AXI
#define CONFIG_NAND_MXC
#define CONFIG_MXC_NAND_REGS_BASE NFC_BASE_ADDR_AXI
#define CONFIG_MXC_NAND_IP_REGS_BASE NFC_BASE_ADDR
#define CONFIG_SYS_NAND_LARGEPAGE
#define CONFIG_MXC_NAND_HWECC
#define CONFIG_SYS_NAND_USE_FLASH_BBT

Best regards,
Beno?t

#58 lore raw

cover mxc nand: Add support for i.MX5

Dear Beno?t Th?baudeau,

Quoted 8 lines

#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE NFC_BASE_ADDR_AXI
#define CONFIG_NAND_MXC
#define CONFIG_MXC_NAND_REGS_BASE NFC_BASE_ADDR_AXI
#define CONFIG_MXC_NAND_IP_REGS_BASE NFC_BASE_ADDR
#define CONFIG_SYS_NAND_LARGEPAGE
#define CONFIG_MXC_NAND_HWECC
#define CONFIG_SYS_NAND_USE_FLASH_BBT

Thanks!

Best regards,
Marek Vasut

#59 lore raw

cover mxc nand: Add support for i.MX5

In reply to Benoît Thébaudeau

Dear Beno?t Th?baudeau,

Quoted 25 lines

Dear Marek Vasut,

Quoted 13 lines · Marek Vasut

Dear Fabio Estevam,

Quoted 11 lines

Hi Beno?t,

On Mon, Jan 7, 2013 at 11:37 AM, Beno?t Th?baudeau

Quoted 5 lines · <[email protected]> wrote:

Fabio, can you give me the reference of the NAND Flash that you will use
for testing on i.MX53? That will allow me to adjust the NFC clock and to
know if I also have to add support for 4-kiB pages or multi-CS.

Quoted 6 lines
Quoted 1 line

The NAND I have is a K9LAG08U0M.

Do you guys happen to have include/config/<config>.h section for the MX5 NFC ?
esp. this CONFIG_MXC_NAND_IP_REGS_BASE is what I don't quite get how it fits in.

Here is this section for my custom i.MX51 board:

Quoted 8 lines

#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE NFC_BASE_ADDR_AXI
#define CONFIG_NAND_MXC
#define CONFIG_MXC_NAND_REGS_BASE NFC_BASE_ADDR_AXI
#define CONFIG_MXC_NAND_IP_REGS_BASE NFC_BASE_ADDR
#define CONFIG_SYS_NAND_LARGEPAGE
#define CONFIG_MXC_NAND_HWECC
#define CONFIG_SYS_NAND_USE_FLASH_BBT

Benoit, not much luck with this stuff. Am I missing something else? I believe I configured pinmux, I enabled the NAND clock too. But maybe there's something else? Can you send me some patch that enables use of this NAND driver on your MX5 platform?

Best regards,
Marek Vasut

#60 lore raw

cover mxc nand: Add support for i.MX5

Dear Marek Vasut,

Quoted 41 lines · Marek Vasut

Dear Beno?t Th?baudeau,

Quoted 30 lines

Dear Marek Vasut,

Quoted 16 lines · Marek Vasut

Dear Fabio Estevam,

Quoted 14 lines

Hi Beno?t,

On Mon, Jan 7, 2013 at 11:37 AM, Beno?t Th?baudeau

Quoted 8 lines · <[email protected]> wrote:

Fabio, can you give me the reference of the NAND Flash that you
will use
for testing on i.MX53? That will allow me to adjust the NFC clock
and to
know if I also have to add support for 4-kiB pages or multi-CS.

Quoted 8 lines
Quoted 1 line

The NAND I have is a K9LAG08U0M.

Do you guys happen to have include/config/<config>.h section for the
MX5 NFC ?
esp. this CONFIG_MXC_NAND_IP_REGS_BASE is what I don't quite get how
it fits in.

Here is this section for my custom i.MX51 board:

Quoted 8 lines

#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE NFC_BASE_ADDR_AXI
#define CONFIG_NAND_MXC
#define CONFIG_MXC_NAND_REGS_BASE NFC_BASE_ADDR_AXI
#define CONFIG_MXC_NAND_IP_REGS_BASE NFC_BASE_ADDR
#define CONFIG_SYS_NAND_LARGEPAGE
#define CONFIG_MXC_NAND_HWECC
#define CONFIG_SYS_NAND_USE_FLASH_BBT

Quoted 7 lines

Benoit, not much luck with this stuff. Am I missing something else? I believe I
configured pinmux, I enabled the NAND clock too. But maybe there's something
else? Can you send me some patch that enables use of this NAND driver on your
MX5 platform?

Did you check that the NFC clock frequency is compatible with your NAND Flash?

Are your running this on i.MX51 or i.MX53?

Are you booting from NAND, or are you just accessing NAND after another source of boot?

Which NAND Flash reference are you using? As I mentioned, 4-kiB pages and multi-CS are not yet supported.

Pinmux should be NFC-ready by default (at least for CS0 on i.MX51).

What did you test and what did you get?

I don't think that I have a simple patch for what you ask. Can you instead send me your patch, and I'll take a look at it?

Best regards,
Beno?t

#61 lore raw

cover mxc nand: Add support for i.MX5

Dear Beno?t Th?baudeau,

Thanks for your help. I think I got it working, so I'll patch it up a bit and submit it.

Best regards,
Marek Vasut