Hi Sami, Please go ahead with the change.
Thanks Chandni On Mon, Apr 19, 2021 at 3:30 PM Sami Mujawar <sami.muja...@arm.com> wrote: > > Hi Chandni, > > Please find my response inline marked [SAMI]. > > Regards, > > Sami Mujawar > > On 19/04/2021, 06:41, "Chandni Cherukuri" <chandni.cheruk...@arm.com> wrote: > > This patch implements the configuration manager for Morello > platform. It enables support for generating the following > ACPI tables for Morello FVP Platform: > 1. FADT > 2. DSDT > 3. GTDT > 4. MADT > 5. SPCR > 6. DBG2 > 7. PPTT > 8. IORT > 9. MCFG > 10. SSDT > > Structures have been created to add Common Platform information > and FVP/Testchip platform specific information so that the > same Dxe is usable for all variants of the platform. > > Co-authored-by: Jessica Clarke <jrt...@jrtc27.com> > Signed-off-by: Chandni Cherukuri <chandni.cheruk...@arm.com> > --- > > Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerFvp.dsc.inc > | 16 + > > Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerDxeFvp.inf > | 94 ++ > > Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.h > | 281 +++++ > > Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerFvp.h > | 122 ++ > > Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/Platform.h > | 91 ++ > > Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.c > | 1170 ++++++++++++++++++++ > > Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerFvp.c > | 602 ++++++++++ > > Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/AslTables/DsdtFvp.asl > | 98 ++ > > Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/AslTables/SsdtPciFvp.asl > | 130 +++ > 9 files changed, 2604 insertions(+) > > diff --git > a/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerFvp.dsc.inc > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerFvp.dsc.inc > new file mode 100644 > index 000000000000..71916783c24c > --- /dev/null > +++ > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerFvp.dsc.inc > @@ -0,0 +1,16 @@ > +## @file > +# dsc include file for Configuration Manager > +# > +# Copyright (c) 2021, ARM Limited. All rights reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + > +[BuildOptions] > + > +[Components.common] > + # Configuration Manager > + > Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerDxeFvp.inf > diff --git > a/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerDxeFvp.inf > > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerDxeFvp.inf > new file mode 100644 > index 000000000000..6fc307df014c > --- /dev/null > +++ > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerDxeFvp.inf > @@ -0,0 +1,94 @@ > +## @file > +# Configuration Manager Dxe > +# > +# Copyright (c) 2021, ARM Limited. All rights reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +## > + > +[Defines] > + INF_VERSION = 0x0001001B > + BASE_NAME = ConfigurationManagerDxe > + FILE_GUID = 6F9C3B47-6F7D-44B6-87E5-4B7F44A60147 > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.0 > + ENTRY_POINT = ConfigurationManagerDxeInitialize > + > +# > +# The following information is for reference only and not required by > the build tools. > +# > +# VALID_ARCHITECTURES = AARCH64 > +# > + > +[Sources] > + AslTables/DsdtFvp.asl > + AslTables/SsdtPciFvp.asl > + ConfigurationManager.c > + ConfigurationManager.h > + ConfigurationManagerFvp.c > + ConfigurationManagerFvp.h > + Platform.h > + > +[Packages] > + ArmPkg/ArmPkg.dec > + ArmPlatformPkg/ArmPlatformPkg.dec > + DynamicTablesPkg/DynamicTablesPkg.dec > + MdeModulePkg/MdeModulePkg.dec > + MdePkg/MdePkg.dec > + Platform/ARM/Morello/MorelloPlatform.dec > + > +[LibraryClasses] > + UefiDriverEntryPoint > + > +[Protocols] > + gEdkiiConfigurationManagerProtocolGuid > + > +[FixedPcd] > + gArmMorelloTokenSpaceGuid.PcdPciBusCount > + gArmMorelloTokenSpaceGuid.PcdPciBusMax > + gArmMorelloTokenSpaceGuid.PcdPciBusMin > + gArmMorelloTokenSpaceGuid.PcdPciExpressBaseAddress > + gArmMorelloTokenSpaceGuid.PcdPciIoBase > + gArmMorelloTokenSpaceGuid.PcdPciIoMaxBase > + gArmMorelloTokenSpaceGuid.PcdPciIoSize > + gArmMorelloTokenSpaceGuid.PcdPciIoTranslation > + gArmMorelloTokenSpaceGuid.PcdPciMmio32Base > + gArmMorelloTokenSpaceGuid.PcdPciMmio32MaxBase > + gArmMorelloTokenSpaceGuid.PcdPciMmio32Size > + gArmMorelloTokenSpaceGuid.PcdPciMmio32Translation > + gArmMorelloTokenSpaceGuid.PcdPciMmio64Base > + gArmMorelloTokenSpaceGuid.PcdPciMmio64MaxBase > + gArmMorelloTokenSpaceGuid.PcdPciMmio64Size > + gArmMorelloTokenSpaceGuid.PcdPciMmio64Translation > + > + gArmMorelloTokenSpaceGuid.PcdVirtioBlkBaseAddress > + gArmMorelloTokenSpaceGuid.PcdVirtioBlkInterrupt > + gArmMorelloTokenSpaceGuid.PcdVirtioBlkSize > + > + ## PL011 Serial Debug UART > + gArmPlatformTokenSpaceGuid.PcdSerialDbgRegisterBase > + gArmPlatformTokenSpaceGuid.PcdSerialDbgUartBaudRate > + gArmPlatformTokenSpaceGuid.PcdSerialDbgUartClkInHz > + > + gArmPlatformTokenSpaceGuid.PL011UartClkInHz > + gArmPlatformTokenSpaceGuid.PL011UartInterrupt > + > + gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum > + gArmTokenSpaceGuid.PcdArmArchTimerIntrNum > + gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum > + gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum > + > + # SBSA Generic Watchdog > + gArmTokenSpaceGuid.PcdGenericWatchdogControlBase > + gArmTokenSpaceGuid.PcdGenericWatchdogEl2IntrNum > + gArmTokenSpaceGuid.PcdGenericWatchdogRefreshBase > + > + gArmTokenSpaceGuid.PcdGicDistributorBase > + gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase > + gArmTokenSpaceGuid.PcdGicRedistributorsBase > + > + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase > + gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate > + > +[Depex] > + TRUE > diff --git > a/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.h > > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.h > new file mode 100644 > index 000000000000..fea4a0efd24a > --- /dev/null > +++ > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.h > @@ -0,0 +1,281 @@ > +/** @file > + > + Copyright (c) 2021, ARM Limited. All rights reserved.<BR> > + > + 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 > + - L2 cache > +*/ > +#define CORE_RESOURCE_COUNT 3 > + > +/** 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_ > diff --git > a/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerFvp.h > > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerFvp.h > new file mode 100644 > index 000000000000..4628b7a879aa > --- /dev/null > +++ > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerFvp.h > @@ -0,0 +1,122 @@ > +/** @file > + > + Copyright (c) 2021, ARM Limited. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > + @par Glossary: > + - Cm or CM - Configuration Manager > + - Obj or OBJ - Object > +**/ > + > +#ifndef FVP_CONFIGURATION_MANAGER_H_ > +#define FVP_CONFIGURATION_MANAGER_H_ > + > +#include "ConfigurationManager.h" > + > +/** The number of ACPI tables to install > +*/ > +#define PLAT_ACPI_TABLE_COUNT 10 > + > +/** A helper macro for mapping a reference token > +*/ > +#define REFERENCE_TOKEN_FVP(Field) \ > + (CM_OBJECT_TOKEN)((UINT8*)&MorelloFvpRepositoryInfo + \ > + OFFSET_OF (EDKII_FVP_PLATFORM_REPOSITORY_INFO, Field)) > + > +/** C array containing the compiled AML template. > + These symbols are defined in the auto generated C file > + containing the AML bytecode array. > +*/ > +extern CHAR8 dsdtfvp_aml_code[]; > +extern CHAR8 ssdtpcifvp_aml_code[]; > + > +/** A structure describing the FVP Platform specific information > +*/ > +typedef struct FvpPlatformRepositoryInfo { > + /// List of ACPI tables > + CM_STD_OBJ_ACPI_TABLE_INFO > CmAcpiTableList[PLAT_ACPI_TABLE_COUNT]; > + > + /// GIC ITS information > + CM_ARM_GIC_ITS_INFO GicItsInfo[2]; > + > + /// ITS Group node > + CM_ARM_ITS_GROUP_NODE ItsGroupInfo[2]; > + > + /// ITS Identifier array > + CM_ARM_ITS_IDENTIFIER ItsIdentifierArray[2]; > + > + /// SMMUv3 node > + CM_ARM_SMMUV3_NODE SmmuV3Info[1]; > + > + /// PCI Root complex node > + CM_ARM_ROOT_COMPLEX_NODE RootComplexInfo[1]; > + > + /// Array of DeviceID mapping > + CM_ARM_ID_MAPPING DeviceIdMapping[2][2]; > + > + /// PCI configuration space information > + CM_ARM_PCI_CONFIG_SPACE_INFO PciConfigInfo[1]; > + > +} EDKII_FVP_PLATFORM_REPOSITORY_INFO; > + > +/** A structure describing the platform configuration > + manager repository information > +*/ > +typedef struct PlatformRepositoryInfo { > + > + /// Common information > + EDKII_COMMON_PLATFORM_REPOSITORY_INFO * CommonPlatRepoInfo; > + > + /// FVP Platform specific information > + EDKII_FVP_PLATFORM_REPOSITORY_INFO * FvpPlatRepoInfo; > + > +} EDKII_PLATFORM_REPOSITORY_INFO; > + > +extern EDKII_COMMON_PLATFORM_REPOSITORY_INFO CommonPlatformInfo; > + > +/** Return platform specific ARM namespace object. > + > + @param [in] This Pointer to the Configuration Manager > Protocol. > + @param [in] CmObjectId The Configuration Manager Object ID. > + @param [in] Token An optional token identifying the object. > If > + unused this must be CM_NULL_TOKEN. > + @param [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +GetArmNameSpaceObjectPlat ( > + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, > + IN CONST CM_OBJECT_ID CmObjectId, > + IN CONST CM_OBJECT_TOKEN Token OPTIONAL, > + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject > + ); > + > +/** Return platform specific standard namespace object. > + > + @param [in] This Pointer to the Configuration Manager > Protocol. > + @param [in] CmObjectId The Configuration Manager Object ID. > + @param [in] Token An optional token identifying the object. > If > + unused this must be CM_NULL_TOKEN. > + @param [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +GetStandardNameSpaceObjectPlat ( > + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, > + IN CONST CM_OBJECT_ID CmObjectId, > + IN CONST CM_OBJECT_TOKEN Token OPTIONAL, > + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject > + ); > + > +#endif // FVP_CONFIGURATION_MANAGER_H_ > diff --git > a/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/Platform.h > > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/Platform.h > new file mode 100644 > index 000000000000..e6af6e170e4a > --- /dev/null > +++ > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/Platform.h > @@ -0,0 +1,91 @@ > +/** @file > + > + Copyright (c) 2021, ARM Limited. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#ifndef PLATFORM_H_ > +#define PLATFORM_H_ > + > +#define ENABLE_MEM_MAPPED_TIMER > + > +#ifdef ENABLE_MEM_MAPPED_TIMER > +// REFCLK CNTControl > +#define MORELLO_SYSTEM_TIMER_BASE_ADDRESS 0x2A430000 > +// REFCLK CNTRead > +#define MORELLO_CNT_READ_BASE_ADDRESS 0x2A800000 > +#else > +#define MORELLO_SYSTEM_TIMER_BASE_ADDRESS 0xFFFFFFFFFFFFFFFF > +#define MORELLO_CNT_READ_BASE_ADDRESS 0xFFFFFFFFFFFFFFFF > +#endif > + > +// GT Block Timer > +// AP_REFCLK CNTCTL > +#define MORELLO_GT_BLOCK_CTL_BASE 0x2A810000 > +#define MORELLO_TIMER_FRAMES_COUNT 2 > + > +// GT Block Timer Frames > +// AP_REFCLK_NS CNTBase0 > +#define MORELLO_GT_BLOCK_FRAME0_CTL_BASE 0x2A830000 > +#define MORELLO_GT_BLOCK_FRAME0_CTL_EL0_BASE 0xFFFFFFFFFFFFFFFF > +#define MORELLO_GT_BLOCK_FRAME0_GSIV 92 > + > +// AP_REFCLK_S CNTBase1 > +#define MORELLO_GT_BLOCK_FRAME1_CTL_BASE 0x2A820000 > +#define MORELLO_GT_BLOCK_FRAME1_CTL_EL0_BASE 0xFFFFFFFFFFFFFFFF > +#define MORELLO_GT_BLOCK_FRAME1_GSIV 91 > + > +#define GTDT_TIMER_EDGE_TRIGGERED \ > + EFI_ACPI_6_3_GTDT_TIMER_FLAG_TIMER_INTERRUPT_MODE > +#define GTDT_TIMER_LEVEL_TRIGGERED 0 > +#define GTDT_TIMER_ACTIVE_LOW \ > + EFI_ACPI_6_3_GTDT_TIMER_FLAG_TIMER_INTERRUPT_POLARITY > +#define GTDT_TIMER_ACTIVE_HIGH 0 > +#define GTDT_TIMER_SAVE_CONTEXT \ > + EFI_ACPI_6_3_GTDT_TIMER_FLAG_ALWAYS_ON_CAPABILITY > +#define GTDT_TIMER_LOSE_CONTEXT 0 > + > +#define MORELLO_GTDT_GTIMER_FLAGS (GTDT_TIMER_LOSE_CONTEXT | \ > + GTDT_TIMER_ACTIVE_LOW | \ > + GTDT_TIMER_LEVEL_TRIGGERED) > + > +// GT Block Timer Flags > +#define GTX_TIMER_EDGE_TRIGGERED \ > + EFI_ACPI_6_3_GTDT_GT_BLOCK_TIMER_FLAG_TIMER_INTERRUPT_MODE > +#define GTX_TIMER_LEVEL_TRIGGERED 0 > +#define GTX_TIMER_ACTIVE_LOW \ > + EFI_ACPI_6_3_GTDT_GT_BLOCK_TIMER_FLAG_TIMER_INTERRUPT_POLARITY > +#define GTX_TIMER_ACTIVE_HIGH 0 > + > +#define MORELLO_GTX_TIMER_FLAGS (GTX_TIMER_ACTIVE_HIGH | \ > + GTX_TIMER_LEVEL_TRIGGERED) > + > +#define GTX_TIMER_SECURE \ > + EFI_ACPI_6_3_GTDT_GT_BLOCK_COMMON_FLAG_SECURE_TIMER > +#define GTX_TIMER_NON_SECURE 0 > +#define GTX_TIMER_SAVE_CONTEXT \ > + EFI_ACPI_6_3_GTDT_GT_BLOCK_COMMON_FLAG_ALWAYS_ON_CAPABILITY > +#define GTX_TIMER_LOSE_CONTEXT 0 > + > +#define MORELLO_GTX_COMMON_FLAGS_S (GTX_TIMER_SAVE_CONTEXT | \ > + GTX_TIMER_SECURE) > +#define MORELLO_GTX_COMMON_FLAGS_NS (GTX_TIMER_SAVE_CONTEXT | \ > + GTX_TIMER_NON_SECURE) > + > +// Watchdog > +#define SBSA_WATCHDOG_EDGE_TRIGGERED \ > + > EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_TIMER_INTERRUPT_MODE > +#define SBSA_WATCHDOG_LEVEL_TRIGGERED 0 > +#define SBSA_WATCHDOG_ACTIVE_LOW \ > + > EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_TIMER_INTERRUPT_POLARITY > +#define SBSA_WATCHDOG_ACTIVE_HIGH 0 > +#define SBSA_WATCHDOG_SECURE \ > + EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_SECURE_TIMER > +#define SBSA_WATCHDOG_NON_SECURE 0 > + > +#define MORELLO_SBSA_WATCHDOG_FLAGS (SBSA_WATCHDOG_NON_SECURE > | \ > + SBSA_WATCHDOG_ACTIVE_HIGH > | \ > + > SBSA_WATCHDOG_LEVEL_TRIGGERED) > + > +#endif // PLATFORM_H_ > diff --git > a/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.c > > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.c > new file mode 100644 > index 000000000000..89fadbcb03a8 > --- /dev/null > +++ > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.c > @@ -0,0 +1,1170 @@ > +/** @file > + Configuration Manager Dxe > + > + Copyright (c) 2021, ARM Limited. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > + @par Glossary: > + - Cm or CM - Configuration Manager > + - Obj or OBJ - Object > +**/ > + > +#include <IndustryStandard/DebugPort2Table.h> > +#include <IndustryStandard/SerialPortConsoleRedirectionTable.h> > +#include <Library/DebugLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Protocol/ConfigurationManagerProtocol.h> > + > +#include "ConfigurationManagerFvp.h" > +#include "ConfigurationManager.h" > +#include "Platform.h" > + > +extern EDKII_PLATFORM_REPOSITORY_INFO MorelloRepositoryInfo; > + > +// The platform configuration repository information. > +EDKII_COMMON_PLATFORM_REPOSITORY_INFO CommonPlatformInfo = { > + // Configuration Manager information > + { CONFIGURATION_MANAGER_REVISION, CFG_MGR_OEM_ID }, > + > + // Boot architecture information > + { EFI_ACPI_6_3_ARM_PSCI_COMPLIANT }, // BootArchFlags > + > +#ifdef HEADLESS_PLATFORM > + // Fixed feature flag information > + { EFI_ACPI_6_3_HEADLESS }, // Fixed feature > flags > +#endif > + > + // Power management profile information > + { EFI_ACPI_6_3_PM_PROFILE_ENTERPRISE_SERVER }, // PowerManagement > Profile > + > + /* GIC CPU Interface information > + GIC_ENTRY (CPUInterfaceNumber, Mpidr, PmuIrq, VGicIrq, > GicRedistBase, > + EnergyEfficiency, SpeIrq, ProximityDomain, ClockDomain) > + */ > + { > + GICC_ENTRY (0, GET_MPID3 (0x0, 0x0, 0x0, 0x0), 23, 25, 0, 0, 21, 0, > 0), > + GICC_ENTRY (1, GET_MPID3 (0x0, 0x0, 0x1, 0x0), 23, 25, 0, 0, 21, 0, > 0), > + GICC_ENTRY (2, GET_MPID3 (0x0, 0x1, 0x0, 0x0), 23, 25, 0, 0, 21, 0, > 0), > + GICC_ENTRY (3, GET_MPID3 (0x0, 0x1, 0x1, 0x0), 23, 25, 0, 0, 21, 0, > 0), > + }, > + > + // GIC Distributor Info > + { > + FixedPcdGet64 (PcdGicDistributorBase), // UINT64 > PhysicalBaseAddress > + 0, // UINT32 SystemVectorBase > + 3 // UINT8 GicVersion > + }, > + > + // GIC Re-Distributor Info > + { > + // UINT64 DiscoveryRangeBaseAddress > + FixedPcdGet64 (PcdGicRedistributorsBase), > + // UINT32 DiscoveryRangeLength > + SIZE_1MB > + }, > + > + // Generic Timer Info > + { > + // The physical base address for the counter control frame > + MORELLO_SYSTEM_TIMER_BASE_ADDRESS, > + // The physical base address for the counter read frame > + MORELLO_CNT_READ_BASE_ADDRESS, > + // The secure PL1 timer interrupt > + FixedPcdGet32 (PcdArmArchTimerSecIntrNum), > + // The secure PL1 timer flags > + MORELLO_GTDT_GTIMER_FLAGS, > + // The non-secure PL1 timer interrupt > + FixedPcdGet32 (PcdArmArchTimerIntrNum), > + // The non-secure PL1 timer flags > + MORELLO_GTDT_GTIMER_FLAGS, > + // The virtual timer interrupt > + FixedPcdGet32 (PcdArmArchTimerVirtIntrNum), > + // The virtual timer flags > + MORELLO_GTDT_GTIMER_FLAGS, > + // The non-secure PL2 timer interrupt > + FixedPcdGet32 (PcdArmArchTimerHypIntrNum), > + // The non-secure PL2 timer flags > + MORELLO_GTDT_GTIMER_FLAGS > + }, > + > + // Generic Timer Block Information > + { > + { > + // The physical base address for the GT Block Timer structure > + MORELLO_GT_BLOCK_CTL_BASE, > + // The number of timer frames implemented in the GT Block > + MORELLO_TIMER_FRAMES_COUNT, > + // Reference token for the GT Block timer frame list > + REFERENCE_TOKEN (GTBlock0TimerInfo) > + } > + }, > + > + // GT Block Timer Frames > + { > + // Frame 0 > + { > + 0, // UINT8 FrameNumber > + MORELLO_GT_BLOCK_FRAME0_CTL_BASE, // UINT64 > PhysicalAddressCntBase > + MORELLO_GT_BLOCK_FRAME0_CTL_EL0_BASE, // UINT64 > PhysicalAddressCntEL0Base > + MORELLO_GT_BLOCK_FRAME0_GSIV, // UINT32 PhysicalTimerGSIV > + MORELLO_GTX_TIMER_FLAGS, // UINT32 PhysicalTimerFlags > + 0, // UINT32 VirtualTimerGSIV > + 0, // UINT32 VirtualTimerFlags > + MORELLO_GTX_COMMON_FLAGS_NS // UINT32 CommonFlags > + }, > + // Frame 1 > + { > + 1, // UINT8 FrameNumber > + MORELLO_GT_BLOCK_FRAME1_CTL_BASE, // UINT64 > PhysicalAddressCntBase > + MORELLO_GT_BLOCK_FRAME1_CTL_EL0_BASE, // UINT64 > PhysicalAddressCntEL0Base > + MORELLO_GT_BLOCK_FRAME1_GSIV, // UINT32 PhysicalTimerGSIV > + MORELLO_GTX_TIMER_FLAGS, // UINT32 PhysicalTimerFlags > + 0, // UINT32 VirtualTimerGSIV > + 0, // UINT32 VirtualTimerFlags > + MORELLO_GTX_COMMON_FLAGS_S // UINT32 CommonFlags > + }, > + }, > + > + // Watchdog Info > + { > + // The physical base address of the SBSA Watchdog control frame > + FixedPcdGet64 (PcdGenericWatchdogControlBase), > + // The physical base address of the SBSA Watchdog refresh frame > + FixedPcdGet64 (PcdGenericWatchdogRefreshBase), > + // The watchdog interrupt > + FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum), > + // The watchdog flags > + MORELLO_SBSA_WATCHDOG_FLAGS > + }, > + > + // SPCR Serial Port > + { > + FixedPcdGet64 (PcdSerialRegisterBase), // > BaseAddress > + FixedPcdGet32 (PL011UartInterrupt), // Interrupt > + FixedPcdGet64 (PcdUartDefaultBaudRate), // BaudRate > + FixedPcdGet32 (PL011UartClkInHz), // Clock > + EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART // Port > subtype > + }, > + > + // Debug Serial Port > + { > + FixedPcdGet64 (PcdSerialDbgRegisterBase), // > BaseAddress > + 0, // Interrupt > -unused > + FixedPcdGet64 (PcdSerialDbgUartBaudRate), // BaudRate > + FixedPcdGet32 (PcdSerialDbgUartClkInHz), // Clock > + EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART // Port > subtype > + }, > + > + // Processor Hierarchy Nodes > + { > + // Package > + { > + // CM_OBJECT_TOKEN Token > + REFERENCE_TOKEN (ProcHierarchyInfo[0]), > + // UINT32 Flags > + PROC_NODE_FLAGS ( > + EFI_ACPI_6_3_PPTT_PACKAGE_PHYSICAL, > + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID, > + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, > + EFI_ACPI_6_3_PPTT_NODE_IS_NOT_LEAF, > + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_IDENTICAL > + ), > + // CM_OBJECT_TOKEN ParentToken > + CM_NULL_TOKEN, > + // CM_OBJECT_TOKEN GicCToken > + CM_NULL_TOKEN, > + // UINT32 NoOfPrivateResources > + SOC_RESOURCE_COUNT, > + // CM_OBJECT_TOKEN PrivateResourcesArrayToken > + REFERENCE_TOKEN (SocResources) > + }, > + > + // Cluster0 > + { > + // CM_OBJECT_TOKEN Token > + REFERENCE_TOKEN (ProcHierarchyInfo[1]), > + // UINT32 Flags > + PROC_NODE_FLAGS ( > + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, > + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID, > + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, > + EFI_ACPI_6_3_PPTT_NODE_IS_NOT_LEAF, > + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_IDENTICAL > + ), > + // CM_OBJECT_TOKEN ParentToken > + REFERENCE_TOKEN (ProcHierarchyInfo[0]), // -> Package > + // CM_OBJECT_TOKEN GicCToken > + CM_NULL_TOKEN, > + // UINT32 NoOfPrivateResources > + CLUSTER_RESOURCE_COUNT, > + // CM_OBJECT_TOKEN PrivateResourcesArrayToken > + REFERENCE_TOKEN (ClusterResources) > + }, > + // Cluster1 > + { > + // CM_OBJECT_TOKEN Token > + REFERENCE_TOKEN (ProcHierarchyInfo[2]), > + // UINT32 Flags > + PROC_NODE_FLAGS ( > + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, > + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID, > + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, > + EFI_ACPI_6_3_PPTT_NODE_IS_NOT_LEAF, > + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_IDENTICAL > + ), > + // CM_OBJECT_TOKEN ParentToken > + REFERENCE_TOKEN (ProcHierarchyInfo[0]), // -> Package > + // CM_OBJECT_TOKEN GicCToken > + CM_NULL_TOKEN, > + // UINT32 NoOfPrivateResources > + CLUSTER_RESOURCE_COUNT, > + // CM_OBJECT_TOKEN PrivateResourcesArrayToken > + REFERENCE_TOKEN (ClusterResources) > + }, > + // Cluster0 - Cpu0 > + { > + // CM_OBJECT_TOKEN Token > + REFERENCE_TOKEN (ProcHierarchyInfo[3]), > + // UINT32 Flags > + PROC_NODE_FLAGS ( > + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, > + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, > + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, > + EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, > + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL > + ), > + // CM_OBJECT_TOKEN ParentToken > + REFERENCE_TOKEN (ProcHierarchyInfo[1]), // -> 'cluster in Cluster0 > + // CM_OBJECT_TOKEN GicCToken > + REFERENCE_TOKEN (GicCInfo[0]), > + // UINT32 NoOfPrivateResources > + CORE_RESOURCE_COUNT, > + // CM_OBJECT_TOKEN PrivateResourcesArrayToken > + REFERENCE_TOKEN (CoreResources) > + }, > + // Cluster0 - Cpu1 > + { > + // CM_OBJECT_TOKEN Token > + REFERENCE_TOKEN (ProcHierarchyInfo[4]), > + // UINT32 Flags > + PROC_NODE_FLAGS ( > + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, > + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, > + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, > + EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, > + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL > + ), > + // CM_OBJECT_TOKEN ParentToken > + REFERENCE_TOKEN (ProcHierarchyInfo[1]), // -> 'cluster in Cluster0 > + // CM_OBJECT_TOKEN GicCToken > + REFERENCE_TOKEN (GicCInfo[1]), > + // UINT32 NoOfPrivateResources > + CORE_RESOURCE_COUNT, > + // CM_OBJECT_TOKEN PrivateResourcesArrayToken > + REFERENCE_TOKEN (CoreResources) > + }, > + // Cluster1 - Cpu0 > + { > + // CM_OBJECT_TOKEN Token > + REFERENCE_TOKEN (ProcHierarchyInfo[3]), > + // UINT32 Flags > + PROC_NODE_FLAGS ( > + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, > + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, > + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, > + EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, > + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL > + ), > + // CM_OBJECT_TOKEN ParentToken > + REFERENCE_TOKEN (ProcHierarchyInfo[2]), // -> 'cluster in Cluster1 > + // CM_OBJECT_TOKEN GicCToken > + REFERENCE_TOKEN (GicCInfo[2]), > + // UINT32 NoOfPrivateResources > + CORE_RESOURCE_COUNT, > + // CM_OBJECT_TOKEN PrivateResourcesArrayToken > + REFERENCE_TOKEN (CoreResources) > + }, > + > + // Cluster1 - Cpu1 > + { > + // CM_OBJECT_TOKEN Token > + REFERENCE_TOKEN (ProcHierarchyInfo[4]), > + // UINT32 Flags > + PROC_NODE_FLAGS ( > + EFI_ACPI_6_3_PPTT_PACKAGE_NOT_PHYSICAL, > + EFI_ACPI_6_3_PPTT_PROCESSOR_ID_VALID, > + EFI_ACPI_6_3_PPTT_PROCESSOR_IS_NOT_THREAD, > + EFI_ACPI_6_3_PPTT_NODE_IS_LEAF, > + EFI_ACPI_6_3_PPTT_IMPLEMENTATION_NOT_IDENTICAL > + ), > + // CM_OBJECT_TOKEN ParentToken > + REFERENCE_TOKEN (ProcHierarchyInfo[2]), // -> 'cluster in Cluster1 > + // CM_OBJECT_TOKEN GicCToken > + REFERENCE_TOKEN (GicCInfo[3]), > + // UINT32 NoOfPrivateResources > + CORE_RESOURCE_COUNT, > + // CM_OBJECT_TOKEN PrivateResourcesArrayToken > + REFERENCE_TOKEN (CoreResources) > + }, > + }, > + > + // Cache information > + { > + // 'cluster's L3 cache > + { > + REFERENCE_TOKEN (CacheInfo[0]), // CM_OBJECT_TOKEN Token > + CM_NULL_TOKEN, // CM_OBJECT_TOKEN > NextLevelOfCacheToken > + SIZE_1MB, // UINT32 Size > + 2048, // UINT32 NumberOfSets > + 8, // UINT32 Associativity > + CACHE_ATTRIBUTES ( // UINT8 Attributes > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ, > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_UNIFIED, > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK > + ), > + 64 // UINT16 LineSize > + }, > + // 'core's L1 instruction cache > + { > + REFERENCE_TOKEN (CacheInfo[1]), // CM_OBJECT_TOKEN Token > + REFERENCE_TOKEN (CacheInfo[3]), // CM_OBJECT_TOKEN > NextLevelOfCacheToken > + SIZE_64KB, // UINT32 Size > + 256, // UINT32 NumberOfSets > + 4, // UINT32 Associativity > + CACHE_ATTRIBUTES ( // UINT8 Attributes > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ, > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_INSTRUCTION, > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK > + ), > + 64 // UINT16 LineSize > + }, > + // 'core's L1 data cache > + { > + REFERENCE_TOKEN (CacheInfo[2]), // CM_OBJECT_TOKEN Token > + REFERENCE_TOKEN (CacheInfo[3]), // CM_OBJECT_TOKEN > NextLevelOfCacheToken > + SIZE_64KB, // UINT32 Size > + 256, // UINT32 NumberOfSets > + 4, // UINT32 Associativity > + CACHE_ATTRIBUTES ( // UINT8 Attributes > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE, > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_DATA, > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK > + ), > + 64 // UINT16 LineSize > + }, > + // cores's L2 cache > + { > + REFERENCE_TOKEN (CacheInfo[3]), // CM_OBJECT_TOKEN Token > + CM_NULL_TOKEN, // CM_OBJECT_TOKEN > NextLevelOfCacheToken > + SIZE_1MB, // UINT32 Size > + 2048, // UINT32 NumberOfSets > + 8, // UINT32 Associativity > + CACHE_ATTRIBUTES ( // UINT8 Attributes > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ, > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_UNIFIED, > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK > + ), > + 64 // UINT16 LineSize > + }, > + // slc cache > + { > + REFERENCE_TOKEN (CacheInfo[4]), // CM_OBJECT_TOKEN Token > + CM_NULL_TOKEN, // CM_OBJECT_TOKEN > NextLevelOfCacheToken > + SIZE_8MB, // UINT32 Size > + 4096, // UINT32 NumberOfSets > + 16, // UINT32 Associativity > + CACHE_ATTRIBUTES ( // UINT8 Attributes > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_ALLOCATION_READ, > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_CACHE_TYPE_UNIFIED, > + EFI_ACPI_6_3_CACHE_ATTRIBUTES_WRITE_POLICY_WRITE_BACK > + ), > + 64 // UINT16 LineSize > + }, > + }, > + // Resources private to the 'cluster (shared among cores) in Cluster > + { > + { REFERENCE_TOKEN (CacheInfo[0]) } // -> 'cluster's L3 cache in > Cluster > + }, > + // Resources private to each individual 'core instance in Cluster > + { > + { REFERENCE_TOKEN (CacheInfo[1]) }, // -> 'core's L1 I-cache in > Cluster > + { REFERENCE_TOKEN (CacheInfo[2]) }, // -> 'core's L1 D-cache in > Cluster > + { REFERENCE_TOKEN (CacheInfo[3]) } // -> 'core's L2 cache in Cluster > + }, > + > + // Resources private to the SoC > + { > + { REFERENCE_TOKEN (CacheInfo[4]) } // -> slc for SoC > + }, > +}; > + > +/** 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 > + ) > +{ > + CmObjectDesc->ObjectId = CmObjectId; > + CmObjectDesc->Size = ObjectSize; > + CmObjectDesc->Data = (VOID*)Object; > + CmObjectDesc->Count = ObjectCount; > + DEBUG (( > + DEBUG_INFO, > + "INFO: CmObjectId = %x, Ptr = 0x%p, Size = %d, Count = %d\n", > + CmObjectId, > + CmObjectDesc->Data, > + CmObjectDesc->Size, > + CmObjectDesc->Count > + )); > + return EFI_SUCCESS; > +} > + > +/** 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 > + ) > +{ > + EFI_STATUS Status; > + CmObjectDesc->ObjectId = CmObjectId; > + if (Token == CM_NULL_TOKEN) { > + CmObjectDesc->Size = ObjectSize; > + CmObjectDesc->Data = (VOID*)Object; > + CmObjectDesc->Count = ObjectCount; > + Status = EFI_SUCCESS; > + } else { > + Status = HandlerProc (This, CmObjectId, Token, CmObjectDesc); > + } > + > + DEBUG (( > + DEBUG_INFO, > + "INFO: Token = 0x%p, CmObjectId = %x, Ptr = 0x%p, Size = %d, Count = > %d\n", > + (VOID*)Token, > + CmObjectId, > + CmObjectDesc->Data, > + CmObjectDesc->Size, > + CmObjectDesc->Count > + )); > + return Status; > +} > + > +/** A helper function for returning Configuration Manager Object(s) > referenced > + by token when the entire platform repository is in scope and the > + CM_NULL_TOKEN value is not allowed. > + > + @param [in] This Pointer to the Configuration Manager > Protocol. > + @param [in] CmObjectId The Configuration Manager Object ID. > + @param [in] Token A token identifying the object. > + @param [in] HandlerProc A handler function to search the > object(s) > + 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. > +**/ > +STATIC > +EFI_STATUS > +EFIAPI > +HandleCmObjectSearchPlatformRepo ( > + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, > + IN CONST CM_OBJECT_ID CmObjectId, > + IN CONST CM_OBJECT_TOKEN Token, > + IN CONST CM_OBJECT_HANDLER_PROC HandlerProc, > + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObjectDesc > + ) > +{ > + EFI_STATUS Status; > + CmObjectDesc->ObjectId = CmObjectId; > + if (Token == CM_NULL_TOKEN) { > + DEBUG (( > + DEBUG_ERROR, > + "ERROR: CM_NULL_TOKEN value is not allowed when searching" > + " the entire platform repository.\n" > + )); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = HandlerProc (This, CmObjectId, Token, CmObjectDesc); > + DEBUG (( > + DEBUG_INFO, > + "INFO: Token = 0x%p, CmObjectId = %x, Ptr = 0x%p, Size = %d, Count = > %d\n", > + CmObjectId, > + (VOID*)Token, > + CmObjectDesc->Data, > + CmObjectDesc->Size, > + CmObjectDesc->Count > + )); > + return Status; > +} > + > +/** Initialize the Platform Configuration Repository. > + > + @param [in] PlatformRepo Pointer to the Platform Configuration > Repository. > + > + @retval > + EFI_SUCCESS Success > +**/ > +STATIC > +EFI_STATUS > +EFIAPI > +InitializePlatformRepository ( > + IN EDKII_PLATFORM_REPOSITORY_INFO * CONST PlatformRepo > + ) > +{ > + return EFI_SUCCESS; > +} > + > +/** Return a GT Block timer frame info list. > + > + @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 [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +GetGTBlockTimerFrameInfo ( > + 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 > + ) > +{ > + EDKII_COMMON_PLATFORM_REPOSITORY_INFO * PlatformRepo; > + > + if ((This == NULL) || (CmObject == NULL)) { > + ASSERT (This != NULL); > + ASSERT (CmObject != NULL); > + return EFI_INVALID_PARAMETER; > + } > + > + PlatformRepo = This->PlatRepoInfo->CommonPlatRepoInfo; > + > + if (Token != (CM_OBJECT_TOKEN)&PlatformRepo->GTBlock0TimerInfo) { > + return EFI_NOT_FOUND; > + } > + > + CmObject->ObjectId = CmObjectId; > + CmObject->Size = sizeof (PlatformRepo->GTBlock0TimerInfo); > + CmObject->Data = (VOID*)&PlatformRepo->GTBlock0TimerInfo; > + CmObject->Count = ARRAY_SIZE (PlatformRepo->GTBlock0TimerInfo); > + return EFI_SUCCESS; > +} > + > +/** Return GIC CPU Interface Info. > + > + @param [in] This Pointer to the Configuration Manager > Protocol. > + @param [in] CmObjectId The Object ID of the CM object > requested > + @param [in] SearchToken A unique token for identifying the > requested > + CM_ARM_GICC_INFO object. > + @param [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +GetGicCInfo ( > + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, > + IN CONST CM_OBJECT_ID CmObjectId, > + IN CONST CM_OBJECT_TOKEN SearchToken, > + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject > + ) > +{ > + EDKII_COMMON_PLATFORM_REPOSITORY_INFO * PlatformRepo; > + UINT32 ObjIndex; > + > + if ((This == NULL) || (CmObject == NULL)) { > + ASSERT (This != NULL); > + ASSERT (CmObject != NULL); > + return EFI_INVALID_PARAMETER; > + } > + > + PlatformRepo = This->PlatRepoInfo->CommonPlatRepoInfo; > + > + for (ObjIndex = 0; ObjIndex < PLAT_CPU_COUNT; ObjIndex++) { > + if (SearchToken == > (CM_OBJECT_TOKEN)&PlatformRepo->GicCInfo[ObjIndex]) { > + CmObject->ObjectId = CmObjectId; > + CmObject->Size = sizeof (PlatformRepo->GicCInfo[ObjIndex]); > + CmObject->Data = (VOID*)&PlatformRepo->GicCInfo[ObjIndex]; > + CmObject->Count = 1; > + return EFI_SUCCESS; > + } > + } > + > + return EFI_NOT_FOUND; > +} > + > +/** Return a list of Configuration Manager object references pointed to > by the > + given input token. > + > + @param [in] This Pointer to the Configuration Manager > Protocol. > + @param [in] CmObjectId The Object ID of the CM object > requested > + @param [in] SearchToken A unique token for identifying the > requested > + CM_ARM_OBJ_REF list. > + @param [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +GetCmObjRefs ( > + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, > + IN CONST CM_OBJECT_ID CmObjectId, > + IN CONST CM_OBJECT_TOKEN SearchToken, > + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject > + ) > +{ > + EDKII_COMMON_PLATFORM_REPOSITORY_INFO * CommonPlatRepo; > + > + if ((This == NULL) || (CmObject == NULL)) { > + ASSERT (This != NULL); > + ASSERT (CmObject != NULL); > + return EFI_INVALID_PARAMETER; > + } > + > + CommonPlatRepo = This->PlatRepoInfo->CommonPlatRepoInfo; > + > + if (SearchToken == (CM_OBJECT_TOKEN)&CommonPlatRepo->ClusterResources) > { > + CmObject->Size = sizeof (CommonPlatRepo->ClusterResources); > + CmObject->Data = (VOID*)&CommonPlatRepo->ClusterResources; > + CmObject->Count = ARRAY_SIZE (CommonPlatRepo->ClusterResources); > + return EFI_SUCCESS; > + } > + if (SearchToken == (CM_OBJECT_TOKEN)&CommonPlatRepo->CoreResources) { > + CmObject->Size = sizeof (CommonPlatRepo->CoreResources); > + CmObject->Data = (VOID*)&CommonPlatRepo->CoreResources; > + CmObject->Count = ARRAY_SIZE (CommonPlatRepo->CoreResources); > + return EFI_SUCCESS; > + } > + if (SearchToken == (CM_OBJECT_TOKEN)&CommonPlatRepo->SocResources) { > + CmObject->Size = sizeof (CommonPlatRepo->SocResources); > + CmObject->Data = (VOID*)&CommonPlatRepo->SocResources; > + CmObject->Count = ARRAY_SIZE (CommonPlatRepo->SocResources); > + return EFI_SUCCESS; > + } > + > + return EFI_NOT_FOUND; > +} > + > +/** Return a standard namespace object. > + > + @param [in] This Pointer to the Configuration Manager > Protocol. > + @param [in] CmObjectId The Configuration Manager Object ID. > + @param [in] Token An optional token identifying the object. > If > + unused this must be CM_NULL_TOKEN. > + @param [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +GetStandardNameSpaceObject ( > + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, > + IN CONST CM_OBJECT_ID CmObjectId, > + IN CONST CM_OBJECT_TOKEN Token OPTIONAL, > + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject > + ) > +{ > + EFI_STATUS Status; > + EDKII_COMMON_PLATFORM_REPOSITORY_INFO * CommonPlatRepo; > + > + if ((This == NULL) || (CmObject == NULL)) { > + ASSERT (This != NULL); > + ASSERT (CmObject != NULL); > + return EFI_INVALID_PARAMETER; > + } > + > + CommonPlatRepo = This->PlatRepoInfo->CommonPlatRepoInfo; > + > + //First search the FVP/SoC platform specific objects and enter the > below > + //if condition only when this function returns EFI_NOT_FOUND status. > + Status = GetStandardNameSpaceObjectPlat (This, CmObjectId, Token, > CmObject); > + > + if (Status == EFI_NOT_FOUND) { > + switch (GET_CM_OBJECT_ID (CmObjectId)) { > + case EStdObjCfgMgrInfo: > + Status = HandleCmObject ( > + CmObjectId, > + &CommonPlatRepo->CmInfo, > + sizeof (CommonPlatRepo->CmInfo), > + 1, > + CmObject > + ); > + break; > + > + default: { > + Status = EFI_NOT_FOUND; > + DEBUG (( > + DEBUG_ERROR, > + "ERROR: Object 0x%x. Status = %r\n", > + CmObjectId, > + Status > + )); > + break; > + } > + } //switch > + } > + > + return Status; > +} > + > +/** Return an ARM namespace object. > + > + @param [in] This Pointer to the Configuration Manager > Protocol. > + @param [in] CmObjectId The Configuration Manager Object ID. > + @param [in] Token An optional token identifying the object. > If > + unused this must be CM_NULL_TOKEN. > + @param [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +GetArmNameSpaceObject ( > + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, > + IN CONST CM_OBJECT_ID CmObjectId, > + IN CONST CM_OBJECT_TOKEN Token OPTIONAL, > + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject > + ) > +{ > + EFI_STATUS Status; > + EDKII_COMMON_PLATFORM_REPOSITORY_INFO * CommonPlatRepo; > + > + if ((This == NULL) || (CmObject == NULL)) { > + ASSERT (This != NULL); > + ASSERT (CmObject != NULL); > + return EFI_INVALID_PARAMETER; > + } > + CommonPlatRepo = This->PlatRepoInfo->CommonPlatRepoInfo; > + > + //First search the FVP/SoC platform specific objects and enter the > below > + //if condition only when this function return EFI_NOT_FOUND status. > + Status = GetArmNameSpaceObjectPlat (This, CmObjectId, Token, CmObject); > + > + if (Status == EFI_NOT_FOUND) { > + switch (GET_CM_OBJECT_ID (CmObjectId)) { > + case EArmObjBootArchInfo: > + Status = HandleCmObject ( > + CmObjectId, > + &CommonPlatRepo->BootArchInfo, > + sizeof (CommonPlatRepo->BootArchInfo), > + 1, > + CmObject > + ); > + break; > + > +#ifdef HEADLESS_PLATFORM > + case EArmObjFixedFeatureFlags: > + Status = HandleCmObject ( > + CmObjectId, > + &CommonPlatRepo->FixedFeatureFlags, > + sizeof (CommonPlatRepo->FixedFeatureFlags), > + 1, > + CmObject > + ); > + break; > +#endif > + case EArmObjPowerManagementProfileInfo: > + Status = HandleCmObject ( > + CmObjectId, > + &CommonPlatRepo->PmProfileInfo, > + sizeof (CommonPlatRepo->PmProfileInfo), > + 1, > + CmObject > + ); > + break; > + > + case EArmObjGenericTimerInfo: > + Status = HandleCmObject ( > + CmObjectId, > + &CommonPlatRepo->GenericTimerInfo, > + sizeof (CommonPlatRepo->GenericTimerInfo), > + 1, > + CmObject > + ); > + break; > + > + case EArmObjPlatformGenericWatchdogInfo: > + Status = HandleCmObject ( > + CmObjectId, > + &CommonPlatRepo->Watchdog, > + sizeof (CommonPlatRepo->Watchdog), > + 1, > + CmObject > + ); > + break; > + > + case EArmObjPlatformGTBlockInfo: > + Status = HandleCmObject ( > + CmObjectId, > + CommonPlatRepo->GTBlockInfo, > + sizeof (CommonPlatRepo->GTBlockInfo), > + 1, > + CmObject > + ); > + break; > + > + case EArmObjGTBlockTimerFrameInfo: > + Status = HandleCmObjectRefByToken ( > + This, > + CmObjectId, > + CommonPlatRepo->GTBlock0TimerInfo, > + sizeof (CommonPlatRepo->GTBlock0TimerInfo), > + ARRAY_SIZE (CommonPlatRepo->GTBlock0TimerInfo), > + Token, > + GetGTBlockTimerFrameInfo, > + CmObject > + ); > + break; > + > + case EArmObjGicCInfo: > + Status = HandleCmObjectRefByToken ( > + This, > + CmObjectId, > + CommonPlatRepo->GicCInfo, > + sizeof (CommonPlatRepo->GicCInfo), > + PLAT_CPU_COUNT, > + Token, > + GetGicCInfo, > + CmObject > + ); > + break; > + > + case EArmObjGicDInfo: > + Status = HandleCmObject ( > + CmObjectId, > + &CommonPlatRepo->GicDInfo, > + sizeof (CommonPlatRepo->GicDInfo), > + 1, > + CmObject > + ); > + break; > + > + case EArmObjGicRedistributorInfo: > + Status = HandleCmObject ( > + CmObjectId, > + &CommonPlatRepo->GicRedistInfo, > + sizeof (CommonPlatRepo->GicRedistInfo), > + 1, > + CmObject > + ); > + break; > + > + case EArmObjSerialConsolePortInfo: > + Status = HandleCmObject ( > + CmObjectId, > + &CommonPlatRepo->SpcrSerialPort, > + sizeof (CommonPlatRepo->SpcrSerialPort), > + 1, > + CmObject > + ); > + break; > + > + case EArmObjSerialDebugPortInfo: > + Status = HandleCmObject ( > + CmObjectId, > + &CommonPlatRepo->DbgSerialPort, > + sizeof (CommonPlatRepo->DbgSerialPort), > + 1, > + CmObject > + ); > + break; > + > + case EArmObjProcHierarchyInfo: > + Status = HandleCmObject ( > + CmObjectId, > + CommonPlatRepo->ProcHierarchyInfo, > + sizeof (CommonPlatRepo->ProcHierarchyInfo), > + PLAT_PROC_HIERARCHY_NODE_COUNT, > + CmObject > + ); > + break; > + > + case EArmObjCacheInfo: > + Status = HandleCmObject ( > + CmObjectId, > + CommonPlatRepo->CacheInfo, > + sizeof (CommonPlatRepo->CacheInfo), > + ARRAY_SIZE (CommonPlatRepo->CacheInfo), > + CmObject > + ); > + break; > + > + case EArmObjCmRef: > + Status = HandleCmObjectSearchPlatformRepo ( > + This, > + CmObjectId, > + Token, > + GetCmObjRefs, > + CmObject > + ); > + break; > + > + default: { > + Status = EFI_NOT_FOUND; > + DEBUG (( > + DEBUG_INFO, > + "INFO: Object 0x%x. Status = %r\n", > + CmObjectId, > + Status > + )); > + break; > + } > + }//switch > + } > + return Status; > +} > + > +/** Return an OEM namespace object. > + > + @param [in] This Pointer to the Configuration Manager > Protocol. > + @param [in] CmObjectId The Configuration Manager Object ID. > + @param [in] Token An optional token identifying the object. > If > + unused this must be CM_NULL_TOKEN. > + @param [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +GetOemNameSpaceObject ( > + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, > + IN CONST CM_OBJECT_ID CmObjectId, > + IN CONST CM_OBJECT_TOKEN Token OPTIONAL, > + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject > + ) > +{ > + EFI_STATUS Status; > + > + Status = EFI_SUCCESS; > + if ((This == NULL) || (CmObject == NULL)) { > + ASSERT (This != NULL); > + ASSERT (CmObject != NULL); > + return EFI_INVALID_PARAMETER; > + } > + > + switch (GET_CM_OBJECT_ID (CmObjectId)) { > + default: { > + Status = EFI_NOT_FOUND; > + DEBUG (( > + DEBUG_ERROR, > + "ERROR: Object 0x%x. Status = %r\n", > + CmObjectId, > + Status > + )); > + break; > + } > + } > + > + return Status; > +} > + > +/** The GetObject function defines the interface implemented by the > + Configuration Manager Protocol for returning the Configuration > + Manager Objects. > + > + @param [in] This Pointer to the Configuration Manager > Protocol. > + @param [in] CmObjectId The Configuration Manager Object ID. > + @param [in] Token An optional token identifying the object. > If > + unused this must be CM_NULL_TOKEN. > + @param [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +MorelloPlatformGetObject ( > + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, > + IN CONST CM_OBJECT_ID CmObjectId, > + IN CONST CM_OBJECT_TOKEN Token OPTIONAL, > + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject > + ) > +{ > + EFI_STATUS Status; > + > + if ((This == NULL) || (CmObject == NULL)) { > + ASSERT (This != NULL); > + ASSERT (CmObject != NULL); > + return EFI_INVALID_PARAMETER; > + } > + > + switch (GET_CM_NAMESPACE_ID (CmObjectId)) { > + case EObjNameSpaceStandard: > + Status = GetStandardNameSpaceObject (This, CmObjectId, Token, > CmObject); > + break; > + case EObjNameSpaceArm: > + Status = GetArmNameSpaceObject (This, CmObjectId, Token, CmObject); > + break; > + case EObjNameSpaceOem: > + Status = GetOemNameSpaceObject (This, CmObjectId, Token, CmObject); > + break; > + default: { > + Status = EFI_INVALID_PARAMETER; > + DEBUG (( > + DEBUG_ERROR, > + "ERROR: Unknown Namespace Object = 0x%x. Status = %r\n", > + CmObjectId, > + Status > + )); > + break; > + } > + } > + > + return Status; > +} > + > +/** The SetObject function defines the interface implemented by the > + Configuration Manager Protocol for updating the Configuration > + Manager Objects. > + > + @param [in] This Pointer to the Configuration Manager > Protocol. > + @param [in] CmObjectId The Configuration Manager Object ID. > + @param [in] Token An optional token identifying the object. > If > + unused this must be CM_NULL_TOKEN. > + @param [in] CmObject Pointer to the Configuration Manager > Object > + descriptor describing the Object. > + > + @retval EFI_UNSUPPORTED This operation is not supported. > +**/ > +EFI_STATUS > +EFIAPI > +MorelloPlatformSetObject ( > + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, > + IN CONST CM_OBJECT_ID CmObjectId, > + IN CONST CM_OBJECT_TOKEN Token OPTIONAL, > + IN CM_OBJ_DESCRIPTOR * CONST CmObject > + ) > +{ > + return EFI_UNSUPPORTED; > +} > + > +/** A structure describing the configuration manager protocol interface. > +*/ > +STATIC > +CONST > +EDKII_CONFIGURATION_MANAGER_PROTOCOL > MorelloPlatformConfigManagerProtocol = { > + CREATE_REVISION(1,0), > + MorelloPlatformGetObject, > + MorelloPlatformSetObject, > + &MorelloRepositoryInfo > +}; > + > +/** > + Entrypoint of Configuration Manager Dxe. > + > + @param ImageHandle > + @param SystemTable > + > + @return EFI_SUCCESS > + @return EFI_LOAD_ERROR > + @return EFI_OUT_OF_RESOURCES > + > +**/ > +EFI_STATUS > +EFIAPI > +ConfigurationManagerDxeInitialize ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE * SystemTable > + ) > +{ > + EFI_STATUS Status; > + > + // Initialize the Platform Configuration Repository before installing > the > + // Configuration Manager Protocol > + Status = InitializePlatformRepository ( > + MorelloPlatformConfigManagerProtocol.PlatRepoInfo > + ); > + if (EFI_ERROR (Status)) { > + DEBUG (( > + DEBUG_ERROR, > + "ERROR: Failed to initialize the Platform Configuration > Repository." \ > + " Status = %r\n", > + Status > + )); > + } > + > + Status = gBS->InstallProtocolInterface ( > + &ImageHandle, > + &gEdkiiConfigurationManagerProtocolGuid, > + EFI_NATIVE_INTERFACE, > + (VOID*)&MorelloPlatformConfigManagerProtocol > + ); > + if (EFI_ERROR (Status)) { > + DEBUG (( > + DEBUG_ERROR, > + "ERROR: Failed to get Install Configuration Manager Protocol." \ > + " Status = %r\n", > + Status > + )); > + goto error_handler; > + } > + > +error_handler: > + return Status; > +} > diff --git > a/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerFvp.c > > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerFvp.c > new file mode 100644 > index 000000000000..333d961ed88a > --- /dev/null > +++ > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerFvp.c > @@ -0,0 +1,602 @@ > +/** @file > + Configuration Manager Dxe > + > + Copyright (c) 2021, ARM Limited. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > + @par Glossary: > + - Cm or CM - Configuration Manager > + - Obj or OBJ - Object > +**/ > + > +#include <IndustryStandard/DebugPort2Table.h> > +#include <IndustryStandard/IoRemappingTable.h> > +#include <IndustryStandard/MemoryMappedConfigurationSpaceAccessTable.h> > +#include <IndustryStandard/SerialPortConsoleRedirectionTable.h> > +#include <Library/DebugLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Protocol/ConfigurationManagerProtocol.h> > + > +#include "ConfigurationManagerFvp.h" > +#include "Platform.h" > + > +EDKII_FVP_PLATFORM_REPOSITORY_INFO MorelloFvpRepositoryInfo = { > + // ACPI Table List > + { > + // FADT Table > + { > + EFI_ACPI_6_3_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE, > + EFI_ACPI_6_3_FIXED_ACPI_DESCRIPTION_TABLE_REVISION, > + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdFadt), > + NULL > + }, > + // GTDT Table > + { > + EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, > + EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION, > + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdGtdt), > + NULL > + }, > + // MADT Table > + { > + EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, > + EFI_ACPI_6_3_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION, > + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdMadt), > + NULL > + }, > + // SPCR Table > + { > + EFI_ACPI_6_3_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE, > + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_REVISION, > + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSpcr), > + NULL > + }, > + // DSDT Table > + { > + EFI_ACPI_6_3_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, > + 0, // Unused > + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdDsdt), > + (EFI_ACPI_DESCRIPTION_HEADER*)dsdtfvp_aml_code > + }, > + // DBG2 Table > + { > + EFI_ACPI_6_3_DEBUG_PORT_2_TABLE_SIGNATURE, > + EFI_ACPI_DBG2_DEBUG_DEVICE_INFORMATION_STRUCT_REVISION, > + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdDbg2), > + NULL > + }, > + // PPTT Table > + { > + > EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE, > + EFI_ACPI_6_3_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_REVISION, > + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdPptt), > + NULL > + }, > + // IORT Table > + { > + EFI_ACPI_6_3_IO_REMAPPING_TABLE_SIGNATURE, > + EFI_ACPI_IO_REMAPPING_TABLE_REVISION, > + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdIort), > + NULL > + }, > + // PCI MCFG Table > + { > + > EFI_ACPI_6_3_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE, > + EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_SPACE_ACCESS_TABLE_REVISION, > + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdMcfg), > + NULL, > + }, > + // SSDT table describing the PCI root complex > + { > + EFI_ACPI_6_3_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE, > + 0, // Unused > + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSsdt), > + (EFI_ACPI_DESCRIPTION_HEADER*)ssdtpcifvp_aml_code > + }, > + }, > + > + // GIC ITS > + { > + // GIC ITS - PCIe TCU > + { > + // The GIC ITS ID. > + 0, > + // The physical address for the Interrupt Translation Service > + 0x30060000, > + //Proximity Domain > + 0 > + }, > + // GIC ITS - PCIe RC > + { > + // The GIC ITS ID. > + 1, > + // The physical address for the Interrupt Translation Service > + 0x300A0000, > + //Proximity Domain > + 0 > + }, > + }, > + > + // ITS group node > + { > + { > + // Reference token for this Iort node > + REFERENCE_TOKEN_FVP (ItsGroupInfo[0]), > + // The number of ITS identifiers in the ITS node. > + 1, > + // Reference token for the ITS identifier array > + REFERENCE_TOKEN_FVP (ItsIdentifierArray[0]) > + }, > + { > + // Reference token for this Iort node > + REFERENCE_TOKEN_FVP (ItsGroupInfo[1]), > + // The number of ITS identifiers in the ITS node. > + 1, > + // Reference token for the ITS identifier array > + REFERENCE_TOKEN_FVP (ItsIdentifierArray[1]) > + }, > + }, > + > + // ITS identifier array > + { > + { > + // The ITS Identifier > + 0 > + }, > + { > + // The ITS Identifier > + 1 > + }, > + }, > + > + // SMMUv3 Node > + { > + { > + // Reference token for this Iort node > + REFERENCE_TOKEN_FVP (SmmuV3Info[0]), > + // Number of ID mappings > + 2, > + // Reference token for the ID mapping array > + REFERENCE_TOKEN_FVP (DeviceIdMapping[0][0]), > + // SMMU Base Address > + 0x4F400000, > + // SMMU flags > + EFI_ACPI_IORT_SMMUv3_FLAG_COHAC_OVERRIDE, > + // VATOS address > + 0, > + // Model > + EFI_ACPI_IORT_SMMUv3_MODEL_GENERIC, > + // GSIV of the Event interrupt if SPI based > + 0x10B, > + // PRI Interrupt if SPI based > + 0, > + // GERR interrupt if GSIV based > + 0x10D, > + // Sync interrupt if GSIV based > + 0x10C, > + // Proximity domain flag, ignored in this case > + 0, > + // Index into the array of ID mapping, ignored as all > + // the SMMU control interrupts are GSIV based > [SAMI] If I understand correctly the PRI interrupt is MSI based. In that case > should this comment be only 'Index into the array of ID mapping'? > Let me know if you agree, I will make this change locally before pushing the > changes. > [/SAMI] > + 1 > + }, > + }, > + > + // Root Complex node info > + { > + { > + // Reference token for this Iort node > + REFERENCE_TOKEN_FVP (RootComplexInfo[0]), > + // Number of ID mappings > + 1, > + // Reference token for the ID mapping array > + REFERENCE_TOKEN_FVP (DeviceIdMapping[1][0]), > + > + // Memory access properties : Cache coherent attributes > + EFI_ACPI_IORT_MEM_ACCESS_PROP_CCA, > + // Memory access properties : Allocation hints > + 0, > + // Memory access properties : Memory access flags > + 0, > + // ATS attributes > + EFI_ACPI_IORT_ROOT_COMPLEX_ATS_SUPPORTED, > + // PCI segment number > + 0, > + // Memory address size limit > + 42 > + }, > + }, > + > + // Array of Device ID mappings > + { > + // DeviceIdMapping[0][0] - [0][1] > + { > + /* Mapping SMMUv3 -> ITS Group > + */ > + > + // SMMUv3 device ID mapping > + { > + // Input base > + 0x0, > + // Number of input IDs > + 0x0000FFFF, > + // Output Base > + 0x0, > + // Output reference > + REFERENCE_TOKEN_FVP (ItsGroupInfo[1]), > + // Flags > + 0 > + }, > + // SMMUv3 device ID mapping > + { > + // Input base > + 0x0, > + // Number of input IDs > + 0x00000001, > + // Output Base > + 0x0, > + // Output reference token for the IORT node > + REFERENCE_TOKEN_FVP (ItsGroupInfo[0]), > + // Flags > + EFI_ACPI_IORT_ID_MAPPING_FLAGS_SINGLE > + } > + }, > + // DeviceIdMapping[1][0] > + { > + // Mapping for RootComplex -> SMMUv3 > + > + // Device ID mapping for Root complex node > + { > + // Input base > + 0x0, > + // Number of input IDs > + 0x0000FFFF, > + // Output Base > + 0x0, > + // Output reference > + REFERENCE_TOKEN_FVP (SmmuV3Info[0]), > + // Flags > + 0 > + }, > + }, > + }, > + // PCI Configuration Space Info > + { > + // PCIe ECAM > + { > + FixedPcdGet64 (PcdPciExpressBaseAddress), // Base Address > + 0x0, // Segment Group Number > + FixedPcdGet32 (PcdPciBusMin), // Start Bus Number > + FixedPcdGet32 (PcdPciBusMax) // End Bus Number > + }, > + }, > +}; > + > +EDKII_PLATFORM_REPOSITORY_INFO MorelloRepositoryInfo = { > + &CommonPlatformInfo, > + &MorelloFvpRepositoryInfo > +}; > + > +/** Return a device Id mapping array. > + > + @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 [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +GetDeviceIdMappingArray ( > + 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 > + ) > +{ > + EDKII_FVP_PLATFORM_REPOSITORY_INFO * PlatformRepo; > + UINTN Count; > + > + if ((This == NULL) || (CmObject == NULL)) { > + ASSERT (This != NULL); > + ASSERT (CmObject != NULL); > + return EFI_INVALID_PARAMETER; > + } > + > + PlatformRepo = This->PlatRepoInfo->FvpPlatRepoInfo; > + > + DEBUG ((DEBUG_INFO, "DeviceIdMapping - Token = %p\n")); > + > + if (Token == (CM_OBJECT_TOKEN)&PlatformRepo->DeviceIdMapping[0][0]) { > + Count = 2; > + DEBUG ((DEBUG_INFO, "DeviceIdMapping - Found > DeviceIdMapping[0][0]\n")); > + } else if (Token == > + (CM_OBJECT_TOKEN)&PlatformRepo->DeviceIdMapping[1][0]) { > + Count = 1; > + DEBUG ((DEBUG_INFO, "DeviceIdMapping - Found > DeviceIdMapping[1][0]\n")); > + } else { > + DEBUG ((DEBUG_INFO, "DeviceIdMapping - Not Found\n")); > + return EFI_NOT_FOUND; > + } > + > + CmObject->Data = (VOID*)Token; > + CmObject->ObjectId = CmObjectId; > + CmObject->Count = Count; > + CmObject->Size = Count * sizeof (CM_ARM_ID_MAPPING); > + > + return EFI_SUCCESS; > +} > + > +/** Return an ITS identifier array. > + > + @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 [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +GetItsIdentifierArray ( > + 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 > + ) > +{ > + EDKII_FVP_PLATFORM_REPOSITORY_INFO * PlatformRepo; > + UINTN Count; > + UINTN Index; > + > + if ((This == NULL) || (CmObject == NULL)) { > + ASSERT (This != NULL); > + ASSERT (CmObject != NULL); > + return EFI_INVALID_PARAMETER; > + } > + > + PlatformRepo = This->PlatRepoInfo->FvpPlatRepoInfo; > + > + Count = ARRAY_SIZE (PlatformRepo->ItsIdentifierArray); > + > + for (Index = 0; Index < Count; Index++) { > + if (Token == > (CM_OBJECT_TOKEN)&PlatformRepo->ItsIdentifierArray[Index]) { > + CmObject->ObjectId = CmObjectId; > + CmObject->Size = sizeof (PlatformRepo->ItsIdentifierArray[0]); > + CmObject->Data = (VOID*)&PlatformRepo->ItsIdentifierArray[Index]; > + CmObject->Count = 1; > + return EFI_SUCCESS; > + } > + } > + > + return EFI_NOT_FOUND; > +} > + > +/** Return an ITS group info. > + > + @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 [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +GetItsGroupInfo ( > + 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 > + ) > +{ > + EDKII_FVP_PLATFORM_REPOSITORY_INFO * PlatformRepo; > + UINTN Count; > + UINTN Index; > + > + if ((This == NULL) || (CmObject == NULL)) { > + ASSERT (This != NULL); > + ASSERT (CmObject != NULL); > + return EFI_INVALID_PARAMETER; > + } > + > + PlatformRepo = This->PlatRepoInfo->FvpPlatRepoInfo; > + > + Count = ARRAY_SIZE (PlatformRepo->ItsGroupInfo); > + > + for (Index = 0; Index < Count; Index++) { > + if (Token == (CM_OBJECT_TOKEN)&PlatformRepo->ItsGroupInfo[Index]) { > + CmObject->ObjectId = CmObjectId; > + CmObject->Size = sizeof (PlatformRepo->ItsGroupInfo[0]); > + CmObject->Data = (VOID*)&PlatformRepo->ItsGroupInfo[Index]; > + CmObject->Count = 1; > + return EFI_SUCCESS; > + } > + } > + > + return EFI_NOT_FOUND; > +} > + > +/** Return platform specific ARM namespace object. > + > + @param [in] This Pointer to the Configuration Manager > Protocol. > + @param [in] CmObjectId The Configuration Manager Object ID. > + @param [in] Token An optional token identifying the object. > If > + unused this must be CM_NULL_TOKEN. > + @param [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +GetArmNameSpaceObjectPlat ( > + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, > + IN CONST CM_OBJECT_ID CmObjectId, > + IN CONST CM_OBJECT_TOKEN Token OPTIONAL, > + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject > + ) > +{ > + EFI_STATUS Status; > + EDKII_FVP_PLATFORM_REPOSITORY_INFO * PlatformRepo; > + > + if ((This == NULL) || (CmObject == NULL)) { > + ASSERT (This != NULL); > + ASSERT (CmObject != NULL); > + return EFI_INVALID_PARAMETER; > + } > + PlatformRepo = This->PlatRepoInfo->FvpPlatRepoInfo; > + Status = EFI_NOT_FOUND; > + > + switch (GET_CM_OBJECT_ID (CmObjectId)) { > + case EArmObjGicItsInfo: > + Status = HandleCmObject ( > + CmObjectId, > + &PlatformRepo->GicItsInfo, > + sizeof (PlatformRepo->GicItsInfo), > + ARRAY_SIZE (PlatformRepo->GicItsInfo), > + CmObject > + ); > + break; > + > + case EArmObjSmmuV3: > + Status = HandleCmObject ( > + CmObjectId, > + PlatformRepo->SmmuV3Info, > + sizeof (PlatformRepo->SmmuV3Info), > + 1, > + CmObject > + ); > + break; > + > + case EArmObjItsGroup: > + Status = HandleCmObjectRefByToken ( > + This, > + CmObjectId, > + PlatformRepo->ItsGroupInfo, > + sizeof (PlatformRepo->ItsGroupInfo), > + ARRAY_SIZE (PlatformRepo->ItsGroupInfo), > + Token, > + GetItsGroupInfo, > + CmObject > + ); > + break; > + > + case EArmObjGicItsIdentifierArray: > + Status = HandleCmObjectRefByToken ( > + This, > + CmObjectId, > + PlatformRepo->ItsIdentifierArray, > + sizeof (PlatformRepo->ItsIdentifierArray), > + ARRAY_SIZE (PlatformRepo->ItsIdentifierArray), > + Token, > + GetItsIdentifierArray, > + CmObject > + ); > + break; > + > + case EArmObjRootComplex: > + Status = HandleCmObject ( > + CmObjectId, > + PlatformRepo->RootComplexInfo, > + sizeof (PlatformRepo->RootComplexInfo), > + 1, > + CmObject > + ); > + break; > + > + case EArmObjIdMappingArray: > + Status = HandleCmObjectRefByToken ( > + This, > + CmObjectId, > + PlatformRepo->DeviceIdMapping, > + sizeof (PlatformRepo->DeviceIdMapping), > + ARRAY_SIZE (PlatformRepo->DeviceIdMapping), > + Token, > + GetDeviceIdMappingArray, > + CmObject > + ); > + break; > + > + case EArmObjPciConfigSpaceInfo: > + Status = HandleCmObject ( > + CmObjectId, > + PlatformRepo->PciConfigInfo, > + sizeof (PlatformRepo->PciConfigInfo), > + 1, > + CmObject > + ); > + break; > + > + default: { > + break; > + } > + }//switch > + return Status; > +} > + > +/** Return platform specific standard namespace object. > + > + @param [in] This Pointer to the Configuration Manager > Protocol. > + @param [in] CmObjectId The Configuration Manager Object ID. > + @param [in] Token An optional token identifying the object. > If > + unused this must be CM_NULL_TOKEN. > + @param [in, 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. > +**/ > +EFI_STATUS > +EFIAPI > +GetStandardNameSpaceObjectPlat ( > + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This, > + IN CONST CM_OBJECT_ID CmObjectId, > + IN CONST CM_OBJECT_TOKEN Token OPTIONAL, > + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject > + ) > +{ > + EFI_STATUS Status; > + EDKII_FVP_PLATFORM_REPOSITORY_INFO * PlatformRepo; > + > + if ((This == NULL) || (CmObject == NULL)) { > + ASSERT (This != NULL); > + ASSERT (CmObject != NULL); > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_NOT_FOUND; > + PlatformRepo = This->PlatRepoInfo->FvpPlatRepoInfo; > + > + switch (GET_CM_OBJECT_ID (CmObjectId)) { > + case EStdObjAcpiTableList: > + Status = HandleCmObject ( > + CmObjectId, > + PlatformRepo->CmAcpiTableList, > + sizeof (PlatformRepo->CmAcpiTableList), > + ARRAY_SIZE (PlatformRepo->CmAcpiTableList), > + CmObject > + ); > + break; > + > + default: { > + break; > + } > + } > + > + return Status; > +} > diff --git > a/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/AslTables/DsdtFvp.asl > > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/AslTables/DsdtFvp.asl > new file mode 100644 > index 000000000000..6ff3d030ba9f > --- /dev/null > +++ > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/AslTables/DsdtFvp.asl > @@ -0,0 +1,98 @@ > +/** @file > + Differentiated System Description Table Fields (DSDT) > + > + Copyright (c) 2021, ARM Ltd. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include "ConfigurationManager.h" > + > +DefinitionBlock("Dsdt.aml", "DSDT", 1, "ARMLTD", "MORELLO", > CFG_MGR_OEM_REVISION) { > + Scope(_SB) { > + Device(CP00) { // Cluster 0, Cpu 0 > + Name(_HID, "ACPI0007") > + Name(_UID, 0) > + Name(_STA, 0xF) > + } > + > + Device(CP01) { // Cluster 0, Cpu 1 > + Name(_HID, "ACPI0007") > + Name(_UID, 1) > + Name(_STA, 0xF) > + } > + > + Device(CP02) { // Cluster 1, Cpu 0 > + Name(_HID, "ACPI0007") > + Name(_UID, 2) > + Name(_STA, 0xF) > + } > + > + Device(CP03) { // Cluster 1, Cpu 1 > + Name(_HID, "ACPI0007") > + Name(_UID, 3) > + Name(_STA, 0xF) > + } > + > + // VIRTIO DISK > + Device(VR00) { > + Name(_HID, "LNRO0005") > + Name(_UID, 0) > + > + Name(_CRS, ResourceTemplate() { > + Memory32Fixed( > + ReadWrite, > + FixedPcdGet32 (PcdVirtioBlkBaseAddress), > + FixedPcdGet32 (PcdVirtioBlkSize) > + ) > + Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) { > + FixedPcdGet32 (PcdVirtioBlkInterrupt) > + } > + }) > + } > + > + // VIRTIO NET > + Device(VR01) { > + Name(_HID, "LNRO0005") > + Name(_UID, 1) > + > + Name(_CRS, ResourceTemplate() { > + Memory32Fixed(ReadWrite, 0x1C180000, 0x00000200) > + Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) { 134 } > + }) > + } > + > + // VIRTIO RANDOM > + Device(VR02) { > + Name(_HID, "LNRO0005") > + Name(_UID, 2) > + > + Name(_CRS, ResourceTemplate() { > + Memory32Fixed(ReadWrite, 0x1C190000, 0x00000200) > + Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) { 133 } > + }) > + } > + > + // VIRTIO P9 Device > + Device(VR03) { > + Name(_HID, "LNRO0005") > + Name(_UID, 3) > + > + Name(_CRS, ResourceTemplate() { > + Memory32Fixed(ReadWrite, 0x1C1A0000, 0x00000200) > + Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) { 135 } > + }) > + } > + > + // SMC91X > + Device(NET0) { > + Name(_HID, "LNRO0003") > + Name(_UID, 0) > + > + Name(_CRS, ResourceTemplate() { > + Memory32Fixed(ReadWrite, 0x1D100000, 0x00001000) > + Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) { 130 } > + }) > + } > + } // Scope(_SB) > +} > diff --git > a/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/AslTables/SsdtPciFvp.asl > > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/AslTables/SsdtPciFvp.asl > new file mode 100644 > index 000000000000..bdf2f06aed69 > --- /dev/null > +++ > b/Platform/ARM/Morello/ConfigurationManager/ConfigurationManagerDxe/AslTables/SsdtPciFvp.asl > @@ -0,0 +1,130 @@ > +/** @file > + Secondary System Description Table (SSDT) > + > + Copyright (c) 2021, ARM Limited. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include "ConfigurationManager.h" > + > +#define LNK_DEVICE(Unique_Id, Link_Name, irq) \ > + Device(Link_Name) { \ > + Name(_HID, EISAID("PNP0C0F")) \ > + Name(_UID, Unique_Id) \ > + Name(_PRS, ResourceTemplate() { \ > + Interrupt(ResourceProducer, Level, ActiveHigh, Exclusive) { irq } \ > + }) \ > + Method (_CRS, 0) { Return (_PRS) } \ > + Method (_SRS, 1) { } \ > + Method (_DIS) { } \ > +} > + > +#define PRT_ENTRY(Address, Pin, Link) > \ > + Package (4) { > \ > + Address, /* uses the same format as _ADR */ > \ > + Pin, /* The PCI pin number of the device (0-INTA, 1-INTB, > 2-INTC, 3-INTD) */ \ > + Link, /* Interrupt allocated via Link device */ > \ > + Zero /* global system interrupt number (no used) */ > \ > +} > + > +#define ROOT_PRT_ENTRY(Pin, Link) PRT_ENTRY(0x0000FFFF, Pin, Link) // > Device 0 for Bridge. > + > +DefinitionBlock("SsdtPci.aml", "SSDT", 1, "ARMLTD", "MORELLO", > + CFG_MGR_OEM_REVISION) > +{ > + Scope (_SB) { > + // > + // PCI Root Complex > + // > + LNK_DEVICE(1, LNKA, 201) > + LNK_DEVICE(2, LNKB, 202) > + LNK_DEVICE(3, LNKC, 203) > + LNK_DEVICE(4, LNKD, 204) > + > + // PCI Root Complex > + Device(PCI0) { > + Name (_HID, EISAID("PNP0A08")) // PCI Express Root Bridge > + Name (_CID, EISAID("PNP0A03")) // Compatible PCI Root Bridge > + Name (_SEG, Zero) // PCI Segment Group number > + Name (_BBN, Zero) // PCI Base Bus Number > + Name (_CCA, 1) // Cache Coherency Attribute > + > + // Root Complex 0 > + Device (RP0) { > + Name(_ADR, 0xF0000000) // Dev 0, Func 0 > + } > + > + // PCI Routing Table > + Name(_PRT, Package() { > + ROOT_PRT_ENTRY(0, LNKA), // INTA > + ROOT_PRT_ENTRY(1, LNKB), // INTB > + ROOT_PRT_ENTRY(2, LNKC), // INTC > + ROOT_PRT_ENTRY(3, LNKD), // INTD > + }) > + > + // Root complex resources > + Method (_CRS, 0, Serialized) { > + Name (RBUF, ResourceTemplate () { > + WordBusNumber ( // Bus numbers > assigned to this root > + ResourceProducer, > + MinFixed, > + MaxFixed, > + PosDecode, > + 0, // > AddressGranularity > + FixedPcdGet32 (PcdPciBusMin), // AddressMinimum > - Minimum Bus Number > + FixedPcdGet32 (PcdPciBusMax), // AddressMaximum > - Maximum Bus Number > + 0, // > AddressTranslation - Set to 0 > + FixedPcdGet32 (PcdPciBusCount) // RangeLength - > Number of Busses > + ) > + > + DWordMemory ( // 32-bit BAR > Windows > + ResourceProducer, > + PosDecode, > + MinFixed, > + MaxFixed, > + Cacheable, > + ReadWrite, > + 0x00000000, // Granularity > + FixedPcdGet32 (PcdPciMmio32Base), // Min Base Address > + FixedPcdGet32 (PcdPciMmio32MaxBase), // Max Base Address > + FixedPcdGet32 (PcdPciMmio32Translation), // Translate > + FixedPcdGet32 (PcdPciMmio32Size) // Length > + ) > + > + QWordMemory ( // 64-bit BAR > Windows > + ResourceProducer, > + PosDecode, > + MinFixed, > + MaxFixed, > + Cacheable, > + ReadWrite, > + 0x00000000, // Granularity > + FixedPcdGet64 (PcdPciMmio64Base), // Min Base Address > + FixedPcdGet64 (PcdPciMmio64MaxBase), // Max Base Address > + FixedPcdGet64 (PcdPciMmio64Translation), // Translate > + FixedPcdGet64 (PcdPciMmio64Size) // Length > + ) > + > + DWordIo ( // IO window > + ResourceProducer, > + MinFixed, > + MaxFixed, > + PosDecode, > + EntireRange, > + 0x00000000, // Granularity > + FixedPcdGet32 (PcdPciIoBase), // Min Base Address > + FixedPcdGet32 (PcdPciIoMaxBase), // Max Base Address > + FixedPcdGet32 (PcdPciIoTranslation), // Translate > + FixedPcdGet32 (PcdPciIoSize), // Length > + , > + , > + , > + TypeTranslation > + ) > + }) // Name(RBUF) > + Return (RBUF) > + } // Method (_CRS) > + } // Device (PCI0) > + } // _SB > +} // DB > -- > 2.17.1 > > > > > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#74275): https://edk2.groups.io/g/devel/message/74275 Mute This Topic: https://groups.io/mt/82202483/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-