summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorShawn Guo <shawn.guo@linaro.org>2019-01-15 22:26:37 +0800
committerTom Rini <trini@konsulko.com>2019-02-08 19:18:23 -0500
commit6a7b406aa8b98155597c408da0764fca85dec377 (patch)
treeee553c0457d759430b5905123ff364a6089887d6 /common
parent97276a91db8e98f081a40ddf9dc8f81d4032a756 (diff)
downloadu-boot-6a7b406aa8b98155597c408da0764fca85dec377.tar.gz
u-boot-6a7b406aa8b98155597c408da0764fca85dec377.tar.bz2
u-boot-6a7b406aa8b98155597c408da0764fca85dec377.zip
fdt: support booting with dtb in Android image
Some platforms choose to store device tree blob in Android image second area. Let's try to look for dtb from there when booting an Android image, and use it for booting if found. Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
Diffstat (limited to 'common')
-rw-r--r--common/image-fdt.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/common/image-fdt.c b/common/image-fdt.c
index 5988808f18..94089b2215 100644
--- a/common/image-fdt.c
+++ b/common/image-fdt.c
@@ -268,6 +268,7 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
ulong load, load_end;
ulong image_start, image_data, image_end;
#endif
+ ulong img_addr;
ulong fdt_addr;
char *fdt_blob = NULL;
void *buf;
@@ -283,6 +284,9 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
*of_flat_tree = NULL;
*of_size = 0;
+ img_addr = simple_strtoul(argv[0], NULL, 16);
+ buf = map_sysmem(img_addr, 0);
+
if (argc > 2)
select = argv[2];
if (select || genimg_has_config(images)) {
@@ -453,6 +457,23 @@ int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
debug("## No Flattened Device Tree\n");
goto no_fdt;
}
+#ifdef CONFIG_ANDROID_BOOT_IMAGE
+ } else if (genimg_get_format(buf) == IMAGE_FORMAT_ANDROID) {
+ struct andr_img_hdr *hdr = buf;
+ ulong fdt_data, fdt_len;
+
+ if (android_image_get_second(hdr, &fdt_data, &fdt_len) != 0)
+ goto no_fdt;
+
+ fdt_blob = (char *)fdt_data;
+ if (fdt_check_header(fdt_blob) != 0)
+ goto no_fdt;
+
+ if (fdt_totalsize(fdt_blob) != fdt_len)
+ goto error;
+
+ debug("## Using FDT found in Android image second area\n");
+#endif
} else {
debug("## No Flattened Device Tree\n");
goto no_fdt;