<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>