Blame view

common/board_r.c 17.4 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>
6f6430d72   Simon Glass   Introduce generic...
51
52
53
54
  
  DECLARE_GLOBAL_DATA_PTR;
  
  ulong monitor_flash_len;
dd2a6cd0f   Jeroen Hofstee   common: board: us...
55
  __weak int board_flash_wp_on(void)
c2240d4db   Simon Glass   Adjust board_r.c ...
56
57
58
59
60
61
62
63
  {
  	/*
  	 * 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...
64
  __weak void cpu_secondary_init_r(void)
c2240d4db   Simon Glass   Adjust board_r.c ...
65
66
  {
  }
c2240d4db   Simon Glass   Adjust board_r.c ...
67
68
69
70
71
72
73
74
75
76
77
78
79
  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...
80

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

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

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

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