]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
boot: Add logic to enable booting from fallback option
authorMartyn Welch <martyn.welch@collabora.com>
Wed, 9 Oct 2024 13:15:39 +0000 (14:15 +0100)
committerTom Rini <trini@konsulko.com>
Tue, 15 Oct 2024 16:24:27 +0000 (10:24 -0600)
The "fallback" extlinux config option allows us to set an alternative
default boot option for when it has been detected that the default is
failing. Implement the logic required to boot from this option when
desired.

Signed-off-by: Martyn Welch <martyn.welch@collabora.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
boot/bootmeth_extlinux.c
boot/bootmeth_pxe.c
boot/pxe_utils.c
cmd/pxe.c
cmd/sysboot.c
include/pxe_utils.h

index fbb05ef928eba5880378b8a89749816ab58ee030..26c61a65e240a3b1a080660a15866e2823546d43 100644 (file)
@@ -149,7 +149,7 @@ static int extlinux_boot(struct udevice *dev, struct bootflow *bflow)
        info.dev = dev;
        info.bflow = bflow;
        ret = pxe_setup_ctx(&ctx, &cmdtp, extlinux_getfile, &info, true,
-                           bflow->fname, false);
+                           bflow->fname, false, false);
        if (ret)
                return log_msg_ret("ctx", -EINVAL);
 
index 03d2589c264f20f0f2274436af52691b028e0b6f..05c6bece2c18bd327f267ca994e1866b1b15db8d 100644 (file)
@@ -150,7 +150,7 @@ static int extlinux_pxe_boot(struct udevice *dev, struct bootflow *bflow)
        info.bflow = bflow;
        info.cmdtp = &cmdtp;
        ret = pxe_setup_ctx(ctx, &cmdtp, extlinux_pxe_getfile, &info, false,
-                           bflow->subdir, false);
+                           bflow->subdir, false, false);
        if (ret)
                return log_msg_ret("ctx", -EINVAL);
 
index a80119c9a3bd01a1e6c330ce8ff445e2e38fde07..d6a4b2cb8594aba13d7136ee84204e7bb10bab97 100644 (file)
@@ -1436,6 +1436,16 @@ struct pxe_menu *parse_pxefile(struct pxe_context *ctx, unsigned long menucfg)
 
        buf = map_sysmem(menucfg, 0);
        r = parse_pxefile_top(ctx, buf, menucfg, cfg, 1);
+
+       if (ctx->use_fallback) {
+               if (cfg->fallback_label) {
+                       printf("Setting use of fallback\n");
+                       cfg->default_label = cfg->fallback_label;
+               } else {
+                       printf("Selected fallback option, but not set\n");
+               }
+       }
+
        unmap_sysmem(buf);
        if (r < 0) {
                destroy_pxe_menu(cfg);
@@ -1586,7 +1596,8 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg)
 
 int pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
                  pxe_getfile_func getfile, void *userdata,
-                 bool allow_abs_path, const char *bootfile, bool use_ipv6)
+                 bool allow_abs_path, const char *bootfile, bool use_ipv6,
+                 bool use_fallback)
 {
        const char *last_slash;
        size_t path_len = 0;
@@ -1597,6 +1608,7 @@ int pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
        ctx->userdata = userdata;
        ctx->allow_abs_path = allow_abs_path;
        ctx->use_ipv6 = use_ipv6;
+       ctx->use_fallback = use_fallback;
 
        /* figure out the boot directory, if there is one */
        if (bootfile && strlen(bootfile) >= MAX_TFTP_PATH_LEN)
index ae02c28c07503763290b073702d6589e2f2fbeb1..982e2b1e7ea73a4762d7e542711b4ee6995834af 100644 (file)
--- a/cmd/pxe.c
+++ b/cmd/pxe.c
@@ -138,7 +138,7 @@ int pxe_get(ulong pxefile_addr_r, char **bootdirp, ulong *sizep, bool use_ipv6)
        int i;
 
        if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false,
-                         env_get("bootfile"), use_ipv6))
+                         env_get("bootfile"), use_ipv6, false))
                return -ENOMEM;
 
        if (IS_ENABLED(CONFIG_BOOTP_PXE_DHCP_OPTION) &&
@@ -288,7 +288,7 @@ do_pxe_boot(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
        }
 
        if (pxe_setup_ctx(&ctx, cmdtp, do_get_tftp, NULL, false,
-                         env_get("bootfile"), use_ipv6)) {
+                         env_get("bootfile"), use_ipv6, false)) {
                printf("Out of memory\n");
                return CMD_RET_FAILURE;
        }
index 0ea08fd7b5356137f6df589525bd7c5c17cbe9b3..8a060780cab7adf7dd050a37a6cc87d56c328a9c 100644 (file)
@@ -105,7 +105,7 @@ static int do_sysboot(struct cmd_tbl *cmdtp, int flag, int argc,
        }
 
        if (pxe_setup_ctx(&ctx, cmdtp, sysboot_read_file, &info, true,
-                         filename, false)) {
+                         filename, false, false)) {
                printf("Out of memory\n");
                return CMD_RET_FAILURE;
        }
index a408fb7f13c130b92ac8407cf9d14b1b3167c00d..68ac40b64ad92d748e3dd5ce3791fbcd4e24ff14 100644 (file)
@@ -96,6 +96,8 @@ typedef int (*pxe_getfile_func)(struct pxe_context *ctx, const char *file_path,
  *     allocated
  * @pxe_file_size: Size of the PXE file
  * @use_ipv6: TRUE : use IPv6 addressing, FALSE : use IPv4 addressing
+ * @use_fallback: TRUE : use "fallback" option as default, FALSE : use
+ *     "default" option as default
  */
 struct pxe_context {
        struct cmd_tbl *cmdtp;
@@ -116,6 +118,7 @@ struct pxe_context {
        char *bootdir;
        ulong pxe_file_size;
        bool use_ipv6;
+       bool use_fallback;
 };
 
 /**
@@ -215,12 +218,17 @@ int format_mac_pxe(char *outbuf, size_t outbuf_len);
  *     none
  * @use_ipv6: TRUE : use IPv6 addressing
  *            FALSE : use IPv4 addressing
+ * @use_fallback: TRUE : Use "fallback" option instead of "default" should no
+ *                       other choice be selected
+ *                FALSE : Use "default" option should no other choice be
+ *                        selected
  * Return: 0 if OK, -ENOMEM if out of memory, -E2BIG if bootfile is larger than
  *     MAX_TFTP_PATH_LEN bytes
  */
 int pxe_setup_ctx(struct pxe_context *ctx, struct cmd_tbl *cmdtp,
                  pxe_getfile_func getfile, void *userdata,
-                 bool allow_abs_path, const char *bootfile, bool use_ipv6);
+                 bool allow_abs_path, const char *bootfile, bool use_ipv6,
+                 bool use_fallback);
 
 /**
  * pxe_destroy_ctx() - Destroy a PXE context