[U-Boot] [PATCH 7/8] tools: mkimage: Add: Kirkwood Boot Image support (kwbimage)

Wolfgang Denk wd at denx.de
Sat Aug 8 01:24:24 CEST 2009


Dear Prafulla Wadaskar,

In message <1248804270-13715-7-git-send-email-prafulla at marvell.com> you wrote:
> This is Third step towards cleaning mkimage code for kwbimage
> support in clean way.

Umm... The "Third step" was already in patch 4/8. I guess you have to
check your commit messages better...

> diff --git a/tools/Makefile b/tools/Makefile
> index 6ef15d9..07a1c27 100644
> --- a/tools/Makefile
> +++ b/tools/Makefile
> @@ -172,6 +172,7 @@ $(obj)img2srec$(SFX):	$(obj)img2srec.o
>  
>  $(obj)mkimage$(SFX):	$(obj)mkimage.o $(obj)crc32.o $(obj)image.o $(obj)md5.o \
>  			$(obj)default_image.o \
> +			$(obj)kwbimage.o \
>  			$(obj)sha1.o $(LIBFDT_OBJS) $(obj)os_support.o

Please keep sorted.

> --- /dev/null
> +++ b/tools/kwbimage.c
> @@ -0,0 +1,364 @@
> +/*
> + * (C) Copyright 2008
> + * Marvell Semiconductor <www.marvell.com>
> + * Written-by: Prafulla Wadaskar <prafulla at marvell.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 "mkimage.h"
> +#include <image.h>
> +#include "kwbimage.h"
> +
> +/*
> + * Suported commands for configuration file
> + */
> +static table_entry_t kwbimage_cmds[] = {
> +	{	CMD_BOOT_FROM,		"BOOT_FROM",		"",	},
> +	{	CMD_NAND_ECC_MODE,	"NAND_ECC_MODE",	"",	},
> +	{	CMD_NAND_PAGE_SIZE,	"NAND_PAGE_SIZE",	"",	},
> +	{	CMD_SATA_PIO_MODE,	"SATA_PIO_MODE",	"",	},
> +	{	CMD_DDR_INIT_DELAY,	"DDR_INIT_DELAY",	"",	},
> +	{	CMD_DATA,		"DATA",			"",	},
> +	{	CMD_INVALID,		"",			"",	},
> +};

Why don't these entries have any printable names associated?

> +/*
> + * Suported Boot options for configuration file

Typo.

...
> +/*
> + * Suported NAND ecc options configuration file
> + */
> +static table_entry_t kwbimage_eccmodes[] = {
> +	{	IBR_HDR_ECC_DEFAULT,	"default",		"",	},
> +	{	IBR_HDR_ECC_FORCED_HAMMING,"hamming",		"",	},
> +	{	IBR_HDR_ECC_FORCED_RS,	"rs",			"",	},
> +	{	IBR_HDR_ECC_DISABLED,	"disabled",		"",	},
> +	{	-1,			"",			"",	},
> +};

Why don't these entries have any printable names associated?


> +uint32_t check_get_hexval (char *token)
> +{
> +	uint32_t hexval;
> +
> +	if (!sscanf (token, "%x", &hexval)) {
> +		printf ("Error:%s[%d] - Invalid hex data\n", fname, lineno);
> +		exit (EXIT_FAILURE);
> +	}
> +	return hexval;
> +}

scanf() is not a good or reliable conversion tool. Better avoid it.
Use strto[u]l() instead.

In the error case, please also print the string that you cannot
convert.

> +/*
> + * Generates 8 bit checksum
> + */
> +uint8_t kwbimage_checksum8 (void *start, uint32_t len, uint8_t csum)
> +{
> +	register uint8_t sum = csum;
> +	volatile uint8_t *startp = (volatile uint8_t *)start;
> +
> +	do {
> +		sum += *startp;
> +		startp++;
> +	} while (--len);

"startp" is incorrectly named. It is only _start_ at the beginning.
Just call it "p" :-)

Maybe you should add handling for the "len=0" case.

> +/*
> + * Generates 32 bit checksum
> + */
> +uint32_t kwbimage_checksum32 (uint32_t *start, uint32_t len, uint32_t csum)
> +{
> +	register uint32_t sum = csum;
> +	volatile uint32_t *startp = start;
> +
> +	do {
> +		sum += *startp;
> +		startp++;
> +		len -= sizeof(uint32_t);
> +	} while (len > 0);
> +	return (sum);

You should error handling for the cas ethet len is not an even
multiple of sizeof(uint32_t).

Maybe you should add handling for the "len=0" case.

...
> +	case CMD_NAND_PAGE_SIZE:
> +		mhdr->nandpagesize =
> +			(uint16_t) check_get_hexval (token);
> +			printf ("Nand page size = 0x%x\n",
> +					mhdr->nandpagesize);

Indentation incorrect.

> +		break;
> +	case CMD_SATA_PIO_MODE:
> +		mhdr->satapiomode =
> +			(uint8_t) check_get_hexval (token);
> +			printf ("Sata PIO mode = 0x%x\n",
> +					mhdr->satapiomode);

Indentation incorrect.

> +		break;
> +	case CMD_DDR_INIT_DELAY:
> +		mhdr->ddrinitdelay =
> +			(uint16_t) check_get_hexval (token);
> +		printf ("DDR init delay = %d msec\n",
> +					mhdr->ddrinitdelay);

Indentation incorrect.

> +		break;
> +	case CMD_DATA:
> +		exthdr->rcfg[datacmd_cnt].raddr =
> +			(uint32_t) check_get_hexval (token);

Umm... why are all these casts needed?

Please get rid of these.

> +		break;
> +	case CMD_INVALID:
> +	default:
> +INVL_DATA:
> +		printf ("Error:%s[%d] - Invalid data\n", fname, lineno);
> +		exit (EXIT_FAILURE);
> +	}

