2 * Freescale i.MX28 SB image generator
4 * Copyright (C) 2012 Marek Vasut <marex@denx.de>
6 * SPDX-License-Identifier: GPL-2.0+
13 #include <arpa/inet.h>
15 #define SB_BLOCK_SIZE 16
17 #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
18 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
20 struct sb_boot_image_version {
29 struct sb_boot_image_header {
31 /* SHA1 of the header. */
34 /* CBC-MAC initialization vector. */
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. */
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. */
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. */
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
72 /* Component version. */
73 struct sb_boot_image_version
75 /* Drive tag for the system drive. (since v1.1) */
81 #define SB_VERSION_MAJOR 1
82 #define SB_VERSION_MINOR 1
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
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];
95 struct sb_ivt_header {
106 #define SB_HAB_IVT_TAG 0xd1UL
107 #define SB_HAB_DCD_TAG 0xd2UL
109 #define SB_HAB_VERSION 0x40UL
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).
116 static inline uint32_t sb_hab_ivt_header(void)
119 ret |= SB_HAB_IVT_TAG << 24;
120 ret |= sizeof(struct sb_ivt_header) << 16;
121 ret |= SB_HAB_VERSION;
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;
133 uint32_t section_flags;
136 #define SB_SECTION_FLAG_BOOTABLE (1 << 0)
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 */
151 uint32_t reserved[3];
154 uint32_t section_number;
155 uint32_t section_length;
156 uint32_t section_flags;
171 /* Passed in register r0 before JUMP */
177 /* Passed in register r0 before CALL */
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
198 static const struct {
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 }
224 struct sb_source_entry {
231 #endif /* __MXSSB_H__ */