diff --git a/drivers/fastboot/fb_fsl/fb_fsl_boot.c b/drivers/fastboot/fb_fsl/fb_fsl_boot.c index c076c24..6bc58f6 100644 --- a/drivers/fastboot/fb_fsl/fb_fsl_boot.c +++ b/drivers/fastboot/fb_fsl/fb_fsl_boot.c @@ -57,6 +57,8 @@ #define ZIMAGE_START_ADDR 10 #define ZIMAGE_END_ADDR 11 +#define FDT_OFFSET_TO_KERNEL 0x3000000 /* device tree blob offset to the kernel image */ + /* Boot metric variables */ boot_metric metrics = { .bll_1 = 0, @@ -737,10 +739,12 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { #ifdef CONFIG_OF_LIBFDT /* load the dtb file */ + u32 fdt_addr = 0; u32 fdt_size = 0; struct dt_table_header *dt_img = NULL; if (is_load_fdt_from_part()) { + fdt_addr = (ulong)((ulong)(hdr->kernel_addr) + FDT_OFFSET_TO_KERNEL); #ifdef CONFIG_ANDROID_THINGS_SUPPORT if (find_partition_data_by_name("oem_bootloader", avb_out_data, &avb_loadpart)) { @@ -785,15 +789,17 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { dt_entry = (struct dt_table_entry *)((ulong)dt_img + be32_to_cpu(dt_img->dt_entries_offset)); fdt_size = be32_to_cpu(dt_entry->dt_size); - memcpy((void *)(ulong)hdr->second_addr, (void *)((ulong)dt_img + + memcpy((void *)fdt_addr, (void *)((ulong)dt_img + be32_to_cpu(dt_entry->dt_offset)), fdt_size); } else { - if (hdr->second_size && hdr->second_addr) { - memcpy((void *)(ulong)hdr->second_addr, + fdt_addr = (ulong)(hdr->second_addr); + fdt_size = (ulong)(hdr->second_size); + if (fdt_size && fdt_addr) { + memcpy((void *)(ulong)fdt_addr, (void *)(ulong)hdr + hdr->page_size + ALIGN(hdr->kernel_size, hdr->page_size) + ALIGN(hdr->ramdisk_size, hdr->page_size), - hdr->second_size); + fdt_size); } } #endif /*CONFIG_OF_LIBFDT*/ @@ -807,20 +813,15 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { printf("kernel @ %08x (%d)\n", hdr->kernel_addr, hdr->kernel_size); printf("ramdisk @ %08x (%d)\n", hdr->ramdisk_addr, hdr->ramdisk_size); #ifdef CONFIG_OF_LIBFDT - if (is_load_fdt_from_part()) { - if (fdt_size) - printf("fdt @ %08x (%d)\n", hdr->second_addr, fdt_size); - } else { - if (hdr->second_size) - printf("fdt @ %08x (%d)\n", hdr->second_addr, hdr->second_size); - } + if (fdt_size) + printf("fdt @ %08x (%d)\n", fdt_addr, fdt_size); #endif /*CONFIG_OF_LIBFDT*/ char boot_addr_start[12]; char ramdisk_addr[25]; - char fdt_addr[12]; + char fdt_addr_start[12]; - char *boot_args[] = { NULL, boot_addr_start, ramdisk_addr, fdt_addr}; + char *boot_args[] = { NULL, boot_addr_start, ramdisk_addr, fdt_addr_start}; if (check_image_arm64) boot_args[0] = "booti"; else @@ -828,7 +829,7 @@ int do_boota(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { sprintf(boot_addr_start, "0x%lx", addr); sprintf(ramdisk_addr, "0x%x:0x%x", hdr->ramdisk_addr, hdr->ramdisk_size); - sprintf(fdt_addr, "0x%x", hdr->second_addr); + sprintf(fdt_addr_start, "0x%x", fdt_addr); /* when CONFIG_SYSTEM_RAMDISK_SUPPORT is enabled and it's for Android Auto, if it's not recovery mode * do not pass ramdisk addr*/