]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
bootstd: efi: Handle prior-stage FDT in network path
authorSimon Glass <sjg@chromium.org>
Sun, 5 Apr 2026 11:34:32 +0000 (05:34 -0600)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Fri, 17 Apr 2026 06:09:41 +0000 (08:09 +0200)
When CONFIG_OF_HAS_PRIOR_STAGE is enabled and fdtfile is not set,
efi_get_distro_fdt_name() returns -EALREADY to indicate the prior-stage
FDT should be used. The block-device EFI path handles this by setting
BOOTFLOWF_USE_PRIOR_FDT, but the network path treats it as an error,
causing the bootflow to stay in 'base' state with a -EALREADY error.

This also means fdt_addr_r is required even when no FDT download is
needed, giving a spurious  -EINVAL error.

Fix this by calling efi_get_distro_fdt_name() before checking
fdt_addr_r, and handling -EALREADY by setting BOOTFLOWF_USE_PRIOR_FDT
to skip the FDT download, matching the block-device behaviour.

THere is no test for this at present, since sandbox does not enable
CONFIG_OF_HAS_PRIOR_STAGE and lacks infra for network-based EFI boot.

Signed-off-by: Simon Glass <sjg@chromium.org>
boot/bootmeth_efi.c

index f592fec07f65dac140b49839ac3104059dd47abb..e187dc39912b2b7495c4abf38f9c089f177d9801 100644 (file)
@@ -269,17 +269,22 @@ static int distro_efi_read_bootflow_net(struct bootflow *bflow)
                return log_msg_ret("fi0", -ENOMEM);
 
        /* read the DT file also */
+       ret = efi_get_distro_fdt_name(fname, sizeof(fname), 0);
+       if (ret == -EALREADY) {
+               /* Prior-stage FDT is used, no download needed */
+               bflow->flags |= BOOTFLOWF_USE_PRIOR_FDT;
+               bflow->state = BOOTFLOWST_READY;
+               return 0;
+       } else if (ret) {
+               return log_msg_ret("nam", ret);
+       }
+
        fdt_addr_str = env_get("fdt_addr_r");
        if (!fdt_addr_str)
                return log_msg_ret("fdt", -EINVAL);
        fdt_addr = hextoul(fdt_addr_str, NULL);
        sprintf(file_addr, "%lx", fdt_addr);
 
-       /* We only allow the first prefix with PXE */
-       ret = efi_get_distro_fdt_name(fname, sizeof(fname), 0);
-       if (ret)
-               return log_msg_ret("nam", ret);
-
        bflow->fdt_fname = strdup(fname);
        if (!bflow->fdt_fname)
                return log_msg_ret("fil", -ENOMEM);