[U-Boot] [PATCH v4 1/5] mtd: nand: omap: enable BCH ECC scheme using ELM for generic platform
Gupta, Pekon
pekon at ti.com
Mon Sep 16 13:19:16 CEST 2013
(apologies for multiple mails, but mails from my client were rejected
due to some client configuration)
> On Tue, 2013-09-03 at 11:26 +0530, Pekon Gupta wrote:
> > diff --git a/doc/README.nand b/doc/README.nand
> > index 913e9b5..f72f618 100644
> > --- a/doc/README.nand
> > +++ b/doc/README.nand
> > @@ -169,6 +169,19 @@ Configuration Options:
> > Please convert your driver even if you don't need the extra
> > flexibility, so that one day we can eliminate the old mechanism.
> >
> > + CONFIG_SYS_NAND_ONFI_DETECTION
> > + Enables detection of ONFI compliant devices during probe.
> > + And fetching device parameters flashed on device, by parsing
> > + ONFI parameter page.
>
> I don't see this used anywhere in the patch (defined in config headers,
> yes, but not ifdeffed).
>
> What does "DETECTION" add here, versus just CONFIG_NAND_ONFI?
>
> It should be CONFIG rather than CONFIG_SYS because it just controls
> whether the support is built, not making an assertion about the
> hardware, right?
>
This is not the new define, it was already there in generic code (nand_base.c)
But not documented, so I documented it and enabled it for am33xx platform
Please refer: $UBOOT/drivers/mtd/nand/nand_base.c
It was added as part of following commit
commit 0272c718ba69c60a9d719db6806971d98db98090
Author: Florian Fainelli <florian at openwrt.org>
AuthorDate: 2011-02-25
>
> > + CONFIG_SYS_NAND_ECCSCHEME
> > + specifies which ECC scheme to use.
>
> Specifies it how? What are the possible values?
>
> If the answer involves "enum omap_ecc", then OMAP should be
> somewhere in the name.
>
I wanted this define to be generic for all NAND drivers. Therefore CONFIG_SYS_
But I don't know how other drivers would use this.
For AM335x its updated in Patch:
[PATCH v5 5/5] board/ti/am335x/README: update for NAND boot
Instead, should I make it more generic for all SoC ? like
CONFIG_SYS_NAND_ECCSCHEME can take in following strings defining
ECC scheme used by NAND driver in SPL boot:
"ham1" - 1 bit hamming code
"bch4" - 4-bit BCH ecc code
"bch8" - 8-bit BCH ecc code
"bch16" - 16-bit BCH ecc code
> > +/**
> > + * omap_select_ecc_scheme - configures driver for particular ecc-scheme
> > + * @nand: NAND chip device structure
> > + * @ecc_scheme: ecc scheme to configure
> > + * @pagesize: number of main-area bytes per page of NAND device
> > + * @oobsize: number of OOB/spare bytes per page of NAND device
> > + */
[snip]
> > + default:
> > + debug("nand: error: ecc scheme not enabled or
> supported\n");
> > + return -EINVAL;
> > + }
>
> This will result in NAND_ECC_NONE and likely an eventual NULL pointer
> dereference if a bad value is passed and the -EINVAL return path is
> taken.
>
> OK, I now see that you've got the caller patching this up in the error
> case, but that's awkward and error prone.
>
Sorry, din't understand your feedback here.
omap_select_ecc_scheme() is common function which is used for
- changing ECC scheme if 'nandecc' like utility is needed later
- selecting ECC scheme during probe.
This function populates all necessary fields in struct *nand_chip
for nand driver to work. During probe (both SPL and u-boot),
'CONFIG_SYS_NAND_ECCSCHEME' is used to determine the ecc-scheme.
'default' statement protects the driver from any invalid or un-supported
ECC scheme selected by user in his board file. So that driver probe cleanly
exits probe instead of causing an exception.
Can you please elaborate, what I'm missing here ?
> > @@ -767,67 +811,41 @@ void omap_nand_switch_ecc(uint32_t hardware,
> uint32_t eccstrength)
> > {
> > struct nand_chip *nand;
> > struct mtd_info *mtd;
> > + struct nand_bch_priv *bch;
> > + int err = 0;
> >
> > if (nand_curr_device < 0 ||
> > nand_curr_device >= CONFIG_SYS_MAX_NAND_DEVICE ||
> > !nand_info[nand_curr_device].name) {
> > - printf("Error: Can't switch ecc, no devices available\n");
> > + printf("nand: error: no devices available\n");
> > return;
> > }
>
> Why are you making the error message less specific?
>
There is already another error message in board_nand_init() which will be
flagged when there is problem in selecting ECC.
printf("nand: error: cannot select ecc scheme\n");
But thanks, you pointed out a bug, I should return -ENODEV here,
Otherwise caller would not know that ecc-scheme could not be changed.
> > diff --git a/include/configs/tricorder.h b/include/configs/tricorder.h
> > index a9b2714..2b01486 100644
> > --- a/include/configs/tricorder.h
> > +++ b/include/configs/tricorder.h
> > @@ -298,6 +298,8 @@
> >
> > #define CONFIG_SYS_NAND_ECCSIZE 512
> > #define CONFIG_SYS_NAND_ECCBYTES 13
> > +#define CONFIG_SYS_NAND_ECCSCHEME 3
> > +#define CONFIG_SYS_NAND_ONFI_DETECTION
>
> What does 3 mean? Please use a symbolic name.
>
For AM335x this is updated in board/ti/am335x/README as part of
following patch:
[PATCH v5 5/5] board/ti/am335x/README: update for NAND boot
but would it be better to use strings like "bch8" as mentioned above ?
with regards, pekon
More information about the U-Boot
mailing list