diff options
author | Ji Luo <ji.luo@nxp.com> | 2018-09-04 20:39:20 +0800 |
---|---|---|
committer | Ji Luo <ji.luo@nxp.com> | 2018-09-07 10:44:16 +0800 |
commit | 77542218ab68b9387a921b9540c46bc9d54af3ac (patch) | |
tree | b89e4240457c51181452f6db29708d88163dca3e | |
parent | 0377dc881a96b46d858643dfaa5f9ef0dd4acccc (diff) |
MA-12337-1 Including DTBO in Recovery for Non-A/B Devices in Pie 9.0
Non-A/B devices should include dtbo in recovery.img to prevent mismatch
with recovery if OTA failure. Load dtbo from recovery.img for Non-A/B
devices in recovery mode.
Change-Id: Ie8b12aeb562b80a172769af0b163df3c672c9af0
Signed-off-by: Ji Luo <ji.luo@nxp.com>
-rw-r--r-- | drivers/usb/gadget/f_fastboot.c | 38 | ||||
-rw-r--r-- | include/android_image.h | 16 |
2 files changed, 43 insertions, 11 deletions
diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index 149244f7c6..1bea0feaf0 100644 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c @@ -2051,6 +2051,12 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { requested_partitions_boot[1] = NULL; requested_partitions_recovery[1] = NULL; } +#ifndef CONFIG_ANDROID_AB_SUPPORT + else if (is_recovery_mode){ + requested_partitions_recovery[1] = NULL; + } +#endif + /* if in lock state, do avb verify */ #ifndef CONFIG_DUAL_BOOTLOADER /* For imx6 on Android, we don't have a/b slot and we want to verify @@ -2185,21 +2191,41 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { #endif #ifdef CONFIG_OF_LIBFDT /* load the dtb file */ - u32 fdt_size = 0; + u32 fdt_size = 0; + struct dt_table_header *dt_img = NULL; + if (is_load_fdt_from_part()) { #ifdef CONFIG_ANDROID_THINGS_SUPPORT if (find_partition_data_by_name("oem_bootloader", avb_out_data, &avb_loadpart)) { goto fail; - } -#else + } else + dt_img = (struct dt_table_header *)avb_loadpart->data; +#elif defined(CONFIG_ANDROID_AB_SUPPORT) if (find_partition_data_by_name("dtbo", avb_out_data, &avb_loadpart)) { goto fail; - } + } else + dt_img = (struct dt_table_header *)avb_loadpart->data; +#else + if (is_recovery_mode) { + if (hdr->header_version != 1) { + printf("boota: boot image header version error!\n"); + goto fail; + } + + dt_img = (struct dt_table_header *)((void *)(ulong)hdr + + hdr->page_size + + ALIGN(hdr->kernel_size, hdr->page_size) + + ALIGN(hdr->ramdisk_size, hdr->page_size) + + ALIGN(hdr->second_size, hdr->page_size)); + } else if (find_partition_data_by_name("dtbo", + avb_out_data, &avb_loadpart)) { + goto fail; + } else + dt_img = (struct dt_table_header *)avb_loadpart->data; #endif - struct dt_table_header *dt_img; - dt_img = (struct dt_table_header *)avb_loadpart->data; + if (be32_to_cpu(dt_img->magic) != DT_TABLE_MAGIC) { printf("boota: bad dt table magic %08x\n", be32_to_cpu(dt_img->magic)); diff --git a/include/android_image.h b/include/android_image.h index ffe50d3b9d..91cbbbf6fd 100644 --- a/include/android_image.h +++ b/include/android_image.h @@ -47,7 +47,7 @@ struct andr_img_hdr { u32 tags_addr; /* physical addr for kernel tags */ u32 page_size; /* flash page size we assume */ - u32 unused; /* reserved for future expansion: MUST be 0 */ + u32 header_version; /* operating system version and security patch level; for * version "A.B.C" and patch level "Y-M-D": @@ -65,22 +65,28 @@ struct andr_img_hdr { /* Supplemental command line data; kept here to maintain * binary compatibility with older versions of mkbootimg */ char extra_cmdline[ANDR_BOOT_EXTRA_ARGS_SIZE]; + uint32_t recovery_dtbo_size; /* size of recovery dtbo image */ + uint64_t recovery_dtbo_offset; /* offset in boot image */ + uint32_t header_size; /* size of boot image header in bytes */ } __attribute__((packed)); /* * +-----------------+ * | boot header | 1 page * +-----------------+ - * | kernel | n pages + * | kernel | i pages * +-----------------+ * | ramdisk | m pages * +-----------------+ - * | second stage | o pages + * | second stage | n pages + * +-----------------+ + * | recovery dtbo | o pages * +-----------------+ * - * n = (kernel_size + page_size - 1) / page_size + * i = (kernel_size + page_size - 1) / page_size * m = (ramdisk_size + page_size - 1) / page_size - * o = (second_size + page_size - 1) / page_size + * n = (second_size + page_size - 1) / page_size + * o = (recovery_dtbo_size + page_size - 1) / page_size * * 0. all entities are page_size aligned in flash * 1. kernel and ramdisk are required (size != 0) |