summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJi Luo <ji.luo@nxp.com>2018-09-04 20:39:20 +0800
committerJi Luo <ji.luo@nxp.com>2018-09-07 10:44:16 +0800
commit77542218ab68b9387a921b9540c46bc9d54af3ac (patch)
treeb89e4240457c51181452f6db29708d88163dca3e
parent0377dc881a96b46d858643dfaa5f9ef0dd4acccc (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.c38
-rw-r--r--include/android_image.h16
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)