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 /* Local prototypes */
71 DtCompileTwoSubtables (
73 ACPI_DMTABLE_INFO *TableInfo1,
74 ACPI_DMTABLE_INFO *TableInfo2);
77 /******************************************************************************
79 * FUNCTION: DtCompileTwoSubtables
81 * PARAMETERS: List - Current field list pointer
82 * TableInfo1 - Info table 1
83 * TableInfo1 - Info table 2
87 * DESCRIPTION: Compile tables with a header and one or more same subtables.
88 * Include CPEP, EINJ, ERST, MCFG, MSCT, WDAT
90 *****************************************************************************/
93 DtCompileTwoSubtables (
95 ACPI_DMTABLE_INFO *TableInfo1,
96 ACPI_DMTABLE_INFO *TableInfo2)
99 DT_SUBTABLE *Subtable;
100 DT_SUBTABLE *ParentTable;
101 DT_FIELD **PFieldList = (DT_FIELD **) List;
104 Status = DtCompileTable (PFieldList, TableInfo1, &Subtable, TRUE);
105 if (ACPI_FAILURE (Status))
110 ParentTable = DtPeekSubtable ();
111 DtInsertSubtable (ParentTable, Subtable);
115 Status = DtCompileTable (PFieldList, TableInfo2, &Subtable, FALSE);
116 if (ACPI_FAILURE (Status))
121 DtInsertSubtable (ParentTable, Subtable);
128 /******************************************************************************
130 * FUNCTION: DtCompileFacs
132 * PARAMETERS: PFieldList - Current field list pointer
136 * DESCRIPTION: Compile FACS.
138 *****************************************************************************/
142 DT_FIELD **PFieldList)
144 DT_SUBTABLE *Subtable;
145 UINT8 *ReservedBuffer;
150 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs,
151 &Gbl_RootTable, TRUE);
152 if (ACPI_FAILURE (Status))
157 /* Large FACS reserved area at the end of the table */
159 ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1);
160 ReservedBuffer = UtLocalCalloc (ReservedSize);
162 DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
164 ACPI_FREE (ReservedBuffer);
165 DtInsertSubtable (Gbl_RootTable, Subtable);
170 /******************************************************************************
172 * FUNCTION: DtCompileRsdp
174 * PARAMETERS: PFieldList - Current field list pointer
178 * DESCRIPTION: Compile RSDP.
180 *****************************************************************************/
184 DT_FIELD **PFieldList)
186 DT_SUBTABLE *Subtable;
187 ACPI_TABLE_RSDP *Rsdp;
188 ACPI_RSDP_EXTENSION *RsdpExtension;
192 /* Compile the "common" RSDP (ACPI 1.0) */
194 Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1,
195 &Gbl_RootTable, TRUE);
196 if (ACPI_FAILURE (Status))
201 Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer);
202 DtSetTableChecksum (&Rsdp->Checksum);
204 if (Rsdp->Revision > 0)
206 /* Compile the "extended" part of the RSDP as a subtable */
208 Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2,
210 if (ACPI_FAILURE (Status))
215 DtInsertSubtable (Gbl_RootTable, Subtable);
217 /* Set length and extended checksum for entire RSDP */
219 RsdpExtension = ACPI_CAST_PTR (ACPI_RSDP_EXTENSION, Subtable->Buffer);
220 RsdpExtension->Length = Gbl_RootTable->Length + Subtable->Length;
221 DtSetTableChecksum (&RsdpExtension->ExtendedChecksum);
228 /******************************************************************************
230 * FUNCTION: DtCompileAsf
232 * PARAMETERS: List - Current field list pointer
236 * DESCRIPTION: Compile ASF!.
238 *****************************************************************************/
244 ACPI_ASF_INFO *AsfTable;
245 DT_SUBTABLE *Subtable;
246 DT_SUBTABLE *ParentTable;
247 ACPI_DMTABLE_INFO *InfoTable;
248 ACPI_DMTABLE_INFO *DataInfoTable = NULL;
249 UINT32 DataCount = 0;
252 DT_FIELD **PFieldList = (DT_FIELD **) List;
253 DT_FIELD *SubtableStart;
258 SubtableStart = *PFieldList;
259 Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr,
261 if (ACPI_FAILURE (Status))
266 ParentTable = DtPeekSubtable ();
267 DtInsertSubtable (ParentTable, Subtable);
268 DtPushSubtable (Subtable);
270 AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer);
272 switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
274 case ACPI_ASF_TYPE_INFO:
276 InfoTable = AcpiDmTableInfoAsf0;
279 case ACPI_ASF_TYPE_ALERT:
281 InfoTable = AcpiDmTableInfoAsf1;
284 case ACPI_ASF_TYPE_CONTROL:
286 InfoTable = AcpiDmTableInfoAsf2;
289 case ACPI_ASF_TYPE_BOOT:
291 InfoTable = AcpiDmTableInfoAsf3;
294 case ACPI_ASF_TYPE_ADDRESS:
296 InfoTable = AcpiDmTableInfoAsf4;
301 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
305 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
306 if (ACPI_FAILURE (Status))
311 ParentTable = DtPeekSubtable ();
312 DtInsertSubtable (ParentTable, Subtable);
314 switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
316 case ACPI_ASF_TYPE_INFO:
318 DataInfoTable = NULL;
321 case ACPI_ASF_TYPE_ALERT:
323 DataInfoTable = AcpiDmTableInfoAsf1a;
324 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT,
325 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
326 sizeof (ACPI_ASF_HEADER)))->Alerts;
329 case ACPI_ASF_TYPE_CONTROL:
331 DataInfoTable = AcpiDmTableInfoAsf2a;
332 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE,
333 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
334 sizeof (ACPI_ASF_HEADER)))->Controls;
337 case ACPI_ASF_TYPE_BOOT:
339 DataInfoTable = NULL;
342 case ACPI_ASF_TYPE_ADDRESS:
344 DataInfoTable = TableInfoAsfAddress;
345 DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS,
346 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
347 sizeof (ACPI_ASF_HEADER)))->Devices;
352 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
358 switch (AsfTable->Header.Type & 0x7F)
360 case ACPI_ASF_TYPE_ADDRESS:
362 while (DataCount > 0)
364 Status = DtCompileTable (PFieldList, DataInfoTable,
366 if (ACPI_FAILURE (Status))
371 DtInsertSubtable (ParentTable, Subtable);
372 DataCount = DataCount - Subtable->Length;
378 for (i = 0; i < DataCount; i++)
380 Status = DtCompileTable (PFieldList, DataInfoTable,
382 if (ACPI_FAILURE (Status))
387 DtInsertSubtable (ParentTable, Subtable);
400 /******************************************************************************
402 * FUNCTION: DtCompileCpep
404 * PARAMETERS: List - Current field list pointer
408 * DESCRIPTION: Compile CPEP.
410 *****************************************************************************/
419 Status = DtCompileTwoSubtables (List,
420 AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0);
425 /******************************************************************************
427 * FUNCTION: DtCompileCsrt
429 * PARAMETERS: List - Current field list pointer
433 * DESCRIPTION: Compile CSRT.
435 *****************************************************************************/
441 ACPI_STATUS Status = AE_OK;
442 DT_SUBTABLE *Subtable;
443 DT_SUBTABLE *ParentTable;
444 DT_FIELD **PFieldList = (DT_FIELD **) List;
445 UINT32 DescriptorCount;
449 /* Subtables (Resource Groups) */
451 ParentTable = DtPeekSubtable ();
454 /* Resource group subtable */
456 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt0,
458 if (ACPI_FAILURE (Status))
463 /* Compute the number of resource descriptors */
466 (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
467 Subtable->Buffer))->Length -
468 (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
469 Subtable->Buffer))->SharedInfoLength -
470 sizeof (ACPI_CSRT_GROUP);
472 DescriptorCount = (GroupLength /
473 sizeof (ACPI_CSRT_DESCRIPTOR));
475 DtInsertSubtable (ParentTable, Subtable);
476 DtPushSubtable (Subtable);
477 ParentTable = DtPeekSubtable ();
479 /* Shared info subtable (One per resource group) */
481 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt1,
483 if (ACPI_FAILURE (Status))
488 DtInsertSubtable (ParentTable, Subtable);
490 /* Sub-Subtables (Resource Descriptors) */
492 while (*PFieldList && DescriptorCount)
495 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2,
497 if (ACPI_FAILURE (Status))
501 DtInsertSubtable (ParentTable, Subtable);
503 DtPushSubtable (Subtable);
504 ParentTable = DtPeekSubtable ();
507 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2a,
509 if (ACPI_FAILURE (Status))
515 DtInsertSubtable (ParentTable, Subtable);
519 ParentTable = DtPeekSubtable ();
525 ParentTable = DtPeekSubtable ();
532 /******************************************************************************
534 * FUNCTION: DtCompileDbg2
536 * PARAMETERS: List - Current field list pointer
540 * DESCRIPTION: Compile DBG2.
542 *****************************************************************************/
549 DT_SUBTABLE *Subtable;
550 DT_SUBTABLE *ParentTable;
551 DT_FIELD **PFieldList = (DT_FIELD **) List;
552 UINT32 SubtableCount;
553 ACPI_DBG2_HEADER *Dbg2Header;
554 ACPI_DBG2_DEVICE *DeviceInfo;
555 UINT16 CurrentOffset;
561 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2, &Subtable, TRUE);
562 if (ACPI_FAILURE (Status))
567 ParentTable = DtPeekSubtable ();
568 DtInsertSubtable (ParentTable, Subtable);
570 /* Main table fields */
572 Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer);
573 Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF (
574 ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header);
576 SubtableCount = Dbg2Header->InfoCount;
577 DtPushSubtable (Subtable);
579 /* Process all Device Information subtables (Count = InfoCount) */
581 while (*PFieldList && SubtableCount)
583 /* Subtable: Debug Device Information */
585 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Device,
587 if (ACPI_FAILURE (Status))
592 DeviceInfo = ACPI_CAST_PTR (ACPI_DBG2_DEVICE, Subtable->Buffer);
593 CurrentOffset = (UINT16) sizeof (ACPI_DBG2_DEVICE);
595 ParentTable = DtPeekSubtable ();
596 DtInsertSubtable (ParentTable, Subtable);
597 DtPushSubtable (Subtable);
599 ParentTable = DtPeekSubtable ();
601 /* BaseAddressRegister GAS array (Required, size is RegisterCount) */
603 DeviceInfo->BaseAddressOffset = CurrentOffset;
604 for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
606 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr,
608 if (ACPI_FAILURE (Status))
613 CurrentOffset += (UINT16) sizeof (ACPI_GENERIC_ADDRESS);
614 DtInsertSubtable (ParentTable, Subtable);
617 /* AddressSize array (Required, size = RegisterCount) */
619 DeviceInfo->AddressSizeOffset = CurrentOffset;
620 for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
622 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size,
624 if (ACPI_FAILURE (Status))
629 CurrentOffset += (UINT16) sizeof (UINT32);
630 DtInsertSubtable (ParentTable, Subtable);
633 /* NamespaceString device identifier (Required, size = NamePathLength) */
635 DeviceInfo->NamepathOffset = CurrentOffset;
636 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name,
638 if (ACPI_FAILURE (Status))
643 /* Update the device info header */
645 DeviceInfo->NamepathLength = (UINT16) Subtable->Length;
646 CurrentOffset += (UINT16) DeviceInfo->NamepathLength;
647 DtInsertSubtable (ParentTable, Subtable);
649 /* OemData - Variable-length data (Optional, size = OemDataLength) */
651 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2OemData,
653 if (ACPI_FAILURE (Status))
658 /* Update the device info header (zeros if no OEM data present) */
660 DeviceInfo->OemDataOffset = 0;
661 DeviceInfo->OemDataLength = 0;
663 /* Optional subtable (OemData) */
665 if (Subtable && Subtable->Length)
667 DeviceInfo->OemDataOffset = CurrentOffset;
668 DeviceInfo->OemDataLength = (UINT16) Subtable->Length;
670 DtInsertSubtable (ParentTable, Subtable);
674 DtPopSubtable (); /* Get next Device Information subtable */
682 /******************************************************************************
684 * FUNCTION: DtCompileDmar
686 * PARAMETERS: List - Current field list pointer
690 * DESCRIPTION: Compile DMAR.
692 *****************************************************************************/
699 DT_SUBTABLE *Subtable;
700 DT_SUBTABLE *ParentTable;
701 DT_FIELD **PFieldList = (DT_FIELD **) List;
702 DT_FIELD *SubtableStart;
703 ACPI_DMTABLE_INFO *InfoTable;
704 ACPI_DMAR_HEADER *DmarHeader;
705 ACPI_DMAR_DEVICE_SCOPE *DmarDeviceScope;
706 UINT32 DeviceScopeLength;
707 UINT32 PciPathLength;
710 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE);
711 if (ACPI_FAILURE (Status))
716 ParentTable = DtPeekSubtable ();
717 DtInsertSubtable (ParentTable, Subtable);
718 DtPushSubtable (Subtable);
724 SubtableStart = *PFieldList;
725 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr,
727 if (ACPI_FAILURE (Status))
732 ParentTable = DtPeekSubtable ();
733 DtInsertSubtable (ParentTable, Subtable);
734 DtPushSubtable (Subtable);
736 DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
738 switch (DmarHeader->Type)
740 case ACPI_DMAR_TYPE_HARDWARE_UNIT:
742 InfoTable = AcpiDmTableInfoDmar0;
745 case ACPI_DMAR_TYPE_RESERVED_MEMORY:
747 InfoTable = AcpiDmTableInfoDmar1;
750 case ACPI_DMAR_TYPE_ROOT_ATS:
752 InfoTable = AcpiDmTableInfoDmar2;
755 case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
757 InfoTable = AcpiDmTableInfoDmar3;
760 case ACPI_DMAR_TYPE_NAMESPACE:
762 InfoTable = AcpiDmTableInfoDmar4;
767 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
773 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
774 if (ACPI_FAILURE (Status))
779 ParentTable = DtPeekSubtable ();
780 DtInsertSubtable (ParentTable, Subtable);
783 * Optional Device Scope subtables
785 if ((DmarHeader->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
786 (DmarHeader->Type == ACPI_DMAR_TYPE_NAMESPACE))
788 /* These types do not support device scopes */
794 DtPushSubtable (Subtable);
795 DeviceScopeLength = DmarHeader->Length - Subtable->Length -
797 while (DeviceScopeLength)
799 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
801 if (Status == AE_NOT_FOUND)
806 ParentTable = DtPeekSubtable ();
807 DtInsertSubtable (ParentTable, Subtable);
808 DtPushSubtable (Subtable);
810 DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer);
812 /* Optional PCI Paths */
814 PciPathLength = DmarDeviceScope->Length - Subtable->Length;
815 while (PciPathLength)
817 Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
819 if (Status == AE_NOT_FOUND)
825 ParentTable = DtPeekSubtable ();
826 DtInsertSubtable (ParentTable, Subtable);
827 PciPathLength -= Subtable->Length;
831 DeviceScopeLength -= DmarDeviceScope->Length;
842 /******************************************************************************
844 * FUNCTION: DtCompileDrtm
846 * PARAMETERS: List - Current field list pointer
850 * DESCRIPTION: Compile DRTM.
852 *****************************************************************************/
859 DT_SUBTABLE *Subtable;
860 DT_SUBTABLE *ParentTable;
861 DT_FIELD **PFieldList = (DT_FIELD **) List;
863 /* ACPI_TABLE_DRTM *Drtm; */
864 ACPI_DRTM_VTABLE_LIST *DrtmVtl;
865 ACPI_DRTM_RESOURCE_LIST *DrtmRl;
866 /* ACPI_DRTM_DPS_ID *DrtmDps; */
869 ParentTable = DtPeekSubtable ();
871 /* Compile DRTM header */
873 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm,
875 if (ACPI_FAILURE (Status))
879 DtInsertSubtable (ParentTable, Subtable);
882 * Using ACPI_SUB_PTR, We needn't define a seperate structure. Care
883 * should be taken to avoid accessing ACPI_TABLE_HADER fields.
886 Drtm = ACPI_SUB_PTR (ACPI_TABLE_DRTM,
887 Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
891 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0,
893 if (ACPI_FAILURE (Status))
897 DtInsertSubtable (ParentTable, Subtable);
898 DrtmVtl = ACPI_CAST_PTR (ACPI_DRTM_VTABLE_LIST, Subtable->Buffer);
900 DtPushSubtable (Subtable);
901 ParentTable = DtPeekSubtable ();
905 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0a,
907 if (ACPI_FAILURE (Status))
915 DtInsertSubtable (ParentTable, Subtable);
918 DrtmVtl->ValidatedTableCount = Count;
920 ParentTable = DtPeekSubtable ();
924 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1,
926 if (ACPI_FAILURE (Status))
930 DtInsertSubtable (ParentTable, Subtable);
931 DrtmRl = ACPI_CAST_PTR (ACPI_DRTM_RESOURCE_LIST, Subtable->Buffer);
933 DtPushSubtable (Subtable);
934 ParentTable = DtPeekSubtable ();
938 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1a,
940 if (ACPI_FAILURE (Status))
948 DtInsertSubtable (ParentTable, Subtable);
951 DrtmRl->ResourceCount = Count;
953 ParentTable = DtPeekSubtable ();
957 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm2,
959 if (ACPI_FAILURE (Status))
963 DtInsertSubtable (ParentTable, Subtable);
964 /* DrtmDps = ACPI_CAST_PTR (ACPI_DRTM_DPS_ID, Subtable->Buffer);*/
971 /******************************************************************************
973 * FUNCTION: DtCompileEinj
975 * PARAMETERS: List - Current field list pointer
979 * DESCRIPTION: Compile EINJ.
981 *****************************************************************************/
990 Status = DtCompileTwoSubtables (List,
991 AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
996 /******************************************************************************
998 * FUNCTION: DtCompileErst
1000 * PARAMETERS: List - Current field list pointer
1004 * DESCRIPTION: Compile ERST.
1006 *****************************************************************************/
1015 Status = DtCompileTwoSubtables (List,
1016 AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
1021 /******************************************************************************
1023 * FUNCTION: DtCompileFadt
1025 * PARAMETERS: List - Current field list pointer
1029 * DESCRIPTION: Compile FADT.
1031 *****************************************************************************/
1038 DT_SUBTABLE *Subtable;
1039 DT_SUBTABLE *ParentTable;
1040 DT_FIELD **PFieldList = (DT_FIELD **) List;
1041 ACPI_TABLE_HEADER *Table;
1045 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1,
1047 if (ACPI_FAILURE (Status))
1052 ParentTable = DtPeekSubtable ();
1053 DtInsertSubtable (ParentTable, Subtable);
1055 Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
1056 Revision = Table->Revision;
1060 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2,
1062 if (ACPI_FAILURE (Status))
1067 DtInsertSubtable (ParentTable, Subtable);
1069 else if (Revision >= 2)
1071 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3,
1073 if (ACPI_FAILURE (Status))
1078 DtInsertSubtable (ParentTable, Subtable);
1082 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5,
1084 if (ACPI_FAILURE (Status))
1089 DtInsertSubtable (ParentTable, Subtable);
1094 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt6,
1096 if (ACPI_FAILURE (Status))
1101 DtInsertSubtable (ParentTable, Subtable);
1108 /******************************************************************************
1110 * FUNCTION: DtCompileGtdt
1112 * PARAMETERS: List - Current field list pointer
1116 * DESCRIPTION: Compile GTDT.
1118 *****************************************************************************/
1125 DT_SUBTABLE *Subtable;
1126 DT_SUBTABLE *ParentTable;
1127 DT_FIELD **PFieldList = (DT_FIELD **) List;
1128 DT_FIELD *SubtableStart;
1129 ACPI_SUBTABLE_HEADER *GtdtHeader;
1130 ACPI_DMTABLE_INFO *InfoTable;
1134 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt,
1136 if (ACPI_FAILURE (Status))
1141 ParentTable = DtPeekSubtable ();
1142 DtInsertSubtable (ParentTable, Subtable);
1146 SubtableStart = *PFieldList;
1147 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdtHdr,
1149 if (ACPI_FAILURE (Status))
1154 ParentTable = DtPeekSubtable ();
1155 DtInsertSubtable (ParentTable, Subtable);
1156 DtPushSubtable (Subtable);
1158 GtdtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1160 switch (GtdtHeader->Type)
1162 case ACPI_GTDT_TYPE_TIMER_BLOCK:
1164 InfoTable = AcpiDmTableInfoGtdt0;
1167 case ACPI_GTDT_TYPE_WATCHDOG:
1169 InfoTable = AcpiDmTableInfoGtdt1;
1174 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "GTDT");
1178 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1179 if (ACPI_FAILURE (Status))
1184 ParentTable = DtPeekSubtable ();
1185 DtInsertSubtable (ParentTable, Subtable);
1188 * Additional GT block subtable data
1191 switch (GtdtHeader->Type)
1193 case ACPI_GTDT_TYPE_TIMER_BLOCK:
1195 DtPushSubtable (Subtable);
1196 ParentTable = DtPeekSubtable ();
1198 GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
1199 Subtable->Buffer - sizeof(ACPI_GTDT_HEADER)))->TimerCount;
1202 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt0a,
1204 if (ACPI_FAILURE (Status))
1210 DtInsertSubtable (ParentTable, Subtable);
1228 /******************************************************************************
1230 * FUNCTION: DtCompileFpdt
1232 * PARAMETERS: List - Current field list pointer
1236 * DESCRIPTION: Compile FPDT.
1238 *****************************************************************************/
1245 ACPI_FPDT_HEADER *FpdtHeader;
1246 DT_SUBTABLE *Subtable;
1247 DT_SUBTABLE *ParentTable;
1248 ACPI_DMTABLE_INFO *InfoTable;
1249 DT_FIELD **PFieldList = (DT_FIELD **) List;
1250 DT_FIELD *SubtableStart;
1255 SubtableStart = *PFieldList;
1256 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr,
1258 if (ACPI_FAILURE (Status))
1263 ParentTable = DtPeekSubtable ();
1264 DtInsertSubtable (ParentTable, Subtable);
1265 DtPushSubtable (Subtable);
1267 FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
1269 switch (FpdtHeader->Type)
1271 case ACPI_FPDT_TYPE_BOOT:
1273 InfoTable = AcpiDmTableInfoFpdt0;
1276 case ACPI_FPDT_TYPE_S3PERF:
1278 InfoTable = AcpiDmTableInfoFpdt1;
1283 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT");
1288 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1289 if (ACPI_FAILURE (Status))
1294 ParentTable = DtPeekSubtable ();
1295 DtInsertSubtable (ParentTable, Subtable);
1303 /******************************************************************************
1305 * FUNCTION: DtCompileHest
1307 * PARAMETERS: List - Current field list pointer
1311 * DESCRIPTION: Compile HEST.
1313 *****************************************************************************/
1320 DT_SUBTABLE *Subtable;
1321 DT_SUBTABLE *ParentTable;
1322 DT_FIELD **PFieldList = (DT_FIELD **) List;
1323 DT_FIELD *SubtableStart;
1324 ACPI_DMTABLE_INFO *InfoTable;
1329 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
1331 if (ACPI_FAILURE (Status))
1336 ParentTable = DtPeekSubtable ();
1337 DtInsertSubtable (ParentTable, Subtable);
1341 /* Get subtable type */
1343 SubtableStart = *PFieldList;
1344 DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
1348 case ACPI_HEST_TYPE_IA32_CHECK:
1350 InfoTable = AcpiDmTableInfoHest0;
1353 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1355 InfoTable = AcpiDmTableInfoHest1;
1358 case ACPI_HEST_TYPE_IA32_NMI:
1360 InfoTable = AcpiDmTableInfoHest2;
1363 case ACPI_HEST_TYPE_AER_ROOT_PORT:
1365 InfoTable = AcpiDmTableInfoHest6;
1368 case ACPI_HEST_TYPE_AER_ENDPOINT:
1370 InfoTable = AcpiDmTableInfoHest7;
1373 case ACPI_HEST_TYPE_AER_BRIDGE:
1375 InfoTable = AcpiDmTableInfoHest8;
1378 case ACPI_HEST_TYPE_GENERIC_ERROR:
1380 InfoTable = AcpiDmTableInfoHest9;
1385 /* Cannot continue on unknown type */
1387 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
1391 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1392 if (ACPI_FAILURE (Status))
1397 DtInsertSubtable (ParentTable, Subtable);
1400 * Additional subtable data - IA32 Error Bank(s)
1405 case ACPI_HEST_TYPE_IA32_CHECK:
1407 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1408 Subtable->Buffer))->NumHardwareBanks;
1411 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1413 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1414 Subtable->Buffer))->NumHardwareBanks;
1424 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
1426 if (ACPI_FAILURE (Status))
1431 DtInsertSubtable (ParentTable, Subtable);
1440 /******************************************************************************
1442 * FUNCTION: DtCompileIort
1444 * PARAMETERS: List - Current field list pointer
1448 * DESCRIPTION: Compile IORT.
1450 *****************************************************************************/
1457 DT_SUBTABLE *Subtable;
1458 DT_SUBTABLE *ParentTable;
1459 DT_FIELD **PFieldList = (DT_FIELD **) List;
1460 DT_FIELD *SubtableStart;
1461 ACPI_TABLE_IORT *Iort;
1462 ACPI_IORT_NODE *IortNode;
1463 ACPI_IORT_ITS_GROUP *IortItsGroup;
1464 ACPI_IORT_SMMU *IortSmmu;
1467 UINT32 IdMappingNumber;
1469 UINT32 ContextIrptNumber;
1470 UINT32 PmuIrptNumber;
1471 UINT32 PaddingLength;
1474 ParentTable = DtPeekSubtable ();
1476 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort,
1478 if (ACPI_FAILURE (Status))
1482 DtInsertSubtable (ParentTable, Subtable);
1485 * Using ACPI_SUB_PTR, We needn't define a seperate structure. Care
1486 * should be taken to avoid accessing ACPI_TABLE_HADER fields.
1488 Iort = ACPI_SUB_PTR (ACPI_TABLE_IORT,
1489 Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
1492 * OptionalPadding - Variable-length data
1493 * (Optional, size = OffsetToNodes - sizeof (ACPI_TABLE_IORT))
1494 * Optionally allows the generic data types to be used for filling
1497 Iort->NodeOffset = sizeof (ACPI_TABLE_IORT);
1498 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortPad,
1500 if (ACPI_FAILURE (Status))
1506 DtInsertSubtable (ParentTable, Subtable);
1507 Iort->NodeOffset += Subtable->Length;
1511 Status = DtCompileGeneric (ACPI_CAST_PTR (void *, PFieldList),
1512 AcpiDmTableInfoIortHdr[0].Name, &PaddingLength);
1513 if (ACPI_FAILURE (Status))
1517 Iort->NodeOffset += PaddingLength;
1523 SubtableStart = *PFieldList;
1524 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr,
1526 if (ACPI_FAILURE (Status))
1530 DtInsertSubtable (ParentTable, Subtable);
1531 IortNode = ACPI_CAST_PTR (ACPI_IORT_NODE, Subtable->Buffer);
1532 NodeLength = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
1534 DtPushSubtable (Subtable);
1535 ParentTable = DtPeekSubtable ();
1537 switch (IortNode->Type)
1539 case ACPI_IORT_NODE_ITS_GROUP:
1541 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0,
1543 if (ACPI_FAILURE (Status))
1547 DtInsertSubtable (ParentTable, Subtable);
1548 IortItsGroup = ACPI_CAST_PTR (ACPI_IORT_ITS_GROUP, Subtable->Buffer);
1549 NodeLength += Subtable->Length;
1554 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0a,
1556 if (ACPI_FAILURE (Status))
1564 DtInsertSubtable (ParentTable, Subtable);
1565 NodeLength += Subtable->Length;
1569 IortItsGroup->ItsCount = ItsNumber;
1572 case ACPI_IORT_NODE_NAMED_COMPONENT:
1574 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1,
1576 if (ACPI_FAILURE (Status))
1580 DtInsertSubtable (ParentTable, Subtable);
1581 NodeLength += Subtable->Length;
1584 * Padding - Variable-length data
1585 * Optionally allows the offset of the ID mappings to be used
1586 * for filling this field.
1588 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1a,
1590 if (ACPI_FAILURE (Status))
1596 DtInsertSubtable (ParentTable, Subtable);
1597 NodeLength += Subtable->Length;
1601 if (NodeLength > IortNode->MappingOffset)
1603 return (AE_BAD_DATA);
1605 if (NodeLength < IortNode->MappingOffset)
1607 Status = DtCompilePadding (
1608 IortNode->MappingOffset - NodeLength,
1610 if (ACPI_FAILURE (Status))
1614 DtInsertSubtable (ParentTable, Subtable);
1615 NodeLength = IortNode->MappingOffset;
1620 case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
1622 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort2,
1624 if (ACPI_FAILURE (Status))
1628 DtInsertSubtable (ParentTable, Subtable);
1629 NodeLength += Subtable->Length;
1632 case ACPI_IORT_NODE_SMMU:
1634 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3,
1636 if (ACPI_FAILURE (Status))
1640 DtInsertSubtable (ParentTable, Subtable);
1641 IortSmmu = ACPI_CAST_PTR (ACPI_IORT_SMMU, Subtable->Buffer);
1642 NodeLength += Subtable->Length;
1644 /* Compile global interrupt array */
1646 IortSmmu->GlobalInterruptOffset = NodeLength;
1647 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3a,
1649 if (ACPI_FAILURE (Status))
1653 DtInsertSubtable (ParentTable, Subtable);
1654 NodeLength += Subtable->Length;
1656 /* Compile context interrupt array */
1658 ContextIrptNumber = 0;
1659 IortSmmu->ContextInterruptOffset = NodeLength;
1662 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3b,
1664 if (ACPI_FAILURE (Status))
1672 DtInsertSubtable (ParentTable, Subtable);
1673 NodeLength += Subtable->Length;
1674 ContextIrptNumber++;
1676 IortSmmu->ContextInterruptCount = ContextIrptNumber;
1678 /* Compile PMU interrupt array */
1681 IortSmmu->PmuInterruptOffset = NodeLength;
1684 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3c,
1686 if (ACPI_FAILURE (Status))
1694 DtInsertSubtable (ParentTable, Subtable);
1695 NodeLength += Subtable->Length;
1698 IortSmmu->PmuInterruptCount = PmuIrptNumber;
1703 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IORT");
1707 /* Compile Array of ID mappings */
1709 IortNode->MappingOffset = NodeLength;
1710 IdMappingNumber = 0;
1713 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortMap,
1715 if (ACPI_FAILURE (Status))
1723 DtInsertSubtable (ParentTable, Subtable);
1724 NodeLength += sizeof (ACPI_IORT_ID_MAPPING);
1727 IortNode->MappingCount = IdMappingNumber;
1730 * Node length can be determined by DT_LENGTH option
1731 * IortNode->Length = NodeLength;
1734 ParentTable = DtPeekSubtable ();
1737 Iort->NodeCount = NodeNumber;
1743 /******************************************************************************
1745 * FUNCTION: DtCompileIvrs
1747 * PARAMETERS: List - Current field list pointer
1751 * DESCRIPTION: Compile IVRS.
1753 *****************************************************************************/
1760 DT_SUBTABLE *Subtable;
1761 DT_SUBTABLE *ParentTable;
1762 DT_FIELD **PFieldList = (DT_FIELD **) List;
1763 DT_FIELD *SubtableStart;
1764 ACPI_DMTABLE_INFO *InfoTable;
1765 ACPI_IVRS_HEADER *IvrsHeader;
1769 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
1771 if (ACPI_FAILURE (Status))
1776 ParentTable = DtPeekSubtable ();
1777 DtInsertSubtable (ParentTable, Subtable);
1781 SubtableStart = *PFieldList;
1782 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr,
1784 if (ACPI_FAILURE (Status))
1789 ParentTable = DtPeekSubtable ();
1790 DtInsertSubtable (ParentTable, Subtable);
1791 DtPushSubtable (Subtable);
1793 IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer);
1795 switch (IvrsHeader->Type)
1797 case ACPI_IVRS_TYPE_HARDWARE:
1799 InfoTable = AcpiDmTableInfoIvrs0;
1802 case ACPI_IVRS_TYPE_MEMORY1:
1803 case ACPI_IVRS_TYPE_MEMORY2:
1804 case ACPI_IVRS_TYPE_MEMORY3:
1806 InfoTable = AcpiDmTableInfoIvrs1;
1811 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS");
1815 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1816 if (ACPI_FAILURE (Status))
1821 ParentTable = DtPeekSubtable ();
1822 DtInsertSubtable (ParentTable, Subtable);
1824 if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE)
1826 while (*PFieldList &&
1827 !ACPI_STRCMP ((*PFieldList)->Name, "Entry Type"))
1829 SubtableStart = *PFieldList;
1830 DtCompileInteger (&EntryType, *PFieldList, 1, 0);
1834 /* 4-byte device entries */
1836 case ACPI_IVRS_TYPE_PAD4:
1837 case ACPI_IVRS_TYPE_ALL:
1838 case ACPI_IVRS_TYPE_SELECT:
1839 case ACPI_IVRS_TYPE_START:
1840 case ACPI_IVRS_TYPE_END:
1842 InfoTable = AcpiDmTableInfoIvrs4;
1845 /* 8-byte entries, type A */
1847 case ACPI_IVRS_TYPE_ALIAS_SELECT:
1848 case ACPI_IVRS_TYPE_ALIAS_START:
1850 InfoTable = AcpiDmTableInfoIvrs8a;
1853 /* 8-byte entries, type B */
1855 case ACPI_IVRS_TYPE_PAD8:
1856 case ACPI_IVRS_TYPE_EXT_SELECT:
1857 case ACPI_IVRS_TYPE_EXT_START:
1859 InfoTable = AcpiDmTableInfoIvrs8b;
1862 /* 8-byte entries, type C */
1864 case ACPI_IVRS_TYPE_SPECIAL:
1866 InfoTable = AcpiDmTableInfoIvrs8c;
1871 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
1872 "IVRS Device Entry");
1876 Status = DtCompileTable (PFieldList, InfoTable,
1878 if (ACPI_FAILURE (Status))
1883 DtInsertSubtable (ParentTable, Subtable);
1894 /******************************************************************************
1896 * FUNCTION: DtCompileLpit
1898 * PARAMETERS: List - Current field list pointer
1902 * DESCRIPTION: Compile LPIT.
1904 *****************************************************************************/
1911 DT_SUBTABLE *Subtable;
1912 DT_SUBTABLE *ParentTable;
1913 DT_FIELD **PFieldList = (DT_FIELD **) List;
1914 DT_FIELD *SubtableStart;
1915 ACPI_DMTABLE_INFO *InfoTable;
1916 ACPI_LPIT_HEADER *LpitHeader;
1919 /* Note: Main table consists only of the standard ACPI table header */
1923 SubtableStart = *PFieldList;
1925 /* LPIT Subtable header */
1927 Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr,
1929 if (ACPI_FAILURE (Status))
1934 ParentTable = DtPeekSubtable ();
1935 DtInsertSubtable (ParentTable, Subtable);
1936 DtPushSubtable (Subtable);
1938 LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer);
1940 switch (LpitHeader->Type)
1942 case ACPI_LPIT_TYPE_NATIVE_CSTATE:
1944 InfoTable = AcpiDmTableInfoLpit0;
1949 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT");
1955 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1956 if (ACPI_FAILURE (Status))
1961 ParentTable = DtPeekSubtable ();
1962 DtInsertSubtable (ParentTable, Subtable);
1970 /******************************************************************************
1972 * FUNCTION: DtCompileMadt
1974 * PARAMETERS: List - Current field list pointer
1978 * DESCRIPTION: Compile MADT.
1980 *****************************************************************************/
1987 DT_SUBTABLE *Subtable;
1988 DT_SUBTABLE *ParentTable;
1989 DT_FIELD **PFieldList = (DT_FIELD **) List;
1990 DT_FIELD *SubtableStart;
1991 ACPI_SUBTABLE_HEADER *MadtHeader;
1992 ACPI_DMTABLE_INFO *InfoTable;
1995 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
1997 if (ACPI_FAILURE (Status))
2002 ParentTable = DtPeekSubtable ();
2003 DtInsertSubtable (ParentTable, Subtable);
2007 SubtableStart = *PFieldList;
2008 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
2010 if (ACPI_FAILURE (Status))
2015 ParentTable = DtPeekSubtable ();
2016 DtInsertSubtable (ParentTable, Subtable);
2017 DtPushSubtable (Subtable);
2019 MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
2021 switch (MadtHeader->Type)
2023 case ACPI_MADT_TYPE_LOCAL_APIC:
2025 InfoTable = AcpiDmTableInfoMadt0;
2028 case ACPI_MADT_TYPE_IO_APIC:
2030 InfoTable = AcpiDmTableInfoMadt1;
2033 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
2035 InfoTable = AcpiDmTableInfoMadt2;
2038 case ACPI_MADT_TYPE_NMI_SOURCE:
2040 InfoTable = AcpiDmTableInfoMadt3;
2043 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
2045 InfoTable = AcpiDmTableInfoMadt4;
2048 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
2050 InfoTable = AcpiDmTableInfoMadt5;
2053 case ACPI_MADT_TYPE_IO_SAPIC:
2055 InfoTable = AcpiDmTableInfoMadt6;
2058 case ACPI_MADT_TYPE_LOCAL_SAPIC:
2060 InfoTable = AcpiDmTableInfoMadt7;
2063 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
2065 InfoTable = AcpiDmTableInfoMadt8;
2068 case ACPI_MADT_TYPE_LOCAL_X2APIC:
2070 InfoTable = AcpiDmTableInfoMadt9;
2073 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
2075 InfoTable = AcpiDmTableInfoMadt10;
2078 case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
2080 InfoTable = AcpiDmTableInfoMadt11;
2083 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
2085 InfoTable = AcpiDmTableInfoMadt12;
2088 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
2090 InfoTable = AcpiDmTableInfoMadt13;
2093 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
2095 InfoTable = AcpiDmTableInfoMadt14;
2098 case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
2100 InfoTable = AcpiDmTableInfoMadt15;
2105 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
2109 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
2110 if (ACPI_FAILURE (Status))
2115 ParentTable = DtPeekSubtable ();
2116 DtInsertSubtable (ParentTable, Subtable);
2124 /******************************************************************************
2126 * FUNCTION: DtCompileMcfg
2128 * PARAMETERS: List - Current field list pointer
2132 * DESCRIPTION: Compile MCFG.
2134 *****************************************************************************/
2143 Status = DtCompileTwoSubtables (List,
2144 AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
2149 /******************************************************************************
2151 * FUNCTION: DtCompileMpst
2153 * PARAMETERS: List - Current field list pointer
2157 * DESCRIPTION: Compile MPST.
2159 *****************************************************************************/
2166 DT_SUBTABLE *Subtable;
2167 DT_SUBTABLE *ParentTable;
2168 DT_FIELD **PFieldList = (DT_FIELD **) List;
2169 ACPI_MPST_CHANNEL *MpstChannelInfo;
2170 ACPI_MPST_POWER_NODE *MpstPowerNode;
2171 ACPI_MPST_DATA_HDR *MpstDataHeader;
2172 UINT16 SubtableCount;
2173 UINT32 PowerStateCount;
2174 UINT32 ComponentCount;
2179 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable, TRUE);
2180 if (ACPI_FAILURE (Status))
2185 ParentTable = DtPeekSubtable ();
2186 DtInsertSubtable (ParentTable, Subtable);
2187 DtPushSubtable (Subtable);
2189 MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
2190 SubtableCount = MpstChannelInfo->PowerNodeCount;
2192 while (*PFieldList && SubtableCount)
2194 /* Subtable: Memory Power Node(s) */
2196 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
2198 if (ACPI_FAILURE (Status))
2203 ParentTable = DtPeekSubtable ();
2204 DtInsertSubtable (ParentTable, Subtable);
2205 DtPushSubtable (Subtable);
2207 MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
2208 PowerStateCount = MpstPowerNode->NumPowerStates;
2209 ComponentCount = MpstPowerNode->NumPhysicalComponents;
2211 ParentTable = DtPeekSubtable ();
2213 /* Sub-subtables - Memory Power State Structure(s) */
2215 while (*PFieldList && PowerStateCount)
2217 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
2219 if (ACPI_FAILURE (Status))
2224 DtInsertSubtable (ParentTable, Subtable);
2228 /* Sub-subtables - Physical Component ID Structure(s) */
2230 while (*PFieldList && ComponentCount)
2232 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
2234 if (ACPI_FAILURE (Status))
2239 DtInsertSubtable (ParentTable, Subtable);
2247 /* Subtable: Count of Memory Power State Characteristic structures */
2251 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable, TRUE);
2252 if (ACPI_FAILURE (Status))
2257 ParentTable = DtPeekSubtable ();
2258 DtInsertSubtable (ParentTable, Subtable);
2259 DtPushSubtable (Subtable);
2261 MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
2262 SubtableCount = MpstDataHeader->CharacteristicsCount;
2264 ParentTable = DtPeekSubtable ();
2266 /* Subtable: Memory Power State Characteristics structure(s) */
2268 while (*PFieldList && SubtableCount)
2270 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
2272 if (ACPI_FAILURE (Status))
2277 DtInsertSubtable (ParentTable, Subtable);
2286 /******************************************************************************
2288 * FUNCTION: DtCompileMsct
2290 * PARAMETERS: List - Current field list pointer
2294 * DESCRIPTION: Compile MSCT.
2296 *****************************************************************************/
2305 Status = DtCompileTwoSubtables (List,
2306 AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
2311 /******************************************************************************
2313 * FUNCTION: DtCompileMtmr
2315 * PARAMETERS: List - Current field list pointer
2319 * DESCRIPTION: Compile MTMR.
2321 *****************************************************************************/
2330 Status = DtCompileTwoSubtables (List,
2331 AcpiDmTableInfoMtmr, AcpiDmTableInfoMtmr0);
2336 /******************************************************************************
2338 * FUNCTION: DtCompileNfit
2340 * PARAMETERS: List - Current field list pointer
2344 * DESCRIPTION: Compile NFIT.
2346 *****************************************************************************/
2353 DT_SUBTABLE *Subtable;
2354 DT_SUBTABLE *ParentTable;
2355 DT_FIELD **PFieldList = (DT_FIELD **) List;
2356 DT_FIELD *SubtableStart;
2357 ACPI_NFIT_HEADER *NfitHeader;
2358 ACPI_DMTABLE_INFO *InfoTable;
2360 ACPI_NFIT_INTERLEAVE *Interleave = NULL;
2361 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
2365 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit,
2367 if (ACPI_FAILURE (Status))
2372 ParentTable = DtPeekSubtable ();
2373 DtInsertSubtable (ParentTable, Subtable);
2374 DtPushSubtable (Subtable);
2380 SubtableStart = *PFieldList;
2381 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr,
2383 if (ACPI_FAILURE (Status))
2388 ParentTable = DtPeekSubtable ();
2389 DtInsertSubtable (ParentTable, Subtable);
2390 DtPushSubtable (Subtable);
2392 NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
2394 switch (NfitHeader->Type)
2396 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
2398 InfoTable = AcpiDmTableInfoNfit0;
2401 case ACPI_NFIT_TYPE_MEMORY_MAP:
2403 InfoTable = AcpiDmTableInfoNfit1;
2406 case ACPI_NFIT_TYPE_INTERLEAVE:
2408 Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer);
2409 InfoTable = AcpiDmTableInfoNfit2;
2412 case ACPI_NFIT_TYPE_SMBIOS:
2414 InfoTable = AcpiDmTableInfoNfit3;
2417 case ACPI_NFIT_TYPE_CONTROL_REGION:
2419 InfoTable = AcpiDmTableInfoNfit4;
2422 case ACPI_NFIT_TYPE_DATA_REGION:
2424 InfoTable = AcpiDmTableInfoNfit5;
2427 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
2429 Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer);
2430 InfoTable = AcpiDmTableInfoNfit6;
2435 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
2439 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
2440 if (ACPI_FAILURE (Status))
2445 ParentTable = DtPeekSubtable ();
2446 DtInsertSubtable (ParentTable, Subtable);
2449 switch (NfitHeader->Type)
2451 case ACPI_NFIT_TYPE_INTERLEAVE:
2454 DtPushSubtable (Subtable);
2457 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a,
2459 if (ACPI_FAILURE (Status))
2469 ParentTable = DtPeekSubtable ();
2470 DtInsertSubtable (ParentTable, Subtable);
2474 Interleave->LineCount = Count;
2478 case ACPI_NFIT_TYPE_SMBIOS:
2482 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a,
2484 if (ACPI_FAILURE (Status))
2490 DtInsertSubtable (ParentTable, Subtable);
2495 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
2498 DtPushSubtable (Subtable);
2501 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a,
2503 if (ACPI_FAILURE (Status))
2513 ParentTable = DtPeekSubtable ();
2514 DtInsertSubtable (ParentTable, Subtable);
2518 Hint->HintCount = (UINT16) Count;
2531 /******************************************************************************
2533 * FUNCTION: DtCompilePcct
2535 * PARAMETERS: List - Current field list pointer
2539 * DESCRIPTION: Compile PCCT.
2541 *****************************************************************************/
2548 DT_SUBTABLE *Subtable;
2549 DT_SUBTABLE *ParentTable;
2550 DT_FIELD **PFieldList = (DT_FIELD **) List;
2551 DT_FIELD *SubtableStart;
2552 ACPI_SUBTABLE_HEADER *PcctHeader;
2553 ACPI_DMTABLE_INFO *InfoTable;
2558 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
2560 if (ACPI_FAILURE (Status))
2565 ParentTable = DtPeekSubtable ();
2566 DtInsertSubtable (ParentTable, Subtable);
2572 SubtableStart = *PFieldList;
2573 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
2575 if (ACPI_FAILURE (Status))
2580 ParentTable = DtPeekSubtable ();
2581 DtInsertSubtable (ParentTable, Subtable);
2582 DtPushSubtable (Subtable);
2584 PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
2586 switch (PcctHeader->Type)
2588 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
2590 InfoTable = AcpiDmTableInfoPcct0;
2593 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
2595 InfoTable = AcpiDmTableInfoPcct1;
2600 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
2604 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
2605 if (ACPI_FAILURE (Status))
2610 ParentTable = DtPeekSubtable ();
2611 DtInsertSubtable (ParentTable, Subtable);
2619 /******************************************************************************
2621 * FUNCTION: DtCompilePmtt
2623 * PARAMETERS: List - Current field list pointer
2627 * DESCRIPTION: Compile PMTT.
2629 *****************************************************************************/
2636 DT_SUBTABLE *Subtable;
2637 DT_SUBTABLE *ParentTable;
2638 DT_FIELD **PFieldList = (DT_FIELD **) List;
2639 DT_FIELD *SubtableStart;
2640 ACPI_PMTT_HEADER *PmttHeader;
2641 ACPI_PMTT_CONTROLLER *PmttController;
2643 UINT8 PrevType = ACPI_PMTT_TYPE_SOCKET;
2648 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable, TRUE);
2649 if (ACPI_FAILURE (Status))
2654 ParentTable = DtPeekSubtable ();
2655 DtInsertSubtable (ParentTable, Subtable);
2656 DtPushSubtable (Subtable);
2660 SubtableStart = *PFieldList;
2661 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
2663 if (ACPI_FAILURE (Status))
2668 PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
2669 while (PrevType >= PmttHeader->Type)
2673 if (PrevType == ACPI_PMTT_TYPE_SOCKET)
2679 PrevType = PmttHeader->Type;
2681 ParentTable = DtPeekSubtable ();
2682 DtInsertSubtable (ParentTable, Subtable);
2683 DtPushSubtable (Subtable);
2685 switch (PmttHeader->Type)
2687 case ACPI_PMTT_TYPE_SOCKET:
2689 /* Subtable: Socket Structure */
2691 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
2693 if (ACPI_FAILURE (Status))
2698 ParentTable = DtPeekSubtable ();
2699 DtInsertSubtable (ParentTable, Subtable);
2702 case ACPI_PMTT_TYPE_CONTROLLER:
2704 /* Subtable: Memory Controller Structure */
2706 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
2708 if (ACPI_FAILURE (Status))
2713 ParentTable = DtPeekSubtable ();
2714 DtInsertSubtable (ParentTable, Subtable);
2716 PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
2717 (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
2718 DomainCount = PmttController->DomainCount;
2722 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
2724 if (ACPI_FAILURE (Status))
2729 DtInsertSubtable (ParentTable, Subtable);
2734 case ACPI_PMTT_TYPE_DIMM:
2736 /* Subtable: Physical Component Structure */
2738 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
2740 if (ACPI_FAILURE (Status))
2745 ParentTable = DtPeekSubtable ();
2746 DtInsertSubtable (ParentTable, Subtable);
2751 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
2760 /******************************************************************************
2762 * FUNCTION: DtCompileRsdt
2764 * PARAMETERS: List - Current field list pointer
2768 * DESCRIPTION: Compile RSDT.
2770 *****************************************************************************/
2776 DT_SUBTABLE *Subtable;
2777 DT_SUBTABLE *ParentTable;
2778 DT_FIELD *FieldList = *(DT_FIELD **) List;
2782 ParentTable = DtPeekSubtable ();
2786 DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
2788 DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
2789 DtInsertSubtable (ParentTable, Subtable);
2790 FieldList = FieldList->Next;
2797 /******************************************************************************
2799 * FUNCTION: DtCompileS3pt
2801 * PARAMETERS: PFieldList - Current field list pointer
2805 * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
2807 *****************************************************************************/
2811 DT_FIELD **PFieldList)
2814 ACPI_S3PT_HEADER *S3ptHeader;
2815 DT_SUBTABLE *Subtable;
2816 DT_SUBTABLE *ParentTable;
2817 ACPI_DMTABLE_INFO *InfoTable;
2818 DT_FIELD *SubtableStart;
2821 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
2822 &Gbl_RootTable, TRUE);
2823 if (ACPI_FAILURE (Status))
2828 DtPushSubtable (Gbl_RootTable);
2832 SubtableStart = *PFieldList;
2833 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
2835 if (ACPI_FAILURE (Status))
2840 ParentTable = DtPeekSubtable ();
2841 DtInsertSubtable (ParentTable, Subtable);
2842 DtPushSubtable (Subtable);
2844 S3ptHeader = ACPI_CAST_PTR (ACPI_S3PT_HEADER, Subtable->Buffer);
2846 switch (S3ptHeader->Type)
2848 case ACPI_S3PT_TYPE_RESUME:
2850 InfoTable = AcpiDmTableInfoS3pt0;
2853 case ACPI_S3PT_TYPE_SUSPEND:
2855 InfoTable = AcpiDmTableInfoS3pt1;
2860 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
2864 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
2865 if (ACPI_FAILURE (Status))
2870 ParentTable = DtPeekSubtable ();
2871 DtInsertSubtable (ParentTable, Subtable);
2879 /******************************************************************************
2881 * FUNCTION: DtCompileSlic
2883 * PARAMETERS: List - Current field list pointer
2887 * DESCRIPTION: Compile SLIC.
2889 *****************************************************************************/
2896 DT_SUBTABLE *Subtable;
2897 DT_SUBTABLE *ParentTable;
2898 DT_FIELD **PFieldList = (DT_FIELD **) List;
2903 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
2905 if (ACPI_FAILURE (Status))
2910 ParentTable = DtPeekSubtable ();
2911 DtInsertSubtable (ParentTable, Subtable);
2912 DtPushSubtable (Subtable);
2920 /******************************************************************************
2922 * FUNCTION: DtCompileSlit
2924 * PARAMETERS: List - Current field list pointer
2928 * DESCRIPTION: Compile SLIT.
2930 *****************************************************************************/
2937 DT_SUBTABLE *Subtable;
2938 DT_SUBTABLE *ParentTable;
2939 DT_FIELD **PFieldList = (DT_FIELD **) List;
2940 DT_FIELD *FieldList;
2942 UINT8 *LocalityBuffer;
2945 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
2947 if (ACPI_FAILURE (Status))
2952 ParentTable = DtPeekSubtable ();
2953 DtInsertSubtable (ParentTable, Subtable);
2955 Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
2956 LocalityBuffer = UtLocalCalloc (Localities);
2958 /* Compile each locality buffer */
2960 FieldList = *PFieldList;
2963 DtCompileBuffer (LocalityBuffer,
2964 FieldList->Value, FieldList, Localities);
2966 DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
2967 DtInsertSubtable (ParentTable, Subtable);
2968 FieldList = FieldList->Next;
2971 ACPI_FREE (LocalityBuffer);
2976 /******************************************************************************
2978 * FUNCTION: DtCompileSrat
2980 * PARAMETERS: List - Current field list pointer
2984 * DESCRIPTION: Compile SRAT.
2986 *****************************************************************************/
2993 DT_SUBTABLE *Subtable;
2994 DT_SUBTABLE *ParentTable;
2995 DT_FIELD **PFieldList = (DT_FIELD **) List;
2996 DT_FIELD *SubtableStart;
2997 ACPI_SUBTABLE_HEADER *SratHeader;
2998 ACPI_DMTABLE_INFO *InfoTable;
3001 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
3003 if (ACPI_FAILURE (Status))
3008 ParentTable = DtPeekSubtable ();
3009 DtInsertSubtable (ParentTable, Subtable);
3013 SubtableStart = *PFieldList;
3014 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
3016 if (ACPI_FAILURE (Status))
3021 ParentTable = DtPeekSubtable ();
3022 DtInsertSubtable (ParentTable, Subtable);
3023 DtPushSubtable (Subtable);
3025 SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
3027 switch (SratHeader->Type)
3029 case ACPI_SRAT_TYPE_CPU_AFFINITY:
3031 InfoTable = AcpiDmTableInfoSrat0;
3034 case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
3036 InfoTable = AcpiDmTableInfoSrat1;
3039 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
3041 InfoTable = AcpiDmTableInfoSrat2;
3044 case ACPI_SRAT_TYPE_GICC_AFFINITY:
3046 InfoTable = AcpiDmTableInfoSrat3;
3051 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
3055 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
3056 if (ACPI_FAILURE (Status))
3061 ParentTable = DtPeekSubtable ();
3062 DtInsertSubtable (ParentTable, Subtable);
3070 /******************************************************************************
3072 * FUNCTION: DtCompileStao
3074 * PARAMETERS: PFieldList - Current field list pointer
3078 * DESCRIPTION: Compile STAO.
3080 *****************************************************************************/
3086 DT_FIELD **PFieldList = (DT_FIELD **) List;
3087 DT_SUBTABLE *Subtable;
3088 DT_SUBTABLE *ParentTable;
3092 /* Compile the main table */
3094 Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
3096 if (ACPI_FAILURE (Status))
3101 ParentTable = DtPeekSubtable ();
3102 DtInsertSubtable (ParentTable, Subtable);
3104 /* Compile each ASCII namestring as a subtable */
3108 Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
3110 if (ACPI_FAILURE (Status))
3115 ParentTable = DtPeekSubtable ();
3116 DtInsertSubtable (ParentTable, Subtable);
3123 /******************************************************************************
3125 * FUNCTION: DtGetGenericTableInfo
3127 * PARAMETERS: Name - Generic type name
3129 * RETURN: Info entry
3131 * DESCRIPTION: Obtain table info for a generic name entry
3133 *****************************************************************************/
3136 DtGetGenericTableInfo (
3139 ACPI_DMTABLE_INFO *Info;
3148 /* Search info table for name match */
3152 Info = AcpiDmTableInfoGeneric[i];
3153 if (Info->Opcode == ACPI_DMT_EXIT)
3159 /* Use caseless compare for generic keywords */
3161 if (!AcpiUtStricmp (Name, Info->Name))
3171 /******************************************************************************
3173 * FUNCTION: DtCompileUefi
3175 * PARAMETERS: List - Current field list pointer
3179 * DESCRIPTION: Compile UEFI.
3181 *****************************************************************************/
3188 DT_SUBTABLE *Subtable;
3189 DT_SUBTABLE *ParentTable;
3190 DT_FIELD **PFieldList = (DT_FIELD **) List;
3194 /* Compile the predefined portion of the UEFI table */
3196 Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
3198 if (ACPI_FAILURE (Status))
3203 DataOffset = (UINT16 *) (Subtable->Buffer + 16);
3204 *DataOffset = sizeof (ACPI_TABLE_UEFI);
3206 ParentTable = DtPeekSubtable ();
3207 DtInsertSubtable (ParentTable, Subtable);
3210 * Compile the "generic" portion of the UEFI table. This
3211 * part of the table is not predefined and any of the generic
3212 * operators may be used.
3215 DtCompileGeneric ((void **) PFieldList, NULL, NULL);
3221 /******************************************************************************
3223 * FUNCTION: DtCompileVrtc
3225 * PARAMETERS: List - Current field list pointer
3229 * DESCRIPTION: Compile VRTC.
3231 *****************************************************************************/
3240 Status = DtCompileTwoSubtables (List,
3241 AcpiDmTableInfoVrtc, AcpiDmTableInfoVrtc0);
3246 /******************************************************************************
3248 * FUNCTION: DtCompileWdat
3250 * PARAMETERS: List - Current field list pointer
3254 * DESCRIPTION: Compile WDAT.
3256 *****************************************************************************/
3265 Status = DtCompileTwoSubtables (List,
3266 AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
3271 /******************************************************************************
3273 * FUNCTION: DtCompileWpbt
3275 * PARAMETERS: List - Current field list pointer
3279 * DESCRIPTION: Compile WPBT.
3281 *****************************************************************************/
3287 DT_FIELD **PFieldList = (DT_FIELD **) List;
3288 DT_SUBTABLE *Subtable;
3289 DT_SUBTABLE *ParentTable;
3290 ACPI_TABLE_WPBT *Table;
3295 /* Compile the main table */
3297 Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt,
3299 if (ACPI_FAILURE (Status))
3304 ParentTable = DtPeekSubtable ();
3305 DtInsertSubtable (ParentTable, Subtable);
3307 /* Compile the argument list subtable */
3309 Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0,
3311 if (ACPI_FAILURE (Status))
3316 /* Extract the length of the Arguments buffer, insert into main table */
3318 Length = (UINT16) Subtable->TotalLength;
3319 Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
3320 Table->ArgumentsLength = Length;
3322 ParentTable = DtPeekSubtable ();
3323 DtInsertSubtable (ParentTable, Subtable);
3328 /******************************************************************************
3330 * FUNCTION: DtCompileXsdt
3332 * PARAMETERS: List - Current field list pointer
3336 * DESCRIPTION: Compile XSDT.
3338 *****************************************************************************/
3344 DT_SUBTABLE *Subtable;
3345 DT_SUBTABLE *ParentTable;
3346 DT_FIELD *FieldList = *(DT_FIELD **) List;
3350 ParentTable = DtPeekSubtable ();
3354 DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
3356 DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
3357 DtInsertSubtable (ParentTable, Subtable);
3358 FieldList = FieldList->Next;
3365 /******************************************************************************
3367 * FUNCTION: DtCompileGeneric
3369 * PARAMETERS: List - Current field list pointer
3370 * Name - Field name to end generic compiling
3371 * Length - Compiled table length to return
3375 * DESCRIPTION: Compile generic unknown table.
3377 *****************************************************************************/
3386 DT_SUBTABLE *Subtable;
3387 DT_SUBTABLE *ParentTable;
3388 DT_FIELD **PFieldList = (DT_FIELD **) List;
3389 ACPI_DMTABLE_INFO *Info;
3392 ParentTable = DtPeekSubtable ();
3395 * Compile the "generic" portion of the table. This
3396 * part of the table is not predefined and any of the generic
3397 * operators may be used.
3400 /* Find any and all labels in the entire generic portion */
3402 DtDetectAllLabels (*PFieldList);
3404 /* Now we can actually compile the parse tree */
3412 if (Name && !ACPI_STRCMP ((*PFieldList)->Name, Name))
3416 Info = DtGetGenericTableInfo ((*PFieldList)->Name);
3419 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
3420 (*PFieldList)->Name);
3421 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
3422 (*PFieldList), MsgBuffer);
3424 *PFieldList = (*PFieldList)->Next;
3428 Status = DtCompileTable (PFieldList, Info,
3430 if (ACPI_SUCCESS (Status))
3432 DtInsertSubtable (ParentTable, Subtable);
3435 *Length += Subtable->Length;
3440 *PFieldList = (*PFieldList)->Next;
3442 if (Status == AE_NOT_FOUND)
3444 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
3445 (*PFieldList)->Name);
3446 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
3447 (*PFieldList), MsgBuffer);