Replace PCIPaths code with struct pci_device.
authorKevin O'Connor <kevin@koconnor.net>
Tue, 21 Jun 2011 03:29:15 +0000 (23:29 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Tue, 21 Jun 2011 03:58:08 +0000 (23:58 -0400)
src/boot.c
src/pci.c
src/pci.h
src/post.c

index 9a6791602198f65d1da356d379c7dedf5b0004f2..f3c165caaf9cc25891f4d2472eb91f95d371abe6 100644 (file)
@@ -98,24 +98,33 @@ find_prio(const char *glob)
 
 #define FW_PCI_DOMAIN "/pci@i0cf8"
 
+static struct pci_device *
+find_pci(u16 bdf)
+{
+    struct pci_device *pci;
+    foreachpci(pci) {
+        if (pci->bdf == bdf)
+            return pci;
+    }
+    return NULL;
+}
+
 static char *
-build_pci_path(char *buf, int max, const char *devname, int bdf)
+build_pci_path(char *buf, int max, const char *devname, struct pci_device *pci)
 {
+    if (!pci)
+        return buf;
     // Build the string path of a bdf - for example: /pci@i0cf8/isa@1,2
     char *p = buf;
-    int parent = pci_bdf_to_bus(bdf);
-    if (PCIpaths)
-        parent = PCIpaths[parent];
-    int parentdev = parent & 0xffff;
-    if (parent & PP_PCIBRIDGE) {
-        p = build_pci_path(p, max, "pci-bridge", parentdev);
+    if (pci->parent) {
+        p = build_pci_path(p, max, "pci-bridge", pci->parent);
     } else {
-        if (parentdev)
-            p += snprintf(p, max, "/pci-root@%x", parentdev);
+        if (pci->rootbus)
+            p += snprintf(p, max, "/pci-root@%x", pci->rootbus);
         p += snprintf(p, buf+max-p, "%s", FW_PCI_DOMAIN);
     }
 
-    int dev = pci_bdf_to_dev(bdf), fn = pci_bdf_to_fn(bdf);
+    int dev = pci_bdf_to_dev(pci->bdf), fn = pci_bdf_to_fn(pci->bdf);
     p += snprintf(p, buf+max-p, "/%s@%x", devname, dev);
     if (fn)
         p += snprintf(p, buf+max-p, ",%x", fn);
@@ -128,7 +137,7 @@ int bootprio_find_pci_device(int bdf)
         return -1;
     // Find pci device - for example: /pci@i0cf8/ethernet@5
     char desc[256];
-    build_pci_path(desc, sizeof(desc), "*", bdf);
+    build_pci_path(desc, sizeof(desc), "*", find_pci(bdf));
     return find_prio(desc);
 }
 
@@ -141,7 +150,7 @@ int bootprio_find_ata_device(int bdf, int chanid, int slave)
         return -1;
     // Find ata drive - for example: /pci@i0cf8/ide@1,1/drive@1/disk@0
     char desc[256], *p;
-    p = build_pci_path(desc, sizeof(desc), "*", bdf);
+    p = build_pci_path(desc, sizeof(desc), "*", find_pci(bdf));
     snprintf(p, desc+sizeof(desc)-p, "/drive@%x/disk@%x", chanid, slave);
     return find_prio(desc);
 }
@@ -155,7 +164,7 @@ int bootprio_find_fdc_device(int bdf, int port, int fdid)
         return -1;
     // Find floppy - for example: /pci@i0cf8/isa@1/fdc@03f1/floppy@0
     char desc[256], *p;
-    p = build_pci_path(desc, sizeof(desc), "isa", bdf);
+    p = build_pci_path(desc, sizeof(desc), "isa", find_pci(bdf));
     snprintf(p, desc+sizeof(desc)-p, "/fdc@%04x/floppy@%x", port, fdid);
     return find_prio(desc);
 }
@@ -166,7 +175,7 @@ int bootprio_find_pci_rom(int bdf, int instance)
         return -1;
     // Find pci rom - for example: /pci@i0cf8/scsi@3:rom2
     char desc[256], *p;
-    p = build_pci_path(desc, sizeof(desc), "*", bdf);
+    p = build_pci_path(desc, sizeof(desc), "*", find_pci(bdf));
     if (instance)
         snprintf(p, desc+sizeof(desc)-p, ":rom%d", instance);
     return find_prio(desc);
@@ -191,7 +200,7 @@ int bootprio_find_usb(int bdf, u64 path)
     // Find usb - for example: /pci@i0cf8/usb@1,2/hub@1/network@0/ethernet@0
     int i;
     char desc[256], *p;
-    p = build_pci_path(desc, sizeof(desc), "usb", bdf);
+    p = build_pci_path(desc, sizeof(desc), "usb", find_pci(bdf));
     for (i=56; i>0; i-=8) {
         int port = (path >> i) & 0xff;
         if (port != 0xff)
index 9a696b9052394a943ac62a486f8b94041bce89df..eaf434abff988878c3117ed56a36c1b9c247724d 100644 (file)
--- a/src/pci.c
+++ b/src/pci.c
@@ -190,36 +190,6 @@ pci_find_class(u16 classid)
     return -1;
 }
 
-int *PCIpaths;
-
-// Build the PCI path designations.
-void
-pci_path_setup(void)
-{
-    PCIpaths = malloc_tmp(sizeof(*PCIpaths) * 256);
-    if (!PCIpaths)
-        return;
-    memset(PCIpaths, 0, sizeof(*PCIpaths) * 256);
-
-    int roots = 0;
-    int bdf, max;
-    foreachbdf(bdf, max) {
-        int bus = pci_bdf_to_bus(bdf);
-        if (! PCIpaths[bus])
-            PCIpaths[bus] = (roots++) | PP_ROOT;
-
-        // Check if found device is a bridge.
-        u32 v = pci_config_readb(bdf, PCI_HEADER_TYPE);
-        v &= 0x7f;
-        if (v == PCI_HEADER_TYPE_BRIDGE || v == PCI_HEADER_TYPE_CARDBUS) {
-            v = pci_config_readl(bdf, PCI_PRIMARY_BUS);
-            int childbus = (v >> 8) & 0xff;
-            if (childbus > bus)
-                PCIpaths[childbus] = bdf | PP_PCIBRIDGE;
-        }
-    }
-}
-
 int pci_init_device(const struct pci_device_id *ids, u16 bdf, void *arg)
 {
     u16 vendor_id = pci_config_readw(bdf, PCI_VENDOR_ID);
index 7aa2dfeb60f466489232e8fa3978baeb37e9a1fa..70339cda63c744634d73b63e390d122fe713a435 100644 (file)
--- a/src/pci.h
+++ b/src/pci.h
@@ -59,11 +59,6 @@ static inline u32 pci_classprog(struct pci_device *pci) {
 #define foreachpci(PCI)                         \
     for (PCI=PCIDevices; PCI; PCI=PCI->next)
 
-#define PP_ROOT      (1<<17)
-#define PP_PCIBRIDGE (1<<18)
-extern int *PCIpaths;
-void pci_path_setup(void);
-
 int pci_next(int bdf, int *pmax);
 #define foreachbdf(BDF, MAX)                    \
     for (MAX=0x0100, BDF=pci_next(0, &MAX)      \
index d8f4acf1587b75529a5f29c84d534ef931ea9497..7618b176154b933f4b5f28c514ae1088942f68cf 100644 (file)
@@ -225,7 +225,6 @@ maininit(void)
     // Initialize pci
     pci_setup();
     pci_probe();
-    pci_path_setup();
     smm_init();
 
     // Initialize internal tables