Skip to contentSkip to conversation

MTD NAND BCH support for 24 bits/1K of ECC correction?

DISCUSSION Aaron Williams 2 participants 3 messages Mar 28, 2013 – Mar 30, 2013 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

Hi all,

I am trying to clean up our OCTEON NAND flash driver in the Linux kernel and enable support for multi-bit ECC using BCH and am having some issues. I am able to successfully work with NAND flash that requires 4 bits ECC per 512 bytes but I am having issues with one of our boards that has a NAND device that requires 24 bits of ECC per 1024 bytes.

I was wondering if ECC of this magnitude has been successfully tested in the past. By my calculations I should have 42 bytes of ECC per 1K block (m=14, t=24 for 336 bits of ECC data). My problem is that when decoding an encoded block I am seeing that nroots != err in decode_bch() after find_poly_roots(). I am seeing this for all of the blocks I attempt to read. As far as I can tell the data being sent to BCH is good, though it might have a few bad bits but nowhere near 24.

I am also seeing this same behavior in my U-Boot code which uses the identical bch and nand_bch code.

Cheers,

Aaron Williams

Signature · 4 lines
Aaron Williams
Software Engineer
Cavium, Inc.
(408) 943-7198  (510) 789-8988 (cell)
#1 lore raw
Quoted 16 lines · Aaron Williams

Hi all,

I am trying to clean up our OCTEON NAND flash driver in the Linux kernel and enable support for multi-bit ECC using BCH and am having some issues. I am able to successfully work with NAND flash that requires 4 bits ECC per 512 bytes but I am having issues with one of our boards that has a NAND device that requires 24 bits of ECC per 1024 bytes.

I was wondering if ECC of this magnitude has been successfully tested in the past. By my calculations I should have 42 bytes of ECC per 1K block (m=14, t=24 for 336 bits of ECC data). My problem is that when decoding an encoded block I am seeing that nroots != err in decode_bch() after find_poly_roots(). I am seeing this for all of the blocks I attempt to read. As far as I can tell the data being sent to BCH is good, though it might have a few bad bits but nowhere near 24.

Quoted 3 lines

I am also seeing this same behavior in my U-Boot code which uses the identical bch and nand_bch code.

Hi Aaron,

CC-ing your message to linux-mtd which is the place to go for such questions :-)

Your configuration (m=14 t=24 with 1024 bytes of data) has been tested, and should work with the BCH library. Could you give some details about your ECC setup:

1. Are you trying to locate and correct errors from hardware-computed syndromes ?

2. If yes, did you provide the BCH lib with the specific primitive polynomial used by your hardware ? What is this polynomial ?

3. Could you provide the ECC bytes generated for the following block patterns:
- a 0xff-filled 1024 bytes block
- a 0xff-filled 1024 bytes block, except for the first byte set to 0xfe This would help me find out how to setup the library to match your hardware.

Regards,

Signature · 1 line
Ivan
#2 lore raw
Quoted 32 lines · Ivan Djelic
Quoted 16 lines · Aaron Williams

Hi all,

I am trying to clean up our OCTEON NAND flash driver in the Linux kernel and enable support for multi-bit ECC using BCH and am having some issues. I am able to successfully work with NAND flash that requires 4 bits ECC per 512 bytes but I am having issues with one of our boards that has a NAND device that requires 24 bits of ECC per 1024 bytes.

I was wondering if ECC of this magnitude has been successfully tested in the past. By my calculations I should have 42 bytes of ECC per 1K block (m=14, t=24 for 336 bits of ECC data). My problem is that when decoding an encoded block I am seeing that nroots != err in decode_bch() after find_poly_roots(). I am seeing this for all of the blocks I attempt to read. As far as I can tell the data being sent to BCH is good, though it might have a few bad bits but nowhere near 24.

Quoted 3 lines

I am also seeing this same behavior in my U-Boot code which uses the identical bch and nand_bch code.

Hi Aaron,

CC-ing your message to linux-mtd which is the place to go for such questions :-)

Your configuration (m=14 t=24 with 1024 bytes of data) has been tested, and should work with the BCH library. Could you give some details about your ECC setup:

1. Are you trying to locate and correct errors from hardware-computed syndromes ?

2. If yes, did you provide the BCH lib with the specific primitive polynomial used by your hardware ? What is this polynomial ?

Quoted 6 lines

3. Could you provide the ECC bytes generated for the following block patterns:
- a 0xff-filled 1024 bytes block
- a 0xff-filled 1024 bytes block, except for the first byte set to 0xfe This would help me find out how to setup the library to match your hardware.

Regards,

We are doing the BCH support entirely in software due to limitations of our hardware to 1 bit ECC.

I may have to get back to you. I may have found the problem and will try and look at it some more next week. It looks like I now have it working in U-Boot and the same bug exists in our Linux driver. It wouldn't be the first one... our NAND drivers haven't been updated in ages.

-Aaron

Signature · 4 lines
Aaron Williams
Software Engineer
Cavium, Inc.
(408) 943-7198  (510) 789-8988 (cell)