xref: /openbmc/u-boot/include/imx8image.h (revision cf033e04da315ba949e804c127abae0134bda30f)
1*a2b96eceSPeng Fan /* SPDX-License-Identifier: GPL-2.0+ */
2*a2b96eceSPeng Fan /*
3*a2b96eceSPeng Fan  * Copyright 2018 NXP
4*a2b96eceSPeng Fan  *
5*a2b96eceSPeng Fan  * Peng Fan <peng.fan@nxp.com>
6*a2b96eceSPeng Fan  */
7*a2b96eceSPeng Fan 
8*a2b96eceSPeng Fan #ifndef _IMX8IMAGE_H_
9*a2b96eceSPeng Fan #define _IMX8IMAGE_H_
10*a2b96eceSPeng Fan 
11*a2b96eceSPeng Fan #include <image.h>
12*a2b96eceSPeng Fan #include <inttypes.h>
13*a2b96eceSPeng Fan #include "imagetool.h"
14*a2b96eceSPeng Fan #include "linux/kernel.h"
15*a2b96eceSPeng Fan 
16*a2b96eceSPeng Fan #define __packed   __attribute__((packed))
17*a2b96eceSPeng Fan 
18*a2b96eceSPeng Fan #define IV_MAX_LEN			32
19*a2b96eceSPeng Fan #define HASH_MAX_LEN			64
20*a2b96eceSPeng Fan #define MAX_NUM_IMGS			6
21*a2b96eceSPeng Fan #define MAX_NUM_SRK_RECORDS		4
22*a2b96eceSPeng Fan 
23*a2b96eceSPeng Fan #define IVT_HEADER_TAG_B0		0x87
24*a2b96eceSPeng Fan #define IVT_VERSION_B0			0x00
25*a2b96eceSPeng Fan 
26*a2b96eceSPeng Fan #define IMG_FLAG_HASH_SHA256		0x000
27*a2b96eceSPeng Fan #define IMG_FLAG_HASH_SHA384		0x100
28*a2b96eceSPeng Fan #define IMG_FLAG_HASH_SHA512		0x200
29*a2b96eceSPeng Fan 
30*a2b96eceSPeng Fan #define IMG_FLAG_ENCRYPTED_MASK		0x400
31*a2b96eceSPeng Fan #define IMG_FLAG_ENCRYPTED_SHIFT	0x0A
32*a2b96eceSPeng Fan 
33*a2b96eceSPeng Fan #define IMG_FLAG_BOOTFLAGS_MASK		0xFFFF0000
34*a2b96eceSPeng Fan #define IMG_FLAG_BOOTFLAGS_SHIFT	0x10
35*a2b96eceSPeng Fan 
36*a2b96eceSPeng Fan #define IMG_ARRAY_ENTRY_SIZE		128
37*a2b96eceSPeng Fan #define HEADER_IMG_ARRAY_OFFSET		0x10
38*a2b96eceSPeng Fan 
39*a2b96eceSPeng Fan #define HASH_TYPE_SHA_256		256
40*a2b96eceSPeng Fan #define HASH_TYPE_SHA_384		384
41*a2b96eceSPeng Fan #define HASH_TYPE_SHA_512		512
42*a2b96eceSPeng Fan 
43*a2b96eceSPeng Fan #define IMAGE_HASH_ALGO_DEFAULT		384
44*a2b96eceSPeng Fan #define IMAGE_PADDING_DEFAULT		0x1000
45*a2b96eceSPeng Fan 
46*a2b96eceSPeng Fan #define DCD_ENTRY_ADDR_IN_SCFW		0x240
47*a2b96eceSPeng Fan 
48*a2b96eceSPeng Fan #define CONTAINER_ALIGNMENT		0x400
49*a2b96eceSPeng Fan #define CONTAINER_FLAGS_DEFAULT		0x10
50*a2b96eceSPeng Fan #define CONTAINER_FUSE_DEFAULT		0x0
51*a2b96eceSPeng Fan 
52*a2b96eceSPeng Fan #define SIGNATURE_BLOCK_HEADER_LENGTH	0x10
53*a2b96eceSPeng Fan 
54*a2b96eceSPeng Fan #define MAX_NUM_OF_CONTAINER		2
55*a2b96eceSPeng Fan 
56*a2b96eceSPeng Fan #define FIRST_CONTAINER_HEADER_LENGTH	0x400
57*a2b96eceSPeng Fan 
58*a2b96eceSPeng Fan #define BOOT_IMG_META_MU_RID_SHIFT	10
59*a2b96eceSPeng Fan #define BOOT_IMG_META_PART_ID_SHIFT	20
60*a2b96eceSPeng Fan 
61*a2b96eceSPeng Fan #define IMAGE_A35_DEFAULT_META(PART)	(((PART == 0) ? \
62*a2b96eceSPeng Fan 					 PARTITION_ID_AP : PART) << \
63*a2b96eceSPeng Fan 					 BOOT_IMG_META_PART_ID_SHIFT | \
64*a2b96eceSPeng Fan 					 SC_R_MU_0A << \
65*a2b96eceSPeng Fan 					 BOOT_IMG_META_MU_RID_SHIFT | \
66*a2b96eceSPeng Fan 					 SC_R_A35_0)
67*a2b96eceSPeng Fan 
68*a2b96eceSPeng Fan #define IMAGE_A53_DEFAULT_META(PART)	(((PART == 0) ? \
69*a2b96eceSPeng Fan 					 PARTITION_ID_AP : PART) << \
70*a2b96eceSPeng Fan 					 BOOT_IMG_META_PART_ID_SHIFT | \
71*a2b96eceSPeng Fan 					 SC_R_MU_0A << \
72*a2b96eceSPeng Fan 					 BOOT_IMG_META_MU_RID_SHIFT | \
73*a2b96eceSPeng Fan 					 SC_R_A53_0)
74*a2b96eceSPeng Fan 
75*a2b96eceSPeng Fan #define IMAGE_A72_DEFAULT_META(PART)	(((PART == 0) ? \
76*a2b96eceSPeng Fan 					 PARTITION_ID_AP : PART) << \
77*a2b96eceSPeng Fan 					 BOOT_IMG_META_PART_ID_SHIFT | \
78*a2b96eceSPeng Fan 					 SC_R_MU_0A << \
79*a2b96eceSPeng Fan 					 BOOT_IMG_META_MU_RID_SHIFT | \
80*a2b96eceSPeng Fan 					 SC_R_A72_0)
81*a2b96eceSPeng Fan 
82*a2b96eceSPeng Fan #define IMAGE_M4_0_DEFAULT_META(PART)	(((PART == 0) ? \
83*a2b96eceSPeng Fan 					 PARTITION_ID_M4 : PART) << \
84*a2b96eceSPeng Fan 					 BOOT_IMG_META_PART_ID_SHIFT | \
85*a2b96eceSPeng Fan 					 SC_R_M4_0_MU_1A << \
86*a2b96eceSPeng Fan 					 BOOT_IMG_META_MU_RID_SHIFT | \
87*a2b96eceSPeng Fan 					 SC_R_M4_0_PID0)
88*a2b96eceSPeng Fan 
89*a2b96eceSPeng Fan #define IMAGE_M4_1_DEFAULT_META(PART)	(((PART == 0) ? \
90*a2b96eceSPeng Fan 					 PARTITION_ID_M4 : PART) << \
91*a2b96eceSPeng Fan 					 BOOT_IMG_META_PART_ID_SHIFT | \
92*a2b96eceSPeng Fan 					 SC_R_M4_1_MU_1A << \
93*a2b96eceSPeng Fan 					 BOOT_IMG_META_MU_RID_SHIFT | \
94*a2b96eceSPeng Fan 					 SC_R_M4_1_PID0)
95*a2b96eceSPeng Fan 
96*a2b96eceSPeng Fan #define CONTAINER_IMAGE_ARRAY_START_OFFSET	0x2000
97*a2b96eceSPeng Fan 
98*a2b96eceSPeng Fan typedef struct {
99*a2b96eceSPeng Fan 	uint8_t version;
100*a2b96eceSPeng Fan 	uint16_t length;
101*a2b96eceSPeng Fan 	uint8_t tag;
102*a2b96eceSPeng Fan 	uint16_t srk_table_offset;
103*a2b96eceSPeng Fan 	uint16_t cert_offset;
104*a2b96eceSPeng Fan 	uint16_t blob_offset;
105*a2b96eceSPeng Fan 	uint16_t signature_offset;
106*a2b96eceSPeng Fan 	uint32_t reserved;
107*a2b96eceSPeng Fan } __packed sig_blk_hdr_t;
108*a2b96eceSPeng Fan 
109*a2b96eceSPeng Fan typedef struct {
110*a2b96eceSPeng Fan 	uint32_t offset;
111*a2b96eceSPeng Fan 	uint32_t size;
112*a2b96eceSPeng Fan 	uint64_t dst;
113*a2b96eceSPeng Fan 	uint64_t entry;
114*a2b96eceSPeng Fan 	uint32_t hab_flags;
115*a2b96eceSPeng Fan 	uint32_t meta;
116*a2b96eceSPeng Fan 	uint8_t hash[HASH_MAX_LEN];
117*a2b96eceSPeng Fan 	uint8_t iv[IV_MAX_LEN];
118*a2b96eceSPeng Fan } __packed boot_img_t;
119*a2b96eceSPeng Fan 
120*a2b96eceSPeng Fan typedef struct {
121*a2b96eceSPeng Fan 	uint8_t version;
122*a2b96eceSPeng Fan 	uint16_t length;
123*a2b96eceSPeng Fan 	uint8_t tag;
124*a2b96eceSPeng Fan 	uint32_t flags;
125*a2b96eceSPeng Fan 	uint16_t sw_version;
126*a2b96eceSPeng Fan 	uint8_t fuse_version;
127*a2b96eceSPeng Fan 	uint8_t num_images;
128*a2b96eceSPeng Fan 	uint16_t sig_blk_offset;
129*a2b96eceSPeng Fan 	uint16_t reserved;
130*a2b96eceSPeng Fan 	boot_img_t img[MAX_NUM_IMGS];
131*a2b96eceSPeng Fan 	sig_blk_hdr_t sig_blk_hdr;
132*a2b96eceSPeng Fan 	uint32_t sigblk_size;
133*a2b96eceSPeng Fan 	uint32_t padding;
134*a2b96eceSPeng Fan } __packed flash_header_v3_t;
135*a2b96eceSPeng Fan 
136*a2b96eceSPeng Fan typedef struct {
137*a2b96eceSPeng Fan 	flash_header_v3_t fhdr[MAX_NUM_OF_CONTAINER];
138*a2b96eceSPeng Fan }  __packed imx_header_v3_t;
139*a2b96eceSPeng Fan 
140*a2b96eceSPeng Fan struct image_array {
141*a2b96eceSPeng Fan 	char *name;
142*a2b96eceSPeng Fan 	unsigned int core_type;
143*a2b96eceSPeng Fan 	unsigned int core_id;
144*a2b96eceSPeng Fan 	unsigned int load_addr;
145*a2b96eceSPeng Fan };
146*a2b96eceSPeng Fan 
147*a2b96eceSPeng Fan enum imx8image_cmd {
148*a2b96eceSPeng Fan 	CMD_INVALID,
149*a2b96eceSPeng Fan 	CMD_BOOT_FROM,
150*a2b96eceSPeng Fan 	CMD_FUSE_VERSION,
151*a2b96eceSPeng Fan 	CMD_SW_VERSION,
152*a2b96eceSPeng Fan 	CMD_MSG_BLOCK,
153*a2b96eceSPeng Fan 	CMD_FILEOFF,
154*a2b96eceSPeng Fan 	CMD_FLAG,
155*a2b96eceSPeng Fan 	CMD_APPEND,
156*a2b96eceSPeng Fan 	CMD_PARTITION,
157*a2b96eceSPeng Fan 	CMD_SOC_TYPE,
158*a2b96eceSPeng Fan 	CMD_CONTAINER,
159*a2b96eceSPeng Fan 	CMD_IMAGE,
160*a2b96eceSPeng Fan 	CMD_DATA
161*a2b96eceSPeng Fan };
162*a2b96eceSPeng Fan 
163*a2b96eceSPeng Fan enum imx8image_core_type {
164*a2b96eceSPeng Fan 	CFG_CORE_INVALID,
165*a2b96eceSPeng Fan 	CFG_SCU,
166*a2b96eceSPeng Fan 	CFG_M40,
167*a2b96eceSPeng Fan 	CFG_M41,
168*a2b96eceSPeng Fan 	CFG_A35,
169*a2b96eceSPeng Fan 	CFG_A53,
170*a2b96eceSPeng Fan 	CFG_A72
171*a2b96eceSPeng Fan };
172*a2b96eceSPeng Fan 
173*a2b96eceSPeng Fan enum imx8image_fld_types {
174*a2b96eceSPeng Fan 	CFG_INVALID = -1,
175*a2b96eceSPeng Fan 	CFG_COMMAND,
176*a2b96eceSPeng Fan 	CFG_CORE_TYPE,
177*a2b96eceSPeng Fan 	CFG_IMAGE_NAME,
178*a2b96eceSPeng Fan 	CFG_LOAD_ADDR
179*a2b96eceSPeng Fan };
180*a2b96eceSPeng Fan 
181*a2b96eceSPeng Fan typedef enum SOC_TYPE {
182*a2b96eceSPeng Fan 	NONE = 0,
183*a2b96eceSPeng Fan 	QX,
184*a2b96eceSPeng Fan 	QM
185*a2b96eceSPeng Fan } soc_type_t;
186*a2b96eceSPeng Fan 
187*a2b96eceSPeng Fan typedef enum option_type {
188*a2b96eceSPeng Fan 	NO_IMG = 0,
189*a2b96eceSPeng Fan 	DCD,
190*a2b96eceSPeng Fan 	SCFW,
191*a2b96eceSPeng Fan 	SECO,
192*a2b96eceSPeng Fan 	M40,
193*a2b96eceSPeng Fan 	M41,
194*a2b96eceSPeng Fan 	AP,
195*a2b96eceSPeng Fan 	OUTPUT,
196*a2b96eceSPeng Fan 	SCD,
197*a2b96eceSPeng Fan 	CSF,
198*a2b96eceSPeng Fan 	FLAG,
199*a2b96eceSPeng Fan 	DEVICE,
200*a2b96eceSPeng Fan 	NEW_CONTAINER,
201*a2b96eceSPeng Fan 	APPEND,
202*a2b96eceSPeng Fan 	DATA,
203*a2b96eceSPeng Fan 	PARTITION,
204*a2b96eceSPeng Fan 	FILEOFF,
205*a2b96eceSPeng Fan 	MSG_BLOCK
206*a2b96eceSPeng Fan } option_type_t;
207*a2b96eceSPeng Fan 
208*a2b96eceSPeng Fan typedef struct {
209*a2b96eceSPeng Fan 	option_type_t option;
210*a2b96eceSPeng Fan 	char *filename;
211*a2b96eceSPeng Fan 	uint64_t src;
212*a2b96eceSPeng Fan 	uint64_t dst;
213*a2b96eceSPeng Fan 	uint64_t entry;
214*a2b96eceSPeng Fan 	uint64_t ext;
215*a2b96eceSPeng Fan } image_t;
216*a2b96eceSPeng Fan 
217*a2b96eceSPeng Fan #define CORE_SC         1
218*a2b96eceSPeng Fan #define CORE_CM4_0      2
219*a2b96eceSPeng Fan #define CORE_CM4_1      3
220*a2b96eceSPeng Fan #define CORE_CA53       4
221*a2b96eceSPeng Fan #define CORE_CA35       4
222*a2b96eceSPeng Fan #define CORE_CA72       5
223*a2b96eceSPeng Fan #define CORE_SECO       6
224*a2b96eceSPeng Fan 
225*a2b96eceSPeng Fan #define SC_R_OTP	357U
226*a2b96eceSPeng Fan #define SC_R_DEBUG	354U
227*a2b96eceSPeng Fan #define SC_R_ROM_0	236U
228*a2b96eceSPeng Fan 
229*a2b96eceSPeng Fan #define MSG_DEBUG_EN	SC_R_DEBUG
230*a2b96eceSPeng Fan #define MSG_FUSE	SC_R_OTP
231*a2b96eceSPeng Fan #define MSG_FIELD	SC_R_ROM_0
232*a2b96eceSPeng Fan 
233*a2b96eceSPeng Fan #define IMG_TYPE_CSF     0x01   /* CSF image type */
234*a2b96eceSPeng Fan #define IMG_TYPE_SCD     0x02   /* SCD image type */
235*a2b96eceSPeng Fan #define IMG_TYPE_EXEC    0x03   /* Executable image type */
236*a2b96eceSPeng Fan #define IMG_TYPE_DATA    0x04   /* Data image type */
237*a2b96eceSPeng Fan #define IMG_TYPE_DCD_DDR 0x05   /* DCD/DDR image type */
238*a2b96eceSPeng Fan #define IMG_TYPE_SECO    0x06   /* SECO image type */
239*a2b96eceSPeng Fan #define IMG_TYPE_PROV    0x07   /* Provisioning image type */
240*a2b96eceSPeng Fan #define IMG_TYPE_DEK     0x08   /* DEK validation type */
241*a2b96eceSPeng Fan 
242*a2b96eceSPeng Fan #define IMG_TYPE_SHIFT   0
243*a2b96eceSPeng Fan #define IMG_TYPE_MASK    0x1f
244*a2b96eceSPeng Fan #define IMG_TYPE(x)      (((x) & IMG_TYPE_MASK) >> IMG_TYPE_SHIFT)
245*a2b96eceSPeng Fan 
246*a2b96eceSPeng Fan #define BOOT_IMG_FLAGS_CORE_MASK		0xF
247*a2b96eceSPeng Fan #define BOOT_IMG_FLAGS_CORE_SHIFT		0x04
248*a2b96eceSPeng Fan #define BOOT_IMG_FLAGS_CPU_RID_MASK		0x3FF0
249*a2b96eceSPeng Fan #define BOOT_IMG_FLAGS_CPU_RID_SHIFT		4
250*a2b96eceSPeng Fan #define BOOT_IMG_FLAGS_MU_RID_MASK		0xFFC000
251*a2b96eceSPeng Fan #define BOOT_IMG_FLAGS_MU_RID_SHIFT		14
252*a2b96eceSPeng Fan #define BOOT_IMG_FLAGS_PARTITION_ID_MASK	0x1F000000
253*a2b96eceSPeng Fan #define BOOT_IMG_FLAGS_PARTITION_ID_SHIFT	24
254*a2b96eceSPeng Fan 
255*a2b96eceSPeng Fan /* Resource id used in scfw */
256*a2b96eceSPeng Fan #define SC_R_A35_0		508
257*a2b96eceSPeng Fan #define SC_R_A53_0		1
258*a2b96eceSPeng Fan #define SC_R_A72_0		6
259*a2b96eceSPeng Fan #define SC_R_MU_0A		213
260*a2b96eceSPeng Fan #define SC_R_M4_0_PID0		278
261*a2b96eceSPeng Fan #define SC_R_M4_0_MU_1A		297
262*a2b96eceSPeng Fan #define SC_R_M4_1_PID0		298
263*a2b96eceSPeng Fan #define SC_R_M4_1_MU_1A		317
264*a2b96eceSPeng Fan #define PARTITION_ID_M4		0
265*a2b96eceSPeng Fan #define PARTITION_ID_AP		1
266*a2b96eceSPeng Fan 
267*a2b96eceSPeng Fan #define IMG_STACK_SIZE	32
268*a2b96eceSPeng Fan 
269*a2b96eceSPeng Fan #define append(p, s, l) do { \
270*a2b96eceSPeng Fan 	memcpy((p), (uint8_t *)(s), (l)); (p) += (l); \
271*a2b96eceSPeng Fan 	} while (0)
272*a2b96eceSPeng Fan 
273*a2b96eceSPeng Fan #endif
274