diff options
author | Braden Kell <bradenkell@google.com> | 2018-01-31 09:42:56 -0800 |
---|---|---|
committer | Ji Luo <ji.luo@nxp.com> | 2018-08-20 21:25:41 +0800 |
commit | 7db36bcbef8d8ec0866b116eacdb8eea0ce259bb (patch) | |
tree | 02665a610668b6cfe175e142da54fcee4a729416 /drivers | |
parent | 8ef2dfd7f199d3285d4f861d812ca59bf1aa0170 (diff) |
[iot] iMX7D: Load device tree from oem_bootloader
Load kernel.dtb from oem_bootloader root, or fall
back to default behavior if that doesn't work.
oem_bootloader should be ext2 or ext4.
Bug: 72662957
Test: U-Boot loads modified dtb from
oem_bootloader, or loads original dtb if
kernel.dtb doesn't exist or oem_bootloader
isn't formatted
Change-Id: Ic93b572a482e85726e2fa0792997348c855f41a1
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/gadget/f_fastboot.c | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c index 2c98aa0d84..7cd70b035e 100644 --- a/drivers/usb/gadget/f_fastboot.c +++ b/drivers/usb/gadget/f_fastboot.c @@ -67,6 +67,10 @@ extern void trusty_os_init(void); #include <fsl_avb.h> #endif +#ifdef CONFIG_ANDROID_THINGS_SUPPORT +#include <fs.h> +#endif + #ifdef CONFIG_FASTBOOT_LOCK #include "fastboot_lock_unlock.h" #endif @@ -108,6 +112,11 @@ struct fastboot_device_info fastboot_firmwareinfo; * that expect bulk OUT requests to be divisible by maxpacket size. */ +#define AT_OEM_DTB "/kernel.dtb" +#define AT_OEM_PART_NAME "oem_bootloader" +#define AT_OEM_PART_SIZE 17 +#define AT_OEM_DEV_SIZE 6 + /* common variables of fastboot getvar command */ char *fastboot_common_var[FASTBOOT_COMMON_VAR_NUM] = { "version", @@ -1861,6 +1870,33 @@ bootimg_print_image_hdr(struct andr_img_hdr *hdr) #endif } +#ifdef CONFIG_ANDROID_THINGS_SUPPORT +static int android_things_load_fdt(const char *slot, struct andr_img_hdr *hdrload) { + /* check for kernel.dtb in oem_bootloader */ + char oem_bootloader[AT_OEM_PART_SIZE]; + snprintf(oem_bootloader, AT_OEM_PART_SIZE, AT_OEM_PART_NAME "%s", slot); + struct fastboot_ptentry *pte = fastboot_flash_find_ptn(oem_bootloader); + if (pte == NULL) { + printf("boota: no partition found for '%s'\n", oem_bootloader); + return -1; + } + + char dev_part[AT_OEM_DEV_SIZE]; + snprintf(dev_part, AT_OEM_DEV_SIZE, "%x:%x", fastboot_devinfo.dev_id, + pte->partition_index); + if (fs_set_blk_dev("mmc", dev_part, FS_TYPE_EXT) != 0) + return -1; + + loff_t dtb_size; + if (!fs_read(AT_OEM_DTB, hdrload->second_addr, 0, 0, &dtb_size) && dtb_size) { + hdrload->second_size = dtb_size; + return 0; + } + + return -1; +} +#endif + static struct andr_img_hdr boothdr __aligned(ARCH_DMA_MINALIGN); #if defined(CONFIG_AVB_SUPPORT) && defined(CONFIG_MMC) @@ -1874,6 +1910,7 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { u32 avb_metric; bool check_image_arm64 = false; bool is_recovery_mode = false; + char *slot = NULL; #if defined (CONFIG_ARCH_IMX8) || defined (CONFIG_ARCH_IMX8M) size_t lz4_len = DST_DECOMPRESS_LEN; @@ -1933,6 +1970,7 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { printf("boota: bad boot image magic\n"); goto fail; } + slot = avb_out_data->ab_suffix; if (avb_result == AVB_AB_FLOW_RESULT_OK) printf(" verify OK, boot '%s%s'\n", avb_loadpart->partition_name, avb_out_data->ab_suffix); @@ -2001,7 +2039,6 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { char bootimg[10]; /* we don't have a/b slot for imx6 on normal Android*/ #ifndef CONFIG_ANDROID_AB_SUPPORT - char *slot = ""; if (!is_recovery_mode) { sprintf(bootimg, "boot"); } else { @@ -2009,7 +2046,7 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { } printf("boot '%s' still\n", bootimg); #else - char *slot = select_slot(&fsl_avb_ab_ops); + slot = select_slot(&fsl_avb_ab_ops); if (slot == NULL) { printf("boota: no bootable slot\n"); goto fail; @@ -2090,9 +2127,13 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { + ALIGN(hdr->kernel_size, hdr->page_size), hdr->ramdisk_size); #endif #ifdef CONFIG_OF_LIBFDT + bool fdt_loaded = false; +#ifdef CONFIG_ANDROID_THINGS_SUPPORT + fdt_loaded = !android_things_load_fdt(slot, hdr); +#endif /* CONFIG_ANDROID_THINGS_SUPPORT */ /* load the dtb file */ - if (hdr->second_size && hdr->second_addr) { - memcpy((void *)(ulong)hdr->second_addr, (void *)(ulong)hdr + hdr->page_size + if (!fdt_loaded && hdr->second_size && hdr->second_addr) { + memcpy((void *)(ulong)hdr->second_addr, (void *)(ulong)hdr->kernel_addr + ALIGN(hdr->kernel_size, hdr->page_size) + ALIGN(hdr->ramdisk_size, hdr->page_size), hdr->second_size); } |