[new uImage] Add autostart flag to bootm_headers structure
[oweals/u-boot.git] / common / image.c
index ea27b0ba5b6ce1d90e8b886fee3143967678d0a6..4f2ff9c97719328b86603fa4c2fa02afedb68a77 100644 (file)
 #include <fdt_support.h>
 #endif
 
-extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
-
 #ifdef CONFIG_CMD_BDI
 extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
 #endif
 
 DECLARE_GLOBAL_DATA_PTR;
+
+static image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag,
+               int argc, char *argv[],
+               ulong rd_addr, uint8_t arch, int verify);
 #else
 #include "mkimage.h"
 #endif /* USE_HOSTCC*/
@@ -124,6 +126,12 @@ int getenv_verify (void)
        return (s && (*s == 'n')) ? 0 : 1;
 }
 
+int getenv_autostart (void)
+{
+       char *s = getenv ("autostart");
+       return (s && (*s == 'n')) ? 0 : 1;
+}
+
 void memmove_wd (void *to, void *from, size_t len, ulong chunksz)
 {
 #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
@@ -371,6 +379,10 @@ void image_print_contents (image_header_t *hdr)
  * gen_image_get_format() checks whether provided address points to a valid
  * legacy or FIT image.
  *
+ * New uImage format and FDT blob are based on a libfdt. FDT blob
+ * may be passed directly or embedded in a FIT image. In both situations
+ * gen_image_get_format() must be able to dectect libfdt header.
+ *
  * returns:
  *     image format type or IMAGE_FORMAT_INVALID if no image is present
  */
@@ -378,14 +390,14 @@ int gen_image_get_format (void *img_addr)
 {
        ulong           format = IMAGE_FORMAT_INVALID;
        image_header_t  *hdr;
-#if defined(CONFIG_FIT)
+#if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT)
        char            *fit_hdr;
 #endif
 
        hdr = (image_header_t *)img_addr;
        if (image_check_magic(hdr))
                format = IMAGE_FORMAT_LEGACY;
-#if defined(CONFIG_FIT)
+#if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT)
        else {
                fit_hdr = (char *)img_addr;
                if (fdt_check_header (fit_hdr) == 0)
@@ -408,55 +420,57 @@ int gen_image_get_format (void *img_addr)
  */
 ulong gen_get_image (ulong img_addr)
 {
-       ulong ram_addr, h_size, d_size;
-
-       h_size = image_get_header_size ();
-#if defined(CONFIG_FIT)
-       if (sizeof(struct fdt_header) > h_size)
-               h_size = sizeof(struct fdt_header);
-#endif
+       ulong ram_addr = img_addr;
 
 #ifdef CONFIG_HAS_DATAFLASH
+       ulong h_size, d_size;
+
        if (addr_dataflash (img_addr)){
+               /* ger RAM address */
                ram_addr = CFG_LOAD_ADDR;
+
+               /* get header size */
+               h_size = image_get_header_size ();
+#if defined(CONFIG_FIT)
+               if (sizeof(struct fdt_header) > h_size)
+                       h_size = sizeof(struct fdt_header);
+#endif
+
+               /* read in header */
                debug ("   Reading image header from dataflash address "
                        "%08lx to RAM address %08lx\n", img_addr, ram_addr);
-               read_dataflash (img_addr, h_size, (char *)ram_addr);
-       } else
-#endif
-               return img_addr;
 
-       ram_addr = img_addr;
+               read_dataflash (img_addr, h_size, (char *)ram_addr);
 
-       switch (gen_image_get_format ((void *)ram_addr)) {
-       case IMAGE_FORMAT_LEGACY:
-               d_size = image_get_data_size ((image_header_t *)ram_addr);
-               debug ("   Legacy format image found at 0x%08lx, size 0x%08lx\n",
-                               ram_addr, d_size);
-               break;
+               /* get data size */
+               switch (gen_image_get_format ((void *)ram_addr)) {
+               case IMAGE_FORMAT_LEGACY:
+                       d_size = image_get_data_size ((image_header_t *)ram_addr);
+                       debug ("   Legacy format image found at 0x%08lx, size 0x%08lx\n",
+                                       ram_addr, d_size);
+                       break;
 #if defined(CONFIG_FIT)
-       case IMAGE_FORMAT_FIT:
-               d_size = fdt_totalsize((void *)ram_addr) - h_size;
-               debug ("   FIT/FDT format image found at 0x%08lx, size 0x%08lx\n",
-                               ram_addr, d_size);
-
-               break;
+               case IMAGE_FORMAT_FIT:
+                       d_size = fdt_totalsize((void *)ram_addr) - h_size;
+                       debug ("   FIT/FDT format image found at 0x%08lx, size 0x%08lx\n",
+                                       ram_addr, d_size);
+                       break;
 #endif
-       default:
-               printf ("   No valid image found at 0x%08lx\n", img_addr);
-               return ram_addr;
-       }
+               default:
+                       printf ("   No valid image found at 0x%08lx\n", img_addr);
+                       return ram_addr;
+               }
 
-#ifdef CONFIG_HAS_DATAFLASH
-       if (addr_dataflash (img_addr)) {
+               /* read in image data */
                debug ("   Reading image remaining data from dataflash address "
                        "%08lx to RAM address %08lx\n", img_addr + h_size,
                        ram_addr + h_size);
 
                read_dataflash (img_addr + h_size, d_size,
                                (char *)(ram_addr + h_size));
+
        }
-#endif
+#endif /* CONFIG_HAS_DATAFLASH */
 
        return ram_addr;
 }
@@ -481,9 +495,9 @@ ulong gen_get_image (ulong img_addr)
  *
  * returns:
  *     pointer to a ramdisk image header, if image was found and valid
- *     otherwise, board is reset
+ *     otherwise, return NULL
  */
-image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag,
+static image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag,
                int argc, char *argv[],
                ulong rd_addr, uint8_t arch, int verify)
 {
@@ -495,13 +509,13 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag,
        if (!image_check_magic (rd_hdr)) {
                puts ("Bad Magic Number\n");
                show_boot_progress (-10);
-               do_reset (cmdtp, flag, argc, argv);
+               return NULL;
        }
 
        if (!image_check_hcrc (rd_hdr)) {
                puts ("Bad Header Checksum\n");
                show_boot_progress (-11);
-               do_reset (cmdtp, flag, argc, argv);
+               return NULL;
        }
 
        show_boot_progress (10);
@@ -512,7 +526,7 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag,
                if (!image_check_dcrc_wd (rd_hdr, CHUNKSZ)) {
                        puts ("Bad Data CRC\n");
                        show_boot_progress (-12);
-                       do_reset (cmdtp, flag, argc, argv);
+                       return NULL;
                }
                puts("OK\n");
        }
@@ -525,7 +539,7 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag,
                printf ("No Linux %s Ramdisk Image\n",
                                image_get_arch_name(arch));
                show_boot_progress (-13);
-               do_reset (cmdtp, flag, argc, argv);
+               return NULL;
        }
 
        return rd_hdr;
@@ -537,8 +551,7 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag,
  * @flag: command flag
  * @argc: command argument count
  * @argv: command argument list
- * @images: pointer to the bootm images strcture
- * @verify: checksum verification flag
+ * @images: pointer to the bootm images structure
  * @arch: expected ramdisk architecture
  * @rd_start: pointer to a ulong variable, will hold ramdisk start address
  * @rd_end: pointer to a ulong variable, will hold ramdisk end
@@ -552,10 +565,10 @@ image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag,
  *     rd_start and rd_end are set to ramdisk start/end addresses if
  *     ramdisk image is found and valid
  *     rd_start and rd_end are set to 0 if no ramdisk exists
- *     board is reset if ramdisk image is found but corrupted
+ *     return 1 if ramdisk image is found but corrupted
  */
-void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
-               bootm_headers_t *images, int verify, uint8_t arch,
+int 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)
 {
        ulong rd_addr, rd_load;
@@ -619,7 +632,13 @@ void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                        debug ("*  ramdisk: legacy format image\n");
 
                        rd_hdr = image_get_ramdisk (cmdtp, flag, argc, argv,
-                                               rd_addr, arch, verify);
+                                               rd_addr, arch, images->verify);
+
+                       if (rd_hdr == NULL) {
+                               *rd_start = 0;
+                               *rd_end = 0;
+                               return 1;
+                       }
 
                        rd_data = image_get_data (rd_hdr);
                        rd_len = image_get_data_size (rd_hdr);
