Adds PCI iobar helper
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 23 Jan 2015 00:03:55 +0000 (19:03 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Sun, 1 Mar 2015 14:35:59 +0000 (09:35 -0500)
This stuff is a bit clunky; you need to check after each pci_get_whatever().
Not sure if there's a nicer way, esp given we have a bunch of device code from
2-3 OSs in here.

kern/arch/x86/pci.c
kern/arch/x86/pci.h

index cf9ba33..6847516 100644 (file)
@@ -502,6 +502,15 @@ uintptr_t pci_get_membar(struct pci_device *pcidev, int bir)
                pcidev->bar[bir].mmio_base32);
 }
 
+uintptr_t pci_get_iobar(struct pci_device *pcidev, int bir)
+{
+       if (bir >= pcidev->nr_bars)
+               return 0;
+       if (!pci_is_iobar(pcidev->bar[bir].raw_bar))
+               return 0;
+       return pci_getiobar32(pcidev->bar[bir].raw_bar);
+}
+
 uint16_t pci_get_vendor(struct pci_device *pcidev)
 {
        return pcidev->ven_id;
index 2082880..de88646 100644 (file)
@@ -406,6 +406,7 @@ void pci_set_bus_master(struct pci_device *pcidev);
 void pci_clr_bus_master(struct pci_device *pcidev);
 struct pci_device *pci_match_tbdf(int tbdf);
 uintptr_t pci_get_membar(struct pci_device *pcidev, int bir);
+uintptr_t pci_get_iobar(struct pci_device *pcidev, int bir);
 uint16_t pci_get_vendor(struct pci_device *pcidev);
 uint16_t pci_get_device(struct pci_device *pcidev);
 uint16_t pci_get_subvendor(struct pci_device *pcidev);