diff options
Diffstat (limited to 'arch/arm/lib/bootm.c')
| -rw-r--r-- | arch/arm/lib/bootm.c | 47 | 
1 files changed, 47 insertions, 0 deletions
| diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c index f476a8970..a8295bf1f 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 @@ -326,3 +350,26 @@ int bootz_setup(ulong image, ulong *start, ulong *end)  }  #endif	/* CONFIG_CMD_BOOTZ */ + +#if defined(CONFIG_BOOTM_VXWORKS) +void boot_prep_vxworks(bootm_headers_t *images) +{ +#if defined(CONFIG_OF_LIBFDT) +	int off; + +	if (images->ft_addr) { +		off = fdt_path_offset(images->ft_addr, "/memory"); +		if (off < 0) { +			if (arch_fixup_memory_node(images->ft_addr)) +				puts("## WARNING: fixup memory failed!\n"); +		} +	} +#endif +	cleanup_before_linux(); +} +void boot_jump_vxworks(bootm_headers_t *images) +{ +	/* ARM VxWorks requires device tree physical address to be passed */ +	((void (*)(void *))images->ep)(images->ft_addr); +} +#endif |