MA-9702-2 [Android] arm2-8qm: bring up android in v2017.
authorsanshan zhang <sanshan.zhang@nxp.com>
Thu, 8 Jun 2017 02:41:38 +0000 (10:41 +0800)
committerJason Liu <jason.hui.liu@nxp.com>
Thu, 2 Nov 2017 18:36:53 +0000 (02:36 +0800)
enable booti for imx8.
boot_addr_start for booti should be the addr of Image rather than
boot.img, so need read Image into hdr->kernel_addr.
change the offset for bootloader.
booti do not call android_image_get_kernel to init android env.
booti can't load boot.img, so it can't init android env.
init android env through android_image_get_kernel.

Change-Id: Ifb990ee9c5710ce7bd5fa9a0d4221dcb0e52d341
Signed-off-by: sanshan zhang <sanshan.zhang@nxp.com>
common/image-android.c
drivers/usb/gadget/f_fastboot.c
include/android_image.h
include/image.h

index 66f4316..d2ad997 100644 (file)
@@ -220,3 +220,15 @@ int android_image_get_fdt(const struct andr_img_hdr *hdr,
        *fdt_len = hdr->second_size;
        return 0;
 }
+
+#define ARM64_IMAGE_MAGIC      0x644d5241
+bool image_arm64(void *images)
+{
+       struct header_image *ih;
+
+       ih = (struct header_image *)images;
+       debug("image magic: %x\n", ih->magic);
+       if (ih->magic == le32_to_cpu(ARM64_IMAGE_MAGIC))
+               return true;
+       return false;
+}
index fdbf2f8..33cad88 100644 (file)
@@ -41,6 +41,7 @@
 #include <part.h>
 #include <sparse_format.h>
 #include <image-sparse.h>
+#include <image.h>
 #include <asm/imx-common/boot_mode.h>
 #ifdef CONFIG_ANDROID_RECOVERY
 #include <recovery.h>
@@ -187,7 +188,11 @@ static struct usb_gadget_strings *fastboot_strings[] = {
 
 #define ANDROID_MBR_OFFSET         0
 #define ANDROID_MBR_SIZE           0x200
+#ifdef  CONFIG_BOOTLOADER_OFFSET_33K
+#define ANDROID_BOOTLOADER_OFFSET   0x8400
+#else
 #define ANDROID_BOOTLOADER_OFFSET   0x400
+#endif
 #define ANDROID_BOOTLOADER_SIZE            0xFFC00
 #define ANDROID_KERNEL_OFFSET      0x100000
 #define ANDROID_KERNEL_SIZE        0x500000
@@ -1768,6 +1773,7 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        int mmcc = -1;
        struct andr_img_hdr *hdr = &boothdr;
     ulong image_size;
+       bool check_image_arm64;
 #ifdef CONFIG_SECURE_BOOT
 #define IVT_SIZE 0x20
 #define CSF_PAD_SIZE CONFIG_CSF_SIZE
@@ -1883,7 +1889,7 @@ use_given_ptn:
                }
                /* flush cache after read */
                flush_cache((ulong)load_addr, bootimg_sectors * 512); /* FIXME */
-
+               check_image_arm64  = image_arm64(load_addr + hdr->page_size);
                addr = load_addr;
 #ifdef CONFIG_FASTBOOT_LOCK
                int verifyresult = -1;
@@ -1919,6 +1925,17 @@ use_given_ptn:
 #endif
 
                sector = pte->start + (hdr->page_size / 512);
+               if (check_image_arm64) {
+                       if (mmc->block_dev.block_read(dev_desc, sector,
+                                                               (hdr->kernel_size / 512) + 1,
+                                                               (void *)hdr->kernel_addr) < 0) {
+                               printf("boota: mmc failed to read kernel\n");
+                               goto fail;
+                       }
+                       flush_cache((ulong)hdr->kernel_addr, hdr->kernel_size);
+                       android_image_get_kernel(hdr, 0, NULL, NULL);
+                       addr = hdr->kernel_addr;
+               }
                sector += ALIGN(hdr->kernel_size, hdr->page_size) / 512;
                if (mmc->block_dev.block_read(dev_desc, sector,
                                                (hdr->ramdisk_size / 512) + 1,
@@ -2038,15 +2055,24 @@ use_given_ptn:
        char boot_addr_start[12];
        char ramdisk_addr[25];
        char fdt_addr[12];
-
-       char *bootm_args[] = { "bootm", boot_addr_start, ramdisk_addr, fdt_addr};
+       char *boot_args[] = { NULL, boot_addr_start, ramdisk_addr, fdt_addr};
+       if (check_image_arm64)
+               boot_args[0] = "booti";
+       else
+               boot_args[0] = "bootm";
 
        sprintf(boot_addr_start, "0x%lx", addr);
        sprintf(ramdisk_addr, "0x%x:0x%x", hdr->ramdisk_addr, hdr->ramdisk_size);
        sprintf(fdt_addr, "0x%x", hdr->second_addr);
-
-       do_bootm(NULL, 0, 4, bootm_args);
-
+       if (check_image_arm64) {
+#ifdef CONFIG_CMD_BOOTI
+               do_booti(NULL, 0, 4, boot_args);
+#else
+               debug("please enable CONFIG_CMD_BOOTI when kernel are Image");
+#endif
+       } else {
+               do_bootm(NULL, 0, 4, boot_args);
+       }
        /* This only happens if image is somehow faulty so we start over */
        do_reset(NULL, 0, 0, NULL);
 
index 094d60a..1c70bf8 100644 (file)
@@ -66,4 +66,16 @@ struct andr_img_hdr {
  * 6. if second_size != 0: jump to second_addr
  *    else: jump to kernel_addr
  */
+struct header_image {
+       uint32_t        code0;          /* Executable code */
+       uint32_t        code1;          /* Executable code */
+       uint64_t        text_offset;    /* Image load offset, LE */
+       uint64_t        image_size;     /* Effective Image size, LE */
+       uint64_t        res1;           /* reserved */
+       uint64_t        res2;           /* reserved */
+       uint64_t        res3;           /* reserved */
+       uint64_t        res4;           /* reserved */
+       uint32_t        magic;          /* Magic number */
+       uint32_t        res5;
+};
 #endif
index dd4c8e3..54a5d8e 100644 (file)
@@ -1245,6 +1245,7 @@ int android_image_get_fdt(const struct andr_img_hdr *hdr,
 ulong android_image_get_end(const struct andr_img_hdr *hdr);
 ulong android_image_get_kload(const struct andr_img_hdr *hdr);
 void android_print_contents(const struct andr_img_hdr *hdr);
+bool image_arm64(void *images);
 
 #endif /* CONFIG_ANDROID_BOOT_IMAGE */