Blame view

common/board_r.c 18.2 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
6f6430d72   Simon Glass   Introduce generic...
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>
6f6430d72   Simon Glass   Introduce generic...
10
11
12
   */
  
  #include <common.h>
12d738ae4   Simon Glass   api: Add a header...
13
  #include <api.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
14
15
16
17
  /* 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...
18
  #include <command.h>
24b852a7a   Simon Glass   Move console defi...
19
  #include <console.h>
1ce601767   Simon Glass   dm: Set up driver...
20
  #include <dm.h>
6f6430d72   Simon Glass   Introduce generic...
21
22
  #include <environment.h>
  #include <fdtdec.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
23
  #include <ide.h>
6f6430d72   Simon Glass   Introduce generic...
24
  #include <initcall.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
25
26
27
  #if defined(CONFIG_CMD_KGDB)
  #include <kgdb.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
28
  #include <malloc.h>
0eb25b619   Joe Hershberger   common: Make sure...
29
  #include <mapmem.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
30
31
32
  #ifdef CONFIG_BITBANGMII
  #include <miiphy.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
33
34
  #include <mmc.h>
  #include <nand.h>
3af86a4e2   Simon Glass   dm: Build a live ...
35
  #include <of_live.h>
6f6430d72   Simon Glass   Introduce generic...
36
  #include <onenand_uboot.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
37
  #include <scsi.h>
6f6430d72   Simon Glass   Introduce generic...
38
39
  #include <serial.h>
  #include <stdio_dev.h>
1057e6cfe   Simon Glass   timer: Set up the...
40
  #include <timer.h>
71c52dba2   Simon Glass   Add trace support...
41
  #include <trace.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
42
43
44
45
  #include <watchdog.h>
  #ifdef CONFIG_ADDR_MAP
  #include <asm/mmu.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
46
  #include <asm/sections.h>
1ce601767   Simon Glass   dm: Set up driver...
47
  #include <dm/root.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
48
  #include <linux/compiler.h>
1ce601767   Simon Glass   dm: Set up driver...
49
  #include <linux/err.h>
50149ea37   Alexander Graf   efi_loader: Add r...
50
  #include <efi_loader.h>
9b149c2a2   Ye Li   MLK-18591-3 andro...
51
52
53
  #ifdef CONFIG_FSL_FASTBOOT
  #include <fb_fsl.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
54
55
56
57
  
  DECLARE_GLOBAL_DATA_PTR;
  
  ulong monitor_flash_len;
dd2a6cd0f   Jeroen Hofstee   common: board: us...
58
  __weak int board_flash_wp_on(void)
c2240d4db   Simon Glass   Adjust board_r.c ...
59
60
61
62
63
64
65
66
  {
  	/*
  	 * 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...
67
  __weak void cpu_secondary_init_r(void)
c2240d4db   Simon Glass   Adjust board_r.c ...
68
69
  {
  }
c2240d4db   Simon Glass   Adjust board_r.c ...
70
71
72
73
74
75
76
77
78
79
80
81
82
  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...
83

71c52dba2   Simon Glass   Add trace support...
84
85
86
87
88
89
90
91
  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...
92
93
  static int initr_reloc(void)
  {
c9356be30   Simon Glass   dm: Split the sim...
94
95
  	/* tell others: relocation done */
  	gd->flags |= GD_FLG_RELOC | GD_FLG_FULL_MALLOC_INIT;
6f6430d72   Simon Glass   Introduce generic...
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
  
  	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 ...
112
113
114
115
  __weak int fixup_cpu(void)
  {
  	return 0;
  }
