LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH 0/2] ARM: mvebu: a385-db-ap: Enable the NAND controller
@ 2015-01-23 15:41 Maxime Ripard
  2015-01-23 15:41 ` [PATCH 1/2] mtd: nand: pxa3xx: Fix PIO FIFO draining Maxime Ripard
  2015-01-23 15:41 ` [PATCH 2/2] ARM: mvebu: a385-db-ap: Enable the NAND Maxime Ripard
  0 siblings, 2 replies; 5+ messages in thread
From: Maxime Ripard @ 2015-01-23 15:41 UTC (permalink / raw)
  To: Gregory Clement, Jason Cooper, Andrew Lunn,
	Sebastian Hesselbarth, Ezequiel Garcia, Brian Norris
  Cc: linux-mtd, Boris Brezillon, Thomas Petazzoni, linux-arm-kernel,
	Tawfik Bayouk, Nadav Haklai, Lior Amsalem, linux-kernel,
	Sudhakar Gundubogula, Seif Mazareeb, Maxime Ripard

Hi,

This patch serie enable the NAND support on the Armada 385 Access
Point DB.

In the process, some timeouts were found when we were accessing a
freshly erased NAND page, which turned out to be an issue when
draining the read FIFO where we were not following the datasheet.

This has been fixed with the first patch, with stable CC'd. The second
patch just enables the NAND controller in the DT.

Thanks,
Maxime

Maxime Ripard (2):
  mtd: nand: pxa3xx: Fix PIO FIFO draining
  ARM: mvebu: a385-db-ap: Enable the NAND

 arch/arm/boot/dts/armada-385-db-ap.dts | 13 ++++++++++++
 drivers/mtd/nand/pxa3xx_nand.c         | 36 ++++++++++++++++++++++++++++------
 2 files changed, 43 insertions(+), 6 deletions(-)

-- 
2.2.2


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] mtd: nand: pxa3xx: Fix PIO FIFO draining
  2015-01-23 15:41 [PATCH 0/2] ARM: mvebu: a385-db-ap: Enable the NAND controller Maxime Ripard
