From 4cb39792d0dacfca16ba5331014b0553e084be4c Mon Sep 17 00:00:00 2001 From: Jianguo Sun Date: Wed, 3 Apr 2024 19:59:13 +0800 Subject: [PATCH] virtio: Add polling virtio-mmio device reset completion We write 0 to device_status to initiate reset of a virtio-mmio device. The reset operation itself may or may not be completed by the time write instruction completes. Add polling device_status to return 0 to ensure reset completion before reinitializing the device. Change-Id: If15d11d090dfd0d4972ad35f49af03e076872413 Signed-off-by: Jianguo Sun Signed-off-by: Sreenad Menon --- drivers/virtio/virtio_mmio.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c index d73bf8083bc3..f4ae1c28f46c 100644 --- a/drivers/virtio/virtio_mmio.c +++ b/drivers/virtio/virtio_mmio.c @@ -70,6 +70,7 @@ #include #include #include +#include #ifdef CONFIG_GH_VIRTIO_DEBUG #define CREATE_TRACE_POINTS @@ -292,6 +293,13 @@ static void vm_reset(struct virtio_device *vdev) /* 0 status means a reset. */ writel(0, vm_dev->base + VIRTIO_MMIO_STATUS); +#ifdef CONFIG_VIRTIO_MMIO_POLL_RESET + /* After writing 0 to device_status, the driver MUST wait for a read of + * device_status to return 0 before reinitializing the device. + */ + while (readl(vm_dev->base + VIRTIO_MMIO_STATUS)) + usleep_range(1000, 1100); +#endif }