I really dislike this jumping into another case. Please don;t. Move
this code out of the switch().

> +}
> +
> +void kwdimage_set_ext_header (struct kwb_header *kwbhdr, char* name) {

How about some comments what all these functions are supposed to do?

> +			case CFG_DATA1:
> +				if (cmd != CMD_DATA)
> +					goto INVL_CMD;
> +
> +				exthdr->rcfg[datacmd_cnt].rdata =
> +					(uint32_t) check_get_hexval (token);
> +
> +				if (datacmd_cnt > KWBIMAGE_MAX_CONFIG ) {
> +					printf ("Error:%s[%d] - Found more "
> +						"than max(%d) allowed "
> +						"data configurations\n",
> +						fname, lineno,
> +						KWBIMAGE_MAX_CONFIG);
> +				exit (EXIT_FAILURE);

Indentation incorrect.

> +				} else
> +					datacmd_cnt++;
> +				break;
> +
> +			default:
> +				/*
> +				 * Command format permits maximum three
> +				 * strings on a line, i.e. command and data
> +				 * if more than two are observed, then error
> +				 * will be reported
> +				 */

That does not make sense. If three three stings are permitted, then
why throwing an error when there are three? 

And "three strings on a line, i.e. command and data" sounds incorrect,
too.


> +INVL_CMD:
> +				printf ("Error:%s[%d] - Invalid command\n",
> +					fname, lineno);
> +				exit (EXIT_FAILURE);

Please do not jump right in the middle of a switch. Move this error
code out of the switch.

> +/* -l support functions */
> +int kwbimage_verify_header (char *ptr, int image_size,
> +			struct mkimage_params *params)
> +{
> +	struct kwb_header *hdr = (struct kwb_header *)ptr;
> +	bhr_t *mhdr = &hdr->kwb_hdr;
> +	extbhr_t *exthdr = &hdr->kwb_exthdr;
> +	uint8_t calc_hdrcsum;
> +	uint8_t calc_exthdrcsum;
> +
> +	calc_hdrcsum = kwbimage_checksum8 ((void *)mhdr,
> +			sizeof(bhr_t) - sizeof(uint8_t), 0);
> +	if (calc_hdrcsum != mhdr->checkSum) {
> +		return -FDT_ERR_BADSTRUCTURE;	/* mhdr csum not matched */
> +	}

No braces needed for single line statements.

> +	calc_exthdrcsum = kwbimage_checksum8 ((void *)exthdr,
> +			sizeof(extbhr_t) - sizeof(uint8_t), 0);
> +	if (calc_hdrcsum != mhdr->checkSum) {
> +		return -FDT_ERR_BADSTRUCTURE; /* exthdr csum not matched */
> +	}

No braces needed for single line statements.

> +void kwbimage_print_header (char *ptr)
> +{
> +	struct kwb_header *hdr = (struct kwb_header *) ptr;
> +	bhr_t *mhdr = &hdr->kwb_hdr;
> +
> +	printf ("Image Type:   Kirkwood Boot from %s Image\n",
> +		get_table_entry_name (kwbimage_bootops,
> +			"Kwbimage boot option",
> +			(int) mhdr->blockid));

Indentation looks ugly.

...
> diff --git a/tools/mkimage.c b/tools/mkimage.c
> index 3a3cb19..7e29610 100644
> --- a/tools/mkimage.c
> +++ b/tools/mkimage.c
> @@ -25,6 +25,7 @@
>  #include "mkimage.h"
>  #include <image.h>
>  #include "default_image.h"
> +#include "kwbimage.h"
>  
>  static void copy_file(int, const char *, int);
>  static void usage(void);
> @@ -59,6 +60,7 @@ static struct image_functions image_ftable[] = {
>  	{image_get_tparams,},	/* for IH_TYPE_SCRIPT */
>  	{image_get_tparams,},	/* for IH_TYPE_STANDALONE */
>  	{fitimage_get_tparams,},	/* for IH_TYPE_FLATDT */
> +	{kwbimage_get_tparams,},        /* for IH_TYPE_KWBIMAGE */
>  };
>  
>  int
> @@ -111,7 +113,7 @@ main (int argc, char **argv)
>  					(params.opt_type =
>  					genimg_get_type_id (*++argv)) < 0)
>  					usage ();
> -				if (image_ftable_size <= params.opt_type) {
> +				if (image_ftable_size < params.opt_type) {

Ah!  What's going on here????


Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
When choosing between two evils, I always like to take the  one  I've
never tried before.                     -- Mae West, "Klondike Annie"


More information about the U-Boot mailing list