From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by mx.groups.io with SMTP id smtpd.web09.6390.1573747683757275630 for ; Thu, 14 Nov 2019 08:08:04 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@akeo-ie.20150623.gappssmtp.com header.s=20150623 header.b=zQH7oxZC; spf=none, err=permanent DNS error (domain: akeo.ie, ip: 209.85.221.67, mailfrom: pete@akeo.ie) Received: by mail-wr1-f67.google.com with SMTP id l7so7111248wrp.6 for ; Thu, 14 Nov 2019 08:08:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=akeo-ie.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SaWOBNWTMoWILs3GDeqA+MXzCg4eKf/l5TqFr9599Sk=; b=zQH7oxZClELkGbekZaSjkRLpe5Fet7aIWxUgIRKhenUJAs2JrJIUna+liztPiJuz/w x5PgS3UP/ekif4gw63pAUJzZ6L6M+LaOzB9FzX+FQtLrLiRlWD55zNESeXG+5SgpMaPd DFvoIOX1/XyCOopcHwdstdiv9Hjl1eghWhEH+8NR7pHik0g0rXWoQnkvMDyfvAz8VkOF 33i9IdKj3ytZDXGYbdlM6024Gt+b93MeTwGwMqz4MrN7Q1dRuevqqIY+HSpcB0JynoeB 0uCbhgQ+vHSmu4b3QS1JfaWK43Afx/2Qt3MDC7d/hs7WQtKMjB7G8GE92U0W4F2Y3w4a 7BSQ== 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:mime-version:content-transfer-encoding; bh=SaWOBNWTMoWILs3GDeqA+MXzCg4eKf/l5TqFr9599Sk=; b=Bajo16OgVUBBukRzP0kyBRf5nfMv+EXESnJTP+kxRydfefGHlUbo0QI/0zXmm5HAhE TV8ecQFWPpYGL/NklazBcVVfEwgPWwdzWaD3bMqi+lasTyEngVP5AuCYW9nFOa8WSdjp A1Wu4opEKbP5JI3qqjjqX5HRuRks84yaMx0WfVExcZP10Kmm4I4gmMZT3UMyW0VjXdUa gfM2jrmiz/Ko2Sah+nc4CIpaRAtwjK4k5h5Qd5Ixy1kaM3k8Y4Rxq9nfgTIqlNWxQVgE 8gNahUNbHBn6ApWLklibZgUzZRQjv79FWquibTP5j6xsFAtB6v/TL8EJsjBM4xYzbxII /FgA== X-Gm-Message-State: APjAAAXz/msx1WYCjy8wuvlY4D3HUJ9Nc7t//NlQUdsOnfaqew88nw5B YBSvLT7dAACKtgkLzsta9h/ISnmUJXY= X-Google-Smtp-Source: APXvYqyUmu3dUXgPuxIO5Phq/wgdKyeMN1mRuO4WnQXDeUxrkhdCDYui/grwbpQaR33vmTLopexPCQ== X-Received: by 2002:adf:fad1:: with SMTP id a17mr1942327wrs.328.1573747681646; Thu, 14 Nov 2019 08:08:01 -0800 (PST) Return-Path: Received: from localhost.localdomain ([84.203.67.47]) by smtp.gmail.com with ESMTPSA id a16sm6793088wmd.11.2019.11.14.08.07.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 14 Nov 2019 08:08:00 -0800 (PST) From: "Pete Batard" To: devel@edk2.groups.io Cc: ard.biesheuvel@linaro.org, leif.lindholm@linaro.org, philmd@redhat.com Subject: [edk2-platforms][PATCH 5/8] Platform/RPi: Clean up and improve early memory init Date: Thu, 14 Nov 2019 16:07:37 +0000 Message-Id: <20191114160740.10072-6-pete@akeo.ie> X-Mailer: git-send-email 2.21.0.windows.1 In-Reply-To: <20191114160740.10072-1-pete@akeo.ie> References: <20191114160740.10072-1-pete@akeo.ie> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit This patch improves memory initialization for the Raspberry Pi Platform by: Using VideoCore mailbox data to reserve only the regions that are actually mapped. Especially, besides the base RAM size, which was already set using VideoCore data, we can set the GPU/VideoCore base address as well as the extended RAM, which is the memory beyond 1 GB that is available on models such as the Raspberry Pi 4 (for the 2GB or 4GB versions). Introducing a new PcdExtendedMemoryBase PCD for the base address of the extended memory region, which currently cannot be retrieved from VideoCore (MBOX_GET_ARM_MEMSIZE still only returns a single region on Bcm2711). Introducing a new RpiPlatformGetVirtualMemoryInfo() companion call to ArmPlatformGetVirtualMemoryMap() that allows us greatly simplify the registration of each segment in MemoryPeim() as well as making it easier to maintain for future models. We also fix SoC register space that should have been marked as reserved but wasn't until now and remove the unreferenced mSystemMemoryEnd extern in MemoryInitPeiLib.c. Signed-off-by: Pete Batard --- Platform/RaspberryPi/Include/Library/RPiMem.h | 26 +++ Platform/RaspberryPi/Library/MemoryInitPeiLib/MemoryInitPeiLib.c | 94 ++++---- Platform/RaspberryPi/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf | 1 + Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf | 3 + Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c | 242 +++++++++++--------- Platform/RaspberryPi/RaspberryPi.dec | 1 + 6 files changed, 210 insertions(+), 157 deletions(-) diff --git a/Platform/RaspberryPi/Include/Library/RPiMem.h b/Platform/RaspberryPi/Include/Library/RPiMem.h new file mode 100644 index 000000000000..0bfc697ed094 --- /dev/null +++ b/Platform/RaspberryPi/Include/Library/RPiMem.h @@ -0,0 +1,26 @@ +/** @file + * + * Copyright (c) 2019, Pete Batard + * + * SPDX-License-Identifier: BSD-2-Clause-Patent + * + **/ + +#ifndef __RPI_MEM_H__ +#define __RPI_MEM_H__ + +#define RPI_MEM_BASIC_REGION 0 +#define RPI_MEM_RUNTIME_REGION 1 +#define RPI_MEM_RESERVED_REGION 2 + +typedef struct { + CONST CHAR16* Name; + UINTN Type; +} RPI_MEMORY_REGION_INFO; + +VOID +RpiPlatformGetVirtualMemoryInfo ( + IN RPI_MEMORY_REGION_INFO** MemoryInfo + ); + +#endif /* __RPI_MEM_H__ */ diff --git a/Platform/RaspberryPi/Library/MemoryInitPeiLib/MemoryInitPeiLib.c b/Platform/RaspberryPi/Library/MemoryInitPeiLib/MemoryInitPeiLib.c index 60cf397f8baa..3a0f7e19e993 100644 --- a/Platform/RaspberryPi/Library/MemoryInitPeiLib/MemoryInitPeiLib.c +++ b/Platform/RaspberryPi/Library/MemoryInitPeiLib/MemoryInitPeiLib.c @@ -15,8 +15,7 @@ #include #include #include - -extern UINT64 mSystemMemoryEnd; +#include VOID BuildMemoryTypeInformationHob ( @@ -39,23 +38,32 @@ InitMmu ( } } +STATIC +VOID +AddBasicMemoryRegion ( + IN ARM_MEMORY_REGION_DESCRIPTOR *Desc +) +{ + BuildResourceDescriptorHob ( + EFI_RESOURCE_SYSTEM_MEMORY, + 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, + Desc->PhysicalBase, + Desc->Length + ); +} + STATIC VOID AddRuntimeServicesRegion ( IN ARM_MEMORY_REGION_DESCRIPTOR *Desc ) { - BuildResourceDescriptorHob ( - EFI_RESOURCE_SYSTEM_MEMORY, - 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, - Desc->PhysicalBase, - Desc->Length - ); + AddBasicMemoryRegion (Desc); BuildMemoryAllocationHob ( Desc->PhysicalBase, @@ -70,17 +78,7 @@ AddReservedMemoryRegion ( IN ARM_MEMORY_REGION_DESCRIPTOR *Desc ) { - BuildResourceDescriptorHob ( - EFI_RESOURCE_SYSTEM_MEMORY, - 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, - Desc->PhysicalBase, - Desc->Length - ); + AddBasicMemoryRegion (Desc); BuildMemoryAllocationHob ( Desc->PhysicalBase, @@ -89,6 +87,12 @@ AddReservedMemoryRegion ( ); } +void (*AddRegion[]) (IN ARM_MEMORY_REGION_DESCRIPTOR *Desc) = { + AddBasicMemoryRegion, + AddRuntimeServicesRegion, + AddReservedMemoryRegion, + }; + /*++ Routine Description: @@ -113,36 +117,28 @@ MemoryPeim ( ) { ARM_MEMORY_REGION_DESCRIPTOR *MemoryTable; + RPI_MEMORY_REGION_INFO *MemoryInfo; + UINTN Index; // Get Virtual Memory Map from the Platform Library ArmPlatformGetVirtualMemoryMap (&MemoryTable); - // Ensure PcdSystemMemorySize has been set - ASSERT (PcdGet64 (PcdSystemMemorySize) != 0); + // Get additional info not provided by MemoryTable + RpiPlatformGetVirtualMemoryInfo (&MemoryInfo); - // FD without variable store - AddReservedMemoryRegion (&MemoryTable[0]); - - // Variable store. - AddRuntimeServicesRegion (&MemoryTable[1]); - - // Trusted Firmware region - AddReservedMemoryRegion (&MemoryTable[2]); - - // Usable memory. - BuildResourceDescriptorHob ( - EFI_RESOURCE_SYSTEM_MEMORY, - 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, - MemoryTable[3].PhysicalBase, - MemoryTable[3].Length - ); - - AddReservedMemoryRegion (&MemoryTable[4]); + // Register each memory region + for (Index = 0; MemoryTable[Index].Length != 0; Index++) { + ASSERT (MemoryInfo[Index].Type < ARRAY_SIZE (AddRegion)); + DEBUG ((DEBUG_INFO, "%s:\n" + "\tPhysicalBase: 0x%lX\n" + "\tVirtualBase: 0x%lX\n" + "\tLength: 0x%lX\n", + MemoryInfo[Index].Name, + MemoryTable[Index].PhysicalBase, + MemoryTable[Index].VirtualBase, + MemoryTable[Index].Length)); + AddRegion[MemoryInfo[Index].Type] (&MemoryTable[Index]); + } // Build Memory Allocation Hob InitMmu (MemoryTable); diff --git a/Platform/RaspberryPi/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf b/Platform/RaspberryPi/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf index 0084c010936d..d39210c7a4f1 100644 --- a/Platform/RaspberryPi/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf +++ b/Platform/RaspberryPi/Library/MemoryInitPeiLib/MemoryInitPeiLib.inf @@ -24,6 +24,7 @@ [Packages] EmbeddedPkg/EmbeddedPkg.dec ArmPkg/ArmPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec + Platform/RaspberryPi/RaspberryPi.dec [LibraryClasses] DebugLib diff --git a/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf b/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf index 85462febdd8d..c0e2a75451c3 100644 --- a/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf +++ b/Platform/RaspberryPi/Library/PlatformLib/PlatformLib.inf @@ -22,6 +22,7 @@ [Packages] EmbeddedPkg/EmbeddedPkg.dec ArmPkg/ArmPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec + Silicon/Broadcom/Bcm27xx/Bcm27xx.dec Silicon/Broadcom/Bcm283x/Bcm283x.dec Platform/RaspberryPi/RaspberryPi.dec @@ -50,10 +51,12 @@ [FixedPcd] gEmbeddedTokenSpaceGuid.PcdDmaDeviceOffset gArmTokenSpaceGuid.PcdSystemMemoryBase gArmTokenSpaceGuid.PcdSystemMemorySize + gRaspberryPiTokenSpaceGuid.PcdExtendedMemoryBase gRaspberryPiTokenSpaceGuid.PcdNvStorageEventLogSize gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize + gBcm27xxTokenSpaceGuid.PcdBcm27xxRegistersAddress gBcm283xTokenSpaceGuid.PcdBcm283xRegistersAddress [Ppis] diff --git a/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c b/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c index 2bfd3f020a6e..1a6a13b9591b 100644 --- a/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c +++ b/Platform/RaspberryPi/Library/PlatformLib/RaspberryPiMem.c @@ -1,7 +1,9 @@ /** @file * + * Copyright (c) 2019, Pete Batard * Copyright (c) 2017-2018, Andrey Warkentin * Copyright (c) 2014, Linaro Limited. All rights reserved. + * Copyright (c) 2013-2018, ARM Limited. All rights reserved. * * SPDX-License-Identifier: BSD-2-Clause-Patent * @@ -9,8 +11,11 @@ #include #include -#include #include +#include +#include +#include +#include UINT64 mSystemMemoryBase; extern UINT64 mSystemMemoryEnd; @@ -18,6 +23,13 @@ UINT64 mVideoCoreBase; UINT64 mVideoCoreSize; UINT32 mBoardRevision; + +// The total number of descriptors, including the final "end-of-table" descriptor. +#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 10 + +STATIC BOOLEAN VirtualMemoryInfoInitialized = FALSE; +STATIC RPI_MEMORY_REGION_INFO VirtualMemoryInfo[MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS]; + #define VariablesSize (FixedPcdGet32(PcdFlashNvStorageVariableSize) + \ FixedPcdGet32(PcdFlashNvStorageFtwWorkingSize) + \ FixedPcdGet32(PcdFlashNvStorageFtwSpareSize) + \ @@ -29,49 +41,6 @@ UINT32 mBoardRevision; #define ATFBase (FixedPcdGet64(PcdFdBaseAddress) + FixedPcdGet32(PcdFdSize)) -STATIC ARM_MEMORY_REGION_DESCRIPTOR RaspberryPiMemoryRegionDescriptor[] = { - { - /* Firmware Volume. */ - FixedPcdGet64 (PcdFdBaseAddress), FixedPcdGet64 (PcdFdBaseAddress), - FixedPcdGet32 (PcdFdSize) - VariablesSize, - ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK - }, - { - /* Variables Volume. */ - VariablesBase, VariablesBase, - VariablesSize, - ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK - }, - { - /* ATF reserved RAM. */ - ATFBase, ATFBase, - FixedPcdGet64 (PcdSystemMemoryBase) - ATFBase, - ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK - }, - { - /* System RAM. */ - FixedPcdGet64 (PcdSystemMemoryBase), FixedPcdGet64 (PcdSystemMemoryBase), - 0, - ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK - }, - { - /* Reserved GPU RAM. */ - 0, - 0, - 0, - ARM_MEMORY_REGION_ATTRIBUTE_DEVICE - }, - { - /* SOC registers. */ - BCM2836_SOC_REGISTERS, - BCM2836_SOC_REGISTERS, - BCM2836_SOC_REGISTER_LENGTH, - ARM_MEMORY_REGION_ATTRIBUTE_DEVICE - }, - { - } -}; - /** Return the Virtual Memory Map of your platform @@ -89,6 +58,11 @@ ArmPlatformGetVirtualMemoryMap ( IN ARM_MEMORY_REGION_DESCRIPTOR** VirtualMemoryMap ) { + UINTN Index = 0; + UINTN GpuIndex; + INT64 ExtendedMemorySize; + ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable; + // Early output of the info we got from VideoCore can prove valuable. DEBUG ((DEBUG_INFO, "Board Rev: 0x%lX\n", mBoardRevision)); DEBUG ((DEBUG_INFO, "Base RAM : 0x%ll08X (Size 0x%ll08X)\n", mSystemMemoryBase, mSystemMemoryEnd + 1)); @@ -97,68 +71,120 @@ ArmPlatformGetVirtualMemoryMap ( ASSERT (mSystemMemoryBase == 0); ASSERT (VirtualMemoryMap != NULL); - RaspberryPiMemoryRegionDescriptor[3].Length = mSystemMemoryEnd + 1 - - FixedPcdGet64 (PcdSystemMemoryBase); - - RaspberryPiMemoryRegionDescriptor[4].PhysicalBase = - RaspberryPiMemoryRegionDescriptor[3].PhysicalBase + - RaspberryPiMemoryRegionDescriptor[3].Length; - - RaspberryPiMemoryRegionDescriptor[4].VirtualBase = - RaspberryPiMemoryRegionDescriptor[4].PhysicalBase; - - RaspberryPiMemoryRegionDescriptor[4].Length = - RaspberryPiMemoryRegionDescriptor[5].PhysicalBase - - RaspberryPiMemoryRegionDescriptor[4].PhysicalBase; - - DEBUG ((DEBUG_INFO, "FD:\n" - "\tPhysicalBase: 0x%lX\n" - "\tVirtualBase: 0x%lX\n" - "\tLength: 0x%lX\n", - RaspberryPiMemoryRegionDescriptor[0].PhysicalBase, - RaspberryPiMemoryRegionDescriptor[0].VirtualBase, - RaspberryPiMemoryRegionDescriptor[0].Length + - RaspberryPiMemoryRegionDescriptor[1].Length)); - - DEBUG ((DEBUG_INFO, "Variables (part of FD):\n" - "\tPhysicalBase: 0x%lX\n" - "\tVirtualBase: 0x%lX\n" - "\tLength: 0x%lX\n", - RaspberryPiMemoryRegionDescriptor[1].PhysicalBase, - RaspberryPiMemoryRegionDescriptor[1].VirtualBase, - RaspberryPiMemoryRegionDescriptor[1].Length)); - - DEBUG ((DEBUG_INFO, "ATF RAM:\n" - "\tPhysicalBase: 0x%lX\n" - "\tVirtualBase: 0x%lX\n" - "\tLength: 0x%lX\n", - RaspberryPiMemoryRegionDescriptor[2].PhysicalBase, - RaspberryPiMemoryRegionDescriptor[2].VirtualBase, - RaspberryPiMemoryRegionDescriptor[2].Length)); - - DEBUG ((DEBUG_INFO, "System RAM:\n" - "\tPhysicalBase: 0x%lX\n" - "\tVirtualBase: 0x%lX\n" - "\tLength: 0x%lX\n", - RaspberryPiMemoryRegionDescriptor[3].PhysicalBase, - RaspberryPiMemoryRegionDescriptor[3].VirtualBase, - RaspberryPiMemoryRegionDescriptor[3].Length)); - - DEBUG ((DEBUG_INFO, "GPU Reserved:\n" - "\tPhysicalBase: 0x%lX\n" - "\tVirtualBase: 0x%lX\n" - "\tLength: 0x%lX\n", - RaspberryPiMemoryRegionDescriptor[4].PhysicalBase, - RaspberryPiMemoryRegionDescriptor[4].VirtualBase, - RaspberryPiMemoryRegionDescriptor[4].Length)); - - DEBUG ((DEBUG_INFO, "SoC reserved:\n" - "\tPhysicalBase: 0x%lX\n" - "\tVirtualBase: 0x%lX\n" - "\tLength: 0x%lX\n", - RaspberryPiMemoryRegionDescriptor[5].PhysicalBase, - RaspberryPiMemoryRegionDescriptor[5].VirtualBase, - RaspberryPiMemoryRegionDescriptor[5].Length)); - - *VirtualMemoryMap = RaspberryPiMemoryRegionDescriptor; + VirtualMemoryTable = (ARM_MEMORY_REGION_DESCRIPTOR*)AllocatePages + (EFI_SIZE_TO_PAGES (sizeof (ARM_MEMORY_REGION_DESCRIPTOR) * + MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS)); + if (VirtualMemoryTable == NULL) { + return; + } + + + // Firmware Volume + VirtualMemoryTable[Index].PhysicalBase = FixedPcdGet64 (PcdFdBaseAddress); + VirtualMemoryTable[Index].VirtualBase = VirtualMemoryTable[Index].PhysicalBase; + VirtualMemoryTable[Index].Length = FixedPcdGet32 (PcdFdSize) - VariablesSize; + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; + VirtualMemoryInfo[Index].Type = RPI_MEM_RESERVED_REGION; + VirtualMemoryInfo[Index++].Name = L"FD"; + + // Variable Volume + VirtualMemoryTable[Index].PhysicalBase = VariablesBase; + VirtualMemoryTable[Index].VirtualBase = VirtualMemoryTable[Index].PhysicalBase; + VirtualMemoryTable[Index].Length = VariablesSize; + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; + VirtualMemoryInfo[Index].Type = RPI_MEM_RUNTIME_REGION; + VirtualMemoryInfo[Index++].Name = L"FD Variables"; + + // TF-A reserved RAM + VirtualMemoryTable[Index].PhysicalBase = ATFBase; + VirtualMemoryTable[Index].VirtualBase = VirtualMemoryTable[Index].PhysicalBase; + VirtualMemoryTable[Index].Length = FixedPcdGet64 (PcdSystemMemoryBase) - ATFBase; + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; + VirtualMemoryInfo[Index].Type = RPI_MEM_RESERVED_REGION; + VirtualMemoryInfo[Index++].Name = L"TF-A RAM"; + + // Base System RAM + VirtualMemoryTable[Index].PhysicalBase = FixedPcdGet64 (PcdSystemMemoryBase); + VirtualMemoryTable[Index].VirtualBase = VirtualMemoryTable[Index].PhysicalBase; + VirtualMemoryTable[Index].Length = mSystemMemoryEnd + 1 - FixedPcdGet64 (PcdSystemMemoryBase); + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; + VirtualMemoryInfo[Index].Type = RPI_MEM_BASIC_REGION; + VirtualMemoryInfo[Index++].Name = L"Base System RAM"; + + // GPU Reserved + GpuIndex = Index; + VirtualMemoryTable[Index].PhysicalBase = mVideoCoreBase; + VirtualMemoryTable[Index].VirtualBase = VirtualMemoryTable[Index].PhysicalBase; + VirtualMemoryTable[Index].Length = mVideoCoreSize; + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; + VirtualMemoryInfo[Index].Type = RPI_MEM_RESERVED_REGION; + VirtualMemoryInfo[Index++].Name = L"GPU Reserved"; + + // Compute the amount of extended RAM available on this platform + ExtendedMemorySize = SIZE_256MB; + ExtendedMemorySize <<= (mBoardRevision >> 20) & 0x07; + ExtendedMemorySize -= SIZE_1GB; + if (ExtendedMemorySize > 0) { + VirtualMemoryTable[Index].PhysicalBase = FixedPcdGet64 (PcdExtendedMemoryBase); + VirtualMemoryTable[Index].VirtualBase = VirtualMemoryTable[Index].PhysicalBase; + VirtualMemoryTable[Index].Length = ExtendedMemorySize; + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; + VirtualMemoryInfo[Index].Type = RPI_MEM_BASIC_REGION; + VirtualMemoryInfo[Index++].Name = L"Extended System RAM"; + } + + // Extended SoC registers (PCIe, genet, ...) + if (BCM2711_SOC_REGISTERS > 0) { + VirtualMemoryTable[Index].PhysicalBase = BCM2711_SOC_REGISTERS; + VirtualMemoryTable[Index].VirtualBase = VirtualMemoryTable[Index].PhysicalBase; + VirtualMemoryTable[Index].Length = BCM2711_SOC_REGISTER_LENGTH; + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; + VirtualMemoryInfo[Index].Type = RPI_MEM_RESERVED_REGION; + VirtualMemoryInfo[Index++].Name = L"SoC Reserved (27xx)"; + } + + // Base SoC registers + VirtualMemoryTable[Index].PhysicalBase = BCM2836_SOC_REGISTERS; + // On the Pi 3 the SoC registers may overlap VideoCore => fix this + if (VirtualMemoryTable[GpuIndex].PhysicalBase + VirtualMemoryTable[GpuIndex].Length > VirtualMemoryTable[Index].PhysicalBase) { + VirtualMemoryTable[GpuIndex].Length = VirtualMemoryTable[Index].PhysicalBase - VirtualMemoryTable[GpuIndex].PhysicalBase; + } + VirtualMemoryTable[Index].VirtualBase = VirtualMemoryTable[Index].PhysicalBase; + VirtualMemoryTable[Index].Length = BCM2836_SOC_REGISTER_LENGTH; + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE; + VirtualMemoryInfo[Index].Type = RPI_MEM_RESERVED_REGION; + VirtualMemoryInfo[Index++].Name = L"SoC Reserved (283x)"; + + // End of Table + VirtualMemoryTable[Index].PhysicalBase = 0; + VirtualMemoryTable[Index].VirtualBase = 0; + VirtualMemoryTable[Index].Length = 0; + VirtualMemoryTable[Index++].Attributes = (ARM_MEMORY_REGION_ATTRIBUTES)0; + + ASSERT(Index <= MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS); + + *VirtualMemoryMap = VirtualMemoryTable; + VirtualMemoryInfoInitialized = TRUE; +} + +/** + Return additional memory info not populated by the above call. + + This call should follow the one to ArmPlatformGetVirtualMemoryMap (). + +**/ +VOID +RpiPlatformGetVirtualMemoryInfo ( + IN RPI_MEMORY_REGION_INFO** MemoryInfo + ) +{ + ASSERT (VirtualMemoryInfo != NULL); + + if (!VirtualMemoryInfoInitialized) { + DEBUG ((DEBUG_ERROR, + "ArmPlatformGetVirtualMemoryMap must be called before RpiPlatformGetVirtualMemoryInfo.\n")); + return; + } + + *MemoryInfo = VirtualMemoryInfo; } diff --git a/Platform/RaspberryPi/RaspberryPi.dec b/Platform/RaspberryPi/RaspberryPi.dec index 3e9171eccb13..c7e17350544a 100644 --- a/Platform/RaspberryPi/RaspberryPi.dec +++ b/Platform/RaspberryPi/RaspberryPi.dec @@ -42,6 +42,7 @@ [PcdsFixedAtBuild.common] gRaspberryPiTokenSpaceGuid.PcdNvStorageVariableBase|0x0|UINT32|0x00000005 gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwSpareBase|0x0|UINT32|0x00000006 gRaspberryPiTokenSpaceGuid.PcdNvStorageFtwWorkingBase|0x0|UINT32|0x00000007 + gRaspberryPiTokenSpaceGuid.PcdExtendedMemoryBase|0x0|UINT32|0x00000008 [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx] gRaspberryPiTokenSpaceGuid.PcdCpuClock|0|UINT32|0x0000000d -- 2.21.0.windows.1