@ 2015-01-23 15:41 ` Maxime Ripard
  2015-01-23 15:59   ` Gregory CLEMENT
  2015-01-23 15:41 ` [PATCH 2/2] ARM: mvebu: a385-db-ap: Enable the NAND Maxime Ripard
  1 sibling, 1 reply; 5+ messages in thread
From: Maxime Ripard @ 2015-01-23 15:41 UTC (permalink / raw)
  To: Gregory Clement, Jason Cooper, Andrew Lunn,
	Sebastian Hesselbarth, Ezequiel Garcia, Brian Norris
  Cc: linux-mtd, Boris Brezillon, Thomas Petazzoni, linux-arm-kernel,
	Tawfik Bayouk, Nadav Haklai, Lior Amsalem, linux-kernel,
	Sudhakar Gundubogula, Seif Mazareeb, Maxime Ripard, stable

The NDDB register holds the data that are needed by the read and write
commands.

However, during a read PIO access, the datasheet specifies that after each 32
bits read in that register, when BCH is enabled, we have to make sure that the
RDDREQ bit is set in the NDSR register.

This fixes an issue that was seen on the Armada 385, and presumably other mvebu
SoCs, when a read on a newly erased page would end up in the driver reporting a
timeout from the NAND.

Cc: <stable@vger.kernel.org>
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
---
 drivers/mtd/nand/pxa3xx_nand.c | 36 ++++++++++++++++++++++++++++++------
 1 file changed, 30 insertions(+), 6 deletions(-)

diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c
index 96b0b1d27df1..320c2ab14d4e 100644
--- a/drivers/mtd/nand/pxa3xx_nand.c
+++ b/drivers/mtd/nand/pxa3xx_nand.c
@@ -480,6 +480,30 @@ static void disable_int(struct pxa3xx_nand_info *info, uint32_t int_mask)
 	nand_writel(info, NDCR, ndcr | int_mask);
 }
 
+static void drain_fifo(struct pxa3xx_nand_info *info,
+		       void *data,
+		       int len)
+{
+	u32 *dst = (u32 *)data;
+
+	if (info->ecc_bch) {
+		while (len--) {
+			*dst++ = nand_readl(info, NDDB);
+
+			/*
+			 * According to the datasheet, when reading
+			 * from NDDB with BCH enabled, after each 32
+			 * bits reads, we have to make sure that the
+			 * NDSR.RDDREQ bit is set
+			 */
+			while (!(nand_readl(info, NDSR) & NDSR_RDDREQ))
+				cpu_relax();
+		}
+	} else {
+		__raw_readsl(info->mmio_base + NDDB, data, len);
+	}
+}
+
 static void handle_data_pio(struct pxa3xx_nand_info *info)
 {
 	unsigned int do_bytes = min(info->data_size, info->chunk_size);
@@ -496,14 +520,14 @@ static void handle_data_pio(struct pxa3xx_nand_info *info)
 				      DIV_ROUND_UP(info->oob_size, 4));
 		break;
 	case STATE_PIO_READING:
-		__raw_readsl(info->mmio_base + NDDB,
-			     info->data_buff + info->data_buff_pos,
-			     DIV_ROUND_UP(do_bytes, 4));
+		drain_fifo(info,
+			   info->data_buff + info->data_buff_pos,
+			   DIV_ROUND_UP(do_bytes, 4));
 
 		if (info->oob_size > 0)
-			__raw_readsl(info->mmio_base + NDDB,
-				     info->oob_buff + info->oob_buff_pos,
-				     DIV_ROUND_UP(info->oob_size, 4));
+			drain_fifo(info,
+				   info->oob_buff + info->oob_buff_pos,
+				   DIV_ROUND_UP(info->oob_size, 4));
 		break;
 	default:
 		dev_err(&info->pdev->dev, "%s: invalid state %d\n", __func__,
-- 
2.2.2


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 2/2] ARM: mvebu: a385-db-ap: Enable the NAND
  2015-01-23 15:41 [PATCH 0/2] ARM: mvebu: a385-db-ap: Enable the NAND controller Maxime Ripard
  2015-01-23 15:41 ` [PATCH 1/2] mtd: nand: pxa3xx: Fix PIO FIFO draining Maxime Ripard
@ 2015-01-23 15:41 ` Maxime Ripard
  1 sibling, 0 replies; 5+ messages in thread
From: Maxime Ripard @ 2015-01-23 15:41 UTC (permalink / raw)
  To: Gregory Clement, Jason Cooper, Andrew Lunn,
	Sebastian Hesselbarth, Ezequiel Garcia, Brian Norris
  Cc: linux-mtd, Boris Brezillon, Thomas Petazzoni, linux-arm-kernel,
	Tawfik Bayouk, Nadav Haklai, Lior Amsalem, linux-kernel,
	Sudhakar Gundubogula, Seif Mazareeb, Maxime Ripard

The Armada 385 Access Point Development Board has a 1GB NAND SLC chip from
Micron as its main storage. Enable it.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
---
 arch/arm/boot/dts/armada-385-db-ap.dts | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/arch/arm/boot/dts/armada-385-db-ap.dts b/arch/arm/boot/dts/armada-385-db-ap.dts
index b891b4c897f5..ee648fb19075 100644
--- a/arch/arm/boot/dts/armada-385-db-ap.dts
+++ b/arch/arm/boot/dts/armada-385-db-ap.dts
@@ -130,6 +130,19 @@
 				phy-mode = "rgmii-id";
 			};
 
+			nfc: flash@d0000 {
+				status = "okay";
+				#address-cells = <1>;
+				#size-cells = <1>;
+
+				num-cs = <1>;
+				nand-ecc-strength = <4>;
+				nand-ecc-step-size = <512>;
+				marvell,nand-keep-config;
+				marvell,nand-enable-arbiter;
+				nand-on-flash-bbt;
+			};
+
 			usb3@f0000 {
 				status = "okay";
 				usb-phy = <&usb3_phy>;
-- 
2.2.2


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] mtd: nand: pxa3xx: Fix PIO FIFO draining
  2015-01-23 15:41 ` [PATCH 1/2] mtd: nand: pxa3xx: Fix PIO FIFO draining Maxime Ripard
