Ethersel must use the pci com32 module instead of builtin pci detection code
authorErwan Velu <erwan@seanodes.com>
Thu, 8 Feb 2007 20:39:47 +0000 (21:39 +0100)
committerH. Peter Anvin <hpa@zytor.com>
Wed, 7 Mar 2007 19:04:11 +0000 (11:04 -0800)
 From : Erwan Velu <erwan.velu@free.fr>

This patch
- remove the pci detection code from ethersel
- add a find_pci_device() function in the PCI com32 module
- make ethersel using the pci com32 module instead of builtin pci
detection code

Testing and feedback are welcome.

Signed-off-by:Erwan Velu <erwan.velu@free.fr>

com32/include/sys/pci.h
com32/modules/Makefile
com32/modules/ethersel.c
com32/modules/pci.c

index b309958..4862cda 100644 (file)
@@ -37,6 +37,16 @@ typedef struct {
        uint8_t count;
 } s_pci_bus_list;
 
+struct match {
+  struct match *next;
+  uint32_t did;
+  uint32_t did_mask;
+  uint32_t sid;
+  uint32_t sid_mask;
+  uint8_t rid_min, rid_max;
+  char *filename;
+};
+
 static inline pciaddr_t pci_mkaddr(uint32_t bus, uint32_t dev,
                                   uint32_t func, uint32_t reg)
 {
@@ -62,4 +72,5 @@ void pci_writew(uint16_t, pciaddr_t);
 void pci_writel(uint32_t, pciaddr_t);
 
 extern int pci_scan(s_pci_bus_list *pci_bus_list, s_pci_device_list *pci_device_list);
+extern struct match * find_pci_device(s_pci_device_list *pci_device_list, struct match *list);
 #endif /* _SYS_PCI_H */
index 877ce39..297e1b1 100644 (file)
@@ -91,6 +91,9 @@ menu.elf : menu.o menumain.o readconfig.o $(LIBS)
 vesamenu.elf : vesamenu.o menumain.o readconfig.o $(LIBS)
        $(LD) $(LDFLAGS) -o $@ $^
 
+ethersel.elf : ethersel.o pci.o $(LIBS)
+       $(LD) $(LDFLAGS) -o $@ $^
+
 menu.lnx : menu.lo readconfig.lo $(LNXLIBS)
        $(CC) $(LNXLDFLAGS) -o $@ $^
 
index 4d17ca5..c3f99fe 100644 (file)
 # define dprintf(...) ((void)0)
 #endif
 
-struct match {
-  struct match *next;
-  uint32_t did;
-  uint32_t did_mask;
-  uint32_t sid;
-  uint32_t sid_mask;
-  uint8_t rid_min, rid_max;
-  char *filename;
-};
-
 static const char *
 get_config(void)
 {
@@ -201,68 +191,6 @@ parse_config(const char *filename)
   return list;
 }
 
-static struct match *
-pciscan(struct match *list)
-{
-  unsigned int bus, dev, func, maxfunc;
-  uint32_t did, sid;
-  uint8_t hdrtype, rid;
-  pciaddr_t a;
-  struct match *m;
-  int cfgtype;
-
-#ifdef DEBUG
-  outl(~0, 0xcf8);
-  printf("Poking at port CF8 = %#08x\n", inl(0xcf8));
-  outl(0, 0xcf8);
-#endif
-
-  cfgtype = pci_set_config_type(PCI_CFG_AUTO);
-  (void)cfgtype;
-
-  dprintf("PCI configuration type %d\n", cfgtype);
-
-  for ( bus = 0 ; bus <= 0xff ; bus++ ) {
-
-    dprintf("Probing bus 0x%02x... \n", bus);
-
-    for ( dev = 0 ; dev <= 0x1f ; dev++ ) {
-      maxfunc = 0;
-      for ( func = 0 ; func <= maxfunc ; func++ ) {
-       a = pci_mkaddr(bus, dev, func, 0);
-
-       did = pci_readl(a);
-
-       if ( did == 0xffffffff || did == 0xffff0000 ||
-            did == 0x0000ffff || did == 0x00000000 )
-         continue;
-
-       hdrtype = pci_readb(a + 0x0e);
-
-       if ( hdrtype & 0x80 )
-         maxfunc = 7;          /* Multifunction device */
-
-       if ( hdrtype & 0x7f )
-         continue;             /* Ignore bridge devices */
-
-       rid = pci_readb(a + 0x08);
-       sid = pci_readl(a + 0x2c);
-
-       dprintf("Scanning: DID %08x SID %08x RID %02x\n", did, sid, rid);
-
-       for ( m = list ; m ; m = m->next ) {
-         if ( ((did ^ m->did) & m->did_mask) == 0 &&
-              ((sid ^ m->sid) & m->sid_mask) == 0 &&
-              rid >= m->rid_min && rid <= m->rid_max )
-           return m;
-       }
-      }
-    }
-  }
-
-  return NULL;
-}
-
 static void __attribute__((noreturn))
 execute(const char *cmdline)
 {
@@ -279,12 +207,15 @@ execute(const char *cmdline)
 int main(int argc, char *argv[])
 {
   struct match *list, *match;
+  s_pci_device_list pci_device_list;
+  s_pci_bus_list pci_bus_list;
 
   openconsole(&dev_null_r, &dev_stdcon_w);
+  pci_scan(&pci_bus_list,&pci_device_list);
 
   list = parse_config(argc < 2 ? NULL : argv[1]);
 
-  match = pciscan(list);
+  match = find_pci_device(&pci_device_list,list);
 
   if ( match )
     execute(match->filename);
index 3d83db1..4eb8f98 100644 (file)
@@ -113,6 +113,26 @@ void get_name_from_pci_ids(s_pci_device *pci_device)
  fclose(f);
 }
 
+struct match * find_pci_device(s_pci_device_list *pci_device_list, struct match *list) {
+        int pci_dev;
+       uint32_t did,sid;
+       struct match *m;
+        for (pci_dev=0; pci_dev<pci_device_list->count;pci_dev++) {
+                s_pci_device *pci_device = &pci_device_list->pci_device[pci_dev];
+               sid=((pci_device->sub_product)<<16 | (pci_device->sub_vendor));
+               did=((pci_device->product<<16) | (pci_device->vendor));
+               for ( m = list ; m ; m = m->next ) {
+                       if ( ((did ^ m->did) & m->did_mask) == 0 &&
+                               ((sid ^ m->sid) & m->sid_mask) == 0 &&
+                               pci_device->revision >= m->rid_min && pci_device->revision <= m->rid_max ) {
+                               dprintf("PCI Match: Vendor=%04x Product=%04x Sub_vendor=%04x Sub_Product=%04x Release=%02x\n",pci_device->vendor,pci_device->product,pci_device->sub_vendor,pci_device->sub_product,pci_device->revision);
+                               return m;
+                       }
+               }
+        }
+       return NULL;
+}
+
 int pci_scan(s_pci_bus_list *pci_bus_list, s_pci_device_list *pci_device_list)
 {
   unsigned int bus, dev, func, maxfunc;