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 <[EMAIL PROTECTED]>
---
 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
         */
-- 
1.5.4


-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
U-Boot-Users mailing list
U-Boot-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/u-boot-users

Reply via email to