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