mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
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:
12
cmd/Kconfig
12
cmd/Kconfig
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
19
cmd/mem.c
19
cmd/mem.c
@@ -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
99
cmd/meminfo.c
Normal 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",
|
||||
""
|
||||
);
|
||||
Reference in New Issue
Block a user