/** @file Copyright (c) 2021, ARM Limited. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @par Glossary: - Cm or CM - Configuration Manager - Obj or OBJ - Object **/ #ifndef CONFIGURATION_MANAGER_H_ #define CONFIGURATION_MANAGER_H_ /** The configuration manager version. */ #define CONFIGURATION_MANAGER_REVISION CREATE_REVISION (1, 0) /** The OEM ID */ #define CFG_MGR_OEM_ID { 'A', 'R', 'M', 'L', 'T', 'D' } #define CFG_MGR_OEM_REVISION 0x20181101 /** A helper macro for mapping a reference token */ #define REFERENCE_TOKEN(Field) \ (CM_OBJECT_TOKEN)((UINT8*)&CommonPlatformInfo + \ OFFSET_OF (EDKII_COMMON_PLATFORM_REPOSITORY_INFO, Field)) /** A helper macro that constructs the MPID based on the Aff0, Aff1, Aff2, Aff3 values */ #define GET_MPID3(Aff3, Aff2, Aff1, Aff0) \ (((Aff3##ULL) << 32) | ((Aff2) << 16) | ((Aff1) << 8) | (Aff0)) /** A helper macro for populating the GIC CPU information */ #define GICC_ENTRY( \ CPUInterfaceNumber, \ Mpidr, \ PmuIrq, \ VGicIrq, \ GicRedistBase, \ EnergyEfficiency, \ SpeIrq, \ ProximityDomain, \ ClockDomain \ ) { \ CPUInterfaceNumber, /* UINT32 CPUInterfaceNumber */ \ CPUInterfaceNumber, /* UINT32 AcpiProcessorUid */ \ EFI_ACPI_6_2_GIC_ENABLED, /* UINT32 Flags */ \ 0, /* UINT32 ParkingProtocolVersion */ \ PmuIrq, /* UINT32 PerformanceInterruptGsiv */ \ 0, /* UINT64 ParkedAddress */ \ FixedPcdGet64 ( \ PcdGicInterruptInterfaceBase \ ), /* UINT64 PhysicalBaseAddress */ \ 0, /* UINT64 GICV */ \ 0, /* UINT64 GICH */ \ VGicIrq, /* UINT32 VGICMaintenanceInterrupt */ \ GicRedistBase, /* UINT64 GICRBaseAddress */ \ Mpidr, /* UINT64 MPIDR */ \ EnergyEfficiency, /* UINT8 ProcessorPowerEfficiencyClass*/ \ SpeIrq, /* UINT16 SpeOverflowInterrupt */ \ ProximityDomain, /* UINT32 ProximityDomain */ \ ClockDomain, /* UINT32 ClockDomain */ \ EFI_ACPI_6_3_GICC_ENABLED,/* UINT32 Flags */ \ } /** A helper macro for populating the Processor Hierarchy Node flags */ #define PROC_NODE_FLAGS( \ PhysicalPackage, \ AcpiProcessorIdValid, \ ProcessorIsThread, \ NodeIsLeaf, \ IdenticalImplementation \ ) \ ( \ PhysicalPackage | \ (AcpiProcessorIdValid << 1) | \ (ProcessorIsThread << 2) | \ (NodeIsLeaf << 3) | \ (IdenticalImplementation << 4) \ ) /** A helper macro for populating the Cache Type Structure's attributes */ #define CACHE_ATTRIBUTES( \ AllocationType, \ CacheType, \ WritePolicy \ ) \ ( \ AllocationType | \ (CacheType << 2) | \ (WritePolicy << 4) \ ) /** A function that prepares Configuration Manager Objects for returning. @param [in] This Pointer to the Configuration Manager Protocol. @param [in] CmObjectId The Configuration Manager Object ID. @param [in] Token A token for identifying the object. @param [out] CmObject Pointer to the Configuration Manager Object descriptor describing the requested Object. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_NOT_FOUND The required object information is not found. **/ typedef EFI_STATUS (*CM_OBJECT_HANDLER_PROC) ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, IN CONST CM_OBJECT_ID CmObjectId, IN CONST CM_OBJECT_TOKEN Token, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject ); /** A helper function for returning the Configuration Manager Objects. @param [in] CmObjectId The Configuration Manager Object ID. @param [in] Object Pointer to the Object(s). @param [in] ObjectSize Total size of the Object(s). @param [in] ObjectCount Number of Objects. @param [in, out] CmObjectDesc Pointer to the Configuration Manager Object descriptor describing the requested Object. @retval EFI_SUCCESS Success. **/ EFI_STATUS EFIAPI HandleCmObject ( IN CONST CM_OBJECT_ID CmObjectId, IN VOID * Object, IN CONST UINTN ObjectSize, IN CONST UINTN ObjectCount, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObjectDesc ); /** A helper function for returning the Configuration Manager Objects that match the token. @param [in] This Pointer to the Configuration Manager Protocol. @param [in] CmObjectId The Configuration Manager Object ID. @param [in] Object Pointer to the Object(s). @param [in] ObjectSize Total size of the Object(s). @param [in] ObjectCount Number of Objects. @param [in] Token A token identifying the object. @param [in] HandlerProc A handler function to search the object referenced by the token. @param [in, out] CmObjectDesc Pointer to the Configuration Manager Object descriptor describing the requested Object. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_NOT_FOUND The required object information is not found. **/ EFI_STATUS EFIAPI HandleCmObjectRefByToken ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, IN CONST CM_OBJECT_ID CmObjectId, IN VOID * Object, IN CONST UINTN ObjectSize, IN CONST UINTN ObjectCount, IN CONST CM_OBJECT_TOKEN Token, IN CONST CM_OBJECT_HANDLER_PROC HandlerProc, IN OUT CM_OBJ_DESCRIPTOR * CONST CmObjectDesc ); /** The number of CPUs */ #define PLAT_CPU_COUNT 4 /** The number of platform generic timer blocks */ #define PLAT_GTBLOCK_COUNT 1 /** The number of timer frames per generic timer block */ #define PLAT_GTFRAME_COUNT 2 /** The number of Processor Hierarchy Nodes - one package node - two cluster nodes - two cores in cluster 0 - two cores in cluster 1 */ #define PLAT_PROC_HIERARCHY_NODE_COUNT 7 /** The number of unique cache structures: - cluster L3 unified cache - core L1 instruction cache - core L1 data cache - core L2 cache - slc unified cache */ #define PLAT_CACHE_COUNT 5 /** The number of resources private to the cluster - L3 cache */ #define CLUSTER_RESOURCE_COUNT 1 /** The number of resources private to 'core instance - L1 data cache - L1 instruction cache */ #define CORE_RESOURCE_COUNT 2 /** The number of resources private to SoC - slc cache */ #define SOC_RESOURCE_COUNT 1 /** A structure describing the platform configuration manager repository information */ typedef struct CommonPlatformRepositoryInfo { /// Configuration Manager Information CM_STD_OBJ_CONFIGURATION_MANAGER_INFO CmInfo; /// Boot architecture information CM_ARM_BOOT_ARCH_INFO BootArchInfo; #ifdef HEADLESS_PLATFORM /// Fixed feature flag information CM_ARM_FIXED_FEATURE_FLAGS FixedFeatureFlags; #endif /// Power management profile information CM_ARM_POWER_MANAGEMENT_PROFILE_INFO PmProfileInfo; /// GIC CPU interface information CM_ARM_GICC_INFO GicCInfo[PLAT_CPU_COUNT]; /// GIC distributor information CM_ARM_GICD_INFO GicDInfo; /// GIC Redistributor information CM_ARM_GIC_REDIST_INFO GicRedistInfo; /// Generic timer information CM_ARM_GENERIC_TIMER_INFO GenericTimerInfo; /// Generic timer block information CM_ARM_GTBLOCK_INFO GTBlockInfo[PLAT_GTBLOCK_COUNT]; /// Generic timer frame information CM_ARM_GTBLOCK_TIMER_FRAME_INFO GTBlock0TimerInfo[PLAT_GTFRAME_COUNT]; /// Watchdog information CM_ARM_GENERIC_WATCHDOG_INFO Watchdog; /** Serial port information for the serial port console redirection port */ CM_ARM_SERIAL_PORT_INFO SpcrSerialPort; /// Serial port information for the DBG2 UART port CM_ARM_SERIAL_PORT_INFO DbgSerialPort; // Processor topology information CM_ARM_PROC_HIERARCHY_INFO ProcHierarchyInfo[PLAT_PROC_HIERARCHY_NODE_COUNT]; // Cache information CM_ARM_CACHE_INFO CacheInfo[PLAT_CACHE_COUNT]; // Cluster private resources CM_ARM_OBJ_REF ClusterResources[CLUSTER_RESOURCE_COUNT]; // Core private resources CM_ARM_OBJ_REF CoreResources[CORE_RESOURCE_COUNT]; // SoC Resources CM_ARM_OBJ_REF SocResources[SOC_RESOURCE_COUNT]; } EDKII_COMMON_PLATFORM_REPOSITORY_INFO; #endif // CONFIGURATION_MANAGER_H_