On 29 November 2015 at 07:31, Shannon Zhao <zhaoshengl...@huawei.com> wrote: > From: Shannon Zhao <shannon.z...@linaro.org> > > If there are more than one /memory nodes in FDT, it needs to find the > lowest one, and set PcdSystemMemorySize with thes size of this node. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Shannon Zhao <shannon.z...@linaro.org> > --- > ArmVirtPkg/Library/ArmVirtPlatformLib/Virt.c | 30 > ++++++++++++++++------------ > 1 file changed, 17 insertions(+), 13 deletions(-) > > diff --git a/ArmVirtPkg/Library/ArmVirtPlatformLib/Virt.c > b/ArmVirtPkg/Library/ArmVirtPlatformLib/Virt.c > index 17f2686..7a0fc0e 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; > + }
I wonder if it would not make more sense to search for the memory node whose base == FixedPcdGet64 (PcdSystemMemoryBase) directly, rather than find the lowest one and ASSERT() that it is the one we are looking for. > } 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 > -- > 2.0.4 > > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel