From: Evan Lloyd <Evan.Lloyd@arm.com>
To: Sami Mujawar <Sami.Mujawar@arm.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: Arvind Chauhan <Arvind.Chauhan@arm.com>,
Daniil Egranov <Daniil.Egranov@arm.com>,
Thomas Abraham <thomas.abraham@arm.com>,
"leif.lindholm@linaro.org" <leif.lindholm@linaro.org>,
Matteo Carlini <Matteo.Carlini@arm.com>,
Stephanie Hughes-Fitt <Stephanie.Hughes-Fitt@arm.com>,
nd <nd@arm.com>
Subject: Re: [PATCH 2/2][platforms/dynamictables] Platform/ARM: Dynamic Tables support for FVP
Date: Mon, 19 Mar 2018 16:13:54 +0000 [thread overview]
Message-ID: <HE1PR0801MB17714B956FCF12C7F0797F008BD40@HE1PR0801MB1771.eurprd08.prod.outlook.com> (raw)
In-Reply-To: <20180319152153.98292-3-sami.mujawar@arm.com>
> -----Original Message-----
> From: Sami Mujawar [mailto:sami.mujawar@arm.com]
> Sent: 19 March 2018 15:22
> To: edk2-devel@lists.01.org
> Cc: Arvind Chauhan <Arvind.Chauhan@arm.com>; Daniil Egranov
> <Daniil.Egranov@arm.com>; Thomas Abraham
> <thomas.abraham@arm.com>; Evan Lloyd <Evan.Lloyd@arm.com>;
> leif.lindholm@linaro.org; Matteo Carlini <Matteo.Carlini@arm.com>;
> Stephanie Hughes-Fitt <Stephanie.Hughes-Fitt@arm.com>; nd
> <nd@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.mujawar@arm.com>
Reviewed-by: Evan Lloyd <evan.lloyd@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)'
>
next prev parent reply other threads:[~2018-03-19 16:07 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-19 15:21 [PATCH 0/2] [platforms/dynamictables] Platform support for Dynamic Tables Framework Sami Mujawar
2018-03-19 15:21 ` [PATCH 1/2][platforms/dynamictables] Platform/ARM: Dynamic Tables support for Juno Sami Mujawar
2018-03-19 16:13 ` Evan Lloyd
2018-03-19 15:21 ` [PATCH 2/2][platforms/dynamictables] Platform/ARM: Dynamic Tables support for FVP Sami Mujawar
2018-03-19 16:13 ` Evan Lloyd [this message]
2018-03-21 3:49 ` [PATCH 0/2] [platforms/dynamictables] Platform support for Dynamic Tables Framework Leif Lindholm
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=HE1PR0801MB17714B956FCF12C7F0797F008BD40@HE1PR0801MB1771.eurprd08.prod.outlook.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox