[new uImage] Add autostart flag to bootm_headers structure
[oweals/u-boot.git] / common / image.c
index 5ca77b9667b3311e5c6b51d2a3fb34946f8dd75c..4f2ff9c97719328b86603fa4c2fa02afedb68a77 100644 (file)
@@ -51,8 +51,6 @@
 #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
@@ -128,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)
@@ -375,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
  */
@@ -382,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)
@@ -487,7 +495,7 @@ 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
  */
 static image_header_t* image_get_ramdisk (cmd_tbl_t *cmdtp, int flag,
                int argc, char *argv[],
@@ -501,13 +509,13 @@ static 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);
@@ -518,7 +526,7 @@ static 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");
        }
@@ -531,7 +539,7 @@ static 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;
@@ -557,9 +565,9 @@ static 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[],
+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)
 {
@@ -626,6 +634,12 @@ void get_ramdisk (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
                        rd_hdr = image_get_ramdisk (cmdtp, flag, argc, argv,
                                                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);
                        rd_load = image_get_load (rd_hdr);
@@ -635,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",
@@ -683,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)
@@ -690,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
@@ -708,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;
@@ -730,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);