[U-Boot] [PATCH resend V2 1/3] mtd: nand: mxs support oobsize bigger than 512

Peng Fan b51431 at freescale.com
Sat Aug 1 07:56:39 CEST 2015


On Fri, Jul 31, 2015 at 09:36:45PM -0500, Scott Wood wrote:
>On Sat, 2015-08-01 at 09:15 +0800, Peng Fan wrote:
>> On Fri, Jul 31, 2015 at 12:07:50PM -0500, Scott Wood wrote:
>> > On Tue, 2015-07-21 at 16:15 +0800, Peng Fan wrote:
>> > > If ecc chunk data size is 512 and oobsize is bigger than 512, there is
>> > > a chance that block_mark_bit_offset conflicts with bch ecc area.
>> > > 
>> > > The following graph is modified from kernel gpmi-nand.c driver with
>> > > each data block 512 bytes. We can see that Block Mark conflicts with
>> > > ecc area from bch view. We can enlarge the ecc chunk size to avoid
>> > > this problem to those oobsize which is larger than 512.
>> > 
>> > Enlarge it by how much?  What does the layout look like in that case?
>> 
>> Enlarge it to 1024 bytes.
>
>Then say so in the changelog.

You mean I need to add this in commit msg and send out a new patch version?
Or you pick this one?

>
>> In normal case the Block Mark bit should locates at the data part, but
>> not at the ECC area.
>
>It seems like either would be bad...

No. To read/write with ecc enabled, the block mark will be swapped with byte in metadata area.
This is correct way for GPMI + BCH to perform nand reading/writing with ecc enabled.
See following:
645         /* Read DMA completed, now do the mark swapping. */
646         mxs_nand_swap_block_mark(mtd, nand_info->data_buf, nand_info->oob_buf);

When GPMI + BCH used for DMA read, meta data will be stored to oob_buf. Then
swap the data at Block Mark with data at oob_buf[0](actually metadata[0]).

Before DMA write, Block Mark will be swapped with metadata[0]. Then DMA write.
Then Block Mark should not conlicts with ECC area, but ok with DATA area. Anyway
Block Mark should be aways points to bit at a data block.

>
>> You can take the following as an example.
>> 
>>    |                          P                                    |
>>    |<------------------------------------------------------------->|
>>    |                                                               |
>>    |                                          (Block Mark)         |
>>    |                      P'                         |           | |   |
>>    |<----------------------------------------------->|     D     | | O'|
>>    |                                                 |<--------->| |<->|
>>    V                                                 V           V V   V
>>    +---+---------------------------+-+---------------------------+-+---+
>>    | M |   data                    |E|   data             data   |E|   |
>>    +---+---------------------------+-+---------------------------+-+---+
>>                                                     ^                  ^
>>                                                     |         O        |
>>                                                     |<---------------->|
>> 
>> 
>> > 
>> > > 
>> > >    |                          P                                        |
>> > >    |<----------------------------------------------------------------->|
>> > >    |                                                                   |
>> > >    |                                                (Block Mark)       |
>> > >    |                      P'                             |           | |
>> > >    |
>> > >    |<--------------------------------------------------->|     D     | |
>> > > O'|
>> > >    |                                                     |<--------->| 
>> > > |<->|
>> > >    V                                                     V           V V
>> > >    V
>> > >    +---+--------------+-+--------------+-+--------------+-+----------+-+
>> > > ---+
>> > >    | M |   data       |E|   data       |E|   data       |E|   data   
>> > > |E|   |
>> > >    +---+--------------+-+--------------+-+--------------+-+----------+-+
>> > > ---+
>> > >                                                         ^               
>> > >    ^
>> > >                                                         |         O     
>> > >    |
>> > >                                                         |<--------------
>> > > -->|
>> > > 
>> > >        P : the page size for BCH module.
>> > >        E : The ECC strength.
>> > >        G : the length of Galois Field.
>> > >        N : The chunk count of per page.
>> > >        M : the metasize of per page.
>> > >        C : the ecc chunk size, aka the "data" above.
>> > >        P': the nand chip's page size.
>> > >        O : the nand chip's oob size.
>> > >        O': the free oob.
>> > 
>> > "D" is in the diagram but not the key.  "G", "N", and "C" are in the key 
>> > but 
>> > not the diagram.
>> C is ecc chunk data size, same the data area. Here it is 512 bytes. 
>> N is chunk count. for exmaple page size is 2048 bytes, ecc chunk data size 
>> is 512 bytes, then N is 2048/512.
>> G is the Galois Field, its value is 13 or 14. The should be got from 
>> reference mannual.
>> D is in the digram , but not the key. I think it is enougth to show why 
>> this patch is done.
>> 
>> I put the digram here to show that Block Mark may conflicts with ECC area,
>> and this is wrong, we need to find a way to avoid this. And the way is
>> to enlarge the ecc chunk data size from 512 to 1024 bytes.
>> 
>> I did not put the formula here. The keys is same to keys in kernel gpmi-
>> nand.c.
>> 
>>       The formula for P is :     
>> 
>>                   E * G * N
>>              P = ------------ + P' + M
>>                       8
>> 
>> The position of block mark moves forward in the ECC-based view of page, and 
>> the delta is:                                           
>> 
>>                    E * G * (N - 1)
>>              D = (---------------- + M)
>>                           8 
>> 
>> I think there is no need to put the formula in commit msg. Also, to explain 
>> D is not relevant to this patch.
>
>I'm not asking for the above to go into the commit message.  I'm asking for 
>what does go in the commit message to be less cryptic.
>
>> > What is "the metasize of per page"?
>> 
>> 10 bytes.
>
>But what does it mean?

BCH layout for data stored in nand page:
Meta + DATA + ECC + DATA + ECC + DATA + ECC + DATA + ECC

After usind DMA read, the layout in buffer is following:
DATA + DATA + DATA + DATA | META + status of each data block
   stored in data buffer  |    stored in oob buffer

Hope this is clear.

Peng.
>
>-Scott
>

-- 


More information about the U-Boot mailing list