@ 2015-01-23 15:59   ` Gregory CLEMENT
  2015-01-24 14:01     ` Ezequiel Garcia
  0 siblings, 1 reply; 5+ messages in thread
From: Gregory CLEMENT @ 2015-01-23 15:59 UTC (permalink / raw)
  To: Maxime Ripard
  Cc: Jason Cooper, Andrew Lunn, Sebastian Hesselbarth,
	Ezequiel Garcia, Brian Norris, linux-mtd, Boris Brezillon,
	Thomas Petazzoni, linux-arm-kernel, Tawfik Bayouk, Nadav Haklai,
	Lior Amsalem, linux-kernel, Sudhakar Gundubogula, Seif Mazareeb,
	stable

Hi Maxime,

On 23/01/2015 16:41, Maxime Ripard wrote:
> The NDDB register holds the data that are needed by the read and write
> commands.
> 
> However, during a read PIO access, the datasheet specifies that after each 32
> bits read in that register, when BCH is enabled, we have to make sure that the
> RDDREQ bit is set in the NDSR register.
> 
> This fixes an issue that was seen on the Armada 385, and presumably other mvebu
> SoCs, when a read on a newly erased page would end up in the driver reporting a
> timeout from the NAND.
> 
> Cc: <stable@vger.kernel.org>

It would help the stable maintainer if you could indicate since which commit or
kernel release this fix should be applied.

> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
> ---
>  drivers/mtd/nand/pxa3xx_nand.c | 36 ++++++++++++++++++++++++++++++------
>  1 file changed, 30 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c
> index 96b0b1d27df1..320c2ab14d4e 100644
> --- a/drivers/mtd/nand/pxa3xx_nand.c
> +++ b/drivers/mtd/nand/pxa3xx_nand.c
> @@ -480,6 +480,30 @@ static void disable_int(struct pxa3xx_nand_info *info, uint32_t int_mask)
>  	nand_writel(info, NDCR, ndcr | int_mask);
>  }
>  
> +static void drain_fifo(struct pxa3xx_nand_info *info,
> +		       void *data,
> +		       int len)
> +{
> +	u32 *dst = (u32 *)data;
> +
> +	if (info->ecc_bch) {
> +		while (len--) {
> +			*dst++ = nand_readl(info, NDDB);
> +
> +			/*
> +			 * According to the datasheet, when reading
> +			 * from NDDB with BCH enabled, after each 32
> +			 * bits reads, we have to make sure that the
> +			 * NDSR.RDDREQ bit is set
> +			 */
> +			while (!(nand_readl(info, NDSR) & NDSR_RDDREQ))
> +				cpu_relax();

Are we sure that we won't be blocked here?
If not, what about adding a timeout?

Thanks,

Gregory
> +		}
> +	} else {
> +		__raw_readsl(info->mmio_base + NDDB, data, len);
> +	}
> +}
> +
>  static void handle_data_pio(struct pxa3xx_nand_info *info)
>  {
>  	unsigned int do_bytes = min(info->data_size, info->chunk_size);
> @@ -496,14 +520,14 @@ static void handle_data_pio(struct pxa3xx_nand_info *info)
>  				      DIV_ROUND_UP(info->oob_size, 4));
>  		break;
>  	case STATE_PIO_READING:
> -		__raw_readsl(info->mmio_base + NDDB,
> -			     info->data_buff + info->data_buff_pos,
> -			     DIV_ROUND_UP(do_bytes, 4));
> +		drain_fifo(info,
> +			   info->data_buff + info->data_buff_pos,
> +			   DIV_ROUND_UP(do_bytes, 4));
>  
>  		if (info->oob_size > 0)
> -			__raw_readsl(info->mmio_base + NDDB,
> -				     info->oob_buff + info->oob_buff_pos,
> -				     DIV_ROUND_UP(info->oob_size, 4));
> +			drain_fifo(info,
> +				   info->oob_buff + info->oob_buff_pos,
> +				   DIV_ROUND_UP(info->oob_size, 4));
>  		break;
>  	default:
>  		dev_err(&info->pdev->dev, "%s: invalid state %d\n", __func__,
> 


-- 
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] mtd: nand: pxa3xx: Fix PIO FIFO draining
  2015-01-23 15:59   ` Gregory CLEMENT
@ 2015-01-24 14:01     ` Ezequiel Garcia
  0 siblings, 0 replies; 5+ messages in thread
