1 /******************************************************************************
3 * Module Name: dttable.c - handling for specific ACPI tables
5 *****************************************************************************/
8 * Copyright (C) 2000 - 2011, 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 <contrib/dev/acpica/compiler/aslcompiler.h>
49 #include <contrib/dev/acpica/compiler/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);
669 /******************************************************************************
671 * FUNCTION: DtCompileHest
673 * PARAMETERS: List - Current field list pointer
677 * DESCRIPTION: Compile HEST.
679 *****************************************************************************/
686 DT_SUBTABLE *Subtable;
687 DT_SUBTABLE *ParentTable;
688 DT_FIELD **PFieldList = (DT_FIELD **) List;
689 DT_FIELD *SubtableStart;
690 ACPI_DMTABLE_INFO *InfoTable;
695 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
697 if (ACPI_FAILURE (Status))
702 ParentTable = DtPeekSubtable ();
703 DtInsertSubtable (ParentTable, Subtable);
707 /* Get subtable type */
709 SubtableStart = *PFieldList;
710 DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
714 case ACPI_HEST_TYPE_IA32_CHECK:
715 InfoTable = AcpiDmTableInfoHest0;
718 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
719 InfoTable = AcpiDmTableInfoHest1;
722 case ACPI_HEST_TYPE_IA32_NMI:
723 InfoTable = AcpiDmTableInfoHest2;
726 case ACPI_HEST_TYPE_AER_ROOT_PORT:
727 InfoTable = AcpiDmTableInfoHest6;
730 case ACPI_HEST_TYPE_AER_ENDPOINT:
731 InfoTable = AcpiDmTableInfoHest7;
734 case ACPI_HEST_TYPE_AER_BRIDGE:
735 InfoTable = AcpiDmTableInfoHest8;
738 case ACPI_HEST_TYPE_GENERIC_ERROR:
739 InfoTable = AcpiDmTableInfoHest9;
743 /* Cannot continue on unknown type */
745 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
749 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
750 if (ACPI_FAILURE (Status))
755 DtInsertSubtable (ParentTable, Subtable);
758 * Additional subtable data - IA32 Error Bank(s)
763 case ACPI_HEST_TYPE_IA32_CHECK:
764 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
765 Subtable->Buffer))->NumHardwareBanks;
768 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
769 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
770 Subtable->Buffer))->NumHardwareBanks;
779 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
781 if (ACPI_FAILURE (Status))
786 DtInsertSubtable (ParentTable, Subtable);
795 /******************************************************************************
797 * FUNCTION: DtCompileIvrs
799 * PARAMETERS: List - Current field list pointer
803 * DESCRIPTION: Compile IVRS.
805 *****************************************************************************/
812 DT_SUBTABLE *Subtable;
813 DT_SUBTABLE *ParentTable;
814 DT_FIELD **PFieldList = (DT_FIELD **) List;
815 DT_FIELD *SubtableStart;
816 ACPI_DMTABLE_INFO *InfoTable;
817 ACPI_IVRS_HEADER *IvrsHeader;
821 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
823 if (ACPI_FAILURE (Status))
828 ParentTable = DtPeekSubtable ();
829 DtInsertSubtable (ParentTable, Subtable);
833 SubtableStart = *PFieldList;
834 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr,
836 if (ACPI_FAILURE (Status))
841 ParentTable = DtPeekSubtable ();
842 DtInsertSubtable (ParentTable, Subtable);
843 DtPushSubtable (Subtable);
845 IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer);
847 switch (IvrsHeader->Type)
849 case ACPI_IVRS_TYPE_HARDWARE:
850 InfoTable = AcpiDmTableInfoIvrs0;
853 case ACPI_IVRS_TYPE_MEMORY1:
854 case ACPI_IVRS_TYPE_MEMORY2:
855 case ACPI_IVRS_TYPE_MEMORY3:
856 InfoTable = AcpiDmTableInfoIvrs1;
860 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS");
864 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
865 if (ACPI_FAILURE (Status))
870 ParentTable = DtPeekSubtable ();
871 DtInsertSubtable (ParentTable, Subtable);
873 if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE)
875 while (*PFieldList &&
876 !ACPI_STRCMP ((*PFieldList)->Name, "Entry Type"))
878 SubtableStart = *PFieldList;
879 DtCompileInteger (&EntryType, *PFieldList, 1, 0);
883 /* 4-byte device entries */
885 case ACPI_IVRS_TYPE_PAD4:
886 case ACPI_IVRS_TYPE_ALL:
887 case ACPI_IVRS_TYPE_SELECT:
888 case ACPI_IVRS_TYPE_START:
889 case ACPI_IVRS_TYPE_END:
891 InfoTable = AcpiDmTableInfoIvrs4;
894 /* 8-byte entries, type A */
896 case ACPI_IVRS_TYPE_ALIAS_SELECT:
897 case ACPI_IVRS_TYPE_ALIAS_START:
899 InfoTable = AcpiDmTableInfoIvrs8a;
902 /* 8-byte entries, type B */
904 case ACPI_IVRS_TYPE_PAD8:
905 case ACPI_IVRS_TYPE_EXT_SELECT:
906 case ACPI_IVRS_TYPE_EXT_START:
908 InfoTable = AcpiDmTableInfoIvrs8b;
911 /* 8-byte entries, type C */
913 case ACPI_IVRS_TYPE_SPECIAL:
915 InfoTable = AcpiDmTableInfoIvrs8c;
919 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
920 "IVRS Device Entry");
924 Status = DtCompileTable (PFieldList, InfoTable,
926 if (ACPI_FAILURE (Status))
931 DtInsertSubtable (ParentTable, Subtable);
942 /******************************************************************************
944 * FUNCTION: DtCompileMadt
946 * PARAMETERS: List - Current field list pointer
950 * DESCRIPTION: Compile MADT.
952 *****************************************************************************/
959 DT_SUBTABLE *Subtable;
960 DT_SUBTABLE *ParentTable;
961 DT_FIELD **PFieldList = (DT_FIELD **) List;
962 DT_FIELD *SubtableStart;
963 ACPI_SUBTABLE_HEADER *MadtHeader;
964 ACPI_DMTABLE_INFO *InfoTable;
967 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadt,
969 if (ACPI_FAILURE (Status))
974 ParentTable = DtPeekSubtable ();
975 DtInsertSubtable (ParentTable, Subtable);
979 SubtableStart = *PFieldList;
980 Status = DtCompileTable (PFieldList, AcpiDmTableInfoMadtHdr,
982 if (ACPI_FAILURE (Status))
987 ParentTable = DtPeekSubtable ();
988 DtInsertSubtable (ParentTable, Subtable);
989 DtPushSubtable (Subtable);
991 MadtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
993 switch (MadtHeader->Type)
995 case ACPI_MADT_TYPE_LOCAL_APIC:
996 InfoTable = AcpiDmTableInfoMadt0;
998 case ACPI_MADT_TYPE_IO_APIC:
999 InfoTable = AcpiDmTableInfoMadt1;
1001 case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
1002 InfoTable = AcpiDmTableInfoMadt2;
1004 case ACPI_MADT_TYPE_NMI_SOURCE:
1005 InfoTable = AcpiDmTableInfoMadt3;
1007 case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
1008 InfoTable = AcpiDmTableInfoMadt4;
1010 case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
1011 InfoTable = AcpiDmTableInfoMadt5;
1013 case ACPI_MADT_TYPE_IO_SAPIC:
1014 InfoTable = AcpiDmTableInfoMadt6;
1016 case ACPI_MADT_TYPE_LOCAL_SAPIC:
1017 InfoTable = AcpiDmTableInfoMadt7;
1019 case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
1020 InfoTable = AcpiDmTableInfoMadt8;
1022 case ACPI_MADT_TYPE_LOCAL_X2APIC:
1023 InfoTable = AcpiDmTableInfoMadt9;
1025 case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
1026 InfoTable = AcpiDmTableInfoMadt10;
1029 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "MADT");
1033 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1034 if (ACPI_FAILURE (Status))
1039 ParentTable = DtPeekSubtable ();
1040 DtInsertSubtable (ParentTable, Subtable);
1048 /******************************************************************************
1050 * FUNCTION: DtCompileMcfg
1052 * PARAMETERS: List - Current field list pointer
1056 * DESCRIPTION: Compile MCFG.
1058 *****************************************************************************/
1067 Status = DtCompileTwoSubtables (List,
1068 AcpiDmTableInfoMcfg, AcpiDmTableInfoMcfg0);
1073 /******************************************************************************
1075 * FUNCTION: DtCompileMsct
1077 * PARAMETERS: List - Current field list pointer
1081 * DESCRIPTION: Compile MSCT.
1083 *****************************************************************************/
1092 Status = DtCompileTwoSubtables (List,
1093 AcpiDmTableInfoMsct, AcpiDmTableInfoMsct0);
1098 /******************************************************************************
1100 * FUNCTION: DtCompileRsdt
1102 * PARAMETERS: List - Current field list pointer
1106 * DESCRIPTION: Compile RSDT.
1108 *****************************************************************************/
1114 DT_SUBTABLE *Subtable;
1115 DT_SUBTABLE *ParentTable;
1116 DT_FIELD *FieldList = *(DT_FIELD **) List;
1120 ParentTable = DtPeekSubtable ();
1124 DtCompileInteger ((UINT8 *) &Address, FieldList, 4, DT_NON_ZERO);
1126 DtCreateSubtable ((UINT8 *) &Address, 4, &Subtable);
1127 DtInsertSubtable (ParentTable, Subtable);
1128 FieldList = FieldList->Next;
1135 /******************************************************************************
1137 * FUNCTION: DtCompileSlic
1139 * PARAMETERS: List - Current field list pointer
1143 * DESCRIPTION: Compile SLIC.
1145 *****************************************************************************/
1152 DT_SUBTABLE *Subtable;
1153 DT_SUBTABLE *ParentTable;
1154 DT_FIELD **PFieldList = (DT_FIELD **) List;
1155 DT_FIELD *SubtableStart;
1156 ACPI_SLIC_HEADER *SlicHeader;
1157 ACPI_DMTABLE_INFO *InfoTable;
1162 SubtableStart = *PFieldList;
1163 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlicHdr,
1165 if (ACPI_FAILURE (Status))
1170 ParentTable = DtPeekSubtable ();
1171 DtInsertSubtable (ParentTable, Subtable);
1172 DtPushSubtable (Subtable);
1174 SlicHeader = ACPI_CAST_PTR (ACPI_SLIC_HEADER, Subtable->Buffer);
1176 switch (SlicHeader->Type)
1178 case ACPI_SLIC_TYPE_PUBLIC_KEY:
1179 InfoTable = AcpiDmTableInfoSlic0;
1181 case ACPI_SLIC_TYPE_WINDOWS_MARKER:
1182 InfoTable = AcpiDmTableInfoSlic1;
1185 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SLIC");
1189 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1190 if (ACPI_FAILURE (Status))
1195 ParentTable = DtPeekSubtable ();
1196 DtInsertSubtable (ParentTable, Subtable);
1204 /******************************************************************************
1206 * FUNCTION: DtCompileSlit
1208 * PARAMETERS: List - Current field list pointer
1212 * DESCRIPTION: Compile SLIT.
1214 *****************************************************************************/
1221 DT_SUBTABLE *Subtable;
1222 DT_SUBTABLE *ParentTable;
1223 DT_FIELD **PFieldList = (DT_FIELD **) List;
1224 DT_FIELD *FieldList;
1226 UINT8 *LocalityBuffer;
1229 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSlit,
1231 if (ACPI_FAILURE (Status))
1236 ParentTable = DtPeekSubtable ();
1237 DtInsertSubtable (ParentTable, Subtable);
1239 Localities = *ACPI_CAST_PTR (UINT32, Subtable->Buffer);
1240 LocalityBuffer = UtLocalCalloc (Localities);
1242 /* Compile each locality buffer */
1244 FieldList = *PFieldList;
1247 DtCompileBuffer (LocalityBuffer,
1248 FieldList->Value, FieldList, Localities);
1250 DtCreateSubtable (LocalityBuffer, Localities, &Subtable);
1251 DtInsertSubtable (ParentTable, Subtable);
1252 FieldList = FieldList->Next;
1255 ACPI_FREE (LocalityBuffer);
1260 /******************************************************************************
1262 * FUNCTION: DtCompileSrat
1264 * PARAMETERS: List - Current field list pointer
1268 * DESCRIPTION: Compile SRAT.
1270 *****************************************************************************/
1277 DT_SUBTABLE *Subtable;
1278 DT_SUBTABLE *ParentTable;
1279 DT_FIELD **PFieldList = (DT_FIELD **) List;
1280 DT_FIELD *SubtableStart;
1281 ACPI_SUBTABLE_HEADER *SratHeader;
1282 ACPI_DMTABLE_INFO *InfoTable;
1285 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSrat,
1287 if (ACPI_FAILURE (Status))
1292 ParentTable = DtPeekSubtable ();
1293 DtInsertSubtable (ParentTable, Subtable);
1297 SubtableStart = *PFieldList;
1298 Status = DtCompileTable (PFieldList, AcpiDmTableInfoSratHdr,
1300 if (ACPI_FAILURE (Status))
1305 ParentTable = DtPeekSubtable ();
1306 DtInsertSubtable (ParentTable, Subtable);
1307 DtPushSubtable (Subtable);
1309 SratHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
1311 switch (SratHeader->Type)
1313 case ACPI_SRAT_TYPE_CPU_AFFINITY:
1314 InfoTable = AcpiDmTableInfoSrat0;
1316 case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
1317 InfoTable = AcpiDmTableInfoSrat1;
1319 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
1320 InfoTable = AcpiDmTableInfoSrat2;
1323 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "SRAT");
1327 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1328 if (ACPI_FAILURE (Status))
1333 ParentTable = DtPeekSubtable ();
1334 DtInsertSubtable (ParentTable, Subtable);
1342 /******************************************************************************
1344 * FUNCTION: DtGetGenericTableInfo
1346 * PARAMETERS: Name - Generic type name
1348 * RETURN: Info entry
1350 * DESCRIPTION: Obtain table info for a generic name entry
1352 *****************************************************************************/
1355 DtGetGenericTableInfo (
1358 ACPI_DMTABLE_INFO *Info;
1367 /* Search info table for name match */
1371 Info = AcpiDmTableInfoGeneric[i];
1372 if (Info->Opcode == ACPI_DMT_EXIT)
1378 if (!ACPI_STRCMP (Name, Info->Name))
1388 /******************************************************************************
1390 * FUNCTION: DtCompileUefi
1392 * PARAMETERS: List - Current field list pointer
1396 * DESCRIPTION: Compile UEFI.
1398 *****************************************************************************/
1405 DT_SUBTABLE *Subtable;
1406 DT_SUBTABLE *ParentTable;
1407 DT_FIELD **PFieldList = (DT_FIELD **) List;
1411 /* Compile the predefined portion of the UEFI table */
1413 Status = DtCompileTable (PFieldList, AcpiDmTableInfoUefi,
1415 if (ACPI_FAILURE (Status))
1420 DataOffset = (UINT16 *) (Subtable->Buffer + 16);
1421 *DataOffset = sizeof (ACPI_TABLE_UEFI);
1423 ParentTable = DtPeekSubtable ();
1424 DtInsertSubtable (ParentTable, Subtable);
1427 * Compile the "generic" portion of the UEFI table. This
1428 * part of the table is not predefined and any of the generic
1429 * operators may be used.
1432 DtCompileGeneric ((void **) PFieldList);
1438 /******************************************************************************
1440 * FUNCTION: DtCompileWdat
1442 * PARAMETERS: List - Current field list pointer
1446 * DESCRIPTION: Compile WDAT.
1448 *****************************************************************************/
1457 Status = DtCompileTwoSubtables (List,
1458 AcpiDmTableInfoWdat, AcpiDmTableInfoWdat0);
1463 /******************************************************************************
1465 * FUNCTION: DtCompileXsdt
1467 * PARAMETERS: List - Current field list pointer
1471 * DESCRIPTION: Compile XSDT.
1473 *****************************************************************************/
1479 DT_SUBTABLE *Subtable;
1480 DT_SUBTABLE *ParentTable;
1481 DT_FIELD *FieldList = *(DT_FIELD **) List;
1484 ParentTable = DtPeekSubtable ();
1488 DtCompileInteger ((UINT8 *) &Address, FieldList, 8, DT_NON_ZERO);
1490 DtCreateSubtable ((UINT8 *) &Address, 8, &Subtable);
1491 DtInsertSubtable (ParentTable, Subtable);
1492 FieldList = FieldList->Next;
1499 /******************************************************************************
1501 * FUNCTION: DtCompileGeneric
1503 * PARAMETERS: List - Current field list pointer
1507 * DESCRIPTION: Compile generic unknown table.
1509 *****************************************************************************/
1516 DT_SUBTABLE *Subtable;
1517 DT_SUBTABLE *ParentTable;
1518 DT_FIELD **PFieldList = (DT_FIELD **) List;
1519 ACPI_DMTABLE_INFO *Info;
1522 ParentTable = DtPeekSubtable ();
1525 * Compile the "generic" portion of the table. This
1526 * part of the table is not predefined and any of the generic
1527 * operators may be used.
1530 /* Find any and all labels in the entire generic portion */
1532 DtDetectAllLabels (*PFieldList);
1534 /* Now we can actually compile the parse tree */
1538 Info = DtGetGenericTableInfo ((*PFieldList)->Name);
1541 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
1542 (*PFieldList)->Name);
1543 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
1544 (*PFieldList), MsgBuffer);
1546 *PFieldList = (*PFieldList)->Next;
1550 Status = DtCompileTable (PFieldList, Info,
1552 if (ACPI_SUCCESS (Status))
1554 DtInsertSubtable (ParentTable, Subtable);
1558 *PFieldList = (*PFieldList)->Next;
1560 if (Status == AE_NOT_FOUND)
1562 sprintf (MsgBuffer, "Generic data type \"%s\" not found",
1563 (*PFieldList)->Name);
1564 DtNameError (ASL_ERROR, ASL_MSG_INVALID_FIELD_NAME,
1565 (*PFieldList), MsgBuffer);