[PATCH v2] virtio: Fix virtio initialization sequence

Tom Rini trini at konsulko.com
Tue Mar 10 15:16:42 CET 2026


From: Christian Pötzsch <christian.poetzsch at kernkonzept.com>

The virtio spec clearly states in "3.1.1 Driver Requirements: Device
Initialization" the sequence a client has to follow after device reset.
Because u-boot resets here again, it also needs to set the "acknowledge"
bit again even if this was done in virtio_uclass_child_post_bind already
once before.

Signed-off-by: Christian Pötzsch <christian.poetzsch at kernkonzept.com>
Signed-off-by: Adam Lackorzynski <adam at l4re.org>
[trini: Add VIRTIO_CONFIG_S_ACKNOWLEDGE flag check to the test]
Signed-off-by: Tom Rini <trini at konsulko.com>
---
Changes in v2:
- Update the test to expect VIRTIO_CONFIG_S_ACKNOWLEDGE being set as
  well.
---
 drivers/virtio/virtio-uclass.c | 3 +++
 test/dm/virtio_device.c        | 1 +
 2 files changed, 4 insertions(+)

diff --git a/drivers/virtio/virtio-uclass.c b/drivers/virtio/virtio-uclass.c
index ac563991b90f..c36e9e9b3a77 100644
--- a/drivers/virtio/virtio-uclass.c
+++ b/drivers/virtio/virtio-uclass.c
@@ -292,6 +292,9 @@ static int virtio_uclass_child_pre_probe(struct udevice *vdev)
 	if (ret)
 		goto err;
 
+	/* After a reset we always need to start the init sequence again */
+	virtio_add_status(vdev, VIRTIO_CONFIG_S_ACKNOWLEDGE);
+
 	/* We have a driver! */
 	virtio_add_status(vdev, VIRTIO_CONFIG_S_DRIVER);
 
diff --git a/test/dm/virtio_device.c b/test/dm/virtio_device.c
index 53414e4d3a47..c2cd0630d973 100644
--- a/test/dm/virtio_device.c
+++ b/test/dm/virtio_device.c
@@ -40,6 +40,7 @@ static int dm_test_virtio_base(struct unit_test_state *uts)
 	ut_assertok(virtio_get_status(dev, &status));
 	ut_asserteq(VIRTIO_CONFIG_S_DRIVER |
 		    VIRTIO_CONFIG_S_DRIVER_OK |
+		    VIRTIO_CONFIG_S_ACKNOWLEDGE |
 		    VIRTIO_CONFIG_S_FEATURES_OK, status);
 
 	return 0;
-- 
2.43.0



More information about the U-Boot mailing list