Add function for finding unused BARs
authorRonald G. Minnich <rminnich@google.com>
Fri, 28 Mar 2014 17:11:44 +0000 (10:11 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sat, 29 Mar 2014 01:17:06 +0000 (18:17 -0700)
MSI-X will need up to two unused BARs, and at least one.
Next step is code to find the MSI-X capability and fill in the
blanks.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
kern/arch/x86/pci.c
kern/arch/x86/pci.h

index b5a99f1..59957b9 100644 (file)
@@ -400,6 +400,17 @@ void pci_clr_bus_master(struct pci_device *pcidev)
        pcidev_write16(pcidev, PCI_CMD_REG, reg);
 }
 
+/* Find up to 'need' unused bars. Needed for MSI-X */
+int pci_find_unused_bars(struct pci_device *dev, int *bars, int need)
+{
+       int i, found;
+       for(i = found = 0; found < need && i < ARRAY_SIZE(dev->bar); i++)
+               if (!dev->bar[i].raw_bar)
+                       bars[found++] = i;
+       return found;
+
+}
+
 struct pci_device *pci_match_tbdf(int tbdf)
 {
        struct pci_device *search;
index 7f3bc57..2588f7a 100644 (file)
@@ -405,6 +405,7 @@ struct irq_handler; /* include loops */
 void msi_mask_irq(struct irq_handler *irq_h, int apic_vector);
 void msi_unmask_irq(struct irq_handler *irq_h, int apic_vector);
 int msi_route_irq(struct irq_handler *irq_h, int apic_vector, int dest);
+int pci_find_unused_bars(struct pci_device *dev, int *bars, int need);
 
 /* TODO: this is quite the Hacke */
 #define explode_tbdf(tbdf) {pcidev.bus = tbdf >> 16;\