Skip to contentSkip to conversation

at91: PMECC: enable PMECC in dt for at91sam9x5ek, at91sam9n12ek

PATCH New Josh Wu 3 participants 9 messages Dec 19, 2012 – Jan 17, 2013

Subsystems (4)
lore
Share & tools
lore

Josh Wu

author
#0 lore raw

cover at91: PMECC: enable PMECC in dt for at91sam9x5ek, at91sam9n12ek

Those patches will enable PMECC in dt parameters for at91sam9x5ek, at91sam9n12ek.

Josh Wu (3):
MTD: at91: atmel_nand: for PMECC, add code to choose the ecc bits and
sector size according to the ONFI parameter ECC requirement.
at91: 9x5: add DT parameters to enable PMECC
at91: at91sam9n12: add DT parameters to enable PMECC

 arch/arm/boot/dts/at91sam9n12.dtsi  |    1 +
 arch/arm/boot/dts/at91sam9n12ek.dts |    5 +-
 arch/arm/boot/dts/at91sam9x5.dtsi   |    4 ++
 arch/arm/boot/dts/at91sam9x5cm.dtsi |    5 +-
 drivers/mtd/nand/atmel_nand.c       |   89 +++++++++++++++++++++++++++++++++++
 5 files changed, 102 insertions(+), 2 deletions(-)
Signature · 1 line
1.7.9.5
author
#1 lore raw

PATCH 1/3 MTD: at91: atmel_nand: for PMECC, add code to choose the ecc bits and sector size according to the ONFI parameter ECC requirement.

This patch will check NAND flash's ecc minimum requirement in ONFI parameter. If it is equal or smaller than pmecc-cap in dtsi, then use ecc_bits in ONFI. otherwise, return an error since pmecc-cap in dtsi don't meet the ecc minimum reqirement.

This patch also check sector size (codeword) requirement in ONFI. If it is equal or bigger than sector_size in dtsi, then use the one of ONFI. otherwise return error.

Currently we don't support to read the ECC parameter in ONFI extended parameter page. So in that case we just use the value specified in dts.

For non-ONFI nand flash, we assume the minimum ecc requirement is 2bits in 512 bytes.

---
 drivers/mtd/nand/atmel_nand.c |   89 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 89 insertions(+)
drivers/mtd/nand/atmel_nand.c +89 -0
index 9144557..7855ccd 100644
@@ -901,6 +901,84 @@ static void atmel_pmecc_core_init(struct mtd_info *mtd)
 	pmecc_writel(host->ecc, CTRL, PMECC_CTRL_ENABLE);
 }
 
