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

Peng Fan
2015-08-01T05:56:39Z

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
>

--