diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/cmd_bootm.c | 167 | ||||
| -rw-r--r-- | common/cmd_nand.c | 2 | ||||
| -rw-r--r-- | common/cmd_spl.c | 12 | ||||
| -rw-r--r-- | common/env_nand.c | 18 | 
4 files changed, 185 insertions, 14 deletions
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c index f0338babe..1312a0db8 100644 --- a/common/cmd_bootm.c +++ b/common/cmd_bootm.c @@ -79,9 +79,15 @@ static int image_info(unsigned long addr);  #include <flash.h>  #include <mtd/cfi_flash.h>  extern flash_info_t flash_info[]; /* info for FLASH chips */ +#endif + +#if defined(CONFIG_CMD_IMLS) || defined(CONFIG_CMD_IMLS_NAND)  static int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);  #endif +#include <linux/err.h> +#include <nand.h> +  #ifdef CONFIG_SILENT_CONSOLE  static void fixup_silent_linux(void);  #endif @@ -1192,7 +1198,7 @@ U_BOOT_CMD(  /* imls - list all images found in flash */  /*******************************************************************/  #if defined(CONFIG_CMD_IMLS) -static int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +static int do_imls_nor(void)  {  	flash_info_t *info;  	int i, j; @@ -1241,6 +1247,161 @@ next_sector:		;  		}  next_bank:	;  	} +	return 0; +} +#endif + +#if defined(CONFIG_CMD_IMLS_NAND) +static int nand_imls_legacyimage(nand_info_t *nand, int nand_dev, loff_t off, +		size_t len) +{ +	void *imgdata; +	int ret; + +	imgdata = malloc(len); +	if (!imgdata) { +		printf("May be a Legacy Image at NAND device %d offset %08llX:\n", +				nand_dev, off); +		printf("   Low memory(cannot allocate memory for image)\n"); +		return -ENOMEM; +	} + +	ret = nand_read_skip_bad(nand, off, &len, +			imgdata); +	if (ret < 0 && ret != -EUCLEAN) { +		free(imgdata); +		return ret; +	} + +	if (!image_check_hcrc(imgdata)) { +		free(imgdata); +		return 0; +	} + +	printf("Legacy Image at NAND device %d offset %08llX:\n", +			nand_dev, off); +	image_print_contents(imgdata); + +	puts("   Verifying Checksum ... "); +	if (!image_check_dcrc(imgdata)) +		puts("Bad Data CRC\n"); +	else +		puts("OK\n"); + +	free(imgdata); + +	return 0; +} + +static int nand_imls_fitimage(nand_info_t *nand, int nand_dev, loff_t off, +		size_t len) +{ +	void *imgdata; +	int ret; + +	imgdata = malloc(len); +	if (!imgdata) { +		printf("May be a FIT Image at NAND device %d offset %08llX:\n", +				nand_dev, off); +		printf("   Low memory(cannot allocate memory for image)\n"); +		return -ENOMEM; +	} + +	ret = nand_read_skip_bad(nand, off, &len, +			imgdata); +	if (ret < 0 && ret != -EUCLEAN) { +		free(imgdata); +		return ret; +	} + +	if (!fit_check_format(imgdata)) { +		free(imgdata); +		return 0; +	} + +	printf("FIT Image at NAND device %d offset %08llX:\n", nand_dev, off); + +	fit_print_contents(imgdata); +	free(imgdata); + +	return 0; +} + +static int do_imls_nand(void) +{ +	nand_info_t *nand; +	int nand_dev = nand_curr_device; +	size_t len; +	loff_t off; +	u32 buffer[16]; + +	if (nand_dev < 0 || nand_dev >= CONFIG_SYS_MAX_NAND_DEVICE) { +		puts("\nNo NAND devices available\n"); +		return -ENODEV; +	} + +	printf("\n"); + +	for (nand_dev = 0; nand_dev < CONFIG_SYS_MAX_NAND_DEVICE; nand_dev++) { +		nand = &nand_info[nand_dev]; +		if (!nand->name || !nand->size) +			continue; + +		for (off = 0; off < nand->size; off += nand->erasesize) { +			const image_header_t *header; +			int ret; + +			if (nand_block_isbad(nand, off)) +				continue; + +			len = sizeof(buffer); + +			ret = nand_read(nand, off, &len, (u8 *)buffer); +			if (ret < 0 && ret != -EUCLEAN) { +				printf("NAND read error %d at offset %08llX\n", +						ret, off); +				continue; +			} + +			switch (genimg_get_format(buffer)) { +			case IMAGE_FORMAT_LEGACY: +				header = (const image_header_t *)buffer; + +				len = image_get_image_size(header); +				nand_imls_legacyimage(nand, nand_dev, off, len); +				break; +#if defined(CONFIG_FIT) +			case IMAGE_FORMAT_FIT: +				len = fit_get_size(buffer); +				nand_imls_fitimage(nand, nand_dev, off, len); +				break; +#endif +			} +		} +	} + +	return 0; +} +#endif + +#if defined(CONFIG_CMD_IMLS) || defined(CONFIG_CMD_IMLS_NAND) +static int do_imls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ +	int ret_nor = 0, ret_nand = 0; + +#if defined(CONFIG_CMD_IMLS) +	ret_nor = do_imls_nor(); +#endif + +#if defined(CONFIG_CMD_IMLS_NAND) +	ret_nand = do_imls_nand(); +#endif + +	if (ret_nor) +		return ret_nor; + +	if (ret_nand) +		return ret_nand;  	return (0);  } @@ -1249,8 +1410,8 @@ U_BOOT_CMD(  	imls,	1,		1,	do_imls,  	"list all images found in flash",  	"\n" -	"    - Prints information about all images found at sector\n" -	"      boundaries in flash." +	"    - Prints information about all images found at sector/block\n" +	"      boundaries in nor/nand flash."  );  #endif diff --git a/common/cmd_nand.c b/common/cmd_nand.c index 1568594ca..495610c40 100644 --- a/common/cmd_nand.c +++ b/common/cmd_nand.c @@ -608,7 +608,7 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  		size_t rwsize;  		ulong pagecount = 1;  		int read; -		int raw; +		int raw = 0;  		if (argc < 4)  			goto usage; diff --git a/common/cmd_spl.c b/common/cmd_spl.c index e3c543b46..94b0a1715 100644 --- a/common/cmd_spl.c +++ b/common/cmd_spl.c @@ -184,7 +184,11 @@ static int do_spl(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  U_BOOT_CMD(  	spl, 6 , 1, do_spl, "SPL configuration", -	"export <img=atags|fdt> [kernel_addr] [initrd_addr] " -	"[fdt_addr if <img> = fdt] - export a kernel parameter image\n" -	"\t initrd_img can be set to \"-\" if fdt_addr without initrd img is" -	"used"); +	"export <img=atags|fdt> [kernel_addr] [initrd_addr] [fdt_addr]\n" +	"\timg\t\t\"atags\" or \"fdt\"\n" +	"\tkernel_addr\taddress where a kernel image is stored.\n" +	"\t\t\tkernel is loaded as part of the boot process, but it is not started.\n" +	"\tinitrd_addr\taddress of initial ramdisk\n" +	"\t\t\tcan be set to \"-\" if fdt_addr without initrd_addr is used.\n" +	"\tfdt_addr\tin case of fdt, the address of the device tree.\n" +	); diff --git a/common/env_nand.c b/common/env_nand.c index 22e72a20b..5b69889c0 100644 --- a/common/env_nand.c +++ b/common/env_nand.c @@ -331,6 +331,7 @@ int get_nand_env_oob(nand_info_t *nand, unsigned long *result)  void env_relocate_spec(void)  {  #if !defined(ENV_IS_EMBEDDED) +	int read1_fail = 0, read2_fail = 0;  	int crc1_ok = 0, crc2_ok = 0;  	env_t *ep, *tmp_env1, *tmp_env2; @@ -342,14 +343,19 @@ void env_relocate_spec(void)  		goto done;  	} -	if (readenv(CONFIG_ENV_OFFSET, (u_char *) tmp_env1)) -		puts("No Valid Environment Area found\n"); +	read1_fail = readenv(CONFIG_ENV_OFFSET, (u_char *) tmp_env1); +	read2_fail = readenv(CONFIG_ENV_OFFSET_REDUND, (u_char *) tmp_env2); -	if (readenv(CONFIG_ENV_OFFSET_REDUND, (u_char *) tmp_env2)) -		puts("No Valid Redundant Environment Area found\n"); +	if (read1_fail && read2_fail) +		puts("*** Error - No Valid Environment Area found\n"); +	else if (read1_fail || read2_fail) +		puts("*** Warning - some problems detected " +		     "reading environment; recovered successfully\n"); -	crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc; -	crc2_ok = crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc; +	crc1_ok = !read1_fail && +		(crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc); +	crc2_ok = !read2_fail && +		(crc32(0, tmp_env2->data, ENV_SIZE) == tmp_env2->crc);  	if (!crc1_ok && !crc2_ok) {  		set_default_env("!bad CRC");  |