[PATCH v4 09/10] tools: spkgimage: add Renesas SPKG format

Marek Vasut marek.vasut at mailbox.org
Mon Apr 17 19:23:46 CEST 2023


On 3/8/23 21:26, Ralph Siemsen wrote:

[...]

> diff --git a/tools/Makefile b/tools/Makefile
> index e13effbb66..1d7abcb916 100644
> --- a/tools/Makefile
> +++ b/tools/Makefile
> @@ -125,6 +125,7 @@ dumpimage-mkimage-objs := aisimage.o \
>   			stm32image.o \
>   			$(ROCKCHIP_OBS) \
>   			socfpgaimage.o \
> +			spkgimage.o \

Maybe just call the file renesas_spkgimage.o so its clear which 
SoC/vendor this file is associtated with.

>   			sunxi_egon.o \
>   			lib/crc16-ccitt.o \
>   			lib/hash-checksum.o \
> diff --git a/tools/spkgimage.c b/tools/spkgimage.c
> new file mode 100644
> index 0000000000..ea8036e114
> --- /dev/null
> +++ b/tools/spkgimage.c
> @@ -0,0 +1,330 @@
> +// SPDX-License-Identifier: BSD-2-Clause
> +/*
> + * Generate Renesas RZ/N1 BootROM header (SPKG)
> + * (C) Copyright 2022 Schneider Electric
> + *
> + * Based on spkg_utility.c
> + * (C) Copyright 2016 Renesas Electronics Europe Ltd
> + */
> +
> +#include "imagetool.h"
> +#include <limits.h>
> +#include <image.h>
> +#include <stdarg.h>
> +#include <stdint.h>
> +#include <u-boot/crc.h>
> +#include "spkgimage.h"
> +
> +static struct spkg_file out_buf;
> +
> +static uint32_t padding;

Is this padding here and the padding in struct config_file below 
different padding ? Can we get rid of these static global variables ?

> +/* Note: the ordering of the bitfields does not matter */
> +static struct config_file {
> +	unsigned int version:1;
> +	unsigned int ecc_block_size:2;
> +	unsigned int ecc_enable:1;
> +	unsigned int ecc_scheme:3;
> +	unsigned int ecc_bytes:8;
> +	unsigned int blp_len;
> +	unsigned int padding;
> +} conf;
> +
> +static int check_range(const char *name, int val, int min, int max)
> +{
> +	if (val < min) {
> +		fprintf(stderr, "Warning: param '%s' adjusted to min %d\n",
> +			name, min);
> +		val = min;
> +	}
> +
> +	if (val > max) {
> +		fprintf(stderr, "Warning: param '%s' adjusted to max %d\n",
> +			name, max);
> +		val = max;
> +	}

There is a macro clamp() which implements range limiting .

> +	return val;
> +}
> +
> +static int spkgimage_parse_config_line(char *line, size_t line_num)
> +{
> +	char *saveptr;
> +	char *delim = "\t ";
> +	char *name = strtok_r(line, delim, &saveptr);
> +	char *val_str = strtok_r(NULL, delim, &saveptr);
> +	int value = atoi(val_str);
> +
> +	if (!strcmp("VERSION", name)) {
> +		conf.version = check_range(name, value, 1, 15);
> +	} else if (!strcmp("NAND_ECC_ENABLE", name)) {
> +		conf.ecc_enable = check_range(name, value, 0, 1);
> +	} else if (!strcmp("NAND_ECC_BLOCK_SIZE", name)) {
> +		conf.ecc_block_size = check_range(name, value, 0, 2);
> +	} else if (!strcmp("NAND_ECC_SCHEME", name)) {
> +		conf.ecc_scheme = check_range(name, value, 0, 7);
> +	} else if (!strcmp("NAND_BYTES_PER_ECC_BLOCK", name)) {
> +		conf.ecc_bytes = check_range(name, value, 0, 255);
> +	} else if (!strcmp("ADD_DUMMY_BLP", name)) {
> +		conf.blp_len = value ? SPKG_BLP_SIZE : 0;
> +	} else if (!strcmp("PADDING", name)) {
> +		if (strrchr(val_str, 'K'))
> +			value = value * 1024;
> +		else if (strrchr(val_str, 'M'))
> +			value = value * 1024 * 1024;
> +		conf.padding = check_range(name, value, 1, INT_MAX);
> +	} else {
> +		fprintf(stderr,
> +			"config error: unknown keyword on line %ld\n",
> +			line_num);
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
> +static int spkgimage_parse_config_file(char *filename)
> +{
> +	FILE *fcfg;
> +	char line[256];
> +	size_t len;
> +	size_t line_num = 0;
> +
> +	fcfg = fopen(filename, "r");
> +	if (!fcfg)
> +		return -EINVAL;
> +
> +	while (fgets(line, sizeof(line), fcfg)) {
> +		line_num += 1;
> +
> +		/* Skip blank lines and comments */
> +		if (line[0] == '\n' || line[0] == '#')
> +			continue;
> +
> +		/* Strip the trailing newline */
> +		len = strlen(line);
> +		if (line[len - 1] == '\n')
> +			line[--len] = 0;

Use len - 1 here too to avoid confusion ?

> +
> +		/* Parse the line */
> +		if (spkgimage_parse_config_line(line, line_num))
> +			return -EINVAL;
> +	}
> +
> +	fclose(fcfg);
> +
> +	/* Avoid divide-by-zero later on */
> +	if (!conf.padding)
> +		conf.padding = 1;
> +
> +	return 0;
> +}

[...]


More information about the U-Boot mailing list