diff options
Diffstat (limited to 'tools/imximage.c')
| -rw-r--r-- | tools/imximage.c | 41 | 
1 files changed, 38 insertions, 3 deletions
| diff --git a/tools/imximage.c b/tools/imximage.c index 26460bfec..3f2dc68eb 100644 --- a/tools/imximage.c +++ b/tools/imximage.c @@ -16,6 +16,8 @@  #include <image.h>  #include "imximage.h" +#define UNDEFINED 0xFFFFFFFF +  /*   * Supported commands for configuration file   */ @@ -23,6 +25,7 @@ static table_entry_t imximage_cmds[] = {  	{CMD_BOOT_FROM,         "BOOT_FROM",            "boot command",	  },  	{CMD_BOOT_OFFSET,       "BOOT_OFFSET",          "Boot offset",	  },  	{CMD_DATA,              "DATA",                 "Reg Write Data", }, +	{CMD_CSF,               "CSF",           "Command Sequence File", },  	{CMD_IMAGE_VERSION,     "IMAGE_VERSION",        "image version",  },  	{-1,                    "",                     "",	          },  }; @@ -66,8 +69,13 @@ static table_entry_t imximage_versions[] = {  static struct imx_header imximage_header;  static uint32_t imximage_version; -/* Image Vector Table Offset */ -static uint32_t imximage_ivt_offset; +/* + * Image Vector Table Offset + * Initialized to a wrong not 4-bytes aligned address to + * check if it is was set by the cfg file. + */ +static uint32_t imximage_ivt_offset = UNDEFINED; +static uint32_t imximage_csf_size = UNDEFINED;  /* Initial Load Region Size */  static uint32_t imximage_init_loadsize; @@ -76,6 +84,7 @@ static set_dcd_rst_t set_dcd_rst;  static set_imx_hdr_t set_imx_hdr;  static uint32_t max_dcd_entries;  static uint32_t *header_size_ptr; +static uint32_t *csf_ptr;  static uint32_t get_cfg_value(char *token, char *name,  int linenr)  { @@ -247,9 +256,10 @@ static void set_imx_hdr_v2(struct imx_header *imxhdr, uint32_t dcd_len,  			+ offsetof(imx_header_v2_t, boot_data);  	hdr_v2->boot_data.start = entry_point - imximage_init_loadsize; -	/* Security feature are not supported */  	fhdr_v2->csf = 0; +  	header_size_ptr = &hdr_v2->boot_data.size; +	csf_ptr = &fhdr_v2->csf;  }  static void set_hdr_func(struct imx_header *imxhdr) @@ -326,6 +336,13 @@ static void print_hdr_v2(struct imx_header *imx_hdr)  	genimg_print_size(hdr_v2->boot_data.size);  	printf("Load Address: %08x\n", (uint32_t)fhdr_v2->boot_data_ptr);  	printf("Entry Point:  %08x\n", (uint32_t)fhdr_v2->entry); +	if (fhdr_v2->csf && (imximage_ivt_offset != UNDEFINED) && +	    (imximage_csf_size != UNDEFINED)) { +		printf("HAB Blocks:   %08x %08x %08x\n", +		       (uint32_t)fhdr_v2->self, 0, +		       hdr_v2->boot_data.size - imximage_ivt_offset - +		       imximage_csf_size); +	}  }  static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token, @@ -386,6 +403,17 @@ static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,  		if (unlikely(cmd_ver_first != 1))  			cmd_ver_first = 0;  		break; +	case CMD_CSF: +		if (imximage_version != 2) { +			fprintf(stderr, +				"Error: %s[%d] - CSF only supported for VERSION 2(%s)\n", +				name, lineno, token); +			exit(EXIT_FAILURE); +		} +		imximage_csf_size = get_cfg_value(token, name, lineno); +		if (unlikely(cmd_ver_first != 1)) +			cmd_ver_first = 0; +		break;  	}  } @@ -537,6 +565,7 @@ static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,  	imximage_version = IMXIMAGE_V1;  	/* Be able to detect if the cfg file has no BOOT_FROM tag */  	imximage_ivt_offset = FLASH_OFFSET_UNDEFINED; +	imximage_csf_size = 0;  	set_hdr_func(imxhdr);  	/* Parse dcd configuration file */ @@ -555,6 +584,12 @@ static void imximage_set_header(void *ptr, struct stat *sbuf, int ifd,  	 * The remaining fraction of a block bytes would not be loaded!  	 */  	*header_size_ptr = ROUND(sbuf->st_size, 4096); + +	if (csf_ptr && imximage_csf_size) { +		*csf_ptr = params->ep - imximage_init_loadsize + +			*header_size_ptr; +		*header_size_ptr += imximage_csf_size; +	}  }  int imximage_check_params(struct mkimage_params *params) |