1 /******************************************************************************
3 * Module Name: dttable.c - handling for specific ACPI tables
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2015, 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.
44 /* Compile all complex data tables */
46 #include "aslcompiler.h"
47 #include "dtcompiler.h"
49 #define _COMPONENT DT_COMPILER
50 ACPI_MODULE_NAME ("dttable")
53 /* TBD: merge these into dmtbinfo.c? */
55 static ACPI_DMTABLE_INFO TableInfoAsfAddress[] =
57 {ACPI_DMT_BUFFER, 0, "Addresses", 0},
58 {ACPI_DMT_EXIT, 0, NULL, 0}
61 static ACPI_DMTABLE_INFO TableInfoDmarPciPath[] =
63 {ACPI_DMT_PCI_PATH, 0, "PCI Path", 0},
64 {ACPI_DMT_EXIT, 0, NULL, 0}
68 /* TBD: move to acmacros.h */
70 #define ACPI_SUB_PTR(t, a, b) \
71 ACPI_CAST_PTR (t, (ACPI_CAST_PTR (UINT8, (a)) - (ACPI_SIZE)(b)))
74 /* Local prototypes */
77 DtCompileTwoSubtables (
79 ACPI_DMTABLE_INFO *TableInfo1,
80 ACPI_DMTABLE_INFO *TableInfo2);
83 /******************************************************************************
85 * FUNCTION: DtCompileTwoSubtables
87 * PARAMETERS: List - Current field list pointer
88 * TableInfo1 - Info table 1
89 * TableInfo1 - Info table 2
93 * DESCRIPTION: Compile tables with a header and one or more same subtables.
94 * Include CPEP, EINJ, ERST, MCFG, MSCT, WDAT
96 *****************************************************************************/
99 DtCompileTwoSubtables (
101 ACPI_DMTABLE_INFO *TableInfo1,
102 ACPI_DMTABLE_INFO *TableInfo2)
105 DT_SUBTABLE *Subtable;
106 DT_SUBTABLE *ParentTable;
107 DT_FIELD **PFieldList = (DT_FIELD **) List;
110 Status = DtCompileTable (PFieldList, TableInfo1, &Subtable, TRUE);
111 if (ACPI_FAILURE (Status))
116 ParentTable = DtPeekSubtable ();
117 DtInsertSubtable (ParentTable, Subtable);
121 Status = DtCompileTable (PFieldList, TableInfo2, &Subtable, FALSE);
122 if (ACPI_FAILURE (Status))
127 DtInsertSubtable (ParentTable, Subtable);
134 /******************************************************************************
136 * FUNCTION: DtCompileFacs
138 * PARAMETERS: PFieldList - Current field list pointer
142 * DESCRIPTION: Compile FACS.
144 *****************************************************************************/
148 DT_FIELD **PFieldList)
150 DT_SUBTABLE *Subtable;
151 UINT8 *ReservedBuffer;
156 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs,
157 &Gbl_RootTable, TRUE);
158 if (ACPI_FAILURE (Status))
163 /* Large FACS reserved area at the end of the table */
165 ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1);
166 ReservedBuffer = UtLocalCalloc (ReservedSize);
168 DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
170 ACPI_FREE (ReservedBuffer);
171 DtInsertSubtable (Gbl_RootTable, Subtable);
176 /******************************************************************************
178 * FUNCTION: DtCompileRsdp
180 * PARAMETERS: PFieldList - Current field list pointer
184 * DESCRIPTION: Compile RSDP.
186 *****************************************************************************/
190 DT_FIELD **PFieldList)
192 DT_SUBTABLE *Subtable;
193 ACPI_TABLE_RSDP *Rsdp;
194 ACPI_RSDP_EXTENSION *RsdpExtension;
198 /* Compile the "common" RSDP (ACPI 1.0) */
200 Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1,
201 &Gbl_RootTable, TRUE);
202 if (ACPI_FAILURE (Status))
207 Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer);
208 DtSetTableChecksum (&Rsdp->Checksum);
210 if (Rsdp->Revision > 0)
212 /* Compile the "extended" part of the RSDP as a subtable */
214 Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2,
216 if (ACPI_FAILURE (Status))
221 DtInsertSubtable (Gbl_RootTable, Subtable);
223 /* Set length and extended checksum for entire RSDP */
225 RsdpExtension = ACPI_CAST_PTR (ACPI_RSDP_EXTENSION, Subtable->Buffer);
226 RsdpExtension->Length = Gbl_RootTable->Length + Subtable->Length;
227 DtSetTableChecksum (&RsdpExtension->ExtendedChecksum);
234 /******************************************************************************
236 * FUNCTION: DtCompileAsf
238 * PARAMETERS: List - Current field list pointer
242 * DESCRIPTION: Compile ASF!.
244 *****************************************************************************/
250 ACPI_ASF_INFO *AsfTable;
251 DT_SUBTABLE *Subtable;
252 DT_SUBTABLE *ParentTable;
253 ACPI_DMTABLE_INFO *InfoTable;
254 ACPI_DMTABLE_INFO *DataInfoTable = NULL;
255 UINT32 DataCount = 0;
258 DT_FIELD **PFieldList = (DT_FIELD **) List;
259 DT_FIELD *SubtableStart;
264 SubtableStart = *PFieldList;
265 Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr,
267 if (ACPI_FAILURE (Status))
272 ParentTable = DtPeekSubtable ();
273 DtInsertSubtable (ParentTable, Subtable);
274 DtPushSubtable (Subtable);
276 AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer);
278 switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
280 case ACPI_ASF_TYPE_INFO:
282 InfoTable = AcpiDmTableInfoAsf0;
285 case ACPI_ASF_TYPE_ALERT:
287 InfoTable = AcpiDmTableInfoAsf1;
290 case ACPI_ASF_TYPE_CONTROL:
292 InfoTable = AcpiDmTableInfoAsf2;
295 case ACPI_ASF_TYPE_BOOT:
297 InfoTable = AcpiDmTableInfoAsf3;
300 case ACPI_ASF_TYPE_ADDRESS:
302 InfoTable = AcpiDmTableInfoAsf4;
307 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
311 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
312 if (ACPI_FAILURE (Status))
317 ParentTable = DtPeekSubtable ();
318 DtInsertSubtable (ParentTable, Subtable);
320 switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
322 case ACPI_ASF_TYPE_INFO:
324 DataInfoTable = NULL;
327 case ACPI_ASF_TYPE_ALERT:
329 DataInfoTable = AcpiDmTableInfoAsf1a;
330 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT,
331 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
332 sizeof (ACPI_ASF_HEADER)))->Alerts;
335 case ACPI_ASF_TYPE_CONTROL:
337 DataInfoTable = AcpiDmTableInfoAsf2a;
338 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE,
339 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
340 sizeof (ACPI_ASF_HEADER)))->Controls;
343 case ACPI_ASF_TYPE_BOOT:
345 DataInfoTable = NULL;
348 case ACPI_ASF_TYPE_ADDRESS:
350 DataInfoTable = TableInfoAsfAddress;
351 DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS,
352 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
353 sizeof (ACPI_ASF_HEADER)))->Devices;
358 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
364 switch (AsfTable->Header.Type & 0x7F)
366 case ACPI_ASF_TYPE_ADDRESS:
368 while (DataCount > 0)
370 Status = DtCompileTable (PFieldList, DataInfoTable,
372 if (ACPI_FAILURE (Status))
377 DtInsertSubtable (ParentTable, Subtable);
378 DataCount = DataCount - Subtable->Length;
384 for (i = 0; i < DataCount; i++)
386 Status = DtCompileTable (PFieldList, DataInfoTable,
388 if (ACPI_FAILURE (Status))
393 DtInsertSubtable (ParentTable, Subtable);
406 /******************************************************************************
408 * FUNCTION: DtCompileCpep
410 * PARAMETERS: List - Current field list pointer
414 * DESCRIPTION: Compile CPEP.
416 *****************************************************************************/
425 Status = DtCompileTwoSubtables (List,
426 AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0);
431 /******************************************************************************
433 * FUNCTION: DtCompileCsrt
435 * PARAMETERS: List - Current field list pointer
439 * DESCRIPTION: Compile CSRT.
441 *****************************************************************************/
447 ACPI_STATUS Status = AE_OK;
448 DT_SUBTABLE *Subtable;
449 DT_SUBTABLE *ParentTable;
450 DT_FIELD **PFieldList = (DT_FIELD **) List;
451 UINT32 DescriptorCount;
455 /* Subtables (Resource Groups) */
459 /* Resource group subtable */
461 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt0,
463 if (ACPI_FAILURE (Status))
468 /* Compute the number of resource descriptors */
471 (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
472 Subtable->Buffer))->Length -
473 (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
474 Subtable->Buffer))->SharedInfoLength -
475 sizeof (ACPI_CSRT_GROUP);
477 DescriptorCount = (GroupLength /
478 sizeof (ACPI_CSRT_DESCRIPTOR));
480 ParentTable = DtPeekSubtable ();
481 DtInsertSubtable (ParentTable, Subtable);
482 DtPushSubtable (Subtable);
484 /* Shared info subtable (One per resource group) */
486 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt1,
488 if (ACPI_FAILURE (Status))
493 ParentTable = DtPeekSubtable ();
494 DtInsertSubtable (ParentTable, Subtable);
496 /* Sub-Subtables (Resource Descriptors) */
498 while (*PFieldList && DescriptorCount)
500 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2,
502 if (ACPI_FAILURE (Status))
507 ParentTable = DtPeekSubtable ();
508 DtInsertSubtable (ParentTable, Subtable);
519 /******************************************************************************
521 * FUNCTION: DtCompileDbg2
523 * PARAMETERS: List - Current field list pointer
527 * DESCRIPTION: Compile DBG2.
529 *****************************************************************************/
536 DT_SUBTABLE *Subtable;
537 DT_SUBTABLE *ParentTable;
538 DT_FIELD **PFieldList = (DT_FIELD **) List;
539 UINT32 SubtableCount;
540 ACPI_DBG2_HEADER *Dbg2Header;
541 ACPI_DBG2_DEVICE *DeviceInfo;
542 UINT16 CurrentOffset;
548 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2, &Subtable, TRUE);
549 if (ACPI_FAILURE (Status))
554 ParentTable = DtPeekSubtable ();
555 DtInsertSubtable (ParentTable, Subtable);
557 /* Main table fields */
559 Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer);
560 Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF (
561 ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header);
563 SubtableCount = Dbg2Header->InfoCount;
564 DtPushSubtable (Subtable);
566 /* Process all Device Information subtables (Count = InfoCount) */
568 while (*PFieldList && SubtableCount)
570 /* Subtable: Debug Device Information */
572 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Device,
574 if (ACPI_FAILURE (Status))
579 DeviceInfo = ACPI_CAST_PTR (ACPI_DBG2_DEVICE, Subtable->Buffer);
580 CurrentOffset = (UINT16) sizeof (ACPI_DBG2_DEVICE);
582 ParentTable = DtPeekSubtable ();
583 DtInsertSubtable (ParentTable, Subtable);
584 DtPushSubtable (Subtable);
586 ParentTable = DtPeekSubtable ();
588 /* BaseAddressRegister GAS array (Required, size is RegisterCount) */
590 DeviceInfo->BaseAddressOffset = CurrentOffset;
591 for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
593 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr,
595 if (ACPI_FAILURE (Status))
600 CurrentOffset += (UINT16) sizeof (ACPI_GENERIC_ADDRESS);
601 DtInsertSubtable (ParentTable, Subtable);
604 /* AddressSize array (Required, size = RegisterCount) */
606 DeviceInfo->AddressSizeOffset = CurrentOffset;
607 for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
609 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size,
611 if (ACPI_FAILURE (Status))
616 CurrentOffset += (UINT16) sizeof (UINT32);
617 DtInsertSubtable (ParentTable, Subtable);
620 /* NamespaceString device identifier (Required, size = NamePathLength) */
622 DeviceInfo->NamepathOffset = CurrentOffset;
623 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name,
625 if (ACPI_FAILURE (Status))
630 /* Update the device info header */
632 DeviceInfo->NamepathLength = (UINT16) Subtable->Length;
633 CurrentOffset += (UINT16) DeviceInfo->NamepathLength;
634 DtInsertSubtable (ParentTable, Subtable);
636 /* OemData - Variable-length data (Optional, size = OemDataLength) */
638 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2OemData,
640 if (ACPI_FAILURE (Status))
645 /* Update the device info header (zeros if no OEM data present) */
647 DeviceInfo->OemDataOffset = 0;
648 DeviceInfo->OemDataLength = 0;
650 /* Optional subtable (OemData) */
652 if (Subtable && Subtable->Length)
654 DeviceInfo->OemDataOffset = CurrentOffset;
655 DeviceInfo->OemDataLength = (UINT16) Subtable->Length;
657 DtInsertSubtable (ParentTable, Subtable);
661 DtPopSubtable (); /* Get next Device Information subtable */
669 /******************************************************************************
671 * FUNCTION: DtCompileDmar
673 * PARAMETERS: List - Current field list pointer
677 * DESCRIPTION: Compile DMAR.
679 *****************************************************************************/
686 DT_SUBTABLE *Subtable;
687 DT_SUBTABLE *ParentTable;
688 DT_FIELD **PFieldList = (DT_FIELD **) List;
689 DT_FIELD *SubtableStart;
690 ACPI_DMTABLE_INFO *InfoTable;
691 ACPI_DMAR_HEADER *DmarHeader;
692 ACPI_DMAR_DEVICE_SCOPE *DmarDeviceScope;
693 UINT32 DeviceScopeLength;
694 UINT32 PciPathLength;
697 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE);
698 if (ACPI_FAILURE (Status))
703 ParentTable = DtPeekSubtable ();
704 DtInsertSubtable (ParentTable, Subtable);
705 DtPushSubtable (Subtable);
711 SubtableStart = *PFieldList;
712 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr,
714 if (ACPI_FAILURE (Status))
719 ParentTable = DtPeekSubtable ();
720 DtInsertSubtable (ParentTable, Subtable);
721 DtPushSubtable (Subtable);
723 DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
725 switch (DmarHeader->Type)
727 case ACPI_DMAR_TYPE_HARDWARE_UNIT:
729 InfoTable = AcpiDmTableInfoDmar0;
732 case ACPI_DMAR_TYPE_RESERVED_MEMORY:
734 InfoTable = AcpiDmTableInfoDmar1;
737 case ACPI_DMAR_TYPE_ROOT_ATS:
739 InfoTable = AcpiDmTableInfoDmar2;
742 case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
744 InfoTable = AcpiDmTableInfoDmar3;
747 case ACPI_DMAR_TYPE_NAMESPACE:
749 InfoTable = AcpiDmTableInfoDmar4;
754 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
760 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
761 if (ACPI_FAILURE (Status))
766 ParentTable = DtPeekSubtable ();
767 DtInsertSubtable (ParentTable, Subtable);
770 * Optional Device Scope subtables
772 if ((DmarHeader->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
773 (DmarHeader->Type == ACPI_DMAR_TYPE_NAMESPACE))
775 /* These types do not support device scopes */
781 DtPushSubtable (Subtable);
782 DeviceScopeLength = DmarHeader->Length - Subtable->Length -
784 while (DeviceScopeLength)
786 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
788 if (Status == AE_NOT_FOUND)
793 ParentTable = DtPeekSubtable ();
794 DtInsertSubtable (ParentTable, Subtable);
795 DtPushSubtable (Subtable);
797 DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer);
799 /* Optional PCI Paths */
801 PciPathLength = DmarDeviceScope->Length - Subtable->Length;
802 while (PciPathLength)
804 Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
806 if (Status == AE_NOT_FOUND)
812 ParentTable = DtPeekSubtable ();
813 DtInsertSubtable (ParentTable, Subtable);
814 PciPathLength -= Subtable->Length;
818 DeviceScopeLength -= DmarDeviceScope->Length;
829 /******************************************************************************
831 * FUNCTION: DtCompileEinj
833 * PARAMETERS: List - Current field list pointer
837 * DESCRIPTION: Compile EINJ.
839 *****************************************************************************/
848 Status = DtCompileTwoSubtables (List,
849 AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
854 /******************************************************************************
856 * FUNCTION: DtCompileErst
858 * PARAMETERS: List - Current field list pointer
862 * DESCRIPTION: Compile ERST.
864 *****************************************************************************/
873 Status = DtCompileTwoSubtables (List,
874 AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
879 /******************************************************************************
881 * FUNCTION: DtCompileFadt
883 * PARAMETERS: List - Current field list pointer
887 * DESCRIPTION: Compile FADT.
889 *****************************************************************************/
896 DT_SUBTABLE *Subtable;
897 DT_SUBTABLE *ParentTable;
898 DT_FIELD **PFieldList = (DT_FIELD **) List;
899 ACPI_TABLE_HEADER *Table;
903 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1,
905 if (ACPI_FAILURE (Status))
910 ParentTable = DtPeekSubtable ();
911 DtInsertSubtable (ParentTable, Subtable);
913 Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
914 Revision = Table->Revision;
918 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2,
920 if (ACPI_FAILURE (Status))
925 DtInsertSubtable (ParentTable, Subtable);
927 else if (Revision >= 2)
929 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3,
931 if (ACPI_FAILURE (Status))
936 DtInsertSubtable (ParentTable, Subtable);
940 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5,
942 if (ACPI_FAILURE (Status))
947 DtInsertSubtable (ParentTable, Subtable);
954 /******************************************************************************
956 * FUNCTION: DtCompileGtdt
958 * PARAMETERS: List - Current field list pointer
962 * DESCRIPTION: Compile GTDT.
964 *****************************************************************************/
971 DT_SUBTABLE *Subtable;
972 DT_SUBTABLE *ParentTable;
973 DT_FIELD **PFieldList = (DT_FIELD **) List;
974 DT_FIELD *SubtableStart;
975 ACPI_SUBTABLE_HEADER *GtdtHeader;
976 ACPI_DMTABLE_INFO *InfoTable;
980 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt,
982 if (ACPI_FAILURE (Status))
987 ParentTable = DtPeekSubtable ();
988 DtInsertSubtable (ParentTable, Subtable);
992 SubtableStart = *PFieldList;
993 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdtHdr,
995 if (ACPI_FAILURE (Status))
1000 ParentTable = DtPeekSubtable ();
1001 DtInsertSubtable (ParentTable, Subtable);
1002 DtPushSubtable (Subtable);
1004 GtdtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1006 switch (GtdtHeader->Type)
1008 case ACPI_GTDT_TYPE_TIMER_BLOCK:
1010 InfoTable = AcpiDmTableInfoGtdt0;
1013 case ACPI_GTDT_TYPE_WATCHDOG:
1015 InfoTable = AcpiDmTableInfoGtdt1;
1020 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "GTDT");
1024 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1025 if (ACPI_FAILURE (Status))
1030 ParentTable = DtPeekSubtable ();
1031 DtInsertSubtable (ParentTable, Subtable);
1034 * Additional GT block subtable data
1037 switch (GtdtHeader->Type)
1039 case ACPI_GTDT_TYPE_TIMER_BLOCK:
1041 DtPushSubtable (Subtable);
1042 ParentTable = DtPeekSubtable ();
1044 GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1045 Subtable->Buffer - sizeof(ACPI_GTDT_HEADER)))->TimerCount;
1048 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt0a,
1050 if (ACPI_FAILURE (Status))
1056 DtInsertSubtable (ParentTable, Subtable);
1074 /******************************************************************************
1076 * FUNCTION: DtCompileFpdt
1078 * PARAMETERS: List - Current field list pointer
1082 * DESCRIPTION: Compile FPDT.
1084 *****************************************************************************/
1091 ACPI_FPDT_HEADER *FpdtHeader;
1092 DT_SUBTABLE *Subtable;
1093 DT_SUBTABLE *ParentTable;
1094 ACPI_DMTABLE_INFO *InfoTable;
1095 DT_FIELD **PFieldList = (DT_FIELD **) List;
1096 DT_FIELD *SubtableStart;
1101 SubtableStart = *PFieldList;
1102 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr,
1104 if (ACPI_FAILURE (Status))
1109 ParentTable = DtPeekSubtable ();
1110 DtInsertSubtable (ParentTable, Subtable);
1111 DtPushSubtable (Subtable);
1113 FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
1115 switch (FpdtHeader->Type)
1117 case ACPI_FPDT_TYPE_BOOT:
1119 InfoTable = AcpiDmTableInfoFpdt0;
1122 case ACPI_FPDT_TYPE_S3PERF:
1124 InfoTable = AcpiDmTableInfoFpdt1;
1129 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT");
1134 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1135 if (ACPI_FAILURE (Status))
1140 ParentTable = DtPeekSubtable ();
1141 DtInsertSubtable (ParentTable, Subtable);
1149 /******************************************************************************
1151 * FUNCTION: DtCompileHest
1153 * PARAMETERS: List - Current field list pointer
1157 * DESCRIPTION: Compile HEST.
1159 *****************************************************************************/
1166 DT_SUBTABLE *Subtable;
1167 DT_SUBTABLE *ParentTable;
1168 DT_FIELD **PFieldList = (DT_FIELD **) List;
1169 DT_FIELD *SubtableStart;
1170 ACPI_DMTABLE_INFO *InfoTable;
1175 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
1177 if (ACPI_FAILURE (Status))
1182 ParentTable = DtPeekSubtable ();
1183 DtInsertSubtable (ParentTable, Subtable);
1187 /* Get subtable type */
1189 SubtableStart = *PFieldList;
1190 DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
1194 case ACPI_HEST_TYPE_IA32_CHECK:
1196 InfoTable = AcpiDmTableInfoHest0;
1199 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1201 InfoTable = AcpiDmTableInfoHest1;
1204 case ACPI_HEST_TYPE_IA32_NMI:
1206 InfoTable = AcpiDmTableInfoHest2;
1209 case ACPI_HEST_TYPE_AER_ROOT_PORT:
1211 InfoTable = AcpiDmTableInfoHest6;
1214 case ACPI_HEST_TYPE_AER_ENDPOINT:
1216 InfoTable = AcpiDmTableInfoHest7;
1219 case ACPI_HEST_TYPE_AER_BRIDGE:
1221 InfoTable = AcpiDmTableInfoHest8;
1224 case ACPI_HEST_TYPE_GENERIC_ERROR:
1226 InfoTable = AcpiDmTableInfoHest9;
1231 /* Cannot continue on unknown type */
1233 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
1237 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1238 if (ACPI_FAILURE (Status))
1243 DtInsertSubtable (ParentTable, Subtable);
1246 * Additional subtable data - IA32 Error Bank(s)
1251 case ACPI_HEST_TYPE_IA32_CHECK:
1253 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1254 Subtable->Buffer))->NumHardwareBanks;
1257 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1259 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1260 Subtable->Buffer))->NumHardwareBanks;
1270 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
1272 if (ACPI_FAILURE (Status))
1277 DtInsertSubtable (ParentTable, Subtable);
1286 /******************************************************************************
1288 * FUNCTION: DtCompileIvrs
1290 * PARAMETERS: List - Current field list pointer
1294 * DESCRIPTION: Compile IVRS.
1296 *****************************************************************************/
1303 DT_SUBTABLE *Subtable;
1304 DT_SUBTABLE *ParentTable;
1305 DT_FIELD **PFieldList = (DT_FIELD **) List;
1306 DT_FIELD *SubtableStart;
1307 ACPI_DMTABLE_INFO *InfoTable;
1308 ACPI_IVRS_HEADER *IvrsHeader;
1312 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
1314 if (ACPI_FAILURE (Status))
1319 ParentTable = DtPeekSubtable ();
1320 DtInsertSubtable (ParentTable, Subtable);
1324 SubtableStart = *PFieldList;
1325 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr,
1327 if (ACPI_FAILURE (Status))
1332 ParentTable = DtPeekSubtable ();
1333 DtInsertSubtable (ParentTable, Subtable);
1334 DtPushSubtable (Subtable);
1336 IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer);
1338 switch (IvrsHeader->Type)
1340 case ACPI_IVRS_TYPE_HARDWARE:
1342 InfoTable = AcpiDmTableInfoIvrs0;
1345 case ACPI_IVRS_TYPE_MEMORY1:
1346 case ACPI_IVRS_TYPE_MEMORY2:
1347 case ACPI_IVRS_TYPE_MEMORY3:
1349 InfoTable = AcpiDmTableInfoIvrs1;
1354 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS");
1358 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1359 if (ACPI_FAILURE (Status))
1364 ParentTable = DtPeekSubtable ();
1365 DtInsertSubtable (ParentTable, Subtable);
1367 if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE)
1369 while (*PFieldList &&
1370 !ACPI_STRCMP ((*PFieldList)->Name, "Entry Type"))
1372 SubtableStart = *PFieldList;
1373 DtCompileInteger (&EntryType, *PFieldList, 1, 0);
1377 /* 4-byte device entries */
1379 case ACPI_IVRS_TYPE_PAD4:
1380 case ACPI_IVRS_TYPE_ALL:
1381 case ACPI_IVRS_TYPE_SELECT:
1382 case ACPI_IVRS_TYPE_START:
1383 case ACPI_IVRS_TYPE_END:
1385 InfoTable = AcpiDmTableInfoIvrs4;
1388 /* 8-byte entries, type A */
1390 case ACPI_IVRS_TYPE_ALIAS_SELECT:
1391 case ACPI_IVRS_TYPE_ALIAS_START:
1393 InfoTable = AcpiDmTableInfoIvrs8a;
1396 /* 8-byte entries, type B */
1398 case ACPI_IVRS_TYPE_PAD8:
1399 case ACPI_IVRS_TYPE_EXT_SELECT:
1400 case ACPI_IVRS_TYPE_EXT_START:
1402 InfoTable = AcpiDmTableInfoIvrs8b;
1405 /* 8-byte entries, type C */
1407 case ACPI_IVRS_TYPE_SPECIAL:
1409 InfoTable = AcpiDmTableInfoIvrs8c;
1414 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
1415 "IVRS Device Entry");
1419 Status = DtCompileTable (PFieldList, InfoTable,
1421 if (ACPI_FAILURE (Status))
1426 DtInsertSubtable (ParentTable, Subtable);
1437 /******************************************************************************
1439 * FUNCTION: DtCompileLpit
1441 * PARAMETERS: List - Current field list pointer
1445 * DESCRIPTION: Compile LPIT.
1447 *****************************************************************************/
1454 DT_SUBTABLE *Subtable;
1455 DT_SUBTABLE *ParentTable;
1456 DT_FIELD **PFieldList = (DT_FIELD **) List;
1457 DT_FIELD *SubtableStart;
1458 ACPI_DMTABLE_INFO *InfoTable;
1459 ACPI_LPIT_HEADER *LpitHeader;
1462 /* Note: Main table consists only of the standard ACPI table header */
1466 SubtableStart = *PFieldList;
1468 /* LPIT Subtable header */
1470 Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr,
1472 if (ACPI_FAILURE (Status))
1477 ParentTable = DtPeekSubtable ();
1478 DtInsertSubtable (ParentTable, Subtable);
1479 DtPushSubtable (Subtable);
1481 LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer);
1483 switch (LpitHeader->Type)
1485 case ACPI_LPIT_TYPE_NATIVE_CSTATE:
1487 InfoTable = AcpiDmTableInfoLpit0;
1490 case ACPI_LPIT_TYPE_SIMPLE_IO:
1492 InfoTable = AcpiDmTableInfoLpit1;
1497 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT");
1503 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1504 if (ACPI_FAILURE (Status))
1509 ParentTable = DtPeekSubtable ();
1510 DtInsertSubtable (ParentTable, Subtable);
1518 /******************************************************************************
1520 * FUNCTION: DtCompileMadt
1522 * PARAMETERS: List - Current field list pointer
1526 * DESCRIPTION: Compile MADT.
1528 *****************************************************************************/
1535 DT_SUBTABLE *Subtable;
1536 DT_SUBTABLE *ParentTable;
1537 DT_FIELD **PFieldList = (DT_FIELD **) List;
1538 DT_FIELD *SubtableStart;
1539 ACPI_SUBTABLE_HEADER *MadtHeader;
1540 ACPI_DMTABLE_INFO *InfoTable;
1543 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
1545 if (ACPI_FAILURE (Status))
1550 ParentTable = DtPeekSubtable ();
1551 DtInsertSubtable (ParentTable, Subtable);
1555 SubtableStart = *PFieldList;
1556 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
1558 if (ACPI_FAILURE (Status))
1563 ParentTable = DtPeekSubtable ();
1564 DtInsertSubtable (ParentTable, Subtable);
1565 DtPushSubtable (Subtable);
1567 MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1569 switch (MadtHeader->Type)
1571 case ACPI_MADT_TYPE_LOCAL_APIC:
1573 InfoTable = AcpiDmTableInfoMadt0;
1576 case ACPI_MADT_TYPE_IO_APIC:
1578 InfoTable = AcpiDmTableInfoMadt1;
1581 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1583 InfoTable = AcpiDmTableInfoMadt2;
1586 case ACPI_MADT_TYPE_NMI_SOURCE:
1588 InfoTable = AcpiDmTableInfoMadt3;
1591 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1593 InfoTable = AcpiDmTableInfoMadt4;
1596 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1598 InfoTable = AcpiDmTableInfoMadt5;
1601 case ACPI_MADT_TYPE_IO_SAPIC:
1603 InfoTable = AcpiDmTableInfoMadt6;
1606 case ACPI_MADT_TYPE_LOCAL_SAPIC:
1608 InfoTable = AcpiDmTableInfoMadt7;
1611 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1613 InfoTable = AcpiDmTableInfoMadt8;
1616 case ACPI_MADT_TYPE_LOCAL_X2APIC:
1618 InfoTable = AcpiDmTableInfoMadt9;
1621 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1623 InfoTable = AcpiDmTableInfoMadt10;
1626 case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
1628 InfoTable = AcpiDmTableInfoMadt11;
1631 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
1633 InfoTable = AcpiDmTableInfoMadt12;
1636 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
1638 InfoTable = AcpiDmTableInfoMadt13;
1641 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
1643 InfoTable = AcpiDmTableInfoMadt14;
1648 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
1652 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1653 if (ACPI_FAILURE (Status))
1658 ParentTable = DtPeekSubtable ();
1659 DtInsertSubtable (ParentTable, Subtable);
1667 /******************************************************************************
1669 * FUNCTION: DtCompileMcfg
1671 * PARAMETERS: List - Current field list pointer
1675 * DESCRIPTION: Compile MCFG.
1677 *****************************************************************************/
1686 Status = DtCompileTwoSubtables (List,
1687 AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
1692 /******************************************************************************
1694 * FUNCTION: DtCompileMpst
1696 * PARAMETERS: List - Current field list pointer
1700 * DESCRIPTION: Compile MPST.
1702 *****************************************************************************/
1709 DT_SUBTABLE *Subtable;
1710 DT_SUBTABLE *ParentTable;
1711 DT_FIELD **PFieldList = (DT_FIELD **) List;
1712 ACPI_MPST_CHANNEL *MpstChannelInfo;
1713 ACPI_MPST_POWER_NODE *MpstPowerNode;
1714 ACPI_MPST_DATA_HDR *MpstDataHeader;
1715 UINT16 SubtableCount;
1716 UINT32 PowerStateCount;
1717 UINT32 ComponentCount;
1722 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable, TRUE);
1723 if (ACPI_FAILURE (Status))
1728 ParentTable = DtPeekSubtable ();
1729 DtInsertSubtable (ParentTable, Subtable);
1730 DtPushSubtable (Subtable);
1732 MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
1733 SubtableCount = MpstChannelInfo->PowerNodeCount;
1735 while (*PFieldList && SubtableCount)
1737 /* Subtable: Memory Power Node(s) */
1739 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
1741 if (ACPI_FAILURE (Status))
1746 ParentTable = DtPeekSubtable ();
1747 DtInsertSubtable (ParentTable, Subtable);
1748 DtPushSubtable (Subtable);
1750 MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
1751 PowerStateCount = MpstPowerNode->NumPowerStates;
1752 ComponentCount = MpstPowerNode->NumPhysicalComponents;
1754 ParentTable = DtPeekSubtable ();
1756 /* Sub-subtables - Memory Power State Structure(s) */
1758 while (*PFieldList && PowerStateCount)
1760 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
1762 if (ACPI_FAILURE (Status))
1767 DtInsertSubtable (ParentTable, Subtable);
1771 /* Sub-subtables - Physical Component ID Structure(s) */
1773 while (*PFieldList && ComponentCount)
1775 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
1777 if (ACPI_FAILURE (Status))
1782 DtInsertSubtable (ParentTable, Subtable);
1790 /* Subtable: Count of Memory Power State Characteristic structures */
1794 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable, TRUE);
1795 if (ACPI_FAILURE (Status))
1800 ParentTable = DtPeekSubtable ();
1801 DtInsertSubtable (ParentTable, Subtable);
1802 DtPushSubtable (Subtable);
1804 MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
1805 SubtableCount = MpstDataHeader->CharacteristicsCount;
1807 ParentTable = DtPeekSubtable ();
1809 /* Subtable: Memory Power State Characteristics structure(s) */
1811 while (*PFieldList && SubtableCount)
1813 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
1815 if (ACPI_FAILURE (Status))
1820 DtInsertSubtable (ParentTable, Subtable);
1829 /******************************************************************************
1831 * FUNCTION: DtCompileMsct
1833 * PARAMETERS: List - Current field list pointer
1837 * DESCRIPTION: Compile MSCT.
1839 *****************************************************************************/
1848 Status = DtCompileTwoSubtables (List,
1849 AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
1854 /******************************************************************************
1856 * FUNCTION: DtCompileMtmr
1858 * PARAMETERS: List - Current field list pointer
1862 * DESCRIPTION: Compile MTMR.
1864 *****************************************************************************/
1873 Status = DtCompileTwoSubtables (List,
1874 AcpiDmTableInfoMtmr, AcpiDmTableInfoMtmr0);
1879 /******************************************************************************
1881 * FUNCTION: DtCompilePcct
1883 * PARAMETERS: List - Current field list pointer
1887 * DESCRIPTION: Compile PCCT.
1889 *****************************************************************************/
1896 DT_SUBTABLE *Subtable;
1897 DT_SUBTABLE *ParentTable;
1898 DT_FIELD **PFieldList = (DT_FIELD **) List;
1899 DT_FIELD *SubtableStart;
1900 ACPI_SUBTABLE_HEADER *PcctHeader;
1901 ACPI_DMTABLE_INFO *InfoTable;
1904 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
1906 if (ACPI_FAILURE (Status))
1911 ParentTable = DtPeekSubtable ();
1912 DtInsertSubtable (ParentTable, Subtable);
1916 SubtableStart = *PFieldList;
1917 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
1919 if (ACPI_FAILURE (Status))
1924 ParentTable = DtPeekSubtable ();
1925 DtInsertSubtable (ParentTable, Subtable);
1926 DtPushSubtable (Subtable);
1928 PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1930 switch (PcctHeader->Type)
1932 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
1934 InfoTable = AcpiDmTableInfoPcct0;
1937 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
1939 InfoTable = AcpiDmTableInfoPcct1;
1944 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
1948 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1949 if (ACPI_FAILURE (Status))
1954 ParentTable = DtPeekSubtable ();
1955 DtInsertSubtable (ParentTable, Subtable);
1963 /******************************************************************************
1965 * FUNCTION: DtCompilePmtt
1967 * PARAMETERS: List - Current field list pointer
1971 * DESCRIPTION: Compile PMTT.
1973 *****************************************************************************/
1980 DT_SUBTABLE *Subtable;
1981 DT_SUBTABLE *ParentTable;
1982 DT_FIELD **PFieldList = (DT_FIELD **) List;
1983 DT_FIELD *SubtableStart;
1984 ACPI_PMTT_HEADER *PmttHeader;
1985 ACPI_PMTT_CONTROLLER *PmttController;
1987 UINT8 PrevType = ACPI_PMTT_TYPE_SOCKET;
1992 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable, TRUE);
1993 if (ACPI_FAILURE (Status))
1998 ParentTable = DtPeekSubtable ();
1999 DtInsertSubtable (ParentTable, Subtable);
2000 DtPushSubtable (Subtable);
2004 SubtableStart = *PFieldList;
2005 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
2007 if (ACPI_FAILURE (Status))
2012 PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
2013 while (PrevType >= PmttHeader->Type)
2017 if (PrevType == ACPI_PMTT_TYPE_SOCKET)
2023 PrevType = PmttHeader->Type;
2025 ParentTable = DtPeekSubtable ();
2026 DtInsertSubtable (ParentTable, Subtable);
2027 DtPushSubtable (Subtable);
2029 switch (PmttHeader->Type)
2031 case ACPI_PMTT_TYPE_SOCKET:
2033 /* Subtable: Socket Structure */
2035 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
2037 if (ACPI_FAILURE (Status))
2042 ParentTable = DtPeekSubtable ();
2043 DtInsertSubtable (ParentTable, Subtable);
2046 case ACPI_PMTT_TYPE_CONTROLLER:
2048 /* Subtable: Memory Controller Structure */
2050 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
2052 if (ACPI_FAILURE (Status))
2057 ParentTable = DtPeekSubtable ();
2058 DtInsertSubtable (ParentTable, Subtable);
2060 PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
2061 (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
2062 DomainCount = PmttController->DomainCount;
2066 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
2068 if (ACPI_FAILURE (Status))
2073 DtInsertSubtable (ParentTable, Subtable);
2078 case ACPI_PMTT_TYPE_DIMM:
2080 /* Subtable: Physical Component Structure */
2082 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
2084 if (ACPI_FAILURE (Status))
2089 ParentTable = DtPeekSubtable ();
2090 DtInsertSubtable (ParentTable, Subtable);
2095 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
2104 /******************************************************************************
2106 * FUNCTION: DtCompileRsdt
2108 * PARAMETERS: List - Current field list pointer
2112 * DESCRIPTION: Compile RSDT.
2114 *****************************************************************************/
2120 DT_SUBTABLE *Subtable;
2121 DT_SUBTABLE *ParentTable;
2122 DT_FIELD *FieldList = *(DT_FIELD **) List;
2126 ParentTable = DtPeekSubtable ();
2130 DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
2132 DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
2133 DtInsertSubtable (ParentTable, Subtable);
2134 FieldList = FieldList->Next;
2141 /******************************************************************************
2143 * FUNCTION: DtCompileS3pt
2145 * PARAMETERS: PFieldList - Current field list pointer
2149 * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
2151 *****************************************************************************/
2155 DT_FIELD **PFieldList)
2158 ACPI_S3PT_HEADER *S3ptHeader;
2159 DT_SUBTABLE *Subtable;
2160 DT_SUBTABLE *ParentTable;
2161 ACPI_DMTABLE_INFO *InfoTable;
2162 DT_FIELD *SubtableStart;
2165 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
2166 &Gbl_RootTable, TRUE);
2167 if (ACPI_FAILURE (Status))
2172 DtPushSubtable (Gbl_RootTable);
2176 SubtableStart = *PFieldList;
2177 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
2179 if (ACPI_FAILURE (Status))
2184 ParentTable = DtPeekSubtable ();
2185 DtInsertSubtable (ParentTable, Subtable);
2186 DtPushSubtable (Subtable);
2188 S3ptHeader = ACPI_CAST_PTR (ACPI_S3PT_HEADER, Subtable->Buffer);
2190 switch (S3ptHeader->Type)
2192 case ACPI_S3PT_TYPE_RESUME:
2194 InfoTable = AcpiDmTableInfoS3pt0;
2197 case ACPI_S3PT_TYPE_SUSPEND:
2199 InfoTable = AcpiDmTableInfoS3pt1;
2204 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
2208 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
2209 if (ACPI_FAILURE (Status))
2214 ParentTable = DtPeekSubtable ();
2215 DtInsertSubtable (ParentTable, Subtable);
2223 /******************************************************************************
2225 * FUNCTION: DtCompileSlic
2227 * PARAMETERS: List - Current field list pointer
2231 * DESCRIPTION: Compile SLIC.
2233 *****************************************************************************/
2240 DT_SUBTABLE *Subtable;
2241 DT_SUBTABLE *ParentTable;
2242 DT_FIELD **PFieldList = (DT_FIELD **) List;
2247 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
2249 if (ACPI_FAILURE (Status))
2254 ParentTable = DtPeekSubtable ();
2255 DtInsertSubtable (ParentTable, Subtable);
2256 DtPushSubtable (Subtable);
2264 /******************************************************************************
2266 * FUNCTION: DtCompileSlit
2268 * PARAMETERS: List - Current field list pointer
2272 * DESCRIPTION: Compile SLIT.
2274 *****************************************************************************/
2281 DT_SUBTABLE *Subtable;
2282 DT_SUBTABLE *ParentTable;
2283 DT_FIELD **PFieldList = (DT_FIELD **) List;
2284 DT_FIELD *FieldList;
2286 UINT8 *LocalityBuffer;
2289 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
2291 if (ACPI_FAILURE (Status))
2296 ParentTable = DtPeekSubtable ();
2297 DtInsertSubtable (ParentTable, Subtable);
2299 Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
2300 LocalityBuffer = UtLocalCalloc (Localities);
2302 /* Compile each locality buffer */
2304 FieldList = *PFieldList;
2307 DtCompileBuffer (LocalityBuffer,
2308 FieldList->Value, FieldList, Localities);
2310 DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
2311 DtInsertSubtable (ParentTable, Subtable);
2312 FieldList = FieldList->Next;
2315 ACPI_FREE (LocalityBuffer);
2320 /******************************************************************************
2322 * FUNCTION: DtCompileSrat
2324 * PARAMETERS: List - Current field list pointer
2328 * DESCRIPTION: Compile SRAT.
2330 *****************************************************************************/
2337 DT_SUBTABLE *Subtable;
2338 DT_SUBTABLE *ParentTable;
2339 DT_FIELD **PFieldList = (DT_FIELD **) List;
2340 DT_FIELD *SubtableStart;
2341 ACPI_SUBTABLE_HEADER *SratHeader;
2342 ACPI_DMTABLE_INFO *InfoTable;
2345 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
2347 if (ACPI_FAILURE (Status))
2352 ParentTable = DtPeekSubtable ();
2353 DtInsertSubtable (ParentTable, Subtable);
2357 SubtableStart = *PFieldList;
2358 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
2360 if (ACPI_FAILURE (Status))
2365 ParentTable = DtPeekSubtable ();
2366 DtInsertSubtable (ParentTable, Subtable);
2367 DtPushSubtable (Subtable);
2369 SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
2371 switch (SratHeader->Type)
2373 case ACPI_SRAT_TYPE_CPU_AFFINITY:
2375 InfoTable = AcpiDmTableInfoSrat0;
2378 case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
2380 InfoTable = AcpiDmTableInfoSrat1;
2383 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
2385 InfoTable = AcpiDmTableInfoSrat2;
2388 case ACPI_SRAT_TYPE_GICC_AFFINITY:
2390 InfoTable = AcpiDmTableInfoSrat3;
2395 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
2399 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
2400 if (ACPI_FAILURE (Status))
2405 ParentTable = DtPeekSubtable ();
2406 DtInsertSubtable (ParentTable, Subtable);
2414 /******************************************************************************
2416 * FUNCTION: DtGetGenericTableInfo
2418 * PARAMETERS: Name - Generic type name
2420 * RETURN: Info entry
2422 * DESCRIPTION: Obtain table info for a generic name entry
2424 *****************************************************************************/
2427 DtGetGenericTableInfo (
2430 ACPI_DMTABLE_INFO *Info;
2439 /* Search info table for name match */
2443 Info = AcpiDmTableInfoGeneric[i];
2444 if (Info->Opcode == ACPI_DMT_EXIT)
2450 /* Use caseless compare for generic keywords */
2452 if (!AcpiUtStricmp (Name, Info->Name))
2462 /******************************************************************************
2464 * FUNCTION: DtCompileUefi
2466 * PARAMETERS: List - Current field list pointer
2470 * DESCRIPTION: Compile UEFI.
2472 *****************************************************************************/
2479 DT_SUBTABLE *Subtable;
2480 DT_SUBTABLE *ParentTable;
2481 DT_FIELD **PFieldList = (DT_FIELD **) List;
2485 /* Compile the predefined portion of the UEFI table */
2487 Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
2489 if (ACPI_FAILURE (Status))
2494 DataOffset = (UINT16 *) (Subtable->Buffer + 16);
2495 *DataOffset = sizeof (ACPI_TABLE_UEFI);
2497 ParentTable = DtPeekSubtable ();
2498 DtInsertSubtable (ParentTable, Subtable);
2501 * Compile the "generic" portion of the UEFI table. This
2502 * part of the table is not predefined and any of the generic
2503 * operators may be used.
2506 DtCompileGeneric ((void **) PFieldList);
2512 /******************************************************************************
2514 * FUNCTION: DtCompileVrtc
2516 * PARAMETERS: List - Current field list pointer
2520 * DESCRIPTION: Compile VRTC.
2522 *****************************************************************************/
2531 Status = DtCompileTwoSubtables (List,
2532 AcpiDmTableInfoVrtc, AcpiDmTableInfoVrtc0);
2537 /******************************************************************************
2539 * FUNCTION: DtCompileWdat
2541 * PARAMETERS: List - Current field list pointer
2545 * DESCRIPTION: Compile WDAT.
2547 *****************************************************************************/
2556 Status = DtCompileTwoSubtables (List,
2557 AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
2562 /******************************************************************************
2564 * FUNCTION: DtCompileXsdt
2566 * PARAMETERS: List - Current field list pointer
2570 * DESCRIPTION: Compile XSDT.
2572 *****************************************************************************/
2578 DT_SUBTABLE *Subtable;
2579 DT_SUBTABLE *ParentTable;
2580 DT_FIELD *FieldList = *(DT_FIELD **) List;
2583 ParentTable = DtPeekSubtable ();
2587 DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
2589 DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
2590 DtInsertSubtable (ParentTable, Subtable);
2591 FieldList = FieldList->Next;
2598 /******************************************************************************
2600 * FUNCTION: DtCompileGeneric
2602 * PARAMETERS: List - Current field list pointer
2606 * DESCRIPTION: Compile generic unknown table.
2608 *****************************************************************************/
2615 DT_SUBTABLE *Subtable;
2616 DT_SUBTABLE *ParentTable;
2617 DT_FIELD **PFieldList = (DT_FIELD **) List;
2618 ACPI_DMTABLE_INFO *Info;
2621 ParentTable = DtPeekSubtable ();
2624 * Compile the "generic" portion of the table. This
2625 * part of the table is not predefined and any of the generic
2626 * operators may be used.
2629 /* Find any and all labels in the entire generic portion */
2631 DtDetectAllLabels (*PFieldList);
2633 /* Now we can actually compile the parse tree */
2637 Info = DtGetGenericTableInfo ((*PFieldList)->Name);
2640 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
2641 (*PFieldList)->Name);
2642 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
2643 (*PFieldList), MsgBuffer);
2645 *PFieldList = (*PFieldList)->Next;
2649 Status = DtCompileTable (PFieldList, Info,
2651 if (ACPI_SUCCESS (Status))
2653 DtInsertSubtable (ParentTable, Subtable);
2657 *PFieldList = (*PFieldList)->Next;
2659 if (Status == AE_NOT_FOUND)
2661 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
2662 (*PFieldList)->Name);
2663 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
2664 (*PFieldList), MsgBuffer);