From: "Leif Lindholm" <leif@nuviainc.com>
To: Vikas Singh <vikas.singh@puresoftware.com>
Cc: devel@edk2.groups.io, sami.mujawar@arm.com,
meenakshi.aggarwal@nxp.com, paul.yang@arm.com,
augustine.philips@arm.com, samer.el-haj-mahmoud@arm.com,
v.sethi@nxp.com, arokia.samy@puresoftware.com,
kuldip.dwivedi@puresoftware.com, ard.biesheuvel@arm.com,
vikas.singh@nxp.com
Subject: Re: [PATCH v2 1/2] Platform/NXP: Add Dynamic Acpi for layerscape platforms
Date: Mon, 15 Feb 2021 13:55:04 +0000 [thread overview]
Message-ID: <20210215135504.GD1664@vanye> (raw)
In-Reply-To: <1611729899-23741-2-git-send-email-vikas.singh@puresoftware.com>
On Wed, Jan 27, 2021 at 12:14:58 +0530, Vikas Singh wrote:
> These changes intend to add Common Configuration Manager (CM)
> for all fsl platforms and Platform headers consumed by CM for
> LX2160ARDB.
>
> Signed-off-by: Vikas Singh <vikas.singh@puresoftware.com>
> ---
> .../ConfigurationManagerDxe/ConfigurationManager.c | 834 +++++++++++++++++++++
> .../ConfigurationManagerDxe/ConfigurationManager.h | 151 ++++
> .../ConfigurationManagerDxe.inf | 51 ++
> Platform/NXP/Env.sh | 67 ++
> Platform/NXP/LX2160aRdbPkg/Include/Platform.h | 240 ++++++
> Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.dec | 1 +
> Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.dsc | 28 +
> Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.fdf | 12 +
> Platform/NXP/Readme.md | 35 +-
> Platform/NXP/build.sh | 115 +++
> Silicon/NXP/LX2160A/LX2160A.dsc.inc | 9 +
> 11 files changed, 1542 insertions(+), 1 deletion(-)
> create mode 100644 Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManager.c
> create mode 100644 Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManager.h
> create mode 100644 Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManagerDxe.inf
> create mode 100755 Platform/NXP/Env.sh
> create mode 100644 Platform/NXP/LX2160aRdbPkg/Include/Platform.h
> create mode 100755 Platform/NXP/build.sh
>
> diff --git a/Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManager.c b/Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManager.c
> new file mode 100644
> index 0000000..bec9131
> --- /dev/null
> +++ b/Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManager.c
> @@ -0,0 +1,834 @@
> +/** @file
> + Configuration Manager Dxe
> +
> + Copyright 2020 NXP
> + Copyright 2020 Puresoftware Ltd
> +
> + SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> + @par Glossary:
> + - Cm or CM - Configuration Manager
> + - Obj or OBJ - Object
> +**/
> +
> +#include <IndustryStandard/MemoryMappedConfigurationSpaceAccessTable.h>
> +#include <IndustryStandard/SerialPortConsoleRedirectionTable.h>
> +#include <Library/ArmLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Protocol/AcpiTable.h>
> +#include <Protocol/ConfigurationManagerProtocol.h>
> +
> +/** The platform specific headers
> +*/
> +#include "ConfigurationManager.h"
> +#include <Library/SocLib.h>
> +
> +/** The platform configuration repository information.
> +*/
> +STATIC
> +FSL_PLATFORM_REPOSITORY_INFO FslPlatformRepositoryInfo = {
> + /// Configuration Manager information
> + { CONFIGURATION_MANAGER_REVISION, CFG_MGR_OEM_ID },
> +
> + // ACPI Table List
> + {
> + // FADT Table
> + {
> + EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,
> + EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_REVISION,
> + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdFadt),
> + NULL,
> + CFG_MGR_TABLE_ID
> + },
> +
> + // GTDT Table
> + {
> + EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,
> + EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION,
> + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdGtdt),
> + NULL,
> + CFG_MGR_TABLE_ID
> + },
> +
> + // MADT Table
> + {
> + EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,
> + EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION,
> + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdMadt),
> + NULL,
> + CFG_MGR_TABLE_ID
> + },
> +
> + // PCI MCFG Table
> + {
> + EFI_ACPI_6_2_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE,
> + EFI_ACPI_MEMORY_MAPPED_CONFIGURATION_SPACE_ACCESS_TABLE_REVISION,
> + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdMcfg),
> + NULL,
> + CFG_MGR_TABLE_ID
> + },
> +
> + // SPCR Table
> + {
> + EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE,
> + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_REVISION,
> + CREATE_STD_ACPI_TABLE_GEN_ID (EStdAcpiTableIdSpcr),
> + NULL,
> + CFG_MGR_TABLE_ID
> + }
> +
> + },
> +
> + // Boot architecture information
> + { EFI_ACPI_6_2_ARM_PSCI_COMPLIANT }, // BootArchFlags
> +
> + // Power management profile information
> + { EFI_ACPI_6_2_PM_PROFILE_ENTERPRISE_SERVER }, // PowerManagement Profile
> +
> + // Generic Timer Info
> + {
> + // The physical base address for the counter control frame
> + TIMER_BASE_ADDRESS,
> + // The physical base address for the counter read frame
> + TIMER_READ_BASE_ADDRESS,
> + // The secure PL1 timer interrupt
> + TIMER_SEC_IT,
> + // The secure PL1 timer flags
> + GTDT_GTIMER_FLAGS,
> + // The non-secure PL1 timer interrupt
> + TIMER_NON_SEC_IT,
> + // The non-secure PL1 timer flags
> + GTDT_GTIMER_FLAGS,
> + // The virtual timer interrupt
> + TIMER_VIRT_IT,
> + // The virtual timer flags
> + GTDT_GTIMER_FLAGS,
> + // The non-secure PL2 timer interrupt
> + TIMER_HYP_IT,
> + // The non-secure PL2 timer flags
> + GTDT_GTIMER_FLAGS
> + },
> +
> + // Generic Timer Block Information
> + PLAT_TIMER_BLOCK_INFO,
> +
> + // GTDT Frames
> + PLAT_TIMER_FRAME_INFO,
> +
> + // Watchdog info
> + PLAT_WATCHDOG_INFO,
> +
> + // GIC CPU Interface information
> + PLAT_GIC_CPU_INTERFACE,
> +
> + // GIC Distributor Info
> + PLAT_GIC_DISTRIBUTOR_INFO,
> +
> + // GIC Redistributor
> + PLAT_GIC_REDISTRIBUTOR_INFO,
> +
> + // GIC ITS
> + PLAT_GIC_ITS_INFO,
> +
> + // MCFG Info
> + PLAT_MCFG_INFO,
> +
> + // SPCR Info
> + PLAT_SPCR_INFO,
> +
> + 2.0 // fsl board revision
> +};
> +
> +/** 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 EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This
> + )
> +{
> + FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo;
> + UINT32 Svr;
> +
> + PlatformRepo = This->PlatRepoInfo;
> +
> + Svr = SocGetSvr ();
> + if (SVR_SOC_VER(Svr) == SVR_LX2160A) {
> + PlatformRepo->FslBoardRevision = SVR_MAJOR(Svr);
> + DEBUG ((DEBUG_INFO, "Fsl : SoC LX2160A Rev = 0x%x\n", PlatformRepo->FslBoardRevision));
> + } else {
> + DEBUG ((DEBUG_INFO, "Fsl : SoC Unknown Rev = 0x%x\n", PlatformRepo->FslBoardRevision));
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +/** Return PCI Configuration Info.
> + @param [in] This Pointer to the Configuration Manager Protocol.
> + @param [in] CmObjectId The Object ID of the CM object requested
> + @param [in] Token A unique token for identifying the requested
> + CM_ARM_PCI_INFO object.
> + @param [in, out] CmObject Pointer to the Configuration Manager Object
> + descriptor describing the requested Object.
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_NOT_FOUND The required object information is
> + not found.
> + **/
> +EFI_STATUS
> +EFIAPI
> +GetPciConfigInfo (
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
> + IN CONST CM_OBJECT_ID CmObjectId,
> + IN CONST CM_OBJECT_TOKEN Token,
> + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
> + )
> +{
> + FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo;
> + UINT32 TotalObjCount;
> + UINT32 ObjIndex;
> +
> + if ((This == NULL) || (CmObject == NULL)) {
> + ASSERT (This != NULL);
> + ASSERT (CmObject != NULL);
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + PlatformRepo = This->PlatRepoInfo;
> +
> + TotalObjCount = ARRAY_SIZE (PlatformRepo->PciConfigInfo);
> +
> + for (ObjIndex = 0; ObjIndex < TotalObjCount; ObjIndex++) {
> + if (Token == (CM_OBJECT_TOKEN)&PlatformRepo->PciConfigInfo[ObjIndex])
> + {
> + CmObject->ObjectId = CmObjectId;
> + CmObject->Size = sizeof (PlatformRepo->PciConfigInfo[ObjIndex]);
> + CmObject->Data = (VOID*)&PlatformRepo->PciConfigInfo[ObjIndex];
> + CmObject->Count = 1;
> + return EFI_SUCCESS;
> + }
> + }
> +
> + return EFI_NOT_FOUND;
> +}
> +
> +/** Return GIC CPU Interface Info.
> + @param [in] This Pointer to the Configuration Manager Protocol.
> + @param [in] CmObjectId The Object ID of the CM object requested
> + @param [in] Token A unique token for identifying the requested
> + CM_ARM_GICC_INFO object.
> + @param [in, out] CmObject Pointer to the Configuration Manager Object
> + descriptor describing the requested Object.
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_NOT_FOUND The required object information is
> + not found.
> + **/
> +EFI_STATUS
> +EFIAPI
> +GetGicCInfo (
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
> + IN CONST CM_OBJECT_ID CmObjectId,
> + IN CONST CM_OBJECT_TOKEN Token,
> + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
> + )
> +{
> + FSL_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->GicCInfo) {
> + return EFI_NOT_FOUND;
> + }
> +
> + CmObject->ObjectId = CmObjectId;
> + CmObject->Size = sizeof (PlatformRepo->GicCInfo);
> + CmObject->Data = (VOID*)&PlatformRepo->GicCInfo;
> + CmObject->Count = ARRAY_SIZE (PlatformRepo->GicCInfo);
> +
> + return EFI_SUCCESS;
> +}
> +
> +/** Return a GT Block timer frame info list.
> + @param [in] This Pointer to the Configuration Manager Protocol.
> + @param [in] CmObjectId The Configuration Manager Object ID.
> + @param [in] Token A token for identifying the object
> + @param [in, out] CmObject Pointer to the Configuration Manager Object
> + descriptor describing the requested Object.
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_NOT_FOUND The required object information is not found.
> + **/
> +EFI_STATUS
> +EFIAPI
> +GetGTBlockTimerFrameInfo (
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
> + IN CONST CM_OBJECT_ID CmObjectId,
> + IN CONST CM_OBJECT_TOKEN Token,
> + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
> + )
> +{
> + FSL_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->ObjectId = CmObjectId;
> + CmObject->Size = sizeof (PlatformRepo->GTBlock0TimerInfo);
> + CmObject->Data = (VOID*)&PlatformRepo->GTBlock0TimerInfo;
> + CmObject->Count = ARRAY_SIZE (PlatformRepo->GTBlock0TimerInfo);
> +
> + return EFI_SUCCESS;
> +}
> +
> +/** A helper function for returning the Configuration Manager Objects.
> +
> + @param [in] CmObjectId The Configuration Manager Object ID.
> + @param [in] Object Pointer to the Object(s).
> + @param [in] ObjectSize Total size of the Object(s).
> + @param [in] ObjectCount Number of Objects.
> + @param [in, out] CmObjectDesc Pointer to the Configuration Manager Object
> + descriptor describing the requested Object.
> +
> + @retval EFI_SUCCESS Success.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +HandleCmObject (
> + IN CONST CM_OBJECT_ID CmObjectId,
> + IN VOID * Object,
> + IN CONST UINTN ObjectSize,
> + IN CONST UINTN ObjectCount,
> + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObjectDesc
> + )
> +{
> + CmObjectDesc->ObjectId = CmObjectId;
> + CmObjectDesc->Size = ObjectSize;
> + CmObjectDesc->Data = (VOID*)Object;
> + CmObjectDesc->Count = ObjectCount;
> + DEBUG ((
> + DEBUG_INFO,
> + "INFO: CmObjectId = %x, Ptr = 0x%p, Size = %d, Count = %d\n",
> + CmObjectId,
> + CmObjectDesc->Data,
> + CmObjectDesc->Size,
> + CmObjectDesc->Count
> + ));
> + return EFI_SUCCESS;
> +}
> +
> +/** A helper function for returning the Configuration Manager Objects that
> + match the token.
> +
> + @param [in] This Pointer to the Configuration Manager Protocol.
> + @param [in] CmObjectId The Configuration Manager Object ID.
> + @param [in] Object Pointer to the Object(s).
> + @param [in] ObjectSize Total size of the Object(s).
> + @param [in] ObjectCount Number of Objects.
> + @param [in] Token A token identifying the object.
> + @param [in] HandlerProc A handler function to search the object
> + referenced by the token.
> + @param [in, out] CmObjectDesc Pointer to the Configuration Manager Object
> + descriptor describing the requested Object.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_NOT_FOUND The required object information is not found.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +HandleCmObjectRefByToken (
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
> + IN CONST CM_OBJECT_ID CmObjectId,
> + IN VOID * Object,
> + IN CONST UINTN ObjectSize,
> + IN CONST UINTN ObjectCount,
> + IN CONST CM_OBJECT_TOKEN Token,
> + IN CONST CM_OBJECT_HANDLER_PROC HandlerProc,
> + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObjectDesc
> + )
> +{
> + EFI_STATUS Status;
> + CmObjectDesc->ObjectId = CmObjectId;
> + if (Token == CM_NULL_TOKEN) {
> + CmObjectDesc->Size = ObjectSize;
> + CmObjectDesc->Data = (VOID*)Object;
> + CmObjectDesc->Count = ObjectCount;
> + Status = EFI_SUCCESS;
> + } else {
> + Status = HandlerProc (This, CmObjectId, Token, CmObjectDesc);
> + }
> +
> + DEBUG ((
> + DEBUG_INFO,
> + "INFO: Token = 0x%p, CmObjectId = %x, Ptr = 0x%p, Size = %d, Count = %d\n",
> + (VOID*)Token,
> + CmObjectId,
> + CmObjectDesc->Data,
> + CmObjectDesc->Size,
> + CmObjectDesc->Count
> + ));
> + return Status;
> +}
> +
> +/** Return a standard namespace object.
> +
> + @param [in] This Pointer to the Configuration Manager Protocol.
> + @param [in] CmObjectId The Configuration Manager Object ID.
> + @param [in] Token An optional token identifying the object. If
> + unused this must be CM_NULL_TOKEN.
> + @param [in, out] CmObject Pointer to the Configuration Manager Object
> + descriptor describing the requested Object.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_NOT_FOUND The required object information is not found.
> +**/
> +EFI_STATUS
> +EFIAPI
> +GetStandardNameSpaceObject (
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
> + IN CONST CM_OBJECT_ID CmObjectId,
> + IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
> + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
> + )
> +{
> + EFI_STATUS Status;
> + FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo;
> +
> + Status = EFI_SUCCESS;
> + if ((This == NULL) || (CmObject == NULL)) {
> + ASSERT (This != NULL);
> + ASSERT (CmObject != NULL);
> + return EFI_INVALID_PARAMETER;
> + }
> + PlatformRepo = This->PlatRepoInfo;
> +
> + switch (GET_CM_OBJECT_ID (CmObjectId)) {
> + case EStdObjCfgMgrInfo:
> + Status = HandleCmObject (
> + CmObjectId,
> + &PlatformRepo->CmInfo,
> + sizeof (PlatformRepo->CmInfo),
> + 1,
> + CmObject
> + );
> + break;
> + case EStdObjAcpiTableList:
> + Status = HandleCmObject (
> + CmObjectId,
> + &PlatformRepo->CmAcpiTableList,
> + sizeof (PlatformRepo->CmAcpiTableList),
> + ARRAY_SIZE (PlatformRepo->CmAcpiTableList),
> + CmObject
> + );
> + break;
> + 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 [in, out] CmObject Pointer to the Configuration Manager Object
> + descriptor describing the requested Object.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_NOT_FOUND The required object information is not found.
> +**/
> +EFI_STATUS
> +EFIAPI
> +GetArmNameSpaceObject (
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
> + IN CONST CM_OBJECT_ID CmObjectId,
> + IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
> + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
> + )
> +{
> + EFI_STATUS Status;
> + FSL_PLATFORM_REPOSITORY_INFO * PlatformRepo;
> +
> + Status = EFI_SUCCESS;
> + if ((This == NULL) || (CmObject == NULL)) {
> + ASSERT (This != NULL);
> + ASSERT (CmObject != NULL);
> + return EFI_INVALID_PARAMETER;
> + }
> + PlatformRepo = This->PlatRepoInfo;
> +
> + switch (GET_CM_OBJECT_ID (CmObjectId)) {
> + case EArmObjBootArchInfo:
> + Status = HandleCmObject (
> + CmObjectId,
> + &PlatformRepo->BootArchInfo,
> + sizeof (PlatformRepo->BootArchInfo),
> + 1,
> + CmObject
> + );
> + break;
> +
> + case EArmObjPowerManagementProfileInfo:
> + Status = HandleCmObject (
> + CmObjectId,
> + &PlatformRepo->PmProfileInfo,
> + sizeof (PlatformRepo->PmProfileInfo),
> + 1,
> + CmObject
> + );
> + break;
> +
> + case EArmObjGenericTimerInfo:
> + Status = HandleCmObject (
> + CmObjectId,
> + &PlatformRepo->GenericTimerInfo,
> + sizeof (PlatformRepo->GenericTimerInfo),
> + 1,
> + CmObject
> + );
> + break;
> +
> + case EArmObjPlatformGenericWatchdogInfo:
> + Status = HandleCmObject (
> + CmObjectId,
> + &PlatformRepo->Watchdog,
> + sizeof (PlatformRepo->Watchdog),
> + PLAT_WATCHDOG_COUNT,
> + CmObject
> + );
> + break;
> +
> + case EArmObjPlatformGTBlockInfo:
> + Status = HandleCmObject (
> + CmObjectId,
> + &PlatformRepo->GTBlockInfo,
> + sizeof (PlatformRepo->GTBlockInfo),
> + ARRAY_SIZE (PlatformRepo->GTBlockInfo),
> + CmObject
> + );
> + break;
> +
> + case EArmObjGTBlockTimerFrameInfo:
> + Status = HandleCmObjectRefByToken (
> + This,
> + CmObjectId,
> + PlatformRepo->GTBlock0TimerInfo,
> + sizeof (PlatformRepo->GTBlock0TimerInfo),
> + ARRAY_SIZE (PlatformRepo->GTBlock0TimerInfo),
> + Token,
> + GetGTBlockTimerFrameInfo,
> + CmObject
> + );
> + break;
> +
> + case EArmObjGicCInfo:
> + Status = HandleCmObjectRefByToken (
> + This,
> + CmObjectId,
> + PlatformRepo->GicCInfo,
> + sizeof (PlatformRepo->GicCInfo),
> + ARRAY_SIZE (PlatformRepo->GicCInfo),
> + Token,
> + GetGicCInfo,
> + CmObject
> + );
> + break;
> +
> + case EArmObjGicDInfo:
> + Status = HandleCmObject (
> + CmObjectId,
> + &PlatformRepo->GicDInfo,
> + sizeof (PlatformRepo->GicDInfo),
> + 1,
> + CmObject
> + );
> + break;
> +
> + case EArmObjGicRedistributorInfo:
> + Status = HandleCmObject (
> + CmObjectId,
> + &PlatformRepo->GicRedistInfo,
> + sizeof (PlatformRepo->GicRedistInfo),
> + PLAT_GIC_REDISTRIBUTOR_COUNT,
> + CmObject
> + );
> + break;
> +
> + case EArmObjGicItsInfo:
> + Status = HandleCmObject (
> + CmObjectId,
> + &PlatformRepo->GicItsInfo,
> + sizeof (PlatformRepo->GicItsInfo),
> + PLAT_GIC_ITS_COUNT,
> + CmObject
> + );
> + break;
> +
> + case EArmObjSerialConsolePortInfo:
> + Status = HandleCmObject (
> + CmObjectId,
> + &PlatformRepo->SpcrSerialPort,
> + sizeof (PlatformRepo->SpcrSerialPort),
> + 1,
> + CmObject
> + );
> + break;
> +
> + case EArmObjPciConfigSpaceInfo:
> + Status = HandleCmObjectRefByToken (
> + This,
> + CmObjectId,
> + PlatformRepo->PciConfigInfo,
> + sizeof (PlatformRepo->PciConfigInfo),
> + ARRAY_SIZE (PlatformRepo->PciConfigInfo),
> + Token,
> + GetPciConfigInfo,
> + CmObject
> + );
> + break;
> +
> + default: {
> + Status = EFI_NOT_FOUND;
> + DEBUG ((
> + DEBUG_INFO,
> + "INFO: Object 0x%x. Status = %r\n",
> + CmObjectId,
> + Status
> + ));
> + break;
> + }
> + }//switch
> +
> + return Status;
> +}
> +
> +/** Return an OEM namespace object.
> +
> + @param [in] This Pointer to the Configuration Manager Protocol.
> + @param [in] CmObjectId The Configuration Manager Object ID.
> + @param [in] Token An optional token identifying the object. If
> + unused this must be CM_NULL_TOKEN.
> + @param [in, out] CmObject Pointer to the Configuration Manager Object
> + descriptor describing the requested Object.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_NOT_FOUND The required object information is not found.
> +**/
> +EFI_STATUS
> +EFIAPI
> +GetOemNameSpaceObject (
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
> + IN CONST CM_OBJECT_ID CmObjectId,
> + IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
> + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
> + )
> +{
> + EFI_STATUS Status;
> +
> + Status = EFI_SUCCESS;
> + if ((This == NULL) || (CmObject == NULL)) {
> + ASSERT (This != NULL);
> + ASSERT (CmObject != NULL);
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + switch (GET_CM_OBJECT_ID (CmObjectId)) {
> + default: {
> + Status = EFI_NOT_FOUND;
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Object 0x%x. Status = %r\n",
> + CmObjectId,
> + Status
> + ));
> + break;
> + }
> + }
> +
> + return Status;
> +}
> +
> +/** The GetObject function defines the interface implemented by the
> + Configuration Manager Protocol for returning the Configuration
> + Manager Objects.
> +
> + @param [in] This Pointer to the Configuration Manager Protocol.
> + @param [in] CmObjectId The Configuration Manager Object ID.
> + @param [in] Token An optional token identifying the object. If
> + unused this must be CM_NULL_TOKEN.
> + @param [in, out] CmObject Pointer to the Configuration Manager Object
> + descriptor describing the requested Object.
> +
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_NOT_FOUND The required object information is not found.
> +**/
> +EFI_STATUS
> +EFIAPI
> +FslPlatformGetObject (
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
> + IN CONST CM_OBJECT_ID CmObjectId,
> + IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
> + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
> + )
> +{
> + EFI_STATUS Status;
> +
> + if ((This == NULL) || (CmObject == NULL)) {
> + ASSERT (This != NULL);
> + ASSERT (CmObject != NULL);
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + switch (GET_CM_NAMESPACE_ID (CmObjectId)) {
> + case EObjNameSpaceStandard:
> + Status = GetStandardNameSpaceObject (This, CmObjectId, Token, CmObject);
> + break;
> + case EObjNameSpaceArm:
> + Status = GetArmNameSpaceObject (This, CmObjectId, Token, CmObject);
> + break;
> + case EObjNameSpaceOem:
> + Status = GetOemNameSpaceObject (This, CmObjectId, Token, CmObject);
> + break;
> + default: {
> + Status = EFI_INVALID_PARAMETER;
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Unknown Namespace Object = 0x%x. Status = %r\n",
> + CmObjectId,
> + Status
> + ));
> + break;
> + }
> + }
> +
> + return Status;
> +}
> +
> +/** The SetObject function defines the interface implemented by the
> + Configuration Manager Protocol for updating the Configuration
> + Manager Objects.
> +
> + @param [in] This Pointer to the Configuration Manager Protocol.
> + @param [in] CmObjectId The Configuration Manager Object ID.
> + @param [in] Token An optional token identifying the object. If
> + unused this must be CM_NULL_TOKEN.
> + @param [in] CmObject Pointer to the Configuration Manager Object
> + descriptor describing the Object.
> +
> + @retval EFI_UNSUPPORTED This operation is not supported.
> +**/
> +EFI_STATUS
> +EFIAPI
> +FslPlatformSetObject (
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
> + IN CONST CM_OBJECT_ID CmObjectId,
> + IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
> + IN CM_OBJ_DESCRIPTOR * CONST CmObject
> + )
> +{
> + return EFI_UNSUPPORTED;
> +}
> +
> +/** A structure describing the configuration manager protocol interface.
> +*/
> +STATIC
> +CONST
> +EDKII_CONFIGURATION_MANAGER_PROTOCOL FslConfigManagerProtocol = {
> + CREATE_REVISION (1, 0),
> + FslPlatformGetObject,
> + FslPlatformSetObject,
> + &FslPlatformRepositoryInfo
> +};
> +
> +/**
> + 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,
> + &gEdkiiConfigurationManagerProtocolGuid,
> + EFI_NATIVE_INTERFACE,
> + (VOID*)&FslConfigManagerProtocol
> + );
> + if (EFI_ERROR (Status)) {
> + DEBUG ((
> + DEBUG_ERROR,
> + "ERROR: Failed to get Install Configuration Manager Protocol." \
> + " Status = %r\n",
> + Status
> + ));
> + goto error_handler;
> + }
> +
> + Status = InitializePlatformRepository (
> + &FslConfigManagerProtocol
> + );
> + 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/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManager.h b/Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManager.h
> new file mode 100644
> index 0000000..ab320e5
> --- /dev/null
> +++ b/Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManager.h
> @@ -0,0 +1,151 @@
> +/** @file
> + Configuration Manager headers
> +
> + Copyright 2020 NXP
> + Copyright 2020 Puresoftware Ltd
> +
> + SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> + @par Glossary:
> + - Cm or CM - Configuration Manager
> + - Obj or OBJ - Object
> +**/
> +
> +#ifndef CONFIGURATION_MANAGER_H
> +#define CONFIGURATION_MANAGER_H
> +
> +#include <Platform.h>
> +
> +/** The configuration manager version
> +*/
> +#define CONFIGURATION_MANAGER_REVISION CREATE_REVISION (0, 0)
> +
> +/** The OEM ID
> +*/
> +#define CFG_MGR_OEM_ID { 'N', 'X', 'P', ' ', ' ', ' ' }
> +
> +/** 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 */ \
> + GICC_BASE, /* UINT64 PhysicalBaseAddress */ \
> + GICV_BASE, /* UINT64 GICV */ \
> + GICH_BASE, /* UINT64 GICH */ \
> + VGicIrq, /* UINT32 VGICMaintenanceInterrupt */ \
> + 0, /* UINT64 GICRBaseAddress */ \
> + Mpidr, /* UINT64 MPIDR */ \
> + EnergyEfficiency /* UINT8 ProcessorPowerEfficiency */ \
> +}
> +
> +/**
> + @retval EFI_SUCCESS Success.
> + @retval EFI_INVALID_PARAMETER A parameter is invalid.
> + @retval EFI_NOT_FOUND The required object information is not found.
> +**/
> +typedef EFI_STATUS (*CM_OBJECT_HANDLER_PROC) (
> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST This,
> + IN CONST CM_OBJECT_ID CmObjectId,
> + IN CONST CM_OBJECT_TOKEN Token,
> + IN OUT CM_OBJ_DESCRIPTOR * CONST CmObject
> + );
> +
> +/** The number of ACPI tables to install
> +*/
> +#define PLAT_ACPI_TABLE_COUNT 5
> +
> +/** 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;
> +
> + /// Power management profile information
> + CM_ARM_POWER_MANAGEMENT_PROFILE_INFO PmProfileInfo;
> +
> + /// 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;
> +
> + /// 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;
> +
> + /// GIC ITS information
> + CM_ARM_GIC_ITS_INFO GicItsInfo;
> +
> + /// PCI configuration space information
> + CM_ARM_PCI_CONFIG_SPACE_INFO PciConfigInfo[PLAT_PCI_CONFG_COUNT];
> +
> + /// Serial port information for serial port console redirection port
> + CM_ARM_SERIAL_PORT_INFO SpcrSerialPort;
> +
> + /// Fsl Board Revision
> + UINT32 FslBoardRevision;
> +} FSL_PLATFORM_REPOSITORY_INFO;
> +
> +/*
> + * GTDT_GTIMER_FLAGS
> + * IT trigger (Level/Edge- Bit 0) and Polarity (Low/High) Bit 1
> + * Set bit-0 is 0 (Level trigger), Bit 1 1 (Active low)
> + */
> +#define GTDT_GTIMER_FLAGS (EFI_ACPI_6_1_GTDT_TIMER_FLAG_TIMER_INTERRUPT_POLARITY)
> +
> +/*
> + * Timer Frame IT High Level triggered
> + * IT trigger (Level/Edge- Bit 0) and Polarity (Low/High) Bit 1
> + * Set bit-0 is 0 (Level trigger), Bit 1 0 (Active High)
> + */
> +#define GTDT_FRAME_FLAGS 0
> +
> +/*
> + * Timer frame status
> + * Access - Secure or non secure <-- Bit 0
> + * State - Save (meaning always on) or Lose Context <-- Bit 1
> + * Set Bit 0 1 as Secure and Bit 1 zero as lose context
> +*/
> +#define GTDT_FRAME_COMMON_FLAGS EFI_ACPI_6_1_GTDT_GT_BLOCK_COMMON_FLAG_SECURE_TIMER
> +
> +/*
> + * Watchdog flags
> + * IT trigger (Level/Edge- Bit 0), Polarity (Low/High) Bit 1, Secured Bit 2
> + * Set Level trigger (Bit 0 as 0)
> + * Active High (Bit 1 as 0)
> + * Non secure (Bit 2 as 0)
> + */
> +#define SBSA_WATCHDOG_FLAGS 0
> +#define SBSA_SEC_WATCHDOG_FLAGS EFI_ACPI_6_1_GTDT_GT_BLOCK_COMMON_FLAG_SECURE_TIMER
> +
> +#define GT_BLOCK_FRAME_RES_BASE MAX_UINT64
> +
> +#endif // CONFIGURATION_MANAGER_H
> diff --git a/Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManagerDxe.inf b/Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManagerDxe.inf
> new file mode 100644
> index 0000000..496c8bf
> --- /dev/null
> +++ b/Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManagerDxe.inf
> @@ -0,0 +1,51 @@
> +## @file
> +# Configuration Manager Dxe
> +#
> +# Copyright 2020 NXP
> +# Copyright 2020 Puresoftware Ltd
> +#
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +##
> +
> +[Defines]
> + INF_VERSION = 0x0001001B
> + BASE_NAME = ConfigurationManagerDxe
> + FILE_GUID = A97F70AC-3BB4-4596-B4D2-9F948EC12D17
> + 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
> + EmbeddedPkg/EmbeddedPkg.dec
> + MdeModulePkg/MdeModulePkg.dec
> + MdePkg/MdePkg.dec
> + Silicon/NXP/NxpQoriqLs.dec
> +
> +[LibraryClasses]
> + ArmPlatformLib
> + PrintLib
> + UefiBootServicesTableLib
> + UefiDriverEntryPoint
> + UefiRuntimeServicesTableLib
> +
> +[Protocols]
> + gEdkiiConfigurationManagerProtocolGuid
> +
> +[FixedPcd]
> +
> +[Pcd]
> +
> +[Depex]
> + TRUE
> diff --git a/Platform/NXP/Env.sh b/Platform/NXP/Env.sh
> new file mode 100755
> index 0000000..3a8ad38
> --- /dev/null
> +++ b/Platform/NXP/Env.sh
> @@ -0,0 +1,67 @@
> +#!/bin/bash
> +#
> +# Copyright 2020 NXP
> +# Copyright 2020 Puresoftware Ltd
> +#
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +##
> +
> +unset GCC_UTILITY GCC_VERSION MajorVersion MinorVersion
> +
> +if [ X"$CROSS_COMPILE_64" != X"" ]; then
> + ARM64_PREFIX="$CROSS_COMPILE_64"
> +elif [ X"$CROSS_COMPILE" != X"" ]; then
> + ARM64_PREFIX="$CROSS_COMPILE"
> +else
> + ARM64_PREFIX="aarch64-linux-gnu-"
> +fi
> +
> +GCC_UTILITY="${ARM64_PREFIX}gcc"
> +CheckGcc=`which $GCC_UTILITY >/dev/null 2>&1`
> +if [ "$?" -eq 0 ];then
> + GCC_VERSION=`$GCC_UTILITY -v 2>&1 | tail -n 1 | awk '{print $3}'`
> + MajorVersion=`echo $GCC_VERSION | cut -d . -f 1`
> + MinorVersion=`echo $GCC_VERSION | cut -d . -f 2`
> + GCC_ARCH_PREFIX=
> +
> + case $MajorVersion in
> + 4)
> + case $MinorVersion in
> + 9)
> + GCC_ARCH_PREFIX="GCC49_AARCH64_PREFIX"
> + ;;
> + *)
> + NOTSUPPORTED=1
> + ;;
> + esac
> + ;;
> + 5)
> + case $MinorVersion in
> + 4)
> + GCC_ARCH_PREFIX="GCC5_AARCH64_PREFIX"
> + ;;
> + *)
> + GCC_ARCH_PREFIX="GCC5_AARCH64_PREFIX"
> + echo "Warning: ${GCC_UTILITY} version ($MajorVersion.$MinorVersion) has not been tested, please use at own risk."
> + ;;
> + esac
> + ;;
> + *)
> + GCC_ARCH_PREFIX="GCC5_AARCH64_PREFIX"
> + echo "Warning: ${GCC_UTILITY} version ($MajorVersion.$MinorVersion) has not been tested, please use at own risk."
> + ;;
> + esac
> +
> + [ -n "$GCC_ARCH_PREFIX" ] && {
> + export GCC_ARCH_PREFIX="$GCC_ARCH_PREFIX"
> + export "$GCC_ARCH_PREFIX=$ARM64_PREFIX"
> + }
> +
> + unset ARCH
> +else
> + echo "Error: ${GCC_UTILITY} not found. Please check PATH variable."
> + unset GCC_UTILITY GCC_VERSION MajorVersion MinorVersion
> +fi
> +
> +# Export edk2-platforms path
> +export PACKAGES_PATH=`dirname \`dirname "$PWD"\``
> diff --git a/Platform/NXP/LX2160aRdbPkg/Include/Platform.h b/Platform/NXP/LX2160aRdbPkg/Include/Platform.h
> new file mode 100644
> index 0000000..e11ac37
> --- /dev/null
> +++ b/Platform/NXP/LX2160aRdbPkg/Include/Platform.h
> @@ -0,0 +1,240 @@
> +/** @file
> + * Platform headers
> + *
> + * Copyright 2020 NXP
> + * Copyright 2020 Puresoftware Ltd
> + *
> + * SPDX-License-Identifier: BSD-2-Clause-Patent
> + *
> +**/
> +
> +
> +#ifndef LX2160ARDB_PLATFORM_H
> +#define LX2160ARDB_PLATFORM_H
> +
> +#define EFI_ACPI_ARM_OEM_REVISION 0x00000000
> +
> +// Soc defines
> +#define SVR_SOC_VER(svr) (((svr) >> 8) & 0xFFFFFE)
> +#define SVR_MAJOR(svr) (((svr) >> 4) & 0xf)
> +#define SVR_MINOR(svr) (((svr) >> 0) & 0xf)
> +
> +#define SVR_LX2160A 0x873600
> +
> +// Gic
> +#define GIC_VERSION 3
> +#define GICD_BASE 0x6000000
> +#define GICI_BASE 0x6020000
> +#define GICR_BASE 0x06200000
> +#define GICR_LEN 0x200000
> +#define GICC_BASE 0x0c0c0000
> +#define GICH_BASE 0x0c0d0000
> +#define GICV_BASE 0x0c0e0000
> +
> +// UART
> +#define UART0_BASE 0x21C0000
> +#define UART1_BASE 0x21D0000
> +#define UART2_BASE 0x21E0000
> +#define UART3_BASE 0x21F0000
> +#define UART0_IT 64
> +#define UART1_IT 65
> +#define UART2_IT 104
> +#define UART3_IT 105
> +#define UART_LEN 0x10000
> +#define SPCR_FLOW_CONTROL_NONE 0
> +
> +// Timer
> +#define TIMER_BLOCK_COUNT 1
> +#define TIMER_FRAME_COUNT 4
> +#define TIMER_WATCHDOG_COUNT 1
> +#define TIMER_BASE_ADDRESS 0x23E0000 // a.k.a CNTControlBase
> +#define TIMER_READ_BASE_ADDRESS 0x23F0000 // a.k.a CNTReadBase
> +#define TIMER_GT_BLOCK_0_ADDRESS 0x2890000 // a.k.a CNTCTLBase (Secure)
> +#define TIMER_GT_BASE_0_ADDRESS 0x28A0000 // a.k.a CNTBase0
> +#define TIMER_GT_BASE_1_ADDRESS 0x28B0000 // a.k.a CNTBase1
> +#define TIMER_GT_BASE_2_ADDRESS 0x28C0000 // a.k.a CNTBase2
> +#define TIMER_GT_BASE_3_ADDRESS 0x28D0000 // a.k.a CNTBase3
> +#define TIMER_GT_BASE_0_EL0_ADDRESS 0x28E0000 // a.k.a CNTBase0EL0
> +#define TIMER_GT_BASE_2_EL0_ADDRESS 0x28F0000 // a.k.a CNTBase2EL0
> +#define TIMER_WDT0_REFRESH_BASE 0x2390000
> +#define TIMER_WDT0_CONTROL_BASE 0x23A0000
> +#define TIMER_SEC_IT 29
> +#define TIMER_NON_SEC_IT 30
> +#define TIMER_VIRT_IT 27
> +#define TIMER_HYP_IT 26
> +#define TIMER_FRAME0_IT 78
> +#define TIMER_FRAME1_IT 79
> +#define TIMER_FRAME2_IT 92
> +#define TIMER_FRAME3_IT 93
> +#define TIMER_WDT0_IT 91
> +
> +#define DEFAULT_PLAT_FREQ 700000000
> +
> +// Mcfg
> +#define LX2160A_PCI_SEG0_CONFIG_BASE 0x9000000000
> +#define LX2160A_PCI_SEG0 0x2
> +#define LX2160A_PCI_SEG_BUSNUM_MIN 0x0
> +#define LX2160A_PCI_SEG_BUSNUM_MAX 0xff
> +#define LX2160A_PCI_SEG1_CONFIG_BASE 0xA000000000
> +#define LX2160A_PCI_SEG1 0x4
> +
> +// Platform specific info needed by Configuration Manager
> +
> +#define CFG_MGR_TABLE_ID SIGNATURE_64 ('L','X','2','1','6','0',' ',' ')
> +
> +#define PLAT_PCI_SEG0_CONFIG_BASE LX2160A_PCI_SEG0_CONFIG_BASE
> +#define PLAT_PCI_SEG0 LX2160A_PCI_SEG0
> +#define PLAT_PCI_SEG_BUSNUM_MIN LX2160A_PCI_SEG_BUSNUM_MIN
> +#define PLAT_PCI_SEG_BUSNUM_MAX LX2160A_PCI_SEG_BUSNUM_MAX
> +#define PLAT_PCI_SEG1_CONFIG_BASE LX2160A_PCI_SEG1_CONFIG_BASE
> +#define PLAT_PCI_SEG1 LX2160A_PCI_SEG1
> +
> +#define PLAT_GIC_VERSION GIC_VERSION
> +#define PLAT_GICD_BASE GICD_BASE
> +#define PLAT_GICI_BASE GICI_BASE
> +#define PLAT_GICR_BASE GICR_BASE
> +#define PLAT_GICR_LEN GICR_LEN
> +#define PLAT_GICC_BASE GICC_BASE
> +#define PLAT_GICH_BASE GICH_BASE
> +#define PLAT_GICV_BASE GICV_BASE
> +
> +#define PLAT_CPU_COUNT 16
> +#define PLAT_GTBLOCK_COUNT 1
> +#define PLAT_GTFRAME_COUNT 4
> +#define PLAT_PCI_CONFG_COUNT 2
> +
> +#define PLAT_WATCHDOG_COUNT 1
> +#define PLAT_GIC_REDISTRIBUTOR_COUNT 1
> +#define PLAT_GIC_ITS_COUNT 1
> +
> +/* GIC CPU Interface information
> + GIC_ENTRY (CPUInterfaceNumber, Mpidr, PmuIrq, VGicIrq, EnergyEfficiency)
> + */
> +#define PLAT_GIC_CPU_INTERFACE { \
> + GICC_ENTRY (0, GET_MPID (0, 0), 23, 0x19, 0), \
> + GICC_ENTRY (1, GET_MPID (0, 1), 23, 0x19, 0), \
> + GICC_ENTRY (2, GET_MPID (1, 0), 23, 0x19, 0), \
> + GICC_ENTRY (3, GET_MPID (1, 1), 23, 0x19, 0), \
> + GICC_ENTRY (4, GET_MPID (2, 0), 23, 0x19, 0), \
> + GICC_ENTRY (5, GET_MPID (2, 1), 23, 0x19, 0), \
> + GICC_ENTRY (6, GET_MPID (3, 0), 23, 0x19, 0), \
> + GICC_ENTRY (7, GET_MPID (3, 1), 23, 0x19, 0), \
> + GICC_ENTRY (8, GET_MPID (4, 0), 23, 0x19, 0), \
> + GICC_ENTRY (9, GET_MPID (4, 1), 23, 0x19, 0), \
> + GICC_ENTRY (10, GET_MPID (5, 0), 23, 0x19, 0), \
> + GICC_ENTRY (11, GET_MPID (5, 1), 23, 0x19, 0), \
> + GICC_ENTRY (12, GET_MPID (6, 0), 23, 0x19, 0), \
> + GICC_ENTRY (13, GET_MPID (6, 1), 23, 0x19, 0), \
> + GICC_ENTRY (14, GET_MPID (7, 0), 23, 0x19, 0), \
> + GICC_ENTRY (15, GET_MPID (7, 1), 23, 0x19, 0) \
> +}
> +
> +// watchdogs
> +#define PLAT_WATCHDOG_INFO \
> + { \
> + TIMER_WDT0_CONTROL_BASE, \
> + TIMER_WDT0_REFRESH_BASE, \
> + TIMER_WDT0_IT, \
> + SBSA_WATCHDOG_FLAGS \
> + } \
> +
> +#define PLAT_TIMER_BLOCK_INFO \
> + { \
> + { \
> + TIMER_GT_BLOCK_0_ADDRESS, \
> + PLAT_GTFRAME_COUNT, \
> + (CM_OBJECT_TOKEN)((UINT8*)&FslPlatformRepositoryInfo + \
> + OFFSET_OF (EDKII_PLATFORM_REPOSITORY_INFO, GTBlock0TimerInfo)) \
> + } \
> + } \
> +
> +#define PLAT_TIMER_FRAME_INFO \
> + { \
> + { \
> + 0, /* UINT8 GTFrameNumber */ \
> + TIMER_GT_BASE_0_ADDRESS, /* UINT64 CntBaseX */ \
> + TIMER_GT_BASE_0_EL0_ADDRESS, /* UINT64 CntEL0BaseX */ \
> + TIMER_FRAME0_IT, /* UINT32 GTxPhysicalTimerGSIV */ \
> + GTDT_FRAME_FLAGS, /* UINT32 GTxPhysicalTimerFlags */ \
> + TIMER_FRAME0_IT, /* UINT32 GTxVirtualTimerGSIV */ \
> + GTDT_FRAME_FLAGS, /* UINT32 GTxVirtualTimerFlags */ \
> + 0 /* UINT32 GTxCommonFlags */ \
> + }, /* Gtdt.Frames[0] */ \
> + { \
> + 1, /* UINT8 GTFrameNumber */ \
> + TIMER_GT_BASE_1_ADDRESS, /* UINT64 CntBaseX */ \
> + GT_BLOCK_FRAME_RES_BASE, /* UINT64 CntEL0BaseX */ \
> + TIMER_FRAME1_IT, /* UINT32 GTxPhysicalTimerGSIV */ \
> + GTDT_FRAME_FLAGS, /* UINT32 GTxPhysicalTimerFlags */ \
> + 0, /* UINT32 GTxVirtualTimerGSIV */ \
> + 0, /* UINT32 GTxVirtualTimerFlags */ \
> + GTDT_FRAME_COMMON_FLAGS /* UINT32 GTxCommonFlags */ \
> + }, /* Gtdt.Frames[1] */ \
> + { \
> + 2, /* UINT8 GTFrameNumber */ \
> + TIMER_GT_BASE_2_ADDRESS, /* UINT64 CntBaseX */ \
> + TIMER_GT_BASE_2_EL0_ADDRESS, /* UINT64 CntEL0BaseX */ \
> + TIMER_FRAME2_IT, /* UINT32 GTxPhysicalTimerGSIV */ \
> + GTDT_FRAME_FLAGS, /* UINT32 GTxPhysicalTimerFlags */ \
> + 0, /* UINT32 GTxVirtualTimerGSIV */ \
> + 0, /* UINT32 GTxVirtualTimerFlags */ \
> + GTDT_FRAME_COMMON_FLAGS /* UINT32 GTxCommonFlags */ \
> + },/* Gtdt.Frames[2] */ \
> + { \
> + 3, /* UINT8 GTFrameNumber */ \
> + TIMER_GT_BASE_3_ADDRESS, /* UINT64 CntBaseX */ \
> + GT_BLOCK_FRAME_RES_BASE, /* UINT64 CntEL0BaseX */ \
> + TIMER_FRAME3_IT, /* UINT32 GTxPhysicalTimerGSIV */ \
> + GTDT_FRAME_FLAGS, /* UINT32 GTxPhysicalTimerFlags */ \
> + 0, /* UINT32 GTxVirtualTimerGSIV */ \
> + 0, /* UINT32 GTxVirtualTimerFlags */ \
> + GTDT_FRAME_COMMON_FLAGS /* UINT32 GTxCommonFlags */ \
> + }, /* Gtdt.Frames[3] */ \
> + } \
> +
> +#define PLAT_GIC_DISTRIBUTOR_INFO \
> + { \
> + PLAT_GICD_BASE, /* UINT64 PhysicalBaseAddress */ \
> + 0, /* UINT32 SystemVectorBase */ \
> + PLAT_GIC_VERSION /* UINT8 GicVersion */ \
> + } \
> +
> +#define PLAT_GIC_REDISTRIBUTOR_INFO \
> + { \
> + PLAT_GICR_BASE, /* UINT64 DiscoveryRangeBaseAddress */ \
> + PLAT_GICR_LEN /* UINT32 DiscoveryRangeLength */ \
> + } \
> +
> +#define PLAT_GIC_ITS_INFO \
> + { \
> + 0, /* UINT32 GIC ITS ID */ \
> + PLAT_GICI_BASE, /* UINT64 The 64-bit physical address for ITS */ \
> + 0 /* UINT32 Populate the GIC ITS affinity in SRAT. */ \
> + } \
> +
> +#define PLAT_MCFG_INFO \
> + { \
> + { \
> + PLAT_PCI_SEG0_CONFIG_BASE, \
> + PLAT_PCI_SEG0, \
> + PLAT_PCI_SEG_BUSNUM_MIN, \
> + PLAT_PCI_SEG_BUSNUM_MAX, \
> + }, \
> + { \
> + PLAT_PCI_SEG1_CONFIG_BASE, \
> + PLAT_PCI_SEG1, \
> + PLAT_PCI_SEG_BUSNUM_MIN, \
> + PLAT_PCI_SEG_BUSNUM_MAX, \
> + } \
> + } \
> +
> +#define PLAT_SPCR_INFO \
> + { \
> + UART0_BASE, \
> + UART0_IT, \
> + 115200, \
> + 0, \
> + EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERFACE_TYPE_ARM_PL011_UART \
> + } \
> +
> +#endif // LX2160ARDB_PLATFORM_H
> diff --git a/Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.dec b/Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.dec
> index 03996b0..459440c 100644
> --- a/Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.dec
> +++ b/Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.dec
> @@ -2,6 +2,7 @@
> # LX2160a board package.
> #
> # Copyright 2018, 2020 NXP
> +# Copyright 2020 Puresoftware Ltd
> #
> # SPDX-License-Identifier: BSD-2-Clause-Patent
> #
> diff --git a/Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.dsc b/Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.dsc
> index 7132b3e..6ba429d 100644
> --- a/Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.dsc
> +++ b/Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.dsc
> @@ -3,6 +3,7 @@
> # LX2160ARDB Board package.
> #
> # Copyright 2018-2020 NXP
> +# Copyright 2020 Puresoftware Ltd
> #
> # SPDX-License-Identifier: BSD-2-Clause-Patent
> #
> @@ -29,9 +30,17 @@
> DEFINE NETWORK_HTTP_BOOT_ENABLE = FALSE
> DEFINE NETWORK_ISCSI_ENABLE = FALSE
>
> + # This flag controls the dynamic acpi generation
> + #
> + DEFINE DYNAMIC_ACPI_ENABLE = TRUE
> +
> !include Silicon/NXP/NxpQoriqLs.dsc.inc
> !include Silicon/NXP/LX2160A/LX2160A.dsc.inc
>
> +!if $(DYNAMIC_ACPI_ENABLE) == TRUE
> + !include DynamicTablesPkg/DynamicTables.dsc.inc
> +!endif
> +
> [LibraryClasses.common]
> ArmPlatformLib|Platform/NXP/LX2160aRdbPkg/Library/ArmPlatformLib/ArmPlatformLib.inf
> RealTimeClockLib|EmbeddedPkg/Library/VirtualRealTimeClockLib/VirtualRealTimeClockLib.inf
> @@ -64,6 +73,25 @@
> MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
>
> #
> + # Dynamic Table Factory
> + !if $(DYNAMIC_ACPI_ENABLE) == TRUE
> + DynamicTablesPkg/Drivers/DynamicTableFactoryDxe/DynamicTableFactoryDxe.inf {
> + <LibraryClasses>
> + NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiFadtLibArm/AcpiFadtLibArm.inf
> + NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiGtdtLibArm/AcpiGtdtLibArm.inf
> + NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiMadtLibArm/AcpiMadtLibArm.inf
> + NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiMcfgLibArm/AcpiMcfgLibArm.inf
> + NULL|DynamicTablesPkg/Library/Acpi/Arm/AcpiSpcrLibArm/AcpiSpcrLibArm.inf
> + }
> + !endif
> +
> + #
> + # Acpi Support
> + #
> + MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatformDxe.inf
> + MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
> +
> + #
> # Networking stack
> #
> !include NetworkPkg/Network.dsc.inc
> diff --git a/Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.fdf b/Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.fdf
> index 111c845..0680565 100644
> --- a/Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.fdf
> +++ b/Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.fdf
> @@ -3,6 +3,7 @@
> # FLASH layout file for LX2160a board.
> #
> # Copyright 2018-2020 NXP
> +# Copyright 2020 Puresoftware Ltd
> #
> # SPDX-License-Identifier: BSD-2-Clause-Patent
> #
> @@ -103,6 +104,17 @@ READ_LOCK_STATUS = TRUE
> INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
>
> #
> + # Acpi Support
> + #
> + INF MdeModulePkg/Universal/Acpi/AcpiPlatformDxe/AcpiPlatformDxe.inf
> + INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
> +
> + !if $(DYNAMIC_ACPI_ENABLE) == TRUE
> + INF Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManagerDxe.inf
> + !include DynamicTablesPkg/DynamicTables.fdf.inc
> + !endif
> +
> + #
> # Multiple Console IO support
> #
> INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
> diff --git a/Platform/NXP/Readme.md b/Platform/NXP/Readme.md
> index 2d60d7c..878df75 100644
> --- a/Platform/NXP/Readme.md
> +++ b/Platform/NXP/Readme.md
> @@ -2,4 +2,37 @@ Support for all NXP boards is available in this directory.
>
> # How to build
>
> -Please follow top-level Readme.md for build instructions..
> +Introduced a "build.sh" script under edk2-platforms/NXP/ to automate fsl
> +platforms build system. Also called UEFI build script for NXP Layer Scape
> +SoCs And also mandatorily needed to support Dynamic ACPI framework for fsl
> +based platforms.
> +This script intend to:
> + - Setup workspace
> + - Setup BaseTools in edk2
> + - Setup Target and Tools needed
> + - Finally exports variables if needed (in case of Dynamic ACPI)
> +
> +Most importantly it uses source environment file "Env.sh".
> +This file sources in:
> + - GCC VERSION info
> + - CROSS COMPILE info
> + - ARCH info etc.
> +
> +This build shell script (build.sh) expects:
> + Arg 1 (mandatory): SoC Type (can be LS1046 / LS2088 / LX2160 / LS1028).
> + Arg 2 (mandatory): Board Type (can be RDB / QDS /FRWY).
> + Arg 3 (mandatory): Build candidate (can be RELEASE or DEBUG).
> + By default we build the RELEASE candidate.
> + Arg 4 (optional): clean - To do a 'make clean' operation.
> +
> +Usage: $ ./build.sh <Soc Type> <Board Type> <Build Type>
> +
> +E.g: $ ./build.sh LX2160 RDB RELEASE
> + Or
> + $ ./build.sh LX2160 RDB RELEASE clean // For build cleanup
> +
> +# Prerequisites
> +
> +Please follow top-level Readme.md's "Obtaining source code" tag
> +https://github.com/tianocore/edk2-platforms#obtaining-source-code
> +for sources.
Seeing this improved version, I'm even more convinced than I was that
this is nothing we want in the upstream tree. It remains misleading,
inflexible, and of insufficient quality. (And is the cause of the
build failure I reported for 0/2.)
Please drop build.sh and Env.sh from this patch, and update the
Readme.md to provide the platform-specific relevant information.
(It should have been a separate patch to begin with.)
If NXP wants this "vendor value add", they can keep it as a single
patch in some othe repo.
/
Leif
> diff --git a/Platform/NXP/build.sh b/Platform/NXP/build.sh
> new file mode 100755
> index 0000000..0c47e73
> --- /dev/null
> +++ b/Platform/NXP/build.sh
> @@ -0,0 +1,115 @@
> +#!/bin/bash
> +# UEFI build script for NXP Layer Scape SoCs
> +#
> +# Copyright 2020 NXP
> +# Copyright 2020 Puresoftware Ltd
> +#
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +##
> +
> +# source environment file
> +source Env.sh
> +
> +# Global Defaults
> +ARCH=AARCH64
> +TARGET_TOOLS=`echo $GCC_ARCH_PREFIX | cut -d _ -f 1`
> +BASE_DIR=../../..
> +
> +[ -z "$TARGET_TOOLS" ] && {
> + echo "TARGET_TOOLS not found. Please run \"source Env.cshrc\" ."
> + exit 1
> +}
> +
> +print_usage_banner()
> +{
> + echo ""
> + echo "This shell script expects:"
> + echo " Arg 1 (mandatory): SoC Type (can be LS1043 / LS1046 / LS2088 / LX2160 / LS1028)."
> + echo " Arg 2 (mandatory): Board Type (can be RDB / QDS /FRWY)."
> + echo " Arg 3 (mandatory): Build candidate (can be RELEASE or DEBUG). By
> + default we build the RELEASE candidate."
> + echo " Arg 4 (optional): clean - To do a 'make clean' operation."
> +}
> +
> +# Check for total num of input arguments
> +if [[ "$#" -gt 4 ]]; then
> + echo "Illegal number of parameters"
> + print_usage_banner
> + exit
> +fi
> +
> +# Check for third parameter to be clean only
> +if [[ "$4" && $4 != "clean" ]]; then
> + echo "Error ! Either clean or emplty"
> + print_usage_banner
> + exit
> +fi
> +
> +# Check for input arguments
> +if [[ $1 == "" || $2 == "" || $3 == "" ]]; then
> + echo "Error !"
> + print_usage_banner
> + exit
> +fi
> +
> +# Check for input arguments
> +if [[ $1 != "LS1043" && $1 != "LS1046" && $1 != "LS2088" && $1 != "LX2160" && $1 != "LS1028" ]]; then
> + echo "Error ! Incorrect Soc Type specified."
> + print_usage_banner
> + exit
> +fi
> +
> +# Check for input arguments
> +if [[ $2 != "RDB" && $2 != "QDS" && $2 != "FRWY" ]]; then
> + echo "Error ! Incorrect Board Type specified."
> + print_usage_banner
> + exit
> +fi
> +
> +# Check for input arguments
> +if [[ $3 != "RELEASE" ]]; then
> + if [[ $3 != "DEBUG" ]]; then
> + echo "Error ! Incorrect build target specified."
> + print_usage_banner
> + exit
> + fi
> +fi
> +
> +# Set Package drirectory
> +if [[ $2 == "RDB" ]]; then
> + PKG="aRdbPkg"
> + if [[ $2 == "QDS" ]]; then
> + PKG="aQdsPkg"
> + fi
> +elif [[ $2 == "FRWY" ]]; then
> + PKG="aFrwyPkg"
> +fi
> +
> +echo ".........................................."
> +echo "Welcome to $1$PKG UEFI Build environment"
> +echo ".........................................."
> +
> +if [[ $4 == "clean" ]]; then
> + echo "Cleaning up the build directory '$BASE_DIR/Build/$1$PKG/'.."
> + rm -rf $BASE_DIR/Build/$1$PKG/*
> + exit
> +fi
> +
> +# Clean-up
> +set -e
> +shopt -s nocasematch
> +
> +#
> +# Setup workspace now
> +#
> +echo Initializing workspace
> +cd $BASE_DIR
> +
> +# Use the BaseTools in edk2
> +export EDK_TOOLS_PATH=`pwd`/BaseTools
> +source edksetup.sh BaseTools
> +
> +export DYNAMIC_ACPI_PLATFORM=$1$PKG
> +export DYNAMIC_ACPI_INC="$1A"
> +
> +build -p "$PACKAGES_PATH/Platform/NXP/$1$PKG/$1$PKG.dsc" -a $ARCH -t $TARGET_TOOLS -b $3
> diff --git a/Silicon/NXP/LX2160A/LX2160A.dsc.inc b/Silicon/NXP/LX2160A/LX2160A.dsc.inc
> index 856fc59..149376f 100644
> --- a/Silicon/NXP/LX2160A/LX2160A.dsc.inc
> +++ b/Silicon/NXP/LX2160A/LX2160A.dsc.inc
> @@ -63,4 +63,13 @@
> [Components.common]
> ArmPkg/Drivers/GenericWatchdogDxe/GenericWatchdogDxe.inf
>
> + #
> + # Configuration Manager
> +!if $(DYNAMIC_ACPI_ENABLE) == TRUE
> + Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManagerDxe.inf {
> + <BuildOptions>
> + *_*_*_PLATFORM_FLAGS = -I$(WORKSPACE)/Platform/NXP/$(DYNAMIC_ACPI_PLATFORM)/Include
> + }
> +!endif
> +
> ##
> --
> 2.7.4
>
next prev parent reply other threads:[~2021-02-15 13:55 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-27 6:44 [PATCH v2 0/2] Dynamic ACPI framework for fsl layerscape platforms Vikas Singh
2021-01-27 6:44 ` [PATCH v2 1/2] Platform/NXP: Add Dynamic Acpi for " Vikas Singh
2021-02-15 13:55 ` Leif Lindholm [this message]
2021-01-27 6:44 ` [PATCH v2 2/2] Platform/NXP: Add OEM specific DSDT generator Vikas Singh
2021-02-15 13:44 ` Leif Lindholm
2021-02-15 13:18 ` [PATCH v2 0/2] Dynamic ACPI framework for fsl layerscape platforms Leif Lindholm
2021-02-15 13:53 ` Sami Mujawar
2021-02-16 11:59 ` Vikas Singh
2021-02-19 10:42 ` Vikas Singh
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=20210215135504.GD1664@vanye \
--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