From: Ezequiel Garcia @ 2015-01-24 14:01 UTC (permalink / raw)
  To: Gregory CLEMENT, Maxime Ripard
  Cc: Jason Cooper, Andrew Lunn, Sebastian Hesselbarth, Brian Norris,
	linux-mtd, Boris Brezillon, Thomas Petazzoni, linux-arm-kernel,
	Tawfik Bayouk, Nadav Haklai, Lior Amsalem, linux-kernel,
	Sudhakar Gundubogula, Seif Mazareeb, stable

On 01/23/2015 12:59 PM, Gregory CLEMENT wrote:
> On 23/01/2015 16:41, Maxime Ripard wrote:
>> The NDDB register holds the data that are needed by the read and write
>> commands.
>>
>> However, during a read PIO access, the datasheet specifies that after each 32
>> bits read in that register, when BCH is enabled, we have to make sure that the
>> RDDREQ bit is set in the NDSR register.
>>
>> This fixes an issue that was seen on the Armada 385, and presumably other mvebu
>> SoCs, when a read on a newly erased page would end up in the driver reporting a
>> timeout from the NAND.
>>
>> Cc: <stable@vger.kernel.org>
> 
> It would help the stable maintainer if you could indicate since which commit or
> kernel release this fix should be applied.
> 

This is a fix for the BCH support, namely commit 43bcfd2bb24a
"mtd: nand: pxa3xx: Add driver-specific ECC BCH support". The commit was merged
in v3.14.

However, this patch won't apply directly there. It will apply on commit
fa543bef72d6 "mtd: nand: pxa3xx: Add a read/write buffers markers"; which
was also merged in v3.14.

Therefore, I guess it's OK to say

Cc: <stable@vger.kernel.org> # v3.14.x

>> Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
>> ---
>>  drivers/mtd/nand/pxa3xx_nand.c | 36 ++++++++++++++++++++++++++++++------
>>  1 file changed, 30 insertions(+), 6 deletions(-)
>>
>> diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c
>> index 96b0b1d27df1..320c2ab14d4e 100644
>> --- a/drivers/mtd/nand/pxa3xx_nand.c
>> +++ b/drivers/mtd/nand/pxa3xx_nand.c
>> @@ -480,6 +480,30 @@ static void disable_int(struct pxa3xx_nand_info *info, uint32_t int_mask)
>>  	nand_writel(info, NDCR, ndcr | int_mask);
>>  }
>>  
>> +static void drain_fifo(struct pxa3xx_nand_info *info,
>> +		       void *data,
>> +		       int len)

^^
You don't need to split that line, it seems to fit 80 characters as is.

>> +{
>> +	u32 *dst = (u32 *)data;
>> +
>> +	if (info->ecc_bch) {
>> +		while (len--) {
>> +			*dst++ = nand_readl(info, NDDB);
>> +
>> +			/*
>> +			 * According to the datasheet, when reading
>> +			 * from NDDB with BCH enabled, after each 32
>> +			 * bits reads, we have to make sure that the
>> +			 * NDSR.RDDREQ bit is set
>> +			 */
>> +			while (!(nand_readl(info, NDSR) & NDSR_RDDREQ))
>> +				cpu_relax();
> 
> Are we sure that we won't be blocked here?
> If not, what about adding a timeout?
> 

Definitely. I think we shouldn't have an infinite loop, no matter what the hw specs say.
-- 
Ezequiel García, Free Electrons
Embedded Linux, Kernel and Android Engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2015-01-24 14:09 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-23 15:41 [PATCH 0/2] ARM: mvebu: a385-db-ap: Enable the NAND controller Maxime Ripard
2015-01-23 15:41 ` [PATCH 1/2] mtd: nand: pxa3xx: Fix PIO FIFO draining Maxime Ripard
2015-01-23 15:59   ` Gregory CLEMENT
2015-01-24 14:01     ` Ezequiel Garcia
2015-01-23 15:41 ` [PATCH 2/2] ARM: mvebu: a385-db-ap: Enable the NAND Maxime Ripard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).