Begin parsing MCFG ACPI table
This commit is contained in:
parent
602a7525d2
commit
6514af8e94
@ -9,8 +9,14 @@ import hulk.memory;
|
|||||||
|
|
||||||
struct Acpi
|
struct Acpi
|
||||||
{
|
{
|
||||||
enum uint APIC_SIGNATURE = 0x43495041u;
|
static uint signature(string s)
|
||||||
enum uint XSDT_SIGNATURE = 0x54445358u;
|
{
|
||||||
|
return s[0] | (s[1] << 8) | (s[2] << 16) | (s[3] << 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum uint APIC_SIGNATURE = signature("APIC");
|
||||||
|
enum uint MCFG_SIGNATURE = signature("MCFG");
|
||||||
|
enum uint XSDT_SIGNATURE = signature("XSDT");
|
||||||
|
|
||||||
static align(4) struct XsdtHeader
|
static align(4) struct XsdtHeader
|
||||||
{
|
{
|
||||||
@ -53,6 +59,38 @@ struct Acpi
|
|||||||
ubyte length;
|
ubyte length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct MCFGTable
|
||||||
|
{
|
||||||
|
/* PCI Segment Group Memory Area Descriptor. */
|
||||||
|
static struct SGMADesc
|
||||||
|
{
|
||||||
|
uint[2] base_address_a;
|
||||||
|
ushort pci_segment_group_number;
|
||||||
|
ubyte start_pci_bus_number;
|
||||||
|
ubyte end_pci_bus_number;
|
||||||
|
uint _reserved;
|
||||||
|
|
||||||
|
public @property ulong base_address() const
|
||||||
|
{
|
||||||
|
return base_address_a[0] | (cast(ulong)base_address_a[1] << 32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static assert(SGMADesc.sizeof == 16);
|
||||||
|
static assert(SGMADesc.alignof == 4);
|
||||||
|
|
||||||
|
uint signature;
|
||||||
|
uint length;
|
||||||
|
ubyte revision;
|
||||||
|
ubyte checksum;
|
||||||
|
char[6] oemid;
|
||||||
|
ulong oemtableid;
|
||||||
|
uint oem_revision;
|
||||||
|
uint creator_id;
|
||||||
|
uint creator_revision;
|
||||||
|
uint[2] _reserved;
|
||||||
|
SGMADesc[0] sgma_descs;
|
||||||
|
}
|
||||||
|
|
||||||
public static __gshared ulong apic_address;
|
public static __gshared ulong apic_address;
|
||||||
|
|
||||||
public static void initialize(ulong acpi_xsdt_phys)
|
public static void initialize(ulong acpi_xsdt_phys)
|
||||||
@ -83,6 +121,10 @@ struct Acpi
|
|||||||
{
|
{
|
||||||
parse_apic_table(address);
|
parse_apic_table(address);
|
||||||
}
|
}
|
||||||
|
else if (signature == MCFG_SIGNATURE)
|
||||||
|
{
|
||||||
|
parse_mcfg_table(address);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,4 +147,21 @@ struct Acpi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static parse_mcfg_table(ulong address)
|
||||||
|
{
|
||||||
|
const(MCFGTable) * mcfg_table = cast(const(MCFGTable) *)address;
|
||||||
|
Hurl.identity_map_range(address, mcfg_table.length, 0u);
|
||||||
|
Klog.writefln("MCFG length = %u", mcfg_table.length);
|
||||||
|
size_t n_sgma_descs = (mcfg_table.length - MCFGTable.sgma_descs.offsetof) / MCFGTable.SGMADesc.sizeof;
|
||||||
|
Klog.writefln("# SGMA descriptors = %u", (mcfg_table.length - MCFGTable.sgma_descs.offsetof) / MCFGTable.SGMADesc.sizeof);
|
||||||
|
for (size_t i = 0; i < n_sgma_descs; i++)
|
||||||
|
{
|
||||||
|
Klog.writefln("SGMA %u: SG %u; Bus %u-%u; addr %p",
|
||||||
|
i, mcfg_table.sgma_descs[i].pci_segment_group_number,
|
||||||
|
mcfg_table.sgma_descs[i].start_pci_bus_number,
|
||||||
|
mcfg_table.sgma_descs[i].end_pci_bus_number,
|
||||||
|
mcfg_table.sgma_descs[i].base_address);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,7 +84,7 @@ struct XHCI
|
|||||||
void initialize(Pci.Device * pci_device)
|
void initialize(Pci.Device * pci_device)
|
||||||
{
|
{
|
||||||
void * base_address = pci_device.memory_ranges[0].address;
|
void * base_address = pci_device.memory_ranges[0].address;
|
||||||
Klog.writefln("Found XHCI controller at address %x", base_address);
|
Klog.writefln("Found XHCI controller at address %p", base_address);
|
||||||
m_capability_registers = cast(CapabilityRegisters *)base_address;
|
m_capability_registers = cast(CapabilityRegisters *)base_address;
|
||||||
m_operational_registers = cast(OperationalRegisters *)(base_address + m_capability_registers.capability_length);
|
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. */
|
/* TODO: confirm if 0x400 offset is from m_operation_registers or base_address. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user