bdinfo.c 9.8 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0+
W
wdenk 已提交
2 3 4 5 6 7 8 9 10 11
/*
 * (C) Copyright 2003
 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 */

/*
 * Boot support
 */
#include <common.h>
#include <command.h>
S
Simon Glass 已提交
12
#include <env.h>
13
#include <net.h>
S
Simon Glass 已提交
14
#include <vsprintf.h>
15
#include <asm/cache.h>
16
#include <linux/compiler.h>
W
wdenk 已提交
17

18
DECLARE_GLOBAL_DATA_PTR;
W
wdenk 已提交
19

20 21 22 23 24
__maybe_unused void print_cpu_word_size(void)
{
	printf("%-12s= %u-bit\n", "Build", (uint)sizeof(void *) * 8);
}

25 26 27
__maybe_unused
static void print_num(const char *name, ulong value)
{
28
	printf("%-12s= 0x%0*lx\n", name, 2 * (int)sizeof(value), value);
29
}
W
wdenk 已提交
30

S
Simon Glass 已提交
31
__maybe_unused
32 33 34 35 36 37 38
static void print_eth(int idx)
{
	char name[10], *val;
	if (idx)
		sprintf(name, "eth%iaddr", idx);
	else
		strcpy(name, "ethaddr");
39
	val = env_get(name);
40 41 42 43
	if (!val)
		val = "(not set)";
	printf("%-12s= %s\n", name, val);
}
44

45
#ifndef CONFIG_DM_ETH
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
__maybe_unused
static void print_eths(void)
{
	struct eth_device *dev;
	int i = 0;

	do {
		dev = eth_get_dev_by_index(i);
		if (dev) {
			printf("eth%dname    = %s\n", i, dev->name);
			print_eth(i);
			i++;
		}
	} while (dev);

	printf("current eth = %s\n", eth_get_name());
62
	printf("ip_addr     = %s\n", env_get("ipaddr"));
63
}
64
#endif
65

66
__maybe_unused
67
static void print_lnum(const char *name, unsigned long long value)
68 69 70 71 72 73 74 75 76 77 78
{
	printf("%-12s= 0x%.8llX\n", name, value);
}

__maybe_unused
static void print_mhz(const char *name, unsigned long hz)
{
	char buf[32];

	printf("%-12s= %6s MHz\n", name, strmhz(buf, hz));
}
W
wdenk 已提交
79

80 81 82 83 84 85

static inline void print_bi_boot_params(const bd_t *bd)
{
	print_num("boot_params",	(ulong)bd->bi_boot_params);
}

M
Max Filippov 已提交
86 87 88 89 90 91 92 93 94 95 96 97 98 99
static inline void print_bi_mem(const bd_t *bd)
{
#if defined(CONFIG_SH)
	print_num("mem start      ",	(ulong)bd->bi_memstart);
	print_lnum("mem size       ",	(u64)bd->bi_memsize);
#elif defined(CONFIG_ARC)
	print_num("mem start",		(ulong)bd->bi_memstart);
	print_lnum("mem size",		(u64)bd->bi_memsize);
#else
	print_num("memstart",		(ulong)bd->bi_memstart);
	print_lnum("memsize",		(u64)bd->bi_memsize);
#endif
}

M
Max Filippov 已提交
100 101 102 103 104 105
static inline void print_bi_dram(const bd_t *bd)
{
#ifdef CONFIG_NR_DRAM_BANKS
	int i;

	for (i = 0; i < CONFIG_NR_DRAM_BANKS; ++i) {
106 107 108 109 110
		if (bd->bi_dram[i].size) {
			print_num("DRAM bank",	i);
			print_num("-> start",	bd->bi_dram[i].start);
			print_num("-> size",	bd->bi_dram[i].size);
		}
M
Max Filippov 已提交
111 112 113 114
	}
#endif
}

