diff options
| author | Heiko Schocher <[email protected]> | 2026-02-17 17:39:07 +0100 |
|---|---|---|
| committer | Fabio Estevam <[email protected]> | 2026-02-28 15:31:50 -0300 |
| commit | 4e67785e6dfa37b8f08c432bd9cdfcb0919d00ec (patch) | |
| tree | ea214cdd4e3ff486780fd531744dafc44b6db0a5 | |
| parent | 4f8749394d4524a5cd49683d58d34d216065c5fd (diff) | |
siemens: capricorn: add logic to U-Boot to avoid zig-zag boot
add logic in board code for detecting the real boot
partition and set a local hush shell variable fallback
which can be used later in boot variables for detecting
a ROM bootloader fallback case.
We use the local hush shell variable, as we do not want
to save in any case the fallback variable in U-Boot
Environment, as the default Environment is maybe saved
in boards, which are downgraded to older U-Boot versions.
And than the board code does not run, and fallback never
gets the correct value.
Introduce also hush shell variable envvers to value "v2_"
so we can use them in Environment for running different
versions of variables between new and old U-Boot images.
Signed-off-by: Heiko Schocher <[email protected]>
Signed-off-by: Walter Schweizer <[email protected]>
Reviewed-by: Peng Fan <[email protected]>
| -rw-r--r-- | board/siemens/capricorn/Kconfig | 2 | ||||
| -rw-r--r-- | board/siemens/capricorn/board.c | 43 |
2 files changed, 37 insertions, 8 deletions
diff --git a/board/siemens/capricorn/Kconfig b/board/siemens/capricorn/Kconfig index fe230971e97..d6d1aad75b2 100644 --- a/board/siemens/capricorn/Kconfig +++ b/board/siemens/capricorn/Kconfig @@ -1,5 +1,7 @@ if TARGET_CAPRICORN +config HUSH_INIT_VAR + def_bool y config SYS_BOARD default "capricorn" diff --git a/board/siemens/capricorn/board.c b/board/siemens/capricorn/board.c index 390a7b0d841..34e7f2d1713 100644 --- a/board/siemens/capricorn/board.c +++ b/board/siemens/capricorn/board.c @@ -5,6 +5,7 @@ * Copyright 2019 Siemens AG * */ +#include <cli_hush.h> #include <command.h> #include <dm.h> #include <env.h> @@ -29,6 +30,7 @@ #include "../common/board.h" #include "../common/eeprom.h" #include "../common/factoryset.h" +#include <firmware/imx/sci/sci.h> #define GPIO_PAD_CTRL \ ((SC_PAD_CONFIG_NORMAL << PADRING_CONFIG_SHIFT) | \ @@ -373,23 +375,48 @@ __weak int mmc_map_to_kernel_blk(int dev_no) void board_late_mmc_env_init(void) { - char cmd[32]; - char mmcblk[32]; u32 dev_no = mmc_get_env_dev(); if (!check_mmc_autodetect()) return; env_set_ulong("mmcdev", dev_no); +} + +#if defined(CONFIG_HUSH_INIT_VAR) +int hush_init_var(void) +{ + sc_misc_bt_t boot_type; - /* Set mmcblk env */ - sprintf(mmcblk, "/dev/mmcblk%dp2 rootwait rw", - mmc_map_to_kernel_blk(dev_no)); - env_set("mmcroot", mmcblk); + if (sc_misc_get_boot_type(-1, &boot_type) != 0) { + puts("boottype cannot be retrieved\n"); + return 0; + } + + /* + * Set here explicitly a hush shell variable, so if a saveenv + * happens, this variable is *not* saved in U-Boot environment. + * + * This is for devices which are already in the field essential, + * as if such a device breaks, the cutsomer gets a new device + * with a new U-Boot version (and so a new U-Boot environment). + * + * But the customer makes a downgrade to an older U-Boot version, + * which does not have this code in, and runs now with a new + * U-Boot Environment (yes, protected Environment is not enabled + * there) and the old U-Boot must still work with the new U-Boot + * Environment. So we cannot store this variable in U-Boot + * Environment as a stored value will in this case never be over- + * written. + */ + if (boot_type == 1) { + printf("boot-container fallback ocured\n"); + set_local_var("fallback=1", 0); + } - sprintf(cmd, "mmc dev %d", dev_no); - run_command(cmd, 0); + return 0; } +#endif #ifndef CONFIG_XPL_BUILD static int load_parameters_from_factoryset(void) |
