diff options
author | Shannon Zhao <shannon.zhao@linaro.org> | 2015-12-04 16:17:12 +0000 |
---|---|---|
committer | lersek <lersek@Edk2> | 2015-12-04 16:17:12 +0000 |
commit | 45f9bb91b037f87c4853cac58457d2abc958829f (patch) | |
tree | 7402ee21d93b37f6f1d61650c862c5572f9fc803 /ArmVirtPkg | |
parent | 17247f53d59077ca04dea27e848c409d065eb478 (diff) | |
download | edk2-platforms-45f9bb91b037f87c4853cac58457d2abc958829f.tar.xz |
ArmVirtPkg: ArmVirtPlatformLib: find the lowest memory node
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
Diffstat (limited to 'ArmVirtPkg')
-rw-r--r-- | ArmVirtPkg/Library/ArmVirtPlatformLib/Virt.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/ArmVirtPkg/Library/ArmVirtPlatformLib/Virt.c b/ArmVirtPkg/Library/ArmVirtPlatformLib/Virt.c index 17f2686975..7a0fc0e75e 100644 --- a/ArmVirtPkg/Library/ArmVirtPlatformLib/Virt.c +++ b/ArmVirtPkg/Library/ArmVirtPlatformLib/Virt.c @@ -72,8 +72,8 @@ ArmPlatformInitializeSystemMemory ( {
VOID *DeviceTreeBase;
INT32 Node, Prev;
- UINT64 NewBase;
- UINT64 NewSize;
+ UINT64 NewBase, CurBase;
+ UINT64 NewSize, CurSize;
CONST CHAR8 *Type;
INT32 Len;
CONST UINT64 *RegProp;
@@ -90,7 +90,7 @@ ArmPlatformInitializeSystemMemory ( ASSERT (fdt_check_header (DeviceTreeBase) == 0);
//
- // Look for a memory node
+ // Look for the lowest memory node
//
for (Prev = 0;; Prev = Node) {
Node = fdt_next_node (DeviceTreeBase, Prev, NULL);
@@ -110,26 +110,30 @@ ArmPlatformInitializeSystemMemory ( RegProp = fdt_getprop (DeviceTreeBase, Node, "reg", &Len);
if (RegProp != 0 && Len == (2 * sizeof (UINT64))) {
- NewBase = fdt64_to_cpu (ReadUnaligned64 (RegProp));
- NewSize = fdt64_to_cpu (ReadUnaligned64 (RegProp + 1));
-
- //
- // Make sure the start of DRAM matches our expectation
- //
- ASSERT (FixedPcdGet64 (PcdSystemMemoryBase) == NewBase);
- PcdSet64 (PcdSystemMemorySize, NewSize);
+ CurBase = fdt64_to_cpu (ReadUnaligned64 (RegProp));
+ CurSize = fdt64_to_cpu (ReadUnaligned64 (RegProp + 1));
DEBUG ((EFI_D_INFO, "%a: System RAM @ 0x%lx - 0x%lx\n",
- __FUNCTION__, NewBase, NewBase + NewSize - 1));
+ __FUNCTION__, CurBase, CurBase + CurSize - 1));
+
+ if (NewBase > CurBase || NewBase == 0) {
+ NewBase = CurBase;
+ NewSize = CurSize;
+ }
} else {
DEBUG ((EFI_D_ERROR, "%a: Failed to parse FDT memory node\n",
__FUNCTION__));
}
- break;
}
}
//
+ // Make sure the start of DRAM matches our expectation
+ //
+ ASSERT (FixedPcdGet64 (PcdSystemMemoryBase) == NewBase);
+ PcdSet64 (PcdSystemMemorySize, NewSize);
+
+ //
// We need to make sure that the machine we are running on has at least
// 128 MB of memory configured, and is currently executing this binary from
// NOR flash. This prevents a device tree image in DRAM from getting
|