1# SPDX-License-Identifier: GPL-2.0+
2# Copyright 2025 Marek Vasut <marek.vasut+renesas@mailbox.org>
3#
4# Entry-type module for generating the Renesas R-Car Gen4 SA0 header.
5#
6
7import os
8import struct
9
10from binman.etype.section import Entry_section
11from dtoc import fdt_util
12from u_boot_pylib import tools
13
14RCAR_GEN4_SF_HEADER_SIZE    = 0x40000
15RCAR_GEN4_SF_MAX_LOAD_SIZE  = 0xec000
16
17class Entry_renesas_rcar4_sa0(Entry_section):
18    """Renesas R-Car Gen4 SA0 generator"""
19
20    def __init__(self, section, etype, node):
21        super().__init__(section, etype, node)
22        self.required_props = ['renesas,loader-address']
23
24    def ReadNode(self):
25        self.loader_address = fdt_util.GetInt(self._node, 'renesas,loader-address')
26        super().ReadNode()
27
28    def BuildSectionData(self, required):
29        data = super().BuildSectionData(required)[RCAR_GEN4_SF_HEADER_SIZE:]
30
31        # Offset 0x0000 / Value 0x00000000
32        header = struct.pack('<I', 0)
33        header += tools.get_bytes(0xff, 0x3008)
34        # Offset 0x300c / Value 0x00000000
35        header += struct.pack('<I', 0)
36        header += tools.get_bytes(0xff, 0x144)
37        # Offset 0x3154 / Value (payload load address)
38        header += struct.pack('<I', self.loader_address)
39        header += tools.get_bytes(0xff, 0x10c)
40        # Offset 0x3264 / Value (payload size in 4-byte words, aligned to 4k)
41        header += struct.pack('<I', int(tools.align(len(data), 0x1000) / 4))
42        header += tools.get_bytes(0xff, 0x3cd98)
43        if len(data) > RCAR_GEN4_SF_MAX_LOAD_SIZE:
44            self.Raise(f'SRAM data longer than {RCAR_GEN4_SF_MAX_LOAD_SIZE} Bytes')
45
46        return header + data
47