ArmVirtPkg: ArmVirtPlatformLib: find the lowest memory node
authorShannon Zhao <shannon.zhao@linaro.org>
Fri, 4 Dec 2015 16:17:12 +0000 (16:17 +0000)
committerlersek <lersek@Edk2>
Fri, 4 Dec 2015 16:17:12 +0000 (16:17 +0000)
While QEMU NUMA support on ARM will introduce more than one /memory node
in the device tree, it needs to find the lowest one and set
PcdSystemMemorySize with the actual size of this memory node.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Shannon Zhao <shannon.zhao@linaro.org>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19123 6f19259b-4bc3-4df7-8a09-765794883524

ArmVirtPkg/Library/ArmVirtPlatformLib/Virt.c

index 17f2686975831d11c9d36fde87dbb436b7807c77..7a0fc0e75e37c6c48709c1df2e9fc95eaa0ed321 100644 (file)
@@ -72,8 +72,8 @@ ArmPlatformInitializeSystemMemory (
 {\r
   VOID         *DeviceTreeBase;\r
   INT32        Node, Prev;\r
-  UINT64       NewBase;\r
-  UINT64       NewSize;\r
+  UINT64       NewBase, CurBase;\r
+  UINT64       NewSize, CurSize;\r
   CONST CHAR8  *Type;\r
   INT32        Len;\r
   CONST UINT64 *RegProp;\r
@@ -90,7 +90,7 @@ ArmPlatformInitializeSystemMemory (
   ASSERT (fdt_check_header (DeviceTreeBase) == 0);\r
 \r
   //\r
-  // Look for a memory node\r
+  // Look for the lowest memory node\r
   //\r
   for (Prev = 0;; Prev = Node) {\r
     Node = fdt_next_node (DeviceTreeBase, Prev, NULL);\r
@@ -110,25 +110,29 @@ ArmPlatformInitializeSystemMemory (
       RegProp = fdt_getprop (DeviceTreeBase, Node, "reg", &Len);\r
       if (RegProp != 0 && Len == (2 * sizeof (UINT64))) {\r
 \r
-        NewBase = fdt64_to_cpu (ReadUnaligned64 (RegProp));\r
-        NewSize = fdt64_to_cpu (ReadUnaligned64 (RegProp + 1));\r
-\r
-        //\r
-        // Make sure the start of DRAM matches our expectation\r
-        //\r
-        ASSERT (FixedPcdGet64 (PcdSystemMemoryBase) == NewBase);\r
-        PcdSet64 (PcdSystemMemorySize, NewSize);\r
+        CurBase = fdt64_to_cpu (ReadUnaligned64 (RegProp));\r
+        CurSize = fdt64_to_cpu (ReadUnaligned64 (RegProp + 1));\r
 \r
         DEBUG ((EFI_D_INFO, "%a: System RAM @ 0x%lx - 0x%lx\n",\r
-               __FUNCTION__, NewBase, NewBase + NewSize - 1));\r
+               __FUNCTION__, CurBase, CurBase + CurSize - 1));\r
+\r
+        if (NewBase > CurBase || NewBase == 0) {\r
+          NewBase = CurBase;\r
+          NewSize = CurSize;\r
+        }\r
       } else {\r
         DEBUG ((EFI_D_ERROR, "%a: Failed to parse FDT memory node\n",\r
                __FUNCTION__));\r
       }\r
-      break;\r
     }\r
   }\r
 \r
+  //\r
+  // Make sure the start of DRAM matches our expectation\r
+  //\r
+  ASSERT (FixedPcdGet64 (PcdSystemMemoryBase) == NewBase);\r
+  PcdSet64 (PcdSystemMemorySize, NewSize);\r
+\r
   //\r
   // We need to make sure that the machine we are running on has at least\r
   // 128 MB of memory configured, and is currently executing this binary from\r