u-boot/tools/renesas_spkgimage.h
Ralph Siemsen afdfcb11f9 tools: spkgimage: add Renesas SPKG format
Renesas RZ/N1 devices contain BootROM code that loads a custom SPKG
image from QSPI, NAND or USB DFU. Support this format in mkimage tool.

SPKGs can optionally be signed, however creation of signed SPKG is not
currently supported.

Example of how to use it:

tools/mkimage -n board/schneider/rzn1-snarc/spkgimage.cfg \
	-T spkgimage -a 0x20040000 -e 0x20040000 \
	-d u-boot.bin u-boot.bin.spkg

The config file (spkgimage.cfg in this example) contains additional
parameters such as NAND ECC settings.

Signed-off-by: Ralph Siemsen <ralph.siemsen@linaro.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
2023-05-13 04:01:30 +02:00

87 lines
2.8 KiB
C

/* 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