1 /* 2 * (C) Copyright 2003 3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 /* 9 * Boot support 10 */ 11 #include <common.h> 12 #include <command.h> 13 #include <linux/compiler.h> 14 15 DECLARE_GLOBAL_DATA_PTR; 16 17 __maybe_unused 18 static void print_num(const char *name, ulong value) 19 { 20 printf("%-12s= 0x%08lX\n", name, value); 21 } 22 23 __maybe_unused 24 static void print_eth(int idx) 25 { 26 char name[10], *val; 27 if (idx) 28 sprintf(name, "eth%iaddr", idx); 29 else 30 strcpy(name, "ethaddr"); 31 val = getenv(name); 32 if (!val) 33 val = "(not set)"; 34 printf("%-12s= %s\n", name, val); 35 } 36 37 #ifndef CONFIG_DM_ETH 38 __maybe_unused 39 static void print_eths(void) 40 { 41 struct eth_device *dev; 42 int i = 0; 43 44 do { 45 dev = eth_get_dev_by_index(i); 46 if (dev) { 47 printf("eth%dname = %s\n", i, dev->name); 48 print_eth(i); 49 i++; 50 } 51 } while (dev); 52 53 printf("current eth = %s\n", eth_get_name()); 54 printf("ip_addr = %s\n", getenv("ipaddr")); 55 } 56 #endif 57 58 __maybe_unused 59 static void print_lnum(const char *name, unsigned long long value) 60 { 61 printf("%-12s= 0x%.8llX\n", name, value); 62 } 63 64 __maybe_unused 65 static void print_mhz(const char *name, unsigned long hz) 66 { 67 char buf[32]; 68 69 printf("%-12s= %6s MHz\n", name, strmhz(buf, hz)); 70 } 71 72 73 static inline void print_bi_boot_params(const bd_t *bd) 74 { 75 print_num("boot_params", (ulong)bd->bi_boot_params); 76 } 77 78 static inline void print_bi_mem(const bd_t *bd) 79 { 80 #if defined(CONFIG_SH) 81 print_num("mem start ", (ulong)bd->bi_memstart); 82 print_lnum("mem size ", (u64)bd->bi_memsize); 83 #elif defined(CONFIG_ARC) 84 print_num("mem start", (ulong)bd->bi_memstart); 85 print_lnum("mem size", (u64)bd->bi_memsize); 86 #elif defined(CONFIG_AVR32) 87 print_num("memstart", (ulong)bd->bi_dram[0].start); 88 print_lnum("memsize", (u64)bd->bi_dram[0].size); 89 #else 90 print_num("memstart", (ulong)bd->bi_memstart); 91 print_lnum("memsize", (u64)bd->bi_memsize); 92 #endif 93 } 94 95 static inline void print_bi_dram(const bd_t *bd) 96 { 97 #ifdef CONFIG_NR_DRAM_BANKS 98 int i; 99 100 for (i = 0; i < CONFIG_NR_DRAM_BANKS; ++i) { 101 print_num("DRAM bank", i); 102 print_num("-> start", bd->bi_dram[i].start); 103 print_num("-> size", bd->bi_dram[i].size); 104 } 105 #endif 106 } 107 108 #if defined(CONFIG_PPC) 109 void __weak board_detail(void) 110 { 111 /* Please define boot_detail() for your platform */ 112 } 113 114 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 115 { 116 bd_t *bd = gd->bd; 117 118 #ifdef DEBUG 119 print_num("bd address", (ulong)bd); 120 #endif 121 print_bi_mem(bd); 122 print_num("flashstart", bd->bi_flashstart); 123 print_num("flashsize", bd->bi_flashsize); 124 print_num("flashoffset", bd->bi_flashoffset); 125 print_num("sramstart", bd->bi_sramstart); 126 print_num("sramsize", bd->bi_sramsize); 127 #if defined(CONFIG_5xx) || defined(CONFIG_8xx) || \ 128 defined(CONFIG_MPC8260) || defined(CONFIG_E500) 129 print_num("immr_base", bd->bi_immr_base); 130 #endif 131 print_num("bootflags", bd->bi_bootflags); 132 #if defined(CONFIG_405EP) || \ 133 defined(CONFIG_405GP) || \ 134 defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \ 135 defined(CONFIG_440GR) || defined(CONFIG_440GRX) || \ 136 defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \ 137 defined(CONFIG_XILINX_405) 138 print_mhz("procfreq", bd->bi_procfreq); 139 print_mhz("plb_busfreq", bd->bi_plb_busfreq); 140 #if defined(CONFIG_405EP) || defined(CONFIG_405GP) || \ 141 defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \ 142 defined(CONFIG_440GR) || defined(CONFIG_440GRX) || \ 143 defined(CONFIG_440SPE) || defined(CONFIG_XILINX_405) 144 print_mhz("pci_busfreq", bd->bi_pci_busfreq); 145 #endif 146 #else /* ! CONFIG_405GP, CONFIG_405EP, CONFIG_XILINX_405, CONFIG_440EP CONFIG_440GR */ 147 #if defined(CONFIG_CPM2) 148 print_mhz("vco", bd->bi_vco); 149 print_mhz("sccfreq", bd->bi_sccfreq); 150 print_mhz("brgfreq", bd->bi_brgfreq); 151 #endif 152 print_mhz("intfreq", bd->bi_intfreq); 153 #if defined(CONFIG_CPM2) 154 print_mhz("cpmfreq", bd->bi_cpmfreq); 155 #endif 156 print_mhz("busfreq", bd->bi_busfreq); 157 #endif /* CONFIG_405GP, CONFIG_405EP, CONFIG_XILINX_405, CONFIG_440EP CONFIG_440GR */ 158 159 #ifdef CONFIG_ENABLE_36BIT_PHYS 160 #ifdef CONFIG_PHYS_64BIT 161 puts("addressing = 36-bit\n"); 162 #else 163 puts("addressing = 32-bit\n"); 164 #endif 165 #endif 166 167 print_eth(0); 168 #if defined(CONFIG_HAS_ETH1) 169 print_eth(1); 170 #endif 171 #if defined(CONFIG_HAS_ETH2) 172 print_eth(2); 173 #endif 174 #if defined(CONFIG_HAS_ETH3) 175 print_eth(3); 176 #endif 177 #if defined(CONFIG_HAS_ETH4) 178 print_eth(4); 179 #endif 180 #if defined(CONFIG_HAS_ETH5) 181 print_eth(5); 182 #endif 183 184 printf("IP addr = %s\n", getenv("ipaddr")); 185 printf("baudrate = %6u bps\n", gd->baudrate); 186 print_num("relocaddr", gd->relocaddr); 187 board_detail(); 188 return 0; 189 } 190 191 #elif defined(CONFIG_NIOS2) 192 193 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 194 { 195 bd_t *bd = gd->bd; 196 197 print_bi_dram(bd); 198 print_num("flash start", (ulong)bd->bi_flashstart); 199 print_num("flash size", (ulong)bd->bi_flashsize); 200 print_num("flash offset", (ulong)bd->bi_flashoffset); 201 202 #if defined(CONFIG_SYS_SRAM_BASE) 203 print_num ("sram start", (ulong)bd->bi_sramstart); 204 print_num ("sram size", (ulong)bd->bi_sramsize); 205 #endif 206 207 #if defined(CONFIG_CMD_NET) 208 print_eth(0); 209 printf("ip_addr = %s\n", getenv("ipaddr")); 210 #endif 211 212 printf("baudrate = %u bps\n", gd->baudrate); 213 214 return 0; 215 } 216 217 #elif defined(CONFIG_MICROBLAZE) 218 219 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 220 { 221 bd_t *bd = gd->bd; 222 223 print_bi_dram(bd); 224 print_num("flash start ", (ulong)bd->bi_flashstart); 225 print_num("flash size ", (ulong)bd->bi_flashsize); 226 print_num("flash offset ", (ulong)bd->bi_flashoffset); 227 #if defined(CONFIG_SYS_SRAM_BASE) 228 print_num("sram start ", (ulong)bd->bi_sramstart); 229 print_num("sram size ", (ulong)bd->bi_sramsize); 230 #endif 231 #if defined(CONFIG_CMD_NET) && !defined(CONFIG_DM_ETH) 232 print_eths(); 233 #endif 234 printf("baudrate = %u bps\n", gd->baudrate); 235 print_num("relocaddr", gd->relocaddr); 236 print_num("reloc off", gd->reloc_off); 237 print_num("fdt_blob", (ulong)gd->fdt_blob); 238 print_num("new_fdt", (ulong)gd->new_fdt); 239 print_num("fdt_size", (ulong)gd->fdt_size); 240 241 return 0; 242 } 243 244 #elif defined(CONFIG_SPARC) 245 246 int do_bdinfo(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) 247 { 248 bd_t *bd = gd->bd; 249 250 #ifdef DEBUG 251 print_num("bd address ", (ulong) bd); 252 #endif 253 print_num("memstart ", bd->bi_memstart); 254 print_lnum("memsize ", bd->bi_memsize); 255 print_num("flashstart ", bd->bi_flashstart); 256 print_num("CONFIG_SYS_MONITOR_BASE ", CONFIG_SYS_MONITOR_BASE); 257 print_num("CONFIG_ENV_ADDR ", CONFIG_ENV_ADDR); 258 printf("CONFIG_SYS_RELOC_MONITOR_BASE = 0x%x (%d)\n", CONFIG_SYS_RELOC_MONITOR_BASE, 259 CONFIG_SYS_MONITOR_LEN); 260 printf("CONFIG_SYS_MALLOC_BASE = 0x%x (%d)\n", CONFIG_SYS_MALLOC_BASE, 261 CONFIG_SYS_MALLOC_LEN); 262 printf("CONFIG_SYS_INIT_SP_OFFSET = 0x%x (%d)\n", CONFIG_SYS_INIT_SP_OFFSET, 263 CONFIG_SYS_STACK_SIZE); 264 printf("CONFIG_SYS_PROM_OFFSET = 0x%x (%d)\n", CONFIG_SYS_PROM_OFFSET, 265 CONFIG_SYS_PROM_SIZE); 266 printf("CONFIG_SYS_GBL_DATA_OFFSET = 0x%x (%d)\n", CONFIG_SYS_GBL_DATA_OFFSET, 267 GENERATED_GBL_DATA_SIZE); 268 269 #if defined(CONFIG_CMD_NET) 270 print_eth(0); 271 printf("ip_addr = %s\n", getenv("ipaddr")); 272 #endif 273 printf("baudrate = %6u bps\n", gd->baudrate); 274 return 0; 275 } 276 277 #elif defined(CONFIG_M68K) 278 279 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 280 { 281 bd_t *bd = gd->bd; 282 283 print_bi_mem(bd); 284 print_num("flashstart", (ulong)bd->bi_flashstart); 285 print_num("flashsize", (ulong)bd->bi_flashsize); 286 print_num("flashoffset", (ulong)bd->bi_flashoffset); 287 #if defined(CONFIG_SYS_INIT_RAM_ADDR) 288 print_num("sramstart", (ulong)bd->bi_sramstart); 289 print_num("sramsize", (ulong)bd->bi_sramsize); 290 #endif 291 #if defined(CONFIG_SYS_MBAR) 292 print_num("mbar", bd->bi_mbar_base); 293 #endif 294 print_mhz("cpufreq", bd->bi_intfreq); 295 print_mhz("busfreq", bd->bi_busfreq); 296 #ifdef CONFIG_PCI 297 print_mhz("pcifreq", bd->bi_pcifreq); 298 #endif 299 #ifdef CONFIG_EXTRA_CLOCK 300 print_mhz("flbfreq", bd->bi_flbfreq); 301 print_mhz("inpfreq", bd->bi_inpfreq); 302 print_mhz("vcofreq", bd->bi_vcofreq); 303 #endif 304 #if defined(CONFIG_CMD_NET) 305 print_eth(0); 306 #if defined(CONFIG_HAS_ETH1) 307 print_eth(1); 308 #endif 309 #if defined(CONFIG_HAS_ETH2) 310 print_eth(2); 311 #endif 312 #if defined(CONFIG_HAS_ETH3) 313 print_eth(3); 314 #endif 315 316 printf("ip_addr = %s\n", getenv("ipaddr")); 317 #endif 318 printf("baudrate = %u bps\n", gd->baudrate); 319 320 return 0; 321 } 322 323 #elif defined(CONFIG_BLACKFIN) 324 325 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 326 { 327 bd_t *bd = gd->bd; 328 329 printf("U-Boot = %s\n", bd->bi_r_version); 330 printf("CPU = %s\n", bd->bi_cpu); 331 printf("Board = %s\n", bd->bi_board_name); 332 print_mhz("VCO", bd->bi_vco); 333 print_mhz("CCLK", bd->bi_cclk); 334 print_mhz("SCLK", bd->bi_sclk); 335 336 print_bi_boot_params(bd); 337 print_bi_mem(bd); 338 print_num("flashstart", (ulong)bd->bi_flashstart); 339 print_num("flashsize", (ulong)bd->bi_flashsize); 340 print_num("flashoffset", (ulong)bd->bi_flashoffset); 341 342 print_eth(0); 343 printf("ip_addr = %s\n", getenv("ipaddr")); 344 printf("baudrate = %u bps\n", gd->baudrate); 345 346 return 0; 347 } 348 349 #elif defined(CONFIG_MIPS) 350 351 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 352 { 353 bd_t *bd = gd->bd; 354 355 print_bi_boot_params(bd); 356 print_bi_mem(bd); 357 print_num("flashstart", (ulong)bd->bi_flashstart); 358 print_num("flashsize", (ulong)bd->bi_flashsize); 359 print_num("flashoffset", (ulong)bd->bi_flashoffset); 360 361 print_eth(0); 362 printf("ip_addr = %s\n", getenv("ipaddr")); 363 printf("baudrate = %u bps\n", gd->baudrate); 364 print_num("relocaddr", gd->relocaddr); 365 print_num("reloc off", gd->reloc_off); 366 367 return 0; 368 } 369 370 #elif defined(CONFIG_AVR32) 371 372 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 373 { 374 bd_t *bd = gd->bd; 375 376 print_bi_boot_params(bd); 377 print_bi_mem(bd); 378 print_num("flashstart", (ulong)bd->bi_flashstart); 379 print_num("flashsize", (ulong)bd->bi_flashsize); 380 print_num("flashoffset", (ulong)bd->bi_flashoffset); 381 382 print_eth(0); 383 printf("ip_addr = %s\n", getenv("ipaddr")); 384 printf("baudrate = %u bps\n", gd->baudrate); 385 386 return 0; 387 } 388 389 #elif defined(CONFIG_ARM) 390 391 static int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, 392 char * const argv[]) 393 { 394 bd_t *bd = gd->bd; 395 396 print_num("arch_number", bd->bi_arch_number); 397 print_bi_boot_params(bd); 398 print_bi_dram(bd); 399 400 #ifdef CONFIG_SYS_MEM_RESERVE_SECURE 401 if (gd->arch.secure_ram & MEM_RESERVE_SECURE_SECURED) { 402 print_num("Secure ram", 403 gd->arch.secure_ram & MEM_RESERVE_SECURE_ADDR_MASK); 404 } 405 #endif 406 #if defined(CONFIG_CMD_NET) && !defined(CONFIG_DM_ETH) 407 print_eths(); 408 #endif 409 printf("baudrate = %u bps\n", gd->baudrate); 410 #if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF)) 411 print_num("TLB addr", gd->arch.tlb_addr); 412 #endif 413 print_num("relocaddr", gd->relocaddr); 414 print_num("reloc off", gd->reloc_off); 415 print_num("irq_sp", gd->irq_sp); /* irq stack pointer */ 416 print_num("sp start ", gd->start_addr_sp); 417 #if defined(CONFIG_LCD) || defined(CONFIG_VIDEO) 418 print_num("FB base ", gd->fb_base); 419 #endif 420 /* 421 * TODO: Currently only support for davinci SOC's is added. 422 * Remove this check once all the board implement this. 423 */ 424 #ifdef CONFIG_CLOCKS 425 printf("ARM frequency = %ld MHz\n", gd->bd->bi_arm_freq); 426 printf("DSP frequency = %ld MHz\n", gd->bd->bi_dsp_freq); 427 printf("DDR frequency = %ld MHz\n", gd->bd->bi_ddr_freq); 428 #endif 429 #ifdef CONFIG_BOARD_TYPES 430 printf("Board Type = %ld\n", gd->board_type); 431 #endif 432 #ifdef CONFIG_SYS_MALLOC_F 433 printf("Early malloc usage: %lx / %x\n", gd->malloc_ptr, 434 CONFIG_SYS_MALLOC_F_LEN); 435 #endif 436 437 return 0; 438 } 439 440 #elif defined(CONFIG_SH) 441 442 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 443 { 444 bd_t *bd = gd->bd; 445 446 print_bi_mem(bd); 447 print_num("flash start ", (ulong)bd->bi_flashstart); 448 print_num("flash size ", (ulong)bd->bi_flashsize); 449 print_num("flash offset ", (ulong)bd->bi_flashoffset); 450 451 #if defined(CONFIG_CMD_NET) 452 print_eth(0); 453 printf("ip_addr = %s\n", getenv("ipaddr")); 454 #endif 455 printf("baudrate = %u bps\n", gd->baudrate); 456 return 0; 457 } 458 459 #elif defined(CONFIG_X86) 460 461 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 462 { 463 bd_t *bd = gd->bd; 464 465 print_bi_boot_params(bd); 466 print_num("bi_memstart", bd->bi_memstart); 467 print_num("bi_memsize", bd->bi_memsize); 468 print_num("bi_flashstart", bd->bi_flashstart); 469 print_num("bi_flashsize", bd->bi_flashsize); 470 print_num("bi_flashoffset", bd->bi_flashoffset); 471 print_num("bi_sramstart", bd->bi_sramstart); 472 print_num("bi_sramsize", bd->bi_sramsize); 473 print_num("bi_bootflags", bd->bi_bootflags); 474 print_mhz("cpufreq", bd->bi_intfreq); 475 print_mhz("busfreq", bd->bi_busfreq); 476 477 print_bi_dram(bd); 478 479 #if defined(CONFIG_CMD_NET) 480 print_eth(0); 481 printf("ip_addr = %s\n", getenv("ipaddr")); 482 print_mhz("ethspeed", bd->bi_ethspeed); 483 #endif 484 printf("baudrate = %u bps\n", gd->baudrate); 485 486 return 0; 487 } 488 489 #elif defined(CONFIG_SANDBOX) 490 491 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 492 { 493 bd_t *bd = gd->bd; 494 495 print_bi_boot_params(bd); 496 print_bi_dram(bd); 497 498 #if defined(CONFIG_CMD_NET) 499 print_eth(0); 500 printf("ip_addr = %s\n", getenv("ipaddr")); 501 #endif 502 #if defined(CONFIG_LCD) || defined(CONFIG_VIDEO) 503 print_num("FB base ", gd->fb_base); 504 #endif 505 return 0; 506 } 507 508 #elif defined(CONFIG_NDS32) 509 510 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 511 { 512 bd_t *bd = gd->bd; 513 514 print_num("arch_number", bd->bi_arch_number); 515 print_bi_boot_params(bd); 516 print_bi_dram(bd); 517 518 #if defined(CONFIG_CMD_NET) 519 print_eth(0); 520 printf("ip_addr = %s\n", getenv("ipaddr")); 521 #endif 522 printf("baudrate = %u bps\n", gd->baudrate); 523 524 return 0; 525 } 526 527 #elif defined(CONFIG_OPENRISC) 528 529 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 530 { 531 bd_t *bd = gd->bd; 532 533 print_bi_mem(bd); 534 print_num("flash start", (ulong)bd->bi_flashstart); 535 print_num("flash size", (ulong)bd->bi_flashsize); 536 print_num("flash offset", (ulong)bd->bi_flashoffset); 537 538 #if defined(CONFIG_CMD_NET) 539 print_eth(0); 540 printf("ip_addr = %s\n", getenv("ipaddr")); 541 #endif 542 543 printf("baudrate = %u bps\n", gd->baudrate); 544 545 return 0; 546 } 547 548 #elif defined(CONFIG_ARC) 549 550 int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 551 { 552 bd_t *bd = gd->bd; 553 554 print_bi_mem(bd); 555 556 #if defined(CONFIG_CMD_NET) 557 print_eth(0); 558 printf("ip_addr = %s\n", getenv("ipaddr")); 559 #endif 560 printf("baudrate = %d bps\n", gd->baudrate); 561 562 return 0; 563 } 564 565 #else 566 #error "a case for this architecture does not exist!" 567 #endif 568 569 /* -------------------------------------------------------------------- */ 570 571 U_BOOT_CMD( 572 bdinfo, 1, 1, do_bdinfo, 573 "print Board Info structure", 574 "" 575 ); 576