]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/image.c
led_display: split led display support into generic and hw-dependent parts
[karo-tx-uboot.git] / common / image.c
index daa68bc2ddeb8f9c4c0dabe0a072f4f18f94ca9f..3a2f25e5af4de7f64e9e3e31bc61ef456e9e97c3 100644 (file)
@@ -60,12 +60,12 @@ static int fit_check_ramdisk (const void *fit, int os_noffset,
 #endif
 
 #ifdef CONFIG_CMD_BDI
-extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
+extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 #endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
-static image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch,
+static const image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch,
                                                int verify);
 #else
 #include "mkimage.h"
@@ -74,12 +74,6 @@ static image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch,
 #include <image.h>
 #endif /* !USE_HOSTCC*/
 
-typedef struct table_entry {
-       int     id;             /* as defined in image.h        */
-       char    *sname;         /* short (input) name           */
-       char    *lname;         /* long (output) name           */
-} table_entry_t;
-
 static table_entry_t uimage_arch[] = {
        {       IH_ARCH_INVALID,        NULL,           "Invalid ARCH", },
        {       IH_ARCH_ALPHA,          "alpha",        "Alpha",        },
@@ -90,7 +84,6 @@ static table_entry_t uimage_arch[] = {
        {       IH_ARCH_MICROBLAZE,     "microblaze",   "MicroBlaze",   },
        {       IH_ARCH_MIPS,           "mips",         "MIPS",         },
        {       IH_ARCH_MIPS64,         "mips64",       "MIPS 64 Bit",  },
-       {       IH_ARCH_NIOS,           "nios",         "NIOS",         },
        {       IH_ARCH_NIOS2,          "nios2",        "NIOS II",      },
        {       IH_ARCH_PPC,            "powerpc",      "PowerPC",      },
        {       IH_ARCH_PPC,            "ppc",          "PowerPC",      },
@@ -110,6 +103,7 @@ static table_entry_t uimage_os[] = {
        {       IH_OS_LYNXOS,   "lynxos",       "LynxOS",               },
 #endif
        {       IH_OS_NETBSD,   "netbsd",       "NetBSD",               },
+       {       IH_OS_OSE,      "ose",          "Enea OSE",             },
        {       IH_OS_RTEMS,    "rtems",        "RTEMS",                },
        {       IH_OS_U_BOOT,   "u-boot",       "U-Boot",               },
 #if defined(CONFIG_CMD_ELF) || defined(USE_HOSTCC)
@@ -145,6 +139,8 @@ static table_entry_t uimage_type[] = {
        {       IH_TYPE_SCRIPT,     "script",     "Script",             },
        {       IH_TYPE_STANDALONE, "standalone", "Standalone Program", },
        {       IH_TYPE_FLATDT,     "flat_dt",    "Flat Device Tree",   },
+       {       IH_TYPE_KWBIMAGE,   "kwbimage",   "Kirkwood Boot Image",},
+       {       IH_TYPE_IMXIMAGE,   "imximage",   "Freescale i.MX Boot Image",},
        {       -1,                 "",           "",                   },
 };
 
@@ -153,12 +149,12 @@ static table_entry_t uimage_comp[] = {
        {       IH_COMP_BZIP2,  "bzip2",        "bzip2 compressed",     },
        {       IH_COMP_GZIP,   "gzip",         "gzip compressed",      },
        {       IH_COMP_LZMA,   "lzma",         "lzma compressed",      },
+       {       IH_COMP_LZO,    "lzo",          "lzo compressed",       },
        {       -1,             "",             "",                     },
 };
 
 uint32_t crc32 (uint32_t, const unsigned char *, uint);
 uint32_t crc32_wd (uint32_t, const unsigned char *, uint, uint);
-static void genimg_print_size (uint32_t size);
 #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || defined(USE_HOSTCC)
 static void genimg_print_time (time_t timestamp);
 #endif
@@ -166,7 +162,7 @@ static void genimg_print_time (time_t timestamp);
 /*****************************************************************************/
 /* Legacy format routines */
 /*****************************************************************************/
-int image_check_hcrc (image_header_t *hdr)
+int image_check_hcrc (const image_header_t *hdr)
 {
        ulong hcrc;
        ulong len = image_get_header_size ();
@@ -181,7 +177,7 @@ int image_check_hcrc (image_header_t *hdr)
        return (hcrc == image_get_hcrc (hdr));
 }
 
-int image_check_dcrc (image_header_t *hdr)
+int image_check_dcrc (const image_header_t *hdr)
 {
        ulong data = image_get_data (hdr);
        ulong len = image_get_data_size (hdr);
@@ -203,7 +199,7 @@ int image_check_dcrc (image_header_t *hdr)
  * returns:
  *     number of components
  */
-ulong image_multi_count (image_header_t *hdr)
+ulong image_multi_count (const image_header_t *hdr)
 {
        ulong i, count = 0;
        uint32_t *size;
@@ -236,7 +232,7 @@ ulong image_multi_count (image_header_t *hdr)
  *     data address and size of the component, if idx is valid
  *     0 in data and len, if idx is out of range
  */
-void image_multi_getimg (image_header_t *hdr, ulong idx,
+void image_multi_getimg (const image_header_t *hdr, ulong idx,
                        ulong *data, ulong *len)
 {
        int i;
@@ -272,7 +268,7 @@ void image_multi_getimg (image_header_t *hdr, ulong idx,
        }
 }
 
-static void image_print_type (image_header_t *hdr)
+static void image_print_type (const image_header_t *hdr)
 {
        const char *os, *arch, *type, *comp;
 
@@ -286,7 +282,7 @@ static void image_print_type (image_header_t *hdr)
 
 /**
  * image_print_contents - prints out the contents of the legacy format image
- * @hdr: pointer to the legacy format image header
+ * @ptr: pointer to the legacy format image header
  * @p: pointer to prefix string
  *
  * image_print_contents() formats a multi line legacy image contents description.
@@ -296,8 +292,9 @@ static void image_print_type (image_header_t *hdr)
  * returns:
  *     no returned results
  */
-void image_print_contents (image_header_t *hdr)
+void image_print_contents (const void *ptr)
 {
+       const image_header_t *hdr = (const image_header_t *)ptr;
        const char *p;
 
 #ifdef USE_HOSTCC
@@ -363,10 +360,10 @@ void image_print_contents (image_header_t *hdr)
  *     pointer to a ramdisk image header, if image was found and valid
  *     otherwise, return NULL
  */
-static image_header_t* image_get_ramdisk (ulong rd_addr, uint8_t arch,
+static const image_header_t *image_get_ramdisk (ulong rd_addr, uint8_t arch,
                                                int verify)
 {
-       image_header_t *rd_hdr = (image_header_t *)rd_addr;
+       const image_header_t *rd_hdr = (const image_header_t *)rd_addr;
 
        if (!image_check_magic (rd_hdr)) {
                puts ("Bad Magic Number\n");
@@ -437,26 +434,31 @@ ulong getenv_bootm_low(void)
 
 phys_size_t getenv_bootm_size(void)
 {
+       phys_size_t tmp;
        char *s = getenv ("bootm_size");
        if (s) {
-               phys_size_t tmp;
-#ifdef CONFIG_SYS_64BIT_STRTOUL
                tmp = (phys_size_t)simple_strtoull (s, NULL, 16);
-#else
-               tmp = (phys_size_t)simple_strtoul (s, NULL, 16);
-#endif
                return tmp;
        }
+       s = getenv("bootm_low");
+       if (s)
+               tmp = (phys_size_t)simple_strtoull (s, NULL, 16);
+       else
+               tmp = 0;
+
 
 #if defined(CONFIG_ARM)
-       return gd->bd->bi_dram[0].size;
+       return gd->bd->bi_dram[0].size - tmp;
 #else
-       return gd->bd->bi_memsize;
+       return gd->bd->bi_memsize - tmp;
 #endif
 }
 
 void memmove_wd (void *to, void *from, size_t len, ulong chunksz)
 {
+       if (to == from)
+               return;
+
 #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
        while (len > 0) {
                size_t tail = (len > chunksz) ? chunksz : len;
@@ -472,7 +474,7 @@ void memmove_wd (void *to, void *from, size_t len, ulong chunksz)
 }
 #endif /* !USE_HOSTCC */
 
-static void genimg_print_size (uint32_t size)
+void genimg_print_size (uint32_t size)
 {
 #ifndef USE_HOSTCC
        printf ("%d Bytes = ", size);
@@ -514,11 +516,15 @@ static void genimg_print_time (time_t timestamp)
  *     long entry name if translation succeeds
  *     msg otherwise
  */
-static char *get_table_entry_name (table_entry_t *table, char *msg, int id)
+char *get_table_entry_name (table_entry_t *table, char *msg, int id)
 {
        for (; table->id >= 0; ++table) {
                if (table->id == id)
-                       return (table->lname);
+#if defined(USE_HOSTCC) || defined(CONFIG_RELOC_FIXUP_WORKS)
+                       return table->lname;
+#else
+                       return table->lname + gd->reloc_off;
+#endif
        }
        return (msg);
 }
@@ -557,7 +563,7 @@ const char *genimg_get_comp_name (uint8_t comp)
  *     entry id if translation succeeds
  *     -1 otherwise
  */
-static int get_table_entry_id (table_entry_t *table,
+int get_table_entry_id (table_entry_t *table,
                const char *table_name, const char *name)
 {
        table_entry_t *t;
@@ -579,7 +585,11 @@ static int get_table_entry_id (table_entry_t *table,
        fprintf (stderr, "\n");
 #else
        for (t = table; t->id >= 0; ++t) {
+#ifdef CONFIG_RELOC_FIXUP_WORKS
                if (t->sname && strcmp(t->sname, name) == 0)
+#else
+               if (t->sname && strcmp(t->sname + gd->reloc_off, name) == 0)
+#endif
                        return (t->id);
        }
        debug ("Invalid %s Type: %s\n", table_name, name);
@@ -624,13 +634,13 @@ int genimg_get_comp_id (const char *name)
  */
 int genimg_get_format (void *img_addr)
 {
-       ulong           format = IMAGE_FORMAT_INVALID;
-       image_header_t  *hdr;
+       ulong format = IMAGE_FORMAT_INVALID;
+       const image_header_t *hdr;
 #if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT)
-       char            *fit_hdr;
+       char *fit_hdr;
 #endif
 
-       hdr = (image_header_t *)img_addr;
+       hdr = (const image_header_t *)img_addr;
        if (image_check_magic(hdr))
                format = IMAGE_FORMAT_LEGACY;
 #if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT)
@@ -681,7 +691,7 @@ ulong genimg_get_image (ulong img_addr)
                /* get data size */
                switch (genimg_get_format ((void *)ram_addr)) {
                case IMAGE_FORMAT_LEGACY:
-                       d_size = image_get_data_size ((image_header_t *)ram_addr);
+                       d_size = image_get_data_size ((const image_header_t *)ram_addr);
                        debug ("   Legacy format image found at 0x%08lx, size 0x%08lx\n",
                                        ram_addr, d_size);
                        break;
@@ -753,12 +763,12 @@ int genimg_has_config (bootm_headers_t *images)
  *     1, if ramdisk image is found but corrupted, or invalid
  *     rd_start and rd_end are set to 0 if no ramdisk exists
  */
-int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images,
+int boot_get_ramdisk (int argc, char * const argv[], bootm_headers_t *images,
                uint8_t arch, ulong *rd_start, ulong *rd_end)
 {
        ulong rd_addr, rd_load;
        ulong rd_data, rd_len;
-       image_header_t *rd_hdr;
+       const image_header_t *rd_hdr;
 #if defined(CONFIG_FIT)
        void            *fit_hdr;
        const char      *fit_uname_config = NULL;
@@ -1081,9 +1091,9 @@ static void fdt_error (const char *msg)
        puts (" - must RESET the board to recover.\n");
 }
 
-static image_header_t *image_get_fdt (ulong fdt_addr)
+static const image_header_t *image_get_fdt (ulong fdt_addr)
 {
-       image_header_t *fdt_hdr = (image_header_t *)fdt_addr;
+       const image_header_t *fdt_hdr = (const image_header_t *)fdt_addr;
 
        image_print_contents (fdt_hdr);
 
@@ -1175,6 +1185,7 @@ static int fit_check_fdt (const void *fit, int fdt_noffset, int verify)
  *      0 - success
  *      1 - failure
  */
+#if defined(CONFIG_SYS_BOOTMAPSZ)
 int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
                char **of_flat_tree, ulong *of_size)
 {
@@ -1254,6 +1265,7 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
 error:
        return 1;
 }
+#endif /* CONFIG_SYS_BOOTMAPSZ */
 
 /**
  * boot_get_fdt - main fdt handling routine
@@ -1276,11 +1288,11 @@ error:
  *     1, if fdt image is found but corrupted
  *     of_flat_tree and of_size are set to 0 if no fdt exists
  */
-int boot_get_fdt (int flag, int argc, char *argv[], bootm_headers_t *images,
+int boot_get_fdt (int flag, int argc, char * const argv[], bootm_headers_t *images,
                char **of_flat_tree, ulong *of_size)
 {
+       const image_header_t *fdt_hdr;
        ulong           fdt_addr;
-       image_header_t  *fdt_hdr;
        char            *fdt_blob = NULL;
        ulong           image_start, image_end;
        ulong           load_start, load_end;