This allows a simpler VFIO_DEVICE_GET_INFO ioctl in vendor driver

Cc: Kevin Tian <[email protected]>
Signed-off-by: Yan Zhao <[email protected]>
---
 drivers/vfio/pci/vfio_pci.c         | 23 +++++++++++++++++++++--
 drivers/vfio/pci/vfio_pci_private.h |  2 ++
 include/linux/vfio.h                |  3 +++
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
index 290b7ab55ecf..30137c1c5308 100644
--- a/drivers/vfio/pci/vfio_pci.c
+++ b/drivers/vfio/pci/vfio_pci.c
@@ -105,6 +105,24 @@ void *vfio_pci_vendor_data(void *device_data)
 }
 EXPORT_SYMBOL_GPL(vfio_pci_vendor_data);
 
+int vfio_pci_set_vendor_regions(void *device_data, int num_vendor_regions)
+{
+       struct vfio_pci_device *vdev = device_data;
+
+       vdev->num_vendor_regions = num_vendor_regions;
+       return 0;
+}
+EXPORT_SYMBOL_GPL(vfio_pci_set_vendor_regions);
+
+
+int vfio_pci_set_vendor_irqs(void *device_data, int num_vendor_irqs)
+{
+       struct vfio_pci_device *vdev = device_data;
+
+       vdev->num_vendor_irqs = num_vendor_irqs;
+       return 0;
+}
+EXPORT_SYMBOL_GPL(vfio_pci_set_vendor_irqs);
 /*
  * Our VGA arbiter participation is limited since we don't know anything
  * about the device itself.  However, if the device is the only VGA device
@@ -797,8 +815,9 @@ long vfio_pci_ioctl(void *device_data,
                if (vdev->reset_works)
                        info.flags |= VFIO_DEVICE_FLAGS_RESET;
 
-               info.num_regions = VFIO_PCI_NUM_REGIONS + vdev->num_regions;
-               info.num_irqs = VFIO_PCI_NUM_IRQS;
+               info.num_regions = VFIO_PCI_NUM_REGIONS + vdev->num_regions +
+                                               vdev->num_vendor_regions;
+               info.num_irqs = VFIO_PCI_NUM_IRQS + vdev->num_vendor_irqs;
 
                return copy_to_user((void __user *)arg, &info, minsz) ?
                        -EFAULT : 0;
diff --git a/drivers/vfio/pci/vfio_pci_private.h 
b/drivers/vfio/pci/vfio_pci_private.h
index 7758a20546fa..c6cfc4605987 100644
--- a/drivers/vfio/pci/vfio_pci_private.h
+++ b/drivers/vfio/pci/vfio_pci_private.h
@@ -110,6 +110,8 @@ struct vfio_pci_device {
        int                     num_ctx;
        int                     irq_type;
        int                     num_regions;
+       int                     num_vendor_regions;
+       int                     num_vendor_irqs;
        struct vfio_pci_region  *region;
        u8                      msi_qmax;
        u8                      msix_bar;
diff --git a/include/linux/vfio.h b/include/linux/vfio.h
index 6ededceb1964..6310c53f9d36 100644
--- a/include/linux/vfio.h
+++ b/include/linux/vfio.h
@@ -231,6 +231,9 @@ extern void vfio_pci_release(void *device_data);
 extern int vfio_pci_match(void *device_data, char *buf);
 
 extern void *vfio_pci_vendor_data(void *device_data);
+extern int vfio_pci_set_vendor_regions(void *device_data,
+                                      int num_vendor_regions);
+extern int vfio_pci_set_vendor_irqs(void *device_data, int num_vendor_irqs);
 
 struct vfio_pci_vendor_driver_ops {
        char                    *name;
-- 
2.17.1

Reply via email to