0,0 → 1,63 |
|
|
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; |
}; |