diff options
Diffstat (limited to 'cmd/elf.c')
| -rw-r--r-- | cmd/elf.c | 39 | 
1 files changed, 36 insertions, 3 deletions
| diff --git a/cmd/elf.c b/cmd/elf.c index b7b9f506a52..df4354d3742 100644 --- a/cmd/elf.c +++ b/cmd/elf.c @@ -38,6 +38,10 @@ static unsigned long do_bootelf_exec(ulong (*entry)(int, char * const[]),  /* Interpreter command to boot an arbitrary ELF image from memory */  int do_bootelf(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])  { +#if CONFIG_IS_ENABLED(CMD_ELF_FDT_SETUP) +	struct bootm_headers img = {0}; +	unsigned long fdt_addr = 0; /* Address of the FDT */ +#endif  	unsigned long addr; /* Address of the ELF image */  	unsigned long rc; /* Return value from user code */  	char *sload = NULL; @@ -46,13 +50,25 @@ int do_bootelf(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])  	/* Consume 'bootelf' */  	argc--; argv++; -	/* Check for flag. */ +	/* Check for [-p|-s] flag. */  	if (argc >= 1 && (argv[0][0] == '-' && \  				(argv[0][1] == 'p' || argv[0][1] == 's'))) {  		sload = argv[0];  		/* Consume flag. */  		argc--; argv++;  	} + +#if CONFIG_IS_ENABLED(CMD_ELF_FDT_SETUP) +	/* Check for [-d fdt_addr_r] option. */ +	if ((argc >= 2) && (argv[0][0] == '-') && (argv[0][1] == 'd')) { +		if (strict_strtoul(argv[1], 16, &fdt_addr) != 0) +			return CMD_RET_USAGE; +		/* Consume option. */ +		argc -= 2; +		argv += 2; +	} +#endif +  	/* Check for address. */  	if (argc >= 1 && strict_strtoul(argv[0], 16, &addr) != -EINVAL) {  		/* Consume address */ @@ -68,6 +84,16 @@ int do_bootelf(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])  	else  		addr = load_elf_image_shdr(addr); +#if CONFIG_IS_ENABLED(CMD_ELF_FDT_SETUP) +	if (fdt_addr) { +		printf("## Setting up FDT at 0x%08lx ...\n", fdt_addr); +		flush(); + +		if (image_setup_libfdt(&img, (void *)fdt_addr, NULL)) +			return 1; +	} +#endif +  	if (!env_get_autostart())  		return rcode; @@ -298,9 +324,16 @@ int do_bootvx(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])  U_BOOT_CMD(  	bootelf, CONFIG_SYS_MAXARGS, 0, do_bootelf,  	"Boot from an ELF image in memory", -	"[-p|-s] [address]\n" +	"[-p|-s] " +#if CONFIG_IS_ENABLED(CMD_ELF_FDT_SETUP) +	"[-d fdt_addr_r] " +#endif +	"[address]\n"  	"\t- load ELF image at [address] via program headers (-p)\n" -	"\t  or via section headers (-s)" +	"\t  or via section headers (-s)\n" +#if CONFIG_IS_ENABLED(CMD_ELF_FDT_SETUP) +	"\t- setup FDT image at [fdt_addr_r] (-d)" +#endif  );  U_BOOT_CMD( | 
