]> Joshua Wise's Git repositories - netwatch.git/commitdiff
Merge nyus.joshuawise.com:/storage/git/netwatch
authorJoshua Wise <joshua@rebirth.joshuawise.com>
Thu, 2 Oct 2008 22:33:37 +0000 (18:33 -0400)
committerJoshua Wise <joshua@rebirth.joshuawise.com>
Thu, 2 Oct 2008 22:33:37 +0000 (18:33 -0400)
aseg/3c905.c [new file with mode: 0644]
aseg/3c905.h [new file with mode: 0644]
aseg/Makefile
aseg/counter.c
aseg/firstrun.c
include/pci.h
pci/pci.c

diff --git a/aseg/3c905.c b/aseg/3c905.c
new file mode 100644 (file)
index 0000000..b89abe2
--- /dev/null
@@ -0,0 +1,36 @@
+#include <pci.h>
+#include <output.h>
+#include "3c905.h"
+
+static int found = 0, _bus, _dev, _fn;
+
+static int bother_3c905(pci_dev_t *dev, void *nutrinus)
+{
+       if (dev->vid == 0x10B7 || dev->did == 0x9200)
+       {
+               outputf("Found a 3c905 to bother");
+               
+               _bus = dev->bus;
+               _dev = dev->dev;
+               _fn = dev->fn;
+               found = 1;
+               
+               return 1;
+       }
+       return 0;
+}
+
+void eth_poll()
+{
+       if (!found)
+               return;
+               
+       pci_write16(_bus, _dev, _fn, 0x04, 0xFF);
+       
+       pci_write16(_bus, _dev, _fn, 0x04, 0x00);
+}
+
+void eth_init()
+{
+       pci_probe(bother_3c905, 0x0);
+}
diff --git a/aseg/3c905.h b/aseg/3c905.h
new file mode 100644 (file)
index 0000000..708069b
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef _3C905_H
+#define _3C905_H
+
+extern void eth_init();
+extern void eth_poll();
+
+#endif
index c5f33f4d62a7fdec956cf85f25b1d86146530f53..82836482654c44a016cbc9db8c877ae181632c10 100644 (file)
@@ -1,6 +1,6 @@
 CC=gcc
 CFLAGS=-I../include -I../include/raw -nostdlib -nostdinc -fno-builtin -D__RAW__ -Wall -Werror -pedantic -ansi -std=gnu99
-OBJS=counter.o firstrun.o ../pci/pci-raw.o ../lib/minilib.o ../lib/console.o ../ich2/smram-ich2.o ../ich2/smi.o vga-overlay.o packet.o ../lib/sprintf.o ../lib/doprnt.o ../pci/pci.o
+OBJS=counter.o firstrun.o ../pci/pci-raw.o ../lib/minilib.o ../lib/console.o ../ich2/smram-ich2.o ../ich2/smi.o vga-overlay.o packet.o ../lib/sprintf.o ../lib/doprnt.o ../pci/pci.o 3c905.o
 
 all: aseg.elf
 
index 5c888505b73177cf5362800013b0af86c5f87bd1..eaeec525e7ab11b006ba18c826d0726279791f8c 100644 (file)
@@ -3,6 +3,7 @@
 #include <video_defines.h>
 #include <minilib.h>
 #include <smi.h>
+#include "3c905.h"
 #include "vga-overlay.h"
 #include "packet.h"
 
@@ -100,8 +101,7 @@ void smi_entry(void)
        sprintf(statstr, "15-412! %08x %08x", smi_status(), counter);
        strblit(statstr, 0, 0);
        
-       extern void do_bother();
-       do_bother();
+       eth_poll();
        
        if (inl(0x840) & 0x1000)
        {
index 75bcccc9f85e9966030b19857c558fd9f36c1253..d45bc813336b88bdf28a153c90e1a6b3569fee65 100644 (file)
@@ -5,6 +5,7 @@
 #include <output.h>
 #include "vga-overlay.h"
 #include <smram.h>
+#include "3c905.h"
 
 extern int _bss, _bssend;
 
@@ -12,38 +13,6 @@ extern void timer_handler(smi_event_t ev);
 extern void kbc_handler(smi_event_t ev);
 extern void gbl_rls_handler(smi_event_t ev);
 
-static int found = 0, _bus, _dev, _fn;
-
-void do_bother()
-{
-       int bar;
-
-       if (!found)
-               return;
-               
-       pci_write16(_bus, _dev, _fn, 0x04, 0x00);
-       for (bar = 0; bar < 6; bar++)
-               pci_write32(_bus, _dev, _fn, 0x10 + bar*4, 0x1FFFFFFF);
-}
-
-int bother_3c905(pci_dev_t *dev)
-{
-       if (dev->vid == 0x10B7 || dev->did == 0x9200)
-       {
-               outputf("Found a 3c905 to bother");
-               
-               _bus = dev->bus;
-               _dev = dev->dev;
-               _fn = dev->fn;
-               found = 1;
-               
-               do_bother();
-               
-               return 1;
-       }
-       return 0;
-}
-
 void __firstrun_start() {
        unsigned char *bp;
        smram_state_t smram;
@@ -65,7 +34,7 @@ void __firstrun_start() {
        /* Turn on the SMIs we want */
        smi_disable();
        
-       pci_probe(bother_3c905);
+       eth_init();
        
        smi_register_handler(SMI_EVENT_FAST_TIMER, timer_handler);
        smi_enable_event(SMI_EVENT_FAST_TIMER);
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.039344 seconds and 4 git commands to generate.