summaryrefslogtreecommitdiff
path: root/drivers/mtd/nand
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2015-08-15 21:51:33 +0200
committerHans de Goede <hdegoede@redhat.com>2015-08-31 08:43:42 +0200
commit24a06c964fd457238f16531d8ed1b660c4341676 (patch)
tree687cfa39f76cca626093faee785aa1004a755299 /drivers/mtd/nand
parent2b8a01a99d6b1632d4356fa71383069b4a532687 (diff)
downloadu-boot-imx-24a06c964fd457238f16531d8ed1b660c4341676.zip
u-boot-imx-24a06c964fd457238f16531d8ed1b660c4341676.tar.gz
u-boot-imx-24a06c964fd457238f16531d8ed1b660c4341676.tar.bz2
sunxi_nand_spl: Add support for backup boot partitions
The BROM does not care / use bad page markings, instead it deals with any bad pages in the first erase-block by simply trying to load "boot0" from the next erase-block. This commit implements the same strategy for the sunxi spl nand code, allowing it to boot from the backup boot partition when the main boot partition is bad (tested by erasing the main boot partition). Signed-off-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Ian Campbell <ijc@hellion.org.uk>
Diffstat (limited to 'drivers/mtd/nand')
-rw-r--r--drivers/mtd/nand/sunxi_nand_spl.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/mtd/nand/sunxi_nand_spl.c b/drivers/mtd/nand/sunxi_nand_spl.c
index eee6c7b..14320c4 100644
--- a/drivers/mtd/nand/sunxi_nand_spl.c
+++ b/drivers/mtd/nand/sunxi_nand_spl.c
@@ -350,7 +350,23 @@ static int nand_read_buffer(uint32_t offs, unsigned int size, void *dest,
int nand_spl_load_image(uint32_t offs, unsigned int size, void *dest)
{
+ const uint32_t boot_offsets[] = {
+ 0 * 1024 * 1024 + CONFIG_SYS_NAND_U_BOOT_OFFS,
+ 1 * 1024 * 1024 + CONFIG_SYS_NAND_U_BOOT_OFFS,
+ 2 * 1024 * 1024 + CONFIG_SYS_NAND_U_BOOT_OFFS,
+ 4 * 1024 * 1024 + CONFIG_SYS_NAND_U_BOOT_OFFS,
+ };
int syndrome = offs < CONFIG_NAND_SUNXI_SPL_SYNDROME_PARTITIONS_END;
+ int i;
+
+ if (offs == CONFIG_SYS_NAND_U_BOOT_OFFS) {
+ for (i = 0; i < ARRAY_SIZE(boot_offsets); i++) {
+ if (nand_read_buffer(boot_offsets[i], size,
+ dest, syndrome) == 0)
+ return 0;
+ }
+ return -1;
+ }
return nand_read_buffer(offs, size, dest, syndrome);
}