]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
bootstd: Correct virtio block-device handling
authorSimon Glass <sjg@chromium.org>
Sat, 28 Jan 2023 22:00:20 +0000 (15:00 -0700)
committerTom Rini <trini@konsulko.com>
Mon, 6 Feb 2023 18:04:53 +0000 (13:04 -0500)
At present virtio tries to attach QEMU services to a bootdev device, which
cannot work. Add a check for this.

Also use bootdev_setup_sibling_blk() to create the bootdev device, since
it allows the correct name to be used and bootdev_get_sibling_blk() to
work as expected.

The bootdev is not created on sandbox since it does have a real virtio
device and it is not possible to read blocks.

Signed-off-by: Simon Glass <sjg@chromium.org>
Fixes: a60f7a3e35b ("bootstd: Add a virtio bootdev")
Reported-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
drivers/virtio/virtio-uclass.c

index 91af412ec1d6b01f0182e1939d87ad25636bbd7e..de9bc90359cacf5e4b8f6614e3e9bc4ad78f4b4c 100644 (file)
@@ -247,8 +247,8 @@ static int virtio_uclass_post_probe(struct udevice *udev)
        }
        device_set_name_alloced(vdev);
 
-       if (uc_priv->device == VIRTIO_ID_BLOCK) {
-               ret = bootdev_setup_for_dev(udev, name);
+       if (uc_priv->device == VIRTIO_ID_BLOCK && !IS_ENABLED(CONFIG_SANDBOX)) {
+               ret = bootdev_setup_sibling_blk(vdev, "virtio_bootdev");
                if (ret)
                        return log_msg_ret("bootdev", ret);
        }
@@ -275,6 +275,10 @@ static int virtio_uclass_child_pre_probe(struct udevice *vdev)
        int i;
        int ret;
 
+       /* bootdevs are not virtio devices */
+       if (device_get_uclass_id(vdev) == UCLASS_BOOTDEV)
+               return 0;
+
        /*
         * Save the real virtio device (eg: virtio-net, virtio-blk) to
         * the transport (parent) device's uclass priv for future use.