]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
android: boot: ramdisk: support vendor ramdisk
authorSafae Ouajih <souajih@baylibre.com>
Sun, 5 Feb 2023 23:50:13 +0000 (00:50 +0100)
committerTom Rini <trini@konsulko.com>
Tue, 4 Apr 2023 18:50:47 +0000 (14:50 -0400)
Version 3 and 4 of boot image header introduced
vendor boot ramdisk: Please check include/android_image.h
for details.

The ramdisk is now split into a generic ramdisk in boot image
and a vendor ramdisk in vendor boot image.

Support the new vendor ramdisk.

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
include/image.h

index 712d437766b35e2e5a4134a8b93f12a61a1896c6..35243fd5b166170306e63ed97e9524542754294b 100644 (file)
@@ -25,6 +25,7 @@ static void android_boot_image_v3_v4_parse_hdr(const struct andr_boot_img_hdr_v3
 
        data->kcmdline = hdr->cmdline;
        data->header_version = hdr->header_version;
+       data->ramdisk_ptr = env_get_ulong("ramdisk_addr_r", 16, 0);
 
        /*
         * The header takes a full page, the remaining components are aligned
@@ -322,10 +323,11 @@ ulong android_image_get_kcomp(const struct andr_boot_img_hdr_v0 *hdr,
                return image_decomp_type(p, sizeof(u32));
 }
 
-int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0 *hdr,
-                             const void *vendor_boot_img, ulong *rd_data, ulong *rd_len)
+int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
+                             ulong *rd_data, ulong *rd_len)
 {
        struct andr_image_data img_data = {0};
+       ulong ramdisk_ptr;
 
        if (!android_image_get_data(hdr, vendor_boot_img, &img_data))
                return -EINVAL;
@@ -334,6 +336,13 @@ int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0 *hdr,
                *rd_data = *rd_len = 0;
                return -1;
        }
+       if (img_data.header_version > 2) {
+               ramdisk_ptr = img_data.ramdisk_ptr;
+               memcpy((void *)(ramdisk_ptr), (void *)img_data.vendor_ramdisk_ptr,
+                      img_data.vendor_ramdisk_size);
+               memcpy((void *)(ramdisk_ptr + img_data.vendor_ramdisk_size),
+                      (void *)img_data.ramdisk_ptr, img_data.boot_ramdisk_size);
+       }
 
        printf("RAM disk load addr 0x%08lx size %u KiB\n",
               img_data.ramdisk_ptr, DIV_ROUND_UP(img_data.ramdisk_size, 1024));
index c2e751c1364cd7c2d0d8fdeb93a957f9eed45e40..c4d9b1c5754e8de9130228dbff11b28d76a8320f 100644 (file)
@@ -1782,8 +1782,8 @@ int android_image_get_kernel(const struct andr_boot_img_hdr_v0 *hdr,
  * @rd_len:    Pointer to a ulong variable, will hold ramdisk length
  * Return: 0 if succeeded, -1 if ramdisk size is 0
  */
-int android_image_get_ramdisk(const struct andr_boot_img_hdr_v0 *hdr,
-                             const void *vendor_boot_img, ulong *rd_data, ulong *rd_len);
+int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
+                             ulong *rd_data, ulong *rd_len);
 
 /**
  * android_image_get_second() - Extracts the secondary bootloader address