Blame view

common/board_r.c 18.7 KB
6f6430d72   Simon Glass   Introduce generic...
1
2
3
4
5
6
7
8
9
  /*
   * Copyright (c) 2011 The Chromium OS Authors.
   * (C) Copyright 2002-2006
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
   * (C) Copyright 2002
   * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
   * Marius Groeger <mgroeger@sysgo.de>
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
10
   * SPDX-License-Identifier:	GPL-2.0+
6f6430d72   Simon Glass   Introduce generic...
11
12
13
   */
  
  #include <common.h>
12d738ae4   Simon Glass   api: Add a header...
14
  #include <api.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
15
16
17
18
  /* TODO: can we just include all these headers whether needed or not? */
  #if defined(CONFIG_CMD_BEDBUG)
  #include <bedbug/type.h>
  #endif
cbb2df201   Tom Rini   CONFIG_NEEDS_MANU...
19
  #include <command.h>
24b852a7a   Simon Glass   Move console defi...
20
  #include <console.h>
1ce601767   Simon Glass   dm: Set up driver...
21
  #include <dm.h>
6f6430d72   Simon Glass   Introduce generic...
22
23
  #include <environment.h>
  #include <fdtdec.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
24
  #include <ide.h>
6f6430d72   Simon Glass   Introduce generic...
25
  #include <initcall.h>
96d4b75c0   Simon Glass   board_f: Make ini...
26
  #include <init_helpers.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
27
28
29
30
31
32
  #ifdef CONFIG_PS2KBD
  #include <keyboard.h>
  #endif
  #if defined(CONFIG_CMD_KGDB)
  #include <kgdb.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
33
  #include <malloc.h>
0eb25b619   Joe Hershberger   common: Make sure...
34
  #include <mapmem.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
35
36
37
  #ifdef CONFIG_BITBANGMII
  #include <miiphy.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
38
39
  #include <mmc.h>
  #include <nand.h>
3af86a4e2   Simon Glass   dm: Build a live ...
40
  #include <of_live.h>
6f6430d72   Simon Glass   Introduce generic...
41
  #include <onenand_uboot.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
42
  #include <scsi.h>
6f6430d72   Simon Glass   Introduce generic...
43
  #include <serial.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
44
  #include <spi.h>
6f6430d72   Simon Glass   Introduce generic...
45
  #include <stdio_dev.h>
1057e6cfe   Simon Glass   timer: Set up the...
46
  #include <timer.h>
71c52dba2   Simon Glass   Add trace support...
47
  #include <trace.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
48
49
50
51
  #include <watchdog.h>
  #ifdef CONFIG_ADDR_MAP
  #include <asm/mmu.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
52
  #include <asm/sections.h>
1ce601767   Simon Glass   dm: Set up driver...
53
  #include <dm/root.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
54
  #include <linux/compiler.h>
1ce601767   Simon Glass   dm: Set up driver...
55
  #include <linux/err.h>
50149ea37   Alexander Graf   efi_loader: Add r...
56
  #include <efi_loader.h>
2c840c82b   Ye Li   MLK-18591-3 andro...
57
58
59
  #ifdef CONFIG_FSL_FASTBOOT
  #include <fsl_fastboot.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
60
61
62
63
  
  DECLARE_GLOBAL_DATA_PTR;
  
  ulong monitor_flash_len;
dd2a6cd0f   Jeroen Hofstee   common: board: us...
64
  __weak int board_flash_wp_on(void)
c2240d4db   Simon Glass   Adjust board_r.c ...
65
66
67
68
69
70
71
72
  {
  	/*
  	 * Most flashes can't be detected when write protection is enabled,
  	 * so provide a way to let U-Boot gracefully ignore write protected
  	 * devices.
  	 */
  	return 0;
  }
dd2a6cd0f   Jeroen Hofstee   common: board: us...
73
  __weak void cpu_secondary_init_r(void)
c2240d4db   Simon Glass   Adjust board_r.c ...
74
75
  {
  }
c2240d4db   Simon Glass   Adjust board_r.c ...
76
77
78
79
80
81
82
83
84
85
86
87
88
  static int initr_secondary_cpu(void)
  {
  	/*
  	 * after non-volatile devices & environment is setup and cpu code have
  	 * another round to deal with any initialization that might require
  	 * full access to the environment or loading of some image (firmware)
  	 * from a non-volatile device
  	 */
  	/* TODO: maybe define this for all archs? */
  	cpu_secondary_init_r();
  
  	return 0;
  }
6f6430d72   Simon Glass   Introduce generic...
89

71c52dba2   Simon Glass   Add trace support...
90
91
92
93
94
95
96
97
  static int initr_trace(void)
  {
  #ifdef CONFIG_TRACE
  	trace_init(gd->trace_buff, CONFIG_TRACE_BUFFER_SIZE);
  #endif
  
  	return 0;
  }
6f6430d72   Simon Glass   Introduce generic...
98
99
  static int initr_reloc(void)
  {
c9356be30   Simon Glass   dm: Split the sim...
100
101
  	/* tell others: relocation done */
  	gd->flags |= GD_FLG_RELOC | GD_FLG_FULL_MALLOC_INIT;
6f6430d72   Simon Glass   Introduce generic...
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
  
  	return 0;
  }
  
  #ifdef CONFIG_ARM
  /*
   * Some of these functions are needed purely because the functions they
   * call return void. If we change them to return 0, these stubs can go away.
   */
  static int initr_caches(void)
  {
  	/* Enable caches */
  	enable_caches();
  	return 0;
  }
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
118
119
120
121
  __weak int fixup_cpu(void)
  {
  	return 0;
  }
