diff options
author | John Zhao <john.zhao@intel.com> | 2021-03-24 11:55:09 -0700 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2021-03-28 16:03:21 +0000 |
commit | 6edbb18901565d60bc61fda9ac75da08cb94ff84 (patch) | |
tree | 75915c7398933b6bcf2047342e63229d9c57981c | |
parent | 56eb876c40205dacb48d2a942a9548e05ad6f0e0 (diff) |
ACPI: Add SATC structure for DMAR table
The SoC integrated address translation cache(SATC) reporting structure
is added to Virtualization Technology for Directed I/O specification
Rev3.2. This change adds an ACPI Name-Space Device Declaration structure
SATC which has type 5 reporting structure.
BUG=None
TEST=Built image successfully.
Signed-off-by: John Zhao <john.zhao@intel.com>
Change-Id: I91d1384083c98b75bcbdddd9cc7b7a26fab25d9d
Reviewed-on: https://review.coreboot.org/c/coreboot/+/51776
Reviewed-by: Lance Zhao
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r-- | src/acpi/acpi.c | 21 | ||||
-rw-r--r-- | src/include/acpi/acpi.h | 15 |
2 files changed, 35 insertions, 1 deletions
diff --git a/src/acpi/acpi.c b/src/acpi/acpi.c index 867e163c99..b350bc389e 100644 --- a/src/acpi/acpi.c +++ b/src/acpi/acpi.c @@ -638,6 +638,21 @@ unsigned long acpi_create_dmar_andd(unsigned long current, u8 device_number, return andd->length; } +unsigned long acpi_create_dmar_satc(unsigned long current, u8 flags, + u16 segment, const char *device_scope) +{ + dmar_satc_entry_t *satc = (dmar_satc_entry_t *)current; + int satc_len = sizeof(dmar_satc_entry_t) + strlen(device_scope) + 1; + memset(satc, 0, satc_len); + satc->type = DMAR_SATC; + satc->length = satc_len; + satc->flags = flags; + satc->segment_number = segment; + memcpy(&satc->device_scope, device_scope, strlen(device_scope)); + + return satc->length; +} + void acpi_dmar_drhd_fixup(unsigned long base, unsigned long current) { dmar_entry_t *drhd = (dmar_entry_t *)base; @@ -656,6 +671,12 @@ void acpi_dmar_atsr_fixup(unsigned long base, unsigned long current) atsr->length = current - base; } +void acpi_dmar_satc_fixup(unsigned long base, unsigned long current) +{ + dmar_satc_entry_t *satc = (dmar_satc_entry_t *)base; + satc->length = current - base; +} + static unsigned long acpi_create_dmar_ds(unsigned long current, enum dev_scope_type type, u8 enumeration_id, u8 bus, u8 dev, u8 fn) { diff --git a/src/include/acpi/acpi.h b/src/include/acpi/acpi.h index 775fc316e7..932fb6fee8 100644 --- a/src/include/acpi/acpi.h +++ b/src/include/acpi/acpi.h @@ -410,7 +410,8 @@ enum dmar_type { DMAR_RMRR = 1, DMAR_ATSR = 2, DMAR_RHSA = 3, - DMAR_ANDD = 4 + DMAR_ANDD = 4, + DMAR_SATC = 5 }; enum { @@ -465,6 +466,15 @@ typedef struct dmar_andd_entry { u8 device_name[]; } __packed dmar_andd_entry_t; +typedef struct dmar_satc_entry { + u16 type; + u16 length; + u8 flags; + u8 reserved; + u16 segment_number; + u8 device_scope[]; +} __packed dmar_satc_entry_t; + /* DMAR (DMA Remapping Reporting Structure) */ typedef struct acpi_dmar { acpi_header_t header; @@ -1055,9 +1065,12 @@ unsigned long acpi_create_dmar_rhsa(unsigned long current, u64 base_addr, u32 proximity_domain); unsigned long acpi_create_dmar_andd(unsigned long current, u8 device_number, const char *device_name); +unsigned long acpi_create_dmar_satc(unsigned long current, u8 flags, + u16 segment, const char *device_scope); 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); +void acpi_dmar_satc_fixup(unsigned long base, 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_ds_pci(unsigned long current, |