From d600e089e593920940050f393faf122af10f5e56 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 10 Jun 2023 11:16:27 -0400 Subject: [PATCH] Add Pci.Device class --- src/hulk/pci.d | 61 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/src/hulk/pci.d b/src/hulk/pci.d index 034aaf5..4178ba9 100644 --- a/src/hulk/pci.d +++ b/src/hulk/pci.d @@ -2,6 +2,7 @@ module hulk.pci; import hulk.cpu; import hulk.klog; +import hulk.hurl.a1; struct Pci { @@ -23,6 +24,43 @@ struct Pci ubyte function_nr; } + struct Device + { + Address address; + ushort vendor_id; + ushort device_id; + ubyte class_id; + ubyte subclass_id; + ubyte if_id; + + void initialize(Address address, ushort vendor_id, ushort device_id) + { + this.vendor_id = vendor_id; + this.device_id = device_id; + uint reg2 = read_config_register(address, 2u); + class_id = (reg2 >> 24u) & 0xFFu; + subclass_id = (reg2 >> 16u) & 0xFFu; + if_id = (reg2 >> 8u) & 0xFFu; + Klog.writefln("Found PCI device %04x:%04x (%02x:%02x:%02x) at %02u:%02u.%u", + vendor_id, device_id, + class_id, subclass_id, if_id, + address.bus_nr, address.device_nr, address.function_nr); + init_device(class_id, subclass_id, if_id); + if (address.function_nr == 0u) + { + uint reg3 = read_config_register(address, 3u); + if ((reg3 & (1u << 23u)) != 0u) + { + /* Multi-function device found. */ + for (address.function_nr = 1u; address.function_nr < 8u; address.function_nr++) + { + scan(address); + } + } + } + } + } + struct SerialBusController { enum ID = 0x0Cu; @@ -91,29 +129,10 @@ struct Pci ulong reg0 = read_config_register(address, 0u); if (reg0 != 0xFFFFFFFFu) { - uint reg2 = read_config_register(address, 2u); ushort vendor_id = reg0 & 0xFFFFu; ushort device_id = (reg0 >> 16u) & 0xFFFFu; - 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.%u", - vendor_id, device_id, - class_id, subclass_id, if_id, - address.bus_nr, address.device_nr, address.function_nr); - init_device(class_id, subclass_id, if_id); - if (address.function_nr == 0u) - { - uint reg3 = read_config_register(address, 3u); - if ((reg3 & (1u << 23u)) != 0u) - { - /* Multi-function device found. */ - for (address.function_nr = 1u; address.function_nr < 8u; address.function_nr++) - { - scan(address); - } - } - } + Device * device = A1.allocate!Device(); + device.initialize(address, vendor_id, device_id); } }