From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) by mx.groups.io with SMTP id smtpd.web12.5109.1613552631828550020 for ; Wed, 17 Feb 2021 01:03:51 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@puresoftware.com header.s=google header.b=jhOMdk2r; spf=pass (domain: puresoftware.com, ip: 209.85.216.46, mailfrom: vikas.singh@puresoftware.com) Received: by mail-pj1-f46.google.com with SMTP id cl8so1106392pjb.0 for ; Wed, 17 Feb 2021 01:03:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=puresoftware.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=wML5NKQMpu4BHFroNnd4lpBtPJdK7+tF53opegvpzGs=; b=jhOMdk2rlf4I6LpLxR7e0LB9dlWPBNBV0u/NDUJ9uJe7qLTwdZnjGkNnt/VxmBbIxj NLYgIYitvKYPNliI54mXUWhQZR0nL1uL8fKUq4YiUJ6kN1eTUwGuBjhC+0xiDdHLRiPe F79Rb1EVUSVdMjlb7j+DhQGXl/Z/5rRURE2rs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=wML5NKQMpu4BHFroNnd4lpBtPJdK7+tF53opegvpzGs=; b=tCxd12Q/lwT4+uVkQ4HkrVpkDz1sVW8wBD9wn36W7YydsiY1whxIMANwQCXzM8q+XQ 0/U+/YmJ7Pq9beLQD96WL9y7v00bNTKphqrJRWQgZiIocvzH6fI7PlwHFM3ocisZqvwQ BotuoD6bUsgwfJeVJS+4f507DxXZRaymE3C/P3hPe3efPGZv70wNCZPhDbItFHsrGT7A txp0J+i7MiLX8L6j+MBLyvAPYOSgjbAx6kRH4icrou7xRAMBZChfXXkgdhVdW5d/ppBl NQ3zAcYZTBNhjmrat/VBi+F/ux/FSfxnMqSqT7AmWp8x5D+u51A6Ax+OfwbEZxi7r/h+ eWAA== X-Gm-Message-State: AOAM532Ue9wywHAiGHKIUvRichwczjLnJERwWlX/K+pEvA0af860IMsn ScjIyBln8ClPUhwxgRrGAdp1JAdDKVKaNRWP X-Google-Smtp-Source: ABdhPJzn2dws/23FPQqnPxD0Rkg5R9RhShnccrL+pbbUm4imuJkhTv8J4ZHoaFu8aNJobJjjmEOzdA== X-Received: by 2002:a17:90b:17ca:: with SMTP id me10mr7855170pjb.60.1613552630203; Wed, 17 Feb 2021 01:03:50 -0800 (PST) Return-Path: Received: from embedded-PC.puresoft.int ([125.63.92.170]) by smtp.gmail.com with ESMTPSA id v9sm1493418pju.33.2021.02.17.01.03.46 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Feb 2021 01:03:49 -0800 (PST) From: "Vikas Singh" To: devel@edk2.groups.io Cc: sami.mujawar@arm.com, leif@nuviainc.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: [PATCH v3 1/2] Platform/NXP: Add Dynamic Acpi for layerscape platforms Date: Wed, 17 Feb 2021 14:33:31 +0530 Message-Id: <1613552612-15642-2-git-send-email-vikas.singh@puresoftware.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1613552612-15642-1-git-send-email-vikas.singh@puresoftware.com> References: <1613552612-15642-1-git-send-email-vikas.singh@puresoftware.com> 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 --- Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManager.c | 834 ++++++++++++++++++++ Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManager.h | 151 ++++ Platform/NXP/ConfigurationManagerPkg/ConfigurationManagerDxe/ConfigurationManagerDxe.inf | 51 ++ Platform/NXP/LX2160aRdbPkg/Include/Platform.h | 240 ++++++ Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.dsc | 28 + Platform/NXP/LX2160aRdbPkg/LX2160aRdbPkg.fdf | 12 + Silicon/NXP/LX2160A/LX2160A.dsc.inc | 10 + 7 files changed, 1326 insertions(+) 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/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.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/Silicon/NXP/LX2160A/LX2160A.dsc.inc b/Silicon/NXP/LX2160A/LX2160A.dsc.inc index 856fc59..ea7e54f 100644 --- a/Silicon/NXP/LX2160A/LX2160A.dsc.inc +++ b/Silicon/NXP/LX2160A/LX2160A.dsc.inc @@ -2,6 +2,7 @@ # LX2160A Soc package. # # Copyright 2018-2020 NXP +# Copyright 2020 Puresoftware Ltd # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -63,4 +64,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/LX2160aRdbPkg/Include + } +!endif + ## -- 2.7.4