]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: Add support for memory above 4GB
authorjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 21 Jan 2011 16:51:00 +0000 (16:51 +0000)
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 21 Jan 2011 16:51:00 +0000 (16:51 +0000)
When QEMU has more than 3.5GB of RAM, it will map the
additional memory above 4GB.  This change will make that
RAM accessible to OVMF.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11266 6f19259b-4bc3-4df7-8a09-765794883524

OvmfPkg/PlatformPei/MemDetect.c
OvmfPkg/PlatformPei/Platform.c
OvmfPkg/PlatformPei/Platform.h

index 9a82cc79d04e241fb420b03d6f4c9475fcfa3ae1..78b43d22b75f5bb2c641f6ad86eaf2a4f25802b1 100644 (file)
@@ -36,7 +36,7 @@ Module Name:
 \r
 STATIC\r
 UINTN\r
-GetSystemMemorySize (\r
+GetSystemMemorySizeBelow4gb (\r
   )\r
 {\r
   UINT8 Cmos0x34;\r
@@ -58,6 +58,31 @@ GetSystemMemorySize (
 }\r
 \r
 \r
+STATIC\r
+UINT64\r
+GetSystemMemorySizeAbove4gb (\r
+  )\r
+{\r
+  UINT32 Size;\r
+  UINTN  CmosIndex;\r
+\r
+  //\r
+  // CMOS 0x5b-0x5d specifies the system memory above 4GB MB.\r
+  // * CMOS(0x5d) is the most significant size byte\r
+  // * CMOS(0x5c) is the middle size byte\r
+  // * CMOS(0x5b) is the least significant size byte\r
+  // * The size is specified in 64kb chunks\r
+  //\r
+\r
+  Size = 0;\r
+  for (CmosIndex = 0x5d; CmosIndex >= 0x5b; CmosIndex--) {\r
+    Size = (UINT32) (Size << 8) + (UINT32) CmosRead8 (CmosIndex);\r
+  }\r
+\r
+  return LShiftU64 (Size, 16);\r
+}\r
+\r
+\r
 /**\r
   Peform Memory Detection\r
 \r
@@ -71,23 +96,25 @@ MemDetect (
   EFI_STATUS                  Status;\r
   EFI_PHYSICAL_ADDRESS        MemoryBase;\r
   UINT64                      MemorySize;\r
-  UINT64                      TotalMemorySize;\r
+  UINT64                      LowerMemorySize;\r
+  UINT64                      UpperMemorySize;\r
 \r
   DEBUG ((EFI_D_ERROR, "MemDetect called\n"));\r
 \r
   //\r
   // Determine total memory size available\r
   //\r
-  TotalMemorySize = (UINT64)GetSystemMemorySize ();\r
+  LowerMemorySize = GetSystemMemorySizeBelow4gb ();\r
+  UpperMemorySize = GetSystemMemorySizeAbove4gb ();\r
 \r
   //\r
   // Determine the range of memory to use during PEI\r
   //\r
   MemoryBase = PcdGet32 (PcdOvmfMemFvBase) + PcdGet32 (PcdOvmfMemFvSize);\r
-  MemorySize = TotalMemorySize - MemoryBase;\r
-  if (MemorySize > SIZE_16MB) {\r
-    MemoryBase = TotalMemorySize - SIZE_16MB;\r
-    MemorySize = SIZE_16MB;\r
+  MemorySize = LowerMemorySize - MemoryBase;\r
+  if (MemorySize > SIZE_64MB) {\r
+    MemoryBase = LowerMemorySize - SIZE_64MB;\r
+    MemorySize = SIZE_64MB;\r
   }\r
 \r
   //\r
@@ -103,6 +130,10 @@ MemDetect (
   AddMemoryRangeHob (BASE_1MB, MemoryBase);\r
   AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);\r
 \r
+  if (UpperMemorySize != 0) {\r
+    AddUntestedMemoryBaseSizeHob (BASE_4GB, UpperMemorySize);\r
+  }\r
+\r
   return MemoryBase + MemorySize;\r
 }\r
 \r
index 66bb0984c864e8c44538496367d9a05214d8625d..fe25486fa4afa668ea3483f237d4a4786dc6274b 100644 (file)
@@ -103,6 +103,37 @@ AddMemoryRangeHob (
   AddMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase));\r
 }\r
 \r
+\r
+VOID\r
+AddUntestedMemoryBaseSizeHob (\r
+  EFI_PHYSICAL_ADDRESS        MemoryBase,\r
+  UINT64                      MemorySize\r
+  )\r
+{\r
+  BuildResourceDescriptorHob (\r
+    EFI_RESOURCE_SYSTEM_MEMORY,\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
+    MemoryBase,\r
+    MemorySize\r
+    );\r
+}\r
+\r
+\r
+VOID\r
+AddUntestedMemoryRangeHob (\r
+  EFI_PHYSICAL_ADDRESS        MemoryBase,\r
+  EFI_PHYSICAL_ADDRESS        MemoryLimit\r
+  )\r
+{\r
+  AddUntestedMemoryBaseSizeHob (MemoryBase, (UINT64)(MemoryLimit - MemoryBase));\r
+}\r
+\r
+\r
 VOID\r
 MemMapInitialization (\r
   EFI_PHYSICAL_ADDRESS  TopOfMemory\r
index 0829f89d3b6fc61837043d6bbf6ea8cda59cfaf7..3e5dca2ce7002604fdde1bad691cb6f886377ac7 100644 (file)
@@ -39,6 +39,18 @@ AddMemoryRangeHob (
   EFI_PHYSICAL_ADDRESS        MemoryLimit\r
   );\r
 \r
+VOID\r
+AddUntestedMemoryBaseSizeHob (\r
+  EFI_PHYSICAL_ADDRESS        MemoryBase,\r
+  UINT64                      MemorySize\r
+  );\r
+\r
+VOID\r
+AddUntestedMemoryRangeHob (\r
+  EFI_PHYSICAL_ADDRESS        MemoryBase,\r
+  EFI_PHYSICAL_ADDRESS        MemoryLimit\r
+  );\r
+\r
 EFI_PHYSICAL_ADDRESS\r
 MemDetect (\r
   VOID\r