From 4814b51daf3898e25bcbf87fe2d03e0fcd4c5fb1 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Tue, 19 Sep 2023 11:07:18 -0400 Subject: [PATCH] Dump xHCI extended capabilities --- src/hulk/usb/xhci.d | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/hulk/usb/xhci.d b/src/hulk/usb/xhci.d index 1eaf5ef..7a106b6 100644 --- a/src/hulk/usb/xhci.d +++ b/src/hulk/usb/xhci.d @@ -177,6 +177,47 @@ struct XHCI m_port_registers = cast(PortRegisters *)(cast(void *)m_operational_registers + 0x400); m_runtime_registers = cast(RuntimeRegisters *)(base_address + m_capability_registers.rts_offset); m_doorbell_registers = cast(DoorbellRegister *)(base_address + m_capability_registers.doorbell_offset); + dump_extended_capabilities(); + } + + private void dump_extended_capabilities() + { + size_t ext_cap_off = (m_capability_registers.hcc_params1 >> 16u); + if (ext_cap_off != 0u) + { + Klog.writefln("Extended capabilities:"); + uint * extended_capabilities = cast(uint *)m_capability_registers + ext_cap_off; + for (;;) + { + uint ec0 = extended_capabilities[0]; + size_t next_offset = (ec0 >> 8u) & 0xFFu; + size_t len = next_offset; + if (len < 1u) + { + len = 1u; + } + ubyte type = ec0 & 0xFFu; + if (type == 2u) + { + len = 4u; + } + for (size_t i = 0u; i < len; i++) + { + uint ecv = extended_capabilities[i]; + Klog.writef(" %02X %02X %02X %02X", + ecv & 0xFFu, + (ecv >> 8u) & 0xFFu, + (ecv >> 16u) & 0xFFu, + (ecv >> 24u) & 0xFFu); + } + Klog.writef("\n"); + if (next_offset == 0u) + { + break; + } + extended_capabilities += next_offset; + } + } } static void build(Pci.Device * pci_device)