Assign PCI header fields to named variables

This commit is contained in:
Josh Holtrop 2023-02-24 20:53:46 -05:00
parent f5e5c40c12
commit cc891f6d4d

View File

@ -11,25 +11,28 @@ struct Pci
/* IO address for PCI configuration data. */ /* IO address for PCI configuration data. */
enum IO_ADDR_CONFIG_DATA = 0xCFCu; 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); out32(IO_ADDR_CONFIG_ADDRESS, addr);
return in32(IO_ADDR_CONFIG_DATA); 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) 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", Klog.writefln("Found PCI device %04x:%04x (%02x:%02x:%02x) at %02u:%02u",
(reg0 & 0xFFFFu), (reg0 >> 16u), vendor_id, device_id,
(reg2 >> 24u) & 0xFFu, class_code, subclass, prog_if,
(reg2 >> 16u) & 0xFFu, bus_id, device_idx);
(reg2 >> 8u) & 0xFFu,
bus_id, device_id);
} }
} }
@ -38,9 +41,9 @@ struct Pci
Klog.writefln("Scanning PCI devices..."); Klog.writefln("Scanning PCI devices...");
for (ulong bus_id = 0u; bus_id < 256u; bus_id++) 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."); Klog.writefln("PCI scan complete.");