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;
+}

[...]

Reply via email to