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