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