]> git.karo-electronics.de Git - karo-tx-uboot.git/commitdiff
nand_spl_simple: store ecc data on the stack
authorStefano Babic <sbabic@denx.de>
Thu, 15 Dec 2011 09:55:37 +0000 (10:55 +0100)
committerScott Wood <scottwood@freescale.com>
Thu, 26 Jan 2012 22:06:21 +0000 (16:06 -0600)
Currently nand_spl_simple puts it's temp data at 0x10000 offset in SDRAM
which is likely to contain already loaded data.
The patch saves the oob data and the ecc on the stack replacing
the fixed address in RAM.

Signed-off-by: Stefano Babic <sbabic@denx.de>
CC: Ilya Yanok <yanok@emcraft.com>
CC: Scott Wood <scottwood@freescale.com>
CC: Tom Rini <tom.rini@gmail.com>
CC: Simon Schwarz <simonschwarzcor@googlemail.com>
CC: Wolfgang Denk <wd@denx.de>
Signed-off-by: Scott Wood <scottwood@freescale.com>
drivers/mtd/nand/nand_spl_simple.c
include/configs/am3517_crane.h
include/configs/am3517_evm.h
include/configs/devkit8000.h
include/configs/hawkboard.h
include/configs/omap3_beagle.h
include/configs/omap3_evm.h
include/configs/omap3_evm_quick_nand.h

index 7eb08a3b089dfdfb9d031caba651fe62967fc540..4a4d02f4c8b5c1c4d95c8735a52862ab4c7fd4fe 100644 (file)
@@ -27,6 +27,11 @@ static int nand_ecc_pos[] = CONFIG_SYS_NAND_ECCPOS;
 static nand_info_t mtd;
 static struct nand_chip nand_chip;
 
+#define ECCSTEPS       (CONFIG_SYS_NAND_PAGE_SIZE / \
+                                       CONFIG_SYS_NAND_ECCSIZE)
+#define ECCTOTAL       (ECCSTEPS * CONFIG_SYS_NAND_ECCBYTES)
+
+
 #if (CONFIG_SYS_NAND_PAGE_SIZE <= 512)
 /*
  * NAND command for small page NAND devices (512)
@@ -145,29 +150,21 @@ static int nand_is_bad_block(int block)
 static int nand_read_page(int block, int page, uchar *dst)
 {
        struct nand_chip *this = mtd.priv;
-       u_char *ecc_calc;
-       u_char *ecc_code;
-       u_char *oob_data;
+       u_char ecc_calc[ECCTOTAL];
+       u_char ecc_code[ECCTOTAL];
+       u_char oob_data[CONFIG_SYS_NAND_OOBSIZE];
        int i;
        int eccsize = CONFIG_SYS_NAND_ECCSIZE;
        int eccbytes = CONFIG_SYS_NAND_ECCBYTES;
-       int eccsteps = CONFIG_SYS_NAND_ECCSTEPS;
+       int eccsteps = ECCSTEPS;
        uint8_t *p = dst;
 
-       /*
-        * No malloc available for now, just use some temporary locations
-        * in SDRAM
-        */
-       ecc_calc = (u_char *)(CONFIG_SYS_SDRAM_BASE + 0x10000);
-       ecc_code = ecc_calc + 0x100;
-       oob_data = ecc_calc + 0x200;
-
        nand_command(block, page, 0, NAND_CMD_READOOB);
        this->read_buf(&mtd, oob_data, CONFIG_SYS_NAND_OOBSIZE);
        nand_command(block, page, 0, NAND_CMD_READ0);
 
        /* Pick the ECC bytes out of the oob data */
-       for (i = 0; i < CONFIG_SYS_NAND_ECCTOTAL; i++)
+       for (i = 0; i < ECCTOTAL; i++)
                ecc_code[i] = oob_data[nand_ecc_pos[i]];
 
 
