Skip to contentSkip to conversation

NAND support for Armada 370

DISCUSSION Rodolfo Giometti 3 participants 10 messages Jan 2, 2014 – Jan 13, 2014 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

Hello Gregory,

I'm working on vanilla kernel 3.13-rc6 and an Armada-370 based board (compatible with armada-370-db) and I'm trying to get NAND support working.

I noticed that on my kernel is missing your patch named "[PATCH v2 01/27] clk: mvebu: Add Core Divider clock", however after applying it I get:

pxa3xx-nand f10d0000.nand: This platform can't do DMA on this device pxa3xx-nand f10d0000.nand: Wait time out!!!
pxa3xx-nand f10d0000.nand: Wait time out!!!
pxa3xx-nand f10d0000.nand: Wait time out!!!
No NAND device found

Do I still miss something? And what about DMA support?

Thanks in advance,

Rodolfo

Signature · 5 lines
GNU/Linux Solutions                  e-mail: giometti at enneenne.com
Linux Device Driver                          giometti at linux.it
Embedded Systems                     phone:  +39 349 2432127
UNIX programming                     skype:  rodolfo.giometti
Freelance ICT Italia - Consulente ICT Italia - www.consulenti-ict.it
#1 lore raw

Dear Rodolfo Giometti,

The e-mail address you used for Gregory is wrong. Also, for NAND questions, you should Cc Ezequiel Garcia (I added him), as he is our NAND driver developer.

Quoted 8 lines · Rodolfo Giometti

I'm working on vanilla kernel 3.13-rc6 and an Armada-370 based board (compatible with armada-370-db) and I'm trying to get NAND support working.

I noticed that on my kernel is missing your patch named "[PATCH v2 01/27] clk: mvebu: Add Core Divider clock", however after applying it I get:

Quoted 7 lines
   pxa3xx-nand f10d0000.nand: This platform can't do DMA on this device
   pxa3xx-nand f10d0000.nand: Wait time out!!!
   pxa3xx-nand f10d0000.nand: Wait time out!!!
   pxa3xx-nand f10d0000.nand: Wait time out!!!
   No NAND device found

Do I still miss something? And what about DMA support?

The 3.13-rc kernels do not have NAND support for Armada 370/XP. The NAND support will only arrive in 3.14. You can try the linux-next tree, but I'm not sure it has absolutely all of the patches that are needed (I see at least one potentially missing).

Alternatively, you can use the backport-3.10 branch at
https://github.com/MISL-EBU-System-SW/mainline-public/commits/backport-3.10.
It is based on 3.10, and has a good number of backported patches, including NAND support.

Best regards,

Thomas

Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com
#2 lore raw
Quoted 3 lines · Thomas Petazzoni

Dear Rodolfo Giometti,

The e-mail address you used for Gregory is wrong.

I see... sorry! I did too much cut&paste! :-P

Quoted 2 lines

Also, for NAND questions, you should Cc Ezequiel Garcia (I added him), as he is our NAND driver developer.

Thanks a lot for your help!

Rodolfo

Signature · 5 lines
GNU/Linux Solutions                  e-mail: giometti at enneenne.com
Linux Device Driver                          giometti at linux.it
Embedded Systems                     phone:  +39 349 2432127
UNIX programming                     skype:  rodolfo.giometti
Freelance ICT Italia - Consulente ICT Italia - www.consulenti-ict.it
#3 lore raw
In reply to Thomas Petazzoni
Quoted 10 lines · Thomas Petazzoni

The 3.13-rc kernels do not have NAND support for Armada 370/XP. The NAND support will only arrive in 3.14. You can try the linux-next tree, but I'm not sure it has absolutely all of the patches that are needed (I see at least one potentially missing).

Alternatively, you can use the backport-3.10 branch at
https://github.com/MISL-EBU-System-SW/mainline-public/commits/backport-3.10.
It is based on 3.10, and has a good number of backported patches, including NAND support.

I got several patches from here:

https://github.com/MISL-EBU-System-SW/mainline-public.git

and now I have:

