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
   */
  
  #include <common.h>
  #include <linux/compiler.h>
  #include <version.h>
  #include <environment.h>
ab7cd6279   Simon Glass   dm: Support drive...
17
  #include <dm.h>
1938f4a5b   Simon Glass   Introduce generic...
18
  #include <fdtdec.h>
f828bf25f   Simon Glass   sandbox: Add CONF...
19
  #include <fs.h>
e4fef6cfc   Simon Glass   Adjust board_f.c ...
20
21
22
23
  #if defined(CONFIG_CMD_IDE)
  #include <ide.h>
  #endif
  #include <i2c.h>
1938f4a5b   Simon Glass   Introduce generic...
24
25
  #include <initcall.h>
  #include <logbuff.h>
e4fef6cfc   Simon Glass   Adjust board_f.c ...
26
27
28
29
30
31
32
33
34
35
36
  
  /* 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
ec3b48201   Gabriel Huau   common: fix inclu...
37
  #if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
a76df7090   Gabriel Huau   mx6: add support ...
38
39
  #include <asm/mp.h>
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
40

a733b06b6   Simon Glass   sandbox: Switch o...
41
  #include <os.h>
1938f4a5b   Simon Glass   Introduce generic...
42
  #include <post.h>
e4fef6cfc   Simon Glass   Adjust board_f.c ...
43
  #include <spi.h>
c5d4001a1   Jeroen Hofstee   common: board_f: ...
44
  #include <status_led.h>
71c52dba2   Simon Glass   Add trace support...
45
  #include <trace.h>
e4fef6cfc   Simon Glass   Adjust board_f.c ...
46
  #include <watchdog.h>
a733b06b6   Simon Glass   sandbox: Switch o...
47
  #include <asm/errno.h>
1938f4a5b   Simon Glass   Introduce generic...
48
49
  #include <asm/io.h>
  #include <asm/sections.h>
48a338067   Simon Glass   x86: Adjust board...
50
51
52
53
  #ifdef CONFIG_X86
  #include <asm/init_helpers.h>
  #include <asm/relocate.h>
  #endif
a733b06b6   Simon Glass   sandbox: Switch o...
54
55
56
  #ifdef CONFIG_SANDBOX
  #include <asm/state.h>
  #endif
ab7cd6279   Simon Glass   dm: Support drive...
57
  #include <dm/root.h>
1938f4a5b   Simon Glass   Introduce generic...
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
  #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
   */
c5d4001a1   Jeroen Hofstee   common: board_f: ...
84
85
86
87
88
89
90
91
92
  __weak void coloured_LED_init(void) {}
  __weak void red_led_on(void) {}
  __weak void red_led_off(void) {}
  __weak void green_led_on(void) {}
  __weak void green_led_off(void) {}
  __weak void yellow_led_on(void) {}
  __weak void yellow_led_off(void) {}
  __weak void blue_led_on(void) {}
  __weak void blue_led_off(void) {}
1938f4a5b   Simon Glass   Introduce generic...
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  
  /*
   * 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?
   */
d54d7eb96   Sonic Zhang   support blackfin ...
108
  #if defined(CONFIG_WATCHDOG) || defined(CONFIG_HW_WATCHDOG)
e4fef6cfc   Simon Glass   Adjust board_f.c ...
109
110
  static int init_func_watchdog_init(void)
  {
d54d7eb96   Sonic Zhang   support blackfin ...
111
112
113
114
115
  # if defined(CONFIG_HW_WATCHDOG) && (defined(CONFIG_BLACKFIN) || \
  	defined(CONFIG_M68K) || defined(CONFIG_MICROBLAZE) || \
  	defined(CONFIG_SH))
  	hw_watchdog_init();
  # endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
116
117
118
119
120
121
122
123
124
125
126
127
128
129
  	puts("       Watchdog enabled
  ");
  	WATCHDOG_RESET();
  
  	return 0;
  }
  
  int init_func_watchdog_reset(void)
  {
  	WATCHDOG_RESET();
  
  	return 0;
  }
  #endif /* CONFIG_WATCHDOG */
dd2a6cd0f   Jeroen Hofstee   common: board: us...
130
  __weak void board_add_ram_info(int use_default)
e4fef6cfc   Simon Glass   Adjust board_f.c ...
131
132
133
  {
  	/* please define platform specific board_add_ram_info() */
  }
1938f4a5b   Simon Glass   Introduce generic...
134
135
136
137
138
139
140
141
  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...
142
  #ifndef CONFIG_SANDBOX
9fdee7d73   Daniel Schwierzeck   common/board_f: f...
143
  	ulong bss_start, bss_end, text_base;
1938f4a5b   Simon Glass   Introduce generic...
144

