1 /******************************************************************************
3 * Module Name: dttable.c - handling for specific ACPI tables
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2014, Intel Corp.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
46 /* Compile all complex data tables */
48 #include "aslcompiler.h"
49 #include "dtcompiler.h"
51 #define _COMPONENT DT_COMPILER
52 ACPI_MODULE_NAME ("dttable")
55 /* TBD: merge these into dmtbinfo.c? */
57 static ACPI_DMTABLE_INFO TableInfoAsfAddress[] =
59 {ACPI_DMT_BUFFER, 0, "Addresses", 0},
60 {ACPI_DMT_EXIT, 0, NULL, 0}
63 static ACPI_DMTABLE_INFO TableInfoDmarPciPath[] =
65 {ACPI_DMT_PCI_PATH, 0, "PCI Path", 0},
66 {ACPI_DMT_EXIT, 0, NULL, 0}
70 /* TBD: move to acmacros.h */
72 #define ACPI_SUB_PTR(t, a, b) \
73 ACPI_CAST_PTR (t, (ACPI_CAST_PTR (UINT8, (a)) - (ACPI_SIZE)(b)))
76 /* Local prototypes */
79 DtCompileTwoSubtables (
81 ACPI_DMTABLE_INFO *TableInfo1,
82 ACPI_DMTABLE_INFO *TableInfo2);
85 /******************************************************************************
87 * FUNCTION: DtCompileTwoSubtables
89 * PARAMETERS: List - Current field list pointer
90 * TableInfo1 - Info table 1
91 * TableInfo1 - Info table 2
95 * DESCRIPTION: Compile tables with a header and one or more same subtables.
96 * Include CPEP, EINJ, ERST, MCFG, MSCT, WDAT
98 *****************************************************************************/
101 DtCompileTwoSubtables (
103 ACPI_DMTABLE_INFO *TableInfo1,
104 ACPI_DMTABLE_INFO *TableInfo2)
107 DT_SUBTABLE *Subtable;
108 DT_SUBTABLE *ParentTable;
109 DT_FIELD **PFieldList = (DT_FIELD **) List;
112 Status = DtCompileTable (PFieldList, TableInfo1, &Subtable, TRUE);
113 if (ACPI_FAILURE (Status))
118 ParentTable = DtPeekSubtable ();
119 DtInsertSubtable (ParentTable, Subtable);
123 Status = DtCompileTable (PFieldList, TableInfo2, &Subtable, FALSE);
124 if (ACPI_FAILURE (Status))
129 DtInsertSubtable (ParentTable, Subtable);
136 /******************************************************************************
138 * FUNCTION: DtCompileFacs
140 * PARAMETERS: PFieldList - Current field list pointer
144 * DESCRIPTION: Compile FACS.
146 *****************************************************************************/
150 DT_FIELD **PFieldList)
152 DT_SUBTABLE *Subtable;
153 UINT8 *ReservedBuffer;
158 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs,
159 &Gbl_RootTable, TRUE);
160 if (ACPI_FAILURE (Status))
165 /* Large FACS reserved area at the end of the table */
167 ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1);
168 ReservedBuffer = UtLocalCalloc (ReservedSize);
170 DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
172 ACPI_FREE (ReservedBuffer);
173 DtInsertSubtable (Gbl_RootTable, Subtable);
178 /******************************************************************************
180 * FUNCTION: DtCompileRsdp
182 * PARAMETERS: PFieldList - Current field list pointer
186 * DESCRIPTION: Compile RSDP.
188 *****************************************************************************/
192 DT_FIELD **PFieldList)
194 DT_SUBTABLE *Subtable;
195 ACPI_TABLE_RSDP *Rsdp;
196 ACPI_RSDP_EXTENSION *RsdpExtension;
200 /* Compile the "common" RSDP (ACPI 1.0) */
202 Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1,
203 &Gbl_RootTable, TRUE);
204 if (ACPI_FAILURE (Status))
209 Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer);
210 DtSetTableChecksum (&Rsdp->Checksum);
212 if (Rsdp->Revision > 0)
214 /* Compile the "extended" part of the RSDP as a subtable */
216 Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2,
218 if (ACPI_FAILURE (Status))
223 DtInsertSubtable (Gbl_RootTable, Subtable);
225 /* Set length and extended checksum for entire RSDP */
227 RsdpExtension = ACPI_CAST_PTR (ACPI_RSDP_EXTENSION, Subtable->Buffer);
228 RsdpExtension->Length = Gbl_RootTable->Length + Subtable->Length;
229 DtSetTableChecksum (&RsdpExtension->ExtendedChecksum);
236 /******************************************************************************
238 * FUNCTION: DtCompileAsf
240 * PARAMETERS: List - Current field list pointer
244 * DESCRIPTION: Compile ASF!.
246 *****************************************************************************/
252 ACPI_ASF_INFO *AsfTable;
253 DT_SUBTABLE *Subtable;
254 DT_SUBTABLE *ParentTable;
255 ACPI_DMTABLE_INFO *InfoTable;
256 ACPI_DMTABLE_INFO *DataInfoTable = NULL;
257 UINT32 DataCount = 0;
260 DT_FIELD **PFieldList = (DT_FIELD **) List;
261 DT_FIELD *SubtableStart;
266 SubtableStart = *PFieldList;
267 Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr,
269 if (ACPI_FAILURE (Status))
274 ParentTable = DtPeekSubtable ();
275 DtInsertSubtable (ParentTable, Subtable);
276 DtPushSubtable (Subtable);
278 AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer);
280 switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
282 case ACPI_ASF_TYPE_INFO:
284 InfoTable = AcpiDmTableInfoAsf0;
287 case ACPI_ASF_TYPE_ALERT:
289 InfoTable = AcpiDmTableInfoAsf1;
292 case ACPI_ASF_TYPE_CONTROL:
294 InfoTable = AcpiDmTableInfoAsf2;
297 case ACPI_ASF_TYPE_BOOT:
299 InfoTable = AcpiDmTableInfoAsf3;
302 case ACPI_ASF_TYPE_ADDRESS:
304 InfoTable = AcpiDmTableInfoAsf4;
309 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
313 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
314 if (ACPI_FAILURE (Status))
319 ParentTable = DtPeekSubtable ();
320 DtInsertSubtable (ParentTable, Subtable);
322 switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
324 case ACPI_ASF_TYPE_INFO:
326 DataInfoTable = NULL;
329 case ACPI_ASF_TYPE_ALERT:
331 DataInfoTable = AcpiDmTableInfoAsf1a;
332 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT,
333 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
334 sizeof (ACPI_ASF_HEADER)))->Alerts;
337 case ACPI_ASF_TYPE_CONTROL:
339 DataInfoTable = AcpiDmTableInfoAsf2a;
340 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE,
341 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
342 sizeof (ACPI_ASF_HEADER)))->Controls;
345 case ACPI_ASF_TYPE_BOOT:
347 DataInfoTable = NULL;
350 case ACPI_ASF_TYPE_ADDRESS:
352 DataInfoTable = TableInfoAsfAddress;
353 DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS,
354 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
355 sizeof (ACPI_ASF_HEADER)))->Devices;
360 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
366 switch (AsfTable->Header.Type & 0x7F)
368 case ACPI_ASF_TYPE_ADDRESS:
370 while (DataCount > 0)
372 Status = DtCompileTable (PFieldList, DataInfoTable,
374 if (ACPI_FAILURE (Status))
379 DtInsertSubtable (ParentTable, Subtable);
380 DataCount = DataCount - Subtable->Length;
386 for (i = 0; i < DataCount; i++)
388 Status = DtCompileTable (PFieldList, DataInfoTable,
390 if (ACPI_FAILURE (Status))
395 DtInsertSubtable (ParentTable, Subtable);
408 /******************************************************************************
410 * FUNCTION: DtCompileCpep
412 * PARAMETERS: List - Current field list pointer
416 * DESCRIPTION: Compile CPEP.
418 *****************************************************************************/
427 Status = DtCompileTwoSubtables (List,
428 AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0);
433 /******************************************************************************
435 * FUNCTION: DtCompileCsrt
437 * PARAMETERS: List - Current field list pointer
441 * DESCRIPTION: Compile CSRT.
443 *****************************************************************************/
449 ACPI_STATUS Status = AE_OK;
450 DT_SUBTABLE *Subtable;
451 DT_SUBTABLE *ParentTable;
452 DT_FIELD **PFieldList = (DT_FIELD **) List;
453 UINT32 DescriptorCount;
457 /* Subtables (Resource Groups) */
461 /* Resource group subtable */
463 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt0,
465 if (ACPI_FAILURE (Status))
470 /* Compute the number of resource descriptors */
473 (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
474 Subtable->Buffer))->Length -
475 (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
476 Subtable->Buffer))->SharedInfoLength -
477 sizeof (ACPI_CSRT_GROUP);
479 DescriptorCount = (GroupLength /
480 sizeof (ACPI_CSRT_DESCRIPTOR));
482 ParentTable = DtPeekSubtable ();
483 DtInsertSubtable (ParentTable, Subtable);
484 DtPushSubtable (Subtable);
486 /* Shared info subtable (One per resource group) */
488 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt1,
490 if (ACPI_FAILURE (Status))
495 ParentTable = DtPeekSubtable ();
496 DtInsertSubtable (ParentTable, Subtable);
498 /* Sub-Subtables (Resource Descriptors) */
500 while (*PFieldList && DescriptorCount)
502 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2,
504 if (ACPI_FAILURE (Status))
509 ParentTable = DtPeekSubtable ();
510 DtInsertSubtable (ParentTable, Subtable);
521 /******************************************************************************
523 * FUNCTION: DtCompileDbg2
525 * PARAMETERS: List - Current field list pointer
529 * DESCRIPTION: Compile DBG2.
531 *****************************************************************************/
538 DT_SUBTABLE *Subtable;
539 DT_SUBTABLE *ParentTable;
540 DT_FIELD **PFieldList = (DT_FIELD **) List;
541 UINT32 SubtableCount;
542 ACPI_DBG2_HEADER *Dbg2Header;
543 ACPI_DBG2_DEVICE *DeviceInfo;
544 UINT16 CurrentOffset;
550 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2, &Subtable, TRUE);
551 if (ACPI_FAILURE (Status))
556 ParentTable = DtPeekSubtable ();
557 DtInsertSubtable (ParentTable, Subtable);
559 /* Main table fields */
561 Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer);
562 Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF (
563 ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header);
565 SubtableCount = Dbg2Header->InfoCount;
566 DtPushSubtable (Subtable);
568 /* Process all Device Information subtables (Count = InfoCount) */
570 while (*PFieldList && SubtableCount)
572 /* Subtable: Debug Device Information */
574 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Device,
576 if (ACPI_FAILURE (Status))
581 DeviceInfo = ACPI_CAST_PTR (ACPI_DBG2_DEVICE, Subtable->Buffer);
582 CurrentOffset = (UINT16) sizeof (ACPI_DBG2_DEVICE);
584 ParentTable = DtPeekSubtable ();
585 DtInsertSubtable (ParentTable, Subtable);
586 DtPushSubtable (Subtable);
588 ParentTable = DtPeekSubtable ();
590 /* BaseAddressRegister GAS array (Required, size is RegisterCount) */
592 DeviceInfo->BaseAddressOffset = CurrentOffset;
593 for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
595 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr,
597 if (ACPI_FAILURE (Status))
602 CurrentOffset += (UINT16) sizeof (ACPI_GENERIC_ADDRESS);
603 DtInsertSubtable (ParentTable, Subtable);
606 /* AddressSize array (Required, size = RegisterCount) */
608 DeviceInfo->AddressSizeOffset = CurrentOffset;
609 for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
611 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size,
613 if (ACPI_FAILURE (Status))
618 CurrentOffset += (UINT16) sizeof (UINT32);
619 DtInsertSubtable (ParentTable, Subtable);
622 /* NamespaceString device identifier (Required, size = NamePathLength) */
624 DeviceInfo->NamepathOffset = CurrentOffset;
625 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name,
627 if (ACPI_FAILURE (Status))
632 /* Update the device info header */
634 DeviceInfo->NamepathLength = (UINT16) Subtable->Length;
635 CurrentOffset += (UINT16) DeviceInfo->NamepathLength;
636 DtInsertSubtable (ParentTable, Subtable);
638 /* OemData - Variable-length data (Optional, size = OemDataLength) */
640 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2OemData,
642 if (ACPI_FAILURE (Status))
647 /* Update the device info header (zeros if no OEM data present) */
649 DeviceInfo->OemDataOffset = 0;
650 DeviceInfo->OemDataLength = 0;
652 /* Optional subtable (OemData) */
654 if (Subtable && Subtable->Length)
656 DeviceInfo->OemDataOffset = CurrentOffset;
657 DeviceInfo->OemDataLength = (UINT16) Subtable->Length;
659 DtInsertSubtable (ParentTable, Subtable);
663 DtPopSubtable (); /* Get next Device Information subtable */
671 /******************************************************************************
673 * FUNCTION: DtCompileDmar
675 * PARAMETERS: List - Current field list pointer
679 * DESCRIPTION: Compile DMAR.
681 *****************************************************************************/
688 DT_SUBTABLE *Subtable;
689 DT_SUBTABLE *ParentTable;
690 DT_FIELD **PFieldList = (DT_FIELD **) List;
691 DT_FIELD *SubtableStart;
692 ACPI_DMTABLE_INFO *InfoTable;
693 ACPI_DMAR_HEADER *DmarHeader;
694 ACPI_DMAR_DEVICE_SCOPE *DmarDeviceScope;
695 UINT32 DeviceScopeLength;
696 UINT32 PciPathLength;
699 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE);
700 if (ACPI_FAILURE (Status))
705 ParentTable = DtPeekSubtable ();
706 DtInsertSubtable (ParentTable, Subtable);
707 DtPushSubtable (Subtable);
713 SubtableStart = *PFieldList;
714 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr,
716 if (ACPI_FAILURE (Status))
721 ParentTable = DtPeekSubtable ();
722 DtInsertSubtable (ParentTable, Subtable);
723 DtPushSubtable (Subtable);
725 DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
727 switch (DmarHeader->Type)
729 case ACPI_DMAR_TYPE_HARDWARE_UNIT:
731 InfoTable = AcpiDmTableInfoDmar0;
734 case ACPI_DMAR_TYPE_RESERVED_MEMORY:
736 InfoTable = AcpiDmTableInfoDmar1;
739 case ACPI_DMAR_TYPE_ROOT_ATS:
741 InfoTable = AcpiDmTableInfoDmar2;
744 case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
746 InfoTable = AcpiDmTableInfoDmar3;
749 case ACPI_DMAR_TYPE_NAMESPACE:
751 InfoTable = AcpiDmTableInfoDmar4;
756 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
762 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
763 if (ACPI_FAILURE (Status))
768 ParentTable = DtPeekSubtable ();
769 DtInsertSubtable (ParentTable, Subtable);
772 * Optional Device Scope subtables
774 if ((DmarHeader->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
775 (DmarHeader->Type == ACPI_DMAR_TYPE_NAMESPACE))
777 /* These types do not support device scopes */
783 DtPushSubtable (Subtable);
784 DeviceScopeLength = DmarHeader->Length - Subtable->Length -
786 while (DeviceScopeLength)
788 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
790 if (Status == AE_NOT_FOUND)
795 ParentTable = DtPeekSubtable ();
796 DtInsertSubtable (ParentTable, Subtable);
797 DtPushSubtable (Subtable);
799 DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer);
801 /* Optional PCI Paths */
803 PciPathLength = DmarDeviceScope->Length - Subtable->Length;
804 while (PciPathLength)
806 Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
808 if (Status == AE_NOT_FOUND)
814 ParentTable = DtPeekSubtable ();
815 DtInsertSubtable (ParentTable, Subtable);
816 PciPathLength -= Subtable->Length;
820 DeviceScopeLength -= DmarDeviceScope->Length;
831 /******************************************************************************
833 * FUNCTION: DtCompileEinj
835 * PARAMETERS: List - Current field list pointer
839 * DESCRIPTION: Compile EINJ.
841 *****************************************************************************/
850 Status = DtCompileTwoSubtables (List,
851 AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
856 /******************************************************************************
858 * FUNCTION: DtCompileErst
860 * PARAMETERS: List - Current field list pointer
864 * DESCRIPTION: Compile ERST.
866 *****************************************************************************/
875 Status = DtCompileTwoSubtables (List,
876 AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
881 /******************************************************************************
883 * FUNCTION: DtCompileFadt
885 * PARAMETERS: List - Current field list pointer
889 * DESCRIPTION: Compile FADT.
891 *****************************************************************************/
898 DT_SUBTABLE *Subtable;
899 DT_SUBTABLE *ParentTable;
900 DT_FIELD **PFieldList = (DT_FIELD **) List;
901 ACPI_TABLE_HEADER *Table;
905 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1,
907 if (ACPI_FAILURE (Status))
912 ParentTable = DtPeekSubtable ();
913 DtInsertSubtable (ParentTable, Subtable);
915 Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
916 Revision = Table->Revision;
920 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2,
922 if (ACPI_FAILURE (Status))
927 DtInsertSubtable (ParentTable, Subtable);
929 else if (Revision >= 2)
931 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3,
933 if (ACPI_FAILURE (Status))
938 DtInsertSubtable (ParentTable, Subtable);
942 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5,
944 if (ACPI_FAILURE (Status))
949 DtInsertSubtable (ParentTable, Subtable);
956 /******************************************************************************
958 * FUNCTION: DtCompileGtdt
960 * PARAMETERS: List - Current field list pointer
964 * DESCRIPTION: Compile GTDT.
966 *****************************************************************************/
973 DT_SUBTABLE *Subtable;
974 DT_SUBTABLE *ParentTable;
975 DT_FIELD **PFieldList = (DT_FIELD **) List;
976 DT_FIELD *SubtableStart;
977 ACPI_SUBTABLE_HEADER *GtdtHeader;
978 ACPI_DMTABLE_INFO *InfoTable;
982 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt,
984 if (ACPI_FAILURE (Status))
989 ParentTable = DtPeekSubtable ();
990 DtInsertSubtable (ParentTable, Subtable);
994 SubtableStart = *PFieldList;
995 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdtHdr,
997 if (ACPI_FAILURE (Status))
1002 ParentTable = DtPeekSubtable ();
1003 DtInsertSubtable (ParentTable, Subtable);
1004 DtPushSubtable (Subtable);
1006 GtdtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1008 switch (GtdtHeader->Type)
1010 case ACPI_GTDT_TYPE_TIMER_BLOCK:
1012 InfoTable = AcpiDmTableInfoGtdt0;
1015 case ACPI_GTDT_TYPE_WATCHDOG:
1017 InfoTable = AcpiDmTableInfoGtdt1;
1022 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "GTDT");
1026 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1027 if (ACPI_FAILURE (Status))
1032 ParentTable = DtPeekSubtable ();
1033 DtInsertSubtable (ParentTable, Subtable);
1036 * Additional GT block subtable data
1039 switch (GtdtHeader->Type)
1041 case ACPI_GTDT_TYPE_TIMER_BLOCK:
1043 DtPushSubtable (Subtable);
1044 ParentTable = DtPeekSubtable ();
1046 GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1047 Subtable->Buffer - sizeof(ACPI_GTDT_HEADER)))->TimerCount;
1050 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt0a,
1052 if (ACPI_FAILURE (Status))
1058 DtInsertSubtable (ParentTable, Subtable);
1076 /******************************************************************************
1078 * FUNCTION: DtCompileFpdt
1080 * PARAMETERS: List - Current field list pointer
1084 * DESCRIPTION: Compile FPDT.
1086 *****************************************************************************/
1093 ACPI_FPDT_HEADER *FpdtHeader;
1094 DT_SUBTABLE *Subtable;
1095 DT_SUBTABLE *ParentTable;
1096 ACPI_DMTABLE_INFO *InfoTable;
1097 DT_FIELD **PFieldList = (DT_FIELD **) List;
1098 DT_FIELD *SubtableStart;
1103 SubtableStart = *PFieldList;
1104 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr,
1106 if (ACPI_FAILURE (Status))
1111 ParentTable = DtPeekSubtable ();
1112 DtInsertSubtable (ParentTable, Subtable);
1113 DtPushSubtable (Subtable);
1115 FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
1117 switch (FpdtHeader->Type)
1119 case ACPI_FPDT_TYPE_BOOT:
1121 InfoTable = AcpiDmTableInfoFpdt0;
1124 case ACPI_FPDT_TYPE_S3PERF:
1126 InfoTable = AcpiDmTableInfoFpdt1;
1131 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT");
1136 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1137 if (ACPI_FAILURE (Status))
1142 ParentTable = DtPeekSubtable ();
1143 DtInsertSubtable (ParentTable, Subtable);
1151 /******************************************************************************
1153 * FUNCTION: DtCompileHest
1155 * PARAMETERS: List - Current field list pointer
1159 * DESCRIPTION: Compile HEST.
1161 *****************************************************************************/
1168 DT_SUBTABLE *Subtable;
1169 DT_SUBTABLE *ParentTable;
1170 DT_FIELD **PFieldList = (DT_FIELD **) List;
1171 DT_FIELD *SubtableStart;
1172 ACPI_DMTABLE_INFO *InfoTable;
1177 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
1179 if (ACPI_FAILURE (Status))
1184 ParentTable = DtPeekSubtable ();
1185 DtInsertSubtable (ParentTable, Subtable);
1189 /* Get subtable type */
1191 SubtableStart = *PFieldList;
1192 DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
1196 case ACPI_HEST_TYPE_IA32_CHECK:
1198 InfoTable = AcpiDmTableInfoHest0;
1201 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1203 InfoTable = AcpiDmTableInfoHest1;
1206 case ACPI_HEST_TYPE_IA32_NMI:
1208 InfoTable = AcpiDmTableInfoHest2;
1211 case ACPI_HEST_TYPE_AER_ROOT_PORT:
1213 InfoTable = AcpiDmTableInfoHest6;
1216 case ACPI_HEST_TYPE_AER_ENDPOINT:
1218 InfoTable = AcpiDmTableInfoHest7;
1221 case ACPI_HEST_TYPE_AER_BRIDGE:
1223 InfoTable = AcpiDmTableInfoHest8;
1226 case ACPI_HEST_TYPE_GENERIC_ERROR:
1228 InfoTable = AcpiDmTableInfoHest9;
1233 /* Cannot continue on unknown type */
1235 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
1239 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1240 if (ACPI_FAILURE (Status))
1245 DtInsertSubtable (ParentTable, Subtable);
1248 * Additional subtable data - IA32 Error Bank(s)
1253 case ACPI_HEST_TYPE_IA32_CHECK:
1255 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1256 Subtable->Buffer))->NumHardwareBanks;
1259 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1261 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1262 Subtable->Buffer))->NumHardwareBanks;
1272 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
1274 if (ACPI_FAILURE (Status))
1279 DtInsertSubtable (ParentTable, Subtable);
1288 /******************************************************************************
1290 * FUNCTION: DtCompileIvrs
1292 * PARAMETERS: List - Current field list pointer
1296 * DESCRIPTION: Compile IVRS.
1298 *****************************************************************************/
1305 DT_SUBTABLE *Subtable;
1306 DT_SUBTABLE *ParentTable;
1307 DT_FIELD **PFieldList = (DT_FIELD **) List;
1308 DT_FIELD *SubtableStart;
1309 ACPI_DMTABLE_INFO *InfoTable;
1310 ACPI_IVRS_HEADER *IvrsHeader;
1314 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
1316 if (ACPI_FAILURE (Status))
1321 ParentTable = DtPeekSubtable ();
1322 DtInsertSubtable (ParentTable, Subtable);
1326 SubtableStart = *PFieldList;
1327 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr,
1329 if (ACPI_FAILURE (Status))
1334 ParentTable = DtPeekSubtable ();
1335 DtInsertSubtable (ParentTable, Subtable);
1336 DtPushSubtable (Subtable);
1338 IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer);
1340 switch (IvrsHeader->Type)
1342 case ACPI_IVRS_TYPE_HARDWARE:
1344 InfoTable = AcpiDmTableInfoIvrs0;
1347 case ACPI_IVRS_TYPE_MEMORY1:
1348 case ACPI_IVRS_TYPE_MEMORY2:
1349 case ACPI_IVRS_TYPE_MEMORY3:
1351 InfoTable = AcpiDmTableInfoIvrs1;
1356 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS");
1360 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1361 if (ACPI_FAILURE (Status))
1366 ParentTable = DtPeekSubtable ();
1367 DtInsertSubtable (ParentTable, Subtable);
1369 if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE)
1371 while (*PFieldList &&
1372 !ACPI_STRCMP ((*PFieldList)->Name, "Entry Type"))
1374 SubtableStart = *PFieldList;
1375 DtCompileInteger (&EntryType, *PFieldList, 1, 0);
1379 /* 4-byte device entries */
1381 case ACPI_IVRS_TYPE_PAD4:
1382 case ACPI_IVRS_TYPE_ALL:
1383 case ACPI_IVRS_TYPE_SELECT:
1384 case ACPI_IVRS_TYPE_START:
1385 case ACPI_IVRS_TYPE_END:
1387 InfoTable = AcpiDmTableInfoIvrs4;
1390 /* 8-byte entries, type A */
1392 case ACPI_IVRS_TYPE_ALIAS_SELECT:
1393 case ACPI_IVRS_TYPE_ALIAS_START:
1395 InfoTable = AcpiDmTableInfoIvrs8a;
1398 /* 8-byte entries, type B */
1400 case ACPI_IVRS_TYPE_PAD8:
1401 case ACPI_IVRS_TYPE_EXT_SELECT:
1402 case ACPI_IVRS_TYPE_EXT_START:
1404 InfoTable = AcpiDmTableInfoIvrs8b;
1407 /* 8-byte entries, type C */
1409 case ACPI_IVRS_TYPE_SPECIAL:
1411 InfoTable = AcpiDmTableInfoIvrs8c;
1416 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
1417 "IVRS Device Entry");
1421 Status = DtCompileTable (PFieldList, InfoTable,
1423 if (ACPI_FAILURE (Status))
1428 DtInsertSubtable (ParentTable, Subtable);
1439 /******************************************************************************
1441 * FUNCTION: DtCompileLpit
1443 * PARAMETERS: List - Current field list pointer
1447 * DESCRIPTION: Compile LPIT.
1449 *****************************************************************************/
1456 DT_SUBTABLE *Subtable;
1457 DT_SUBTABLE *ParentTable;
1458 DT_FIELD **PFieldList = (DT_FIELD **) List;
1459 DT_FIELD *SubtableStart;
1460 ACPI_DMTABLE_INFO *InfoTable;
1461 ACPI_LPIT_HEADER *LpitHeader;
1464 /* Note: Main table consists only of the standard ACPI table header */
1468 SubtableStart = *PFieldList;
1470 /* LPIT Subtable header */
1472 Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr,
1474 if (ACPI_FAILURE (Status))
1479 ParentTable = DtPeekSubtable ();
1480 DtInsertSubtable (ParentTable, Subtable);
1481 DtPushSubtable (Subtable);
1483 LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer);
1485 switch (LpitHeader->Type)
1487 case ACPI_LPIT_TYPE_NATIVE_CSTATE:
1489 InfoTable = AcpiDmTableInfoLpit0;
1492 case ACPI_LPIT_TYPE_SIMPLE_IO:
1494 InfoTable = AcpiDmTableInfoLpit1;
1499 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT");
1505 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1506 if (ACPI_FAILURE (Status))
1511 ParentTable = DtPeekSubtable ();
1512 DtInsertSubtable (ParentTable, Subtable);
1520 /******************************************************************************
1522 * FUNCTION: DtCompileMadt
1524 * PARAMETERS: List - Current field list pointer
1528 * DESCRIPTION: Compile MADT.
1530 *****************************************************************************/
1537 DT_SUBTABLE *Subtable;
1538 DT_SUBTABLE *ParentTable;
1539 DT_FIELD **PFieldList = (DT_FIELD **) List;
1540 DT_FIELD *SubtableStart;
1541 ACPI_SUBTABLE_HEADER *MadtHeader;
1542 ACPI_DMTABLE_INFO *InfoTable;
1545 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
1547 if (ACPI_FAILURE (Status))
1552 ParentTable = DtPeekSubtable ();
1553 DtInsertSubtable (ParentTable, Subtable);
1557 SubtableStart = *PFieldList;
1558 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
1560 if (ACPI_FAILURE (Status))
1565 ParentTable = DtPeekSubtable ();
1566 DtInsertSubtable (ParentTable, Subtable);
1567 DtPushSubtable (Subtable);
1569 MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1571 switch (MadtHeader->Type)
1573 case ACPI_MADT_TYPE_LOCAL_APIC:
1575 InfoTable = AcpiDmTableInfoMadt0;
1578 case ACPI_MADT_TYPE_IO_APIC:
1580 InfoTable = AcpiDmTableInfoMadt1;
1583 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1585 InfoTable = AcpiDmTableInfoMadt2;
1588 case ACPI_MADT_TYPE_NMI_SOURCE:
1590 InfoTable = AcpiDmTableInfoMadt3;
1593 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1595 InfoTable = AcpiDmTableInfoMadt4;
1598 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1600 InfoTable = AcpiDmTableInfoMadt5;
1603 case ACPI_MADT_TYPE_IO_SAPIC:
1605 InfoTable = AcpiDmTableInfoMadt6;
1608 case ACPI_MADT_TYPE_LOCAL_SAPIC:
1610 InfoTable = AcpiDmTableInfoMadt7;
1613 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1615 InfoTable = AcpiDmTableInfoMadt8;
1618 case ACPI_MADT_TYPE_LOCAL_X2APIC:
1620 InfoTable = AcpiDmTableInfoMadt9;
1623 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1625 InfoTable = AcpiDmTableInfoMadt10;
1628 case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
1630 InfoTable = AcpiDmTableInfoMadt11;
1633 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
1635 InfoTable = AcpiDmTableInfoMadt12;
1638 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
1640 InfoTable = AcpiDmTableInfoMadt13;
1643 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
1645 InfoTable = AcpiDmTableInfoMadt14;
1650 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
1654 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1655 if (ACPI_FAILURE (Status))
1660 ParentTable = DtPeekSubtable ();
1661 DtInsertSubtable (ParentTable, Subtable);
1669 /******************************************************************************
1671 * FUNCTION: DtCompileMcfg
1673 * PARAMETERS: List - Current field list pointer
1677 * DESCRIPTION: Compile MCFG.
1679 *****************************************************************************/
1688 Status = DtCompileTwoSubtables (List,
1689 AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
1694 /******************************************************************************
1696 * FUNCTION: DtCompileMpst
1698 * PARAMETERS: List - Current field list pointer
1702 * DESCRIPTION: Compile MPST.
1704 *****************************************************************************/
1711 DT_SUBTABLE *Subtable;
1712 DT_SUBTABLE *ParentTable;
1713 DT_FIELD **PFieldList = (DT_FIELD **) List;
1714 ACPI_MPST_CHANNEL *MpstChannelInfo;
1715 ACPI_MPST_POWER_NODE *MpstPowerNode;
1716 ACPI_MPST_DATA_HDR *MpstDataHeader;
1717 UINT16 SubtableCount;
1718 UINT32 PowerStateCount;
1719 UINT32 ComponentCount;
1724 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable, TRUE);
1725 if (ACPI_FAILURE (Status))
1730 ParentTable = DtPeekSubtable ();
1731 DtInsertSubtable (ParentTable, Subtable);
1732 DtPushSubtable (Subtable);
1734 MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
1735 SubtableCount = MpstChannelInfo->PowerNodeCount;
1737 while (*PFieldList && SubtableCount)
1739 /* Subtable: Memory Power Node(s) */
1741 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
1743 if (ACPI_FAILURE (Status))
1748 ParentTable = DtPeekSubtable ();
1749 DtInsertSubtable (ParentTable, Subtable);
1750 DtPushSubtable (Subtable);
1752 MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
1753 PowerStateCount = MpstPowerNode->NumPowerStates;
1754 ComponentCount = MpstPowerNode->NumPhysicalComponents;
1756 ParentTable = DtPeekSubtable ();
1758 /* Sub-subtables - Memory Power State Structure(s) */
1760 while (*PFieldList && PowerStateCount)
1762 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
1764 if (ACPI_FAILURE (Status))
1769 DtInsertSubtable (ParentTable, Subtable);
1773 /* Sub-subtables - Physical Component ID Structure(s) */
1775 while (*PFieldList && ComponentCount)
1777 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
1779 if (ACPI_FAILURE (Status))
1784 DtInsertSubtable (ParentTable, Subtable);
1792 /* Subtable: Count of Memory Power State Characteristic structures */
1796 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable, TRUE);
1797 if (ACPI_FAILURE (Status))
1802 ParentTable = DtPeekSubtable ();
1803 DtInsertSubtable (ParentTable, Subtable);
1804 DtPushSubtable (Subtable);
1806 MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
1807 SubtableCount = MpstDataHeader->CharacteristicsCount;
1809 ParentTable = DtPeekSubtable ();
1811 /* Subtable: Memory Power State Characteristics structure(s) */
1813 while (*PFieldList && SubtableCount)
1815 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
1817 if (ACPI_FAILURE (Status))
1822 DtInsertSubtable (ParentTable, Subtable);
1831 /******************************************************************************
1833 * FUNCTION: DtCompileMsct
1835 * PARAMETERS: List - Current field list pointer
1839 * DESCRIPTION: Compile MSCT.
1841 *****************************************************************************/
1850 Status = DtCompileTwoSubtables (List,
1851 AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
1856 /******************************************************************************
1858 * FUNCTION: DtCompileMtmr
1860 * PARAMETERS: List - Current field list pointer
1864 * DESCRIPTION: Compile MTMR.
1866 *****************************************************************************/
1875 Status = DtCompileTwoSubtables (List,
1876 AcpiDmTableInfoMtmr, AcpiDmTableInfoMtmr0);
1881 /******************************************************************************
1883 * FUNCTION: DtCompilePcct
1885 * PARAMETERS: List - Current field list pointer
1889 * DESCRIPTION: Compile PCCT.
1891 *****************************************************************************/
1898 DT_SUBTABLE *Subtable;
1899 DT_SUBTABLE *ParentTable;
1900 DT_FIELD **PFieldList = (DT_FIELD **) List;
1901 DT_FIELD *SubtableStart;
1902 ACPI_SUBTABLE_HEADER *PcctHeader;
1903 ACPI_DMTABLE_INFO *InfoTable;
1906 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
1908 if (ACPI_FAILURE (Status))
1913 ParentTable = DtPeekSubtable ();
1914 DtInsertSubtable (ParentTable, Subtable);
1918 SubtableStart = *PFieldList;
1919 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
1921 if (ACPI_FAILURE (Status))
1926 ParentTable = DtPeekSubtable ();
1927 DtInsertSubtable (ParentTable, Subtable);
1928 DtPushSubtable (Subtable);
1930 PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1932 switch (PcctHeader->Type)
1934 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
1936 InfoTable = AcpiDmTableInfoPcct0;
1939 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
1941 InfoTable = AcpiDmTableInfoPcct1;
1946 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
1950 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1951 if (ACPI_FAILURE (Status))
1956 ParentTable = DtPeekSubtable ();
1957 DtInsertSubtable (ParentTable, Subtable);
1965 /******************************************************************************
1967 * FUNCTION: DtCompilePmtt
1969 * PARAMETERS: List - Current field list pointer
1973 * DESCRIPTION: Compile PMTT.
1975 *****************************************************************************/
1982 DT_SUBTABLE *Subtable;
1983 DT_SUBTABLE *ParentTable;
1984 DT_FIELD **PFieldList = (DT_FIELD **) List;
1985 DT_FIELD *SubtableStart;
1986 ACPI_PMTT_HEADER *PmttHeader;
1987 ACPI_PMTT_CONTROLLER *PmttController;
1989 UINT8 PrevType = ACPI_PMTT_TYPE_SOCKET;
1994 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable, TRUE);
1995 if (ACPI_FAILURE (Status))
2000 ParentTable = DtPeekSubtable ();
2001 DtInsertSubtable (ParentTable, Subtable);
2002 DtPushSubtable (Subtable);
2006 SubtableStart = *PFieldList;
2007 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
2009 if (ACPI_FAILURE (Status))
2014 PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
2015 while (PrevType >= PmttHeader->Type)
2019 if (PrevType == ACPI_PMTT_TYPE_SOCKET)
2025 PrevType = PmttHeader->Type;
2027 ParentTable = DtPeekSubtable ();
2028 DtInsertSubtable (ParentTable, Subtable);
2029 DtPushSubtable (Subtable);
2031 switch (PmttHeader->Type)
2033 case ACPI_PMTT_TYPE_SOCKET:
2035 /* Subtable: Socket Structure */
2037 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
2039 if (ACPI_FAILURE (Status))
2044 ParentTable = DtPeekSubtable ();
2045 DtInsertSubtable (ParentTable, Subtable);
2048 case ACPI_PMTT_TYPE_CONTROLLER:
2050 /* Subtable: Memory Controller Structure */
2052 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
2054 if (ACPI_FAILURE (Status))
2059 ParentTable = DtPeekSubtable ();
2060 DtInsertSubtable (ParentTable, Subtable);
2062 PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
2063 (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
2064 DomainCount = PmttController->DomainCount;
2068 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
2070 if (ACPI_FAILURE (Status))
2075 DtInsertSubtable (ParentTable, Subtable);
2080 case ACPI_PMTT_TYPE_DIMM:
2082 /* Subtable: Physical Component Structure */
2084 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
2086 if (ACPI_FAILURE (Status))
2091 ParentTable = DtPeekSubtable ();
2092 DtInsertSubtable (ParentTable, Subtable);
2097 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
2106 /******************************************************************************
2108 * FUNCTION: DtCompileRsdt
2110 * PARAMETERS: List - Current field list pointer
2114 * DESCRIPTION: Compile RSDT.
2116 *****************************************************************************/
2122 DT_SUBTABLE *Subtable;
2123 DT_SUBTABLE *ParentTable;
2124 DT_FIELD *FieldList = *(DT_FIELD **) List;
2128 ParentTable = DtPeekSubtable ();
2132 DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
2134 DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
2135 DtInsertSubtable (ParentTable, Subtable);
2136 FieldList = FieldList->Next;
2143 /******************************************************************************
2145 * FUNCTION: DtCompileS3pt
2147 * PARAMETERS: PFieldList - Current field list pointer
2151 * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
2153 *****************************************************************************/
2157 DT_FIELD **PFieldList)
2160 ACPI_S3PT_HEADER *S3ptHeader;
2161 DT_SUBTABLE *Subtable;
2162 DT_SUBTABLE *ParentTable;
2163 ACPI_DMTABLE_INFO *InfoTable;
2164 DT_FIELD *SubtableStart;
2167 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
2168 &Gbl_RootTable, TRUE);
2169 if (ACPI_FAILURE (Status))
2174 DtPushSubtable (Gbl_RootTable);
2178 SubtableStart = *PFieldList;
2179 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
2181 if (ACPI_FAILURE (Status))
2186 ParentTable = DtPeekSubtable ();
2187 DtInsertSubtable (ParentTable, Subtable);
2188 DtPushSubtable (Subtable);
2190 S3ptHeader = ACPI_CAST_PTR (ACPI_S3PT_HEADER, Subtable->Buffer);
2192 switch (S3ptHeader->Type)
2194 case ACPI_S3PT_TYPE_RESUME:
2196 InfoTable = AcpiDmTableInfoS3pt0;
2199 case ACPI_S3PT_TYPE_SUSPEND:
2201 InfoTable = AcpiDmTableInfoS3pt1;
2206 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
2210 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
2211 if (ACPI_FAILURE (Status))
2216 ParentTable = DtPeekSubtable ();
2217 DtInsertSubtable (ParentTable, Subtable);
2225 /******************************************************************************
2227 * FUNCTION: DtCompileSlic
2229 * PARAMETERS: List - Current field list pointer
2233 * DESCRIPTION: Compile SLIC.
2235 *****************************************************************************/
2242 DT_SUBTABLE *Subtable;
2243 DT_SUBTABLE *ParentTable;
2244 DT_FIELD **PFieldList = (DT_FIELD **) List;
2245 DT_FIELD *SubtableStart;
2246 ACPI_SLIC_HEADER *SlicHeader;
2247 ACPI_DMTABLE_INFO *InfoTable;
2252 SubtableStart = *PFieldList;
2253 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlicHdr,
2255 if (ACPI_FAILURE (Status))
2260 ParentTable = DtPeekSubtable ();
2261 DtInsertSubtable (ParentTable, Subtable);
2262 DtPushSubtable (Subtable);
2264 SlicHeader = ACPI_CAST_PTR (ACPI_SLIC_HEADER, Subtable->Buffer);
2266 switch (SlicHeader->Type)
2268 case ACPI_SLIC_TYPE_PUBLIC_KEY:
2270 InfoTable = AcpiDmTableInfoSlic0;
2273 case ACPI_SLIC_TYPE_WINDOWS_MARKER:
2275 InfoTable = AcpiDmTableInfoSlic1;
2280 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SLIC");
2284 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
2285 if (ACPI_FAILURE (Status))
2290 ParentTable = DtPeekSubtable ();
2291 DtInsertSubtable (ParentTable, Subtable);
2299 /******************************************************************************
2301 * FUNCTION: DtCompileSlit
2303 * PARAMETERS: List - Current field list pointer
2307 * DESCRIPTION: Compile SLIT.
2309 *****************************************************************************/
2316 DT_SUBTABLE *Subtable;
2317 DT_SUBTABLE *ParentTable;
2318 DT_FIELD **PFieldList = (DT_FIELD **) List;
2319 DT_FIELD *FieldList;
2321 UINT8 *LocalityBuffer;
2324 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
2326 if (ACPI_FAILURE (Status))
2331 ParentTable = DtPeekSubtable ();
2332 DtInsertSubtable (ParentTable, Subtable);
2334 Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
2335 LocalityBuffer = UtLocalCalloc (Localities);
2337 /* Compile each locality buffer */
2339 FieldList = *PFieldList;
2342 DtCompileBuffer (LocalityBuffer,
2343 FieldList->Value, FieldList, Localities);
2345 DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
2346 DtInsertSubtable (ParentTable, Subtable);
2347 FieldList = FieldList->Next;
2350 ACPI_FREE (LocalityBuffer);
2355 /******************************************************************************
2357 * FUNCTION: DtCompileSrat
2359 * PARAMETERS: List - Current field list pointer
2363 * DESCRIPTION: Compile SRAT.
2365 *****************************************************************************/
2372 DT_SUBTABLE *Subtable;
2373 DT_SUBTABLE *ParentTable;
2374 DT_FIELD **PFieldList = (DT_FIELD **) List;
2375 DT_FIELD *SubtableStart;
2376 ACPI_SUBTABLE_HEADER *SratHeader;
2377 ACPI_DMTABLE_INFO *InfoTable;
2380 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
2382 if (ACPI_FAILURE (Status))
2387 ParentTable = DtPeekSubtable ();
2388 DtInsertSubtable (ParentTable, Subtable);
2392 SubtableStart = *PFieldList;
2393 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
2395 if (ACPI_FAILURE (Status))
2400 ParentTable = DtPeekSubtable ();
2401 DtInsertSubtable (ParentTable, Subtable);
2402 DtPushSubtable (Subtable);
2404 SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
2406 switch (SratHeader->Type)
2408 case ACPI_SRAT_TYPE_CPU_AFFINITY:
2410 InfoTable = AcpiDmTableInfoSrat0;
2413 case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
2415 InfoTable = AcpiDmTableInfoSrat1;
2418 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
2420 InfoTable = AcpiDmTableInfoSrat2;
2425 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
2429 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
2430 if (ACPI_FAILURE (Status))
2435 ParentTable = DtPeekSubtable ();
2436 DtInsertSubtable (ParentTable, Subtable);
2444 /******************************************************************************
2446 * FUNCTION: DtGetGenericTableInfo
2448 * PARAMETERS: Name - Generic type name
2450 * RETURN: Info entry
2452 * DESCRIPTION: Obtain table info for a generic name entry
2454 *****************************************************************************/
2457 DtGetGenericTableInfo (
2460 ACPI_DMTABLE_INFO *Info;
2469 /* Search info table for name match */
2473 Info = AcpiDmTableInfoGeneric[i];
2474 if (Info->Opcode == ACPI_DMT_EXIT)
2480 /* Use caseless compare for generic keywords */
2482 if (!AcpiUtStricmp (Name, Info->Name))
2492 /******************************************************************************
2494 * FUNCTION: DtCompileUefi
2496 * PARAMETERS: List - Current field list pointer
2500 * DESCRIPTION: Compile UEFI.
2502 *****************************************************************************/
2509 DT_SUBTABLE *Subtable;
2510 DT_SUBTABLE *ParentTable;
2511 DT_FIELD **PFieldList = (DT_FIELD **) List;
2515 /* Compile the predefined portion of the UEFI table */
2517 Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
2519 if (ACPI_FAILURE (Status))
2524 DataOffset = (UINT16 *) (Subtable->Buffer + 16);
2525 *DataOffset = sizeof (ACPI_TABLE_UEFI);
2527 ParentTable = DtPeekSubtable ();
2528 DtInsertSubtable (ParentTable, Subtable);
2531 * Compile the "generic" portion of the UEFI table. This
2532 * part of the table is not predefined and any of the generic
2533 * operators may be used.
2536 DtCompileGeneric ((void **) PFieldList);
2542 /******************************************************************************
2544 * FUNCTION: DtCompileVrtc
2546 * PARAMETERS: List - Current field list pointer
2550 * DESCRIPTION: Compile VRTC.
2552 *****************************************************************************/
2561 Status = DtCompileTwoSubtables (List,
2562 AcpiDmTableInfoVrtc, AcpiDmTableInfoVrtc0);
2567 /******************************************************************************
2569 * FUNCTION: DtCompileWdat
2571 * PARAMETERS: List - Current field list pointer
2575 * DESCRIPTION: Compile WDAT.
2577 *****************************************************************************/
2586 Status = DtCompileTwoSubtables (List,
2587 AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
2592 /******************************************************************************
2594 * FUNCTION: DtCompileXsdt
2596 * PARAMETERS: List - Current field list pointer
2600 * DESCRIPTION: Compile XSDT.
2602 *****************************************************************************/
2608 DT_SUBTABLE *Subtable;
2609 DT_SUBTABLE *ParentTable;
2610 DT_FIELD *FieldList = *(DT_FIELD **) List;
2613 ParentTable = DtPeekSubtable ();
2617 DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
2619 DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
2620 DtInsertSubtable (ParentTable, Subtable);
2621 FieldList = FieldList->Next;
2628 /******************************************************************************
2630 * FUNCTION: DtCompileGeneric
2632 * PARAMETERS: List - Current field list pointer
2636 * DESCRIPTION: Compile generic unknown table.
2638 *****************************************************************************/
2645 DT_SUBTABLE *Subtable;
2646 DT_SUBTABLE *ParentTable;
2647 DT_FIELD **PFieldList = (DT_FIELD **) List;
2648 ACPI_DMTABLE_INFO *Info;
2651 ParentTable = DtPeekSubtable ();
2654 * Compile the "generic" portion of the table. This
2655 * part of the table is not predefined and any of the generic
2656 * operators may be used.
2659 /* Find any and all labels in the entire generic portion */
2661 DtDetectAllLabels (*PFieldList);
2663 /* Now we can actually compile the parse tree */
2667 Info = DtGetGenericTableInfo ((*PFieldList)->Name);
2670 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
2671 (*PFieldList)->Name);
2672 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
2673 (*PFieldList), MsgBuffer);
2675 *PFieldList = (*PFieldList)->Next;
2679 Status = DtCompileTable (PFieldList, Info,
2681 if (ACPI_SUCCESS (Status))
2683 DtInsertSubtable (ParentTable, Subtable);
2687 *PFieldList = (*PFieldList)->Next;
2689 if (Status == AE_NOT_FOUND)
2691 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
2692 (*PFieldList)->Name);
2693 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
2694 (*PFieldList), MsgBuffer);