From: Simon Glass Date: Sun, 5 Apr 2026 11:34:32 +0000 (-0600) Subject: bootstd: efi: Handle prior-stage FDT in network path X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ee4bcfc65971730dc2fe137877e620f19a2f8e93;p=thirdparty%2Fu-boot.git bootstd: efi: Handle prior-stage FDT in network path 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 --- diff --git a/boot/bootmeth_efi.c b/boot/bootmeth_efi.c index f592fec07f6..e187dc39912 100644 --- a/boot/bootmeth_efi.c +++ b/boot/bootmeth_efi.c @@ -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);