blob: a6a45a4b03a0a42e049b1731fc8be32f1c9add05 [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001/* SPDX-License-Identifier: GPL-2.0+ */
Marek Vasutbce88372013-08-26 20:43:33 +02002/*
3 * Freescale i.MX28 SB image generator
4 *
5 * Copyright (C) 2012 Marek Vasut <marex@denx.de>
Marek Vasutbce88372013-08-26 20:43:33 +02006 */
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
19struct 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
28struct 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
Alexey Ignatov7a139952014-10-12 01:43:30 +040083/* 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
Marek Vasutbce88372013-08-26 20:43:33 +020086
87struct 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
94struct 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 */
115static 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
124struct 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
137struct 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 */
197static 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
213enum 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
223struct sb_source_entry {
224 uint8_t tag;
225 uint32_t address;
226 uint32_t flags;
227 char *filename;
228};
229
230#endif /* __MXSSB_H__ */