summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/nhlt.h17
-rw-r--r--src/lib/nhlt.c22
-rw-r--r--src/soc/intel/skylake/nhlt/nhlt.c9
3 files changed, 45 insertions, 3 deletions
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
@@ -125,12 +125,29 @@ 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
* field references for the serialized structure.
*/
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
@@ -389,9 +389,17 @@ 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
@@ -87,6 +87,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;
gnvs = cbmem_find(CBMEM_ID_ACPI_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);
}