i read the vendor's id, and skip device if is 0xFFFF.
Code: Select all
int pci_read(int bus, int dev, int func, int reg)
{
outportl(0xCF8, ((unsigned long) 0x80000000 | (bus << 16) | (dev << 11) | (func << 8) | reg));
return inportl(0xCFC);
}
PCI_Device_t* pci_readdevice(int bus, int dev, int func)
{
PCI_Device_t* ret;
ret->VendorID = (short) (pci_read(bus,dev,func,0)&0x0000FFFF);
ret->DeviceID = (short)((pci_read(bus,dev,func,0)&0xFFFF0000) >> 16);
ret->CommandReg = (short) (pci_read(bus,dev,func,4)&0x0000FFFF);
ret->StatusReg = (short)((pci_read(bus,dev,func,4)&0xFFFF0000) >> 16);
ret->RevisionID = (short) (pci_read(bus,dev,func,8)&0x0000FFFF);
ret->SubClass = (char) ((pci_read(bus,dev,func,8)&0x00FF0000) >> 16);
ret->ClassCode = (char) ((pci_read(bus,dev,func,8)&0xFF000000) >> 24);
ret->CachelineSize = (char) (pci_read(bus,dev,func,12)&0x000000FF);
ret->Latency = (char) ((pci_read(bus,dev,func,12)&0x0000FF00) >> 8);
ret->HeaderType = (char) ((pci_read(bus,dev,func,12)&0x00FF0000) >> 16);
ret->BIST = (char) ((pci_read(bus,dev,func,12)&0xFF000000) >> 24);
ret->BAR0 = pci_read(bus, dev, func, 16);
ret->BAR1 = pci_read(bus, dev, func, 20);
ret->BAR2 = pci_read(bus, dev, func, 24);
ret->BAR3 = pci_read(bus, dev, func, 28);
ret->BAR4 = pci_read(bus, dev, func, 32);
ret->BAR5 = pci_read(bus, dev, func, 36);
ret->CardbusCISPtr = pci_read(bus, dev, func, 40);
ret->SubVendorID = (short) (pci_read(bus,dev,func,44)&0x0000FFFF);
ret->SubDeviceID = (short)((pci_read(bus,dev,func,44)&0xFFFF0000) >> 16);
ret->ExRomAddress = pci_read(bus, dev, func, 48);
ret->Reserved1 = pci_read(bus, dev, func, 52);
ret->Reserved2 = pci_read(bus, dev, func, 56);
ret->IRQ = (char) (pci_read(bus,dev,func,60)&0x000000FF);
ret->PIN = (char) ((pci_read(bus,dev,func,60)&0x0000FF00) >> 8);
ret->MinGrant = (char) ((pci_read(bus,dev,func,60)&0x00FF0000) >> 16);
ret->MaxLatency = (char) ((pci_read(bus,dev,func,60)&0xFF000000) >> 24);
return ret;
}
void scanpci()
{
int bus, dev, func, i;
i=0;
PCI_Device_t* device;
printf("PCI Scan...\n");
for (bus = 0; bus < 255; bus++)
{
putch('-');
for (dev = 0; dev < 32; dev++)
{
for (func = 0; func < 8; func++)
{
device = pci_readdevice(bus, dev, func);
if(device->VendorID != 0xFFFF)
{
i++;
printf("\n--bus %u|device %u|function %u|has Vendor ID = 0x%x and Device ID = 0x%x", bus, dev, func, device->VendorID, device->DeviceID);
}
//else
//printf("\n--bus %u | device %u | function %u | is null", bus, dev, func);
}
}
}
printf("Scan complete! %u devices found!", i);
}