diff options
Diffstat (limited to 'common/cmd_bootm.c')
| -rw-r--r-- | common/cmd_bootm.c | 92 | 
1 files changed, 79 insertions, 13 deletions
| diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index ba73f5781..3f576594d 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -23,6 +23,11 @@  #include <asm/io.h>  #include <linux/compiler.h> +#if defined(CONFIG_BOOTM_VXWORKS) && \ +	(defined(CONFIG_PPC) || defined(CONFIG_ARM)) +#include <vxworks.h> +#endif +  #if defined(CONFIG_CMD_USB)  #include <usb.h>  #endif @@ -120,8 +125,11 @@ static boot_os_fn do_bootm_ose;  #if defined(CONFIG_BOOTM_PLAN9)  static boot_os_fn do_bootm_plan9;  #endif -#if defined(CONFIG_CMD_ELF) +#if defined(CONFIG_BOOTM_VXWORKS) && \ +	(defined(CONFIG_PPC) || defined(CONFIG_ARM))  static boot_os_fn do_bootm_vxworks; +#endif +#if defined(CONFIG_CMD_ELF)  static boot_os_fn do_bootm_qnxelf;  int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);  int do_bootelf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); @@ -149,8 +157,11 @@ static boot_os_fn *boot_os[] = {  #if defined(CONFIG_BOOTM_PLAN9)  	[IH_OS_PLAN9] = do_bootm_plan9,  #endif -#if defined(CONFIG_CMD_ELF) +#if defined(CONFIG_BOOTM_VXWORKS) && \ +	(defined(CONFIG_PPC) || defined(CONFIG_ARM))  	[IH_OS_VXWORKS] = do_bootm_vxworks, +#endif +#if defined(CONFIG_CMD_ELF)  	[IH_OS_QNX] = do_bootm_qnxelf,  #endif  #ifdef CONFIG_INTEGRITY @@ -333,7 +344,8 @@ static int bootm_find_other(cmd_tbl_t *cmdtp, int flag, int argc,  	if (((images.os.type == IH_TYPE_KERNEL) ||  	     (images.os.type == IH_TYPE_KERNEL_NOLOAD) ||  	     (images.os.type == IH_TYPE_MULTI)) && -	    (images.os.os == IH_OS_LINUX)) { +	    (images.os.os == IH_OS_LINUX || +		 images.os.os == IH_OS_VXWORKS)) {  		if (bootm_find_ramdisk(flag, argc, argv))  			return 1; @@ -1531,10 +1543,10 @@ static int do_bootm_netbsd(int flag, int argc, char * const argv[],  	/*  	 * NetBSD Stage-2 Loader Parameters: -	 *   r3: ptr to board info data -	 *   r4: image address -	 *   r5: console device -	 *   r6: boot args string +	 *   arg[0]: pointer to board info data +	 *   arg[1]: image load address +	 *   arg[2]: char pointer to the console device to use +	 *   arg[3]: char pointer to the boot arguments  	 */  	(*loader)(gd->bd, os_hdr, consdev, cmdline); @@ -1678,12 +1690,66 @@ static int do_bootm_plan9(int flag, int argc, char * const argv[],  }  #endif /* CONFIG_BOOTM_PLAN9 */ -#if defined(CONFIG_CMD_ELF) +#if defined(CONFIG_BOOTM_VXWORKS) && \ +	(defined(CONFIG_PPC) || defined(CONFIG_ARM)) + +void do_bootvx_fdt(bootm_headers_t *images) +{ +#if defined(CONFIG_OF_LIBFDT) +	int ret; +	char *bootline; +	ulong of_size = images->ft_len; +	char **of_flat_tree = &images->ft_addr; +	struct lmb *lmb = &images->lmb; + +	if (*of_flat_tree) { +		boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree); + +		ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size); +		if (ret) +			return; + +		ret = fdt_add_subnode(*of_flat_tree, 0, "chosen"); +		if ((ret >= 0 || ret == -FDT_ERR_EXISTS)) { +			bootline = getenv("bootargs"); +			if (bootline) { +				ret = fdt_find_and_setprop(*of_flat_tree, +						"/chosen", "bootargs", +						bootline, +						strlen(bootline) + 1, 1); +				if (ret < 0) { +					printf("## ERROR: %s : %s\n", __func__, +					       fdt_strerror(ret)); +					return; +				} +			} +		} else { +			printf("## ERROR: %s : %s\n", __func__, +			       fdt_strerror(ret)); +			return; +		} +	} +#endif + +	boot_prep_vxworks(images); + +	bootstage_mark(BOOTSTAGE_ID_RUN_OS); + +#if defined(CONFIG_OF_LIBFDT) +	printf("## Starting vxWorks at 0x%08lx, device tree at 0x%08lx ...\n", +	       (ulong)images->ep, (ulong)*of_flat_tree); +#else +	printf("## Starting vxWorks at 0x%08lx\n", (ulong)images->ep); +#endif + +	boot_jump_vxworks(images); + +	puts("## vxWorks terminated\n"); +} +  static int do_bootm_vxworks(int flag, int argc, char * const argv[],  			     bootm_headers_t *images)  { -	char str[80]; -  	if (flag != BOOTM_STATE_OS_GO)  		return 0; @@ -1694,13 +1760,13 @@ static int do_bootm_vxworks(int flag, int argc, char * const argv[],  	}  #endif -	sprintf(str, "%lx", images->ep); /* write entry-point into string */ -	setenv("loadaddr", str); -	do_bootvx(NULL, 0, 0, NULL); +	do_bootvx_fdt(images);  	return 1;  } +#endif +#if defined(CONFIG_CMD_ELF)  static int do_bootm_qnxelf(int flag, int argc, char * const argv[],  			    bootm_headers_t *images)  { |