1 /* SPDX-License-Identifier: BSD-2-Clause */ 2 /* 3 * Renesas RZ/N1 Package Table format 4 * (C) 2015-2016 Renesas Electronics Europe, LTD 5 * All rights reserved. 6 * 7 * Converted to mkimage plug-in 8 * (C) Copyright 2022 Schneider Electric 9 */ 10 11 #ifndef _SPKGIMAGE_H_ 12 #define _SPKGIMAGE_H_ 13 14 #ifdef __GNUC__ 15 #define __packed __attribute((packed)) 16 #else 17 #define __packed 18 #endif 19 20 #define SPKG_HEADER_MARKER {'R', 'Z', 'N', '1'} 21 #define SPKG_HEADER_SIZE 24 22 #define SPKG_HEADER_COUNT 8 23 #define SPKG_BLP_SIZE 264 24 #define SPKG_CRC_SIZE 4 25 26 /** 27 * struct spkg_hdr - SPKG header 28 * @marker: magic pattern "RZN1" 29 * @version: header version (currently 1) 30 * @ecc: ECC enable and block size. 31 * @ecc_scheme: ECC algorithm selction 32 * @ecc_bytes: ECC bytes per block 33 * @payload_length: length of the payload (including CRC) 34 * @load_address: address in memory where payload should be loaded 35 * @execution_offset: offset from @load_address where execution starts 36 * @crc: 32-bit CRC of the above header fields 37 * 38 * SPKG header format is defined by Renesas. It is documented in the Reneasas 39 * RZ/N1 User Manual, Chapter 7.4 ("SPKG format"). 40 * 41 * The BootROM searches this header in order to find and validate the boot 42 * payload. It is therefore mandatory to wrap the payload in this header. 43 * 44 * The ECC-related fields @ecc @ecc_scheme @ecc_bytes are used only when 45 * booting from NAND flash, and they are only used while fetching the payload. 46 * These values are used to initialize the ECC controller. To avoid using 47 * non-portable bitfields, struct spkg_hdr uses uint8_t for these fields, so 48 * the user must shift the values into the correct spot. 49 * 50 * The payload will be loaded into memory at @payload_address. 51 * Execution then jumps to @payload_address + @execution_offset. 52 * The LSB of @execution_offset selects between ARM and Thumb mode, 53 * as per the usual ARM interworking convention. 54 */ 55 struct spkg_hdr { 56 uint8_t marker[4]; /* aka magic */ 57 uint8_t version; 58 uint8_t ecc; 59 uint8_t ecc_scheme; 60 uint8_t ecc_bytes; 61 uint32_t payload_length; /* only HIGHER 24 bits */ 62 uint32_t load_address; 63 uint32_t execution_offset; 64 uint32_t crc; /* of this header */ 65 } __packed; 66 67 /** 68 * struct spkg_file - complete SPKG image 69 * 70 * A SPKG image consists of 8 identical copies of struct spkg_hdr, each one 71 * occupying 24 bytes, for a total of 192 bytes. 72 * 73 * This is followed by the payload (the u-boot binary), and a 32-bit CRC. 74 * 75 * Optionally, the payload can be being with security header ("BLp_header"). 76 * This feature is not currently supported in mkimage. 77 * 78 * The payload is typically padded with 0xFF bytes so as to bring the total 79 * image size to a multiple of the flash erase size (often 64kB). 80 */ 81 struct spkg_file { 82 struct spkg_hdr header[SPKG_HEADER_COUNT]; 83 uint8_t payload[0]; 84 /* then the CRC */ 85 } __packed; 86 87 #endif 88