1 /******************************************************************************
3 * Module Name: dttable.c - handling for specific ACPI tables
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2012, Intel Corp.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
46 /* Compile all complex data tables */
48 #include "aslcompiler.h"
49 #include "dtcompiler.h"
51 #define _COMPONENT DT_COMPILER
52 ACPI_MODULE_NAME ("dttable")
55 /* TBD: merge these into dmtbinfo.c? */
57 static ACPI_DMTABLE_INFO TableInfoAsfAddress[] =
59 {ACPI_DMT_BUFFER, 0, "Addresses", 0},
60 {ACPI_DMT_EXIT, 0, NULL, 0}
63 static ACPI_DMTABLE_INFO TableInfoDmarPciPath[] =
65 {ACPI_DMT_PCI_PATH, 0, "PCI Path", 0},
66 {ACPI_DMT_EXIT, 0, NULL, 0}
70 /* TBD: move to acmacros.h */
72 #define ACPI_SUB_PTR(t, a, b) \
73 ACPI_CAST_PTR (t, (ACPI_CAST_PTR (UINT8, (a)) - (ACPI_SIZE)(b)))
76 /* Local prototypes */
79 DtCompileTwoSubtables (
81 ACPI_DMTABLE_INFO *TableInfo1,
82 ACPI_DMTABLE_INFO *TableInfo2);
85 /******************************************************************************
87 * FUNCTION: DtCompileTwoSubtables
89 * PARAMETERS: List - Current field list pointer
90 * TableInfo1 - Info table 1
91 * TableInfo1 - Info table 2
95 * DESCRIPTION: Compile tables with a header and one or more same subtables.
96 * Include CPEP, EINJ, ERST, MCFG, MSCT, WDAT
98 *****************************************************************************/
101 DtCompileTwoSubtables (
103 ACPI_DMTABLE_INFO *TableInfo1,
104 ACPI_DMTABLE_INFO *TableInfo2)
107 DT_SUBTABLE *Subtable;
108 DT_SUBTABLE *ParentTable;
109 DT_FIELD **PFieldList = (DT_FIELD **) List;
112 Status = DtCompileTable (PFieldList, TableInfo1, &Subtable, TRUE);
113 if (ACPI_FAILURE (Status))
118 ParentTable = DtPeekSubtable ();
119 DtInsertSubtable (ParentTable, Subtable);
123 Status = DtCompileTable (PFieldList, TableInfo2, &Subtable, FALSE);
124 if (ACPI_FAILURE (Status))
129 DtInsertSubtable (ParentTable, Subtable);
136 /******************************************************************************
138 * FUNCTION: DtCompileFacs
140 * PARAMETERS: PFieldList - Current field list pointer
144 * DESCRIPTION: Compile FACS.
146 *****************************************************************************/
150 DT_FIELD **PFieldList)
152 DT_SUBTABLE *Subtable;
153 UINT8 *ReservedBuffer;
158 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFacs,
159 &Gbl_RootTable, TRUE);
160 if (ACPI_FAILURE (Status))
165 /* Large FACS reserved area at the end of the table */
167 ReservedSize = (UINT32) sizeof (((ACPI_TABLE_FACS *) NULL)->Reserved1);
168 ReservedBuffer = UtLocalCalloc (ReservedSize);
170 DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
172 ACPI_FREE (ReservedBuffer);
173 DtInsertSubtable (Gbl_RootTable, Subtable);
178 /******************************************************************************
180 * FUNCTION: DtCompileRsdp
182 * PARAMETERS: PFieldList - Current field list pointer
186 * DESCRIPTION: Compile RSDP.
188 *****************************************************************************/
192 DT_FIELD **PFieldList)
194 DT_SUBTABLE *Subtable;
195 ACPI_TABLE_RSDP *Rsdp;
196 ACPI_RSDP_EXTENSION *RsdpExtension;
200 /* Compile the "common" RSDP (ACPI 1.0) */
202 Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp1,
203 &Gbl_RootTable, TRUE);
204 if (ACPI_FAILURE (Status))
209 Rsdp = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Gbl_RootTable->Buffer);
210 DtSetTableChecksum (&Rsdp->Checksum);
212 if (Rsdp->Revision > 0)
214 /* Compile the "extended" part of the RSDP as a subtable */
216 Status = DtCompileTable (PFieldList, AcpiDmTableInfoRsdp2,
218 if (ACPI_FAILURE (Status))
223 DtInsertSubtable (Gbl_RootTable, Subtable);
225 /* Set length and extended checksum for entire RSDP */
227 RsdpExtension = ACPI_CAST_PTR (ACPI_RSDP_EXTENSION, Subtable->Buffer);
228 RsdpExtension->Length = Gbl_RootTable->Length + Subtable->Length;
229 DtSetTableChecksum (&RsdpExtension->ExtendedChecksum);
236 /******************************************************************************
238 * FUNCTION: DtCompileAsf
240 * PARAMETERS: List - Current field list pointer
244 * DESCRIPTION: Compile ASF!.
246 *****************************************************************************/
252 ACPI_ASF_INFO *AsfTable;
253 DT_SUBTABLE *Subtable;
254 DT_SUBTABLE *ParentTable;
255 ACPI_DMTABLE_INFO *InfoTable;
256 ACPI_DMTABLE_INFO *DataInfoTable = NULL;
257 UINT32 DataCount = 0;
260 DT_FIELD **PFieldList = (DT_FIELD **) List;
261 DT_FIELD *SubtableStart;
266 SubtableStart = *PFieldList;
267 Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr,
269 if (ACPI_FAILURE (Status))
274 ParentTable = DtPeekSubtable ();
275 DtInsertSubtable (ParentTable, Subtable);
276 DtPushSubtable (Subtable);
278 AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer);
280 switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
282 case ACPI_ASF_TYPE_INFO:
283 InfoTable = AcpiDmTableInfoAsf0;
286 case ACPI_ASF_TYPE_ALERT:
287 InfoTable = AcpiDmTableInfoAsf1;
290 case ACPI_ASF_TYPE_CONTROL:
291 InfoTable = AcpiDmTableInfoAsf2;
294 case ACPI_ASF_TYPE_BOOT:
295 InfoTable = AcpiDmTableInfoAsf3;
298 case ACPI_ASF_TYPE_ADDRESS:
299 InfoTable = AcpiDmTableInfoAsf4;
303 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
307 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
308 if (ACPI_FAILURE (Status))
313 ParentTable = DtPeekSubtable ();
314 DtInsertSubtable (ParentTable, Subtable);
316 switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
318 case ACPI_ASF_TYPE_INFO:
319 DataInfoTable = NULL;
322 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:
330 DataInfoTable = AcpiDmTableInfoAsf2a;
331 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE,
332 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
333 sizeof (ACPI_ASF_HEADER)))->Controls;
336 case ACPI_ASF_TYPE_BOOT:
337 DataInfoTable = NULL;
340 case ACPI_ASF_TYPE_ADDRESS:
341 DataInfoTable = TableInfoAsfAddress;
342 DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS,
343 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
344 sizeof (ACPI_ASF_HEADER)))->Devices;
348 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
354 switch (AsfTable->Header.Type & 0x7F)
356 case ACPI_ASF_TYPE_ADDRESS:
358 while (DataCount > 0)
360 Status = DtCompileTable (PFieldList, DataInfoTable,
362 if (ACPI_FAILURE (Status))
367 DtInsertSubtable (ParentTable, Subtable);
368 DataCount = DataCount - Subtable->Length;
374 for (i = 0; i < DataCount; i++)
376 Status = DtCompileTable (PFieldList, DataInfoTable,
378 if (ACPI_FAILURE (Status))
383 DtInsertSubtable (ParentTable, Subtable);
396 /******************************************************************************
398 * FUNCTION: DtCompileCpep
400 * PARAMETERS: List - Current field list pointer
404 * DESCRIPTION: Compile CPEP.
406 *****************************************************************************/
415 Status = DtCompileTwoSubtables (List,
416 AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0);
421 /******************************************************************************
423 * FUNCTION: DtCompileDmar
425 * PARAMETERS: List - Current field list pointer
429 * DESCRIPTION: Compile DMAR.
431 *****************************************************************************/
438 DT_SUBTABLE *Subtable;
439 DT_SUBTABLE *ParentTable;
440 DT_FIELD **PFieldList = (DT_FIELD **) List;
441 DT_FIELD *SubtableStart;
442 ACPI_DMTABLE_INFO *InfoTable;
443 ACPI_DMAR_HEADER *DmarHeader;
444 UINT8 *ReservedBuffer;
448 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE);
449 if (ACPI_FAILURE (Status))
454 ParentTable = DtPeekSubtable ();
455 DtInsertSubtable (ParentTable, Subtable);
457 /* DMAR Reserved area */
459 ReservedSize = (UINT32) sizeof (((ACPI_TABLE_DMAR *) NULL)->Reserved);
460 ReservedBuffer = UtLocalCalloc (ReservedSize);
462 DtCreateSubtable (ReservedBuffer, ReservedSize, &Subtable);
464 ACPI_FREE (ReservedBuffer);
465 ParentTable = DtPeekSubtable ();
466 DtInsertSubtable (ParentTable, Subtable);
472 SubtableStart = *PFieldList;
473 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr,
475 if (ACPI_FAILURE (Status))
480 ParentTable = DtPeekSubtable ();
481 DtInsertSubtable (ParentTable, Subtable);
482 DtPushSubtable (Subtable);
484 DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
486 switch (DmarHeader->Type)
488 case ACPI_DMAR_TYPE_HARDWARE_UNIT:
489 InfoTable = AcpiDmTableInfoDmar0;
491 case ACPI_DMAR_TYPE_RESERVED_MEMORY:
492 InfoTable = AcpiDmTableInfoDmar1;
494 case ACPI_DMAR_TYPE_ATSR:
495 InfoTable = AcpiDmTableInfoDmar2;
497 case ACPI_DMAR_HARDWARE_AFFINITY:
498 InfoTable = AcpiDmTableInfoDmar3;
501 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
507 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
508 if (ACPI_FAILURE (Status))
513 ParentTable = DtPeekSubtable ();
514 DtInsertSubtable (ParentTable, Subtable);
516 /* Optional Device Scope subtables */
520 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
522 if (Status == AE_NOT_FOUND)
527 ParentTable = DtPeekSubtable ();
528 DtInsertSubtable (ParentTable, Subtable);
529 DtPushSubtable (Subtable);
531 /* Optional PCI Paths */
535 Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
537 if (Status == AE_NOT_FOUND)
543 ParentTable = DtPeekSubtable ();
544 DtInsertSubtable (ParentTable, Subtable);
555 /******************************************************************************
557 * FUNCTION: DtCompileEinj
559 * PARAMETERS: List - Current field list pointer
563 * DESCRIPTION: Compile EINJ.
565 *****************************************************************************/
574 Status = DtCompileTwoSubtables (List,
575 AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
580 /******************************************************************************
582 * FUNCTION: DtCompileErst
584 * PARAMETERS: List - Current field list pointer
588 * DESCRIPTION: Compile ERST.
590 *****************************************************************************/
599 Status = DtCompileTwoSubtables (List,
600 AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
605 /******************************************************************************
607 * FUNCTION: DtCompileFadt
609 * PARAMETERS: List - Current field list pointer
613 * DESCRIPTION: Compile FADT.
615 *****************************************************************************/
622 DT_SUBTABLE *Subtable;
623 DT_SUBTABLE *ParentTable;
624 DT_FIELD **PFieldList = (DT_FIELD **) List;
625 ACPI_TABLE_HEADER *Table;
629 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt1,
631 if (ACPI_FAILURE (Status))
636 ParentTable = DtPeekSubtable ();
637 DtInsertSubtable (ParentTable, Subtable);
639 Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER, ParentTable->Buffer);
640 Revision = Table->Revision;
644 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt2,
646 if (ACPI_FAILURE (Status))
651 DtInsertSubtable (ParentTable, Subtable);
653 else if (Revision >= 2)
655 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt3,
657 if (ACPI_FAILURE (Status))
662 DtInsertSubtable (ParentTable, Subtable);
666 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFadt5,
668 if (ACPI_FAILURE (Status))
673 DtInsertSubtable (ParentTable, Subtable);
681 /******************************************************************************
683 * FUNCTION: DtCompileFpdt
685 * PARAMETERS: List - Current field list pointer
689 * DESCRIPTION: Compile FPDT.
691 *****************************************************************************/
698 ACPI_FPDT_HEADER *FpdtHeader;
699 DT_SUBTABLE *Subtable;
700 DT_SUBTABLE *ParentTable;
701 ACPI_DMTABLE_INFO *InfoTable;
702 DT_FIELD **PFieldList = (DT_FIELD **) List;
703 DT_FIELD *SubtableStart;
708 SubtableStart = *PFieldList;
709 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr,
711 if (ACPI_FAILURE (Status))
716 ParentTable = DtPeekSubtable ();
717 DtInsertSubtable (ParentTable, Subtable);
718 DtPushSubtable (Subtable);
720 FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
722 switch (FpdtHeader->Type)
724 case ACPI_FPDT_TYPE_BOOT:
725 InfoTable = AcpiDmTableInfoFpdt0;
728 case ACPI_FPDT_TYPE_S3PERF:
729 InfoTable = AcpiDmTableInfoFpdt1;
733 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT");
738 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
739 if (ACPI_FAILURE (Status))
744 ParentTable = DtPeekSubtable ();
745 DtInsertSubtable (ParentTable, Subtable);
753 /******************************************************************************
755 * FUNCTION: DtCompileHest
757 * PARAMETERS: List - Current field list pointer
761 * DESCRIPTION: Compile HEST.
763 *****************************************************************************/
770 DT_SUBTABLE *Subtable;
771 DT_SUBTABLE *ParentTable;
772 DT_FIELD **PFieldList = (DT_FIELD **) List;
773 DT_FIELD *SubtableStart;
774 ACPI_DMTABLE_INFO *InfoTable;
779 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
781 if (ACPI_FAILURE (Status))
786 ParentTable = DtPeekSubtable ();
787 DtInsertSubtable (ParentTable, Subtable);
791 /* Get subtable type */
793 SubtableStart = *PFieldList;
794 DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
798 case ACPI_HEST_TYPE_IA32_CHECK:
799 InfoTable = AcpiDmTableInfoHest0;
802 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
803 InfoTable = AcpiDmTableInfoHest1;
806 case ACPI_HEST_TYPE_IA32_NMI:
807 InfoTable = AcpiDmTableInfoHest2;
810 case ACPI_HEST_TYPE_AER_ROOT_PORT:
811 InfoTable = AcpiDmTableInfoHest6;
814 case ACPI_HEST_TYPE_AER_ENDPOINT:
815 InfoTable = AcpiDmTableInfoHest7;
818 case ACPI_HEST_TYPE_AER_BRIDGE:
819 InfoTable = AcpiDmTableInfoHest8;
822 case ACPI_HEST_TYPE_GENERIC_ERROR:
823 InfoTable = AcpiDmTableInfoHest9;
827 /* Cannot continue on unknown type */
829 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
833 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
834 if (ACPI_FAILURE (Status))
839 DtInsertSubtable (ParentTable, Subtable);
842 * Additional subtable data - IA32 Error Bank(s)
847 case ACPI_HEST_TYPE_IA32_CHECK:
848 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
849 Subtable->Buffer))->NumHardwareBanks;
852 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
853 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
854 Subtable->Buffer))->NumHardwareBanks;
863 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
865 if (ACPI_FAILURE (Status))
870 DtInsertSubtable (ParentTable, Subtable);
879 /******************************************************************************
881 * FUNCTION: DtCompileIvrs
883 * PARAMETERS: List - Current field list pointer
887 * DESCRIPTION: Compile IVRS.
889 *****************************************************************************/
896 DT_SUBTABLE *Subtable;
897 DT_SUBTABLE *ParentTable;
898 DT_FIELD **PFieldList = (DT_FIELD **) List;
899 DT_FIELD *SubtableStart;
900 ACPI_DMTABLE_INFO *InfoTable;
901 ACPI_IVRS_HEADER *IvrsHeader;
905 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
907 if (ACPI_FAILURE (Status))
912 ParentTable = DtPeekSubtable ();
913 DtInsertSubtable (ParentTable, Subtable);
917 SubtableStart = *PFieldList;
918 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr,
920 if (ACPI_FAILURE (Status))
925 ParentTable = DtPeekSubtable ();
926 DtInsertSubtable (ParentTable, Subtable);
927 DtPushSubtable (Subtable);
929 IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer);
931 switch (IvrsHeader->Type)
933 case ACPI_IVRS_TYPE_HARDWARE:
934 InfoTable = AcpiDmTableInfoIvrs0;
937 case ACPI_IVRS_TYPE_MEMORY1:
938 case ACPI_IVRS_TYPE_MEMORY2:
939 case ACPI_IVRS_TYPE_MEMORY3:
940 InfoTable = AcpiDmTableInfoIvrs1;
944 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS");
948 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
949 if (ACPI_FAILURE (Status))
954 ParentTable = DtPeekSubtable ();
955 DtInsertSubtable (ParentTable, Subtable);
957 if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE)
959 while (*PFieldList &&
960 !ACPI_STRCMP ((*PFieldList)->Name, "Entry Type"))
962 SubtableStart = *PFieldList;
963 DtCompileInteger (&EntryType, *PFieldList, 1, 0);
967 /* 4-byte device entries */
969 case ACPI_IVRS_TYPE_PAD4:
970 case ACPI_IVRS_TYPE_ALL:
971 case ACPI_IVRS_TYPE_SELECT:
972 case ACPI_IVRS_TYPE_START:
973 case ACPI_IVRS_TYPE_END:
975 InfoTable = AcpiDmTableInfoIvrs4;
978 /* 8-byte entries, type A */
980 case ACPI_IVRS_TYPE_ALIAS_SELECT:
981 case ACPI_IVRS_TYPE_ALIAS_START:
983 InfoTable = AcpiDmTableInfoIvrs8a;
986 /* 8-byte entries, type B */
988 case ACPI_IVRS_TYPE_PAD8:
989 case ACPI_IVRS_TYPE_EXT_SELECT:
990 case ACPI_IVRS_TYPE_EXT_START:
992 InfoTable = AcpiDmTableInfoIvrs8b;
995 /* 8-byte entries, type C */
997 case ACPI_IVRS_TYPE_SPECIAL:
999 InfoTable = AcpiDmTableInfoIvrs8c;
1003 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
1004 "IVRS Device Entry");
1008 Status = DtCompileTable (PFieldList, InfoTable,
1010 if (ACPI_FAILURE (Status))
1015 DtInsertSubtable (ParentTable, Subtable);
1026 /******************************************************************************
1028 * FUNCTION: DtCompileMadt
1030 * PARAMETERS: List - Current field list pointer
1034 * DESCRIPTION: Compile MADT.
1036 *****************************************************************************/
1043 DT_SUBTABLE *Subtable;
1044 DT_SUBTABLE *ParentTable;
1045 DT_FIELD **PFieldList = (DT_FIELD **) List;
1046 DT_FIELD *SubtableStart;
1047 ACPI_SUBTABLE_HEADER *MadtHeader;
1048 ACPI_DMTABLE_INFO *InfoTable;
1051 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
1053 if (ACPI_FAILURE (Status))
1058 ParentTable = DtPeekSubtable ();
1059 DtInsertSubtable (ParentTable, Subtable);
1063 SubtableStart = *PFieldList;
1064 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
1066 if (ACPI_FAILURE (Status))
1071 ParentTable = DtPeekSubtable ();
1072 DtInsertSubtable (ParentTable, Subtable);
1073 DtPushSubtable (Subtable);
1075 MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1077 switch (MadtHeader->Type)
1079 case ACPI_MADT_TYPE_LOCAL_APIC:
1080 InfoTable = AcpiDmTableInfoMadt0;
1082 case ACPI_MADT_TYPE_IO_APIC:
1083 InfoTable = AcpiDmTableInfoMadt1;
1085 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1086 InfoTable = AcpiDmTableInfoMadt2;
1088 case ACPI_MADT_TYPE_NMI_SOURCE:
1089 InfoTable = AcpiDmTableInfoMadt3;
1091 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1092 InfoTable = AcpiDmTableInfoMadt4;
1094 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1095 InfoTable = AcpiDmTableInfoMadt5;
1097 case ACPI_MADT_TYPE_IO_SAPIC:
1098 InfoTable = AcpiDmTableInfoMadt6;
1100 case ACPI_MADT_TYPE_LOCAL_SAPIC:
1101 InfoTable = AcpiDmTableInfoMadt7;
1103 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1104 InfoTable = AcpiDmTableInfoMadt8;
1106 case ACPI_MADT_TYPE_LOCAL_X2APIC:
1107 InfoTable = AcpiDmTableInfoMadt9;
1109 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1110 InfoTable = AcpiDmTableInfoMadt10;
1112 case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
1113 InfoTable = AcpiDmTableInfoMadt11;
1115 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
1116 InfoTable = AcpiDmTableInfoMadt12;
1119 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
1123 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1124 if (ACPI_FAILURE (Status))
1129 ParentTable = DtPeekSubtable ();
1130 DtInsertSubtable (ParentTable, Subtable);
1138 /******************************************************************************
1140 * FUNCTION: DtCompileMcfg
1142 * PARAMETERS: List - Current field list pointer
1146 * DESCRIPTION: Compile MCFG.
1148 *****************************************************************************/
1157 Status = DtCompileTwoSubtables (List,
1158 AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
1163 /******************************************************************************
1165 * FUNCTION: DtCompileMpst
1167 * PARAMETERS: List - Current field list pointer
1171 * DESCRIPTION: Compile MPST.
1173 *****************************************************************************/
1180 DT_SUBTABLE *Subtable;
1181 DT_SUBTABLE *ParentTable;
1182 DT_FIELD **PFieldList = (DT_FIELD **) List;
1183 ACPI_MPST_CHANNEL *MpstChannelInfo;
1184 ACPI_MPST_POWER_NODE *MpstPowerNode;
1185 ACPI_MPST_DATA_HDR *MpstDataHeader;
1186 UINT16 SubtableCount;
1187 UINT8 PowerStateCount;
1188 UINT8 ComponentCount;
1193 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable, TRUE);
1194 if (ACPI_FAILURE (Status))
1199 ParentTable = DtPeekSubtable ();
1200 DtInsertSubtable (ParentTable, Subtable);
1201 DtPushSubtable (Subtable);
1203 MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
1204 SubtableCount = MpstChannelInfo->PowerNodeCount;
1206 while (*PFieldList && SubtableCount)
1208 /* Subtable: Memory Power Node(s) */
1210 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
1212 if (ACPI_FAILURE (Status))
1217 ParentTable = DtPeekSubtable ();
1218 DtInsertSubtable (ParentTable, Subtable);
1219 DtPushSubtable (Subtable);
1221 MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
1222 PowerStateCount = MpstPowerNode->NumPowerStates;
1223 ComponentCount = MpstPowerNode->NumPhysicalComponents;
1225 ParentTable = DtPeekSubtable ();
1227 /* Sub-subtables - Memory Power State Structure(s) */
1229 while (*PFieldList && PowerStateCount)
1231 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
1233 if (ACPI_FAILURE (Status))
1238 DtInsertSubtable (ParentTable, Subtable);
1242 /* Sub-subtables - Physical Component ID Structure(s) */
1244 while (*PFieldList && ComponentCount)
1246 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
1248 if (ACPI_FAILURE (Status))
1253 DtInsertSubtable (ParentTable, Subtable);
1261 /* Subtable: Count of Memory Power State Characteristic structures */
1265 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable, TRUE);
1266 if (ACPI_FAILURE (Status))
1271 ParentTable = DtPeekSubtable ();
1272 DtInsertSubtable (ParentTable, Subtable);
1273 DtPushSubtable (Subtable);
1275 MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
1276 SubtableCount = MpstDataHeader->CharacteristicsCount;
1278 ParentTable = DtPeekSubtable ();
1280 /* Subtable: Memory Power State Characteristics structure(s) */
1282 while (*PFieldList && SubtableCount)
1284 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
1286 if (ACPI_FAILURE (Status))
1291 DtInsertSubtable (ParentTable, Subtable);
1300 /******************************************************************************
1302 * FUNCTION: DtCompileMsct
1304 * PARAMETERS: List - Current field list pointer
1308 * DESCRIPTION: Compile MSCT.
1310 *****************************************************************************/
1319 Status = DtCompileTwoSubtables (List,
1320 AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
1325 /******************************************************************************
1327 * FUNCTION: DtCompilePmtt
1329 * PARAMETERS: List - Current field list pointer
1333 * DESCRIPTION: Compile PMTT.
1335 *****************************************************************************/
1342 DT_SUBTABLE *Subtable;
1343 DT_SUBTABLE *ParentTable;
1344 DT_FIELD **PFieldList = (DT_FIELD **) List;
1345 DT_FIELD *SubtableStart;
1346 ACPI_PMTT_HEADER *PmttHeader;
1347 ACPI_PMTT_CONTROLLER *PmttController;
1349 UINT8 PrevType = ACPI_PMTT_TYPE_SOCKET;
1354 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable, TRUE);
1355 if (ACPI_FAILURE (Status))
1360 ParentTable = DtPeekSubtable ();
1361 DtInsertSubtable (ParentTable, Subtable);
1362 DtPushSubtable (Subtable);
1366 SubtableStart = *PFieldList;
1367 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
1369 if (ACPI_FAILURE (Status))
1374 PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
1375 while (PrevType >= PmttHeader->Type)
1379 if (PrevType == ACPI_PMTT_TYPE_SOCKET)
1385 PrevType = PmttHeader->Type;
1387 ParentTable = DtPeekSubtable ();
1388 DtInsertSubtable (ParentTable, Subtable);
1389 DtPushSubtable (Subtable);
1391 switch (PmttHeader->Type)
1393 case ACPI_PMTT_TYPE_SOCKET:
1395 /* Subtable: Socket Structure */
1397 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
1399 if (ACPI_FAILURE (Status))
1404 ParentTable = DtPeekSubtable ();
1405 DtInsertSubtable (ParentTable, Subtable);
1408 case ACPI_PMTT_TYPE_CONTROLLER:
1410 /* Subtable: Memory Controller Structure */
1412 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
1414 if (ACPI_FAILURE (Status))
1419 ParentTable = DtPeekSubtable ();
1420 DtInsertSubtable (ParentTable, Subtable);
1422 PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
1423 (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
1424 DomainCount = PmttController->DomainCount;
1428 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
1430 if (ACPI_FAILURE (Status))
1435 DtInsertSubtable (ParentTable, Subtable);
1440 case ACPI_PMTT_TYPE_DIMM:
1442 /* Subtable: Physical Component Structure */
1444 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
1446 if (ACPI_FAILURE (Status))
1451 ParentTable = DtPeekSubtable ();
1452 DtInsertSubtable (ParentTable, Subtable);
1457 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
1466 /******************************************************************************
1468 * FUNCTION: DtCompileRsdt
1470 * PARAMETERS: List - Current field list pointer
1474 * DESCRIPTION: Compile RSDT.
1476 *****************************************************************************/
1482 DT_SUBTABLE *Subtable;
1483 DT_SUBTABLE *ParentTable;
1484 DT_FIELD *FieldList = *(DT_FIELD **) List;
1488 ParentTable = DtPeekSubtable ();
1492 DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
1494 DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
1495 DtInsertSubtable (ParentTable, Subtable);
1496 FieldList = FieldList->Next;
1503 /******************************************************************************
1505 * FUNCTION: DtCompileS3pt
1507 * PARAMETERS: PFieldList - Current field list pointer
1511 * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
1513 *****************************************************************************/
1517 DT_FIELD **PFieldList)
1520 ACPI_S3PT_HEADER *S3ptHeader;
1521 DT_SUBTABLE *Subtable;
1522 DT_SUBTABLE *ParentTable;
1523 ACPI_DMTABLE_INFO *InfoTable;
1524 DT_FIELD *SubtableStart;
1527 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
1528 &Gbl_RootTable, TRUE);
1529 if (ACPI_FAILURE (Status))
1534 DtPushSubtable (Gbl_RootTable);
1538 SubtableStart = *PFieldList;
1539 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
1541 if (ACPI_FAILURE (Status))
1546 ParentTable = DtPeekSubtable ();
1547 DtInsertSubtable (ParentTable, Subtable);
1548 DtPushSubtable (Subtable);
1550 S3ptHeader = ACPI_CAST_PTR (ACPI_S3PT_HEADER, Subtable->Buffer);
1552 switch (S3ptHeader->Type)
1554 case ACPI_S3PT_TYPE_RESUME:
1555 InfoTable = AcpiDmTableInfoS3pt0;
1558 case ACPI_S3PT_TYPE_SUSPEND:
1559 InfoTable = AcpiDmTableInfoS3pt1;
1563 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
1567 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1568 if (ACPI_FAILURE (Status))
1573 ParentTable = DtPeekSubtable ();
1574 DtInsertSubtable (ParentTable, Subtable);
1582 /******************************************************************************
1584 * FUNCTION: DtCompileSlic
1586 * PARAMETERS: List - Current field list pointer
1590 * DESCRIPTION: Compile SLIC.
1592 *****************************************************************************/
1599 DT_SUBTABLE *Subtable;
1600 DT_SUBTABLE *ParentTable;
1601 DT_FIELD **PFieldList = (DT_FIELD **) List;
1602 DT_FIELD *SubtableStart;
1603 ACPI_SLIC_HEADER *SlicHeader;
1604 ACPI_DMTABLE_INFO *InfoTable;
1609 SubtableStart = *PFieldList;
1610 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlicHdr,
1612 if (ACPI_FAILURE (Status))
1617 ParentTable = DtPeekSubtable ();
1618 DtInsertSubtable (ParentTable, Subtable);
1619 DtPushSubtable (Subtable);
1621 SlicHeader = ACPI_CAST_PTR (ACPI_SLIC_HEADER, Subtable->Buffer);
1623 switch (SlicHeader->Type)
1625 case ACPI_SLIC_TYPE_PUBLIC_KEY:
1626 InfoTable = AcpiDmTableInfoSlic0;
1628 case ACPI_SLIC_TYPE_WINDOWS_MARKER:
1629 InfoTable = AcpiDmTableInfoSlic1;
1632 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SLIC");
1636 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1637 if (ACPI_FAILURE (Status))
1642 ParentTable = DtPeekSubtable ();
1643 DtInsertSubtable (ParentTable, Subtable);
1651 /******************************************************************************
1653 * FUNCTION: DtCompileSlit
1655 * PARAMETERS: List - Current field list pointer
1659 * DESCRIPTION: Compile SLIT.
1661 *****************************************************************************/
1668 DT_SUBTABLE *Subtable;
1669 DT_SUBTABLE *ParentTable;
1670 DT_FIELD **PFieldList = (DT_FIELD **) List;
1671 DT_FIELD *FieldList;
1673 UINT8 *LocalityBuffer;
1676 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
1678 if (ACPI_FAILURE (Status))
1683 ParentTable = DtPeekSubtable ();
1684 DtInsertSubtable (ParentTable, Subtable);
1686 Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
1687 LocalityBuffer = UtLocalCalloc (Localities);
1689 /* Compile each locality buffer */
1691 FieldList = *PFieldList;
1694 DtCompileBuffer (LocalityBuffer,
1695 FieldList->Value, FieldList, Localities);
1697 DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
1698 DtInsertSubtable (ParentTable, Subtable);
1699 FieldList = FieldList->Next;
1702 ACPI_FREE (LocalityBuffer);
1707 /******************************************************************************
1709 * FUNCTION: DtCompileSrat
1711 * PARAMETERS: List - Current field list pointer
1715 * DESCRIPTION: Compile SRAT.
1717 *****************************************************************************/
1724 DT_SUBTABLE *Subtable;
1725 DT_SUBTABLE *ParentTable;
1726 DT_FIELD **PFieldList = (DT_FIELD **) List;
1727 DT_FIELD *SubtableStart;
1728 ACPI_SUBTABLE_HEADER *SratHeader;
1729 ACPI_DMTABLE_INFO *InfoTable;
1732 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
1734 if (ACPI_FAILURE (Status))
1739 ParentTable = DtPeekSubtable ();
1740 DtInsertSubtable (ParentTable, Subtable);
1744 SubtableStart = *PFieldList;
1745 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
1747 if (ACPI_FAILURE (Status))
1752 ParentTable = DtPeekSubtable ();
1753 DtInsertSubtable (ParentTable, Subtable);
1754 DtPushSubtable (Subtable);
1756 SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1758 switch (SratHeader->Type)
1760 case ACPI_SRAT_TYPE_CPU_AFFINITY:
1761 InfoTable = AcpiDmTableInfoSrat0;
1763 case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
1764 InfoTable = AcpiDmTableInfoSrat1;
1766 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
1767 InfoTable = AcpiDmTableInfoSrat2;
1770 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
1774 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1775 if (ACPI_FAILURE (Status))
1780 ParentTable = DtPeekSubtable ();
1781 DtInsertSubtable (ParentTable, Subtable);
1789 /******************************************************************************
1791 * FUNCTION: DtGetGenericTableInfo
1793 * PARAMETERS: Name - Generic type name
1795 * RETURN: Info entry
1797 * DESCRIPTION: Obtain table info for a generic name entry
1799 *****************************************************************************/
1802 DtGetGenericTableInfo (
1805 ACPI_DMTABLE_INFO *Info;
1814 /* Search info table for name match */
1818 Info = AcpiDmTableInfoGeneric[i];
1819 if (Info->Opcode == ACPI_DMT_EXIT)
1825 /* Use caseless compare for generic keywords */
1827 if (!AcpiUtStricmp (Name, Info->Name))
1837 /******************************************************************************
1839 * FUNCTION: DtCompileUefi
1841 * PARAMETERS: List - Current field list pointer
1845 * DESCRIPTION: Compile UEFI.
1847 *****************************************************************************/
1854 DT_SUBTABLE *Subtable;
1855 DT_SUBTABLE *ParentTable;
1856 DT_FIELD **PFieldList = (DT_FIELD **) List;
1860 /* Compile the predefined portion of the UEFI table */
1862 Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
1864 if (ACPI_FAILURE (Status))
1869 DataOffset = (UINT16 *) (Subtable->Buffer + 16);
1870 *DataOffset = sizeof (ACPI_TABLE_UEFI);
1872 ParentTable = DtPeekSubtable ();
1873 DtInsertSubtable (ParentTable, Subtable);
1876 * Compile the "generic" portion of the UEFI table. This
1877 * part of the table is not predefined and any of the generic
1878 * operators may be used.
1881 DtCompileGeneric ((void **) PFieldList);
1887 /******************************************************************************
1889 * FUNCTION: DtCompileWdat
1891 * PARAMETERS: List - Current field list pointer
1895 * DESCRIPTION: Compile WDAT.
1897 *****************************************************************************/
1906 Status = DtCompileTwoSubtables (List,
1907 AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
1912 /******************************************************************************
1914 * FUNCTION: DtCompileXsdt
1916 * PARAMETERS: List - Current field list pointer
1920 * DESCRIPTION: Compile XSDT.
1922 *****************************************************************************/
1928 DT_SUBTABLE *Subtable;
1929 DT_SUBTABLE *ParentTable;
1930 DT_FIELD *FieldList = *(DT_FIELD **) List;
1933 ParentTable = DtPeekSubtable ();
1937 DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
1939 DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
1940 DtInsertSubtable (ParentTable, Subtable);
1941 FieldList = FieldList->Next;
1948 /******************************************************************************
1950 * FUNCTION: DtCompileGeneric
1952 * PARAMETERS: List - Current field list pointer
1956 * DESCRIPTION: Compile generic unknown table.
1958 *****************************************************************************/
1965 DT_SUBTABLE *Subtable;
1966 DT_SUBTABLE *ParentTable;
1967 DT_FIELD **PFieldList = (DT_FIELD **) List;
1968 ACPI_DMTABLE_INFO *Info;
1971 ParentTable = DtPeekSubtable ();
1974 * Compile the "generic" portion of the table. This
1975 * part of the table is not predefined and any of the generic
1976 * operators may be used.
1979 /* Find any and all labels in the entire generic portion */
1981 DtDetectAllLabels (*PFieldList);
1983 /* Now we can actually compile the parse tree */
1987 Info = DtGetGenericTableInfo ((*PFieldList)->Name);
1990 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
1991 (*PFieldList)->Name);
1992 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
1993 (*PFieldList), MsgBuffer);
1995 *PFieldList = (*PFieldList)->Next;
1999 Status = DtCompileTable (PFieldList, Info,
2001 if (ACPI_SUCCESS (Status))
2003 DtInsertSubtable (ParentTable, Subtable);
2007 *PFieldList = (*PFieldList)->Next;
2009 if (Status == AE_NOT_FOUND)
2011 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
2012 (*PFieldList)->Name);
2013 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
2014 (*PFieldList), MsgBuffer);