vfio/pci: Move igd initialization to vfio_pci.c
[sfrench/cifs-2.6.git] / drivers / vfio / pci / vfio_pci.c
index 4e31bd3001addb4412ead46fe4943f3c22cc7fc6..2729b777a56d6b4788038b3cff9ae032fb3cacfe 100644 (file)
@@ -82,9 +82,36 @@ static bool vfio_pci_is_denylisted(struct pci_dev *pdev)
        return true;
 }
 
+static int vfio_pci_open_device(struct vfio_device *core_vdev)
+{
+       struct vfio_pci_core_device *vdev =
+               container_of(core_vdev, struct vfio_pci_core_device, vdev);
+       struct pci_dev *pdev = vdev->pdev;
+       int ret;
+
+       ret = vfio_pci_core_enable(vdev);
+       if (ret)
+               return ret;
+
+       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 && ret != -ENODEV) {
+                       pci_warn(pdev, "Failed to setup Intel IGD regions\n");
+                       vfio_pci_core_disable(vdev);
+                       return ret;
+               }
+       }
+
+       vfio_pci_core_finish_enable(vdev);
+
+       return 0;
+}
+
 static const struct vfio_device_ops vfio_pci_ops = {
        .name           = "vfio-pci",
-       .open_device    = vfio_pci_core_open_device,
+       .open_device    = vfio_pci_open_device,
        .close_device   = vfio_pci_core_close_device,
        .ioctl          = vfio_pci_core_ioctl,
        .read           = vfio_pci_core_read,