xref: /rk3399_rockchip-uboot/include/imximage.h (revision 6aee2ab68c362ace5a59f89a63abed82e0bf19e5)
1*4e76c077SStefan Agner /*
2*4e76c077SStefan Agner  * (C) Copyright 2009
3*4e76c077SStefan Agner  * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
4*4e76c077SStefan Agner  *
5*4e76c077SStefan Agner  * SPDX-License-Identifier:	GPL-2.0+
6*4e76c077SStefan Agner  */
7*4e76c077SStefan Agner 
8*4e76c077SStefan Agner #ifndef _IMXIMAGE_H_
9*4e76c077SStefan Agner #define _IMXIMAGE_H_
10*4e76c077SStefan Agner 
11*4e76c077SStefan Agner #define MAX_HW_CFG_SIZE_V2 220 /* Max number of registers imx can set for v2 */
12*4e76c077SStefan Agner #define MAX_PLUGIN_CODE_SIZE (64 * 1024)
13*4e76c077SStefan Agner #define MAX_HW_CFG_SIZE_V1 60  /* Max number of registers imx can set for v1 */
14*4e76c077SStefan Agner #define APP_CODE_BARKER	0xB1
15*4e76c077SStefan Agner #define DCD_BARKER	0xB17219E9
16*4e76c077SStefan Agner 
17*4e76c077SStefan Agner /*
18*4e76c077SStefan Agner  * NOTE: This file must be kept in sync with arch/arm/include/asm/\
19*4e76c077SStefan Agner  *       mach-imx/imximage.cfg because tools/imximage.c can not
20*4e76c077SStefan Agner  *       cross-include headers from arch/arm/ and vice-versa.
21*4e76c077SStefan Agner  */
22*4e76c077SStefan Agner #define CMD_DATA_STR	"DATA"
23*4e76c077SStefan Agner 
24*4e76c077SStefan Agner /* Initial Vector Table Offset */
25*4e76c077SStefan Agner #define FLASH_OFFSET_UNDEFINED	0xFFFFFFFF
26*4e76c077SStefan Agner #define FLASH_OFFSET_STANDARD	0x400
27*4e76c077SStefan Agner #define FLASH_OFFSET_NAND	FLASH_OFFSET_STANDARD
28*4e76c077SStefan Agner #define FLASH_OFFSET_SD		FLASH_OFFSET_STANDARD
29*4e76c077SStefan Agner #define FLASH_OFFSET_SPI	FLASH_OFFSET_STANDARD
30*4e76c077SStefan Agner #define FLASH_OFFSET_ONENAND	0x100
31*4e76c077SStefan Agner #define FLASH_OFFSET_NOR	0x1000
32*4e76c077SStefan Agner #define FLASH_OFFSET_SATA	FLASH_OFFSET_STANDARD
33*4e76c077SStefan Agner #define FLASH_OFFSET_QSPI	0x1000
34*4e76c077SStefan Agner 
35*4e76c077SStefan Agner /* Initial Load Region Size */
36*4e76c077SStefan Agner #define FLASH_LOADSIZE_UNDEFINED	0xFFFFFFFF
37*4e76c077SStefan Agner #define FLASH_LOADSIZE_STANDARD		0x1000
38*4e76c077SStefan Agner #define FLASH_LOADSIZE_NAND		FLASH_LOADSIZE_STANDARD
39*4e76c077SStefan Agner #define FLASH_LOADSIZE_SD		FLASH_LOADSIZE_STANDARD
40*4e76c077SStefan Agner #define FLASH_LOADSIZE_SPI		FLASH_LOADSIZE_STANDARD
41*4e76c077SStefan Agner #define FLASH_LOADSIZE_ONENAND		0x400
42*4e76c077SStefan Agner #define FLASH_LOADSIZE_NOR		0x0 /* entire image */
43*4e76c077SStefan Agner #define FLASH_LOADSIZE_SATA		FLASH_LOADSIZE_STANDARD
44*4e76c077SStefan Agner #define FLASH_LOADSIZE_QSPI		0x0 /* entire image */
45*4e76c077SStefan Agner 
46*4e76c077SStefan Agner /* Command tags and parameters */
47*4e76c077SStefan Agner #define IVT_HEADER_TAG			0xD1
48*4e76c077SStefan Agner #define IVT_VERSION			0x40
49*4e76c077SStefan Agner #define DCD_HEADER_TAG			0xD2
50*4e76c077SStefan Agner #define DCD_VERSION			0x40
51*4e76c077SStefan Agner #define DCD_WRITE_DATA_COMMAND_TAG	0xCC
52*4e76c077SStefan Agner #define DCD_WRITE_DATA_PARAM		0x4
53*4e76c077SStefan Agner #define DCD_WRITE_CLR_BIT_PARAM		0xC
54*4e76c077SStefan Agner #define DCD_WRITE_SET_BIT_PARAM		0x1C
55*4e76c077SStefan Agner #define DCD_CHECK_DATA_COMMAND_TAG	0xCF
56*4e76c077SStefan Agner #define DCD_CHECK_BITS_SET_PARAM	0x14
57*4e76c077SStefan Agner #define DCD_CHECK_BITS_CLR_PARAM	0x04
58*4e76c077SStefan Agner 
59*4e76c077SStefan Agner enum imximage_cmd {
60*4e76c077SStefan Agner 	CMD_INVALID,
61*4e76c077SStefan Agner 	CMD_IMAGE_VERSION,
62*4e76c077SStefan Agner 	CMD_BOOT_FROM,
63*4e76c077SStefan Agner 	CMD_BOOT_OFFSET,
64*4e76c077SStefan Agner 	CMD_WRITE_DATA,
65*4e76c077SStefan Agner 	CMD_WRITE_CLR_BIT,
66*4e76c077SStefan Agner 	CMD_WRITE_SET_BIT,
67*4e76c077SStefan Agner 	CMD_CHECK_BITS_SET,
68*4e76c077SStefan Agner 	CMD_CHECK_BITS_CLR,
69*4e76c077SStefan Agner 	CMD_CSF,
70*4e76c077SStefan Agner 	CMD_PLUGIN,
71*4e76c077SStefan Agner };
72*4e76c077SStefan Agner 
73*4e76c077SStefan Agner enum imximage_fld_types {
74*4e76c077SStefan Agner 	CFG_INVALID = -1,
75*4e76c077SStefan Agner 	CFG_COMMAND,
76*4e76c077SStefan Agner 	CFG_REG_SIZE,
77*4e76c077SStefan Agner 	CFG_REG_ADDRESS,
78*4e76c077SStefan Agner 	CFG_REG_VALUE
79*4e76c077SStefan Agner };
80*4e76c077SStefan Agner 
81*4e76c077SStefan Agner enum imximage_version {
82*4e76c077SStefan Agner 	IMXIMAGE_VER_INVALID = -1,
83*4e76c077SStefan Agner 	IMXIMAGE_V1 = 1,
84*4e76c077SStefan Agner 	IMXIMAGE_V2
85*4e76c077SStefan Agner };
86*4e76c077SStefan Agner 
87*4e76c077SStefan Agner typedef struct {
88*4e76c077SStefan Agner 	uint32_t type; /* Type of pointer (byte, halfword, word, wait/read) */
89*4e76c077SStefan Agner 	uint32_t addr; /* Address to write to */
90*4e76c077SStefan Agner 	uint32_t value; /* Data to write */
91*4e76c077SStefan Agner } dcd_type_addr_data_t;
92*4e76c077SStefan Agner 
93*4e76c077SStefan Agner typedef struct {
94*4e76c077SStefan Agner 	uint32_t barker; /* Barker for sanity check */
95*4e76c077SStefan Agner 	uint32_t length; /* Device configuration length (without preamble) */
96*4e76c077SStefan Agner } dcd_preamble_t;
97*4e76c077SStefan Agner 
98*4e76c077SStefan Agner typedef struct {
99*4e76c077SStefan Agner 	dcd_preamble_t preamble;
100*4e76c077SStefan Agner 	dcd_type_addr_data_t addr_data[MAX_HW_CFG_SIZE_V1];
101*4e76c077SStefan Agner } dcd_v1_t;
102*4e76c077SStefan Agner 
103*4e76c077SStefan Agner typedef struct {
104*4e76c077SStefan Agner 	uint32_t app_code_jump_vector;
105*4e76c077SStefan Agner 	uint32_t app_code_barker;
106*4e76c077SStefan Agner 	uint32_t app_code_csf;
107*4e76c077SStefan Agner 	uint32_t dcd_ptr_ptr;
108*4e76c077SStefan Agner 	uint32_t super_root_key;
109*4e76c077SStefan Agner 	uint32_t dcd_ptr;
110*4e76c077SStefan Agner 	uint32_t app_dest_ptr;
111*4e76c077SStefan Agner } flash_header_v1_t;
112*4e76c077SStefan Agner 
113*4e76c077SStefan Agner typedef struct {
114*4e76c077SStefan Agner 	uint32_t length; 	/* Length of data to be read from flash */
115*4e76c077SStefan Agner } flash_cfg_parms_t;
116*4e76c077SStefan Agner 
117*4e76c077SStefan Agner typedef struct {
118*4e76c077SStefan Agner 	flash_header_v1_t fhdr;
119*4e76c077SStefan Agner 	dcd_v1_t dcd_table;
120*4e76c077SStefan Agner 	flash_cfg_parms_t ext_header;
121*4e76c077SStefan Agner } imx_header_v1_t;
122*4e76c077SStefan Agner 
123*4e76c077SStefan Agner typedef struct {
124*4e76c077SStefan Agner 	uint32_t addr;
125*4e76c077SStefan Agner 	uint32_t value;
126*4e76c077SStefan Agner } dcd_addr_data_t;
127*4e76c077SStefan Agner 
128*4e76c077SStefan Agner typedef struct {
129*4e76c077SStefan Agner 	uint8_t tag;
130*4e76c077SStefan Agner 	uint16_t length;
131*4e76c077SStefan Agner 	uint8_t version;
132*4e76c077SStefan Agner } __attribute__((packed)) ivt_header_t;
133*4e76c077SStefan Agner 
134*4e76c077SStefan Agner typedef struct {
135*4e76c077SStefan Agner 	uint8_t tag;
136*4e76c077SStefan Agner 	uint16_t length;
137*4e76c077SStefan Agner 	uint8_t param;
138*4e76c077SStefan Agner } __attribute__((packed)) write_dcd_command_t;
139*4e76c077SStefan Agner 
140*4e76c077SStefan Agner struct dcd_v2_cmd {
141*4e76c077SStefan Agner 	write_dcd_command_t write_dcd_command;
142*4e76c077SStefan Agner 	dcd_addr_data_t addr_data[MAX_HW_CFG_SIZE_V2];
143*4e76c077SStefan Agner };
144*4e76c077SStefan Agner 
145*4e76c077SStefan Agner typedef struct {
146*4e76c077SStefan Agner 	ivt_header_t header;
147*4e76c077SStefan Agner 	struct dcd_v2_cmd dcd_cmd;
148*4e76c077SStefan Agner 	uint32_t padding[1]; /* end up on an 8-byte boundary */
149*4e76c077SStefan Agner } dcd_v2_t;
150*4e76c077SStefan Agner 
151*4e76c077SStefan Agner typedef struct {
152*4e76c077SStefan Agner 	uint32_t start;
153*4e76c077SStefan Agner 	uint32_t size;
154*4e76c077SStefan Agner 	uint32_t plugin;
155*4e76c077SStefan Agner } boot_data_t;
156*4e76c077SStefan Agner 
157*4e76c077SStefan Agner typedef struct {
158*4e76c077SStefan Agner 	ivt_header_t header;
159*4e76c077SStefan Agner 	uint32_t entry;
160*4e76c077SStefan Agner 	uint32_t reserved1;
161*4e76c077SStefan Agner 	uint32_t dcd_ptr;
162*4e76c077SStefan Agner 	uint32_t boot_data_ptr;
163*4e76c077SStefan Agner 	uint32_t self;
164*4e76c077SStefan Agner 	uint32_t csf;
165*4e76c077SStefan Agner 	uint32_t reserved2;
166*4e76c077SStefan Agner } flash_header_v2_t;
167*4e76c077SStefan Agner 
168*4e76c077SStefan Agner typedef struct {
169*4e76c077SStefan Agner 	flash_header_v2_t fhdr;
170*4e76c077SStefan Agner 	boot_data_t boot_data;
171*4e76c077SStefan Agner 	union {
172*4e76c077SStefan Agner 		dcd_v2_t dcd_table;
173*4e76c077SStefan Agner 		char plugin_code[MAX_PLUGIN_CODE_SIZE];
174*4e76c077SStefan Agner 	} data;
175*4e76c077SStefan Agner } imx_header_v2_t;
176*4e76c077SStefan Agner 
177*4e76c077SStefan Agner /* The header must be aligned to 4k on MX53 for NAND boot */
178*4e76c077SStefan Agner struct imx_header {
179*4e76c077SStefan Agner 	union {
180*4e76c077SStefan Agner 		imx_header_v1_t hdr_v1;
181*4e76c077SStefan Agner 		imx_header_v2_t hdr_v2;
182*4e76c077SStefan Agner 	} header;
183*4e76c077SStefan Agner };
184*4e76c077SStefan Agner 
185*4e76c077SStefan Agner typedef void (*set_dcd_val_t)(struct imx_header *imxhdr,
186*4e76c077SStefan Agner 					char *name, int lineno,
187*4e76c077SStefan Agner 					int fld, uint32_t value,
188*4e76c077SStefan Agner 					uint32_t off);
189*4e76c077SStefan Agner 
190*4e76c077SStefan Agner typedef void (*set_dcd_param_t)(struct imx_header *imxhdr, uint32_t dcd_len,
191*4e76c077SStefan Agner 					int32_t cmd);
192*4e76c077SStefan Agner 
193*4e76c077SStefan Agner typedef void (*set_dcd_rst_t)(struct imx_header *imxhdr,
194*4e76c077SStefan Agner 					uint32_t dcd_len,
195*4e76c077SStefan Agner 					char *name, int lineno);
196*4e76c077SStefan Agner 
197*4e76c077SStefan Agner typedef void (*set_imx_hdr_t)(struct imx_header *imxhdr, uint32_t dcd_len,
198*4e76c077SStefan Agner 		uint32_t entry_point, uint32_t flash_offset);
199*4e76c077SStefan Agner 
200*4e76c077SStefan Agner #endif /* _IMXIMAGE_H_ */
201