From: Shannon Zhao Date: Fri, 4 Dec 2015 16:17:12 +0000 (+0000) Subject: ArmVirtPkg: ArmVirtPlatformLib: find the lowest memory node X-Git-Tag: edk2-stable201903~8381 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=45f9bb91b037f87c4853cac58457d2abc958829f;hp=17247f53d59077ca04dea27e848c409d065eb478 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 Reviewed-by: Laszlo Ersek git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19123 6f19259b-4bc3-4df7-8a09-765794883524 --- 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,25 +110,29 @@ 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