]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
bootmeth_efi: Support PXE booting
authorSimon Glass <sjg@chromium.org>
Thu, 23 Jan 2025 22:07:24 +0000 (15:07 -0700)
committerHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sun, 26 Jan 2025 10:06:57 +0000 (11:06 +0100)
Finish off the implementation so it is possible to boot an EFI app over
a network.

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

index b745ba8bd4b961572b715eeaa37370fd770c5be9..0c9b4c3d59dc6505c05ccf5c2fdd02f401a0f048 100644 (file)
@@ -210,6 +210,7 @@ static int distro_efi_read_bootflow_net(struct bootflow *bflow)
        if (size <= 0)
                return log_msg_ret("sz", -EINVAL);
        bflow->size = size;
+       bflow->buf = map_sysmem(addr, size);
 
        /* bootfile should be setup by dhcp */
        bootfile_name = env_get("bootfile");
@@ -219,10 +220,6 @@ static int distro_efi_read_bootflow_net(struct bootflow *bflow)
        if (!bflow->fname)
                return log_msg_ret("fi0", -ENOMEM);
 
-       /* do the hideous EFI hack */
-       efi_set_bootdev("Net", "", bflow->fname, map_sysmem(addr, 0),
-                       bflow->size);
-
        /* read the DT file also */
        fdt_addr_str = env_get("fdt_addr_r");
        if (!fdt_addr_str)
@@ -296,16 +293,6 @@ static int distro_efi_boot(struct udevice *dev, struct bootflow *bflow)
                if (bflow->flags & ~BOOTFLOWF_USE_BUILTIN_FDT)
                        fdt = bflow->fdt_addr;
 
-       } else {
-               /*
-                * This doesn't actually work for network devices:
-                *
-                * do_bootefi_image() No UEFI binary known at 0x02080000
-                *
-                * But this is the same behaviour for distro boot, so it can be
-                * fixed here.
-                */
-               fdt = env_get_hex("fdt_addr_r", 0);
        }
 
        if (efi_bootflow_run(bflow))
index fdde536af7ae02fd67490a479ddb022542cc7078..10ec5e9ada3dd9d2afa646ae3ac007cb2f133d19 100644 (file)
@@ -302,6 +302,9 @@ static const char *calc_dev_name(struct bootflow *bflow)
        media_dev = dev_get_parent(bflow->dev);
 
        if (!bflow->blk) {
+               if (device_get_uclass_id(media_dev) == UCLASS_ETH)
+                       return "Net";
+
                log_err("Cannot boot EFI app on media '%s'\n",
                        dev_get_uclass_name(media_dev));
 
@@ -342,7 +345,7 @@ efi_status_t efi_bootflow_run(struct bootflow *bflow)
        ret = calculate_paths(dev_name, devnum_str, bflow->fname, &device,
                              &image);
        if (ret)
-               return ret;
+               return EFI_UNSUPPORTED;
 
        if (bflow->flags & BOOTFLOWF_USE_BUILTIN_FDT) {
                log_debug("Booting with built-in fdt\n");