[PATCH 1/1] efi_driver: create a parent device for all EFI block devices
Ilias Apalodimas
ilias.apalodimas at linaro.org
Thu Feb 20 09:54:21 CET 2025
On Sat, 15 Feb 2025 at 17:22, Heinrich Schuchardt
<heinrich.schuchardt at canonical.com> wrote:
>
> Up to now root has been the parent device for all block devices created via
> calling ConnectController(). This does not work well together with the
> implementation of bootstd.
>
> Add a dummy parent device for all EFI block devices.
>
> With this change EFI block devices are also accessible via commands like
> 'cat', 'load', and 'ls'.
>
> => dm tree
> Class Seq Probed Driver Name
> -----------------------------------------------------------
> efi 0 [ + ] EFI block driver `-- efi
> blk 3 [ + ] efi_blk `-- efi.efiblk#0
> partition 0 [ + ] blk_partition `-- efi.efiblk#0:1
>
> => ls efiloader 0:1
> 13 hello.txt
> 7 u-boot.txt
> 2 file(s), 0 dir(s)
>
> => cat efiloader 0:1 hello.txt
> Hello world!
>
> => efidebug dh
> 0000000018df1700 (efi.efiblk#0:1)
> /VenHw(dbca4c98-6cb0-694d-0872-819c650cb7b8)/HD(1,MBR,0xd1535d21,0x1,0x7f)
> Block IO
> Simple File System
>
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> ---
> lib/efi_driver/efi_block_device.c | 29 ++++++++++++++++++++++++++++-
> 1 file changed, 28 insertions(+), 1 deletion(-)
>
> diff --git a/lib/efi_driver/efi_block_device.c b/lib/efi_driver/efi_block_device.c
> index d3c668dc183..070747de515 100644
> --- a/lib/efi_driver/efi_block_device.c
> +++ b/lib/efi_driver/efi_block_device.c
> @@ -35,8 +35,10 @@
> #include <efi_driver.h>
> #include <malloc.h>
> #include <dm/device-internal.h>
> +#include <dm/lists.h>
> #include <dm/root.h>
> #include <dm/tag.h>
> +#include <dm/uclass-internal.h>
>
> /**
> * struct efi_blk_plat - attributes of a block device
> @@ -118,13 +120,18 @@ static ulong efi_bl_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
> static efi_status_t
> efi_bl_create_block_device(efi_handle_t handle, void *interface)
> {
> - struct udevice *bdev = NULL, *parent = dm_root();
> + struct udevice *bdev = NULL, *parent;
> efi_status_t ret;
> + int r;
> int devnum;
> char *name;
> struct efi_block_io *io = interface;
> struct efi_blk_plat *plat;
>
> + r = uclass_find_first_device(UCLASS_EFI_LOADER, &parent);
> + if (r)
> + return EFI_OUT_OF_RESOURCES;
> +
> devnum = blk_next_free_devnum(UCLASS_EFI_LOADER);
> if (devnum < 0)
> return EFI_OUT_OF_RESOURCES;
> @@ -221,6 +228,24 @@ efi_bl_init(struct efi_driver_binding_extended_protocol *this)
> return EFI_SUCCESS;
> }
>
> +/**
> + * efi_block_device_create() - create parent for EFI block devices
> + *
> + * Create a device that serves as parent for all block devices created via
> + * ConnectController().
> + *
> + * Return: 0 for success
> + */
> +static int efi_block_device_create(void)
> +{
> + int ret;
> + struct udevice *dev;
> +
> + ret = device_bind_driver(gd->dm_root, "EFI block driver", "efi", &dev);
> +
> + return ret;
> +}
> +
> /* Block device driver operators */
> static const struct blk_ops efi_blk_ops = {
> .read = efi_bl_read,
> @@ -249,3 +274,5 @@ U_BOOT_DRIVER(efi_block) = {
> .id = UCLASS_EFI_LOADER,
> .ops = &driver_ops,
> };
> +
> +EVENT_SPY_SIMPLE(EVT_LAST_STAGE_INIT, efi_block_device_create);
> --
> 2.47.1
>
Acked-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
More information about the U-Boot
mailing list