mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-29 01:23:25 +01:00 
			
		
		
		
	When U-Boot started using SPDX tags we were among the early adopters and there weren't a lot of other examples to borrow from. So we picked the area of the file that usually had a full license text and replaced it with an appropriate SPDX-License-Identifier: entry. Since then, the Linux Kernel has adopted SPDX tags and they place it as the very first line in a file (except where shebangs are used, then it's second line) and with slightly different comment styles than us. In part due to community overlap, in part due to better tag visibility and in part for other minor reasons, switch over to that style. This commit changes all instances where we have a single declared license in the tag as both the before and after are identical in tag contents. There's also a few places where I found we did not have a tag and have introduced one. Signed-off-by: Tom Rini <trini@konsulko.com>
		
			
				
	
	
		
			231 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			231 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0+ */
 | |
| /*
 | |
|  * Freescale i.MX28 SB image generator
 | |
|  *
 | |
|  * Copyright (C) 2012 Marek Vasut <marex@denx.de>
 | |
|  */
 | |
| 
 | |
| #ifndef __MXSSB_H__
 | |
| #define __MXSSB_H__
 | |
| 
 | |
| #include <stdint.h>
 | |
| #include <arpa/inet.h>
 | |
| 
 | |
| #define SB_BLOCK_SIZE		16
 | |
| 
 | |
| #define roundup(x, y)		((((x) + ((y) - 1)) / (y)) * (y))
 | |
| #define ARRAY_SIZE(x)		(sizeof(x) / sizeof((x)[0]))
 | |
| 
 | |
| struct sb_boot_image_version {
 | |
| 	uint16_t	major;
 | |
| 	uint16_t	pad0;
 | |
| 	uint16_t	minor;
 | |
| 	uint16_t	pad1;
 | |
| 	uint16_t	revision;
 | |
| 	uint16_t	pad2;
 | |
| };
 | |
| 
 | |
| struct sb_boot_image_header {
 | |
| 	union {
 | |
| 		/* SHA1 of the header. */
 | |
| 		uint8_t	digest[20];
 | |
| 		struct {
 | |
| 			/* CBC-MAC initialization vector. */
 | |
| 			uint8_t iv[16];
 | |
| 			uint8_t extra[4];
 | |
| 		};
 | |
| 	};
 | |
| 	/* 'STMP' */
 | |
| 	uint8_t		signature1[4];
 | |
| 	/* Major version of the image format. */
 | |
| 	uint8_t		major_version;
 | |
| 	/* Minor version of the image format. */
 | |
| 	uint8_t		minor_version;
 | |
| 	/* Flags associated with the image. */
 | |
| 	uint16_t	flags;
 | |
| 	/* Size of the image in 16b blocks. */
 | |
| 	uint32_t	image_blocks;
 | |
| 	/* Offset of the first tag in 16b blocks. */
 | |
| 	uint32_t	first_boot_tag_block;
 | |
| 	/* ID of the section to boot from. */
 | |
| 	uint32_t	first_boot_section_id;
 | |
| 	/* Amount of crypto keys. */
 | |
| 	uint16_t	key_count;
 | |
| 	/* Offset to the key dictionary in 16b blocks. */
 | |
| 	uint16_t	key_dictionary_block;
 | |
| 	/* Size of this header in 16b blocks. */
 | |
| 	uint16_t	header_blocks;
 | |
| 	/* Amount of section headers. */
 | |
| 	uint16_t	section_count;
 | |
| 	/* Section header size in 16b blocks. */
 | |
| 	uint16_t	section_header_size;
 | |
| 	/* Padding to align timestamp to uint64_t. */
 | |
| 	uint8_t		padding0[2];
 | |
| 	/* 'sgtl' (since v1.1) */
 | |
| 	uint8_t		signature2[4];
 | |
| 	/* Image generation date, in microseconds since 1.1.2000 . */
 | |
| 	uint64_t	timestamp_us;
 | |
| 	/* Product version. */
 | |
| 	struct sb_boot_image_version
 | |
| 			product_version;
 | |
| 	/* Component version. */
 | |
| 	struct sb_boot_image_version
 | |
| 			component_version;
 | |
| 	/* Drive tag for the system drive. (since v1.1) */
 | |
| 	uint16_t	drive_tag;
 | |
| 	/* Padding. */
 | |
| 	uint8_t		padding1[6];
 | |
| };
 | |
| 
 | |
| #define	SB_VERSION_MAJOR	1
 | |
| #define	SB_VERSION_MINOR	1
 | |
| 
 | |
| /* Enable to HTLLC boot report. */
 | |
| #define SB_IMAGE_FLAG_DISPLAY_PROGRESS	(1 << 0)
 | |
| #define SB_IMAGE_FLAGS_MASK SB_IMAGE_FLAG_DISPLAY_PROGRESS
 | |
| 
 | |
| struct sb_key_dictionary_key {
 | |
| 	/* The CBC-MAC of image and sections header. */
 | |
| 	uint8_t		cbc_mac[SB_BLOCK_SIZE];
 | |
| 	/* The AES key encrypted by image key (zero). */
 | |
| 	uint8_t		key[SB_BLOCK_SIZE];
 | |
| };
 | |
| 
 | |
| struct sb_ivt_header {
 | |
| 	uint32_t	header;
 | |
| 	uint32_t	entry;
 | |
| 	uint32_t	reserved1;
 | |
| 	uint32_t	dcd;
 | |
| 	uint32_t	boot_data;
 | |
| 	uint32_t	self;
 | |
| 	uint32_t	csf;
 | |
| 	uint32_t	reserved2;
 | |
| };
 | |
| 
 | |
| #define	SB_HAB_IVT_TAG			0xd1UL
 | |
