[edk2-devel] [edk2-platforms][PATCH V3 4/7] Platform/ARM/Morello: Add Configuration Manager for Morello

chandni cherukuri posted 7 patches 4 years, 9 months ago
[edk2-devel] [edk2-platforms][PATCH V3 4/7] Platform/ARM/Morello: Add Configuration Manager for Morello
Posted by chandni cherukuri 4 years, 9 months ago
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 <jrtc27@jrtc27.com>
Signed-off-by: Chandni Cherukuri <chandni.cherukuri@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
+      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 (#74244): https://edk2.groups.io/g/devel/message/74244
Mute This Topic: https://groups.io/mt/82202483/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [edk2-platforms][PATCH V3 4/7] Platform/ARM/Morello: Add Configuration Manager for Morello
Posted by Sami Mujawar 4 years, 9 months ago
Hi Chandni,

Please find my response inline marked [SAMI].

Regards,

Sami Mujawar

On 19/04/2021, 06:41, "Chandni Cherukuri" <chandni.cherukuri@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 <jrtc27@jrtc27.com>
    Signed-off-by: Chandni Cherukuri <chandni.cherukuri@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 (#74270): https://edk2.groups.io/g/devel/message/74270
Mute This Topic: https://groups.io/mt/82202483/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-


Re: [edk2-devel] [edk2-platforms][PATCH V3 4/7] Platform/ARM/Morello: Add Configuration Manager for Morello
Posted by chandni cherukuri 4 years, 9 months ago
Hi Sami,

Please go ahead with the change.

Thanks
Chandni

On Mon, Apr 19, 2021 at 3:30 PM Sami Mujawar <sami.mujawar@arm.com> wrote:
>
> Hi Chandni,
>
> Please find my response inline marked [SAMI].
>
> Regards,
>
> Sami Mujawar
>
> On 19/04/2021, 06:41, "Chandni Cherukuri" <chandni.cherukuri@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 <jrtc27@jrtc27.com>
>     Signed-off-by: Chandni Cherukuri <chandni.cherukuri@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/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-