nand_spl: Support page-aligned read in nand_load, use chipselect

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>
Signed-off-by: Scott Wood <scottwood@freescale.com>
master
Guennadi Liakhovetski 17 years ago committed by Scott Wood
parent 4f32d7760a
commit aa646643b6
  1. 30
      nand_spl/nand_boot.c

@ -131,7 +131,7 @@ static int nand_is_bad_block(struct mtd_info *mtd, int block)
/* /*
* Read one byte * Read one byte
*/ */
if (in_8(this->IO_ADDR_R) != 0xff) if (readb(this->IO_ADDR_R) != 0xff)
return 1; return 1;
return 0; return 0;
@ -184,29 +184,33 @@ static int nand_read_page(struct mtd_info *mtd, int block, int page, uchar *dst)
return 0; return 0;
} }
static int nand_load(struct mtd_info *mtd, int offs, int uboot_size, uchar *dst) static int nand_load(struct mtd_info *mtd, unsigned int offs,
unsigned int uboot_size, uchar *dst)
{ {
int block; unsigned int block, lastblock;
int blockcopy_count; unsigned int page;
int page;
/* /*
* offs has to be aligned to a block address! * offs has to be aligned to a page address!
*/ */
block = offs / CFG_NAND_BLOCK_SIZE; block = offs / CFG_NAND_BLOCK_SIZE;
blockcopy_count = 0; lastblock = (offs + uboot_size - 1) / CFG_NAND_BLOCK_SIZE;
page = (offs % CFG_NAND_BLOCK_SIZE) / CFG_NAND_PAGE_SIZE;
while (blockcopy_count < (uboot_size / CFG_NAND_BLOCK_SIZE)) { while (block <= lastblock) {
if (!nand_is_bad_block(mtd, block)) { if (!nand_is_bad_block(mtd, block)) {
/* /*
* Skip bad blocks * Skip bad blocks
*/ */
for (page = 0; page < CFG_NAND_PAGE_COUNT; page++) { while (page < CFG_NAND_PAGE_COUNT) {
nand_read_page(mtd, block, page, dst); nand_read_page(mtd, block, page, dst);
dst += CFG_NAND_PAGE_SIZE; dst += CFG_NAND_PAGE_SIZE;
page++;
} }
blockcopy_count++; page = 0;
} else {
lastblock++;
} }
block++; block++;
@ -235,12 +239,18 @@ void nand_boot(void)
nand_chip.dev_ready = NULL; /* preset to NULL */ nand_chip.dev_ready = NULL; /* preset to NULL */
board_nand_init(&nand_chip); 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 * Load U-Boot image from NAND into RAM
*/ */
ret = nand_load(&nand_info, CFG_NAND_U_BOOT_OFFS, CFG_NAND_U_BOOT_SIZE, ret = nand_load(&nand_info, CFG_NAND_U_BOOT_OFFS, CFG_NAND_U_BOOT_SIZE,
(uchar *)CFG_NAND_U_BOOT_DST); (uchar *)CFG_NAND_U_BOOT_DST);
if (nand_chip.select_chip)
nand_chip.select_chip(&nand_info, -1);
/* /*
* Jump to U-Boot image * Jump to U-Boot image
*/ */

Loading…
Cancel
Save