Commit 9b82e65d authored by Linus Torvalds's avatar Linus Torvalds

Merge git://github.com/rustyrussell/linux

* 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
parents 8174a06e e6af578c
...@@ -37,7 +37,7 @@ config VIRTIO_BALLOON ...@@ -37,7 +37,7 @@ config VIRTIO_BALLOON
config VIRTIO_MMIO config VIRTIO_MMIO
tristate "Platform bus driver for memory mapped virtio devices (EXPERIMENTAL)" tristate "Platform bus driver for memory mapped virtio devices (EXPERIMENTAL)"
depends on EXPERIMENTAL depends on HAS_IOMEM && EXPERIMENTAL
select VIRTIO select VIRTIO
select VIRTIO_RING select VIRTIO_RING
---help--- ---help---
......
...@@ -118,7 +118,7 @@ static void vm_finalize_features(struct virtio_device *vdev) ...@@ -118,7 +118,7 @@ static void vm_finalize_features(struct virtio_device *vdev)
vring_transport_features(vdev); vring_transport_features(vdev);
for (i = 0; i < ARRAY_SIZE(vdev->features); i++) { for (i = 0; i < ARRAY_SIZE(vdev->features); i++) {
writel(i, vm_dev->base + VIRTIO_MMIO_GUEST_FEATURES_SET); writel(i, vm_dev->base + VIRTIO_MMIO_GUEST_FEATURES_SEL);
writel(vdev->features[i], writel(vdev->features[i],
vm_dev->base + VIRTIO_MMIO_GUEST_FEATURES); vm_dev->base + VIRTIO_MMIO_GUEST_FEATURES);
} }
......
...@@ -169,11 +169,29 @@ static void vp_set_status(struct virtio_device *vdev, u8 status) ...@@ -169,11 +169,29 @@ static void vp_set_status(struct virtio_device *vdev, u8 status)
iowrite8(status, vp_dev->ioaddr + VIRTIO_PCI_STATUS); iowrite8(status, vp_dev->ioaddr + VIRTIO_PCI_STATUS);
} }
/* wait for pending irq handlers */
static void vp_synchronize_vectors(struct virtio_device *vdev)
{
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
int i;
if (vp_dev->intx_enabled)
synchronize_irq(vp_dev->pci_dev->irq);
for (i = 0; i < vp_dev->msix_vectors; ++i)
synchronize_irq(vp_dev->msix_entries[i].vector);
}
static void vp_reset(struct virtio_device *vdev) static void vp_reset(struct virtio_device *vdev)
{ {
struct virtio_pci_device *vp_dev = to_vp_device(vdev); struct virtio_pci_device *vp_dev = to_vp_device(vdev);
/* 0 status means a reset. */ /* 0 status means a reset. */
iowrite8(0, vp_dev->ioaddr + VIRTIO_PCI_STATUS); iowrite8(0, vp_dev->ioaddr + VIRTIO_PCI_STATUS);
/* Flush out the status write, and flush in device writes,
* including MSi-X interrupts, if any. */
ioread8(vp_dev->ioaddr + VIRTIO_PCI_STATUS);
/* Flush pending VQ/configuration callbacks. */
vp_synchronize_vectors(vdev);
} }
/* the notify function used when creating a virt queue */ /* the notify function used when creating a virt queue */
......
...@@ -85,6 +85,8 @@ ...@@ -85,6 +85,8 @@
* @reset: reset the device * @reset: reset the device
* vdev: the virtio device * vdev: the virtio device
* After this, status and feature negotiation must be done again * After this, status and feature negotiation must be done again
* Device must not be reset from its vq/config callbacks, or in
* parallel with being added/removed.
* @find_vqs: find virtqueues and instantiate them. * @find_vqs: find virtqueues and instantiate them.
* vdev: the virtio_device * vdev: the virtio_device
* nvqs: the number of virtqueues to find * nvqs: the number of virtqueues to find
......
...@@ -63,7 +63,7 @@ ...@@ -63,7 +63,7 @@
#define VIRTIO_MMIO_GUEST_FEATURES 0x020 #define VIRTIO_MMIO_GUEST_FEATURES 0x020
/* Activated features set selector - Write Only */ /* Activated features set selector - Write Only */
#define VIRTIO_MMIO_GUEST_FEATURES_SET 0x024 #define VIRTIO_MMIO_GUEST_FEATURES_SEL 0x024
/* Guest's memory page size in bytes - Write Only */ /* Guest's memory page size in bytes - Write Only */
#define VIRTIO_MMIO_GUEST_PAGE_SIZE 0x028 #define VIRTIO_MMIO_GUEST_PAGE_SIZE 0x028
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment