xref: /openbmc/u-boot/include/imximage.h (revision 522e035441ca04d99de2fc13b614ad896691e9c9)
183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */
24e76c077SStefan Agner /*
34e76c077SStefan Agner  * (C) Copyright 2009
44e76c077SStefan Agner  * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
54e76c077SStefan Agner  */
64e76c077SStefan Agner 
74e76c077SStefan Agner #ifndef _IMXIMAGE_H_
84e76c077SStefan Agner #define _IMXIMAGE_H_
94e76c077SStefan Agner 
104e76c077SStefan Agner #define MAX_HW_CFG_SIZE_V2 220 /* Max number of registers imx can set for v2 */
114e76c077SStefan Agner #define MAX_PLUGIN_CODE_SIZE (64 * 1024)
124e76c077SStefan Agner #define MAX_HW_CFG_SIZE_V1 60  /* Max number of registers imx can set for v1 */
134e76c077SStefan Agner #define APP_CODE_BARKER	0xB1
144e76c077SStefan Agner #define DCD_BARKER	0xB17219E9
154e76c077SStefan Agner 
1669f06950SBryan O'Donoghue /* Specify the offset of the IVT in the IMX header as expected by BootROM */
1769f06950SBryan O'Donoghue #define BOOTROM_IVT_HDR_OFFSET	0xC00
1869f06950SBryan O'Donoghue 
194e76c077SStefan Agner /*
204e76c077SStefan Agner  * NOTE: This file must be kept in sync with arch/arm/include/asm/\
214e76c077SStefan Agner  *       mach-imx/imximage.cfg because tools/imximage.c can not
224e76c077SStefan Agner  *       cross-include headers from arch/arm/ and vice-versa.
234e76c077SStefan Agner  */
244e76c077SStefan Agner #define CMD_DATA_STR	"DATA"
254e76c077SStefan Agner 
264e76c077SStefan Agner /* Initial Vector Table Offset */
274e76c077SStefan Agner #define FLASH_OFFSET_UNDEFINED	0xFFFFFFFF
284e76c077SStefan Agner #define FLASH_OFFSET_STANDARD	0x400
294e76c077SStefan Agner #define FLASH_OFFSET_NAND	FLASH_OFFSET_STANDARD
304e76c077SStefan Agner #define FLASH_OFFSET_SD		FLASH_OFFSET_STANDARD
314e76c077SStefan Agner #define FLASH_OFFSET_SPI	FLASH_OFFSET_STANDARD
324e76c077SStefan Agner #define FLASH_OFFSET_ONENAND	0x100
334e76c077SStefan Agner #define FLASH_OFFSET_NOR	0x1000
344e76c077SStefan Agner #define FLASH_OFFSET_SATA	FLASH_OFFSET_STANDARD
354e76c077SStefan Agner #define FLASH_OFFSET_QSPI	0x1000
36*6609c266SPeng Fan #define FLASH_OFFSET_FLEXSPI	0x1000
374e76c077SStefan Agner 
384e76c077SStefan Agner /* Initial Load Region Size */
394e76c077SStefan Agner #define FLASH_LOADSIZE_UNDEFINED	0xFFFFFFFF
404e76c077SStefan Agner #define FLASH_LOADSIZE_STANDARD		0x1000
414e76c077SStefan Agner #define FLASH_LOADSIZE_NAND		FLASH_LOADSIZE_STANDARD
424e76c077SStefan Agner #define FLASH_LOADSIZE_SD		FLASH_LOADSIZE_STANDARD
434e76c077SStefan Agner #define FLASH_LOADSIZE_SPI		FLASH_LOADSIZE_STANDARD
444e76c077SStefan Agner #define FLASH_LOADSIZE_ONENAND		0x400
454e76c077SStefan Agner #define FLASH_LOADSIZE_NOR		0x0 /* entire image */
464e76c077SStefan Agner #define FLASH_LOADSIZE_SATA		FLASH_LOADSIZE_STANDARD
474e76c077SStefan Agner #define FLASH_LOADSIZE_QSPI		0x0 /* entire image */
484e76c077SStefan Agner 
494e76c077SStefan Agner /* Command tags and parameters */
504e76c077SStefan Agner #define IVT_HEADER_TAG			0xD1
514e76c077SStefan Agner #define IVT_VERSION			0x40
52*6609c266SPeng Fan #define IVT_VERSION_V3			0x41
534e76c077SStefan Agner #define DCD_HEADER_TAG			0xD2
544e76c077SStefan Agner #define DCD_VERSION			0x40
554e76c077SStefan Agner #define DCD_WRITE_DATA_COMMAND_TAG	0xCC
564e76c077SStefan Agner #define DCD_WRITE_DATA_PARAM		0x4
574e76c077SStefan Agner #define DCD_WRITE_CLR_BIT_PARAM		0xC
584e76c077SStefan Agner #define DCD_WRITE_SET_BIT_PARAM		0x1C
594e76c077SStefan Agner #define DCD_CHECK_DATA_COMMAND_TAG	0xCF
604e76c077SStefan Agner #define DCD_CHECK_BITS_SET_PARAM	0x14
614e76c077SStefan Agner #define DCD_CHECK_BITS_CLR_PARAM	0x04
624e76c077SStefan Agner 
63f4d8fccdSBryan O'Donoghue #ifndef __ASSEMBLY__
644e76c077SStefan Agner enum imximage_cmd {
654e76c077SStefan Agner 	CMD_INVALID,
664e76c077SStefan Agner 	CMD_IMAGE_VERSION,
674e76c077SStefan Agner 	CMD_BOOT_FROM,
684e76c077SStefan Agner 	CMD_BOOT_OFFSET,
694e76c077SStefan Agner 	CMD_WRITE_DATA,
704e76c077SStefan Agner 	CMD_WRITE_CLR_BIT,
714e76c077SStefan Agner 	CMD_WRITE_SET_BIT,
724e76c077SStefan Agner 	CMD_CHECK_BITS_SET,
734e76c077SStefan Agner 	CMD_CHECK_BITS_CLR,
744e76c077SStefan Agner 	CMD_CSF,
754e76c077SStefan Agner 	CMD_PLUGIN,
76*6609c266SPeng Fan 	/* Follwoing on i.MX8MQ/MM */
77*6609c266SPeng Fan 	CMD_FIT,
78*6609c266SPeng Fan 	CMD_SIGNED_HDMI,
79*6609c266SPeng Fan 	CMD_LOADER,
80*6609c266SPeng Fan 	CMD_SECOND_LOADER,
81*6609c266SPeng Fan 	CMD_DDR_FW,
824e76c077SStefan Agner };
834e76c077SStefan Agner 
844e76c077SStefan Agner enum imximage_fld_types {
854e76c077SStefan Agner 	CFG_INVALID = -1,
864e76c077SStefan Agner 	CFG_COMMAND,
874e76c077SStefan Agner 	CFG_REG_SIZE,
884e76c077SStefan Agner 	CFG_REG_ADDRESS,
894e76c077SStefan Agner 	CFG_REG_VALUE
904e76c077SStefan Agner };
914e76c077SStefan Agner 
924e76c077SStefan Agner enum imximage_version {
934e76c077SStefan Agner 	IMXIMAGE_VER_INVALID = -1,
944e76c077SStefan Agner 	IMXIMAGE_V1 = 1,
95*6609c266SPeng Fan 	IMXIMAGE_V2,
96*6609c266SPeng Fan 	IMXIMAGE_V3
974e76c077SStefan Agner };
984e76c077SStefan Agner 
994e76c077SStefan Agner typedef struct {
1004e76c077SStefan Agner 	uint32_t type; /* Type of pointer (byte, halfword, word, wait/read) */
1014e76c077SStefan Agner 	uint32_t addr; /* Address to write to */
1024e76c077SStefan Agner 	uint32_t value; /* Data to write */
1034e76c077SStefan Agner } dcd_type_addr_data_t;
1044e76c077SStefan Agner 
1054e76c077SStefan Agner typedef struct {
1064e76c077SStefan Agner 	uint32_t barker; /* Barker for sanity check */
1074e76c077SStefan Agner 	uint32_t length; /* Device configuration length (without preamble) */
1084e76c077SStefan Agner } dcd_preamble_t;
1094e76c077SStefan Agner 
1104e76c077SStefan Agner typedef struct {
1114e76c077SStefan Agner 	dcd_preamble_t preamble;
1124e76c077SStefan Agner 	dcd_type_addr_data_t addr_data[MAX_HW_CFG_SIZE_V1];
1134e76c077SStefan Agner } dcd_v1_t;
1144e76c077SStefan Agner 
1154e76c077SStefan Agner typedef struct {
1164e76c077SStefan Agner 	uint32_t app_code_jump_vector;
1174e76c077SStefan Agner 	uint32_t app_code_barker;
1184e76c077SStefan Agner 	uint32_t app_code_csf;
1194e76c077SStefan Agner 	uint32_t dcd_ptr_ptr;
1204e76c077SStefan Agner 	uint32_t super_root_key;
1214e76c077SStefan Agner 	uint32_t dcd_ptr;
1224e76c077SStefan Agner 	uint32_t app_dest_ptr;
1234e76c077SStefan Agner } flash_header_v1_t;
1244e76c077SStefan Agner 
1254e76c077SStefan Agner typedef struct {
1264e76c077SStefan Agner 	uint32_t length; 	/* Length of data to be read from flash */
1274e76c077SStefan Agner } flash_cfg_parms_t;
1284e76c077SStefan Agner 
1294e76c077SStefan Agner typedef struct {
1304e76c077SStefan Agner 	flash_header_v1_t fhdr;
1314e76c077SStefan Agner 	dcd_v1_t dcd_table;
1324e76c077SStefan Agner 	flash_cfg_parms_t ext_header;
1334e76c077SStefan Agner } imx_header_v1_t;
1344e76c077SStefan Agner 
1354e76c077SStefan Agner typedef struct {
1364e76c077SStefan Agner 	uint32_t addr;
1374e76c077SStefan Agner 	uint32_t value;
1384e76c077SStefan Agner } dcd_addr_data_t;
1394e76c077SStefan Agner 
1404e76c077SStefan Agner typedef struct {
1414e76c077SStefan Agner 	uint8_t tag;
1424e76c077SStefan Agner 	uint16_t length;
1434e76c077SStefan Agner 	uint8_t version;
1444e76c077SStefan Agner } __attribute__((packed)) ivt_header_t;
1454e76c077SStefan Agner 
1464e76c077SStefan Agner typedef struct {
1474e76c077SStefan Agner 	uint8_t tag;
1484e76c077SStefan Agner 	uint16_t length;
1494e76c077SStefan Agner 	uint8_t param;
1504e76c077SStefan Agner } __attribute__((packed)) write_dcd_command_t;
1514e76c077SStefan Agner 
1524e76c077SStefan Agner struct dcd_v2_cmd {
1534e76c077SStefan Agner 	write_dcd_command_t write_dcd_command;
1544e76c077SStefan Agner 	dcd_addr_data_t addr_data[MAX_HW_CFG_SIZE_V2];
1554e76c077SStefan Agner };
1564e76c077SStefan Agner 
1574e76c077SStefan Agner typedef struct {
1584e76c077SStefan Agner 	ivt_header_t header;
1594e76c077SStefan Agner 	struct dcd_v2_cmd dcd_cmd;
1604e76c077SStefan Agner 	uint32_t padding[1]; /* end up on an 8-byte boundary */
1614e76c077SStefan Agner } dcd_v2_t;
1624e76c077SStefan Agner 
1634e76c077SStefan Agner typedef struct {
1644e76c077SStefan Agner 	uint32_t start;
1654e76c077SStefan Agner 	uint32_t size;
1664e76c077SStefan Agner 	uint32_t plugin;
1674e76c077SStefan Agner } boot_data_t;
1684e76c077SStefan Agner 
1694e76c077SStefan Agner typedef struct {
1704e76c077SStefan Agner 	ivt_header_t header;
1714e76c077SStefan Agner 	uint32_t entry;
1724e76c077SStefan Agner 	uint32_t reserved1;
1734e76c077SStefan Agner 	uint32_t dcd_ptr;
1744e76c077SStefan Agner 	uint32_t boot_data_ptr;
1754e76c077SStefan Agner 	uint32_t self;
1764e76c077SStefan Agner 	uint32_t csf;
1774e76c077SStefan Agner 	uint32_t reserved2;
1784e76c077SStefan Agner } flash_header_v2_t;
1794e76c077SStefan Agner 
1804e76c077SStefan Agner typedef struct {
1814e76c077SStefan Agner 	flash_header_v2_t fhdr;
1824e76c077SStefan Agner 	boot_data_t boot_data;
1834e76c077SStefan Agner 	union {
1844e76c077SStefan Agner 		dcd_v2_t dcd_table;
1854e76c077SStefan Agner 		char plugin_code[MAX_PLUGIN_CODE_SIZE];
1864e76c077SStefan Agner 	} data;
1874e76c077SStefan Agner } imx_header_v2_t;
1884e76c077SStefan Agner 
189*6609c266SPeng Fan typedef struct {
190*6609c266SPeng Fan 	flash_header_v2_t fhdr;
191*6609c266SPeng Fan 	boot_data_t boot_data;
192*6609c266SPeng Fan 	uint32_t padding[5];
193*6609c266SPeng Fan } imx_header_v3_t;
194*6609c266SPeng Fan 
1954e76c077SStefan Agner /* The header must be aligned to 4k on MX53 for NAND boot */
1964e76c077SStefan Agner struct imx_header {
1974e76c077SStefan Agner 	union {
1984e76c077SStefan Agner 		imx_header_v1_t hdr_v1;
1994e76c077SStefan Agner 		imx_header_v2_t hdr_v2;
2004e76c077SStefan Agner 	} header;
2014e76c077SStefan Agner };
2024e76c077SStefan Agner 
2034e76c077SStefan Agner typedef void (*set_dcd_val_t)(struct imx_header *imxhdr,
2044e76c077SStefan Agner 					char *name, int lineno,
2054e76c077SStefan Agner 					int fld, uint32_t value,
2064e76c077SStefan Agner 					uint32_t off);
2074e76c077SStefan Agner 
2084e76c077SStefan Agner typedef void (*set_dcd_param_t)(struct imx_header *imxhdr, uint32_t dcd_len,
2094e76c077SStefan Agner 					int32_t cmd);
2104e76c077SStefan Agner 
2114e76c077SStefan Agner typedef void (*set_dcd_rst_t)(struct imx_header *imxhdr,
2124e76c077SStefan Agner 					uint32_t dcd_len,
2134e76c077SStefan Agner 					char *name, int lineno);
2144e76c077SStefan Agner 
2154e76c077SStefan Agner typedef void (*set_imx_hdr_t)(struct imx_header *imxhdr, uint32_t dcd_len,
2164e76c077SStefan Agner 		uint32_t entry_point, uint32_t flash_offset);
2174e76c077SStefan Agner 
218f4d8fccdSBryan O'Donoghue #endif /* __ASSEMBLY__ */
2194e76c077SStefan Agner #endif /* _IMXIMAGE_H_ */
220