diff options
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/x86/acpi.c | 40 | ||||
-rw-r--r-- | src/arch/x86/include/arch/acpi.h | 22 |
2 files changed, 47 insertions, 15 deletions
diff --git a/src/arch/x86/acpi.c b/src/arch/x86/acpi.c index 8b6b2c1d28..60d2879219 100644 --- a/src/arch/x86/acpi.c +++ b/src/arch/x86/acpi.c @@ -449,7 +449,7 @@ void acpi_create_dmar(acpi_dmar_t *dmar, enum dmar_flags flags, } unsigned long acpi_create_dmar_drhd(unsigned long current, u8 flags, - u16 segment, u32 bar) + u16 segment, u64 bar) { dmar_entry_t *drhd = (dmar_entry_t *)current; memset(drhd, 0, sizeof(*drhd)); @@ -462,6 +462,20 @@ unsigned long acpi_create_dmar_drhd(unsigned long current, u8 flags, return drhd->length; } +unsigned long acpi_create_dmar_rmrr(unsigned long current, u16 segment, + u64 bar, u64 limit) +{ + dmar_rmrr_entry_t *rmrr = (dmar_rmrr_entry_t *)current; + memset(rmrr, 0, sizeof(*rmrr)); + rmrr->type = DMAR_RMRR; + rmrr->length = sizeof(*rmrr); /* will be fixed up later */ + rmrr->segment = segment; + rmrr->bar = bar; + rmrr->limit = limit; + + return rmrr->length; +} + unsigned long acpi_create_dmar_atsr(unsigned long current, u8 flags, u16 segment) { @@ -481,13 +495,19 @@ void acpi_dmar_drhd_fixup(unsigned long base, unsigned long current) drhd->length = current - base; } +void acpi_dmar_rmrr_fixup(unsigned long base, unsigned long current) +{ + dmar_rmrr_entry_t *rmrr = (dmar_rmrr_entry_t *)base; + rmrr->length = current - base; +} + void acpi_dmar_atsr_fixup(unsigned long base, unsigned long current) { dmar_atsr_entry_t *atsr = (dmar_atsr_entry_t *)base; atsr->length = current - base; } -static unsigned long acpi_create_dmar_drhd_ds(unsigned long current, +static unsigned long acpi_create_dmar_ds(unsigned long current, enum dev_scope_type type, u8 enumeration_id, u8 bus, u8 dev, u8 fn) { /* we don't support longer paths yet */ @@ -505,31 +525,31 @@ static unsigned long acpi_create_dmar_drhd_ds(unsigned long current, return ds->length; } -unsigned long acpi_create_dmar_drhd_ds_pci_br(unsigned long current, u8 bus, +unsigned long acpi_create_dmar_ds_pci_br(unsigned long current, u8 bus, u8 dev, u8 fn) { - return acpi_create_dmar_drhd_ds(current, + return acpi_create_dmar_ds(current, SCOPE_PCI_SUB, 0, bus, dev, fn); } -unsigned long acpi_create_dmar_drhd_ds_pci(unsigned long current, u8 bus, +unsigned long acpi_create_dmar_ds_pci(unsigned long current, u8 bus, u8 dev, u8 fn) { - return acpi_create_dmar_drhd_ds(current, + return acpi_create_dmar_ds(current, SCOPE_PCI_ENDPOINT, 0, bus, dev, fn); } -unsigned long acpi_create_dmar_drhd_ds_ioapic(unsigned long current, +unsigned long acpi_create_dmar_ds_ioapic(unsigned long current, u8 enumeration_id, u8 bus, u8 dev, u8 fn) { - return acpi_create_dmar_drhd_ds(current, + return acpi_create_dmar_ds(current, SCOPE_IOAPIC, enumeration_id, bus, dev, fn); } -unsigned long acpi_create_dmar_drhd_ds_msi_hpet(unsigned long current, +unsigned long acpi_create_dmar_ds_msi_hpet(unsigned long current, u8 enumeration_id, u8 bus, u8 dev, u8 fn) { - return acpi_create_dmar_drhd_ds(current, + return acpi_create_dmar_ds(current, SCOPE_MSI_HPET, enumeration_id, bus, dev, fn); } diff --git a/src/arch/x86/include/arch/acpi.h b/src/arch/x86/include/arch/acpi.h index f5e2e81c81..1811965963 100644 --- a/src/arch/x86/include/arch/acpi.h +++ b/src/arch/x86/include/arch/acpi.h @@ -331,6 +331,15 @@ typedef struct dmar_entry { u64 bar; } __packed dmar_entry_t; +typedef struct dmar_rmrr_entry { + u16 type; + u16 length; + u16 reserved; + u16 segment; + u64 bar; + u64 limit; +} __packed dmar_rmrr_entry_t; + typedef struct dmar_atsr_entry { u16 type; u16 length; @@ -738,19 +747,22 @@ unsigned long acpi_write_dbg2_pci_uart(acpi_rsdp_t *rsdp, unsigned long current, void acpi_create_dmar(acpi_dmar_t *dmar, enum dmar_flags flags, unsigned long (*acpi_fill_dmar)(unsigned long)); unsigned long acpi_create_dmar_drhd(unsigned long current, u8 flags, - u16 segment, u32 bar); + u16 segment, u64 bar); +unsigned long acpi_create_dmar_rmrr(unsigned long current, u16 segment, + u64 bar, u64 limit); unsigned long acpi_create_dmar_atsr(unsigned long current, u8 flags, u16 segment); void acpi_dmar_drhd_fixup(unsigned long base, unsigned long current); +void acpi_dmar_rmrr_fixup(unsigned long base, unsigned long current); void acpi_dmar_atsr_fixup(unsigned long base, unsigned long current); -unsigned long acpi_create_dmar_drhd_ds_pci_br(unsigned long current, +unsigned long acpi_create_dmar_ds_pci_br(unsigned long current, u8 bus, u8 dev, u8 fn); -unsigned long acpi_create_dmar_drhd_ds_pci(unsigned long current, +unsigned long acpi_create_dmar_ds_pci(unsigned long current, u8 bus, u8 dev, u8 fn); -unsigned long acpi_create_dmar_drhd_ds_ioapic(unsigned long current, +unsigned long acpi_create_dmar_ds_ioapic(unsigned long current, u8 enumeration_id, u8 bus, u8 dev, u8 fn); -unsigned long acpi_create_dmar_drhd_ds_msi_hpet(unsigned long current, +unsigned long acpi_create_dmar_ds_msi_hpet(unsigned long current, u8 enumeration_id, u8 bus, u8 dev, u8 fn); void acpi_write_hest(acpi_hest_t *hest, |