Uncorrectable bitflips with Linux 4.12 on SAMA5D2

Boris Brezillon boris.brezillon at free-electrons.com
Mon Jul 31 09:35:32 PDT 2017


On Mon, 17 Jul 2017 20:20:08 +0200
Boris Brezillon <boris.brezillon at free-electrons.com> wrote:

> Le Mon, 17 Jul 2017 19:48:09 +0200,
> Boris Brezillon <boris.brezillon at free-electrons.com> a écrit :
> 
> > +Ludovic, Nicolas and Alexandre
> > 
> > Hi Romain,
> > 
> > Le Mon, 17 Jul 2017 18:11:26 +0200,
> > Romain Izard <romain.izard.pro at gmail.com> a écrit :
> >   
> > > Hello,
> > > 
> > > On a custom board based on Microchip's SAMA5D2 SoC, I am encountering
> > > ECC problems with the NAND Flash controller. The board is currently
> > > working with Linux v4.9.x, but it does not with Linux 4.12.
> > > 
> > > Some pages on the NAND Flash memory chip of the device have bitflips.
> > > With Linux 4.9.x, the bitflips are fixed by the PMECC code, but with
> > > Linux 4.12, the errors are reported as uncorrectable.
> > > 
> > > From my end, I updated the board's device tree to include the
> > > sama5d2.dtsi as it exists in Linux 4.12, but the rest of the file is
> > > the same as for Linux 4.9. From my understanding, it should be
> > > sufficient as the legacy DTB binding for the NAND controller is
> > > supported.    
> > 
> > I know Ludovic add some problems with the NAND controller on sama5d2,
> > but it was with the new bindings (see the fixes here [1]).
> > 
> > Your problem seems a bit different since you're using the backward
> > compat code.  
> 
> Can you try with the following patch applied?
> 
> --->8---  
> From cb95a16cdd497137872c44d5dd4e251ec73c79c1 Mon Sep 17 00:00:00 2001
> From: Boris Brezillon <boris.brezillon at free-electrons.com>
> Date: Mon, 17 Jul 2017 20:09:59 +0200
> Subject: [PATCH] mtd: nand: atmel: Fix DT backward compatibility in pmecc.c
> 
> PMECC caps extraction from old DT bindings is broken, thus leading to
> erroneous EL registers offset, which in turn make HW ECC unusable on
> sama5d2 when old bindings are in use.
> 
> Passing the NAND dev node instead of the NFC node to of_match_node()
> solves the problem.
> 
> Signed-off-by: Boris Brezillon <boris.brezillon at free-electrons.com>
> Fixes: f88fc122cc34 ("mtd: nand: Cleanup/rework the atmel_nand driver")
> Cc: <stable at vger.kernel.org>

Applied to nand/fixes.

> ---
>  drivers/mtd/nand/atmel/pmecc.c | 21 ++++++---------------
>  1 file changed, 6 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/mtd/nand/atmel/pmecc.c b/drivers/mtd/nand/atmel/pmecc.c
> index 55a8ee5306ea..8c210a5776bc 100644
> --- a/drivers/mtd/nand/atmel/pmecc.c
> +++ b/drivers/mtd/nand/atmel/pmecc.c
> @@ -945,6 +945,7 @@ struct atmel_pmecc *devm_atmel_pmecc_get(struct device *userdev)
>  		 */
>  		struct platform_device *pdev = to_platform_device(userdev);
>  		const struct atmel_pmecc_caps *caps;
> +		const struct of_device_id *match;
>  
>  		/* No PMECC engine available. */
>  		if (!of_property_read_bool(userdev->of_node,
> @@ -953,21 +954,11 @@ struct atmel_pmecc *devm_atmel_pmecc_get(struct device *userdev)
>  
>  		caps = &at91sam9g45_caps;
>  
> -		/*
> -		 * Try to find the NFC subnode and extract the associated caps
> -		 * from there.
> -		 */
> -		np = of_find_compatible_node(userdev->of_node, NULL,
> -					     "atmel,sama5d3-nfc");
> -		if (np) {
> -			const struct of_device_id *match;
> -
> -			match = of_match_node(atmel_pmecc_legacy_match, np);
> -			if (match && match->data)
> -				caps = match->data;
> -
> -			of_node_put(np);
> -		}
> +		/* Find the caps associated to the NAND dev node. */
> +		match = of_match_node(atmel_pmecc_legacy_match,
> +				      userdev->of_node);
> +		if (match && match->data)
> +			caps = match->data;
>  
>  		pmecc = atmel_pmecc_create(pdev, caps, 1, 2);
>  	}
> 
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/




More information about the linux-arm-kernel mailing list