Home | History | Annotate | Download | only in tools
      1 /* SPDX-License-Identifier: GPL-2.0+ */
      2 /*
      3  * Freescale i.MX28 SB image generator
      4  *
      5  * Copyright (C) 2012 Marek Vasut <marex (at) 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  */
    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