[PATCH v4 12/14] efi_loader: Avoid using sandbox virtio devices

Ilias Apalodimas ilias.apalodimas at linaro.org
Mon Aug 26 13:19:58 CEST 2024


On Thu, 15 Aug 2024 at 23:24, Simon Glass <sjg at chromium.org> wrote:
>
> While sandbox supports virtio it cannot support actually using the block
> devices to read files, since there is nothing on the other end of the
> 'virtqueue'.
>
> A recent change makes EFI probe all block devices, whether used or not.
> This is apparently required by EFI, although it violates U-Boot's
> lazy-init principle.

I think the early scanning is due to CONFIG_EFI_CAPSULE_ON_DISK_EARLY.
I also think we can get rid of this option, but I'll have to dig a bit
deeper

In any case, I am fine with the workaround
Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>

>
> We cannot just drop the virtio devices as they are used in sandbox tests.
>
> So for now just add a special case to work around this.
>
> The eventual fix is likely adding an implementation of
> virtio_sandbox_notify() to actually do the block read. That is tracked
> in [1].
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> Fixes: d5391bf02b9 ("efi_loader: ensure all block devices are probed")
> [1] https://source.denx.de/u-boot/u-boot/-/issues/37
> ---
>
> (no changes since v3)
>
> Changes in v3:
> - Add a Fixes tag
> - Mention the issue created for this problem
>
>  lib/efi_loader/efi_disk.c | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
> index 93a9a5ac025..2e1d37848fc 100644
> --- a/lib/efi_loader/efi_disk.c
> +++ b/lib/efi_loader/efi_disk.c
> @@ -838,8 +838,20 @@ efi_status_t efi_disk_get_device_name(const efi_handle_t handle, char *buf, int
>  efi_status_t efi_disks_register(void)
>  {
>         struct udevice *dev;
> +       struct uclass *uc;
>
> -       uclass_foreach_dev_probe(UCLASS_BLK, dev) {
> +       uclass_id_foreach_dev(UCLASS_BLK, dev, uc) {
> +               /*
> +                * The virtio block-device hangs on sandbox when accessed since
> +                * there is nothing listening to the mailbox
> +                */
> +               if (IS_ENABLED(CONFIG_SANDBOX)) {
> +                       struct blk_desc *desc = dev_get_uclass_plat(dev);
> +
> +                       if (desc->uclass_id == UCLASS_VIRTIO)
> +                               continue;
> +               }
> +               device_probe(dev);
>         }
>
>         return EFI_SUCCESS;
> --
> 2.34.1
>


More information about the U-Boot mailing list