From f3f45445b3b3598fcaa3f7ddf3e15ba483ba9e36 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Thu, 7 Sep 2023 14:04:30 -0400 Subject: [PATCH] Determine XHCI controller addresses --- src/hulk/pci.d | 2 ++ src/hulk/usb/xhci.d | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/hulk/pci.d b/src/hulk/pci.d index 48244e3..67224e2 100644 --- a/src/hulk/pci.d +++ b/src/hulk/pci.d @@ -60,6 +60,8 @@ struct Pci { map_memory_regions(); } + + spawn_device_instance(); } private void map_memory_regions() diff --git a/src/hulk/usb/xhci.d b/src/hulk/usb/xhci.d index 8792e2f..f54a8dd 100644 --- a/src/hulk/usb/xhci.d +++ b/src/hulk/usb/xhci.d @@ -10,6 +10,7 @@ module hulk.usb.xhci; import hulk.pci; import hulk.hurl.a1; +import hulk.klog; struct XHCI { @@ -74,8 +75,22 @@ struct XHCI } static assert(DoorbellRegister.sizeof == 4u); + private CapabilityRegisters * m_capability_registers; + private OperationalRegisters * m_operational_registers; + private PortRegisters * m_port_registers; + private RuntimeRegisters * m_runtime_registers; + private DoorbellRegister * m_doorbell_registers; + void initialize(Pci.Device * pci_device) { + void * base_address = pci_device.memory_ranges[0].address; + Klog.writefln("Found XHCI controller at address %x", base_address); + m_capability_registers = cast(CapabilityRegisters *)base_address; + m_operational_registers = cast(OperationalRegisters *)(base_address + m_capability_registers.capability_length); + /* TODO: confirm if 0x400 offset is from m_operation_registers or base_address. */ + 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); } static void build(Pci.Device * pci_device)