pxa3xx-nand f10d0000.nand: This platform can't do DMA on this device NAND device: Manufacturer ID: 0x2c, Chip ID: 0xf1 (Micron MT29F1G08ABADAWP) NAND device: 128MiB, SLC, page size: 2048, OOB size: 64 pxa3xx-nand f10d0000.nand: ECC strength 4 at page size 2048 is not supported pxa3xx-nand f10d0000.nand: failed to scan nand at cs 0

So I suppose I should modify function pxa_ecc_init() in file drivers/mtd/nand/pxa3xx_nand.c in order to support my NAND chip, is that right? Have you any advice for me about it? :)

Thanks a lot,

Rodolfo

Signature · 5 lines
GNU/Linux Solutions                  e-mail: giometti at enneenne.com
Linux Device Driver                          giometti at linux.it
Embedded Systems                     phone:  +39 349 2432127
UNIX programming                     skype:  rodolfo.giometti
Freelance ICT Italia - Consulente ICT Italia - www.consulenti-ict.it
#4 lore raw
Quoted 14 lines · Rodolfo Giometti
Quoted 10 lines · Thomas Petazzoni

The 3.13-rc kernels do not have NAND support for Armada 370/XP. The NAND support will only arrive in 3.14. You can try the linux-next tree, but I'm not sure it has absolutely all of the patches that are needed (I see at least one potentially missing).

Alternatively, you can use the backport-3.10 branch at
https://github.com/MISL-EBU-System-SW/mainline-public/commits/backport-3.10.
It is based on 3.10, and has a good number of backported patches, including NAND support.

I got several patches from here:

Quoted 7 lines

https://github.com/MISL-EBU-System-SW/mainline-public.git

and now I have:

pxa3xx-nand f10d0000.nand: This platform can't do DMA on this device NAND device: Manufacturer ID: 0x2c, Chip ID: 0xf1 (Micron MT29F1G08ABADAWP) NAND device: 128MiB, SLC, page size: 2048, OOB size: 64

Great! Your NAND is now detected...

Quoted 7 lines

pxa3xx-nand f10d0000.nand: ECC strength 4 at page size 2048 is not supported pxa3xx-nand f10d0000.nand: failed to scan nand at cs 0

So I suppose I should modify function pxa_ecc_init() in file drivers/mtd/nand/pxa3xx_nand.c in order to support my NAND chip, is that right? Have you any advice for me about it? :)

Can you modify the above message so the ECC step size is also printed? I'll help you prepare a suitable fix to support your NAND.

Thanks!

Signature · 3 lines
Ezequiel Garc?a, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com
#5 lore raw
Quoted 9 lines · Ezequiel Garcia
Quoted 3 lines

pxa3xx-nand f10d0000.nand: This platform can't do DMA on this device NAND device: Manufacturer ID: 0x2c, Chip ID: 0xf1 (Micron MT29F1G08ABADAWP) NAND device: 128MiB, SLC, page size: 2048, OOB size: 64

Great! Your NAND is now detected...

Quoted 3 lines

pxa3xx-nand f10d0000.nand: ECC strength 4 at page size 2048 is not supported pxa3xx-nand f10d0000.nand: failed to scan nand at cs 0

Quoted 6 lines
Quoted 4 lines

So I suppose I should modify function pxa_ecc_init() in file drivers/mtd/nand/pxa3xx_nand.c in order to support my NAND chip, is that right? Have you any advice for me about it? :)

Can you modify the above message so the ECC step size is also printed?

Here my modification:

diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c index 31aae53..3e4519f 100644
--- a/drivers/mtd/nand/pxa3xx_nand.c
+++ b/drivers/mtd/nand/pxa3xx_nand.c
@@ -1498,6 +1508,8 @@ KEEP_CONFIG:

           ecc_strength = chip->ecc_strength_ds;
           ecc_step = chip->ecc_step_ds;
   +       dev_info(&info->pdev->dev, "ECC strength %d, ECC step size %d\n",
   +                       ecc_strength, ecc_step);
    
           /* Set default ECC strength requirements on non-ONFI devices */
           if (ecc_strength < 1 && ecc_step < 1) {

and the corresponding output:

pxa3xx-nand f10d0000.nand: ECC strength 4, ECC step size 512

Quoted 1 line

I'll help you prepare a suitable fix to support your NAND.

Great. Thanks! :-)

Ciao,

