From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by mx.groups.io with SMTP id smtpd.web11.8544.1574098469357797090 for ; Mon, 18 Nov 2019 09:34:30 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@akeo-ie.20150623.gappssmtp.com header.s=20150623 header.b=LVgeFZjm; spf=none, err=permanent DNS error (domain: akeo.ie, ip: 209.85.128.65, mailfrom: pete@akeo.ie) Received: by mail-wm1-f65.google.com with SMTP id z26so138477wmi.4 for ; Mon, 18 Nov 2019 09:34:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=akeo-ie.20150623.gappssmtp.com; s=20150623; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=7wxmcK7a6OFJEAPpByHm1gOmDDra6cbhZJmEm9j29NY=; b=LVgeFZjm/gRxeRArscn5AEuDCcv6PBj6nHdfTvfonlJ09fmMfrzjMmMBx7W+wVw7Vn jmZlks4VTz5w3UsWYkAbrWO58OUwSYDwckobTfCsJNzEG22WHaKWj4aGhNXJ8YCoeUFe RzjrO9dKWEPTJr65yCxjr/R1bM1ZrvuzlaYwwfJ6r105FAEMA1L+vwZ0bELDjR78r1Ag qTcw8nKjJlIxxkKsUpR+s4VudvD9Q44ZPb4zwh/zrW9SgV2B+NrtbD+PL3sKu8JpecYe bYiJmUeKSPqQlP4oW1E17+QsHn1K18GKCEmrhBLox22MK6N8tsC3AUrTbE+IKdel/Enn cNLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=7wxmcK7a6OFJEAPpByHm1gOmDDra6cbhZJmEm9j29NY=; b=Lim6mIPpZuw97fHMJjwF+iuiObQJn/2zjChiLEa7DdkDzORlHx3YWeiHMulJxn6P8K o0WTNMtFOQQthQLmHJLIikccLCzvrBvU8kD0brDRVPF/0Y/EQtR25P3uG7/y8B8HVOJH iI7zOIP+ljFtVAprQdDm0SzhMbwxV4eQU+gJHl20fMhUnTLZ6dlHyGiZn9vmHXSEtZzL MtjJUtOmcl8i+O+Uc/G5GurMZb9bx+o0E4VQkTyvgs+K8D9eZsFty4uQ6jC6Mzxoh0TN AgJMNcwU6qwq4TTrEmoSP64Ubab/F3PPlxq/27lqLcdDkNK7TUf1sLZ8YxAskPkwp9Ou C8Mg== X-Gm-Message-State: APjAAAXwdZgDLmR+IvtxgoLl1T0lIdN4bRLWv7A+SXN058D1biylxbPJ jxSK0ywEW5P8mNSC4b4ZJXbPsA== X-Google-Smtp-Source: APXvYqzA07Cf3MzW4FB+2n9BrnRNHZZ3RNISkDDAvUDadXbeM3AfRJKWYei3f7lRlMput1H5pd0Q0Q== X-Received: by 2002:a1c:2bc2:: with SMTP id r185mr150942wmr.91.1574098467523; Mon, 18 Nov 2019 09:34:27 -0800 (PST) Return-Path: Received: from [10.0.0.122] ([84.203.67.47]) by smtp.googlemail.com with ESMTPSA id q17sm84292wmj.12.2019.11.18.09.34.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Nov 2019 09:34:26 -0800 (PST) Subject: Re: [edk2-platforms][PATCH 5/8] Platform/RPi: Clean up and improve early memory init To: Leif Lindholm Cc: devel@edk2.groups.io, ard.biesheuvel@linaro.org, philmd@redhat.com References: <20191114160740.10072-1-pete@akeo.ie> <20191114160740.10072-6-pete@akeo.ie> <20191118172059.GT7323@bivouac.eciton.net> From: "Pete Batard" Message-ID: <3f9be1ea-db97-1ca8-ed20-e0b3fa211825@akeo.ie> Date: Mon, 18 Nov 2019 17:34:25 +0000 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.9.1 MIME-Version: 1.0 In-Reply-To: <20191118172059.GT7323@bivouac.eciton.net> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 7bit Hi Leif, On 2019.11.18 17:20, Leif Lindholm wrote: > On Thu, Nov 14, 2019 at 04:07:37PM +0000, Pete Batard wrote: >> 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. > > Minor style comments and one copyright question below. > >> 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__ > > As mentioned for earlier patch, please drop leading __. Will do. I assume this applies to trailing __ as well. >> + >> +#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. > > This confuses me slightly - is it an indication that some code has > been copied from a file including this copyright? It is. I copy/pasted some code from ArmJunoMem.c that had this copyright, which I then proceeded to modify. Hence the reason why you find the copyright notice. > >> * >> * SPDX-License-Identifier: BSD-2-Clause-Patent >> * >> @@ -9,8 +11,11 @@ >> >> #include >> #include >> -#include >> #include >> +#include >> +#include > > Could you move MemoryAllocationLib.h above PcdLib.h? Will do. I will also take into account comments for the other patches wrt to alphabetical order for the PCDs as well as the additional comment for x1 in the assembly before submitting a v2. Regards, /Pete > > / > Leif > >> +#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 >>