diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/Makefile | 1 | ||||
| -rw-r--r-- | common/cmd_bdinfo.c | 5 | ||||
| -rw-r--r-- | common/cmd_fpga.c | 250 | ||||
| -rw-r--r-- | common/cmd_fuse.c | 168 | ||||
| -rw-r--r-- | common/cmd_mem.c | 2 | ||||
| -rw-r--r-- | common/spl/spl.c | 10 | 
6 files changed, 255 insertions, 181 deletions
| diff --git a/common/Makefile b/common/Makefile index f50bf2ea9..3ba431626 100644 --- a/common/Makefile +++ b/common/Makefile @@ -111,6 +111,7 @@ ifdef CONFIG_FPGA  COBJS-$(CONFIG_CMD_FPGA) += cmd_fpga.o  endif  COBJS-$(CONFIG_CMD_FS_GENERIC) += cmd_fs.o +COBJS-$(CONFIG_CMD_FUSE) += cmd_fuse.o  COBJS-$(CONFIG_CMD_GETTIME) += cmd_gettime.o  COBJS-$(CONFIG_CMD_GPIO) += cmd_gpio.o  COBJS-$(CONFIG_CMD_I2C) += cmd_i2c.o diff --git a/common/cmd_bdinfo.c b/common/cmd_bdinfo.c index 78e0bf6a3..17dc96179 100644 --- a/common/cmd_bdinfo.c +++ b/common/cmd_bdinfo.c @@ -84,6 +84,10 @@ static void print_mhz(const char *name, unsigned long hz)  }  #if defined(CONFIG_PPC) +void __weak board_detail(void) +{ +	/* Please define boot_detail() for your platform */ +}  int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  { @@ -162,6 +166,7 @@ int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  	printf("IP addr     = %s\n", getenv("ipaddr"));  	printf("baudrate    = %6u bps\n", bd->bi_baudrate);  	print_num("relocaddr", gd->relocaddr); +	board_detail();  	return 0;  } diff --git a/common/cmd_fpga.c b/common/cmd_fpga.c index 1341604c5..3cd1b13b3 100644 --- a/common/cmd_fpga.c +++ b/common/cmd_fpga.c @@ -27,14 +27,11 @@   */  #include <common.h>  #include <command.h> -#if defined(CONFIG_CMD_NET) -#include <net.h> -#endif  #include <fpga.h>  #include <malloc.h>  /* Local functions */ -static int fpga_get_op (char *opstr); +static int fpga_get_op(char *opstr);  /* Local defines */  #define FPGA_NONE   -1 @@ -44,102 +41,6 @@ static int fpga_get_op (char *opstr);  #define FPGA_DUMP   3  #define FPGA_LOADMK 4 -/* Convert bitstream data and load into the fpga */ -int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size) -{ -#if defined(CONFIG_FPGA_XILINX) -	unsigned int length; -	unsigned int swapsize; -	char buffer[80]; -	unsigned char *dataptr; -	unsigned int i; -	int rc; - -	dataptr = (unsigned char *)fpgadata; - -	/* skip the first bytes of the bitsteam, their meaning is unknown */ -	length = (*dataptr << 8) + *(dataptr+1); -	dataptr+=2; -	dataptr+=length; - -	/* get design name (identifier, length, string) */ -	length = (*dataptr << 8) + *(dataptr+1); -	dataptr+=2; -	if (*dataptr++ != 0x61) { -		debug("%s: Design name identifier not recognized " -			"in bitstream\n", -			__func__); -		return FPGA_FAIL; -	} - -	length = (*dataptr << 8) + *(dataptr+1); -	dataptr+=2; -	for(i=0;i<length;i++) -		buffer[i] = *dataptr++; - -	printf("  design filename = \"%s\"\n", buffer); - -	/* get part number (identifier, length, string) */ -	if (*dataptr++ != 0x62) { -		printf("%s: Part number identifier not recognized " -			"in bitstream\n", -			__func__); -		return FPGA_FAIL; -	} - -	length = (*dataptr << 8) + *(dataptr+1); -	dataptr+=2; -	for(i=0;i<length;i++) -		buffer[i] = *dataptr++; -	printf("  part number = \"%s\"\n", buffer); - -	/* get date (identifier, length, string) */ -	if (*dataptr++ != 0x63) { -		printf("%s: Date identifier not recognized in bitstream\n", -		       __func__); -		return FPGA_FAIL; -	} - -	length = (*dataptr << 8) + *(dataptr+1); -	dataptr+=2; -	for(i=0;i<length;i++) -		buffer[i] = *dataptr++; -	printf("  date = \"%s\"\n", buffer); - -	/* get time (identifier, length, string) */ -	if (*dataptr++ != 0x64) { -		printf("%s: Time identifier not recognized in bitstream\n", -			__func__); -		return FPGA_FAIL; -	} - -	length = (*dataptr << 8) + *(dataptr+1); -	dataptr+=2; -	for(i=0;i<length;i++) -		buffer[i] = *dataptr++; -	printf("  time = \"%s\"\n", buffer); - -	/* get fpga data length (identifier, length) */ -	if (*dataptr++ != 0x65) { -		printf("%s: Data length identifier not recognized in bitstream\n", -			__func__); -		return FPGA_FAIL; -	} -	swapsize = ((unsigned int) *dataptr     <<24) + -	           ((unsigned int) *(dataptr+1) <<16) + -	           ((unsigned int) *(dataptr+2) <<8 ) + -	           ((unsigned int) *(dataptr+3)     ) ; -	dataptr+=4; -	printf("  bytes in bitstream = %d\n", swapsize); - -	rc = fpga_load(dev, dataptr, swapsize); -	return rc; -#else -	printf("Bitstream support only for Xilinx devices\n"); -	return FPGA_FAIL; -#endif -} -  /* ------------------------------------------------------------------------- */  /* command form:   *   fpga <op> <device number> <data addr> <datasize> @@ -148,81 +49,81 @@ int fpga_loadbitstream(unsigned long dev, char* fpgadata, size_t size)   * If there is no data addr field, the fpgadata environment variable is used.   * The info command requires no data address field.   */ -int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) +int do_fpga(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])  {  	int op, dev = FPGA_INVALID_DEVICE;  	size_t data_size = 0;  	void *fpga_data = NULL; -	char *devstr = getenv ("fpga"); -	char *datastr = getenv ("fpgadata"); +	char *devstr = getenv("fpga"); +	char *datastr = getenv("fpgadata");  	int rc = FPGA_FAIL;  	int wrong_parms = 0; -#if defined (CONFIG_FIT) +#if defined(CONFIG_FIT)  	const char *fit_uname = NULL;  	ulong fit_addr;  #endif  	if (devstr) -		dev = (int) simple_strtoul (devstr, NULL, 16); +		dev = (int) simple_strtoul(devstr, NULL, 16);  	if (datastr) -		fpga_data = (void *) simple_strtoul (datastr, NULL, 16); +		fpga_data = (void *)simple_strtoul(datastr, NULL, 16);  	switch (argc) {  	case 5:		/* fpga <op> <dev> <data> <datasize> */ -		data_size = simple_strtoul (argv[4], NULL, 16); +		data_size = simple_strtoul(argv[4], NULL, 16);  	case 4:		/* fpga <op> <dev> <data> */  #if defined(CONFIG_FIT) -		if (fit_parse_subimage (argv[3], (ulong)fpga_data, -					&fit_addr, &fit_uname)) { +		if (fit_parse_subimage(argv[3], (ulong)fpga_data, +				       &fit_addr, &fit_uname)) {  			fpga_data = (void *)fit_addr; -			debug("*  fpga: subimage '%s' from FIT image " -				"at 0x%08lx\n", -				fit_uname, fit_addr); +			debug("*  fpga: subimage '%s' from FIT image ", +			      fit_uname); +			debug("at 0x%08lx\n", fit_addr);  		} else  #endif  		{ -			fpga_data = (void *) simple_strtoul (argv[3], NULL, 16); +			fpga_data = (void *)simple_strtoul(argv[3], NULL, 16);  			debug("*  fpga: cmdline image address = 0x%08lx\n", -				(ulong)fpga_data); +			      (ulong)fpga_data);  		} -		debug("%s: fpga_data = 0x%x\n", __func__, (uint) fpga_data); +		debug("%s: fpga_data = 0x%x\n", __func__, (uint)fpga_data);  	case 3:		/* fpga <op> <dev | data addr> */ -		dev = (int) simple_strtoul (argv[2], NULL, 16); +		dev = (int)simple_strtoul(argv[2], NULL, 16);  		debug("%s: device = %d\n", __func__, dev);  		/* FIXME - this is a really weak test */ -		if ((argc == 3) && (dev > fpga_count ())) {	/* must be buffer ptr */ +		if ((argc == 3) && (dev > fpga_count())) { +			/* must be buffer ptr */  			debug("%s: Assuming buffer pointer in arg 3\n", -				__func__); +			      __func__);  #if defined(CONFIG_FIT) -			if (fit_parse_subimage (argv[2], (ulong)fpga_data, -						&fit_addr, &fit_uname)) { +			if (fit_parse_subimage(argv[2], (ulong)fpga_data, +					       &fit_addr, &fit_uname)) {  				fpga_data = (void *)fit_addr; -				debug("*  fpga: subimage '%s' from FIT image " -					"at 0x%08lx\n", -					fit_uname, fit_addr); +				debug("*  fpga: subimage '%s' from FIT image ", +				      fit_uname); +				debug("at 0x%08lx\n", fit_addr);  			} else  #endif  			{ -				fpga_data = (void *) dev; -				debug("*  fpga: cmdline image address = " -					"0x%08lx\n", (ulong)fpga_data); +				fpga_data = (void *)dev; +				debug("*  fpga: cmdline image addr = 0x%08lx\n", +				      (ulong)fpga_data);  			}  			debug("%s: fpga_data = 0x%x\n", -				__func__, (uint) fpga_data); +			      __func__, (uint)fpga_data);  			dev = FPGA_INVALID_DEVICE;	/* reset device num */  		}  	case 2:		/* fpga <op> */ -		op = (int) fpga_get_op (argv[1]); +		op = (int)fpga_get_op(argv[1]);  		break;  	default: -		debug("%s: Too many or too few args (%d)\n", -			__func__, argc); +		debug("%s: Too many or too few args (%d)\n", __func__, argc);  		op = FPGA_NONE;	/* force usage display */  		break;  	} @@ -258,11 +159,11 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])  		return CMD_RET_USAGE;  	case FPGA_INFO: -		rc = fpga_info (dev); +		rc = fpga_info(dev);  		break;  	case FPGA_LOAD: -		rc = fpga_load (dev, fpga_data, data_size); +		rc = fpga_load(dev, fpga_data, data_size);  		break;  	case FPGA_LOADB: @@ -270,15 +171,16 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])  		break;  	case FPGA_LOADMK: -		switch (genimg_get_format (fpga_data)) { +		switch (genimg_get_format(fpga_data)) {  		case IMAGE_FORMAT_LEGACY:  			{ -				image_header_t *hdr = (image_header_t *)fpga_data; -				ulong	data; +				image_header_t *hdr = +						(image_header_t *)fpga_data; +				ulong data; -				data = (ulong)image_get_data (hdr); -				data_size = image_get_data_size (hdr); -				rc = fpga_load (dev, (void *)data, data_size); +				data = (ulong)image_get_data(hdr); +				data_size = image_get_data_size(hdr); +				rc = fpga_load(dev, (void *)data, data_size);  			}  			break;  #if defined(CONFIG_FIT) @@ -289,19 +191,21 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])  				const void *fit_data;  				if (fit_uname == NULL) { -					puts ("No FIT subimage unit name\n"); +					puts("No FIT subimage unit name\n");  					return 1;  				} -				if (!fit_check_format (fit_hdr)) { -					puts ("Bad FIT image format\n"); +				if (!fit_check_format(fit_hdr)) { +					puts("Bad FIT image format\n");  					return 1;  				}  				/* get fpga component image node offset */ -				noffset = fit_image_get_node (fit_hdr, fit_uname); +				noffset = fit_image_get_node(fit_hdr, +							     fit_uname);  				if (noffset < 0) { -					printf ("Can't find '%s' FIT subimage\n", fit_uname); +					printf("Can't find '%s' FIT subimage\n", +					       fit_uname);  					return 1;  				} @@ -312,72 +216,72 @@ int do_fpga (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])  				}  				/* get fpga subimage data address and length */ -				if (fit_image_get_data (fit_hdr, noffset, &fit_data, &data_size)) { -					puts ("Could not find fpga subimage data\n"); +				if (fit_image_get_data(fit_hdr, noffset, +						       &fit_data, &data_size)) { +					puts("Fpga subimage data not found\n");  					return 1;  				} -				rc = fpga_load (dev, fit_data, data_size); +				rc = fpga_load(dev, fit_data, data_size);  			}  			break;  #endif  		default: -			puts ("** Unknown image type\n"); +			puts("** Unknown image type\n");  			rc = FPGA_FAIL;  			break;  		}  		break;  	case FPGA_DUMP: -		rc = fpga_dump (dev, fpga_data, data_size); +		rc = fpga_dump(dev, fpga_data, data_size);  		break;  	default: -		printf ("Unknown operation\n"); +		printf("Unknown operation\n");  		return CMD_RET_USAGE;  	} -	return (rc); +	return rc;  }  /*   * Map op to supported operations.  We don't use a table since we   * would just have to relocate it from flash anyway.   */ -static int fpga_get_op (char *opstr) +static int fpga_get_op(char *opstr)  {  	int op = FPGA_NONE; -	if (!strcmp ("info", opstr)) { +	if (!strcmp("info", opstr))  		op = FPGA_INFO; -	} else if (!strcmp ("loadb", opstr)) { +	else if (!strcmp("loadb", opstr))  		op = FPGA_LOADB; -	} else if (!strcmp ("load", opstr)) { +	else if (!strcmp("load", opstr))  		op = FPGA_LOAD; -	} else if (!strcmp ("loadmk", opstr)) { +	else if (!strcmp("loadmk", opstr))  		op = FPGA_LOADMK; -	} else if (!strcmp ("dump", opstr)) { +	else if (!strcmp("dump", opstr))  		op = FPGA_DUMP; -	} -	if (op == FPGA_NONE) { -		printf ("Unknown fpga operation \"%s\"\n", opstr); -	} +	if (op == FPGA_NONE) +		printf("Unknown fpga operation \"%s\"\n", opstr); +  	return op;  } -U_BOOT_CMD (fpga, 6, 1, do_fpga, -	"loadable FPGA image support", -	"[operation type] [device number] [image address] [image size]\n" -	"fpga operations:\n" -	"  dump\t[dev]\t\t\tLoad device to memory buffer\n" -	"  info\t[dev]\t\t\tlist known device information\n" -	"  load\t[dev] [address] [size]\tLoad device from memory buffer\n" -	"  loadb\t[dev] [address] [size]\t" -	"Load device from bitstream buffer (Xilinx only)\n" -	"  loadmk [dev] [address]\tLoad device generated with mkimage" +U_BOOT_CMD(fpga, 6, 1, do_fpga, +	   "loadable FPGA image support", +	   "[operation type] [device number] [image address] [image size]\n" +	   "fpga operations:\n" +	   "  dump\t[dev]\t\t\tLoad device to memory buffer\n" +	   "  info\t[dev]\t\t\tlist known device information\n" +	   "  load\t[dev] [address] [size]\tLoad device from memory buffer\n" +	   "  loadb\t[dev] [address] [size]\t" +	   "Load device from bitstream buffer (Xilinx only)\n" +	   "  loadmk [dev] [address]\tLoad device generated with mkimage"  #if defined(CONFIG_FIT) -	"\n" -	"\tFor loadmk operating on FIT format uImage address must include\n" -	"\tsubimage unit name in the form of addr:<subimg_uname>" +	   "\n" +	   "\tFor loadmk operating on FIT format uImage address must include\n" +	   "\tsubimage unit name in the form of addr:<subimg_uname>"  #endif  ); diff --git a/common/cmd_fuse.c b/common/cmd_fuse.c new file mode 100644 index 000000000..f24c01c2d --- /dev/null +++ b/common/cmd_fuse.c @@ -0,0 +1,168 @@ +/* + * (C) Copyright 2009-2013 ADVANSEE + * Benoît Thébaudeau <benoit.thebaudeau@advansee.com> + * + * Based on the mpc512x iim code: + * Copyright 2008 Silicon Turnkey Express, Inc. + * Martha Marx <mmarx@silicontkx.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <command.h> +#include <fuse.h> +#include <asm/errno.h> + +static int strtou32(const char *str, unsigned int base, u32 *result) +{ +	char *ep; + +	*result = simple_strtoul(str, &ep, base); +	if (ep == str || *ep != '\0') +		return -EINVAL; + +	return 0; +} + +static int confirm_prog(void) +{ +	puts("Warning: Programming fuses is an irreversible operation!\n" +			"         This may brick your system.\n" +			"         Use this command only if you are sure of " +					"what you are doing!\n" +			"\nReally perform this fuse programming? <y/N>\n"); + +	if (getc() == 'y') { +		int c; + +		putc('y'); +		c = getc(); +		putc('\n'); +		if (c == '\r') +			return 1; +	} + +	puts("Fuse programming aborted\n"); +	return 0; +} + +static int do_fuse(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) +{ +	const char *op = argc >= 2 ? argv[1] : NULL; +	int confirmed = argc >= 3 && !strcmp(argv[2], "-y"); +	u32 bank, word, cnt, val; +	int ret, i; + +	argc -= 2 + confirmed; +	argv += 2 + confirmed; + +	if (argc < 2 || strtou32(argv[0], 0, &bank) || +			strtou32(argv[1], 0, &word)) +		return CMD_RET_USAGE; + +	if (!strcmp(op, "read")) { +		if (argc == 2) +			cnt = 1; +		else if (argc != 3 || strtou32(argv[2], 0, &cnt)) +			return CMD_RET_USAGE; + +		printf("Reading bank %u:\n", bank); +		for (i = 0; i < cnt; i++, word++) { +			if (!(i % 4)) +				printf("\nWord 0x%.8x:", word); + +			ret = fuse_read(bank, word, &val); +			if (ret) +				goto err; + +			printf(" %.8x", val); +		} +		putc('\n'); +	} else if (!strcmp(op, "sense")) { +		if (argc == 2) +			cnt = 1; +		else if (argc != 3 || strtou32(argv[2], 0, &cnt)) +			return CMD_RET_USAGE; + +		printf("Sensing bank %u:\n", bank); +		for (i = 0; i < cnt; i++, word++) { +			if (!(i % 4)) +				printf("\nWord 0x%.8x:", word); + +			ret = fuse_sense(bank, word, &val); +			if (ret) +				goto err; + +			printf(" %.8x", val); +		} +		putc('\n'); +	} else if (!strcmp(op, "prog")) { +		if (argc < 3) +			return CMD_RET_USAGE; + +		for (i = 2; i < argc; i++, word++) { +			if (strtou32(argv[i], 16, &val)) +				return CMD_RET_USAGE; + +			printf("Programming bank %u word 0x%.8x to 0x%.8x...\n", +					bank, word, val); +			if (!confirmed && !confirm_prog()) +				return CMD_RET_FAILURE; +			ret = fuse_prog(bank, word, val); +			if (ret) +				goto err; +		} +	} else if (!strcmp(op, "override")) { +		if (argc < 3) +			return CMD_RET_USAGE; + +		for (i = 2; i < argc; i++, word++) { +			if (strtou32(argv[i], 16, &val)) +				return CMD_RET_USAGE; + +			printf("Overriding bank %u word 0x%.8x with " +					"0x%.8x...\n", bank, word, val); +			ret = fuse_override(bank, word, val); +			if (ret) +				goto err; +		} +	} else { +		return CMD_RET_USAGE; +	} + +	return 0; + +err: +	puts("ERROR\n"); +	return ret; +} + +U_BOOT_CMD( +	fuse, CONFIG_SYS_MAXARGS, 0, do_fuse, +	"Fuse sub-system", +	     "read <bank> <word> [<cnt>] - read 1 or 'cnt' fuse words,\n" +	"    starting at 'word'\n" +	"fuse sense <bank> <word> [<cnt>] - sense 1 or 'cnt' fuse words,\n" +	"    starting at 'word'\n" +	"fuse prog [-y] <bank> <word> <hexval> [<hexval>...] - program 1 or\n" +	"    several fuse words, starting at 'word' (PERMANENT)\n" +	"fuse override <bank> <word> <hexval> [<hexval>...] - override 1 or\n" +	"    several fuse words, starting at 'word'" +); diff --git a/common/cmd_mem.c b/common/cmd_mem.c index 64dd76a0f..6df00b15d 100644 --- a/common/cmd_mem.c +++ b/common/cmd_mem.c @@ -445,7 +445,7 @@ static int do_mem_cp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  #endif  	bytes = size * count; -	buf = map_sysmem(addr, bytes); +	buf = map_sysmem(dest, bytes);  	src = map_sysmem(addr, bytes);  	while (count-- > 0) {  		if (size == 4) diff --git a/common/spl/spl.c b/common/spl/spl.c index 7ce2d5f21..628c3990f 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -118,17 +118,13 @@ void spl_parse_image_header(const struct image_header *header)  __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)  { -	typedef void __noreturn (*image_entry_noargs_t)(u32 *); +	typedef void __noreturn (*image_entry_noargs_t)(void); +  	image_entry_noargs_t image_entry =  			(image_entry_noargs_t) spl_image->entry_point;  	debug("image entry point: 0x%X\n", spl_image->entry_point); -	/* Pass the saved boot_params from rom code */ -#if defined(CONFIG_VIRTIO) || defined(CONFIG_ZEBU) -	image_entry = (image_entry_noargs_t)0x80100000; -#endif -	u32 boot_params_ptr_addr = (u32)&boot_params_ptr; -	image_entry((u32 *)boot_params_ptr_addr); +	image_entry();  }  #ifdef CONFIG_SPL_RAM_DEVICE |