diff --git a/src/include/nhlt.h b/src/include/nhlt.h index ca1669381c..f0b3b6f5e7 100644 --- a/src/include/nhlt.h +++ b/src/include/nhlt.h @@ -124,6 +124,15 @@ void nhlt_next_instance(struct nhlt *nhlt, int link_type); */ uintptr_t nhlt_serialize(struct nhlt *nhlt, uintptr_t acpi_addr); +/* + * Serialize NHLT object to ACPI table. Take in the beginning address of where + * the table will reside oem_id and oem_table_id and return the address of the + * next ACPI table. On error 0 will be returned. The NHLT object is no longer + * valid after thisfunction is called. + */ +uintptr_t nhlt_serialize_oem_overrides(struct nhlt *nhlt, uintptr_t acpi_addr, + const char *oem_id, const char *oem_table_id); + /* * While very similar to nhlt_serialize() the SoC specific function allows * the chipset to perform any needed accounting work such as updating ACPI @@ -131,6 +140,14 @@ uintptr_t nhlt_serialize(struct nhlt *nhlt, uintptr_t acpi_addr); */ uintptr_t nhlt_soc_serialize(struct nhlt *nhlt, uintptr_t acpi_addr); +/* + * While very similar to nhlt_serialize_oem_overrides() the SoC specific + * function allows the chipset to perform any needed accounting work such + * as updating ACPI field references for the serialized structure. + */ +uintptr_t nhlt_soc_serialize_oem_overrides(struct nhlt *nhlt, + uintptr_t acpi_addr, const char *oem_id, const char *oem_table_id); + /* Link and device types. */ enum { NHLT_LINK_HDA, diff --git a/src/lib/nhlt.c b/src/lib/nhlt.c index 4fa4a0c2c1..11a397ca8e 100644 --- a/src/lib/nhlt.c +++ b/src/lib/nhlt.c @@ -388,10 +388,18 @@ static void nhlt_serialize_endpoints(struct nhlt *nhlt, struct cursor *cur) } uintptr_t nhlt_serialize(struct nhlt *nhlt, uintptr_t acpi_addr) +{ + return nhlt_serialize_oem_overrides(nhlt, acpi_addr, NULL, NULL); +} + +uintptr_t nhlt_serialize_oem_overrides(struct nhlt *nhlt, + uintptr_t acpi_addr, const char *oem_id, const char *oem_table_id) { struct cursor cur; acpi_header_t *header; size_t sz; + size_t oem_id_len; + size_t oem_table_id_len; printk(BIOS_DEBUG, "ACPI: * NHLT\n"); @@ -403,8 +411,18 @@ uintptr_t nhlt_serialize(struct nhlt *nhlt, uintptr_t acpi_addr) memcpy(header->signature, "NHLT", 4); write_le32(&header->length, sz); write_le8(&header->revision, 5); - memcpy(header->oem_id, OEM_ID, 6); - memcpy(header->oem_table_id, ACPI_TABLE_CREATOR, 8); + + if (oem_id == NULL) + oem_id = OEM_ID; + + if (oem_table_id == NULL) + oem_table_id = ACPI_TABLE_CREATOR; + + oem_id_len = MIN(strlen(oem_id), 6); + oem_table_id_len = MIN(strlen(oem_table_id), 8); + + memcpy(header->oem_id, oem_id, oem_id_len); + memcpy(header->oem_table_id, oem_table_id, oem_table_id_len); memcpy(header->asl_compiler_id, ASLC, 4); cur.buf = (void *)(acpi_addr + sizeof(acpi_header_t)); diff --git a/src/soc/intel/skylake/nhlt/nhlt.c b/src/soc/intel/skylake/nhlt/nhlt.c index 56e7d39254..6ef906a00e 100644 --- a/src/soc/intel/skylake/nhlt/nhlt.c +++ b/src/soc/intel/skylake/nhlt/nhlt.c @@ -86,6 +86,12 @@ struct nhlt_endpoint *nhlt_soc_add_endpoint(struct nhlt *nhlt, int soc_hwintf, } uintptr_t nhlt_soc_serialize(struct nhlt *nhlt, uintptr_t acpi_addr) +{ + return nhlt_soc_serialize_oem_overrides(nhlt, acpi_addr, NULL, NULL); +} + +uintptr_t nhlt_soc_serialize_oem_overrides(struct nhlt *nhlt, + uintptr_t acpi_addr, const char *oem_id, const char *oem_table_id) { global_nvs_t *gnvs; @@ -98,5 +104,6 @@ uintptr_t nhlt_soc_serialize(struct nhlt *nhlt, uintptr_t acpi_addr) gnvs->nhla = (uintptr_t)acpi_addr; gnvs->nhll = nhlt_current_size(nhlt); - return nhlt_serialize(nhlt, acpi_addr); + return nhlt_serialize_oem_overrides(nhlt, acpi_addr, + oem_id, oem_table_id); }