[edk2] [PATCH 2/2] [edk2-platforms] Platform/ARM: Dynamic Tables support for FVP

evan.lloyd@arm.com posted 2 patches 7 years, 2 months ago
[edk2] [PATCH 2/2] [edk2-platforms] Platform/ARM: Dynamic Tables support for FVP
Posted by evan.lloyd@arm.com 7 years, 2 months ago
From: Sami Mujawar <sami.mujawar@arm.com>

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.mujawar@arm.com>
Signed-off-by: Evan Lloyd <evan.lloyd@arm.com>
---
 Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManager.dsc.inc                        |  33 ++
 Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc                                              |  17 +-
 Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.fdf                                              |  17 +-
 Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerDxe.inf |  79 +++
 Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLib/PlatformASLTablesLib.inf       |  34 ++
 Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.h      |  62 +++
 Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/Platform.h                  |  90 +++
 Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.c      | 584 ++++++++++++++++++++
 Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLib/Dsdt.asl                       |  53 ++
 9 files changed, 967 insertions(+), 2 deletions(-)

diff --git a/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManager.dsc.inc b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManager.dsc.inc
new file mode 100644
index 0000000000000000000000000000000000000000..e536d7930f8f51efd1e1636154c92d58b5c1c01a
--- /dev/null
+++ b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManager.dsc.inc
@@ -0,0 +1,33 @@
+## @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/ConfigurationManagerDxe/ConfigurationManagerDxe.inf {
+    <LibraryClasses>
+    # Platform ASL Tables
+    PlatformAslTablesLib|Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLib/PlatformASLTablesLib.inf
+  <BuildOptions>
+   *_*_*_PLATFORM_FLAGS = -I$(BIN_DIR)/Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLib/PlatformASLTablesLib/OUTPUT
+  }
diff --git a/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc b/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc
index e9f954d926ac25a2abd2f97a4141267927dfc0a3..39b122c418c13180b464b6a54bce2fdd9ab8c57b 100644
--- a/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc
+++ b/Platform/ARM/VExpressPkg/ArmVExpress-FVP-AArch64.dsc
@@ -1,5 +1,5 @@
 #
-#  Copyright (c) 2011-2015, ARM Limited. All rights reserved.
+#  Copyright (c) 2011-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
@@ -38,6 +38,10 @@ [Defines]
   DT_SUPPORT                     = FALSE
 
 !include Platform/ARM/VExpressPkg/ArmVExpress.dsc.inc
+!ifdef DYNAMIC_TABLES_FRAMEWORK
+  !include MdeModulePkg/Universal/DynamicTables/DynamicTables.dsc.inc
+  !include Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManager.dsc.inc
+!endif
 
 [LibraryClasses.common]
   ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf
@@ -131,6 +135,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
@@ -262,8 +275,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 1084eda3d367e727fa9428cfe306a060e2cb57b9..4015d4ffdedd22dd1f8fd19a81b8aa72443fd6ad 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 - 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
@@ -97,9 +97,13 @@ [FV.FvMain]
 
   # ACPI Support
   #
+!ifndef DYNAMIC_TABLES_FRAMEWORK
   INF MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatformDxe.inf
+!endif
   INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
+!ifndef DYNAMIC_TABLES_FRAMEWORK
   INF RuleOverride=ACPITABLE Platform/ARM/VExpressPkg/AcpiTables/AcpiTables.inf
+!endif
 
   #
   # Multiple Console IO support
@@ -141,6 +145,15 @@ [FV.FvMain]
   # SMBIOS Support
   #
   INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+!ifdef DYNAMIC_TABLES_FRAMEWORK
+  # Configuration Manager
+  INF Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerDxe.inf
+
+  #
+  # Dynamic Table fdf
+  #
+  !include MdeModulePkg/Universal/DynamicTables/DynamicTables.fdf.inc
+!endif
 
   #
   # Platform Driver
