diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/board_f.c | 83 | 
1 files changed, 81 insertions, 2 deletions
| diff --git a/common/board_f.c b/common/board_f.c index 1721eed8e..29b49c3ab 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -57,6 +57,10 @@  #include <asm/mp.h>  #endif  #include <asm/sections.h> +#ifdef CONFIG_X86 +#include <asm/init_helpers.h> +#include <asm/relocate.h> +#endif  #include <linux/compiler.h>  /* @@ -423,7 +427,7 @@ static int reserve_lcd(void)  #endif /* CONFIG_LCD */  #if defined(CONFIG_VIDEO) && (!defined(CONFIG_PPC) || defined(CONFIG_8xx)) \ -		&& !defined(CONFIG_ARM) +		&& !defined(CONFIG_ARM) && !defined(CONFIG_X86)  static int reserve_video(void)  {  	/* reserve memory for video display (always full pages) */ @@ -716,7 +720,25 @@ static int setup_reloc(void)  static int jump_to_copy(void)  { +	/* +	 * 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  	relocate_code(gd->dest_addr_sp, gd->new_gd, gd->dest_addr); +#endif  	return 0;  } @@ -743,6 +765,12 @@ static init_fnc_t init_sequence_f[] = {  	probecpu,  #endif  	arch_cpu_init,		/* basic arch cpu dependent setup */ +#ifdef CONFIG_X86 +	cpu_init_f,		/* TODO(sjg@chromium.org): remove */ +# ifdef CONFIG_OF_CONTROL +	find_fdt,		/* TODO(sjg@chromium.org): remove */ +# endif +#endif  	mark_bootstage,  #ifdef CONFIG_OF_CONTROL  	fdtdec_check_fdt, @@ -791,6 +819,9 @@ static init_fnc_t init_sequence_f[] = {  	init_baud_rate,		/* initialze baudrate settings */  	serial_init,		/* serial communications setup */  	console_init_f,		/* stage 1 init of console */ +#if defined(CONFIG_X86) && defined(CONFIG_OF_CONTROL) +	prepare_fdt,		/* TODO(sjg@chromium.org): remove */ +#endif  	display_options,	/* say that we are here */  	display_text_info,	/* show debugging info if required */  #if defined(CONFIG_8260) @@ -828,6 +859,8 @@ static init_fnc_t init_sequence_f[] = {  #endif  #ifdef CONFIG_X86  	dram_init_f,		/* configure available RAM banks */ +	/* x86 would prefer that this happens after relocation */ +	dram_init,  #endif  	announce_dram_init,  	/* TODO: unify all these dram functions? */ @@ -879,7 +912,7 @@ static init_fnc_t init_sequence_f[] = {  #endif  	/* TODO: Why the dependency on CONFIG_8xx? */  #if defined(CONFIG_VIDEO) && (!defined(CONFIG_PPC) || defined(CONFIG_8xx)) \ -		&& !defined(CONFIG_ARM) +		&& !defined(CONFIG_ARM) && !defined(CONFIG_X86)  	reserve_video,  #endif  	reserve_uboot, @@ -914,9 +947,11 @@ static init_fnc_t init_sequence_f[] = {  void board_init_f(ulong boot_flags)  { +#ifndef CONFIG_X86  	gd_t data;  	gd = &data; +#endif  	gd->flags = boot_flags; @@ -929,6 +964,50 @@ void board_init_f(ulong boot_flags)  #endif  } +#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 */ +  void hang(void)  {  	puts("### ERROR ### Please RESET the board ###\n"); |