aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHuang Shijie <b32955@freescale.com>2013-05-16 23:17:25 -0400
committerNitin Garg <nitin.garg@freescale.com>2014-04-16 09:06:03 -0400
commit76d36e451d1ecba85b3d9346afe8805f0ef1eec9 (patch)
tree7e0518e89f7578d3e029227895719618d75c07c6
parent9e4eedec99c5e37636ced0627a26f0bd088ac71f (diff)
mtd: add datasheet's ECC information to nand_chip{}
1.) Why add the ECC information to the nand_chip{} ? Each nand chip has its requirement for the ECC correctability, such as "4bit ECC for each 512Byte" or "40bit ECC for each 1024Byte". This ECC info is very important to the nand controller, such as gpmi. Take the Micron MT29F64G08CBABA for example, its geometry is 8KiB page size, 744 bytes oob size and it requires 40bit ECC per 1KiB. If we do not provide the ECC info to the gpmi nand driver, it has to calculate the ECC correctability itself. The gpmi driver will gets the 56bit ECC for per 1KiB which is beyond its BCH's 40bit ecc capibility. The gpmi will quits in this case. But in actually, the gpmi can supports this nand chip if it can get the right ECC info. 2.) about the new fields. The @ecc_strength_ds stands for the ecc bits needed within the @ecc_step_ds. The two fields should be set from the nand chip's datasheets. For example: "4bit ECC for each 512Byte" could be: @ecc_strength_ds = 4, @ecc_step_ds = 512. "40bit ECC for each 1024Byte" could be: @ecc_strength_ds = 40, @ecc_step_ds = 1024. 3.) Why do not re-use the @strength and @size in the nand_ecc_ctrl{}? The @strength and @size in nand_ecc_ctrl{} is used by the nand controller driver, while the @ecc_strength_ds and @ecc_step_ds are get from the datasheet. Signed-off-by: Huang Shijie <b32955@freescale.com> Reviewed-and-tested-by: Brian Norris <computersforpeace@gmail.com> Signed-off-by: Brian Norris <computersforpeace@gmail.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
-rw-r--r--include/linux/mtd/nand.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
index eeb4a9e67b51..9c3c55254a4e 100644
--- a/include/linux/mtd/nand.h
+++ b/include/linux/mtd/nand.h
@@ -437,6 +437,12 @@ struct nand_buffers {
437 * bad block marker position; i.e., BBM == 11110111b is 437 * bad block marker position; i.e., BBM == 11110111b is
438 * not bad when badblockbits == 7 438 * not bad when badblockbits == 7
439 * @cellinfo: [INTERN] MLC/multichip data from chip ident 439 * @cellinfo: [INTERN] MLC/multichip data from chip ident
440 * @ecc_strength_ds: [INTERN] ECC correctability from the datasheet.
441 * Minimum amount of bit errors per @ecc_step_ds guaranteed
442 * to be correctable. If unknown, set to zero.
443 * @ecc_step_ds: [INTERN] ECC step required by the @ecc_strength_ds,
444 * also from the datasheet. It is the recommended ECC step
445 * size, if known; if unknown, set to zero.
440 * @numchips: [INTERN] number of physical chips 446 * @numchips: [INTERN] number of physical chips
441 * @chipsize: [INTERN] the size of one chip for multichip arrays 447 * @chipsize: [INTERN] the size of one chip for multichip arrays
442 * @pagemask: [INTERN] page number mask = number of (pages / chip) - 1 448 * @pagemask: [INTERN] page number mask = number of (pages / chip) - 1
@@ -513,6 +519,8 @@ struct nand_chip {
513 unsigned int pagebuf_bitflips; 519 unsigned int pagebuf_bitflips;
514 int subpagesize; 520 int subpagesize;
515 uint8_t cellinfo; 521 uint8_t cellinfo;
522 uint16_t ecc_strength_ds;
523 uint16_t ecc_step_ds;
516 int badblockpos; 524 int badblockpos;
517 int badblockbits; 525 int badblockbits;
518 526