diff options
author | Alex Williamson <alex.williamson@redhat.com> | 2016-02-23 02:02:45 +0300 |
---|---|---|
committer | Alex Williamson <alex.williamson@redhat.com> | 2016-02-23 02:10:09 +0300 |
commit | f572a960a15e8bb56599f6d2358a9c18f0808e91 (patch) | |
tree | 7010cab19cd6604f8d17d3dbb27611635e1870c9 /drivers/vfio/pci/vfio_pci.c | |
parent | 5846ff54e87d8bab4f1e330af0b5407747a0a57e (diff) | |
download | linux-f572a960a15e8bb56599f6d2358a9c18f0808e91.tar.xz |
vfio/pci: Intel IGD host and LCP bridge config space access
Provide read-only access to PCI config space of the PCI host bridge
and LPC bridge through device specific regions. This may be used to
configure a VM with matching register contents to satisfy driver
requirements. Providing this through the vfio file descriptor removes
an additional userspace requirement for access through pci-sysfs and
removes the CAP_SYS_ADMIN requirement that doesn't appear to apply to
the specific devices we're accessing.
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
Diffstat (limited to 'drivers/vfio/pci/vfio_pci.c')
-rw-r--r-- | drivers/vfio/pci/vfio_pci.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c index cb2624db37d8..74a375297494 100644 --- a/drivers/vfio/pci/vfio_pci.c +++ b/drivers/vfio/pci/vfio_pci.c @@ -111,6 +111,7 @@ static inline bool vfio_pci_is_vga(struct pci_dev *pdev) } static void vfio_pci_try_bus_reset(struct vfio_pci_device *vdev); +static void vfio_pci_disable(struct vfio_pci_device *vdev); static int vfio_pci_enable(struct vfio_pci_device *vdev) { @@ -170,10 +171,16 @@ static int vfio_pci_enable(struct vfio_pci_device *vdev) vdev->has_vga = true; - if (vfio_pci_is_vga(pdev) && pdev->vendor == PCI_VENDOR_ID_INTEL) { - if (vfio_pci_igd_opregion_init(vdev) == 0) - dev_info(&pdev->dev, - "Intel IGD OpRegion support enabled\n"); + if (vfio_pci_is_vga(pdev) && + pdev->vendor == PCI_VENDOR_ID_INTEL && + IS_ENABLED(CONFIG_VFIO_PCI_IGD)) { + ret = vfio_pci_igd_init(vdev); + if (ret) { + dev_warn(&vdev->pdev->dev, + "Failed to setup Intel IGD regions\n"); + vfio_pci_disable(vdev); + return ret; + } } return 0; |