diff --git a/src/hulk/pci.d b/src/hulk/pci.d index 3814a4e..53e889c 100644 --- a/src/hulk/pci.d +++ b/src/hulk/pci.d @@ -11,25 +11,28 @@ struct Pci /* 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) + private static ulong read_config_register(ulong bus_id, ulong device_idx, ulong register_id) { - ulong addr = 0x8000_0000u | (bus_id << 16u) | (device_id << 11u) | (register_id << 2u); + ulong addr = 0x8000_0000u | (bus_id << 16u) | (device_idx << 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) + private static void scan(ulong bus_id, ulong device_idx) { - ulong reg0 = read_config_register(bus_id, device_id, 0u); + ulong reg0 = read_config_register(bus_id, device_idx, 0u); if (reg0 != 0xFFFFFFFFu) { - ulong reg2 = read_config_register(bus_id, device_id, 2u); + ulong reg2 = read_config_register(bus_id, device_idx, 2u); + ushort vendor_id = reg0 & 0xFFFFu; + ushort device_id = (reg0 >> 16u) & 0xFFFFu; + ubyte class_code = (reg2 >> 24u) & 0xFFu; + ubyte subclass = (reg2 >> 16u) & 0xFFu; + ubyte prog_if = (reg2 >> 8u) & 0xFFu; 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); + vendor_id, device_id, + class_code, subclass, prog_if, + bus_id, device_idx); } } @@ -38,9 +41,9 @@ struct Pci 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++) + for (ulong device_idx = 0u; device_idx < 32u; device_idx++) { - scan(bus_id, device_id); + scan(bus_id, device_idx); } } Klog.writefln("PCI scan complete.");