632efa744   Simon Glass   Add CONFIG_SYS_SY...
145
146
  	bss_start = (ulong)&__bss_start;
  	bss_end = (ulong)&__bss_end;
b60eff31f   Albert ARIBAUD   arm: remove unnee...
147

d54d7eb96   Sonic Zhang   support blackfin ...
148
  #ifdef CONFIG_SYS_TEXT_BASE
9fdee7d73   Daniel Schwierzeck   common/board_f: f...
149
  	text_base = CONFIG_SYS_TEXT_BASE;
d54d7eb96   Sonic Zhang   support blackfin ...
150
  #else
9fdee7d73   Daniel Schwierzeck   common/board_f: f...
151
  	text_base = CONFIG_SYS_MONITOR_BASE;
d54d7eb96   Sonic Zhang   support blackfin ...
152
  #endif
9fdee7d73   Daniel Schwierzeck   common/board_f: f...
153
154
155
156
  
  	debug("U-Boot code: %08lX -> %08lX  BSS: -> %08lX
  ",
  		text_base, bss_start, bss_end);
a733b06b6   Simon Glass   sandbox: Switch o...
157
  #endif
1938f4a5b   Simon Glass   Introduce generic...
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
  
  #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;
  }
3da7e5a50   Paul Burton   board_f: call ini...
178
  #if defined(CONFIG_MIPS) || defined(CONFIG_PPC)
e4fef6cfc   Simon Glass   Adjust board_f.c ...
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
  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...
