{\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
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
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