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]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to