summaryrefslogtreecommitdiffstats
path: root/sys/contrib/dev/acpica/compiler/dttable.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/dev/acpica/compiler/dttable.c')
-rw-r--r--sys/contrib/dev/acpica/compiler/dttable.c3257
1 files changed, 21 insertions, 3236 deletions
diff --git a/sys/contrib/dev/acpica/compiler/dttable.c b/sys/contrib/dev/acpica/compiler/dttable.c
index bae80ad..dc55449 100644
--- a/sys/contrib/dev/acpica/compiler/dttable.c
+++ b/sys/contrib/dev/acpica/compiler/dttable.c
@@ -5,7 +5,7 @@
*****************************************************************************/
/*
- * Copyright (C) 2000 - 2015, Intel Corp.
+ * Copyright (C) 2000 - 2016, Intel Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -41,7 +41,7 @@
* POSSIBILITY OF SUCH DAMAGES.
*/
-/* Compile all complex data tables */
+/* Compile routines for the basic ACPI tables */
#include <contrib/dev/acpica/compiler/aslcompiler.h>
#include <contrib/dev/acpica/compiler/dtcompiler.h>
@@ -50,123 +50,6 @@
ACPI_MODULE_NAME ("dttable")
-/* TBD: merge these into dmtbinfo.c? */
-
-static ACPI_DMTABLE_INFO TableInfoAsfAddress[] =
-{
- {ACPI_DMT_BUFFER, 0, "Addresses", 0},
- {ACPI_DMT_EXIT, 0, NULL, 0}
-};
-
-static ACPI_DMTABLE_INFO TableInfoDmarPciPath[] =
-{
- {ACPI_DMT_PCI_PATH, 0, "PCI Path", 0},
- {ACPI_DMT_EXIT, 0, NULL, 0}
-};
-
-
-/* Local prototypes */
-
-static ACPI_STATUS
-DtCompileTwoSubtables (
- void **List,
- ACPI_DMTABLE_INFO *TableInfo1,
- ACPI_DMTABLE_INFO *TableInfo2);
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileTwoSubtables
- *
- * PARAMETERS: List - Current field list pointer
- * TableInfo1 - Info table 1
- * TableInfo1 - Info table 2
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile tables with a header and one or more same subtables.
- * Include CPEP, EINJ, ERST, MCFG, MSCT, WDAT
- *
- *****************************************************************************/
-
-static ACPI_STATUS
-DtCompileTwoSubtables (
- void **List,
- ACPI_DMTABLE_INFO *TableInfo1,
- ACPI_DMTABLE_INFO *TableInfo2)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
-
-
- Status = DtCompileTable (PFieldList, TableInfo1, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- while (*PFieldList)
- {
- Status = DtCompileTable (PFieldList, TableInfo2, &Subtable, FALSE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- DtInsertSubtable (ParentTable, Subtable);
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileFacs
- *
- * PARAMETERS: PFieldList - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile FACS.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileFacs (
- DT_FIELD **PFieldList)
-{
- DT_SUBTABLE *Subtable;
- UINT8 *ReservedBuffer;
- ACPI_STATUS Status;
- UINT32 ReservedSize;
-
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs,
- &Gbl_RootTable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- /* Large FACS reserved area at the end of the table */
-
- ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1);
- ReservedBuffer = UtLocalCalloc (ReservedSize);
-
- DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
-
- ACPI_FREE (ReservedBuffer);
- DtInsertSubtable (Gbl_RootTable, Subtable);
- return (AE_OK);
-}
-
-
/******************************************************************************
*
* FUNCTION: DtCompileRsdp
@@ -192,7 +75,7 @@ DtCompileRsdp (
/* Compile the "common" RSDP (ACPI 1.0) */
Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1,
- &Gbl_RootTable, TRUE);
+ &Gbl_RootTable, TRUE);
if (ACPI_FAILURE (Status))
{
return (Status);
@@ -206,7 +89,7 @@ DtCompileRsdp (
/* Compile the "extended" part of the RSDP as a subtable */
Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2,
- &Subtable, TRUE);
+ &Subtable, TRUE);
if (ACPI_FAILURE (Status))
{
return (Status);
@@ -227,799 +110,6 @@ DtCompileRsdp (
/******************************************************************************
*
- * FUNCTION: DtCompileAsf
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile ASF!.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileAsf (
- void **List)
-{
- ACPI_ASF_INFO *AsfTable;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- ACPI_DMTABLE_INFO *InfoTable;
- ACPI_DMTABLE_INFO *DataInfoTable = NULL;
- UINT32 DataCount = 0;
- ACPI_STATUS Status;
- UINT32 i;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
-
-
- while (*PFieldList)
- {
- SubtableStart = *PFieldList;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer);
-
- switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
- {
- case ACPI_ASF_TYPE_INFO:
-
- InfoTable = AcpiDmTableInfoAsf0;
- break;
-
- case ACPI_ASF_TYPE_ALERT:
-
- InfoTable = AcpiDmTableInfoAsf1;
- break;
-
- case ACPI_ASF_TYPE_CONTROL:
-
- InfoTable = AcpiDmTableInfoAsf2;
- break;
-
- case ACPI_ASF_TYPE_BOOT:
-
- InfoTable = AcpiDmTableInfoAsf3;
- break;
-
- case ACPI_ASF_TYPE_ADDRESS:
-
- InfoTable = AcpiDmTableInfoAsf4;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
- return (AE_ERROR);
- }
-
- Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
- {
- case ACPI_ASF_TYPE_INFO:
-
- DataInfoTable = NULL;
- break;
-
- case ACPI_ASF_TYPE_ALERT:
-
- DataInfoTable = AcpiDmTableInfoAsf1a;
- DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT,
- ACPI_SUB_PTR (UINT8, Subtable->Buffer,
- sizeof (ACPI_ASF_HEADER)))->Alerts;
- break;
-
- case ACPI_ASF_TYPE_CONTROL:
-
- DataInfoTable = AcpiDmTableInfoAsf2a;
- DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE,
- ACPI_SUB_PTR (UINT8, Subtable->Buffer,
- sizeof (ACPI_ASF_HEADER)))->Controls;
- break;
-
- case ACPI_ASF_TYPE_BOOT:
-
- DataInfoTable = NULL;
- break;
-
- case ACPI_ASF_TYPE_ADDRESS:
-
- DataInfoTable = TableInfoAsfAddress;
- DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS,
- ACPI_SUB_PTR (UINT8, Subtable->Buffer,
- sizeof (ACPI_ASF_HEADER)))->Devices;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
- return (AE_ERROR);
- }
-
- if (DataInfoTable)
- {
- switch (AsfTable->Header.Type & 0x7F)
- {
- case ACPI_ASF_TYPE_ADDRESS:
-
- while (DataCount > 0)
- {
- Status = DtCompileTable (PFieldList, DataInfoTable,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- DtInsertSubtable (ParentTable, Subtable);
- DataCount = DataCount - Subtable->Length;
- }
- break;
-
- default:
-
- for (i = 0; i < DataCount; i++)
- {
- Status = DtCompileTable (PFieldList, DataInfoTable,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- DtInsertSubtable (ParentTable, Subtable);
- }
- break;
- }
- }
-
- DtPopSubtable ();
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileCpep
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile CPEP.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileCpep (
- void **List)
-{
- ACPI_STATUS Status;
-
-
- Status = DtCompileTwoSubtables (List,
- AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0);
- return (Status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileCsrt
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile CSRT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileCsrt (
- void **List)
-{
- ACPI_STATUS Status = AE_OK;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- UINT32 DescriptorCount;
- UINT32 GroupLength;
-
-
- /* Subtables (Resource Groups) */
-
- ParentTable = DtPeekSubtable ();
- while (*PFieldList)
- {
- /* Resource group subtable */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt0,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- /* Compute the number of resource descriptors */
-
- GroupLength =
- (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
- Subtable->Buffer))->Length -
- (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
- Subtable->Buffer))->SharedInfoLength -
- sizeof (ACPI_CSRT_GROUP);
-
- DescriptorCount = (GroupLength /
- sizeof (ACPI_CSRT_DESCRIPTOR));
-
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
- ParentTable = DtPeekSubtable ();
-
- /* Shared info subtable (One per resource group) */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt1,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- DtInsertSubtable (ParentTable, Subtable);
-
- /* Sub-Subtables (Resource Descriptors) */
-
- while (*PFieldList && DescriptorCount)
- {
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- DtInsertSubtable (ParentTable, Subtable);
-
- DtPushSubtable (Subtable);
- ParentTable = DtPeekSubtable ();
- if (*PFieldList)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2a,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- if (Subtable)
- {
- DtInsertSubtable (ParentTable, Subtable);
- }
- }
- DtPopSubtable ();
- ParentTable = DtPeekSubtable ();
-
- DescriptorCount--;
- }
-
- DtPopSubtable ();
- ParentTable = DtPeekSubtable ();
- }
-
- return (Status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileDbg2
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile DBG2.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileDbg2 (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- UINT32 SubtableCount;
- ACPI_DBG2_HEADER *Dbg2Header;
- ACPI_DBG2_DEVICE *DeviceInfo;
- UINT16 CurrentOffset;
- UINT32 i;
-
-
- /* Main table */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- /* Main table fields */
-
- Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer);
- Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF (
- ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header);
-
- SubtableCount = Dbg2Header->InfoCount;
- DtPushSubtable (Subtable);
-
- /* Process all Device Information subtables (Count = InfoCount) */
-
- while (*PFieldList && SubtableCount)
- {
- /* Subtable: Debug Device Information */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Device,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- DeviceInfo = ACPI_CAST_PTR (ACPI_DBG2_DEVICE, Subtable->Buffer);
- CurrentOffset = (UINT16) sizeof (ACPI_DBG2_DEVICE);
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- ParentTable = DtPeekSubtable ();
-
- /* BaseAddressRegister GAS array (Required, size is RegisterCount) */
-
- DeviceInfo->BaseAddressOffset = CurrentOffset;
- for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- CurrentOffset += (UINT16) sizeof (ACPI_GENERIC_ADDRESS);
- DtInsertSubtable (ParentTable, Subtable);
- }
-
- /* AddressSize array (Required, size = RegisterCount) */
-
- DeviceInfo->AddressSizeOffset = CurrentOffset;
- for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- CurrentOffset += (UINT16) sizeof (UINT32);
- DtInsertSubtable (ParentTable, Subtable);
- }
-
- /* NamespaceString device identifier (Required, size = NamePathLength) */
-
- DeviceInfo->NamepathOffset = CurrentOffset;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- /* Update the device info header */
-
- DeviceInfo->NamepathLength = (UINT16) Subtable->Length;
- CurrentOffset += (UINT16) DeviceInfo->NamepathLength;
- DtInsertSubtable (ParentTable, Subtable);
-
- /* OemData - Variable-length data (Optional, size = OemDataLength) */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2OemData,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- /* Update the device info header (zeros if no OEM data present) */
-
- DeviceInfo->OemDataOffset = 0;
- DeviceInfo->OemDataLength = 0;
-
- /* Optional subtable (OemData) */
-
- if (Subtable && Subtable->Length)
- {
- DeviceInfo->OemDataOffset = CurrentOffset;
- DeviceInfo->OemDataLength = (UINT16) Subtable->Length;
-
- DtInsertSubtable (ParentTable, Subtable);
- }
-
- SubtableCount--;
- DtPopSubtable (); /* Get next Device Information subtable */
- }
-
- DtPopSubtable ();
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileDmar
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile DMAR.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileDmar (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
- ACPI_DMTABLE_INFO *InfoTable;
- ACPI_DMAR_HEADER *DmarHeader;
- ACPI_DMAR_DEVICE_SCOPE *DmarDeviceScope;
- UINT32 DeviceScopeLength;
- UINT32 PciPathLength;
-
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- while (*PFieldList)
- {
- /* DMAR Header */
-
- SubtableStart = *PFieldList;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
-
- switch (DmarHeader->Type)
- {
- case ACPI_DMAR_TYPE_HARDWARE_UNIT:
-
- InfoTable = AcpiDmTableInfoDmar0;
- break;
-
- case ACPI_DMAR_TYPE_RESERVED_MEMORY:
-
- InfoTable = AcpiDmTableInfoDmar1;
- break;
-
- case ACPI_DMAR_TYPE_ROOT_ATS:
-
- InfoTable = AcpiDmTableInfoDmar2;
- break;
-
- case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
-
- InfoTable = AcpiDmTableInfoDmar3;
- break;
-
- case ACPI_DMAR_TYPE_NAMESPACE:
-
- InfoTable = AcpiDmTableInfoDmar4;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
- return (AE_ERROR);
- }
-
- /* DMAR Subtable */
-
- Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- /*
- * Optional Device Scope subtables
- */
- if ((DmarHeader->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
- (DmarHeader->Type == ACPI_DMAR_TYPE_NAMESPACE))
- {
- /* These types do not support device scopes */
-
- DtPopSubtable ();
- continue;
- }
-
- DtPushSubtable (Subtable);
- DeviceScopeLength = DmarHeader->Length - Subtable->Length -
- ParentTable->Length;
- while (DeviceScopeLength)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
- &Subtable, FALSE);
- if (Status == AE_NOT_FOUND)
- {
- break;
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer);
-
- /* Optional PCI Paths */
-
- PciPathLength = DmarDeviceScope->Length - Subtable->Length;
- while (PciPathLength)
- {
- Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
- &Subtable, FALSE);
- if (Status == AE_NOT_FOUND)
- {
- DtPopSubtable ();
- break;
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- PciPathLength -= Subtable->Length;
- }
-
- DtPopSubtable ();
- DeviceScopeLength -= DmarDeviceScope->Length;
- }
-
- DtPopSubtable ();
- DtPopSubtable ();
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileDrtm
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile DRTM.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileDrtm (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- UINT32 Count;
- /* ACPI_TABLE_DRTM *Drtm; */
- ACPI_DRTM_VTABLE_LIST *DrtmVtl;
- ACPI_DRTM_RESOURCE_LIST *DrtmRl;
- /* ACPI_DRTM_DPS_ID *DrtmDps; */
-
-
- ParentTable = DtPeekSubtable ();
-
- /* Compile DRTM header */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- DtInsertSubtable (ParentTable, Subtable);
-
- /*
- * Using ACPI_SUB_PTR, We needn't define a seperate structure. Care
- * should be taken to avoid accessing ACPI_TABLE_HADER fields.
- */
-#if 0
- Drtm = ACPI_SUB_PTR (ACPI_TABLE_DRTM,
- Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
-#endif
- /* Compile VTL */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- DtInsertSubtable (ParentTable, Subtable);
- DrtmVtl = ACPI_CAST_PTR (ACPI_DRTM_VTABLE_LIST, Subtable->Buffer);
-
- DtPushSubtable (Subtable);
- ParentTable = DtPeekSubtable ();
- Count = 0;
- while (*PFieldList)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0a,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- if (!Subtable)
- {
- break;
- }
- DtInsertSubtable (ParentTable, Subtable);
- Count++;
- }
- DrtmVtl->ValidatedTableCount = Count;
- DtPopSubtable ();
- ParentTable = DtPeekSubtable ();
-
- /* Compile RL */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- DtInsertSubtable (ParentTable, Subtable);
- DrtmRl = ACPI_CAST_PTR (ACPI_DRTM_RESOURCE_LIST, Subtable->Buffer);
-
- DtPushSubtable (Subtable);
- ParentTable = DtPeekSubtable ();
- Count = 0;
- while (*PFieldList)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1a,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- if (!Subtable)
- {
- break;
- }
- DtInsertSubtable (ParentTable, Subtable);
- Count++;
- }
- DrtmRl->ResourceCount = Count;
- DtPopSubtable ();
- ParentTable = DtPeekSubtable ();
-
- /* Compile DPS */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm2,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- DtInsertSubtable (ParentTable, Subtable);
- /* DrtmDps = ACPI_CAST_PTR (ACPI_DRTM_DPS_ID, Subtable->Buffer);*/
-
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileEinj
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile EINJ.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileEinj (
- void **List)
-{
- ACPI_STATUS Status;
-
-
- Status = DtCompileTwoSubtables (List,
- AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
- return (Status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileErst
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile ERST.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileErst (
- void **List)
-{
- ACPI_STATUS Status;
-
-
- Status = DtCompileTwoSubtables (List,
- AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
- return (Status);
-}
-
-
-/******************************************************************************
- *
* FUNCTION: DtCompileFadt
*
* PARAMETERS: List - Current field list pointer
@@ -1043,7 +133,7 @@ DtCompileFadt (
Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1,
- &Subtable, TRUE);
+ &Subtable, TRUE);
if (ACPI_FAILURE (Status))
{
return (Status);
@@ -1058,7 +148,7 @@ DtCompileFadt (
if (Revision == 2)
{
Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2,
- &Subtable, TRUE);
+ &Subtable, TRUE);
if (ACPI_FAILURE (Status))
{
return (Status);
@@ -1069,7 +159,7 @@ DtCompileFadt (
else if (Revision >= 2)
{
Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3,
- &Subtable, TRUE);
+ &Subtable, TRUE);
if (ACPI_FAILURE (Status))
{
return (Status);
@@ -1080,7 +170,7 @@ DtCompileFadt (
if (Revision >= 5)
{
Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5,
- &Subtable, TRUE);
+ &Subtable, TRUE);
if (ACPI_FAILURE (Status))
{
return (Status);
@@ -1092,2362 +182,57 @@ DtCompileFadt (
if (Revision >= 6)
{
Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt6,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- DtInsertSubtable (ParentTable, Subtable);
- }
- }
-
- return (AE_OK);
-}
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileGtdt
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile GTDT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileGtdt (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
- ACPI_SUBTABLE_HEADER *GtdtHeader;
- ACPI_DMTABLE_INFO *InfoTable;
- UINT32 GtCount;
-
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- while (*PFieldList)
- {
- SubtableStart = *PFieldList;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdtHdr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- GtdtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
-
- switch (GtdtHeader->Type)
- {
- case ACPI_GTDT_TYPE_TIMER_BLOCK:
-
- InfoTable = AcpiDmTableInfoGtdt0;
- break;
-
- case ACPI_GTDT_TYPE_WATCHDOG:
-
- InfoTable = AcpiDmTableInfoGtdt1;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "GTDT");
- return (AE_ERROR);
- }
-
- Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- /*
- * Additional GT block subtable data
- */
-
- switch (GtdtHeader->Type)
- {
- case ACPI_GTDT_TYPE_TIMER_BLOCK:
-
- DtPushSubtable (Subtable);
- ParentTable = DtPeekSubtable ();
-
- GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
- Subtable->Buffer - sizeof(ACPI_GTDT_HEADER)))->TimerCount;
- while (GtCount)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt0a,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
-
- DtInsertSubtable (ParentTable, Subtable);
- GtCount--;
- }
- DtPopSubtable ();
- break;
-
- default:
-
- break;
- }
-
- DtPopSubtable ();
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileFpdt
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile FPDT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileFpdt (
- void **List)
-{
- ACPI_STATUS Status;
- ACPI_FPDT_HEADER *FpdtHeader;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- ACPI_DMTABLE_INFO *InfoTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
-
-
- while (*PFieldList)
- {
- SubtableStart = *PFieldList;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
-
- switch (FpdtHeader->Type)
- {
- case ACPI_FPDT_TYPE_BOOT:
-
- InfoTable = AcpiDmTableInfoFpdt0;
- break;
-
- case ACPI_FPDT_TYPE_S3PERF:
-
- InfoTable = AcpiDmTableInfoFpdt1;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT");
- return (AE_ERROR);
- break;
- }
-
- Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPopSubtable ();
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileHest
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile HEST.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileHest (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
- ACPI_DMTABLE_INFO *InfoTable;
- UINT16 Type;
- UINT32 BankCount;
-
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- while (*PFieldList)
- {
- /* Get subtable type */
-
- SubtableStart = *PFieldList;
- DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
-
- switch (Type)
- {
- case ACPI_HEST_TYPE_IA32_CHECK:
-
- InfoTable = AcpiDmTableInfoHest0;
- break;
-
- case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
-
- InfoTable = AcpiDmTableInfoHest1;
- break;
-
- case ACPI_HEST_TYPE_IA32_NMI:
-
- InfoTable = AcpiDmTableInfoHest2;
- break;
-
- case ACPI_HEST_TYPE_AER_ROOT_PORT:
-
- InfoTable = AcpiDmTableInfoHest6;
- break;
-
- case ACPI_HEST_TYPE_AER_ENDPOINT:
-
- InfoTable = AcpiDmTableInfoHest7;
- break;
-
- case ACPI_HEST_TYPE_AER_BRIDGE:
-
- InfoTable = AcpiDmTableInfoHest8;
- break;
-
- case ACPI_HEST_TYPE_GENERIC_ERROR:
-
- InfoTable = AcpiDmTableInfoHest9;
- break;
-
- default:
-
- /* Cannot continue on unknown type */
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
- return (AE_ERROR);
- }
-
- Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- DtInsertSubtable (ParentTable, Subtable);
-
- /*
- * Additional subtable data - IA32 Error Bank(s)
- */
- BankCount = 0;
- switch (Type)
- {
- case ACPI_HEST_TYPE_IA32_CHECK:
-
- BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
- Subtable->Buffer))->NumHardwareBanks;
- break;
-
- case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
-
- BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
- Subtable->Buffer))->NumHardwareBanks;
- break;
-
- default:
-
- break;
- }
-
- while (BankCount)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- DtInsertSubtable (ParentTable, Subtable);
- BankCount--;
- }
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileIort
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile IORT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileIort (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
- ACPI_TABLE_IORT *Iort;
- ACPI_IORT_NODE *IortNode;
- ACPI_IORT_ITS_GROUP *IortItsGroup;
- ACPI_IORT_SMMU *IortSmmu;
- UINT32 NodeNumber;
- UINT32 NodeLength;
- UINT32 IdMappingNumber;
- UINT32 ItsNumber;
- UINT32 ContextIrptNumber;
- UINT32 PmuIrptNumber;
- UINT32 PaddingLength;
-
-
- ParentTable = DtPeekSubtable ();
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- DtInsertSubtable (ParentTable, Subtable);
-
- /*
- * Using ACPI_SUB_PTR, We needn't define a seperate structure. Care
- * should be taken to avoid accessing ACPI_TABLE_HADER fields.
- */
- Iort = ACPI_SUB_PTR (ACPI_TABLE_IORT,
- Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
-
- /*
- * OptionalPadding - Variable-length data
- * (Optional, size = OffsetToNodes - sizeof (ACPI_TABLE_IORT))
- * Optionally allows the generic data types to be used for filling
- * this field.
- */
- Iort->NodeOffset = sizeof (ACPI_TABLE_IORT);
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortPad,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- if (Subtable)
- {
- DtInsertSubtable (ParentTable, Subtable);
- Iort->NodeOffset += Subtable->Length;
- }
- else
- {
- Status = DtCompileGeneric (ACPI_CAST_PTR (void *, PFieldList),
- AcpiDmTableInfoIortHdr[0].Name, &PaddingLength);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- Iort->NodeOffset += PaddingLength;
- }
-
- NodeNumber = 0;
- while (*PFieldList)
- {
- SubtableStart = *PFieldList;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- DtInsertSubtable (ParentTable, Subtable);
- IortNode = ACPI_CAST_PTR (ACPI_IORT_NODE, Subtable->Buffer);
- NodeLength = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
-
- DtPushSubtable (Subtable);
- ParentTable = DtPeekSubtable ();
-
- switch (IortNode->Type)
- {
- case ACPI_IORT_NODE_ITS_GROUP:
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- DtInsertSubtable (ParentTable, Subtable);
- IortItsGroup = ACPI_CAST_PTR (ACPI_IORT_ITS_GROUP, Subtable->Buffer);
- NodeLength += Subtable->Length;
-
- ItsNumber = 0;
- while (*PFieldList)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0a,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- if (!Subtable)
- {
- break;
- }
- DtInsertSubtable (ParentTable, Subtable);
- NodeLength += Subtable->Length;
- ItsNumber++;
- }
-
- IortItsGroup->ItsCount = ItsNumber;
- break;
-
- case ACPI_IORT_NODE_NAMED_COMPONENT:
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- DtInsertSubtable (ParentTable, Subtable);
- NodeLength += Subtable->Length;
-
- /*
- * Padding - Variable-length data
- * Optionally allows the offset of the ID mappings to be used
- * for filling this field.
- */
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1a,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- if (Subtable)
- {
- DtInsertSubtable (ParentTable, Subtable);
- NodeLength += Subtable->Length;
- }
- else
- {
- if (NodeLength > IortNode->MappingOffset)
- {
- return (AE_BAD_DATA);
- }
- if (NodeLength < IortNode->MappingOffset)
- {
- Status = DtCompilePadding (
- IortNode->MappingOffset - NodeLength,
- &Subtable);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- DtInsertSubtable (ParentTable, Subtable);
- NodeLength = IortNode->MappingOffset;
- }
- }
- break;
-
- case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort2,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- DtInsertSubtable (ParentTable, Subtable);
- NodeLength += Subtable->Length;
- break;
-
- case ACPI_IORT_NODE_SMMU:
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- DtInsertSubtable (ParentTable, Subtable);
- IortSmmu = ACPI_CAST_PTR (ACPI_IORT_SMMU, Subtable->Buffer);
- NodeLength += Subtable->Length;
-
- /* Compile global interrupt array */
-
- IortSmmu->GlobalInterruptOffset = NodeLength;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3a,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- DtInsertSubtable (ParentTable, Subtable);
- NodeLength += Subtable->Length;
-
- /* Compile context interrupt array */
-
- ContextIrptNumber = 0;
- IortSmmu->ContextInterruptOffset = NodeLength;
- while (*PFieldList)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3b,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- if (!Subtable)
- {
- break;
- }
- DtInsertSubtable (ParentTable, Subtable);
- NodeLength += Subtable->Length;
- ContextIrptNumber++;
- }
- IortSmmu->ContextInterruptCount = ContextIrptNumber;
-
- /* Compile PMU interrupt array */
-
- PmuIrptNumber = 0;
- IortSmmu->PmuInterruptOffset = NodeLength;
- while (*PFieldList)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3c,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- if (!Subtable)
- {
- break;
- }
- DtInsertSubtable (ParentTable, Subtable);
- NodeLength += Subtable->Length;
- PmuIrptNumber++;
- }
- IortSmmu->PmuInterruptCount = PmuIrptNumber;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IORT");
- return (AE_ERROR);
- }
-
- /* Compile Array of ID mappings */
-
- IortNode->MappingOffset = NodeLength;
- IdMappingNumber = 0;
- while (*PFieldList)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortMap,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- if (!Subtable)
- {
- break;
- }
- DtInsertSubtable (ParentTable, Subtable);
- NodeLength += sizeof (ACPI_IORT_ID_MAPPING);
- IdMappingNumber++;
- }
- IortNode->MappingCount = IdMappingNumber;
-
- /*
- * Node length can be determined by DT_LENGTH option
- * IortNode->Length = NodeLength;
- */
- DtPopSubtable ();
- ParentTable = DtPeekSubtable ();
- NodeNumber++;
- }
- Iort->NodeCount = NodeNumber;
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileIvrs
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile IVRS.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileIvrs (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
- ACPI_DMTABLE_INFO *InfoTable;
- ACPI_IVRS_HEADER *IvrsHeader;
- UINT8 EntryType;
-
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- while (*PFieldList)
- {
- SubtableStart = *PFieldList;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer);
-
- switch (IvrsHeader->Type)
- {
- case ACPI_IVRS_TYPE_HARDWARE:
-
- InfoTable = AcpiDmTableInfoIvrs0;
- break;
-
- case ACPI_IVRS_TYPE_MEMORY1:
- case ACPI_IVRS_TYPE_MEMORY2:
- case ACPI_IVRS_TYPE_MEMORY3:
-
- InfoTable = AcpiDmTableInfoIvrs1;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS");
- return (AE_ERROR);
- }
-
- Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE)
- {
- while (*PFieldList &&
- !ACPI_STRCMP ((*PFieldList)->Name, "Entry Type"))
- {
- SubtableStart = *PFieldList;
- DtCompileInteger (&EntryType, *PFieldList, 1, 0);
-
- switch (EntryType)
- {
- /* 4-byte device entries */
-
- case ACPI_IVRS_TYPE_PAD4:
- case ACPI_IVRS_TYPE_ALL:
- case ACPI_IVRS_TYPE_SELECT:
- case ACPI_IVRS_TYPE_START:
- case ACPI_IVRS_TYPE_END:
-
- InfoTable = AcpiDmTableInfoIvrs4;
- break;
-
- /* 8-byte entries, type A */
-
- case ACPI_IVRS_TYPE_ALIAS_SELECT:
- case ACPI_IVRS_TYPE_ALIAS_START:
-
- InfoTable = AcpiDmTableInfoIvrs8a;
- break;
-
- /* 8-byte entries, type B */
-
- case ACPI_IVRS_TYPE_PAD8:
- case ACPI_IVRS_TYPE_EXT_SELECT:
- case ACPI_IVRS_TYPE_EXT_START:
-
- InfoTable = AcpiDmTableInfoIvrs8b;
- break;
-
- /* 8-byte entries, type C */
-
- case ACPI_IVRS_TYPE_SPECIAL:
-
- InfoTable = AcpiDmTableInfoIvrs8c;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
- "IVRS Device Entry");
- return (AE_ERROR);
- }
-
- Status = DtCompileTable (PFieldList, InfoTable,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- DtInsertSubtable (ParentTable, Subtable);
- }
- }
-
- DtPopSubtable ();
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileLpit
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile LPIT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileLpit (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
- ACPI_DMTABLE_INFO *InfoTable;
- ACPI_LPIT_HEADER *LpitHeader;
-
-
- /* Note: Main table consists only of the standard ACPI table header */
-
- while (*PFieldList)
- {
- SubtableStart = *PFieldList;
-
- /* LPIT Subtable header */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer);
-
- switch (LpitHeader->Type)
- {
- case ACPI_LPIT_TYPE_NATIVE_CSTATE:
-
- InfoTable = AcpiDmTableInfoLpit0;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT");
- return (AE_ERROR);
- }
-
- /* LPIT Subtable */
-
- Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPopSubtable ();
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileMadt
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile MADT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileMadt (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
- ACPI_SUBTABLE_HEADER *MadtHeader;
- ACPI_DMTABLE_INFO *InfoTable;
-
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
&Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- while (*PFieldList)
- {
- SubtableStart = *PFieldList;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
-
- switch (MadtHeader->Type)
- {
- case ACPI_MADT_TYPE_LOCAL_APIC:
-
- InfoTable = AcpiDmTableInfoMadt0;
- break;
-
- case ACPI_MADT_TYPE_IO_APIC:
-
- InfoTable = AcpiDmTableInfoMadt1;
- break;
-
- case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
-
- InfoTable = AcpiDmTableInfoMadt2;
- break;
-
- case ACPI_MADT_TYPE_NMI_SOURCE:
-
- InfoTable = AcpiDmTableInfoMadt3;
- break;
-
- case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
-
- InfoTable = AcpiDmTableInfoMadt4;
- break;
-
- case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
-
- InfoTable = AcpiDmTableInfoMadt5;
- break;
-
- case ACPI_MADT_TYPE_IO_SAPIC:
-
- InfoTable = AcpiDmTableInfoMadt6;
- break;
-
- case ACPI_MADT_TYPE_LOCAL_SAPIC:
-
- InfoTable = AcpiDmTableInfoMadt7;
- break;
-
- case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
-
- InfoTable = AcpiDmTableInfoMadt8;
- break;
-
- case ACPI_MADT_TYPE_LOCAL_X2APIC:
-
- InfoTable = AcpiDmTableInfoMadt9;
- break;
-
- case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
-
- InfoTable = AcpiDmTableInfoMadt10;
- break;
-
- case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
-
- InfoTable = AcpiDmTableInfoMadt11;
- break;
-
- case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
-
- InfoTable = AcpiDmTableInfoMadt12;
- break;
-
- case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
-
- InfoTable = AcpiDmTableInfoMadt13;
- break;
-
- case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
-
- InfoTable = AcpiDmTableInfoMadt14;
- break;
-
- case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
-
- InfoTable = AcpiDmTableInfoMadt15;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
- return (AE_ERROR);
- }
-
- Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPopSubtable ();
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileMcfg
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile MCFG.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileMcfg (
- void **List)
-{
- ACPI_STATUS Status;
-
-
- Status = DtCompileTwoSubtables (List,
- AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
- return (Status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileMpst
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile MPST.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileMpst (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- ACPI_MPST_CHANNEL *MpstChannelInfo;
- ACPI_MPST_POWER_NODE *MpstPowerNode;
- ACPI_MPST_DATA_HDR *MpstDataHeader;
- UINT16 SubtableCount;
- UINT32 PowerStateCount;
- UINT32 ComponentCount;
-
-
- /* Main table */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
- SubtableCount = MpstChannelInfo->PowerNodeCount;
-
- while (*PFieldList && SubtableCount)
- {
- /* Subtable: Memory Power Node(s) */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
- PowerStateCount = MpstPowerNode->NumPowerStates;
- ComponentCount = MpstPowerNode->NumPhysicalComponents;
-
- ParentTable = DtPeekSubtable ();
-
- /* Sub-subtables - Memory Power State Structure(s) */
-
- while (*PFieldList && PowerStateCount)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
- &Subtable, TRUE);
if (ACPI_FAILURE (Status))
{
return (Status);
}
DtInsertSubtable (ParentTable, Subtable);
- PowerStateCount--;
- }
-
- /* Sub-subtables - Physical Component ID Structure(s) */
-
- while (*PFieldList && ComponentCount)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- DtInsertSubtable (ParentTable, Subtable);
- ComponentCount--;
- }
-
- SubtableCount--;
- DtPopSubtable ();
- }
-
- /* Subtable: Count of Memory Power State Characteristic structures */
-
- DtPopSubtable ();
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
- SubtableCount = MpstDataHeader->CharacteristicsCount;
-
- ParentTable = DtPeekSubtable ();
-
- /* Subtable: Memory Power State Characteristics structure(s) */
-
- while (*PFieldList && SubtableCount)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
}
-
- DtInsertSubtable (ParentTable, Subtable);
- SubtableCount--;
}
- DtPopSubtable ();
return (AE_OK);
}
/******************************************************************************
*
- * FUNCTION: DtCompileMsct
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile MSCT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileMsct (
- void **List)
-{
- ACPI_STATUS Status;
-
-
- Status = DtCompileTwoSubtables (List,
- AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
- return (Status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileMtmr
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile MTMR.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileMtmr (
- void **List)
-{
- ACPI_STATUS Status;
-
-
- Status = DtCompileTwoSubtables (List,
- AcpiDmTableInfoMtmr, AcpiDmTableInfoMtmr0);
- return (Status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileNfit
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile NFIT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileNfit (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
- ACPI_NFIT_HEADER *NfitHeader;
- ACPI_DMTABLE_INFO *InfoTable;
- UINT32 Count;
- ACPI_NFIT_INTERLEAVE *Interleave = NULL;
- ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
-
- /* Main table */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- /* Subtables */
-
- while (*PFieldList)
- {
- SubtableStart = *PFieldList;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
-
- switch (NfitHeader->Type)
- {
- case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
-
- InfoTable = AcpiDmTableInfoNfit0;
- break;
-
- case ACPI_NFIT_TYPE_MEMORY_MAP:
-
- InfoTable = AcpiDmTableInfoNfit1;
- break;
-
- case ACPI_NFIT_TYPE_INTERLEAVE:
-
- Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer);
- InfoTable = AcpiDmTableInfoNfit2;
- break;
-
- case ACPI_NFIT_TYPE_SMBIOS:
-
- InfoTable = AcpiDmTableInfoNfit3;
- break;
-
- case ACPI_NFIT_TYPE_CONTROL_REGION:
-
- InfoTable = AcpiDmTableInfoNfit4;
- break;
-
- case ACPI_NFIT_TYPE_DATA_REGION:
-
- InfoTable = AcpiDmTableInfoNfit5;
- break;
-
- case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
-
- Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer);
- InfoTable = AcpiDmTableInfoNfit6;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
- return (AE_ERROR);
- }
-
- Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPopSubtable ();
-
- switch (NfitHeader->Type)
- {
- case ACPI_NFIT_TYPE_INTERLEAVE:
-
- Count = 0;
- DtPushSubtable (Subtable);
- while (*PFieldList)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a,
- &Subtable, FALSE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- if (!Subtable)
- {
- DtPopSubtable ();
- break;
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- Count++;
- }
-
- Interleave->LineCount = Count;
- DtPopSubtable ();
- break;
-
- case ACPI_NFIT_TYPE_SMBIOS:
-
- if (*PFieldList)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- if (Subtable)
- {
- DtInsertSubtable (ParentTable, Subtable);
- }
- }
- break;
-
- case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
-
- Count = 0;
- DtPushSubtable (Subtable);
- while (*PFieldList)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a,
- &Subtable, FALSE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
- if (!Subtable)
- {
- DtPopSubtable ();
- break;
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- Count++;
- }
-
- Hint->HintCount = (UINT16) Count;
- DtPopSubtable ();
- break;
-
- default:
- break;
- }
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompilePcct
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile PCCT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompilePcct (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
- ACPI_SUBTABLE_HEADER *PcctHeader;
- ACPI_DMTABLE_INFO *InfoTable;
-
-
- /* Main table */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- /* Subtables */
-
- while (*PFieldList)
- {
- SubtableStart = *PFieldList;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
-
- switch (PcctHeader->Type)
- {
- case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
-
- InfoTable = AcpiDmTableInfoPcct0;
- break;
-
- case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
-
- InfoTable = AcpiDmTableInfoPcct1;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
- return (AE_ERROR);
- }
-
- Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPopSubtable ();
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompilePmtt
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile PMTT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompilePmtt (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
- ACPI_PMTT_HEADER *PmttHeader;
- ACPI_PMTT_CONTROLLER *PmttController;
- UINT16 DomainCount;
- UINT8 PrevType = ACPI_PMTT_TYPE_SOCKET;
-
-
- /* Main table */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- while (*PFieldList)
- {
- SubtableStart = *PFieldList;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
- while (PrevType >= PmttHeader->Type)
- {
- DtPopSubtable ();
-
- if (PrevType == ACPI_PMTT_TYPE_SOCKET)
- {
- break;
- }
- PrevType--;
- }
- PrevType = PmttHeader->Type;
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- switch (PmttHeader->Type)
- {
- case ACPI_PMTT_TYPE_SOCKET:
-
- /* Subtable: Socket Structure */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- break;
-
- case ACPI_PMTT_TYPE_CONTROLLER:
-
- /* Subtable: Memory Controller Structure */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
- (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
- DomainCount = PmttController->DomainCount;
-
- while (DomainCount)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- DtInsertSubtable (ParentTable, Subtable);
- DomainCount--;
- }
- break;
-
- case ACPI_PMTT_TYPE_DIMM:
-
- /* Subtable: Physical Component Structure */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
- return (AE_ERROR);
- }
- }
-
- return (Status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileRsdt
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile RSDT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileRsdt (
- void **List)
-{
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD *FieldList = *(DT_FIELD **) List;
- UINT32 Address;
-
-
- ParentTable = DtPeekSubtable ();
-
- while (FieldList)
- {
- DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
-
- DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
- DtInsertSubtable (ParentTable, Subtable);
- FieldList = FieldList->Next;
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileS3pt
+ * FUNCTION: DtCompileFacs
*
* PARAMETERS: PFieldList - Current field list pointer
*
* RETURN: Status
*
- * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
+ * DESCRIPTION: Compile FACS.
*
*****************************************************************************/
ACPI_STATUS
-DtCompileS3pt (
+DtCompileFacs (
DT_FIELD **PFieldList)
{
- ACPI_STATUS Status;
- ACPI_S3PT_HEADER *S3ptHeader;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- ACPI_DMTABLE_INFO *InfoTable;
- DT_FIELD *SubtableStart;
-
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
- &Gbl_RootTable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- DtPushSubtable (Gbl_RootTable);
-
- while (*PFieldList)
- {
- SubtableStart = *PFieldList;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- S3ptHeader = ACPI_CAST_PTR (ACPI_S3PT_HEADER, Subtable->Buffer);
-
- switch (S3ptHeader->Type)
- {
- case ACPI_S3PT_TYPE_RESUME:
-
- InfoTable = AcpiDmTableInfoS3pt0;
- break;
-
- case ACPI_S3PT_TYPE_SUSPEND:
-
- InfoTable = AcpiDmTableInfoS3pt1;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
- return (AE_ERROR);
- }
-
- Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPopSubtable ();
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileSlic
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile SLIC.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileSlic (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
-
-
- while (*PFieldList)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
- DtPopSubtable ();
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileSlit
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile SLIT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileSlit (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *FieldList;
- UINT32 Localities;
- UINT8 *LocalityBuffer;
-
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
- LocalityBuffer = UtLocalCalloc (Localities);
-
- /* Compile each locality buffer */
-
- FieldList = *PFieldList;
- while (FieldList)
- {
- DtCompileBuffer (LocalityBuffer,
- FieldList->Value, FieldList, Localities);
-
- DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
- DtInsertSubtable (ParentTable, Subtable);
- FieldList = FieldList->Next;
- }
-
- ACPI_FREE (LocalityBuffer);
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileSrat
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile SRAT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileSrat (
- void **List)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_FIELD *SubtableStart;
- ACPI_SUBTABLE_HEADER *SratHeader;
- ACPI_DMTABLE_INFO *InfoTable;
-
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- while (*PFieldList)
- {
- SubtableStart = *PFieldList;
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPushSubtable (Subtable);
-
- SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
-
- switch (SratHeader->Type)
- {
- case ACPI_SRAT_TYPE_CPU_AFFINITY:
-
- InfoTable = AcpiDmTableInfoSrat0;
- break;
-
- case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
-
- InfoTable = AcpiDmTableInfoSrat1;
- break;
-
- case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
-
- InfoTable = AcpiDmTableInfoSrat2;
- break;
-
- case ACPI_SRAT_TYPE_GICC_AFFINITY:
-
- InfoTable = AcpiDmTableInfoSrat3;
- break;
-
- default:
-
- DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
- return (AE_ERROR);
- }
-
- Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- DtPopSubtable ();
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileStao
- *
- * PARAMETERS: PFieldList - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile STAO.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileStao (
- void **List)
-{
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- ACPI_STATUS Status;
-
-
- /* Compile the main table */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- /* Compile each ASCII namestring as a subtable */
-
- while (*PFieldList)
- {
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtGetGenericTableInfo
- *
- * PARAMETERS: Name - Generic type name
- *
- * RETURN: Info entry
- *
- * DESCRIPTION: Obtain table info for a generic name entry
- *
- *****************************************************************************/
-
-ACPI_DMTABLE_INFO *
-DtGetGenericTableInfo (
- char *Name)
-{
- ACPI_DMTABLE_INFO *Info;
- UINT32 i;
-
-
- if (!Name)
- {
- return (NULL);
- }
-
- /* Search info table for name match */
-
- for (i = 0; ; i++)
- {
- Info = AcpiDmTableInfoGeneric[i];
- if (Info->Opcode == ACPI_DMT_EXIT)
- {
- Info = NULL;
- break;
- }
-
- /* Use caseless compare for generic keywords */
-
- if (!AcpiUtStricmp (Name, Info->Name))
- {
- break;
- }
- }
-
- return (Info);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileUefi
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile UEFI.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileUefi (
- void **List)
-{
- ACPI_STATUS Status;
DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- UINT16 *DataOffset;
-
-
- /* Compile the predefined portion of the UEFI table */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- DataOffset = (UINT16 *) (Subtable->Buffer + 16);
- *DataOffset = sizeof (ACPI_TABLE_UEFI);
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
-
- /*
- * Compile the "generic" portion of the UEFI table. This
- * part of the table is not predefined and any of the generic
- * operators may be used.
- */
-
- DtCompileGeneric ((void **) PFieldList, NULL, NULL);
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileVrtc
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile VRTC.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileVrtc (
- void **List)
-{
- ACPI_STATUS Status;
-
-
- Status = DtCompileTwoSubtables (List,
- AcpiDmTableInfoVrtc, AcpiDmTableInfoVrtc0);
- return (Status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileWdat
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile WDAT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileWdat (
- void **List)
-{
- ACPI_STATUS Status;
-
-
- Status = DtCompileTwoSubtables (List,
- AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
- return (Status);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileWpbt
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile WPBT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileWpbt (
- void **List)
-{
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- ACPI_TABLE_WPBT *Table;
+ UINT8 *ReservedBuffer;
ACPI_STATUS Status;
- UINT16 Length;
-
-
- /* Compile the main table */
-
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt,
- &Subtable, TRUE);
- if (ACPI_FAILURE (Status))
- {
- return (Status);
- }
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
+ UINT32 ReservedSize;
- /* Compile the argument list subtable */
- Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0,
- &Subtable, TRUE);
+ Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs,
+ &Gbl_RootTable, TRUE);
if (ACPI_FAILURE (Status))
{
return (Status);
}
- /* Extract the length of the Arguments buffer, insert into main table */
-
- Length = (UINT16) Subtable->TotalLength;
- Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
- Table->ArgumentsLength = Length;
-
- ParentTable = DtPeekSubtable ();
- DtInsertSubtable (ParentTable, Subtable);
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileXsdt
- *
- * PARAMETERS: List - Current field list pointer
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile XSDT.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileXsdt (
- void **List)
-{
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD *FieldList = *(DT_FIELD **) List;
- UINT64 Address;
-
-
- ParentTable = DtPeekSubtable ();
-
- while (FieldList)
- {
- DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
-
- DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
- DtInsertSubtable (ParentTable, Subtable);
- FieldList = FieldList->Next;
- }
-
- return (AE_OK);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: DtCompileGeneric
- *
- * PARAMETERS: List - Current field list pointer
- * Name - Field name to end generic compiling
- * Length - Compiled table length to return
- *
- * RETURN: Status
- *
- * DESCRIPTION: Compile generic unknown table.
- *
- *****************************************************************************/
-
-ACPI_STATUS
-DtCompileGeneric (
- void **List,
- char *Name,
- UINT32 *Length)
-{
- ACPI_STATUS Status;
- DT_SUBTABLE *Subtable;
- DT_SUBTABLE *ParentTable;
- DT_FIELD **PFieldList = (DT_FIELD **) List;
- ACPI_DMTABLE_INFO *Info;
-
-
- ParentTable = DtPeekSubtable ();
-
- /*
- * Compile the "generic" portion of the table. This
- * part of the table is not predefined and any of the generic
- * operators may be used.
- */
-
- /* Find any and all labels in the entire generic portion */
-
- DtDetectAllLabels (*PFieldList);
-
- /* Now we can actually compile the parse tree */
-
- if (*Length)
- {
- *Length = 0;
- }
- while (*PFieldList)
- {
- if (Name && !ACPI_STRCMP ((*PFieldList)->Name, Name))
- {
- break;
- }
- Info = DtGetGenericTableInfo ((*PFieldList)->Name);
- if (!Info)
- {
- sprintf (MsgBuffer, "Generic data type \"%s\" not found",
- (*PFieldList)->Name);
- DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
- (*PFieldList), MsgBuffer);
-
- *PFieldList = (*PFieldList)->Next;
- continue;
- }
+ /* Large FACS reserved area at the end of the table */
- Status = DtCompileTable (PFieldList, Info,
- &Subtable, TRUE);
- if (ACPI_SUCCESS (Status))
- {
- DtInsertSubtable (ParentTable, Subtable);
- if (Length)
- {
- *Length += Subtable->Length;
- }
- }
- else
- {
- *PFieldList = (*PFieldList)->Next;
+ ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1);
+ ReservedBuffer = UtLocalCalloc (ReservedSize);
- if (Status == AE_NOT_FOUND)
- {
- sprintf (MsgBuffer, "Generic data type \"%s\" not found",
- (*PFieldList)->Name);
- DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
- (*PFieldList), MsgBuffer);
- }
- }
- }
+ DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
+ ACPI_FREE (ReservedBuffer);
+ DtInsertSubtable (Gbl_RootTable, Subtable);
return (AE_OK);
}
OpenPOWER on IntegriCloud