183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
26f6430d7SSimon Glass /*
36f6430d7SSimon Glass * Copyright (c) 2011 The Chromium OS Authors.
46f6430d7SSimon Glass * (C) Copyright 2002-2006
56f6430d7SSimon Glass * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
66f6430d7SSimon Glass *
76f6430d7SSimon Glass * (C) Copyright 2002
86f6430d7SSimon Glass * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
96f6430d7SSimon Glass * Marius Groeger <mgroeger@sysgo.de>
106f6430d7SSimon Glass */
116f6430d7SSimon Glass
126f6430d7SSimon Glass #include <common.h>
1312d738aeSSimon Glass #include <api.h>
14c2240d4dSSimon Glass /* TODO: can we just include all these headers whether needed or not? */
15c2240d4dSSimon Glass #if defined(CONFIG_CMD_BEDBUG)
16c2240d4dSSimon Glass #include <bedbug/type.h>
17c2240d4dSSimon Glass #endif
18cbb2df20STom Rini #include <command.h>
1924b852a7SSimon Glass #include <console.h>
201ce60176SSimon Glass #include <dm.h>
216f6430d7SSimon Glass #include <environment.h>
226f6430d7SSimon Glass #include <fdtdec.h>
23c2240d4dSSimon Glass #include <ide.h>
246f6430d7SSimon Glass #include <initcall.h>
25c2240d4dSSimon Glass #if defined(CONFIG_CMD_KGDB)
26c2240d4dSSimon Glass #include <kgdb.h>
27c2240d4dSSimon Glass #endif
286f6430d7SSimon Glass #include <malloc.h>
290eb25b61SJoe Hershberger #include <mapmem.h>
30c2240d4dSSimon Glass #ifdef CONFIG_BITBANGMII
31c2240d4dSSimon Glass #include <miiphy.h>
32c2240d4dSSimon Glass #endif
336f6430d7SSimon Glass #include <mmc.h>
346f6430d7SSimon Glass #include <nand.h>
353af86a4eSSimon Glass #include <of_live.h>
366f6430d7SSimon Glass #include <onenand_uboot.h>
37c2240d4dSSimon Glass #include <scsi.h>
386f6430d7SSimon Glass #include <serial.h>
396f6430d7SSimon Glass #include <stdio_dev.h>
401057e6cfSSimon Glass #include <timer.h>
4171c52dbaSSimon Glass #include <trace.h>
42c2240d4dSSimon Glass #include <watchdog.h>
43c2240d4dSSimon Glass #ifdef CONFIG_ADDR_MAP
44c2240d4dSSimon Glass #include <asm/mmu.h>
45c2240d4dSSimon Glass #endif
466f6430d7SSimon Glass #include <asm/sections.h>
471ce60176SSimon Glass #include <dm/root.h>
48c2240d4dSSimon Glass #include <linux/compiler.h>
491ce60176SSimon Glass #include <linux/err.h>
5050149ea3SAlexander Graf #include <efi_loader.h>
51*dab778a2SHeiko Schocher #if defined(CONFIG_GPIO_HOG)
5204c095b2SHeiko Schocher #include <asm/gpio.h>
5304c095b2SHeiko Schocher #endif
546f6430d7SSimon Glass
556f6430d7SSimon Glass DECLARE_GLOBAL_DATA_PTR;
566f6430d7SSimon Glass
576f6430d7SSimon Glass ulong monitor_flash_len;
586f6430d7SSimon Glass
board_flash_wp_on(void)59dd2a6cd0SJeroen Hofstee __weak int board_flash_wp_on(void)
60c2240d4dSSimon Glass {
61c2240d4dSSimon Glass /*
62c2240d4dSSimon Glass * Most flashes can't be detected when write protection is enabled,
63c2240d4dSSimon Glass * so provide a way to let U-Boot gracefully ignore write protected
64c2240d4dSSimon Glass * devices.
65c2240d4dSSimon Glass */
66c2240d4dSSimon Glass return 0;
67c2240d4dSSimon Glass }
68c2240d4dSSimon Glass
cpu_secondary_init_r(void)69dd2a6cd0SJeroen Hofstee __weak void cpu_secondary_init_r(void)
70c2240d4dSSimon Glass {
71c2240d4dSSimon Glass }
72c2240d4dSSimon Glass
initr_secondary_cpu(void)73c2240d4dSSimon Glass static int initr_secondary_cpu(void)
74c2240d4dSSimon Glass {
75c2240d4dSSimon Glass /*
76c2240d4dSSimon Glass * after non-volatile devices & environment is setup and cpu code have
77c2240d4dSSimon Glass * another round to deal with any initialization that might require
78c2240d4dSSimon Glass * full access to the environment or loading of some image (firmware)
79c2240d4dSSimon Glass * from a non-volatile device
80c2240d4dSSimon Glass */
81c2240d4dSSimon Glass /* TODO: maybe define this for all archs? */
82c2240d4dSSimon Glass cpu_secondary_init_r();
83c2240d4dSSimon Glass
84c2240d4dSSimon Glass return 0;
85c2240d4dSSimon Glass }
866f6430d7SSimon Glass
initr_trace(void)8771c52dbaSSimon Glass static int initr_trace(void)
8871c52dbaSSimon Glass {
8971c52dbaSSimon Glass #ifdef CONFIG_TRACE
9071c52dbaSSimon Glass trace_init(gd->trace_buff, CONFIG_TRACE_BUFFER_SIZE);
9171c52dbaSSimon Glass #endif
9271c52dbaSSimon Glass
9371c52dbaSSimon Glass return 0;
9471c52dbaSSimon Glass }
9571c52dbaSSimon Glass
initr_reloc(void)966f6430d7SSimon Glass static int initr_reloc(void)
976f6430d7SSimon Glass {
98c9356be3SSimon Glass /* tell others: relocation done */
99c9356be3SSimon Glass gd->flags |= GD_FLG_RELOC | GD_FLG_FULL_MALLOC_INIT;
1006f6430d7SSimon Glass
1016f6430d7SSimon Glass return 0;
1026f6430d7SSimon Glass }
1036f6430d7SSimon Glass
1046f6430d7SSimon Glass #ifdef CONFIG_ARM
1056f6430d7SSimon Glass /*
1066f6430d7SSimon Glass * Some of these functions are needed purely because the functions they
1076f6430d7SSimon Glass * call return void. If we change them to return 0, these stubs can go away.
1086f6430d7SSimon Glass */
initr_caches(void)1096f6430d7SSimon Glass static int initr_caches(void)
1106f6430d7SSimon Glass {
1116f6430d7SSimon Glass /* Enable caches */
1126f6430d7SSimon Glass enable_caches();
1136f6430d7SSimon Glass return 0;
1146f6430d7SSimon Glass }
1156f6430d7SSimon Glass #endif
1166f6430d7SSimon Glass
fixup_cpu(void)117c2240d4dSSimon Glass __weak int fixup_cpu(void)
118c2240d4dSSimon Glass {
119c2240d4dSSimon Glass return 0;
120c2240d4dSSimon Glass }
121c2240d4dSSimon Glass
initr_reloc_global_data(void)1226f6430d7SSimon Glass static int initr_reloc_global_data(void)
1236f6430d7SSimon Glass {
124b60eff31SAlbert ARIBAUD #ifdef __ARM__
125b60eff31SAlbert ARIBAUD monitor_flash_len = _end - __image_copy_start;
126068feb9bSRick Chen #elif defined(CONFIG_NDS32) || defined(CONFIG_RISCV)
1272e88bb28SKun-Hua Huang monitor_flash_len = (ulong)&_end - (ulong)&_start;
1285ff10aa7SThomas Chou #elif !defined(CONFIG_SANDBOX) && !defined(CONFIG_NIOS2)
129a0ba279aSMasahiro Yamada monitor_flash_len = (ulong)&__init_end - gd->relocaddr;
1306f6430d7SSimon Glass #endif
131c2240d4dSSimon Glass #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
132c2240d4dSSimon Glass /*
133c2240d4dSSimon Glass * The gd->cpu pointer is set to an address in flash before relocation.
134c2240d4dSSimon Glass * We need to update it to point to the same CPU entry in RAM.
135c2240d4dSSimon Glass * TODO: why not just add gd->reloc_ofs?
136c2240d4dSSimon Glass */
137a0ba279aSMasahiro Yamada gd->arch.cpu += gd->relocaddr - CONFIG_SYS_MONITOR_BASE;
138c2240d4dSSimon Glass
139c2240d4dSSimon Glass /*
140c2240d4dSSimon Glass * If we didn't know the cpu mask & # cores, we can save them of
141c2240d4dSSimon Glass * now rather than 'computing' them constantly
142c2240d4dSSimon Glass */
143c2240d4dSSimon Glass fixup_cpu();
144c2240d4dSSimon Glass #endif
1456c6add60SSimon Goldschmidt #if !defined(CONFIG_ENV_ADDR) || defined(ENV_IS_EMBEDDED)
146c2240d4dSSimon Glass /*
1476c6add60SSimon Goldschmidt * Relocate the early env_addr pointer unless we know it is not inside
1486c6add60SSimon Goldschmidt * the binary. Some systems need this and for the rest, it doesn't hurt.
149c2240d4dSSimon Glass */
1506c6add60SSimon Goldschmidt gd->env_addr += gd->reloc_off;
151c2240d4dSSimon Glass #endif
152e9acb9eaSSiva Durga Prasad Paladugu #ifdef CONFIG_OF_EMBED
153e9acb9eaSSiva Durga Prasad Paladugu /*
154e9acb9eaSSiva Durga Prasad Paladugu * The fdt_blob needs to be moved to new relocation address
155e9acb9eaSSiva Durga Prasad Paladugu * incase of FDT blob is embedded with in image
156e9acb9eaSSiva Durga Prasad Paladugu */
157e9acb9eaSSiva Durga Prasad Paladugu gd->fdt_blob += gd->reloc_off;
158e9acb9eaSSiva Durga Prasad Paladugu #endif
15950149ea3SAlexander Graf #ifdef CONFIG_EFI_LOADER
16050149ea3SAlexander Graf efi_runtime_relocate(gd->relocaddr, NULL);
16150149ea3SAlexander Graf #endif
162e9acb9eaSSiva Durga Prasad Paladugu
163c2240d4dSSimon Glass return 0;
1646f6430d7SSimon Glass }
1656f6430d7SSimon Glass
initr_serial(void)1666f6430d7SSimon Glass static int initr_serial(void)
1676f6430d7SSimon Glass {
1686f6430d7SSimon Glass serial_initialize();
1696f6430d7SSimon Glass return 0;
1706f6430d7SSimon Glass }
1716f6430d7SSimon Glass
1724c2cb115SDaniel Schwierzeck #if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_MIPS)
initr_trap(void)173c2240d4dSSimon Glass static int initr_trap(void)
174c2240d4dSSimon Glass {
175c2240d4dSSimon Glass /*
176c2240d4dSSimon Glass * Setup trap handlers
177c2240d4dSSimon Glass */
178e310b93eSangelo@sysam.it #if defined(CONFIG_PPC)
179a0ba279aSMasahiro Yamada trap_init(gd->relocaddr);
180e310b93eSangelo@sysam.it #else
181e310b93eSangelo@sysam.it trap_init(CONFIG_SYS_SDRAM_BASE);
182e310b93eSangelo@sysam.it #endif
183c2240d4dSSimon Glass return 0;
184c2240d4dSSimon Glass }
185c2240d4dSSimon Glass #endif
186c2240d4dSSimon Glass
187c2240d4dSSimon Glass #ifdef CONFIG_ADDR_MAP
initr_addr_map(void)188c2240d4dSSimon Glass static int initr_addr_map(void)
189c2240d4dSSimon Glass {
190c2240d4dSSimon Glass init_addr_map();
191c2240d4dSSimon Glass
192c2240d4dSSimon Glass return 0;
193c2240d4dSSimon Glass }
194c2240d4dSSimon Glass #endif
195c2240d4dSSimon Glass
1966f6430d7SSimon Glass #ifdef CONFIG_POST
initr_post_backlog(void)1976f6430d7SSimon Glass static int initr_post_backlog(void)
1986f6430d7SSimon Glass {
1996f6430d7SSimon Glass post_output_backlog();
2006f6430d7SSimon Glass return 0;
2016f6430d7SSimon Glass }
2026f6430d7SSimon Glass #endif
2036f6430d7SSimon Glass
204c2240d4dSSimon Glass #if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
initr_unlock_ram_in_cache(void)205c2240d4dSSimon Glass static int initr_unlock_ram_in_cache(void)
206c2240d4dSSimon Glass {
207c2240d4dSSimon Glass unlock_ram_in_cache(); /* it's time to unlock D-cache in e500 */
208c2240d4dSSimon Glass return 0;
209c2240d4dSSimon Glass }
210c2240d4dSSimon Glass #endif
211c2240d4dSSimon Glass
212c2240d4dSSimon Glass #ifdef CONFIG_PCI
initr_pci(void)213c2240d4dSSimon Glass static int initr_pci(void)
214c2240d4dSSimon Glass {
215ff3e077bSSimon Glass #ifndef CONFIG_DM_PCI
216c2240d4dSSimon Glass pci_init();
217ff3e077bSSimon Glass #endif
218c2240d4dSSimon Glass
219c2240d4dSSimon Glass return 0;
220c2240d4dSSimon Glass }
221c2240d4dSSimon Glass #endif
222c2240d4dSSimon Glass
initr_barrier(void)223c2240d4dSSimon Glass static int initr_barrier(void)
224c2240d4dSSimon Glass {
225c2240d4dSSimon Glass #ifdef CONFIG_PPC
226c2240d4dSSimon Glass /* TODO: Can we not use dmb() macros for this? */
227c2240d4dSSimon Glass asm("sync ; isync");
228c2240d4dSSimon Glass #endif
229c2240d4dSSimon Glass return 0;
230c2240d4dSSimon Glass }
231c2240d4dSSimon Glass
initr_malloc(void)2326f6430d7SSimon Glass static int initr_malloc(void)
2336f6430d7SSimon Glass {
2346f6430d7SSimon Glass ulong malloc_start;
2356f6430d7SSimon Glass
236f1896c45SAndy Yan #if CONFIG_VAL(SYS_MALLOC_F_LEN)
237d59476b6SSimon Glass debug("Pre-reloc malloc() used %#lx bytes (%ld KB)\n", gd->malloc_ptr,
238d59476b6SSimon Glass gd->malloc_ptr / 1024);
239d59476b6SSimon Glass #endif
2406f6430d7SSimon Glass /* The malloc area is immediately below the monitor copy in DRAM */
241a0ba279aSMasahiro Yamada malloc_start = gd->relocaddr - TOTAL_MALLOC_LEN;
242a733b06bSSimon Glass mem_malloc_init((ulong)map_sysmem(malloc_start, TOTAL_MALLOC_LEN),
243a733b06bSSimon Glass TOTAL_MALLOC_LEN);
2446f6430d7SSimon Glass return 0;
2456f6430d7SSimon Glass }
2466f6430d7SSimon Glass
initr_console_record(void)2479854a874SSimon Glass static int initr_console_record(void)
2489854a874SSimon Glass {
2499854a874SSimon Glass #if defined(CONFIG_CONSOLE_RECORD)
2509854a874SSimon Glass return console_record_init();
2519854a874SSimon Glass #else
2529854a874SSimon Glass return 0;
2539854a874SSimon Glass #endif
2549854a874SSimon Glass }
2559854a874SSimon Glass
256671fa63eSJan Kiszka #ifdef CONFIG_SYS_NONCACHED_MEMORY
initr_noncached(void)257671fa63eSJan Kiszka static int initr_noncached(void)
258671fa63eSJan Kiszka {
259671fa63eSJan Kiszka noncached_init();
260671fa63eSJan Kiszka return 0;
261671fa63eSJan Kiszka }
262671fa63eSJan Kiszka #endif
263671fa63eSJan Kiszka
2643af86a4eSSimon Glass #ifdef CONFIG_OF_LIVE
initr_of_live(void)2653af86a4eSSimon Glass static int initr_of_live(void)
2663af86a4eSSimon Glass {
267a132f770SSimon Glass int ret;
268a132f770SSimon Glass
269a132f770SSimon Glass bootstage_start(BOOTSTAGE_ID_ACCUM_OF_LIVE, "of_live");
270a132f770SSimon Glass ret = of_live_build(gd->fdt_blob, (struct device_node **)&gd->of_root);
271a132f770SSimon Glass bootstage_accum(BOOTSTAGE_ID_ACCUM_OF_LIVE);
272a132f770SSimon Glass if (ret)
273a132f770SSimon Glass return ret;
274a132f770SSimon Glass
275a132f770SSimon Glass return 0;
2763af86a4eSSimon Glass }
2773af86a4eSSimon Glass #endif
2783af86a4eSSimon Glass
2791ce60176SSimon Glass #ifdef CONFIG_DM
initr_dm(void)2801ce60176SSimon Glass static int initr_dm(void)
2811ce60176SSimon Glass {
2821057e6cfSSimon Glass int ret;
2831057e6cfSSimon Glass
284ab7cd627SSimon Glass /* Save the pre-reloc driver model and start a new one */
285ab7cd627SSimon Glass gd->dm_root_f = gd->dm_root;
286ab7cd627SSimon Glass gd->dm_root = NULL;
287d74d6b44SSimon Glass #ifdef CONFIG_TIMER
288d74d6b44SSimon Glass gd->timer = NULL;
289d74d6b44SSimon Glass #endif
29063c5bf48SSimon Glass bootstage_start(BOOTSTATE_ID_ACCUM_DM_R, "dm_r");
2911057e6cfSSimon Glass ret = dm_init_and_scan(false);
29263c5bf48SSimon Glass bootstage_accum(BOOTSTATE_ID_ACCUM_DM_R);
2931057e6cfSSimon Glass if (ret)
2941057e6cfSSimon Glass return ret;
2951057e6cfSSimon Glass #ifdef CONFIG_TIMER_EARLY
2961057e6cfSSimon Glass ret = dm_timer_init();
2971057e6cfSSimon Glass if (ret)
2981057e6cfSSimon Glass return ret;
2998f41b878SThomas Chou #endif
3001057e6cfSSimon Glass
3011057e6cfSSimon Glass return 0;
3021ce60176SSimon Glass }
3031ce60176SSimon Glass #endif
3041ce60176SSimon Glass
initr_bootstage(void)305881c124aSSimon Glass static int initr_bootstage(void)
306881c124aSSimon Glass {
307881c124aSSimon Glass bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_R, "board_init_r");
308881c124aSSimon Glass
309881c124aSSimon Glass return 0;
310881c124aSSimon Glass }
311881c124aSSimon Glass
power_init_board(void)3126f6430d7SSimon Glass __weak int power_init_board(void)
3136f6430d7SSimon Glass {
3146f6430d7SSimon Glass return 0;
3156f6430d7SSimon Glass }
3166f6430d7SSimon Glass
initr_announce(void)3176f6430d7SSimon Glass static int initr_announce(void)
3186f6430d7SSimon Glass {
319a0ba279aSMasahiro Yamada debug("Now running in RAM - U-Boot at: %08lx\n", gd->relocaddr);
3206f6430d7SSimon Glass return 0;
3216f6430d7SSimon Glass }
3226f6430d7SSimon Glass
32361d7b1bbSAndreas Bießmann #ifdef CONFIG_NEEDS_MANUAL_RELOC
initr_manual_reloc_cmdtable(void)32461d7b1bbSAndreas Bießmann static int initr_manual_reloc_cmdtable(void)
32561d7b1bbSAndreas Bießmann {
32661d7b1bbSAndreas Bießmann fixup_cmdtable(ll_entry_start(cmd_tbl_t, cmd),
32761d7b1bbSAndreas Bießmann ll_entry_count(cmd_tbl_t, cmd));
32861d7b1bbSAndreas Bießmann return 0;
32961d7b1bbSAndreas Bießmann }
33061d7b1bbSAndreas Bießmann #endif
33161d7b1bbSAndreas Bießmann
332e856bdcfSMasahiro Yamada #if defined(CONFIG_MTD_NOR_FLASH)
initr_flash(void)3336f6430d7SSimon Glass static int initr_flash(void)
3346f6430d7SSimon Glass {
335c2240d4dSSimon Glass ulong flash_size = 0;
336c2240d4dSSimon Glass bd_t *bd = gd->bd;
3376f6430d7SSimon Glass
3386f6430d7SSimon Glass puts("Flash: ");
3396f6430d7SSimon Glass
34070879a92SMasahiro Yamada if (board_flash_wp_on())
341c2240d4dSSimon Glass printf("Uninitialized - Write Protect On\n");
34270879a92SMasahiro Yamada else
3436f6430d7SSimon Glass flash_size = flash_init();
34470879a92SMasahiro Yamada
3456f6430d7SSimon Glass print_size(flash_size, "");
3466f6430d7SSimon Glass #ifdef CONFIG_SYS_FLASH_CHECKSUM
3476f6430d7SSimon Glass /*
3486f6430d7SSimon Glass * Compute and print flash CRC if flashchecksum is set to 'y'
3496f6430d7SSimon Glass *
3506f6430d7SSimon Glass * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX
3516f6430d7SSimon Glass */
352bfebc8c9SSimon Glass if (env_get_yesno("flashchecksum") == 1) {
35392f84b67SMario Six const uchar *flash_base = (const uchar *)CONFIG_SYS_FLASH_BASE;
35492f84b67SMario Six
3556f6430d7SSimon Glass printf(" CRC: %08X", crc32(0,
35692f84b67SMario Six flash_base,
3576f6430d7SSimon Glass flash_size));
3586f6430d7SSimon Glass }
3596f6430d7SSimon Glass #endif /* CONFIG_SYS_FLASH_CHECKSUM */
3606f6430d7SSimon Glass putc('\n');
3616f6430d7SSimon Glass
362c2240d4dSSimon Glass /* update start of FLASH memory */
363c2240d4dSSimon Glass #ifdef CONFIG_SYS_FLASH_BASE
364c2240d4dSSimon Glass bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
365c2240d4dSSimon Glass #endif
366c2240d4dSSimon Glass /* size of FLASH memory (final value) */
367c2240d4dSSimon Glass bd->bi_flashsize = flash_size;
368c2240d4dSSimon Glass
369c2240d4dSSimon Glass #if defined(CONFIG_SYS_UPDATE_FLASH_SIZE)
370c2240d4dSSimon Glass /* Make a update of the Memctrl. */
371c2240d4dSSimon Glass update_flash_size(flash_size);
372c2240d4dSSimon Glass #endif
373c2240d4dSSimon Glass
374c2240d4dSSimon Glass #if defined(CONFIG_OXC) || defined(CONFIG_RMU)
375c2240d4dSSimon Glass /* flash mapped at end of memory map */
376c2240d4dSSimon Glass bd->bi_flashoffset = CONFIG_SYS_TEXT_BASE + flash_size;
377c2240d4dSSimon Glass #elif CONFIG_SYS_MONITOR_BASE == CONFIG_SYS_FLASH_BASE
378c2240d4dSSimon Glass bd->bi_flashoffset = monitor_flash_len; /* reserved area for monitor */
379c2240d4dSSimon Glass #endif
380c2240d4dSSimon Glass return 0;
381c2240d4dSSimon Glass }
382c2240d4dSSimon Glass #endif
383c2240d4dSSimon Glass
3846f6430d7SSimon Glass #ifdef CONFIG_CMD_NAND
3856f6430d7SSimon Glass /* go init the NAND */
initr_nand(void)3862588ba14SJeroen Hofstee static int initr_nand(void)
3876f6430d7SSimon Glass {
3886f6430d7SSimon Glass puts("NAND: ");
3896f6430d7SSimon Glass nand_init();
390203db38aSHou Zhiqiang printf("%lu MiB\n", nand_size() / 1024);
3916f6430d7SSimon Glass return 0;
3926f6430d7SSimon Glass }
3936f6430d7SSimon Glass #endif
3946f6430d7SSimon Glass
3956f6430d7SSimon Glass #if defined(CONFIG_CMD_ONENAND)
3966f6430d7SSimon Glass /* go init the NAND */
initr_onenand(void)3972588ba14SJeroen Hofstee static int initr_onenand(void)
3986f6430d7SSimon Glass {
3996f6430d7SSimon Glass puts("NAND: ");
4006f6430d7SSimon Glass onenand_init();
4016f6430d7SSimon Glass return 0;
4026f6430d7SSimon Glass }
4036f6430d7SSimon Glass #endif
4046f6430d7SSimon Glass
4054aa2ba3aSMasahiro Yamada #ifdef CONFIG_MMC
initr_mmc(void)4062588ba14SJeroen Hofstee static int initr_mmc(void)
4076f6430d7SSimon Glass {
4086f6430d7SSimon Glass puts("MMC: ");
4096f6430d7SSimon Glass mmc_initialize(gd->bd);
4106f6430d7SSimon Glass return 0;
4116f6430d7SSimon Glass }
4126f6430d7SSimon Glass #endif
4136f6430d7SSimon Glass
4146f6430d7SSimon Glass /*
4156f6430d7SSimon Glass * Tell if it's OK to load the environment early in boot.
4166f6430d7SSimon Glass *
417776babd7SMasahiro Yamada * If CONFIG_OF_CONTROL is defined, we'll check with the FDT to see
4186f6430d7SSimon Glass * if this is OK (defaulting to saying it's OK).
4196f6430d7SSimon Glass *
4206f6430d7SSimon Glass * NOTE: Loading the environment early can be a bad idea if security is
4216f6430d7SSimon Glass * important, since no verification is done on the environment.
4226f6430d7SSimon Glass *
4236f6430d7SSimon Glass * @return 0 if environment should not be loaded, !=0 if it is ok to load
4246f6430d7SSimon Glass */
should_load_env(void)4256f6430d7SSimon Glass static int should_load_env(void)
4266f6430d7SSimon Glass {
4276f6430d7SSimon Glass #ifdef CONFIG_OF_CONTROL
4286f6430d7SSimon Glass return fdtdec_get_config_int(gd->fdt_blob, "load-environment", 1);
4296f6430d7SSimon Glass #elif defined CONFIG_DELAY_ENVIRONMENT
4306f6430d7SSimon Glass return 0;
4316f6430d7SSimon Glass #else
4326f6430d7SSimon Glass return 1;
4336f6430d7SSimon Glass #endif
4346f6430d7SSimon Glass }
4356f6430d7SSimon Glass
initr_env(void)4366f6430d7SSimon Glass static int initr_env(void)
4376f6430d7SSimon Glass {
4386f6430d7SSimon Glass /* initialize environment */
4396f6430d7SSimon Glass if (should_load_env())
4406f6430d7SSimon Glass env_relocate();
4416f6430d7SSimon Glass else
442c5d548a9SYaniv Levinsky set_default_env(NULL, 0);
443545dfd10SThomas Chou #ifdef CONFIG_OF_CONTROL
444f980c999SHeinrich Schuchardt env_set_hex("fdtcontroladdr",
445f980c999SHeinrich Schuchardt (unsigned long)map_to_sysmem(gd->fdt_blob));
446545dfd10SThomas Chou #endif
4476f6430d7SSimon Glass
4486f6430d7SSimon Glass /* Initialize from environment */
449bfebc8c9SSimon Glass load_addr = env_get_ulong("loadaddr", 16, load_addr);
450c2240d4dSSimon Glass
4516f6430d7SSimon Glass return 0;
4526f6430d7SSimon Glass }
4536f6430d7SSimon Glass
454c722f0b0SAndreas Bießmann #ifdef CONFIG_SYS_BOOTPARAMS_LEN
initr_malloc_bootparams(void)455c722f0b0SAndreas Bießmann static int initr_malloc_bootparams(void)
456c722f0b0SAndreas Bießmann {
457c722f0b0SAndreas Bießmann gd->bd->bi_boot_params = (ulong)malloc(CONFIG_SYS_BOOTPARAMS_LEN);
458c722f0b0SAndreas Bießmann if (!gd->bd->bi_boot_params) {
459c722f0b0SAndreas Bießmann puts("WARNING: Cannot allocate space for boot parameters\n");
460c722f0b0SAndreas Bießmann return -ENOMEM;
461c722f0b0SAndreas Bießmann }
462c722f0b0SAndreas Bießmann return 0;
463c722f0b0SAndreas Bießmann }
464c722f0b0SAndreas Bießmann #endif
465c722f0b0SAndreas Bießmann
initr_jumptable(void)4666f6430d7SSimon Glass static int initr_jumptable(void)
4676f6430d7SSimon Glass {
4686f6430d7SSimon Glass jumptable_init();
4696f6430d7SSimon Glass return 0;
4706f6430d7SSimon Glass }
4716f6430d7SSimon Glass
4726f6430d7SSimon Glass #if defined(CONFIG_API)
initr_api(void)4736f6430d7SSimon Glass static int initr_api(void)
4746f6430d7SSimon Glass {
4756f6430d7SSimon Glass /* Initialize API */
4766f6430d7SSimon Glass api_init();
4776f6430d7SSimon Glass return 0;
4786f6430d7SSimon Glass }
4796f6430d7SSimon Glass #endif
4806f6430d7SSimon Glass
4816f6430d7SSimon Glass /* enable exceptions */
482daab59acSAndy Shevchenko #ifdef CONFIG_ARM
initr_enable_interrupts(void)4836f6430d7SSimon Glass static int initr_enable_interrupts(void)
4846f6430d7SSimon Glass {
4856f6430d7SSimon Glass enable_interrupts();
4866f6430d7SSimon Glass return 0;
4876f6430d7SSimon Glass }
488e424c15cSSimon Glass #endif
4896f6430d7SSimon Glass
4906f6430d7SSimon Glass #ifdef CONFIG_CMD_NET
initr_ethaddr(void)4916f6430d7SSimon Glass static int initr_ethaddr(void)
4926f6430d7SSimon Glass {
493c2240d4dSSimon Glass bd_t *bd = gd->bd;
494c2240d4dSSimon Glass
495c2240d4dSSimon Glass /* kept around for legacy kernels only ... ignore the next section */
49635affd7aSSimon Glass eth_env_get_enetaddr("ethaddr", bd->bi_enetaddr);
497c2240d4dSSimon Glass #ifdef CONFIG_HAS_ETH1
49835affd7aSSimon Glass eth_env_get_enetaddr("eth1addr", bd->bi_enet1addr);
499c2240d4dSSimon Glass #endif
500c2240d4dSSimon Glass #ifdef CONFIG_HAS_ETH2
50135affd7aSSimon Glass eth_env_get_enetaddr("eth2addr", bd->bi_enet2addr);
502c2240d4dSSimon Glass #endif
503c2240d4dSSimon Glass #ifdef CONFIG_HAS_ETH3
50435affd7aSSimon Glass eth_env_get_enetaddr("eth3addr", bd->bi_enet3addr);
505c2240d4dSSimon Glass #endif
506c2240d4dSSimon Glass #ifdef CONFIG_HAS_ETH4
50735affd7aSSimon Glass eth_env_get_enetaddr("eth4addr", bd->bi_enet4addr);
508c2240d4dSSimon Glass #endif
509c2240d4dSSimon Glass #ifdef CONFIG_HAS_ETH5
51035affd7aSSimon Glass eth_env_get_enetaddr("eth5addr", bd->bi_enet5addr);
511c2240d4dSSimon Glass #endif
512c2240d4dSSimon Glass return 0;
513c2240d4dSSimon Glass }
514c2240d4dSSimon Glass #endif /* CONFIG_CMD_NET */
515c2240d4dSSimon Glass
516c2240d4dSSimon Glass #ifdef CONFIG_CMD_KGDB
initr_kgdb(void)517c2240d4dSSimon Glass static int initr_kgdb(void)
518c2240d4dSSimon Glass {
519c2240d4dSSimon Glass puts("KGDB: ");
520c2240d4dSSimon Glass kgdb_init();
521c2240d4dSSimon Glass return 0;
522c2240d4dSSimon Glass }
523c2240d4dSSimon Glass #endif
524c2240d4dSSimon Glass
5252d8d190cSUri Mashiach #if defined(CONFIG_LED_STATUS)
initr_status_led(void)526c2240d4dSSimon Glass static int initr_status_led(void)
527c2240d4dSSimon Glass {
5282d8d190cSUri Mashiach #if defined(CONFIG_LED_STATUS_BOOT)
5292d8d190cSUri Mashiach status_led_set(CONFIG_LED_STATUS_BOOT, CONFIG_LED_STATUS_BLINKING);
53013cfbe51SBernhard Nortmann #else
53113cfbe51SBernhard Nortmann status_led_init();
53213cfbe51SBernhard Nortmann #endif
533c2240d4dSSimon Glass return 0;
534c2240d4dSSimon Glass }
535c2240d4dSSimon Glass #endif
536c2240d4dSSimon Glass
537e8a016b5SMichal Simek #if defined(CONFIG_SCSI) && !defined(CONFIG_DM_SCSI)
initr_scsi(void)538c2240d4dSSimon Glass static int initr_scsi(void)
539c2240d4dSSimon Glass {
540c2240d4dSSimon Glass puts("SCSI: ");
541c2240d4dSSimon Glass scsi_init();
5423804f5bbSHeinrich Schuchardt puts("\n");
5436f6430d7SSimon Glass
5446f6430d7SSimon Glass return 0;
5456f6430d7SSimon Glass }
5462c997e7aSIan Campbell #endif
5476f6430d7SSimon Glass
5486f6430d7SSimon Glass #ifdef CONFIG_BITBANGMII
initr_bbmii(void)5496f6430d7SSimon Glass static int initr_bbmii(void)
5506f6430d7SSimon Glass {
5516f6430d7SSimon Glass bb_miiphy_init();
5526f6430d7SSimon Glass return 0;
5536f6430d7SSimon Glass }
5546f6430d7SSimon Glass #endif
5556f6430d7SSimon Glass
5566f6430d7SSimon Glass #ifdef CONFIG_CMD_NET
initr_net(void)5576f6430d7SSimon Glass static int initr_net(void)
5586f6430d7SSimon Glass {
5596f6430d7SSimon Glass puts("Net: ");
560d2eaec60SJoe Hershberger eth_initialize();
5616f6430d7SSimon Glass #if defined(CONFIG_RESET_PHY_R)
5626f6430d7SSimon Glass debug("Reset Ethernet PHY\n");
5636f6430d7SSimon Glass reset_phy();
5646f6430d7SSimon Glass #endif
5656f6430d7SSimon Glass return 0;
5666f6430d7SSimon Glass }
5676f6430d7SSimon Glass #endif
5686f6430d7SSimon Glass
5696f6430d7SSimon Glass #ifdef CONFIG_POST
initr_post(void)5706f6430d7SSimon Glass static int initr_post(void)
5716f6430d7SSimon Glass {
5726f6430d7SSimon Glass post_run(NULL, POST_RAM | post_bootmode_get(0));
5736f6430d7SSimon Glass return 0;
5746f6430d7SSimon Glass }
5756f6430d7SSimon Glass #endif
5766f6430d7SSimon Glass
577fc843a02SSimon Glass #if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_IDE)
initr_pcmcia(void)578c2240d4dSSimon Glass static int initr_pcmcia(void)
579c2240d4dSSimon Glass {
580c2240d4dSSimon Glass puts("PCMCIA:");
581c2240d4dSSimon Glass pcmcia_init();
582c2240d4dSSimon Glass return 0;
583c2240d4dSSimon Glass }
584c2240d4dSSimon Glass #endif
585c2240d4dSSimon Glass
586ec15d5f6SBin Meng #if defined(CONFIG_IDE) && !defined(CONFIG_BLK)
initr_ide(void)587c2240d4dSSimon Glass static int initr_ide(void)
588c2240d4dSSimon Glass {
589c2240d4dSSimon Glass puts("IDE: ");
590c2240d4dSSimon Glass #if defined(CONFIG_START_IDE)
591c2240d4dSSimon Glass if (board_start_ide())
592c2240d4dSSimon Glass ide_init();
593c2240d4dSSimon Glass #else
594c2240d4dSSimon Glass ide_init();
595c2240d4dSSimon Glass #endif
596c2240d4dSSimon Glass return 0;
597c2240d4dSSimon Glass }
598c2240d4dSSimon Glass #endif
599c2240d4dSSimon Glass
600c5404b64SSimon Glass #if defined(CONFIG_PRAM)
6016f6430d7SSimon Glass /*
6026f6430d7SSimon Glass * Export available size of memory for Linux, taking into account the
6036f6430d7SSimon Glass * protected RAM at top of memory
6046f6430d7SSimon Glass */
initr_mem(void)6056f6430d7SSimon Glass int initr_mem(void)
6066f6430d7SSimon Glass {
6076f6430d7SSimon Glass ulong pram = 0;
6086f6430d7SSimon Glass char memsz[32];
6096f6430d7SSimon Glass
610bfebc8c9SSimon Glass pram = env_get_ulong("pram", 10, CONFIG_PRAM);
611ae1a74ebSValentin Longchamp sprintf(memsz, "%ldk", (long int)((gd->ram_size / 1024) - pram));
612382bee57SSimon Glass env_set("mem", memsz);
613c2240d4dSSimon Glass
614c2240d4dSSimon Glass return 0;
615c2240d4dSSimon Glass }
616c2240d4dSSimon Glass #endif
617c2240d4dSSimon Glass
618c2240d4dSSimon Glass #ifdef CONFIG_CMD_BEDBUG
initr_bedbug(void)619c2240d4dSSimon Glass static int initr_bedbug(void)
620c2240d4dSSimon Glass {
621c2240d4dSSimon Glass bedbug_init();
622c2240d4dSSimon Glass
623c2240d4dSSimon Glass return 0;
624c2240d4dSSimon Glass }
625c2240d4dSSimon Glass #endif
626c2240d4dSSimon Glass
run_main_loop(void)6276f6430d7SSimon Glass static int run_main_loop(void)
6286f6430d7SSimon Glass {
629a733b06bSSimon Glass #ifdef CONFIG_SANDBOX
630a733b06bSSimon Glass sandbox_main_loop_init();
631a733b06bSSimon Glass #endif
6326f6430d7SSimon Glass /* main_loop() can return to retry autoboot, if so just run it again */
6336f6430d7SSimon Glass for (;;)
6346f6430d7SSimon Glass main_loop();
6356f6430d7SSimon Glass return 0;
6366f6430d7SSimon Glass }
6376f6430d7SSimon Glass
6386f6430d7SSimon Glass /*
63947870afaSAlexander Graf * We hope to remove most of the driver-related init and do it if/when
6406f6430d7SSimon Glass * the driver is later used.
641c2240d4dSSimon Glass *
642c2240d4dSSimon Glass * TODO: perhaps reset the watchdog in the initcall function after each call?
6436f6430d7SSimon Glass */
6444acff452SSimon Glass static init_fnc_t init_sequence_r[] = {
64571c52dbaSSimon Glass initr_trace,
6466f6430d7SSimon Glass initr_reloc,
647c2240d4dSSimon Glass /* TODO: could x86/PPC have this also perhaps? */
6486f6430d7SSimon Glass #ifdef CONFIG_ARM
6496f6430d7SSimon Glass initr_caches,
65012eaf31cSYork Sun /* Note: For Freescale LS2 SoCs, new MMU table is created in DDR.
65112eaf31cSYork Sun * A temporary mapping of IFC high region is since removed,
65292f84b67SMario Six * so environmental variables in NOR flash is not available
65312eaf31cSYork Sun * until board_init() is called below to remap IFC to high
65412eaf31cSYork Sun * region.
65512eaf31cSYork Sun */
6569fb02491SSimon Glass #endif
6579fb02491SSimon Glass initr_reloc_global_data,
658fef3e25fSYork Sun #if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
659fef3e25fSYork Sun initr_unlock_ram_in_cache,
660fef3e25fSYork Sun #endif
6619fb02491SSimon Glass initr_barrier,
6629fb02491SSimon Glass initr_malloc,
663af1bc0cfSSimon Glass log_init,
6645ac44a55SSimon Glass initr_bootstage, /* Needs malloc() but has its own timer */
6659854a874SSimon Glass initr_console_record,
666671fa63eSJan Kiszka #ifdef CONFIG_SYS_NONCACHED_MEMORY
667671fa63eSJan Kiszka initr_noncached,
668671fa63eSJan Kiszka #endif
6699fb02491SSimon Glass bootstage_relocate,
6703af86a4eSSimon Glass #ifdef CONFIG_OF_LIVE
6713af86a4eSSimon Glass initr_of_live,
6723af86a4eSSimon Glass #endif
6739fb02491SSimon Glass #ifdef CONFIG_DM
6749fb02491SSimon Glass initr_dm,
6759fb02491SSimon Glass #endif
67617585e2dSPatrick Delaunay #if defined(CONFIG_ARM) || defined(CONFIG_NDS32) || defined(CONFIG_RISCV) || \
67717585e2dSPatrick Delaunay defined(CONFIG_SANDBOX)
6786f6430d7SSimon Glass board_init, /* Setup chipselects */
6796f6430d7SSimon Glass #endif
680c2240d4dSSimon Glass /*
681c2240d4dSSimon Glass * TODO: printing of the clock inforamtion of the board is now
682c2240d4dSSimon Glass * implemented as part of bdinfo command. Currently only support for
683c2240d4dSSimon Glass * davinci SOC's is added. Remove this check once all the board
684c2240d4dSSimon Glass * implement this.
685c2240d4dSSimon Glass */
686c2240d4dSSimon Glass #ifdef CONFIG_CLOCKS
687c2240d4dSSimon Glass set_cpu_clk_info, /* Setup clock information */
688c2240d4dSSimon Glass #endif
6895d00995cSAlexander Graf #ifdef CONFIG_EFI_LOADER
6905d00995cSAlexander Graf efi_memory_init,
6915d00995cSAlexander Graf #endif
6929fb02491SSimon Glass stdio_init_tables,
6936f6430d7SSimon Glass initr_serial,
6946f6430d7SSimon Glass initr_announce,
695c2240d4dSSimon Glass INIT_FUNC_WATCHDOG_RESET
69661d7b1bbSAndreas Bießmann #ifdef CONFIG_NEEDS_MANUAL_RELOC
69761d7b1bbSAndreas Bießmann initr_manual_reloc_cmdtable,
69861d7b1bbSAndreas Bießmann #endif
6994c2cb115SDaniel Schwierzeck #if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_MIPS)
700c2240d4dSSimon Glass initr_trap,
701c2240d4dSSimon Glass #endif
702c2240d4dSSimon Glass #ifdef CONFIG_ADDR_MAP
703c2240d4dSSimon Glass initr_addr_map,
704c2240d4dSSimon Glass #endif
705c2240d4dSSimon Glass #if defined(CONFIG_BOARD_EARLY_INIT_R)
706c2240d4dSSimon Glass board_early_init_r,
707c2240d4dSSimon Glass #endif
708c2240d4dSSimon Glass INIT_FUNC_WATCHDOG_RESET
7096f6430d7SSimon Glass #ifdef CONFIG_POST
7106f6430d7SSimon Glass initr_post_backlog,
7116f6430d7SSimon Glass #endif
712c2240d4dSSimon Glass INIT_FUNC_WATCHDOG_RESET
713c2240d4dSSimon Glass #if defined(CONFIG_PCI) && defined(CONFIG_SYS_EARLY_PCI_INIT)
714c2240d4dSSimon Glass /*
715c2240d4dSSimon Glass * Do early PCI configuration _before_ the flash gets initialised,
71692f84b67SMario Six * because PCU resources are crucial for flash access on some boards.
717c2240d4dSSimon Glass */
718c2240d4dSSimon Glass initr_pci,
719c2240d4dSSimon Glass #endif
7206f6430d7SSimon Glass #ifdef CONFIG_ARCH_EARLY_INIT_R
7216f6430d7SSimon Glass arch_early_init_r,
7226f6430d7SSimon Glass #endif
7236f6430d7SSimon Glass power_init_board,
724e856bdcfSMasahiro Yamada #ifdef CONFIG_MTD_NOR_FLASH
7256f6430d7SSimon Glass initr_flash,
7266f6430d7SSimon Glass #endif
727c2240d4dSSimon Glass INIT_FUNC_WATCHDOG_RESET
728936478e7STom Rini #if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_X86)
729c2240d4dSSimon Glass /* initialize higher level parts of CPU like time base and timers */
730c2240d4dSSimon Glass cpu_init_r,
731be274b99SSimon Glass #endif
7326f6430d7SSimon Glass #ifdef CONFIG_CMD_NAND
7336f6430d7SSimon Glass initr_nand,
7346f6430d7SSimon Glass #endif
7356f6430d7SSimon Glass #ifdef CONFIG_CMD_ONENAND
7366f6430d7SSimon Glass initr_onenand,
7376f6430d7SSimon Glass #endif
7384aa2ba3aSMasahiro Yamada #ifdef CONFIG_MMC
7396f6430d7SSimon Glass initr_mmc,
7406f6430d7SSimon Glass #endif
7416f6430d7SSimon Glass initr_env,
742c722f0b0SAndreas Bießmann #ifdef CONFIG_SYS_BOOTPARAMS_LEN
743c722f0b0SAndreas Bießmann initr_malloc_bootparams,
744c722f0b0SAndreas Bießmann #endif
745c2240d4dSSimon Glass INIT_FUNC_WATCHDOG_RESET
746c2240d4dSSimon Glass initr_secondary_cpu,
747c2240d4dSSimon Glass #if defined(CONFIG_ID_EEPROM) || defined(CONFIG_SYS_I2C_MAC_OFFSET)
748c2240d4dSSimon Glass mac_read_from_eeprom,
749c2240d4dSSimon Glass #endif
750c2240d4dSSimon Glass INIT_FUNC_WATCHDOG_RESET
751c2240d4dSSimon Glass #if defined(CONFIG_PCI) && !defined(CONFIG_SYS_EARLY_PCI_INIT)
752c2240d4dSSimon Glass /*
753c2240d4dSSimon Glass * Do pci configuration
754c2240d4dSSimon Glass */
755c2240d4dSSimon Glass initr_pci,
756c2240d4dSSimon Glass #endif
7579fb02491SSimon Glass stdio_add_devices,
7586f6430d7SSimon Glass initr_jumptable,
7596f6430d7SSimon Glass #ifdef CONFIG_API
7606f6430d7SSimon Glass initr_api,
7616f6430d7SSimon Glass #endif
7626f6430d7SSimon Glass console_init_r, /* fully init console as a device */
7636f6430d7SSimon Glass #ifdef CONFIG_DISPLAY_BOARDINFO_LATE
764b0895384SSimon Glass console_announce_r,
7650365ffccSMasahiro Yamada show_board_info,
7666f6430d7SSimon Glass #endif
7676f6430d7SSimon Glass #ifdef CONFIG_ARCH_MISC_INIT
7686f6430d7SSimon Glass arch_misc_init, /* miscellaneous arch-dependent init */
7696f6430d7SSimon Glass #endif
7706f6430d7SSimon Glass #ifdef CONFIG_MISC_INIT_R
7716f6430d7SSimon Glass misc_init_r, /* miscellaneous platform-dependent init */
7726f6430d7SSimon Glass #endif
773c2240d4dSSimon Glass INIT_FUNC_WATCHDOG_RESET
774c2240d4dSSimon Glass #ifdef CONFIG_CMD_KGDB
775c2240d4dSSimon Glass initr_kgdb,
776c2240d4dSSimon Glass #endif
7776f6430d7SSimon Glass interrupt_init,
778daab59acSAndy Shevchenko #ifdef CONFIG_ARM
7796f6430d7SSimon Glass initr_enable_interrupts,
780c2240d4dSSimon Glass #endif
781daab59acSAndy Shevchenko #if defined(CONFIG_MICROBLAZE) || defined(CONFIG_M68K)
782be274b99SSimon Glass timer_init, /* initialize timer */
783be274b99SSimon Glass #endif
7842d8d190cSUri Mashiach #if defined(CONFIG_LED_STATUS)
785c2240d4dSSimon Glass initr_status_led,
786c2240d4dSSimon Glass #endif
787c2240d4dSSimon Glass /* PPC has a udelay(20) here dating from 2002. Why? */
7886f6430d7SSimon Glass #ifdef CONFIG_CMD_NET
7896f6430d7SSimon Glass initr_ethaddr,
7906f6430d7SSimon Glass #endif
791*dab778a2SHeiko Schocher #if defined(CONFIG_GPIO_HOG)
79204c095b2SHeiko Schocher gpio_hog_probe_all,
79304c095b2SHeiko Schocher #endif
7946f6430d7SSimon Glass #ifdef CONFIG_BOARD_LATE_INIT
7956f6430d7SSimon Glass board_late_init,
7966f6430d7SSimon Glass #endif
797e8a016b5SMichal Simek #if defined(CONFIG_SCSI) && !defined(CONFIG_DM_SCSI)
798c2240d4dSSimon Glass INIT_FUNC_WATCHDOG_RESET
799c2240d4dSSimon Glass initr_scsi,
800c2240d4dSSimon Glass #endif
8016f6430d7SSimon Glass #ifdef CONFIG_BITBANGMII
8026f6430d7SSimon Glass initr_bbmii,
8036f6430d7SSimon Glass #endif
8046f6430d7SSimon Glass #ifdef CONFIG_CMD_NET
805c2240d4dSSimon Glass INIT_FUNC_WATCHDOG_RESET
8066f6430d7SSimon Glass initr_net,
8076f6430d7SSimon Glass #endif
8086f6430d7SSimon Glass #ifdef CONFIG_POST
8096f6430d7SSimon Glass initr_post,
8106f6430d7SSimon Glass #endif
811fc843a02SSimon Glass #if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_IDE)
812c2240d4dSSimon Glass initr_pcmcia,
813c2240d4dSSimon Glass #endif
814ec15d5f6SBin Meng #if defined(CONFIG_IDE) && !defined(CONFIG_BLK)
815c2240d4dSSimon Glass initr_ide,
816c2240d4dSSimon Glass #endif
817c2240d4dSSimon Glass #ifdef CONFIG_LAST_STAGE_INIT
818c2240d4dSSimon Glass INIT_FUNC_WATCHDOG_RESET
819c2240d4dSSimon Glass /*
820c2240d4dSSimon Glass * Some parts can be only initialized if all others (like
821c2240d4dSSimon Glass * Interrupts) are up and running (i.e. the PC-style ISA
822c2240d4dSSimon Glass * keyboard).
823c2240d4dSSimon Glass */
824c2240d4dSSimon Glass last_stage_init,
825c2240d4dSSimon Glass #endif
826c2240d4dSSimon Glass #ifdef CONFIG_CMD_BEDBUG
827c2240d4dSSimon Glass INIT_FUNC_WATCHDOG_RESET
828c2240d4dSSimon Glass initr_bedbug,
829c2240d4dSSimon Glass #endif
830c5404b64SSimon Glass #if defined(CONFIG_PRAM)
831c2240d4dSSimon Glass initr_mem,
832c2240d4dSSimon Glass #endif
8336f6430d7SSimon Glass run_main_loop,
8346f6430d7SSimon Glass };
8356f6430d7SSimon Glass
board_init_r(gd_t * new_gd,ulong dest_addr)8366f6430d7SSimon Glass void board_init_r(gd_t *new_gd, ulong dest_addr)
8376f6430d7SSimon Glass {
838fb92308bSSimon Glass /*
839fb92308bSSimon Glass * Set up the new global data pointer. So far only x86 does this
840fb92308bSSimon Glass * here.
841fb92308bSSimon Glass * TODO(sjg@chromium.org): Consider doing this for all archs, or
842fb92308bSSimon Glass * dropping the new_gd parameter.
843fb92308bSSimon Glass */
844fb92308bSSimon Glass #if CONFIG_IS_ENABLED(X86_64)
845fb92308bSSimon Glass arch_setup_gd(new_gd);
846fb92308bSSimon Glass #endif
847fb92308bSSimon Glass
8487395398aSAlexey Brodkin #ifdef CONFIG_NEEDS_MANUAL_RELOC
8497395398aSAlexey Brodkin int i;
8507395398aSAlexey Brodkin #endif
8517395398aSAlexey Brodkin
85247a602eaSJeroen Hofstee #if !defined(CONFIG_X86) && !defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
8536f6430d7SSimon Glass gd = new_gd;
854be274b99SSimon Glass #endif
855af1bc0cfSSimon Glass gd->flags &= ~GD_FLG_LOG_READY;
8567395398aSAlexey Brodkin
8577395398aSAlexey Brodkin #ifdef CONFIG_NEEDS_MANUAL_RELOC
8587395398aSAlexey Brodkin for (i = 0; i < ARRAY_SIZE(init_sequence_r); i++)
8597395398aSAlexey Brodkin init_sequence_r[i] += gd->reloc_off;
8607395398aSAlexey Brodkin #endif
8617395398aSAlexey Brodkin
8626f6430d7SSimon Glass if (initcall_run_list(init_sequence_r))
8636f6430d7SSimon Glass hang();
8646f6430d7SSimon Glass
8656f6430d7SSimon Glass /* NOTREACHED - run_main_loop() does not return */
8666f6430d7SSimon Glass hang();
8676f6430d7SSimon Glass }
868