* git://github.com/rustyrussell/linux: virtio-pci: make reset operation safer virtio-mmio: Correct the name of the guest features selector virtio: add HAS_IOMEM dependency to MMIO platform bus driver
···37373838 config VIRTIO_MMIO3939 tristate "Platform bus driver for memory mapped virtio devices (EXPERIMENTAL)"4040- depends on EXPERIMENTAL4040+ depends on HAS_IOMEM && EXPERIMENTAL4141 select VIRTIO4242 select VIRTIO_RING4343 ---help---
+1-1
drivers/virtio/virtio_mmio.c
···118118 vring_transport_features(vdev);119119120120 for (i = 0; i < ARRAY_SIZE(vdev->features); i++) {121121- writel(i, vm_dev->base + VIRTIO_MMIO_GUEST_FEATURES_SET);121121+ writel(i, vm_dev->base + VIRTIO_MMIO_GUEST_FEATURES_SEL);122122 writel(vdev->features[i],123123 vm_dev->base + VIRTIO_MMIO_GUEST_FEATURES);124124 }
+18
drivers/virtio/virtio_pci.c
···169169 iowrite8(status, vp_dev->ioaddr + VIRTIO_PCI_STATUS);170170}171171172172+/* wait for pending irq handlers */173173+static void vp_synchronize_vectors(struct virtio_device *vdev)174174+{175175+ struct virtio_pci_device *vp_dev = to_vp_device(vdev);176176+ int i;177177+178178+ if (vp_dev->intx_enabled)179179+ synchronize_irq(vp_dev->pci_dev->irq);180180+181181+ for (i = 0; i < vp_dev->msix_vectors; ++i)182182+ synchronize_irq(vp_dev->msix_entries[i].vector);183183+}184184+172185static void vp_reset(struct virtio_device *vdev)173186{174187 struct virtio_pci_device *vp_dev = to_vp_device(vdev);175188 /* 0 status means a reset. */176189 iowrite8(0, vp_dev->ioaddr + VIRTIO_PCI_STATUS);190190+ /* Flush out the status write, and flush in device writes,191191+ * including MSi-X interrupts, if any. */192192+ ioread8(vp_dev->ioaddr + VIRTIO_PCI_STATUS);193193+ /* Flush pending VQ/configuration callbacks. */194194+ vp_synchronize_vectors(vdev);177195}178196179197/* the notify function used when creating a virt queue */
+2
include/linux/virtio_config.h
···8585 * @reset: reset the device8686 * vdev: the virtio device8787 * After this, status and feature negotiation must be done again8888+ * Device must not be reset from its vq/config callbacks, or in8989+ * parallel with being added/removed.8890 * @find_vqs: find virtqueues and instantiate them.8991 * vdev: the virtio_device9092 * nvqs: the number of virtqueues to find
+1-1
include/linux/virtio_mmio.h
···6363#define VIRTIO_MMIO_GUEST_FEATURES 0x02064646565/* Activated features set selector - Write Only */6666-#define VIRTIO_MMIO_GUEST_FEATURES_SET 0x0246666+#define VIRTIO_MMIO_GUEST_FEATURES_SEL 0x02467676868/* Guest's memory page size in bytes - Write Only */6969#define VIRTIO_MMIO_GUEST_PAGE_SIZE 0x028