@@ -184,24 +181,17 @@ static int nand_read_page(int block, int page, uchar *dst)
 static int nand_read_page(int block, int page, void *dst)
 {
        struct nand_chip *this = mtd.priv;
-       u_char *ecc_calc;
-       u_char *ecc_code;
-       u_char *oob_data;
+       u_char ecc_calc[ECCTOTAL];
+       u_char ecc_code[ECCTOTAL];
+       u_char oob_data[CONFIG_SYS_NAND_OOBSIZE];
        int i;
        int eccsize = CONFIG_SYS_NAND_ECCSIZE;
        int eccbytes = CONFIG_SYS_NAND_ECCBYTES;
-       int eccsteps = CONFIG_SYS_NAND_ECCSTEPS;
+       int eccsteps = ECCSTEPS;
        uint8_t *p = dst;
 
        nand_command(block, page, 0, NAND_CMD_READ0);
 
-       /* No malloc available for now, just use some temporary locations
-        * in SDRAM
-        */
-       ecc_calc = (u_char *)(CONFIG_SYS_SDRAM_BASE + 0x10000);
-       ecc_code = ecc_calc + 0x100;
-       oob_data = ecc_calc + 0x200;
-
        for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
                if (this->ecc.mode != NAND_ECC_SOFT)
                        this->ecc.hwctl(&mtd, NAND_ECC_READ);
@@ -211,10 +201,10 @@ static int nand_read_page(int block, int page, void *dst)
        this->read_buf(&mtd, oob_data, CONFIG_SYS_NAND_OOBSIZE);
 
        /* Pick the ECC bytes out of the oob data */
-       for (i = 0; i < CONFIG_SYS_NAND_ECCTOTAL; i++)
+       for (i = 0; i < ECCTOTAL; i++)
                ecc_code[i] = oob_data[nand_ecc_pos[i]];
 
-       eccsteps = CONFIG_SYS_NAND_ECCSTEPS;
+       eccsteps = ECCSTEPS;
        p = dst;
 
        for (i = 0 ; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
index 0a0c261bf9507c1e9b5a2a200f8f1c355d2b2f44..b0dd2f0af61ff1f2ceb9ad8386909791e1b9b67a 100644 (file)
                                                10, 11, 12, 13}
 #define CONFIG_SYS_NAND_ECCSIZE                512
 #define CONFIG_SYS_NAND_ECCBYTES       3
-#define CONFIG_SYS_NAND_ECCSTEPS       (CONFIG_SYS_NAND_PAGE_SIZE / \
-                                               CONFIG_SYS_NAND_ECCSIZE)
-#define CONFIG_SYS_NAND_ECCTOTAL       (CONFIG_SYS_NAND_ECCBYTES * \
-                                               CONFIG_SYS_NAND_ECCSTEPS)
 #define CONFIG_SYS_NAND_U_BOOT_START   CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x80000
 
index d44eeec5b68b98956ac946cb162c5e1919fbd8b1..f797f3ffd97f0425614404e4b78ef0a980495e18 100644 (file)
                                                10, 11, 12, 13}
 #define CONFIG_SYS_NAND_ECCSIZE                512
 #define CONFIG_SYS_NAND_ECCBYTES       3
-#define CONFIG_SYS_NAND_ECCSTEPS       (CONFIG_SYS_NAND_PAGE_SIZE / \
-                                               CONFIG_SYS_NAND_ECCSIZE)
-#define CONFIG_SYS_NAND_ECCTOTAL       (CONFIG_SYS_NAND_ECCBYTES * \
-                                               CONFIG_SYS_NAND_ECCSTEPS)
 #define CONFIG_SYS_NAND_U_BOOT_START   CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x80000
 
index 758326bb9dddbd5099dfee5007b56618721cad4b..2b6a6ee091815a36162f7d601d0a71aaa28b8ff4 100644 (file)
 #define CONFIG_SYS_NAND_ECCSIZE                512
 #define CONFIG_SYS_NAND_ECCBYTES       3
 
