Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / u-boot / tools / mxsimage.h
diff --git a/qemu/roms/u-boot/tools/mxsimage.h b/qemu/roms/u-boot/tools/mxsimage.h
new file mode 100644 (file)
index 0000000..6cd59d2
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+ * Freescale i.MX28 SB image generator
+ *
+ * Copyright (C) 2012 Marek Vasut <marex@denx.de>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#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 verbose boot report. */
+#define SB_IMAGE_FLAG_VERBOSE  (1 << 0)
+
+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__ */