From 63db26d3da38726f19ac666fff089033c2ba64b5 Mon Sep 17 00:00:00 2001 From: zhang sanshan Date: Sun, 29 Oct 2017 16:46:26 +0800 Subject: MA-10552-6 [Android] enable A/B system in android support arm64 kernel image when enable AVB. put the bootimage at hdr->kernel_addr - hdr->page_size. copy ramdisk and dts to the addr in bootimage header. Change-Id: I45c2f8238c2bf055130e6e7c2d5b431ca46e431e Signed-off-by: zhang sanshan --- drivers/usb/gadget/f_fastboot.c | 55 +++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index 8d2996d0c7..5c6804149f 100755 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c @@ -2032,6 +2032,7 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { struct andr_img_hdr *hdr = NULL; struct andr_img_hdr *hdrload; ulong image_size; + bool check_image_arm64 = false; AvbABFlowResult avb_result; AvbSlotVerifyData *avb_out_data; @@ -2062,14 +2063,14 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { } printf(" verify OK, boot '%s%s'\n", avb_loadpart->partition_name, avb_out_data->ab_suffix); char bootargs_sec[2048]; - sprintf(bootargs_sec, "androidboot.slot_suffix=%s %s", avb_out_data->ab_suffix, avb_out_data->cmdline); + sprintf(bootargs_sec, "androidboot.slot_suffix=%s ", avb_out_data->ab_suffix); setenv("bootargs_sec", bootargs_sec); #ifdef CONFIG_SYSTEM_RAMDISK_SUPPORT if(!is_recovery_mode) fastboot_setup_system_boot_args(avb_out_data->ab_suffix); #endif image_size = avb_loadpart->data_size; - memcpy((void *)load_addr, (void *)hdr, image_size); + memcpy((void *)(hdr->kernel_addr - hdr->page_size), (void *)hdr, image_size); } else if (lock_status == FASTBOOT_LOCK) { /* && verify fail */ /* if in lock state, verify enforce fail */ printf(" verify FAIL, state: LOCK\n"); @@ -2105,7 +2106,7 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { } image_size = android_image_get_end(hdr) - (ulong)hdr; if (fsl_avb_ops.read_from_partition(&fsl_avb_ops, bootimg, - 0, image_size, (void *)load_addr, &num_read) != AVB_IO_RESULT_OK && + 0, image_size, (void *)(hdr->kernel_addr - hdr->page_size), &num_read) != AVB_IO_RESULT_OK && num_read != image_size) { printf("boota: read boot image error\n"); goto fail; @@ -2122,31 +2123,26 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { #endif flush_cache((ulong)load_addr, image_size); - addr = load_addr; - hdrload = (struct andr_img_hdr *)load_addr; + hdrload = (struct andr_img_hdr *)(hdr->kernel_addr - hdr->page_size); + check_image_arm64 = image_arm64((void *)hdrload->kernel_addr); - ulong img_ramdisk, img_ramdisk_len; - if(android_image_get_ramdisk(hdrload, &img_ramdisk, &img_ramdisk_len) != 0) { - printf("boota: mmc failed to read ramdisk\n"); - goto fail; - } - memcpy((void *)hdrload->ramdisk_addr, (void *)img_ramdisk, img_ramdisk_len); - /* flush cache after read */ - flush_cache((ulong)hdrload->ramdisk_addr, img_ramdisk_len); /* FIXME */ + memcpy((void *)hdrload->ramdisk_addr, (void *)hdrload->kernel_addr + + ALIGN(hdrload->kernel_size,hdrload->page_size), hdrload->ramdisk_size); #ifdef CONFIG_OF_LIBFDT /* load the dtb file */ if (hdrload->second_size && hdrload->second_addr) { - ulong img_fdt, img_fdt_len; - if (android_image_get_fdt(hdrload, &img_fdt, &img_fdt_len) != 0) { - printf("boota: mmc failed to dtb\n"); - goto fail; - } - memcpy((void *)hdrload->second_addr, (void *)img_fdt, img_fdt_len); - /* flush cache after read */ - flush_cache((ulong)hdrload->second_addr, img_fdt_len); /* FIXME */ + memcpy((void *)hdrload->second_addr, (void *)hdrload->kernel_addr + + ALIGN(hdrload->kernel_size, hdrload->page_size) + + ALIGN(hdrload->ramdisk_size, hdrload->page_size), hdr->second_size); } #endif /*CONFIG_OF_LIBFDT*/ + if (check_image_arm64) { + android_image_get_kernel(hdrload, 0, NULL, NULL); + addr = hdrload->kernel_addr; + } else { + addr = hdrload; + } printf("kernel @ %08x (%d)\n", hdrload->kernel_addr, hdrload->kernel_size); printf("ramdisk @ %08x (%d)\n", hdrload->ramdisk_addr, hdrload->ramdisk_size); #ifdef CONFIG_OF_LIBFDT @@ -2158,7 +2154,11 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { 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", hdrload->ramdisk_addr, hdrload->ramdisk_size); @@ -2166,8 +2166,15 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { if (avb_out_data != NULL) avb_slot_verify_data_free(avb_out_data); - - 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); -- cgit v1.2.3