Adds PCI iobar helper 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.
diff --git a/kern/arch/x86/pci.c b/kern/arch/x86/pci.c index cf9ba33..6847516 100644 --- a/kern/arch/x86/pci.c +++ b/kern/arch/x86/pci.c
@@ -502,6 +502,15 @@ 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;
diff --git a/kern/arch/x86/pci.h b/kern/arch/x86/pci.h index 2a19379..3aaf051 100644 --- a/kern/arch/x86/pci.h +++ b/kern/arch/x86/pci.h
@@ -408,6 +408,7 @@ 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);