Blame view

common/board_r.c 17.6 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>
3f989e7b0   Simon Glass   env: Move env_rel...
21
  #include <env.h>
f3998fdc4   Simon Glass   env: Rename envir...
22
  #include <env_internal.h>
6f6430d72   Simon Glass   Introduce generic...
23
  #include <fdtdec.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
24
  #include <ide.h>
6f6430d72   Simon Glass   Introduce generic...
25
  #include <initcall.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
26
27
28
  #if defined(CONFIG_CMD_KGDB)
  #include <kgdb.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
29
  #include <malloc.h>
0eb25b619   Joe Hershberger   common: Make sure...
30
  #include <mapmem.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
31
32
33
  #ifdef CONFIG_BITBANGMII
  #include <miiphy.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
34
35
  #include <mmc.h>
  #include <nand.h>
3af86a4e2   Simon Glass   dm: Build a live ...
36
  #include <of_live.h>
6f6430d72   Simon Glass   Introduce generic...
37
  #include <onenand_uboot.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
38
  #include <scsi.h>
6f6430d72   Simon Glass   Introduce generic...
39
40
  #include <serial.h>
  #include <stdio_dev.h>
1057e6cfe   Simon Glass   timer: Set up the...
41
  #include <timer.h>
71c52dba2   Simon Glass   Add trace support...
42
  #include <trace.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
43
44
45
46
  #include <watchdog.h>
  #ifdef CONFIG_ADDR_MAP
  #include <asm/mmu.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
47
  #include <asm/sections.h>
1ce601767   Simon Glass   dm: Set up driver...
48
  #include <dm/root.h>
c2240d4db   Simon Glass   Adjust board_r.c ...
49
  #include <linux/compiler.h>
1ce601767   Simon Glass   dm: Set up driver...
50
  #include <linux/err.h>
50149ea37   Alexander Graf   efi_loader: Add r...
51
  #include <efi_loader.h>
06985289d   Stefan Roese   watchdog: Impleme...
52
  #include <wdt.h>
49b10cb49   Heiko Schocher   gpio: fixes for g...
53
  #if defined(CONFIG_GPIO_HOG)
5fc7cf8c8   Heiko Schocher   gpio: add gpio-ho...
54
55
  #include <asm/gpio.h>
  #endif
6f6430d72   Simon Glass   Introduce generic...
56
57
58
59
  
  DECLARE_GLOBAL_DATA_PTR;
  
  ulong monitor_flash_len;
dd2a6cd0f   Jeroen Hofstee   common: board: us...
60
  __weak int board_flash_wp_on(void)
c2240d4db   Simon Glass   Adjust board_r.c ...
61
62
63
64
65
66
67
68
  {
  	/*
  	 * 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...
69
  __weak void cpu_secondary_init_r(void)
c2240d4db   Simon Glass   Adjust board_r.c ...
70
71
  {
  }
c2240d4db   Simon Glass   Adjust board_r.c ...
72
73
74
75
76
77
78
79
80
81
82
83
84
  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...
85

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

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

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

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