4 Copyright (c) 2016 - 2022, Arm Limited. All rights reserved.
5 SPDX-License-Identifier: BSD-2-Clause-Patent
8 - IO Remapping Table, Platform Design Document, Revision E.d, Feb 2022
9 (https://developer.arm.com/documentation/den0049/)
16 #include <IndustryStandard/IoRemappingTable.h>
17 #include <Library/PrintLib.h>
18 #include <Library/UefiLib.h>
19 #include "AcpiParser.h"
20 #include "AcpiTableParser.h"
21 #include "AcpiViewConfig.h"
24 STATIC ACPI_DESCRIPTION_HEADER_INFO AcpiHdrInfo
;
26 STATIC CONST UINT32
*IortNodeCount
;
27 STATIC CONST UINT32
*IortNodeOffset
;
29 STATIC CONST UINT8
*IortNodeType
;
30 STATIC CONST UINT16
*IortNodeLength
;
31 STATIC CONST UINT8
*IortNodeRevision
;
32 STATIC CONST UINT32
*IortIdMappingCount
;
33 STATIC CONST UINT32
*IortIdMappingOffset
;
35 STATIC CONST UINT32
*InterruptContextCount
;
36 STATIC CONST UINT32
*InterruptContextOffset
;
37 STATIC CONST UINT32
*PmuInterruptCount
;
38 STATIC CONST UINT32
*PmuInterruptOffset
;
40 STATIC CONST UINT32
*ItsCount
;
42 STATIC CONST UINT32
*RmrMemDescCount
;
43 STATIC CONST UINT32
*RmrMemDescOffset
;
46 This function validates the ID Mapping array count for the ITS node.
48 @param [in] Ptr Pointer to the start of the field data.
49 @param [in] Context Pointer to context specific information e.g. this
50 could be a pointer to the ACPI table header.
55 ValidateItsIdMappingCount (
60 if (*(UINT32
*)Ptr
!= 0) {
61 IncrementErrorCount ();
62 Print (L
"\nERROR: IORT ID Mapping count must be zero.");
67 This function validates the ID Mapping array count for the Performance
68 Monitoring Counter Group (PMCG) node.
70 @param [in] Ptr Pointer to the start of the field data.
71 @param [in] Context Pointer to context specific information e.g. this
72 could be a pointer to the ACPI table header.
77 ValidatePmcgIdMappingCount (
82 if (*(UINT32
*)Ptr
> 1) {
83 IncrementErrorCount ();
84 Print (L
"\nERROR: IORT ID Mapping count must not be greater than 1.");
89 This function validates the ID Mapping array offset for the ITS node.
91 @param [in] Ptr Pointer to the start of the field data.
92 @param [in] Context Pointer to context specific information e.g. this
93 could be a pointer to the ACPI table header.
98 ValidateItsIdArrayReference (
103 if (*(UINT32
*)Ptr
!= 0) {
104 IncrementErrorCount ();
105 Print (L
"\nERROR: IORT ID Mapping offset must be zero.");
110 This function validates that the Physical Range address or length is not zero
113 @param [in] Ptr Pointer to the start of the field data.
114 @param [in] Context Pointer to context specific information e.g. this
115 could be a pointer to the ACPI table header.
120 ValidatePhysicalRange (
127 Value
= *(UINT64
*)Ptr
;
128 if ((Value
== 0) || ((Value
& (SIZE_64KB
- 1)) != 0)) {
129 IncrementErrorCount ();
130 Print (L
"\nERROR: Physical Range must be 64K aligned and cannot be zero.");
135 This function validates that the RMR memory range descriptor count.
137 @param [in] Ptr Pointer to the start of the field data.
138 @param [in] Context Pointer to context specific information e.g. this
139 could be a pointer to the ACPI table header.
144 ValidateRmrMemDescCount (
149 if (*(UINT32
*)Ptr
== 0) {
150 IncrementErrorCount ();
151 Print (L
"\nERROR: Memory Range Descriptor count must be >=1.");
156 Helper Macro for populating the IORT Node header in the ACPI_PARSER array.
158 @param [out] ValidateIdMappingCount Optional pointer to a function for
159 validating the ID Mapping count.
160 @param [out] ValidateIdArrayReference Optional pointer to a function for
161 validating the ID Array reference.
163 #define PARSE_IORT_NODE_HEADER(ValidateIdMappingCount, \
164 ValidateIdArrayReference) \
165 { L"Type", 1, 0, L"%d", NULL, (VOID**)&IortNodeType, NULL, NULL }, \
166 { L"Length", 2, 1, L"%d", NULL, (VOID**)&IortNodeLength, NULL, NULL }, \
167 { L"Revision", 1, 3, L"%d", NULL, (VOID**)&IortNodeRevision, NULL, NULL }, \
168 { L"Identifier", 4, 4, L"0x%x", NULL, NULL, NULL, NULL }, \
169 { L"Number of ID mappings", 4, 8, L"%d", NULL, \
170 (VOID**)&IortIdMappingCount, ValidateIdMappingCount, NULL }, \
171 { L"Reference to ID Array", 4, 12, L"0x%x", NULL, \
172 (VOID**)&IortIdMappingOffset, ValidateIdArrayReference, NULL }
175 An ACPI_PARSER array describing the ACPI IORT Table
177 STATIC CONST ACPI_PARSER IortParser
[] = {
178 PARSE_ACPI_HEADER (&AcpiHdrInfo
),
179 { L
"Number of IORT Nodes", 4, 36, L
"%d", NULL
,
180 (VOID
**)&IortNodeCount
, NULL
, NULL
},
181 { L
"Offset to Array of IORT Nodes",4, 40, L
"0x%x", NULL
,
182 (VOID
**)&IortNodeOffset
, NULL
, NULL
},
183 { L
"Reserved", 4, 44, L
"0x%x", NULL
,NULL
,NULL
, NULL
}
187 An ACPI_PARSER array describing the IORT node header structure.
189 STATIC CONST ACPI_PARSER IortNodeHeaderParser
[] = {
190 PARSE_IORT_NODE_HEADER (NULL
, NULL
)
194 An ACPI_PARSER array describing the IORT SMMUv1/2 node.
196 STATIC CONST ACPI_PARSER IortNodeSmmuV1V2Parser
[] = {
197 PARSE_IORT_NODE_HEADER (NULL
, NULL
),
198 { L
"Base Address", 8, 16, L
"0x%lx", NULL
, NULL
, NULL
, NULL
},
199 { L
"Span", 8, 24, L
"0x%lx", NULL
, NULL
, NULL
, NULL
},
200 { L
"Model", 4, 32, L
"%d", NULL
, NULL
, NULL
, NULL
},
201 { L
"Flags", 4, 36, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
202 { L
"Global Interrupt Array Ref", 4, 40, L
"0x%x", NULL
, NULL
, NULL
,
204 { L
"Number of context interrupts", 4, 44, L
"%d", NULL
,
205 (VOID
**)&InterruptContextCount
, NULL
, NULL
},
206 { L
"Context Interrupt Array Ref", 4, 48, L
"0x%x", NULL
,
207 (VOID
**)&InterruptContextOffset
, NULL
, NULL
},
208 { L
"Number of PMU Interrupts", 4, 52, L
"%d", NULL
,
209 (VOID
**)&PmuInterruptCount
, NULL
, NULL
},
210 { L
"PMU Interrupt Array Ref", 4, 56, L
"0x%x", NULL
,
211 (VOID
**)&PmuInterruptOffset
, NULL
, NULL
},
214 { L
"SMMU_NSgIrpt", 4, 60, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
215 { L
"SMMU_NSgIrpt interrupt flags", 4, 64, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
216 { L
"SMMU_NSgCfgIrpt", 4, 68, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
217 { L
"SMMU_NSgCfgIrpt interrupt flags",4, 72, L
"0x%x", NULL
, NULL
, NULL
, NULL
}
221 An ACPI_PARSER array describing the SMMUv1/2 Node Interrupt Array.
223 STATIC CONST ACPI_PARSER InterruptArrayParser
[] = {
224 { L
"Interrupt GSIV", 4, 0, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
225 { L
"Flags", 4, 4, L
"0x%x", NULL
, NULL
, NULL
, NULL
}
229 An ACPI_PARSER array describing the IORT ID Mapping.
231 STATIC CONST ACPI_PARSER IortNodeIdMappingParser
[] = {
232 { L
"Input base", 4, 0, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
233 { L
"Number of IDs", 4, 4, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
234 { L
"Output base", 4, 8, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
235 { L
"Output reference", 4, 12, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
236 { L
"Flags", 4, 16, L
"0x%x", NULL
, NULL
, NULL
, NULL
}
240 An ACPI_PARSER array describing the IORT SMMUv3 node.
242 STATIC CONST ACPI_PARSER IortNodeSmmuV3Parser
[] = {
243 PARSE_IORT_NODE_HEADER (NULL
, NULL
),
244 { L
"Base Address", 8, 16, L
"0x%lx", NULL
, NULL
, NULL
, NULL
},
245 { L
"Flags", 4, 24, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
246 { L
"Reserved", 4, 28, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
247 { L
"VATOS Address", 8, 32, L
"0x%lx", NULL
, NULL
, NULL
, NULL
},
248 { L
"Model", 4, 40, L
"%d", NULL
, NULL
, NULL
, NULL
},
249 { L
"Event", 4, 44, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
250 { L
"PRI", 4, 48, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
251 { L
"GERR", 4, 52, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
252 { L
"Sync", 4, 56, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
253 { L
"Proximity domain", 4, 60, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
254 { L
"Device ID mapping index", 4, 64, L
"%d", NULL
, NULL
, NULL
, NULL
}
258 An ACPI_PARSER array describing the IORT ITS node.
260 STATIC CONST ACPI_PARSER IortNodeItsParser
[] = {
261 PARSE_IORT_NODE_HEADER (
262 ValidateItsIdMappingCount
,
263 ValidateItsIdArrayReference
265 { L
"Number of ITSs", 4,16, L
"%d", NULL
, (VOID
**)&ItsCount
, NULL
}
269 An ACPI_PARSER array describing the ITS ID.
271 STATIC CONST ACPI_PARSER ItsIdParser
[] = {
272 { L
"GIC ITS Identifier", 4, 0, L
"%d", NULL
, NULL
, NULL
}
276 An ACPI_PARSER array describing the IORT Names Component node.
278 STATIC CONST ACPI_PARSER IortNodeNamedComponentParser
[] = {
279 PARSE_IORT_NODE_HEADER (NULL
, NULL
),
280 { L
"Node Flags", 4, 16, L
"%d", NULL
, NULL
, NULL
, NULL
},
281 { L
"Memory access properties",8, 20, L
"0x%lx", NULL
, NULL
, NULL
, NULL
},
282 { L
"Device memory address size limit",1, 28, L
"%d", NULL
, NULL
, NULL
, NULL
}
286 An ACPI_PARSER array describing the IORT Root Complex node.
288 STATIC CONST ACPI_PARSER IortNodeRootComplexParser
[] = {
289 PARSE_IORT_NODE_HEADER (NULL
, NULL
),
290 { L
"Memory access properties",8, 16, L
"0x%lx", NULL
, NULL
, NULL
, NULL
},
291 { L
"ATS Attribute", 4, 24, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
292 { L
"PCI Segment number", 4, 28, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
293 { L
"Memory access size limit",1, 32, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
294 { L
"PASID capabilities", 2, 33, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
295 { L
"Reserved", 1, 35, L
"%x", NULL
, NULL
, NULL
, NULL
},
296 { L
"Flags", 4, 36, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
300 An ACPI_PARSER array describing the IORT PMCG node.
302 STATIC CONST ACPI_PARSER IortNodePmcgParser
[] = {
303 PARSE_IORT_NODE_HEADER (ValidatePmcgIdMappingCount
, NULL
),
304 { L
"Page 0 Base Address", 8, 16, L
"0x%lx", NULL
, NULL
, NULL
, NULL
},
305 { L
"Overflow interrupt GSIV", 4, 24, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
306 { L
"Node reference", 4, 28, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
307 { L
"Page 1 Base Address", 8, 32, L
"0x%lx", NULL
, NULL
, NULL
, NULL
}
311 An ACPI_PARSER array describing the IORT RMR node.
313 STATIC CONST ACPI_PARSER IortNodeRmrParser
[] = {
314 PARSE_IORT_NODE_HEADER (NULL
, NULL
),
315 { L
"Flags", 4, 16, L
"0x%x", NULL
, NULL
, NULL
, NULL
},
316 { L
"Memory Range Desc count", 4, 20, L
"%d", NULL
,
317 (VOID
**)&RmrMemDescCount
, ValidateRmrMemDescCount
,NULL
},
318 { L
"Memory Range Desc Ref", 4, 24, L
"0x%x", NULL
,
319 (VOID
**)&RmrMemDescOffset
, NULL
, NULL
}
323 An ACPI_PARSER array describing the IORT RMR Memory Range Descriptor.
325 STATIC CONST ACPI_PARSER IortNodeRmrMemRangeDescParser
[] = {
326 { L
"Physical Range offset", 8, 0, L
"0x%lx", NULL
, NULL
, ValidatePhysicalRange
,
328 { L
"Physical Range length", 8, 8, L
"0x%lx", NULL
, NULL
, ValidatePhysicalRange
,
330 { L
"Reserved", 4, 16, L
"0x%x", NULL
, NULL
, NULL
, NULL
}
334 This function parses the IORT Node Id Mapping array.
336 @param [in] Ptr Pointer to the start of the ID mapping array.
337 @param [in] Length Length of the buffer.
338 @param [in] MappingCount The ID Mapping count.
342 DumpIortNodeIdMappings (
345 IN UINT32 MappingCount
350 CHAR8 Buffer
[40]; // Used for AsciiName param of ParseAcpi
355 while ((Index
< MappingCount
) &&
364 Offset
+= ParseAcpi (
370 PARSER_PARAMS (IortNodeIdMappingParser
)
377 This function parses the IORT SMMUv1/2 node.
379 @param [in] Ptr Pointer to the start of the buffer.
380 @param [in] Length Length of the buffer.
381 @param [in] MappingCount The ID Mapping count.
382 @param [in] MappingOffset The offset of the ID Mapping array
383 from the start of the IORT table.
387 DumpIortNodeSmmuV1V2 (
390 IN UINT32 MappingCount
,
391 IN UINT32 MappingOffset
396 CHAR8 Buffer
[50]; // Used for AsciiName param of ParseAcpi
401 "SMMUv1 or SMMUv2 Node",
404 PARSER_PARAMS (IortNodeSmmuV1V2Parser
)
407 // Check if the values used to control the parsing logic have been
408 // successfully read.
409 if ((InterruptContextCount
== NULL
) ||
410 (InterruptContextOffset
== NULL
) ||
411 (PmuInterruptCount
== NULL
) ||
412 (PmuInterruptOffset
== NULL
))
414 IncrementErrorCount ();
416 L
"ERROR: Insufficient SMMUv1/2 node length. Length = %d\n",
422 Offset
= *InterruptContextOffset
;
425 while ((Index
< *InterruptContextCount
) &&
431 "Context Interrupts Array [%d]",
434 Offset
+= ParseAcpi (
440 PARSER_PARAMS (InterruptArrayParser
)
445 Offset
= *PmuInterruptOffset
;
448 while ((Index
< *PmuInterruptCount
) &&
454 "PMU Interrupts Array [%d]",
457 Offset
+= ParseAcpi (
463 PARSER_PARAMS (InterruptArrayParser
)
468 DumpIortNodeIdMappings (
470 Length
- MappingOffset
,
476 This function parses the IORT SMMUv3 node.
478 @param [in] Ptr Pointer to the start of the buffer.
479 @param [in] Length Length of the buffer.
480 @param [in] MappingCount The ID Mapping count.
481 @param [in] MappingOffset The offset of the ID Mapping array
482 from the start of the IORT table.
489 IN UINT32 MappingCount
,
490 IN UINT32 MappingOffset
499 PARSER_PARAMS (IortNodeSmmuV3Parser
)
502 DumpIortNodeIdMappings (
504 Length
- MappingOffset
,
510 This function parses the IORT ITS node.
512 @param [in] Ptr Pointer to the start of the buffer.
513 @param [in] Length Length of the buffer.
524 CHAR8 Buffer
[80]; // Used for AsciiName param of ParseAcpi
532 PARSER_PARAMS (IortNodeItsParser
)
535 // Check if the values used to control the parsing logic have been
536 // successfully read.
537 if (ItsCount
== NULL
) {
538 IncrementErrorCount ();
540 L
"ERROR: Insufficient ITS group length. Length = %d.\n",
548 while ((Index
< *ItsCount
) &&
554 "GIC ITS Identifier Array [%d]",
557 Offset
+= ParseAcpi (
563 PARSER_PARAMS (ItsIdParser
)
568 // Note: ITS does not have the ID Mappings Array
572 This function parses the IORT Named Component node.
574 @param [in] Ptr Pointer to the start of the buffer.
575 @param [in] Length Length of the buffer.
576 @param [in] MappingCount The ID Mapping count.
577 @param [in] MappingOffset The offset of the ID Mapping array
578 from the start of the IORT table.
582 DumpIortNodeNamedComponent (
585 IN UINT32 MappingCount
,
586 IN UINT32 MappingOffset
594 "Named Component Node",
597 PARSER_PARAMS (IortNodeNamedComponentParser
)
600 // Estimate the Device Name length
601 PrintFieldName (2, L
"Device Object Name");
603 while ((*(Ptr
+ Offset
) != 0) &&
606 Print (L
"%c", *(Ptr
+ Offset
));
612 DumpIortNodeIdMappings (
614 Length
- MappingOffset
,
620 This function parses the IORT Root Complex node.
622 @param [in] Ptr Pointer to the start of the buffer.
623 @param [in] Length Length of the buffer.
624 @param [in] MappingCount The ID Mapping count.
625 @param [in] MappingOffset The offset of the ID Mapping array
626 from the start of the IORT table.
630 DumpIortNodeRootComplex (
633 IN UINT32 MappingCount
,
634 IN UINT32 MappingOffset
643 PARSER_PARAMS (IortNodeRootComplexParser
)
646 DumpIortNodeIdMappings (
648 Length
- MappingOffset
,
654 This function parses the IORT PMCG node.
656 @param [in] Ptr Pointer to the start of the buffer.
657 @param [in] Length Length of the buffer.
658 @param [in] MappingCount The ID Mapping count.
659 @param [in] MappingOffset The offset of the ID Mapping array
660 from the start of the IORT table.
667 IN UINT32 MappingCount
,
668 IN UINT32 MappingOffset
677 PARSER_PARAMS (IortNodePmcgParser
)
680 DumpIortNodeIdMappings (
682 Length
- MappingOffset
,
688 This function parses the IORT RMR Node Memory Range Descriptor array.
690 @param [in] Ptr Pointer to the start of the Memory Range Descriptor
692 @param [in] Length Length of the buffer.
693 @param [in] DescCount Memory Range Descriptor count.
697 DumpIortNodeRmrMemRangeDesc (
705 CHAR8 Buffer
[40]; // Used for AsciiName param of ParseAcpi
710 while ((Index
< DescCount
) &&
716 "Mem range Descriptor [%d]",
719 Offset
+= ParseAcpi (
725 PARSER_PARAMS (IortNodeRmrMemRangeDescParser
)
732 This function parses the IORT RMR node.
734 @param [in] Ptr Pointer to the start of the buffer.
735 @param [in] Length Length of the buffer.
736 @param [in] MappingCount The ID Mapping count.
737 @param [in] MappingOffset The offset of the ID Mapping array
738 from the start of the IORT table.
745 IN UINT32 MappingCount
,
746 IN UINT32 MappingOffset
755 PARSER_PARAMS (IortNodeRmrParser
)
758 if (*IortNodeRevision
== EFI_ACPI_IORT_RMR_NODE_REVISION_02
) {
759 IncrementErrorCount ();
761 L
"ERROR: RMR node Rev 2 (defined in IORT Rev E.c) must not be used."
762 L
" IORT tabe Revision E.c is deprecated and must not be used.\n"
766 DumpIortNodeIdMappings (
768 Length
- MappingOffset
,
772 DumpIortNodeRmrMemRangeDesc (
773 Ptr
+ (*RmrMemDescOffset
),
774 Length
- (*RmrMemDescOffset
),
780 This function parses the ACPI IORT table.
781 When trace is enabled this function parses the IORT table and traces the ACPI
784 This function also parses the following nodes:
793 This function also performs validation of the ACPI table fields.
795 @param [in] Trace If TRUE, trace the ACPI fields.
796 @param [in] Ptr Pointer to the start of the buffer.
797 @param [in] AcpiTableLength Length of the ACPI table.
798 @param [in] AcpiTableRevision Revision of the ACPI table.
805 IN UINT32 AcpiTableLength
,
806 IN UINT8 AcpiTableRevision
817 if ((AcpiTableRevision
> EFI_ACPI_IO_REMAPPING_TABLE_REVISION_00
) &&
818 (AcpiTableRevision
< EFI_ACPI_IO_REMAPPING_TABLE_REVISION_05
))
821 L
"ERROR: Parsing not supported for IORT tabe Revision E, E.<a,b,c>.\n"
823 if (AcpiTableRevision
== EFI_ACPI_IO_REMAPPING_TABLE_REVISION_04
) {
824 IncrementErrorCount ();
826 L
"ERROR: IORT tabe Revision E.c is deprecated and must not be used.\n"
839 PARSER_PARAMS (IortParser
)
842 // Check if the values used to control the parsing logic have been
843 // successfully read.
844 if ((IortNodeCount
== NULL
) ||
845 (IortNodeOffset
== NULL
))
847 IncrementErrorCount ();
849 L
"ERROR: Insufficient table length. AcpiTableLength = %d.\n",
855 Offset
= *IortNodeOffset
;
856 NodePtr
= Ptr
+ Offset
;
859 // Parse the specified number of IORT nodes or the IORT table buffer length.
860 // Whichever is minimum.
861 while ((Index
++ < *IortNodeCount
) &&
862 (Offset
< AcpiTableLength
))
864 // Parse the IORT Node Header
870 AcpiTableLength
- Offset
,
871 PARSER_PARAMS (IortNodeHeaderParser
)
874 // Check if the values used to control the parsing logic have been
875 // successfully read.
876 if ((IortNodeType
== NULL
) ||
877 (IortNodeLength
== NULL
) ||
878 (IortIdMappingCount
== NULL
) ||
879 (IortIdMappingOffset
== NULL
))
881 IncrementErrorCount ();
883 L
"ERROR: Insufficient remaining table buffer length to read the " \
884 L
"IORT node header. Length = %d.\n",
885 AcpiTableLength
- Offset
890 // Validate IORT Node length
891 if ((*IortNodeLength
== 0) ||
892 ((Offset
+ (*IortNodeLength
)) > AcpiTableLength
))
894 IncrementErrorCount ();
896 L
"ERROR: Invalid IORT Node length. " \
897 L
"Length = %d. Offset = %d. AcpiTableLength = %d.\n",
905 PrintFieldName (2, L
"* Node Offset *");
906 Print (L
"0x%x\n", Offset
);
908 switch (*IortNodeType
) {
909 case EFI_ACPI_IORT_TYPE_ITS_GROUP
:
915 case EFI_ACPI_IORT_TYPE_NAMED_COMP
:
916 DumpIortNodeNamedComponent (
923 case EFI_ACPI_IORT_TYPE_ROOT_COMPLEX
:
924 DumpIortNodeRootComplex (
931 case EFI_ACPI_IORT_TYPE_SMMUv1v2
:
932 DumpIortNodeSmmuV1V2 (
939 case EFI_ACPI_IORT_TYPE_SMMUv3
:
947 case EFI_ACPI_IORT_TYPE_PMCG
:
955 case EFI_ACPI_IORT_TYPE_RMR
:
964 IncrementErrorCount ();
965 Print (L
"ERROR: Unsupported IORT Node type = %d\n", *IortNodeType
);
968 NodePtr
+= (*IortNodeLength
);
969 Offset
+= (*IortNodeLength
);