]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.c
ArmVirtPkg/MemoryInitPeiLib: split memory HOB based on MAX_ALLOC_ADDRESS
[mirror_edk2.git] / ArmVirtPkg / Library / ArmVirtMemoryInitPeiLib / ArmVirtMemoryInitPeiLib.c
index 8ce63b4596e2c08148116031e48729ebf219fb5e..66925fc05ebd29511c3470658ad298785d1dec5e 100644 (file)
@@ -15,7 +15,8 @@
 \r
 #include <PiPei.h>\r
 \r
-#include <Library/ArmPlatformLib.h>\r
+#include <Library/ArmMmuLib.h>\r
+#include <Library/ArmVirtMemInfoLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/HobLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
@@ -38,7 +39,7 @@ InitMmu (
   RETURN_STATUS                 Status;\r
 \r
   // Get Virtual Memory Map from the Platform Library\r
-  ArmPlatformGetVirtualMemoryMap (&MemoryTable);\r
+  ArmVirtGetMemoryMap (&MemoryTable);\r
 \r
   //Note: Because we called PeiServicesInstallPeiMemory() before to call InitMmu() the MMU Page Table resides in\r
   //      DRAM (even at the top of DRAM as it is the first permanent memory allocation)\r
@@ -56,6 +57,7 @@ MemoryPeim (
   )\r
 {\r
   EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttributes;\r
+  UINT64                      SystemMemoryTop;\r
 \r
   // Ensure PcdSystemMemorySize has been set\r
   ASSERT (PcdGet64 (PcdSystemMemorySize) != 0);\r
@@ -66,19 +68,34 @@ MemoryPeim (
   ResourceAttributes = (\r
       EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
       EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
-      EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE |\r
-      EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE |\r
-      EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE |\r
       EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE |\r
       EFI_RESOURCE_ATTRIBUTE_TESTED\r
   );\r
 \r
-  BuildResourceDescriptorHob (\r
-      EFI_RESOURCE_SYSTEM_MEMORY,\r
-      ResourceAttributes,\r
-      PcdGet64 (PcdSystemMemoryBase),\r
-      PcdGet64 (PcdSystemMemorySize)\r
-  );\r
+  SystemMemoryTop = PcdGet64 (PcdSystemMemoryBase) +\r
+                    PcdGet64 (PcdSystemMemorySize);\r
+\r
+  if (SystemMemoryTop - 1 > MAX_ALLOC_ADDRESS) {\r
+    BuildResourceDescriptorHob (\r
+        EFI_RESOURCE_SYSTEM_MEMORY,\r
+        ResourceAttributes,\r
+        PcdGet64 (PcdSystemMemoryBase),\r
+        (UINT64)MAX_ALLOC_ADDRESS - PcdGet64 (PcdSystemMemoryBase) + 1\r
+        );\r
+    BuildResourceDescriptorHob (\r
+        EFI_RESOURCE_SYSTEM_MEMORY,\r
+        ResourceAttributes,\r
+        (UINT64)MAX_ALLOC_ADDRESS + 1,\r
+        SystemMemoryTop - MAX_ALLOC_ADDRESS - 1\r
+        );\r
+  } else {\r
+    BuildResourceDescriptorHob (\r
+        EFI_RESOURCE_SYSTEM_MEMORY,\r
+        ResourceAttributes,\r
+        PcdGet64 (PcdSystemMemoryBase),\r
+        PcdGet64 (PcdSystemMemorySize)\r
+        );\r
+  }\r
 \r
   //\r
   // When running under virtualization, the PI/UEFI memory region may be\r