summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Behún <marek.behun@nic.cz>2021-05-28 10:00:49 +0200
committerStefan Roese <sr@denx.de>2021-06-04 11:32:41 +0200
commit176c3e7760a2e302620b8b12b29f4aa385b86087 (patch)
treef280cf847549aec7adabaffb645a64a7a014c552
parent0b5bb36d13fe416fda29d593ce9ac1152e62186b (diff)
downloadu-boot-176c3e7760a2e302620b8b12b29f4aa385b86087.tar.gz
u-boot-176c3e7760a2e302620b8b12b29f4aa385b86087.tar.xz
u-boot-176c3e7760a2e302620b8b12b29f4aa385b86087.zip
arm: mvebu: turris_omnia: support invoking rescue boot from console
Make it possible to invoke rescue boot from U-Boot console, without having to press the factory reset button. This is needed when accessing the device remotely, for example. Achieve this by putting rescue command into `bootcmd_rescue` default environment variable and setting some distroboot environment variables to their default values when the factory button is pressed. Rescue boot from console can be invoked by running run bootcmd_rescue Signed-off-by: Marek Behún <marek.behun@nic.cz> Reviewed-by: Pali Rohár <pali@kernel.org> Reviewed-by: Stefan Roese <sr@denx.de>
-rw-r--r--board/CZ.NIC/turris_omnia/turris_omnia.c53
-rw-r--r--include/configs/turris_omnia.h23
2 files changed, 52 insertions, 24 deletions
diff --git a/board/CZ.NIC/turris_omnia/turris_omnia.c b/board/CZ.NIC/turris_omnia/turris_omnia.c
index d3de8004eb..ade923f599 100644
--- a/board/CZ.NIC/turris_omnia/turris_omnia.c
+++ b/board/CZ.NIC/turris_omnia/turris_omnia.c
@@ -337,29 +337,6 @@ static int set_regdomain(void)
return env_set("regdomain", rd);
}
-/*
- * default factory reset bootcommand on Omnia first sets all the front LEDs
- * to green and then tries to load the rescue image from SPI flash memory and
- * boot it
- */
-#define OMNIA_FACTORY_RESET_BOOTCMD \
- "i2c dev 2; " \
- "i2c mw 0x2a.1 0x3 0x1c 1; " \
- "i2c mw 0x2a.1 0x4 0x1c 1; " \
- "mw.l 0x01000000 0x00ff000c; " \
- "i2c write 0x01000000 0x2a.1 0x5 4 -s; " \
- "setenv bootargs \"earlyprintk console=ttyS0,115200" \
- " omniarescue=$omnia_reset rescue_mode=$omnia_reset\"; " \
- "sf probe; " \
- "sf read 0x1000000 0x100000 0x700000; " \
- "lzmadec 0x1000000 0x1700000; " \
- "if gpio input gpio@71_4; then " \
- "bootm 0x1700000#sfp; " \
- "else " \
- "bootm 0x1700000; " \
- "fi; " \
- "bootz 0x1000000"
-
static void handle_reset_button(void)
{
int ret;
@@ -375,8 +352,36 @@ static void handle_reset_button(void)
env_set_ulong("omnia_reset", reset_status);
if (reset_status) {
+ const char * const vars[3] = {
+ "bootcmd",
+ "bootcmd_rescue",
+ "distro_bootcmd",
+ };
+
+ /*
+ * Set the above envs to their default values, in case the user
+ * managed to break them.
+ */
+ env_set_default_vars(3, (char * const *)vars, 0);
+
+ /* Ensure bootcmd_rescue is used by distroboot */
+ env_set("boot_targets", "rescue");
+
printf("RESET button was pressed, overwriting bootcmd!\n");
- env_set("bootcmd", OMNIA_FACTORY_RESET_BOOTCMD);
+ } else {
+ /*
+ * In case the user somehow managed to save environment with
+ * boot_targets=rescue, reset boot_targets to default value.
+ * This could happen in subsequent commands if bootcmd_rescue
+ * failed.
+ */
+ if (!strcmp(env_get("boot_targets"), "rescue")) {
+ const char * const vars[1] = {
+ "boot_targets",
+ };
+
+ env_set_default_vars(1, (char * const *)vars, 0);
+ }
}
}
#endif
diff --git a/include/configs/turris_omnia.h b/include/configs/turris_omnia.h
index 0b55c14d8b..7da18f97db 100644
--- a/include/configs/turris_omnia.h
+++ b/include/configs/turris_omnia.h
@@ -108,12 +108,35 @@
#include <config_distro_bootcmd.h>
+/*
+ * The factory reset bootcommand on Omnia first sets all the front LEDs to green
+ * and then tries to load the rescue image from SPI flash memory and boot it
+ */
+#define TURRIS_OMNIA_BOOTCMD_RESCUE \
+ "i2c dev 2; " \
+ "i2c mw 0x2a.1 0x3 0x1c 1; " \
+ "i2c mw 0x2a.1 0x4 0x1c 1; " \
+ "mw.l 0x01000000 0x00ff000c; " \
+ "i2c write 0x01000000 0x2a.1 0x5 4 -s; " \
+ "setenv bootargs \"earlyprintk console=ttyS0,115200" \
+ " omniarescue=$omnia_reset rescue_mode=$omnia_reset\"; " \
+ "sf probe; " \
+ "sf read 0x1000000 0x100000 0x700000; " \
+ "lzmadec 0x1000000 0x1700000; " \
+ "if gpio input gpio@71_4; then " \
+ "bootm 0x1700000#sfp; " \
+ "else " \
+ "bootm 0x1700000; " \
+ "fi; " \
+ "bootz 0x1000000"
+
#define CONFIG_EXTRA_ENV_SETTINGS \
RELOCATION_LIMITS_ENV_SETTINGS \
LOAD_ADDRESS_ENV_SETTINGS \
"fdtfile=" CONFIG_DEFAULT_DEVICE_TREE ".dtb\0" \
"console=ttyS0,115200\0" \
"ethact=ethernet@34000\0" \
+ "bootcmd_rescue=" TURRIS_OMNIA_BOOTCMD_RESCUE "\0" \
BOOTENV
#endif /* CONFIG_SPL_BUILD */