]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - include/image.h
SPARC: added SPARC support for new uimage in common code.
[karo-tx-uboot.git] / include / image.h
index 1cec1db1e2df38bf6f4f71658757ca32a1f4e4e3..c1a6cbb481e05eac54c2205a9948aa8119a544af 100644 (file)
 #include <command.h>
 
 #ifndef USE_HOSTCC
+#include <lmb.h>
 #include <linux/string.h>
 #include <asm/u-boot.h>
 
-/* new uImage format support enabled by default */
+#else
+
+/* new uImage format support enabled on host */
 #define CONFIG_FIT             1
 #define CONFIG_OF_LIBFDT       1
+#define CONFIG_FIT_VERBOSE     1 /* enable fit_format_{error,warning}() */
 
-/* enable fit_format_error(), fit_format_warning() */
-#define CONFIG_FIT_VERBOSE     1
+#endif /* USE_HOSTCC */
 
 #if defined(CONFIG_FIT) && !defined(CONFIG_OF_LIBFDT)
 #error "CONFIG_OF_LIBFDT not enabled, required by CONFIG_FIT!"
 #endif
-#endif /* USE_HOSTCC */
+
+#if defined(CONFIG_FIT)
+#include <fdt.h>
+#include <libfdt.h>
+#include <fdt_support.h>
+#define CONFIG_MD5             /* FIT images need MD5 support */
+#endif
 
 /*
  * Operating System Codes
 #define IH_NMLEN               32      /* Image Name Length            */
 
 /*
- * all data in network byte order (aka natural aka bigendian)
+ * Legacy format image header,
+ * all data in network byte order (aka natural aka bigendian).
  */
-
 typedef struct image_header {
        uint32_t        ih_magic;       /* Image Header Magic Number    */
        uint32_t        ih_hcrc;        /* Image Header CRC Checksum    */
@@ -185,25 +194,33 @@ typedef struct image_header {
 typedef struct bootm_headers {
        /*
         * Legacy os image header, if it is a multi component image
-        * then get_ramdisk() and get_fdt() will attempt to get
+        * then boot_get_ramdisk() and get_fdt() will attempt to get
         * data from second and third component accordingly.
         */
        image_header_t  *legacy_hdr_os;
        ulong           legacy_hdr_valid;
 
 #if defined(CONFIG_FIT)
+       const char      *fit_uname_cfg; /* configuration node unit name */
+
        void            *fit_hdr_os;    /* os FIT image header */
-       char            *fit_uname_os;  /* os subimage node unit name */
+       const char      *fit_uname_os;  /* os subimage node unit name */
+       int             fit_noffset_os; /* os subimage node offset */
 
        void            *fit_hdr_rd;    /* init ramdisk FIT image header */
-       char            *fit_uname_rd;  /* init ramdisk node unit name */
+       const char      *fit_uname_rd;  /* init ramdisk subimage node unit name */
+       int             fit_noffset_rd; /* init ramdisk subimage node offset */
 
 #if defined(CONFIG_PPC)
        void            *fit_hdr_fdt;   /* FDT blob FIT image header */
-       char            *fit_uname_fdt; /* FDT blob node unit name */
+       const char      *fit_uname_fdt; /* FDT blob subimage node unit name */
+       int             fit_noffset_fdt;/* FDT blob subimage node offset */
 #endif
-       int             verify;         /* getenv("verify")[0] != 'n' */
 #endif
+
+       int             verify;         /* getenv("verify")[0] != 'n' */
+       int             autostart;      /* getenv("autostart")[0] != 'n' */
+       struct lmb      *lmb;           /* for memory mgmt */
 } bootm_headers_t;
 
 /*
@@ -213,9 +230,44 @@ typedef struct bootm_headers {
  */
 #define CHUNKSZ (64 * 1024)
 
-#define image_to_cpu(x)                ntohl(x)
-#define cpu_to_image(x)                htonl(x)
+#define uimage_to_cpu(x)               ntohl(x)
+#define cpu_to_uimage(x)               htonl(x)
+
+const char *genimg_get_os_name (uint8_t os);
+const char *genimg_get_arch_name (uint8_t arch);
+const char *genimg_get_type_name (uint8_t type);
+const char *genimg_get_comp_name (uint8_t comp);
+int genimg_get_os_id (const char *name);
+int genimg_get_arch_id (const char *name);
+int genimg_get_type_id (const char *name);
+int genimg_get_comp_id (const char *name);
+
+#ifndef USE_HOSTCC
+/* Image format types, returned by _get_format() routine */
+#define IMAGE_FORMAT_INVALID   0x00
+#define IMAGE_FORMAT_LEGACY    0x01    /* legacy image_header based format */
+#define IMAGE_FORMAT_FIT       0x02    /* new, libfdt based format */
+
+int genimg_get_format (void *img_addr);
+int genimg_has_config (bootm_headers_t *images);
+ulong genimg_get_image (ulong img_addr);
+
+int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images,
+               uint8_t arch, ulong *rd_start, ulong *rd_end);
+
+#if defined(CONFIG_PPC) || defined(CONFIG_M68K)
+int boot_ramdisk_high (struct lmb *lmb, ulong rd_data, ulong rd_len,
+                 ulong *initrd_start, ulong *initrd_end);
+
+int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end,
+                       ulong bootmap_base);
+int boot_get_kbd (struct lmb *lmb, bd_t **kbd, ulong bootmap_base);
+#endif /* CONFIG_PPC || CONFIG_M68K */
+#endif /* !USE_HOSTCC */
 
