>From 7395e89541061aa844c3f9fbeb34a1afc7a78078 Mon Sep 17 00:00:00 2001 From: Alexey Korolev Date: Thu, 19 Apr 2012 17:40:13 +1200 Subject: [PATCH 06/11] pciinit: bridges can have two regions too Patch takes into account PCI bar and ROM regions of PCI bridges Original patch by: Gerd Hoffmann Signed-off-by: Kevin O'Connor Signed-off-by: Alexey Korolev --- src/pci.h | 1 + src/pciinit.c | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/pci.h b/src/pci.h index 5598100..6be838c 100644 --- a/src/pci.h +++ b/src/pci.h @@ -5,6 +5,7 @@ #define PCI_ROM_SLOT 6 #define PCI_NUM_REGIONS 7 +#define PCI_BRIDGE_NUM_REGIONS 2 static inline u8 pci_bdf_to_bus(u16 bdf) { return bdf >> 8; diff --git a/src/pciinit.c b/src/pciinit.c index 67008e0..d330568 100644 --- a/src/pciinit.c +++ b/src/pciinit.c @@ -370,13 +370,15 @@ static int pci_bios_check_devices(struct pci_bus *busses) // Calculate resources needed for regular (non-bus) devices. struct pci_device *pci; foreachpci(pci) { - if (pci->class == PCI_CLASS_BRIDGE_PCI) { + if (pci->class == PCI_CLASS_BRIDGE_PCI) busses[pci->secondary_bus].bus_dev = pci; - continue; - } + struct pci_bus *bus = &busses[pci_bdf_to_bus(pci->bdf)]; int i; for (i = 0; i < PCI_NUM_REGIONS; i++) { + if ((pci->class == PCI_CLASS_BRIDGE_PCI) && + (i >= PCI_BRIDGE_NUM_REGIONS && i < PCI_ROM_SLOT)) + continue; u32 val, size; pci_bios_get_bar(pci, i, &val, &size); if (val == 0) -- 1.7.5.4