xref: /openbmc/u-boot/common/board_r.c (revision dab778a23937bbcd7635266272802e50d94f1397)
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