|
@@ -239,9 +239,12 @@ static int vfio_pci_get_irq_count(struct vfio_pci_device *vdev, int irq_type)
|
|
|
|
|
|
return (flags & PCI_MSIX_FLAGS_QSIZE) + 1;
|
|
return (flags & PCI_MSIX_FLAGS_QSIZE) + 1;
|
|
}
|
|
}
|
|
- } else if (irq_type == VFIO_PCI_ERR_IRQ_INDEX)
|
|
|
|
|
|
+ } else if (irq_type == VFIO_PCI_ERR_IRQ_INDEX) {
|
|
if (pci_is_pcie(vdev->pdev))
|
|
if (pci_is_pcie(vdev->pdev))
|
|
return 1;
|
|
return 1;
|
|
|
|
+ } else if (irq_type == VFIO_PCI_REQ_IRQ_INDEX) {
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -464,6 +467,7 @@ static long vfio_pci_ioctl(void *device_data,
|
|
|
|
|
|
switch (info.index) {
|
|
switch (info.index) {
|
|
case VFIO_PCI_INTX_IRQ_INDEX ... VFIO_PCI_MSIX_IRQ_INDEX:
|
|
case VFIO_PCI_INTX_IRQ_INDEX ... VFIO_PCI_MSIX_IRQ_INDEX:
|
|
|
|
+ case VFIO_PCI_REQ_IRQ_INDEX:
|
|
break;
|
|
break;
|
|
case VFIO_PCI_ERR_IRQ_INDEX:
|
|
case VFIO_PCI_ERR_IRQ_INDEX:
|
|
if (pci_is_pcie(vdev->pdev))
|
|
if (pci_is_pcie(vdev->pdev))
|
|
@@ -828,6 +832,20 @@ static int vfio_pci_mmap(void *device_data, struct vm_area_struct *vma)
|
|
req_len, vma->vm_page_prot);
|
|
req_len, vma->vm_page_prot);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void vfio_pci_request(void *device_data, unsigned int count)
|
|
|
|
+{
|
|
|
|
+ struct vfio_pci_device *vdev = device_data;
|
|
|
|
+
|
|
|
|
+ mutex_lock(&vdev->igate);
|
|
|
|
+
|
|
|
|
+ if (vdev->req_trigger) {
|
|
|
|
+ dev_dbg(&vdev->pdev->dev, "Requesting device from user\n");
|
|
|
|
+ eventfd_signal(vdev->req_trigger, 1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ mutex_unlock(&vdev->igate);
|
|
|
|
+}
|
|
|
|
+
|
|
static const struct vfio_device_ops vfio_pci_ops = {
|
|
static const struct vfio_device_ops vfio_pci_ops = {
|
|
.name = "vfio-pci",
|
|
.name = "vfio-pci",
|
|
.open = vfio_pci_open,
|
|
.open = vfio_pci_open,
|
|
@@ -836,6 +854,7 @@ static const struct vfio_device_ops vfio_pci_ops = {
|
|
.read = vfio_pci_read,
|
|
.read = vfio_pci_read,
|
|
.write = vfio_pci_write,
|
|
.write = vfio_pci_write,
|
|
.mmap = vfio_pci_mmap,
|
|
.mmap = vfio_pci_mmap,
|
|
|
|
+ .request = vfio_pci_request,
|
|
};
|
|
};
|
|
|
|
|
|
static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|