Annotation of elwix/tools/uboot_mkimage/include/image.h, revision 1.1

1.1     ! misho       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: #define IH_OS_OSE              22      /* OSE          */
        !            87: 
        !            88: /*
        !            89:  * CPU Architecture Codes (supported by Linux)
        !            90:  */
        !            91: #define IH_ARCH_INVALID                0       /* Invalid CPU  */
        !            92: #define IH_ARCH_ALPHA          1       /* Alpha        */
        !            93: #define IH_ARCH_ARM            2       /* ARM          */
        !            94: #define IH_ARCH_I386           3       /* Intel x86    */
        !            95: #define IH_ARCH_IA64           4       /* IA64         */
        !            96: #define IH_ARCH_MIPS           5       /* MIPS         */
        !            97: #define IH_ARCH_MIPS64         6       /* MIPS  64 Bit */
        !            98: #define IH_ARCH_PPC            7       /* PowerPC      */
        !            99: #define IH_ARCH_S390           8       /* IBM S390     */
        !           100: #define IH_ARCH_SH             9       /* SuperH       */
        !           101: #define IH_ARCH_SPARC          10      /* Sparc        */
        !           102: #define IH_ARCH_SPARC64                11      /* Sparc 64 Bit */
        !           103: #define IH_ARCH_M68K           12      /* M68K         */
        !           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:  */
        !           177: typedef 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: 
        !           192: typedef 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:  */
        !           203: typedef 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:  */
        !           292: typedef 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:  */
        !           303: int 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:  */
        !           310: char *get_table_entry_name (table_entry_t *table, char *msg, int id);
        !           311: 
        !           312: const char *genimg_get_os_name (uint8_t os);
        !           313: const char *genimg_get_arch_name (uint8_t arch);
        !           314: const char *genimg_get_type_name (uint8_t type);
        !           315: const char *genimg_get_comp_name (uint8_t comp);
        !           316: int genimg_get_os_id (const char *name);
        !           317: int genimg_get_arch_id (const char *name);
        !           318: int genimg_get_type_id (const char *name);
        !           319: int genimg_get_comp_id (const char *name);
        !           320: void 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: 
        !           328: int genimg_get_format (void *img_addr);
        !           329: int genimg_has_config (bootm_headers_t *images);
        !           330: ulong genimg_get_image (ulong img_addr);
        !           331: 
        !           332: int boot_get_ramdisk (int argc, char * const argv[], bootm_headers_t *images,
        !           333:                uint8_t arch, ulong *rd_start, ulong *rd_end);
        !           334: 
        !           335: 
        !           336: #ifdef CONFIG_OF_LIBFDT
        !           337: int boot_get_fdt (int flag, int argc, char * const argv[], bootm_headers_t *images,
        !           338:                char **of_flat_tree, ulong *of_size);
        !           339: int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
        !           340:                char **of_flat_tree, ulong *of_size);
        !           341: #endif
        !           342: 
        !           343: #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
        !           344: int boot_ramdisk_high (struct lmb *lmb, ulong rd_data, ulong rd_len,
        !           345:                  ulong *initrd_start, ulong *initrd_end);
        !           346: #endif /* CONFIG_SYS_BOOT_RAMDISK_HIGH */
        !           347: #ifdef CONFIG_SYS_BOOT_GET_CMDLINE
        !           348: int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end,
        !           349:                        ulong bootmap_base);
        !           350: #endif /* CONFIG_SYS_BOOT_GET_CMDLINE */
        !           351: #ifdef CONFIG_SYS_BOOT_GET_KBD
        !           352: int boot_get_kbd (struct lmb *lmb, bd_t **kbd, ulong bootmap_base);
        !           353: #endif /* CONFIG_SYS_BOOT_GET_KBD */
        !           354: #endif /* !USE_HOSTCC */
        !           355: 
        !           356: /*******************************************************************/
        !           357: /* Legacy format specific code (prefixed with image_) */
        !           358: /*******************************************************************/
        !           359: static inline uint32_t image_get_header_size (void)
        !           360: {
        !           361:        return (sizeof (image_header_t));
        !           362: }
        !           363: 
        !           364: #define image_get_hdr_l(f) \
        !           365:        static inline uint32_t image_get_##f(const image_header_t *hdr) \
        !           366:        { \
        !           367:                return uimage_to_cpu (hdr->ih_##f); \
        !           368:        }
        !           369: image_get_hdr_l (magic)                /* image_get_magic */
        !           370: image_get_hdr_l (hcrc)         /* image_get_hcrc */
        !           371: image_get_hdr_l (time)         /* image_get_time */
        !           372: image_get_hdr_l (size)         /* image_get_size */
        !           373: image_get_hdr_l (load)         /* image_get_load */
        !           374: image_get_hdr_l (ep)           /* image_get_ep */
        !           375: image_get_hdr_l (dcrc)         /* image_get_dcrc */
        !           376: 
        !           377: #define image_get_hdr_b(f) \
        !           378:        static inline uint8_t image_get_##f(const image_header_t *hdr) \
        !           379:        { \
        !           380:                return hdr->ih_##f; \
        !           381:        }
        !           382: image_get_hdr_b (os)           /* image_get_os */
        !           383: image_get_hdr_b (arch)         /* image_get_arch */
        !           384: image_get_hdr_b (type)         /* image_get_type */
        !           385: image_get_hdr_b (comp)         /* image_get_comp */
        !           386: 
        !           387: static inline char *image_get_name (const image_header_t *hdr)
        !           388: {
        !           389:        return (char *)hdr->ih_name;
        !           390: }
        !           391: 
        !           392: static inline uint32_t image_get_data_size (const image_header_t *hdr)
        !           393: {
        !           394:        return image_get_size (hdr);
        !           395: }
        !           396: 
        !           397: /**
        !           398:  * image_get_data - get image payload start address
        !           399:  * @hdr: image header
        !           400:  *
        !           401:  * image_get_data() returns address of the image payload. For single
        !           402:  * component images it is image data start. For multi component
        !           403:  * images it points to the null terminated table of sub-images sizes.
        !           404:  *
        !           405:  * returns:
        !           406:  *     image payload data start address
        !           407:  */
        !           408: static inline ulong image_get_data (const image_header_t *hdr)
        !           409: {
        !           410:        return ((ulong)hdr + image_get_header_size ());
        !           411: }
        !           412: 
        !           413: static inline uint32_t image_get_image_size (const image_header_t *hdr)
        !           414: {
        !           415:        return (image_get_size (hdr) + image_get_header_size ());
        !           416: }
        !           417: static inline ulong image_get_image_end (const image_header_t *hdr)
        !           418: {
        !           419:        return ((ulong)hdr + image_get_image_size (hdr));
        !           420: }
        !           421: 
        !           422: #define image_set_hdr_l(f) \
        !           423:        static inline void image_set_##f(image_header_t *hdr, uint32_t val) \
        !           424:        { \
        !           425:                hdr->ih_##f = cpu_to_uimage (val); \
        !           426:        }
        !           427: image_set_hdr_l (magic)                /* image_set_magic */
        !           428: image_set_hdr_l (hcrc)         /* image_set_hcrc */
        !           429: image_set_hdr_l (time)         /* image_set_time */
        !           430: image_set_hdr_l (size)         /* image_set_size */
        !           431: image_set_hdr_l (load)         /* image_set_load */
        !           432: image_set_hdr_l (ep)           /* image_set_ep */
        !           433: image_set_hdr_l (dcrc)         /* image_set_dcrc */
        !           434: 
        !           435: #define image_set_hdr_b(f) \
        !           436:        static inline void image_set_##f(image_header_t *hdr, uint8_t val) \
        !           437:        { \
        !           438:                hdr->ih_##f = val; \
        !           439:        }
        !           440: image_set_hdr_b (os)           /* image_set_os */
        !           441: image_set_hdr_b (arch)         /* image_set_arch */
        !           442: image_set_hdr_b (type)         /* image_set_type */
        !           443: image_set_hdr_b (comp)         /* image_set_comp */
        !           444: 
        !           445: static inline void image_set_name (image_header_t *hdr, const char *name)
        !           446: {
        !           447:        strncpy (image_get_name (hdr), name, IH_NMLEN);
        !           448: }
        !           449: 
        !           450: int image_check_hcrc (const image_header_t *hdr);
        !           451: int image_check_dcrc (const image_header_t *hdr);
        !           452: #ifndef USE_HOSTCC
        !           453: int getenv_yesno (char *var);
        !           454: ulong getenv_bootm_low(void);
        !           455: phys_size_t getenv_bootm_size(void);
        !           456: void memmove_wd (void *to, void *from, size_t len, ulong chunksz);
        !           457: #endif
        !           458: 
        !           459: static inline int image_check_magic (const image_header_t *hdr)
        !           460: {
        !           461:        return (image_get_magic (hdr) == IH_MAGIC);
        !           462: }
        !           463: static inline int image_check_type (const image_header_t *hdr, uint8_t type)
        !           464: {
        !           465:        return (image_get_type (hdr) == type);
        !           466: }
        !           467: static inline int image_check_arch (const image_header_t *hdr, uint8_t arch)
        !           468: {
        !           469:        return (image_get_arch (hdr) == arch);
        !           470: }
        !           471: static inline int image_check_os (const image_header_t *hdr, uint8_t os)
        !           472: {
        !           473:        return (image_get_os (hdr) == os);
        !           474: }
        !           475: 
        !           476: ulong image_multi_count (const image_header_t *hdr);
        !           477: void image_multi_getimg (const image_header_t *hdr, ulong idx,
        !           478:                        ulong *data, ulong *len);
        !           479: 
        !           480: void image_print_contents (const void *hdr);
        !           481: 
        !           482: #ifndef USE_HOSTCC
        !           483: static inline int image_check_target_arch (const image_header_t *hdr)
        !           484: {
        !           485: #if defined(__ARM__)
        !           486:        if (!image_check_arch (hdr, IH_ARCH_ARM))
        !           487: #elif defined(__avr32__)
        !           488:        if (!image_check_arch (hdr, IH_ARCH_AVR32))
        !           489: #elif defined(__bfin__)
        !           490:        if (!image_check_arch (hdr, IH_ARCH_BLACKFIN))
        !           491: #elif defined(__I386__)
        !           492:        if (!image_check_arch (hdr, IH_ARCH_I386))
        !           493: #elif defined(__M68K__)
        !           494:        if (!image_check_arch (hdr, IH_ARCH_M68K))
        !           495: #elif defined(__microblaze__)
        !           496:        if (!image_check_arch (hdr, IH_ARCH_MICROBLAZE))
        !           497: #elif defined(__mips__)
        !           498:        if (!image_check_arch (hdr, IH_ARCH_MIPS))
        !           499: #elif defined(__nios2__)
        !           500:        if (!image_check_arch (hdr, IH_ARCH_NIOS2))
        !           501: #elif defined(__PPC__)
        !           502:        if (!image_check_arch (hdr, IH_ARCH_PPC))
        !           503: #elif defined(__sh__)
        !           504:        if (!image_check_arch (hdr, IH_ARCH_SH))
        !           505: #elif defined(__sparc__)
        !           506:        if (!image_check_arch (hdr, IH_ARCH_SPARC))
        !           507: #else
        !           508: # error Unknown CPU type
        !           509: #endif
        !           510:                return 0;
        !           511: 
        !           512:        return 1;
        !           513: }
        !           514: #endif /* USE_HOSTCC */
        !           515: 
        !           516: /*******************************************************************/
        !           517: /* New uImage format specific code (prefixed with fit_) */
        !           518: /*******************************************************************/
        !           519: #if defined(CONFIG_FIT)
        !           520: 
        !           521: #define FIT_IMAGES_PATH                "/images"
        !           522: #define FIT_CONFS_PATH         "/configurations"
        !           523: 
        !           524: /* hash node */
        !           525: #define FIT_HASH_NODENAME      "hash"
        !           526: #define FIT_ALGO_PROP          "algo"
        !           527: #define FIT_VALUE_PROP         "value"
        !           528: 
        !           529: /* image node */
        !           530: #define FIT_DATA_PROP          "data"
        !           531: #define FIT_TIMESTAMP_PROP     "timestamp"
        !           532: #define FIT_DESC_PROP          "description"
        !           533: #define FIT_ARCH_PROP          "arch"
        !           534: #define FIT_TYPE_PROP          "type"
        !           535: #define FIT_OS_PROP            "os"
        !           536: #define FIT_COMP_PROP          "compression"
        !           537: #define FIT_ENTRY_PROP         "entry"
        !           538: #define FIT_LOAD_PROP          "load"
        !           539: 
        !           540: /* configuration node */
        !           541: #define FIT_KERNEL_PROP                "kernel"
        !           542: #define FIT_RAMDISK_PROP       "ramdisk"
        !           543: #define FIT_FDT_PROP           "fdt"
        !           544: #define FIT_DEFAULT_PROP       "default"
        !           545: 
        !           546: #define FIT_MAX_HASH_LEN       20      /* max(crc32_len(4), sha1_len(20)) */
        !           547: 
        !           548: /* cmdline argument format parsing */
        !           549: inline int fit_parse_conf (const char *spec, ulong addr_curr,
        !           550:                ulong *addr, const char **conf_name);
        !           551: inline int fit_parse_subimage (const char *spec, ulong addr_curr,
        !           552:                ulong *addr, const char **image_name);
        !           553: 
        !           554: void fit_print_contents (const void *fit);
        !           555: void fit_image_print (const void *fit, int noffset, const char *p);
        !           556: void fit_image_print_hash (const void *fit, int noffset, const char *p);
        !           557: 
        !           558: /**
        !           559:  * fit_get_end - get FIT image size
        !           560:  * @fit: pointer to the FIT format image header
        !           561:  *
        !           562:  * returns:
        !           563:  *     size of the FIT image (blob) in memory
        !           564:  */
        !           565: static inline ulong fit_get_size (const void *fit)
        !           566: {
        !           567:        return fdt_totalsize (fit);
        !           568: }
        !           569: 
        !           570: /**
        !           571:  * fit_get_end - get FIT image end
        !           572:  * @fit: pointer to the FIT format image header
        !           573:  *
        !           574:  * returns:
        !           575:  *     end address of the FIT image (blob) in memory
        !           576:  */
        !           577: static inline ulong fit_get_end (const void *fit)
        !           578: {
        !           579:        return (ulong)fit + fdt_totalsize (fit);
        !           580: }
        !           581: 
        !           582: /**
        !           583:  * fit_get_name - get FIT node name
        !           584:  * @fit: pointer to the FIT format image header
        !           585:  *
        !           586:  * returns:
        !           587:  *     NULL, on error
        !           588:  *     pointer to node name, on success
        !           589:  */
        !           590: static inline const char *fit_get_name (const void *fit_hdr,
        !           591:                int noffset, int *len)
        !           592: {
        !           593:        return fdt_get_name (fit_hdr, noffset, len);
        !           594: }
        !           595: 
        !           596: int fit_get_desc (const void *fit, int noffset, char **desc);
        !           597: int fit_get_timestamp (const void *fit, int noffset, time_t *timestamp);
        !           598: 
        !           599: int fit_image_get_node (const void *fit, const char *image_uname);
        !           600: int fit_image_get_os (const void *fit, int noffset, uint8_t *os);
        !           601: int fit_image_get_arch (const void *fit, int noffset, uint8_t *arch);
        !           602: int fit_image_get_type (const void *fit, int noffset, uint8_t *type);
        !           603: int fit_image_get_comp (const void *fit, int noffset, uint8_t *comp);
        !           604: int fit_image_get_load (const void *fit, int noffset, ulong *load);
        !           605: int fit_image_get_entry (const void *fit, int noffset, ulong *entry);
        !           606: int fit_image_get_data (const void *fit, int noffset,
        !           607:                                const void **data, size_t *size);
        !           608: 
        !           609: int fit_image_hash_get_algo (const void *fit, int noffset, char **algo);
        !           610: int fit_image_hash_get_value (const void *fit, int noffset, uint8_t **value,
        !           611:                                int *value_len);
        !           612: 
        !           613: int fit_set_timestamp (void *fit, int noffset, time_t timestamp);
        !           614: int fit_set_hashes (void *fit);
        !           615: int fit_image_set_hashes (void *fit, int image_noffset);
        !           616: int fit_image_hash_set_value (void *fit, int noffset, uint8_t *value,
        !           617:                                int value_len);
        !           618: 
        !           619: int fit_image_check_hashes (const void *fit, int noffset);
        !           620: int fit_all_image_check_hashes (const void *fit);
        !           621: int fit_image_check_os (const void *fit, int noffset, uint8_t os);
        !           622: int fit_image_check_arch (const void *fit, int noffset, uint8_t arch);
        !           623: int fit_image_check_type (const void *fit, int noffset, uint8_t type);
        !           624: int fit_image_check_comp (const void *fit, int noffset, uint8_t comp);
        !           625: int fit_check_format (const void *fit);
        !           626: 
        !           627: int fit_conf_get_node (const void *fit, const char *conf_uname);
        !           628: int fit_conf_get_kernel_node (const void *fit, int noffset);
        !           629: int fit_conf_get_ramdisk_node (const void *fit, int noffset);
        !           630: int fit_conf_get_fdt_node (const void *fit, int noffset);
        !           631: 
        !           632: void fit_conf_print (const void *fit, int noffset, const char *p);
        !           633: 
        !           634: #ifndef USE_HOSTCC
        !           635: static inline int fit_image_check_target_arch (const void *fdt, int node)
        !           636: {
        !           637: #if defined(__ARM__)
        !           638:        if (!fit_image_check_arch (fdt, node, IH_ARCH_ARM))
        !           639: #elif defined(__avr32__)
        !           640:        if (!fit_image_check_arch (fdt, node, IH_ARCH_AVR32))
        !           641: #elif defined(__bfin__)
        !           642:        if (!fit_image_check_arch (fdt, node, IH_ARCH_BLACKFIN))
        !           643: #elif defined(__I386__)
        !           644:        if (!fit_image_check_arch (fdt, node, IH_ARCH_I386))
        !           645: #elif defined(__M68K__)
        !           646:        if (!fit_image_check_arch (fdt, node, IH_ARCH_M68K))
        !           647: #elif defined(__microblaze__)
        !           648:        if (!fit_image_check_arch (fdt, node, IH_ARCH_MICROBLAZE))
        !           649: #elif defined(__mips__)
        !           650:        if (!fit_image_check_arch (fdt, node, IH_ARCH_MIPS))
        !           651: #elif defined(__nios2__)
        !           652:        if (!fit_image_check_arch (fdt, node, IH_ARCH_NIOS2))
        !           653: #elif defined(__PPC__)
        !           654:        if (!fit_image_check_arch (fdt, node, IH_ARCH_PPC))
        !           655: #elif defined(__sh__)
        !           656:        if (!fit_image_check_arch (fdt, node, IH_ARCH_SH))
        !           657: #elif defined(__sparc__)
        !           658:        if (!fit_image_check_arch (fdt, node, IH_ARCH_SPARC))
        !           659: #else
        !           660: # error Unknown CPU type
        !           661: #endif
        !           662:                return 0;
        !           663: 
        !           664:        return 1;
        !           665: }
        !           666: #endif /* USE_HOSTCC */
        !           667: 
        !           668: #ifdef CONFIG_FIT_VERBOSE
        !           669: #define fit_unsupported(msg)   printf ("! %s:%d " \
        !           670:                                "FIT images not supported for '%s'\n", \
        !           671:                                __FILE__, __LINE__, (msg))
        !           672: 
        !           673: #define fit_unsupported_reset(msg)     printf ("! %s:%d " \
        !           674:                                "FIT images not supported for '%s' " \
        !           675:                                "- must reset board to recover!\n", \
        !           676:                                __FILE__, __LINE__, (msg))
        !           677: #else
        !           678: #define fit_unsupported(msg)
        !           679: #define fit_unsupported_reset(msg)
        !           680: #endif /* CONFIG_FIT_VERBOSE */
        !           681: #endif /* CONFIG_FIT */
        !           682: 
        !           683: #endif /* __IMAGE_H__ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>