]> git.proxmox.com Git - mirror_edk2.git/blob - DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManagerObjectParser.c
45e3a0f4ab598025c1aaf08dd82d9cf5017fd14a
[mirror_edk2.git] / DynamicTablesPkg / Library / Common / TableHelperLib / ConfigurationManagerObjectParser.c
1 /** @file
2 Configuration Manager Object parser.
3
4 Copyright (c) 2021 - 2022, ARM Limited. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6
7 **/
8
9 #include <Library/BaseLib.h>
10 #include <Library/DebugLib.h>
11 #include <ConfigurationManagerObject.h>
12 #include "ConfigurationManagerObjectParser.h"
13
14 STATIC
15 VOID
16 EFIAPI
17 PrintOemId (
18 CONST CHAR8 *Format,
19 UINT8 *Ptr
20 );
21
22 STATIC
23 VOID
24 EFIAPI
25 PrintString (
26 CONST CHAR8 *Format,
27 UINT8 *Ptr
28 );
29
30 /** A parser for EArmObjBootArchInfo.
31 */
32 STATIC CONST CM_OBJ_PARSER CmArmBootArchInfoParser[] = {
33 { "BootArchFlags", 2, "0x%x", NULL }
34 };
35
36 /** A parser for EArmObjPowerManagementProfileInfo.
37 */
38 STATIC CONST CM_OBJ_PARSER CmArmPowerManagementProfileInfoParser[] = {
39 { "PowerManagementProfile", 1, "0x%x", NULL }
40 };
41
42 /** A parser for EArmObjGicCInfo.
43 */
44 STATIC CONST CM_OBJ_PARSER CmArmGicCInfoParser[] = {
45 { "CPUInterfaceNumber", 4, "0x%x", NULL },
46 { "AcpiProcessorUid", 4, "0x%x", NULL },
47 { "Flags", 4, "0x%x", NULL },
48 { "ParkingProtocolVersion", 4, "0x%x", NULL },
49 { "PerformanceInterruptGsiv", 4, "0x%x", NULL },
50 { "ParkedAddress", 8, "0x%llx", NULL },
51 { "PhysicalBaseAddress", 8, "0x%llx", NULL },
52 { "GICV", 8, "0x%llx", NULL },
53 { "GICH", 8, "0x%llx", NULL },
54 { "VGICMaintenanceInterrupt", 4, "0x%x", NULL },
55 { "GICRBaseAddress", 8, "0x%llx", NULL },
56 { "MPIDR", 8, "0x%llx", NULL },
57 { "ProcessorPowerEfficiencyClass", 1, "0x%x", NULL },
58 { "SpeOverflowInterrupt", 2, "0x%x", NULL },
59 { "ProximityDomain", 4, "0x%x", NULL },
60 { "ClockDomain", 4, "0x%x", NULL },
61 { "AffinityFlags", 4, "0x%x", NULL },
62 { "CpcToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }
63 };
64
65 /** A parser for EArmObjGicDInfo.
66 */
67 STATIC CONST CM_OBJ_PARSER CmArmGicDInfoParser[] = {
68 { "PhysicalBaseAddress", 8, "0x%llx", NULL },
69 { "SystemVectorBase", 4, "0x%x", NULL },
70 { "GicVersion", 1, "0x%x", NULL },
71 };
72
73 /** A parser for EArmObjGicMsiFrameInfo.
74 */
75 STATIC CONST CM_OBJ_PARSER CmArmGicMsiFrameInfoParser[] = {
76 { "GicMsiFrameId", 4, "0x%x", NULL },
77 { "PhysicalBaseAddress", 8, "0x%llx", NULL },
78 { "Flags", 4, "0x%x", NULL },
79 { "SPICount", 2, "0x%x", NULL },
80 { "SPIBase", 2, "0x%x", NULL }
81 };
82
83 /** A parser for EArmObjGicRedistributorInfo.
84 */
85 STATIC CONST CM_OBJ_PARSER CmArmGicRedistInfoParser[] = {
86 { "DiscoveryRangeBaseAddress", 8, "0x%llx", NULL },
87 { "DiscoveryRangeLength", 4, "0x%x", NULL }
88 };
89
90 /** A parser for EArmObjGicItsInfo.
91 */
92 STATIC CONST CM_OBJ_PARSER CmArmGicItsInfoParser[] = {
93 { "GicItsId", 4, "0x%x", NULL },
94 { "PhysicalBaseAddress", 8, "0x%llx", NULL },
95 { "ProximityDomain", 4, "0x%x", NULL }
96 };
97
98 /** A parser for EArmObjSerialConsolePortInfo,
99 EArmObjSerialDebugPortInfo and EArmObjSerialPortInfo.
100 */
101 STATIC CONST CM_OBJ_PARSER CmArmSerialPortInfoParser[] = {
102 { "BaseAddress", 8, "0x%llx", NULL },
103 { "Interrupt", 4, "0x%x", NULL },
104 { "BaudRate", 8, "0x%llx", NULL },
105 { "Clock", 4, "0x%x", NULL },
106 { "PortSubtype", 2, "0x%x", NULL },
107 { "BaseAddressLength", 8, "0x%llx", NULL },
108 { "AccessSize", 1, "0x%d", NULL }
109 };
110
111 /** A parser for EArmObjGenericTimerInfo.
112 */
113 STATIC CONST CM_OBJ_PARSER CmArmGenericTimerInfoParser[] = {
114 { "CounterControlBaseAddress", 8, "0x%llx", NULL },
115 { "CounterReadBaseAddress", 8, "0x%llx", NULL },
116 { "SecurePL1TimerGSIV", 4, "0x%x", NULL },
117 { "SecurePL1TimerFlags", 4, "0x%x", NULL },
118 { "NonSecurePL1TimerGSIV", 4, "0x%x", NULL },
119 { "NonSecurePL1TimerFlags", 4, "0x%x", NULL },
120 { "VirtualTimerGSIV", 4, "0x%x", NULL },
121 { "VirtualTimerFlags", 4, "0x%x", NULL },
122 { "NonSecurePL2TimerGSIV", 4, "0x%x", NULL },
123 { "NonSecurePL2TimerFlags", 4, "0x%x", NULL },
124 { "VirtualPL2TimerGSIV", 4, "0x%x", NULL },
125 { "VirtualPL2TimerFlags", 4, "0x%x", NULL }
126 };
127
128 /** A parser for EArmObjPlatformGTBlockInfo.
129 */
130 STATIC CONST CM_OBJ_PARSER CmArmGTBlockInfoParser[] = {
131 { "GTBlockPhysicalAddress", 8, "0x%llx", NULL },
132 { "GTBlockTimerFrameCount", 4, "0x%x", NULL },
133 { "GTBlockTimerFrameToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }
134 };
135
136 /** A parser for EArmObjGTBlockTimerFrameInfo.
137 */
138 STATIC CONST CM_OBJ_PARSER CmArmGTBlockTimerFrameInfoParser[] = {
139 { "FrameNumber", 1, "0x%x", NULL },
140 { "PhysicalAddressCntBase", 8, "0x%llx", NULL },
141 { "PhysicalAddressCntEL0Base", 8, "0x%llx", NULL },
142 { "PhysicalTimerGSIV", 4, "0x%x", NULL },
143 { "PhysicalTimerFlags", 4, "0x%x", NULL },
144 { "VirtualTimerGSIV", 4, "0x%x", NULL },
145 { "VirtualTimerFlags", 4, "0x%x", NULL },
146 { "CommonFlags", 4, "0x%x", NULL }
147 };
148
149 /** A parser for EArmObjPlatformGenericWatchdogInfo.
150 */
151 STATIC CONST CM_OBJ_PARSER CmArmGenericWatchdogInfoParser[] = {
152 { "ControlFrameAddress", 8, "0x%llx", NULL },
153 { "RefreshFrameAddress", 8, "0x%llx", NULL },
154 { "TimerGSIV", 4, "0x%x", NULL },
155 { "Flags", 4, "0x%x", NULL }
156 };
157
158 /** A parser for EArmObjPciConfigSpaceInfo.
159 */
160 STATIC CONST CM_OBJ_PARSER CmArmPciConfigSpaceInfoParser[] = {
161 { "BaseAddress", 8, "0x%llx", NULL },
162 { "PciSegmentGroupNumber", 2, "0x%x", NULL },
163 { "StartBusNumber", 1, "0x%x", NULL },
164 { "EndBusNumber", 1, "0x%x", NULL },
165 { "AddressMapToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
166 { "InterruptMapToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
167 };
168
169 /** A parser for EArmObjHypervisorVendorIdentity.
170 */
171 STATIC CONST CM_OBJ_PARSER CmArmHypervisorVendorIdParser[] = {
172 { "HypervisorVendorId", 8, "0x%llx", NULL }
173 };
174
175 /** A parser for EArmObjFixedFeatureFlags.
176 */
177 STATIC CONST CM_OBJ_PARSER CmArmFixedFeatureFlagsParser[] = {
178 { "Flags", 4, "0x%x", NULL }
179 };
180
181 /** A parser for EArmObjItsGroup.
182 */
183 STATIC CONST CM_OBJ_PARSER CmArmItsGroupNodeParser[] = {
184 { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
185 { "ItsIdCount", 4, "0x%x", NULL },
186 { "ItsIdToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
187 { "Identifier", 4, "0x%x", NULL },
188 };
189
190 /** A parser for EArmObjNamedComponent.
191 */
192 STATIC CONST CM_OBJ_PARSER CmArmNamedComponentNodeParser[] = {
193 { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
194 { "IdMappingCount", 4, "0x%x", NULL },
195 { "IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
196 { "Flags", 4, "0x%x", NULL },
197 { "CacheCoherent", 4, "0x%x", NULL },
198 { "AllocationHints", 1, "0x%x", NULL },
199 { "MemoryAccessFlags", 1, "0x%x", NULL },
200 { "AddressSizeLimit", 1, "0x%x", NULL },
201 { "ObjectName", sizeof (CHAR8 *), NULL, PrintString },
202 { "Identifier", 4, "0x%x", NULL },
203 };
204
205 /** A parser for EArmObjRootComplex.
206 */
207 STATIC CONST CM_OBJ_PARSER CmArmRootComplexNodeParser[] = {
208 { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
209 { "IdMappingCount", 4, "0x%x", NULL },
210 { "IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
211 { "CacheCoherent", 4, "0x%x", NULL },
212 { "AllocationHints", 1, "0x%x", NULL },
213 { "MemoryAccessFlags", 1, "0x%x", NULL },
214 { "AtsAttribute", 4, "0x%x", NULL },
215 { "PciSegmentNumber", 4, "0x%x", NULL },
216 { "MemoryAddressSize", 1, "0x%x", NULL },
217 { "PasidCapabilities", 2, "0x%x", NULL },
218 { "Flags", 4, "0x%x", NULL },
219 { "Identifier", 4, "0x%x", NULL },
220 };
221
222 /** A parser for EArmObjSmmuV1SmmuV2.
223 */
224 STATIC CONST CM_OBJ_PARSER CmArmSmmuV1SmmuV2NodeParser[] = {
225 { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
226 { "IdMappingCount", 4, "0x%x", NULL },
227 { "IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
228 { "BaseAddress", 8, "0x%llx", NULL },
229 { "Span", 8, "0x%llx", NULL },
230 { "Model", 4, "0x%x", NULL },
231 { "Flags", 4, "0x%x", NULL },
232 { "ContextInterruptCount", 4, "0x%x", NULL },
233 { "ContextInterruptToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
234 { "PmuInterruptCount", 4, "0x%x", NULL },
235 { "PmuInterruptToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
236 { "SMMU_NSgIrpt", 4, "0x%x", NULL },
237 { "SMMU_NSgIrptFlags", 4, "0x%x", NULL },
238 { "SMMU_NSgCfgIrpt", 4, "0x%x", NULL },
239 { "SMMU_NSgCfgIrptFlags", 4, "0x%x", NULL },
240 { "Identifier", 4, "0x%x", NULL },
241 };
242
243 /** A parser for EArmObjSmmuV3.
244 */
245 STATIC CONST CM_OBJ_PARSER CmArmSmmuV3NodeParser[] = {
246 { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
247 { "IdMappingCount", 4, "0x%x", NULL },
248 { "IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
249 { "BaseAddress", 8, "0x%llx", NULL },
250 { "Flags", 4, "0x%x", NULL },
251 { "VatosAddress", 8, "0x%llx", NULL },
252 { "Model", 4, "0x%x", NULL },
253 { "EventInterrupt", 4, "0x%x", NULL },
254 { "PriInterrupt", 4, "0x%x", NULL },
255 { "GerrInterrupt", 4, "0x%x", NULL },
256 { "SyncInterrupt", 4, "0x%x", NULL },
257 { "ProximityDomain", 4, "0x%x", NULL },
258 { "DeviceIdMappingIndex", 4, "0x%x", NULL },
259 { "Identifier", 4, "0x%x", NULL },
260 };
261
262 /** A parser for EArmObjPmcg.
263 */
264 STATIC CONST CM_OBJ_PARSER CmArmPmcgNodeParser[] = {
265 { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
266 { "IdMappingCount", 4, "0x%x", NULL },
267 { "IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
268 { "BaseAddress", 8, "0x%llx", NULL },
269 { "OverflowInterrupt", 4, "0x%x", NULL },
270 { "Page1BaseAddress", 8, "0x%llx", NULL },
271 { "ReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
272 { "Identifier", 4, "0x%x", NULL },
273 };
274
275 /** A parser for EArmObjGicItsIdentifierArray.
276 */
277 STATIC CONST CM_OBJ_PARSER CmArmGicItsIdentifierParser[] = {
278 { "ItsId", 4, "0x%x", NULL }
279 };
280
281 /** A parser for EArmObjIdMappingArray.
282 */
283 STATIC CONST CM_OBJ_PARSER CmArmIdMappingParser[] = {
284 { "InputBase", 4, "0x%x", NULL },
285 { "NumIds", 4, "0x%x", NULL },
286 { "OutputBase", 4, "0x%x", NULL },
287 { "OutputReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
288 { "Flags", 4, "0x%x", NULL }
289 };
290
291 /** A parser for EArmObjSmmuInterruptArray.
292 */
293 STATIC CONST CM_OBJ_PARSER CmArmGenericInterruptParser[] = {
294 { "Interrupt", 4, "0x%x", NULL },
295 { "Flags", 4, "0x%x", NULL }
296 };
297
298 /** A parser for EArmObjProcHierarchyInfo.
299 */
300 STATIC CONST CM_OBJ_PARSER CmArmProcHierarchyInfoParser[] = {
301 { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
302 { "Flags", 4, "0x%x", NULL },
303 { "ParentToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
304 { "GicCToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
305 { "NoOfPrivateResources", 4, "0x%x", NULL },
306 { "PrivateResourcesArrayToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }
307 };
308
309 /** A parser for EArmObjCacheInfo.
310 */
311 STATIC CONST CM_OBJ_PARSER CmArmCacheInfoParser[] = {
312 { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
313 { "NextLevelOfCacheToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
314 { "Size", 4, "0x%x", NULL },
315 { "NumberOfSets", 4, "0x%x", NULL },
316 { "Associativity", 4, "0x%x", NULL },
317 { "Attributes", 1, "0x%x", NULL },
318 { "LineSize", 2, "0x%x", NULL }
319 };
320
321 /** A parser for EArmObjProcNodeIdInfo.
322 */
323 STATIC CONST CM_OBJ_PARSER CmArmProcNodeIdInfoParser[] = {
324 { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
325 { "VendorId", 4, "0x%p", NULL },
326 { "Level1Id", 8, "0x%x", NULL },
327 { "Level2Id", 8, "0x%x", NULL },
328 { "MajorRev", 2, "0x%x", NULL },
329 { "MinorRev", 2, "0x%x", NULL },
330 { "SpinRev", 2, "0x%x", NULL }
331 };
332
333 /** A parser for EArmObjCmRef.
334 */
335 STATIC CONST CM_OBJ_PARSER CmArmObjRefParser[] = {
336 { "ReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }
337 };
338
339 /** A parser for EArmObjMemoryAffinityInfo.
340 */
341 STATIC CONST CM_OBJ_PARSER CmArmMemoryAffinityInfoParser[] = {
342 { "ProximityDomain", 4, "0x%x", NULL },
343 { "BaseAddress", 8, "0x%llx", NULL },
344 { "Length", 8, "0x%llx", NULL },
345 { "Flags", 4, "0x%x", NULL }
346 };
347
348 /** A parser for EArmObjDeviceHandleAcpi.
349 */
350 STATIC CONST CM_OBJ_PARSER CmArmDeviceHandleAcpiParser[] = {
351 { "Hid", 8, "0x%llx", NULL },
352 { "Uid", 4, "0x%x", NULL }
353 };
354
355 /** A parser for EArmObjDeviceHandlePci.
356 */
357 STATIC CONST CM_OBJ_PARSER CmArmDeviceHandlePciParser[] = {
358 { "SegmentNumber", 2, "0x%x", NULL },
359 { "BusNumber", 1, "0x%x", NULL },
360 { "DeviceNumber", 1, "0x%x", NULL },
361 { "FunctionNumber", 1, "0x%x", NULL }
362 };
363
364 /** A parser for EArmObjGenericInitiatorAffinityInfo.
365 */
366 STATIC CONST CM_OBJ_PARSER CmArmGenericInitiatorAffinityInfoParser[] = {
367 { "ProximityDomain", 4, "0x%x", NULL },
368 { "Flags", 4, "0x%x", NULL },
369 { "DeviceHandleType", 1, "0x%x", NULL },
370 { "DeviceHandleToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL }
371 };
372
373 /** A parser for EArmObjCmn600Info.
374 */
375 STATIC CONST CM_OBJ_PARSER CmArmCmn600InfoParser[] = {
376 { "PeriphBaseAddress", 8, "0x%llx", NULL },
377 { "PeriphBaseAddressLength", 8, "0x%llx", NULL },
378 { "RootNodeBaseAddress", 8, "0x%llx", NULL },
379 { "DtcCount", 1, "0x%x", NULL },
380 { "DtcInterrupt[0]", 4, "0x%x", NULL },
381 { "DtcFlags[0]", 4, "0x%x", NULL },
382 { "DtcInterrupt[1]", 4, "0x%x", NULL },
383 { "DtcFlags[1]", 4, "0x%x", NULL },
384 { "DtcInterrupt[2]", 4, "0x%x", NULL },
385 { "DtcFlags[2]", 4, "0x%x", NULL },
386 { "DtcInterrupt[3]", 4, "0x%x", NULL },
387 { "DtcFlags[3]", 4, "0x%x", NULL }
388 };
389
390 /** A parser for the EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE structure.
391 */
392 STATIC CONST CM_OBJ_PARSER AcpiGenericAddressParser[] = {
393 { "AddressSpaceId", 1, "%d", NULL },
394 { "RegisterBitWidth", 1, "%d", NULL },
395 { "RegisterBitOffset", 1, "%d", NULL },
396 { "AccessSize", 1, "%d", NULL },
397 { "Address", 8, "0x%llx", NULL },
398 };
399
400 /** A parser for EArmObjLpiInfo.
401 */
402 STATIC CONST CM_OBJ_PARSER CmArmLpiInfoParser[] = {
403 { "MinResidency", 4, "0x%x", NULL },
404 { "WorstCaseWakeLatency", 4, "0x%x", NULL },
405 { "Flags", 4, "0x%x", NULL },
406 { "ArchFlags", 4, "0x%x", NULL },
407 { "ResCntFreq", 4, "0x%x", NULL },
408 { "EnableParentState", 4, "0x%x", NULL },
409 { "IsInteger", 1, "%d", NULL },
410 { "IntegerEntryMethod", 8, "0x%llx", NULL },
411 { "RegisterEntryMethod", sizeof (EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE),
412 NULL, NULL, AcpiGenericAddressParser,
413 ARRAY_SIZE (AcpiGenericAddressParser) },
414 { "ResidencyCounterRegister", sizeof (EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE),
415 NULL, NULL, AcpiGenericAddressParser,
416 ARRAY_SIZE (AcpiGenericAddressParser) },
417 { "UsageCounterRegister", sizeof (EFI_ACPI_6_3_GENERIC_ADDRESS_STRUCTURE),
418 NULL, NULL, AcpiGenericAddressParser,
419 ARRAY_SIZE (AcpiGenericAddressParser) },
420 { "StateName", 16, "0x%a", NULL },
421 };
422
423 /** A parser for EArmObjPciAddressMapInfo.
424 */
425 STATIC CONST CM_OBJ_PARSER CmArmPciAddressMapInfoParser[] = {
426 { "SpaceCode", 1, "%d", NULL },
427 { "PciAddress", 8, "0x%llx", NULL },
428 { "CpuAddress", 8, "0x%llx", NULL },
429 { "AddressSize", 8, "0x%llx", NULL },
430 };
431
432 /** A parser for EArmObjPciInterruptMapInfo.
433 */
434 STATIC CONST CM_OBJ_PARSER CmPciInterruptMapInfoParser[] = {
435 { "PciBus", 1, "0x%x", NULL },
436 { "PciDevice", 1, "0x%x", NULL },
437 { "PciInterrupt", 1, "0x%x", NULL },
438 { "IntcInterrupt", sizeof (CM_ARM_GENERIC_INTERRUPT),
439 NULL, NULL, CmArmGenericInterruptParser,
440 ARRAY_SIZE (CmArmGenericInterruptParser) },
441 };
442
443 /** A parser for EArmObjRmr.
444 */
445 STATIC CONST CM_OBJ_PARSER CmArmRmrInfoParser[] = {
446 { "Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
447 { "IdMappingCount", 4, "0x%x", NULL },
448 { "IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
449 { "Identifier", 4, "0x%x", NULL },
450 { "Flags", 4, "0x%x", NULL },
451 { "MemRangeDescCount", 4, "0x%x", NULL },
452 { "MemRangeDescToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
453 };
454
455 /** A parser for EArmObjMemoryRangeDescriptor.
456 */
457 STATIC CONST CM_OBJ_PARSER CmArmMemoryRangeDescriptorInfoParser[] = {
458 { "BaseAddress", 8, "0x%llx", NULL },
459 { "Length", 8, "0x%llx", NULL },
460 };
461
462 /** A parser for EArmObjCpcInfo.
463 */
464 STATIC CONST CM_OBJ_PARSER CmArmCpcInfoParser[] = {
465 { "Revision", 4, "0x%lx", NULL },
466 { "HighestPerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
467 NULL, NULL, AcpiGenericAddressParser,
468 ARRAY_SIZE (AcpiGenericAddressParser) },
469 { "HighestPerformanceInteger", 4, "0x%lx", NULL },
470 { "NominalPerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
471 NULL, NULL, AcpiGenericAddressParser,
472 ARRAY_SIZE (AcpiGenericAddressParser) },
473 { "NominalPerformanceInteger", 4, "0x%lx", NULL },
474 { "LowestNonlinearPerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
475 NULL, NULL, AcpiGenericAddressParser,
476 ARRAY_SIZE (AcpiGenericAddressParser) },
477 { "LowestNonlinearPerformanceInteger", 4, "0x%lx", NULL },
478 { "LowestPerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
479 NULL, NULL, AcpiGenericAddressParser,
480 ARRAY_SIZE (AcpiGenericAddressParser) },
481 { "LowestPerformanceInteger", 4, "0x%lx", NULL },
482 { "GuaranteedPerformanceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
483 NULL, NULL, AcpiGenericAddressParser,
484 ARRAY_SIZE (AcpiGenericAddressParser) },
485 { "DesiredPerformanceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
486 NULL, NULL, AcpiGenericAddressParser,
487 ARRAY_SIZE (AcpiGenericAddressParser) },
488 { "MinimumPerformanceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
489 NULL, NULL, AcpiGenericAddressParser,
490 ARRAY_SIZE (AcpiGenericAddressParser) },
491 { "MaximumPerformanceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
492 NULL, NULL, AcpiGenericAddressParser,
493 ARRAY_SIZE (AcpiGenericAddressParser) },
494 { "PerformanceReductionToleranceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
495 NULL, NULL, AcpiGenericAddressParser,
496 ARRAY_SIZE (AcpiGenericAddressParser) },
497 { "TimeWindowRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
498 NULL, NULL, AcpiGenericAddressParser,
499 ARRAY_SIZE (AcpiGenericAddressParser) },
500 { "CounterWraparoundTimeBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
501 NULL, NULL, AcpiGenericAddressParser,
502 ARRAY_SIZE (AcpiGenericAddressParser) },
503 { "CounterWraparoundTimeInteger", 4, "0x%lx", NULL },
504 { "ReferencePerformanceCounterRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
505 NULL, NULL, AcpiGenericAddressParser,
506 ARRAY_SIZE (AcpiGenericAddressParser) },
507 { "DeliveredPerformanceCounterRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
508 NULL, NULL, AcpiGenericAddressParser,
509 ARRAY_SIZE (AcpiGenericAddressParser) },
510 { "PerformanceLimitedRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
511 NULL, NULL, AcpiGenericAddressParser,
512 ARRAY_SIZE (AcpiGenericAddressParser) },
513 { "CPPCEnableRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
514 NULL, NULL, AcpiGenericAddressParser,
515 ARRAY_SIZE (AcpiGenericAddressParser) },
516 { "AutonomousSelectionEnableBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
517 NULL, NULL, AcpiGenericAddressParser,
518 ARRAY_SIZE (AcpiGenericAddressParser) },
519 { "AutonomousSelectionEnableInteger", 4, "0x%lx", NULL },
520 { "AutonomousActivityWindowRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
521 NULL, NULL, AcpiGenericAddressParser,
522 ARRAY_SIZE (AcpiGenericAddressParser) },
523 { "EnergyPerformancePreferenceRegister", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
524 NULL, NULL, AcpiGenericAddressParser,
525 ARRAY_SIZE (AcpiGenericAddressParser) },
526 { "ReferencePerformanceBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
527 NULL, NULL, AcpiGenericAddressParser,
528 ARRAY_SIZE (AcpiGenericAddressParser) },
529 { "ReferencePerformanceInteger", 4, "0x%lx", NULL },
530 { "LowestFrequencyBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
531 NULL, NULL, AcpiGenericAddressParser,
532 ARRAY_SIZE (AcpiGenericAddressParser) },
533 { "LowestFrequencyInteger", 4, "0x%lx", NULL },
534 { "NominalFrequencyBuffer", sizeof (EFI_ACPI_6_4_GENERIC_ADDRESS_STRUCTURE),
535 NULL, NULL, AcpiGenericAddressParser,
536 ARRAY_SIZE (AcpiGenericAddressParser) },
537 { "NominalFrequencyInteger", 4, "0x%lx", NULL },
538 };
539
540 /** A parser for Arm namespace objects.
541 */
542 STATIC CONST CM_OBJ_PARSER_ARRAY ArmNamespaceObjectParser[] = {
543 { "EArmObjReserved", NULL, 0 },
544 { "EArmObjBootArchInfo", CmArmBootArchInfoParser,
545 ARRAY_SIZE (CmArmBootArchInfoParser) },
546 { "EArmObjCpuInfo", NULL, 0 },
547 { "EArmObjPowerManagementProfileInfo", CmArmPowerManagementProfileInfoParser,
548 ARRAY_SIZE (CmArmPowerManagementProfileInfoParser) },
549 { "EArmObjGicCInfo", CmArmGicCInfoParser, ARRAY_SIZE (CmArmGicCInfoParser) },
550 { "EArmObjGicDInfo", CmArmGicDInfoParser, ARRAY_SIZE (CmArmGicDInfoParser) },
551 { "EArmObjGicMsiFrameInfo", CmArmGicMsiFrameInfoParser,
552 ARRAY_SIZE (CmArmGicMsiFrameInfoParser) },
553 { "EArmObjGicRedistributorInfo", CmArmGicRedistInfoParser,
554 ARRAY_SIZE (CmArmGicRedistInfoParser) },
555 { "EArmObjGicItsInfo", CmArmGicItsInfoParser,
556 ARRAY_SIZE (CmArmGicItsInfoParser) },
557 { "EArmObjSerialConsolePortInfo", CmArmSerialPortInfoParser,
558 ARRAY_SIZE (CmArmSerialPortInfoParser) },
559 { "EArmObjSerialDebugPortInfo", CmArmSerialPortInfoParser,
560 ARRAY_SIZE (CmArmSerialPortInfoParser) },
561 { "EArmObjGenericTimerInfo", CmArmGenericTimerInfoParser,
562 ARRAY_SIZE (CmArmGenericTimerInfoParser) },
563 { "EArmObjPlatformGTBlockInfo", CmArmGTBlockInfoParser,
564 ARRAY_SIZE (CmArmGTBlockInfoParser) },
565 { "EArmObjGTBlockTimerFrameInfo", CmArmGTBlockTimerFrameInfoParser,
566 ARRAY_SIZE (CmArmGTBlockTimerFrameInfoParser) },
567 { "EArmObjPlatformGenericWatchdogInfo", CmArmGenericWatchdogInfoParser,
568 ARRAY_SIZE (CmArmGenericWatchdogInfoParser) },
569 { "EArmObjPciConfigSpaceInfo", CmArmPciConfigSpaceInfoParser,
570 ARRAY_SIZE (CmArmPciConfigSpaceInfoParser) },
571 { "EArmObjHypervisorVendorIdentity", CmArmHypervisorVendorIdParser,
572 ARRAY_SIZE (CmArmHypervisorVendorIdParser) },
573 { "EArmObjFixedFeatureFlags", CmArmFixedFeatureFlagsParser,
574 ARRAY_SIZE (CmArmFixedFeatureFlagsParser) },
575 { "EArmObjItsGroup", CmArmItsGroupNodeParser,
576 ARRAY_SIZE (CmArmItsGroupNodeParser) },
577 { "EArmObjNamedComponent", CmArmNamedComponentNodeParser,
578 ARRAY_SIZE (CmArmNamedComponentNodeParser) },
579 { "EArmObjRootComplex", CmArmRootComplexNodeParser,
580 ARRAY_SIZE (CmArmRootComplexNodeParser) },
581 { "EArmObjSmmuV1SmmuV2", CmArmSmmuV1SmmuV2NodeParser,
582 ARRAY_SIZE (CmArmSmmuV1SmmuV2NodeParser) },
583 { "EArmObjSmmuV3", CmArmSmmuV3NodeParser,
584 ARRAY_SIZE (CmArmSmmuV3NodeParser) },
585 { "EArmObjPmcg", CmArmPmcgNodeParser, ARRAY_SIZE (CmArmPmcgNodeParser) },
586 { "EArmObjGicItsIdentifierArray", CmArmGicItsIdentifierParser,
587 ARRAY_SIZE (CmArmGicItsIdentifierParser) },
588 { "EArmObjIdMappingArray", CmArmIdMappingParser,
589 ARRAY_SIZE (CmArmIdMappingParser) },
590 { "EArmObjSmmuInterruptArray", CmArmGenericInterruptParser,
591 ARRAY_SIZE (CmArmGenericInterruptParser) },
592 { "EArmObjProcHierarchyInfo", CmArmProcHierarchyInfoParser,
593 ARRAY_SIZE (CmArmProcHierarchyInfoParser) },
594 { "EArmObjCacheInfo", CmArmCacheInfoParser,
595 ARRAY_SIZE (CmArmCacheInfoParser) },
596 { "EArmObjProcNodeIdInfo", CmArmProcNodeIdInfoParser,
597 ARRAY_SIZE (CmArmProcNodeIdInfoParser) },
598 { "EArmObjCmRef", CmArmObjRefParser, ARRAY_SIZE (CmArmObjRefParser) },
599 { "EArmObjMemoryAffinityInfo", CmArmMemoryAffinityInfoParser,
600 ARRAY_SIZE (CmArmMemoryAffinityInfoParser) },
601 { "EArmObjDeviceHandleAcpi", CmArmDeviceHandleAcpiParser,
602 ARRAY_SIZE (CmArmDeviceHandleAcpiParser) },
603 { "EArmObjDeviceHandlePci", CmArmDeviceHandlePciParser,
604 ARRAY_SIZE (CmArmDeviceHandlePciParser) },
605 { "EArmObjGenericInitiatorAffinityInfo",
606 CmArmGenericInitiatorAffinityInfoParser,
607 ARRAY_SIZE (CmArmGenericInitiatorAffinityInfoParser) },
608 { "EArmObjSerialPortInfo", CmArmSerialPortInfoParser,
609 ARRAY_SIZE (CmArmSerialPortInfoParser) },
610 { "EArmObjCmn600Info", CmArmCmn600InfoParser,
611 ARRAY_SIZE (CmArmCmn600InfoParser) },
612 { "EArmObjLpiInfo", CmArmLpiInfoParser,
613 ARRAY_SIZE (CmArmLpiInfoParser) },
614 { "EArmObjPciAddressMapInfo", CmArmPciAddressMapInfoParser,
615 ARRAY_SIZE (CmArmPciAddressMapInfoParser) },
616 { "EArmObjPciInterruptMapInfo", CmPciInterruptMapInfoParser,
617 ARRAY_SIZE (CmPciInterruptMapInfoParser) },
618 { "EArmObjRmr", CmArmRmrInfoParser,
619 ARRAY_SIZE (CmArmRmrInfoParser) },
620 { "EArmObjMemoryRangeDescriptor", CmArmMemoryRangeDescriptorInfoParser,
621 ARRAY_SIZE (CmArmMemoryRangeDescriptorInfoParser) },
622 { "EArmObjCpcInfo", CmArmCpcInfoParser,
623 ARRAY_SIZE (CmArmCpcInfoParser) },
624 { "EArmObjMax", NULL, 0 },
625 };
626
627 /** A parser for EStdObjCfgMgrInfo.
628 */
629 STATIC CONST CM_OBJ_PARSER StdObjCfgMgrInfoParser[] = {
630 { "Revision", 4, "0x%x", NULL },
631 { "OemId[6]", 6, "%C%C%C%C%C%C", PrintOemId }
632 };
633
634 /** A parser for EStdObjAcpiTableList.
635 */
636 STATIC CONST CM_OBJ_PARSER StdObjAcpiTableInfoParser[] = {
637 { "AcpiTableSignature", 4, "0x%x", NULL },
638 { "AcpiTableRevision", 1, "%d", NULL },
639 { "TableGeneratorId", sizeof (ACPI_TABLE_GENERATOR_ID), "0x%x", NULL },
640 { "AcpiTableData", sizeof (EFI_ACPI_DESCRIPTION_HEADER *), "0x%p", NULL },
641 { "OemTableId", 8, "0x%LLX", NULL },
642 { "OemRevision", 4, "0x%x", NULL },
643 { "MinorRevision", 1, "0x%x", NULL },
644 };
645
646 /** A parser for EStdObjSmbiosTableList.
647 */
648 STATIC CONST CM_OBJ_PARSER StdObjSmbiosTableInfoParser[] = {
649 { "TableGeneratorId", sizeof (SMBIOS_TABLE_GENERATOR_ID), "0x%x", NULL },
650 { "SmbiosTableData", sizeof (SMBIOS_STRUCTURE *), "0x%p", NULL }
651 };
652
653 /** A parser for Standard namespace objects.
654 */
655 STATIC CONST CM_OBJ_PARSER_ARRAY StdNamespaceObjectParser[] = {
656 { "EStdObjCfgMgrInfo", StdObjCfgMgrInfoParser,
657 ARRAY_SIZE (StdObjCfgMgrInfoParser) },
658 { "EStdObjAcpiTableList", StdObjAcpiTableInfoParser,
659 ARRAY_SIZE (StdObjAcpiTableInfoParser) },
660 { "EStdObjSmbiosTableList", StdObjSmbiosTableInfoParser,
661 ARRAY_SIZE (StdObjSmbiosTableInfoParser) },
662 };
663
664 /** Print OEM Id.
665
666 @param [in] Format Format to print the Ptr.
667 @param [in] Ptr Pointer to the OEM Id.
668 **/
669 STATIC
670 VOID
671 EFIAPI
672 PrintOemId (
673 IN CONST CHAR8 *Format,
674 IN UINT8 *Ptr
675 )
676 {
677 DEBUG ((
678 DEBUG_ERROR,
679 (Format != NULL) ? Format : "%C%C%C%C%C%C",
680 Ptr[0],
681 Ptr[1],
682 Ptr[2],
683 Ptr[3],
684 Ptr[4],
685 Ptr[5]
686 ));
687 }
688
689 /** Print string.
690
691 The string must be NULL terminated.
692
693 @param [in] Format Format to print the Ptr.
694 @param [in] Ptr Pointer to the string.
695 **/
696 STATIC
697 VOID
698 EFIAPI
699 PrintString (
700 CONST CHAR8 *Format,
701 UINT8 *Ptr
702 )
703 {
704 DEBUG ((DEBUG_ERROR, "%a", Ptr));
705 }
706
707 /** Print fields of the objects.
708
709 @param [in] Data Pointer to the object to print.
710 @param [in] Parser Parser containing the object fields.
711 @param [in] ItemCount Number of entries/fields in the Parser.
712 @param [in] RemainingSize Parse at most *RemainingSize bytes.
713 This function decrements the value
714 from the number bytes consumed.
715 @param [in] IndentLevel Indentation to use when printing.
716 **/
717 STATIC
718 VOID
719 PrintCmObjDesc (
720 IN VOID *Data,
721 IN CONST CM_OBJ_PARSER *Parser,
722 IN UINTN ItemCount,
723 IN INTN *RemainingSize,
724 IN UINT32 IndentLevel
725 )
726 {
727 UINT32 Index;
728 UINT32 IndentIndex;
729 INTN SubStructSize;
730
731 if ((Data == NULL) ||
732 (Parser == NULL) ||
733 (ItemCount == 0) ||
734 (RemainingSize == NULL))
735 {
736 ASSERT (0);
737 return;
738 }
739
740 // Print each field.
741 for (Index = 0; Index < ItemCount; Index++) {
742 // Check there is enough space in left.
743 *RemainingSize -= Parser[Index].Length;
744 if (*RemainingSize < 0) {
745 DEBUG ((
746 DEBUG_ERROR,
747 "\nERROR: %a: Buffer overrun\n",
748 Parser[Index].NameStr
749 ));
750 ASSERT (0);
751 return;
752 }
753
754 // Indentation
755 for (IndentIndex = 0; IndentIndex < IndentLevel; IndentIndex++) {
756 DEBUG ((DEBUG_ERROR, " "));
757 }
758
759 DEBUG ((
760 DEBUG_ERROR,
761 "%-*a :",
762 OUTPUT_FIELD_COLUMN_WIDTH - 2 * IndentLevel,
763 Parser[Index].NameStr
764 ));
765 if (Parser[Index].PrintFormatter != NULL) {
766 Parser[Index].PrintFormatter (Parser[Index].Format, Data);
767 } else if (Parser[Index].Format != NULL) {
768 switch (Parser[Index].Length) {
769 case 1:
770 DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT8 *)Data));
771 break;
772 case 2:
773 DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT16 *)Data));
774 break;
775 case 4:
776 DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT32 *)Data));
777 break;
778 case 8:
779 DEBUG ((DEBUG_ERROR, Parser[Index].Format, ReadUnaligned64 (Data)));
780 break;
781 default:
782 DEBUG ((
783 DEBUG_ERROR,
784 "\nERROR: %a: CANNOT PARSE THIS FIELD, Field Length = %d\n",
785 Parser[Index].NameStr,
786 Parser[Index].Length
787 ));
788 } // switch
789 } else if (Parser[Index].SubObjParser != NULL) {
790 SubStructSize = Parser[Index].Length;
791
792 DEBUG ((DEBUG_ERROR, "\n"));
793 PrintCmObjDesc (
794 Data,
795 Parser[Index].SubObjParser,
796 Parser[Index].SubObjItemCount,
797 &SubStructSize,
798 IndentLevel + 1
799 );
800 } else {
801 ASSERT (0);
802 DEBUG ((
803 DEBUG_ERROR,
804 "\nERROR: %a: CANNOT PARSE THIS FIELD, Field Length = %d\n",
805 Parser[Index].NameStr,
806 Parser[Index].Length
807 ));
808 }
809
810 DEBUG ((DEBUG_ERROR, "\n"));
811 Data = (UINT8 *)Data + Parser[Index].Length;
812 } // for
813 }
814
815 /** Parse and print a CmObjDesc.
816
817 @param [in] CmObjDesc The CmObjDesc to parse and print.
818 **/
819 VOID
820 EFIAPI
821 ParseCmObjDesc (
822 IN CONST CM_OBJ_DESCRIPTOR *CmObjDesc
823 )
824 {
825 UINTN ObjId;
826 UINTN NameSpaceId;
827 UINT32 ObjIndex;
828 UINT32 ObjectCount;
829 INTN RemainingSize;
830 INTN Offset;
831 CONST CM_OBJ_PARSER_ARRAY *ParserArray;
832
833 if ((CmObjDesc == NULL) || (CmObjDesc->Data == NULL)) {
834 return;
835 }
836
837 NameSpaceId = GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId);
838 ObjId = GET_CM_OBJECT_ID (CmObjDesc->ObjectId);
839
840 switch (NameSpaceId) {
841 case EObjNameSpaceStandard:
842 if (ObjId >= EStdObjMax) {
843 ASSERT (0);
844 return;
845 }
846
847 ParserArray = &StdNamespaceObjectParser[ObjId];
848 break;
849 case EObjNameSpaceArm:
850 if (ObjId >= EArmObjMax) {
851 ASSERT (0);
852 return;
853 }
854
855 ParserArray = &ArmNamespaceObjectParser[ObjId];
856 break;
857 default:
858 // Not supported
859 ASSERT (0);
860 return;
861 } // switch
862
863 ObjectCount = CmObjDesc->Count;
864 RemainingSize = CmObjDesc->Size;
865 Offset = 0;
866
867 for (ObjIndex = 0; ObjIndex < ObjectCount; ObjIndex++) {
868 DEBUG ((
869 DEBUG_ERROR,
870 "\n%-*a [%d/%d]:\n",
871 OUTPUT_FIELD_COLUMN_WIDTH,
872 ParserArray->ObjectName,
873 ObjIndex + 1,
874 ObjectCount
875 ));
876 PrintCmObjDesc (
877 (VOID *)((UINTN)CmObjDesc->Data + Offset),
878 ParserArray->Parser,
879 ParserArray->ItemCount,
880 &RemainingSize,
881 1
882 );
883 if ((RemainingSize > CmObjDesc->Size) ||
884 (RemainingSize < 0))
885 {
886 ASSERT (0);
887 return;
888 }
889
890 Offset = CmObjDesc->Size - RemainingSize;
891 } // for
892
893 ASSERT (RemainingSize == 0);
894 }