From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) by mx.groups.io with SMTP id smtpd.web12.30955.1613397308978192641 for ; Mon, 15 Feb 2021 05:55:09 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@nuviainc-com.20150623.gappssmtp.com header.s=20150623 header.b=cZZoq3mv; spf=pass (domain: nuviainc.com, ip: 209.85.221.48, mailfrom: leif@nuviainc.com) Received: by mail-wr1-f48.google.com with SMTP id u14so9006869wri.3 for ; Mon, 15 Feb 2021 05:55:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nuviainc-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=FYISJemjPWyKAUgHorDW6zBYG93ptbkHAQibC5mI0Uw=; b=cZZoq3mvwg7zYcWj59Ph+E2Jjw9AAUY1YoGJNF4uGjeuGcDYM3nGxf6Y0Z24JjcUhs WHiv8o+G9Hbd7df24umpAwsKn6yq3h0A7fUikCpJo1NXIYod8Qx65rcBcdi7bkAv9sd2 aAN7AZnI2hMIo2kJVxNydh/30JESAUdurzWwvC4lVr7pyTUAwZ6O1q7dXyqAkXUD21Wu NzLK8bzWuS7QuSp6xTlh2avOx7whk0HWe6ze2CT8vvQAOnBvC+bFhSlJxjaRyEimk7f+ xL+zRDBTeRJ5OC9PyFdGhNN0hsxGfZsLHGHGez6LoI4/7XM1bFQr9XPxUmOinmy2JNNH phOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=FYISJemjPWyKAUgHorDW6zBYG93ptbkHAQibC5mI0Uw=; b=qw8hMEvrFlkHOd7/sKEvdxwGZCtZecdo+6A1ttimMd/3+STdEYSQvDXKwzJe3YsCmF L1hc3KCOCutOqLu0fcj4QrwYZFyA54icQmhhaASt5zBSXJ1Tc47G8xy2dOdw93WfjE5V h6SUyXCX2xAIuKGlmBWEQzFj7EYXjN0It5Pmw9XUYDOkAMVpngQZC56TGL6xvomrq/Lg Cb5TUof9h087cF1yf4xDRbuJbv0JPkRv74t40El/t28TCeNWg6gC1H6Kc43ZFbhXq8iS QjGxVMOjQ/GtvHzCHpy+PPFdF3CRpO0ppqjRdUrC08bYlgyyXhUDqvqbwE6lomyMkzmm Jhjg== X-Gm-Message-State: AOAM533F8vHGoVvSJrIkWrnfV+JE3xySxbikWbe0a4Qjn6/yqs4plIL7 rhuJ/JNH7ZNNDR6Snw4aLuplrQ== X-Google-Smtp-Source: ABdhPJwfBlzuNlJDV6OX6tjimzjwugt/dBJoER/fV6GjJ80d2FkmRwtSw2gSaa+bRGcTI5R0MaBnGQ== X-Received: by 2002:adf:f6d0:: with SMTP id y16mr19167001wrp.351.1613397306789; Mon, 15 Feb 2021 05:55:06 -0800 (PST) Return-Path: Received: from vanye (cpc1-cmbg19-2-0-cust915.5-4.cable.virginm.net. [82.27.183.148]) by smtp.gmail.com with ESMTPSA id f7sm23564425wre.78.2021.02.15.05.55.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 15 Feb 2021 05:55:06 -0800 (PST) Date: Mon, 15 Feb 2021 13:55:04 +0000 From: "Leif Lindholm" To: Vikas Singh 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 Message-ID: <20210215135504.GD1664@vanye> References: <1611729899-23741-1-git-send-email-vikas.singh@puresoftware.com> <1611729899-23741-2-git-send-email-vikas.singh@puresoftware.com> MIME-Version: 1.0 In-Reply-To: <1611729899-23741-2-git-send-email-vikas.singh@puresoftware.com> User-Agent: Mutt/1.10.1 (2018-07-13) Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 > --- > .../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 > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +/** The platform specific headers > +*/ > +#include "ConfigurationManager.h" > +#include > + > +/** 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 > + > +/** 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 { > + > + 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 > + > +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 { > + > + *_*_*_PLATFORM_FLAGS = -I$(WORKSPACE)/Platform/NXP/$(DYNAMIC_ACPI_PLATFORM)/Include > + } > +!endif > + > ## > -- > 2.7.4 >