6f6430d72   Simon Glass   Introduce generic...
122
123
  static int initr_reloc_global_data(void)
  {
b60eff31f   Albert ARIBAUD   arm: remove unnee...
124
125
  #ifdef __ARM__
  	monitor_flash_len = _end - __image_copy_start;
068feb9b8   Rick Chen   riscv: Modify gen...
126
  #elif defined(CONFIG_NDS32) || defined(CONFIG_RISCV)
2e88bb28d   Kun-Hua Huang   NDS32: Generic Bo...
127
  	monitor_flash_len = (ulong)&_end - (ulong)&_start;
5ff10aa7e   Thomas Chou   nios2: add generi...
128
  #elif !defined(CONFIG_SANDBOX) && !defined(CONFIG_NIOS2)
a0ba279ac   Masahiro Yamada   generic_board: re...
129
  	monitor_flash_len = (ulong)&__init_end - gd->relocaddr;
6f6430d72   Simon Glass   Introduce generic...
130
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
131
132
133
134
135
136
  #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
  	/*
  	 * The gd->cpu pointer is set to an address in flash before relocation.
  	 * We need to update it to point to the same CPU entry in RAM.
  	 * TODO: why not just add gd->reloc_ofs?
  	 */
a0ba279ac   Masahiro Yamada   generic_board: re...
137
  	gd->arch.cpu += gd->relocaddr - CONFIG_SYS_MONITOR_BASE;
c2240d4db   Simon Glass   Adjust board_r.c ...
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  
  	/*
  	 * If we didn't know the cpu mask & # cores, we can save them of
  	 * now rather than 'computing' them constantly
  	 */
  	fixup_cpu();
  #endif
  #ifdef CONFIG_SYS_EXTRA_ENV_RELOC
  	/*
  	 * Some systems need to relocate the env_addr pointer early because the
  	 * location it points to will get invalidated before env_relocate is
  	 * called.  One example is on systems that might use a L2 or L3 cache
  	 * in SRAM mode and initialize that cache from SRAM mode back to being
  	 * a cache in cpu_init_r.
  	 */
a0ba279ac   Masahiro Yamada   generic_board: re...
153
  	gd->env_addr += gd->relocaddr - CONFIG_SYS_MONITOR_BASE;
c2240d4db   Simon Glass   Adjust board_r.c ...
154
  #endif
e9acb9ea4   Siva Durga Prasad Paladugu   common: board: Do...
155
156
  #ifdef CONFIG_OF_EMBED
  	/*
92f84b67e   Mario Six   common: board_r: ...
157
158
159
  	 * The fdt_blob needs to be moved to new relocation address
  	 * incase of FDT blob is embedded with in image
  	 */
e9acb9ea4   Siva Durga Prasad Paladugu   common: board: Do...
160
161
  	gd->fdt_blob += gd->reloc_off;
  #endif
50149ea37   Alexander Graf   efi_loader: Add r...
162
163
164
  #ifdef CONFIG_EFI_LOADER
  	efi_runtime_relocate(gd->relocaddr, NULL);
  #endif
e9acb9ea4   Siva Durga Prasad Paladugu   common: board: Do...
165

c2240d4db   Simon Glass   Adjust board_r.c ...
166
  	return 0;
6f6430d72   Simon Glass   Introduce generic...
167
168
169
170
171
172
173
  }
  
  static int initr_serial(void)
  {
  	serial_initialize();
  	return 0;
  }
4c2cb1151   Daniel Schwierzeck   common/board_f: e...
174
  #if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_MIPS)
