1 /******************************************************************************
3 * Module Name: dttable2.c - handling for specific ACPI tables
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2017, 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, signatures starting with L-Z */
46 #include <contrib/dev/acpica/compiler/aslcompiler.h>
47 #include <contrib/dev/acpica/compiler/dtcompiler.h>
49 #define _COMPONENT DT_COMPILER
50 ACPI_MODULE_NAME ("dttable2")
53 /******************************************************************************
55 * FUNCTION: DtCompileLpit
57 * PARAMETERS: List - Current field list pointer
61 * DESCRIPTION: Compile LPIT.
63 *****************************************************************************/
70 DT_SUBTABLE *Subtable;
71 DT_SUBTABLE *ParentTable;
72 DT_FIELD **PFieldList = (DT_FIELD **) List;
73 DT_FIELD *SubtableStart;
74 ACPI_DMTABLE_INFO *InfoTable;
75 ACPI_LPIT_HEADER *LpitHeader;
78 /* Note: Main table consists only of the standard ACPI table header */
82 SubtableStart = *PFieldList;
84 /* LPIT Subtable header */
86 Status = DtCompileTable (PFieldList, AcpiDmTableInfoLpitHdr,
88 if (ACPI_FAILURE (Status))
93 ParentTable = DtPeekSubtable ();
94 DtInsertSubtable (ParentTable, Subtable);
95 DtPushSubtable (Subtable);
97 LpitHeader = ACPI_CAST_PTR (ACPI_LPIT_HEADER, Subtable->Buffer);
99 switch (LpitHeader->Type)
101 case ACPI_LPIT_TYPE_NATIVE_CSTATE:
103 InfoTable = AcpiDmTableInfoLpit0;
108 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "LPIT");
114 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
115 if (ACPI_FAILURE (Status))
120 ParentTable = DtPeekSubtable ();
121 DtInsertSubtable (ParentTable, Subtable);
129 /******************************************************************************
131 * FUNCTION: DtCompileMadt
133 * PARAMETERS: List - Current field list pointer
137 * DESCRIPTION: Compile MADT.
139 *****************************************************************************/
146 DT_SUBTABLE *Subtable;
147 DT_SUBTABLE *ParentTable;
148 DT_FIELD **PFieldList = (DT_FIELD **) List;
149 DT_FIELD *SubtableStart;
150 ACPI_SUBTABLE_HEADER *MadtHeader;
151 ACPI_DMTABLE_INFO *InfoTable;
154 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
156 if (ACPI_FAILURE (Status))
161 ParentTable = DtPeekSubtable ();
162 DtInsertSubtable (ParentTable, Subtable);
166 SubtableStart = *PFieldList;
167 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
169 if (ACPI_FAILURE (Status))
174 ParentTable = DtPeekSubtable ();
175 DtInsertSubtable (ParentTable, Subtable);
176 DtPushSubtable (Subtable);
178 MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
180 switch (MadtHeader->Type)
182 case ACPI_MADT_TYPE_LOCAL_APIC:
184 InfoTable = AcpiDmTableInfoMadt0;
187 case ACPI_MADT_TYPE_IO_APIC:
189 InfoTable = AcpiDmTableInfoMadt1;
192 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
194 InfoTable = AcpiDmTableInfoMadt2;
197 case ACPI_MADT_TYPE_NMI_SOURCE:
199 InfoTable = AcpiDmTableInfoMadt3;
202 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
204 InfoTable = AcpiDmTableInfoMadt4;
207 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
209 InfoTable = AcpiDmTableInfoMadt5;
212 case ACPI_MADT_TYPE_IO_SAPIC:
214 InfoTable = AcpiDmTableInfoMadt6;
217 case ACPI_MADT_TYPE_LOCAL_SAPIC:
219 InfoTable = AcpiDmTableInfoMadt7;
222 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
224 InfoTable = AcpiDmTableInfoMadt8;
227 case ACPI_MADT_TYPE_LOCAL_X2APIC:
229 InfoTable = AcpiDmTableInfoMadt9;
232 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
234 InfoTable = AcpiDmTableInfoMadt10;
237 case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
239 InfoTable = AcpiDmTableInfoMadt11;
242 case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
244 InfoTable = AcpiDmTableInfoMadt12;
247 case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
249 InfoTable = AcpiDmTableInfoMadt13;
252 case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
254 InfoTable = AcpiDmTableInfoMadt14;
257 case ACPI_MADT_TYPE_GENERIC_TRANSLATOR:
259 InfoTable = AcpiDmTableInfoMadt15;
264 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
268 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
269 if (ACPI_FAILURE (Status))
274 ParentTable = DtPeekSubtable ();
275 DtInsertSubtable (ParentTable, Subtable);
283 /******************************************************************************
285 * FUNCTION: DtCompileMcfg
287 * PARAMETERS: List - Current field list pointer
291 * DESCRIPTION: Compile MCFG.
293 *****************************************************************************/
302 Status = DtCompileTwoSubtables (List,
303 AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
308 /******************************************************************************
310 * FUNCTION: DtCompileMpst
312 * PARAMETERS: List - Current field list pointer
316 * DESCRIPTION: Compile MPST.
318 *****************************************************************************/
325 DT_SUBTABLE *Subtable;
326 DT_SUBTABLE *ParentTable;
327 DT_FIELD **PFieldList = (DT_FIELD **) List;
328 ACPI_MPST_CHANNEL *MpstChannelInfo;
329 ACPI_MPST_POWER_NODE *MpstPowerNode;
330 ACPI_MPST_DATA_HDR *MpstDataHeader;
331 UINT16 SubtableCount;
332 UINT32 PowerStateCount;
333 UINT32 ComponentCount;
338 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst, &Subtable, TRUE);
339 if (ACPI_FAILURE (Status))
344 ParentTable = DtPeekSubtable ();
345 DtInsertSubtable (ParentTable, Subtable);
346 DtPushSubtable (Subtable);
348 MpstChannelInfo = ACPI_CAST_PTR (ACPI_MPST_CHANNEL, Subtable->Buffer);
349 SubtableCount = MpstChannelInfo->PowerNodeCount;
351 while (*PFieldList && SubtableCount)
353 /* Subtable: Memory Power Node(s) */
355 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0,
357 if (ACPI_FAILURE (Status))
362 ParentTable = DtPeekSubtable ();
363 DtInsertSubtable (ParentTable, Subtable);
364 DtPushSubtable (Subtable);
366 MpstPowerNode = ACPI_CAST_PTR (ACPI_MPST_POWER_NODE, Subtable->Buffer);
367 PowerStateCount = MpstPowerNode->NumPowerStates;
368 ComponentCount = MpstPowerNode->NumPhysicalComponents;
370 ParentTable = DtPeekSubtable ();
372 /* Sub-subtables - Memory Power State Structure(s) */
374 while (*PFieldList && PowerStateCount)
376 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0A,
378 if (ACPI_FAILURE (Status))
383 DtInsertSubtable (ParentTable, Subtable);
387 /* Sub-subtables - Physical Component ID Structure(s) */
389 while (*PFieldList && ComponentCount)
391 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst0B,
393 if (ACPI_FAILURE (Status))
398 DtInsertSubtable (ParentTable, Subtable);
406 /* Subtable: Count of Memory Power State Characteristic structures */
410 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst1, &Subtable, TRUE);
411 if (ACPI_FAILURE (Status))
416 ParentTable = DtPeekSubtable ();
417 DtInsertSubtable (ParentTable, Subtable);
418 DtPushSubtable (Subtable);
420 MpstDataHeader = ACPI_CAST_PTR (ACPI_MPST_DATA_HDR, Subtable->Buffer);
421 SubtableCount = MpstDataHeader->CharacteristicsCount;
423 ParentTable = DtPeekSubtable ();
425 /* Subtable: Memory Power State Characteristics structure(s) */
427 while (*PFieldList && SubtableCount)
429 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMpst2,
431 if (ACPI_FAILURE (Status))
436 DtInsertSubtable (ParentTable, Subtable);
445 /******************************************************************************
447 * FUNCTION: DtCompileMsct
449 * PARAMETERS: List - Current field list pointer
453 * DESCRIPTION: Compile MSCT.
455 *****************************************************************************/
464 Status = DtCompileTwoSubtables (List,
465 AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
470 /******************************************************************************
472 * FUNCTION: DtCompileMtmr
474 * PARAMETERS: List - Current field list pointer
478 * DESCRIPTION: Compile MTMR.
480 *****************************************************************************/
489 Status = DtCompileTwoSubtables (List,
490 AcpiDmTableInfoMtmr, AcpiDmTableInfoMtmr0);
495 /******************************************************************************
497 * FUNCTION: DtCompileNfit
499 * PARAMETERS: List - Current field list pointer
503 * DESCRIPTION: Compile NFIT.
505 *****************************************************************************/
512 DT_SUBTABLE *Subtable;
513 DT_SUBTABLE *ParentTable;
514 DT_FIELD **PFieldList = (DT_FIELD **) List;
515 DT_FIELD *SubtableStart;
516 ACPI_NFIT_HEADER *NfitHeader;
517 ACPI_DMTABLE_INFO *InfoTable;
519 ACPI_NFIT_INTERLEAVE *Interleave = NULL;
520 ACPI_NFIT_FLUSH_ADDRESS *Hint = NULL;
525 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit,
527 if (ACPI_FAILURE (Status))
532 ParentTable = DtPeekSubtable ();
533 DtInsertSubtable (ParentTable, Subtable);
534 DtPushSubtable (Subtable);
540 SubtableStart = *PFieldList;
541 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfitHdr,
543 if (ACPI_FAILURE (Status))
548 ParentTable = DtPeekSubtable ();
549 DtInsertSubtable (ParentTable, Subtable);
550 DtPushSubtable (Subtable);
552 NfitHeader = ACPI_CAST_PTR (ACPI_NFIT_HEADER, Subtable->Buffer);
554 switch (NfitHeader->Type)
556 case ACPI_NFIT_TYPE_SYSTEM_ADDRESS:
558 InfoTable = AcpiDmTableInfoNfit0;
561 case ACPI_NFIT_TYPE_MEMORY_MAP:
563 InfoTable = AcpiDmTableInfoNfit1;
566 case ACPI_NFIT_TYPE_INTERLEAVE:
568 Interleave = ACPI_CAST_PTR (ACPI_NFIT_INTERLEAVE, Subtable->Buffer);
569 InfoTable = AcpiDmTableInfoNfit2;
572 case ACPI_NFIT_TYPE_SMBIOS:
574 InfoTable = AcpiDmTableInfoNfit3;
577 case ACPI_NFIT_TYPE_CONTROL_REGION:
579 InfoTable = AcpiDmTableInfoNfit4;
582 case ACPI_NFIT_TYPE_DATA_REGION:
584 InfoTable = AcpiDmTableInfoNfit5;
587 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
589 Hint = ACPI_CAST_PTR (ACPI_NFIT_FLUSH_ADDRESS, Subtable->Buffer);
590 InfoTable = AcpiDmTableInfoNfit6;
595 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "NFIT");
599 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
600 if (ACPI_FAILURE (Status))
605 ParentTable = DtPeekSubtable ();
606 DtInsertSubtable (ParentTable, Subtable);
609 switch (NfitHeader->Type)
611 case ACPI_NFIT_TYPE_INTERLEAVE:
614 DtPushSubtable (Subtable);
617 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit2a,
619 if (ACPI_FAILURE (Status))
630 ParentTable = DtPeekSubtable ();
631 DtInsertSubtable (ParentTable, Subtable);
635 Interleave->LineCount = Count;
639 case ACPI_NFIT_TYPE_SMBIOS:
643 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit3a,
645 if (ACPI_FAILURE (Status))
652 DtInsertSubtable (ParentTable, Subtable);
657 case ACPI_NFIT_TYPE_FLUSH_ADDRESS:
660 DtPushSubtable (Subtable);
663 Status = DtCompileTable (PFieldList, AcpiDmTableInfoNfit6a,
665 if (ACPI_FAILURE (Status))
676 ParentTable = DtPeekSubtable ();
677 DtInsertSubtable (ParentTable, Subtable);
681 Hint->HintCount = (UINT16) Count;
694 /******************************************************************************
696 * FUNCTION: DtCompilePcct
698 * PARAMETERS: List - Current field list pointer
702 * DESCRIPTION: Compile PCCT.
704 *****************************************************************************/
711 DT_SUBTABLE *Subtable;
712 DT_SUBTABLE *ParentTable;
713 DT_FIELD **PFieldList = (DT_FIELD **) List;
714 DT_FIELD *SubtableStart;
715 ACPI_SUBTABLE_HEADER *PcctHeader;
716 ACPI_DMTABLE_INFO *InfoTable;
721 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcct,
723 if (ACPI_FAILURE (Status))
728 ParentTable = DtPeekSubtable ();
729 DtInsertSubtable (ParentTable, Subtable);
735 SubtableStart = *PFieldList;
736 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPcctHdr,
738 if (ACPI_FAILURE (Status))
743 ParentTable = DtPeekSubtable ();
744 DtInsertSubtable (ParentTable, Subtable);
745 DtPushSubtable (Subtable);
747 PcctHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
749 switch (PcctHeader->Type)
751 case ACPI_PCCT_TYPE_GENERIC_SUBSPACE:
753 InfoTable = AcpiDmTableInfoPcct0;
756 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE:
758 InfoTable = AcpiDmTableInfoPcct1;
761 case ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2:
763 InfoTable = AcpiDmTableInfoPcct2;
768 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PCCT");
772 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
773 if (ACPI_FAILURE (Status))
778 ParentTable = DtPeekSubtable ();
779 DtInsertSubtable (ParentTable, Subtable);
787 /******************************************************************************
789 * FUNCTION: DtCompilePmtt
791 * PARAMETERS: List - Current field list pointer
795 * DESCRIPTION: Compile PMTT.
797 *****************************************************************************/
804 DT_SUBTABLE *Subtable;
805 DT_SUBTABLE *ParentTable;
806 DT_FIELD **PFieldList = (DT_FIELD **) List;
807 DT_FIELD *SubtableStart;
808 ACPI_PMTT_HEADER *PmttHeader;
809 ACPI_PMTT_CONTROLLER *PmttController;
811 UINT8 PrevType = ACPI_PMTT_TYPE_SOCKET;
816 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt, &Subtable, TRUE);
817 if (ACPI_FAILURE (Status))
822 ParentTable = DtPeekSubtable ();
823 DtInsertSubtable (ParentTable, Subtable);
824 DtPushSubtable (Subtable);
828 SubtableStart = *PFieldList;
829 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmttHdr,
831 if (ACPI_FAILURE (Status))
836 PmttHeader = ACPI_CAST_PTR (ACPI_PMTT_HEADER, Subtable->Buffer);
837 while (PrevType >= PmttHeader->Type)
841 if (PrevType == ACPI_PMTT_TYPE_SOCKET)
849 PrevType = PmttHeader->Type;
851 ParentTable = DtPeekSubtable ();
852 DtInsertSubtable (ParentTable, Subtable);
853 DtPushSubtable (Subtable);
855 switch (PmttHeader->Type)
857 case ACPI_PMTT_TYPE_SOCKET:
859 /* Subtable: Socket Structure */
861 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt0,
863 if (ACPI_FAILURE (Status))
868 ParentTable = DtPeekSubtable ();
869 DtInsertSubtable (ParentTable, Subtable);
872 case ACPI_PMTT_TYPE_CONTROLLER:
874 /* Subtable: Memory Controller Structure */
876 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1,
878 if (ACPI_FAILURE (Status))
883 ParentTable = DtPeekSubtable ();
884 DtInsertSubtable (ParentTable, Subtable);
886 PmttController = ACPI_CAST_PTR (ACPI_PMTT_CONTROLLER,
887 (Subtable->Buffer - sizeof (ACPI_PMTT_HEADER)));
888 DomainCount = PmttController->DomainCount;
892 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt1a,
894 if (ACPI_FAILURE (Status))
899 DtInsertSubtable (ParentTable, Subtable);
904 case ACPI_PMTT_TYPE_DIMM:
906 /* Subtable: Physical Component Structure */
908 Status = DtCompileTable (PFieldList, AcpiDmTableInfoPmtt2,
910 if (ACPI_FAILURE (Status))
915 ParentTable = DtPeekSubtable ();
916 DtInsertSubtable (ParentTable, Subtable);
921 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "PMTT");
930 /******************************************************************************
932 * FUNCTION: DtCompileRsdt
934 * PARAMETERS: List - Current field list pointer
938 * DESCRIPTION: Compile RSDT.
940 *****************************************************************************/
946 DT_SUBTABLE *Subtable;
947 DT_SUBTABLE *ParentTable;
948 DT_FIELD *FieldList = *(DT_FIELD **) List;
952 ParentTable = DtPeekSubtable ();
956 DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
958 DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
959 DtInsertSubtable (ParentTable, Subtable);
960 FieldList = FieldList->Next;
967 /******************************************************************************
969 * FUNCTION: DtCompileS3pt
971 * PARAMETERS: PFieldList - Current field list pointer
975 * DESCRIPTION: Compile S3PT (Pointed to by FPDT)
977 *****************************************************************************/
981 DT_FIELD **PFieldList)
984 ACPI_FPDT_HEADER *S3ptHeader;
985 DT_SUBTABLE *Subtable;
986 DT_SUBTABLE *ParentTable;
987 ACPI_DMTABLE_INFO *InfoTable;
988 DT_FIELD *SubtableStart;
991 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3pt,
992 &Gbl_RootTable, TRUE);
993 if (ACPI_FAILURE (Status))
998 DtPushSubtable (Gbl_RootTable);
1002 SubtableStart = *PFieldList;
1003 Status = DtCompileTable (PFieldList, AcpiDmTableInfoS3ptHdr,
1005 if (ACPI_FAILURE (Status))
1010 ParentTable = DtPeekSubtable ();
1011 DtInsertSubtable (ParentTable, Subtable);
1012 DtPushSubtable (Subtable);
1014 S3ptHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
1016 switch (S3ptHeader->Type)
1018 case ACPI_S3PT_TYPE_RESUME:
1020 InfoTable = AcpiDmTableInfoS3pt0;
1023 case ACPI_S3PT_TYPE_SUSPEND:
1025 InfoTable = AcpiDmTableInfoS3pt1;
1030 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "S3PT");
1034 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1035 if (ACPI_FAILURE (Status))
1040 ParentTable = DtPeekSubtable ();
1041 DtInsertSubtable (ParentTable, Subtable);
1049 /******************************************************************************
1051 * FUNCTION: DtCompileSlic
1053 * PARAMETERS: List - Current field list pointer
1057 * DESCRIPTION: Compile SLIC.
1059 *****************************************************************************/
1066 DT_SUBTABLE *Subtable;
1067 DT_SUBTABLE *ParentTable;
1068 DT_FIELD **PFieldList = (DT_FIELD **) List;
1073 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlic,
1075 if (ACPI_FAILURE (Status))
1080 ParentTable = DtPeekSubtable ();
1081 DtInsertSubtable (ParentTable, Subtable);
1082 DtPushSubtable (Subtable);
1090 /******************************************************************************
1092 * FUNCTION: DtCompileSlit
1094 * PARAMETERS: List - Current field list pointer
1098 * DESCRIPTION: Compile SLIT.
1100 *****************************************************************************/
1107 DT_SUBTABLE *Subtable;
1108 DT_SUBTABLE *ParentTable;
1109 DT_FIELD **PFieldList = (DT_FIELD **) List;
1110 DT_FIELD *FieldList;
1112 UINT8 *LocalityBuffer;
1115 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
1117 if (ACPI_FAILURE (Status))
1122 ParentTable = DtPeekSubtable ();
1123 DtInsertSubtable (ParentTable, Subtable);
1125 Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
1126 LocalityBuffer = UtLocalCalloc (Localities);
1128 /* Compile each locality buffer */
1130 FieldList = *PFieldList;
1133 DtCompileBuffer (LocalityBuffer,
1134 FieldList->Value, FieldList, Localities);
1136 DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
1137 DtInsertSubtable (ParentTable, Subtable);
1138 FieldList = FieldList->Next;
1141 ACPI_FREE (LocalityBuffer);
1146 /******************************************************************************
1148 * FUNCTION: DtCompileSrat
1150 * PARAMETERS: List - Current field list pointer
1154 * DESCRIPTION: Compile SRAT.
1156 *****************************************************************************/
1163 DT_SUBTABLE *Subtable;
1164 DT_SUBTABLE *ParentTable;
1165 DT_FIELD **PFieldList = (DT_FIELD **) List;
1166 DT_FIELD *SubtableStart;
1167 ACPI_SUBTABLE_HEADER *SratHeader;
1168 ACPI_DMTABLE_INFO *InfoTable;
1171 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
1173 if (ACPI_FAILURE (Status))
1178 ParentTable = DtPeekSubtable ();
1179 DtInsertSubtable (ParentTable, Subtable);
1183 SubtableStart = *PFieldList;
1184 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
1186 if (ACPI_FAILURE (Status))
1191 ParentTable = DtPeekSubtable ();
1192 DtInsertSubtable (ParentTable, Subtable);
1193 DtPushSubtable (Subtable);
1195 SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1197 switch (SratHeader->Type)
1199 case ACPI_SRAT_TYPE_CPU_AFFINITY:
1201 InfoTable = AcpiDmTableInfoSrat0;
1204 case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
1206 InfoTable = AcpiDmTableInfoSrat1;
1209 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
1211 InfoTable = AcpiDmTableInfoSrat2;
1214 case ACPI_SRAT_TYPE_GICC_AFFINITY:
1216 InfoTable = AcpiDmTableInfoSrat3;
1221 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
1225 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1226 if (ACPI_FAILURE (Status))
1231 ParentTable = DtPeekSubtable ();
1232 DtInsertSubtable (ParentTable, Subtable);
1240 /******************************************************************************
1242 * FUNCTION: DtCompileStao
1244 * PARAMETERS: PFieldList - Current field list pointer
1248 * DESCRIPTION: Compile STAO.
1250 *****************************************************************************/
1256 DT_FIELD **PFieldList = (DT_FIELD **) List;
1257 DT_SUBTABLE *Subtable;
1258 DT_SUBTABLE *ParentTable;
1262 /* Compile the main table */
1264 Status = DtCompileTable (PFieldList, AcpiDmTableInfoStao,
1266 if (ACPI_FAILURE (Status))
1271 ParentTable = DtPeekSubtable ();
1272 DtInsertSubtable (ParentTable, Subtable);
1274 /* Compile each ASCII namestring as a subtable */
1278 Status = DtCompileTable (PFieldList, AcpiDmTableInfoStaoStr,
1280 if (ACPI_FAILURE (Status))
1285 ParentTable = DtPeekSubtable ();
1286 DtInsertSubtable (ParentTable, Subtable);
1293 /******************************************************************************
1295 * FUNCTION: DtCompileTcpa
1297 * PARAMETERS: PFieldList - Current field list pointer
1301 * DESCRIPTION: Compile TCPA.
1303 *****************************************************************************/
1309 DT_FIELD **PFieldList = (DT_FIELD **) List;
1310 DT_SUBTABLE *Subtable;
1311 ACPI_TABLE_TCPA_HDR *TcpaHeader;
1312 DT_SUBTABLE *ParentTable;
1316 /* Compile the main table */
1318 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaHdr,
1320 if (ACPI_FAILURE (Status))
1325 ParentTable = DtPeekSubtable ();
1326 DtInsertSubtable (ParentTable, Subtable);
1329 * Examine the PlatformClass field to determine the table type.
1330 * Either a client or server table. Only one.
1332 TcpaHeader = ACPI_CAST_PTR (ACPI_TABLE_TCPA_HDR, ParentTable->Buffer);
1334 switch (TcpaHeader->PlatformClass)
1336 case ACPI_TCPA_CLIENT_TABLE:
1338 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaClient,
1342 case ACPI_TCPA_SERVER_TABLE:
1344 Status = DtCompileTable (PFieldList, AcpiDmTableInfoTcpaServer,
1350 AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
1351 TcpaHeader->PlatformClass);
1356 ParentTable = DtPeekSubtable ();
1357 DtInsertSubtable (ParentTable, Subtable);
1362 /******************************************************************************
1364 * FUNCTION: DtGetGenericTableInfo
1366 * PARAMETERS: Name - Generic type name
1368 * RETURN: Info entry
1370 * DESCRIPTION: Obtain table info for a generic name entry
1372 *****************************************************************************/
1375 DtGetGenericTableInfo (
1378 ACPI_DMTABLE_INFO *Info;
1387 /* Search info table for name match */
1391 Info = AcpiDmTableInfoGeneric[i];
1392 if (Info->Opcode == ACPI_DMT_EXIT)
1398 /* Use caseless compare for generic keywords */
1400 if (!AcpiUtStricmp (Name, Info->Name))
1410 /******************************************************************************
1412 * FUNCTION: DtCompileUefi
1414 * PARAMETERS: List - Current field list pointer
1418 * DESCRIPTION: Compile UEFI.
1420 *****************************************************************************/
1427 DT_SUBTABLE *Subtable;
1428 DT_SUBTABLE *ParentTable;
1429 DT_FIELD **PFieldList = (DT_FIELD **) List;
1433 /* Compile the predefined portion of the UEFI table */
1435 Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
1437 if (ACPI_FAILURE (Status))
1442 DataOffset = (UINT16 *) (Subtable->Buffer + 16);
1443 *DataOffset = sizeof (ACPI_TABLE_UEFI);
1445 ParentTable = DtPeekSubtable ();
1446 DtInsertSubtable (ParentTable, Subtable);
1449 * Compile the "generic" portion of the UEFI table. This
1450 * part of the table is not predefined and any of the generic
1451 * operators may be used.
1453 DtCompileGeneric ((void **) PFieldList, NULL, NULL);
1458 /******************************************************************************
1460 * FUNCTION: DtCompileVrtc
1462 * PARAMETERS: List - Current field list pointer
1466 * DESCRIPTION: Compile VRTC.
1468 *****************************************************************************/
1477 Status = DtCompileTwoSubtables (List,
1478 AcpiDmTableInfoVrtc, AcpiDmTableInfoVrtc0);
1483 /******************************************************************************
1485 * FUNCTION: DtCompileWdat
1487 * PARAMETERS: List - Current field list pointer
1491 * DESCRIPTION: Compile WDAT.
1493 *****************************************************************************/
1502 Status = DtCompileTwoSubtables (List,
1503 AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
1508 /******************************************************************************
1510 * FUNCTION: DtCompileWpbt
1512 * PARAMETERS: List - Current field list pointer
1516 * DESCRIPTION: Compile WPBT.
1518 *****************************************************************************/
1524 DT_FIELD **PFieldList = (DT_FIELD **) List;
1525 DT_SUBTABLE *Subtable;
1526 DT_SUBTABLE *ParentTable;
1527 ACPI_TABLE_WPBT *Table;
1532 /* Compile the main table */
1534 Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt,
1536 if (ACPI_FAILURE (Status))
1541 ParentTable = DtPeekSubtable ();
1542 DtInsertSubtable (ParentTable, Subtable);
1544 /* Compile the argument list subtable */
1546 Status = DtCompileTable (PFieldList, AcpiDmTableInfoWpbt0,
1548 if (ACPI_FAILURE (Status))
1553 /* Extract the length of the Arguments buffer, insert into main table */
1555 Length = (UINT16) Subtable->TotalLength;
1556 Table = ACPI_CAST_PTR (ACPI_TABLE_WPBT, ParentTable->Buffer);
1557 Table->ArgumentsLength = Length;
1559 ParentTable = DtPeekSubtable ();
1560 DtInsertSubtable (ParentTable, Subtable);
1565 /******************************************************************************
1567 * FUNCTION: DtCompileXsdt
1569 * PARAMETERS: List - Current field list pointer
1573 * DESCRIPTION: Compile XSDT.
1575 *****************************************************************************/
1581 DT_SUBTABLE *Subtable;
1582 DT_SUBTABLE *ParentTable;
1583 DT_FIELD *FieldList = *(DT_FIELD **) List;
1587 ParentTable = DtPeekSubtable ();
1591 DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
1593 DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
1594 DtInsertSubtable (ParentTable, Subtable);
1595 FieldList = FieldList->Next;
1602 /******************************************************************************
1604 * FUNCTION: DtCompileGeneric
1606 * PARAMETERS: List - Current field list pointer
1607 * Name - Field name to end generic compiling
1608 * Length - Compiled table length to return
1612 * DESCRIPTION: Compile generic unknown table.
1614 *****************************************************************************/
1623 DT_SUBTABLE *Subtable;
1624 DT_SUBTABLE *ParentTable;
1625 DT_FIELD **PFieldList = (DT_FIELD **) List;
1626 ACPI_DMTABLE_INFO *Info;
1629 ParentTable = DtPeekSubtable ();
1632 * Compile the "generic" portion of the table. This
1633 * part of the table is not predefined and any of the generic
1634 * operators may be used.
1637 /* Find any and all labels in the entire generic portion */
1639 DtDetectAllLabels (*PFieldList);
1641 /* Now we can actually compile the parse tree */
1643 if (Length && *Length)
1649 if (Name && !strcmp ((*PFieldList)->Name, Name))
1654 Info = DtGetGenericTableInfo ((*PFieldList)->Name);
1657 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
1658 (*PFieldList)->Name);
1659 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
1660 (*PFieldList), MsgBuffer);
1662 *PFieldList = (*PFieldList)->Next;
1666 Status = DtCompileTable (PFieldList, Info,
1668 if (ACPI_SUCCESS (Status))
1670 DtInsertSubtable (ParentTable, Subtable);
1673 *Length += Subtable->Length;
1678 *PFieldList = (*PFieldList)->Next;
1680 if (Status == AE_NOT_FOUND)
1682 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
1683 (*PFieldList)->Name);
1684 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
1685 (*PFieldList), MsgBuffer);