diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/Makefile | 2 | ||||
| -rw-r--r-- | common/board_f.c | 36 | ||||
| -rw-r--r-- | common/cmd_bootm.c | 92 | ||||
| -rw-r--r-- | common/cmd_elf.c | 6 | ||||
| -rw-r--r-- | common/cmd_mmc.c | 23 | ||||
| -rw-r--r-- | common/cmd_pxe.c | 4 | ||||
| -rw-r--r-- | common/cmd_sandbox.c | 64 | ||||
| -rw-r--r-- | common/console.c | 16 | ||||
| -rw-r--r-- | common/fdt_support.c | 71 | ||||
| -rw-r--r-- | common/image.c | 1 | 
10 files changed, 245 insertions, 70 deletions
| diff --git a/common/Makefile b/common/Makefile index 74404beb3..d12cba5bf 100644 --- a/common/Makefile +++ b/common/Makefile @@ -230,8 +230,6 @@ obj-$(CONFIG_FIT_SIGNATURE) += image-sig.o  obj-y += memsize.o  obj-y += stdio.o -CPPFLAGS += -I.. -  $(obj)env_embedded.o: $(src)env_embedded.c  	$(CC) $(AFLAGS) -Wa,--no-warn \  		-DENV_CRC=$(shell $(obj)../tools/envcrc) \ diff --git a/common/board_f.c b/common/board_f.c index f0664bc2b..aa70c3e57 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -347,9 +347,10 @@ done:  #ifdef CONFIG_SANDBOX  static int setup_ram_buf(void)  { -	gd->arch.ram_buf = os_malloc(CONFIG_SYS_SDRAM_SIZE); -	assert(gd->arch.ram_buf); -	gd->ram_size = CONFIG_SYS_SDRAM_SIZE; +	struct sandbox_state *state = state_get_current(); + +	gd->arch.ram_buf = state->ram_buf; +	gd->ram_size = state->ram_size;  	return 0;  } @@ -462,7 +463,7 @@ static int reserve_round_4k(void)  static int reserve_mmu(void)  {  	/* reserve TLB table */ -	gd->arch.tlb_size = 4096 * 4; +	gd->arch.tlb_size = PGTABLE_SIZE;  	gd->relocaddr -= gd->arch.tlb_size;  	/* round down to next 64 kB limit */ @@ -614,7 +615,7 @@ static int reserve_stacks(void)  	 * TODO(sjg@chromium.org): Perhaps create arch_reserve_stack()  	 * to handle this and put in arch/xxx/lib/stack.c  	 */ -# ifdef CONFIG_ARM +# if defined(CONFIG_ARM) && !defined(CONFIG_ARM64)  #  ifdef CONFIG_USE_IRQ  	gd->start_addr_sp -= (CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ);  	debug("Reserving %zu Bytes for IRQ stack at: %08lx\n", @@ -772,7 +773,7 @@ static int setup_reloc(void)  }  /* ARM calls relocate_code from its crt0.S */ -#if !defined(CONFIG_ARM) +#if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)  static int jump_to_copy(void)  { @@ -792,8 +793,6 @@ static int jump_to_copy(void)  	 * (CPU cache)  	 */  	board_init_f_r_trampoline(gd->start_addr_sp); -#elif defined(CONFIG_SANDBOX) -	board_init_r(gd->new_gd, 0);  #else  	relocate_code(gd->start_addr_sp, gd->new_gd, gd->relocaddr);  #endif @@ -811,11 +810,6 @@ static int mark_bootstage(void)  }  static init_fnc_t init_sequence_f[] = { -#if !defined(CONFIG_CPM2) && !defined(CONFIG_MPC512X) && \ -		!defined(CONFIG_MPC83xx) && !defined(CONFIG_MPC85xx) && \ -		!defined(CONFIG_MPC86xx) && !defined(CONFIG_X86) -	zero_global_data, -#endif  #ifdef CONFIG_SANDBOX  	setup_ram_buf,  #endif @@ -995,7 +989,7 @@ static init_fnc_t init_sequence_f[] = {  	INIT_FUNC_WATCHDOG_RESET  	reloc_fdt,  	setup_reloc, -#ifndef CONFIG_ARM +#if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)  	jump_to_copy,  #endif  	NULL, @@ -1009,12 +1003,24 @@ void board_init_f(ulong boot_flags)  	gd = &data;  #endif +	/* +	 * Clear global data before it is accessed at debug print +	 * in initcall_run_list. Otherwise the debug print probably +	 * get the wrong vaule of gd->have_console. +	 */ +#if !defined(CONFIG_CPM2) && !defined(CONFIG_MPC512X) && \ +		!defined(CONFIG_MPC83xx) && !defined(CONFIG_MPC85xx) && \ +		!defined(CONFIG_MPC86xx) && !defined(CONFIG_X86) +	zero_global_data(); +#endif +  	gd->flags = boot_flags; +	gd->have_console = 0;  	if (initcall_run_list(init_sequence_f))  		hang(); -#ifndef CONFIG_ARM +#if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX)  	/* NOTREACHED - jump_to_copy() does not return */  	hang();  #endif 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)  { diff --git a/common/cmd_elf.c b/common/cmd_elf.c index f741f6b83..ab9c7e332 100644 --- a/common/cmd_elf.c +++ b/common/cmd_elf.c @@ -156,16 +156,16 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  	 * If we don't know where the image is then we're done.  	 */ -	if (argc < 1) +	if (argc < 2)  		addr = load_addr;  	else -		addr = simple_strtoul(argv[0], NULL, 16); +		addr = simple_strtoul(argv[1], NULL, 16);  #if defined(CONFIG_CMD_NET)  	/*  	 * Check to see if we need to tftp the image ourselves before starting  	 */ -	if ((argc == 1) && (strcmp(argv[0], "tftp") == 0)) { +	if ((argc == 2) && (strcmp(argv[1], "tftp") == 0)) {  		if (NetLoop(TFTPGET) <= 0)  			return 1;  		printf("Automatic boot of VxWorks image at address 0x%08lx ...\n", diff --git a/common/cmd_mmc.c b/common/cmd_mmc.c index 67a94a746..da5fef9db 100644 --- a/common/cmd_mmc.c +++ b/common/cmd_mmc.c @@ -340,6 +340,28 @@ static int do_mmcops(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  		}  #endif /* CONFIG_SUPPORT_EMMC_BOOT */  	} + +	else if (argc == 3 && strcmp(argv[1], "setdsr") == 0) { +		struct mmc *mmc = find_mmc_device(curr_device); +		u32 val = simple_strtoul(argv[2], NULL, 16); +		int ret; + +		if (!mmc) { +			printf("no mmc device at slot %x\n", curr_device); +			return 1; +		} +		ret = mmc_set_dsr(mmc, val); +		printf("set dsr %s\n", (!ret) ? "OK, force rescan" : "ERROR"); +		if (!ret) { +			mmc->has_init = 0; +			if (mmc_init(mmc)) +				return 1; +			else +				return 0; +		} +		return ret; +	} +  	state = MMC_INVALID;  	if (argc == 5 && strcmp(argv[1], "read") == 0)  		state = MMC_READ; @@ -423,5 +445,6 @@ U_BOOT_CMD(  	"mmc bootpart <device num> <boot part size MB> <RPMB part size MB>\n"  	" - change sizes of boot and RPMB partitions of specified device\n"  #endif +	"mmc setdsr - set DSR register value\n"  	);  #endif /* !CONFIG_GENERIC_MMC */ diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c index db6b15698..c27ec354c 100644 --- a/common/cmd_pxe.c +++ b/common/cmd_pxe.c @@ -59,7 +59,7 @@ static int format_mac_pxe(char *outbuf, size_t outbuf_len)  	uchar ethaddr[6];  	if (outbuf_len < 21) { -		printf("outbuf is too small (%d < 21)\n", outbuf_len); +		printf("outbuf is too small (%zd < 21)\n", outbuf_len);  		return -EINVAL;  	} @@ -103,7 +103,7 @@ static int get_bootfile_path(const char *file_path, char *bootfile_path,  	path_len = (last_slash - bootfile) + 1;  	if (bootfile_path_size < path_len) { -		printf("bootfile_path too small. (%d < %d)\n", +		printf("bootfile_path too small. (%zd < %zd)\n",  				bootfile_path_size, path_len);  		return -1; diff --git a/common/cmd_sandbox.c b/common/cmd_sandbox.c index 8d59364b6..00982b164 100644 --- a/common/cmd_sandbox.c +++ b/common/cmd_sandbox.c @@ -6,6 +6,9 @@  #include <common.h>  #include <fs.h> +#include <part.h> +#include <sandboxblockdev.h> +#include <asm/errno.h>  static int do_sandbox_load(cmd_tbl_t *cmdtp, int flag, int argc,  			   char * const argv[]) @@ -25,10 +28,69 @@ static int do_sandbox_save(cmd_tbl_t *cmdtp, int flag, int argc,  	return do_save(cmdtp, flag, argc, argv, FS_TYPE_SANDBOX);  } +static int do_sandbox_bind(cmd_tbl_t *cmdtp, int flag, int argc, +			   char * const argv[]) +{ +	if (argc < 2 || argc > 3) +		return CMD_RET_USAGE; +	char *ep; +	char *dev_str = argv[1]; +	char *file = argc >= 3 ? argv[2] : NULL; +	int dev = simple_strtoul(dev_str, &ep, 16); +	if (*ep) { +		printf("** Bad device specification %s **\n", dev_str); +		return CMD_RET_USAGE; +	} +	return host_dev_bind(dev, file); +} + +static int do_sandbox_info(cmd_tbl_t *cmdtp, int flag, int argc, +			   char * const argv[]) +{ +	if (argc < 1 || argc > 2) +		return CMD_RET_USAGE; +	int min_dev = 0; +	int max_dev = CONFIG_HOST_MAX_DEVICES - 1; +	if (argc >= 2) { +		char *ep; +		char *dev_str = argv[1]; +		int dev = simple_strtoul(dev_str, &ep, 16); +		if (*ep) { +			printf("** Bad device specification %s **\n", dev_str); +			return CMD_RET_USAGE; +		} +		min_dev = dev; +		max_dev = dev; +	} +	int dev; +	printf("%3s %12s %s\n", "dev", "blocks", "path"); +	for (dev = min_dev; dev <= max_dev; dev++) { +		block_dev_desc_t *blk_dev; +		int ret; + +		printf("%3d ", dev); +		ret = host_get_dev_err(dev, &blk_dev); +		if (ret) { +			if (ret == -ENOENT) +				puts("Not bound to a backing file\n"); +			else if (ret == -ENODEV) +				puts("Invalid host device number\n"); + +			continue; +		} +		struct host_block_dev *host_dev = blk_dev->priv; +		printf("%12lu %s\n", (unsigned long)blk_dev->lba, +		       host_dev->filename); +	} +	return 0; +} +  static cmd_tbl_t cmd_sandbox_sub[] = {  	U_BOOT_CMD_MKENT(load, 7, 0, do_sandbox_load, "", ""),  	U_BOOT_CMD_MKENT(ls, 3, 0, do_sandbox_ls, "", ""),  	U_BOOT_CMD_MKENT(save, 6, 0, do_sandbox_save, "", ""), +	U_BOOT_CMD_MKENT(bind, 3, 0, do_sandbox_bind, "", ""), +	U_BOOT_CMD_MKENT(info, 3, 0, do_sandbox_info, "", ""),  };  static int do_sandbox(cmd_tbl_t *cmdtp, int flag, int argc, @@ -57,4 +119,6 @@ U_BOOT_CMD(  	"sb ls host <filename>                      - list files on host\n"  	"sb save host <dev> <filename> <addr> <bytes> [<offset>] - "  		"save a file to host\n" +	"sb bind <dev> [<filename>] - bind \"host\" device to file\n" +	"sb info [<dev>]            - show device binding & info"  ); diff --git a/common/console.c b/common/console.c index cc55068c7..2dfb78888 100644 --- a/common/console.c +++ b/common/console.c @@ -8,6 +8,7 @@  #include <common.h>  #include <stdarg.h>  #include <malloc.h> +#include <os.h>  #include <serial.h>  #include <stdio_dev.h>  #include <exports.h> @@ -415,6 +416,12 @@ static inline void print_pre_console_buffer(void) {}  void putc(const char c)  { +#ifdef CONFIG_SANDBOX +	if (!gd) { +		os_putc(c); +		return; +	} +#endif  #ifdef CONFIG_SILENT_CONSOLE  	if (gd->flags & GD_FLG_SILENT)  		return; @@ -439,6 +446,13 @@ void putc(const char c)  void puts(const char *s)  { +#ifdef CONFIG_SANDBOX +	if (!gd) { +		os_puts(s); +		return; +	} +#endif +  #ifdef CONFIG_SILENT_CONSOLE  	if (gd->flags & GD_FLG_SILENT)  		return; @@ -467,7 +481,7 @@ int printf(const char *fmt, ...)  	uint i;  	char printbuffer[CONFIG_SYS_PBSIZE]; -#ifndef CONFIG_PRE_CONSOLE_BUFFER +#if !defined(CONFIG_SANDBOX) && !defined(CONFIG_PRE_CONSOLE_BUFFER)  	if (!gd->have_console)  		return 0;  #endif diff --git a/common/fdt_support.c b/common/fdt_support.c index 1f0d8f5fe..b9dce9946 100644 --- a/common/fdt_support.c +++ b/common/fdt_support.c @@ -21,6 +21,34 @@   */  DECLARE_GLOBAL_DATA_PTR; +/* + * Get cells len in bytes + *     if #NNNN-cells property is 2 then len is 8 + *     otherwise len is 4 + */ +static int get_cells_len(void *blob, char *nr_cells_name) +{ +	const fdt32_t *cell; + +	cell = fdt_getprop(blob, 0, nr_cells_name, NULL); +	if (cell && fdt32_to_cpu(*cell) == 2) +		return 8; + +	return 4; +} + +/* + * Write a 4 or 8 byte big endian cell + */ +static void write_cell(u8 *addr, u64 val, int size) +{ +	int shift = (size - 1) * 8; +	while (size-- > 0) { +		*addr++ = (val >> shift) & 0xff; +		shift -= 8; +	} +} +  /**   * fdt_getprop_u32_default - Find a node and return it's property or a default   * @@ -131,9 +159,9 @@ static int fdt_fixup_stdout(void *fdt, int chosenoff)  int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)  { -	int   nodeoffset; +	int   nodeoffset, addr_cell_len;  	int   err, j, total; -	fdt32_t  tmp; +	fdt64_t  tmp;  	const char *path;  	uint64_t addr, size; @@ -170,9 +198,11 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)  		return err;  	} +	addr_cell_len = get_cells_len(fdt, "#address-cells"); +  	path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL);  	if ((path == NULL) || force) { -		tmp = cpu_to_fdt32(initrd_start); +		write_cell((u8 *)&tmp, initrd_start, addr_cell_len);  		err = fdt_setprop(fdt, nodeoffset,  			"linux,initrd-start", &tmp, sizeof(tmp));  		if (err < 0) { @@ -181,7 +211,7 @@ int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)  				fdt_strerror(err));  			return err;  		} -		tmp = cpu_to_fdt32(initrd_end); +		write_cell((u8 *)&tmp, initrd_end, addr_cell_len);  		err = fdt_setprop(fdt, nodeoffset,  			"linux,initrd-end", &tmp, sizeof(tmp));  		if (err < 0) { @@ -343,34 +373,6 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat,  	do_fixup_by_compat(fdt, compat, prop, &tmp, 4, create);  } -/* - * Get cells len in bytes - *     if #NNNN-cells property is 2 then len is 8 - *     otherwise len is 4 - */ -static int get_cells_len(void *blob, char *nr_cells_name) -{ -	const fdt32_t *cell; - -	cell = fdt_getprop(blob, 0, nr_cells_name, NULL); -	if (cell && fdt32_to_cpu(*cell) == 2) -		return 8; - -	return 4; -} - -/* - * Write a 4 or 8 byte big endian cell - */ -static void write_cell(u8 *addr, u64 val, int size) -{ -	int shift = (size - 1) * 8; -	while (size-- > 0) { -		*addr++ = (val >> shift) & 0xff; -		shift -= 8; -	} -} -  #ifdef CONFIG_NR_DRAM_BANKS  #define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS  #else @@ -400,10 +402,11 @@ int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)  	nodeoffset = fdt_path_offset(blob, "/memory");  	if (nodeoffset < 0) {  		nodeoffset = fdt_add_subnode(blob, 0, "memory"); -		if (nodeoffset < 0) +		if (nodeoffset < 0) {  			printf("WARNING: could not create /memory: %s.\n",  					fdt_strerror(nodeoffset)); -		return nodeoffset; +			return nodeoffset; +		}  	}  	err = fdt_setprop(blob, nodeoffset, "device_type", "memory",  			sizeof("memory")); diff --git a/common/image.c b/common/image.c index b0ae58ff3..41453540f 100644 --- a/common/image.c +++ b/common/image.c @@ -81,6 +81,7 @@ static const table_entry_t uimage_arch[] = {  	{	IH_ARCH_NDS32,		"nds32",	"NDS32",	},  	{	IH_ARCH_OPENRISC,	"or1k",		"OpenRISC 1000",},  	{	IH_ARCH_SANDBOX,	"sandbox",	"Sandbox",	}, +	{	IH_ARCH_ARM64,		"arm64",	"AArch64",	},  	{	-1,			"",		"",		},  }; |