]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
abootimg: Add init_boot image support
authorRoman Stratiienko <r.stratiienko@gmail.com>
Thu, 23 May 2024 07:06:07 +0000 (07:06 +0000)
committerTom Rini <trini@konsulko.com>
Fri, 7 Jun 2024 22:20:33 +0000 (16:20 -0600)
Quote from [1]:

"For devices launching with Android 13, the generic ramdisk is removed
from the boot image and placed in a separate init_boot image.
This change leaves the boot image with only the GKI kernel."

While at it, update wrong error handling message when vendor_boot
cannot be loaded.

[1]: https://source.android.com/docs/core/architecture/partitions/generic-boot

Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
boot/image-board.c
cmd/abootimg.c
include/image.h

index b7884b8c5dc73e0d5d5be50fcc6ebd24d62041fe..f212401304648ad37a8744a4caf06b50271f2ea6 100644 (file)
@@ -406,13 +406,20 @@ static int select_ramdisk(struct bootm_headers *images, const char *select, u8 a
                if (IS_ENABLED(CONFIG_ANDROID_BOOT_IMAGE)) {
                        int ret;
                        if (IS_ENABLED(CONFIG_CMD_ABOOTIMG)) {
-                               void *boot_img = map_sysmem(get_abootimg_addr(), 0);
+                               ulong boot_img = get_abootimg_addr();
+                               ulong init_boot_img = get_ainit_bootimg_addr();
                                void *vendor_boot_img = map_sysmem(get_avendor_bootimg_addr(), 0);
+                               void *ramdisk_img;
 
-                               ret = android_image_get_ramdisk(boot_img, vendor_boot_img,
+                               if (init_boot_img == -1)
+                                       ramdisk_img = map_sysmem(boot_img, 0);
+                               else
+                                       ramdisk_img = map_sysmem(init_boot_img, 0);
+
+                               ret = android_image_get_ramdisk(ramdisk_img, vendor_boot_img,
                                                                rd_datap, rd_lenp);
                                unmap_sysmem(vendor_boot_img);
-                               unmap_sysmem(boot_img);
+                               unmap_sysmem(ramdisk_img);
                        } else {
                                void *ptr = map_sysmem(images->os.start, 0);
 
index 88c77d999290d12fa46b36383a35519130a19001..327712a536c0ff4d46f3727a6c6a243b38e9516b 100644 (file)
@@ -14,6 +14,7 @@
 
 /* Please use abootimg_addr() macro to obtain the boot image address */
 static ulong _abootimg_addr = -1;
+static ulong _ainit_bootimg_addr = -1;
 static ulong _avendor_bootimg_addr = -1;
 
 ulong get_abootimg_addr(void)
@@ -21,6 +22,11 @@ ulong get_abootimg_addr(void)
        return (_abootimg_addr == -1 ? image_load_addr : _abootimg_addr);
 }
 
+ulong get_ainit_bootimg_addr(void)
+{
+       return _ainit_bootimg_addr;
+}
+
 ulong get_avendor_bootimg_addr(void)
 {
        return _avendor_bootimg_addr;
@@ -179,7 +185,7 @@ static int do_abootimg_addr(struct cmd_tbl *cmdtp, int flag, int argc,
        char *endp;
        ulong img_addr;
 
-       if (argc < 2 || argc > 3)
+       if (argc < 2 || argc > 4)
                return CMD_RET_USAGE;
 
        img_addr = hextoul(argv[1], &endp);
@@ -190,16 +196,26 @@ static int do_abootimg_addr(struct cmd_tbl *cmdtp, int flag, int argc,
 
        _abootimg_addr = img_addr;
 
-       if (argc == 3) {
+       if (argc > 2) {
                img_addr = simple_strtoul(argv[2], &endp, 16);
                if (*endp != '\0') {
-                       printf("Error: Wrong vendor image address\n");
+                       printf("Error: Wrong vendor_boot image address\n");
                        return CMD_RET_FAILURE;
                }
 
                _avendor_bootimg_addr = img_addr;
        }
 
+       if (argc == 4) {
+               img_addr = simple_strtoul(argv[3], &endp, 16);
+               if (*endp != '\0') {
+                       printf("Error: Wrong init_boot image address\n");
+                       return CMD_RET_FAILURE;
+               }
+
+               _ainit_bootimg_addr = img_addr;
+       }
+
        return CMD_RET_SUCCESS;
 }
 
@@ -243,7 +259,7 @@ static int do_abootimg_dump(struct cmd_tbl *cmdtp, int flag, int argc,
 }
 
 static struct cmd_tbl cmd_abootimg_sub[] = {
-       U_BOOT_CMD_MKENT(addr, 3, 1, do_abootimg_addr, "", ""),
+       U_BOOT_CMD_MKENT(addr, 4, 1, do_abootimg_addr, "", ""),
        U_BOOT_CMD_MKENT(dump, 2, 1, do_abootimg_dump, "", ""),
        U_BOOT_CMD_MKENT(get, 5, 1, do_abootimg_get, "", ""),
 };
@@ -271,7 +287,7 @@ static int do_abootimg(struct cmd_tbl *cmdtp, int flag, int argc,
 U_BOOT_CMD(
        abootimg, CONFIG_SYS_MAXARGS, 0, do_abootimg,
        "manipulate Android Boot Image",
-       "addr <boot_img_addr> [<vendor_boot_img_addr>]>\n"
+       "addr <boot_img_addr> [<vendor_boot_img_addr> [<init_boot_img_addr>]]\n"
        "    - set the address in RAM where boot image is located\n"
        "      ($loadaddr is used by default)\n"
        "abootimg dump dtb\n"
index acffd17e0dfd03ee37feddbe69357e24d06a0b19..c5b288f62b443576b4d291b4856697216cf8068e 100644 (file)
@@ -1970,6 +1970,13 @@ bool is_android_vendor_boot_image_header(const void *vendor_boot_img);
  */
 ulong get_abootimg_addr(void);
 
+/**
+ * get_ainit_bootimg_addr() - Get Android init boot image address
+ *
+ * Return: Android init boot image address
+ */
+ulong get_ainit_bootimg_addr(void);
+
 /**
  * get_avendor_bootimg_addr() - Get Android vendor boot image address
  *