ARM: fdt support: Add usbethaddr as an acceptable MAC
[platform/kernel/u-boot.git] / common / cmd_bootm.c
index c243a5b..c06f4b7 100644 (file)
 #include <usb.h>
 #endif
 
-#ifdef CONFIG_SYS_HUSH_PARSER
-#include <hush.h>
-#endif
-
 #if defined(CONFIG_OF_LIBFDT)
 #include <libfdt.h>
 #include <fdt_support.h>
@@ -222,6 +218,7 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc,
                         char * const argv[])
 {
        const void *os_hdr;
+       bool ep_found = false;
 
        /* get kernel image header, start address and length */
        os_hdr = boot_get_kernel(cmdtp, flag, argc, argv,
@@ -233,6 +230,7 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc,
 
        /* get image parameters */
        switch (genimg_get_format(os_hdr)) {
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
        case IMAGE_FORMAT_LEGACY:
                images.os.type = image_get_type(os_hdr);
                images.os.comp = image_get_comp(os_hdr);
@@ -241,6 +239,7 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc,
                images.os.end = image_get_image_end(os_hdr);
                images.os.load = image_get_load(os_hdr);
                break;
+#endif
 #if defined(CONFIG_FIT)
        case IMAGE_FORMAT_FIT:
                if (fit_image_get_type(images.fit_hdr_os,
@@ -274,6 +273,18 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc,
                }
                break;
 #endif
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+       case IMAGE_FORMAT_ANDROID:
+               images.os.type = IH_TYPE_KERNEL;
+               images.os.comp = IH_COMP_NONE;
+               images.os.os = IH_OS_LINUX;
+               images.ep = images.os.load;
+               ep_found = true;
+
+               images.os.end = android_image_get_end(os_hdr);
+               images.os.load = android_image_get_kload(os_hdr);
+               break;
+#endif
        default:
                puts("ERROR: unknown image format type!\n");
                return 1;
@@ -293,7 +304,7 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc,
                        return 1;
                }
 #endif
-       } else {
+       } else if (!ep_found) {
                puts("Could not find kernel entry point!\n");
                return 1;
        }
@@ -388,7 +399,7 @@ static int bootm_load_os(bootm_headers_t *images, unsigned long *load_end,
        image_buf = map_sysmem(image_start, image_len);
        switch (comp) {
        case IH_COMP_NONE:
-               if (load == blob_start || load == image_start) {
+               if (load == image_start) {
                        printf("   XIP %s ... ", type_name);
                        no_overlap = 1;
                } else {
@@ -838,6 +849,7 @@ int bootm_maybe_autostart(cmd_tbl_t *cmdtp, const char *cmd)
        return 0;
 }
 
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
 /**
  * image_get_kernel - verify legacy format kernel image
  * @img_addr: in RAM address of the legacy format image to be verified
@@ -888,6 +900,7 @@ static image_header_t *image_get_kernel(ulong img_addr, int verify)
        }
        return hdr;
 }
+#endif
 
 /**
  * boot_get_kernel - find kernel image
@@ -905,7 +918,9 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
                char * const argv[], bootm_headers_t *images, ulong *os_data,
                ulong *os_len)
 {
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
        image_header_t  *hdr;
+#endif
        ulong           img_addr;
        const void *buf;
 #if defined(CONFIG_FIT)
@@ -943,6 +958,7 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
        *os_data = *os_len = 0;
        buf = map_sysmem(img_addr, 0);
        switch (genimg_get_format(buf)) {
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
        case IMAGE_FORMAT_LEGACY:
                printf("## Booting kernel from Legacy Image at %08lx ...\n",
                                img_addr);
@@ -985,6 +1001,7 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
                images->legacy_hdr_valid = 1;
                bootstage_mark(BOOTSTAGE_ID_DECOMP_IMAGE);
                break;
+#endif
 #if defined(CONFIG_FIT)
        case IMAGE_FORMAT_FIT:
                os_noffset = fit_image_load(images, FIT_KERNEL_PROP,
@@ -1002,6 +1019,14 @@ static const void *boot_get_kernel(cmd_tbl_t *cmdtp, int flag, int argc,
                images->fit_noffset_os = os_noffset;
                break;
 #endif
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+       case IMAGE_FORMAT_ANDROID:
+               printf("## Booting Android Image at 0x%08lx ...\n", img_addr);
+               if (android_image_get_kernel((void *)img_addr, images->verify,
+                                            os_data, os_len))
+                       return NULL;
+               break;
+#endif
        default:
                printf("Wrong Image Format for %s command\n", cmdtp->name);
                bootstage_error(BOOTSTAGE_ID_FIT_KERNEL_INFO);
@@ -1062,11 +1087,7 @@ U_BOOT_CMD(
 #if defined(CONFIG_CMD_BOOTD)
 int do_bootd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
-       int rcode = 0;
-
-       if (run_command(getenv("bootcmd"), flag) < 0)
-               rcode = 1;
-       return rcode;
+       return run_command(getenv("bootcmd"), flag);
 }
 
 U_BOOT_CMD(
@@ -1114,6 +1135,7 @@ static int image_info(ulong addr)
        printf("\n## Checking Image at %08lx ...\n", addr);
 
        switch (genimg_get_format(hdr)) {
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
        case IMAGE_FORMAT_LEGACY:
                puts("   Legacy image found\n");
                if (!image_check_magic(hdr)) {
@@ -1135,6 +1157,7 @@ static int image_info(ulong addr)
                }
                puts("OK\n");
                return 0;
+#endif
 #if defined(CONFIG_FIT)
        case IMAGE_FORMAT_FIT:
                puts("   FIT image found\n");
@@ -1194,6 +1217,7 @@ static int do_imls_nor(void)
                                goto next_sector;
 
                        switch (genimg_get_format(hdr)) {
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
                        case IMAGE_FORMAT_LEGACY:
                                if (!image_check_hcrc(hdr))
                                        goto next_sector;
@@ -1208,6 +1232,7 @@ static int do_imls_nor(void)
                                        puts("OK\n");
                                }
                                break;
+#endif
 #if defined(CONFIG_FIT)
                        case IMAGE_FORMAT_FIT:
                                if (!fit_check_format(hdr))
@@ -1342,12 +1367,14 @@ static int do_imls_nand(void)
                        }
 
                        switch (genimg_get_format(buffer)) {
+#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
                        case IMAGE_FORMAT_LEGACY:
                                header = (const image_header_t *)buffer;
 
                                len = image_get_image_size(header);
                                nand_imls_legacyimage(nand, nand_dev, off, len);
                                break;
+#endif
 #if defined(CONFIG_FIT)
                        case IMAGE_FORMAT_FIT:
                                len = fit_get_size(buffer);