From: Guodong Xu <[email protected]> On 32-bit builds 'ulong' is only 32 bits wide, so the memory map truncates any address or size at or above 4 GiB even though the columns already allow 13 hex digits. Boards with large DRAM therefore print wrong bases, sizes and gaps.
Use phys_addr_t for every region address and print it as a 64-bit value so the map is correct regardless of the build's long width. Signed-off-by: Guodong Xu <[email protected]> Signed-off-by: Raymond Mao <[email protected]> --- cmd/meminfo.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/cmd/meminfo.c b/cmd/meminfo.c index 69a5b1b51a2..537ef2a0e13 100644 --- a/cmd/meminfo.c +++ b/cmd/meminfo.c @@ -21,18 +21,23 @@ void __weak arch_dump_mem_attrs(void) { } -static void print_region(const char *name, ulong base, ulong size, ulong *uptop) +static void print_region(const char *name, phys_addr_t base, phys_addr_t size, + phys_addr_t *uptop) { - ulong end = base + size; + phys_addr_t end = base + size; - printf("%-12s %13lx %13lx %13lx", name, base, size, end); + printf("%-12s %13llx %13llx %13llx", + name, + (unsigned long long)base, + (unsigned long long)size, + (unsigned long long)end); if (*uptop) - printf(" %13lx", *uptop - end); + printf(" %13llx", (unsigned long long)(*uptop - end)); putc('\n'); *uptop = base; } -static void show_lmb(const struct lmb *lmb, ulong *uptop) +static void show_lmb(const struct lmb *lmb, phys_addr_t *uptop) { int i; @@ -56,7 +61,7 @@ static void show_lmb(const struct lmb *lmb, ulong *uptop) static int do_meminfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { - ulong upto, stk_bot; + phys_addr_t upto, stk_bot; puts("DRAM: "); print_size(gd->ram_size, "\n"); -- 2.25.1

