mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-25 00:11:07 +00:00
acpi: add MCFG table parsing
This commit is contained in:
parent
002ea7cfc4
commit
ba566a1530
@ -39,6 +39,17 @@ struct Apic_struct
|
|||||||
Apic_struct *next() { return reinterpret_cast<Apic_struct *>((uint8_t *)this + length); }
|
Apic_struct *next() { return reinterpret_cast<Apic_struct *>((uint8_t *)this + length); }
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
struct Mcfg_struct
|
||||||
|
{
|
||||||
|
uint64_t base;
|
||||||
|
uint16_t pci_seg;
|
||||||
|
uint8_t pci_bus_start;
|
||||||
|
uint8_t pci_bus_end;
|
||||||
|
uint32_t reserved;
|
||||||
|
|
||||||
|
Mcfg_struct *next() {
|
||||||
|
return reinterpret_cast<Mcfg_struct *>((uint8_t *)this + sizeof(*this)); }
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
/* ACPI spec 5.2.12.5 */
|
/* ACPI spec 5.2.12.5 */
|
||||||
struct Apic_override : Apic_struct
|
struct Apic_override : Apic_struct
|
||||||
@ -68,6 +79,10 @@ struct Generic
|
|||||||
/* MADT acpi structures */
|
/* MADT acpi structures */
|
||||||
Apic_struct *apic_struct() { return reinterpret_cast<Apic_struct *>(&creator_rev + 3); }
|
Apic_struct *apic_struct() { return reinterpret_cast<Apic_struct *>(&creator_rev + 3); }
|
||||||
Apic_struct *end() { return reinterpret_cast<Apic_struct *>(signature + size); }
|
Apic_struct *end() { return reinterpret_cast<Apic_struct *>(signature + size); }
|
||||||
|
|
||||||
|
/* MCFG ACPI stucture */
|
||||||
|
Mcfg_struct *mcfg_struct() { return reinterpret_cast<Mcfg_struct *>(&creator_rev + 3); }
|
||||||
|
Mcfg_struct *mcfg_end() { return reinterpret_cast<Mcfg_struct *>(signature + size); }
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
|
||||||
@ -186,6 +201,11 @@ class Table_wrapper
|
|||||||
*/
|
*/
|
||||||
bool is_madt() { return _cmp("APIC"); }
|
bool is_madt() { return _cmp("APIC"); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is this a MCFG table
|
||||||
|
*/
|
||||||
|
bool is_mcfg() { return _cmp("MCFG"); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Look for DSDT and SSDT tables
|
* Look for DSDT and SSDT tables
|
||||||
*/
|
*/
|
||||||
@ -209,6 +229,15 @@ class Table_wrapper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void parse_mcfg() const
|
||||||
|
{
|
||||||
|
Mcfg_struct *mcfg = _table->mcfg_struct();
|
||||||
|
for (; mcfg < _table->mcfg_end(); mcfg = mcfg->next()) {
|
||||||
|
PINF("MCFG BASE 0x%llx seg %02x bus %02x-%02x", mcfg->base,
|
||||||
|
mcfg->pci_seg, mcfg->pci_bus_start, mcfg->pci_bus_end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Table_wrapper(addr_t base)
|
Table_wrapper(addr_t base)
|
||||||
: _base(base), _io_mem(0), _table(0)
|
: _base(base), _io_mem(0), _table(0)
|
||||||
{
|
{
|
||||||
@ -927,10 +956,16 @@ class Acpi_table
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (table.is_madt()) {
|
if (table.is_madt()) {
|
||||||
PDBG("Found MADT");
|
PDBG("Found MADT");
|
||||||
|
|
||||||
table.parse_madt();
|
table.parse_madt();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (table.is_mcfg()) {
|
||||||
|
PDBG("Found MCFG");
|
||||||
|
|
||||||
|
table.parse_mcfg();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dsdt) {
|
if (dsdt) {
|
||||||
|
Loading…
Reference in New Issue
Block a user