]> git.sur5r.net Git - u-boot/blobdiff - common/image.c
Move do_irqinfo() to common/cmd_irq.c
[u-boot] / common / image.c
index dc8d7dda6b8abe3a05676a3d0af5caae984349a3..6eaf41eb131feb2624421b590c99441bc3a542bf 100644 (file)
@@ -65,7 +65,7 @@ extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
 
 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",        },
@@ -145,6 +139,7 @@ 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",},
        {       -1,                 "",           "",                   },
 };
 
@@ -158,7 +153,6 @@ static table_entry_t uimage_comp[] = {
 
 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 +160,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 +175,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 +197,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 +230,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 +266,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 +280,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 +290,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 +358,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");
@@ -426,8 +421,8 @@ ulong getenv_bootm_low(void)
                return tmp;
        }
 
-#if defined(CFG_SDRAM_BASE)
-       return CFG_SDRAM_BASE;
+#if defined(CONFIG_SYS_SDRAM_BASE)
+       return CONFIG_SYS_SDRAM_BASE;
 #elif defined(CONFIG_ARM)
        return gd->bd->bi_dram[0].start;
 #else
@@ -440,7 +435,7 @@ phys_size_t getenv_bootm_size(void)
        char *s = getenv ("bootm_size");
        if (s) {
                phys_size_t tmp;
-#ifdef CFG_64BIT_STRTOUL
+#ifdef CONFIG_SYS_64BIT_STRTOUL
                tmp = (phys_size_t)simple_strtoull (s, NULL, 16);
 #else
                tmp = (phys_size_t)simple_strtoul (s, NULL, 16);
@@ -472,7 +467,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 +509,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 +556,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 +578,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 +627,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)
@@ -663,7 +666,7 @@ ulong genimg_get_image (ulong img_addr)
 
        if (addr_dataflash (img_addr)){
                /* ger RAM address */
-               ram_addr = CFG_LOAD_ADDR;
+               ram_addr = CONFIG_SYS_LOAD_ADDR;
 
                /* get header size */
                h_size = image_get_header_size ();
@@ -681,7 +684,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;
@@ -758,7 +761,7 @@ int boot_get_ramdisk (int argc, char *argv[], bootm_headers_t *images,
 {
        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;
@@ -1071,6 +1074,7 @@ int boot_ramdisk_high (struct lmb *lmb, ulong rd_data, ulong rd_len,
 error:
        return -1;
 }
+#endif /* defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_SPARC) */
 
 #ifdef CONFIG_OF_LIBFDT
 static void fdt_error (const char *msg)
@@ -1080,9 +1084,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);
 
@@ -1154,8 +1158,8 @@ static int fit_check_fdt (const void *fit, int fdt_noffset, int verify)
 }
 #endif /* CONFIG_FIT */
 
-#ifndef CFG_FDT_PAD
-#define CFG_FDT_PAD 0x3000
+#ifndef CONFIG_SYS_FDT_PAD
+#define CONFIG_SYS_FDT_PAD 0x3000
 #endif
 
 /**
@@ -1190,7 +1194,7 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
                goto error;
        }
 
-#ifndef CFG_NO_FLASH
+#ifndef CONFIG_SYS_NO_FLASH
        /* move the blob if it is in flash (set relocate) */
        if (addr2info ((ulong)fdt_blob) != NULL)
                relocate = 1;
@@ -1202,8 +1206,8 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
        if (fdt_blob < (char *)bootmap_base)
                relocate = 1;
 
-       if ((fdt_blob + *of_size + CFG_FDT_PAD) >=
-                       ((char *)CFG_BOOTMAPSZ + bootmap_base))
+       if ((fdt_blob + *of_size + CONFIG_SYS_FDT_PAD) >=
+                       ((char *)CONFIG_SYS_BOOTMAPSZ + bootmap_base))
                relocate = 1;
 
        /* move flattend device tree if needed */
@@ -1213,9 +1217,9 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
 
                /* position on a 4K boundary before the alloc_current */
                /* Pad the FDT by a specified amount */
-               of_len = *of_size + CFG_FDT_PAD;
+               of_len = *of_size + CONFIG_SYS_FDT_PAD;
                of_start = (unsigned long)lmb_alloc_base(lmb, of_len, 0x1000,
-                               (CFG_BOOTMAPSZ + bootmap_base));
+                               (CONFIG_SYS_BOOTMAPSZ + bootmap_base));
 
                if (of_start == 0) {
                        puts("device tree - allocation error\n");
@@ -1240,7 +1244,7 @@ int boot_relocate_fdt (struct lmb *lmb, ulong bootmap_base,
                *of_size = of_len;
        } else {
                *of_flat_tree = fdt_blob;
-               of_len = (CFG_BOOTMAPSZ + bootmap_base) - (ulong)fdt_blob;
+               of_len = (CONFIG_SYS_BOOTMAPSZ + bootmap_base) - (ulong)fdt_blob;
                lmb_reserve(lmb, (ulong)fdt_blob, of_len);
                fdt_set_totalsize(*of_flat_tree, of_len);
 
@@ -1278,8 +1282,8 @@ error:
 int boot_get_fdt (int flag, int argc, char *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;
@@ -1575,6 +1579,7 @@ error:
 }
 #endif /* CONFIG_OF_LIBFDT */
 
+#if defined(CONFIG_PPC) || defined(CONFIG_M68K)
 /**
  * boot_get_cmdline - allocate and initialize kernel cmdline
  * @lmb: pointer to lmb handle, will be used for memory mgmt
@@ -1598,8 +1603,8 @@ int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end,
        char *cmdline;
        char *s;
 
-       cmdline = (char *)(ulong)lmb_alloc_base(lmb, CFG_BARGSIZE, 0xf,
-                                        CFG_BOOTMAPSZ + bootmap_base);
+       cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf,
+                                        CONFIG_SYS_BOOTMAPSZ + bootmap_base);
 
        if (cmdline == NULL)
                return -1;
@@ -1635,7 +1640,7 @@ int boot_get_cmdline (struct lmb *lmb, ulong *cmd_start, ulong *cmd_end,
 int boot_get_kbd (struct lmb *lmb, bd_t **kbd, ulong bootmap_base)
 {
        *kbd = (bd_t *)(ulong)lmb_alloc_base(lmb, sizeof(bd_t), 0xf,
-                                     CFG_BOOTMAPSZ + bootmap_base);
+                                     CONFIG_SYS_BOOTMAPSZ + bootmap_base);
        if (*kbd == NULL)
                return -1;
 
@@ -1852,7 +1857,10 @@ void fit_print_contents (const void *fit)
  * @p: pointer to prefix string
  *
  * fit_image_print() lists all mandatory properies for the processed component
- * image. If present, hash nodes are printed out as well.
+ * image. If present, hash nodes are printed out as well. Load
+ * address for images of type firmware is also printed out. Since the load
+ * address is not mandatory for firmware images, it will be output as
+ * "unavailable" when not present.
  *
  * returns:
  *     no returned results
@@ -1911,14 +1919,17 @@ void fit_image_print (const void *fit, int image_noffset, const char *p)
                printf ("%s  OS:           %s\n", p, genimg_get_os_name (os));
        }
 
-       if ((type == IH_TYPE_KERNEL) || (type == IH_TYPE_STANDALONE)) {
+       if ((type == IH_TYPE_KERNEL) || (type == IH_TYPE_STANDALONE) ||
+               (type == IH_TYPE_FIRMWARE)) {
                ret = fit_image_get_load (fit, image_noffset, &load);
                printf ("%s  Load Address: ", p);
                if (ret)
                        printf ("unavailable\n");
                else
                        printf ("0x%08lx\n", load);
+       }
 
+       if ((type == IH_TYPE_KERNEL) || (type == IH_TYPE_STANDALONE)) {
                fit_image_get_entry (fit, image_noffset, &entry);
                printf ("%s  Entry Point:  ", p);
                if (ret)
@@ -2844,7 +2855,7 @@ int fit_check_format (const void *fit)
 #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || defined(USE_HOSTCC)
        /* mandatory / node 'timestamp' property */
        if (fdt_getprop (fit, 0, FIT_TIMESTAMP_PROP, NULL) == NULL) {
-               debug ("Wrong FIT format: no description\n");
+               debug ("Wrong FIT format: no timestamp\n");
                return 0;
        }
 #endif