bootstd: Allow bootmeths to be marked as global

The current way of handling things like EFI bootmgr is a bit odd, since
that bootmeth handles selection of the bootdev itself. VBE needs to work
the same way, so we should support it properly.

Add a flag that indicates that the bootmeth is global, rather than being
invoked on each bootdev. Provide a helper to read a bootflow from the
bootmeth.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass
2022-07-30 15:52:21 -06:00
committed by Tom Rini
parent a18686cda1
commit bc06aa035d
6 changed files with 50 additions and 2 deletions

View File

@@ -349,6 +349,13 @@ config BOOTSTD_BOOTCOMMAND
standard boot does not support all of the features of distro boot
yet.
config BOOTMETH_GLOBAL
bool
help
Add support for global bootmeths. This feature is used by VBE and
EFI bootmgr, since they take full control over which bootdevs are
selected to boot.
config BOOTMETH_DISTRO
bool "Bootdev support for distro boot"
select PXE_UTILS

View File

@@ -71,6 +71,20 @@ int bootmeth_read_file(struct udevice *dev, struct bootflow *bflow,
return ops->read_file(dev, bflow, file_path, addr, sizep);
}
int bootmeth_get_bootflow(struct udevice *dev, struct bootflow *bflow)
{
const struct bootmeth_ops *ops = bootmeth_get_ops(dev);
if (!ops->read_bootflow)
return -ENOSYS;
memset(bflow, '\0', sizeof(*bflow));
bflow->dev = NULL;
bflow->method = dev;
bflow->state = BOOTFLOWST_BASE;
return ops->read_bootflow(dev, bflow);
}
/**
* bootmeth_setup_iter_order() - Set up the ordering of bootmeths to scan
*

View File

@@ -61,6 +61,7 @@ static int bootmeth_efi_mgr_bind(struct udevice *dev)
struct bootmeth_uc_plat *plat = dev_get_uclass_plat(dev);
plat->desc = "EFI bootmgr flow";
plat->flags = BOOTMETHF_GLOBAL;
return 0;
}
@@ -77,7 +78,7 @@ static const struct udevice_id efi_mgr_bootmeth_ids[] = {
{ }
};
U_BOOT_DRIVER(bootmeth_zefi_mgr) = {
U_BOOT_DRIVER(bootmeth_efi_mgr) = {
.name = "bootmeth_efi_mgr",
.id = UCLASS_BOOTMETH,
.of_match = efi_mgr_bootmeth_ids,