--- /dev/null
+/** @file\r
+ Configuration Manager Object parser.\r
+\r
+ Copyright (c) 2021, ARM Limited. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <ConfigurationManagerObject.h>\r
+#include "ConfigurationManagerObjectParser.h"\r
+\r
+STATIC\r
+VOID\r
+EFIAPI\r
+PrintOemId (\r
+ CONST CHAR8* Format,\r
+ UINT8* Ptr\r
+ );\r
+\r
+/** A parser for EArmObjBootArchInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmBootArchInfoParser[] = {\r
+ {"BootArchFlags", 2, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjPowerManagementProfileInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmPowerManagementProfileInfoParser[] = {\r
+ {"PowerManagementProfile", 1, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjGicCInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmGicCInfoParser[] = {\r
+ {"CPUInterfaceNumber", 4, "0x%x", NULL},\r
+ {"AcpiProcessorUid", 4, "0x%x", NULL},\r
+ {"Flags", 4, "0x%x", NULL},\r
+ {"ParkingProtocolVersion", 4, "0x%x", NULL},\r
+ {"PerformanceInterruptGsiv", 4, "0x%x", NULL},\r
+ {"ParkedAddress", 8, "0x%llx", NULL},\r
+ {"PhysicalBaseAddress", 8, "0x%llx", NULL},\r
+ {"GICV", 8, "0x%llx", NULL},\r
+ {"GICH", 8, "0x%llx", NULL},\r
+ {"VGICMaintenanceInterrupt", 4, "0x%x", NULL},\r
+ {"GICRBaseAddress", 8, "0x%llx", NULL},\r
+ {"MPIDR", 8, "0x%llx", NULL},\r
+ {"ProcessorPowerEfficiencyClass", 1, "0x%x", NULL},\r
+ {"SpeOverflowInterrupt", 2, "0x%x", NULL},\r
+ {"ProximityDomain", 4, "0x%x", NULL},\r
+ {"ClockDomain", 4, "0x%x", NULL},\r
+ {"AffinityFlags", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjGicDInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmGicDInfoParser[] = {\r
+ {"PhysicalBaseAddress", 8, "0x%llx", NULL},\r
+ {"SystemVectorBase", 4, "0x%x", NULL},\r
+ {"GicVersion", 1, "0x%x", NULL},\r
+};\r
+\r
+/** A parser for EArmObjGicMsiFrameInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmGicMsiFrameInfoParser[] = {\r
+ {"GicMsiFrameId", 4, "0x%x", NULL},\r
+ {"PhysicalBaseAddress", 8, "0x%llx", NULL},\r
+ {"Flags", 4, "0x%x", NULL},\r
+ {"SPICount", 2, "0x%x", NULL},\r
+ {"SPIBase", 2, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjGicRedistributorInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmGicRedistInfoParser[] = {\r
+ {"DiscoveryRangeBaseAddress", 8, "0x%llx", NULL},\r
+ {"DiscoveryRangeLength", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjGicItsInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmGicItsInfoParser[] = {\r
+ {"GicItsId", 4, "0x%x", NULL},\r
+ {"PhysicalBaseAddress", 8, "0x%llx", NULL},\r
+ {"ProximityDomain", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjSerialConsolePortInfo,\r
+ EArmObjSerialDebugPortInfo and EArmObjSerialPortInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmSerialPortInfoParser[] = {\r
+ {"BaseAddress", 8, "0x%llx", NULL},\r
+ {"Interrupt", 4, "0x%x", NULL},\r
+ {"BaudRate", 8, "0x%llx", NULL},\r
+ {"Clock", 4, "0x%x", NULL},\r
+ {"PortSubtype", 2, "0x%x", NULL},\r
+ {"BaseAddressLength", 8, "0x%llx", NULL},\r
+ {"AccessSize", 1, "0x%d", NULL}\r
+};\r
+\r
+/** A parser for EArmObjGenericTimerInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmGenericTimerInfoParser[] = {\r
+ {"CounterControlBaseAddress", 8, "0x%llx", NULL},\r
+ {"CounterReadBaseAddress", 8, "0x%llx", NULL},\r
+ {"SecurePL1TimerGSIV", 4, "0x%x", NULL},\r
+ {"SecurePL1TimerFlags", 4, "0x%x", NULL},\r
+ {"NonSecurePL1TimerGSIV", 4, "0x%x", NULL},\r
+ {"NonSecurePL1TimerFlags", 4, "0x%x", NULL},\r
+ {"VirtualTimerGSIV", 4, "0x%x", NULL},\r
+ {"VirtualTimerFlags", 4, "0x%x", NULL},\r
+ {"NonSecurePL2TimerGSIV", 4, "0x%x", NULL},\r
+ {"NonSecurePL2TimerFlags", 4, "0x%x", NULL},\r
+ {"VirtualPL2TimerGSIV", 4, "0x%x", NULL},\r
+ {"VirtualPL2TimerFlags", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjPlatformGTBlockInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmGTBlockTimerFrameInfoParser[] = {\r
+ {"FrameNumber", 1, "0x%x", NULL},\r
+ {"PhysicalAddressCntBase", 8, "0x%llx", NULL},\r
+ {"PhysicalAddressCntEL0Base", 8, "0x%llx", NULL},\r
+ {"PhysicalTimerGSIV", 4, "0x%x", NULL},\r
+ {"PhysicalTimerFlags", 4, "0x%x", NULL},\r
+ {"VirtualTimerGSIV", 4, "0x%x", NULL},\r
+ {"VirtualTimerFlags", 4, "0x%x", NULL},\r
+ {"CommonFlags", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjGTBlockTimerFrameInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmGTBlockInfoParser[] = {\r
+ {"GTBlockPhysicalAddress", 8, "0x%llx", NULL},\r
+ {"GTBlockTimerFrameCount", 4, "0x%x", NULL},\r
+ {"GTBlockTimerFrameToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}\r
+};\r
+\r
+/** A parser for EArmObjPlatformGenericWatchdogInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmGenericWatchdogInfoParser[] = {\r
+ {"ControlFrameAddress", 8, "0x%llx", NULL},\r
+ {"RefreshFrameAddress", 8, "0x%llx", NULL},\r
+ {"TimerGSIV", 4, "0x%x", NULL},\r
+ {"Flags", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjPciConfigSpaceInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmPciConfigSpaceInfoParser[] = {\r
+ {"BaseAddress", 8, "0x%llx", NULL},\r
+ {"PciSegmentGroupNumber", 2, "0x%x", NULL},\r
+ {"StartBusNumber", 1, "0x%x", NULL},\r
+ {"EndBusNumber", 1, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjHypervisorVendorIdentity.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmHypervisorVendorIdParser[] = {\r
+ {"HypervisorVendorId", 8, "0x%llx", NULL}\r
+};\r
+\r
+/** A parser for EArmObjFixedFeatureFlags.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmFixedFeatureFlagsParser[] = {\r
+ {"Flags", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjItsGroup.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmItsGroupNodeParser[] = {\r
+ {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"ItsIdCount", 4, "0x%x", NULL},\r
+ {"ItsIdToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}\r
+};\r
+\r
+/** A parser for EArmObjNamedComponent.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmNamedComponentNodeParser[] = {\r
+ {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"IdMappingCount", 4, "0x%x", NULL},\r
+ {"IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"Flags", 4, "0x%x", NULL},\r
+ {"CacheCoherent", 4, "0x%x", NULL},\r
+ {"AllocationHints", 1, "0x%x", NULL},\r
+ {"MemoryAccessFlags", 1, "0x%x", NULL},\r
+ {"AddressSizeLimit", 1, "0x%x", NULL},\r
+ {"ObjectName", sizeof (CHAR8*), "%a", NULL}\r
+};\r
+\r
+/** A parser for EArmObjRootComplex.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmRootComplexNodeParser[] = {\r
+ {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"IdMappingCount", 4, "0x%x", NULL},\r
+ {"IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"CacheCoherent", 4, "0x%x", NULL},\r
+ {"AllocationHints", 1, "0x%x", NULL},\r
+ {"MemoryAccessFlags", 1, "0x%x", NULL},\r
+ {"AtsAttribute", 4, "0x%x", NULL},\r
+ {"PciSegmentNumber", 4, "0x%x", NULL},\r
+ {"MemoryAddressSize", 1, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjSmmuV1SmmuV2.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmSmmuV1SmmuV2NodeParser[] = {\r
+ {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"IdMappingCount", 4, "0x%x", NULL},\r
+ {"IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"BaseAddress", 8, "0x%llx", NULL},\r
+ {"Span", 8, "0x%llx", NULL},\r
+ {"Model", 4, "0x%x", NULL},\r
+ {"Flags", 4, "0x%x", NULL},\r
+ {"ContextInterruptCount", 4, "0x%x", NULL},\r
+ {"ContextInterruptToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"PmuInterruptCount", 4, "0x%x", NULL},\r
+ {"PmuInterruptToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"SMMU_NSgIrpt", 4, "0x%x", NULL},\r
+ {"SMMU_NSgIrptFlags", 4, "0x%x", NULL},\r
+ {"SMMU_NSgCfgIrpt", 4, "0x%x", NULL},\r
+ {"SMMU_NSgCfgIrptFlags", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjSmmuV3.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmSmmuV3NodeParser[] = {\r
+ {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"IdMappingCount", 4, "0x%x", NULL},\r
+ {"IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"BaseAddress", 8, "0x%llx", NULL},\r
+ {"Flags", 4, "0x%x", NULL},\r
+ {"VatosAddress", 8, "0x%llx", NULL},\r
+ {"Model", 4, "0x%x", NULL},\r
+ {"EventInterrupt", 4, "0x%x", NULL},\r
+ {"PriInterrupt", 4, "0x%x", NULL},\r
+ {"GerrInterrupt", 4, "0x%x", NULL},\r
+ {"SyncInterrupt", 4, "0x%x", NULL},\r
+ {"ProximityDomain", 4, "0x%x", NULL},\r
+ {"DeviceIdMappingIndex", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjPmcg.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmPmcgNodeParser[] = {\r
+ {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"IdMappingCount", 4, "0x%x", NULL},\r
+ {"IdMappingToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"BaseAddress", 8, "0x%llx", NULL},\r
+ {"OverflowInterrupt", 4, "0x%x", NULL},\r
+ {"Page1BaseAddress", 8, "0x%llx", NULL},\r
+ {"ReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}\r
+};\r
+\r
+/** A parser for EArmObjGicItsIdentifierArray.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmGicItsIdentifierParser[] = {\r
+ {"ItsId", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjIdMappingArray.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmIdMappingParser[] = {\r
+ {"InputBase", 4, "0x%x", NULL},\r
+ {"NumIds", 4, "0x%x", NULL},\r
+ {"OutputBase", 4, "0x%x", NULL},\r
+ {"OutputReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"Flags", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjSmmuInterruptArray.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmGenericInterruptParser[] = {\r
+ {"Interrupt", 4, "0x%x", NULL},\r
+ {"Flags", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjProcHierarchyInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmProcHierarchyInfoParser[] = {\r
+ {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"Flags", 4, "0x%x", NULL},\r
+ {"ParentToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"GicCToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"NoOfPrivateResources", 4, "0x%x", NULL},\r
+ {"PrivateResourcesArrayToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}\r
+};\r
+\r
+/** A parser for EArmObjCacheInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmCacheInfoParser[] = {\r
+ {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"NextLevelOfCacheToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"Size", 4, "0x%x", NULL},\r
+ {"NumberOfSets", 4, "0x%x", NULL},\r
+ {"Associativity", 4, "0x%x", NULL},\r
+ {"Attributes", 1, "0x%x", NULL},\r
+ {"LineSize", 2, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjProcNodeIdInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmProcNodeIdInfoParser[] = {\r
+ {"Token", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL},\r
+ {"VendorId", 4, "0x%p", NULL},\r
+ {"Level1Id", 8, "0x%x", NULL},\r
+ {"Level2Id", 8, "0x%x", NULL},\r
+ {"MajorRev", 2, "0x%x", NULL},\r
+ {"MinorRev", 2, "0x%x", NULL},\r
+ {"SpinRev", 2, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjCmRef.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmObjRefParser[] = {\r
+ {"ReferenceToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}\r
+};\r
+\r
+/** A parser for EArmObjMemoryAffinityInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmMemoryAffinityInfoParser[] = {\r
+ {"ProximityDomain", 4, "0x%x", NULL},\r
+ {"BaseAddress", 8, "0x%llx", NULL},\r
+ {"Length", 8, "0x%llx", NULL},\r
+ {"Flags", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjDeviceHandleAcpi.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmDeviceHandleAcpiParser[] = {\r
+ {"Hid", 8, "0x%llx", NULL},\r
+ {"Uid", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjDeviceHandlePci.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmDeviceHandlePciParser[] = {\r
+ {"SegmentNumber", 2, "0x%x", NULL},\r
+ {"BusNumber", 1, "0x%x", NULL},\r
+ {"DeviceNumber", 1, "0x%x", NULL},\r
+ {"FunctionNumber", 1, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EArmObjGenericInitiatorAffinityInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmGenericInitiatorAffinityInfoParser[] = {\r
+ {"ProximityDomain", 4, "0x%x", NULL},\r
+ {"Flags", 4, "0x%x", NULL},\r
+ {"DeviceHandleType", 1, "0x%x", NULL},\r
+ {"DeviceHandleToken", sizeof (CM_OBJECT_TOKEN), "0x%p", NULL}\r
+};\r
+\r
+/** A parser for EArmObjCmn600Info.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER CmArmCmn600InfoParser[] = {\r
+ {"PeriphBaseAddress", 8, "0x%llx", NULL},\r
+ {"PeriphBaseAddressLength", 8, "0x%llx", NULL},\r
+ {"RootNodeBaseAddress", 8, "0x%llx", NULL},\r
+ {"DtcCount", 1, "0x%x", NULL},\r
+ {"DtcInterrupt[0]", 4, "0x%x", NULL},\r
+ {"DtcFlags[0]", 4, "0x%x", NULL},\r
+ {"DtcInterrupt[1]", 4, "0x%x", NULL},\r
+ {"DtcFlags[1]", 4, "0x%x", NULL},\r
+ {"DtcInterrupt[2]", 4, "0x%x", NULL},\r
+ {"DtcFlags[2]", 4, "0x%x", NULL},\r
+ {"DtcInterrupt[3]", 4, "0x%x", NULL},\r
+ {"DtcFlags[3]", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for Arm namespace objects.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER_ARRAY ArmNamespaceObjectParser[] = {\r
+ {"EArmObjReserved", NULL, 0},\r
+ {"EArmObjBootArchInfo", CmArmBootArchInfoParser,\r
+ ARRAY_SIZE (CmArmBootArchInfoParser)},\r
+ {"EArmObjCpuInfo", NULL, 0},\r
+ {"EArmObjPowerManagementProfileInfo", CmArmPowerManagementProfileInfoParser,\r
+ ARRAY_SIZE (CmArmPowerManagementProfileInfoParser)},\r
+ {"EArmObjGicCInfo", CmArmGicCInfoParser, ARRAY_SIZE (CmArmGicCInfoParser)},\r
+ {"EArmObjGicDInfo", CmArmGicDInfoParser, ARRAY_SIZE (CmArmGicDInfoParser)},\r
+ {"EArmObjGicMsiFrameInfo", CmArmGicMsiFrameInfoParser,\r
+ ARRAY_SIZE (CmArmGicMsiFrameInfoParser)},\r
+ {"EArmObjGicRedistributorInfo", CmArmGicRedistInfoParser,\r
+ ARRAY_SIZE (CmArmGicRedistInfoParser)},\r
+ {"EArmObjGicItsInfo", CmArmGicItsInfoParser,\r
+ ARRAY_SIZE (CmArmGicItsInfoParser)},\r
+ {"EArmObjSerialConsolePortInfo", CmArmSerialPortInfoParser,\r
+ ARRAY_SIZE (CmArmSerialPortInfoParser)},\r
+ {"EArmObjSerialDebugPortInfo", CmArmSerialPortInfoParser,\r
+ ARRAY_SIZE (CmArmSerialPortInfoParser)},\r
+ {"EArmObjGenericTimerInfo", CmArmGenericTimerInfoParser,\r
+ ARRAY_SIZE (CmArmGenericTimerInfoParser)},\r
+ {"EArmObjPlatformGTBlockInfo", CmArmGTBlockTimerFrameInfoParser,\r
+ ARRAY_SIZE (CmArmGTBlockTimerFrameInfoParser)},\r
+ {"EArmObjGTBlockTimerFrameInfo", CmArmGTBlockInfoParser,\r
+ ARRAY_SIZE (CmArmGTBlockInfoParser)},\r
+ {"EArmObjPlatformGenericWatchdogInfo", CmArmGenericWatchdogInfoParser,\r
+ ARRAY_SIZE (CmArmGenericWatchdogInfoParser)},\r
+ {"EArmObjPciConfigSpaceInfo", CmArmPciConfigSpaceInfoParser,\r
+ ARRAY_SIZE (CmArmPciConfigSpaceInfoParser)},\r
+ {"EArmObjHypervisorVendorIdentity", CmArmHypervisorVendorIdParser,\r
+ ARRAY_SIZE (CmArmHypervisorVendorIdParser)},\r
+ {"EArmObjFixedFeatureFlags", CmArmFixedFeatureFlagsParser,\r
+ ARRAY_SIZE (CmArmFixedFeatureFlagsParser)},\r
+ {"EArmObjItsGroup", CmArmItsGroupNodeParser,\r
+ ARRAY_SIZE (CmArmItsGroupNodeParser)},\r
+ {"EArmObjNamedComponent", CmArmNamedComponentNodeParser,\r
+ ARRAY_SIZE (CmArmNamedComponentNodeParser)},\r
+ {"EArmObjRootComplex", CmArmRootComplexNodeParser,\r
+ ARRAY_SIZE (CmArmRootComplexNodeParser)},\r
+ {"EArmObjSmmuV1SmmuV2", CmArmSmmuV1SmmuV2NodeParser,\r
+ ARRAY_SIZE (CmArmSmmuV1SmmuV2NodeParser)},\r
+ {"EArmObjSmmuV3", CmArmSmmuV3NodeParser,\r
+ ARRAY_SIZE (CmArmSmmuV3NodeParser)},\r
+ {"EArmObjPmcg", CmArmPmcgNodeParser, ARRAY_SIZE (CmArmPmcgNodeParser)},\r
+ {"EArmObjGicItsIdentifierArray", CmArmGicItsIdentifierParser,\r
+ ARRAY_SIZE (CmArmGicItsIdentifierParser)},\r
+ {"EArmObjIdMappingArray", CmArmIdMappingParser,\r
+ ARRAY_SIZE (CmArmIdMappingParser)},\r
+ {"EArmObjSmmuInterruptArray", CmArmGenericInterruptParser,\r
+ ARRAY_SIZE (CmArmGenericInterruptParser)},\r
+ {"EArmObjProcHierarchyInfo", CmArmProcHierarchyInfoParser,\r
+ ARRAY_SIZE (CmArmProcHierarchyInfoParser)},\r
+ {"EArmObjCacheInfo", CmArmCacheInfoParser,\r
+ ARRAY_SIZE (CmArmCacheInfoParser)},\r
+ {"EArmObjProcNodeIdInfo", CmArmProcNodeIdInfoParser,\r
+ ARRAY_SIZE (CmArmProcNodeIdInfoParser)},\r
+ {"EArmObjCmRef", CmArmObjRefParser, ARRAY_SIZE (CmArmObjRefParser)},\r
+ {"EArmObjMemoryAffinityInfo", CmArmMemoryAffinityInfoParser,\r
+ ARRAY_SIZE (CmArmMemoryAffinityInfoParser)},\r
+ {"EArmObjDeviceHandleAcpi", CmArmDeviceHandleAcpiParser,\r
+ ARRAY_SIZE (CmArmDeviceHandleAcpiParser)},\r
+ {"EArmObjDeviceHandlePci", CmArmDeviceHandlePciParser,\r
+ ARRAY_SIZE (CmArmDeviceHandlePciParser)},\r
+ {"EArmObjGenericInitiatorAffinityInfo",\r
+ CmArmGenericInitiatorAffinityInfoParser,\r
+ ARRAY_SIZE (CmArmGenericInitiatorAffinityInfoParser)},\r
+ {"EArmObjSerialPortInfo", CmArmSerialPortInfoParser,\r
+ ARRAY_SIZE (CmArmSerialPortInfoParser)},\r
+ {"EArmObjCmn600Info", CmArmCmn600InfoParser,\r
+ ARRAY_SIZE (CmArmCmn600InfoParser)},\r
+ {"EArmObjMax", NULL, 0},\r
+};\r
+\r
+/** A parser for EStdObjCfgMgrInfo.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER StdObjCfgMgrInfoParser[] = {\r
+ {"Revision", 4, "0x%x", NULL},\r
+ {"OemId[6]", 6, "%C%C%C%C%C%C", PrintOemId}\r
+};\r
+\r
+/** A parser for EStdObjAcpiTableList.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER StdObjAcpiTableInfoParser[] = {\r
+ {"AcpiTableSignature", 4, "0x%x", NULL},\r
+ {"AcpiTableRevision", 1, "%d", NULL},\r
+ {"TableGeneratorId", sizeof (ACPI_TABLE_GENERATOR_ID), "0x%x", NULL},\r
+ {"AcpiTableData", sizeof (EFI_ACPI_DESCRIPTION_HEADER*), "0x%p", NULL},\r
+ {"OemTableId", 8, "0x%LLX", NULL},\r
+ {"OemRevision", 4, "0x%x", NULL}\r
+};\r
+\r
+/** A parser for EStdObjSmbiosTableList.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER StdObjSmbiosTableInfoParser[] = {\r
+ {"TableGeneratorId", sizeof (SMBIOS_TABLE_GENERATOR_ID), "0x%x", NULL},\r
+ {"SmbiosTableData", sizeof (SMBIOS_STRUCTURE*), "0x%p", NULL}\r
+};\r
+\r
+/** A parser for Standard namespace objects.\r
+*/\r
+STATIC CONST CM_OBJ_PARSER_ARRAY StdNamespaceObjectParser[] = {\r
+ {"EStdObjCfgMgrInfo", StdObjCfgMgrInfoParser,\r
+ ARRAY_SIZE (StdObjCfgMgrInfoParser)},\r
+ {"EStdObjAcpiTableList", StdObjAcpiTableInfoParser,\r
+ ARRAY_SIZE (StdObjAcpiTableInfoParser)},\r
+ {"EStdObjSmbiosTableList", StdObjSmbiosTableInfoParser,\r
+ ARRAY_SIZE (StdObjSmbiosTableInfoParser)},\r
+};\r
+\r
+/** Print OEM Id.\r
+\r
+ @param [in] Format Format to print the Ptr.\r
+ @param [in] Ptr Pointer to the OEM Id.\r
+**/\r
+STATIC\r
+VOID\r
+EFIAPI\r
+PrintOemId (\r
+ IN CONST CHAR8 * Format,\r
+ IN UINT8 * Ptr\r
+ )\r
+{\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ (Format != NULL) ? Format : "%C%C%C%C%C%C",\r
+ Ptr[0],\r
+ Ptr[1],\r
+ Ptr[2],\r
+ Ptr[3],\r
+ Ptr[4],\r
+ Ptr[5]\r
+ ));\r
+}\r
+\r
+/** Print fields of the objects.\r
+\r
+ @param [in] Data Pointer to the object to print.\r
+ @param [in] Parser Parser containing the object fields.\r
+ @param [in] ItemCount Number of entries/fields in the Parser.\r
+ @param [in] RemainingSize Parse at most *RemainingSize bytes.\r
+ This function decrements the value\r
+ from the number bytes consumed.\r
+ @param [in] IndentLevel Indentation to use when printing.\r
+**/\r
+STATIC\r
+VOID\r
+PrintCmObjDesc (\r
+ IN VOID *Data,\r
+ IN CONST CM_OBJ_PARSER *Parser,\r
+ IN UINTN ItemCount,\r
+ IN INTN *RemainingSize,\r
+ IN UINT32 IndentLevel\r
+ )\r
+{\r
+ UINT32 Index;\r
+ UINT32 IndentIndex;\r
+ INTN SubStructSize;\r
+\r
+ if ((Data == NULL) ||\r
+ (Parser == NULL) ||\r
+ (ItemCount == 0) ||\r
+ (RemainingSize == NULL)) {\r
+ ASSERT (0);\r
+ return;\r
+ }\r
+\r
+ // Print each field.\r
+ for (Index = 0; Index < ItemCount; Index++) {\r
+ // Check there is enough space in left.\r
+ *RemainingSize -= Parser[Index].Length;\r
+ if (*RemainingSize < 0) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "\nERROR: %a: Buffer overrun\n",\r
+ Parser[Index].NameStr\r
+ ));\r
+ ASSERT (0);\r
+ return;\r
+ }\r
+\r
+ // Indentation\r
+ for (IndentIndex = 0; IndentIndex < IndentLevel; IndentIndex++) {\r
+ DEBUG ((DEBUG_ERROR, " "));\r
+ }\r
+\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "%-*a :",\r
+ OUTPUT_FIELD_COLUMN_WIDTH - 2 * IndentLevel,\r
+ Parser[Index].NameStr\r
+ ));\r
+ if (Parser[Index].PrintFormatter != NULL) {\r
+ Parser[Index].PrintFormatter (Parser[Index].Format, Data);\r
+ } else if (Parser[Index].Format != NULL) {\r
+ switch (Parser[Index].Length) {\r
+ case 1:\r
+ DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT8*)Data));\r
+ break;\r
+ case 2:\r
+ DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT16*)Data));\r
+ break;\r
+ case 4:\r
+ DEBUG ((DEBUG_ERROR, Parser[Index].Format, *(UINT32*)Data));\r
+ break;\r
+ case 8:\r
+ DEBUG ((DEBUG_ERROR, Parser[Index].Format, ReadUnaligned64(Data)));\r
+ break;\r
+ default:\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "\nERROR: %a: CANNOT PARSE THIS FIELD, Field Length = %d\n",\r
+ Parser[Index].NameStr,\r
+ Parser[Index].Length\r
+ ));\r
+ } // switch\r
+ } else if (Parser[Index].SubObjParser != NULL) {\r
+ SubStructSize = Parser[Index].Length;\r
+\r
+ DEBUG ((DEBUG_ERROR, "\n"));\r
+ PrintCmObjDesc (\r
+ Data,\r
+ Parser[Index].SubObjParser,\r
+ Parser[Index].SubObjItemCount,\r
+ &SubStructSize,\r
+ IndentLevel + 1\r
+ );\r
+ } else {\r
+ ASSERT (0);\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "\nERROR: %a: CANNOT PARSE THIS FIELD, Field Length = %d\n",\r
+ Parser[Index].NameStr,\r
+ Parser[Index].Length\r
+ ));\r
+ }\r
+ DEBUG ((DEBUG_ERROR, "\n"));\r
+ Data += Parser[Index].Length;\r
+ } // for\r
+}\r
+\r
+/** Parse and print a CmObjDesc.\r
+\r
+ @param [in] CmObjDesc The CmObjDesc to parse and print.\r
+**/\r
+VOID\r
+EFIAPI\r
+ParseCmObjDesc (\r
+ IN CONST CM_OBJ_DESCRIPTOR * CmObjDesc\r
+ )\r
+{\r
+ UINTN ObjId;\r
+ UINTN NameSpaceId;\r
+ UINT32 ObjIndex;\r
+ UINT32 ObjectCount;\r
+ INTN RemainingSize;\r
+ CONST CM_OBJ_PARSER_ARRAY * ParserArray;\r
+\r
+ if ((CmObjDesc == NULL) || (CmObjDesc->Data == NULL)) {\r
+ return;\r
+ }\r
+\r
+ NameSpaceId = GET_CM_NAMESPACE_ID (CmObjDesc->ObjectId);\r
+ ObjId = GET_CM_OBJECT_ID (CmObjDesc->ObjectId);\r
+\r
+ switch (NameSpaceId) {\r
+ case EObjNameSpaceStandard:\r
+ if (ObjId >= EStdObjMax) {\r
+ ASSERT (0);\r
+ return;\r
+ }\r
+ ParserArray = &StdNamespaceObjectParser[ObjId];\r
+ break;\r
+ case EObjNameSpaceArm:\r
+ if (ObjId >= EArmObjMax) {\r
+ ASSERT (0);\r
+ return;\r
+ }\r
+ ParserArray = &ArmNamespaceObjectParser[ObjId];\r
+ break;\r
+ default:\r
+ // Not supported\r
+ ASSERT (0);\r
+ return;\r
+ } // switch\r
+\r
+ ObjectCount = CmObjDesc->Count;\r
+ RemainingSize = CmObjDesc->Size;\r
+\r
+ for (ObjIndex = 0; ObjIndex < ObjectCount; ObjIndex++) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "\n%-*a [%d/%d]:\n",\r
+ OUTPUT_FIELD_COLUMN_WIDTH,\r
+ ParserArray->ObjectName,\r
+ ObjIndex + 1,\r
+ ObjectCount\r
+ ));\r
+ PrintCmObjDesc (\r
+ CmObjDesc->Data,\r
+ ParserArray->Parser,\r
+ ParserArray->ItemCount,\r
+ &RemainingSize,\r
+ 1\r
+ );\r
+ } // for\r
+}\r