Rodolfo

Signature · 5 lines
GNU/Linux Solutions                  e-mail: giometti at enneenne.com
Linux Device Driver                          giometti at linux.it
Embedded Systems                     phone:  +39 349 2432127
UNIX programming                     skype:  rodolfo.giometti
Freelance ICT Italia - Consulente ICT Italia - www.consulenti-ict.it
#6 lore raw
In reply to Ezequiel Garcia
Quoted 3 lines · Ezequiel Garcia

Can you modify the above message so the ECC step size is also printed? I'll help you prepare a suitable fix to support your NAND.

After some attemps I found this configuration... however I'd like to have your opinion about it since I'm not so sure that I correctly understood what each parameter means. :-)

Thanks in advance,

Rodolfo

Signature · 12 lines
GNU/Linux Solutions                  e-mail: giometti at enneenne.com
Linux Device Driver                          giometti at linux.it
Embedded Systems                     phone:  +39 349 2432127
UNIX programming                     skype:  rodolfo.giometti
Freelance ICT Italia - Consulente ICT Italia - www.consulenti-ict.it
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-mtd-pxa3xx_nand.c-add-support-for-2048-bytes-page-si.patch
Type: text/x-diff
Size: 1656 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140106/af46e3dc/attachment.bin>
#7 lore raw

Hi Rodolfo,

(Ccing MTD list so they can review this as well)

Quoted 9 lines · Rodolfo Giometti
Quoted 3 lines · Ezequiel Garcia

Can you modify the above message so the ECC step size is also printed? I'll help you prepare a suitable fix to support your NAND.

After some attemps I found this configuration... however I'd like to have your opinion about it since I'm not so sure that I correctly understood what each parameter means. :-)

Sorry for being so unresponsive these days, I've been on vacation. I'll review your patch on Monday.

In fact, already took a quick look and it looks good. I have a few doubts:

1. Do we need the ECC layout? (MTD already provides defaults)

2. Is this compatible with Marvell's U-Boot? (can you write from U-Boot, and read from Linux, and viceversa?)

Regards and thanks a lot for your contribution!
Ezequiel

Quoted 53 lines

From 8fc320506e1573dbff4844f4d98e20ff91c43ffd Mon Sep 17 00:00:00 2001
From: Rodolfo Giometti <[email protected]>
Date: Mon, 6 Jan 2014 16:18:49 +0100
Subject: [PATCH] mtd pxa3xx_nand.c: add support for 2048 bytes page size
layout

---
 drivers/mtd/nand/pxa3xx_nand.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
drivers/mtd/nand/pxa3xx_nand.c +21 -0
index 31aae53..2a7a0b2 100644
@@ -286,6 +286,16 @@ static struct nand_bbt_descr bbt_mirror_descr = {
 	.pattern = bbt_mirror_pattern
 };
 
