summaryrefslogtreecommitdiff
path: root/source/compiler/dttable1.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/compiler/dttable1.c')
-rw-r--r--source/compiler/dttable1.c228
1 files changed, 228 insertions, 0 deletions
diff --git a/source/compiler/dttable1.c b/source/compiler/dttable1.c
index c25f4b0e09af..bdf0419cf940 100644
--- a/source/compiler/dttable1.c
+++ b/source/compiler/dttable1.c
@@ -1249,6 +1249,16 @@ DtCompileHest (
InfoTable = AcpiDmTableInfoHest9;
break;
+ case ACPI_HEST_TYPE_GENERIC_ERROR_V2:
+
+ InfoTable = AcpiDmTableInfoHest10;
+ break;
+
+ case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
+
+ InfoTable = AcpiDmTableInfoHest11;
+ break;
+
default:
/* Cannot continue on unknown type */
@@ -1283,6 +1293,12 @@ DtCompileHest (
Subtable->Buffer))->NumHardwareBanks;
break;
+ case ACPI_HEST_TYPE_IA32_DEFERRED_CHECK:
+
+ BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_DEFERRED_CHECK,
+ Subtable->Buffer))->NumHardwareBanks;
+ break;
+
default:
break;
@@ -1308,6 +1324,218 @@ DtCompileHest (
/******************************************************************************
*
+ * FUNCTION: DtCompileHmat
+ *
+ * PARAMETERS: List - Current field list pointer
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Compile HMAT.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+DtCompileHmat (
+ void **List)
+{
+ ACPI_STATUS Status;
+ DT_SUBTABLE *Subtable;
+ DT_SUBTABLE *ParentTable;
+ DT_FIELD **PFieldList = (DT_FIELD **) List;
+ DT_FIELD *SubtableStart;
+ DT_FIELD *EntryStart;
+ ACPI_HMAT_STRUCTURE *HmatStruct;
+ ACPI_HMAT_LOCALITY *HmatLocality;
+ ACPI_HMAT_CACHE *HmatCache;
+ ACPI_DMTABLE_INFO *InfoTable;
+ UINT32 IntPDNumber;
+ UINT32 TgtPDNumber;
+ UINT64 EntryNumber;
+ UINT16 SMBIOSHandleNumber;
+
+
+ ParentTable = DtPeekSubtable ();
+
+ Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmat,
+ &Subtable, TRUE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ DtInsertSubtable (ParentTable, Subtable);
+
+ while (*PFieldList)
+ {
+ /* Compile HMAT structure header */
+
+ SubtableStart = *PFieldList;
+ Status = DtCompileTable (PFieldList, AcpiDmTableInfoHmatHdr,
+ &Subtable, TRUE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ DtInsertSubtable (ParentTable, Subtable);
+
+ HmatStruct = ACPI_CAST_PTR (ACPI_HMAT_STRUCTURE, Subtable->Buffer);
+ HmatStruct->Length = Subtable->Length;
+
+ /* Compile HMAT structure body */
+
+ switch (HmatStruct->Type)
+ {
+ case ACPI_HMAT_TYPE_ADDRESS_RANGE:
+
+ InfoTable = AcpiDmTableInfoHmat0;
+ break;
+
+ case ACPI_HMAT_TYPE_LOCALITY:
+
+ InfoTable = AcpiDmTableInfoHmat1;
+ break;
+
+ case ACPI_HMAT_TYPE_CACHE:
+
+ InfoTable = AcpiDmTableInfoHmat2;
+ break;
+
+ default:
+
+ DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HMAT");
+ return (AE_ERROR);
+ }
+
+ Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ DtInsertSubtable (ParentTable, Subtable);
+ HmatStruct->Length += Subtable->Length;
+
+ /* Compile HMAT structure additionals */
+
+ switch (HmatStruct->Type)
+ {
+ case ACPI_HMAT_TYPE_LOCALITY:
+
+ HmatLocality = ACPI_SUB_PTR (ACPI_HMAT_LOCALITY,
+ Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE));
+
+ /* Compile initiator proximity domain list */
+
+ IntPDNumber = 0;
+ while (*PFieldList)
+ {
+ Status = DtCompileTable (PFieldList,
+ AcpiDmTableInfoHmat1a, &Subtable, TRUE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ if (!Subtable)
+ {
+ break;
+ }
+ DtInsertSubtable (ParentTable, Subtable);
+ HmatStruct->Length += Subtable->Length;
+ IntPDNumber++;
+ }
+ HmatLocality->NumberOfInitiatorPDs = IntPDNumber;
+
+ /* Compile target proximity domain list */
+
+ TgtPDNumber = 0;
+ while (*PFieldList)
+ {
+ Status = DtCompileTable (PFieldList,
+ AcpiDmTableInfoHmat1b, &Subtable, TRUE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ if (!Subtable)
+ {
+ break;
+ }
+ DtInsertSubtable (ParentTable, Subtable);
+ HmatStruct->Length += Subtable->Length;
+ TgtPDNumber++;
+ }
+ HmatLocality->NumberOfTargetPDs = TgtPDNumber;
+
+ /* Save start of the entries for reporting errors */
+
+ EntryStart = *PFieldList;
+
+ /* Compile latency/bandwidth entries */
+
+ EntryNumber = 0;
+ while (*PFieldList)
+ {
+ Status = DtCompileTable (PFieldList,
+ AcpiDmTableInfoHmat1c, &Subtable, TRUE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ if (!Subtable)
+ {
+ break;
+ }
+ DtInsertSubtable (ParentTable, Subtable);
+ HmatStruct->Length += Subtable->Length;
+ EntryNumber++;
+ }
+
+ /* Validate number of entries */
+
+ if (EntryNumber !=
+ ((UINT64)IntPDNumber * (UINT64)TgtPDNumber))
+ {
+ DtFatal (ASL_MSG_INVALID_EXPRESSION, EntryStart, "HMAT");
+ return (AE_ERROR);
+ }
+ break;
+
+ case ACPI_HMAT_TYPE_CACHE:
+
+ /* Compile SMBIOS handles */
+
+ HmatCache = ACPI_SUB_PTR (ACPI_HMAT_CACHE,
+ Subtable->Buffer, sizeof (ACPI_HMAT_STRUCTURE));
+ SMBIOSHandleNumber = 0;
+ while (*PFieldList)
+ {
+ Status = DtCompileTable (PFieldList,
+ AcpiDmTableInfoHmat2a, &Subtable, TRUE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ if (!Subtable)
+ {
+ break;
+ }
+ DtInsertSubtable (ParentTable, Subtable);
+ HmatStruct->Length += Subtable->Length;
+ SMBIOSHandleNumber++;
+ }
+ HmatCache->NumberOfSMBIOSHandles = SMBIOSHandleNumber;
+ break;
+
+ default:
+
+ break;
+ }
+ }
+
+ return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
* FUNCTION: DtCompileIort
*
* PARAMETERS: List - Current field list pointer