]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
ARM: imx: Add support for switching primary/secondary boot mode to bmode
authorMarek Vasut <marex@denx.de>
Wed, 5 Aug 2020 13:34:05 +0000 (15:34 +0200)
committerStefano Babic <sbabic@denx.de>
Mon, 17 Aug 2020 15:54:01 +0000 (17:54 +0200)
The i.MX6/i.MX7 is capable of booting a secondary "redundant" system
image in case the primary one is corrupted. The user can force this
boot mode as well by explicitly setting SRC GPR10 bit 30. This can be
potentially useful when upgrading the bootloader itself. Expose this
functionality to the user.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Fabio Estevam <festevam@gmail.com>
Cc: NXP i.MX U-Boot Team <uboot-imx@nxp.com>
Cc: Peng Fan <peng.fan@nxp.com>
Cc: Stefano Babic <sbabic@denx.de>
Reviewed-by: Stefano Babic <sbabic@denx.de>
arch/arm/include/asm/mach-imx/boot_mode.h
arch/arm/include/asm/mach-imx/sys_proto.h
arch/arm/mach-imx/init.c
arch/arm/mach-imx/mx7/soc.c

index 3a483b6afa610e6dfc545c4705ef15418bd87118..6dc58559680a15882b7f0aeb53516e628a839aa3 100644 (file)
@@ -7,6 +7,8 @@
 #define _ASM_BOOT_MODE_H
 #define MAKE_CFGVAL(cfg1, cfg2, cfg3, cfg4) \
        ((cfg4) << 24) | ((cfg3) << 16) | ((cfg2) << 8) | (cfg1)
+#define MAKE_CFGVAL_PRIMARY_BOOT       0xfffffff0
+#define MAKE_CFGVAL_SECONDARY_BOOT     0xffffffff
 
 enum boot_device {
        WEIM_NOR_BOOT,
index 2d18b1f56b8b1b7efab5d20399d1d826d906c52e..15d1cba8e74ab7895ef04edeada5d8582463398b 100644 (file)
@@ -79,6 +79,7 @@ struct bd_info;
 
 #ifdef CONFIG_MX6
 #define IMX6_SRC_GPR10_BMODE                   BIT(28)
+#define IMX6_SRC_GPR10_PERSIST_SECONDARY_BOOT  BIT(30)
 
 #define IMX6_BMODE_MASK                        GENMASK(7, 0)
 #define        IMX6_BMODE_SHIFT                4
@@ -128,6 +129,7 @@ void gpr_init(void);
 
 #ifdef CONFIG_MX7
 #define IMX7_SRC_GPR10_BMODE                   BIT(28)
+#define IMX7_SRC_GPR10_PERSIST_SECONDARY_BOOT  BIT(30)
 #endif
 
 /* address translation table */
index e30d63b8963b46eb1c680ddcd130f615c94db052..ce3eb4b0b8a896e8fe05bba1a3624aac026856c7 100644 (file)
@@ -104,20 +104,28 @@ void init_src(void)
 void boot_mode_apply(unsigned cfg_val)
 {
 #ifdef CONFIG_MX6
+       const u32 persist_sec = IMX6_SRC_GPR10_PERSIST_SECONDARY_BOOT;
        const u32 bmode = IMX6_SRC_GPR10_BMODE;
 #elif CONFIG_MX7
+       const u32 persist_sec = IMX7_SRC_GPR10_PERSIST_SECONDARY_BOOT;
        const u32 bmode = IMX7_SRC_GPR10_BMODE;
 #endif
        struct src *psrc = (struct src *)SRC_BASE_ADDR;
        unsigned reg;
 
-       writel(cfg_val, &psrc->gpr9);
-       reg = readl(&psrc->gpr10);
-       if (cfg_val)
-               reg |= bmode;
-       else
-               reg &= ~bmode;
-       writel(reg, &psrc->gpr10);
+       if (cfg_val == MAKE_CFGVAL_PRIMARY_BOOT)
+               clrbits_le32(&psrc->gpr10, persist_sec);
+       else if (cfg_val == MAKE_CFGVAL_SECONDARY_BOOT)
+               setbits_le32(&psrc->gpr10, persist_sec);
+       else {
+               writel(cfg_val, &psrc->gpr9);
+               reg = readl(&psrc->gpr10);
+               if (cfg_val)
+                       reg |= bmode;
+               else
+                       reg &= ~bmode;
+               writel(reg, &psrc->gpr10);
+       }
 }
 #endif
 
index 979ba3eebc9e5b46a83ec1530d434cd66d60d6f7..b70ef80131ec8a7a16324581ad543dd0fca65c7b 100644 (file)
@@ -414,6 +414,8 @@ void s_init(void)
 #ifndef CONFIG_SPL_BUILD
 const struct boot_mode soc_boot_modes[] = {
        {"normal",      MAKE_CFGVAL(0x00, 0x00, 0x00, 0x00)},
+       {"primary",     MAKE_CFGVAL_PRIMARY_BOOT},
+       {"secondary",   MAKE_CFGVAL_SECONDARY_BOOT},
        {NULL,          0},
 };
 #endif