From 2662b54d70fc04f070f0e4a9742d4b3197c9f3ea Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Sat, 30 Jul 2022 15:52:22 -0600 Subject: [PATCH] bootstd: Allow EFI bootmgr to support an invalid bootflow For most testing we don't want this bootmeth to actually do anything. For the one test where we do, add a test hook to obtain the correct behaviour. This will allow us to bind the device always, rather than just doing it for this test. Signed-off-by: Simon Glass --- arch/sandbox/include/asm/test.h | 11 +++++++++++ boot/bootmeth_efi_mgr.c | 32 ++++++++++++++++++++++++++------ test/boot/bootflow.c | 4 ++++ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/arch/sandbox/include/asm/test.h b/arch/sandbox/include/asm/test.h index 015e96d53f..53a036b3ab 100644 --- a/arch/sandbox/include/asm/test.h +++ b/arch/sandbox/include/asm/test.h @@ -304,4 +304,15 @@ int sandbox_cros_ec_get_pwm_duty(struct udevice *dev, uint index, uint *duty); */ int sandbox_sdl_set_bpp(struct udevice *dev, enum video_log2_bpp l2bpp); +/** + * sandbox_set_fake_efi_mgr_dev() - Control EFI bootmgr producing valid bootflow + * + * This is only used for testing. + * + * @dev: efi_mgr bootmeth device + * @fake_dev: true to produce a valid bootflow when requested, false to produce + * an error + */ +void sandbox_set_fake_efi_mgr_dev(struct udevice *dev, bool fake_dev); + #endif diff --git a/boot/bootmeth_efi_mgr.c b/boot/bootmeth_efi_mgr.c index 08d9328af4..2f327c1f8c 100644 --- a/boot/bootmeth_efi_mgr.c +++ b/boot/bootmeth_efi_mgr.c @@ -15,6 +15,22 @@ #include #include +/** + * struct efi_mgr_priv - private info for the efi-mgr driver + * + * @fake_bootflow: Fake a valid bootflow for testing + */ +struct efi_mgr_priv { + bool fake_dev; +}; + +void sandbox_set_fake_efi_mgr_dev(struct udevice *dev, bool fake_dev) +{ + struct efi_mgr_priv *priv = dev_get_priv(dev); + + priv->fake_dev = fake_dev; +} + static int efi_mgr_check(struct udevice *dev, struct bootflow_iter *iter) { int ret; @@ -29,13 +45,16 @@ static int efi_mgr_check(struct udevice *dev, struct bootflow_iter *iter) static int efi_mgr_read_bootflow(struct udevice *dev, struct bootflow *bflow) { - /* - * Just assume there is something to boot since we don't have any way - * of knowing in advance - */ - bflow->state = BOOTFLOWST_READY; + struct efi_mgr_priv *priv = dev_get_priv(dev); - return 0; + if (priv->fake_dev) { + bflow->state = BOOTFLOWST_READY; + return 0; + } + + /* To be implemented */ + + return -EINVAL; } static int efi_mgr_read_file(struct udevice *dev, struct bootflow *bflow, @@ -84,4 +103,5 @@ U_BOOT_DRIVER(bootmeth_efi_mgr) = { .of_match = efi_mgr_bootmeth_ids, .ops = &efi_mgr_bootmeth_ops, .bind = bootmeth_efi_mgr_bind, + .priv_auto = sizeof(struct efi_mgr_priv), }; diff --git a/test/boot/bootflow.c b/test/boot/bootflow.c index a2ed8ac774..22eef40c0e 100644 --- a/test/boot/bootflow.c +++ b/test/boot/bootflow.c @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include #include @@ -328,6 +330,8 @@ static int bootflow_system(struct unit_test_state *uts) ut_assertok(uclass_first_device_err(UCLASS_BOOTSTD, &bootstd)); ut_assertok(device_bind_driver(bootstd, "bootmeth_efi_mgr", "bootmgr", &dev)); + ut_assertok(device_probe(dev)); + sandbox_set_fake_efi_mgr_dev(dev, true); /* Add the system bootdev that it uses */ ut_assertok(device_bind_driver(bootstd, "system_bootdev",