android: boot: update android_image_get_dtb_img_addr to support v3, v4
authorSafae Ouajih <souajih@baylibre.com>
Sun, 5 Feb 2023 23:50:15 +0000 (00:50 +0100)
committerTom Rini <trini@konsulko.com>
Tue, 4 Apr 2023 18:50:47 +0000 (14:50 -0400)
Add support for boot image version 3 and 4 in
android_image_get_dtb_img_addr().
Since the dtb is now included in vendor_boot image
instead of boot image, extract the dtb address from
vendor_boot image when a v3 or v4 is used.

Signed-off-by: Safae Ouajih <souajih@baylibre.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
Tested-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
boot/image-android.c

index a944f0a..6be439e 100644 (file)
@@ -457,6 +457,7 @@ exit:
 static bool android_image_get_dtb_img_addr(ulong hdr_addr, ulong vhdr_addr, ulong *addr)
 {
        const struct andr_boot_img_hdr_v0 *hdr;
+       const struct andr_vnd_boot_img_hdr *v_hdr;
        ulong dtb_img_addr;
        bool ret = true;
 
@@ -473,22 +474,40 @@ static bool android_image_get_dtb_img_addr(ulong hdr_addr, ulong vhdr_addr, ulon
                goto exit;
        }
 
-       if (hdr->dtb_size == 0) {
-               printf("Error: dtb_size is 0\n");
-               ret = false;
-               goto exit;
+       if (hdr->header_version == 2) {
+               if (!hdr->dtb_size) {
+                       printf("Error: dtb_size is 0\n");
+                       ret = false;
+                       goto exit;
+               }
+               /* Calculate the address of DTB area in boot image */
+               dtb_img_addr = hdr_addr;
+               dtb_img_addr += hdr->page_size;
+               dtb_img_addr += ALIGN(hdr->kernel_size, hdr->page_size);
+               dtb_img_addr += ALIGN(hdr->ramdisk_size, hdr->page_size);
+               dtb_img_addr += ALIGN(hdr->second_size, hdr->page_size);
+               dtb_img_addr += ALIGN(hdr->recovery_dtbo_size, hdr->page_size);
+
+               *addr = dtb_img_addr;
        }
 
-       /* Calculate the address of DTB area in boot image */
-       dtb_img_addr = hdr_addr;
-       dtb_img_addr += hdr->page_size;
-       dtb_img_addr += ALIGN(hdr->kernel_size, hdr->page_size);
-       dtb_img_addr += ALIGN(hdr->ramdisk_size, hdr->page_size);
-       dtb_img_addr += ALIGN(hdr->second_size, hdr->page_size);
-       dtb_img_addr += ALIGN(hdr->recovery_dtbo_size, hdr->page_size);
-
-       *addr = dtb_img_addr;
-
+       if (hdr->header_version > 2) {
+               v_hdr = map_sysmem(vhdr_addr, sizeof(*v_hdr));
+               if (!v_hdr->dtb_size) {
+                       printf("Error: dtb_size is 0\n");
+                       ret = false;
+                       unmap_sysmem(v_hdr);
+                       goto exit;
+               }
+               /* Calculate the address of DTB area in boot image */
+               dtb_img_addr = vhdr_addr;
+               dtb_img_addr += v_hdr->page_size;
+               if (v_hdr->vendor_ramdisk_size)
+                       dtb_img_addr += ALIGN(v_hdr->vendor_ramdisk_size, v_hdr->page_size);
+               *addr = dtb_img_addr;
+               unmap_sysmem(v_hdr);
+               goto exit;
+       }
 exit:
        unmap_sysmem(hdr);
        return ret;