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