+/*
+ * Get ECC requirement in ONFI parameters, returns -1 if ONFI
+ * parameters is not supported.
+ * return 0 if success to get the ECC requirement.
+ */
+static int get_onfi_ecc_param(struct nand_chip *chip,
+		int *ecc_bits, int *sector_size)
+{
+	*ecc_bits = *sector_size = 0;
+
+	if (chip->onfi_params.ecc_bits == 0xff)
+		/* TODO: the sector_size and ecc_bits need to be find in
+		 * extended ecc parameter, currently we don't support it.
+		 */
+		return -1;
+
+	*ecc_bits = chip->onfi_params.ecc_bits;
+
+	/* The default sector size (ecc codeword size) is 512 */
+	*sector_size = 512;
+
+	return 0;
+}
+
+/*
+ * Choose ecc cap and sector size in atmel_nand_host according to ONFI
+ * parameters ecc requirement.
+ * return 0 if success. otherwise return error code.
+ */
+static int pmecc_choose_ecc_bits(struct atmel_nand_host *host,
+		struct nand_chip *chip)
+{
+	int ecc_bits, sector_size;
+
+	if (!get_onfi_ecc_param(chip, &ecc_bits, &sector_size)) {
+		dev_info(host->dev, "ONFI params, minimum required ECC: %dbits in %d bytes\n",
+				ecc_bits, sector_size);
+
+		if (ecc_bits > host->pmecc_corr_cap) {
+			dev_err(host->dev, "Error: Need to set a bigger pmecc-cap in dts. Current is: %d\n",
+				host->pmecc_corr_cap);
+			return -EINVAL;
+		}
+		if (sector_size < host->pmecc_sector_size) {
+			dev_err(host->dev, "Error: Need to set a smaller pmecc-sector-size in dts. Current is: %d\n",
+					host->pmecc_sector_size);
+			return -EINVAL;
+		}
+
+		/* use the most fitable ecc bits (the near bigger one ) */
+		if (ecc_bits <= 2)
+			host->pmecc_corr_cap = 2;
+		else if (ecc_bits <= 4)
+			host->pmecc_corr_cap = 4;
+		else if (ecc_bits < 8)
+			host->pmecc_corr_cap = 8;
+		else if (ecc_bits < 12)
+			host->pmecc_corr_cap = 12;
+		else if (ecc_bits < 24)
+			host->pmecc_corr_cap = 24;
+		else
+			return -EINVAL;
+
+		/* use the most fitable sector size (the near smaller one ) */
+		if (sector_size >= 1024)
+			host->pmecc_sector_size = 1024;
+		else if (sector_size >= 512)
+			host->pmecc_sector_size = 512;
+		else
+			return -EINVAL;
+	} else {
+		dev_info(host->dev,
+		"NAND chip ECC reqirement is in Extended ONFI parameter, we don't support yet. So use default setting in dts\n");
+	}
+
+	return 0;
+}
+
 static int __init atmel_pmecc_nand_init_params(struct platform_device *pdev,
 					 struct atmel_nand_host *host)
 {
@@ -909,8 +987,19 @@ static int __init atmel_pmecc_nand_init_params(struct platform_device *pdev,
 	struct resource *regs, *regs_pmerr, *regs_rom;
 	int cap, sector_size, err_no;
 
+	if (nand_chip->onfi_version) {
+		/* Choose ecc cap and sector size base on ONFI parameters */
+		err_no = pmecc_choose_ecc_bits(host, nand_chip);
+		if (err_no)
+			return err_no;
+	} else {
+		dev_info(host->dev, "NAND chip is not ONFI compliant, assume ecc_bits is 2");
+		host->pmecc_corr_cap = 2;
+	}
+
 	cap = host->pmecc_corr_cap;
 	sector_size = host->pmecc_sector_size;
+
 	dev_info(host->dev, "Initialize PMECC params, cap: %d, sector: %d\n",
 		 cap, sector_size);
 
Signature · 1 line
1.7.9.5
#2 lore raw

PATCH 1/3 MTD: at91: atmel_nand: for PMECC, add code to choose the ecc bits and sector size according to the ONFI parameter ECC requirement.

I cannot compile this patch:

ERROR (phandle_references): Reference to non-existent node or label "pinctrl_ssc0_tx"

ERROR: Input tree has errors, aborting (use -f to force output) make[2]: *** [arch/arm/boot/dts/at91sam9g20ek.dtb] Error 2

Quoted 9 lines · Josh Wu

This patch will check NAND flash's ecc minimum requirement in ONFI parameter. If it is equal or smaller than pmecc-cap in dtsi, then use ecc_bits in ONFI. otherwise, return an error since pmecc-cap in dtsi don't meet the ecc minimum reqirement.

This patch also check sector size (codeword) requirement in ONFI. If it is equal or bigger than sector_size in dtsi, then use the one of ONFI. otherwise return error.

Currently we don't support to read the ECC parameter in ONFI extended parameter page. So in that case we just use the value specified in dts.

For non-ONFI nand flash, we assume the minimum ecc requirement is 2bits in 512 bytes.

Please, wrap the lines like kernel developers usually do.

Signature · 9 lines
Best Regards,
Artem Bityutskiy
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20130115/49c8872d/attachment.sig>
#3 lore raw

PATCH 1/3 MTD: at91: atmel_nand: for PMECC, add code to choose the ecc bits and sector size according to the ONFI parameter ECC requirement.

Hi Artem Bityutskiy,

Quoted 6 lines · Artem Bityutskiy

I cannot compile this patch:

ERROR (phandle_references): Reference to non-existent node or label "pinctrl_ssc0_tx"

ERROR: Input tree has errors, aborting (use -f to force output) make[2]: *** [arch/arm/boot/dts/at91sam9g20ek.dtb] Error 2

Sorry for this inconvenience.
There are patches doesn't go to mainline in time which cause this issue.

[1] https://patchwork.kernel.org/patch/1966321/
[2] https://patchwork.kernel.org/patch/1966341/

Best Regards,
Bo Shen

Quoted 21 lines · Josh Wu
Quoted 9 lines

This patch will check NAND flash's ecc minimum requirement in ONFI parameter. If it is equal or smaller than pmecc-cap in dtsi, then use ecc_bits in ONFI. otherwise, return an error since pmecc-cap in dtsi don't meet the ecc minimum reqirement.

This patch also check sector size (codeword) requirement in ONFI. If it is equal or bigger than sector_size in dtsi, then use the one of ONFI. otherwise return error.

Currently we don't support to read the ECC parameter in ONFI extended parameter page. So in that case we just use the value specified in dts.

For non-ONFI nand flash, we assume the minimum ecc requirement is 2bits in 512 bytes.

Please, wrap the lines like kernel developers usually do.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

author
#4 lore raw

PATCH 1/3 MTD: at91: atmel_nand: for PMECC, add code to choose the ecc bits and sector size according to the ONFI parameter ECC requirement.

In reply to Artem Bityutskiy

Hi, Artem

Quoted 6 lines · Artem Bityutskiy

I cannot compile this patch:

ERROR (phandle_references): Reference to non-existent node or label "pinctrl_ssc0_tx"

ERROR: Input tree has errors, aborting (use -f to force output) make[2]: *** [arch/arm/boot/dts/at91sam9g20ek.dtb] Error 2

As Bo Shen already mentioned, they are caused by ssc pinctrl patches. it will be merged in next rc or late.

Quoted 12 lines · Josh Wu
Quoted 9 lines

This patch will check NAND flash's ecc minimum requirement in ONFI parameter. If it is equal or smaller than pmecc-cap in dtsi, then use ecc_bits in ONFI. otherwise, return an error since pmecc-cap in dtsi don't meet the ecc minimum reqirement.

This patch also check sector size (codeword) requirement in ONFI. If it is equal or bigger than sector_size in dtsi, then use the one of ONFI. otherwise return error.

Currently we don't support to read the ECC parameter in ONFI extended parameter page. So in that case we just use the value specified in dts.

For non-ONFI nand flash, we assume the minimum ecc requirement is 2bits in 512 bytes.

Please, wrap the lines like kernel developers usually do.

OK. I will resend the whole patch series with wrapped commit message. thanks.

Best Regards,
Josh Wu

Quoted 1 line
#5 lore raw

PATCH 1/3 MTD: at91: atmel_nand: for PMECC, add code to choose the ecc bits and sector size according to the ONFI parameter ECC requirement.

Quoted 5 lines · Josh Wu

Hi, Artem

Quoted 2 lines · Artem Bityutskiy

I cannot compile this patch:

Quoted 7 lines
Quoted 4 lines

ERROR (phandle_references): Reference to non-existent node or label "pinctrl_ssc0_tx"

ERROR: Input tree has errors, aborting (use -f to force output) make[2]: *** [arch/arm/boot/dts/at91sam9g20ek.dtb] Error 2

As Bo Shen already mentioned, they are caused by ssc pinctrl patches. it will be merged in next rc or late.

Then ping me when the patches are ready to go, please.

Signature · 9 lines
Best Regards,
Artem Bityutskiy
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20130117/18bb67c3/attachment.sig>
author
#6 lore raw

PATCH 2/3 at91: 9x5: add DT parameters to enable PMECC

In reply to Josh Wu

Default ecc correctable setting is 2bits in 512 bytes.

---
 arch/arm/boot/dts/at91sam9x5.dtsi   |    4 ++++
 arch/arm/boot/dts/at91sam9x5cm.dtsi |    5 ++++-
 2 files changed, 8 insertions(+), 1 deletion(-)
arch/arm/boot/dts/at91sam9x5.dtsi +4 -0
index 03fc136..590f225 100644
@@ -270,7 +270,11 @@
 			#address-cells = <1>;
 			#size-cells = <1>;
 			reg = <0x40000000 0x10000000
+				0xffffe000 0x600	/* PMECC Registers */
+				0xffffe600 0x200	/* PMECC Error Location Registers */
+				0x00100000 0x100000	/* ROM code */
 			      >;
+			atmel,pmecc-lookup-table-offset = <0x8000 0x10000>;
 			atmel,nand-addr-offset = <21>;
 			atmel,nand-cmd-offset = <22>;
 			gpios = <&pioD 5 0
arch/arm/boot/dts/at91sam9x5cm.dtsi +4 -1
index 31e7be2..4027ac7 100644
@@ -26,7 +26,10 @@
 	ahb {
 		nand0: nand@40000000 {
 			nand-bus-width = <8>;
-			nand-ecc-mode = "soft";
+			nand-ecc-mode = "hw";
+			atmel,has-pmecc;	/* Enable PMECC */
+			atmel,pmecc-cap = <2>;
+			atmel,pmecc-sector-size = <512>;
 			nand-on-flash-bbt;
 			status = "okay";
 
Signature · 1 line
1.7.9.5
author
#7 lore raw

PATCH 3/3 at91: at91sam9n12: add DT parameters to enable PMECC

In reply to Josh Wu

Default ecc correctable setting is 2bits in 512 bytes.

---
 arch/arm/boot/dts/at91sam9n12.dtsi  |    1 +
 arch/arm/boot/dts/at91sam9n12ek.dts |    5 ++++-
 2 files changed, 5 insertions(+), 1 deletion(-)
arch/arm/boot/dts/at91sam9n12.dtsi +1 -0
index 82508d6..c9719ce 100644
@@ -213,6 +213,7 @@
 				0xffffe600 0x00000200
 				0x00100000 0x00100000
 			       >;
+			atmel,pmecc-lookup-table-offset = <0x8000 0x10000>;
 			atmel,nand-addr-offset = <21>;
 			atmel,nand-cmd-offset = <22>;
 			gpios = <&pioD 5 0
arch/arm/boot/dts/at91sam9n12ek.dts +4 -1
index 912b2c2..88ee0da 100644
@@ -49,7 +49,10 @@
 
 		nand0: nand@40000000 {
 			nand-bus-width = <8>;
-			nand-ecc-mode = "soft";
+			nand-ecc-mode = "hw";
+			atmel,has-pmecc;
+			atmel,pmecc-cap = <2>;
+			atmel,pmecc-sector-size = <512>;
 			nand-on-flash-bbt;
 			status = "okay";
 		};
Signature · 1 line
1.7.9.5
author
#8 lore raw

cover at91: PMECC: enable PMECC in dt for at91sam9x5ek, at91sam9n12ek

In reply to Josh Wu

Ping? Any feedback for these patches?

Quoted 8 lines · Josh Wu

Those patches will enable PMECC in dt parameters for at91sam9x5ek, at91sam9n12ek.

Josh Wu (3):
MTD: at91: atmel_nand: for PMECC, add code to choose the ecc bits and
sector size according to the ONFI parameter ECC requirement.
at91: 9x5: add DT parameters to enable PMECC
at91: at91sam9n12: add DT parameters to enable PMECC

Quoted 7 lines
  arch/arm/boot/dts/at91sam9n12.dtsi  |    1 +
  arch/arm/boot/dts/at91sam9n12ek.dts |    5 +-
  arch/arm/boot/dts/at91sam9x5.dtsi   |    4 ++
  arch/arm/boot/dts/at91sam9x5cm.dtsi |    5 +-
  drivers/mtd/nand/atmel_nand.c       |   89 +++++++++++++++++++++++++++++++++++
  5 files changed, 102 insertions(+), 2 deletions(-)

Best Regards,
Josh Wu