-#define CONFIG_SYS_NAND_ECCSTEPS       (CONFIG_SYS_NAND_PAGE_SIZE / \
-                                               CONFIG_SYS_NAND_ECCSIZE)
-#define CONFIG_SYS_NAND_ECCTOTAL       (CONFIG_SYS_NAND_ECCBYTES * \
-                                               CONFIG_SYS_NAND_ECCSTEPS)
-
 #define CONFIG_SYS_NAND_U_BOOT_START   CONFIG_SYS_TEXT_BASE
 
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x80000
index 12acb27aef7e4e68d8d8b3374bd469b99e1fb177..65b3b78abecba32175ffd3e9d1af5551f1880221 100644 (file)
 #define CONFIG_SYS_NAND_BAD_BLOCK_POS  0
 #define CONFIG_SYS_NAND_ECCSIZE                512
 #define CONFIG_SYS_NAND_ECCBYTES       10
-#define CONFIG_SYS_NAND_ECCSTEPS       (CONFIG_SYS_NAND_PAGE_SIZE /     \
-                                        CONFIG_SYS_NAND_ECCSIZE)
 #define CONFIG_SYS_NAND_OOBSIZE                64
-#define CONFIG_SYS_NAND_ECCTOTAL       (CONFIG_SYS_NAND_ECCBYTES *     \
-                                       CONFIG_SYS_NAND_ECCSTEPS)
+
 #endif /* CONFIG_SYS_USE_NAND */
 
 /*
index 91af8a025697b0055b87d135db0034b3e6b3e117..4c7a686d390b713be73d930b51f34c93dac0581b 100644 (file)
                                                10, 11, 12, 13}
 #define CONFIG_SYS_NAND_ECCSIZE                512
 #define CONFIG_SYS_NAND_ECCBYTES       3
-#define CONFIG_SYS_NAND_ECCSTEPS       (CONFIG_SYS_NAND_PAGE_SIZE / \
-                                               CONFIG_SYS_NAND_ECCSIZE)
-#define CONFIG_SYS_NAND_ECCTOTAL       (CONFIG_SYS_NAND_ECCBYTES * \
-                                               CONFIG_SYS_NAND_ECCSTEPS)
 #define CONFIG_SYS_NAND_U_BOOT_START   CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x80000
 
index 2ce3959fdaf5f8963a0edce96f90791c3702f81c..1fcb7af9fe2128969ebee408323c8411c72a44d0 100644 (file)
                                                10, 11, 12, 13}
 #define CONFIG_SYS_NAND_ECCSIZE                512
 #define CONFIG_SYS_NAND_ECCBYTES       3
-#define CONFIG_SYS_NAND_ECCSTEPS       (CONFIG_SYS_NAND_PAGE_SIZE / \
-                                               CONFIG_SYS_NAND_ECCSIZE)
-#define CONFIG_SYS_NAND_ECCTOTAL       (CONFIG_SYS_NAND_ECCBYTES * \
-                                               CONFIG_SYS_NAND_ECCSTEPS)
 #define CONFIG_SYS_NAND_U_BOOT_START   CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x80000
 
index 2f879c0bf12ffd5b9799dc9aff1015ff4e11ce83..362fa1d720a06d7940f5f603e75205018d7893aa 100644 (file)
                                                10, 11, 12, 13}
 #define CONFIG_SYS_NAND_ECCSIZE                512
 #define CONFIG_SYS_NAND_ECCBYTES       3
-#define CONFIG_SYS_NAND_ECCSTEPS       (CONFIG_SYS_NAND_PAGE_SIZE / \
-                                               CONFIG_SYS_NAND_ECCSIZE)
-#define CONFIG_SYS_NAND_ECCTOTAL       (CONFIG_SYS_NAND_ECCBYTES * \
-                                               CONFIG_SYS_NAND_ECCSTEPS)
 #define CONFIG_SYS_NAND_U_BOOT_START   CONFIG_SYS_TEXT_BASE
 #define CONFIG_SYS_NAND_U_BOOT_OFFS    0x80000