1 /* 2 * Copyright (c) 2011 The Chromium OS Authors. 3 * (C) Copyright 2002-2006 4 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 5 * 6 * (C) Copyright 2002 7 * Sysgo Real-Time Solutions, GmbH <www.elinos.com> 8 * Marius Groeger <mgroeger@sysgo.de> 9 * 10 * SPDX-License-Identifier: GPL-2.0+ 11 */ 12 13 #include <common.h> 14 /* TODO: can we just include all these headers whether needed or not? */ 15 #if defined(CONFIG_CMD_BEDBUG) 16 #include <bedbug/type.h> 17 #endif 18 #include <console.h> 19 #ifdef CONFIG_HAS_DATAFLASH 20 #include <dataflash.h> 21 #endif 22 #include <dm.h> 23 #include <environment.h> 24 #include <fdtdec.h> 25 #if defined(CONFIG_CMD_IDE) 26 #include <ide.h> 27 #endif 28 #include <initcall.h> 29 #ifdef CONFIG_PS2KBD 30 #include <keyboard.h> 31 #endif 32 #if defined(CONFIG_CMD_KGDB) 33 #include <kgdb.h> 34 #endif 35 #include <logbuff.h> 36 #include <malloc.h> 37 #include <mapmem.h> 38 #ifdef CONFIG_BITBANGMII 39 #include <miiphy.h> 40 #endif 41 #include <mmc.h> 42 #include <nand.h> 43 #include <onenand_uboot.h> 44 #include <scsi.h> 45 #include <serial.h> 46 #include <spi.h> 47 #include <stdio_dev.h> 48 #include <trace.h> 49 #include <watchdog.h> 50 #ifdef CONFIG_CMD_AMBAPP 51 #include <ambapp.h> 52 #endif 53 #ifdef CONFIG_ADDR_MAP 54 #include <asm/mmu.h> 55 #endif 56 #include <asm/sections.h> 57 #ifdef CONFIG_X86 58 #include <asm/init_helpers.h> 59 #endif 60 #include <dm/root.h> 61 #include <linux/compiler.h> 62 #include <linux/err.h> 63 #ifdef CONFIG_AVR32 64 #include <asm/arch/mmu.h> 65 #endif 66 67 DECLARE_GLOBAL_DATA_PTR; 68 69 ulong monitor_flash_len; 70 71 __weak int board_flash_wp_on(void) 72 { 73 /* 74 * Most flashes can't be detected when write protection is enabled, 75 * so provide a way to let U-Boot gracefully ignore write protected 76 * devices. 77 */ 78 return 0; 79 } 80 81 __weak void cpu_secondary_init_r(void) 82 { 83 } 84 85 static int initr_secondary_cpu(void) 86 { 87 /* 88 * after non-volatile devices & environment is setup and cpu code have 89 * another round to deal with any initialization that might require 90 * full access to the environment or loading of some image (firmware) 91 * from a non-volatile device 92 */ 93 /* TODO: maybe define this for all archs? */ 94 cpu_secondary_init_r(); 95 96 return 0; 97 } 98 99 static int initr_trace(void) 100 { 101 #ifdef CONFIG_TRACE 102 trace_init(gd->trace_buff, CONFIG_TRACE_BUFFER_SIZE); 103 #endif 104 105 return 0; 106 } 107 108 static int initr_reloc(void) 109 { 110 /* tell others: relocation done */ 111 gd->flags |= GD_FLG_RELOC | GD_FLG_FULL_MALLOC_INIT; 112 bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_R, "board_init_r"); 113 114 return 0; 115 } 116 117 #ifdef CONFIG_ARM 118 /* 119 * Some of these functions are needed purely because the functions they 120 * call return void. If we change them to return 0, these stubs can go away. 121 */ 122 static int initr_caches(void) 123 { 124 /* Enable caches */ 125 enable_caches(); 126 return 0; 127 } 128 #endif 129 130 __weak int fixup_cpu(void) 131 { 132 return 0; 133 } 134 135 static int initr_reloc_global_data(void) 136 { 137 #ifdef __ARM__ 138 monitor_flash_len = _end - __image_copy_start; 139 #elif defined(CONFIG_NDS32) 140 monitor_flash_len = (ulong)&_end - (ulong)&_start; 141 #elif !defined(CONFIG_SANDBOX) && !defined(CONFIG_NIOS2) 142 monitor_flash_len = (ulong)&__init_end - gd->relocaddr; 143 #endif 144 #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx) 145 /* 146 * The gd->cpu pointer is set to an address in flash before relocation. 147 * We need to update it to point to the same CPU entry in RAM. 148 * TODO: why not just add gd->reloc_ofs? 149 */ 150 gd->arch.cpu += gd->relocaddr - CONFIG_SYS_MONITOR_BASE; 151 152 /* 153 * If we didn't know the cpu mask & # cores, we can save them of 154 * now rather than 'computing' them constantly 155 */ 156 fixup_cpu(); 157 #endif 158 #ifdef CONFIG_SYS_EXTRA_ENV_RELOC 159 /* 160 * Some systems need to relocate the env_addr pointer early because the 161 * location it points to will get invalidated before env_relocate is 162 * called. One example is on systems that might use a L2 or L3 cache 163 * in SRAM mode and initialize that cache from SRAM mode back to being 164 * a cache in cpu_init_r. 165 */ 166 gd->env_addr += gd->relocaddr - CONFIG_SYS_MONITOR_BASE; 167 #endif 168 return 0; 169 } 170 171 static int initr_serial(void) 172 { 173 serial_initialize(); 174 return 0; 175 } 176 177 #if defined(CONFIG_PPC) || defined(CONFIG_M68K) 178 static int initr_trap(void) 179 { 180 /* 181 * Setup trap handlers 182 */ 183 #if defined(CONFIG_PPC) 184 trap_init(gd->relocaddr); 185 #else 186 trap_init(CONFIG_SYS_SDRAM_BASE); 187 #endif 188 return 0; 189 } 190 #endif 191 192 #ifdef CONFIG_ADDR_MAP 193 static int initr_addr_map(void) 194 { 195 init_addr_map(); 196 197 return 0; 198 } 199 #endif 200 201 #ifdef CONFIG_LOGBUFFER 202 unsigned long logbuffer_base(void) 203 { 204 return gd->ram_top - LOGBUFF_LEN; 205 } 206 207 static int initr_logbuffer(void) 208 { 209 logbuff_init_ptrs(); 210 return 0; 211 } 212 #endif 213 214 #ifdef CONFIG_POST 215 static int initr_post_backlog(void) 216 { 217 post_output_backlog(); 218 return 0; 219 } 220 #endif 221 222 #ifdef CONFIG_SYS_DELAYED_ICACHE 223 static int initr_icache_enable(void) 224 { 225 return 0; 226 } 227 #endif 228 229 #if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500) 230 static int initr_unlock_ram_in_cache(void) 231 { 232 unlock_ram_in_cache(); /* it's time to unlock D-cache in e500 */ 233 return 0; 234 } 235 #endif 236 237 #ifdef CONFIG_PCI 238 static int initr_pci(void) 239 { 240 #ifndef CONFIG_DM_PCI 241 pci_init(); 242 #endif 243 244 return 0; 245 } 246 #endif 247 248 #ifdef CONFIG_WINBOND_83C553 249 static int initr_w83c553f(void) 250 { 251 /* 252 * Initialise the ISA bridge 253 */ 254 initialise_w83c553f(); 255 return 0; 256 } 257 #endif 258 259 static int initr_barrier(void) 260 { 261 #ifdef CONFIG_PPC 262 /* TODO: Can we not use dmb() macros for this? */ 263 asm("sync ; isync"); 264 #endif 265 return 0; 266 } 267 268 static int initr_malloc(void) 269 { 270 ulong malloc_start; 271 272 #ifdef CONFIG_SYS_MALLOC_F_LEN 273 debug("Pre-reloc malloc() used %#lx bytes (%ld KB)\n", gd->malloc_ptr, 274 gd->malloc_ptr / 1024); 275 #endif 276 /* The malloc area is immediately below the monitor copy in DRAM */ 277 malloc_start = gd->relocaddr - TOTAL_MALLOC_LEN; 278 mem_malloc_init((ulong)map_sysmem(malloc_start, TOTAL_MALLOC_LEN), 279 TOTAL_MALLOC_LEN); 280 return 0; 281 } 282 283 static int initr_console_record(void) 284 { 285 #if defined(CONFIG_CONSOLE_RECORD) 286 return console_record_init(); 287 #else 288 return 0; 289 #endif 290 } 291 292 #ifdef CONFIG_SYS_NONCACHED_MEMORY 293 static int initr_noncached(void) 294 { 295 noncached_init(); 296 return 0; 297 } 298 #endif 299 300 #ifdef CONFIG_DM 301 static int initr_dm(void) 302 { 303 /* Save the pre-reloc driver model and start a new one */ 304 gd->dm_root_f = gd->dm_root; 305 gd->dm_root = NULL; 306 #ifdef CONFIG_TIMER 307 gd->timer = NULL; 308 #endif 309 return dm_init_and_scan(false); 310 } 311 #endif 312 313 __weak int power_init_board(void) 314 { 315 return 0; 316 } 317 318 static int initr_announce(void) 319 { 320 debug("Now running in RAM - U-Boot at: %08lx\n", gd->relocaddr); 321 return 0; 322 } 323 324 #ifdef CONFIG_NEEDS_MANUAL_RELOC 325 static int initr_manual_reloc_cmdtable(void) 326 { 327 fixup_cmdtable(ll_entry_start(cmd_tbl_t, cmd), 328 ll_entry_count(cmd_tbl_t, cmd)); 329 return 0; 330 } 331 #endif 332 333 #if !defined(CONFIG_SYS_NO_FLASH) 334 static int initr_flash(void) 335 { 336 ulong flash_size = 0; 337 bd_t *bd = gd->bd; 338 339 puts("Flash: "); 340 341 if (board_flash_wp_on()) 342 printf("Uninitialized - Write Protect On\n"); 343 else 344 flash_size = flash_init(); 345 346 print_size(flash_size, ""); 347 #ifdef CONFIG_SYS_FLASH_CHECKSUM 348 /* 349 * Compute and print flash CRC if flashchecksum is set to 'y' 350 * 351 * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX 352 */ 353 if (getenv_yesno("flashchecksum") == 1) { 354 printf(" CRC: %08X", crc32(0, 355 (const unsigned char *) CONFIG_SYS_FLASH_BASE, 356 flash_size)); 357 } 358 #endif /* CONFIG_SYS_FLASH_CHECKSUM */ 359 putc('\n'); 360 361 /* update start of FLASH memory */ 362 #ifdef CONFIG_SYS_FLASH_BASE 363 bd->bi_flashstart = CONFIG_SYS_FLASH_BASE; 364 #endif 365 /* size of FLASH memory (final value) */ 366 bd->bi_flashsize = flash_size; 367 368 #if defined(CONFIG_SYS_UPDATE_FLASH_SIZE) 369 /* Make a update of the Memctrl. */ 370 update_flash_size(flash_size); 371 #endif 372 373 374 #if defined(CONFIG_OXC) || defined(CONFIG_RMU) 375 /* flash mapped at end of memory map */ 376 bd->bi_flashoffset = CONFIG_SYS_TEXT_BASE + flash_size; 377 #elif CONFIG_SYS_MONITOR_BASE == CONFIG_SYS_FLASH_BASE 378 bd->bi_flashoffset = monitor_flash_len; /* reserved area for monitor */ 379 #endif 380 return 0; 381 } 382 #endif 383 384 #if defined(CONFIG_PPC) && !defined(CONFIG_DM_SPI) 385 static int initr_spi(void) 386 { 387 /* PPC does this here */ 388 #ifdef CONFIG_SPI 389 #if !defined(CONFIG_ENV_IS_IN_EEPROM) 390 spi_init_f(); 391 #endif 392 spi_init_r(); 393 #endif 394 return 0; 395 } 396 #endif 397 398 #ifdef CONFIG_CMD_NAND 399 /* go init the NAND */ 400 static int initr_nand(void) 401 { 402 puts("NAND: "); 403 nand_init(); 404 return 0; 405 } 406 #endif 407 408 #if defined(CONFIG_CMD_ONENAND) 409 /* go init the NAND */ 410 static int initr_onenand(void) 411 { 412 puts("NAND: "); 413 onenand_init(); 414 return 0; 415 } 416 #endif 417 418 #ifdef CONFIG_GENERIC_MMC 419 static int initr_mmc(void) 420 { 421 puts("MMC: "); 422 mmc_initialize(gd->bd); 423 return 0; 424 } 425 #endif 426 427 #ifdef CONFIG_HAS_DATAFLASH 428 static int initr_dataflash(void) 429 { 430 AT91F_DataflashInit(); 431 dataflash_print_info(); 432 return 0; 433 } 434 #endif 435 436 /* 437 * Tell if it's OK to load the environment early in boot. 438 * 439 * If CONFIG_OF_CONFIG is defined, we'll check with the FDT to see 440 * if this is OK (defaulting to saying it's OK). 441 * 442 * NOTE: Loading the environment early can be a bad idea if security is 443 * important, since no verification is done on the environment. 444 * 445 * @return 0 if environment should not be loaded, !=0 if it is ok to load 446 */ 447 static int should_load_env(void) 448 { 449 #ifdef CONFIG_OF_CONTROL 450 return fdtdec_get_config_int(gd->fdt_blob, "load-environment", 1); 451 #elif defined CONFIG_DELAY_ENVIRONMENT 452 return 0; 453 #else 454 return 1; 455 #endif 456 } 457 458 static int initr_env(void) 459 { 460 /* initialize environment */ 461 if (should_load_env()) 462 env_relocate(); 463 else 464 set_default_env(NULL); 465 #ifdef CONFIG_OF_CONTROL 466 setenv_addr("fdtcontroladdr", gd->fdt_blob); 467 #endif 468 469 /* Initialize from environment */ 470 load_addr = getenv_ulong("loadaddr", 16, load_addr); 471 #if defined(CONFIG_SYS_EXTBDINFO) 472 #if defined(CONFIG_405GP) || defined(CONFIG_405EP) 473 #if defined(CONFIG_I2CFAST) 474 /* 475 * set bi_iic_fast for linux taking environment variable 476 * "i2cfast" into account 477 */ 478 { 479 char *s = getenv("i2cfast"); 480 481 if (s && ((*s == 'y') || (*s == 'Y'))) { 482 gd->bd->bi_iic_fast[0] = 1; 483 gd->bd->bi_iic_fast[1] = 1; 484 } 485 } 486 #endif /* CONFIG_I2CFAST */ 487 #endif /* CONFIG_405GP, CONFIG_405EP */ 488 #endif /* CONFIG_SYS_EXTBDINFO */ 489 return 0; 490 } 491 492 #ifdef CONFIG_SYS_BOOTPARAMS_LEN 493 static int initr_malloc_bootparams(void) 494 { 495 gd->bd->bi_boot_params = (ulong)malloc(CONFIG_SYS_BOOTPARAMS_LEN); 496 if (!gd->bd->bi_boot_params) { 497 puts("WARNING: Cannot allocate space for boot parameters\n"); 498 return -ENOMEM; 499 } 500 return 0; 501 } 502 #endif 503 504 static int initr_jumptable(void) 505 { 506 jumptable_init(); 507 return 0; 508 } 509 510 #if defined(CONFIG_API) 511 static int initr_api(void) 512 { 513 /* Initialize API */ 514 api_init(); 515 return 0; 516 } 517 #endif 518 519 /* enable exceptions */ 520 #if defined(CONFIG_ARM) || defined(CONFIG_AVR32) 521 static int initr_enable_interrupts(void) 522 { 523 enable_interrupts(); 524 return 0; 525 } 526 #endif 527 528 #ifdef CONFIG_CMD_NET 529 static int initr_ethaddr(void) 530 { 531 bd_t *bd = gd->bd; 532 533 /* kept around for legacy kernels only ... ignore the next section */ 534 eth_getenv_enetaddr("ethaddr", bd->bi_enetaddr); 535 #ifdef CONFIG_HAS_ETH1 536 eth_getenv_enetaddr("eth1addr", bd->bi_enet1addr); 537 #endif 538 #ifdef CONFIG_HAS_ETH2 539 eth_getenv_enetaddr("eth2addr", bd->bi_enet2addr); 540 #endif 541 #ifdef CONFIG_HAS_ETH3 542 eth_getenv_enetaddr("eth3addr", bd->bi_enet3addr); 543 #endif 544 #ifdef CONFIG_HAS_ETH4 545 eth_getenv_enetaddr("eth4addr", bd->bi_enet4addr); 546 #endif 547 #ifdef CONFIG_HAS_ETH5 548 eth_getenv_enetaddr("eth5addr", bd->bi_enet5addr); 549 #endif 550 return 0; 551 } 552 #endif /* CONFIG_CMD_NET */ 553 554 #ifdef CONFIG_CMD_KGDB 555 static int initr_kgdb(void) 556 { 557 puts("KGDB: "); 558 kgdb_init(); 559 return 0; 560 } 561 #endif 562 563 #if defined(CONFIG_STATUS_LED) 564 static int initr_status_led(void) 565 { 566 #if defined(STATUS_LED_BOOT) 567 status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING); 568 #else 569 status_led_init(); 570 #endif 571 return 0; 572 } 573 #endif 574 575 #if defined(CONFIG_CMD_AMBAPP) && defined(CONFIG_SYS_AMBAPP_PRINT_ON_STARTUP) 576 extern int do_ambapp_print(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); 577 578 static int initr_ambapp_print(void) 579 { 580 puts("AMBA:\n"); 581 do_ambapp_print(NULL, 0, 0, NULL); 582 583 return 0; 584 } 585 #endif 586 587 #if defined(CONFIG_CMD_SCSI) 588 static int initr_scsi(void) 589 { 590 puts("SCSI: "); 591 scsi_init(); 592 593 return 0; 594 } 595 #endif 596 597 #if defined(CONFIG_CMD_DOC) 598 static int initr_doc(void) 599 { 600 puts("DOC: "); 601 doc_init(); 602 return 0; 603 } 604 #endif 605 606 #ifdef CONFIG_BITBANGMII 607 static int initr_bbmii(void) 608 { 609 bb_miiphy_init(); 610 return 0; 611 } 612 #endif 613 614 #ifdef CONFIG_CMD_NET 615 static int initr_net(void) 616 { 617 puts("Net: "); 618 eth_initialize(); 619 #if defined(CONFIG_RESET_PHY_R) 620 debug("Reset Ethernet PHY\n"); 621 reset_phy(); 622 #endif 623 return 0; 624 } 625 #endif 626 627 #ifdef CONFIG_POST 628 static int initr_post(void) 629 { 630 post_run(NULL, POST_RAM | post_bootmode_get(0)); 631 return 0; 632 } 633 #endif 634 635 #if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_CMD_IDE) 636 static int initr_pcmcia(void) 637 { 638 puts("PCMCIA:"); 639 pcmcia_init(); 640 return 0; 641 } 642 #endif 643 644 #if defined(CONFIG_CMD_IDE) 645 static int initr_ide(void) 646 { 647 #ifdef CONFIG_IDE_8xx_PCCARD 648 puts("PCMCIA:"); 649 #else 650 puts("IDE: "); 651 #endif 652 #if defined(CONFIG_START_IDE) 653 if (board_start_ide()) 654 ide_init(); 655 #else 656 ide_init(); 657 #endif 658 return 0; 659 } 660 #endif 661 662 #if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER) 663 /* 664 * Export available size of memory for Linux, taking into account the 665 * protected RAM at top of memory 666 */ 667 int initr_mem(void) 668 { 669 ulong pram = 0; 670 char memsz[32]; 671 672 # ifdef CONFIG_PRAM 673 pram = getenv_ulong("pram", 10, CONFIG_PRAM); 674 # endif 675 # if defined(CONFIG_LOGBUFFER) && !defined(CONFIG_ALT_LB_ADDR) 676 /* Also take the logbuffer into account (pram is in kB) */ 677 pram += (LOGBUFF_LEN + LOGBUFF_OVERHEAD) / 1024; 678 # endif 679 sprintf(memsz, "%ldk", (long int) ((gd->ram_size / 1024) - pram)); 680 setenv("mem", memsz); 681 682 return 0; 683 } 684 #endif 685 686 #ifdef CONFIG_CMD_BEDBUG 687 static int initr_bedbug(void) 688 { 689 bedbug_init(); 690 691 return 0; 692 } 693 #endif 694 695 #ifdef CONFIG_PS2KBD 696 static int initr_kbd(void) 697 { 698 puts("PS/2: "); 699 kbd_init(); 700 return 0; 701 } 702 #endif 703 704 static int run_main_loop(void) 705 { 706 #ifdef CONFIG_SANDBOX 707 sandbox_main_loop_init(); 708 #endif 709 /* main_loop() can return to retry autoboot, if so just run it again */ 710 for (;;) 711 main_loop(); 712 return 0; 713 } 714 715 /* 716 * Over time we hope to remove these functions with code fragments and 717 * stub funtcions, and instead call the relevant function directly. 718 * 719 * We also hope to remove most of the driver-related init and do it if/when 720 * the driver is later used. 721 * 722 * TODO: perhaps reset the watchdog in the initcall function after each call? 723 */ 724 init_fnc_t init_sequence_r[] = { 725 initr_trace, 726 initr_reloc, 727 /* TODO: could x86/PPC have this also perhaps? */ 728 #ifdef CONFIG_ARM 729 initr_caches, 730 /* Note: For Freescale LS2 SoCs, new MMU table is created in DDR. 731 * A temporary mapping of IFC high region is since removed, 732 * so environmental variables in NOR flash is not availble 733 * until board_init() is called below to remap IFC to high 734 * region. 735 */ 736 #endif 737 initr_reloc_global_data, 738 #if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500) 739 initr_unlock_ram_in_cache, 740 #endif 741 initr_barrier, 742 initr_malloc, 743 initr_console_record, 744 #ifdef CONFIG_SYS_NONCACHED_MEMORY 745 initr_noncached, 746 #endif 747 bootstage_relocate, 748 #ifdef CONFIG_DM 749 initr_dm, 750 #endif 751 #if defined(CONFIG_ARM) || defined(CONFIG_NDS32) 752 board_init, /* Setup chipselects */ 753 #endif 754 /* 755 * TODO: printing of the clock inforamtion of the board is now 756 * implemented as part of bdinfo command. Currently only support for 757 * davinci SOC's is added. Remove this check once all the board 758 * implement this. 759 */ 760 #ifdef CONFIG_CLOCKS 761 set_cpu_clk_info, /* Setup clock information */ 762 #endif 763 stdio_init_tables, 764 initr_serial, 765 initr_announce, 766 INIT_FUNC_WATCHDOG_RESET 767 #ifdef CONFIG_NEEDS_MANUAL_RELOC 768 initr_manual_reloc_cmdtable, 769 #endif 770 #if defined(CONFIG_PPC) || defined(CONFIG_M68K) 771 initr_trap, 772 #endif 773 #ifdef CONFIG_ADDR_MAP 774 initr_addr_map, 775 #endif 776 #if defined(CONFIG_BOARD_EARLY_INIT_R) 777 board_early_init_r, 778 #endif 779 INIT_FUNC_WATCHDOG_RESET 780 #ifdef CONFIG_LOGBUFFER 781 initr_logbuffer, 782 #endif 783 #ifdef CONFIG_POST 784 initr_post_backlog, 785 #endif 786 INIT_FUNC_WATCHDOG_RESET 787 #ifdef CONFIG_SYS_DELAYED_ICACHE 788 initr_icache_enable, 789 #endif 790 #if defined(CONFIG_PCI) && defined(CONFIG_SYS_EARLY_PCI_INIT) 791 /* 792 * Do early PCI configuration _before_ the flash gets initialised, 793 * because PCU ressources are crucial for flash access on some boards. 794 */ 795 initr_pci, 796 #endif 797 #ifdef CONFIG_WINBOND_83C553 798 initr_w83c553f, 799 #endif 800 #ifdef CONFIG_ARCH_EARLY_INIT_R 801 arch_early_init_r, 802 #endif 803 power_init_board, 804 #ifndef CONFIG_SYS_NO_FLASH 805 initr_flash, 806 #endif 807 INIT_FUNC_WATCHDOG_RESET 808 #if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_X86) 809 /* initialize higher level parts of CPU like time base and timers */ 810 cpu_init_r, 811 #endif 812 #ifdef CONFIG_PPC 813 initr_spi, 814 #endif 815 #ifdef CONFIG_CMD_NAND 816 initr_nand, 817 #endif 818 #ifdef CONFIG_CMD_ONENAND 819 initr_onenand, 820 #endif 821 #ifdef CONFIG_GENERIC_MMC 822 initr_mmc, 823 #endif 824 #ifdef CONFIG_HAS_DATAFLASH 825 initr_dataflash, 826 #endif 827 initr_env, 828 #ifdef CONFIG_SYS_BOOTPARAMS_LEN 829 initr_malloc_bootparams, 830 #endif 831 INIT_FUNC_WATCHDOG_RESET 832 initr_secondary_cpu, 833 #if defined(CONFIG_ID_EEPROM) || defined(CONFIG_SYS_I2C_MAC_OFFSET) 834 mac_read_from_eeprom, 835 #endif 836 INIT_FUNC_WATCHDOG_RESET 837 #if defined(CONFIG_PCI) && !defined(CONFIG_SYS_EARLY_PCI_INIT) 838 /* 839 * Do pci configuration 840 */ 841 initr_pci, 842 #endif 843 stdio_add_devices, 844 initr_jumptable, 845 #ifdef CONFIG_API 846 initr_api, 847 #endif 848 console_init_r, /* fully init console as a device */ 849 #ifdef CONFIG_DISPLAY_BOARDINFO_LATE 850 show_board_info, 851 #endif 852 #ifdef CONFIG_ARCH_MISC_INIT 853 arch_misc_init, /* miscellaneous arch-dependent init */ 854 #endif 855 #ifdef CONFIG_MISC_INIT_R 856 misc_init_r, /* miscellaneous platform-dependent init */ 857 #endif 858 INIT_FUNC_WATCHDOG_RESET 859 #ifdef CONFIG_CMD_KGDB 860 initr_kgdb, 861 #endif 862 interrupt_init, 863 #if defined(CONFIG_ARM) || defined(CONFIG_AVR32) 864 initr_enable_interrupts, 865 #endif 866 #if defined(CONFIG_MICROBLAZE) || defined(CONFIG_AVR32) || defined(CONFIG_M68K) 867 timer_init, /* initialize timer */ 868 #endif 869 #if defined(CONFIG_STATUS_LED) 870 initr_status_led, 871 #endif 872 /* PPC has a udelay(20) here dating from 2002. Why? */ 873 #ifdef CONFIG_CMD_NET 874 initr_ethaddr, 875 #endif 876 #ifdef CONFIG_BOARD_LATE_INIT 877 board_late_init, 878 #endif 879 #if defined(CONFIG_CMD_AMBAPP) 880 ambapp_init_reloc, 881 #if defined(CONFIG_SYS_AMBAPP_PRINT_ON_STARTUP) 882 initr_ambapp_print, 883 #endif 884 #endif 885 #ifdef CONFIG_CMD_SCSI 886 INIT_FUNC_WATCHDOG_RESET 887 initr_scsi, 888 #endif 889 #ifdef CONFIG_CMD_DOC 890 INIT_FUNC_WATCHDOG_RESET 891 initr_doc, 892 #endif 893 #ifdef CONFIG_BITBANGMII 894 initr_bbmii, 895 #endif 896 #ifdef CONFIG_CMD_NET 897 INIT_FUNC_WATCHDOG_RESET 898 initr_net, 899 #endif 900 #ifdef CONFIG_POST 901 initr_post, 902 #endif 903 #if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_CMD_IDE) 904 initr_pcmcia, 905 #endif 906 #if defined(CONFIG_CMD_IDE) 907 initr_ide, 908 #endif 909 #ifdef CONFIG_LAST_STAGE_INIT 910 INIT_FUNC_WATCHDOG_RESET 911 /* 912 * Some parts can be only initialized if all others (like 913 * Interrupts) are up and running (i.e. the PC-style ISA 914 * keyboard). 915 */ 916 last_stage_init, 917 #endif 918 #ifdef CONFIG_CMD_BEDBUG 919 INIT_FUNC_WATCHDOG_RESET 920 initr_bedbug, 921 #endif 922 #if defined(CONFIG_PRAM) || defined(CONFIG_LOGBUFFER) 923 initr_mem, 924 #endif 925 #ifdef CONFIG_PS2KBD 926 initr_kbd, 927 #endif 928 run_main_loop, 929 }; 930 931 void board_init_r(gd_t *new_gd, ulong dest_addr) 932 { 933 #ifdef CONFIG_NEEDS_MANUAL_RELOC 934 int i; 935 #endif 936 937 #ifdef CONFIG_AVR32 938 mmu_init_r(dest_addr); 939 #endif 940 941 #if !defined(CONFIG_X86) && !defined(CONFIG_ARM) && !defined(CONFIG_ARM64) 942 gd = new_gd; 943 #endif 944 945 #ifdef CONFIG_NEEDS_MANUAL_RELOC 946 for (i = 0; i < ARRAY_SIZE(init_sequence_r); i++) 947 init_sequence_r[i] += gd->reloc_off; 948 #endif 949 950 if (initcall_run_list(init_sequence_r)) 951 hang(); 952 953 /* NOTREACHED - run_main_loop() does not return */ 954 hang(); 955 } 956