arch/x86/acpi: Add DMAR RMRR helper functions
Add DMAR RMRR table entry and helper functions, using the existing DRHD functions as a model. As the DRHD device scope (DS) functions aren't DRHD-specific, genericize them to be used with RMRR tables as well. Correct DRHD bar size to match table entry in creator function, as noted in comments from patchset below. Adapted from/supersedes https://review.coreboot.org/25445 Change-Id: I912b1d7244ca4dd911bb6629533d453b1b4a06be Signed-off-by: Matt DeVillier <matt.devillier@gmail.com> Reviewed-on: https://review.coreboot.org/27269 Reviewed-by: Youness Alaoui <snifikino@gmail.com> Reviewed-by: Nico Huber <nico.h@gmx.de> Reviewed-by: Jay Talbott <JayTalbott@sysproconsulting.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
committed by
Nico Huber
parent
a6b3b4dd8f
commit
7866d497ad
@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user