]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - include/image.h
bootm: refactor image detection and os load steps
[karo-tx-uboot.git] / include / image.h
index bbd481d348916bcdd1b6736a1a36fefff2282c61..9be806e12d7533033c7bd1f7b3358f8c11b1ed37 100644 (file)
 #include <lmb.h>
 #include <linux/string.h>
 #include <asm/u-boot.h>
-#endif /* USE_HOSTCC */
 
-/* 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!"
@@ -57,6 +58,7 @@
 #include <fdt.h>
 #include <libfdt.h>
 #include <fdt_support.h>
+#define CONFIG_MD5             /* FIT images need MD5 support */
 #endif
 
 /*
@@ -185,6 +187,13 @@ typedef struct image_header {
        uint8_t         ih_name[IH_NMLEN];      /* Image Name           */
 } image_header_t;
 
+typedef struct image_info {
+       ulong           start, end;             /* start/end of blob */
+       ulong           image_start, image_len; /* start of image within blob, len of image */
+       ulong           load;                   /* load addr for the image */
+       uint8_t         comp, type, os;         /* compression, type of image, os type */
+} image_info_t;
+
 /*
  * Legacy and FIT format headers used by do_bootm() and do_bootm_<os>()
  * routines.
@@ -195,32 +204,65 @@ typedef struct bootm_headers {
         * then boot_get_ramdisk() and get_fdt() will attempt to get
         * data from second and third component accordingly.
         */
-       image_header_t  *legacy_hdr_os;
+       image_header_t  *legacy_hdr_os;         /* image header pointer */
+       image_header_t  legacy_hdr_os_copy;     /* header copy */
        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 */
        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 */
-       const 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 */
-       const 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
+#endif
+
+       image_info_t    os;             /* os image info */
+       ulong           ep;             /* entry point of OS */
+
+       ulong           rd_start, rd_end;/* ramdisk start/end */
+
+#ifdef CONFIG_OF_LIBFDT
+       char            *ft_addr;       /* flat dev tree address */
+#endif
+       ulong           ft_len;         /* length of flat device tree */
+
        int             verify;         /* getenv("verify")[0] != 'n' */
-       int             autostart;      /* getenv("autostart")[0] != 'n' */
-       struct lmb      *lmb;           /* for memory mgmt */
+       int             valid;          /* set to 1 if we've set values in the header */
+#ifndef USE_HOSTCC
+       struct lmb      lmb;            /* for memory mgmt */
 #endif
 } bootm_headers_t;
 
 /*
  * Some systems (for example LWMON) have very short watchdog periods;
  * we must make sure to split long operations like memmove() or
- * crc32() into reasonable chunks.
+ * checksum calculations into reasonable chunks.
  */
+#ifndef CHUNKSZ
 #define CHUNKSZ (64 * 1024)
+#endif
+
+#ifndef CHUNKSZ_CRC32
+#define CHUNKSZ_CRC32 (64 * 1024)
+#endif
+
+#ifndef CHUNKSZ_MD5
+#define CHUNKSZ_MD5 (64 * 1024)
+#endif
+
+#ifndef CHUNKSZ_SHA1
+#define CHUNKSZ_SHA1 (64 * 1024)
+#endif
 
 #define uimage_to_cpu(x)               ntohl(x)
 #define cpu_to_uimage(x)               htonl(x)
@@ -241,11 +283,19 @@ int genimg_get_comp_id (const char *name);
 #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 (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
-               bootm_headers_t *images, uint8_t arch,
-               ulong *rd_start, ulong *rd_end);
+int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images,
+               uint8_t arch, ulong *rd_start, ulong *rd_end);
+
+
+#ifdef CONFIG_OF_LIBFDT
+int boot_get_fdt (int flag, int argc, char *argv[], bootm_headers_t *images,
+               char **of_flat_tree, ulong *of_size);
+int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
+               char **of_flat_tree, ulong *of_size);
+#endif
 
 #if defined(CONFIG_PPC) || defined(CONFIG_M68K)
 int boot_ramdisk_high (struct lmb *lmb, ulong rd_data, ulong rd_len,
@@ -354,11 +404,9 @@ static inline void image_set_name (image_header_t *hdr, const char *name)
 int image_check_hcrc (image_header_t *hdr);
 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);
+int getenv_yesno (char *var);
 ulong getenv_bootm_low(void);
-ulong getenv_bootm_size(void);
+phys_size_t getenv_bootm_size(void);
 void memmove_wd (void *to, void *from, size_t len, ulong chunksz);
 #endif
 
@@ -383,8 +431,7 @@ 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);
+void image_print_contents (image_header_t *hdr);
 
 #ifndef USE_HOSTCC
 static inline int image_check_target_arch (image_header_t *hdr)
@@ -411,6 +458,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
@@ -458,8 +507,7 @@ inline int fit_parse_conf (const char *spec, ulong addr_curr,
 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_print_contents (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);
 
@@ -563,6 +611,8 @@ static inline int fit_image_check_target_arch (const void *fdt, int node)
        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