+/*******************************************************************/
+/* Legacy format specific code (prefixed with image_) */
+/*******************************************************************/
 static inline uint32_t image_get_header_size (void)
 {
        return (sizeof (image_header_t));
@@ -224,7 +276,7 @@ static inline uint32_t image_get_header_size (void)
 #define image_get_hdr_l(f) \
        static inline uint32_t image_get_##f(image_header_t *hdr) \
        { \
-               return image_to_cpu (hdr->ih_##f); \
+               return uimage_to_cpu (hdr->ih_##f); \
        }
 image_get_hdr_l (magic);
 image_get_hdr_l (hcrc);
@@ -282,7 +334,7 @@ static inline ulong image_get_image_end (image_header_t *hdr)
 #define image_set_hdr_l(f) \
        static inline void image_set_##f(image_header_t *hdr, uint32_t val) \
        { \
-               hdr->ih_##f = cpu_to_image (val); \
+               hdr->ih_##f = cpu_to_uimage (val); \
        }
 image_set_hdr_l (magic);
 image_set_hdr_l (hcrc);
@@ -312,6 +364,9 @@ int image_check_dcrc (image_header_t *hdr);
 #ifndef USE_HOSTCC
 int image_check_dcrc_wd (image_header_t *hdr, ulong chunksize);
 int getenv_verify (void);
+int getenv_autostart (void);
+ulong getenv_bootm_low(void);
+ulong getenv_bootm_size(void);
 void memmove_wd (void *to, void *from, size_t len, ulong chunksz);
 #endif
 
@@ -336,6 +391,9 @@ ulong image_multi_count (image_header_t *hdr);
 void image_multi_getimg (image_header_t *hdr, ulong idx,
                        ulong *data, ulong *len);
 
+inline void image_print_contents (image_header_t *hdr);
+inline void image_print_contents_noindent (image_header_t *hdr);
+
 #ifndef USE_HOSTCC
 static inline int image_check_target_arch (image_header_t *hdr)
 {
@@ -361,6 +419,8 @@ static inline int image_check_target_arch (image_header_t *hdr)
        if (!image_check_arch (hdr, IH_ARCH_PPC))
 #elif defined(__sh__)
        if (!image_check_arch (hdr, IH_ARCH_SH))
+#elif defined(__sparc__)
+       if (!image_check_arch (hdr, IH_ARCH_SPARC))
 #else
 # error Unknown CPU type
 #endif
@@ -368,43 +428,162 @@ static inline int image_check_target_arch (image_header_t *hdr)
 
        return 1;
 }
-
-const char* image_get_os_name (uint8_t os);
-const char* image_get_arch_name (uint8_t arch);
-const char* image_get_type_name (uint8_t type);
-const char* image_get_comp_name (uint8_t comp);
-void image_print_contents (image_header_t *hdr);
-
-#define IMAGE_FORMAT_INVALID   0x00
-#define IMAGE_FORMAT_LEGACY    0x01    /* legacy image_header based format */
-#define IMAGE_FORMAT_FIT       0x02    /* new, libfdt based format */
-
-int gen_image_get_format (void *img_addr);
-ulong gen_get_image (ulong img_addr);
-
-void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
-               bootm_headers_t *images, uint8_t arch,
-               ulong *rd_start, ulong *rd_end);
-
-#if defined(CONFIG_PPC) || defined(CONFIG_M68K)
-ulong ramdisk_high (ulong alloc_current, ulong rd_data, ulong rd_len,
-               ulong sp_limit, ulong sp,
-               ulong *initrd_start, ulong *initrd_end);
-
-ulong get_boot_sp_limit (ulong sp);
-ulong get_boot_cmdline (ulong alloc_current, ulong *cmd_start, ulong *cmd_end);
-ulong get_boot_kbd (ulong alloc_current, bd_t **kbd);
-#endif /* CONFIG_PPC || CONFIG_M68K */
+#endif /* USE_HOSTCC */
 
 /*******************************************************************/
-/* New uImage format */
+/* New uImage format specific code (prefixed with fit_) */
 /*******************************************************************/
 #if defined(CONFIG_FIT)
+
+#define FIT_IMAGES_PATH                "/images"
+#define FIT_CONFS_PATH         "/configurations"
+
+/* hash node */
+#define FIT_HASH_NODENAME      "hash"
+#define FIT_ALGO_PROP          "algo"
+#define FIT_VALUE_PROP         "value"
+
+/* image node */
+#define FIT_DATA_PROP          "data"
+#define FIT_TIMESTAMP_PROP     "timestamp"
+#define FIT_DESC_PROP          "description"
+#define FIT_ARCH_PROP          "arch"
+#define FIT_TYPE_PROP          "type"
+#define FIT_OS_PROP            "os"
+#define FIT_COMP_PROP          "compression"
+#define FIT_ENTRY_PROP         "entry"
+#define FIT_LOAD_PROP          "load"
+
+/* configuration node */
+#define FIT_KERNEL_PROP                "kernel"
+#define FIT_RAMDISK_PROP       "ramdisk"
+#define FIT_FDT_PROP           "fdt"
+#define FIT_DEFAULT_PROP       "default"
+
+#define FIT_MAX_HASH_LEN       20      /* max(crc32_len(4), sha1_len(20)) */
+
+/* cmdline argument format parsing */
 inline int fit_parse_conf (const char *spec, ulong addr_curr,
                ulong *addr, const char **conf_name);
 inline int fit_parse_subimage (const char *spec, ulong addr_curr,
                ulong *addr, const char **image_name);
 
+inline void fit_print_contents (const void *fit);
+inline void fit_print_contents_noindent (const void *fit);
+void fit_image_print (const void *fit, int noffset, const char *p);
+void fit_image_print_hash (const void *fit, int noffset, const char *p);
+
+/**
+ * fit_get_end - get FIT image size
+ * @fit: pointer to the FIT format image header
+ *
+ * returns:
+ *     size of the FIT image (blob) in memory
+ */
+static inline ulong fit_get_size (const void *fit)
+{
+       return fdt_totalsize (fit);
+}
+
+/**
+ * fit_get_end - get FIT image end
+ * @fit: pointer to the FIT format image header
+ *
+ * returns:
+ *     end address of the FIT image (blob) in memory
+ */
+static inline ulong fit_get_end (const void *fit)
+{
+       return (ulong)fit + fdt_totalsize (fit);
+}
+
+/**
+ * fit_get_name - get FIT node name
+ * @fit: pointer to the FIT format image header
+ *
+ * returns:
+ *     NULL, on error
+ *     pointer to node name, on success
+ */
+static inline const char *fit_get_name (const void *fit_hdr,
+               int noffset, int *len)
+{
+       return fdt_get_name (fit_hdr, noffset, len);
+}
+
+int fit_get_desc (const void *fit, int noffset, char **desc);
+int fit_get_timestamp (const void *fit, int noffset, time_t *timestamp);
+
+int fit_image_get_node (const void *fit, const char *image_uname);
+int fit_image_get_os (const void *fit, int noffset, uint8_t *os);
+int fit_image_get_arch (const void *fit, int noffset, uint8_t *arch);
+int fit_image_get_type (const void *fit, int noffset, uint8_t *type);
+int fit_image_get_comp (const void *fit, int noffset, uint8_t *comp);
+int fit_image_get_load (const void *fit, int noffset, ulong *load);
+int fit_image_get_entry (const void *fit, int noffset, ulong *entry);
+int fit_image_get_data (const void *fit, int noffset,
+                               const void **data, size_t *size);
+
+int fit_image_hash_get_algo (const void *fit, int noffset, char **algo);
+int fit_image_hash_get_value (const void *fit, int noffset, uint8_t **value,
+                               int *value_len);
+
+int fit_set_timestamp (void *fit, int noffset, time_t timestamp);
+int fit_set_hashes (void *fit);
+int fit_image_set_hashes (void *fit, int image_noffset);
+int fit_image_hash_set_value (void *fit, int noffset, uint8_t *value,
+                               int value_len);
+
+int fit_image_check_hashes (const void *fit, int noffset);
+int fit_image_check_os (const void *fit, int noffset, uint8_t os);
+int fit_image_check_arch (const void *fit, int noffset, uint8_t arch);
+int fit_image_check_type (const void *fit, int noffset, uint8_t type);
+int fit_image_check_comp (const void *fit, int noffset, uint8_t comp);
+int fit_check_format (const void *fit);
+
+int fit_conf_get_node (const void *fit, const char *conf_uname);
+int fit_conf_get_kernel_node (const void *fit, int noffset);
+int fit_conf_get_ramdisk_node (const void *fit, int noffset);
+int fit_conf_get_fdt_node (const void *fit, int noffset);
+
+void fit_conf_print (const void *fit, int noffset, const char *p);
+
+#ifndef USE_HOSTCC
+static inline int fit_image_check_target_arch (const void *fdt, int node)
+{
+#if defined(__ARM__)
+       if (!fit_image_check_arch (fdt, node, IH_ARCH_ARM))
+#elif defined(__avr32__)
+       if (!fit_image_check_arch (fdt, node, IH_ARCH_AVR32))
+#elif defined(__bfin__)
+       if (!fit_image_check_arch (fdt, node, IH_ARCH_BLACKFIN))
+#elif defined(__I386__)
+       if (!fit_image_check_arch (fdt, node, IH_ARCH_I386))
+#elif defined(__M68K__)
+       if (!fit_image_check_arch (fdt, node, IH_ARCH_M68K))
+#elif defined(__microblaze__)
+       if (!fit_image_check_arch (fdt, node, IH_ARCH_MICROBLAZE))
+#elif defined(__mips__)
+       if (!fit_image_check_arch (fdt, node, IH_ARCH_MIPS))
+#elif defined(__nios__)
+       if (!fit_image_check_arch (fdt, node, IH_ARCH_NIOS))
+#elif defined(__nios2__)
+       if (!fit_image_check_arch (fdt, node, IH_ARCH_NIOS2))
+#elif defined(__PPC__)
+       if (!fit_image_check_arch (fdt, node, IH_ARCH_PPC))
+#elif defined(__sh__)
+       if (!fit_image_check_arch (fdt, node, IH_ARCH_SH))
+#elif defined(__sparc__)
+       if (!fit_image_check_arch (fdt, node, IH_ARCH_SPARC))
+#else
+# error Unknown CPU type
+#endif
+               return 0;
+
+       return 1;
+}
+#endif /* USE_HOSTCC */
+
 #ifdef CONFIG_FIT_VERBOSE
 #define fit_unsupported(msg)   printf ("! %s:%d " \
                                "FIT images not supported for '%s'\n", \
@@ -418,9 +597,6 @@ inline int fit_parse_subimage (const char *spec, ulong addr_curr,
 #define fit_unsupported(msg)
 #define fit_unsupported_reset(msg)
 #endif /* CONFIG_FIT_VERBOSE */
-
 #endif /* CONFIG_FIT */
 
-#endif /* USE_HOSTCC */
-
 #endif /* __IMAGE_H__ */