summaryrefslogtreecommitdiff
path: root/boot/bootmeth_efi.c
diff options
context:
space:
mode:
Diffstat (limited to 'boot/bootmeth_efi.c')
-rw-r--r--boot/bootmeth_efi.c80
1 files changed, 12 insertions, 68 deletions
diff --git a/boot/bootmeth_efi.c b/boot/bootmeth_efi.c
index f836aa655f5..0c9b4c3d59d 100644
--- a/boot/bootmeth_efi.c
+++ b/boot/bootmeth_efi.c
@@ -52,59 +52,22 @@ static bool bootmeth_uses_network(struct bootflow *bflow)
device_get_uclass_id(media) == UCLASS_ETH;
}
-static void set_efi_bootdev(struct blk_desc *desc, struct bootflow *bflow)
-{
- const struct udevice *media_dev;
- int size = bflow->size;
- const char *dev_name;
- char devnum_str[9];
- char dirname[200];
- char *last_slash;
-
- /*
- * This is a horrible hack to tell EFI about this boot device. Once we
- * unify EFI with the rest of U-Boot we can clean this up. The same hack
- * exists in multiple places, e.g. in the fs, tftp and load commands.
- *
- * Once we can clean up the EFI code to make proper use of driver model,
- * this can go away.
- */
- media_dev = dev_get_parent(bflow->dev);
- snprintf(devnum_str, sizeof(devnum_str), "%x:%x",
- desc ? desc->devnum : dev_seq(media_dev),
- bflow->part);
-
- strlcpy(dirname, bflow->fname, sizeof(dirname));
- last_slash = strrchr(dirname, '/');
- if (last_slash)
- *last_slash = '\0';
-
- dev_name = device_get_uclass_id(media_dev) == UCLASS_MASS_STORAGE ?
- "usb" : blk_get_uclass_name(device_get_uclass_id(media_dev));
- log_debug("setting bootdev %s, %s, %s, %p, %x\n",
- dev_name, devnum_str, bflow->fname, bflow->buf, size);
- efi_set_bootdev(dev_name, devnum_str, bflow->fname, bflow->buf, size);
-}
-
static int efiload_read_file(struct bootflow *bflow, ulong addr)
{
struct blk_desc *desc = NULL;
- loff_t bytes_read;
+ ulong size;
int ret;
if (bflow->blk)
desc = dev_get_uclass_plat(bflow->blk);
- ret = bootmeth_setup_fs(bflow, desc);
- if (ret)
- return log_msg_ret("set", ret);
- ret = fs_read(bflow->fname, addr, 0, bflow->size, &bytes_read);
+ size = SZ_1G;
+ ret = bootmeth_common_read_file(bflow->method, bflow, bflow->fname,
+ addr, BFI_EFI, &size);
if (ret)
- return log_msg_ret("read", ret);
+ return log_msg_ret("rdf", ret);
bflow->buf = map_sysmem(addr, bflow->size);
- set_efi_bootdev(desc, bflow);
-
return 0;
}
@@ -173,7 +136,8 @@ static int distro_efi_try_bootflow_files(struct udevice *dev,
/* Limit FDT files to 4MB */
size = SZ_4M;
ret = bootmeth_common_read_file(dev, bflow, fname,
- fdt_addr, &size);
+ fdt_addr, (enum bootflow_img_t)IH_TYPE_FLATDT,
+ &size);
}
}
@@ -246,16 +210,15 @@ 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");
if (!bootfile_name)
return log_msg_ret("bootfile_name", ret);
bflow->fname = strdup(bootfile_name);
-
- /* do the hideous EFI hack */
- efi_set_bootdev("Net", "", bflow->fname, map_sysmem(addr, 0),
- bflow->size);
+ if (!bflow->fname)
+ return log_msg_ret("fi0", -ENOMEM);
/* read the DT file also */
fdt_addr_str = env_get("fdt_addr_r");
@@ -330,29 +293,10 @@ 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 (bflow->flags & BOOTFLOWF_USE_BUILTIN_FDT) {
- log_debug("Booting with built-in fdt\n");
- if (efi_binary_run(map_sysmem(kernel, 0), bflow->size,
- EFI_FDT_USE_INTERNAL))
- return log_msg_ret("run", -EINVAL);
- } else {
- log_debug("Booting with external fdt\n");
- if (efi_binary_run(map_sysmem(kernel, 0), bflow->size,
- map_sysmem(fdt, 0)))
- return log_msg_ret("run", -EINVAL);
- }
+ if (efi_bootflow_run(bflow))
+ return log_msg_ret("run", -EINVAL);
return 0;
}