mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-13 06:42:56 +00:00
88 lines
2.8 KiB
C
88 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
|