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 <p...@akeo.ie> > --- > 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 <p...@akeo.ie> > + * > + * SPDX-License-Identifier: BSD-2-Clause-Patent > + * > + **/ > + > +#ifndef __RPI_MEM_H__ > +#define __RPI_MEM_H__ As mentioned for earlier patch, please drop leading __. > + > +#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 <Library/HobLib.h> > #include <Library/MemoryAllocationLib.h> > #include <Library/PcdLib.h> > - > -extern UINT64 mSystemMemoryEnd; > +#include <Library/RPiMem.h> > > 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 <p...@akeo.ie> > * Copyright (c) 2017-2018, Andrey Warkentin <andrey.warken...@gmail.com> > * 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? > * > * SPDX-License-Identifier: BSD-2-Clause-Patent > * > @@ -9,8 +11,11 @@ > > #include <Library/ArmPlatformLib.h> > #include <Library/DebugLib.h> > -#include <IndustryStandard/Bcm2836.h> > #include <Library/PcdLib.h> > +#include <Library/RPiMem.h> > +#include <Library/MemoryAllocationLib.h> Could you move MemoryAllocationLib.h above PcdLib.h? / Leif > +#include <IndustryStandard/Bcm2711.h> > +#include <IndustryStandard/Bcm2836.h> > > 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 > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#50839): https://edk2.groups.io/g/devel/message/50839 Mute This Topic: https://groups.io/mt/57792636/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-