diff mbox

[U-Boot,U-Boot,v3,3/7] spl: nand: support redundant u-boot image

Message ID 20160620000747.GA30605@home.buserror.net
State Not Applicable
Delegated to: Scott Wood
Headers show

Commit Message

Crystal Wood June 20, 2016, 12:07 a.m. UTC
On Mon, Jun 06, 2016 at 10:16:58AM +0200, Boris Brezillon wrote:
> On modern NAND it's more than recommended to have a backup copy of the
> u-boot binary to recover from corruption: bitflips are quite common on
> MLC NANDs, and the read-disturbance will corrupt your u-boot partitition
> more quickly than what you would see on an SLC NAND.
> 
> Add an extra Kconfig option to specify the offset of the redundant u-boot
> image.
> 
> Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
> Acked-by: Hans de Goede <hdegoede@redhat.com>
> 
> # Conflicts:
> #	common/spl/spl_nand.c
> #	drivers/mtd/nand/Kconfig
> ---
>  common/spl/spl_nand.c    | 5 +++++
>  drivers/mtd/nand/Kconfig | 8 ++++++++
>  2 files changed, 13 insertions(+)
> 
> diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
> index bbd9546..d8c5b9e 100644
> --- a/common/spl/spl_nand.c
> +++ b/common/spl/spl_nand.c
> @@ -107,6 +107,11 @@ int spl_nand_load_image(void)
>  #endif
>  	/* Load u-boot */
>  	err = spl_nand_load_element(CONFIG_SYS_NAND_U_BOOT_OFFS, header);
> +#if CONFIG_SYS_NAND_U_BOOT_OFFS != CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND
> +	if (err)
> +		err = spl_nand_load_element(CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND,
> +					    header);
> +#endif
>  	nand_deselect();
>  	return err;
>  }
> diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
> index 5fe169f..8c46a2f 100644
> --- a/drivers/mtd/nand/Kconfig
> +++ b/drivers/mtd/nand/Kconfig
> @@ -117,6 +117,14 @@ config SYS_NAND_U_BOOT_OFFS
>  	Set the offset from the start of the nand where u-boot should be
>  	loaded from.
>  
> +config SYS_NAND_U_BOOT_OFFS_REDUND
> +	hex "Location in NAND to read U-Boot from"
> +	default SYS_NAND_U_BOOT_OFFS
> +	depends on SYS_NAND_U_BOOT_LOCATIONS
> +	help
> +	Set the offset from the start of the nand where the redundant u-boot
> +	should be loaded from.
> +
>  config SPL_NAND_DENALI
>  	bool "Support Denali NAND controller for SPL"
>  	help

I'm adding the below ifdef while applying, so that the build doesn't
break on targets that don't define CONFIG_SYS_NAND_U_BOOT_LOCATIONS.



-Scott

Comments

Boris Brezillon June 20, 2016, 8:45 a.m. UTC | #1
On Sun, 19 Jun 2016 19:07:47 -0500
Scott Wood <oss@buserror.net> wrote:

> On Mon, Jun 06, 2016 at 10:16:58AM +0200, Boris Brezillon wrote:
> > On modern NAND it's more than recommended to have a backup copy of the
> > u-boot binary to recover from corruption: bitflips are quite common on
> > MLC NANDs, and the read-disturbance will corrupt your u-boot partitition
> > more quickly than what you would see on an SLC NAND.
> > 
> > Add an extra Kconfig option to specify the offset of the redundant u-boot
> > image.
> > 
> > Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
> > Acked-by: Hans de Goede <hdegoede@redhat.com>
> > 
> > # Conflicts:
> > #	common/spl/spl_nand.c
> > #	drivers/mtd/nand/Kconfig
> > ---
> >  common/spl/spl_nand.c    | 5 +++++
> >  drivers/mtd/nand/Kconfig | 8 ++++++++
> >  2 files changed, 13 insertions(+)
> > 
> > diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
> > index bbd9546..d8c5b9e 100644
> > --- a/common/spl/spl_nand.c
> > +++ b/common/spl/spl_nand.c
> > @@ -107,6 +107,11 @@ int spl_nand_load_image(void)
> >  #endif
> >  	/* Load u-boot */
> >  	err = spl_nand_load_element(CONFIG_SYS_NAND_U_BOOT_OFFS, header);
> > +#if CONFIG_SYS_NAND_U_BOOT_OFFS != CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND
> > +	if (err)
> > +		err = spl_nand_load_element(CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND,
> > +					    header);
> > +#endif
> >  	nand_deselect();
> >  	return err;
> >  }
> > diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
> > index 5fe169f..8c46a2f 100644
> > --- a/drivers/mtd/nand/Kconfig
> > +++ b/drivers/mtd/nand/Kconfig
> > @@ -117,6 +117,14 @@ config SYS_NAND_U_BOOT_OFFS
> >  	Set the offset from the start of the nand where u-boot should be
> >  	loaded from.
> >  
> > +config SYS_NAND_U_BOOT_OFFS_REDUND
> > +	hex "Location in NAND to read U-Boot from"
> > +	default SYS_NAND_U_BOOT_OFFS
> > +	depends on SYS_NAND_U_BOOT_LOCATIONS
> > +	help
> > +	Set the offset from the start of the nand where the redundant u-boot
> > +	should be loaded from.
> > +
> >  config SPL_NAND_DENALI
> >  	bool "Support Denali NAND controller for SPL"
> >  	help  
> 
> I'm adding the below ifdef while applying, so that the build doesn't
> break on targets that don't define CONFIG_SYS_NAND_U_BOOT_LOCATIONS.

Oops. I previously had

#ifndef CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND
#define CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND CONFIG_SYS_NAND_U_BOOT_OFFS
#endif

at the beginning of the file, but I removed it when switching to the
approach you suggested.

Thanks for fixing that.

Regards,

Boris

> 
> diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
> index 952f644..0e35e0f 100644
> --- a/common/spl/spl_nand.c
> +++ b/common/spl/spl_nand.c
> @@ -134,11 +134,13 @@ int spl_nand_load_image(void)
>  #endif
>  	/* Load u-boot */
>  	err = spl_nand_load_element(CONFIG_SYS_NAND_U_BOOT_OFFS, header);
> +#ifdef CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND
>  #if CONFIG_SYS_NAND_U_BOOT_OFFS != CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND
>  	if (err)
>  		err = spl_nand_load_element(CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND,
>  					    header);
>  #endif
> +#endif
>  	nand_deselect();
>  	return err;
>  }
> 
> 
> -Scott
diff mbox

Patch

diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
index 952f644..0e35e0f 100644
--- a/common/spl/spl_nand.c
+++ b/common/spl/spl_nand.c
@@ -134,11 +134,13 @@  int spl_nand_load_image(void)
 #endif
 	/* Load u-boot */
 	err = spl_nand_load_element(CONFIG_SYS_NAND_U_BOOT_OFFS, header);
+#ifdef CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND
 #if CONFIG_SYS_NAND_U_BOOT_OFFS != CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND
 	if (err)
 		err = spl_nand_load_element(CONFIG_SYS_NAND_U_BOOT_OFFS_REDUND,
 					    header);
 #endif
+#endif
 	nand_deselect();
 	return err;
 }