diff options
author | Jonathan Zhang <jonzhang@fb.com> | 2021-04-01 11:43:37 -0700 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2021-05-14 08:56:59 +0000 |
commit | 2a4e1f4b470c73411a46290989c55165cd7968c9 (patch) | |
tree | f39324f8640f3a2065674fb6a04504423b3b5024 /src/acpi | |
parent | 08ba703791c3860d25773f88c6c6206c74935d51 (diff) |
src/acpi: Add initial support for HMAT
Add initial HMAT (Heterogeneous Memory Attribute Table) support based
on ACPI spec 6.4 section 5.2.27.
Add functions to create HMAT table (revision 2) and create HMAT Memory
Proximity Domain Attribute (MPDA) Structure.
TESTED=Simulated HMAT table creation on OCP DeltaLake server, dumped
the HMAT table and exmained the content. HMAT table and one MPDA
structure are added.
OCP Delatake server is based on Intel CooperLake Scalable Processor
which does not support CXL (Compute Express Link). Therefore solution
level testing is not done.
Signed-off-by: Jonathan Zhang <jonzhang@fb.com>
Change-Id: I5ee60ff990c3cea799c5cbdf7eead818b1bb4f9b
Reviewed-on: https://review.coreboot.org/c/coreboot/+/52047
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Diffstat (limited to 'src/acpi')
-rw-r--r-- | src/acpi/acpi.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/acpi/acpi.c b/src/acpi/acpi.c index 5c3fe13614..35c5ec3602 100644 --- a/src/acpi/acpi.c +++ b/src/acpi/acpi.c @@ -539,6 +539,51 @@ void acpi_create_srat(acpi_srat_t *srat, header->checksum = acpi_checksum((void *)srat, header->length); } +int acpi_create_hmat_mpda(acpi_hmat_mpda_t *mpda, u32 initiator, u32 memory) +{ + memset((void *)mpda, 0, sizeof(acpi_hmat_mpda_t)); + + mpda->type = 0; /* Memory Proximity Domain Attributes structure */ + mpda->length = sizeof(acpi_hmat_mpda_t); + /* + * Proximity Domain for Attached Initiator field is valid. + * Bit 1 and bit 2 are reserved since HMAT revision 2. + */ + mpda->flags = (1 << 0); + mpda->proximity_domain_initiator = initiator; + mpda->proximity_domain_memory = memory; + + return mpda->length; +} + +void acpi_create_hmat(acpi_hmat_t *hmat, + unsigned long (*acpi_fill_hmat)(unsigned long current)) +{ + acpi_header_t *header = &(hmat->header); + unsigned long current = (unsigned long)hmat + sizeof(acpi_hmat_t); + + memset((void *)hmat, 0, sizeof(acpi_hmat_t)); + + if (!header) + return; + + /* Fill out header fields. */ + memcpy(header->signature, "HMAT", 4); + memcpy(header->oem_id, OEM_ID, 6); + memcpy(header->oem_table_id, ACPI_TABLE_CREATOR, 8); + memcpy(header->asl_compiler_id, ASLC, 4); + + header->asl_compiler_revision = asl_revision; + header->length = sizeof(acpi_hmat_t); + header->revision = get_acpi_table_revision(HMAT); + + current = acpi_fill_hmat(current); + + /* (Re)calculate length and checksum. */ + header->length = current - (unsigned long)hmat; + header->checksum = acpi_checksum((void *)hmat, header->length); +} + void acpi_create_dmar(acpi_dmar_t *dmar, enum dmar_flags flags, unsigned long (*acpi_fill_dmar)(unsigned long)) { @@ -1880,6 +1925,8 @@ int get_acpi_table_revision(enum acpi_tables table) return 2; case SRAT: /* ACPI 2.0: 1, ACPI 3.0: 2, ACPI 4.0 upto 6.3: 3 */ return 1; /* TODO Should probably be upgraded to 2 */ + case HMAT: /* ACPI 6.4: 2 */ + return 2; case DMAR: return 1; case SLIT: /* ACPI 2.0 upto 6.3: 1 */ |