diff --git a/arch/arm64/configs/vendor/autoghgvm.config b/arch/arm64/configs/vendor/autoghgvm.config index 792daa0ba2b0..e8ef5df34d82 100644 --- a/arch/arm64/configs/vendor/autoghgvm.config +++ b/arch/arm64/configs/vendor/autoghgvm.config @@ -82,6 +82,7 @@ CONFIG_VHOST_MENU=y CONFIG_VIRTIO_BLK=m CONFIG_VIRTIO_INPUT=m CONFIG_VIRTIO_MMIO=m +CONFIG_VIRTIO_MMIO_POLL_RESET=y CONFIG_VIRTIO_MMIO_SWIOTLB=y CONFIG_VIRTIO_NET=m CONFIG_VIRT_DRIVERS=y diff --git a/drivers/virtio/Kconfig b/drivers/virtio/Kconfig index f6a22e108f94..04c437545308 100644 --- a/drivers/virtio/Kconfig +++ b/drivers/virtio/Kconfig @@ -194,4 +194,13 @@ config VIRTIO_DMA_SHARED_BUFFER This option adds a flavor of dma buffers that are backed by virtio resources. +config VIRTIO_MMIO_POLL_RESET + bool "Virti-mmio device synchronous reset support" + depends on VIRTIO_MMIO + help + Say y here to enable synchronous reset for the MMIO transport based + virtio device. After writing 0 to device_status, the driver must + wait for a read of device_status to return 0 before reinitializing + the device. + endif # VIRTIO_MENU 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 }