<p>Marc Jones has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/28276">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">x86/acpi: Add ACPI tablie revision function<br><br>Use a single function to set ACPI table version. This allows us<br>to keep revisions synced to the correct levels for coreboot. This<br>is a partial fix for the bug:<br><br>FAILED [MEDIUM] SPECMADTFADTRevisions: Test 2, MADT revision is not<br>in sync with the FADT revision; MADT 1 expects FADT 3.0 but found 4.0<br>instead.<br><br>BUG=b:112476331<br>TEST-Run FWTS<br><br>Change-Id: Ie9a486380e72b1754677c3cdf8190e3ceff9412b<br>Signed-off-by: Marc Jones <marcj303@gmail.com><br>---<br>M src/arch/x86/acpi.c<br>M src/arch/x86/include/arch/acpi.h<br>2 files changed, 80 insertions(+), 17 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/76/28276/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/arch/x86/acpi.c b/src/arch/x86/acpi.c</span><br><span>index 78eeaa7..6e3f4c9 100644</span><br><span>--- a/src/arch/x86/acpi.c</span><br><span>+++ b/src/arch/x86/acpi.c</span><br><span>@@ -218,7 +218,7 @@</span><br><span> memcpy(header->asl_compiler_id, ASLC, 4);</span><br><span> </span><br><span> header->length = sizeof(acpi_madt_t);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = 1; /* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_acpi_table_revision(MADT);</span><br><span> </span><br><span> madt->lapic_addr = LOCAL_APIC_ADDR;</span><br><span> madt->flags = 0x1; /* PCAT_COMPAT */</span><br><span>@@ -246,7 +246,7 @@</span><br><span> memcpy(header->asl_compiler_id, ASLC, 4);</span><br><span> </span><br><span> header->length = sizeof(acpi_mcfg_t);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_acpi_table_revision(MCFG);</span><br><span> </span><br><span> current = acpi_fill_mcfg(current);</span><br><span> </span><br><span>@@ -299,7 +299,7 @@</span><br><span> memcpy(header->asl_compiler_id, ASLC, 4);</span><br><span> </span><br><span> header->length = sizeof(acpi_tcpa_t);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_acpi_table_revision(TCPA);</span><br><span> </span><br><span> tcpa->platform_class = 0;</span><br><span> tcpa->laml = tcpa_log_len;</span><br><span>@@ -339,7 +339,7 @@</span><br><span> memset((void *)ssdt, 0, sizeof(acpi_header_t));</span><br><span> </span><br><span> memcpy(&ssdt->signature, "SSDT", 4);</span><br><span style="color: hsl(0, 100%, 40%);">- ssdt->revision = 2; /* ACPI 1.0/2.0: ?, ACPI 3.0/4.0: 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ ssdt->revision = get_acpi_table_revision(SSDT);</span><br><span> memcpy(&ssdt->oem_id, OEM_ID, 6);</span><br><span> memcpy(&ssdt->oem_table_id, oem_table_id, 8);</span><br><span> ssdt->oem_revision = 42;</span><br><span>@@ -410,7 +410,7 @@</span><br><span> memcpy(header->asl_compiler_id, ASLC, 4);</span><br><span> </span><br><span> header->length = sizeof(acpi_srat_t);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = 1; /* ACPI 1.0: N/A, 2.0: 1, 3.0: 2, 4.0: 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_acpi_table_revision(SRAT);</span><br><span> </span><br><span> srat->resv = 1; /* Spec: Reserved to 1 for backwards compatibility. */</span><br><span> </span><br><span>@@ -436,7 +436,7 @@</span><br><span> memcpy(header->asl_compiler_id, ASLC, 4);</span><br><span> </span><br><span> header->length = sizeof(acpi_dmar_t);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_acpi_table_revision(DMAR);</span><br><span> </span><br><span> dmar->host_address_width = cpu_phys_address_size() - 1;</span><br><span> dmar->flags = flags;</span><br><span>@@ -569,7 +569,7 @@</span><br><span> memcpy(header->asl_compiler_id, ASLC, 4);</span><br><span> </span><br><span> header->length = sizeof(acpi_slit_t);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = 1; /* ACPI 1.0: N/A, ACPI 2.0/3.0/4.0: 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_acpi_table_revision(SLIT);</span><br><span> </span><br><span> current = acpi_fill_slit(current);</span><br><span> </span><br><span>@@ -593,7 +593,7 @@</span><br><span> memcpy(header->asl_compiler_id, ASLC, 4);</span><br><span> </span><br><span> header->length = sizeof(acpi_hpet_t);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = 1; /* Currently 1. Table added in ACPI 2.0. */</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_acpi_table_revision(HPET);</span><br><span> </span><br><span> /* Fill out HPET address. */</span><br><span> addr->space_id = 0; /* Memory */</span><br><span>@@ -626,7 +626,7 @@</span><br><span> memcpy(header->asl_compiler_id, ASLC, 4);</span><br><span> </span><br><span> header->length = sizeof(struct acpi_vfct);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = 1; /* ACPI 1.0: N/A, ACPI 2.0/3.0/4.0: 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_acpi_table_revision(VFCT);</span><br><span> </span><br><span> current = acpi_fill_vfct(device, vfct, current);</span><br><span> </span><br><span>@@ -651,7 +651,7 @@</span><br><span> memcpy(header->asl_compiler_id, ASLC, 4);</span><br><span> </span><br><span> header->length = sizeof(acpi_ivrs_t);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = IVRS_FORMAT_FIXED;</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_acpi_table_revision(IVRS);</span><br><span> </span><br><span> current = acpi_fill_ivrs(ivrs, current);</span><br><span> </span><br><span>@@ -696,7 +696,7 @@</span><br><span> current = (uintptr_t)dbg2;</span><br><span> memset(dbg2, 0, sizeof(acpi_dbg2_header_t));</span><br><span> header = &(dbg2->header);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_acpi_table_revision(DBG2);</span><br><span> memcpy(header->signature, "DBG2", 4);</span><br><span> memcpy(header->oem_id, OEM_ID, 6);</span><br><span> memcpy(header->oem_table_id, ACPI_TABLE_CREATOR, 8);</span><br><span>@@ -807,7 +807,7 @@</span><br><span> facs->flags = 0;</span><br><span> facs->x_firmware_waking_vector_l = 0;</span><br><span> facs->x_firmware_waking_vector_h = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- facs->version = 1; /* ACPI 1.0: 0, ACPI 2.0/3.0: 1, ACPI 4.0: 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ facs->version = get_acpi_table_revision(FACS);</span><br><span> }</span><br><span> </span><br><span> static void acpi_write_rsdt(acpi_rsdt_t *rsdt, char *oem_id, char *oem_table_id)</span><br><span>@@ -821,7 +821,7 @@</span><br><span> memcpy(header->asl_compiler_id, ASLC, 4);</span><br><span> </span><br><span> header->length = sizeof(acpi_rsdt_t);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = 1; /* ACPI 1.0/2.0/3.0/4.0: 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_acpi_table_revision(RSDT);</span><br><span> </span><br><span> /* Entries are filled in later, we come with an empty set. */</span><br><span> </span><br><span>@@ -840,7 +840,7 @@</span><br><span> memcpy(header->asl_compiler_id, ASLC, 4);</span><br><span> </span><br><span> header->length = sizeof(acpi_xsdt_t);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = 1; /* ACPI 1.0: N/A, 2.0/3.0/4.0: 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_acpi_table_revision(XSDT);</span><br><span> </span><br><span> /* Entries are filled in later, we come with an empty set. */</span><br><span> </span><br><span>@@ -870,7 +870,7 @@</span><br><span> rsdp->revision = 0;</span><br><span> } else {</span><br><span> rsdp->xsdt_address = (u64)(uintptr_t)xsdt;</span><br><span style="color: hsl(0, 100%, 40%);">- rsdp->revision = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ rsdp->revision = get_acpi_table_revision(RSDP);</span><br><span> }</span><br><span> </span><br><span> /* Calculate checksums. */</span><br><span>@@ -950,7 +950,7 @@</span><br><span> memcpy(header->oem_table_id, ACPI_TABLE_CREATOR, 8);</span><br><span> memcpy(header->asl_compiler_id, ASLC, 4);</span><br><span> header->length += sizeof(acpi_hest_t);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_acpi_table_revision(HEST);</span><br><span> </span><br><span> acpi_fill_hest(hest);</span><br><span> </span><br><span>@@ -966,7 +966,7 @@</span><br><span> memset((void *) fadt, 0, sizeof(acpi_fadt_t));</span><br><span> memcpy(header->signature, "FACP", 4);</span><br><span> header->length = sizeof(acpi_fadt_t);</span><br><span style="color: hsl(0, 100%, 40%);">- header->revision = 4;</span><br><span style="color: hsl(120, 100%, 40%);">+ header->revision = get_fadt_madt_version(FADT);</span><br><span> memcpy(header->oem_id, OEM_ID, 6);</span><br><span> memcpy(header->oem_table_id, ACPI_TABLE_CREATOR, 8);</span><br><span> memcpy(header->asl_compiler_id, ASLC, 4);</span><br><span>@@ -1256,3 +1256,48 @@</span><br><span> {</span><br><span> return -1; /* implemented by SOC */</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int get_acpi_table_revision(enum acpi_tables table)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (table) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case FADT:</span><br><span style="color: hsl(120, 100%, 40%);">+ return ACPI_FADT_REV_ACPI_3_0;</span><br><span style="color: hsl(120, 100%, 40%);">+ case MADT: /* ACPI 1.0/2.0: 1, ACPI 3.0: 2, ACPI 4.0: 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ case MCFG:</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ case TCPA:</span><br><span style="color: hsl(120, 100%, 40%);">+ return 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ case SSDT: /* ACPI 1.0/2.0: ?, ACPI 3.0/4.0: 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ case SRAT: /* ACPI 1.0: N/A, 2.0: 1, 3.0: 2, 4.0: 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1; /* TODO Should probably be upgraded to 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ case DMAR:</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ case SLIT: /* ACPI 1.0: N/A, ACPI 2.0/3.0/4.0: 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ case HPET: /* Currently 1. Table added in ACPI 2.0. */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ case VFCT: /* ACPI 1.0: N/A, ACPI 2.0/3.0/4.0: 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ case IVRS:</span><br><span style="color: hsl(120, 100%, 40%);">+ return IVRS_FORMAT_FIXED;</span><br><span style="color: hsl(120, 100%, 40%);">+ case DBG2:</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ case FACS: /* ACPI 1.0: 0, ACPI 2.0/3.0: 1, ACPI 4.0: 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ case RSDT: /* ACPI 1.0/2.0/3.0/4.0: 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ case XSDT: /* ACPI 1.0: N/A, 2.0/3.0/4.0: 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ case RSDP: /* ACPI 1.0: 0, ACPI 2.0/3.0/4.0: 2. */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ case HEST:</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ case NHLT:</span><br><span style="color: hsl(120, 100%, 40%);">+ return 5;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/arch/x86/include/arch/acpi.h b/src/arch/x86/include/arch/acpi.h</span><br><span>index 40fbd54..59c791d 100644</span><br><span>--- a/src/arch/x86/include/arch/acpi.h</span><br><span>+++ b/src/arch/x86/include/arch/acpi.h</span><br><span>@@ -76,6 +76,18 @@</span><br><span> COREBOOT_ACPI_ID_MAX = 0xFFFF, /* BOOTFFFF */</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Table 5-30 DESCRIPTION_HEADER Signatures for tables defined by ACPI 6.2a</span><br><span style="color: hsl(120, 100%, 40%);">+ * Additional tables mssing in 5-30: MADT, RSDP, VFCT, NHLT</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+enum acpi_tables {</span><br><span style="color: hsl(120, 100%, 40%);">+ APIC, BERT, BGRT, CPEP, DSDT, ECDT, EINJ, ERST, FACP, FADT, FACS,</span><br><span style="color: hsl(120, 100%, 40%);">+ FPDT, GTDT, HEST, MSCT, MPST, NFIT, OEMX, PCCT, PMTT, PSDT, RASF,</span><br><span style="color: hsl(120, 100%, 40%);">+ RSDT, SBST, SDEV, SLIT, SRAT, SSDT, XSDT, BOOT, CSRT, DBG2, DBGP,</span><br><span style="color: hsl(120, 100%, 40%);">+ DMAR, DPPT, DRTM, ETDT, HPET, IBFT, IORT, IVRS, LPIT, MCFG, MCHI,</span><br><span style="color: hsl(120, 100%, 40%);">+ MSDM, SDEI, SLIC, SPCR, SPMI, STAO, TCPA, TPM2, WAET, WDAT, WDRT,</span><br><span style="color: hsl(120, 100%, 40%);">+ WPBT, WSMT, XENV, MADT, RSDP, VFCT, NHLT</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* RSDP (Root System Description Pointer) */</span><br><span> typedef struct acpi_rsdp {</span><br><span> char signature[8]; /* RSDP signature */</span><br><span>@@ -845,6 +857,12 @@</span><br><span> return ALIGN(current, 16);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* ACPI table revisions should match the revision of the ACPI spec</span><br><span style="color: hsl(120, 100%, 40%);">+ * supported. This function keeps the talbe versions synced. This could</span><br><span style="color: hsl(120, 100%, 40%);">+ * be made into a weak function if there is ever a need to override the</span><br><span style="color: hsl(120, 100%, 40%);">+ * coreboot default ACPI spec version supported. */</span><br><span style="color: hsl(120, 100%, 40%);">+int get_acpi_table_revision(enum acpi_tables table);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif // !defined(__ASSEMBLER__) && !defined(__ACPI__) && !defined(__ROMC__)</span><br><span> </span><br><span> #endif /* __ASM_ACPI_H */</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/28276">change 28276</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/28276"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ie9a486380e72b1754677c3cdf8190e3ceff9412b </div>
<div style="display:none"> Gerrit-Change-Number: 28276 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Marc Jones <marc@marcjonesconsulting.com> </div>