fdt: support booting with dtb in Android image
authorShawn Guo <shawn.guo@linaro.org>
Tue, 15 Jan 2019 14:26:37 +0000 (22:26 +0800)
committerTom Rini <trini@konsulko.com>
Sat, 9 Feb 2019 00:18:23 +0000 (19:18 -0500)
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>
common/image-fdt.c

index 5988808f1872c6e0c84520f56e55e29857e0ea26..94089b2215ca4b37be1a16b27417da953d804c4b 100644 (file)
@@ -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;