public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
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
> 

  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