uboot/tools/mxsimage.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * Freescale i.MX28 SB image generator
   4 *
   5 * Copyright (C) 2012 Marek Vasut <marex@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
  19struct 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
  28struct 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
  87struct 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
  94struct 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 */
 115static 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
 124struct 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
 137struct 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 */
 197static 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
 213enum 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
 223struct 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