Merge patch series "Allow showing the memory map"

Simon Glass <sjg@chromium.org> says:

This little series adds a new 'memmap' command, intended to show the
layout of memory within U-Boot and how much memory is available for
loading images.

Link: https://lore.kernel.org/r/20241021081934.289473-1-sjg@chromium.org
This commit is contained in:
Tom Rini
2024-10-25 14:22:36 -06:00
17 changed files with 347 additions and 42 deletions

View File

@@ -885,9 +885,21 @@ config MD5SUM_VERIFY
config CMD_MEMINFO
bool "meminfo"
default y if SANDBOX
help
Display memory information.
config CMD_MEMINFO_MAP
bool "- with memory map"
depends on CMD_MEMINFO
default y if SANDBOX
help
Shows a memory map, in addition to just the DRAM size. This allows
seeing where U-Boot's memory area is, at the top of DRAM, as well as
detail about each piece of it.
See doc/usage/cmd/meminfo.rst for more information.
config CMD_MEMORY
bool "md, mm, nm, mw, cp, cmp, base, loop"
default y

View File

@@ -109,6 +109,7 @@ obj-$(CONFIG_CMD_LOG) += log.o
obj-$(CONFIG_CMD_LSBLK) += lsblk.o
obj-$(CONFIG_CMD_MD5SUM) += md5sum.o
obj-$(CONFIG_CMD_MEMORY) += mem.o
obj-$(CONFIG_CMD_MEMINFO) += meminfo.o
obj-$(CONFIG_CMD_IO) += io.o
obj-$(CONFIG_CMD_MII) += mii.o
obj-$(CONFIG_CMD_MISC) += misc.o

View File

@@ -1379,17 +1379,6 @@ U_BOOT_CMD(
#endif
#ifdef CONFIG_CMD_MEMINFO
static int do_mem_info(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
puts("DRAM: ");
print_size(gd->ram_size, "\n");
return 0;
}
#endif
U_BOOT_CMD(
base, 2, 1, do_mem_base,
"print or set address offset",
@@ -1433,14 +1422,6 @@ U_BOOT_CMD(
);
#endif /* CONFIG_CMD_MX_CYCLIC */
#ifdef CONFIG_CMD_MEMINFO
U_BOOT_CMD(
meminfo, 3, 1, do_mem_info,
"display memory information",
""
);
#endif
#ifdef CONFIG_CMD_RANDOM
U_BOOT_CMD(
random, 4, 0, do_random,

99
cmd/meminfo.c Normal file
View File

@@ -0,0 +1,99 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright 2024 Google LLC
* Written by Simon Glass <sjg@chromium.org>
*/
#include <bloblist.h>
#include <bootstage.h>
#include <command.h>
#include <display_options.h>
#include <lmb.h>
#include <malloc.h>
#include <mapmem.h>
#include <asm/global_data.h>
DECLARE_GLOBAL_DATA_PTR;
static void print_region(const char *name, ulong base, ulong size, ulong *uptop)
{
ulong end = base + size;
printf("%-12s %8lx %8lx %8lx", name, base, size, end);
if (*uptop)
printf(" %8lx", *uptop - end);
putc('\n');
*uptop = base;
}
static void show_lmb(const struct lmb *lmb, ulong *uptop)
{
int i;
for (i = lmb->used_mem.count - 1; i >= 0; i--) {
const struct lmb_region *rgn = alist_get(&lmb->used_mem, i,
struct lmb_region);
/*
* Assume that the top lmb region is the U-Boot region, so just
* take account of the memory not already reported
*/
if (lmb->used_mem.count - 1)
print_region("lmb", rgn->base, *uptop - rgn->base,
uptop);
else
print_region("lmb", rgn->base, rgn->size, uptop);
*uptop = rgn->base;
}
}
static int do_meminfo(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
ulong upto, stk_bot;
puts("DRAM: ");
print_size(gd->ram_size, "\n");
if (!IS_ENABLED(CONFIG_CMD_MEMINFO_MAP))
return 0;
printf("\n%-12s %8s %8s %8s %8s\n", "Region", "Base", "Size", "End",
"Gap");
printf("------------------------------------------------\n");
upto = 0;
if (IS_ENABLED(CONFIG_VIDEO))
print_region("video", gd_video_bottom(),
gd_video_size(), &upto);
if (IS_ENABLED(CONFIG_TRACE))
print_region("trace", map_to_sysmem(gd_trace_buff()),
gd_trace_size(), &upto);
print_region("code", gd->relocaddr, gd->mon_len, &upto);
print_region("malloc", map_to_sysmem((void *)mem_malloc_start),
mem_malloc_end - mem_malloc_start, &upto);
print_region("board_info", map_to_sysmem(gd->bd),
sizeof(struct bd_info), &upto);
print_region("global_data", map_to_sysmem((void *)gd),
sizeof(struct global_data), &upto);
print_region("devicetree", map_to_sysmem(gd->fdt_blob),
fdt_totalsize(gd->fdt_blob), &upto);
if (IS_ENABLED(CONFIG_BOOTSTAGE))
print_region("bootstage", map_to_sysmem(gd_bootstage()),
bootstage_get_size(false), &upto);
if (IS_ENABLED(CONFIG_BLOBLIST))
print_region("bloblist", map_to_sysmem(gd_bloblist()),
bloblist_get_total_size(), &upto);
stk_bot = gd->start_addr_sp - CONFIG_STACK_SIZE;
print_region("stack", stk_bot, CONFIG_STACK_SIZE, &upto);
if (IS_ENABLED(CONFIG_LMB))
show_lmb(lmb_get(), &upto);
print_region("free", gd->ram_base, upto, &upto);
return 0;
}
U_BOOT_CMD(
meminfo, 1, 1, do_meminfo,
"display memory information",
""
);