From 8de86dd647e16bb90397fc0b65a17a0eb5fdbf4c Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 7 Jun 2023 16:49:54 -0400 Subject: [PATCH] Add Pci.init_device() skeleton --- src/hulk/pci.d | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/hulk/pci.d b/src/hulk/pci.d index 53e889c..eff3b28 100644 --- a/src/hulk/pci.d +++ b/src/hulk/pci.d @@ -11,6 +11,21 @@ struct Pci /* IO address for PCI configuration data. */ enum IO_ADDR_CONFIG_DATA = 0xCFCu; + struct SerialBusController + { + enum ID = 0x0Cu; + + struct USBController + { + enum ID = 0x03u; + + struct XHCIController + { + enum ID = 0x30u; + } + } + } + private static ulong read_config_register(ulong bus_id, ulong device_idx, ulong register_id) { ulong addr = 0x8000_0000u | (bus_id << 16u) | (device_idx << 11u) | (register_id << 2u); @@ -18,6 +33,32 @@ struct Pci return in32(IO_ADDR_CONFIG_DATA); } + private static void init_device(ubyte class_id, ubyte subclass_id, ubyte if_id) + { + switch (class_id) + { + case SerialBusController.ID: + switch (subclass_id) + { + case SerialBusController.USBController.ID: + switch (if_id) + { + case SerialBusController.USBController.XHCIController.ID: + /* TODO */ + break; + + default: break; + } + break; + + default: break; + } + break; + + default: break; + } + } + private static void scan(ulong bus_id, ulong device_idx) { ulong reg0 = read_config_register(bus_id, device_idx, 0u); @@ -26,13 +67,14 @@ struct Pci 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; + ubyte class_id = (reg2 >> 24u) & 0xFFu; + ubyte subclass_id = (reg2 >> 16u) & 0xFFu; + ubyte if_id = (reg2 >> 8u) & 0xFFu; Klog.writefln("Found PCI device %04x:%04x (%02x:%02x:%02x) at %02u:%02u", vendor_id, device_id, - class_code, subclass, prog_if, + class_id, subclass_id, if_id, bus_id, device_idx); + init_device(class_id, subclass_id, if_id); } }