[PATCH 1/4] ARM: i.MX: external nand boot: check for bad blocks
Sascha Hauer
s.hauer at pengutronix.de
Tue Mar 12 05:29:54 EDT 2013
The i.MX external NAND boot code checks for a bad block every
page, which is wrong. Instead, check for a bad block at the
beginning of each block.
Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
arch/arm/mach-imx/external-nand-boot.c | 39 +++++++++++++++++++++++-----------
1 file changed, 27 insertions(+), 12 deletions(-)
diff --git a/arch/arm/mach-imx/external-nand-boot.c b/arch/arm/mach-imx/external-nand-boot.c
index 73c4ccd..bfefa3c 100644
--- a/arch/arm/mach-imx/external-nand-boot.c
+++ b/arch/arm/mach-imx/external-nand-boot.c
@@ -154,6 +154,14 @@ static int __maybe_unused is_pagesize_2k(void)
#endif
}
+static noinline void __bare_init imx_nandboot_get_page(void *regs,
+ u32 offs, int pagesize_2k)
+{
+ imx_nandboot_send_cmd(regs, NAND_CMD_READ0);
+ imx_nandboot_nfc_addr(regs, offs, pagesize_2k);
+ imx_nandboot_send_page(regs, NFC_OUTPUT, pagesize_2k);
+}
+
void __bare_init imx_nand_load_image(void *dest, int size)
{
u32 tmp, page, block, blocksize, pagesize;
@@ -227,26 +235,33 @@ void __bare_init imx_nand_load_image(void *dest, int size)
while (1) {
page = 0;
+
+ imx_nandboot_get_page(regs, block * blocksize +
+ page * pagesize, pagesize_2k);
+
+ if (pagesize_2k) {
+ if ((readw(spare0) & 0xff) != 0xff) {
+ block++;
+ continue;
+ }
+ } else {
+ if ((readw(spare0 + 4) & 0xff00) != 0xff00) {
+ block++;
+ continue;
+ }
+ }
+
while (page * pagesize < blocksize) {
debug("page: %d block: %d dest: %p src "
"0x%08x\n",
page, block, dest,
block * blocksize +
page * pagesize);
-
- imx_nandboot_send_cmd(regs, NAND_CMD_READ0);
- imx_nandboot_nfc_addr(regs, block * blocksize +
+ if (page)
+ imx_nandboot_get_page(regs, block * blocksize +
page * pagesize, pagesize_2k);
- imx_nandboot_send_page(regs, NFC_OUTPUT, pagesize_2k);
- page++;
- if (pagesize_2k) {
- if ((readw(spare0) & 0xff) != 0xff)
- continue;
- } else {
- if ((readw(spare0 + 4) & 0xff00) != 0xff00)
- continue;
- }
+ page++;
__memcpy32(dest, base, pagesize);
dest += pagesize;
--
1.8.2.rc2
More information about the barebox
mailing list