197
198
  static int show_dram_config(void)
  {
fa39ffe5d   York Sun   common/board_f: F...
199
  	unsigned long long size;
1938f4a5b   Simon Glass   Introduce generic...
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
  
  #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 ...
220
221
222
223
  	print_size(size, "");
  	board_add_ram_info(0);
  	putc('
  ');
1938f4a5b   Simon Glass   Introduce generic...
224
225
226
  
  	return 0;
  }
dd2a6cd0f   Jeroen Hofstee   common: board: us...
227
  __weak void dram_init_banksize(void)
1938f4a5b   Simon Glass   Introduce generic...
228
229
230
231
232
233
  {
  #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
  }
ea818dbbc   Heiko Schocher   i2c, soft-i2c: sw...
234
  #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
e4fef6cfc   Simon Glass   Adjust board_f.c ...
235
236
237
  static int init_func_i2c(void)
  {
  	puts("I2C:   ");
815a76f2e   trem   i2c: fix init on ...
238
239
240
  #ifdef CONFIG_SYS_I2C
  	i2c_init_all();
  #else
e4fef6cfc   Simon Glass   Adjust board_f.c ...
241
  	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
815a76f2e   trem   i2c: fix init on ...
242
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
  	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...
261
262
263
264
265
266
267
268
269
  static int zero_global_data(void)
  {
  	memset((void *)gd, '\0', sizeof(gd_t));
  
  	return 0;
  }
  
  static int setup_mon_len(void)
  {
b60eff31f   Albert ARIBAUD   arm: remove unnee...
270
271
  #ifdef __ARM__
  	gd->mon_len = (ulong)&__bss_end - (ulong)_start;
a733b06b6   Simon Glass   sandbox: Switch o...
272
273
  #elif defined(CONFIG_SANDBOX)
  	gd->mon_len = (ulong)&_end - (ulong)_init;
5ff10aa7e   Thomas Chou   nios2: add generi...
274
  #elif defined(CONFIG_BLACKFIN) || defined(CONFIG_NIOS2)
d54d7eb96   Sonic Zhang   support blackfin ...
275
  	gd->mon_len = CONFIG_SYS_MONITOR_LEN;
632efa744   Simon Glass   Add CONFIG_SYS_SY...
276
  #else
e4fef6cfc   Simon Glass   Adjust board_f.c ...
277
278
  	/* 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...
279
  #endif
1938f4a5b   Simon Glass   Introduce generic...
280
281
282
283
284
285
286
  	return 0;
  }
  
  __weak int arch_cpu_init(void)
  {
  	return 0;
  }
f828bf25f   Simon Glass   sandbox: Add CONF...
287
  #ifdef CONFIG_OF_HOSTFILE
f828bf25f   Simon Glass   sandbox: Add CONF...
288
289
290
  static int read_fdt_from_file(void)
  {
  	struct sandbox_state *state = state_get_current();
95fac6ab4   Simon Glass   sandbox: Use os f...
291
  	const char *fname = state->fdt_fname;
f828bf25f   Simon Glass   sandbox: Add CONF...
292
  	void *blob;
96b1046d1   Suriyan Ramasami   sandbox: Prepare ...
293
  	loff_t size;
f828bf25f   Simon Glass   sandbox: Add CONF...
294
  	int err;
95fac6ab4   Simon Glass   sandbox: Use os f...
295
  	int fd;
f828bf25f   Simon Glass   sandbox: Add CONF...
296
297
298
  
  	blob = map_sysmem(CONFIG_SYS_FDT_LOAD_ADDR, 0);
  	if (!state->fdt_fname) {
95fac6ab4   Simon Glass   sandbox: Use os f...
299
  		err = fdt_create_empty_tree(blob, 256);
f828bf25f   Simon Glass   sandbox: Add CONF...
300
301
  		if (!err)
  			goto done;
95fac6ab4   Simon Glass   sandbox: Use os f...
302
303
304
305
  		printf("Unable to create empty FDT: %s
  ", fdt_strerror(err));
  		return -EINVAL;
  	}
96b1046d1   Suriyan Ramasami   sandbox: Prepare ...
306
307
  	err = os_get_filesize(fname, &size);
  	if (err < 0) {
95fac6ab4   Simon Glass   sandbox: Use os f...
308
309
  		printf("Failed to file FDT file '%s'
  ", fname);
96b1046d1   Suriyan Ramasami   sandbox: Prepare ...
310
  		return err;
95fac6ab4   Simon Glass   sandbox: Use os f...
311
312
313
314
315
316
  	}
  	fd = os_open(fname, OS_O_RDONLY);
  	if (fd < 0) {
  		printf("Failed to open FDT file '%s'
  ", fname);
  		return -EACCES;
f828bf25f   Simon Glass   sandbox: Add CONF...
317
  	}
95fac6ab4   Simon Glass   sandbox: Use os f...
318
319
  	if (os_read(fd, blob, size) != size) {
  		os_close(fd);
f828bf25f   Simon Glass   sandbox: Add CONF...
320
  		return -EIO;
95fac6ab4   Simon Glass   sandbox: Use os f...
321
322
  	}
  	os_close(fd);
f828bf25f   Simon Glass   sandbox: Add CONF...
323
324
325
326
327
328
329
  
  done:
  	gd->fdt_blob = blob;
  
  	return 0;
  }
  #endif
a733b06b6   Simon Glass   sandbox: Switch o...
330
331
332
  #ifdef CONFIG_SANDBOX
  static int setup_ram_buf(void)
  {
5c2859cdc   Simon Glass   sandbox: Allow re...
333
334
335
336
  	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...
337
338
339
340
  
  	return 0;
  }
  #endif
1938f4a5b   Simon Glass   Introduce generic...
341
342
  static int setup_fdt(void)
  {
c970dffed   Masahiro Yamada   generic_board: do...
343
344
  #ifdef CONFIG_OF_CONTROL
  # ifdef CONFIG_OF_EMBED
1938f4a5b   Simon Glass   Introduce generic...
345
  	/* Get a pointer to the FDT */
6ab6b2afa   Masahiro Yamada   dts: re-write dts...
346
  	gd->fdt_blob = __dtb_dt_begin;
c970dffed   Masahiro Yamada   generic_board: do...
347
  # elif defined CONFIG_OF_SEPARATE
1938f4a5b   Simon Glass   Introduce generic...
348
  	/* FDT is at end of image */
632efa744   Simon Glass   Add CONFIG_SYS_SY...
349
  	gd->fdt_blob = (ulong *)&_end;
c970dffed   Masahiro Yamada   generic_board: do...
350
  # elif defined(CONFIG_OF_HOSTFILE)
f828bf25f   Simon Glass   sandbox: Add CONF...
351
352
353
354
355
  	if (read_fdt_from_file()) {
  		puts("Failed to read control FDT
  ");
  		return -1;
  	}
c970dffed   Masahiro Yamada   generic_board: do...
356
  # endif
1938f4a5b   Simon Glass   Introduce generic...
357
358
359
  	/* Allow the early environment to override the fdt address */
  	gd->fdt_blob = (void *)getenv_ulong("fdtcontroladdr", 16,
  						(uintptr_t)gd->fdt_blob);
c970dffed   Masahiro Yamada   generic_board: do...
360
  #endif
1938f4a5b   Simon Glass   Introduce generic...
361
362
363
364
365
366
367
368
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
  	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 ...
395
  	gd->ram_top += get_effective_memsize();
1938f4a5b   Simon Glass   Introduce generic...
396
  	gd->ram_top = board_get_usable_ram_top(gd->mon_len);
a0ba279ac   Masahiro Yamada   generic_board: re...
397
  	gd->relocaddr = gd->ram_top;
1938f4a5b   Simon Glass   Introduce generic...
398
399
  	debug("Ram top: %08lX
  ", (ulong)gd->ram_top);
ec3b48201   Gabriel Huau   common: fix inclu...
400
  #if defined(CONFIG_MP) && (defined(CONFIG_MPC86xx) || defined(CONFIG_E500))
e4fef6cfc   Simon Glass   Adjust board_f.c ...
401
402
403
404
  	/*
  	 * 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...
405
406
407
408
  	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 ...
409
410
  	}
  #endif
1938f4a5b   Simon Glass   Introduce generic...
411
412
413
414
415
416
417
  	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...
418
  	gd->relocaddr -= LOGBUFF_RESERVE;
1938f4a5b   Simon Glass   Introduce generic...
419
420
  	debug("Reserving %dk for kernel logbuffer at %08lx
  ", LOGBUFF_LEN,
a0ba279ac   Masahiro Yamada   generic_board: re...
421
  		gd->relocaddr);
1938f4a5b   Simon Glass   Introduce generic...
422
423
424
425
426
427
428
429
430
431
432
  	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...
433
  	gd->relocaddr -= (reg << 10);		/* size is in kB */
1938f4a5b   Simon Glass   Introduce generic...
434
435
  	debug("Reserving %ldk for protected RAM at %08lx
  ", reg,
a0ba279ac   Masahiro Yamada   generic_board: re...
436
  	      gd->relocaddr);
1938f4a5b   Simon Glass   Introduce generic...
437
438
439
440
441
442
443
  	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...
444
  	gd->relocaddr &= ~(4096 - 1);
1938f4a5b   Simon Glass   Introduce generic...
445
446
447
448
449
450
451
452
  	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...
453
  	gd->arch.tlb_size = PGTABLE_SIZE;
a0ba279ac   Masahiro Yamada   generic_board: re...
454
  	gd->relocaddr -= gd->arch.tlb_size;
1938f4a5b   Simon Glass   Introduce generic...
455
456
  
  	/* round down to next 64 kB limit */
a0ba279ac   Masahiro Yamada   generic_board: re...
457
  	gd->relocaddr &= ~(0x10000 - 1);
1938f4a5b   Simon Glass   Introduce generic...
458

a0ba279ac   Masahiro Yamada   generic_board: re...
459
  	gd->arch.tlb_addr = gd->relocaddr;
1938f4a5b   Simon Glass   Introduce generic...
460
461
462
463
464
465
466
467
468
469
470
471
472
473
  	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...
474
475
  	gd->relocaddr = lcd_setmem(gd->relocaddr);
  	gd->fb_base = gd->relocaddr;
1938f4a5b   Simon Glass   Introduce generic...
476
477
478
479
  #endif /* CONFIG_FB_ADDR */
  	return 0;
  }
  #endif /* CONFIG_LCD */
71c52dba2   Simon Glass   Add trace support...
480
481
482
483
484
485
486
487
488
489
490
491
  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;
  }
d54d7eb96   Sonic Zhang   support blackfin ...
492
493
494
  #if defined(CONFIG_VIDEO) && (!defined(CONFIG_PPC) || defined(CONFIG_8xx)) && \
  		!defined(CONFIG_ARM) && !defined(CONFIG_X86) && \
  		!defined(CONFIG_BLACKFIN)
e4fef6cfc   Simon Glass   Adjust board_f.c ...
495
496
497
  static int reserve_video(void)
  {
  	/* reserve memory for video display (always full pages) */
a0ba279ac   Masahiro Yamada   generic_board: re...
498
499
  	gd->relocaddr = video_setmem(gd->relocaddr);
  	gd->fb_base = gd->relocaddr;
e4fef6cfc   Simon Glass   Adjust board_f.c ...
500
501
502
503
  
  	return 0;
  }
  #endif
1938f4a5b   Simon Glass   Introduce generic...
504
505
506
507
508
509
  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...
510
511
  	gd->relocaddr -= gd->mon_len;
  	gd->relocaddr &= ~(4096 - 1);
e4fef6cfc   Simon Glass   Adjust board_f.c ...
512
513
  #ifdef CONFIG_E500
  	/* round down to next 64 kB limit so that IVPR stays aligned */
a0ba279ac   Masahiro Yamada   generic_board: re...
514
  	gd->relocaddr &= ~(65536 - 1);
e4fef6cfc   Simon Glass   Adjust board_f.c ...
515
  #endif
1938f4a5b   Simon Glass   Introduce generic...
516
517
518
  
  	debug("Reserving %ldk for U-Boot at: %08lx
  ", gd->mon_len >> 10,
a0ba279ac   Masahiro Yamada   generic_board: re...
519
520
521
  	      gd->relocaddr);
  
  	gd->start_addr_sp = gd->relocaddr;
1938f4a5b   Simon Glass   Introduce generic...
522
523
  	return 0;
  }
8cae8a68e   Simon Glass   Add spl load feature
524
  #ifndef CONFIG_SPL_BUILD
1938f4a5b   Simon Glass   Introduce generic...
525
526
527
  /* reserve memory for malloc() area */
  static int reserve_malloc(void)
  {
a0ba279ac   Masahiro Yamada   generic_board: re...
528
  	gd->start_addr_sp = gd->start_addr_sp - TOTAL_MALLOC_LEN;
1938f4a5b   Simon Glass   Introduce generic...
529
530
  	debug("Reserving %dk for malloc() at: %08lx
  ",
a0ba279ac   Masahiro Yamada   generic_board: re...
531
  			TOTAL_MALLOC_LEN >> 10, gd->start_addr_sp);
1938f4a5b   Simon Glass   Introduce generic...
532
533
534
535
536
537
  	return 0;
  }
  
  /* (permanently) allocate a Board Info struct */
  static int reserve_board(void)
  {
d54d7eb96   Sonic Zhang   support blackfin ...
538
539
540
541
542
543
544
545
  	if (!gd->bd) {
  		gd->start_addr_sp -= sizeof(bd_t);
  		gd->bd = (bd_t *)map_sysmem(gd->start_addr_sp, sizeof(bd_t));
  		memset(gd->bd, '\0', sizeof(bd_t));
  		debug("Reserving %zu Bytes for Board Info at: %08lx
  ",
  		      sizeof(bd_t), gd->start_addr_sp);
  	}
1938f4a5b   Simon Glass   Introduce generic...
546
547
  	return 0;
  }
8cae8a68e   Simon Glass   Add spl load feature
548
  #endif
1938f4a5b   Simon Glass   Introduce generic...
549
550
551
552
553
554
555
556
557
558
559
  
  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...
560
561
  	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...
562
563
  	debug("Reserving %zu Bytes for Global Data at: %08lx
  ",
a0ba279ac   Masahiro Yamada   generic_board: re...
564
  			sizeof(gd_t), gd->start_addr_sp);
1938f4a5b   Simon Glass   Introduce generic...
565
566
567
568
569
570
571
572
573
574
575
576
  	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...
577
578
  		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...
579
580
  		debug("Reserving %lu Bytes for FDT at: %08lx
  ",
a0ba279ac   Masahiro Yamada   generic_board: re...
581
  		      gd->fdt_size, gd->start_addr_sp);
1938f4a5b   Simon Glass   Introduce generic...
582
583
584
585
586
587
588
  	}
  
  	return 0;
  }
  
  static int reserve_stacks(void)
  {
8cae8a68e   Simon Glass   Add spl load feature
589
590
  #ifdef CONFIG_SPL_BUILD
  # ifdef CONFIG_ARM
a0ba279ac   Masahiro Yamada   generic_board: re...
591
592
  	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
593
594
  # endif
  #else
94092e361   Tom Rini   Revert "common/bo...
595
  # ifdef CONFIG_PPC
e4fef6cfc   Simon Glass   Adjust board_f.c ...
596
597
  	ulong *s;
  # endif
8cae8a68e   Simon Glass   Add spl load feature
598

1938f4a5b   Simon Glass   Introduce generic...
599
  	/* setup stack pointer for exceptions */
a0ba279ac   Masahiro Yamada   generic_board: re...
600
601
602
  	gd->start_addr_sp -= 16;
  	gd->start_addr_sp &= ~0xf;
  	gd->irq_sp = gd->start_addr_sp;
1938f4a5b   Simon Glass   Introduce generic...
603
604
605
606
607
608
  
  	/*
  	 * 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...
609
  # if defined(CONFIG_ARM) && !defined(CONFIG_ARM64)
1938f4a5b   Simon Glass   Introduce generic...
610
  #  ifdef CONFIG_USE_IRQ
a0ba279ac   Masahiro Yamada   generic_board: re...
611
  	gd->start_addr_sp -= (CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ);
1938f4a5b   Simon Glass   Introduce generic...
612
613
  	debug("Reserving %zu Bytes for IRQ stack at: %08lx
  ",
a0ba279ac   Masahiro Yamada   generic_board: re...
614
  		CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ, gd->start_addr_sp);
1938f4a5b   Simon Glass   Introduce generic...
615
616
  
  	/* 8-byte alignment for ARM ABI compliance */
a0ba279ac   Masahiro Yamada   generic_board: re...
617
  	gd->start_addr_sp &= ~0x07;
1938f4a5b   Simon Glass   Introduce generic...
618
619
  #  endif
  	/* leave 3 words for abort-stack, plus 1 for alignment */
a0ba279ac   Masahiro Yamada   generic_board: re...
620
  	gd->start_addr_sp -= 16;
e4fef6cfc   Simon Glass   Adjust board_f.c ...
621
622
  # elif defined(CONFIG_PPC)
  	/* Clear initial stack frame */
a0ba279ac   Masahiro Yamada   generic_board: re...
623
  	s = (ulong *) gd->start_addr_sp;
e4fef6cfc   Simon Glass   Adjust board_f.c ...
624
625
  	*s = 0; /* Terminate back chain */
  	*++s = 0; /* NULL return address */
8cae8a68e   Simon Glass   Add spl load feature
626
  # endif /* Architecture specific code */
1938f4a5b   Simon Glass   Introduce generic...
627
628
  
  	return 0;
8cae8a68e   Simon Glass   Add spl load feature
629
  #endif
1938f4a5b   Simon Glass   Introduce generic...
630
631
632
633
  }
  
  static int display_new_sp(void)
  {
a0ba279ac   Masahiro Yamada   generic_board: re...
634
635
  	debug("New Stack Pointer is: %08lx
  ", gd->start_addr_sp);
1938f4a5b   Simon Glass   Introduce generic...
636
637
638
  
  	return 0;
  }
e4fef6cfc   Simon Glass   Adjust board_f.c ...
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
  #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
58dac3276   Masahiro Yamada   powerpc: mpc8260:...
655
  #if defined(CONFIG_8xx) || defined(CONFIG_MPC8260) || defined(CONFIG_5xx) || \
e4fef6cfc   Simon Glass   Adjust board_f.c ...
656
657
658
659
660
661
662
663
664
  		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 ...
665
666
667
668
669
670
671
672
673
674
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
  
  	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...
716
717
718
719
720
721
722
723
724
  #ifdef CONFIG_POST
  static int init_post(void)
  {
  	post_bootmode_init();
  	post_run(NULL, POST_ROM | post_bootmode_get(0));
  
  	return 0;
  }
  #endif
1938f4a5b   Simon Glass   Introduce generic...
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
  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)
  {
d54d7eb96   Sonic Zhang   support blackfin ...
745
  #ifdef CONFIG_SYS_TEXT_BASE
a0ba279ac   Masahiro Yamada   generic_board: re...
746
  	gd->reloc_off = gd->relocaddr - CONFIG_SYS_TEXT_BASE;
d54d7eb96   Sonic Zhang   support blackfin ...
747
  #endif
1938f4a5b   Simon Glass   Introduce generic...
748
749
750
751
  	memcpy(gd->new_gd, (char *)gd, sizeof(gd_t));
  
  	debug("Relocation Offset is: %08lx
  ", gd->reloc_off);
a733b06b6   Simon Glass   sandbox: Switch o...
752
753
  	debug("Relocating to %08lx, new gd at %08lx, sp at %08lx
  ",
a0ba279ac   Masahiro Yamada   generic_board: re...
754
755
  	      gd->relocaddr, (ulong)map_to_sysmem(gd->new_gd),
  	      gd->start_addr_sp);
1938f4a5b   Simon Glass   Introduce generic...
756
757
758
759
760
  
  	return 0;
  }
  
  /* ARM calls relocate_code from its crt0.S */
808434cdb   Simon Glass   sandbox: Allow re...
761
  #if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)
1938f4a5b   Simon Glass   Introduce generic...
762
763
764
  
  static int jump_to_copy(void)
  {
48a338067   Simon Glass   x86: Adjust board...
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
  	/*
  	 * 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...
782
  	relocate_code(gd->start_addr_sp, gd->new_gd, gd->relocaddr);
48a338067   Simon Glass   x86: Adjust board...
783
  #endif
1938f4a5b   Simon Glass   Introduce generic...
784
785
786
787
788
789
790
791
792
793
794
795
  
  	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;
  }
d59476b64   Simon Glass   Add a simple mall...
796
797
798
799
800
801
802
803
804
805
  static int initf_malloc(void)
  {
  #ifdef CONFIG_SYS_MALLOC_F_LEN
  	assert(gd->malloc_base);	/* Set up by crt0.S */
  	gd->malloc_limit = gd->malloc_base + CONFIG_SYS_MALLOC_F_LEN;
  	gd->malloc_ptr = 0;
  #endif
  
  	return 0;
  }
ab7cd6279   Simon Glass   dm: Support drive...
806
807
808
809
810
811
812
813
814
815
816
817
  static int initf_dm(void)
  {
  #if defined(CONFIG_DM) && defined(CONFIG_SYS_MALLOC_F_LEN)
  	int ret;
  
  	ret = dm_init_and_scan(true);
  	if (ret)
  		return ret;
  #endif
  
  	return 0;
  }
1938f4a5b   Simon Glass   Introduce generic...
818
  static init_fnc_t init_sequence_f[] = {
a733b06b6   Simon Glass   sandbox: Switch o...
819
820
821
  #ifdef CONFIG_SANDBOX
  	setup_ram_buf,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
822
  	setup_mon_len,
71c52dba2   Simon Glass   Add trace support...
823
  	setup_fdt,
d210718d9   Kevin Hilman   common/board_f.c:...
824
  #ifdef CONFIG_TRACE
71c52dba2   Simon Glass   Add trace support...
825
  	trace_early_init,
d210718d9   Kevin Hilman   common/board_f.c:...
826
  #endif
768e0f52f   Simon Glass   Move early malloc...
827
  	initf_malloc,
e4fef6cfc   Simon Glass   Adjust board_f.c ...
828
829
830
831
  #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
  	/* TODO: can this go into arch_cpu_init()? */
  	probecpu,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
832
833
834
835
836
  	arch_cpu_init,		/* basic arch cpu dependent setup */
  	mark_bootstage,
  #ifdef CONFIG_OF_CONTROL
  	fdtdec_check_fdt,
  #endif
3ea0953d3   Simon Glass   dm: Move pre-relo...
837
  	initf_dm,
1938f4a5b   Simon Glass   Introduce generic...
838
839
840
  #if defined(CONFIG_BOARD_EARLY_INIT_F)
  	board_early_init_f,
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
841
842
843
844
845
846
847
848
849
850
  	/* 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
d54d7eb96   Sonic Zhang   support blackfin ...
851
  #if defined(CONFIG_ARM) || defined(CONFIG_MIPS) || defined(CONFIG_BLACKFIN)
1938f4a5b   Simon Glass   Introduce generic...
852
  	timer_init,		/* initialize timer */
e4fef6cfc   Simon Glass   Adjust board_f.c ...
853
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
854
855
856
857
858
859
860
861
  #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: ...
862
863
864
  #ifdef CONFIG_FSL_ESDHC
  	get_clocks,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
865
  	env_init,		/* initialize environment */
e4fef6cfc   Simon Glass   Adjust board_f.c ...
866
867
868
869
870
871
872
  #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...
873
874
875
  	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...
876
877
878
879
880
  #ifdef CONFIG_SANDBOX
  	sandbox_early_getopt_check,
  #endif
  #ifdef CONFIG_OF_CONTROL
  	fdtdec_prepare_fdt,
48a338067   Simon Glass   x86: Adjust board...
881
  #endif
1938f4a5b   Simon Glass   Introduce generic...
882
883
  	display_options,	/* say that we are here */
  	display_text_info,	/* show debugging info if required */
58dac3276   Masahiro Yamada   powerpc: mpc8260:...
884
  #if defined(CONFIG_MPC8260)
e4fef6cfc   Simon Glass   Adjust board_f.c ...
885
886
  	prt_8260_rsr,
  	prt_8260_clks,
58dac3276   Masahiro Yamada   powerpc: mpc8260:...
887
  #endif /* CONFIG_MPC8260 */
e4fef6cfc   Simon Glass   Adjust board_f.c ...
888
889
890
891
892
893
  #if defined(CONFIG_MPC83xx)
  	prt_83xx_rsr,
  #endif
  #ifdef CONFIG_PPC
  	checkcpu,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
894
  	print_cpuinfo,		/* display cpu info (and speed) */
e4fef6cfc   Simon Glass   Adjust board_f.c ...
895
896
897
  #if defined(CONFIG_MPC5xxx)
  	prt_mpc5xxx_clks,
  #endif /* CONFIG_MPC5xxx */
1938f4a5b   Simon Glass   Introduce generic...
898
899
900
  #if defined(CONFIG_DISPLAY_BOARDINFO)
  	checkboard,		/* display board info */
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
901
902
903
904
905
  	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...
906
  #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
e4fef6cfc   Simon Glass   Adjust board_f.c ...
907
908
909
910
911
  	init_func_i2c,
  #endif
  #if defined(CONFIG_HARD_SPI)
  	init_func_spi,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
912
913
  	announce_dram_init,
  	/* TODO: unify all these dram functions? */
07387d176   Simon Glass   x86: Use the stan...
914
  #if defined(CONFIG_ARM) || defined(CONFIG_X86)
1938f4a5b   Simon Glass   Introduce generic...
915
916
  	dram_init,		/* configure available RAM banks */
  #endif
3da7e5a50   Paul Burton   board_f: call ini...
917
  #if defined(CONFIG_MIPS) || defined(CONFIG_PPC)
e4fef6cfc   Simon Glass   Adjust board_f.c ...
918
919
920
921
922
923
924
925
926
927
  	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...
928
929
930
  #ifdef CONFIG_POST
  	init_post,
  #endif
e4fef6cfc   Simon Glass   Adjust board_f.c ...
931
  	INIT_FUNC_WATCHDOG_RESET
1938f4a5b   Simon Glass   Introduce generic...
932
933
934
935
936
937
938
939
940
941
942
943
944
  	/*
  	 * 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,
5ff10aa7e   Thomas Chou   nios2: add generi...
945
  #if defined(CONFIG_BLACKFIN) || defined(CONFIG_NIOS2)
d54d7eb96   Sonic Zhang   support blackfin ...
946
947
948
  	/* Blackfin u-boot monitor should be on top of the ram */
  	reserve_uboot,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
949
950
951
952
953
954
955
956
957
958
959
960
961
962
  #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...
963
  	reserve_trace,
e4fef6cfc   Simon Glass   Adjust board_f.c ...
964
  	/* TODO: Why the dependency on CONFIG_8xx? */
d54d7eb96   Sonic Zhang   support blackfin ...
965
966
967
  #if defined(CONFIG_VIDEO) && (!defined(CONFIG_PPC) || defined(CONFIG_8xx)) && \
  		!defined(CONFIG_ARM) && !defined(CONFIG_X86) && \
  		!defined(CONFIG_BLACKFIN)
e4fef6cfc   Simon Glass   Adjust board_f.c ...
968
969
  	reserve_video,
  #endif
5ff10aa7e   Thomas Chou   nios2: add generi...
970
  #if !defined(CONFIG_BLACKFIN) && !defined(CONFIG_NIOS2)
1938f4a5b   Simon Glass   Introduce generic...
971
  	reserve_uboot,
d54d7eb96   Sonic Zhang   support blackfin ...
972
  #endif
8cae8a68e   Simon Glass   Add spl load feature
973
  #ifndef CONFIG_SPL_BUILD
1938f4a5b   Simon Glass   Introduce generic...
974
975
  	reserve_malloc,
  	reserve_board,
8cae8a68e   Simon Glass   Add spl load feature
976
  #endif
1938f4a5b   Simon Glass   Introduce generic...
977
978
979
980
981
982
  	setup_machine,
  	reserve_global_data,
  	reserve_fdt,
  	reserve_stacks,
  	setup_dram_config,
  	show_dram_config,
e4fef6cfc   Simon Glass   Adjust board_f.c ...
983
984
985
986
987
  #ifdef CONFIG_PPC
  	setup_board_part1,
  	INIT_FUNC_WATCHDOG_RESET
  	setup_board_part2,
  #endif
1938f4a5b   Simon Glass   Introduce generic...
988
  	display_new_sp,
e4fef6cfc   Simon Glass   Adjust board_f.c ...
989
990
991
992
  #ifdef CONFIG_SYS_EXTBDINFO
  	setup_board_extra,
  #endif
  	INIT_FUNC_WATCHDOG_RESET
1938f4a5b   Simon Glass   Introduce generic...
993
994
  	reloc_fdt,
  	setup_reloc,
808434cdb   Simon Glass   sandbox: Allow re...
995
  #if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)
1938f4a5b   Simon Glass   Introduce generic...
996
997
998
999
1000
1001
1002
  	jump_to_copy,
  #endif
  	NULL,
  };
  
  void board_init_f(ulong boot_flags)
  {
2a1680e30   York Sun   common/board_f: I...
1003
1004
1005
1006
1007
1008
1009
  #ifdef CONFIG_SYS_GENERIC_GLOBAL_DATA
  	/*
  	 * For some archtectures, global data is initialized and used before
  	 * calling this function. The data should be preserved. For others,
  	 * CONFIG_SYS_GENERIC_GLOBAL_DATA should be defined and use the stack
  	 * here to host global data until relocation.
  	 */
1938f4a5b   Simon Glass   Introduce generic...
1010
1011
1012
  	gd_t data;
  
  	gd = &data;
cce6be7f0   David Feng   arm64: generic bo...
1013
1014
1015
1016
1017
  	/*
  	 * 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.
  	 */
cce6be7f0   David Feng   arm64: generic bo...
1018
1019
  	zero_global_data();
  #endif
1938f4a5b   Simon Glass   Introduce generic...
1020
  	gd->flags = boot_flags;
9aed5a277   Alexey Brodkin   board_f: explicit...
1021
  	gd->have_console = 0;
1938f4a5b   Simon Glass   Introduce generic...
1022
1023
1024
  
  	if (initcall_run_list(init_sequence_f))
  		hang();
808434cdb   Simon Glass   sandbox: Allow re...
1025
  #if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)
1938f4a5b   Simon Glass   Introduce generic...
1026
1027
1028
1029
  	/* NOTREACHED - jump_to_copy() does not return */
  	hang();
  #endif
  }
48a338067   Simon Glass   x86: Adjust board...
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
1068
1069
1070
1071
1072
  #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 */