]> Joshua Wise's Git repositories - netwatch.git/commitdiff
Add a 'pci_driver' probe function.
authorJoshua Wise <joshua@rebirth.joshuawise.com>
Thu, 2 Oct 2008 22:25:40 +0000 (18:25 -0400)
committerJoshua Wise <joshua@rebirth.joshuawise.com>
Thu, 2 Oct 2008 22:25:40 +0000 (18:25 -0400)
aseg/3c905.c
include/pci.h
pci/pci.c

index 82ad69568e50dbd57f430eeb46b780ec7a55e04e..b89abe2d2b0f56206aa4446121de9099a28d8a0c 100644 (file)
@@ -4,7 +4,7 @@
 
 static int found = 0, _bus, _dev, _fn;
 
-static int bother_3c905(pci_dev_t *dev)
+static int bother_3c905(pci_dev_t *dev, void *nutrinus)
 {
        if (dev->vid == 0x10B7 || dev->did == 0x9200)
        {
@@ -32,5 +32,5 @@ void eth_poll()
 
 void eth_init()
 {
-       pci_probe(bother_3c905);
+       pci_probe(bother_3c905, 0x0);
 }
index 313b3e0d0570f39a5f8cb4ea6d8a9f01065e275e..9f7e6b90a75c1c64f8bfbc4ca86e4edf236eaa6f 100644 (file)
@@ -36,9 +36,25 @@ typedef struct pci_dev {
        pci_bar_t bars[6];
 } pci_dev_t;
 
-typedef int (*pci_probe_fn_t)(pci_dev_t *);
+typedef int (*pci_probe_fn_t)(pci_dev_t *, void *data);
 
 void pci_bus_enum();
-int pci_probe(pci_probe_fn_t probe);
+int pci_probe(pci_probe_fn_t probe, void *data);
+
+typedef struct pci_id {
+       unsigned short vid, did;
+       const char *name, *friendlyname;
+} pci_id_t;
+
+#define PCI_ROM(a,b,c,d) {(a),(b),(c),(d)}
+
+typedef struct pci_driver {
+       const char *name;
+       pci_probe_fn_t probe;
+       pci_id_t *ids;
+       int id_count;
+} pci_driver_t;
+
+int pci_probe_driver(pci_driver_t driver);
 
 #endif
index e5ab8169dd8231423d1f47ce85eb08b957fbe079..c7385decee845afaa671464b0b4489a8b3e4af07 100644 (file)
--- a/pci/pci.c
+++ b/pci/pci.c
@@ -1,7 +1,7 @@
 #include <pci.h>
 #include <output.h>
 
-int pci_probe(pci_probe_fn_t probe)
+int pci_probe(pci_probe_fn_t probe, void *data)
 {
        int devsfound = 0;
        pci_dev_t pdev;
@@ -11,62 +11,65 @@ int pci_probe(pci_probe_fn_t probe)
        
        for (bus = 0; bus < 0x100; bus++)
                for (dev = 0; dev < 0x20; dev++)
-                       if (pci_read32(bus, dev, 0, 0) != 0xFFFFFFFF)
-                               for (fn = 0; fn < 8; fn++)
+               {
+                       if (pci_read32(bus, dev, 0, 0) == 0xFFFFFFFF)
+                               continue;
+                       for (fn = 0; fn < 8; fn++)
+                       {
+                               int bar;
+                               
+                               if (pci_read32(bus, dev, fn, 0) == 0xFFFFFFFF)
+                                       continue;
+                               
+                               if ((fn != 0) && !(pci_read8(bus, dev, 0, 0x0E) & 0x80))
+                                       continue;
+                               
+                               pdev.bus = bus;
+                               pdev.dev = dev;
+                               pdev.fn = fn;
+                               pdev.vid = pci_read16(bus, dev, fn, 0);
+                               pdev.did = pci_read16(bus, dev, fn, 2);
+                               
+                               for (bar = 0; bar < 6; bar++)
                                {
-                                       int bar;
-                                       
-                                       if (pci_read32(bus, dev, fn, 0) == 0xFFFFFFFF)
-                                               continue;
-                                       
-                                       if ((fn != 0) && !(pci_read8(bus, dev, 0, 0x0E) & 0x80))
+                                       unsigned long bardat = pci_read32(bus, dev, fn, 0x10 + bar*4);
+                                       if (bardat == 0)
+                                       {
+                                               pdev.bars[bar].type = PCI_BAR_NONE;
                                                continue;
-                                       
-                                       pdev.bus = bus;
-                                       pdev.dev = dev;
-                                       pdev.fn = fn;
-                                       pdev.vid = pci_read16(bus, dev, fn, 0);
-                                       pdev.did = pci_read16(bus, dev, fn, 2);
-                                       
-                                       for (bar = 0; bar < 6; bar++)
+                                       }
+                                       if (bardat & 1)
                                        {
-                                               unsigned long bardat = pci_read32(bus, dev, fn, 0x10 + bar*4);
-                                               if (bardat == 0)
+                                               pdev.bars[bar].type = PCI_BAR_IO;
+                                               pdev.bars[bar].addr = bardat & ~0x3;
+                                       } else {
+                                               pdev.bars[bar].prefetchable = (bardat >> 3) & 1;
+                                               switch ((bardat >> 1) & 0x3)
                                                {
+                                               case 0:
+                                                       pdev.bars[bar].type = PCI_BAR_MEMORY32;
+                                                       pdev.bars[bar].addr = bardat & ~0xF;
+                                                       break;
+                                               case 2:
+                                                       pdev.bars[bar].type = PCI_BAR_MEMORY64;
+                                                       bar++;
+                                                       pdev.bars[bar].type = PCI_BAR_NONE;
+                                                       break;
+                                               default:
                                                        pdev.bars[bar].type = PCI_BAR_NONE;
                                                        continue;
                                                }
-                                               if (bardat & 1)
-                                               {
-                                                       pdev.bars[bar].type = PCI_BAR_IO;
-                                                       pdev.bars[bar].addr = bardat & ~0x3;
-                                               } else {
-                                                       pdev.bars[bar].prefetchable = (bardat >> 3) & 1;
-                                                       switch ((bardat >> 1) & 0x3)
-                                                       {
-                                                       case 0:
-                                                               pdev.bars[bar].type = PCI_BAR_MEMORY32;
-                                                               pdev.bars[bar].addr = bardat & ~0xF;
-                                                               break;
-                                                       case 2:
-                                                               pdev.bars[bar].type = PCI_BAR_MEMORY64;
-                                                               bar++;
-                                                               pdev.bars[bar].type = PCI_BAR_NONE;
-                                                               break;
-                                                       default:
-                                                               pdev.bars[bar].type = PCI_BAR_NONE;
-                                                               continue;
-                                                       }
-                                               }
                                        }
-                                       
-                                       devsfound += probe(&pdev);
                                }
+                               
+                               devsfound += probe(&pdev, data);
+                       }
+               }
        
        return devsfound;
 }
 
-static int _enumfn(pci_dev_t *pdev)
+static int _enumfn(pci_dev_t *pdev, void *data)
 {
        int bar;
        
@@ -95,6 +98,24 @@ static int _enumfn(pci_dev_t *pdev)
 
 void pci_bus_enum()
 {
-       pci_probe(_enumfn);
+       pci_probe(_enumfn, 0x0);
 }
 
+static int _probefn(pci_dev_t *dev, void *d)
+{
+       pci_driver_t *driver = d;
+       int i;
+       
+       for (i = 0; i < driver->id_count; i++)
+               if ((dev->vid == driver->ids[i].vid) && (dev->did == driver->ids[i].did))
+               {
+                       outputf("Probing PCI device: %s (%s)", driver->ids[i].name ? driver->ids[i].name : driver->name, driver->ids[i].friendlyname ? driver->ids[i].friendlyname : "no friendly name");
+                       return driver->probe(dev, d);
+               }
+       return 0;
+}
+
+int pci_probe_driver(pci_driver_t driver)
+{
+       return pci_probe(_probefn, &driver);
+}
This page took 0.028485 seconds and 4 git commands to generate.