• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /* SPDX-License-Identifier: GPL-2.0+ */
2  /*
3   * Freescale i.MX28 SB image generator
4   *
5   * Copyright (C) 2012 Marek Vasut <marex@denx.de>
6   */
7  
8  #ifndef __MXSSB_H__
9  #define __MXSSB_H__
10  
11  #include <stdint.h>
12  #include <arpa/inet.h>
13  
14  #define SB_BLOCK_SIZE		16
15  
16  #define roundup(x, y)		((((x) + ((y) - 1)) / (y)) * (y))
17  #define ARRAY_SIZE(x)		(sizeof(x) / sizeof((x)[0]))
18  
19  struct sb_boot_image_version {
20  	uint16_t	major;
21  	uint16_t	pad0;
22  	uint16_t	minor;
23  	uint16_t	pad1;
24  	uint16_t	revision;
25  	uint16_t	pad2;
26  };
27  
28  struct sb_boot_image_header {
29  	union {
30  		/* SHA1 of the header. */
31  		uint8_t	digest[20];
32  		struct {
33  			/* CBC-MAC initialization vector. */
34  			uint8_t iv[16];
35  			uint8_t extra[4];
36  		};
37  	};
38  	/* 'STMP' */
39  	uint8_t		signature1[4];
40  	/* Major version of the image format. */
41  	uint8_t		major_version;
42  	/* Minor version of the image format. */
43  	uint8_t		minor_version;
44  	/* Flags associated with the image. */
45  	uint16_t	flags;
46  	/* Size of the image in 16b blocks. */
47  	uint32_t	image_blocks;
48  	/* Offset of the first tag in 16b blocks. */
49  	uint32_t	first_boot_tag_block;
50  	/* ID of the section to boot from. */
51  	uint32_t	first_boot_section_id;
52  	/* Amount of crypto keys. */
53  	uint16_t	key_count;
54  	/* Offset to the key dictionary in 16b blocks. */
55  	uint16_t	key_dictionary_block;
56  	/* Size of this header in 16b blocks. */
57  	uint16_t	header_blocks;
58  	/* Amount of section headers. */
59  	uint16_t	section_count;
60  	/* Section header size in 16b blocks. */
61  	uint16_t	section_header_size;
62  	/* Padding to align timestamp to uint64_t. */
63  	uint8_t		padding0[2];
64  	/* 'sgtl' (since v1.1) */
65  	uint8_t		signature2[4];
66  	/* Image generation date, in microseconds since 1.1.2000 . */
67  	uint64_t	timestamp_us;
68  	/* Product version. */
69  	struct sb_boot_image_version
70  			product_version;
71  	/* Component version. */
72  	struct sb_boot_image_version
73  			component_version;
74  	/* Drive tag for the system drive. (since v1.1) */
75  	uint16_t	drive_tag;
76  	/* Padding. */
77  	uint8_t		padding1[6];
78  };
79  
80  #define	SB_VERSION_MAJOR	1
81  #define	SB_VERSION_MINOR	1
82  
83  /* Enable to HTLLC boot report. */
84  #define SB_IMAGE_FLAG_DISPLAY_PROGRESS	(1 << 0)
85  #define SB_IMAGE_FLAGS_MASK SB_IMAGE_FLAG_DISPLAY_PROGRESS
86  
87  struct sb_key_dictionary_key {
88  	/* The CBC-MAC of image and sections header. */
89  	uint8_t		cbc_mac[SB_BLOCK_SIZE];
90  	/* The AES key encrypted by image key (zero). */
91  	uint8_t		key[SB_BLOCK_SIZE];
92  };
93  
94  struct sb_ivt_header {
95  	uint32_t	header;
96  	uint32_t	entry;
97  	uint32_t	reserved1;
98  	uint32_t	dcd;
99  	uint32_t	boot_data;
100  	uint32_t	self;
101  	uint32_t	csf;
102  	uint32_t	reserved2;
103  };
104  
105  #define	SB_HAB_IVT_TAG			0xd1UL
106  #define	SB_HAB_DCD_TAG			0xd2UL
107  
108  #define	SB_HAB_VERSION			0x40UL
109  
110  /*
111   * The "size" field in the IVT header is not naturally aligned,
112   * use this macro to fill first 4 bytes of the IVT header without
113   * causing issues on some systems (esp. M68k, PPC, MIPS-BE, ARM-BE).
114   */
sb_hab_ivt_header(void)115  static inline uint32_t sb_hab_ivt_header(void)
116  {
117  	uint32_t ret = 0;
118  	ret |= SB_HAB_IVT_TAG << 24;
119  	ret |= sizeof(struct sb_ivt_header) << 16;
120  	ret |= SB_HAB_VERSION;
121  	return htonl(ret);
122  }
123  
124  struct sb_sections_header {
125  	/* Section number. */
126  	uint32_t	section_number;
127  	/* Offset of this sections first instruction after "TAG". */
128  	uint32_t	section_offset;
129  	/* Size of the section in 16b blocks. */
130  	uint32_t	section_size;
131  	/* Section flags. */
132  	uint32_t	section_flags;
133  };
134  
135  #define	SB_SECTION_FLAG_BOOTABLE	(1 << 0)
136  
137  struct sb_command {
138  	struct {
139  		uint8_t		checksum;
140  		uint8_t		tag;
141  		uint16_t	flags;
142  #define ROM_TAG_CMD_FLAG_ROM_LAST_TAG	0x1
143  #define ROM_LOAD_CMD_FLAG_DCD_LOAD	0x1	/* MX28 only */
144  #define ROM_JUMP_CMD_FLAG_HAB		0x1	/* MX28 only */
145  #define ROM_CALL_CMD_FLAG_HAB		0x1	/* MX28 only */
146  	} header;
147  
148  	union {
149  	struct {
150  		uint32_t	reserved[3];
151  	} nop;
152  	struct {
153  		uint32_t	section_number;
154  		uint32_t	section_length;
155  		uint32_t	section_flags;
156  	} tag;
157  	struct {
158  		uint32_t	address;
159  		uint32_t	count;
160  		uint32_t	crc32;
161  	} load;
162  	struct {
163  		uint32_t	address;
164  		uint32_t	count;
165  		uint32_t	pattern;
166  	} fill;
167  	struct {
168  		uint32_t	address;
169  		uint32_t	reserved;
170  		/* Passed in register r0 before JUMP */
171  		uint32_t	argument;
172  	} jump;
173  	struct {
174  		uint32_t	address;
175  		uint32_t	reserved;
176  		/* Passed in register r0 before CALL */
177  		uint32_t	argument;
178  	} call;
179  	struct {
180  		uint32_t	reserved1;
181  		uint32_t	reserved2;
182  		uint32_t	mode;
183  	} mode;
184  
185  	};
186  };
187  
188  /*
189   * Most of the mode names are same or at least similar
190   * on i.MX23 and i.MX28, but some of the mode names
191   * differ. The "name" field represents the mode name
192   * on i.MX28 as seen in Table 12-2 of the datasheet.
193   * The "altname" field represents the differently named
194   * fields on i.MX23 as seen in Table 35-3 of the
195   * datasheet.
196   */
197  static const struct {
198  	const char	*name;
199  	const char	*altname;
200  	const uint8_t	mode;
201  } modetable[] = {
202  	{ "USB",		NULL,		0x00 },
203  	{ "I2C",		NULL,		0x01 },
204  	{ "SPI2_FLASH",		"SPI1_FLASH",	0x02 },
205  	{ "SPI3_FLASH",		"SPI2_FLASH",	0x03 },
206  	{ "NAND_BCH",		NULL,		0x04 },
207  	{ "JTAG",		NULL,		0x06 },
208  	{ "SPI3_EEPROM",	"SPI2_EEPROM",	0x08 },
209  	{ "SD_SSP0",		NULL,		0x09 },
210  	{ "SD_SSP1",		NULL,		0x0A }
211  };
212  
213  enum sb_tag {
214  	ROM_NOP_CMD	= 0x00,
215  	ROM_TAG_CMD	= 0x01,
216  	ROM_LOAD_CMD	= 0x02,
217  	ROM_FILL_CMD	= 0x03,
218  	ROM_JUMP_CMD	= 0x04,
219  	ROM_CALL_CMD	= 0x05,
220  	ROM_MODE_CMD	= 0x06
221  };
222  
223  struct sb_source_entry {
224  	uint8_t		tag;
225  	uint32_t	address;
226  	uint32_t	flags;
227  	char		*filename;
228  };
229  
230  #endif	/* __MXSSB_H__ */
231