1 /******************************************************************************
3 * Module Name: dttable1.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 A-I */
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 ("dttable1")
53 static ACPI_DMTABLE_INFO TableInfoAsfAddress[] =
55 {ACPI_DMT_BUFFER, 0, "Addresses", 0},
56 {ACPI_DMT_EXIT, 0, NULL, 0}
59 static ACPI_DMTABLE_INFO TableInfoDmarPciPath[] =
61 {ACPI_DMT_PCI_PATH, 0, "PCI Path", 0},
62 {ACPI_DMT_EXIT, 0, NULL, 0}
66 /******************************************************************************
68 * FUNCTION: DtCompileAsf
70 * PARAMETERS: List - Current field list pointer
74 * DESCRIPTION: Compile ASF!.
76 *****************************************************************************/
82 ACPI_ASF_INFO *AsfTable;
83 DT_SUBTABLE *Subtable;
84 DT_SUBTABLE *ParentTable;
85 ACPI_DMTABLE_INFO *InfoTable;
86 ACPI_DMTABLE_INFO *DataInfoTable = NULL;
90 DT_FIELD **PFieldList = (DT_FIELD **) List;
91 DT_FIELD *SubtableStart;
96 SubtableStart = *PFieldList;
97 Status = DtCompileTable (PFieldList, AcpiDmTableInfoAsfHdr,
99 if (ACPI_FAILURE (Status))
104 ParentTable = DtPeekSubtable ();
105 DtInsertSubtable (ParentTable, Subtable);
106 DtPushSubtable (Subtable);
108 AsfTable = ACPI_CAST_PTR (ACPI_ASF_INFO, Subtable->Buffer);
110 switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
112 case ACPI_ASF_TYPE_INFO:
114 InfoTable = AcpiDmTableInfoAsf0;
117 case ACPI_ASF_TYPE_ALERT:
119 InfoTable = AcpiDmTableInfoAsf1;
122 case ACPI_ASF_TYPE_CONTROL:
124 InfoTable = AcpiDmTableInfoAsf2;
127 case ACPI_ASF_TYPE_BOOT:
129 InfoTable = AcpiDmTableInfoAsf3;
132 case ACPI_ASF_TYPE_ADDRESS:
134 InfoTable = AcpiDmTableInfoAsf4;
139 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
143 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
144 if (ACPI_FAILURE (Status))
149 ParentTable = DtPeekSubtable ();
150 DtInsertSubtable (ParentTable, Subtable);
152 switch (AsfTable->Header.Type & 0x7F) /* Mask off top bit */
154 case ACPI_ASF_TYPE_INFO:
156 DataInfoTable = NULL;
159 case ACPI_ASF_TYPE_ALERT:
161 DataInfoTable = AcpiDmTableInfoAsf1a;
162 DataCount = ACPI_CAST_PTR (ACPI_ASF_ALERT,
163 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
164 sizeof (ACPI_ASF_HEADER)))->Alerts;
167 case ACPI_ASF_TYPE_CONTROL:
169 DataInfoTable = AcpiDmTableInfoAsf2a;
170 DataCount = ACPI_CAST_PTR (ACPI_ASF_REMOTE,
171 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
172 sizeof (ACPI_ASF_HEADER)))->Controls;
175 case ACPI_ASF_TYPE_BOOT:
177 DataInfoTable = NULL;
180 case ACPI_ASF_TYPE_ADDRESS:
182 DataInfoTable = TableInfoAsfAddress;
183 DataCount = ACPI_CAST_PTR (ACPI_ASF_ADDRESS,
184 ACPI_SUB_PTR (UINT8, Subtable->Buffer,
185 sizeof (ACPI_ASF_HEADER)))->Devices;
190 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "ASF!");
196 switch (AsfTable->Header.Type & 0x7F)
198 case ACPI_ASF_TYPE_ADDRESS:
200 while (DataCount > 0)
202 Status = DtCompileTable (PFieldList, DataInfoTable,
204 if (ACPI_FAILURE (Status))
209 DtInsertSubtable (ParentTable, Subtable);
210 DataCount = DataCount - Subtable->Length;
216 for (i = 0; i < DataCount; i++)
218 Status = DtCompileTable (PFieldList, DataInfoTable,
220 if (ACPI_FAILURE (Status))
225 DtInsertSubtable (ParentTable, Subtable);
238 /******************************************************************************
240 * FUNCTION: DtCompileCpep
242 * PARAMETERS: List - Current field list pointer
246 * DESCRIPTION: Compile CPEP.
248 *****************************************************************************/
257 Status = DtCompileTwoSubtables (List,
258 AcpiDmTableInfoCpep, AcpiDmTableInfoCpep0);
263 /******************************************************************************
265 * FUNCTION: DtCompileCsrt
267 * PARAMETERS: List - Current field list pointer
271 * DESCRIPTION: Compile CSRT.
273 *****************************************************************************/
279 ACPI_STATUS Status = AE_OK;
280 DT_SUBTABLE *Subtable;
281 DT_SUBTABLE *ParentTable;
282 DT_FIELD **PFieldList = (DT_FIELD **) List;
283 UINT32 DescriptorCount;
287 /* Subtables (Resource Groups) */
289 ParentTable = DtPeekSubtable ();
292 /* Resource group subtable */
294 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt0,
296 if (ACPI_FAILURE (Status))
301 /* Compute the number of resource descriptors */
304 (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
305 Subtable->Buffer))->Length -
306 (ACPI_CAST_PTR (ACPI_CSRT_GROUP,
307 Subtable->Buffer))->SharedInfoLength -
308 sizeof (ACPI_CSRT_GROUP);
310 DescriptorCount = (GroupLength /
311 sizeof (ACPI_CSRT_DESCRIPTOR));
313 DtInsertSubtable (ParentTable, Subtable);
314 DtPushSubtable (Subtable);
315 ParentTable = DtPeekSubtable ();
317 /* Shared info subtable (One per resource group) */
319 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt1,
321 if (ACPI_FAILURE (Status))
326 DtInsertSubtable (ParentTable, Subtable);
328 /* Sub-Subtables (Resource Descriptors) */
330 while (*PFieldList && DescriptorCount)
333 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2,
335 if (ACPI_FAILURE (Status))
340 DtInsertSubtable (ParentTable, Subtable);
342 DtPushSubtable (Subtable);
343 ParentTable = DtPeekSubtable ();
346 Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2a,
348 if (ACPI_FAILURE (Status))
354 DtInsertSubtable (ParentTable, Subtable);
359 ParentTable = DtPeekSubtable ();
364 ParentTable = DtPeekSubtable ();
371 /******************************************************************************
373 * FUNCTION: DtCompileDbg2
375 * PARAMETERS: List - Current field list pointer
379 * DESCRIPTION: Compile DBG2.
381 *****************************************************************************/
388 DT_SUBTABLE *Subtable;
389 DT_SUBTABLE *ParentTable;
390 DT_FIELD **PFieldList = (DT_FIELD **) List;
391 UINT32 SubtableCount;
392 ACPI_DBG2_HEADER *Dbg2Header;
393 ACPI_DBG2_DEVICE *DeviceInfo;
394 UINT16 CurrentOffset;
400 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2, &Subtable, TRUE);
401 if (ACPI_FAILURE (Status))
406 ParentTable = DtPeekSubtable ();
407 DtInsertSubtable (ParentTable, Subtable);
409 /* Main table fields */
411 Dbg2Header = ACPI_CAST_PTR (ACPI_DBG2_HEADER, Subtable->Buffer);
412 Dbg2Header->InfoOffset = sizeof (ACPI_TABLE_HEADER) + ACPI_PTR_DIFF (
413 ACPI_ADD_PTR (UINT8, Dbg2Header, sizeof (ACPI_DBG2_HEADER)), Dbg2Header);
415 SubtableCount = Dbg2Header->InfoCount;
416 DtPushSubtable (Subtable);
418 /* Process all Device Information subtables (Count = InfoCount) */
420 while (*PFieldList && SubtableCount)
422 /* Subtable: Debug Device Information */
424 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Device,
426 if (ACPI_FAILURE (Status))
431 DeviceInfo = ACPI_CAST_PTR (ACPI_DBG2_DEVICE, Subtable->Buffer);
432 CurrentOffset = (UINT16) sizeof (ACPI_DBG2_DEVICE);
434 ParentTable = DtPeekSubtable ();
435 DtInsertSubtable (ParentTable, Subtable);
436 DtPushSubtable (Subtable);
438 ParentTable = DtPeekSubtable ();
440 /* BaseAddressRegister GAS array (Required, size is RegisterCount) */
442 DeviceInfo->BaseAddressOffset = CurrentOffset;
443 for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
445 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Addr,
447 if (ACPI_FAILURE (Status))
452 CurrentOffset += (UINT16) sizeof (ACPI_GENERIC_ADDRESS);
453 DtInsertSubtable (ParentTable, Subtable);
456 /* AddressSize array (Required, size = RegisterCount) */
458 DeviceInfo->AddressSizeOffset = CurrentOffset;
459 for (i = 0; *PFieldList && (i < DeviceInfo->RegisterCount); i++)
461 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Size,
463 if (ACPI_FAILURE (Status))
468 CurrentOffset += (UINT16) sizeof (UINT32);
469 DtInsertSubtable (ParentTable, Subtable);
472 /* NamespaceString device identifier (Required, size = NamePathLength) */
474 DeviceInfo->NamepathOffset = CurrentOffset;
475 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2Name,
477 if (ACPI_FAILURE (Status))
482 /* Update the device info header */
484 DeviceInfo->NamepathLength = (UINT16) Subtable->Length;
485 CurrentOffset += (UINT16) DeviceInfo->NamepathLength;
486 DtInsertSubtable (ParentTable, Subtable);
488 /* OemData - Variable-length data (Optional, size = OemDataLength) */
490 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDbg2OemData,
492 if (ACPI_FAILURE (Status))
497 /* Update the device info header (zeros if no OEM data present) */
499 DeviceInfo->OemDataOffset = 0;
500 DeviceInfo->OemDataLength = 0;
502 /* Optional subtable (OemData) */
504 if (Subtable && Subtable->Length)
506 DeviceInfo->OemDataOffset = CurrentOffset;
507 DeviceInfo->OemDataLength = (UINT16) Subtable->Length;
509 DtInsertSubtable (ParentTable, Subtable);
513 DtPopSubtable (); /* Get next Device Information subtable */
521 /******************************************************************************
523 * FUNCTION: DtCompileDmar
525 * PARAMETERS: List - Current field list pointer
529 * DESCRIPTION: Compile DMAR.
531 *****************************************************************************/
538 DT_SUBTABLE *Subtable;
539 DT_SUBTABLE *ParentTable;
540 DT_FIELD **PFieldList = (DT_FIELD **) List;
541 DT_FIELD *SubtableStart;
542 ACPI_DMTABLE_INFO *InfoTable;
543 ACPI_DMAR_HEADER *DmarHeader;
544 ACPI_DMAR_DEVICE_SCOPE *DmarDeviceScope;
545 UINT32 DeviceScopeLength;
546 UINT32 PciPathLength;
549 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmar, &Subtable, TRUE);
550 if (ACPI_FAILURE (Status))
555 ParentTable = DtPeekSubtable ();
556 DtInsertSubtable (ParentTable, Subtable);
557 DtPushSubtable (Subtable);
563 SubtableStart = *PFieldList;
564 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarHdr,
566 if (ACPI_FAILURE (Status))
571 ParentTable = DtPeekSubtable ();
572 DtInsertSubtable (ParentTable, Subtable);
573 DtPushSubtable (Subtable);
575 DmarHeader = ACPI_CAST_PTR (ACPI_DMAR_HEADER, Subtable->Buffer);
577 switch (DmarHeader->Type)
579 case ACPI_DMAR_TYPE_HARDWARE_UNIT:
581 InfoTable = AcpiDmTableInfoDmar0;
584 case ACPI_DMAR_TYPE_RESERVED_MEMORY:
586 InfoTable = AcpiDmTableInfoDmar1;
589 case ACPI_DMAR_TYPE_ROOT_ATS:
591 InfoTable = AcpiDmTableInfoDmar2;
594 case ACPI_DMAR_TYPE_HARDWARE_AFFINITY:
596 InfoTable = AcpiDmTableInfoDmar3;
599 case ACPI_DMAR_TYPE_NAMESPACE:
601 InfoTable = AcpiDmTableInfoDmar4;
606 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "DMAR");
612 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
613 if (ACPI_FAILURE (Status))
618 ParentTable = DtPeekSubtable ();
619 DtInsertSubtable (ParentTable, Subtable);
622 * Optional Device Scope subtables
624 if ((DmarHeader->Type == ACPI_DMAR_TYPE_HARDWARE_AFFINITY) ||
625 (DmarHeader->Type == ACPI_DMAR_TYPE_NAMESPACE))
627 /* These types do not support device scopes */
633 DtPushSubtable (Subtable);
634 DeviceScopeLength = DmarHeader->Length - Subtable->Length -
636 while (DeviceScopeLength)
638 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDmarScope,
640 if (Status == AE_NOT_FOUND)
645 ParentTable = DtPeekSubtable ();
646 DtInsertSubtable (ParentTable, Subtable);
647 DtPushSubtable (Subtable);
649 DmarDeviceScope = ACPI_CAST_PTR (ACPI_DMAR_DEVICE_SCOPE, Subtable->Buffer);
651 /* Optional PCI Paths */
653 PciPathLength = DmarDeviceScope->Length - Subtable->Length;
654 while (PciPathLength)
656 Status = DtCompileTable (PFieldList, TableInfoDmarPciPath,
658 if (Status == AE_NOT_FOUND)
664 ParentTable = DtPeekSubtable ();
665 DtInsertSubtable (ParentTable, Subtable);
666 PciPathLength -= Subtable->Length;
670 DeviceScopeLength -= DmarDeviceScope->Length;
681 /******************************************************************************
683 * FUNCTION: DtCompileDrtm
685 * PARAMETERS: List - Current field list pointer
689 * DESCRIPTION: Compile DRTM.
691 *****************************************************************************/
698 DT_SUBTABLE *Subtable;
699 DT_SUBTABLE *ParentTable;
700 DT_FIELD **PFieldList = (DT_FIELD **) List;
702 /* ACPI_TABLE_DRTM *Drtm; */
703 ACPI_DRTM_VTABLE_LIST *DrtmVtl;
704 ACPI_DRTM_RESOURCE_LIST *DrtmRl;
705 /* ACPI_DRTM_DPS_ID *DrtmDps; */
708 ParentTable = DtPeekSubtable ();
710 /* Compile DRTM header */
712 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm,
714 if (ACPI_FAILURE (Status))
718 DtInsertSubtable (ParentTable, Subtable);
721 * Using ACPI_SUB_PTR, We needn't define a seperate structure. Care
722 * should be taken to avoid accessing ACPI_TABLE_HADER fields.
725 Drtm = ACPI_SUB_PTR (ACPI_TABLE_DRTM,
726 Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
730 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0,
732 if (ACPI_FAILURE (Status))
737 DtInsertSubtable (ParentTable, Subtable);
738 DrtmVtl = ACPI_CAST_PTR (ACPI_DRTM_VTABLE_LIST, Subtable->Buffer);
740 DtPushSubtable (Subtable);
741 ParentTable = DtPeekSubtable ();
746 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm0a,
748 if (ACPI_FAILURE (Status))
756 DtInsertSubtable (ParentTable, Subtable);
760 DrtmVtl->ValidatedTableCount = Count;
762 ParentTable = DtPeekSubtable ();
766 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1,
768 if (ACPI_FAILURE (Status))
773 DtInsertSubtable (ParentTable, Subtable);
774 DrtmRl = ACPI_CAST_PTR (ACPI_DRTM_RESOURCE_LIST, Subtable->Buffer);
776 DtPushSubtable (Subtable);
777 ParentTable = DtPeekSubtable ();
782 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm1a,
784 if (ACPI_FAILURE (Status))
794 DtInsertSubtable (ParentTable, Subtable);
798 DrtmRl->ResourceCount = Count;
800 ParentTable = DtPeekSubtable ();
804 Status = DtCompileTable (PFieldList, AcpiDmTableInfoDrtm2,
806 if (ACPI_FAILURE (Status))
810 DtInsertSubtable (ParentTable, Subtable);
811 /* DrtmDps = ACPI_CAST_PTR (ACPI_DRTM_DPS_ID, Subtable->Buffer);*/
818 /******************************************************************************
820 * FUNCTION: DtCompileEinj
822 * PARAMETERS: List - Current field list pointer
826 * DESCRIPTION: Compile EINJ.
828 *****************************************************************************/
837 Status = DtCompileTwoSubtables (List,
838 AcpiDmTableInfoEinj, AcpiDmTableInfoEinj0);
843 /******************************************************************************
845 * FUNCTION: DtCompileErst
847 * PARAMETERS: List - Current field list pointer
851 * DESCRIPTION: Compile ERST.
853 *****************************************************************************/
862 Status = DtCompileTwoSubtables (List,
863 AcpiDmTableInfoErst, AcpiDmTableInfoEinj0);
868 /******************************************************************************
870 * FUNCTION: DtCompileGtdt
872 * PARAMETERS: List - Current field list pointer
876 * DESCRIPTION: Compile GTDT.
878 *****************************************************************************/
885 DT_SUBTABLE *Subtable;
886 DT_SUBTABLE *ParentTable;
887 DT_FIELD **PFieldList = (DT_FIELD **) List;
888 DT_FIELD *SubtableStart;
889 ACPI_SUBTABLE_HEADER *GtdtHeader;
890 ACPI_DMTABLE_INFO *InfoTable;
894 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt,
896 if (ACPI_FAILURE (Status))
901 ParentTable = DtPeekSubtable ();
902 DtInsertSubtable (ParentTable, Subtable);
906 SubtableStart = *PFieldList;
907 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdtHdr,
909 if (ACPI_FAILURE (Status))
914 ParentTable = DtPeekSubtable ();
915 DtInsertSubtable (ParentTable, Subtable);
916 DtPushSubtable (Subtable);
918 GtdtHeader = ACPI_CAST_PTR (ACPI_SUBTABLE_HEADER, Subtable->Buffer);
920 switch (GtdtHeader->Type)
922 case ACPI_GTDT_TYPE_TIMER_BLOCK:
924 InfoTable = AcpiDmTableInfoGtdt0;
927 case ACPI_GTDT_TYPE_WATCHDOG:
929 InfoTable = AcpiDmTableInfoGtdt1;
934 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "GTDT");
938 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
939 if (ACPI_FAILURE (Status))
944 ParentTable = DtPeekSubtable ();
945 DtInsertSubtable (ParentTable, Subtable);
948 * Additional GT block subtable data
951 switch (GtdtHeader->Type)
953 case ACPI_GTDT_TYPE_TIMER_BLOCK:
955 DtPushSubtable (Subtable);
956 ParentTable = DtPeekSubtable ();
958 GtCount = (ACPI_CAST_PTR (ACPI_GTDT_TIMER_BLOCK,
959 Subtable->Buffer - sizeof(ACPI_GTDT_HEADER)))->TimerCount;
963 Status = DtCompileTable (PFieldList, AcpiDmTableInfoGtdt0a,
965 if (ACPI_FAILURE (Status))
970 DtInsertSubtable (ParentTable, Subtable);
989 /******************************************************************************
991 * FUNCTION: DtCompileFpdt
993 * PARAMETERS: List - Current field list pointer
997 * DESCRIPTION: Compile FPDT.
999 *****************************************************************************/
1006 ACPI_FPDT_HEADER *FpdtHeader;
1007 DT_SUBTABLE *Subtable;
1008 DT_SUBTABLE *ParentTable;
1009 ACPI_DMTABLE_INFO *InfoTable;
1010 DT_FIELD **PFieldList = (DT_FIELD **) List;
1011 DT_FIELD *SubtableStart;
1016 SubtableStart = *PFieldList;
1017 Status = DtCompileTable (PFieldList, AcpiDmTableInfoFpdtHdr,
1019 if (ACPI_FAILURE (Status))
1024 ParentTable = DtPeekSubtable ();
1025 DtInsertSubtable (ParentTable, Subtable);
1026 DtPushSubtable (Subtable);
1028 FpdtHeader = ACPI_CAST_PTR (ACPI_FPDT_HEADER, Subtable->Buffer);
1030 switch (FpdtHeader->Type)
1032 case ACPI_FPDT_TYPE_BOOT:
1034 InfoTable = AcpiDmTableInfoFpdt0;
1037 case ACPI_FPDT_TYPE_S3PERF:
1039 InfoTable = AcpiDmTableInfoFpdt1;
1044 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "FPDT");
1049 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1050 if (ACPI_FAILURE (Status))
1055 ParentTable = DtPeekSubtable ();
1056 DtInsertSubtable (ParentTable, Subtable);
1064 /******************************************************************************
1066 * FUNCTION: DtCompileHest
1068 * PARAMETERS: List - Current field list pointer
1072 * DESCRIPTION: Compile HEST.
1074 *****************************************************************************/
1081 DT_SUBTABLE *Subtable;
1082 DT_SUBTABLE *ParentTable;
1083 DT_FIELD **PFieldList = (DT_FIELD **) List;
1084 DT_FIELD *SubtableStart;
1085 ACPI_DMTABLE_INFO *InfoTable;
1090 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHest,
1092 if (ACPI_FAILURE (Status))
1097 ParentTable = DtPeekSubtable ();
1098 DtInsertSubtable (ParentTable, Subtable);
1102 /* Get subtable type */
1104 SubtableStart = *PFieldList;
1105 DtCompileInteger ((UINT8 *) &Type, *PFieldList, 2, 0);
1109 case ACPI_HEST_TYPE_IA32_CHECK:
1111 InfoTable = AcpiDmTableInfoHest0;
1114 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1116 InfoTable = AcpiDmTableInfoHest1;
1119 case ACPI_HEST_TYPE_IA32_NMI:
1121 InfoTable = AcpiDmTableInfoHest2;
1124 case ACPI_HEST_TYPE_AER_ROOT_PORT:
1126 InfoTable = AcpiDmTableInfoHest6;
1129 case ACPI_HEST_TYPE_AER_ENDPOINT:
1131 InfoTable = AcpiDmTableInfoHest7;
1134 case ACPI_HEST_TYPE_AER_BRIDGE:
1136 InfoTable = AcpiDmTableInfoHest8;
1139 case ACPI_HEST_TYPE_GENERIC_ERROR:
1141 InfoTable = AcpiDmTableInfoHest9;
1146 /* Cannot continue on unknown type */
1148 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "HEST");
1152 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1153 if (ACPI_FAILURE (Status))
1158 DtInsertSubtable (ParentTable, Subtable);
1161 * Additional subtable data - IA32 Error Bank(s)
1166 case ACPI_HEST_TYPE_IA32_CHECK:
1168 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_MACHINE_CHECK,
1169 Subtable->Buffer))->NumHardwareBanks;
1172 case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
1174 BankCount = (ACPI_CAST_PTR (ACPI_HEST_IA_CORRECTED,
1175 Subtable->Buffer))->NumHardwareBanks;
1185 Status = DtCompileTable (PFieldList, AcpiDmTableInfoHestBank,
1187 if (ACPI_FAILURE (Status))
1192 DtInsertSubtable (ParentTable, Subtable);
1201 /******************************************************************************
1203 * FUNCTION: DtCompileIort
1205 * PARAMETERS: List - Current field list pointer
1209 * DESCRIPTION: Compile IORT.
1211 *****************************************************************************/
1218 DT_SUBTABLE *Subtable;
1219 DT_SUBTABLE *ParentTable;
1220 DT_FIELD **PFieldList = (DT_FIELD **) List;
1221 DT_FIELD *SubtableStart;
1222 ACPI_TABLE_IORT *Iort;
1223 ACPI_IORT_NODE *IortNode;
1224 ACPI_IORT_ITS_GROUP *IortItsGroup;
1225 ACPI_IORT_SMMU *IortSmmu;
1228 UINT32 IdMappingNumber;
1230 UINT32 ContextIrptNumber;
1231 UINT32 PmuIrptNumber;
1232 UINT32 PaddingLength;
1235 ParentTable = DtPeekSubtable ();
1237 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort,
1239 if (ACPI_FAILURE (Status))
1243 DtInsertSubtable (ParentTable, Subtable);
1246 * Using ACPI_SUB_PTR, We needn't define a separate structure. Care
1247 * should be taken to avoid accessing ACPI_TABLE_HEADER fields.
1249 Iort = ACPI_SUB_PTR (ACPI_TABLE_IORT,
1250 Subtable->Buffer, sizeof (ACPI_TABLE_HEADER));
1253 * OptionalPadding - Variable-length data
1254 * (Optional, size = OffsetToNodes - sizeof (ACPI_TABLE_IORT))
1255 * Optionally allows the generic data types to be used for filling
1258 Iort->NodeOffset = sizeof (ACPI_TABLE_IORT);
1259 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortPad,
1261 if (ACPI_FAILURE (Status))
1267 DtInsertSubtable (ParentTable, Subtable);
1268 Iort->NodeOffset += Subtable->Length;
1272 Status = DtCompileGeneric (ACPI_CAST_PTR (void *, PFieldList),
1273 AcpiDmTableInfoIortHdr[0].Name, &PaddingLength);
1274 if (ACPI_FAILURE (Status))
1278 Iort->NodeOffset += PaddingLength;
1284 SubtableStart = *PFieldList;
1285 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortHdr,
1287 if (ACPI_FAILURE (Status))
1292 DtInsertSubtable (ParentTable, Subtable);
1293 IortNode = ACPI_CAST_PTR (ACPI_IORT_NODE, Subtable->Buffer);
1294 NodeLength = ACPI_OFFSET (ACPI_IORT_NODE, NodeData);
1296 DtPushSubtable (Subtable);
1297 ParentTable = DtPeekSubtable ();
1299 switch (IortNode->Type)
1301 case ACPI_IORT_NODE_ITS_GROUP:
1303 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0,
1305 if (ACPI_FAILURE (Status))
1310 DtInsertSubtable (ParentTable, Subtable);
1311 IortItsGroup = ACPI_CAST_PTR (ACPI_IORT_ITS_GROUP, Subtable->Buffer);
1312 NodeLength += Subtable->Length;
1317 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort0a,
1319 if (ACPI_FAILURE (Status))
1328 DtInsertSubtable (ParentTable, Subtable);
1329 NodeLength += Subtable->Length;
1333 IortItsGroup->ItsCount = ItsNumber;
1336 case ACPI_IORT_NODE_NAMED_COMPONENT:
1338 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1,
1340 if (ACPI_FAILURE (Status))
1345 DtInsertSubtable (ParentTable, Subtable);
1346 NodeLength += Subtable->Length;
1349 * Padding - Variable-length data
1350 * Optionally allows the offset of the ID mappings to be used
1351 * for filling this field.
1353 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort1a,
1355 if (ACPI_FAILURE (Status))
1362 DtInsertSubtable (ParentTable, Subtable);
1363 NodeLength += Subtable->Length;
1367 if (NodeLength > IortNode->MappingOffset)
1369 return (AE_BAD_DATA);
1372 if (NodeLength < IortNode->MappingOffset)
1374 Status = DtCompilePadding (
1375 IortNode->MappingOffset - NodeLength,
1377 if (ACPI_FAILURE (Status))
1382 DtInsertSubtable (ParentTable, Subtable);
1383 NodeLength = IortNode->MappingOffset;
1388 case ACPI_IORT_NODE_PCI_ROOT_COMPLEX:
1390 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort2,
1392 if (ACPI_FAILURE (Status))
1397 DtInsertSubtable (ParentTable, Subtable);
1398 NodeLength += Subtable->Length;
1401 case ACPI_IORT_NODE_SMMU:
1403 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3,
1405 if (ACPI_FAILURE (Status))
1410 DtInsertSubtable (ParentTable, Subtable);
1411 IortSmmu = ACPI_CAST_PTR (ACPI_IORT_SMMU, Subtable->Buffer);
1412 NodeLength += Subtable->Length;
1414 /* Compile global interrupt array */
1416 IortSmmu->GlobalInterruptOffset = NodeLength;
1417 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3a,
1419 if (ACPI_FAILURE (Status))
1424 DtInsertSubtable (ParentTable, Subtable);
1425 NodeLength += Subtable->Length;
1427 /* Compile context interrupt array */
1429 ContextIrptNumber = 0;
1430 IortSmmu->ContextInterruptOffset = NodeLength;
1433 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3b,
1435 if (ACPI_FAILURE (Status))
1445 DtInsertSubtable (ParentTable, Subtable);
1446 NodeLength += Subtable->Length;
1447 ContextIrptNumber++;
1450 IortSmmu->ContextInterruptCount = ContextIrptNumber;
1452 /* Compile PMU interrupt array */
1455 IortSmmu->PmuInterruptOffset = NodeLength;
1458 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort3c,
1460 if (ACPI_FAILURE (Status))
1470 DtInsertSubtable (ParentTable, Subtable);
1471 NodeLength += Subtable->Length;
1475 IortSmmu->PmuInterruptCount = PmuIrptNumber;
1478 case ACPI_IORT_NODE_SMMU_V3:
1480 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIort4,
1482 if (ACPI_FAILURE (Status))
1487 DtInsertSubtable (ParentTable, Subtable);
1488 NodeLength += Subtable->Length;
1493 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IORT");
1497 /* Compile Array of ID mappings */
1499 IortNode->MappingOffset = NodeLength;
1500 IdMappingNumber = 0;
1503 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIortMap,
1505 if (ACPI_FAILURE (Status))
1515 DtInsertSubtable (ParentTable, Subtable);
1516 NodeLength += sizeof (ACPI_IORT_ID_MAPPING);
1520 IortNode->MappingCount = IdMappingNumber;
1523 * Node length can be determined by DT_LENGTH option
1524 * IortNode->Length = NodeLength;
1527 ParentTable = DtPeekSubtable ();
1531 Iort->NodeCount = NodeNumber;
1536 /******************************************************************************
1538 * FUNCTION: DtCompileIvrs
1540 * PARAMETERS: List - Current field list pointer
1544 * DESCRIPTION: Compile IVRS.
1546 *****************************************************************************/
1553 DT_SUBTABLE *Subtable;
1554 DT_SUBTABLE *ParentTable;
1555 DT_FIELD **PFieldList = (DT_FIELD **) List;
1556 DT_FIELD *SubtableStart;
1557 ACPI_DMTABLE_INFO *InfoTable;
1558 ACPI_IVRS_HEADER *IvrsHeader;
1562 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrs,
1564 if (ACPI_FAILURE (Status))
1569 ParentTable = DtPeekSubtable ();
1570 DtInsertSubtable (ParentTable, Subtable);
1574 SubtableStart = *PFieldList;
1575 Status = DtCompileTable (PFieldList, AcpiDmTableInfoIvrsHdr,
1577 if (ACPI_FAILURE (Status))
1582 ParentTable = DtPeekSubtable ();
1583 DtInsertSubtable (ParentTable, Subtable);
1584 DtPushSubtable (Subtable);
1586 IvrsHeader = ACPI_CAST_PTR (ACPI_IVRS_HEADER, Subtable->Buffer);
1588 switch (IvrsHeader->Type)
1590 case ACPI_IVRS_TYPE_HARDWARE:
1592 InfoTable = AcpiDmTableInfoIvrs0;
1595 case ACPI_IVRS_TYPE_MEMORY1:
1596 case ACPI_IVRS_TYPE_MEMORY2:
1597 case ACPI_IVRS_TYPE_MEMORY3:
1599 InfoTable = AcpiDmTableInfoIvrs1;
1604 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart, "IVRS");
1608 Status = DtCompileTable (PFieldList, InfoTable, &Subtable, TRUE);
1609 if (ACPI_FAILURE (Status))
1614 ParentTable = DtPeekSubtable ();
1615 DtInsertSubtable (ParentTable, Subtable);
1617 if (IvrsHeader->Type == ACPI_IVRS_TYPE_HARDWARE)
1619 while (*PFieldList &&
1620 !strcmp ((*PFieldList)->Name, "Entry Type"))
1622 SubtableStart = *PFieldList;
1623 DtCompileInteger (&EntryType, *PFieldList, 1, 0);
1627 /* 4-byte device entries */
1629 case ACPI_IVRS_TYPE_PAD4:
1630 case ACPI_IVRS_TYPE_ALL:
1631 case ACPI_IVRS_TYPE_SELECT:
1632 case ACPI_IVRS_TYPE_START:
1633 case ACPI_IVRS_TYPE_END:
1635 InfoTable = AcpiDmTableInfoIvrs4;
1638 /* 8-byte entries, type A */
1640 case ACPI_IVRS_TYPE_ALIAS_SELECT:
1641 case ACPI_IVRS_TYPE_ALIAS_START:
1643 InfoTable = AcpiDmTableInfoIvrs8a;
1646 /* 8-byte entries, type B */
1648 case ACPI_IVRS_TYPE_PAD8:
1649 case ACPI_IVRS_TYPE_EXT_SELECT:
1650 case ACPI_IVRS_TYPE_EXT_START:
1652 InfoTable = AcpiDmTableInfoIvrs8b;
1655 /* 8-byte entries, type C */
1657 case ACPI_IVRS_TYPE_SPECIAL:
1659 InfoTable = AcpiDmTableInfoIvrs8c;
1664 DtFatal (ASL_MSG_UNKNOWN_SUBTABLE, SubtableStart,
1665 "IVRS Device Entry");
1669 Status = DtCompileTable (PFieldList, InfoTable,
1671 if (ACPI_FAILURE (Status))
1676 DtInsertSubtable (ParentTable, Subtable);