How read_oob() should work for HW_SYNDROME NAND controller?

Boris Brezillon boris.brezillon at free-electrons.com
Thu Dec 1 01:15:22 PST 2016


On Thu, 1 Dec 2016 18:09:37 +0900
Masahiro Yamada <yamada.masahiro at socionext.com> wrote:

> Hi Boris,
> 
> 
> >>
> >> And let's say the controller's ecc.size = 1024 and ecc.bytes == 14.
> >> I am omitting BBM to make the situation simpler.  
> >
> > Hm, actually the placement of the BBM is important. Do you know where
> > it's placed in the page layout used by Denali.  
> 
> 
> BBM is placed at the beginning of the OOB area.
> (so, factory BBMs are protected from the ECC correction engine.)
> 
> 
> The more precise layout is as follows:
> 
>    |-----------|    |-----------|
>    |           |    |           |
>    | Payload0  |    |           |
>    |           |    |           |
>    | (ecc.size |    |           |
>    |  1024B)   |    | Main Page |
>    |           |    |   area    |
>    |-----------|    |           |
>    |  ECC0     |    |   2048B   |
>    | (ecc.bytes|    |           |
>    |   14B)    |    |           |
>    |-----------|    |           |
>    |           |    |           |
>    | Payload1  |    |           |
>    |           |    |           |
>    | (ecc.size |    |           |
>    |  1010B)   |    |           |
>    |-----------|    |-----------|
>    | BBM (8B)  |    |           |
>    |-----------|    |           |
>    | Payload1  |    |           |
>    |   14B     |    |           |
>    |-----------|    |           |
>    |  ECC1     |    | OOB area  |
>    | (ecc.bytes|    |           |
>    |   14B)    |    |   64B     |
>    |-----------|    |           |
>    | OOB free  |    |           |
>    |    28B    |    |           |
>    |-----------|    |-----------|
> 
> 
> The Playload1 is split by the BBM area.

Okay, thanks for the detailed layout.
Everything looks good, and you should be able to disable the BBT and
force BBM scanning.

> 
> 
> 
> 
> >> The Denali IP also supports lowlevel
> >> command-base interface to issue NAND_CMD_RNDOUT
> >> and cherry-pick ECC sections.
> >>
> >> But, more simply, I can transfer the whole page + oob
> >> into a temporary buffer, then only copy
> >> ECC sections into oob_poi.  
> >
> > It should be faster if you only retrieve ECC sections (less I/Os), but
> > that's just optimization. Note that read_oob() is heavily used when
> > scanning bad blocks, so it might make a huge boot-time difference in the
> > end.  
> 
> 
> I think this comes down to
> 
> "PIO register access only for ECC sectors"
>     vs
> "DMA transfer for the whole page"
> 
> I will test which is better.
> 
> 
> BTW, surprisingly enough, the Denali still sets
> NAND_SKIP_BBTSCAN flag.
> 
> 
> 




More information about the linux-mtd mailing list