summaryrefslogtreecommitdiff
path: root/boot
diff options
context:
space:
mode:
authorSafae Ouajih <souajih@baylibre.com>2023-02-06 00:50:18 +0100
committerPraneeth Bajjuri <praneeth@ti.com>2023-04-05 11:42:10 -0500
commit9522ed4684e7bdcbf8974ea573df22414a77e1a9 (patch)
tree2c7a5734769e56153e775bfbd8cd3a80c860a42d /boot
parent5456cac6eacdd55c5f7379f406b08d24a7285112 (diff)
android: boot: support bootconfig
commit 57e405e1f4745cdca49a4a6b260afe68592b1d5c upstream. Support Bootconfig feature. - The bootconfig feature replaces the androidboot.* kernel cmdline options. This was adapted from downstream [1] commit : 7af0a0506d4d ("cuttlefish: support bootconfig parameters"). Link:[1] https://android.googlesource.com/platform/external/u-boot/ 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> Signed-off-by: Praneeth Bajjuri <praneeth@ti.com>
Diffstat (limited to 'boot')
-rw-r--r--boot/image-android.c58
1 files changed, 56 insertions, 2 deletions
diff --git a/boot/image-android.c b/boot/image-android.c
index fb29ff403f..88e40bc7ec 100644
--- a/boot/image-android.c
+++ b/boot/image-android.c
@@ -18,6 +18,45 @@
static char andr_tmp_str[ANDR_BOOT_ARGS_SIZE + 1];
+static ulong checksum(const unsigned char *buffer, ulong size)
+{
+ ulong sum = 0;
+
+ for (ulong i = 0; i < size; i++)
+ sum += buffer[i];
+ return sum;
+}
+
+static bool is_trailer_present(ulong bootconfig_end_addr)
+{
+ return !strncmp((char *)(bootconfig_end_addr - BOOTCONFIG_MAGIC_SIZE),
+ BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_SIZE);
+}
+
+static ulong add_trailer(ulong bootconfig_start_addr, ulong bootconfig_size)
+{
+ ulong end;
+ ulong sum;
+
+ if (!bootconfig_start_addr)
+ return -1;
+ if (!bootconfig_size)
+ return 0;
+
+ end = bootconfig_start_addr + bootconfig_size;
+ if (is_trailer_present(end))
+ return 0;
+
+ memcpy((void *)(end), &bootconfig_size, BOOTCONFIG_SIZE_SIZE);
+ sum = checksum((unsigned char *)bootconfig_start_addr, bootconfig_size);
+ memcpy((void *)(end + BOOTCONFIG_SIZE_SIZE), &sum,
+ BOOTCONFIG_CHECKSUM_SIZE);
+ memcpy((void *)(end + BOOTCONFIG_SIZE_SIZE + BOOTCONFIG_CHECKSUM_SIZE),
+ BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_SIZE);
+
+ return BOOTCONFIG_TRAILER_SIZE;
+}
+
static void android_boot_image_v3_v4_parse_hdr(const struct andr_boot_img_hdr_v3 *hdr,
struct andr_image_data *data)
{
@@ -61,6 +100,7 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const struct andr_vnd_boot
data->kernel_addr = hdr->kernel_addr;
data->ramdisk_addr = hdr->ramdisk_addr;
data->dtb_load_addr = hdr->dtb_addr;
+ data->bootconfig_size = hdr->bootconfig_size;
end = (ulong)hdr;
end += hdr->page_size;
if (hdr->vendor_ramdisk_size) {
@@ -75,7 +115,13 @@ static void android_vendor_boot_image_v3_v4_parse_hdr(const struct andr_vnd_boot
end += ALIGN(hdr->dtb_size, hdr->page_size);
end += ALIGN(hdr->vendor_ramdisk_table_size, hdr->page_size);
- end += ALIGN(hdr->bootconfig_size, hdr->page_size);
+ data->bootconfig_addr = end;
+ if (hdr->bootconfig_size) {
+ data->bootconfig_size += add_trailer(data->bootconfig_addr,
+ data->bootconfig_size);
+ data->ramdisk_size += data->bootconfig_size;
+ }
+ end += ALIGN(data->bootconfig_size, hdr->page_size);
data->vendor_boot_img_total_size = end - (ulong)hdr;
}
@@ -352,7 +398,15 @@ int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
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);
+ (void *)img_data.ramdisk_ptr,
+ img_data.boot_ramdisk_size);
+ if (img_data.bootconfig_size) {
+ memcpy((void *)
+ (ramdisk_ptr + img_data.vendor_ramdisk_size +
+ img_data.boot_ramdisk_size),
+ (void *)img_data.bootconfig_addr,
+ img_data.bootconfig_size);
+ }
}
printf("RAM disk load addr 0x%08lx size %u KiB\n",