The reserved region for storing performance data is allocated below 4 GB,
so that its contents are accessible from PEI upon S3 resume. However, this
is a X64 pecularity, and on AARCH64 systems, which does not have this
restriction (nor does it have S3, btw), this limit may cause the allocation
to fail (if the platform does not have memory below 4 GB) or needlessly
fragment the memory map if it does succeed.

So make this behavior conditional, based on the new PcdPeiAllocMemLimit4GB
PCD, which defaults to TRUE, but can be overridden by platforms if they
prefer allocations of PEI accessible memory to be served from anywhere.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <[email protected]>
---
 IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec |  6 ++++++
 IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf |  7 ++++---
 IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c | 13 +++++++++++--
 3 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec 
b/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
index 8bbde8e2c9c8..005d356f5938 100644
--- a/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
+++ b/IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
@@ -161,6 +161,12 @@ [PcdsFeatureFlag]
   # @Prompt Enable Boot Logo only
   
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBootlogoOnlyEnable|FALSE|BOOLEAN|0x00010048
 
+  ## Indicates whether allocations for PEI accessible memory should be below 
the 4 GB mark
+  #   TRUE  - PEI accessible memory should be allocated below 4 GB.<BR>
+  #   FALSE - PEI accessible memory may be allocated anywhere.<BR>
+  # @Prompt Allocated PEI accessible memory below 4 GB
+  
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPeiAllocMemLimit4GB|TRUE|BOOLEAN|0x00010049
+
 [PcdsFixedAtBuild, PcdsPatchableInModule]
   ## FFS filename to find the default BMP Logo file.
   # @Prompt FFS Name of Boot Logo File
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf 
b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
index 6afb8a09df9c..fa210836f410 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
@@ -181,9 +181,10 @@ [Protocols]
   gEdkiiVariableLockProtocolGuid                ## SOMETIMES_CONSUMES
 
 [FeaturePcd]
-  gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate    ## CONSUMES
-  gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport                   ## CONSUMES
-  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBootlogoOnlyEnable ## CONSUMES
+  gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangDeprecate      ## CONSUMES
+  gEfiMdePkgTokenSpaceGuid.PcdUgaConsumeSupport                     ## CONSUMES
+  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdBootlogoOnlyEnable   ## CONSUMES
+  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPeiAllocMemLimit4GB  ## CONSUMES
 
 [Pcd]
   gEfiMdePkgTokenSpaceGuid.PcdUefiVariableDefaultLangCodes          ## 
SOMETIMES_CONSUMES
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c 
b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
index ae7ad2153c51..3b524db94b3d 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
@@ -474,14 +474,23 @@ BdsAllocateMemoryForPerformanceData (
   EFI_STATUS                    Status;
   EFI_PHYSICAL_ADDRESS          AcpiLowMemoryBase;
   EDKII_VARIABLE_LOCK_PROTOCOL  *VariableLock;
+  EFI_ALLOCATE_TYPE             AllocType;
 
-  AcpiLowMemoryBase = 0x0FFFFFFFFULL;
+  //
+  // The memory we allocate here must be accessible from PEI at resume.
+  //
+  if (FeaturePcdGet (PcdPeiAllocMemLimit4GB)) {
+    AcpiLowMemoryBase = 0x0FFFFFFFFULL;
+    AllocType = AllocateMaxAddress;
+  } else {
+    AllocType = AllocateAnyPages;
+  }
 
   //
   // Allocate a block of memory that will contain performance data to OS.
   //
   Status = gBS->AllocatePages (
-                  AllocateMaxAddress,
+                  AllocType,
                   EfiReservedMemoryType,
                   EFI_SIZE_TO_PAGES (PERF_DATA_MAX_LENGTH),
                   &AcpiLowMemoryBase
-- 
2.5.0

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to