diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-12-17 13:44:22 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-12-17 13:44:22 -0500 |
commit | cc669743a39e3f61c9ca5e786e959bf478ccd197 (patch) | |
tree | 99b1e239b6dea761435a5199c994371f01f500bf /drivers/vfio | |
parent | 9f3e15129902bca9d8e296c165345f158bac94eb (diff) | |
parent | 5e9f36c59a4883c6d8db4a3c097e4fc2234742de (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')
-rw-r--r-- | drivers/vfio/Kconfig | 2 | ||||
-rw-r--r-- | drivers/vfio/pci/Kconfig | 8 | ||||
-rw-r--r-- | drivers/vfio/pci/vfio_pci.c | 5 | ||||
-rw-r--r-- | drivers/vfio/pci/vfio_pci_config.c | 7 |
4 files changed, 19 insertions, 3 deletions
diff --git a/drivers/vfio/Kconfig b/drivers/vfio/Kconfig index d8c57636b9ce..14e27ab32456 100644 --- a/drivers/vfio/Kconfig +++ b/drivers/vfio/Kconfig | |||
@@ -16,7 +16,7 @@ config VFIO_SPAPR_EEH | |||
16 | menuconfig VFIO | 16 | menuconfig VFIO |
17 | tristate "VFIO Non-Privileged userspace driver framework" | 17 | tristate "VFIO Non-Privileged userspace driver framework" |
18 | depends on IOMMU_API | 18 | depends on IOMMU_API |
19 | select VFIO_IOMMU_TYPE1 if X86 | 19 | select VFIO_IOMMU_TYPE1 if (X86 || S390 || ARM_SMMU) |
20 | select VFIO_IOMMU_SPAPR_TCE if (PPC_POWERNV || PPC_PSERIES) | 20 | select VFIO_IOMMU_SPAPR_TCE if (PPC_POWERNV || PPC_PSERIES) |
21 | select VFIO_SPAPR_EEH if (PPC_POWERNV || PPC_PSERIES) | 21 | select VFIO_SPAPR_EEH if (PPC_POWERNV || PPC_PSERIES) |
22 | select ANON_INODES | 22 | select ANON_INODES |
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 | |||
20 | config VFIO_PCI_MMAP | ||
21 | depends on VFIO_PCI | ||
22 | def_bool y if !S390 | ||
23 | |||
24 | config 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; |