
Supporting page-aligned reads doesn't incure any sinificant overhead, just a small change in the algorithm. Also replace in_8 with readb, since there is no in_8 on ARM.
Signed-off-by: Guennadi Liakhovetski lg@denx.de --- nand_spl/nand_boot.c | 22 +++++++++++++++++----- 1 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/nand_spl/nand_boot.c b/nand_spl/nand_boot.c index 81b4dfc..02ccfa8 100644 --- a/nand_spl/nand_boot.c +++ b/nand_spl/nand_boot.c @@ -131,7 +131,7 @@ static int nand_is_bad_block(struct mtd_info *mtd, int block) /* * Read one byte */ - if (in_8(this->IO_ADDR_R) != 0xff) + if (readb(this->IO_ADDR_R) != 0xff) return 1;
return 0; @@ -186,24 +186,30 @@ static int nand_read_page(struct mtd_info *mtd, int block, int page, uchar *dst)
static int nand_load(struct mtd_info *mtd, int offs, int uboot_size, uchar *dst) { - int block; + int block, blocks; int blockcopy_count; int page; + unsigned int read = 0;
/* - * offs has to be aligned to a block address! + * offs has to be aligned to a page address! */ block = offs / CFG_NAND_BLOCK_SIZE; + blocks = (uboot_size + offs - ((block - 1) * CFG_NAND_BLOCK_SIZE) - 1) / + CFG_NAND_BLOCK_SIZE; blockcopy_count = 0;
- while (blockcopy_count < (uboot_size / CFG_NAND_BLOCK_SIZE)) { + while (blockcopy_count < blocks) { if (!nand_is_bad_block(mtd, block)) { /* * Skip bad blocks */ for (page = 0; page < CFG_NAND_PAGE_COUNT; page++) { nand_read_page(mtd, block, page, dst); - dst += CFG_NAND_PAGE_SIZE; + /* Overwrite skipped pages */ + if (read >= offs) + dst += CFG_NAND_PAGE_SIZE; + read += CFG_NAND_PAGE_SIZE; }
blockcopy_count++; @@ -235,12 +241,18 @@ void nand_boot(void) nand_chip.dev_ready = NULL; /* preset to NULL */ board_nand_init(&nand_chip);
+ if (nand_chip.select_chip) + nand_chip.select_chip(&nand_info, 0); + /* * Load U-Boot image from NAND into RAM */ ret = nand_load(&nand_info, CFG_NAND_U_BOOT_OFFS, CFG_NAND_U_BOOT_SIZE, (uchar *)CFG_NAND_U_BOOT_DST);
+ if (nand_chip.select_chip) + nand_chip.select_chip(&nand_info, -1); + /* * Jump to U-Boot image */