@@ -630,7 +649,7 @@ void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                        fit_hdr = (void *)rd_addr;
                        debug ("*  ramdisk: FIT format image\n");
                        fit_unsupported_reset ("ramdisk");
-                       do_reset (cmdtp, flag, argc, argv);
+                       return 1;
 #endif
                default:
                        printf ("Wrong Image Format for %s command\n",
@@ -678,6 +697,8 @@ void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
        }
        debug ("   ramdisk start = 0x%08lx, ramdisk end = 0x%08lx\n",
                        *rd_start, *rd_end);
+
+       return 0;
 }
 
 #if defined(CONFIG_PPC) || defined(CONFIG_M68K)
@@ -685,7 +706,6 @@ void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
  * ramdisk_high - relocate init ramdisk
  * @rd_data: ramdisk data start address
  * @rd_len: ramdisk data length
- * @kbd: kernel board info copy (within BOOTMAPSZ boundary)
  * @sp_limit: stack pointer limit (including BOOTMAPSZ)
  * @sp: current stack pointer
  * @initrd_start: pointer to a ulong variable, will hold final init ramdisk
@@ -703,7 +723,7 @@ void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
  *     - returns new allc_current, next free address below BOOTMAPSZ
  */
 ulong ramdisk_high (ulong alloc_current, ulong rd_data, ulong rd_len,
-               bd_t *kbd, ulong sp_limit, ulong sp,
+               ulong sp_limit, ulong sp,
                ulong *initrd_start, ulong *initrd_end)
 {
        char    *s;
@@ -725,9 +745,9 @@ ulong ramdisk_high (ulong alloc_current, ulong rd_data, ulong rd_len,
 
 #ifdef CONFIG_LOGBUFFER
        /* Prevent initrd from overwriting logbuffer */
-       if (initrd_high < (kbd->bi_memsize - LOGBUFF_LEN - LOGBUFF_OVERHEAD))
-               initrd_high = kbd->bi_memsize - LOGBUFF_LEN - LOGBUFF_OVERHEAD;
-       debug ("## Logbuffer at 0x%08lx ", kbd->bi_memsize - LOGBUFF_LEN);
+       if (initrd_high < (gd->bd->bi_memsize - LOGBUFF_LEN - LOGBUFF_OVERHEAD))
+           initrd_high = gd->bd->bi_memsize - LOGBUFF_LEN - LOGBUFF_OVERHEAD;
+       debug ("## Logbuffer at 0x%08lx ", gd->bd->bi_memsize - LOGBUFF_LEN);
 #endif
        debug ("## initrd_high = 0x%08lx, copy_to_ram = %d\n",
                        initrd_high, initrd_copy_to_ram);