[PATCH v3 2/9] image: android: Add routine to get dtbo params

Simon Glass sjg at chromium.org
Wed Jan 8 18:39:51 CET 2020


Hi Sam,

On Tue, 24 Dec 2019 at 12:55, Sam Protsenko <semen.protsenko at linaro.org> wrote:
>
> Android Boot Image v1 adds "Recovery DTB" field in image header and
> associate payload in boot image itself [1]. Payload should be in
> Android DTB/DTBO format [2]. That "Recovery DTB" area should be only
> populated for non-A/B devices, and only in recovery image.
>
> Add function to get an address and size of that payload. That function
> can be further used e.g. in 'abootimg' command to provide the user a way
> to get the address of recovery dtbo from U-Boot shell, which can be
> further parsed using 'adtimg' command.
>
> [1] https://source.android.com/devices/bootloader/boot-image-header
> [2] https://source.android.com/devices/architecture/dto/partitions
>
> Signed-off-by: Sam Protsenko <semen.protsenko at linaro.org>
> ---
>  common/image-android.c | 61 ++++++++++++++++++++++++++++++++++++++++++
>  include/image.h        |  1 +
>  2 files changed, 62 insertions(+)
>
> diff --git a/common/image-android.c b/common/image-android.c
> index 1ccad6c556..5d6669ceab 100644
> --- a/common/image-android.c
> +++ b/common/image-android.c
> @@ -197,6 +197,67 @@ int android_image_get_second(const struct andr_img_hdr *hdr,
>         return 0;
>  }
>
> +/**
> + * android_image_get_dtbo() - Get address and size of recovery DTBO image.
> + * @hdr_addr: Boot image header address
> + * @addr: If not NULL, will contain address of recovery DTBO image
> + * @size: If not NULL, will contain size of recovery DTBO image
> + *
> + * Get the address and size of DTBO image in "Recovery DTBO" area of Android
> + * Boot Image in RAM. The format of this image is Android DTBO (see
> + * corresponding "DTB/DTBO Partitions" AOSP documentation for details). Once
> + * the address is obtained from this function, one can use 'adtimg' U-Boot
> + * command or android_dt_*() functions to extract desired DTBO blob.
> + *
> + * This DTBO (included in boot image) is only needed for non-A/B devices, and it
> + * only can be found in recovery image. On A/B devices we can always rely on
> + * "dtbo" partition. See "Including DTBO in Recovery for Non-A/B Devices" in
> + * AOSP documentation for details.
> + *
> + * Return: true on success or false on error.

Same comments as previous patch on error codes, etc.

Also can we have a test for all this code?

> + */
> +bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, u32 *size)
> +{
> +       const struct andr_img_hdr *hdr;
> +       ulong dtbo_img_addr;
> +       bool res = true;
> +
> +       hdr = map_sysmem(hdr_addr, sizeof(*hdr));
> +       if (android_image_check_header(hdr)) {
> +               printf("Error: Boot Image header is incorrect\n");
> +               res = false;
> +               goto exit;
> +       }
> +
> +       if (hdr->header_version < 1) {
> +               printf("Error: header_version must be >= 1 to get dtbo\n");
> +               res = false;
> +               goto exit;
> +       }
> +
> +       if (hdr->recovery_dtbo_size == 0) {
> +               printf("Error: recovery_dtbo_size is 0\n");
> +               res = false;
> +               goto exit;
> +       }
> +
> +       /* Calculate the address of DTB area in boot image */
> +       dtbo_img_addr = hdr_addr;
> +       dtbo_img_addr += hdr->page_size;
> +       dtbo_img_addr += ALIGN(hdr->kernel_size, hdr->page_size);
> +       dtbo_img_addr += ALIGN(hdr->ramdisk_size, hdr->page_size);
> +       dtbo_img_addr += ALIGN(hdr->second_size, hdr->page_size);
> +
> +       if (addr)
> +               *addr = dtbo_img_addr;
> +       if (size)
> +               *size = hdr->recovery_dtbo_size;
> +
> +exit:
> +       unmap_sysmem(hdr);
> +       return res;
> +}
> +
>  /**
>   * android_image_get_dtb_img_addr() - Get the address of DTB area in boot image.
>   * @hdr_addr: Boot image header address
> diff --git a/include/image.h b/include/image.h
> index 8e81166be4..b8d821605b 100644
> --- a/include/image.h
> +++ b/include/image.h
> @@ -1333,6 +1333,7 @@ int android_image_get_ramdisk(const struct andr_img_hdr *hdr,
>                               ulong *rd_data, ulong *rd_len);
>  int android_image_get_second(const struct andr_img_hdr *hdr,
>                               ulong *second_data, ulong *second_len);
> +bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, u32 *size);

function comment again

>  bool android_image_get_dtb_by_index(ulong hdr_addr, u32 index, ulong *addr,
>                                     u32 *size);
>  ulong android_image_get_end(const struct andr_img_hdr *hdr);
> --
> 2.24.0
>

Regards,
SImon


More information about the U-Boot mailing list