6f6430d72   Simon Glass   Introduce generic...
116
117
  static int initr_reloc_global_data(void)
  {
b60eff31f   Albert ARIBAUD   arm: remove unnee...
118
119
  #ifdef __ARM__
  	monitor_flash_len = _end - __image_copy_start;
068feb9b8   Rick Chen   riscv: Modify gen...
120
  #elif defined(CONFIG_NDS32) || defined(CONFIG_RISCV)
2e88bb28d   Kun-Hua Huang   NDS32: Generic Bo...
121
  	monitor_flash_len = (ulong)&_end - (ulong)&_start;
5ff10aa7e   Thomas Chou   nios2: add generi...
122
  #elif !defined(CONFIG_SANDBOX) && !defined(CONFIG_NIOS2)
a0ba279ac   Masahiro Yamada   generic_board: re...
123
  	monitor_flash_len = (ulong)&__init_end - gd->relocaddr;
6f6430d72   Simon Glass   Introduce generic...
124
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
125
126
127
128
129
130
  #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...
131
  	gd->arch.cpu += gd->relocaddr - CONFIG_SYS_MONITOR_BASE;
c2240d4db   Simon Glass   Adjust board_r.c ...
132
133
134
135
136
137
138
  
  	/*
  	 * If we didn't know the cpu mask & # cores, we can save them of
  	 * now rather than 'computing' them constantly
  	 */
  	fixup_cpu();
  #endif
6c6add602   Simon Goldschmidt   configs: drop CON...
139
  #if !defined(CONFIG_ENV_ADDR) || defined(ENV_IS_EMBEDDED)
c2240d4db   Simon Glass   Adjust board_r.c ...
140
  	/*
6c6add602   Simon Goldschmidt   configs: drop CON...
141
142
  	 * Relocate the early env_addr pointer unless we know it is not inside
  	 * the binary. Some systems need this and for the rest, it doesn't hurt.
c2240d4db   Simon Glass   Adjust board_r.c ...
143
  	 */
6c6add602   Simon Goldschmidt   configs: drop CON...
144
  	gd->env_addr += gd->reloc_off;
c2240d4db   Simon Glass   Adjust board_r.c ...
145
  #endif
e9acb9ea4   Siva Durga Prasad Paladugu   common: board: Do...
146
147
  #ifdef CONFIG_OF_EMBED
  	/*
92f84b67e   Mario Six   common: board_r: ...
148
149
150
  	 * 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...
151
152
  	gd->fdt_blob += gd->reloc_off;
  #endif
50149ea37   Alexander Graf   efi_loader: Add r...
153
154
155
  #ifdef CONFIG_EFI_LOADER
  	efi_runtime_relocate(gd->relocaddr, NULL);
  #endif
e9acb9ea4   Siva Durga Prasad Paladugu   common: board: Do...
156

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

6f6430d72   Simon Glass   Introduce generic...
326
327
328
  	print_size(flash_size, "");
  #ifdef CONFIG_SYS_FLASH_CHECKSUM
  	/*
92f84b67e   Mario Six   common: board_r: ...
329
330
331
332
  	 * 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...
333
  	if (env_get_yesno("flashchecksum") == 1) {
92f84b67e   Mario Six   common: board_r: ...
334
  		const uchar *flash_base = (const uchar *)CONFIG_SYS_FLASH_BASE;
6f6430d72   Simon Glass   Introduce generic...
335
  		printf("  CRC: %08X", crc32(0,
92f84b67e   Mario Six   common: board_r: ...
336
337
  					    flash_base,
  					    flash_size));
6f6430d72   Simon Glass   Introduce generic...
338
339
340
341
  	}
  #endif /* CONFIG_SYS_FLASH_CHECKSUM */
  	putc('
  ');
c2240d4db   Simon Glass   Adjust board_r.c ...
342
343
344
345
346
347
348
349
350
351
352
  	/* 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 ...
353
354
355
356
357
358
359
360
361
  #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
6f6430d72   Simon Glass   Introduce generic...
362
363
  #ifdef CONFIG_CMD_NAND
  /* go init the NAND */
2588ba14d   Jeroen Hofstee   common: board_r: ...
364
  static int initr_nand(void)
6f6430d72   Simon Glass   Introduce generic...
365
366
367
  {
  	puts("NAND:  ");
  	nand_init();
203db38a9   Hou Zhiqiang   mtd: nand: remove...
368
369
  	printf("%lu MiB
  ", nand_size() / 1024);
6f6430d72   Simon Glass   Introduce generic...
370
371
372
373
374
375
  	return 0;
  }
  #endif
  
  #if defined(CONFIG_CMD_ONENAND)
  /* go init the NAND */
2588ba14d   Jeroen Hofstee   common: board_r: ...
376
  static int initr_onenand(void)
6f6430d72   Simon Glass   Introduce generic...
377
378
379
380
381
382
  {
  	puts("NAND:  ");
  	onenand_init();
  	return 0;
  }
  #endif
4aa2ba3a3   Masahiro Yamada   mmc: replace CONF...
383
  #ifdef CONFIG_MMC
2588ba14d   Jeroen Hofstee   common: board_r: ...
384
  static int initr_mmc(void)
6f6430d72   Simon Glass   Introduce generic...
385
386
387
388
389
390
  {
  	puts("MMC:   ");
  	mmc_initialize(gd->bd);
  	return 0;
  }
  #endif
6f6430d72   Simon Glass   Introduce generic...
391
392
393
  /*
   * Tell if it's OK to load the environment early in boot.
   *
776babd78   Masahiro Yamada   board_r: fix a ty...
394
   * If CONFIG_OF_CONTROL is defined, we'll check with the FDT to see
6f6430d72   Simon Glass   Introduce generic...
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
   * 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
c5d548a9f   Yaniv Levinsky   env: common: acce...
419
  		set_default_env(NULL, 0);
545dfd101   Thomas Chou   env: export fdt_b...
420
  #ifdef CONFIG_OF_CONTROL
f980c9998   Heinrich Schuchardt   fdt: sandbox: cor...
421
422
  	env_set_hex("fdtcontroladdr",
  		    (unsigned long)map_to_sysmem(gd->fdt_blob));
545dfd101   Thomas Chou   env: export fdt_b...
423
  #endif
6f6430d72   Simon Glass   Introduce generic...
424
425
  
  	/* Initialize from environment */
bfebc8c96   Simon Glass   env: Rename geten...
426
  	load_addr = env_get_ulong("loadaddr", 16, load_addr);
c2240d4db   Simon Glass   Adjust board_r.c ...
427

c2240d4db   Simon Glass   Adjust board_r.c ...
428
429
  	return 0;
  }
c722f0b02   Andreas Bießmann   common/board_r: a...
430
431
432
433
434
435
436
437
438
439
440
441
  #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...
442
443
444
445
446
447
448
449
450
451
452
453
454
455
  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...
456
  /* enable exceptions */
daab59ac0   Andy Shevchenko   avr32: Retire AVR...
457
  #ifdef CONFIG_ARM
6f6430d72   Simon Glass   Introduce generic...
458
459
460
461
462
  static int initr_enable_interrupts(void)
  {
  	enable_interrupts();
  	return 0;
  }
e424c15c1   Simon Glass   x86: Enable gener...
463
  #endif
6f6430d72   Simon Glass   Introduce generic...
464
465
466
467
  
  #ifdef CONFIG_CMD_NET
  static int initr_ethaddr(void)
  {
c2240d4db   Simon Glass   Adjust board_r.c ...
468
469
470
  	bd_t *bd = gd->bd;
  
  	/* kept around for legacy kernels only ... ignore the next section */
35affd7a2   Simon Glass   env: Rename eth_g...
471
  	eth_env_get_enetaddr("ethaddr", bd->bi_enetaddr);
c2240d4db   Simon Glass   Adjust board_r.c ...
472
  #ifdef CONFIG_HAS_ETH1
35affd7a2   Simon Glass   env: Rename eth_g...
473
  	eth_env_get_enetaddr("eth1addr", bd->bi_enet1addr);
c2240d4db   Simon Glass   Adjust board_r.c ...
474
475
  #endif
  #ifdef CONFIG_HAS_ETH2
35affd7a2   Simon Glass   env: Rename eth_g...
476
  	eth_env_get_enetaddr("eth2addr", bd->bi_enet2addr);
c2240d4db   Simon Glass   Adjust board_r.c ...
477
478
  #endif
  #ifdef CONFIG_HAS_ETH3
35affd7a2   Simon Glass   env: Rename eth_g...
479
  	eth_env_get_enetaddr("eth3addr", bd->bi_enet3addr);
c2240d4db   Simon Glass   Adjust board_r.c ...
480
481
  #endif
  #ifdef CONFIG_HAS_ETH4
35affd7a2   Simon Glass   env: Rename eth_g...
482
  	eth_env_get_enetaddr("eth4addr", bd->bi_enet4addr);
c2240d4db   Simon Glass   Adjust board_r.c ...
483
484
  #endif
  #ifdef CONFIG_HAS_ETH5
35affd7a2   Simon Glass   env: Rename eth_g...
485
  	eth_env_get_enetaddr("eth5addr", bd->bi_enet5addr);
c2240d4db   Simon Glass   Adjust board_r.c ...
486
487
488
489
490
491
492
493
494
495
496
497
498
  #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...
499
  #if defined(CONFIG_LED_STATUS)
c2240d4db   Simon Glass   Adjust board_r.c ...
500
501
  static int initr_status_led(void)
  {
2d8d190c8   Uri Mashiach   status_led: Kconf...
502
503
  #if defined(CONFIG_LED_STATUS_BOOT)
  	status_led_set(CONFIG_LED_STATUS_BOOT, CONFIG_LED_STATUS_BLINKING);
13cfbe513   Bernhard Nortmann   allow LED initial...
504
505
506
  #else
  	status_led_init();
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
507
508
509
  	return 0;
  }
  #endif
e8a016b53   Michal Simek   dm: Add support f...
510
  #if defined(CONFIG_SCSI) && !defined(CONFIG_DM_SCSI)
c2240d4db   Simon Glass   Adjust board_r.c ...
511
512
  static int initr_scsi(void)
  {
c2240d4db   Simon Glass   Adjust board_r.c ...
513
514
  	puts("SCSI:  ");
  	scsi_init();
3804f5bb4   Heinrich Schuchardt   common: print \n ...
515
516
  	puts("
  ");
6f6430d72   Simon Glass   Introduce generic...
517
518
519
  
  	return 0;
  }
2c997e7a8   Ian Campbell   board_r: run scsi...
520
  #endif
6f6430d72   Simon Glass   Introduce generic...
521
522
523
524
525
526
527
528
529
530
531
532
533
  
  #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...
534
  	eth_initialize();
6f6430d72   Simon Glass   Introduce generic...
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
  #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...
551
  #if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_IDE)
c2240d4db   Simon Glass   Adjust board_r.c ...
552
553
554
555
556
557
558
  static int initr_pcmcia(void)
  {
  	puts("PCMCIA:");
  	pcmcia_init();
  	return 0;
  }
  #endif
ec15d5f6e   Bin Meng   board_r: Do not i...
559
  #if defined(CONFIG_IDE) && !defined(CONFIG_BLK)
c2240d4db   Simon Glass   Adjust board_r.c ...
560
561
  static int initr_ide(void)
  {
c2240d4db   Simon Glass   Adjust board_r.c ...
562
  	puts("IDE:   ");
c2240d4db   Simon Glass   Adjust board_r.c ...
563
564
565
566
567
568
569
570
571
  #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
572
  #if defined(CONFIG_PRAM)
6f6430d72   Simon Glass   Introduce generic...
573
574
575
576
577
578
579
580
  /*
   * 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...
581
  	pram = env_get_ulong("pram", 10, CONFIG_PRAM);
92f84b67e   Mario Six   common: board_r: ...
582
  	sprintf(memsz, "%ldk", (long int)((gd->ram_size / 1024) - pram));
382bee57f   Simon Glass   env: Rename seten...
583
  	env_set("mem", memsz);
c2240d4db   Simon Glass   Adjust board_r.c ...
584
585
586
587
588
589
590
591
592
593
594
595
596
  
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_CMD_BEDBUG
  static int initr_bedbug(void)
  {
  	bedbug_init();
  
  	return 0;
  }
  #endif
b871714c5   Ye Li   MLK-18591-1 andro...
597
598
599
600
601
602
603
  #if defined(AVB_RPMB) && !defined(CONFIG_SPL)
  extern int init_avbkey(void);
  static int initr_avbkey(void)
  {
  	return init_avbkey();
  }
  #endif
9b149c2a2   Ye Li   MLK-18591-3 andro...
604
605
606
607
608
609
610
611
612
613
614
615
616
  #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
6fa4f4a42   Ye Li   MLK-18591-6 andro...
617
618
619
620
621
622
623
624
  #ifdef CONFIG_IMX_TRUSTY_OS
  extern void tee_setup(void);
  static int initr_tee_setup(void)
  {
  	tee_setup();
  	return 0;
  }
  #endif
46cc755cf   Ji Luo   MA-15158 Set spl ...
625
626
627
628
629
630
631
632
  #ifdef CONFIG_DUAL_BOOTLOADER
  extern void check_spl_recovery(void);
  static int initr_check_spl_recovery(void)
  {
  	check_spl_recovery();
  	return 0;
  }
  #endif
6f6430d72   Simon Glass   Introduce generic...
633
634
  static int run_main_loop(void)
  {
a733b06b6   Simon Glass   sandbox: Switch o...
635
636
637
  #ifdef CONFIG_SANDBOX
  	sandbox_main_loop_init();
  #endif
6f6430d72   Simon Glass   Introduce generic...
638
639
640
641
642
643
644
  	/* main_loop() can return to retry autoboot, if so just run it again */
  	for (;;)
  		main_loop();
  	return 0;
  }
  
  /*
47870afab   Alexander Graf   initcall: Move to...
645
   * We hope to remove most of the driver-related init and do it if/when
6f6430d72   Simon Glass   Introduce generic...
646
   * the driver is later used.
c2240d4db   Simon Glass   Adjust board_r.c ...
647
648
   *
   * TODO: perhaps reset the watchdog in the initcall function after each call?
6f6430d72   Simon Glass   Introduce generic...
649
   */
4acff4524   Simon Glass   board_f/r: Use st...
650
  static init_fnc_t init_sequence_r[] = {
71c52dba2   Simon Glass   Add trace support...
651
  	initr_trace,
6f6430d72   Simon Glass   Introduce generic...
652
  	initr_reloc,
c2240d4db   Simon Glass   Adjust board_r.c ...
653
  	/* TODO: could x86/PPC have this also perhaps? */
6f6430d72   Simon Glass   Introduce generic...
654
655
  #ifdef CONFIG_ARM
  	initr_caches,
12eaf31c0   York Sun   armv8/fsl-lsch3: ...
656
657
  	/* 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: ...
658
  	 *	 so environmental variables in NOR flash is not available
12eaf31c0   York Sun   armv8/fsl-lsch3: ...
659
660
661
  	 *	 until board_init() is called below to remap IFC to high
  	 *	 region.
  	 */
9fb02491f   Simon Glass   dm: Make driver m...
662
663
  #endif
  	initr_reloc_global_data,
fef3e25fc   York Sun   common/board_r: F...
664
665
666
  #if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500)
  	initr_unlock_ram_in_cache,
  #endif
9fb02491f   Simon Glass   dm: Make driver m...
667
668
  	initr_barrier,
  	initr_malloc,
af1bc0cf4   Simon Glass   log: Plumb loggin...
669
  	log_init,
5ac44a554   Simon Glass   bootstage: Init a...
670
  	initr_bootstage,	/* Needs malloc() but has its own timer */
9854a8748   Simon Glass   console: Add a co...
671
  	initr_console_record,
671fa63e7   Jan Kiszka   common/board_r: R...
672
673
674
  #ifdef CONFIG_SYS_NONCACHED_MEMORY
  	initr_noncached,
  #endif
9fb02491f   Simon Glass   dm: Make driver m...
675
  	bootstage_relocate,
3af86a4e2   Simon Glass   dm: Build a live ...
676
677
678
  #ifdef CONFIG_OF_LIVE
  	initr_of_live,
  #endif
9fb02491f   Simon Glass   dm: Make driver m...
679
680
681
  #ifdef CONFIG_DM
  	initr_dm,
  #endif
17585e2dc   Patrick Delaunay   sandbox: led: use...
682
683
  #if defined(CONFIG_ARM) || defined(CONFIG_NDS32) || defined(CONFIG_RISCV) || \
  	defined(CONFIG_SANDBOX)
6f6430d72   Simon Glass   Introduce generic...
684
685
  	board_init,	/* Setup chipselects */
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
686
687
688
689
690
691
692
693
694
  	/*
  	 * 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...
695
696
697
  #ifdef CONFIG_EFI_LOADER
  	efi_memory_init,
  #endif
9fb02491f   Simon Glass   dm: Make driver m...
698
  	stdio_init_tables,
6f6430d72   Simon Glass   Introduce generic...
699
700
  	initr_serial,
  	initr_announce,
c2240d4db   Simon Glass   Adjust board_r.c ...
701
  	INIT_FUNC_WATCHDOG_RESET
61d7b1bb5   Andreas Bießmann   common/board_r: m...
702
703
704
  #ifdef CONFIG_NEEDS_MANUAL_RELOC
  	initr_manual_reloc_cmdtable,
  #endif
4c2cb1151   Daniel Schwierzeck   common/board_f: e...
705
  #if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_MIPS)
c2240d4db   Simon Glass   Adjust board_r.c ...
706
707
708
709
710
711
712
713
714
  	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...
715
716
717
  #ifdef CONFIG_POST
  	initr_post_backlog,
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
718
  	INIT_FUNC_WATCHDOG_RESET
c2240d4db   Simon Glass   Adjust board_r.c ...
719
720
721
  #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: ...
722
  	 * because PCU resources are crucial for flash access on some boards.
c2240d4db   Simon Glass   Adjust board_r.c ...
723
724
725
  	 */
  	initr_pci,
  #endif
6f6430d72   Simon Glass   Introduce generic...
726
727
728
729
  #ifdef CONFIG_ARCH_EARLY_INIT_R
  	arch_early_init_r,
  #endif
  	power_init_board,
e856bdcfb   Masahiro Yamada   flash: complete C...
730
  #ifdef CONFIG_MTD_NOR_FLASH
6f6430d72   Simon Glass   Introduce generic...
731
732
  	initr_flash,
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
733
  	INIT_FUNC_WATCHDOG_RESET
936478e79   Tom Rini   SPARC: Remove
734
  #if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_X86)
c2240d4db   Simon Glass   Adjust board_r.c ...
735
736
  	/* initialize higher level parts of CPU like time base and timers */
  	cpu_init_r,
be274b99a   Simon Glass   x86: Adjust board...
737
  #endif
6f6430d72   Simon Glass   Introduce generic...
738
739
740
741
742
743
  #ifdef CONFIG_CMD_NAND
  	initr_nand,
  #endif
  #ifdef CONFIG_CMD_ONENAND
  	initr_onenand,
  #endif
4aa2ba3a3   Masahiro Yamada   mmc: replace CONF...
744
  #ifdef CONFIG_MMC
6f6430d72   Simon Glass   Introduce generic...
745
746
  	initr_mmc,
  #endif
6f6430d72   Simon Glass   Introduce generic...
747
  	initr_env,
c722f0b02   Andreas Bießmann   common/board_r: a...
748
749
750
  #ifdef CONFIG_SYS_BOOTPARAMS_LEN
  	initr_malloc_bootparams,
  #endif
c2240d4db   Simon Glass   Adjust board_r.c ...
751
752
  	INIT_FUNC_WATCHDOG_RESET
  	initr_secondary_cpu,
c2240d4db   Simon Glass   Adjust board_r.c ...
753
754
755
756
757
758
759
760
761
762
  #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...
763
  	stdio_add_devices,
6f6430d72   Simon Glass   Introduce generic...
764
765
766
767
768
769
  	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 ...
770
  	console_announce_r,
0365ffcc0   Masahiro Yamada   generic-board: sh...
771
  	show_board_info,
6f6430d72   Simon Glass   Introduce generic...
772
773
774
775
776
777
778
  #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 ...
779
780
781
782
  	INIT_FUNC_WATCHDOG_RESET
  #ifdef CONFIG_CMD_KGDB
  	initr_kgdb,
  #endif
6f6430d72   Simon Glass   Introduce generic...
783
  	interrupt_init,
daab59ac0   Andy Shevchenko   avr32: Retire AVR...
784
  #ifdef CONFIG_ARM
6f6430d72   Simon Glass   Introduce generic...
785
  	initr_enable_interrupts,
c2240d4db   Simon Glass   Adjust board_r.c ...
786
  #endif
daab59ac0   Andy Shevchenko   avr32: Retire AVR...
787
  #if defined(CONFIG_MICROBLAZE) || defined(CONFIG_M68K)
be274b99a   Simon Glass   x86: Adjust board...
788
789
  	timer_init,		/* initialize timer */
  #endif
2d8d190c8   Uri Mashiach   status_led: Kconf...
790
  #if defined(CONFIG_LED_STATUS)
c2240d4db   Simon Glass   Adjust board_r.c ...
791
792
793
  	initr_status_led,
  #endif
  	/* PPC has a udelay(20) here dating from 2002. Why? */
6f6430d72   Simon Glass   Introduce generic...
794
795
796
797
798
799
  #ifdef CONFIG_CMD_NET
  	initr_ethaddr,
  #endif
  #ifdef CONFIG_BOARD_LATE_INIT
  	board_late_init,
  #endif
9b149c2a2   Ye Li   MLK-18591-3 andro...
800
801
802
  #ifdef CONFIG_FSL_FASTBOOT
  	initr_fastboot_setup,
  #endif
e8a016b53   Michal Simek   dm: Add support f...
803
  #if defined(CONFIG_SCSI) && !defined(CONFIG_DM_SCSI)
c2240d4db   Simon Glass   Adjust board_r.c ...
804
805
806
  	INIT_FUNC_WATCHDOG_RESET
  	initr_scsi,
  #endif
6f6430d72   Simon Glass   Introduce generic...
807
808
809
810
  #ifdef CONFIG_BITBANGMII
  	initr_bbmii,
  #endif
  #ifdef CONFIG_CMD_NET
c2240d4db   Simon Glass   Adjust board_r.c ...
811
  	INIT_FUNC_WATCHDOG_RESET
6f6430d72   Simon Glass   Introduce generic...
812
813
814
815
816
  	initr_net,
  #endif
  #ifdef CONFIG_POST
  	initr_post,
  #endif
fc843a02a   Simon Glass   Kconfig: Add a CO...
817
  #if defined(CONFIG_CMD_PCMCIA) && !defined(CONFIG_IDE)
c2240d4db   Simon Glass   Adjust board_r.c ...
818
819
  	initr_pcmcia,
  #endif
ec15d5f6e   Bin Meng   board_r: Do not i...
820
  #if defined(CONFIG_IDE) && !defined(CONFIG_BLK)
c2240d4db   Simon Glass   Adjust board_r.c ...
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
  	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
836
  #if defined(CONFIG_PRAM)
c2240d4db   Simon Glass   Adjust board_r.c ...
837
838
  	initr_mem,
  #endif
b871714c5   Ye Li   MLK-18591-1 andro...
839
840
841
  #if defined(AVB_RPMB) && !defined(CONFIG_SPL)
  	initr_avbkey,
  #endif
6fa4f4a42   Ye Li   MLK-18591-6 andro...
842
843
844
  #ifdef CONFIG_IMX_TRUSTY_OS
  	initr_tee_setup,
  #endif
9b149c2a2   Ye Li   MLK-18591-3 andro...
845
846
847
  #ifdef CONFIG_FSL_FASTBOOT
  	initr_check_fastboot,
  #endif
46cc755cf   Ji Luo   MA-15158 Set spl ...
848
849
850
  #ifdef CONFIG_DUAL_BOOTLOADER
  	initr_check_spl_recovery,
  #endif
6f6430d72   Simon Glass   Introduce generic...
851
852
853
854
855
  	run_main_loop,
  };
  
  void board_init_r(gd_t *new_gd, ulong dest_addr)
  {
fb92308b9   Simon Glass   x86: board_r: Set...
856
857
858
859
860
861
862
863
864
  	/*
  	 * 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...
865
866
867
  #ifdef CONFIG_NEEDS_MANUAL_RELOC
  	int i;
  #endif
47a602eab   Jeroen Hofstee   board_r: ARM[64] ...
868
  #if !defined(CONFIG_X86) && !defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
6f6430d72   Simon Glass   Introduce generic...
869
  	gd = new_gd;
be274b99a   Simon Glass   x86: Adjust board...
870
  #endif
af1bc0cf4   Simon Glass   log: Plumb loggin...
871
  	gd->flags &= ~GD_FLG_LOG_READY;
7395398ad   Alexey Brodkin   board_r - fixup f...
872
873
874
875
876
  
  #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...
877
878
879
880
881
882
  	if (initcall_run_list(init_sequence_r))
  		hang();
  
  	/* NOTREACHED - run_main_loop() does not return */
  	hang();
  }