> -----Original Message-----
> From: Sami Mujawar [mailto:sami.muja...@arm.com]
> Sent: 19 March 2018 15:22
> To: edk2-devel@lists.01.org
> Cc: Arvind Chauhan <arvind.chau...@arm.com>; Daniil Egranov
> <daniil.egra...@arm.com>; Thomas Abraham
> <thomas.abra...@arm.com>; Evan Lloyd <evan.ll...@arm.com>;
> leif.lindh...@linaro.org; Matteo Carlini <matteo.carl...@arm.com>;
> Stephanie Hughes-Fitt <stephanie.hughes-f...@arm.com>; nd
> <n...@arm.com>
> Subject: [PATCH 2/2][platforms/dynamictables] Platform/ARM: Dynamic
> Tables support for FVP
> 
> The dynamic tables framework utilizes the configuration manager protocol
> to get the platform specific information required for building the firmware
> tables.
> 
> The configuration manager is a platform specific component that collates
> the platform hardware information and builds an abstract platform
> configuration repository. The configuration manager also implements the
> configuration manager protocol which returns the hardware information
> requested by the table generators.
> 
> This patch implements the configuration manager support for the FVP
> platform.
> 
> The dynamic tables framework support is configurable and can be enabled
> using the DYNAMIC_TABLES_FRAMEWORK build option.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Sami Mujawar <sami.muja...@arm.com>
Reviewed-by: Evan Lloyd <evan.ll...@arm.com>
> ---
>  Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc
> |  15 +
>  Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.fdf
> |  16 +-
> 
> Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManager.
> dsc.inc                        |  31 +
> 
> Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManager
> Dxe/ConfigurationManager.c      | 607 ++++++++++++++++++++
> 
> Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManager
> Dxe/ConfigurationManager.h      | 172 ++++++
> 
> Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManager
> Dxe/ConfigurationManagerDxe.inf |  78 +++
> 
> Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManager
> Dxe/Platform.h                  |  91 +++
> 
> Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLib/
> Dsdt.asl                       |  77 +++
> 
> Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLib/
> PlatformASLTablesLib.inf       |  34 ++
>  9 files changed, 1119 insertions(+), 2 deletions(-)
> 
> diff --git a/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc
> b/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc
> index
> cdf9e2d49784d542701dc84eb511f592e77ec106..ed1a16b7b35d9854847e
> 3898f8061abb5261e134 100644
> --- a/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc
> +++ b/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc
> @@ -38,6 +38,10 @@ [Defines]
>    DT_SUPPORT                     = FALSE
> 
>  !include Platform/ARM/VExpressPkg/ArmVExpress.dsc.inc
> +!ifdef DYNAMIC_TABLES_FRAMEWORK
> +  !include DynamicTablesPkg/DynamicTables.dsc.inc
> +  !include
> +Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManage
> r.dsc.
> +inc
> +!endif
> 
>  [LibraryClasses.common]
>    ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf
> @@ -128,6 +132,15 @@ [PcdsFixedAtBuild.common]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x1c090000
>    gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|115200
>    gEfiMdePkgTokenSpaceGuid.PcdUartDefaultReceiveFifoDepth|0
> +  gArmPlatformTokenSpaceGuid.PL011UartInterrupt|0x25
> +
> +  ## PL011 Serial Debug UART
> +  gArmPlatformTokenSpaceGuid.PcdSerialDbgRegisterBase|0x1c0a0000
> +  gArmPlatformTokenSpaceGuid.PcdSerialDbgUartBaudRate|115200
> +  gArmPlatformTokenSpaceGuid.PcdSerialDbgUartClkInHz|24000000
> +
> +  # SBSA Generic Watchdog
> +  gArmTokenSpaceGuid.PcdGenericWatchdogEl2IntrNum|59
> 
>    ## PL031 RealTimeClock
>    gArmPlatformTokenSpaceGuid.PcdPL031RtcBase|0x1C170000
> @@ -255,8 +268,10 @@ [Components.common]  !endif
>    }
> 
> +!ifndef DYNAMIC_TABLES_FRAMEWORK
>    MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatformDxe.inf
>    Platform/ARM/VExpressPkg/AcpiTables/AcpiTables.inf
> +!endif
> 
>    ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
>    ArmPlatformPkg/Drivers/NorFlashDxe/NorFlashDxe.inf
> diff --git a/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.fdf
> b/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.fdf
> index
> 305e661a2bdc3ade2c16232c77769df5fc6f0c32..db164be9641cf6e315302
> 3752f60f95909ce803c 100644
> --- a/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.fdf
> +++ b/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.fdf
> @@ -1,5 +1,5 @@
>  #
> -#  Copyright (c) 2011 - 2015, ARM Limited. All rights reserved.
> +#  Copyright (c) 2011 - 2018, ARM Limited. All rights reserved.
>  #
>  #  This program and the accompanying materials  #  are licensed and made
> available under the terms and conditions of the BSD License @@ -97,9
> +97,19 @@ [FV.FvMain]
> 
>    # ACPI Support
>    #
> -  INF MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatformDxe.inf
>    INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
> +!ifndef DYNAMIC_TABLES_FRAMEWORK
> +  INF
> MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatformDxe.inf
>    INF RuleOverride=ACPITABLE
> Platform/ARM/VExpressPkg/AcpiTables/AcpiTables.inf
> +!else
> +  # Configuration Manager
> +  INF
> +Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManage
> rDxe/C
> +onfigurationManagerDxe.inf
> +
> +  #
> +  # Dynamic Table fdf
> +  #
> +  !include DynamicTablesPkg/DynamicTables.fdf.inc
> +!endif
> 
>    #
>    # Multiple Console IO support
> @@ -319,8 +329,10 @@ [Rule.Common.UEFI_APPLICATION.BINARY]
>      VERSION   STRING="$(INF_VERSION)" Optional
> BUILD_NUM=$(BUILD_NUMBER)
>    }
> 
> +!ifndef DYNAMIC_TABLES_FRAMEWORK
>  [Rule.Common.USER_DEFINED.ACPITABLE]
>    FILE FREEFORM = $(NAMED_GUID) {
>      RAW ACPI               |.acpi
>      RAW ASL                |.aml
>    }
> +!endif
> diff --git
> a/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> er.dsc.inc
> b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> er.dsc.inc
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..8402742ebb0249d8b5
> 85d2315e24bba2f5ecf480
> --- /dev/null
> +++
> b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> er
> +++ .dsc.inc
> @@ -0,0 +1,31 @@
> +## @file
> +#
> +#  Copyright (c) 2017, ARM Limited. All rights reserved.
> +#
> +#  This program and the accompanying materials #  are licensed and made
> +available under the terms and conditions of the BSD License #  which
> +accompanies this distribution.  The full text of the license may be
> +found at #  http://opensource.org/licenses/bsd-license.php
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> +BASIS, #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> +##
> +
> +[Defines]
> +# [BuildOptions.common.EDKII.DXE_RUNTIME_DRIVER]
> +
> +[BuildOptions]
> +# Required for pre-processing ASL files that include ArmPlatform.h
> +  *_*_*_ASLPP_FLAGS        = $(PLATFORM_FLAGS)
> +
> +[LibraryClasses.common]
> +
> +[Components.common]
> +  # Configuration Manager
> +
> Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManager
> Dxe/ConfigurationManagerDxe.inf {
> +    <LibraryClasses>
> +    # Platform ASL Tables
> +
> +PlatformAslTablesLib|Platform/ARM/VExpressPkg/ConfigurationManager
> /Plat
> +formASLTablesLib/PlatformASLTablesLib.inf
> +  <BuildOptions>
> +   *_*_*_PLATFORM_FLAGS =
> +-
> I$(BIN_DIR)/Platform/ARM/VExpressPkg/ConfigurationManager/PlatformA
> SLT
> +ablesLib/PlatformASLTablesLib/OUTPUT
> +  }
> diff --git
> a/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> erDxe/ConfigurationManager.c
> b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> erDxe/ConfigurationManager.c
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..d45528813e2db9f44e
> 1745392dfd35ffe05f1dca
> --- /dev/null
> +++
> b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> er
> +++ Dxe/ConfigurationManager.c
> @@ -0,0 +1,607 @@
> +/** @file
> +  Configuration Manager Dxe
> +
> +  Copyright (c) 2017 - 2018, ARM Limited. All rights reserved.
> +
> +  This program and the accompanying materials  are licensed and made
> + available under the terms and conditions of the BSD License  which
> + accompanies this distribution.  The full text of the license may be
> + found at  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +  @par Glossary:
> +    - Cm or CM   - Configuration Manager
> +    - Obj or OBJ - Object
> +**/
> +
> +#include <IndustryStandard/DebugPort2Table.h>
> +#include <Library/IoLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/ArmLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PcdLib.h>
> +#include <Protocol/AcpiTable.h>
> +
> +#include <ArmPlatform.h>
> +#include <AcpiTableGenerator.h>
> +#include <Protocol/ConfigurationManagerProtocol.h>
> +
> +#include "ConfigurationManager.h"
> +#include "Platform.h"
> +
> +// AML Code Include files generated by iASL Compiler #include
> +<Dsdt.hex>
> +
> +/** The platform configuration repository information.
> +*/
> +STATIC
> +EFI_PLATFORM_REPOSITORY_INFO VExpressPlatRepositoryInfo = {
> +  /// Configuration Manager information
> +  { CONFIGURATION_MANAGER_REVISION, CFG_MGR_OEM_ID },
> +
> +  // ACPI Table List
> +  {
> +    // FADT Table
> +    {
> +      EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,
> +      CREATE_STD_ACPI_TABLE_GEN_ID (ESTD_ACPI_TABLE_ID_FADT),
> +      NULL
> +    },
> +    // GTDT Table
> +    {
> +      EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,
> +      CREATE_STD_ACPI_TABLE_GEN_ID (ESTD_ACPI_TABLE_ID_GTDT),
> +      NULL
> +    },
> +    // MADT Table
> +    {
> +      EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,
> +      CREATE_STD_ACPI_TABLE_GEN_ID (ESTD_ACPI_TABLE_ID_MADT),
> +      NULL
> +    },
> +    // SPCR Table
> +    {
> +
> EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE,
> +      CREATE_STD_ACPI_TABLE_GEN_ID (ESTD_ACPI_TABLE_ID_SPCR),
> +      NULL
> +    },
> +    // DSDT Table
> +    {
> +
> EFI_ACPI_6_2_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,
> +      CREATE_STD_ACPI_TABLE_GEN_ID (ESTD_ACPI_TABLE_ID_DSDT),
> +      (EFI_ACPI_DESCRIPTION_HEADER*)dsdt_AmlCode
> +    },
> +    // DBG2 Table
> +    {
> +      EFI_ACPI_6_2_DEBUG_PORT_2_TABLE_SIGNATURE,
> +      CREATE_STD_ACPI_TABLE_GEN_ID (ESTD_ACPI_TABLE_ID_DBG2),
> +      NULL
> +    }
> +  },
> +
> +  // Boot architecture information
> +  { EFI_ACPI_6_2_ARM_PSCI_COMPLIANT },              // BootArchFlags
> +
> +#ifdef HEADLESS_PLATFORM
> +  // Fixed feature flag information
> +  { EFI_ACPI_6_2_HEADLESS },                        // Fixed feature flags
> +#endif
> +
> +  // Power management profile information
> +  { EFI_ACPI_6_2_PM_PROFILE_ENTERPRISE_SERVER },    //
> PowerManagement Profile
> +
> +  /* GIC CPU Interface information
> +     GIC_ENTRY (CPUInterfaceNumber, Mpidr, PmuIrq, VGicIrq,
> + EnergyEfficiency)  */  {
> +    GICC_ENTRY (0, GET_MPID (0, 0), 92, 25, 0),
> +    GICC_ENTRY (1, GET_MPID (0, 1), 93, 25, 0),
> +    GICC_ENTRY (2, GET_MPID (0, 2), 94, 25, 0),
> +    GICC_ENTRY (3, GET_MPID (0, 3), 95, 25, 0),
> +
> +    GICC_ENTRY (4, GET_MPID (1, 0), 96, 25, 0),
> +    GICC_ENTRY (5, GET_MPID (1, 1), 97, 25, 0),
> +    GICC_ENTRY (6, GET_MPID (1, 2), 98, 25, 0),
> +    GICC_ENTRY (7, GET_MPID (1, 3), 99, 25, 0)  },
> +
> +  // GIC Distributor Info
> +  {
> +    0,                                      // UINT32  GicId
> +    FixedPcdGet64 (PcdGicDistributorBase),  // UINT64
> PhysicalBaseAddress
> +    0,                                      // UINT32  SystemVectorBase
> +    3                                       // UINT8   GicVersion
> +  },
> +
> +  /// GIC Re-Distributor Info
> +  {
> +    // UINT64  DiscoveryRangeBaseAddress
> +    FixedPcdGet64 (PcdGicRedistributorsBase),
> +    // UINT32  DiscoveryRangeLength
> +    0x00200000
> +  },
> +
> +  // Generic Timer Info
> +  {
> +    // The physical base address for the counter control frame
> +    FVP_SYSTEM_TIMER_BASE_ADDRESS,
> +    // The physical base address for the counter read frame
> +    FVP_CNT_READ_BASE_ADDRESS,
> +    // The secure PL1 timer interrupt
> +    FixedPcdGet32 (PcdArmArchTimerSecIntrNum),
> +    // The secure PL1 timer flags
> +    FVP_GTDT_GTIMER_FLAGS,
> +    // The non-secure PL1 timer interrupt
> +    FixedPcdGet32 (PcdArmArchTimerIntrNum),
> +    // The non-secure PL1 timer flags
> +    FVP_GTDT_GTIMER_FLAGS,
> +    // The virtual timer interrupt
> +    FixedPcdGet32 (PcdArmArchTimerVirtIntrNum),
> +    // The virtual timer flags
> +    FVP_GTDT_GTIMER_FLAGS,
> +    // The non-secure PL2 timer interrupt
> +    FixedPcdGet32 (PcdArmArchTimerHypIntrNum),
> +    // The non-secure PL2 timer flags
> +    FVP_GTDT_GTIMER_FLAGS
> +  },
> +
> +  // Generic Timer Block Information
> +  {
> +    {
> +      // The physical base address for the GT Block Timer structure
> +      FVP_GT_BLOCK_CTL_BASE,
> +      // The number of timer frames implemented in the GT Block
> +      FVP_TIMER_FRAMES_COUNT,
> +      // Reference token for the GT Block timer frame list
> +      (CM_OBJECT_TOKEN)((UINT8*)&VExpressPlatRepositoryInfo +
> +        OFFSET_OF (EFI_PLATFORM_REPOSITORY_INFO, GTBlock0TimerInfo))
> +    }
> +  },
> +
> +  // GT Block Timer Frames
> +  {
> +    // Frame 0
> +    {
> +      0,                                // UINT8   FrameNumber
> +      FVP_GT_BLOCK_FRAME0_CTL_BASE,     // UINT64
> PhysicalAddressCntBase
> +      FVP_GT_BLOCK_FRAME0_CTL_EL0_BASE, // UINT64
> PhysicalAddressCntEL0Base
> +      FVP_GT_BLOCK_FRAME0_GSIV,         // UINT32  PhysicalTimerGSIV
> +      FVP_GTX_TIMER_FLAGS,              // UINT32  PhysicalTimerFlags
> +      0,                                // UINT32  VirtualTimerGSIV
> +      0,                                // UINT32  VirtualTimerFlags
> +      FVP_GTX_COMMON_FLAGS              // UINT32  CommonFlags
> +    },
> +    // Frame 1
> +    {
> +      1,                                // UINT8   FrameNumber
> +      FVP_GT_BLOCK_FRAME1_CTL_BASE,     // UINT64
> PhysicalAddressCntBase
> +      FVP_GT_BLOCK_FRAME1_CTL_EL0_BASE, // UINT64
> PhysicalAddressCntEL0Base
> +      FVP_GT_BLOCK_FRAME1_GSIV,         // UINT32  PhysicalTimerGSIV
> +      FVP_GTX_TIMER_FLAGS,              // UINT32  PhysicalTimerFlags
> +      0,                                // UINT32  VirtualTimerGSIV
> +      0,                                // UINT32  VirtualTimerFlags
> +      FVP_GTX_COMMON_FLAGS              // 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
> +    FVP_SBSA_WATCHDOG_FLAGS
> +  },
> +
> +  // SPCR Serial Port
> +  {
> +    FixedPcdGet64 (PcdSerialRegisterBase),            // UINT64  BaseAddress
> +    FixedPcdGet32 (PL011UartInterrupt),               // UINT32  Interrupt
> +    FixedPcdGet64 (PcdUartDefaultBaudRate),           // UINT64  BaudRate
> +    FixedPcdGet32 (PL011UartClkInHz),                 // UINT32  Clock
> +    EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART  // UINT16
> Port
> + subtype  },  // Debug Serial Port  {
> +    FixedPcdGet64 (PcdSerialDbgRegisterBase),         // UINT64  BaseAddress
> +    38,                                               // UINT32  Interrupt
> +    FixedPcdGet64 (PcdSerialDbgUartBaudRate),         // UINT64  BaudRate
> +    FixedPcdGet32 (PcdSerialDbgUartClkInHz),          // UINT32  Clock
> +    EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART  // UINT16
> Port
> + subtype  },
> +
> +  // GIC ITS
> +  {
> +    // The GIC ITS ID.
> +    0,
> +    // The physical address for the Interrupt Translation Service
> +    0x2f020000
> +  }
> +};
> +
> +/** Initialize the platform configuration repository.
> +
> +  @param [in]  This        Pointer to the Configuration Manager Protocol.
> +
> +  @retval
> +    EFI_SUCCESS   Success
> +*/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +InitializePlatformRepository (
> +  IN  CONST EFI_CONFIGURATION_MANAGER_PROTOCOL  * CONST This
> +  )
> +{
> +  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 [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 EFI_CONFIGURATION_MANAGER_PROTOCOL  * CONST This,
> +  IN  CONST CM_OBJECT_ID                                CmObjectId,
> +  IN  CONST CM_OBJECT_TOKEN                             Token,
> +  IN  OUT   CM_OBJ_DESCRIPTOR                   * CONST CmObject
> +  )
> +{
> +  EFI_PLATFORM_REPOSITORY_INFO  * PlatformRepo;
> +
> +  if ((This == NULL) || (CmObject == NULL)) {
> +    ASSERT (This != NULL);
> +    ASSERT (CmObject != NULL);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  PlatformRepo = This->PlatRepoInfo;
> +
> +  if (Token != (CM_OBJECT_TOKEN)&PlatformRepo->GTBlock0TimerInfo) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  CmObject->Size = sizeof (PlatformRepo->GTBlock0TimerInfo);
> +  CmObject->Data = (VOID*)&PlatformRepo->GTBlock0TimerInfo;
> +  return EFI_SUCCESS;
> +}
> +
> +/** 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 [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 EFI_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 = EFI_SUCCESS;
> +  EFI_PLATFORM_REPOSITORY_INFO  * PlatformRepo;
> +
> +  if ((This == NULL) || (CmObject == NULL)) {
> +    ASSERT (This != NULL);
> +    ASSERT (CmObject != NULL);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +  PlatformRepo = This->PlatRepoInfo;
> +
> +  switch (GET_CM_OBJECT_ID (CmObjectId)) {
> +    HANDLE_CM_OBJECT (EStdObjCfgMgrInfo, PlatformRepo->CmInfo);
> +    HANDLE_CM_OBJECT (EStdObjAcpiTableList, PlatformRepo-
> >CmAcpiTableList);
> +    default: {
> +      Status = EFI_NOT_FOUND;
> +      DEBUG ((
> +        DEBUG_ERROR,
> +        "ERROR: Object 0x%x. Status = %r\n",
> +        CmObjectId,
> +        Status
> +        ));
> +      break;
> +    }
> +  }
> +
> +  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 [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 EFI_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 = EFI_SUCCESS;
> +  EFI_PLATFORM_REPOSITORY_INFO  * PlatformRepo;
> +
> +  if ((This == NULL) || (CmObject == NULL)) {
> +    ASSERT (This != NULL);
> +    ASSERT (CmObject != NULL);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +  PlatformRepo = This->PlatRepoInfo;
> +
> +  switch (GET_CM_OBJECT_ID (CmObjectId)) {
> +    HANDLE_CM_OBJECT (EArmObjBootArchInfo, PlatformRepo-
> >BootArchInfo);
> +#ifdef HEADLESS_PLATFORM
> +    HANDLE_CM_OBJECT (
> +      EArmObjFixedFeatureFlags,
> +      PlatformRepo->FixedFeatureFlags
> +      );
> +#endif
> +    HANDLE_CM_OBJECT (
> +      EArmObjPowerManagementProfileInfo,
> +      PlatformRepo->PmProfileInfo
> +      );
> +    HANDLE_CM_OBJECT (EArmObjGenericTimerInfo, PlatformRepo-
> >GenericTimerInfo);
> +    HANDLE_CM_OBJECT (
> +      EArmObjPlatformGenericWatchdogInfo,
> +      PlatformRepo->Watchdog
> +      );
> +    HANDLE_CM_OBJECT (EArmObjPlatformGTBlockInfo, PlatformRepo-
> >GTBlockInfo);
> +    HANDLE_CM_OBJECT_REF_BY_TOKEN (
> +      EArmObjGTBlockTimerFrameInfo,
> +      PlatformRepo->GTBlock0TimerInfo,
> +      Token,
> +      GetGTBlockTimerFrameInfo
> +      );
> +    HANDLE_CM_OBJECT (EArmObjGicCInfo, PlatformRepo->GicCInfo);
> +    HANDLE_CM_OBJECT (EArmObjGicDInfo, PlatformRepo->GicDInfo);
> +    HANDLE_CM_OBJECT (EArmObjGicRedistributorInfo, PlatformRepo-
> >GicRedistInfo);
> +    HANDLE_CM_OBJECT (
> +      EArmObjSerialConsolePortInfo,
> +      PlatformRepo->SpcrSerialPort
> +      );
> +    HANDLE_CM_OBJECT (EArmObjSerialDebugPortInfo, PlatformRepo-
> >DbgSerialPort);
> +    HANDLE_CM_OBJECT (EArmObjGicItsInfo, PlatformRepo->GicItsInfo);
> +
> +    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 [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.
> +  @retval EFI_BAD_BUFFER_SIZE   The size returned by the Configuration
> Manager
> +                                is less than the Object size for the 
> requested
> +                                object.
> +*/
> +EFI_STATUS
> +EFIAPI
> +GetOemNameSpaceObject (
> +  IN  CONST EFI_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 = 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 [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
> +ArmVExpressPlatformGetObject (
> +  IN  CONST EFI_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 [out] CmObject    Pointer to the Configuration Manager Object
> +                           descriptor describing the Object.
> +
> +  @retval EFI_UNSUPPORTED  This operation is not supported.
> +*/
> +EFI_STATUS
> +EFIAPI
> +ArmVExpressPlatformSetObject (
> +  IN  CONST EFI_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
> +EFI_CONFIGURATION_MANAGER_PROTOCOL
> +VExpressPlatformConfigManagerProtocol = {
> +  CREATE_REVISION(1,0),
> +  ArmVExpressPlatformGetObject,
> +  ArmVExpressPlatformSetObject,
> +  &VExpressPlatRepositoryInfo
> +};
> +
> +/**
> +  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;
> +
> +  Status = gBS->InstallProtocolInterface (
> +                  &ImageHandle,
> +                  &gEfiConfigurationManagerProtocolGuid,
> +                  EFI_NATIVE_INTERFACE,
> +                  (VOID*)&VExpressPlatformConfigManagerProtocol
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((
> +      DEBUG_ERROR,
> +      "ERROR: Failed to get Install Configuration Manager Protocol." \
> +      " Status = %r\n",
> +      Status
> +      ));
> +    goto error_handler;
> +  }
> +
> +  Status = InitializePlatformRepository (
> +    &VExpressPlatformConfigManagerProtocol
> +    );
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((
> +      DEBUG_ERROR,
> +      "ERROR: Failed to initialize the Platform Configuration Repository." \
> +      " Status = %r\n",
> +      Status
> +      ));
> +  }
> +
> +error_handler:
> +  return Status;
> +}
> diff --git
> a/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> erDxe/ConfigurationManager.h
> b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> erDxe/ConfigurationManager.h
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..2d852b2d0466e5a87c
> 0b2c33b6041faab47cbea7
> --- /dev/null
> +++
> b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> er
> +++ Dxe/ConfigurationManager.h
> @@ -0,0 +1,172 @@
> +/** @file
> +
> +  Copyright (c) 2017 - 2018, ARM Limited. All rights reserved.
> +
> +  This program and the accompanying materials  are licensed and made
> + available under the terms and conditions of the BSD License  which
> + accompanies this distribution.  The full text of the license may be
> + found at  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +  @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' }
> +
> +/** A helper macro for populating the GIC CPU information */
> +#define GICC_ENTRY(                                                      \
> +          CPUInterfaceNumber,                                            \
> +          Mpidr,                                                         \
> +          PmuIrq,                                                        \
> +          VGicIrq,                                                       \
> +          EnergyEfficiency                                               \
> +          ) {                                                            \
> +    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     */ \
> +    0,                        /* UINT64  GICRBaseAddress              */ \
> +    Mpidr,                    /* UINT64  MPIDR                        */ \
> +    EnergyEfficiency          /* UINT8   ProcessorPowerEfficiencyClass*/ \
> +    }
> +
> +/** A helper macro for returning configuration manager objects */
> +#define HANDLE_CM_OBJECT(CmObjectId, Object)   \
> +  case CmObjectId: {                           \
> +    CmObject->Size = sizeof (Object);          \
> +    CmObject->Data = (VOID*)&Object;           \
> +    DEBUG ((                                   \
> +      DEBUG_INFO,                              \
> +      #CmObjectId ": Ptr = 0x%p, Size = %d\n", \
> +      CmObject->Data,                          \
> +      CmObject->Size                           \
> +      ));                                      \
> +    break;                                     \
> +  }
> +
> +/** A helper macro for returning configuration manager objects
> +    referenced by token
> +*/
> +#define HANDLE_CM_OBJECT_REF_BY_TOKEN(                          \
> +          CmObjectId,                                           \
> +          Object,                                               \
> +          Token,                                                \
> +          HandlerProc                                           \
> +          )                                                     \
> +  case CmObjectId: {                                            \
> +    if (Token == CM_NULL_TOKEN) {                               \
> +      CmObject->Size = sizeof (Object);                         \
> +      CmObject->Data = (VOID*)&Object;                          \
> +      DEBUG ((                                                  \
> +        DEBUG_INFO,                                             \
> +        #CmObjectId ": Ptr = 0x%p, Size = %d\n",                \
> +        CmObject->Data,                                         \
> +        CmObject->Size                                          \
> +        ));                                                     \
> +    } else {                                                    \
> +      Status = HandlerProc (This, CmObjectId, Token, CmObject); \
> +      DEBUG ((                                                  \
> +        DEBUG_INFO,                                             \
> +        #CmObjectId ": Token = 0x%p, Ptr = 0x%p, Size = %d\n",  \
> +        (VOID*)Token,                                           \
> +        CmObject->Data,                                         \
> +        CmObject->Size                                          \
> +        ));                                                     \
> +    }                                                           \
> +    break;                                                      \
> +  }
> +
> +/** The number of CPUs
> +*/
> +#define PLAT_CPU_COUNT              8
> +
> +/** The number of ACPI tables to install */
> +#define PLAT_ACPI_TABLE_COUNT       6
> +
> +/** 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
> +
> +/** A structure describing the platform configuration
> +    manager repository information
> +*/
> +typedef struct PlatformRepositoryInfo {
> +  /// Configuration Manager Information
> +  CM_STD_OBJ_CONFIGURATION_MANAGER_INFO CmInfo;
> +
> +  /// List of ACPI tables
> +  CM_STD_OBJ_ACPI_TABLE_INFO
> CmAcpiTableList[PLAT_ACPI_TABLE_COUNT];
> +
> +  /// 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;
> +
> +  /// GIC ITS information
> +  CM_ARM_GIC_ITS_INFO                   GicItsInfo;
> +} EFI_PLATFORM_REPOSITORY_INFO;
> +
> +#endif // CONFIGURATION_MANAGER_H__
> diff --git
> a/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> erDxe/ConfigurationManagerDxe.inf
> b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> erDxe/ConfigurationManagerDxe.inf
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..ff61763f661289e2f86
> 911b5f68576ac657a400c
> --- /dev/null
> +++
> b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> er
> +++ Dxe/ConfigurationManagerDxe.inf
> @@ -0,0 +1,78 @@
> +## @file
> +#
> +#  Copyright (c) 2017 - 2018, ARM Limited. All rights reserved.
> +#
> +#  This program and the accompanying materials #  are licensed and made
> +available under the terms and conditions of the BSD License #  which
> +accompanies this distribution.  The full text of the license may be
> +found at #  http://opensource.org/licenses/bsd-license.php
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> +BASIS, #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010019
> +  BASE_NAME                      = ConfigurationManagerDxe
> +  FILE_GUID                      = 29F45677-1920-4454-94A6-CF119C9491DB
> +  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           = ARM AARCH64
> +#
> +
> +[Sources]
> +  ConfigurationManager.c
> +
> +[Packages]
> +  ArmPkg/ArmPkg.dec
> +  ArmPlatformPkg/ArmPlatformPkg.dec
> +  DynamicTablesPkg/DynamicTablesPkg.dec
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  Platform/ARM/VExpressPkg/ArmVExpressPkg.dec
> +
> +[LibraryClasses]
> +  ArmPlatformLib
> +  PlatformAslTablesLib
> +  PrintLib
> +  UefiBootServicesTableLib
> +  UefiDriverEntryPoint
> +  UefiRuntimeServicesTableLib
> +
> +[Protocols]
> +  gEfiConfigurationManagerProtocolGuid
> +
> +[FixedPcd]
> +  gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum
> +  gArmTokenSpaceGuid.PcdArmArchTimerIntrNum
> +  gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum
> +  gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum
> +
> +  gArmTokenSpaceGuid.PcdGicDistributorBase
> +  gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase
> +  gArmTokenSpaceGuid.PcdGicRedistributorsBase
> +
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase
> +  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate
> +  gArmPlatformTokenSpaceGuid.PL011UartClkInHz
> +  gArmPlatformTokenSpaceGuid.PL011UartInterrupt
> +
> +  ## PL011 Serial Debug UART
> +  gArmPlatformTokenSpaceGuid.PcdSerialDbgRegisterBase
> +  gArmPlatformTokenSpaceGuid.PcdSerialDbgUartBaudRate
> +  gArmPlatformTokenSpaceGuid.PcdSerialDbgUartClkInHz
> +
> +  # SBSA Generic Watchdog
> +  gArmTokenSpaceGuid.PcdGenericWatchdogControlBase
> +  gArmTokenSpaceGuid.PcdGenericWatchdogRefreshBase
> +  gArmTokenSpaceGuid.PcdGenericWatchdogEl2IntrNum
> +
> +[Pcd]
> +
> +[Depex]
> +  TRUE
> diff --git
> a/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> erDxe/Platform.h
> b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> erDxe/Platform.h
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..8ba32717704af8cc65d
> 23e93affcc2922add0346
> --- /dev/null
> +++
> b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManag
> er
> +++ Dxe/Platform.h
> @@ -0,0 +1,91 @@
> +/** @file
> +
> +  Copyright (c) 2017, ARM Limited. All rights reserved.
> +
> +  This program and the accompanying materials  are licensed and made
> + available under the terms and conditions of the BSD License  which
> + accompanies this distribution.  The full text of the license may be
> + found at  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#ifndef PLATFORM_H__
> +#define PLATFORM_H__
> +
> +#define ENABLE_MEM_MAPPED_TIMER
> +
> +#ifdef ENABLE_MEM_MAPPED_TIMER
> +#define FVP_SYSTEM_TIMER_BASE_ADDRESS   0x2A430000
> +#define FVP_CNT_READ_BASE_ADDRESS       0x2A800000
> +#else
> +#define FVP_SYSTEM_TIMER_BASE_ADDRESS   0xFFFFFFFFFFFFFFFF
> +#define FVP_CNT_READ_BASE_ADDRESS       0xFFFFFFFFFFFFFFFF
> +#endif
> +
> +// GT Block Timer
> +#define FVP_GT_BLOCK_CTL_BASE           0x2A810000
> +#define FVP_TIMER_FRAMES_COUNT          2
> +
> +// GT Block Timer Frames
> +#define FVP_GT_BLOCK_FRAME0_CTL_BASE      0x2A820000
> +#define FVP_GT_BLOCK_FRAME0_CTL_EL0_BASE  0xFFFFFFFFFFFFFFFF
> +#define FVP_GT_BLOCK_FRAME0_GSIV          57
> +
> +#define FVP_GT_BLOCK_FRAME1_CTL_BASE      0x2A830000
> +#define FVP_GT_BLOCK_FRAME1_CTL_EL0_BASE  0xFFFFFFFFFFFFFFFF
> +#define FVP_GT_BLOCK_FRAME1_GSIV          58
> +
> +#define GTDT_TIMER_EDGE_TRIGGERED   \
> +          EFI_ACPI_6_2_GTDT_TIMER_FLAG_TIMER_INTERRUPT_MODE
> +#define GTDT_TIMER_LEVEL_TRIGGERED  0
> +#define GTDT_TIMER_ACTIVE_LOW       \
> +          EFI_ACPI_6_2_GTDT_TIMER_FLAG_TIMER_INTERRUPT_POLARITY
> +#define GTDT_TIMER_ACTIVE_HIGH      0
> +#define GTDT_TIMER_SAVE_CONTEXT     \
> +          EFI_ACPI_6_2_GTDT_TIMER_FLAG_ALWAYS_ON_CAPABILITY
> +#define GTDT_TIMER_LOSE_CONTEXT     0
> +
> +#define FVP_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_2_GTDT_GT_BLOCK_TIMER_FLAG_TIMER_INTERRUPT_MODE
> +#define GTX_TIMER_LEVEL_TRIGGERED   0
> +#define GTX_TIMER_ACTIVE_LOW        \
> +
> EFI_ACPI_6_2_GTDT_GT_BLOCK_TIMER_FLAG_TIMER_INTERRUPT_POLARIT
> Y
> +#define GTX_TIMER_ACTIVE_HIGH       0
> +
> +#define FVP_GTX_TIMER_FLAGS         (GTX_TIMER_ACTIVE_HIGH | \
> +                                       GTX_TIMER_LEVEL_TRIGGERED)
> +
> +#define GTX_TIMER_SECURE            \
> +          EFI_ACPI_6_2_GTDT_GT_BLOCK_COMMON_FLAG_SECURE_TIMER
> +#define GTX_TIMER_NON_SECURE        0
> +#define GTX_TIMER_SAVE_CONTEXT      \
> +
> EFI_ACPI_6_2_GTDT_GT_BLOCK_COMMON_FLAG_ALWAYS_ON_CAPABILIT
> Y
> +#define GTX_TIMER_LOSE_CONTEXT      0
> +
> +#define FVP_GTX_COMMON_FLAGS        (GTX_TIMER_SAVE_CONTEXT |
> GTX_TIMER_SECURE)
> +
> +// Watchdog
> +#define SBSA_WATCHDOG_EDGE_TRIGGERED   \
> +
> +EFI_ACPI_6_2_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_TIMER_INTERRU
> PT_MODE
> +#define SBSA_WATCHDOG_LEVEL_TRIGGERED  0
> +#define SBSA_WATCHDOG_ACTIVE_LOW       \
> +
> EFI_ACPI_6_2_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_TIMER_INTERRUP
> T_POLARITY
> +#define SBSA_WATCHDOG_ACTIVE_HIGH      0
> +#define SBSA_WATCHDOG_SECURE           \
> +
> EFI_ACPI_6_2_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_SECURE_TIMER
> +#define SBSA_WATCHDOG_NON_SECURE       0
> +
> +#define FVP_SBSA_WATCHDOG_FLAGS
> (SBSA_WATCHDOG_NON_SECURE       | \
> +                                          SBSA_WATCHDOG_ACTIVE_HIGH    | \
> +
> +SBSA_WATCHDOG_LEVEL_TRIGGERED)
> +
> +#endif // PLATFORM_H__
> +
> diff --git
> a/Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLi
> b/Dsdt.asl
> b/Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLi
> b/Dsdt.asl
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..15ce7c020045d42f08c
> f92ad76644b07f0a1e25e
> --- /dev/null
> +++
> b/Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLi
> b
> +++ /Dsdt.asl
> @@ -0,0 +1,77 @@
> +/** @file
> +  Differentiated System Description Table Fields (DSDT)
> +
> +  Copyright (c) 2014-2017, ARM Ltd. All rights reserved.<BR>
> +    This program and the accompanying materials  are licensed and made
> + available under the terms and conditions of the BSD License  which
> + accompanies this distribution.  The full text of the license may be
> + found at  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +**/
> +
> +DefinitionBlock("DsdtTable.aml", "DSDT", 1, "ARMLTD", "ARM-VEXPRESS",
> +1) {
> +  Scope(_SB) {
> +    //
> +    // Processor
> +    //
> +    Device(CPU0) {
> +      Name(_HID, "ACPI0007")
> +      Name(_UID, Zero)
> +    }
> +    Device(CPU1) {
> +      Name(_HID, "ACPI0007")
> +      Name(_UID, One)
> +    }
> +    Device(CPU2) {
> +      Name(_HID, "ACPI0007")
> +      Name(_UID, 2)
> +    }
> +    Device(CPU3) {
> +      Name(_HID, "ACPI0007")
> +      Name(_UID, 3)
> +    }
> +    Device(CPU4) {
> +      Name(_HID, "ACPI0007")
> +      Name(_UID, 4)
> +    }
> +    Device(CPU5) {
> +      Name(_HID, "ACPI0007")
> +      Name(_UID, 5)
> +    }
> +    Device(CPU6) {
> +      Name(_HID, "ACPI0007")
> +      Name(_UID, 6)
> +    }
> +    Device(CPU7) {
> +      Name(_HID, "ACPI0007")
> +      Name(_UID, 7)
> +    }
> +
> +    // UART PL011
> +    Device(COM2) {
> +      Name(_HID, "ARMH0011")
> +      Name(_CID, "PL011")
> +      Name(_UID, Zero)
> +
> +      Method(_STA) {
> +        Return(0xF)
> +      }
> +
> +      Method(_CRS, 0x0, NotSerialized) {
> +        Name(RBUF, ResourceTemplate() {
> +          // UART1
> +          Memory32Fixed(ReadWrite, 0x1c090000, 0x1000)
> +          Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) { 0x25 }
> +          // UART3
> +          // Memory32Fixed(ReadWrite, 0x1c0B0000, 0x1000)
> +          // Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) { 
> 0x27 }
> +        })
> +        Return (RBUF)
> +      }
> +    }
> +
> +  } // Scope(_SB)
> +}
> diff --git
> a/Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLi
> b/PlatformASLTablesLib.inf
> b/Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLi
> b/PlatformASLTablesLib.inf
> new file mode 100644
> index
> 0000000000000000000000000000000000000000..28426e18f32dc25af6f
> af51826e11d5e09fe105d
> --- /dev/null
> +++
> b/Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLi
> b
> +++ /PlatformASLTablesLib.inf
> @@ -0,0 +1,34 @@
> +## @file
> +#
> +#  Copyright (c) 2017 - 2018, ARM Limited. All rights reserved.
> +#
> +#  This program and the accompanying materials #  are licensed and made
> +available under the terms and conditions of the BSD License #  which
> +accompanies this distribution.  The full text of the license may be
> +found at #  http://opensource.org/licenses/bsd-license.php
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> +BASIS, #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND,
> EITHER EXPRESS OR IMPLIED.
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010019
> +  BASE_NAME                      = PlatformAslTablesLib
> +  FILE_GUID                      = 4000AEAB-C6D3-4F67-ADE3-D4B504FC164B
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = PlatformAslTablesLib|DXE_DRIVER
> +
> +#
> +# The following information is for reference only and not required by the
> build tools.
> +#
> +#  VALID_ARCHITECTURES           = ARM AARCH64
> +#
> +
> +[Sources]
> +  Dsdt.asl
> +
> +[Packages]
> +  ArmPlatformPkg/ArmPlatformPkg.dec
> +  MdePkg/MdePkg.dec
> +  Platform/ARM/VExpressPkg/ArmVExpressPkg.dec
> --
> 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'
> 

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to