summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/binman/etype/renesas_rcar4_sa0.py46
-rw-r--r--tools/binman/ftest.py11
-rw-r--r--tools/binman/test/348_renesas_rcar4_sa0.dts15
-rw-r--r--tools/binman/test/349_renesas_rcar4_sa0_size.dts20
-rw-r--r--tools/bmp_logo.c10
-rw-r--r--tools/gen_ethaddr_crc.c6
-rw-r--r--tools/mkenvimage.c2
-rw-r--r--tools/ublimage.c2
8 files changed, 102 insertions, 10 deletions
diff --git a/tools/binman/etype/renesas_rcar4_sa0.py b/tools/binman/etype/renesas_rcar4_sa0.py
new file mode 100644
index 00000000000..3a7c0988fdc
--- /dev/null
+++ b/tools/binman/etype/renesas_rcar4_sa0.py
@@ -0,0 +1,46 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright 2025 Marek Vasut <marek.vasut+renesas@mailbox.org>
+#
+# Entry-type module for generating the Renesas R-Car Gen4 SA0 header.
+#
+
+import os
+import struct
+
+from binman.etype.section import Entry_section
+from dtoc import fdt_util
+from u_boot_pylib import tools
+
+RCAR_GEN4_SF_HEADER_SIZE = 0x40000
+RCAR_GEN4_SF_MAX_LOAD_SIZE = 0xec000
+
+class Entry_renesas_rcar4_sa0(Entry_section):
+ """Renesas R-Car Gen4 SA0 generator"""
+
+ def __init__(self, section, etype, node):
+ super().__init__(section, etype, node)
+ self.required_props = ['renesas,loader-address']
+
+ def ReadNode(self):
+ self.loader_address = fdt_util.GetInt(self._node, 'renesas,loader-address')
+ super().ReadNode()
+
+ def BuildSectionData(self, required):
+ data = super().BuildSectionData(required)[RCAR_GEN4_SF_HEADER_SIZE:]
+
+ # Offset 0x0000 / Value 0x00000000
+ header = struct.pack('<I', 0)
+ header += tools.get_bytes(0xff, 0x3008)
+ # Offset 0x300c / Value 0x00000000
+ header += struct.pack('<I', 0)
+ header += tools.get_bytes(0xff, 0x144)
+ # Offset 0x3154 / Value (payload load address)
+ header += struct.pack('<I', self.loader_address)
+ header += tools.get_bytes(0xff, 0x10c)
+ # Offset 0x3264 / Value (payload size in 4-byte words, aligned to 4k)
+ header += struct.pack('<I', int(tools.align(len(data), 0x1000) / 4))
+ header += tools.get_bytes(0xff, 0x3cd98)
+ if len(data) > RCAR_GEN4_SF_MAX_LOAD_SIZE:
+ self.Raise(f'SRAM data longer than {RCAR_GEN4_SF_MAX_LOAD_SIZE} Bytes')
+
+ return header + data
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index 8225216fbec..a90db3c9351 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -5586,6 +5586,17 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
data = self._DoReadFile('347_bl1.dts')
self.assertEqual(ATF_BL1_DATA, data[:len(ATF_BL1_DATA)])
+ def testRenesasRCarGen4SA0Image(self):
+ """Test that binman can produce an Renesas R-Car Gen4 SA0 image"""
+ self._DoTestFile('348_renesas_rcar4_sa0.dts')
+
+ def testRenesasRCarGen4SA0ImageSize(self):
+ """Test that binman can not produce large Renesas R-Car Gen4 SA0 image"""
+ with self.assertRaises(ValueError) as exc:
+ self._DoTestFile('349_renesas_rcar4_sa0_size.dts')
+ self.assertIn("Node '/binman/renesas-rcar4-sa0': SRAM data longer than 966656 Bytes",
+ str(exc.exception))
+
def testFitFdtOper(self):
"""Check handling of a specified FIT operation"""
entry_args = {
diff --git a/tools/binman/test/348_renesas_rcar4_sa0.dts b/tools/binman/test/348_renesas_rcar4_sa0.dts
new file mode 100644
index 00000000000..4a8717520f2
--- /dev/null
+++ b/tools/binman/test/348_renesas_rcar4_sa0.dts
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ renesas-rcar4-sa0 {
+ filename = "sa0.bin";
+ renesas,loader-address = <0x10>;
+ };
+ };
+};
diff --git a/tools/binman/test/349_renesas_rcar4_sa0_size.dts b/tools/binman/test/349_renesas_rcar4_sa0_size.dts
new file mode 100644
index 00000000000..eaf4507260b
--- /dev/null
+++ b/tools/binman/test/349_renesas_rcar4_sa0_size.dts
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ binman {
+ renesas-rcar4-sa0 {
+ filename = "sa0.bin";
+ renesas,loader-address = <0x10>;
+
+ fill { /* Oversize fill to cover size check */
+ size = <0x140000>;
+ fill-byte = [ff];
+ };
+ };
+ };
+};
diff --git a/tools/bmp_logo.c b/tools/bmp_logo.c
index 74fcadca63e..40213b7887f 100644
--- a/tools/bmp_logo.c
+++ b/tools/bmp_logo.c
@@ -15,7 +15,7 @@ typedef struct bitmap_s { /* bitmap description */
#define DEFAULT_CMAP_SIZE 16 /* size of default color map */
-void usage(const char *prog)
+static void usage(const char *prog)
{
fprintf(stderr, "Usage: %s [--gen-info|--gen-data|--gen-bmp] file\n",
prog);
@@ -24,7 +24,7 @@ void usage(const char *prog)
/*
* Neutralize little endians.
*/
-uint16_t le_short(uint16_t x)
+static uint16_t le_short(uint16_t x)
{
uint16_t val;
uint8_t *p = (uint8_t *)(&x);
@@ -35,14 +35,14 @@ uint16_t le_short(uint16_t x)
return val;
}
-void skip_bytes (FILE *fp, int n)
+static void skip_bytes(FILE *fp, int n)
{
while (n-- > 0)
fgetc (fp);
}
__attribute__ ((__noreturn__))
-int error (char * msg, FILE *fp)
+static int error(char *msg, FILE *fp)
{
fprintf (stderr, "ERROR: %s\n", msg);
@@ -51,7 +51,7 @@ int error (char * msg, FILE *fp)
exit (EXIT_FAILURE);
}
-void gen_info(bitmap_t *b, uint16_t n_colors)
+static void gen_info(bitmap_t *b, uint16_t n_colors)
{
printf("/*\n"
" * Automatically generated by \"tools/bmp_logo\"\n"
diff --git a/tools/gen_ethaddr_crc.c b/tools/gen_ethaddr_crc.c
index e73d0429a04..27717207580 100644
--- a/tools/gen_ethaddr_crc.c
+++ b/tools/gen_ethaddr_crc.c
@@ -16,12 +16,12 @@
#define ARP_HLEN_ASCII (ARP_HLEN * 2) + (ARP_HLEN - 1) /* with separators */
#define ARP_HLEN_LAZY (ARP_HLEN * 2) /* separatorless hardware address length */
-uint8_t nibble_to_hex(const char *nibble, bool lo)
+static uint8_t nibble_to_hex(const char *nibble, bool lo)
{
return (strtol(nibble, NULL, 16) << (lo ? 0 : 4)) & (lo ? 0x0f : 0xf0);
}
-int process_mac(const char *mac_address)
+static int process_mac(const char *mac_address)
{
uint8_t ethaddr[ARP_HLEN + 1] = { 0x00 };
uint_fast8_t i = 0;
@@ -45,7 +45,7 @@ int process_mac(const char *mac_address)
return 0;
}
-void print_usage(char *cmdname)
+static void print_usage(char *cmdname)
{
printf("Usage: %s <mac_address>\n", cmdname);
puts("<mac_address> may be with or without separators.");
diff --git a/tools/mkenvimage.c b/tools/mkenvimage.c
index 885cdb1390e..944ec82e761 100644
--- a/tools/mkenvimage.c
+++ b/tools/mkenvimage.c
@@ -47,7 +47,7 @@ static void usage(const char *exec_name)
exec_name);
}
-long int xstrtol(const char *s)
+static long int xstrtol(const char *s)
{
long int tmp;
diff --git a/tools/ublimage.c b/tools/ublimage.c
index a1bd807bfa0..8926d5b178b 100644
--- a/tools/ublimage.c
+++ b/tools/ublimage.c
@@ -219,7 +219,7 @@ static void ublimage_set_header(void *ptr, struct stat *sbuf, int ifd,
parse_cfg_file(ublhdr, params->imagename);
}
-int ublimage_check_params(struct image_tool_params *params)
+static int ublimage_check_params(struct image_tool_params *params)
{
if (!params)
return CFG_INVALID;