115 116 117 118 119 120 121
static inline void print_bi_flash(const bd_t *bd)
{
#if defined(CONFIG_MICROBLAZE) || defined(CONFIG_SH)
	print_num("flash start    ",	(ulong)bd->bi_flashstart);
	print_num("flash size     ",	(ulong)bd->bi_flashsize);
	print_num("flash offset   ",	(ulong)bd->bi_flashoffset);

T
Tom Rini 已提交
122
#elif defined(CONFIG_NIOS2)
123 124 125 126 127 128 129 130 131 132
	print_num("flash start",	(ulong)bd->bi_flashstart);
	print_num("flash size",		(ulong)bd->bi_flashsize);
	print_num("flash offset",	(ulong)bd->bi_flashoffset);
#else
	print_num("flashstart",		(ulong)bd->bi_flashstart);
	print_num("flashsize",		(ulong)bd->bi_flashsize);
	print_num("flashoffset",	(ulong)bd->bi_flashoffset);
#endif
}

133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
static inline void print_eth_ip_addr(void)
{
#if defined(CONFIG_CMD_NET)
	print_eth(0);
#if defined(CONFIG_HAS_ETH1)
	print_eth(1);
#endif
#if defined(CONFIG_HAS_ETH2)
	print_eth(2);
#endif
#if defined(CONFIG_HAS_ETH3)
	print_eth(3);
#endif
#if defined(CONFIG_HAS_ETH4)
	print_eth(4);
#endif
#if defined(CONFIG_HAS_ETH5)
	print_eth(5);
#endif
152
	printf("IP addr     = %s\n", env_get("ipaddr"));
153 154 155
#endif
}

156 157 158 159 160 161 162 163 164
static inline void print_baudrate(void)
{
#if defined(CONFIG_PPC)
	printf("baudrate    = %6u bps\n", gd->baudrate);
#else
	printf("baudrate    = %u bps\n", gd->baudrate);
#endif
}

165
static inline void __maybe_unused print_std_bdinfo(const bd_t *bd)
166 167 168 169 170 171 172 173
{
	print_bi_boot_params(bd);
	print_bi_mem(bd);
	print_bi_flash(bd);
	print_eth_ip_addr();
	print_baudrate();
}

174
#if defined(CONFIG_PPC)
Y
York Sun 已提交
175 176
void __weak board_detail(void)
{
177
	/* Please define board_detail() for your platform */
Y
York Sun 已提交
178
}
W
wdenk 已提交
179

180
int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
W
wdenk 已提交
181 182 183 184
{
	bd_t *bd = gd->bd;

#ifdef DEBUG
185 186
	print_num("bd address",		(ulong)bd);
#endif
M
Max Filippov 已提交
187
	print_bi_mem(bd);
188
	print_bi_flash(bd);
189 190
	print_num("sramstart",		bd->bi_sramstart);
	print_num("sramsize",		bd->bi_sramsize);
191
#if	defined(CONFIG_MPC8xx) || defined(CONFIG_E500)
192 193 194
	print_num("immr_base",		bd->bi_immr_base);
#endif
	print_num("bootflags",		bd->bi_bootflags);
195
#if defined(CONFIG_CPM2)
196 197 198
	print_mhz("vco",		bd->bi_vco);
	print_mhz("sccfreq",		bd->bi_sccfreq);
	print_mhz("brgfreq",		bd->bi_brgfreq);
W
wdenk 已提交
199
#endif
200
	print_mhz("intfreq",		bd->bi_intfreq);
201
#if defined(CONFIG_CPM2)
202
	print_mhz("cpmfreq",		bd->bi_cpmfreq);
W
wdenk 已提交
203
#endif
204
	print_mhz("busfreq",		bd->bi_busfreq);
W
wdenk 已提交
205

206 207 208 209 210 211 212 213
#ifdef CONFIG_ENABLE_36BIT_PHYS
#ifdef CONFIG_PHYS_64BIT
	puts("addressing  = 36-bit\n");
#else
	puts("addressing  = 32-bit\n");
#endif
#endif

214
	print_eth_ip_addr();
215
	print_baudrate();
216
	print_num("relocaddr", gd->relocaddr);
Y
York Sun 已提交
217
	board_detail();
218 219
	print_cpu_word_size();

W
wdenk 已提交
220 221 222
	return 0;
}

223
#elif defined(CONFIG_NIOS2)
W
wdenk 已提交
224

225
#define USE_GENERIC
226 227

#elif defined(CONFIG_MICROBLAZE)
M
Michal Simek 已提交
228

229
#define USE_GENERIC
W
wdenk 已提交
230

231 232
#elif defined(CONFIG_M68K)

