summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorBraden Kell <bradenkell@google.com>2018-01-31 09:42:56 -0800
committerJi Luo <ji.luo@nxp.com>2018-08-20 21:25:41 +0800
commit7db36bcbef8d8ec0866b116eacdb8eea0ce259bb (patch)
tree02665a610668b6cfe175e142da54fcee4a729416 /drivers
parent8ef2dfd7f199d3285d4f861d812ca59bf1aa0170 (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.c49
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);
}