vfio/pci: Move igd initialization to vfio_pci.c
authorMax Gurtovoy <mgurtovoy@nvidia.com>
Thu, 26 Aug 2021 10:39:06 +0000 (13:39 +0300)
committerAlex Williamson <alex.williamson@redhat.com>
Thu, 26 Aug 2021 16:36:51 +0000 (10:36 -0600)
igd is related to the vfio_pci pci_driver implementation, move it out of
vfio_pci_core.c.

This is preparation for splitting vfio_pci.ko into 2 drivers.

Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
Link: https://lore.kernel.org/r/20210826103912.128972-8-yishaih@nvidia.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/pci/vfio_pci.c
drivers/vfio/pci/vfio_pci_core.c
drivers/vfio/pci/vfio_pci_core.h

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,
index c0d71f72d4f10cdb4a5d98ed75d25f28d85b9a91..3b3bf74453670656ef32c090901d66812b025faa 100644 (file)
@@ -91,11 +91,6 @@ static unsigned int vfio_pci_set_vga_decode(void *opaque, bool single_vga)
        return decodes;
 }
 
-static inline bool vfio_pci_is_vga(struct pci_dev *pdev)
-{
-       return (pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA;
-}
-
 static void vfio_pci_probe_mmaps(struct vfio_pci_core_device *vdev)
 {
        struct resource *res;
@@ -166,7 +161,6 @@ no_mmap:
 
 struct vfio_pci_group_info;
 static bool vfio_pci_dev_set_try_reset(struct vfio_device_set *dev_set);
-static void vfio_pci_disable(struct vfio_pci_core_device *vdev);
 static int vfio_pci_dev_set_hot_reset(struct vfio_device_set *dev_set,
                                      struct vfio_pci_group_info *groups);
 
@@ -252,7 +246,7 @@ int vfio_pci_set_power_state(struct vfio_pci_core_device *vdev, pci_power_t stat
        return ret;
 }
 
-static int vfio_pci_enable(struct vfio_pci_core_device *vdev)
+int vfio_pci_core_enable(struct vfio_pci_core_device *vdev)
 {
        struct pci_dev *pdev = vdev->pdev;
        int ret;
@@ -321,26 +315,11 @@ static int vfio_pci_enable(struct vfio_pci_core_device *vdev)
        if (!vfio_vga_disabled() && vfio_pci_is_vga(pdev))
                vdev->has_vga = true;
 
-       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");
-                       goto disable_exit;
-               }
-       }
-
-       vfio_pci_probe_mmaps(vdev);
 
        return 0;
-
-disable_exit:
-       vfio_pci_disable(vdev);
-       return ret;
 }
 
-static void vfio_pci_disable(struct vfio_pci_core_device *vdev)
+void vfio_pci_core_disable(struct vfio_pci_core_device *vdev)
 {
        struct pci_dev *pdev = vdev->pdev;
        struct vfio_pci_dummy_resource *dummy_res, *tmp;
@@ -479,7 +458,7 @@ void vfio_pci_core_close_device(struct vfio_device *core_vdev)
 
        vfio_pci_vf_token_user_add(vdev, -1);
        vfio_spapr_pci_eeh_release(vdev->pdev);
-       vfio_pci_disable(vdev);
+       vfio_pci_core_disable(vdev);
 
        mutex_lock(&vdev->igate);
        if (vdev->err_trigger) {
@@ -493,19 +472,11 @@ void vfio_pci_core_close_device(struct vfio_device *core_vdev)
        mutex_unlock(&vdev->igate);
 }
 
-int vfio_pci_core_open_device(struct vfio_device *core_vdev)
+void vfio_pci_core_finish_enable(struct vfio_pci_core_device *vdev)
 {
-       struct vfio_pci_core_device *vdev =
-               container_of(core_vdev, struct vfio_pci_core_device, vdev);
-       int ret = 0;
-
-       ret = vfio_pci_enable(vdev);
-       if (ret)
-               return ret;
-
+       vfio_pci_probe_mmaps(vdev);
        vfio_spapr_pci_eeh_open(vdev->pdev);
        vfio_pci_vf_token_user_add(vdev, 1);
-       return 0;
 }
 
 static int vfio_pci_get_irq_count(struct vfio_pci_core_device *vdev, int irq_type)
index 7dbdd4dda5c0ad2d4cb2617a6439d05a2ed7cb80..ffaf544f35dba244f9f94241869175a157735369 100644 (file)
@@ -210,7 +210,6 @@ static inline int vfio_pci_info_zdev_add_caps(struct vfio_pci_core_device *vdev,
 void vfio_pci_core_cleanup(void);
 int vfio_pci_core_init(void);
 void vfio_pci_core_close_device(struct vfio_device *core_vdev);
-int vfio_pci_core_open_device(struct vfio_device *core_vdev);
 void vfio_pci_core_init_device(struct vfio_pci_core_device *vdev,
                               struct pci_dev *pdev,
                               const struct vfio_device_ops *vfio_pci_ops);
@@ -228,5 +227,13 @@ ssize_t vfio_pci_core_write(struct vfio_device *core_vdev, const char __user *bu
 int vfio_pci_core_mmap(struct vfio_device *core_vdev, struct vm_area_struct *vma);
 void vfio_pci_core_request(struct vfio_device *core_vdev, unsigned int count);
 int vfio_pci_core_match(struct vfio_device *core_vdev, char *buf);
+int vfio_pci_core_enable(struct vfio_pci_core_device *vdev);
+void vfio_pci_core_disable(struct vfio_pci_core_device *vdev);
+void vfio_pci_core_finish_enable(struct vfio_pci_core_device *vdev);
+
+static inline bool vfio_pci_is_vga(struct pci_dev *pdev)
+{
+       return (pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA;
+}
 
 #endif /* VFIO_PCI_CORE_H */