aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/vfio/pci
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-12-17 13:44:22 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-12-17 13:44:22 -0500
commitcc669743a39e3f61c9ca5e786e959bf478ccd197 (patch)
tree99b1e239b6dea761435a5199c994371f01f500bf /drivers/vfio/pci
parent9f3e15129902bca9d8e296c165345f158bac94eb (diff)
parent5e9f36c59a4883c6d8db4a3c097e4fc2234742de (diff)
Merge tag 'vfio-v3.19-rc1' of git://github.com/awilliam/linux-vfio
Pull VFIO updates from Alex Williamson: - s390 support (Frank Blaschka) - Enable iommu-type1 for ARM SMMU (Will Deacon) * tag 'vfio-v3.19-rc1' of git://github.com/awilliam/linux-vfio: drivers/vfio: allow type-1 IOMMU instantiation on top of an ARM SMMU vfio: make vfio run on s390
Diffstat (limited to 'drivers/vfio/pci')
-rw-r--r--drivers/vfio/pci/Kconfig8
-rw-r--r--drivers/vfio/pci/vfio_pci.c5
-rw-r--r--drivers/vfio/pci/vfio_pci_config.c7
3 files changed, 18 insertions, 2 deletions
diff --git a/drivers/vfio/pci/Kconfig b/drivers/vfio/pci/Kconfig
index c41b01e2b693..c6bb5da2d2a7 100644
--- a/drivers/vfio/pci/Kconfig
+++ b/drivers/vfio/pci/Kconfig
@@ -16,3 +16,11 @@ config VFIO_PCI_VGA
16 BIOS and generic video drivers. 16 BIOS and generic video drivers.
17 17
18 If you don't know what to do here, say N. 18 If you don't know what to do here, say N.
19
20config VFIO_PCI_MMAP
21 depends on VFIO_PCI
22 def_bool y if !S390
23
24config VFIO_PCI_INTX
25 depends on VFIO_PCI
26 def_bool y if !S390
diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
index 9558da3f06a0..255201f22126 100644
--- a/drivers/vfio/pci/vfio_pci.c
+++ b/drivers/vfio/pci/vfio_pci.c
@@ -215,7 +215,7 @@ static int vfio_pci_get_irq_count(struct vfio_pci_device *vdev, int irq_type)
215 if (irq_type == VFIO_PCI_INTX_IRQ_INDEX) { 215 if (irq_type == VFIO_PCI_INTX_IRQ_INDEX) {
216 u8 pin; 216 u8 pin;
217 pci_read_config_byte(vdev->pdev, PCI_INTERRUPT_PIN, &pin); 217 pci_read_config_byte(vdev->pdev, PCI_INTERRUPT_PIN, &pin);
218 if (pin) 218 if (IS_ENABLED(CONFIG_VFIO_PCI_INTX) && pin)
219 return 1; 219 return 1;
220 220
221 } else if (irq_type == VFIO_PCI_MSI_IRQ_INDEX) { 221 } else if (irq_type == VFIO_PCI_MSI_IRQ_INDEX) {
@@ -406,7 +406,8 @@ static long vfio_pci_ioctl(void *device_data,
406 406
407 info.flags = VFIO_REGION_INFO_FLAG_READ | 407 info.flags = VFIO_REGION_INFO_FLAG_READ |
408 VFIO_REGION_INFO_FLAG_WRITE; 408 VFIO_REGION_INFO_FLAG_WRITE;
409 if (pci_resource_flags(pdev, info.index) & 409 if (IS_ENABLED(CONFIG_VFIO_PCI_MMAP) &&
410 pci_resource_flags(pdev, info.index) &
410 IORESOURCE_MEM && info.size >= PAGE_SIZE) 411 IORESOURCE_MEM && info.size >= PAGE_SIZE)
411 info.flags |= VFIO_REGION_INFO_FLAG_MMAP; 412 info.flags |= VFIO_REGION_INFO_FLAG_MMAP;
412 break; 413 break;
diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c
index 1de3f94aa7de..ff75ca31a199 100644
--- a/drivers/vfio/pci/vfio_pci_config.c
+++ b/drivers/vfio/pci/vfio_pci_config.c
@@ -609,6 +609,10 @@ static int __init init_pci_cap_basic_perm(struct perm_bits *perm)
609 609
610 /* Sometimes used by sw, just virtualize */ 610 /* Sometimes used by sw, just virtualize */
611 p_setb(perm, PCI_INTERRUPT_LINE, (u8)ALL_VIRT, (u8)ALL_WRITE); 611 p_setb(perm, PCI_INTERRUPT_LINE, (u8)ALL_VIRT, (u8)ALL_WRITE);
612
613 /* Virtualize interrupt pin to allow hiding INTx */
614 p_setb(perm, PCI_INTERRUPT_PIN, (u8)ALL_VIRT, (u8)NO_WRITE);
615
612 return 0; 616 return 0;
613} 617}
614 618
@@ -1445,6 +1449,9 @@ int vfio_config_init(struct vfio_pci_device *vdev)
1445 *(__le16 *)&vconfig[PCI_DEVICE_ID] = cpu_to_le16(pdev->device); 1449 *(__le16 *)&vconfig[PCI_DEVICE_ID] = cpu_to_le16(pdev->device);
1446 } 1450 }
1447 1451
1452 if (!IS_ENABLED(CONFIG_VFIO_PCI_INTX))
1453 vconfig[PCI_INTERRUPT_PIN] = 0;
1454
1448 ret = vfio_cap_init(vdev); 1455 ret = vfio_cap_init(vdev);
1449 if (ret) 1456 if (ret)
1450 goto out; 1457 goto out;