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."); } }