49 lines
1.4 KiB
D
49 lines
1.4 KiB
D
module hulk.pci;
|
|
|
|
import hulk.cpu;
|
|
import hulk.klog;
|
|
|
|
struct pci
|
|
{
|
|
/* IO address for PCI configuration address. */
|
|
enum IO_ADDR_CONFIG_ADDRESS = 0xCF8u;
|
|
|
|
/* IO address for PCI configuration data. */
|
|
enum IO_ADDR_CONFIG_DATA = 0xCFCu;
|
|
|
|
private static ulong read_config_register(ulong bus_id, ulong device_id, ulong register_id)
|
|
{
|
|
ulong addr = 0x8000_0000u | (bus_id << 16u) | (device_id << 11u) | (register_id << 2u);
|
|
out32(IO_ADDR_CONFIG_ADDRESS, addr);
|
|
return in32(IO_ADDR_CONFIG_DATA);
|
|
}
|
|
|
|
private static void scan(ulong bus_id, ulong device_id)
|
|
{
|
|
ulong reg0 = read_config_register(bus_id, device_id, 0u);
|
|
if (reg0 != 0xFFFFFFFFu)
|
|
{
|
|
ulong reg2 = read_config_register(bus_id, device_id, 2u);
|
|
klog.writefln("Found PCI device %04x:%04x (%02x:%02x:%02x) at %02u:%02u",
|
|
(reg0 & 0xFFFFu), (reg0 >> 16u),
|
|
(reg2 >> 24u) & 0xFFu,
|
|
(reg2 >> 16u) & 0xFFu,
|
|
(reg2 >> 8u) & 0xFFu,
|
|
bus_id, device_id);
|
|
}
|
|
}
|
|
|
|
public static void initialize()
|
|
{
|
|
klog.writefln("Scanning PCI devices...");
|
|
for (ulong bus_id = 0u; bus_id < 256u; bus_id++)
|
|
{
|
|
for (ulong device_id = 0u; device_id < 32u; device_id++)
|
|
{
|
|
scan(bus_id, device_id);
|
|
}
|
|
}
|
|
klog.writefln("PCI scan complete.");
|
|
}
|
|
}
|