@@ -319,8 +332,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/ConfigurationManagerDxe/ConfigurationManagerDxe.inf b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerDxe.inf
new file mode 100644
index 0000000000000000000000000000000000000000..fe020fba1ee0010f3b18657c5f7476cab52bd2f4
--- /dev/null
+++ b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManagerDxe.inf
@@ -0,0 +1,79 @@
+## @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]
+  INF_VERSION                    = 0x00010016
+  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
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  ArmPlatformPkg/ArmVExpressPkg/ArmVExpressPkg.dec
+
+[LibraryClasses]
+  UefiBootServicesTableLib
+  UefiDriverEntryPoint
+  ArmPlatformLib
+  PrintLib
+  PlatformAslTablesLib
+  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/PlatformASLTablesLib/PlatformASLTablesLib.inf b/Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLib/PlatformASLTablesLib.inf
new file mode 100644
index 0000000000000000000000000000000000000000..b12f6d4ffa299ae627307c7c8e8adb69d09fd884
--- /dev/null
+++ b/Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLib/PlatformASLTablesLib.inf
@@ -0,0 +1,34 @@
+## @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]
+  INF_VERSION                    = 0x00010005
+  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]
+  MdePkg/MdePkg.dec
+  ArmPlatformPkg/ArmVExpressPkg/ArmVExpressPkg.dec
+  ArmPlatformPkg/ArmPlatformPkg.dec
diff --git a/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.h b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.h
new file mode 100644
index 0000000000000000000000000000000000000000..a533af0fbe489ee539d01f1ead0144c262f8238a
--- /dev/null
+++ b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.h
@@ -0,0 +1,62 @@
+/** @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.
+
+  @par Glossary:
+    - Cm or CM   - Configuration Manager
+    - Obj or OBJ - Object
+**/
+
+#ifndef CONFIGURATION_MANAGER_H__
+#define CONFIGURATION_MANAGER_H__
+
+/** A helper macro for populating the GIC CPU information.
+*/
+#define GICC_ENTRY(                                                      \
+          CPUInterfaceNumber,                                            \
+          Mpidr,                                                         \
+          PmuIrq,                                                        \
+          VGicIrq                                                        \
+          ) {                                                            \
+    CPUInterfaceNumber,       /* UINT32  CPUInterfaceNumber           */ \
+    CPUInterfaceNumber,       /* UINT32  AcpiProcessorUid             */ \
+    EFI_ACPI_6_1_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                        */ \
+    0                         /* UINT8   ProcessorPowerEfficiencyClass*/ \
+    }
+
+/** A helper macro for returning configuration manager objects
+*/
+#define HANDLE_CM_OBJECT(CmObjectId, Object)   \
+  case CmObjectId: {                           \
+    CmObject->Size = sizeof (Object);          \
+    CmObject->Data = (UINTN*)&Object;          \
+    DEBUG ((                                   \
+      DEBUG_INFO,                              \
+      #CmObjectId ": Ptr = 0x%p, Size = %d\n", \
+      CmObject->Data,                          \
+      CmObject->Size                           \
+      ));                                      \
+    break;                                     \
+  }
+
+
+#endif // CONFIGURATION_MANAGER_H__
diff --git a/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/Platform.h b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/Platform.h
new file mode 100644
index 0000000000000000000000000000000000000000..5b5560f33c450b5b0aaa0be084595b46aef56cd5
--- /dev/null
+++ b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/Platform.h
@@ -0,0 +1,90 @@
+/** @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_1_GTDT_TIMER_FLAG_TIMER_INTERRUPT_MODE
+#define GTDT_TIMER_LEVEL_TRIGGERED  0
+#define GTDT_TIMER_ACTIVE_LOW       \
+          EFI_ACPI_6_1_GTDT_TIMER_FLAG_TIMER_INTERRUPT_POLARITY
+#define GTDT_TIMER_ACTIVE_HIGH      0
+#define GTDT_TIMER_SAVE_CONTEXT     \
+          EFI_ACPI_6_1_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_1_GTDT_GT_BLOCK_TIMER_FLAG_TIMER_INTERRUPT_MODE
+#define GTX_TIMER_LEVEL_TRIGGERED   0
+#define GTX_TIMER_ACTIVE_LOW        \
+          EFI_ACPI_6_1_GTDT_GT_BLOCK_TIMER_FLAG_TIMER_INTERRUPT_POLARITY
+#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_1_GTDT_GT_BLOCK_COMMON_FLAG_SECURE_TIMER
+#define GTX_TIMER_NON_SECURE        0
+#define GTX_TIMER_SAVE_CONTEXT      \
+          EFI_ACPI_6_1_GTDT_GT_BLOCK_COMMON_FLAG_ALWAYS_ON_CAPABILITY
+#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_1_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_TIMER_INTERRUPT_MODE
+#define SBSA_WATCHDOG_LEVEL_TRIGGERED  0
+#define SBSA_WATCHDOG_ACTIVE_LOW       \
+          EFI_ACPI_6_1_GTDT_SBSA_GENERIC_WATCHDOG_FLAG_TIMER_INTERRUPT_POLARITY
+#define SBSA_WATCHDOG_ACTIVE_HIGH      0
+#define SBSA_WATCHDOG_SECURE           \
+          EFI_ACPI_6_1_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/ConfigurationManagerDxe/ConfigurationManager.c b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.c
new file mode 100644
index 0000000000000000000000000000000000000000..768f64edc4fc61197b3a802d15a208f88425fb59
--- /dev/null
+++ b/Platform/ARM/VExpressPkg/ConfigurationManager/ConfigurationManagerDxe/ConfigurationManager.c
@@ -0,0 +1,584 @@
+/** @file
+  Configuration Manager Dxe
+
+  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.
+
+  @par Glossary:
+    - Cm or CM   - Configuration Manager
+    - Obj or OBJ - Object
+**/
+
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/ArmLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <IndustryStandard/Acpi.h>
+#include <IndustryStandard/Smbios.h>
+
+#include <DynamicTables/TableGenerator.h>
+#include <DynamicTables/AcpiTableGenerator.h>
+#include <DynamicTables/SmbiosTableGenerator.h>
+#include <DynamicTables/StandardNameSpaceObjects.h>
+#include <DynamicTables/ConfigurationManagerObject.h>
+#include <DynamicTables/StandardNameSpaceObjects.h>
+#include <DynamicTables/ArmNameSpaceObjects.h>
+#include <Protocol/ConfigurationManagerProtocol.h>
+#include "Platform.h"
+#include "ConfigurationManager.h"
+
+// AML Code Include files generated by iASL Compiler
+#include <Dsdt.hex>
+
+/** A macro to define the configuration manager version.
+*/
+#define CONFIGURATION_MANAGER_REVISION CREATE_REVISION (1, 0)
+
+/** A macro describing the OEM ID.
+*/
+#define CFG_MGR_OEM_ID    { 'A', 'R', 'M', 'L', 'T', 'D' }
+
+/** 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[6];
+
+  /// Boot architecture information
+  CM_ARM_BOOT_ARCH_INFO                  BootArchInfo;
+
+  /// Power management profile information
+  CM_ARM_POWER_MANAGEMENT_PROFILE_INFO   PmProfileInfo;
+
+  /// GIC CPU interface information
+  CM_ARM_GICC_INFO                       GicCInfo[8];
+
+  /// 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[1];
+
+  /// Generic timer frame information
+  CM_ARM_GTBLOCK_TIMER_FRAME_INFO        GTBlock0TimerInfo[2];
+
+  /// 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;
+
+/** The platform configuration repository information.
+*/
+EFI_PLATFORM_REPOSITORY_INFO ArmVExpressPlatformRepositoryInfo = {
+  /// Configuration Manager information
+  { CONFIGURATION_MANAGER_REVISION, CFG_MGR_OEM_ID },
+
+  // ACPI Table List
+  {
+    // FADT Table
+    {
+      EFI_ACPI_6_1_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,
+      CREATE_STD_ACPI_TABLE_GEN_ID (ESTD_ACPI_TABLE_ID_FADT),
+      NULL
+    },
+    // GTDT Table
+    {
+      EFI_ACPI_6_1_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,
+      CREATE_STD_ACPI_TABLE_GEN_ID (ESTD_ACPI_TABLE_ID_GTDT),
+      NULL
+    },
+    // MADT Table
+    {
+      EFI_ACPI_6_1_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,
+      CREATE_STD_ACPI_TABLE_GEN_ID (ESTD_ACPI_TABLE_ID_MADT),
+      NULL
+    },
+    // SPCR Table
+    {
+      EFI_ACPI_6_1_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE,
+      CREATE_STD_ACPI_TABLE_GEN_ID (ESTD_ACPI_TABLE_ID_SPCR),
+      NULL
+    },
+    // DSDT Table
+    {
+      EFI_ACPI_6_1_DIFFERENTIATED_SYSTEM_DESCRIPTION_TABLE_SIGNATURE,
+      CREATE_STD_ACPI_TABLE_GEN_ID (ESTD_ACPI_TABLE_ID_DSDT),
+      (EFI_ACPI_DESCRIPTION_HEADER*)DsdtAmlCode
+    },
+    // DBG2 Table
+    {
+      EFI_ACPI_6_1_DEBUG_PORT_2_TABLE_SIGNATURE,
+      CREATE_STD_ACPI_TABLE_GEN_ID (ESTD_ACPI_TABLE_ID_DBG2),
+      NULL
+    }
+  },
+
+  // Boot architecture information
+  { EFI_ACPI_6_1_ARM_PSCI_COMPLIANT },              // BootArchFlags
+
+  // Power management profile information
+  { EFI_ACPI_6_1_PM_PROFILE_ENTERPRISE_SERVER },    // PowerManagement Profile
+
+  // GIC CPU Interface information
+  {
+    GICC_ENTRY (0, GET_MPID (0, 0), 92, 25),
+    GICC_ENTRY (1, GET_MPID (0, 1), 93, 25),
+    GICC_ENTRY (2, GET_MPID (0, 2), 94, 25),
+    GICC_ENTRY (3, GET_MPID (0, 3), 95, 25),
+
+    GICC_ENTRY (4, GET_MPID (1, 0), 96, 25),
+    GICC_ENTRY (5, GET_MPID (1, 1), 97, 25),
+    GICC_ENTRY (6, GET_MPID (1, 2), 98, 25),
+    GICC_ENTRY (7, GET_MPID (1, 3), 99, 25)
+  },
+
+  // 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
+  {
+    FVP_SYSTEM_TIMER_BASE_ADDRESS,
+    FVP_CNT_READ_BASE_ADDRESS,
+    FixedPcdGet32 (PcdArmArchTimerSecIntrNum),
+    FVP_GTDT_GTIMER_FLAGS,
+    FixedPcdGet32 (PcdArmArchTimerIntrNum),
+    FVP_GTDT_GTIMER_FLAGS,
+    FixedPcdGet32 (PcdArmArchTimerVirtIntrNum),
+    FVP_GTDT_GTIMER_FLAGS,
+    FixedPcdGet32 (PcdArmArchTimerHypIntrNum),
+    FVP_GTDT_GTIMER_FLAGS
+  },
+
+  // Generic Timer Block Information
+  {
+    {
+      FVP_GT_BLOCK_CTL_BASE,
+      FVP_TIMER_FRAMES_COUNT,
+      (CM_ARM_GTBLOCK_TIMER_FRAME_INFO*)((UINT8*)&ArmVExpressPlatformRepositoryInfo +
+        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
+  {
+    FixedPcdGet64 (PcdGenericWatchdogControlBase),
+    FixedPcdGet64 (PcdGenericWatchdogRefreshBase),
+    FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
+    FVP_SBSA_WATCHDOG_FLAGS
+  },
+
+  // SPCR Serial Port
+  {
+    FixedPcdGet64 (PcdSerialRegisterBase),  // UINT64  BaseAddress
+    FixedPcdGet32 (PL011UartInterrupt),     // UINT32  Interrupt
+    FixedPcdGet64 (PcdUartDefaultBaudRate), // UINT64  BaudRate
+    FixedPcdGet32 (PL011UartClkInHz)        // UINT32  Clock
+  },
+  // Debug Serial Port
+  {
+    FixedPcdGet64 (PcdSerialDbgRegisterBase), // UINT64  BaseAddress
+    38,                                       // UINT32  Interrupt
+    FixedPcdGet64 (PcdSerialDbgUartBaudRate), // UINT64  BaudRate
+    FixedPcdGet32 (PcdSerialDbgUartClkInHz)   // UINT32  Clock
+  },
+
+  // GIC ITS
+  {
+    // The GIC ITS ID.
+    0,
+
+    // The physical address for the
+    // Interrupt Translation Service
+    0x2f020000
+  }
+};
+
+/** Initialize the platform configuration repository.
+
+    @param [in]  This        Poiner 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 standard namespace object.
+
+    @param [in]  This        Poiner to the Configuration Manager Protocol.
+    @param [in]  CmObjectId  The Configuration Manager Object ID.
+    @param [out] CmObject    Pointer to the Configuration Manager Object
+                             descrptor describing the requested Object.
+
+    @retval Returns:
+      EFI_SUCCESS           Success.
+      EFI_INVALID_PARAMETER A parameter is invalid.
+      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  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        Poiner to the Configuration Manager Protocol.
+    @param [in]  CmObjectId  The Configuration Manager Object ID.
+    @param [out] CmObject    Pointer to the Configuration Manager Object
+                             descrptor describing the requested Object.
+
+    @retval Returns:
+      EFI_SUCCESS           Success.
+      EFI_INVALID_PARAMETER A parameter is invalid.
+      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  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);
+    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 (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_WARN,
+        "WARNING: Object 0x%x. Status = %r\n",
+        CmObjectId,
+        Status
+        ));
+      break;
+    }
+  }//switch
+
+  return Status;
+}
+
+/** Return an OEM namespace object.
+
+    @param [in]  This        Poiner to the Configuration Manager Protocol.
+    @param [in]  CmObjectId  The Configuration Manager Object ID.
+    @param [out] CmObject    Pointer to the Configuration Manager Object
+                             descrptor describing the requested Object.
+
+    @retval Returns:
+      EFI_SUCCESS           Success.
+      EFI_INVALID_PARAMETER A parameter is invalid.
+      EFI_NOT_FOUND         The required object information is not found.
+      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  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        Poiner to the Configuration Manager Protocol.
+    @param [in]  CmObjectId  The Configuration Manager Object ID.
+    @param [out] CmObject    Pointer to the Configuration Manager Object
+                             descrptor describing the requested Object.
+
+    @retval Returns:
+      EFI_SUCCESS           Success.
+      EFI_INVALID_PARAMETER A parameter is invalid.
+      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  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, CmObject);
+      break;
+    case EObjNameSpaceArm:
+      Status = GetArmNameSpaceObject (This, CmObjectId, CmObject);
+      break;
+    case EObjNameSpaceOem:
+      Status = GetOemNameSpaceObject (This, CmObjectId, 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        Poiner to the Configuration Manager Protocol.
+    @param [in]  CmObjectId  The Configuration Manager Object ID.
+    @param [out] CmObject    Pointer to the Configuration Manager Object
+                             descrptor describing the Object.
+
+    @retval Returns:
+      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        CM_OBJ_DESCRIPTOR                   * CONST CmObject
+  )
+{
+  return EFI_UNSUPPORTED;
+}
+
+/** A structure describing the configuration manager protocol interface.
+*/
+STATIC
+CONST
+EFI_CONFIGURATION_MANAGER_PROTOCOL ArmVExpressPlatformConfigurationManagerProtocol = {
+  CREATE_REVISION(1,0),
+  ArmVExpressPlatformGetObject,
+  ArmVExpressPlatformSetObject,
+  &ArmVExpressPlatformRepositoryInfo
+};
+
+/**
+  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*)&ArmVExpressPlatformConfigurationManagerProtocol
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((
+      DEBUG_ERROR,
+      "ERROR: Failed to get Install Configuration Manager Protocol." \
+      " Status = %r\n",
+      Status
+      ));
+    goto error_handler;
+  }
+
+  Status = InitializePlatformRepository (
+    &ArmVExpressPlatformConfigurationManagerProtocol
+    );
+  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/PlatformASLTablesLib/Dsdt.asl b/Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLib/Dsdt.asl
new file mode 100644
index 0000000000000000000000000000000000000000..3411f10bb8d47b234a546de1a6ca3ed0b858fa07
--- /dev/null
+++ b/Platform/ARM/VExpressPkg/ConfigurationManager/PlatformASLTablesLib/Dsdt.asl
@@ -0,0 +1,53 @@
+/** @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)
+  }
+  } // Scope(_SB)
+}
-- 
Guid("CE165669-3EF3-493F-B85D-6190EE5B9759")

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