233
int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
234 235
{
	bd_t *bd = gd->bd;
236

M
Max Filippov 已提交
237
	print_bi_mem(bd);
238
	print_bi_flash(bd);
239
#if defined(CONFIG_SYS_INIT_RAM_ADDR)
240 241
	print_num("sramstart",		(ulong)bd->bi_sramstart);
	print_num("sramsize",		(ulong)bd->bi_sramsize);
242
#endif
243
#if defined(CONFIG_SYS_MBAR)
244
	print_num("mbar",		bd->bi_mbar_base);
245
#endif
246 247
	print_mhz("cpufreq",		bd->bi_intfreq);
	print_mhz("busfreq",		bd->bi_busfreq);
248
#ifdef CONFIG_PCI
249
	print_mhz("pcifreq",		bd->bi_pcifreq);
250 251
#endif
#ifdef CONFIG_EXTRA_CLOCK
252 253 254
	print_mhz("flbfreq",		bd->bi_flbfreq);
	print_mhz("inpfreq",		bd->bi_inpfreq);
	print_mhz("vcofreq",		bd->bi_vcofreq);
255
#endif
256
	print_eth_ip_addr();
257
	print_baudrate();
258
	print_cpu_word_size();
259 260 261 262

	return 0;
}

263
#elif defined(CONFIG_MIPS)
W
wdenk 已提交
264

265
#define USE_GENERIC
W
wdenk 已提交
266

267
#elif defined(CONFIG_ARM)
W
wdenk 已提交
268

269 270
static int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc,
		     char *const argv[])
W
wdenk 已提交
271 272 273
{
	bd_t *bd = gd->bd;

274
	print_num("arch_number",	bd->bi_arch_number);
275
	print_bi_boot_params(bd);
M
Max Filippov 已提交
276
	print_bi_dram(bd);
W
wdenk 已提交
277

Y
York Sun 已提交
278
#ifdef CONFIG_SYS_MEM_RESERVE_SECURE
279
	if (gd->arch.secure_ram & MEM_RESERVE_SECURE_SECURED) {
Y
York Sun 已提交
280
		print_num("Secure ram",
281
			  gd->arch.secure_ram & MEM_RESERVE_SECURE_ADDR_MASK);
Y
York Sun 已提交
282 283
	}
#endif
Y
York Sun 已提交
284 285 286 287
#ifdef CONFIG_RESV_RAM
	if (gd->arch.resv_ram)
		print_num("Reserved ram", gd->arch.resv_ram);
#endif
288
#if defined(CONFIG_CMD_NET) && !defined(CONFIG_DM_ETH)
289
	print_eths();
290
#endif
291
	print_baudrate();
292
#if !(CONFIG_IS_ENABLED(SYS_ICACHE_OFF) && CONFIG_IS_ENABLED(SYS_DCACHE_OFF))
293
	print_num("TLB addr", gd->arch.tlb_addr);
H
Heiko Schocher 已提交
294
#endif
295 296 297 298
	print_num("relocaddr", gd->relocaddr);
	print_num("reloc off", gd->reloc_off);
	print_num("irq_sp", gd->irq_sp);	/* irq stack pointer */
	print_num("sp start ", gd->start_addr_sp);
299
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO) || defined(CONFIG_DM_VIDEO)
300
	print_num("FB base  ", gd->fb_base);
301
#endif
302 303 304 305 306 307 308 309
	/*
	 * TODO: Currently only support for davinci SOC's is added.
	 * Remove this check once all the board implement this.
	 */
#ifdef CONFIG_CLOCKS
	printf("ARM frequency = %ld MHz\n", gd->bd->bi_arm_freq);
	printf("DSP frequency = %ld MHz\n", gd->bd->bi_dsp_freq);
	printf("DDR frequency = %ld MHz\n", gd->bd->bi_ddr_freq);
310 311 312
#endif
#ifdef CONFIG_BOARD_TYPES
	printf("Board Type  = %ld\n", gd->board_type);
313
#endif
314
#if CONFIG_VAL(SYS_MALLOC_F_LEN)
315
	printf("Early malloc usage: %lx / %x\n", gd->malloc_ptr,
316
	       CONFIG_VAL(SYS_MALLOC_F_LEN));
H
Heiko Schocher 已提交
317 318 319
#endif
#if CONFIG_IS_ENABLED(MULTI_DTB_FIT)
	print_num("multi_dtb_fit", (ulong)gd->multi_dtb_fit);
