Blame view

common/board_f.c 24.8 KB
1938f4a5b   Simon Glass   Introduce generic...
1
2
3
4
5
6
7
8
9
  /*
   * Copyright (c) 2011 The Chromium OS Authors.
   * (C) Copyright 2002-2006
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
   * (C) Copyright 2002
   * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
   * Marius Groeger <mgroeger@sysgo.de>
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
10
   * SPDX-License-Identifier:	GPL-2.0+
1938f4a5b   Simon Glass   Introduce generic...
11
12
13
14
15
16
17
   */
  
  #include <common.h>
  #include <linux/compiler.h>
  #include <version.h>
  #include <environment.h>
  #include <fdtdec.h>
f828bf25f   Simon Glass   sandbox: Add CONF...
18
  #include <fs.h>
e4fef6cfc   Simon Glass   Adjust board_f.c ...
19
20
21
22
  #if defined(CONFIG_CMD_IDE)
  #include <ide.h>
  #endif
  #include <i2c.h>
1938f4a5b   Simon Glass   Introduce generic...
23
24
  #include <initcall.h>
  #include <logbuff.h>
e4fef6cfc   Simon Glass   Adjust board_f.c ...
25
26
27
28
29
30
31
32
33
34
35
  
  /* TODO: Can we move these into arch/ headers? */
  #ifdef CONFIG_8xx
  #include <mpc8xx.h>
  #endif
  #ifdef CONFIG_5xx
  #include <mpc5xx.h>
  #endif
  #ifdef CONFIG_MPC5xxx
  #include <mpc5xxx.h>
  #endif
a733b06b6   Simon Glass   sandbox: Switch o...
36
  #include <os.h>
1938f4a5b   Simon Glass   Introduce generic...
37
  #include <post.h>
e4fef6cfc   Simon Glass   Adjust board_f.c ...
38
  #include <spi.h>
71c52dba2   Simon Glass   Add trace support...
39
  #include <trace.h>
e4fef6cfc   Simon Glass   Adjust board_f.c ...
40
  #include <watchdog.h>
a733b06b6   Simon Glass   sandbox: Switch o...
41
  #include <asm/errno.h>
1938f4a5b   Simon Glass   Introduce generic...
42
  #include <asm/io.h>
e4fef6cfc   Simon Glass   Adjust board_f.c ...
43
44
45
  #ifdef CONFIG_MP
  #include <asm/mp.h>
  #endif
1938f4a5b   Simon Glass   Introduce generic...
46
  #include <asm/sections.h>
48a338067   Simon Glass   x86: Adjust board...
47
48
49
50
  #ifdef CONFIG_X86
  #include <asm/init_helpers.h>
  #include <asm/relocate.h>
  #endif
a733b06b6   Simon Glass   sandbox: Switch o...
51
52
53
  #ifdef CONFIG_SANDBOX
  #include <asm/state.h>
  #endif
1938f4a5b   Simon Glass   Introduce generic...
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
  #include <linux/compiler.h>
  
  /*
   * Pointer to initial global data area
   *
   * Here we initialize it if needed.
   */
  #ifdef XTRN_DECLARE_GLOBAL_DATA_PTR
  #undef	XTRN_DECLARE_GLOBAL_DATA_PTR
  #define XTRN_DECLARE_GLOBAL_DATA_PTR	/* empty = allocate here */
  DECLARE_GLOBAL_DATA_PTR = (gd_t *) (CONFIG_SYS_INIT_GD_ADDR);
  #else
  DECLARE_GLOBAL_DATA_PTR;
  #endif
  
  /*
   * sjg: IMO this code should be
   * refactored to a single function, something like:
   *
   * void led_set_state(enum led_colour_t colour, int on);
   */
  /************************************************************************
   * Coloured LED functionality
   ************************************************************************
   * May be supplied by boards if desired
   */
  inline void __coloured_LED_init(void) {}
  void coloured_LED_init(void)
  	__attribute__((weak, alias("__coloured_LED_init")));
  inline void __red_led_on(void) {}
  void red_led_on(void) __attribute__((weak, alias("__red_led_on")));
  inline void __red_led_off(void) {}
  void red_led_off(void) __attribute__((weak, alias("__red_led_off")));
  inline void __green_led_on(void) {}
  void green_led_on(void) __attribute__((weak, alias("__green_led_on")));
  inline void __green_led_off(void) {}
  void green_led_off(void) __attribute__((weak, alias("__green_led_off")));
  inline void __yellow_led_on(void) {}
  void yellow_led_on(void) __attribute__((weak, alias("__yellow_led_on")));
  inline void __yellow_led_off(void) {}
  void yellow_led_off(void) __attribute__((weak, alias("__yellow_led_off")));
  inline void __blue_led_on(void) {}
  void blue_led_on(void) __attribute__((weak, alias("__blue_led_on")));
  inline void __blue_led_off(void) {}
  void blue_led_off(void) __attribute__((weak, alias("__blue_led_off")));
  
  /*
   * Why is gd allocated a register? Prior to reloc it might be better to
   * just pass it around to each function in this file?
   *
   * After reloc one could argue that it is hardly used and doesn't need
   * to be in a register. Or if it is it should perhaps hold pointers to all
   * global data for all modules, so that post-reloc we can avoid the massive
   * literal pool we get on ARM. Or perhaps just encourage each module to use
   * a structure...
   */
  
  /*
   * Could the CONFIG_SPL_BUILD infection become a flag in gd?
   */
