[U-Boot] [RFC PATCH 7/8] mkimage: Add OMAP boot image support

Bedia, Vaibhav vaibhav.bedia at ti.com
Tue Jan 4 14:43:56 CET 2011


Hi John,

On Tuesday, December 28, 2010 6:17 AM, John Rigby wrote:
> Signed-off-by: John Rigby <john.rigby at linaro.org>
> ---
>  common/image.c    |    1 +
>  include/image.h   |    1 +
>  tools/Makefile    |    2 +
>  tools/mkimage.c   |    2 +
>  tools/omapimage.c |  226
>  +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  tools/omapimage.h |   50 ++++++++++++ 6 files changed, 282
> insertions(+), 0 deletions(-)  create mode 100644 tools/omapimage.c
> create mode 100644 tools/omapimage.h  
> 
> diff --git a/common/image.c b/common/image.c index f63a2ff..4198d76
> 100644 --- a/common/image.c
> +++ b/common/image.c
> @@ -141,6 +141,7 @@ static const table_entry_t uimage_type[] = {
>  	{	IH_TYPE_FLATDT,     "flat_dt",    "Flat Device Tree",	},
>  	{	IH_TYPE_KWBIMAGE,   "kwbimage",   "Kirkwood Boot Image",},
>  	{	IH_TYPE_IMXIMAGE,   "imximage",   "Freescale i.MX Boot Image",},
> +	{	IH_TYPE_OMAPIMAGE,  "omapimage",  "TI OMAP CH/GP Boot Image",},
>  	{	-1,		    "",		  "",			},
>  };
> 
[...]

We are working on patch sets to add support for TI816X and TI814X processor series from Texas Instruments. This series includes DM8168/8148, C6A816x and AM389x devices. 

We were also in the process of extending mkimage to attach a header to the u-boot binary for TI816X and TI814X. We could build upon the mkimage extension that you proposed, so please consider making it more generic.

> diff --git a/include/image.h b/include/image.h index
> 005e0d2..f74e2b9 100644 --- a/include/image.h
> +++ b/include/image.h
> @@ -157,6 +157,7 @@
>  #define IH_TYPE_FLATDT		8	/* Binary Flat Device Tree Blob	*/
>  #define IH_TYPE_KWBIMAGE	9	/* Kirkwood Boot Image		*/
>  #define IH_TYPE_IMXIMAGE	10	/* Freescale IMXBoot Image	*/
> +#define IH_TYPE_OMAPIMAGE	11	/* TI OMAP Config Header Image	*/
> 
[...] 

TIIMAGE instead of OMAPIMAGE sounds more generic.

[...]
>  			$(obj)image.o \
>  			$(obj)imximage.o \
> +			$(obj)omapimage.o \
Same here. This change could be done globally in the patch.

>  			$(obj)kwbimage.o \
>  			$(obj)md5.o \
>  			$(obj)mkimage.o \
[...]

> +/* Header size is CH header rounded up to 512 bytes plus GP header */ 
> +#define OMAP_CH_HDR_SIZE 512 #define OMAP_GP_HDR_SIZE
> (sizeof(struct +gp_header)) #define OMAP_FILE_HDR_SIZE
> +(OMAP_CH_HDR_SIZE+OMAP_GP_HDR_SIZE)
> +
> +static uint8_t omapimage_header[OMAP_FILE_HDR_SIZE];
> +

TI816X and TI814X only have GP_HDR. How about adding a config option like CONFIG_OMAP_TIIMAGE to decide upon the final size of the header over here? That config option can also help in conditional compilation of the code which deals with the configuration header.

[...]

> +static int omapimage_verify_header(unsigned char *ptr, int
> image_size, +			struct mkimage_params *params)
> +{
> +	struct ch_toc *toc = (struct ch_toc *)ptr;
> +	struct gp_header *gph = (struct gp_header
> *)(ptr+OMAP_CH_HDR_SIZE); +	uint32_t offset, size;
> +
> +	while (toc->section_offset != 0xffffffff
> +			&& toc->section_size != 0xffffffff) {
> +		offset = toc->section_offset;
> +		size = toc->section_size;
> +		if (!offset || !size)
> +			return -1;
> +		if (offset >= OMAP_CH_HDR_SIZE || offset+size >=
> OMAP_CH_HDR_SIZE) +			return -1;
> +		toc++;
> +	}
> +	if (!valid_gph_size(gph->size))
> +		return -1;
> +	if (!valid_gph_load_addr(gph->load_addr))
> +		return -1;
> +
> +	return 0;
> +}

Please consider splitting the various functions/adding checks for CH_HDR and GP_HDR.

[...]

> +
> +/*
> + * omapimage parameters
> + */
> +static struct image_type_params omapimage_params = {
> +	.name		= "TI OMAP CH/GP Boot Image support",
> +	.header_size	= OMAP_FILE_HDR_SIZE,
> +	.hdr		= (void *)&omapimage_header,
> +	.check_image_type = omapimage_check_image_types,
> +	.verify_header	= omapimage_verify_header,
> +	.print_header	= omapimage_print_header,
> +	.set_header	= omapimage_set_header,
> +	.check_params	= omapimage_check_params,
> +};
> +

The set_header and print_header implementations will vary for TI816X and TI814X so protecting them with a macro like CONFIG_OMAP_TIIMAGE will be needed. I think you'll need to add dummy functions also to avoid compilation errors.

Adding dummy function also has one more advantage in case 2 different binaries are built from the same tree.

Without dummy functions for the spl stage and the full-fledged u-boot binary there will be different commands. 
Eg: "make u-boot.ti" for the spl stage and just "make" in the second stage.
 
But with dummy functions in place the user can invoke "make u-boot.ti" and not get confused about which command is to be used.

[...]

> +
> +struct ch_toc {
> +	uint32_t section_offset;
> +	uint32_t section_size;
> +	uint8_t unused[12];
> +	uint8_t section_name[12];
> +} __attribute__ ((__packed__));
> +
> +struct ch_settings {
> +	uint32_t section_key;
> +	uint8_t valid;
> +	uint8_t version;
> +	uint16_t reserved;
> +	uint32_t flags;
> +} __attribute__ ((__packed__));
> +
> +struct gp_header {
> +	uint32_t size;
> +	uint32_t load_addr;
> +} __attribute__ ((__packed__));
> +
[...] 

TI8168 and TI8148 will require only the gp_header struct. So please consider protecting ch_toc and ch_settings structures with a macro.

If it helps, I can share the current code we have for the mkimage extension for TI816X and TI814X.

Regards,
Vaibhav


More information about the U-Boot mailing list