uboot/include/image.h
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2008 Semihalf
   3 *
   4 * (C) Copyright 2000-2005
   5 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   6 *
   7 * See file CREDITS for list of people who contributed to this
   8 * project.
   9 *
  10 * This program is free software; you can redistribute it and/or
  11 * modify it under the terms of the GNU General Public License as
  12 * published by the Free Software Foundation; either version 2 of
  13 * the License, or (at your option) any later version.
  14 *
  15 * This program is distributed in the hope that it will be useful,
  16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18 * GNU General Public License for more details.
  19 *
  20 * You should have received a copy of the GNU General Public License
  21 * along with this program; if not, write to the Free Software
  22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  23 * MA 02111-1307 USA
  24 *
  25 ********************************************************************
  26 * NOTE: This header file defines an interface to U-Boot. Including
  27 * this (unmodified) header file in another file is considered normal
  28 * use of U-Boot, and does *not* fall under the heading of "derived
  29 * work".
  30 ********************************************************************
  31 */
  32
  33#ifndef __IMAGE_H__
  34#define __IMAGE_H__
  35
  36#include "compiler.h"
  37
  38#ifdef USE_HOSTCC
  39
  40/* new uImage format support enabled on host */
  41#define CONFIG_FIT              1
  42#define CONFIG_OF_LIBFDT        1
  43#define CONFIG_FIT_VERBOSE      1 /* enable fit_format_{error,warning}() */
  44
  45#else
  46
  47#include <lmb.h>
  48#include <asm/u-boot.h>
  49#include <command.h>
  50
  51#endif /* USE_HOSTCC */
  52
  53#if defined(CONFIG_FIT)
  54#include <fdt.h>
  55#include <libfdt.h>
  56#include <fdt_support.h>
  57#define CONFIG_MD5              /* FIT images need MD5 support */
  58#define CONFIG_SHA1             /* and SHA1 */
  59#endif
  60
  61/*
  62 * Operating System Codes
  63 */
  64#define IH_OS_INVALID           0       /* Invalid OS   */
  65#define IH_OS_OPENBSD           1       /* OpenBSD      */
  66#define IH_OS_NETBSD            2       /* NetBSD       */
  67#define IH_OS_FREEBSD           3       /* FreeBSD      */
  68#define IH_OS_4_4BSD            4       /* 4.4BSD       */
  69#define IH_OS_LINUX             5       /* Linux        */
  70#define IH_OS_SVR4              6       /* SVR4         */
  71#define IH_OS_ESIX              7       /* Esix         */
  72#define IH_OS_SOLARIS           8       /* Solaris      */
  73#define IH_OS_IRIX              9       /* Irix         */
  74#define IH_OS_SCO               10      /* SCO          */
  75#define IH_OS_DELL              11      /* Dell         */
  76#define IH_OS_NCR               12      /* NCR          */
  77#define IH_OS_LYNXOS            13      /* LynxOS       */
  78#define IH_OS_VXWORKS           14      /* VxWorks      */
  79#define IH_OS_PSOS              15      /* pSOS         */
  80#define IH_OS_QNX               16      /* QNX          */
  81#define IH_OS_U_BOOT            17      /* Firmware     */
  82#define IH_OS_RTEMS             18      /* RTEMS        */
  83#define IH_OS_ARTOS             19      /* ARTOS        */
  84#define IH_OS_UNITY             20      /* Unity OS     */
  85#define IH_OS_INTEGRITY         21      /* INTEGRITY    */
  86
  87/*
  88 * CPU Architecture Codes (supported by Linux)
  89 */
  90#define IH_ARCH_INVALID         0       /* Invalid CPU  */
  91#define IH_ARCH_ALPHA           1       /* Alpha        */
  92#define IH_ARCH_ARM             2       /* ARM          */
  93#define IH_ARCH_I386            3       /* Intel x86    */
  94#define IH_ARCH_IA64            4       /* IA64         */
  95#define IH_ARCH_MIPS            5       /* MIPS         */
  96#define IH_ARCH_MIPS64          6       /* MIPS  64 Bit */
  97#define IH_ARCH_PPC             7       /* PowerPC      */
  98#define IH_ARCH_S390            8       /* IBM S390     */
  99#define IH_ARCH_SH              9       /* SuperH       */
 100#define IH_ARCH_SPARC           10      /* Sparc        */
 101#define IH_ARCH_SPARC64         11      /* Sparc 64 Bit */
 102#define IH_ARCH_M68K            12      /* M68K         */
 103#define IH_ARCH_NIOS            13      /* Nios-32      */
 104#define IH_ARCH_MICROBLAZE      14      /* MicroBlaze   */
 105#define IH_ARCH_NIOS2           15      /* Nios-II      */
 106#define IH_ARCH_BLACKFIN        16      /* Blackfin     */
 107#define IH_ARCH_AVR32           17      /* AVR32        */
 108#define IH_ARCH_ST200           18      /* STMicroelectronics ST200  */
 109
 110/*
 111 * Image Types
 112 *
 113 * "Standalone Programs" are directly runnable in the environment
 114 *      provided by U-Boot; it is expected that (if they behave
 115 *      well) you can continue to work in U-Boot after return from
 116 *      the Standalone Program.
 117 * "OS Kernel Images" are usually images of some Embedded OS which
 118 *      will take over control completely. Usually these programs
 119 *      will install their own set of exception handlers, device
 120 *      drivers, set up the MMU, etc. - this means, that you cannot
 121 *      expect to re-enter U-Boot except by resetting the CPU.
 122 * "RAMDisk Images" are more or less just data blocks, and their
 123 *      parameters (address, size) are passed to an OS kernel that is
 124 *      being started.
 125 * "Multi-File Images" contain several images, typically an OS
 126 *      (Linux) kernel image and one or more data images like
 127 *      RAMDisks. This construct is useful for instance when you want
 128 *      to boot over the network using BOOTP etc., where the boot
 129 *      server provides just a single image file, but you want to get
 130 *      for instance an OS kernel and a RAMDisk image.
 131 *
 132 *      "Multi-File Images" start with a list of image sizes, each
 133 *      image size (in bytes) specified by an "uint32_t" in network
 134 *      byte order. This list is terminated by an "(uint32_t)0".
 135 *      Immediately after the terminating 0 follow the images, one by
 136 *      one, all aligned on "uint32_t" boundaries (size rounded up to
 137 *      a multiple of 4 bytes - except for the last file).
 138 *
 139 * "Firmware Images" are binary images containing firmware (like
 140 *      U-Boot or FPGA images) which usually will be programmed to
 141 *      flash memory.
 142 *
 143 * "Script files" are command sequences that will be executed by
 144 *      U-Boot's command interpreter; this feature is especially
 145 *      useful when you configure U-Boot to use a real shell (hush)
 146 *      as command interpreter (=> Shell Scripts).
 147 */
 148
 149#define IH_TYPE_INVALID         0       /* Invalid Image                */
 150#define IH_TYPE_STANDALONE      1       /* Standalone Program           */
 151#define IH_TYPE_KERNEL          2       /* OS Kernel Image              */
 152#define IH_TYPE_RAMDISK         3       /* RAMDisk Image                */
 153#define IH_TYPE_MULTI           4       /* Multi-File Image             */
 154#define IH_TYPE_FIRMWARE        5       /* Firmware Image               */
 155#define IH_TYPE_SCRIPT          6       /* Script file                  */
 156#define IH_TYPE_FILESYSTEM      7       /* Filesystem Image (any type)  */
 157#define IH_TYPE_FLATDT          8       /* Binary Flat Device Tree Blob */
 158#define IH_TYPE_KWBIMAGE        9       /* Kirkwood Boot Image          */
 159#define IH_TYPE_IMXIMAGE        10      /* Freescale IMXBoot Image      */
 160
 161/*
 162 * Compression Types
 163 */
 164#define IH_COMP_NONE            0       /*  No   Compression Used       */
 165#define IH_COMP_GZIP            1       /* gzip  Compression Used       */
 166#define IH_COMP_BZIP2           2       /* bzip2 Compression Used       */
 167#define IH_COMP_LZMA            3       /* lzma  Compression Used       */
 168#define IH_COMP_LZO             4       /* lzo   Compression Used       */
 169
 170#define IH_MAGIC        0x27051956      /* Image Magic Number           */
 171#define IH_NMLEN                32      /* Image Name Length            */
 172
 173/*
 174 * Legacy format image header,
 175 * all data in network byte order (aka natural aka bigendian).
 176 */
 177typedef struct image_header {
 178        uint32_t        ih_magic;       /* Image Header Magic Number    */
 179        uint32_t        ih_hcrc;        /* Image Header CRC Checksum    */
 180        uint32_t        ih_time;        /* Image Creation Timestamp     */
 181        uint32_t        ih_size;        /* Image Data Size              */
 182        uint32_t        ih_load;        /* Data  Load  Address          */
 183        uint32_t        ih_ep;          /* Entry Point Address          */
 184        uint32_t        ih_dcrc;        /* Image Data CRC Checksum      */
 185        uint8_t         ih_os;          /* Operating System             */
 186        uint8_t         ih_arch;        /* CPU architecture             */
 187        uint8_t         ih_type;        /* Image Type                   */
 188        uint8_t         ih_comp;        /* Compression Type             */
 189        uint8_t         ih_name[IH_NMLEN];      /* Image Name           */
 190} image_header_t;
 191
 192typedef struct image_info {
 193        ulong           start, end;             /* start/end of blob */
 194        ulong           image_start, image_len; /* start of image within blob, len of image */
 195        ulong           load;                   /* load addr for the image */
 196        uint8_t         comp, type, os;         /* compression, type of image, os type */
 197} image_info_t;
 198
 199/*
 200 * Legacy and FIT format headers used by do_bootm() and do_bootm_<os>()
 201 * routines.
 202 */
 203typedef struct bootm_headers {
 204        /*
 205         * Legacy os image header, if it is a multi component image
 206         * then boot_get_ramdisk() and get_fdt() will attempt to get
 207         * data from second and third component accordingly.
 208         */
 209        image_header_t  *legacy_hdr_os;         /* image header pointer */
 210        image_header_t  legacy_hdr_os_copy;     /* header copy */
 211        ulong           legacy_hdr_valid;
 212
 213#if defined(CONFIG_FIT)
 214        const char      *fit_uname_cfg; /* configuration node unit name */
 215
 216        void            *fit_hdr_os;    /* os FIT image header */
 217        const char      *fit_uname_os;  /* os subimage node unit name */
 218        int             fit_noffset_os; /* os subimage node offset */
 219
 220        void            *fit_hdr_rd;    /* init ramdisk FIT image header */
 221        const char      *fit_uname_rd;  /* init ramdisk subimage node unit name */
 222        int             fit_noffset_rd; /* init ramdisk subimage node offset */
 223
 224        void            *fit_hdr_fdt;   /* FDT blob FIT image header */
 225        const char      *fit_uname_fdt; /* FDT blob subimage node unit name */
 226        int             fit_noffset_fdt;/* FDT blob subimage node offset */
 227#endif
 228
 229#ifndef USE_HOSTCC
 230        image_info_t    os;             /* os image info */
 231        ulong           ep;             /* entry point of OS */
 232
 233        ulong           rd_start, rd_end;/* ramdisk start/end */
 234
 235#ifdef CONFIG_OF_LIBFDT
 236        char            *ft_addr;       /* flat dev tree address */
 237#endif
 238        ulong           ft_len;         /* length of flat device tree */
 239
 240        ulong           initrd_start;
 241        ulong           initrd_end;
 242        ulong           cmdline_start;
 243        ulong           cmdline_end;
 244        bd_t            *kbd;
 245#endif
 246
 247        int             verify;         /* getenv("verify")[0] != 'n' */
 248
 249#define BOOTM_STATE_START       (0x00000001)
 250#define BOOTM_STATE_LOADOS      (0x00000002)
 251#define BOOTM_STATE_RAMDISK     (0x00000004)
 252#define BOOTM_STATE_FDT         (0x00000008)
 253#define BOOTM_STATE_OS_CMDLINE  (0x00000010)
 254#define BOOTM_STATE_OS_BD_T     (0x00000020)
 255#define BOOTM_STATE_OS_PREP     (0x00000040)
 256#define BOOTM_STATE_OS_GO       (0x00000080)
 257        int             state;
 258
 259#ifdef CONFIG_LMB
 260        struct lmb      lmb;            /* for memory mgmt */
 261#endif
 262} bootm_headers_t;
 263
 264/*
 265 * Some systems (for example LWMON) have very short watchdog periods;
 266 * we must make sure to split long operations like memmove() or
 267 * checksum calculations into reasonable chunks.
 268 */
 269#ifndef CHUNKSZ
 270#define CHUNKSZ (64 * 1024)
 271#endif
 272
 273#ifndef CHUNKSZ_CRC32
 274#define CHUNKSZ_CRC32 (64 * 1024)
 275#endif
 276
 277#ifndef CHUNKSZ_MD5
 278#define CHUNKSZ_MD5 (64 * 1024)
 279#endif
 280
 281#ifndef CHUNKSZ_SHA1
 282#define CHUNKSZ_SHA1 (64 * 1024)
 283#endif
 284
 285#define uimage_to_cpu(x)                be32_to_cpu(x)
 286#define cpu_to_uimage(x)                cpu_to_be32(x)
 287
 288/*
 289 * Translation table for entries of a specific type; used by
 290 * get_table_entry_id() and get_table_entry_name().
 291 */
 292typedef struct table_entry {
 293        int     id;
 294        char    *sname;         /* short (input) name to find table entry */
 295        char    *lname;         /* long (output) name to print for messages */
 296} table_entry_t;
 297
 298/*
 299 * get_table_entry_id() scans the translation table trying to find an
 300 * entry that matches the given short name. If a matching entry is
 301 * found, it's id is returned to the caller.
 302 */
 303int get_table_entry_id (table_entry_t *table,
 304                const char *table_name, const char *name);
 305/*
 306 * get_table_entry_name() scans the translation table trying to find
 307 * an entry that matches the given id. If a matching entry is found,
 308 * its long name is returned to the caller.
 309 */
 310char *get_table_entry_name (table_entry_t *table, char *msg, int id);
 311
 312const char *genimg_get_os_name (uint8_t os);
 313const char *genimg_get_arch_name (uint8_t arch);
 314const char *genimg_get_type_name (uint8_t type);
 315const char *genimg_get_comp_name (uint8_t comp);
 316int genimg_get_os_id (const char *name);
 317int genimg_get_arch_id (const char *name);
 318int genimg_get_type_id (const char *name);
 319int genimg_get_comp_id (const char *name);
 320void genimg_print_size (uint32_t size);
 321
 322#ifndef USE_HOSTCC
 323/* Image format types, returned by _get_format() routine */
 324#define IMAGE_FORMAT_INVALID    0x00
 325#define IMAGE_FORMAT_LEGACY     0x01    /* legacy image_header based format */
 326#define IMAGE_FORMAT_FIT        0x02    /* new, libfdt based format */
 327
 328int genimg_get_format (void *img_addr);
 329int genimg_has_config (bootm_headers_t *images);
 330ulong genimg_get_image (ulong img_addr);
 331
 332int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images,
 333                uint8_t arch, ulong *rd_start, ulong *rd_end);
 334
 335
 336#ifdef CONFIG_OF_LIBFDT
 337int boot_get_fdt (int flag, int argc, char *argv[], bootm_headers_t *images,
 338                char **of_flat_tree, ulong *of_size);
 339int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
 340                char **of_flat_tree, ulong *of_size);
 341#endif
 342
 343#if defined(CONFIG_PPC) || defined(CONFIG_M68K)
 344int boot_ramdisk_high (struct lmb *lmb, ulong rd_data, ulong rd_len,
 345                  ulong *initrd_start, ulong *initrd_end);
 346
 347int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end,
 348                        ulong bootmap_base);
 349int boot_get_kbd (struct lmb *lmb, bd_t **kbd, ulong bootmap_base);
 350#endif /* CONFIG_PPC || CONFIG_M68K */
 351#endif /* !USE_HOSTCC */
 352
 353/*******************************************************************/
 354/* Legacy format specific code (prefixed with image_) */
 355/*******************************************************************/
 356static inline uint32_t image_get_header_size (void)
 357{
 358        return (sizeof (image_header_t));
 359}
 360
 361#define image_get_hdr_l(f) \
 362        static inline uint32_t image_get_##f(const image_header_t *hdr) \
 363        { \
 364                return uimage_to_cpu (hdr->ih_##f); \
 365        }
 366image_get_hdr_l (magic);        /* image_get_magic */
 367image_get_hdr_l (hcrc);         /* image_get_hcrc */
 368image_get_hdr_l (time);         /* image_get_time */
 369image_get_hdr_l (size);         /* image_get_size */
 370image_get_hdr_l (load);         /* image_get_load */
 371image_get_hdr_l (ep);           /* image_get_ep */
 372image_get_hdr_l (dcrc);         /* image_get_dcrc */
 373
 374#define image_get_hdr_b(f) \
 375        static inline uint8_t image_get_##f(const image_header_t *hdr) \
 376        { \
 377                return hdr->ih_##f; \
 378        }
 379image_get_hdr_b (os);           /* image_get_os */
 380image_get_hdr_b (arch);         /* image_get_arch */
 381image_get_hdr_b (type);         /* image_get_type */
 382image_get_hdr_b (comp);         /* image_get_comp */
 383
 384static inline char *image_get_name (const image_header_t *hdr)
 385{
 386        return (char *)hdr->ih_name;
 387}
 388
 389static inline uint32_t image_get_data_size (const image_header_t *hdr)
 390{
 391        return image_get_size (hdr);
 392}
 393
 394/**
 395 * image_get_data - get image payload start address
 396 * @hdr: image header
 397 *
 398 * image_get_data() returns address of the image payload. For single
 399 * component images it is image data start. For multi component
 400 * images it points to the null terminated table of sub-images sizes.
 401 *
 402 * returns:
 403 *     image payload data start address
 404 */
 405static inline ulong image_get_data (const image_header_t *hdr)
 406{
 407        return ((ulong)hdr + image_get_header_size ());
 408}
 409
 410static inline uint32_t image_get_image_size (const image_header_t *hdr)
 411{
 412        return (image_get_size (hdr) + image_get_header_size ());
 413}
 414static inline ulong image_get_image_end (const image_header_t *hdr)
 415{
 416        return ((ulong)hdr + image_get_image_size (hdr));
 417}
 418
 419#define image_set_hdr_l(f) \
 420        static inline void image_set_##f(image_header_t *hdr, uint32_t val) \
 421        { \
 422                hdr->ih_##f = cpu_to_uimage (val); \
 423        }
 424image_set_hdr_l (magic);        /* image_set_magic */
 425image_set_hdr_l (hcrc);         /* image_set_hcrc */
 426image_set_hdr_l (time);         /* image_set_time */
 427image_set_hdr_l (size);         /* image_set_size */
 428image_set_hdr_l (load);         /* image_set_load */
 429image_set_hdr_l (ep);           /* image_set_ep */
 430image_set_hdr_l (dcrc);         /* image_set_dcrc */
 431
 432#define image_set_hdr_b(f) \
 433        static inline void image_set_##f(image_header_t *hdr, uint8_t val) \
 434        { \
 435                hdr->ih_##f = val; \
 436        }
 437image_set_hdr_b (os);           /* image_set_os */
 438image_set_hdr_b (arch);         /* image_set_arch */
 439image_set_hdr_b (type);         /* image_set_type */
 440image_set_hdr_b (comp);         /* image_set_comp */
 441
 442static inline void image_set_name (image_header_t *hdr, const char *name)
 443{
 444        strncpy (image_get_name (hdr), name, IH_NMLEN);
 445}
 446
 447int image_check_hcrc (const image_header_t *hdr);
 448int image_check_dcrc (const image_header_t *hdr);
 449#ifndef USE_HOSTCC
 450int getenv_yesno (char *var);
 451ulong getenv_bootm_low(void);
 452phys_size_t getenv_bootm_size(void);
 453void memmove_wd (void *to, void *from, size_t len, ulong chunksz);
 454#endif
 455
 456static inline int image_check_magic (const image_header_t *hdr)
 457{
 458        return (image_get_magic (hdr) == IH_MAGIC);
 459}
 460static inline int image_check_type (const image_header_t *hdr, uint8_t type)
 461{
 462        return (image_get_type (hdr) == type);
 463}
 464static inline int image_check_arch (const image_header_t *hdr, uint8_t arch)
 465{
 466        return (image_get_arch (hdr) == arch);
 467}
 468static inline int image_check_os (const image_header_t *hdr, uint8_t os)
 469{
 470        return (image_get_os (hdr) == os);
 471}
 472
 473ulong image_multi_count (const image_header_t *hdr);
 474void image_multi_getimg (const image_header_t *hdr, ulong idx,
 475                        ulong *data, ulong *len);
 476
 477void image_print_contents (const void *hdr);
 478
 479#ifndef USE_HOSTCC
 480static inline int image_check_target_arch (const image_header_t *hdr)
 481{
 482#if defined(__ARM__)
 483        if (!image_check_arch (hdr, IH_ARCH_ARM))
 484#elif defined(__avr32__)
 485        if (!image_check_arch (hdr, IH_ARCH_AVR32))
 486#elif defined(__bfin__)
 487        if (!image_check_arch (hdr, IH_ARCH_BLACKFIN))
 488#elif defined(__I386__)
 489        if (!image_check_arch (hdr, IH_ARCH_I386))
 490#elif defined(__M68K__)
 491        if (!image_check_arch (hdr, IH_ARCH_M68K))
 492#elif defined(__microblaze__)
 493        if (!image_check_arch (hdr, IH_ARCH_MICROBLAZE))
 494#elif defined(__mips__)
 495        if (!image_check_arch (hdr, IH_ARCH_MIPS))
 496#elif defined(__nios__)
 497        if (!image_check_arch (hdr, IH_ARCH_NIOS))
 498#elif defined(__nios2__)
 499        if (!image_check_arch (hdr, IH_ARCH_NIOS2))
 500#elif defined(__PPC__)
 501        if (!image_check_arch (hdr, IH_ARCH_PPC))
 502#elif defined(__sh__)
 503        if (!image_check_arch (hdr, IH_ARCH_SH))
 504#elif defined(__sparc__)
 505        if (!image_check_arch (hdr, IH_ARCH_SPARC))
 506#else
 507# error Unknown CPU type
 508#endif
 509                return 0;
 510
 511        return 1;
 512}
 513#endif /* USE_HOSTCC */
 514
 515/*******************************************************************/
 516/* New uImage format specific code (prefixed with fit_) */
 517/*******************************************************************/
 518#if defined(CONFIG_FIT)
 519
 520#define FIT_IMAGES_PATH         "/images"
 521#define FIT_CONFS_PATH          "/configurations"
 522
 523/* hash node */
 524#define FIT_HASH_NODENAME       "hash"
 525#define FIT_ALGO_PROP           "algo"
 526#define FIT_VALUE_PROP          "value"
 527
 528/* image node */
 529#define FIT_DATA_PROP           "data"
 530#define FIT_TIMESTAMP_PROP      "timestamp"
 531#define FIT_DESC_PROP           "description"
 532#define FIT_ARCH_PROP           "arch"
 533#define FIT_TYPE_PROP           "type"
 534#define FIT_OS_PROP             "os"
 535#define FIT_COMP_PROP           "compression"
 536#define FIT_ENTRY_PROP          "entry"
 537#define FIT_LOAD_PROP           "load"
 538
 539/* configuration node */
 540#define FIT_KERNEL_PROP         "kernel"
 541#define FIT_RAMDISK_PROP        "ramdisk"
 542#define FIT_FDT_PROP            "fdt"
 543#define FIT_DEFAULT_PROP        "default"
 544
 545#define FIT_MAX_HASH_LEN        20      /* max(crc32_len(4), sha1_len(20)) */
 546
 547/* cmdline argument format parsing */
 548inline int fit_parse_conf (const char *spec, ulong addr_curr,
 549                ulong *addr, const char **conf_name);
 550inline int fit_parse_subimage (const char *spec, ulong addr_curr,
 551                ulong *addr, const char **image_name);
 552
 553void fit_print_contents (const void *fit);
 554void fit_image_print (const void *fit, int noffset, const char *p);
 555void fit_image_print_hash (const void *fit, int noffset, const char *p);
 556
 557/**
 558 * fit_get_end - get FIT image size
 559 * @fit: pointer to the FIT format image header
 560 *
 561 * returns:
 562 *     size of the FIT image (blob) in memory
 563 */
 564static inline ulong fit_get_size (const void *fit)
 565{
 566        return fdt_totalsize (fit);
 567}
 568
 569/**
 570 * fit_get_end - get FIT image end
 571 * @fit: pointer to the FIT format image header
 572 *
 573 * returns:
 574 *     end address of the FIT image (blob) in memory
 575 */
 576static inline ulong fit_get_end (const void *fit)
 577{
 578        return (ulong)fit + fdt_totalsize (fit);
 579}
 580
 581/**
 582 * fit_get_name - get FIT node name
 583 * @fit: pointer to the FIT format image header
 584 *
 585 * returns:
 586 *     NULL, on error
 587 *     pointer to node name, on success
 588 */
 589static inline const char *fit_get_name (const void *fit_hdr,
 590                int noffset, int *len)
 591{
 592        return fdt_get_name (fit_hdr, noffset, len);
 593}
 594
 595int fit_get_desc (const void *fit, int noffset, char **desc);
 596int fit_get_timestamp (const void *fit, int noffset, time_t *timestamp);
 597
 598int fit_image_get_node (const void *fit, const char *image_uname);
 599int fit_image_get_os (const void *fit, int noffset, uint8_t *os);
 600int fit_image_get_arch (const void *fit, int noffset, uint8_t *arch);
 601int fit_image_get_type (const void *fit, int noffset, uint8_t *type);
 602int fit_image_get_comp (const void *fit, int noffset, uint8_t *comp);
 603int fit_image_get_load (const void *fit, int noffset, ulong *load);
 604int fit_image_get_entry (const void *fit, int noffset, ulong *entry);
 605int fit_image_get_data (const void *fit, int noffset,
 606                                const void **data, size_t *size);
 607
 608int fit_image_hash_get_algo (const void *fit, int noffset, char **algo);
 609int fit_image_hash_get_value (const void *fit, int noffset, uint8_t **value,
 610                                int *value_len);
 611
 612int fit_set_timestamp (void *fit, int noffset, time_t timestamp);
 613int fit_set_hashes (void *fit);
 614int fit_image_set_hashes (void *fit, int image_noffset);
 615int fit_image_hash_set_value (void *fit, int noffset, uint8_t *value,
 616                                int value_len);
 617
 618int fit_image_check_hashes (const void *fit, int noffset);
 619int fit_all_image_check_hashes (const void *fit);
 620int fit_image_check_os (const void *fit, int noffset, uint8_t os);
 621int fit_image_check_arch (const void *fit, int noffset, uint8_t arch);
 622int fit_image_check_type (const void *fit, int noffset, uint8_t type);
 623int fit_image_check_comp (const void *fit, int noffset, uint8_t comp);
 624int fit_check_format (const void *fit);
 625
 626int fit_conf_get_node (const void *fit, const char *conf_uname);
 627int fit_conf_get_kernel_node (const void *fit, int noffset);
 628int fit_conf_get_ramdisk_node (const void *fit, int noffset);
 629int fit_conf_get_fdt_node (const void *fit, int noffset);
 630
 631void fit_conf_print (const void *fit, int noffset, const char *p);
 632
 633#ifndef USE_HOSTCC
 634static inline int fit_image_check_target_arch (const void *fdt, int node)
 635{
 636#if defined(__ARM__)
 637        if (!fit_image_check_arch (fdt, node, IH_ARCH_ARM))
 638#elif defined(__avr32__)
 639        if (!fit_image_check_arch (fdt, node, IH_ARCH_AVR32))
 640#elif defined(__bfin__)
 641        if (!fit_image_check_arch (fdt, node, IH_ARCH_BLACKFIN))
 642#elif defined(__I386__)
 643        if (!fit_image_check_arch (fdt, node, IH_ARCH_I386))
 644#elif defined(__M68K__)
 645        if (!fit_image_check_arch (fdt, node, IH_ARCH_M68K))
 646#elif defined(__microblaze__)
 647        if (!fit_image_check_arch (fdt, node, IH_ARCH_MICROBLAZE))
 648#elif defined(__mips__)
 649        if (!fit_image_check_arch (fdt, node, IH_ARCH_MIPS))
 650#elif defined(__nios__)
 651        if (!fit_image_check_arch (fdt, node, IH_ARCH_NIOS))
 652#elif defined(__nios2__)
 653        if (!fit_image_check_arch (fdt, node, IH_ARCH_NIOS2))
 654#elif defined(__PPC__)
 655        if (!fit_image_check_arch (fdt, node, IH_ARCH_PPC))
 656#elif defined(__sh__)
 657        if (!fit_image_check_arch (fdt, node, IH_ARCH_SH))
 658#elif defined(__sparc__)
 659        if (!fit_image_check_arch (fdt, node, IH_ARCH_SPARC))
 660#else
 661# error Unknown CPU type
 662#endif
 663                return 0;
 664
 665        return 1;
 666}
 667#endif /* USE_HOSTCC */
 668
 669#ifdef CONFIG_FIT_VERBOSE
 670#define fit_unsupported(msg)    printf ("! %s:%d " \
 671                                "FIT images not supported for '%s'\n", \
 672                                __FILE__, __LINE__, (msg))
 673
 674#define fit_unsupported_reset(msg)      printf ("! %s:%d " \
 675                                "FIT images not supported for '%s' " \
 676                                "- must reset board to recover!\n", \
 677                                __FILE__, __LINE__, (msg))
 678#else
 679#define fit_unsupported(msg)
 680#define fit_unsupported_reset(msg)
 681#endif /* CONFIG_FIT_VERBOSE */
 682#endif /* CONFIG_FIT */
 683
 684#endif  /* __IMAGE_H__ */
 685