mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-10-31 03:58:17 +00:00 
			
		
		
		
	Add the lmb records onto the end of the memory map. Signed-off-by: Simon Glass <sjg@chromium.org>
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // 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",
 | |
| 	""
 | |
| );
 |