[BUG] issues with new bootflow, uefi and virtio

Simon Glass sjg at chromium.org
Wed Apr 5 20:38:16 CEST 2023


Hi Vincent,

On Thu, 6 Apr 2023 at 03:05, Vincent Stehlé <vincent.stehle at arm.com> wrote:
>
> Hi,
>
> I am hitting an issue with the new bootflow when booting with UEFI from a
> virtio device on Qemu Arm.
>
> It seems the device number computation in efiload_read_file() does not work
> in the general virtio case, where it will pick the virtio device number
> instead of the block device index. On Qemu arm virt machine, many virtio
> mmio devices are provisioned in the memory map and no assumption can be
> made on the number of the actual virtio device in use in the general case.
>
> This is an extract of the output of `dm tree' on this platform, focused on
> the virtio device from which I would like to boot:
>
>   virtio    31  [ + ]   virtio-mmio     |-- virtio_mmio at a003e00
>   blk        0  [ + ]   virtio-blk      |   |-- virtio-blk#31
>   partition  0  [ + ]   blk_partition   |   |   |-- virtio-blk#31:1
>   partition  1  [ + ]   blk_partition   |   |   `-- virtio-blk#31:2
>   bootdev    2  [ + ]   virtio_bootdev  |   `-- virtio-blk#31.bootdev
>
> In this extract the actual virtio device number is 31, as will be picked by
> efiload_read_file(), but the desired block device index is zero, as would
> be used with e.g. `ls virtio 0'.

This is strange. Can you try 'dm uclass' to see the sequence number
for the virtio device? I would expect it to be 0, but I might not
fully understand virtio.

>
> This can be reproduced for example with Buildroot
> qemu_aarch64_ebbr_defconfig or qemu_arm_ebbr_defconfig and updating the
> U-Boot version to v2023.04. This was working properly with U-Boot versions
> up to v2023.01.
>
> This seems to be very specific to virtio, as the numbers align much more
> nicely for e.g. USB mass storage or NVMe.
>
> To help debugging, the following patch forces the device number to zero in
> the case of virtio, which allows to boot again with UEFI and virtio on Qemu
> Arm. Hopefully this should give a hint of what is going on.
>
> I tried to create a fix by looking for the first child device of
> UCLASS_BLK, and use its devnum instead in the case of virtio. Sadly, I am
> not able to confirm if this is a proper fix as I am hitting other boot
> issues in the case of multiple boot devices of the same class it seems...

Please also see this:

https://patchwork.ozlabs.org/project/uboot/patch/20230402140231.v7.3.Ifa423a8f295b3c11e50821222b0db1e869d0c051@changeid/

(or the whole series)

>
> Vincent.
>
> [1]: https://buildroot.org
>
> ---
>  boot/bootmeth_efi.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/boot/bootmeth_efi.c b/boot/bootmeth_efi.c
> index 6a97ac02ff5..e5b0d8614ff 100644
> --- a/boot/bootmeth_efi.c
> +++ b/boot/bootmeth_efi.c
> @@ -117,7 +117,9 @@ static int efiload_read_file(struct blk_desc *desc, struct bootflow *bflow)
>          * this can go away.
>          */
>         media_dev = dev_get_parent(bflow->dev);
> -       snprintf(devnum_str, sizeof(devnum_str), "%x", dev_seq(media_dev));
> +       snprintf(devnum_str, sizeof(devnum_str), "%x",
> +                device_get_uclass_id(media_dev) == UCLASS_VIRTIO ? 0 :
> +                dev_seq(media_dev));
>
>         strlcpy(dirname, bflow->fname, sizeof(dirname));
>         last_slash = strrchr(dirname, '/');
> --
> 2.39.2
>

Regards,
Simon


More information about the U-Boot mailing list