| #define	SB_HAB_DCD_TAG			0xd2UL
 | |
| 
 | |
| #define	SB_HAB_VERSION			0x40UL
 | |
| 
 | |
| /*
 | |
|  * The "size" field in the IVT header is not naturally aligned,
 | |
|  * use this macro to fill first 4 bytes of the IVT header without
 | |
|  * causing issues on some systems (esp. M68k, PPC, MIPS-BE, ARM-BE).
 | |
|  */
 | |
| static inline uint32_t sb_hab_ivt_header(void)
 | |
| {
 | |
| 	uint32_t ret = 0;
 | |
| 	ret |= SB_HAB_IVT_TAG << 24;
 | |
| 	ret |= sizeof(struct sb_ivt_header) << 16;
 | |
| 	ret |= SB_HAB_VERSION;
 | |
| 	return htonl(ret);
 | |
| }
 | |
| 
 | |
| struct sb_sections_header {
 | |
| 	/* Section number. */
 | |
| 	uint32_t	section_number;
 | |
| 	/* Offset of this sections first instruction after "TAG". */
 | |
| 	uint32_t	section_offset;
 | |
| 	/* Size of the section in 16b blocks. */
 | |
| 	uint32_t	section_size;
 | |
| 	/* Section flags. */
 | |
| 	uint32_t	section_flags;
 | |
| };
 | |
| 
 | |
| #define	SB_SECTION_FLAG_BOOTABLE	(1 << 0)
 | |
| 
 | |
| struct sb_command {
 | |
| 	struct {
 | |
| 		uint8_t		checksum;
 | |
| 		uint8_t		tag;
 | |
| 		uint16_t	flags;
 | |
| #define ROM_TAG_CMD_FLAG_ROM_LAST_TAG	0x1
 | |
| #define ROM_LOAD_CMD_FLAG_DCD_LOAD	0x1	/* MX28 only */
 | |
| #define ROM_JUMP_CMD_FLAG_HAB		0x1	/* MX28 only */
 | |
| #define ROM_CALL_CMD_FLAG_HAB		0x1	/* MX28 only */
 | |
| 	} header;
 | |
| 
 | |
| 	union {
 | |
| 	struct {
 | |
| 		uint32_t	reserved[3];
 | |
| 	} nop;
 | |
| 	struct {
 | |
| 		uint32_t	section_number;
 | |
| 		uint32_t	section_length;
 | |
| 		uint32_t	section_flags;
 | |
| 	} tag;
 | |
| 	struct {
 | |
| 		uint32_t	address;
 | |
| 		uint32_t	count;
 | |
| 		uint32_t	crc32;
 | |
| 	} load;
 | |
| 	struct {
 | |
| 		uint32_t	address;
 | |
| 		uint32_t	count;
 | |
| 		uint32_t	pattern;
 | |
| 	} fill;
 | |
| 	struct {
 | |
| 		uint32_t	address;
 | |
| 		uint32_t	reserved;
 | |
| 		/* Passed in register r0 before JUMP */
 | |
| 		uint32_t	argument;
 | |
| 	} jump;
 | |
| 	struct {
 | |
| 		uint32_t	address;
 | |
| 		uint32_t	reserved;
 | |
| 		/* Passed in register r0 before CALL */
 | |
| 		uint32_t	argument;
 | |
| 	} call;
 | |
| 	struct {
 | |
| 		uint32_t	reserved1;
 | |
| 		uint32_t	reserved2;
 | |
| 		uint32_t	mode;
 | |
| 	} mode;
 | |
| 
 | |
| 	};
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Most of the mode names are same or at least similar
 | |
|  * on i.MX23 and i.MX28, but some of the mode names
 | |
|  * differ. The "name" field represents the mode name
 | |
|  * on i.MX28 as seen in Table 12-2 of the datasheet.
 | |
|  * The "altname" field represents the differently named
 | |
|  * fields on i.MX23 as seen in Table 35-3 of the
 | |
|  * datasheet.
 | |
|  */
 | |
| static const struct {
 | |
| 	const char	*name;
 | |
| 	const char	*altname;
 | |
| 	const uint8_t	mode;
 | |
| } modetable[] = {
 | |
| 	{ "USB",		NULL,		0x00 },
 | |
| 	{ "I2C",		NULL,		0x01 },
 | |
| 	{ "SPI2_FLASH",		"SPI1_FLASH",	0x02 },
 | |
| 	{ "SPI3_FLASH",		"SPI2_FLASH",	0x03 },
 | |
| 	{ "NAND_BCH",		NULL,		0x04 },
 | |
| 	{ "JTAG",		NULL,		0x06 },
 | |
| 	{ "SPI3_EEPROM",	"SPI2_EEPROM",	0x08 },
 | |
| 	{ "SD_SSP0",		NULL,		0x09 },
 | |
| 	{ "SD_SSP1",		NULL,		0x0A }
 | |
| };
 | |
| 
 | |
| enum sb_tag {
 | |
| 	ROM_NOP_CMD	= 0x00,
 | |
| 	ROM_TAG_CMD	= 0x01,
 | |
| 	ROM_LOAD_CMD	= 0x02,
 | |
| 	ROM_FILL_CMD	= 0x03,
 | |
| 	ROM_JUMP_CMD	= 0x04,
 | |
| 	ROM_CALL_CMD	= 0x05,
 | |
| 	ROM_MODE_CMD	= 0x06
 | |
| };
 | |
| 
 | |
| struct sb_source_entry {
 | |
| 	uint8_t		tag;
 | |
| 	uint32_t	address;
 | |
| 	uint32_t	flags;
 | |
| 	char		*filename;
 | |
| };
 | |
| 
 | |
| #endif	/* __MXSSB_H__ */
 |