e4fef6cfc   Simon Glass   Adjust board_f.c ...
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
  #if defined(CONFIG_WATCHDOG)
  static int init_func_watchdog_init(void)
  {
  	puts("       Watchdog enabled
  ");
  	WATCHDOG_RESET();
  
  	return 0;
  }
  
  int init_func_watchdog_reset(void)
  {
  	WATCHDOG_RESET();
  
  	return 0;
  }
  #endif /* CONFIG_WATCHDOG */
  
  void __board_add_ram_info(int use_default)
  {
  	/* please define platform specific board_add_ram_info() */
  }
  
  void board_add_ram_info(int)
  	__attribute__ ((weak, alias("__board_add_ram_info")));
1938f4a5b   Simon Glass   Introduce generic...
139
140
141
142
143
144
145
146
  static int init_baud_rate(void)
  {
  	gd->baudrate = getenv_ulong("baudrate", 10, CONFIG_BAUDRATE);
  	return 0;
  }
  
  static int display_text_info(void)
  {
a733b06b6   Simon Glass   sandbox: Switch o...
147
  #ifndef CONFIG_SANDBOX
1938f4a5b   Simon Glass   Introduce generic...
148
  	ulong bss_start, bss_end;
632efa744   Simon Glass   Add CONFIG_SYS_SY...
149
  #ifdef CONFIG_SYS_SYM_OFFSETS
1938f4a5b   Simon Glass   Introduce generic...
150
151
  	bss_start = _bss_start_ofs + _TEXT_BASE;
  	bss_end = _bss_end_ofs + _TEXT_BASE;
632efa744   Simon Glass   Add CONFIG_SYS_SY...
152
153
154
155
  #else
  	bss_start = (ulong)&__bss_start;
  	bss_end = (ulong)&__bss_end;
  #endif
1938f4a5b   Simon Glass   Introduce generic...
156
157
158
  	debug("U-Boot code: %08X -> %08lX  BSS: -> %08lX
  ",
  	      CONFIG_SYS_TEXT_BASE, bss_start, bss_end);
a733b06b6   Simon Glass   sandbox: Switch o...
159
  #endif
1938f4a5b   Simon Glass   Introduce generic...
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
  
  #ifdef CONFIG_MODEM_SUPPORT
  	debug("Modem Support enabled
  ");
  #endif
  #ifdef CONFIG_USE_IRQ
  	debug("IRQ Stack: %08lx
  ", IRQ_STACK_START);
  	debug("FIQ Stack: %08lx
  ", FIQ_STACK_START);
  #endif
  
  	return 0;
  }
  
  static int announce_dram_init(void)
  {
  	puts("DRAM:  ");
  	return 0;
  }
e4fef6cfc   Simon Glass   Adjust board_f.c ...
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
  #ifdef CONFIG_PPC
  static int init_func_ram(void)
  {
  #ifdef	CONFIG_BOARD_TYPES
  	int board_type = gd->board_type;
  #else
  	int board_type = 0;	/* use dummy arg */
  #endif
  
  	gd->ram_size = initdram(board_type);
  
  	if (gd->ram_size > 0)
  		return 0;
  
  	puts("*** failed ***
  ");
  	return 1;
  }
  #endif
1938f4a5b   Simon Glass   Introduce generic...
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
  static int show_dram_config(void)
  {
  	ulong size;
  
  #ifdef CONFIG_NR_DRAM_BANKS
  	int i;
  
  	debug("
  RAM Configuration:
  ");
  	for (i = size = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
  		size += gd->bd->bi_dram[i].size;
  		debug("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
  #ifdef DEBUG
  		print_size(gd->bd->bi_dram[i].size, "
  ");
  #endif
  	}
  	debug("
  DRAM:  ");
  #else
  	size = gd->ram_size;
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
222
223
224
225
  	print_size(size, "");
  	board_add_ram_info(0);
  	putc('
  ');
1938f4a5b   Simon Glass   Introduce generic...
226
227
228
229
230
231
232
233
234
235
236
237
238
239
  
  	return 0;
  }
  
  void __dram_init_banksize(void)
  {
  #if defined(CONFIG_NR_DRAM_BANKS) && defined(CONFIG_SYS_SDRAM_BASE)
  	gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
  	gd->bd->bi_dram[0].size = get_effective_memsize();
  #endif
  }
  
  void dram_init_banksize(void)
  	__attribute__((weak, alias("__dram_init_banksize")));
ea818dbbc   Heiko Schocher   i2c, soft-i2c: sw...
240
  #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
e4fef6cfc   Simon Glass   Adjust board_f.c ...
241
242
243
  static int init_func_i2c(void)
  {
  	puts("I2C:   ");
815a76f2e   trem   i2c: fix init on ...
244
245
246
  #ifdef CONFIG_SYS_I2C
  	i2c_init_all();
  #else
e4fef6cfc   Simon Glass   Adjust board_f.c ...
247
  	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
815a76f2e   trem   i2c: fix init on ...
248
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
  	puts("ready
  ");
  	return 0;
  }
  #endif
  
  #if defined(CONFIG_HARD_SPI)
  static int init_func_spi(void)
  {
  	puts("SPI:   ");
  	spi_init();
  	puts("ready
  ");
  	return 0;
  }
  #endif
  
  __maybe_unused
1938f4a5b   Simon Glass   Introduce generic...
267
268
269
270
271
272
273
274
275
  static int zero_global_data(void)
  {
  	memset((void *)gd, '\0', sizeof(gd_t));
  
  	return 0;
  }
  
  static int setup_mon_len(void)
  {
632efa744   Simon Glass   Add CONFIG_SYS_SY...
276
  #ifdef CONFIG_SYS_SYM_OFFSETS
1938f4a5b   Simon Glass   Introduce generic...
277
  	gd->mon_len = _bss_end_ofs;
a733b06b6   Simon Glass   sandbox: Switch o...
278
279
  #elif defined(CONFIG_SANDBOX)
  	gd->mon_len = (ulong)&_end - (ulong)_init;
632efa744   Simon Glass   Add CONFIG_SYS_SY...
280
  #else
e4fef6cfc   Simon Glass   Adjust board_f.c ...
281
282
  	/* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */
  	gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE;
632efa744   Simon Glass   Add CONFIG_SYS_SY...
283
  #endif
1938f4a5b   Simon Glass   Introduce generic...
284
285
286
287
288
289
290
  	return 0;
  }
  
  __weak int arch_cpu_init(void)
  {
  	return 0;
  }
f828bf25f   Simon Glass   sandbox: Add CONF...
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
  #ifdef CONFIG_OF_HOSTFILE
  
  #define CHECK(x)		err = (x); if (err) goto failed;
  
  /* Create an empty device tree blob */
  static int make_empty_fdt(void *fdt)
  {
  	int err;
  
  	CHECK(fdt_create(fdt, 256));
  	CHECK(fdt_finish_reservemap(fdt));
  	CHECK(fdt_begin_node(fdt, ""));
  	CHECK(fdt_end_node(fdt));
  	CHECK(fdt_finish(fdt));
  
  	return 0;
  failed:
  	printf("Unable to create empty FDT: %s
  ", fdt_strerror(err));
  	return -EACCES;
  }
  
  static int read_fdt_from_file(void)
  {
  	struct sandbox_state *state = state_get_current();
  	void *blob;
  	int size;
  	int err;
  
  	blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0);
  	if (!state->fdt_fname) {
  		err = make_empty_fdt(blob);
  		if (!err)
  			goto done;
  		return err;
  	}
  	err = fs_set_blk_dev("host", NULL, FS_TYPE_SANDBOX);
  	if (err)
  		return err;
  	size = fs_read(state->fdt_fname, CONFIG_SYS_FDT_LOAD_ADDR, 0, 0);
  	if (size < 0)
  		return -EIO;
  
  done:
  	gd->fdt_blob = blob;
  
  	return 0;
  }
  #endif
a733b06b6   Simon Glass   sandbox: Switch o...
340
341
342
  #ifdef CONFIG_SANDBOX
  static int setup_ram_buf(void)
  {
5c2859cdc   Simon Glass   sandbox: Allow re...
343
344
345
346
  	struct sandbox_state *state = state_get_current();
  
  	gd->arch.ram_buf = state->ram_buf;
  	gd->ram_size = state->ram_size;
a733b06b6   Simon Glass   sandbox: Switch o...
347
348
349
350
  
  	return 0;
  }
  #endif
1938f4a5b   Simon Glass   Introduce generic...
351
352
353
354
  static int setup_fdt(void)
  {
  #ifdef CONFIG_OF_EMBED
  	/* Get a pointer to the FDT */
6ab6b2afa   Masahiro Yamada   dts: re-write dts...
355
  	gd->fdt_blob = __dtb_dt_begin;
1938f4a5b   Simon Glass   Introduce generic...
356
357
  #elif defined CONFIG_OF_SEPARATE
  	/* FDT is at end of image */
632efa744   Simon Glass   Add CONFIG_SYS_SY...
358
  # ifdef CONFIG_SYS_SYM_OFFSETS
1938f4a5b   Simon Glass   Introduce generic...
359
  	gd->fdt_blob = (void *)(_end_ofs + CONFIG_SYS_TEXT_BASE);
632efa744   Simon Glass   Add CONFIG_SYS_SY...
360
361
362
  # else
  	gd->fdt_blob = (ulong *)&_end;
  # endif
f828bf25f   Simon Glass   sandbox: Add CONF...
363
364
365
366
367
368
  #elif defined(CONFIG_OF_HOSTFILE)
  	if (read_fdt_from_file()) {
  		puts("Failed to read control FDT
  ");
  		return -1;
  	}
1938f4a5b   Simon Glass   Introduce generic...
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
  #endif
  	/* Allow the early environment to override the fdt address */
  	gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16,
  						(uintptr_t)gd->fdt_blob);
  	return 0;
  }
  
  /* Get the top of usable RAM */
  __weak ulong board_get_usable_ram_top(ulong total_size)
  {
  	return gd->ram_top;
  }
  
  static int setup_dest_addr(void)
  {
  	debug("Monitor len: %08lX
  ", gd->mon_len);
  	/*
  	 * Ram is setup, size stored in gd !!
  	 */
  	debug("Ram size: %08lX
  ", (ulong)gd->ram_size);
  #if defined(CONFIG_SYS_MEM_TOP_HIDE)
  	/*
  	 * Subtract specified amount of memory to hide so that it won't
  	 * get "touched" at all by U-Boot. By fixing up gd->ram_size
  	 * the Linux kernel should now get passed the now "corrected"
  	 * memory size and won't touch it either. This should work
  	 * for arch/ppc and arch/powerpc. Only Linux board ports in
  	 * arch/powerpc with bootwrapper support, that recalculate the
  	 * memory size from the SDRAM controller setup will have to
  	 * get fixed.
  	 */
  	gd->ram_size -= CONFIG_SYS_MEM_TOP_HIDE;
  #endif
  #ifdef CONFIG_SYS_SDRAM_BASE
  	gd->ram_top = CONFIG_SYS_SDRAM_BASE;
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
407
  	gd->ram_top += get_effective_memsize();
1938f4a5b   Simon Glass   Introduce generic...
408
  	gd->ram_top = board_get_usable_ram_top(gd->mon_len);
a0ba279ac   Masahiro Yamada   generic_board: re...
409
  	gd->relocaddr = gd->ram_top;
1938f4a5b   Simon Glass   Introduce generic...
410
411
  	debug("Ram top: %08lX
  ", (ulong)gd->ram_top);
e4fef6cfc   Simon Glass   Adjust board_f.c ...
412
413
414
415
416
  #if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
  	/*
  	 * We need to make sure the location we intend to put secondary core
  	 * boot code is reserved and not used by any part of u-boot
  	 */
a0ba279ac   Masahiro Yamada   generic_board: re...
417
418
419
420
  	if (gd->relocaddr > determine_mp_bootpg(NULL)) {
  		gd->relocaddr = determine_mp_bootpg(NULL);
  		debug("Reserving MP boot page to %08lx
  ", gd->relocaddr);
e4fef6cfc   Simon Glass   Adjust board_f.c ...
421
422
  	}
  #endif
1938f4a5b   Simon Glass   Introduce generic...
423
424
425
426
427
428
429
  	return 0;
  }
  
  #if defined(CONFIG_LOGBUFFER) && !defined(CONFIG_ALT_LB_ADDR)
  static int reserve_logbuffer(void)
  {
  	/* reserve kernel log buffer */
a0ba279ac   Masahiro Yamada   generic_board: re...
430
  	gd->relocaddr -= LOGBUFF_RESERVE;
1938f4a5b   Simon Glass   Introduce generic...
431
432
  	debug("Reserving %dk for kernel logbuffer at %08lx
  ", LOGBUFF_LEN,
a0ba279ac   Masahiro Yamada   generic_board: re...
433
  		gd->relocaddr);
1938f4a5b   Simon Glass   Introduce generic...
434
435
436
437
438
439
440
441
442
443
444
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_PRAM
  /* reserve protected RAM */
  static int reserve_pram(void)
  {
  	ulong reg;
  
  	reg = getenv_ulong("pram", 10, CONFIG_PRAM);
a0ba279ac   Masahiro Yamada   generic_board: re...
445
  	gd->relocaddr -= (reg << 10);		/* size is in kB */
1938f4a5b   Simon Glass   Introduce generic...
446
447
  	debug("Reserving %ldk for protected RAM at %08lx
  ", reg,
a0ba279ac   Masahiro Yamada   generic_board: re...
448
  	      gd->relocaddr);
1938f4a5b   Simon Glass   Introduce generic...
449
450
451
452
453
454
455
  	return 0;
  }
  #endif /* CONFIG_PRAM */
  
  /* Round memory pointer down to next 4 kB limit */
  static int reserve_round_4k(void)
  {
a0ba279ac   Masahiro Yamada   generic_board: re...
456
  	gd->relocaddr &= ~(4096 - 1);
1938f4a5b   Simon Glass   Introduce generic...
457
458
459
460
461
462
463
464
  	return 0;
  }
  
  #if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF)) && \
  		defined(CONFIG_ARM)
  static int reserve_mmu(void)
  {
  	/* reserve TLB table */
cce6be7f0   David Feng   arm64: generic bo...
465
  	gd->arch.tlb_size = PGTABLE_SIZE;
a0ba279ac   Masahiro Yamada   generic_board: re...
466
  	gd->relocaddr -= gd->arch.tlb_size;
1938f4a5b   Simon Glass   Introduce generic...
467
468
  
  	/* round down to next 64 kB limit */
a0ba279ac   Masahiro Yamada   generic_board: re...
469
  	gd->relocaddr &= ~(0x10000 - 1);
1938f4a5b   Simon Glass   Introduce generic...
470

a0ba279ac   Masahiro Yamada   generic_board: re...
471
  	gd->arch.tlb_addr = gd->relocaddr;
1938f4a5b   Simon Glass   Introduce generic...
472
473
474
475
476
477
478
479
480
481
482
483
484
485
  	debug("TLB table from %08lx to %08lx
  ", gd->arch.tlb_addr,
  	      gd->arch.tlb_addr + gd->arch.tlb_size);
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_LCD
  static int reserve_lcd(void)
  {
  #ifdef CONFIG_FB_ADDR
  	gd->fb_base = CONFIG_FB_ADDR;
  #else
  	/* reserve memory for LCD display (always full pages) */
a0ba279ac   Masahiro Yamada   generic_board: re...
486
487
  	gd->relocaddr = lcd_setmem(gd->relocaddr);
  	gd->fb_base = gd->relocaddr;
1938f4a5b   Simon Glass   Introduce generic...
488
489
490
491
  #endif /* CONFIG_FB_ADDR */
  	return 0;
  }
  #endif /* CONFIG_LCD */
71c52dba2   Simon Glass   Add trace support...
492
493
494
495
496
497
498
499
500
501
502
503
  static int reserve_trace(void)
  {
  #ifdef CONFIG_TRACE
  	gd->relocaddr -= CONFIG_TRACE_BUFFER_SIZE;
  	gd->trace_buff = map_sysmem(gd->relocaddr, CONFIG_TRACE_BUFFER_SIZE);
  	debug("Reserving %dk for trace data at: %08lx
  ",
  	      CONFIG_TRACE_BUFFER_SIZE >> 10, gd->relocaddr);
  #endif
  
  	return 0;
  }
e4fef6cfc   Simon Glass   Adjust board_f.c ...
504
  #if defined(CONFIG_VIDEO) && (!defined(CONFIG_PPC) || defined(CONFIG_8xx)) \
48a338067   Simon Glass   x86: Adjust board...
505
  		&& !defined(CONFIG_ARM) && !defined(CONFIG_X86)
e4fef6cfc   Simon Glass   Adjust board_f.c ...
506
507
508
  static int reserve_video(void)
  {
  	/* reserve memory for video display (always full pages) */
a0ba279ac   Masahiro Yamada   generic_board: re...
509
510
  	gd->relocaddr = video_setmem(gd->relocaddr);
  	gd->fb_base = gd->relocaddr;
e4fef6cfc   Simon Glass   Adjust board_f.c ...
511
512
513
514
  
  	return 0;
  }
  #endif
1938f4a5b   Simon Glass   Introduce generic...
515
516
517
518
519
520
  static int reserve_uboot(void)
  {
  	/*
  	 * reserve memory for U-Boot code, data & bss
  	 * round down to next 4 kB limit
  	 */
a0ba279ac   Masahiro Yamada   generic_board: re...
521
522
  	gd->relocaddr -= gd->mon_len;
  	gd->relocaddr &= ~(4096 - 1);
e4fef6cfc   Simon Glass   Adjust board_f.c ...
523
524
  #ifdef CONFIG_E500
  	/* round down to next 64 kB limit so that IVPR stays aligned */
a0ba279ac   Masahiro Yamada   generic_board: re...
525
  	gd->relocaddr &= ~(65536 - 1);
e4fef6cfc   Simon Glass   Adjust board_f.c ...
526
  #endif
1938f4a5b   Simon Glass   Introduce generic...
527
528
529
  
  	debug("Reserving %ldk for U-Boot at: %08lx
  ", gd->mon_len >> 10,
a0ba279ac   Masahiro Yamada   generic_board: re...
530
531
532
  	      gd->relocaddr);
  
  	gd->start_addr_sp = gd->relocaddr;
1938f4a5b   Simon Glass   Introduce generic...
533
534
  	return 0;
  }
8cae8a68e   Simon Glass   Add spl load feature
535
  #ifndef CONFIG_SPL_BUILD
1938f4a5b   Simon Glass   Introduce generic...
536
537
538
  /* reserve memory for malloc() area */
  static int reserve_malloc(void)
  {
a0ba279ac   Masahiro Yamada   generic_board: re...
539
  	gd->start_addr_sp = gd->start_addr_sp - TOTAL_MALLOC_LEN;
1938f4a5b   Simon Glass   Introduce generic...
540
541
  	debug("Reserving %dk for malloc() at: %08lx
  ",
a0ba279ac   Masahiro Yamada   generic_board: re...
542
  			TOTAL_MALLOC_LEN >> 10, gd->start_addr_sp);
1938f4a5b   Simon Glass   Introduce generic...
543
544
545
546
547
548
  	return 0;
  }
  
  /* (permanently) allocate a Board Info struct */
  static int reserve_board(void)
  {
a0ba279ac   Masahiro Yamada   generic_board: re...
549
550
  	gd->start_addr_sp -= sizeof(bd_t);
  	gd->bd = (bd_t *)map_sysmem(gd->start_addr_sp, sizeof(bd_t));
1938f4a5b   Simon Glass   Introduce generic...
551
552
553
  	memset(gd->bd, '\0', sizeof(bd_t));
  	debug("Reserving %zu Bytes for Board Info at: %08lx
  ",
a0ba279ac   Masahiro Yamada   generic_board: re...
554
  			sizeof(bd_t), gd->start_addr_sp);
1938f4a5b   Simon Glass   Introduce generic...
555
556
  	return 0;
  }
8cae8a68e   Simon Glass   Add spl load feature
557
  #endif
1938f4a5b   Simon Glass   Introduce generic...
558
559
560
561
562
563
564
565
566
567
568
  
  static int setup_machine(void)
  {
  #ifdef CONFIG_MACH_TYPE
  	gd->bd->bi_arch_number = CONFIG_MACH_TYPE; /* board id for Linux */
  #endif
  	return 0;
  }
  
  static int reserve_global_data(void)
  {
a0ba279ac   Masahiro Yamada   generic_board: re...
569
570
  	gd->start_addr_sp -= sizeof(gd_t);
  	gd->new_gd = (gd_t *)map_sysmem(gd->start_addr_sp, sizeof(gd_t));
1938f4a5b   Simon Glass   Introduce generic...
571
572
  	debug("Reserving %zu Bytes for Global Data at: %08lx
  ",
a0ba279ac   Masahiro Yamada   generic_board: re...
573
  			sizeof(gd_t), gd->start_addr_sp);
1938f4a5b   Simon Glass   Introduce generic...
574
575
576
577
578
579
580
581
582
583
584
585
  	return 0;
  }
  
  static int reserve_fdt(void)
  {
  	/*
  	 * If the device tree is sitting immediate above our image then we
  	 * must relocate it. If it is embedded in the data section, then it
  	 * will be relocated with other data.
  	 */
  	if (gd->fdt_blob) {
  		gd->fdt_size = ALIGN(fdt_totalsize(gd->fdt_blob) + 0x1000, 32);
a0ba279ac   Masahiro Yamada   generic_board: re...
586
587
  		gd->start_addr_sp -= gd->fdt_size;
  		gd->new_fdt = map_sysmem(gd->start_addr_sp, gd->fdt_size);
a733b06b6   Simon Glass   sandbox: Switch o...
588
589
  		debug("Reserving %lu Bytes for FDT at: %08lx
  ",
a0ba279ac   Masahiro Yamada   generic_board: re...
590
  		      gd->fdt_size, gd->start_addr_sp);
1938f4a5b   Simon Glass   Introduce generic...
591
592
593
594
595
596
597
  	}
  
  	return 0;
  }
  
  static int reserve_stacks(void)
  {
8cae8a68e   Simon Glass   Add spl load feature
598
599
  #ifdef CONFIG_SPL_BUILD
  # ifdef CONFIG_ARM
a0ba279ac   Masahiro Yamada   generic_board: re...
600
601
  	gd->start_addr_sp -= 128;	/* leave 32 words for abort-stack */
  	gd->irq_sp = gd->start_addr_sp;
8cae8a68e   Simon Glass   Add spl load feature
602
603
  # endif
  #else
e4fef6cfc   Simon Glass   Adjust board_f.c ...
604
605
606
  # ifdef CONFIG_PPC
  	ulong *s;
  # endif
8cae8a68e   Simon Glass   Add spl load feature
607

1938f4a5b   Simon Glass   Introduce generic...
608
  	/* setup stack pointer for exceptions */
a0ba279ac   Masahiro Yamada   generic_board: re...
609
610
611
  	gd->start_addr_sp -= 16;
  	gd->start_addr_sp &= ~0xf;
  	gd->irq_sp = gd->start_addr_sp;
1938f4a5b   Simon Glass   Introduce generic...
612
613
614
615
616
617
  
  	/*
  	 * Handle architecture-specific things here
  	 * TODO(sjg@chromium.org): Perhaps create arch_reserve_stack()
  	 * to handle this and put in arch/xxx/lib/stack.c
  	 */
cce6be7f0   David Feng   arm64: generic bo...
618
  # if defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
1938f4a5b   Simon Glass   Introduce generic...
619
  #  ifdef CONFIG_USE_IRQ
a0ba279ac   Masahiro Yamada   generic_board: re...
620
  	gd->start_addr_sp -= (CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ);
1938f4a5b   Simon Glass   Introduce generic...
621
622
  	debug("Reserving %zu Bytes for IRQ stack at: %08lx
  ",
a0ba279ac   Masahiro Yamada   generic_board: re...
623
  		CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ, gd->start_addr_sp);
1938f4a5b   Simon Glass   Introduce generic...
624
625
  
  	/* 8-byte alignment for ARM ABI compliance */
a0ba279ac   Masahiro Yamada   generic_board: re...
626
  	gd->start_addr_sp &= ~0x07;
1938f4a5b   Simon Glass   Introduce generic...
627
628
  #  endif
  	/* leave 3 words for abort-stack, plus 1 for alignment */
a0ba279ac   Masahiro Yamada   generic_board: re...
629
  	gd->start_addr_sp -= 16;
e4fef6cfc   Simon Glass   Adjust board_f.c ...
630
631
  # elif defined(CONFIG_PPC)
  	/* Clear initial stack frame */
a0ba279ac   Masahiro Yamada   generic_board: re...
632
  	s = (ulong *) gd->start_addr_sp;
e4fef6cfc   Simon Glass   Adjust board_f.c ...
633
634
  	*s = 0; /* Terminate back chain */
  	*++s = 0; /* NULL return address */
8cae8a68e   Simon Glass   Add spl load feature
635
  # endif /* Architecture specific code */
1938f4a5b   Simon Glass   Introduce generic...
636
637
  
  	return 0;
8cae8a68e   Simon Glass   Add spl load feature
638
  #endif
1938f4a5b   Simon Glass   Introduce generic...
639
640
641
642
  }
  
  static int display_new_sp(void)
  {
a0ba279ac   Masahiro Yamada   generic_board: re...
643
644
  	debug("New Stack Pointer is: %08lx
  ", gd->start_addr_sp);
1938f4a5b   Simon Glass   Introduce generic...
645
646
647
  
  	return 0;
  }
e4fef6cfc   Simon Glass   Adjust board_f.c ...
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
  #ifdef CONFIG_PPC
  static int setup_board_part1(void)
  {
  	bd_t *bd = gd->bd;
  
  	/*
  	 * Save local variables to board info struct
  	 */
  
  	bd->bi_memstart = CONFIG_SYS_SDRAM_BASE;	/* start of memory */
  	bd->bi_memsize = gd->ram_size;			/* size in bytes */
  
  #ifdef CONFIG_SYS_SRAM_BASE
  	bd->bi_sramstart = CONFIG_SYS_SRAM_BASE;	/* start of SRAM */
  	bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE;		/* size  of SRAM */
  #endif
  
  #if defined(CONFIG_8xx) || defined(CONFIG_8260) || defined(CONFIG_5xx) || \
  		defined(CONFIG_E500) || defined(CONFIG_MPC86xx)
  	bd->bi_immr_base = CONFIG_SYS_IMMR;	/* base  of IMMR register     */
  #endif
  #if defined(CONFIG_MPC5xxx)
  	bd->bi_mbar_base = CONFIG_SYS_MBAR;	/* base of internal registers */
  #endif
  #if defined(CONFIG_MPC83xx)
  	bd->bi_immrbar = CONFIG_SYS_IMMR;
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
  
  	return 0;
  }
  
  static int setup_board_part2(void)
  {
  	bd_t *bd = gd->bd;
  
  	bd->bi_intfreq = gd->cpu_clk;	/* Internal Freq, in Hz */
  	bd->bi_busfreq = gd->bus_clk;	/* Bus Freq,      in Hz */
  #if defined(CONFIG_CPM2)
  	bd->bi_cpmfreq = gd->arch.cpm_clk;
  	bd->bi_brgfreq = gd->arch.brg_clk;
  	bd->bi_sccfreq = gd->arch.scc_clk;
  	bd->bi_vco = gd->arch.vco_out;
  #endif /* CONFIG_CPM2 */
  #if defined(CONFIG_MPC512X)
  	bd->bi_ipsfreq = gd->arch.ips_clk;
  #endif /* CONFIG_MPC512X */
  #if defined(CONFIG_MPC5xxx)
  	bd->bi_ipbfreq = gd->arch.ipb_clk;
  	bd->bi_pcifreq = gd->pci_clk;
  #endif /* CONFIG_MPC5xxx */
  
  	return 0;
  }
  #endif
  
  #ifdef CONFIG_SYS_EXTBDINFO
  static int setup_board_extra(void)
  {
  	bd_t *bd = gd->bd;
  
  	strncpy((char *) bd->bi_s_version, "1.2", sizeof(bd->bi_s_version));
  	strncpy((char *) bd->bi_r_version, U_BOOT_VERSION,
  		sizeof(bd->bi_r_version));
  
  	bd->bi_procfreq = gd->cpu_clk;	/* Processor Speed, In Hz */
  	bd->bi_plb_busfreq = gd->bus_clk;
  #if defined(CONFIG_405GP) || defined(CONFIG_405EP) || \
  		defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
  		defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
  	bd->bi_pci_busfreq = get_PCI_freq();
  	bd->bi_opbfreq = get_OPB_freq();
  #elif defined(CONFIG_XILINX_405)
  	bd->bi_pci_busfreq = get_PCI_freq();
  #endif
  
  	return 0;
  }
  #endif
1938f4a5b   Simon Glass   Introduce generic...
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
  #ifdef CONFIG_POST
  static int init_post(void)
  {
  	post_bootmode_init();
  	post_run(NULL, POST_ROM | post_bootmode_get(0));
  
  	return 0;
  }
  #endif
  
  static int setup_baud_rate(void)
  {
  	/* Ick, can we get rid of this line? */
  	gd->bd->bi_baudrate = gd->baudrate;
  
  	return 0;
  }
  
  static int setup_dram_config(void)
  {
  	/* Ram is board specific, so move it to board code ... */
  	dram_init_banksize();
  
  	return 0;
  }
  
  static int reloc_fdt(void)
  {
  	if (gd->new_fdt) {
  		memcpy(gd->new_fdt, gd->fdt_blob, gd->fdt_size);
  		gd->fdt_blob = gd->new_fdt;
  	}
  
  	return 0;
  }
  
  static int setup_reloc(void)
  {
a0ba279ac   Masahiro Yamada   generic_board: re...
764
  	gd->reloc_off = gd->relocaddr - CONFIG_SYS_TEXT_BASE;
1938f4a5b   Simon Glass   Introduce generic...
765
766
767
768
  	memcpy(gd->new_gd, (char *)gd, sizeof(gd_t));
  
  	debug("Relocation Offset is: %08lx
  ", gd->reloc_off);
a733b06b6   Simon Glass   sandbox: Switch o...
769
770
  	debug("Relocating to %08lx, new gd at %08lx, sp at %08lx
  ",
a0ba279ac   Masahiro Yamada   generic_board: re...
771
772
  	      gd->relocaddr, (ulong)map_to_sysmem(gd->new_gd),
  	      gd->start_addr_sp);
1938f4a5b   Simon Glass   Introduce generic...
773
774
775
776
777
  
  	return 0;
  }
  
  /* ARM calls relocate_code from its crt0.S */
808434cdb   Simon Glass   sandbox: Allow re...
778
  #if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)
1938f4a5b   Simon Glass   Introduce generic...
779
780
781
  
  static int jump_to_copy(void)
  {
48a338067   Simon Glass   x86: Adjust board...
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
  	/*
  	 * x86 is special, but in a nice way. It uses a trampoline which
  	 * enables the dcache if possible.
  	 *
  	 * For now, other archs use relocate_code(), which is implemented
  	 * similarly for all archs. When we do generic relocation, hopefully
  	 * we can make all archs enable the dcache prior to relocation.
  	 */
  #ifdef CONFIG_X86
  	/*
  	 * SDRAM and console are now initialised. The final stack can now
  	 * be setup in SDRAM. Code execution will continue in Flash, but
  	 * with the stack in SDRAM and Global Data in temporary memory
  	 * (CPU cache)
  	 */
  	board_init_f_r_trampoline(gd->start_addr_sp);
  #else
a0ba279ac   Masahiro Yamada   generic_board: re...
799
  	relocate_code(gd->start_addr_sp, gd->new_gd, gd->relocaddr);
48a338067   Simon Glass   x86: Adjust board...
800
  #endif
1938f4a5b   Simon Glass   Introduce generic...
801
802
803
804
805
806
807
808
809
810
811
812
813
814
  
  	return 0;
  }
  #endif
  
  /* Record the board_init_f() bootstage (after arch_cpu_init()) */
  static int mark_bootstage(void)
  {
  	bootstage_mark_name(BOOTSTAGE_ID_START_UBOOT_F, "board_init_f");
  
  	return 0;
  }
  
  static init_fnc_t init_sequence_f[] = {
a733b06b6   Simon Glass   sandbox: Switch o...
815
816
817
  #ifdef CONFIG_SANDBOX
  	setup_ram_buf,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
818
  	setup_mon_len,
71c52dba2   Simon Glass   Add trace support...
819
820
  	setup_fdt,
  	trace_early_init,
e4fef6cfc   Simon Glass   Adjust board_f.c ...
821
822
823
824
  #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
  	/* TODO: can this go into arch_cpu_init()? */
  	probecpu,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
825
  	arch_cpu_init,		/* basic arch cpu dependent setup */
48a338067   Simon Glass   x86: Adjust board...
826
827
828
829
830
831
  #ifdef CONFIG_X86
  	cpu_init_f,		/* TODO(sjg@chromium.org): remove */
  # ifdef CONFIG_OF_CONTROL
  	find_fdt,		/* TODO(sjg@chromium.org): remove */
  # endif
  #endif
1938f4a5b   Simon Glass   Introduce generic...
832
833
834
835
836
837
838
  	mark_bootstage,
  #ifdef CONFIG_OF_CONTROL
  	fdtdec_check_fdt,
  #endif
  #if defined(CONFIG_BOARD_EARLY_INIT_F)
  	board_early_init_f,
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
839
840
841
842
843
844
845
846
847
848
  	/* TODO: can any of this go into arch_cpu_init()? */
  #if defined(CONFIG_PPC) && !defined(CONFIG_8xx_CPUCLK_DEFAULT)
  	get_clocks,		/* get CPU and bus clocks (etc.) */
  #if defined(CONFIG_TQM8xxL) && !defined(CONFIG_TQM866M) \
  		&& !defined(CONFIG_TQM885D)
  	adjust_sdram_tbs_8xx,
  #endif
  	/* TODO: can we rename this to timer_init()? */
  	init_timebase,
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
849
  #ifdef CONFIG_ARM
1938f4a5b   Simon Glass   Introduce generic...
850
  	timer_init,		/* initialize timer */
e4fef6cfc   Simon Glass   Adjust board_f.c ...
851
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
852
853
854
855
856
857
858
859
  #ifdef CONFIG_SYS_ALLOC_DPRAM
  #if !defined(CONFIG_CPM2)
  	dpram_init,
  #endif
  #endif
  #if defined(CONFIG_BOARD_POSTCLK_INIT)
  	board_postclk_init,
  #endif
b8521b740   Masahiro Yamada   common: board_f: ...
860
861
862
  #ifdef CONFIG_FSL_ESDHC
  	get_clocks,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
863
  	env_init,		/* initialize environment */
e4fef6cfc   Simon Glass   Adjust board_f.c ...
864
865
866
867
868
869
870
  #if defined(CONFIG_8xx_CPUCLK_DEFAULT)
  	/* get CPU and bus clocks according to the environment variable */
  	get_clocks_866,
  	/* adjust sdram refresh rate according to the new clock */
  	sdram_adjust_866,
  	init_timebase,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
871
872
873
  	init_baud_rate,		/* initialze baudrate settings */
  	serial_init,		/* serial communications setup */
  	console_init_f,		/* stage 1 init of console */
a733b06b6   Simon Glass   sandbox: Switch o...
874
875
876
877
878
  #ifdef CONFIG_SANDBOX
  	sandbox_early_getopt_check,
  #endif
  #ifdef CONFIG_OF_CONTROL
  	fdtdec_prepare_fdt,
48a338067   Simon Glass   x86: Adjust board...
879
  #endif
1938f4a5b   Simon Glass   Introduce generic...
880
881
  	display_options,	/* say that we are here */
  	display_text_info,	/* show debugging info if required */
e4fef6cfc   Simon Glass   Adjust board_f.c ...
882
883
884
885
886
887
888
889
890
891
  #if defined(CONFIG_8260)
  	prt_8260_rsr,
  	prt_8260_clks,
  #endif /* CONFIG_8260 */
  #if defined(CONFIG_MPC83xx)
  	prt_83xx_rsr,
  #endif
  #ifdef CONFIG_PPC
  	checkcpu,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
892
  	print_cpuinfo,		/* display cpu info (and speed) */
e4fef6cfc   Simon Glass   Adjust board_f.c ...
893
894
895
  #if defined(CONFIG_MPC5xxx)
  	prt_mpc5xxx_clks,
  #endif /* CONFIG_MPC5xxx */
1938f4a5b   Simon Glass   Introduce generic...
896
897
898
  #if defined(CONFIG_DISPLAY_BOARDINFO)
  	checkboard,		/* display board info */
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
899
900
901
902
903
  	INIT_FUNC_WATCHDOG_INIT
  #if defined(CONFIG_MISC_INIT_F)
  	misc_init_f,
  #endif
  	INIT_FUNC_WATCHDOG_RESET
ea818dbbc   Heiko Schocher   i2c, soft-i2c: sw...
904
  #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
e4fef6cfc   Simon Glass   Adjust board_f.c ...
905
906
907
908
909
910
911
  	init_func_i2c,
  #endif
  #if defined(CONFIG_HARD_SPI)
  	init_func_spi,
  #endif
  #ifdef CONFIG_X86
  	dram_init_f,		/* configure available RAM banks */
8b42dfc3b   Simon Glass   x86: Fix DRAM ban...
912
  	calculate_relocation_address,
e4fef6cfc   Simon Glass   Adjust board_f.c ...
913
  #endif
1938f4a5b   Simon Glass   Introduce generic...
914
915
916
917
918
  	announce_dram_init,
  	/* TODO: unify all these dram functions? */
  #ifdef CONFIG_ARM
  	dram_init,		/* configure available RAM banks */
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
919
920
921
922
923
924
925
926
927
928
929
  #ifdef CONFIG_PPC
  	init_func_ram,
  #endif
  #ifdef CONFIG_POST
  	post_init_f,
  #endif
  	INIT_FUNC_WATCHDOG_RESET
  #if defined(CONFIG_SYS_DRAM_TEST)
  	testdram,
  #endif /* CONFIG_SYS_DRAM_TEST */
  	INIT_FUNC_WATCHDOG_RESET
1938f4a5b   Simon Glass   Introduce generic...
930
931
932
  #ifdef CONFIG_POST
  	init_post,
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
933
  	INIT_FUNC_WATCHDOG_RESET
1938f4a5b   Simon Glass   Introduce generic...
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
  	/*
  	 * Now that we have DRAM mapped and working, we can
  	 * relocate the code and continue running from DRAM.
  	 *
  	 * Reserve memory at end of RAM for (top down in that order):
  	 *  - area that won't get touched by U-Boot and Linux (optional)
  	 *  - kernel log buffer
  	 *  - protected RAM
  	 *  - LCD framebuffer
  	 *  - monitor code
  	 *  - board info struct
  	 */
  	setup_dest_addr,
  #if defined(CONFIG_LOGBUFFER) && !defined(CONFIG_ALT_LB_ADDR)
  	reserve_logbuffer,
  #endif
  #ifdef CONFIG_PRAM
  	reserve_pram,
  #endif
  	reserve_round_4k,
  #if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF)) && \
  		defined(CONFIG_ARM)
  	reserve_mmu,
  #endif
  #ifdef CONFIG_LCD
  	reserve_lcd,
  #endif
71c52dba2   Simon Glass   Add trace support...
961
  	reserve_trace,
e4fef6cfc   Simon Glass   Adjust board_f.c ...
962
963
  	/* TODO: Why the dependency on CONFIG_8xx? */
  #if defined(CONFIG_VIDEO) && (!defined(CONFIG_PPC) || defined(CONFIG_8xx)) \
48a338067   Simon Glass   x86: Adjust board...
964
  		&& !defined(CONFIG_ARM) && !defined(CONFIG_X86)
e4fef6cfc   Simon Glass   Adjust board_f.c ...
965
966
  	reserve_video,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
967
  	reserve_uboot,
8cae8a68e   Simon Glass   Add spl load feature
968
  #ifndef CONFIG_SPL_BUILD
1938f4a5b   Simon Glass   Introduce generic...
969
970
  	reserve_malloc,
  	reserve_board,
8cae8a68e   Simon Glass   Add spl load feature
971
  #endif
1938f4a5b   Simon Glass   Introduce generic...
972
973
974
975
976
977
  	setup_machine,
  	reserve_global_data,
  	reserve_fdt,
  	reserve_stacks,
  	setup_dram_config,
  	show_dram_config,
e4fef6cfc   Simon Glass   Adjust board_f.c ...
978
979
980
981
982
  #ifdef CONFIG_PPC
  	setup_board_part1,
  	INIT_FUNC_WATCHDOG_RESET
  	setup_board_part2,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
983
984
  	setup_baud_rate,
  	display_new_sp,
e4fef6cfc   Simon Glass   Adjust board_f.c ...
985
986
987
988
  #ifdef CONFIG_SYS_EXTBDINFO
  	setup_board_extra,
  #endif
  	INIT_FUNC_WATCHDOG_RESET
1938f4a5b   Simon Glass   Introduce generic...
989
990
  	reloc_fdt,
  	setup_reloc,
808434cdb   Simon Glass   sandbox: Allow re...
991
  #if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)
1938f4a5b   Simon Glass   Introduce generic...
992
993
994
995
996
997
998
  	jump_to_copy,
  #endif
  	NULL,
  };
  
  void board_init_f(ulong boot_flags)
  {
48a338067   Simon Glass   x86: Adjust board...
999
  #ifndef CONFIG_X86
1938f4a5b   Simon Glass   Introduce generic...
1000
1001
1002
  	gd_t data;
  
  	gd = &data;
48a338067   Simon Glass   x86: Adjust board...
1003
  #endif
1938f4a5b   Simon Glass   Introduce generic...
1004

cce6be7f0   David Feng   arm64: generic bo...
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
  	/*
  	 * Clear global data before it is accessed at debug print
  	 * in initcall_run_list. Otherwise the debug print probably
  	 * get the wrong vaule of gd->have_console.
  	 */
  #if !defined(CONFIG_CPM2) && !defined(CONFIG_MPC512X) && \
  		!defined(CONFIG_MPC83xx) && !defined(CONFIG_MPC85xx) && \
  		!defined(CONFIG_MPC86xx) && !defined(CONFIG_X86)
  	zero_global_data();
  #endif
1938f4a5b   Simon Glass   Introduce generic...
1015
  	gd->flags = boot_flags;
9aed5a277   Alexey Brodkin   board_f: explicit...
1016
  	gd->have_console = 0;
1938f4a5b   Simon Glass   Introduce generic...
1017
1018
1019
  
  	if (initcall_run_list(init_sequence_f))
  		hang();
808434cdb   Simon Glass   sandbox: Allow re...
1020
  #if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)
1938f4a5b   Simon Glass   Introduce generic...
1021
1022
1023
1024
  	/* NOTREACHED - jump_to_copy() does not return */
  	hang();
  #endif
  }
48a338067   Simon Glass   x86: Adjust board...
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
  #ifdef CONFIG_X86
  /*
   * For now this code is only used on x86.
   *
   * init_sequence_f_r is the list of init functions which are run when
   * U-Boot is executing from Flash with a semi-limited 'C' environment.
   * The following limitations must be considered when implementing an
   * '_f_r' function:
   *  - 'static' variables are read-only
   *  - Global Data (gd->xxx) is read/write
   *
   * The '_f_r' sequence must, as a minimum, copy U-Boot to RAM (if
   * supported).  It _should_, if possible, copy global data to RAM and
   * initialise the CPU caches (to speed up the relocation process)
   *
   * NOTE: At present only x86 uses this route, but it is intended that
   * all archs will move to this when generic relocation is implemented.
   */
  static init_fnc_t init_sequence_f_r[] = {
  	init_cache_f_r,
  	copy_uboot_to_ram,
  	clear_bss,
  	do_elf_reloc_fixups,
  
  	NULL,
  };
  
  void board_init_f_r(void)
  {
  	if (initcall_run_list(init_sequence_f_r))
  		hang();
  
  	/*
  	 * U-Boot has been copied into SDRAM, the BSS has been cleared etc.
  	 * Transfer execution from Flash to RAM by calculating the address
  	 * of the in-RAM copy of board_init_r() and calling it
  	 */
  	(board_init_r + gd->reloc_off)(gd, gd->relocaddr);
  
  	/* NOTREACHED - board_init_r() does not return */
  	hang();
  }
  #endif /* CONFIG_X86 */