c2240d4db   Simon Glass   Adjust board_r.c ...
175
176
177
178
179
  static int initr_trap(void)
  {
  	/*
  	 * Setup trap handlers
  	 */
e310b93ec   angelo@sysam.it   m68k: add generic...
180
  #if defined(CONFIG_PPC)
a0ba279ac   Masahiro Yamada   generic_board: re...
181
  	trap_init(gd->relocaddr);
e310b93ec   angelo@sysam.it   m68k: add generic...
182
183
184
  #else
  	trap_init(CONFIG_SYS_SDRAM_BASE);
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
185
186
187
188
189
190
191
192
193
194
195
196
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_ADDR_MAP
  static int initr_addr_map(void)
  {
  	init_addr_map();
  
  	return 0;
  }
  #endif
6f6430d72   Simon Glass   Introduce generic...
197
198
199
200
201
202
203
  #ifdef CONFIG_POST
  static int initr_post_backlog(void)
  {
  	post_output_backlog();
  	return 0;
  }
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
204
205
206
207
208
209
210
211
212
213
214
  #if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
  static int initr_unlock_ram_in_cache(void)
  {
  	unlock_ram_in_cache();	/* it's time to unlock D-cache in e500 */
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_PCI
  static int initr_pci(void)
  {
ff3e077bd   Simon Glass   dm: pci: Add a uc...
215
  #ifndef CONFIG_DM_PCI
c2240d4db   Simon Glass   Adjust board_r.c ...
216
  	pci_init();
ff3e077bd   Simon Glass   dm: pci: Add a uc...
217
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
218
219
220
221
  
  	return 0;
  }
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
222
223
224
225
226
227
228
229
  static int initr_barrier(void)
  {
  #ifdef CONFIG_PPC
  	/* TODO: Can we not use dmb() macros for this? */
  	asm("sync ; isync");
  #endif
  	return 0;
  }
6f6430d72   Simon Glass   Introduce generic...
230
231
232
  static int initr_malloc(void)
  {
  	ulong malloc_start;
f1896c45c   Andy Yan   spl: make SPL and...
233
  #if CONFIG_VAL(SYS_MALLOC_F_LEN)
d59476b64   Simon Glass   Add a simple mall...
234
235
236
237
  	debug("Pre-reloc malloc() used %#lx bytes (%ld KB)
  ", gd->malloc_ptr,
  	      gd->malloc_ptr / 1024);
  #endif
6f6430d72   Simon Glass   Introduce generic...
238
  	/* The malloc area is immediately below the monitor copy in DRAM */
a0ba279ac   Masahiro Yamada   generic_board: re...
239
  	malloc_start = gd->relocaddr - TOTAL_MALLOC_LEN;
a733b06b6   Simon Glass   sandbox: Switch o...
240
241
  	mem_malloc_init((ulong)map_sysmem(malloc_start, TOTAL_MALLOC_LEN),
  			TOTAL_MALLOC_LEN);
6f6430d72   Simon Glass   Introduce generic...
242
243
  	return 0;
  }
9854a8748   Simon Glass   console: Add a co...
244
245
246
247
248
249
250
251
  static int initr_console_record(void)
  {
  #if defined(CONFIG_CONSOLE_RECORD)
  	return console_record_init();
  #else
  	return 0;
  #endif
  }
671fa63e7   Jan Kiszka   common/board_r: R...
252
253
254
255
256
257
258
  #ifdef CONFIG_SYS_NONCACHED_MEMORY
  static int initr_noncached(void)
  {
  	noncached_init();
  	return 0;
  }
  #endif
3af86a4e2   Simon Glass   dm: Build a live ...
259
260
261
  #ifdef CONFIG_OF_LIVE
  static int initr_of_live(void)
  {
a132f7708   Simon Glass   bootstage: Record...
262
263
264
265
266
267
268
269
270
  	int ret;
  
  	bootstage_start(BOOTSTAGE_ID_ACCUM_OF_LIVE, "of_live");
  	ret = of_live_build(gd->fdt_blob, (struct device_node **)&gd->of_root);
  	bootstage_accum(BOOTSTAGE_ID_ACCUM_OF_LIVE);
  	if (ret)
  		return ret;
  
  	return 0;
3af86a4e2   Simon Glass   dm: Build a live ...
271
272
  }
  #endif
1ce601767   Simon Glass   dm: Set up driver...
273
274
275
  #ifdef CONFIG_DM
  static int initr_dm(void)
  {
1057e6cfe   Simon Glass   timer: Set up the...
276
  	int ret;
ab7cd6279   Simon Glass   dm: Support drive...
277
278
279
  	/* Save the pre-reloc driver model and start a new one */
  	gd->dm_root_f = gd->dm_root;
  	gd->dm_root = NULL;
d74d6b444   Simon Glass   dm: timer: Correc...
280
281
282
  #ifdef CONFIG_TIMER
  	gd->timer = NULL;
  #endif
63c5bf48d   Simon Glass   bootstage: Record...
283
  	bootstage_start(BOOTSTATE_ID_ACCUM_DM_R, "dm_r");
1057e6cfe   Simon Glass   timer: Set up the...
284
  	ret = dm_init_and_scan(false);
63c5bf48d   Simon Glass   bootstage: Record...
285
  	bootstage_accum(BOOTSTATE_ID_ACCUM_DM_R);
1057e6cfe   Simon Glass   timer: Set up the...
286
287
288
  	if (ret)
  		return ret;
  #ifdef CONFIG_TIMER_EARLY
1057e6cfe   Simon Glass   timer: Set up the...
289
290
291
  	ret = dm_timer_init();
  	if (ret)
  		return ret;
8f41b8785   Thomas Chou   timer: start a ne...
292
  #endif
1057e6cfe   Simon Glass   timer: Set up the...
293
294
  
  	return 0;
1ce601767   Simon Glass   dm: Set up driver...
295
296
  }
  #endif
881c124ab   Simon Glass   dm: timer: Avoid ...
297
298
  static int initr_bootstage(void)
  {
881c124ab   Simon Glass   dm: timer: Avoid ...
299
300
301
302
  	bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_R, "board_init_r");
  
  	return 0;
  }
6f6430d72   Simon Glass   Introduce generic...
303
304
305
306
307
308
309
  __weak int power_init_board(void)
  {
  	return 0;
  }
  
  static int initr_announce(void)
  {
a0ba279ac   Masahiro Yamada   generic_board: re...
310
311
  	debug("Now running in RAM - U-Boot at: %08lx
  ", gd->relocaddr);
6f6430d72   Simon Glass   Introduce generic...
312
313
  	return 0;
  }
61d7b1bb5   Andreas Bießmann   common/board_r: m...
314
315
316
317
318
319
320
321
  #ifdef CONFIG_NEEDS_MANUAL_RELOC
  static int initr_manual_reloc_cmdtable(void)
  {
  	fixup_cmdtable(ll_entry_start(cmd_tbl_t, cmd),
  		       ll_entry_count(cmd_tbl_t, cmd));
  	return 0;
  }
  #endif
e856bdcfb   Masahiro Yamada   flash: complete C...
322
  #if defined(CONFIG_MTD_NOR_FLASH)
6f6430d72   Simon Glass   Introduce generic...
323
324
  static int initr_flash(void)
  {
c2240d4db   Simon Glass   Adjust board_r.c ...
325
326
  	ulong flash_size = 0;
  	bd_t *bd = gd->bd;
6f6430d72   Simon Glass   Introduce generic...
327
328
  
  	puts("Flash: ");
70879a925   Masahiro Yamada   flash: do not fai...
329
  	if (board_flash_wp_on())
c2240d4db   Simon Glass   Adjust board_r.c ...
330
331
  		printf("Uninitialized - Write Protect On
  ");
70879a925   Masahiro Yamada   flash: do not fai...
332
  	else
c2240d4db   Simon Glass   Adjust board_r.c ...
333
  		flash_size = flash_init();
70879a925   Masahiro Yamada   flash: do not fai...
334

6f6430d72   Simon Glass   Introduce generic...
335
336
337
  	print_size(flash_size, "");
  #ifdef CONFIG_SYS_FLASH_CHECKSUM
  	/*
92f84b67e   Mario Six   common: board_r: ...
338
339
340
341
  	 * Compute and print flash CRC if flashchecksum is set to 'y'
  	 *
  	 * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX
  	 */
bfebc8c96   Simon Glass   env: Rename geten...
342
  	if (env_get_yesno("flashchecksum") == 1) {
92f84b67e   Mario Six   common: board_r: ...
343
  		const uchar *flash_base = (const uchar *)CONFIG_SYS_FLASH_BASE;
6f6430d72   Simon Glass   Introduce generic...
344
  		printf("  CRC: %08X", crc32(0,
92f84b67e   Mario Six   common: board_r: ...
345
346
  					    flash_base,
  					    flash_size));
6f6430d72   Simon Glass   Introduce generic...
347
348
349
350
  	}
  #endif /* CONFIG_SYS_FLASH_CHECKSUM */
  	putc('
  ');
c2240d4db   Simon Glass   Adjust board_r.c ...
351
352
353
354
355
356
357
358
359
360
361
  	/* update start of FLASH memory    */
  #ifdef CONFIG_SYS_FLASH_BASE
  	bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
  #endif
  	/* size of FLASH memory (final value) */
  	bd->bi_flashsize = flash_size;
  
  #if defined(CONFIG_SYS_UPDATE_FLASH_SIZE)
  	/* Make a update of the Memctrl. */
  	update_flash_size(flash_size);
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
362
363
364
365
366
367
368
369
370
  #if defined(CONFIG_OXC) || defined(CONFIG_RMU)
  	/* flash mapped at end of memory map */
  	bd->bi_flashoffset = CONFIG_SYS_TEXT_BASE + flash_size;
  #elif CONFIG_SYS_MONITOR_BASE == CONFIG_SYS_FLASH_BASE
  	bd->bi_flashoffset = monitor_flash_len;	/* reserved area for monitor */
  #endif
  	return 0;
  }
  #endif
ebe76a2df   Simon Glass   dm: Remove spi_in...
371
  #if defined(CONFIG_PPC) && !defined(CONFIG_DM_SPI)
c2240d4db   Simon Glass   Adjust board_r.c ...
372
373
374
375
376
377
378
379
380
  static int initr_spi(void)
  {
  	/* PPC does this here */
  #ifdef CONFIG_SPI
  #if !defined(CONFIG_ENV_IS_IN_EEPROM)
  	spi_init_f();
  #endif
  	spi_init_r();
  #endif
6f6430d72   Simon Glass   Introduce generic...
381
382
383
384
385
386
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_CMD_NAND
  /* go init the NAND */
2588ba14d   Jeroen Hofstee   common: board_r: ...
387
  static int initr_nand(void)
6f6430d72   Simon Glass   Introduce generic...
388
389
390
  {
  	puts("NAND:  ");
  	nand_init();
203db38a9   Hou Zhiqiang   mtd: nand: remove...
391
392
  	printf("%lu MiB
  ", nand_size() / 1024);
6f6430d72   Simon Glass   Introduce generic...
393
394
395
396
397
398
  	return 0;
  }
  #endif
  
  #if defined(CONFIG_CMD_ONENAND)
  /* go init the NAND */
2588ba14d   Jeroen Hofstee   common: board_r: ...
399
  static int initr_onenand(void)
6f6430d72   Simon Glass   Introduce generic...
400
401
402
403
404
405
  {
  	puts("NAND:  ");
  	onenand_init();
  	return 0;
  }
  #endif
4aa2ba3a3   Masahiro Yamada   mmc: replace CONF...
406
  #ifdef CONFIG_MMC
2588ba14d   Jeroen Hofstee   common: board_r: ...
407
  static int initr_mmc(void)
6f6430d72   Simon Glass   Introduce generic...
408
409
410
411
412
413
  {
  	puts("MMC:   ");
  	mmc_initialize(gd->bd);
  	return 0;
  }
  #endif
6f6430d72   Simon Glass   Introduce generic...
414
415
416
  /*
   * Tell if it's OK to load the environment early in boot.
   *
776babd78   Masahiro Yamada   board_r: fix a ty...
417
   * If CONFIG_OF_CONTROL is defined, we'll check with the FDT to see
6f6430d72   Simon Glass   Introduce generic...
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
   * if this is OK (defaulting to saying it's OK).
   *
   * NOTE: Loading the environment early can be a bad idea if security is
   *       important, since no verification is done on the environment.
   *
   * @return 0 if environment should not be loaded, !=0 if it is ok to load
   */
  static int should_load_env(void)
  {
  #ifdef CONFIG_OF_CONTROL
  	return fdtdec_get_config_int(gd->fdt_blob, "load-environment", 1);
  #elif defined CONFIG_DELAY_ENVIRONMENT
  	return 0;
  #else
  	return 1;
  #endif
  }
  
  static int initr_env(void)
  {
  	/* initialize environment */
  	if (should_load_env())
  		env_relocate();
  	else
  		set_default_env(NULL);
545dfd101   Thomas Chou   env: export fdt_b...
443
  #ifdef CONFIG_OF_CONTROL
018f53032   Simon Glass   env: Rename commo...
444
  	env_set_addr("fdtcontroladdr", gd->fdt_blob);
545dfd101   Thomas Chou   env: export fdt_b...
445
  #endif
6f6430d72   Simon Glass   Introduce generic...
446
447
  
  	/* Initialize from environment */
bfebc8c96   Simon Glass   env: Rename geten...
448
  	load_addr = env_get_ulong("loadaddr", 16, load_addr);
c2240d4db   Simon Glass   Adjust board_r.c ...
449

c2240d4db   Simon Glass   Adjust board_r.c ...
450
451
  	return 0;
  }
c722f0b02   Andreas Bießmann   common/board_r: a...
452
453
454
455
456
457
458
459
460
461
462
463
  #ifdef CONFIG_SYS_BOOTPARAMS_LEN
  static int initr_malloc_bootparams(void)
  {
  	gd->bd->bi_boot_params = (ulong)malloc(CONFIG_SYS_BOOTPARAMS_LEN);
  	if (!gd->bd->bi_boot_params) {
  		puts("WARNING: Cannot allocate space for boot parameters
  ");
  		return -ENOMEM;
  	}
  	return 0;
  }
  #endif
6f6430d72   Simon Glass   Introduce generic...
464
465
466
467
468
469
470
471
472
473
474
475
476
477
  static int initr_jumptable(void)
  {
  	jumptable_init();
  	return 0;
  }
  
  #if defined(CONFIG_API)
  static int initr_api(void)
  {
  	/* Initialize API */
  	api_init();
  	return 0;
  }
  #endif
6f6430d72   Simon Glass   Introduce generic...
478
  /* enable exceptions */
daab59ac0   Andy Shevchenko   avr32: Retire AVR...
479
  #ifdef CONFIG_ARM
6f6430d72   Simon Glass   Introduce generic...
480
481
482
483
484
  static int initr_enable_interrupts(void)
  {
  	enable_interrupts();
  	return 0;
  }
e424c15c1   Simon Glass   x86: Enable gener...
485
  #endif
6f6430d72   Simon Glass   Introduce generic...
486
487
488
489
  
  #ifdef CONFIG_CMD_NET
  static int initr_ethaddr(void)
  {
c2240d4db   Simon Glass   Adjust board_r.c ...
490
491
492
  	bd_t *bd = gd->bd;
  
  	/* kept around for legacy kernels only ... ignore the next section */
35affd7a2   Simon Glass   env: Rename eth_g...
493
  	eth_env_get_enetaddr("ethaddr", bd->bi_enetaddr);
c2240d4db   Simon Glass   Adjust board_r.c ...
494
  #ifdef CONFIG_HAS_ETH1
35affd7a2   Simon Glass   env: Rename eth_g...
495
  	eth_env_get_enetaddr("eth1addr", bd->bi_enet1addr);
c2240d4db   Simon Glass   Adjust board_r.c ...
496
497
  #endif
  #ifdef CONFIG_HAS_ETH2
35affd7a2   Simon Glass   env: Rename eth_g...
498
  	eth_env_get_enetaddr("eth2addr", bd->bi_enet2addr);
c2240d4db   Simon Glass   Adjust board_r.c ...
499
500
  #endif
  #ifdef CONFIG_HAS_ETH3
35affd7a2   Simon Glass   env: Rename eth_g...
501
  	eth_env_get_enetaddr("eth3addr", bd->bi_enet3addr);
c2240d4db   Simon Glass   Adjust board_r.c ...
502
503
  #endif
  #ifdef CONFIG_HAS_ETH4
35affd7a2   Simon Glass   env: Rename eth_g...
504
  	eth_env_get_enetaddr("eth4addr", bd->bi_enet4addr);
c2240d4db   Simon Glass   Adjust board_r.c ...
505
506
  #endif
  #ifdef CONFIG_HAS_ETH5
35affd7a2   Simon Glass   env: Rename eth_g...
507
  	eth_env_get_enetaddr("eth5addr", bd->bi_enet5addr);
c2240d4db   Simon Glass   Adjust board_r.c ...
508
509
510
511
512
513
514
515
516
517
518
519
520
  #endif
  	return 0;
  }
  #endif /* CONFIG_CMD_NET */
  
  #ifdef CONFIG_CMD_KGDB
  static int initr_kgdb(void)
  {
  	puts("KGDB:  ");
  	kgdb_init();
  	return 0;
  }
  #endif
2d8d190c8   Uri Mashiach   status_led: Kconf...
521
  #if defined(CONFIG_LED_STATUS)
c2240d4db   Simon Glass   Adjust board_r.c ...
522
523
  static int initr_status_led(void)
  {
2d8d190c8   Uri Mashiach   status_led: Kconf...
524
525
  #if defined(CONFIG_LED_STATUS_BOOT)
  	status_led_set(CONFIG_LED_STATUS_BOOT, CONFIG_LED_STATUS_BLINKING);
13cfbe513   Bernhard Nortmann   allow LED initial...
526
527
528
  #else
  	status_led_init();
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
529
530
531
  	return 0;
  }
  #endif
e8a016b53   Michal Simek   dm: Add support f...
532
  #if defined(CONFIG_SCSI) && !defined(CONFIG_DM_SCSI)
c2240d4db   Simon Glass   Adjust board_r.c ...
533
534
  static int initr_scsi(void)
  {
c2240d4db   Simon Glass   Adjust board_r.c ...
535
536
  	puts("SCSI:  ");
  	scsi_init();
6f6430d72   Simon Glass   Introduce generic...
537
538
539
  
  	return 0;
  }
2c997e7a8   Ian Campbell   board_r: run scsi...
540
  #endif
6f6430d72   Simon Glass   Introduce generic...
541
542
543
544
545
546
547
548
549
550
551
552
553
  
  #ifdef CONFIG_BITBANGMII
  static int initr_bbmii(void)
  {
  	bb_miiphy_init();
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_CMD_NET
  static int initr_net(void)
  {
  	puts("Net:   ");
d2eaec600   Joe Hershberger   net: Remove the b...
554
  	eth_initialize();
6f6430d72   Simon Glass   Introduce generic...
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
  #if defined(CONFIG_RESET_PHY_R)
  	debug("Reset Ethernet PHY
  ");
  	reset_phy();
  #endif
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_POST
  static int initr_post(void)
  {
  	post_run(NULL, POST_RAM | post_bootmode_get(0));
  	return 0;
  }
  #endif
fc843a02a   Simon Glass   Kconfig: Add a CO...
571
  #if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_IDE)
c2240d4db   Simon Glass   Adjust board_r.c ...
572
573
574
575
576
577
578
  static int initr_pcmcia(void)
  {
  	puts("PCMCIA:");
  	pcmcia_init();
  	return 0;
  }
  #endif
fc843a02a   Simon Glass   Kconfig: Add a CO...
579
  #if defined(CONFIG_IDE)
c2240d4db   Simon Glass   Adjust board_r.c ...
580
581
  static int initr_ide(void)
  {
c2240d4db   Simon Glass   Adjust board_r.c ...
582
  	puts("IDE:   ");
c2240d4db   Simon Glass   Adjust board_r.c ...
583
584
585
586
587
588
589
590
591
  #if defined(CONFIG_START_IDE)
  	if (board_start_ide())
  		ide_init();
  #else
  	ide_init();
  #endif
  	return 0;
  }
  #endif
c5404b64f   Simon Glass   Drop the log buffer
592
  #if defined(CONFIG_PRAM)
6f6430d72   Simon Glass   Introduce generic...
593
594
595
596
597
598
599
600
  /*
   * Export available size of memory for Linux, taking into account the
   * protected RAM at top of memory
   */
  int initr_mem(void)
  {
  	ulong pram = 0;
  	char memsz[32];
bfebc8c96   Simon Glass   env: Rename geten...
601
  	pram = env_get_ulong("pram", 10, CONFIG_PRAM);
92f84b67e   Mario Six   common: board_r: ...
602
  	sprintf(memsz, "%ldk", (long int)((gd->ram_size / 1024) - pram));
382bee57f   Simon Glass   env: Rename seten...
603
  	env_set("mem", memsz);
c2240d4db   Simon Glass   Adjust board_r.c ...
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
  
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_CMD_BEDBUG
  static int initr_bedbug(void)
  {
  	bedbug_init();
  
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_PS2KBD
  static int initr_kbd(void)
  {
  	puts("PS/2:  ");
  	kbd_init();
  	return 0;
  }
  #endif
d7c768a69   Ji Luo   MA-13628 [Auto] R...
626
  #if defined(AVB_RPMB) && !defined(CONFIG_SPL)
2105662ad   Ye Li   MLK-18591-1 andro...
627
628
629
630
631
632
  extern int init_avbkey(void);
  static int initr_avbkey(void)
  {
  	return init_avbkey();
  }
  #endif
2c840c82b   Ye Li   MLK-18591-3 andro...
633
634
635
636
637
638
639
640
641
642
643
644
645
  #ifdef CONFIG_FSL_FASTBOOT
  static int initr_fastboot_setup(void)
  {
  	fastboot_setup();
  	return 0;
  }
  
  static int initr_check_fastboot(void)
  {
  	fastboot_run_bootmode();
  	return 0;
  }
  #endif
1ae9ecc73   Ye Li   MLK-18591-6 andro...
646
647
648
649
650
651
652
653
  #ifdef CONFIG_IMX_TRUSTY_OS
  extern void tee_setup(void);
  static int initr_tee_setup(void)
  {
  	tee_setup();
  	return 0;
  }
  #endif
6f6430d72   Simon Glass   Introduce generic...
654
655
  static int run_main_loop(void)
  {
a733b06b6   Simon Glass   sandbox: Switch o...
656
657
658
  #ifdef CONFIG_SANDBOX
  	sandbox_main_loop_init();
  #endif
6f6430d72   Simon Glass   Introduce generic...
659
660
661
662
663
664
665
666
  	/* main_loop() can return to retry autoboot, if so just run it again */
  	for (;;)
  		main_loop();
  	return 0;
  }
  
  /*
   * Over time we hope to remove these functions with code fragments and
9095d5b89   Simon Goldschmidt   fix spelling of '...
667
   * stub functions, and instead call the relevant function directly.
6f6430d72   Simon Glass   Introduce generic...
668
669
670
   *
   * We also hope to remove most of the driver-related init and do it if/when
   * the driver is later used.
c2240d4db   Simon Glass   Adjust board_r.c ...
671
672
   *
   * TODO: perhaps reset the watchdog in the initcall function after each call?
6f6430d72   Simon Glass   Introduce generic...
673
   */
4acff4524   Simon Glass   board_f/r: Use st...
674
  static init_fnc_t init_sequence_r[] = {
71c52dba2   Simon Glass   Add trace support...
675
  	initr_trace,
6f6430d72   Simon Glass   Introduce generic...
676
  	initr_reloc,
c2240d4db   Simon Glass   Adjust board_r.c ...
677
  	/* TODO: could x86/PPC have this also perhaps? */
6f6430d72   Simon Glass   Introduce generic...
678
679
  #ifdef CONFIG_ARM
  	initr_caches,
12eaf31c0   York Sun   armv8/fsl-lsch3: ...
680
681
  	/* Note: For Freescale LS2 SoCs, new MMU table is created in DDR.
  	 *	 A temporary mapping of IFC high region is since removed,
92f84b67e   Mario Six   common: board_r: ...
682
  	 *	 so environmental variables in NOR flash is not available
12eaf31c0   York Sun   armv8/fsl-lsch3: ...
683
684
685
  	 *	 until board_init() is called below to remap IFC to high
  	 *	 region.
  	 */
9fb02491f   Simon Glass   dm: Make driver m...
686
687
  #endif
  	initr_reloc_global_data,
fef3e25fc   York Sun   common/board_r: F...
688
689
690
  #if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
  	initr_unlock_ram_in_cache,
  #endif
9fb02491f   Simon Glass   dm: Make driver m...
691
692
  	initr_barrier,
  	initr_malloc,
af1bc0cf4   Simon Glass   log: Plumb loggin...
693
  	log_init,
5ac44a554   Simon Glass   bootstage: Init a...
694
  	initr_bootstage,	/* Needs malloc() but has its own timer */
9854a8748   Simon Glass   console: Add a co...
695
  	initr_console_record,
671fa63e7   Jan Kiszka   common/board_r: R...
696
697
698
  #ifdef CONFIG_SYS_NONCACHED_MEMORY
  	initr_noncached,
  #endif
9fb02491f   Simon Glass   dm: Make driver m...
699
  	bootstage_relocate,
3af86a4e2   Simon Glass   dm: Build a live ...
700
701
702
  #ifdef CONFIG_OF_LIVE
  	initr_of_live,
  #endif
9fb02491f   Simon Glass   dm: Make driver m...
703
704
705
  #ifdef CONFIG_DM
  	initr_dm,
  #endif
068feb9b8   Rick Chen   riscv: Modify gen...
706
  #if defined(CONFIG_ARM) || defined(CONFIG_NDS32) || defined(CONFIG_RISCV)
6f6430d72   Simon Glass   Introduce generic...
707
708
  	board_init,	/* Setup chipselects */
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
709
710
711
712
713
714
715
716
717
  	/*
  	 * TODO: printing of the clock inforamtion of the board is now
  	 * implemented as part of bdinfo command. Currently only support for
  	 * davinci SOC's is added. Remove this check once all the board
  	 * implement this.
  	 */
  #ifdef CONFIG_CLOCKS
  	set_cpu_clk_info, /* Setup clock information */
  #endif
5d00995c3   Alexander Graf   efi_loader: Imple...
718
719
720
  #ifdef CONFIG_EFI_LOADER
  	efi_memory_init,
  #endif
9fb02491f   Simon Glass   dm: Make driver m...
721
  	stdio_init_tables,
6f6430d72   Simon Glass   Introduce generic...
722
723
  	initr_serial,
  	initr_announce,
c2240d4db   Simon Glass   Adjust board_r.c ...
724
  	INIT_FUNC_WATCHDOG_RESET
61d7b1bb5   Andreas Bießmann   common/board_r: m...
725
726
727
  #ifdef CONFIG_NEEDS_MANUAL_RELOC
  	initr_manual_reloc_cmdtable,
  #endif
4c2cb1151   Daniel Schwierzeck   common/board_f: e...
728
  #if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_MIPS)
c2240d4db   Simon Glass   Adjust board_r.c ...
729
730
731
732
733
734
735
736
737
  	initr_trap,
  #endif
  #ifdef CONFIG_ADDR_MAP
  	initr_addr_map,
  #endif
  #if defined(CONFIG_BOARD_EARLY_INIT_R)
  	board_early_init_r,
  #endif
  	INIT_FUNC_WATCHDOG_RESET
6f6430d72   Simon Glass   Introduce generic...
738
739
740
  #ifdef CONFIG_POST
  	initr_post_backlog,
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
741
  	INIT_FUNC_WATCHDOG_RESET
c2240d4db   Simon Glass   Adjust board_r.c ...
742
743
744
  #if defined(CONFIG_PCI) && defined(CONFIG_SYS_EARLY_PCI_INIT)
  	/*
  	 * Do early PCI configuration _before_ the flash gets initialised,
92f84b67e   Mario Six   common: board_r: ...
745
  	 * because PCU resources are crucial for flash access on some boards.
c2240d4db   Simon Glass   Adjust board_r.c ...
746
747
748
  	 */
  	initr_pci,
  #endif
6f6430d72   Simon Glass   Introduce generic...
749
750
751
752
  #ifdef CONFIG_ARCH_EARLY_INIT_R
  	arch_early_init_r,
  #endif
  	power_init_board,
e856bdcfb   Masahiro Yamada   flash: complete C...
753
  #ifdef CONFIG_MTD_NOR_FLASH
6f6430d72   Simon Glass   Introduce generic...
754
755
  	initr_flash,
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
756
  	INIT_FUNC_WATCHDOG_RESET
936478e79   Tom Rini   SPARC: Remove
757
  #if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_X86)
c2240d4db   Simon Glass   Adjust board_r.c ...
758
759
  	/* initialize higher level parts of CPU like time base and timers */
  	cpu_init_r,
be274b99a   Simon Glass   x86: Adjust board...
760
761
  #endif
  #ifdef CONFIG_PPC
c2240d4db   Simon Glass   Adjust board_r.c ...
762
763
  	initr_spi,
  #endif
6f6430d72   Simon Glass   Introduce generic...
764
765
766
767
768
769
  #ifdef CONFIG_CMD_NAND
  	initr_nand,
  #endif
  #ifdef CONFIG_CMD_ONENAND
  	initr_onenand,
  #endif
4aa2ba3a3   Masahiro Yamada   mmc: replace CONF...
770
  #ifdef CONFIG_MMC
6f6430d72   Simon Glass   Introduce generic...
771
772
  	initr_mmc,
  #endif
6f6430d72   Simon Glass   Introduce generic...
773
  	initr_env,
c722f0b02   Andreas Bießmann   common/board_r: a...
774
775
776
  #ifdef CONFIG_SYS_BOOTPARAMS_LEN
  	initr_malloc_bootparams,
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
777
778
  	INIT_FUNC_WATCHDOG_RESET
  	initr_secondary_cpu,
c2240d4db   Simon Glass   Adjust board_r.c ...
779
780
781
782
783
784
785
786
787
788
  #if defined(CONFIG_ID_EEPROM) || defined(CONFIG_SYS_I2C_MAC_OFFSET)
  	mac_read_from_eeprom,
  #endif
  	INIT_FUNC_WATCHDOG_RESET
  #if defined(CONFIG_PCI) && !defined(CONFIG_SYS_EARLY_PCI_INIT)
  	/*
  	 * Do pci configuration
  	 */
  	initr_pci,
  #endif
9fb02491f   Simon Glass   dm: Make driver m...
789
  	stdio_add_devices,
6f6430d72   Simon Glass   Introduce generic...
790
791
792
793
794
795
  	initr_jumptable,
  #ifdef CONFIG_API
  	initr_api,
  #endif
  	console_init_r,		/* fully init console as a device */
  #ifdef CONFIG_DISPLAY_BOARDINFO_LATE
b0895384b   Simon Glass   Allow displaying ...
796
  	console_announce_r,
0365ffcc0   Masahiro Yamada   generic-board: sh...
797
  	show_board_info,
6f6430d72   Simon Glass   Introduce generic...
798
799
800
801
802
803
804
  #endif
  #ifdef CONFIG_ARCH_MISC_INIT
  	arch_misc_init,		/* miscellaneous arch-dependent init */
  #endif
  #ifdef CONFIG_MISC_INIT_R
  	misc_init_r,		/* miscellaneous platform-dependent init */
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
805
806
807
808
  	INIT_FUNC_WATCHDOG_RESET
  #ifdef CONFIG_CMD_KGDB
  	initr_kgdb,
  #endif
6f6430d72   Simon Glass   Introduce generic...
809
  	interrupt_init,
daab59ac0   Andy Shevchenko   avr32: Retire AVR...
810
  #ifdef CONFIG_ARM
6f6430d72   Simon Glass   Introduce generic...
811
  	initr_enable_interrupts,
c2240d4db   Simon Glass   Adjust board_r.c ...
812
  #endif
daab59ac0   Andy Shevchenko   avr32: Retire AVR...
813
  #if defined(CONFIG_MICROBLAZE) || defined(CONFIG_M68K)
be274b99a   Simon Glass   x86: Adjust board...
814
815
  	timer_init,		/* initialize timer */
  #endif
2d8d190c8   Uri Mashiach   status_led: Kconf...
816
  #if defined(CONFIG_LED_STATUS)
c2240d4db   Simon Glass   Adjust board_r.c ...
817
818
819
  	initr_status_led,
  #endif
  	/* PPC has a udelay(20) here dating from 2002. Why? */
6f6430d72   Simon Glass   Introduce generic...
820
821
822
823
824
825
  #ifdef CONFIG_CMD_NET
  	initr_ethaddr,
  #endif
  #ifdef CONFIG_BOARD_LATE_INIT
  	board_late_init,
  #endif
2c840c82b   Ye Li   MLK-18591-3 andro...
826
827
828
  #ifdef CONFIG_FSL_FASTBOOT
  	initr_fastboot_setup,
  #endif
e8a016b53   Michal Simek   dm: Add support f...
829
  #if defined(CONFIG_SCSI) && !defined(CONFIG_DM_SCSI)
c2240d4db   Simon Glass   Adjust board_r.c ...
830
831
832
  	INIT_FUNC_WATCHDOG_RESET
  	initr_scsi,
  #endif
6f6430d72   Simon Glass   Introduce generic...
833
834
835
836
  #ifdef CONFIG_BITBANGMII
  	initr_bbmii,
  #endif
  #ifdef CONFIG_CMD_NET
c2240d4db   Simon Glass   Adjust board_r.c ...
837
  	INIT_FUNC_WATCHDOG_RESET
6f6430d72   Simon Glass   Introduce generic...
838
839
840
841
842
  	initr_net,
  #endif
  #ifdef CONFIG_POST
  	initr_post,
  #endif
fc843a02a   Simon Glass   Kconfig: Add a CO...
843
  #if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_IDE)
c2240d4db   Simon Glass   Adjust board_r.c ...
844
845
  	initr_pcmcia,
  #endif
fc843a02a   Simon Glass   Kconfig: Add a CO...
846
  #if defined(CONFIG_IDE)
c2240d4db   Simon Glass   Adjust board_r.c ...
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
  	initr_ide,
  #endif
  #ifdef CONFIG_LAST_STAGE_INIT
  	INIT_FUNC_WATCHDOG_RESET
  	/*
  	 * Some parts can be only initialized if all others (like
  	 * Interrupts) are up and running (i.e. the PC-style ISA
  	 * keyboard).
  	 */
  	last_stage_init,
  #endif
  #ifdef CONFIG_CMD_BEDBUG
  	INIT_FUNC_WATCHDOG_RESET
  	initr_bedbug,
  #endif
c5404b64f   Simon Glass   Drop the log buffer
862
  #if defined(CONFIG_PRAM)
c2240d4db   Simon Glass   Adjust board_r.c ...
863
864
865
866
867
  	initr_mem,
  #endif
  #ifdef CONFIG_PS2KBD
  	initr_kbd,
  #endif
d7c768a69   Ji Luo   MA-13628 [Auto] R...
868
  #if defined(AVB_RPMB) && !defined(CONFIG_SPL)
2105662ad   Ye Li   MLK-18591-1 andro...
869
870
  	initr_avbkey,
  #endif
1ae9ecc73   Ye Li   MLK-18591-6 andro...
871
872
873
  #ifdef CONFIG_IMX_TRUSTY_OS
  	initr_tee_setup,
  #endif
2c840c82b   Ye Li   MLK-18591-3 andro...
874
875
876
  #ifdef CONFIG_FSL_FASTBOOT
  	initr_check_fastboot,
  #endif
6f6430d72   Simon Glass   Introduce generic...
877
878
879
880
881
  	run_main_loop,
  };
  
  void board_init_r(gd_t *new_gd, ulong dest_addr)
  {
fb92308b9   Simon Glass   x86: board_r: Set...
882
883
884
885
886
887
888
889
890
  	/*
  	 * Set up the new global data pointer. So far only x86 does this
  	 * here.
  	 * TODO(sjg@chromium.org): Consider doing this for all archs, or
  	 * dropping the new_gd parameter.
  	 */
  #if CONFIG_IS_ENABLED(X86_64)
  	arch_setup_gd(new_gd);
  #endif
7395398ad   Alexey Brodkin   board_r - fixup f...
891
892
893
  #ifdef CONFIG_NEEDS_MANUAL_RELOC
  	int i;
  #endif
47a602eab   Jeroen Hofstee   board_r: ARM[64] ...
894
  #if !defined(CONFIG_X86) && !defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
6f6430d72   Simon Glass   Introduce generic...
895
  	gd = new_gd;
be274b99a   Simon Glass   x86: Adjust board...
896
  #endif
af1bc0cf4   Simon Glass   log: Plumb loggin...
897
  	gd->flags &= ~GD_FLG_LOG_READY;
7395398ad   Alexey Brodkin   board_r - fixup f...
898
899
900
901
902
  
  #ifdef CONFIG_NEEDS_MANUAL_RELOC
  	for (i = 0; i < ARRAY_SIZE(init_sequence_r); i++)
  		init_sequence_r[i] += gd->reloc_off;
  #endif
6f6430d72   Simon Glass   Introduce generic...
903
904
905
906
907
908
  	if (initcall_run_list(init_sequence_r))
  		hang();
  
  	/* NOTREACHED - run_main_loop() does not return */
  	hang();
  }