summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzhang sanshan <sanshan.zhang@nxp.com>2017-10-29 16:46:26 +0800
committerzhang sanshan <sanshan.zhang@nxp.com>2017-10-29 17:42:29 +0800
commit63db26d3da38726f19ac666fff089033c2ba64b5 (patch)
tree7bf1d9f7e11f711fc939d3bb2469dbc1c00c8b53
parent6dc7b0fb3d7b175bc3b94dc822a59f927046cfb2 (diff)
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 <sanshan.zhang@nxp.com>
-rwxr-xr-xdrivers/usb/gadget/f_fastboot.c55
1 files 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);