[U-Boot] [PATCH v3 2/4] sunxi: nand: Add basic sunxi NAND driver for SPL with DMA support
Scott Wood
scottwood at freescale.com
Fri Jul 31 18:57:09 CEST 2015
On Fri, 2015-07-31 at 16:41 +0200, Boris Brezillon wrote:
> Hi Michal,
>
> On Fri, 31 Jul 2015 16:25:00 +0200
> Michal Suchanek <hramrach at gmail.com> wrote:
>
> > On 31 July 2015 at 11:24, Boris Brezillon
> > <boris.brezillon at free-electrons.com> wrote:
> > > Hi Hans,
> > >
> > > On Fri, 31 Jul 2015 10:36:43 +0200
> > > Hans de Goede <hdegoede at redhat.com> wrote:
> > >
> > > > Hi,
> > > >
> > > > On 31-07-15 02:47, Scott Wood wrote:
> > > > > On Thu, 2015-07-23 at 14:33 +0200, Piotr Zierhoffer wrote:
> > > > > > +int nand_spl_load_image(uint32_t offs, unsigned int size, void
> > > > > > *dest)
> > > > > > +{
> > > > > > + void *current_dest;
> > > > > > + uint32_t count;
> > > > > > + uint32_t current_count;
> > > > > > + uint32_t ecc_errors = 0;
> > > > > > +
> > > > > > + memset(dest, 0x0, size); /* clean destination memory */
> > > > > > + for (current_dest = dest;
> > > > > > + current_dest < (dest + size);
> > > > > > + current_dest +=
> > > > > > CONFIG_NAND_SUNXI_SPL_ECC_PAGE_SIZE) {
> > > > > > + nand_read_page(offs, offs
> > > > > > + <
> > > > > > CONFIG_NAND_SUNXI_SPL_SYNDROME_PARTITIONS_END,
> > > > > > + &ecc_errors);
> > > > > > + count = current_dest - dest;
> > > > > > +
> > > > > > + if (size - count >
> > > > > > CONFIG_NAND_SUNXI_SPL_ECC_PAGE_SIZE)
> > > > > > + current_count =
> > > > > > CONFIG_NAND_SUNXI_SPL_ECC_PAGE_SIZE;
> > > > > > + else
> > > > > > + current_count = size - count;
> > > > > > +
> > > > > > + memcpy(current_dest,
> > > > > > + temp_buf,
> > > > > > + current_count);
> > > > > > + offs += CONFIG_NAND_SUNXI_SPL_ECC_PAGE_SIZE;
> > > > > > + }
> > > > > > + return ecc_errors ? -1 : 0;
> > > > > > +}
> > > > >
> > > > > No bad block marker handling?
> > > >
> > > > The bootrom does not use bad block marker handling (and allwinner's
> > > > own FTL does neither for the non boot area, the actually mess up
> > > > things by writing metadata which looks like classic bad block
> > > > markers).
> > >
> > > Hm, checking for bad block markers (and skipping bad blocks) is always a
> > > good thing, even if it does not by itself guarantee that the data
> > > stored in there are not corrupted.
> >
> > Not on Allwinner hardware. Allwinner tools write data to the nand
> > which looks like bad block markers so skipping blocks which appear
> > marked as bad will inevitably skip valid blocks on many (most ?)
> > Allwinner devices.
So, how do you prevent the bad block check from happening in non-SPL NAND
code?
> First of all, that's not exactly true. The allwinner NAND layer (and
> probably the tools allowing you to flash a new image) is actually
> writing the appropriate good block pattern (0xff), but this pattern is
> then randomized by the hardware randomizer, which makes it look like a
> bad block (!= 0xff).
>
> The other aspect is, do we really have to support images flashed with
> this tool? I mean, I'm flashing my images using fel and a standard
> u-boot, and they generate perfectly valid images with valid bad block
> markers.
>
> >
> > Only in the case you soldered a new nand chip yourself and never used
> > Allwinner tools with it will the bad block markers remain valid. This
> > is overall very unlikely so it should not be something SPL handles.
>
> Here you're talking about the bad block markers 'corrupted' by the
> libnand layer (or the flashing tool).
> To restore valid bad block markers you just have to launch nand scrub
> in u-boot.
Are you talking about using scrub only on blocks that read as valid when
unrandomized? Does the tool that writes these randomized images skip blocks
that are marked bad?
-Scott
More information about the U-Boot
mailing list