static Bool FindPciDevice() { Bool retval = FALSE; u32_t bus, last_bus; PCITAG tag; if( (last_bus = PciApi(1))==-1) return retval; for(bus=0;bus<=last_bus;bus++) { u32_t devfn; for(devfn=0;devfn<256;devfn++) { hc_t *hc; u32_t id; u16_t pcicmd; u16_t devclass; int i; devclass = PciRead16(bus,devfn, 0x0A); if( devclass != 0x0C03) continue; pcicmd = PciRead16(bus,devfn, PCI_COMMAND); if (! pcicmd & PCI_COMMAND_IO) continue; hc = (hc_t*)malloc(sizeof(hc_t)); memset(hc, 0, sizeof(hc_t)); link_initialize(&hc->link); hc->pciId = PciRead32(bus,devfn, 0); hc->PciTag = pciTag(bus,(devfn>>3)&0x1F,devfn&0x7); for (i = 0; i < 6; i++) { u32_t base; Bool validSize; base = PciRead32(bus,devfn, PCI_MAP_REG_START + (i << 2)); if(base) { if (base & PCI_MAP_IO) { hc->ioBase[i] = (addr_t)PCIGETIO(base); hc->memType[i] = base & PCI_MAP_IO_ATTR_MASK; } else { hc->memBase[i] = (u32_t)PCIGETMEMORY(base); hc->memType[i] = base & PCI_MAP_MEMORY_ATTR_MASK; } } }; list_prepend(&hc->link, &hc_list); retval = TRUE; }; }; return retval; };