Thread (1 message) 1 message, 1 author, 2014-11-25

Re: [PATCH v2] mtd: fsl_upm: Support NAND ECC DTS properties

From: Aaron Sierra <hidden>
Date: 2014-11-25 22:19:08

From: "Ezequiel Garcia" <redacted>
Sent: Tuesday, November 25, 2014 2:08:59 PM

On 11/08/2014 04:11 PM, Aaron Sierra wrote:
[..]
quoted
+
+	/* We know mode is either NAND_ECC_SOFT or NAND_ECC_SOFT_BCH */
+	if (strength < 0 && mode == NAND_ECC_SOFT_BCH) {
+		dev_err(fun->dev,
+			"ECC BCH mode requires nand-ecc-strength property");
+		ret = -EINVAL;
+		goto err;
+	} else if (strength == 0) {
+		dev_err(fun->dev, "ECC strength of 0 bits is unsupported");
+		ret = -EINVAL;
+		goto err;
+	} else if (strength == 1 && mode == NAND_ECC_SOFT_BCH) {
+		dev_err(fun->dev, "ECC BCH mode requires > 1-bit strength");
+		ret = -EINVAL;
+		goto err;
+	} else if (strength > 1 && mode == NAND_ECC_SOFT) {
+		dev_warn(fun->dev,
+			"Forcing ECC BCH due to %d-bit strength\n", strength);
+		mode = NAND_ECC_SOFT_BCH;
+	}
+	fun->chip.ecc.mode = mode;
+	fun->chip.ecc.strength = strength;
+
Aside from my comment about the lack of ECC specification in the
binding, I think the above is wrong.

You don't have hardware ECC, but software ECC (either hamming or BCH).
So, you don't need to specify any nand_ecc_ctrl.strength (i.e.
ecc.strength above).

It'll be set by the NAND core and override any value you set
See nand_scan_tail.
Ezequiel,
This patch was originally the second of two patches. The first was applied
to l2-mtd.git on 11/5/2014:

    mtd: nand: Base BCH ECC bytes on required strength

It affects the code in nand_scan_tail that you're referring to so that it
looks like this:

		/*
		 * Board driver should supply ecc.size and ecc.bytes values to
		 * select how many bits are correctable; see nand_bch_init()
		 * for details. Otherwise, default to 4 bits for large page
		 * devices.
		 */
		if (!ecc->size && (mtd->oobsize >= 64)) {
			ecc->size = 512;
			ecc->bytes = DIV_ROUND_UP(13 * ecc->strength, 8);
		}
		ecc->priv = nand_bch_init(mtd, ecc->size, ecc->bytes,
					       &ecc->layout);
		if (!ecc->priv) {
			pr_warn("BCH ECC initialization failed!\n");
			BUG();
		}
		ecc->strength = ecc->bytes * 8 / fls(8 * ecc->size);

In this case ecc->strength is unnecessarily recalculated at the end and
ecc->strength isn't checked for zero in the initial calculation. Perhaps
this block in nand_scan_tail should be patched again to preserve the
original behaviour if ecc->strength or ecc->size are zero.

The only other in-kernel user of SOFT_BCH is sunxi_nand.c and it calculates
ecc->bytes from ecc->size and ecc->strength itself, so it has defined all
three values by this point.
So, I'd say you just need to specify the nand-ecc-mode in the devicetree
binding.

The nand-ecc-strength and nand-ecc-step-size are meant for controllers
with hardware ECC support.
Software BCH allows controllers without hardware support for multiple
bit correction to be used with NAND devices that require multiple bit
correction, so like a hardware controller it needs to know how many
bits to correct.
--
Ezequiel Garcia, VanguardiaSur
www.vanguardiasur.com.ar
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help