From nobody Mon Feb 9 19:08:00 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+58061+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+58061+1787277+3901457@groups.io ARC-Seal: i=1; a=rsa-sha256; t=1587736706; cv=none; d=zohomail.com; s=zohoarc; b=NQvjNHV/+pqQQThZKS0uFIME5XVokEtQOv9gd3S5uGUsWUm8fkqvc5T7rlVN6zb3zPpcJDQBIy0/i5AI2o9DVG73yYpWbzWR0qBpQ97oYUMkEzu5JhIYznH13keq8Nv2l/9qUrs3EZTuhylimk55/svhM/ZQEVH1kUhmrMkMFso= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1587736706; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=BYjcg9IBvc/p7y5I+RQ6KGifGZlfGoFvs6BBIO/lACA=; b=A5zmdii8ofy9K35DP2Xz5c7y7gbflbJaMdSixOUoe3PjPIFD4/0ERNPAMy5yYAtmBy1puL5X06Z3q3r8ockQpT1HrIQILuyqd2zM1QkpcwMtETKAasyu3RY0tFlhY9UwAhJkzKUwpkycN1QLEKGfDxQzQU2D2nTqASH+48tbkPU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+58061+1787277+3901457@groups.io Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1587736706449635.8423103603351; Fri, 24 Apr 2020 06:58:26 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id CRORYY1788612x770bs1OOHK; Fri, 24 Apr 2020 06:58:26 -0700 X-Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web10.4023.1587729521452989852 for ; Fri, 24 Apr 2020 04:58:41 -0700 X-Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1823311D4 for ; Fri, 24 Apr 2020 04:58:41 -0700 (PDT) X-Received: from usa.arm.com (a074742-lin.blr.arm.com [10.162.17.29]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 5FC6A3F7BB for ; Fri, 24 Apr 2020 04:58:40 -0700 (PDT) From: "Pranav Madhu" To: devel@edk2.groups.io Subject: [edk2-devel] [edk2-platforms][PATCH v1 1/4] Platform/ARM/N1SDP: Add platform library implementation Date: Fri, 24 Apr 2020 17:28:26 +0530 Message-Id: <1587729509-11824-2-git-send-email-pranav.madhu@arm.com> In-Reply-To: <1587729509-11824-1-git-send-email-pranav.madhu@arm.com> References: <1587729509-11824-1-git-send-email-pranav.madhu@arm.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,pranav.madhu@arm.com X-Gm-Message-State: aGmNuLEvcXdKo80UxqjA6xK7x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1587736706; bh=fKbduqNg3UqoXkTkR4L60ctwHohcbi4vbL5Uv98r4bU=; h=Date:From:Reply-To:Subject:To; b=iRxpCWY8wBs5NsqQ8VQyUWBAvmo+nq9MIEe3+JITweB2ADuvZGtJvGvTYZKIaquKsT8 SgQwt7tiNX0qgPF4ONo/SjO7/bKSQ1LSd3pgF36j6erPLHVmSrCtpT5RzxElUkNs8ZZrB GI1UQUO2yoiSg6E1qebpARnBZZIUdqudh9o= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" From: Deepak Pandey N1SDP (Neoverse N1 System Development Platform) platform library support. This includes the virtual memory map and helper functions for platform intialization. Signed-off-by: Pranav Madhu --- Platform/ARM/N1SdpPkg/Library/PlatformLib/PlatformLib.inf | 52 ++++++++ Platform/ARM/N1SdpPkg/Include/N1SdpPlatform.h | 68 +++++++++= ++ Platform/ARM/N1SdpPkg/Library/PlatformLib/PlatformLib.c | 67 +++++++++= ++ Platform/ARM/N1SdpPkg/Library/PlatformLib/PlatformLibMem.c | 127 +++++++++= +++++++++++ Platform/ARM/N1SdpPkg/Library/PlatformLib/AArch64/Helper.S | 84 +++++++++= ++++ 5 files changed, 398 insertions(+) diff --git a/Platform/ARM/N1SdpPkg/Library/PlatformLib/PlatformLib.inf b/Pl= atform/ARM/N1SdpPkg/Library/PlatformLib/PlatformLib.inf new file mode 100644 index 000000000000..1ba29657cbf6 --- /dev/null +++ b/Platform/ARM/N1SdpPkg/Library/PlatformLib/PlatformLib.inf @@ -0,0 +1,52 @@ +## @file +# +# Copyright (c) 2018-2020, ARM Limited. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x0001001A + BASE_NAME =3D ArmN1SdpLib + FILE_GUID =3D 87c525cd-e1a2-469e-994c-c28cd0c7bd0d + MODULE_TYPE =3D BASE + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D ArmPlatformLib + +[Packages] + ArmPkg/ArmPkg.dec + ArmPlatformPkg/ArmPlatformPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + Platform/ARM/N1SdpPkg/N1SdpPlatform.dec + +[LibraryClasses] + ArmLib + DebugLib + HobLib + IoLib + MemoryAllocationLib + SerialPortLib + +[Sources.common] + PlatformLibMem.c + PlatformLib.c + +[Sources.AARCH64] + AArch64/Helper.S | GCC + +[FixedPcd] + gArmTokenSpaceGuid.PcdSystemMemoryBase + gArmTokenSpaceGuid.PcdSystemMemorySize + gArmTokenSpaceGuid.PcdArmPrimaryCore + gArmTokenSpaceGuid.PcdArmPrimaryCoreMask + + gArmN1SdpTokenSpaceGuid.PcdDramBlock2Base + +[Guids] + gEfiHobListGuid ## CONSUMES ## SystemTable + +[Ppis] + gArmMpCoreInfoPpiGuid diff --git a/Platform/ARM/N1SdpPkg/Include/N1SdpPlatform.h b/Platform/ARM/N= 1SdpPkg/Include/N1SdpPlatform.h new file mode 100644 index 000000000000..9ab4617c3c90 --- /dev/null +++ b/Platform/ARM/N1SdpPkg/Include/N1SdpPlatform.h @@ -0,0 +1,68 @@ +/** @file +* +* Copyright (c) 2018 - 2020, ARM Limited. All rights reserved. +* +* SPDX-License-Identifier: BSD-2-Clause-Patent +* +**/ + +#ifndef __N1SDP_PLATFORM_H__ +#define __N1SDP_PLATFORM_H__ + +#define N1SDP_DRAM_BLOCK1_SIZE SIZE_2GB + +//************************************************************************= ****** +// Platform Memory Map +//************************************************************************= ****** + +// SubSystem Peripherals - UART0 +#define N1SDP_UART0_BASE 0x2A400000 +#define N1SDP_UART0_SZ SIZE_64KB + +// SubSystem Peripherals - UART1 +#define N1SDP_UART1_BASE 0x2A410000 +#define N1SDP_UART1_SZ SIZE_64KB + +// SubSystem Peripherals - Generic Watchdog +#define N1SDP_GENERIC_WDOG_BASE 0x2A440000 +#define N1SDP_GENERIC_WDOG_SZ SIZE_128KB + +// SubSystem Peripherals - GIC(600) +#define N1SDP_GIC_BASE 0x30000000 +#define N1SDP_GICR_BASE 0x300C0000 +#define N1SDP_GIC_SZ SIZE_256KB +#define N1SDP_GICR_SZ SIZE_1MB + +// SubSystem non-secure SRAM +#define N1SDP_NON_SECURE_SRAM_BASE 0x06000000 +#define N1SDP_NON_SECURE_SRAM_SZ SIZE_64KB + +// AXI Expansion peripherals +#define N1SDP_EXP_PERIPH_BASE0 0x1C000000 +#define N1SDP_EXP_PERIPH_BASE0_SZ 0x1300000 + +// Base address to a structure of type N1SDP_PLAT_INFO which is pre-popula= ted +// by a earlier boot stage +#define N1SDP_PLAT_INFO_STRUCT_BASE (N1SDP_NON_SECURE_SRAM_BASE += \ + 0x00008000) + +/* + * Platform information structure stored in non secure SRAM + * Platform information are passed from the trusted firmware with the below + * structure format. The elements of N1SDP_PLAT_INFO should be always in s= ync + * with the structure in trusted firmware + */ +#pragma pack(1) +typedef struct { + /*! 0 - Single Chip, 1 - Chip to Chip (C2C) */ + BOOLEAN MultichipMode; + /*! Slave count in C2C mode */ + UINT8 SlaveCount; + /*! Local DDR memory size in GigaBytes */ + UINT8 LocalDdrSize; + /*! Remote DDR memory size in GigaBytes */ + UINT8 RemoteDdrSize; +} N1SDP_PLAT_INFO; +#pragma pack() + +#endif diff --git a/Platform/ARM/N1SdpPkg/Library/PlatformLib/PlatformLib.c b/Plat= form/ARM/N1SdpPkg/Library/PlatformLib/PlatformLib.c new file mode 100644 index 000000000000..e9efd7a2d5c2 --- /dev/null +++ b/Platform/ARM/N1SdpPkg/Library/PlatformLib/PlatformLib.c @@ -0,0 +1,67 @@ +/** @file +* +* Copyright (c) 2018-2020, ARM Limited. All rights reserved. +* +* SPDX-License-Identifier: BSD-2-Clause-Patent +* +**/ + +#include +#include +#include + +STATIC ARM_CORE_INFO mCoreInfoTable[] =3D { + { 0x0, 0x0 }, // Cluster 0, Core 0 + { 0x0, 0x1 }, // Cluster 0, Core 1 + { 0x1, 0x0 }, // Cluster 1, Core 0 + { 0x1, 0x1 } // Cluster 1, Core 1 +}; + +EFI_BOOT_MODE +ArmPlatformGetBootMode ( + VOID + ) +{ + return BOOT_WITH_FULL_CONFIGURATION; +} + +RETURN_STATUS +ArmPlatformInitialize ( + IN UINTN MpId + ) +{ + return RETURN_SUCCESS; +} + +EFI_STATUS +PrePeiCoreGetMpCoreInfo ( + OUT UINTN *CoreCount, + OUT ARM_CORE_INFO **ArmCoreTable + ) +{ + *CoreCount =3D sizeof (mCoreInfoTable) / sizeof (ARM_CORE_INFO); + *ArmCoreTable =3D mCoreInfoTable; + return EFI_SUCCESS; +} + +STATIC ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi =3D { + PrePeiCoreGetMpCoreInfo +}; + +EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] =3D { + { + EFI_PEI_PPI_DESCRIPTOR_PPI, + &gArmMpCoreInfoPpiGuid, + &mMpCoreInfoPpi + } +}; + +VOID +ArmPlatformGetPlatformPpiList ( + OUT UINTN *PpiListSize, + OUT EFI_PEI_PPI_DESCRIPTOR **PpiList + ) +{ + *PpiListSize =3D sizeof (gPlatformPpiTable); + *PpiList =3D gPlatformPpiTable; +} diff --git a/Platform/ARM/N1SdpPkg/Library/PlatformLib/PlatformLibMem.c b/P= latform/ARM/N1SdpPkg/Library/PlatformLib/PlatformLibMem.c new file mode 100644 index 000000000000..7fae090cdb8d --- /dev/null +++ b/Platform/ARM/N1SdpPkg/Library/PlatformLib/PlatformLibMem.c @@ -0,0 +1,127 @@ +/** @file +* +* Copyright (c) 2018 - 2020, ARM Limited. All rights reserved. +* +* SPDX-License-Identifier: BSD-2-Clause-Patent +* +**/ + +#include +#include +#include +#include +#include +#include +#include + +// The total number of descriptors, including the final "end-of-table" des= criptor. +#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 9 + +/** + Returns the Virtual Memory Map of the platform. + + This Virtual Memory Map is used by MemoryInitPei Module to initialize th= e MMU + on your platform. + + @param[out] VirtualMemoryMap Array of ARM_MEMORY_REGION_DESCRIPTOR descr= ibing + a Physical-to-Virtual Memory mapping. This = array + must be ended by a zero-filled entry. +**/ +VOID +ArmPlatformGetVirtualMemoryMap ( + IN ARM_MEMORY_REGION_DESCRIPTOR **VirtualMemoryMap + ) +{ + UINTN Index =3D 0; + ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable; + EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttributes; + N1SDP_PLAT_INFO *PlatInfo; + UINT64 DramBlock2Size; + + PlatInfo =3D (N1SDP_PLAT_INFO *)N1SDP_PLAT_INFO_STRUCT_BASE; + DramBlock2Size =3D ((UINT64)(PlatInfo->LocalDdrSize - + (N1SDP_DRAM_BLOCK1_SIZE / SIZE_1GB)) * (UINT64)SIZE_1G= B); + + ResourceAttributes =3D + EFI_RESOURCE_ATTRIBUTE_PRESENT | + EFI_RESOURCE_ATTRIBUTE_INITIALIZED | + EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE | + EFI_RESOURCE_ATTRIBUTE_TESTED; + + BuildResourceDescriptorHob ( + EFI_RESOURCE_SYSTEM_MEMORY, + ResourceAttributes, + FixedPcdGet64 (PcdDramBlock2Base), + DramBlock2Size); + + ASSERT (VirtualMemoryMap !=3D NULL); + Index =3D 0; + + VirtualMemoryTable =3D (ARM_MEMORY_REGION_DESCRIPTOR *)AllocatePages + (EFI_SIZE_TO_PAGES (sizeof (ARM_MEMORY_REGION_DESCR= IPTOR) * + MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS)); + if (VirtualMemoryTable =3D=3D NULL) { + return; + } + + // SubSystem Peripherals - Generic Watchdog + VirtualMemoryTable[Index].PhysicalBase =3D N1SDP_GENERIC_WDOG_BASE; + VirtualMemoryTable[Index].VirtualBase =3D N1SDP_GENERIC_WDOG_BASE; + VirtualMemoryTable[Index].Length =3D N1SDP_GENERIC_WDOG_SZ; + VirtualMemoryTable[Index].Attributes =3D ARM_MEMORY_REGION_ATTRIBUT= E_DEVICE; + + // SubSystem Peripherals - GIC-600 + VirtualMemoryTable[++Index].PhysicalBase =3D N1SDP_GIC_BASE; + VirtualMemoryTable[Index].VirtualBase =3D N1SDP_GIC_BASE; + VirtualMemoryTable[Index].Length =3D N1SDP_GIC_SZ; + VirtualMemoryTable[Index].Attributes =3D ARM_MEMORY_REGION_ATTRIBUT= E_DEVICE; + + // SubSystem Peripherals - GICR-600 + VirtualMemoryTable[++Index].PhysicalBase =3D N1SDP_GICR_BASE; + VirtualMemoryTable[Index].VirtualBase =3D N1SDP_GICR_BASE; + VirtualMemoryTable[Index].Length =3D N1SDP_GICR_SZ; + VirtualMemoryTable[Index].Attributes =3D ARM_MEMORY_REGION_ATTRIBUT= E_DEVICE; + + // OnChip non-secure SRAM + VirtualMemoryTable[++Index].PhysicalBase =3D N1SDP_NON_SECURE_SRAM_BASE; + VirtualMemoryTable[Index].VirtualBase =3D N1SDP_NON_SECURE_SRAM_BASE; + VirtualMemoryTable[Index].Length =3D N1SDP_NON_SECURE_SRAM_SZ; + VirtualMemoryTable[Index].Attributes =3D ARM_MEMORY_REGION_ATTRIBUT= E_UNCACHED_UNBUFFERED; + + // SubSystem Pheripherals - UART0 + VirtualMemoryTable[++Index].PhysicalBase =3D N1SDP_UART0_BASE; + VirtualMemoryTable[Index].VirtualBase =3D N1SDP_UART0_BASE; + VirtualMemoryTable[Index].Length =3D N1SDP_UART0_SZ; + VirtualMemoryTable[Index].Attributes =3D ARM_MEMORY_REGION_ATTRIBUT= E_DEVICE; + + // DDR Primary (2GB) + VirtualMemoryTable[++Index].PhysicalBase =3D PcdGet64 (PcdSystemMemoryB= ase); + VirtualMemoryTable[Index].VirtualBase =3D PcdGet64 (PcdSystemMemoryB= ase); + VirtualMemoryTable[Index].Length =3D PcdGet64 (PcdSystemMemoryS= ize); + VirtualMemoryTable[Index].Attributes =3D ARM_MEMORY_REGION_ATTRIBUT= E_WRITE_BACK; + + // DDR Secondary + VirtualMemoryTable[++Index].PhysicalBase =3D PcdGet64 (PcdDramBlock2Bas= e); + VirtualMemoryTable[Index].VirtualBase =3D PcdGet64 (PcdDramBlock2Bas= e); + VirtualMemoryTable[Index].Length =3D DramBlock2Size; + VirtualMemoryTable[Index].Attributes =3D ARM_MEMORY_REGION_ATTRIBUT= E_WRITE_BACK; + + // Expansion Peripherals + VirtualMemoryTable[++Index].PhysicalBase =3D N1SDP_EXP_PERIPH_BASE0; + VirtualMemoryTable[Index].VirtualBase =3D N1SDP_EXP_PERIPH_BASE0; + VirtualMemoryTable[Index].Length =3D N1SDP_EXP_PERIPH_BASE0_SZ; + VirtualMemoryTable[Index].Attributes =3D ARM_MEMORY_REGION_ATTRIBUT= E_DEVICE; + + // End of Table + VirtualMemoryTable[++Index].PhysicalBase =3D 0; + VirtualMemoryTable[Index].VirtualBase =3D 0; + VirtualMemoryTable[Index].Length =3D 0; + VirtualMemoryTable[Index].Attributes =3D (ARM_MEMORY_REGION_ATTRIBU= TES)0; + + ASSERT((Index) < MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS); + DEBUG ((DEBUG_INIT, "Virtual Memory Table setup complete.\n")); + + *VirtualMemoryMap =3D VirtualMemoryTable; +} diff --git a/Platform/ARM/N1SdpPkg/Library/PlatformLib/AArch64/Helper.S b/P= latform/ARM/N1SdpPkg/Library/PlatformLib/AArch64/Helper.S new file mode 100644 index 000000000000..8d2069dea837 --- /dev/null +++ b/Platform/ARM/N1SdpPkg/Library/PlatformLib/AArch64/Helper.S @@ -0,0 +1,84 @@ +/** @file +* +* Copyright (c) 2019 - 2020, ARM Limited. All rights reserved. +* +* SPDX-License-Identifier: BSD-2-Clause-Patent +* +**/ + +#include +#include + +.text +.align 3 + +GCC_ASM_EXPORT(ArmPlatformPeiBootAction) +GCC_ASM_EXPORT(ArmPlatformGetCorePosition) +GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId) +GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore) + +// +// First platform specific function to be called in the PEI phase +// +// This function is actually the first function called by the PrePi +// or PrePeiCore modules. It allows to retrieve arguments passed to +// the UEFI firmware through the CPU registers. +// +ASM_PFX(ArmPlatformPeiBootAction): + ret + +// +// Return the core position from the value of its MpId register +// +// This function returns core position from the position 0 in the processo= r. +// This function might be called from assembler before any stack is set. +// +// @return Return the core position +// +//UINTN +//ArmPlatformGetCorePosition ( +// IN UINTN MpId +// ); +// With this function: CorePos =3D (ClusterId * 2) + CoreId +ASM_PFX(ArmPlatformGetCorePosition): + and x1, x0, #ARM_CORE_MASK + and x0, x0, #ARM_CLUSTER_MASK + add x0, x1, x0, LSR #7 + ret + +// +// Return the MpId of the primary core +// +// This function returns the MpId of the primary core. +// This function might be called from assembler before any stack is set. +// +// @return Return the MpId of the primary core +// +//UINTN +//ArmPlatformGetPrimaryCoreMpId ( +// VOID +// ); +ASM_PFX(ArmPlatformGetPrimaryCoreMpId): + MOV32 (w0, FixedPcdGet32(PcdArmPrimaryCore)) + ret + +// +// Return a non-zero value if the callee is the primary core +// +// This function returns a non-zero value if the callee is the primary cor= e. +// Primary core is the core responsible to initialize hardware and run UEF= I. +// This function might be called from assembler before any stack is set. +// +// @return Return a non-zero value if the callee is the primary core. +// +//UINTN +//ArmPlatformIsPrimaryCore ( +// IN UINTN MpId +// ); +ASM_PFX(ArmPlatformIsPrimaryCore): + MOV32 (w1, FixedPcdGet32(PcdArmPrimaryCoreMask)) + and x0, x0, x1 + MOV32 (w1, FixedPcdGet32(PcdArmPrimaryCore)) + cmp w0, w1 + cset x0, eq + ret --=20 2.7.4 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#58061): https://edk2.groups.io/g/devel/message/58061 Mute This Topic: https://groups.io/mt/73241664/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-