[U-Boot] [PATCH V4] nand_spl_simple: store ecc data on the stack

Tom Rini
2011-12-13T21:30:38Z

On Tue, Dec 13, 2011 at 12:33 PM, Stefano Babic <sbabic@denx.de> wrote:
> 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>

Acked-by: Tom Rini <trini@ti.com>

> ---
> V4:
> ?- Drop SYS_ from local defines (Wolfgang Denk, Scott Wood)
> ?- drop parenthesis around defines (Scott Wood)
>
> V3:
> ?- use local defines for CONFIG_SYS_NAND_ECCSTEPS and
> ? CONFIG_SYS_NAND_ECCTOTAL (Tom Rini)
> ?- drop CONFIG_SYS_NAND_ECCSTEPS from board config files
>
> V2:
> ?- CONFIG_SYS_NAND_ECCTOTAL can always be computed (Ilya Yanok)
> ?- drop all CONFIG_SYS_NAND_ECCTOTAL in arm boards using nand_simple.c
>
> ?drivers/mtd/nand/nand_spl_simple.c ? ? | ? 42 ++++++++++++-------------------
> ?include/configs/am3517_crane.h ? ? ? ? | ? ?4 ---
> ?include/configs/am3517_evm.h ? ? ? ? ? | ? ?4 ---
> ?include/configs/devkit8000.h ? ? ? ? ? | ? ?5 ----
> ?include/configs/hawkboard.h ? ? ? ? ? ?| ? ?5 +---
> ?include/configs/omap3_beagle.h ? ? ? ? | ? ?4 ---
> ?include/configs/omap3_evm.h ? ? ? ? ? ?| ? ?4 ---
> ?include/configs/omap3_evm_quick_nand.h | ? ?4 ---
> ?8 files changed, 17 insertions(+), 55 deletions(-)
>
> diff --git a/drivers/mtd/nand/nand_spl_simple.c b/drivers/mtd/nand/nand_spl_simple.c
> index ed821f2..5a1e1a9 100644
> --- a/drivers/mtd/nand/nand_spl_simple.c
> +++ b/drivers/mtd/nand/nand_spl_simple.c
> @@ -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,30 +150,22 @@ 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;
> ? ? ? ?int stat;
>
> - ? ? ? /*
> - ? ? ? ?* 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]];
>
>
> @@ -185,25 +182,18 @@ 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;
> ? ? ? ?int stat;
>
> ? ? ? ?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);
> @@ -213,10 +203,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) {
> diff --git a/include/configs/am3517_crane.h b/include/configs/am3517_crane.h
> index 0a0c261..b0dd2f0 100644
> --- a/include/configs/am3517_crane.h
> +++ b/include/configs/am3517_crane.h
> @@ -359,10 +359,6 @@
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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
>
> diff --git a/include/configs/am3517_evm.h b/include/configs/am3517_evm.h
> index d44eeec..f797f3f 100644
> --- a/include/configs/am3517_evm.h
> +++ b/include/configs/am3517_evm.h
> @@ -360,10 +360,6 @@
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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
>
> diff --git a/include/configs/devkit8000.h b/include/configs/devkit8000.h
> index fc7f0cd..6ef6a87 100644
> --- a/include/configs/devkit8000.h
> +++ b/include/configs/devkit8000.h
> @@ -344,11 +344,6 @@
> ?#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
> diff --git a/include/configs/hawkboard.h b/include/configs/hawkboard.h
> index 12acb27..65b3b78 100644
> --- a/include/configs/hawkboard.h
> +++ b/include/configs/hawkboard.h
> @@ -138,11 +138,8 @@
> ?#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 */
>
> ?/*
> diff --git a/include/configs/omap3_beagle.h b/include/configs/omap3_beagle.h
> index 970810c..7a240bb 100644
> --- a/include/configs/omap3_beagle.h
> +++ b/include/configs/omap3_beagle.h
> @@ -426,10 +426,6 @@
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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
>
> diff --git a/include/configs/omap3_evm.h b/include/configs/omap3_evm.h
> index 2ce3959..1fcb7af 100644
> --- a/include/configs/omap3_evm.h
> +++ b/include/configs/omap3_evm.h
> @@ -121,10 +121,6 @@
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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
>
> diff --git a/include/configs/omap3_evm_quick_nand.h b/include/configs/omap3_evm_quick_nand.h
> index 2f879c0..362fa1d 100644
> --- a/include/configs/omap3_evm_quick_nand.h
> +++ b/include/configs/omap3_evm_quick_nand.h
> @@ -91,10 +91,6 @@
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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
>
> --
> 1.7.5.4
>

--
Tom