+static struct nand_ecclayout ecc_layout_2KB_bch4bit = {
+	.eccbytes = 32,
+	.eccpos = {
+		32, 33, 34, 35, 36, 37, 38, 39,
+		40, 41, 42, 43, 44, 45, 46, 47,
+		48, 49, 50, 51, 52, 53, 54, 55,
+		56, 57, 58, 59, 60, 61, 62, 63},
+	.oobfree = { {2, 30} }
+};
+
 static struct nand_ecclayout ecc_layout_4KB_bch4bit = {
 	.eccbytes = 64,
 	.eccpos = {
@@ -1360,6 +1370,17 @@ static int pxa_ecc_init(struct pxa3xx_nand_info *info,
 	 * Required ECC: 4-bit correction per 512 bytes
 	 * Select: 16-bit correction per 2048 bytes
 	 */
+	} else if (strength == 4 && ecc_stepsize == 512 && page_size == 2048) {
+		info->ecc_bch = 1;
+		info->chunk_size = 2048;
+		info->spare_size = 32;
+		info->ecc_size = 32;
+		ecc->mode = NAND_ECC_HW;
+		ecc->size = info->chunk_size;
+		ecc->layout = &ecc_layout_2KB_bch4bit;
+		ecc->strength = 16;
+		return 1;
+
 	} else if (strength == 4 && ecc_stepsize == 512 && page_size == 4096) {
 		info->ecc_bch = 1;
 		info->chunk_size = 2048;
Signature · 1 line
1.8.1.2
Signature · 3 lines
Ezequiel Garc?a, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com
#8 lore raw
Quoted 4 lines · Ezequiel Garcia

Hi Rodolfo,

Sorry for being so unresponsive these days, I've been on vacation. I'll review your patch on Monday.

Ok.

Quoted 4 lines

In fact, already took a quick look and it looks good. I have a few doubts:

1. Do we need the ECC layout? (MTD already provides defaults)

Ok, I did some testes and we can safely remove it! :)

Quoted 2 lines

2. Is this compatible with Marvell's U-Boot? (can you write from U-Boot, and read from Linux, and viceversa?)

Till now all our tests are ok! :)

Attached is the new patch release.

Ciao,

Rodolfo

Signature · 12 lines
GNU/Linux Solutions                  e-mail: giometti at enneenne.com
Linux Device Driver                          giometti at linux.it
Embedded Systems                     phone:  +39 349 2432127
UNIX programming                     skype:  rodolfo.giometti
Freelance ICT Italia - Consulente ICT Italia - www.consulenti-ict.it
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-mtd-pxa3xx_nand.c-add-support-for-2048-bytes-page-si.patch
Type: text/x-diff
Size: 1192 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20140109/2c993927/attachment.bin>
#9 lore raw
In reply to Rodolfo Giometti

Rodolfo,

After reviewing the driver and the NAND kernel core, I think we should use your first version of the patch (with the custom ECC layout).

The default ECC layout provided by Linux for 64-byte OOB is different from the actual layout used by the ECC BCH "16-bit over 2048B" that we use.

IIRC, this ECC layout is not really in use so that's why you didn't spot any issues while removing. Nevertheless, we should try to have it right.

Can you please re-submit the quoted patch (see below) to the MTD mailing list? (don't forget to add me on Cc)

Thanks a lot!

Quoted 53 lines

From 8fc320506e1573dbff4844f4d98e20ff91c43ffd Mon Sep 17 00:00:00 2001
From: Rodolfo Giometti <[email protected]>
Date: Mon, 6 Jan 2014 16:18:49 +0100
Subject: [PATCH] mtd pxa3xx_nand.c: add support for 2048 bytes page size
layout

---
 drivers/mtd/nand/pxa3xx_nand.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
drivers/mtd/nand/pxa3xx_nand.c +21 -0
index 31aae53..2a7a0b2 100644
@@ -286,6 +286,16 @@ static struct nand_bbt_descr bbt_mirror_descr = {
 	.pattern = bbt_mirror_pattern
 };
 
+static struct nand_ecclayout ecc_layout_2KB_bch4bit = {
+	.eccbytes = 32,
+	.eccpos = {
+		32, 33, 34, 35, 36, 37, 38, 39,
+		40, 41, 42, 43, 44, 45, 46, 47,
+		48, 49, 50, 51, 52, 53, 54, 55,
+		56, 57, 58, 59, 60, 61, 62, 63},
+	.oobfree = { {2, 30} }
+};
+
 static struct nand_ecclayout ecc_layout_4KB_bch4bit = {
 	.eccbytes = 64,
 	.eccpos = {
@@ -1360,6 +1370,17 @@ static int pxa_ecc_init(struct pxa3xx_nand_info *info,
 	 * Required ECC: 4-bit correction per 512 bytes
 	 * Select: 16-bit correction per 2048 bytes
 	 */
+	} else if (strength == 4 && ecc_stepsize == 512 && page_size == 2048) {
+		info->ecc_bch = 1;
+		info->chunk_size = 2048;
+		info->spare_size = 32;
+		info->ecc_size = 32;
+		ecc->mode = NAND_ECC_HW;
+		ecc->size = info->chunk_size;
+		ecc->layout = &ecc_layout_2KB_bch4bit;
+		ecc->strength = 16;
+		return 1;
+
 	} else if (strength == 4 && ecc_stepsize == 512 && page_size == 4096) {
 		info->ecc_bch = 1;
 		info->chunk_size = 2048;
Signature · 1 line
1.8.1.2
Signature · 3 lines
Ezequiel Garc?a, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com