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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user