diff options
| author | David Feng <fenghua@phytium.com.cn> | 2013-12-14 11:47:35 +0800 | 
|---|---|---|
| committer | Albert ARIBAUD <albert.u.boot@aribaud.net> | 2014-01-09 16:08:44 +0100 | 
| commit | 0ae7653128c80a4f2920cbe9b124792c2fd9d9e0 (patch) | |
| tree | 14fea7a80e4ea84c7b6a3bc32298daeec55054c7 /arch/arm/lib/bootm.c | |
| parent | 54799e4596bf8af33fd4a8dee153be7011c06d8d (diff) | |
arm64: core support
Relocation code based on a patch by Scott Wood, which is:
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Feng <fenghua@phytium.com.cn>
Diffstat (limited to 'arch/arm/lib/bootm.c')
| -rw-r--r-- | arch/arm/lib/bootm.c | 24 | 
1 files changed, 24 insertions, 0 deletions
| diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c index f476a897022..77f1a5c9736 100644 --- a/arch/arm/lib/bootm.c +++ b/arch/arm/lib/bootm.c @@ -196,6 +196,14 @@ static void do_nonsec_virt_switch(void)  		debug("entered non-secure state\n");  #endif  #endif + +#ifdef CONFIG_ARM64 +	smp_kick_all_cpus(); +	armv8_switch_to_el2(); +#ifdef CONFIG_ARMV8_SWITCH_TO_EL1 +	armv8_switch_to_el1(); +#endif +#endif  }  /* Subcommand: PREP */ @@ -240,6 +248,21 @@ static void boot_prep_linux(bootm_headers_t *images)  /* Subcommand: GO */  static void boot_jump_linux(bootm_headers_t *images, int flag)  { +#ifdef CONFIG_ARM64 +	void (*kernel_entry)(void *fdt_addr); +	int fake = (flag & BOOTM_STATE_OS_FAKE_GO); + +	kernel_entry = (void (*)(void *fdt_addr))images->ep; + +	debug("## Transferring control to Linux (at address %lx)...\n", +		(ulong) kernel_entry); +	bootstage_mark(BOOTSTAGE_ID_RUN_OS); + +	announce_and_cleanup(fake); + +	if (!fake) +		kernel_entry(images->ft_addr); +#else  	unsigned long machid = gd->bd->bi_arch_number;  	char *s;  	void (*kernel_entry)(int zero, int arch, uint params); @@ -266,6 +289,7 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)  	if (!fake)  		kernel_entry(0, machid, r2); +#endif  }  /* Main Entry point for arm bootm implementation | 
