mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-03 10:17:21 +00:00
bootmeth_efi: Support PXE booting
Finish off the implementation so it is possible to boot an EFI app over a network. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
a2338955fc
commit
21de624eb8
2 changed files with 5 additions and 15 deletions
|
@ -210,6 +210,7 @@ static int distro_efi_read_bootflow_net(struct bootflow *bflow)
|
||||||
if (size <= 0)
|
if (size <= 0)
|
||||||
return log_msg_ret("sz", -EINVAL);
|
return log_msg_ret("sz", -EINVAL);
|
||||||
bflow->size = size;
|
bflow->size = size;
|
||||||
|
bflow->buf = map_sysmem(addr, size);
|
||||||
|
|
||||||
/* bootfile should be setup by dhcp */
|
/* bootfile should be setup by dhcp */
|
||||||
bootfile_name = env_get("bootfile");
|
bootfile_name = env_get("bootfile");
|
||||||
|
@ -219,10 +220,6 @@ static int distro_efi_read_bootflow_net(struct bootflow *bflow)
|
||||||
if (!bflow->fname)
|
if (!bflow->fname)
|
||||||
return log_msg_ret("fi0", -ENOMEM);
|
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 */
|
/* read the DT file also */
|
||||||
fdt_addr_str = env_get("fdt_addr_r");
|
fdt_addr_str = env_get("fdt_addr_r");
|
||||||
if (!fdt_addr_str)
|
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)
|
if (bflow->flags & ~BOOTFLOWF_USE_BUILTIN_FDT)
|
||||||
fdt = bflow->fdt_addr;
|
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))
|
if (efi_bootflow_run(bflow))
|
||||||
|
|
|
@ -302,6 +302,9 @@ static const char *calc_dev_name(struct bootflow *bflow)
|
||||||
media_dev = dev_get_parent(bflow->dev);
|
media_dev = dev_get_parent(bflow->dev);
|
||||||
|
|
||||||
if (!bflow->blk) {
|
if (!bflow->blk) {
|
||||||
|
if (device_get_uclass_id(media_dev) == UCLASS_ETH)
|
||||||
|
return "Net";
|
||||||
|
|
||||||
log_err("Cannot boot EFI app on media '%s'\n",
|
log_err("Cannot boot EFI app on media '%s'\n",
|
||||||
dev_get_uclass_name(media_dev));
|
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,
|
ret = calculate_paths(dev_name, devnum_str, bflow->fname, &device,
|
||||||
&image);
|
&image);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return EFI_UNSUPPORTED;
|
||||||
|
|
||||||
if (bflow->flags & BOOTFLOWF_USE_BUILTIN_FDT) {
|
if (bflow->flags & BOOTFLOWF_USE_BUILTIN_FDT) {
|
||||||
log_debug("Booting with built-in fdt\n");
|
log_debug("Booting with built-in fdt\n");
|
||||||
|
|
Loading…
Add table
Reference in a new issue