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