320
#endif
H
Heiko Schocher 已提交
321
	if (gd->fdt_blob)
322
		print_num("fdt_blob", (ulong)gd->fdt_blob);
323
	print_cpu_word_size();
324

W
wdenk 已提交
325 326 327
	return 0;
}

328 329
#elif defined(CONFIG_SH)

330
#define USE_GENERIC
331

G
Graeme Russ 已提交
332 333
#elif defined(CONFIG_X86)

334
int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
G
Graeme Russ 已提交
335 336 337
{
	bd_t *bd = gd->bd;

338
	print_bi_boot_params(bd);
339

M
Max Filippov 已提交
340
	print_bi_dram(bd);
G
Graeme Russ 已提交
341

342 343
	print_num("relocaddr", gd->relocaddr);
	print_num("reloc off", gd->reloc_off);
G
Graeme Russ 已提交
344
#if defined(CONFIG_CMD_NET)
345
	print_eth_ip_addr();
346
	print_mhz("ethspeed",	    bd->bi_ethspeed);
G
Graeme Russ 已提交
347
#endif
348
	print_baudrate();
349
	print_cpu_word_size();
G
Graeme Russ 已提交
350 351 352 353

	return 0;
}

354 355
#elif defined(CONFIG_SANDBOX)

356
int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
357 358 359
{
	bd_t *bd = gd->bd;

360
	print_bi_boot_params(bd);
M
Max Filippov 已提交
361
	print_bi_dram(bd);
362
	print_eth_ip_addr();
363

364
#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO)
365
	print_num("FB base  ", gd->fb_base);
366
#endif
367 368
	print_cpu_word_size();

369 370 371
	return 0;
}

372 373
#elif defined(CONFIG_NDS32)

374
int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
375 376 377 378
{
	bd_t *bd = gd->bd;

	print_num("arch_number",	bd->bi_arch_number);
379
	print_bi_boot_params(bd);
M
Max Filippov 已提交
380
	print_bi_dram(bd);
381
	print_eth_ip_addr();
382
	print_baudrate();
383
	print_cpu_word_size();
384 385 386 387

	return 0;
}

388 389
#elif defined(CONFIG_RISCV)

390
int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
391 392 393 394 395
{
	bd_t *bd = gd->bd;

	print_bi_boot_params(bd);
	print_bi_dram(bd);
396 397
	print_num("relocaddr", gd->relocaddr);
	print_num("reloc off", gd->reloc_off);
398 399
	print_eth_ip_addr();
	print_baudrate();
400
	print_cpu_word_size();
401 402 403 404

	return 0;
}

405
#elif defined(CONFIG_ARC)
406

407
int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
408 409 410
{
	bd_t *bd = gd->bd;

M
Max Filippov 已提交
411
	print_bi_mem(bd);
412
	print_eth_ip_addr();
413
	print_baudrate();
414
	print_cpu_word_size();
415 416 417 418

	return 0;
}

419 420
#elif defined(CONFIG_XTENSA)

421 422 423 424 425 426 427 428
#define USE_GENERIC

#else
 #error "a case for this architecture does not exist!"
#endif

/* Temporary check for archs that use generic bdinfo. Eventually all will */
#ifdef USE_GENERIC
429
int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
430 431
{
	print_std_bdinfo(gd->bd);
432 433 434
	print_num("relocaddr", gd->relocaddr);
	print_num("reloc off", gd->reloc_off);
	print_cpu_word_size();
435 436 437 438 439 440
#if defined(CONFIG_CMD_NET) && !defined(CONFIG_DM_ETH)
	print_eths();
#endif
	print_num("fdt_blob", (ulong)gd->fdt_blob);
	print_num("new_fdt", (ulong)gd->new_fdt);
	print_num("fdt_size", (ulong)gd->fdt_size);
441

442 443
	return 0;
}
444
#endif
W
wdenk 已提交
445 446 447

/* -------------------------------------------------------------------- */

W
wdenk 已提交
448 449
U_BOOT_CMD(
	bdinfo,	1,	1,	do_bdinfo,
P
Peter Tyser 已提交
450
	"print Board Info structure",
W
Wolfgang Denk 已提交
451
	""
W
wdenk 已提交
452
);