pci: get the number of interrupts 87/17087/9
authorMohsin Kazmi <sykazmi@cisco.com>
Fri, 25 Jan 2019 15:57:24 +0000 (15:57 +0000)
committerDamjan Marion <dmarion@me.com>
Thu, 31 Jan 2019 13:12:33 +0000 (13:12 +0000)
Change-Id: I2cfb81b3c8809d027a3ee5f5f570668e60be08ef
Signed-off-by: Mohsin Kazmi <sykazmi@cisco.com>
src/vlib/linux/pci.c
src/vlib/pci/pci.h

index 28a5140..ec35adb 100644 (file)
@@ -173,6 +173,24 @@ vlib_pci_get_numa_node (vlib_main_t * vm, vlib_pci_dev_handle_t h)
   return d->numa_node;
 }
 
+u32
+vlib_pci_get_num_msix_interrupts (vlib_main_t * vm, vlib_pci_dev_handle_t h)
+{
+  linux_pci_device_t *d = linux_pci_get_device (h);
+
+  if (d->type == LINUX_PCI_DEVICE_TYPE_VFIO)
+    {
+      struct vfio_irq_info ii = { 0 };
+
+      ii.argsz = sizeof (struct vfio_irq_info);
+      ii.index = VFIO_PCI_MSIX_IRQ_INDEX;
+      if (ioctl (d->fd, VFIO_DEVICE_GET_IRQ_INFO, &ii) < 0)
+       return 0;
+      return ii.count;
+    }
+  return 0;
+}
+
 /* Call to allocate/initialize the pci subsystem.
    This is not an init function so that users can explicitly enable
    pci only when it's needed. */
index 71d4bae..d3b43ba 100644 (file)
@@ -103,6 +103,9 @@ vlib_pci_addr_t *vlib_pci_get_all_dev_addrs ();
 vlib_pci_addr_t *vlib_pci_get_addr (vlib_main_t * vm,
                                    vlib_pci_dev_handle_t h);
 u32 vlib_pci_get_numa_node (vlib_main_t * vm, vlib_pci_dev_handle_t h);
+u32 vlib_pci_get_num_msix_interrupts (vlib_main_t * vm,
+                                     vlib_pci_dev_handle_t h);
+
 uword vlib_pci_get_private_data (vlib_main_t * vm, vlib_pci_dev_handle_t h);
 void vlib_pci_set_private_data (vlib_main_t * vm, vlib_pci_dev_handle_t h,
                                uword private_data);