mirror of
https://xff.cz/git/u-boot/
synced 2026-01-07 00:59:18 +01:00
android: boot: add boot image header v3 and v4 structures
Add support for v3/v4 boot image format by adding the following structures: - andr_boot_img_hdr_v3 : describes boot image header - andr_vnd_boot_img_hdr : describes vendor boot image header These definitions have been copied over from the AOSP documentation at [1] and [2] Boot arg sizes are taken from [3]: commit: 35fb6262bc3f (ANDROID: Support for vendor boot) This also adds documentation for boot image header v3/v4 structure that was imported from [4], file: include/bootimg/bootimg.h commit: 8d0922bfb932 (Adding GKI signature in boot.img v4) Link:[1] https://source.android.com/docs/core/architecture/bootloader/boot-image-header Link:[2] https://source.android.com/docs/core/architecture/bootloader/partitions/vendor-boot-partitions#vendor-boot-header Link:[3] https://android.googlesource.com/platform/external/u-boot Link:[4] https://android.googlesource.com/platform/system/tools/mkbootimg 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>
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
* This is from the Android Project,
|
||||
* Repository: https://android.googlesource.com/platform/system/tools/mkbootimg
|
||||
* File: include/bootimg/bootimg.h
|
||||
* Commit: e55998a0f2b61b685d5eb4a486ca3a0c680b1a2f
|
||||
* Commit: cce5b1923e3cd2fcb765b512610bdc5c42bc501d
|
||||
*
|
||||
* Copyright (C) 2007 The Android Open Source Project
|
||||
*/
|
||||
@@ -14,11 +14,58 @@
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define ANDR_GKI_PAGE_SIZE 4096
|
||||
#define ANDR_BOOT_MAGIC "ANDROID!"
|
||||
#define ANDR_BOOT_MAGIC_SIZE 8
|
||||
#define ANDR_BOOT_NAME_SIZE 16
|
||||
#define ANDR_BOOT_ARGS_SIZE 512
|
||||
#define ANDR_BOOT_EXTRA_ARGS_SIZE 1024
|
||||
#define VENDOR_BOOT_MAGIC "VNDRBOOT"
|
||||
#define ANDR_VENDOR_BOOT_MAGIC_SIZE 8
|
||||
#define ANDR_VENDOR_BOOT_ARGS_SIZE 2048
|
||||
#define ANDR_VENDOR_BOOT_NAME_SIZE 16
|
||||
|
||||
struct andr_boot_img_hdr_v3 {
|
||||
u8 magic[ANDR_BOOT_MAGIC_SIZE];
|
||||
|
||||
u32 kernel_size; /* size in bytes */
|
||||
u32 ramdisk_size; /* size in bytes */
|
||||
|
||||
u32 os_version;
|
||||
|
||||
u32 header_size; /* size of boot image header in bytes */
|
||||
u32 reserved[4];
|
||||
u32 header_version; /* offset remains constant for version check */
|
||||
|
||||
u8 cmdline[ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE];
|
||||
/* for boot image header v4 only */
|
||||
u32 signature_size; /* size in bytes */
|
||||
};
|
||||
|
||||
struct andr_vnd_boot_img_hdr {
|
||||
u8 magic[ANDR_VENDOR_BOOT_MAGIC_SIZE];
|
||||
u32 header_version;
|
||||
u32 page_size; /* flash page size we assume */
|
||||
|
||||
u32 kernel_addr; /* physical load addr */
|
||||
u32 ramdisk_addr; /* physical load addr */
|
||||
|
||||
u32 vendor_ramdisk_size; /* size in bytes */
|
||||
|
||||
u8 cmdline[ANDR_VENDOR_BOOT_ARGS_SIZE];
|
||||
|
||||
u32 tags_addr; /* physical addr for kernel tags */
|
||||
|
||||
u8 name[ANDR_VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
|
||||
u32 header_size; /* size of vendor boot image header in bytes */
|
||||
u32 dtb_size; /* size of dtb image */
|
||||
u64 dtb_addr; /* physical load address */
|
||||
/* for boot image header v4 only */
|
||||
u32 vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk table */
|
||||
u32 vendor_ramdisk_table_entry_num; /* number of entries in the vendor ramdisk table */
|
||||
u32 vendor_ramdisk_table_entry_size; /* size in bytes for a vendor ramdisk table entry */
|
||||
u32 bootconfig_size; /* size in bytes for the bootconfig section */
|
||||
};
|
||||
|
||||
/* The bootloader expects the structure of andr_boot_img_hdr_v0 with header
|
||||
* version 0 to be as follows: */
|
||||
@@ -136,4 +183,138 @@ struct andr_boot_img_hdr_v0 {
|
||||
* else: jump to kernel_addr
|
||||
*/
|
||||
|
||||
/* When the boot image header has a version of 3, the structure of the boot
|
||||
* image is as follows:
|
||||
*
|
||||
* +---------------------+
|
||||
* | boot header | 4096 bytes
|
||||
* +---------------------+
|
||||
* | kernel | m pages
|
||||
* +---------------------+
|
||||
* | ramdisk | n pages
|
||||
* +---------------------+
|
||||
*
|
||||
* m = (kernel_size + 4096 - 1) / 4096
|
||||
* n = (ramdisk_size + 4096 - 1) / 4096
|
||||
*
|
||||
* Note that in version 3 of the boot image header, page size is fixed at 4096 bytes.
|
||||
*
|
||||
* The structure of the vendor boot image (introduced with version 3 and
|
||||
* required to be present when a v3 boot image is used) is as follows:
|
||||
*
|
||||
* +---------------------+
|
||||
* | vendor boot header | o pages
|
||||
* +---------------------+
|
||||
* | vendor ramdisk | p pages
|
||||
* +---------------------+
|
||||
* | dtb | q pages
|
||||
* +---------------------+
|
||||
* o = (2112 + page_size - 1) / page_size
|
||||
* p = (vendor_ramdisk_size + page_size - 1) / page_size
|
||||
* q = (dtb_size + page_size - 1) / page_size
|
||||
*
|
||||
* 0. all entities in the boot image are 4096-byte aligned in flash, all
|
||||
* entities in the vendor boot image are page_size (determined by the vendor
|
||||
* and specified in the vendor boot image header) aligned in flash
|
||||
* 1. kernel, ramdisk, vendor ramdisk, and DTB are required (size != 0)
|
||||
* 2. load the kernel and DTB at the specified physical address (kernel_addr,
|
||||
* dtb_addr)
|
||||
* 3. load the vendor ramdisk at ramdisk_addr
|
||||
* 4. load the generic ramdisk immediately following the vendor ramdisk in
|
||||
* memory
|
||||
* 5. set up registers for kernel entry as required by your architecture
|
||||
* 6. if the platform has a second stage bootloader jump to it (must be
|
||||
* contained outside boot and vendor boot partitions), otherwise
|
||||
* jump to kernel_addr
|
||||
*/
|
||||
|
||||
/* When the boot image header has a version of 4, the structure of the boot
|
||||
* image is as follows:
|
||||
*
|
||||
* +---------------------+
|
||||
* | boot header | 4096 bytes
|
||||
* +---------------------+
|
||||
* | kernel | m pages
|
||||
* +---------------------+
|
||||
* | ramdisk | n pages
|
||||
* +---------------------+
|
||||
* | boot signature | g pages
|
||||
* +---------------------+
|
||||
*
|
||||
* m = (kernel_size + 4096 - 1) / 4096
|
||||
* n = (ramdisk_size + 4096 - 1) / 4096
|
||||
* g = (signature_size + 4096 - 1) / 4096
|
||||
*
|
||||
* Note that in version 4 of the boot image header, page size is fixed at 4096
|
||||
* bytes.
|
||||
*
|
||||
* The structure of the vendor boot image version 4, which is required to be
|
||||
* present when a version 4 boot image is used, is as follows:
|
||||
*
|
||||
* +------------------------+
|
||||
* | vendor boot header | o pages
|
||||
* +------------------------+
|
||||
* | vendor ramdisk section | p pages
|
||||
* +------------------------+
|
||||
* | dtb | q pages
|
||||
* +------------------------+
|
||||
* | vendor ramdisk table | r pages
|
||||
* +------------------------+
|
||||
* | bootconfig | s pages
|
||||
* +------------------------+
|
||||
*
|
||||
* o = (2128 + page_size - 1) / page_size
|
||||
* p = (vendor_ramdisk_size + page_size - 1) / page_size
|
||||
* q = (dtb_size + page_size - 1) / page_size
|
||||
* r = (vendor_ramdisk_table_size + page_size - 1) / page_size
|
||||
* s = (vendor_bootconfig_size + page_size - 1) / page_size
|
||||
*
|
||||
* Note that in version 4 of the vendor boot image, multiple vendor ramdisks can
|
||||
* be included in the vendor boot image. The bootloader can select a subset of
|
||||
* ramdisks to load at runtime. To help the bootloader select the ramdisks, each
|
||||
* ramdisk is tagged with a type tag and a set of hardware identifiers
|
||||
* describing the board, soc or platform that this ramdisk is intended for.
|
||||
*
|
||||
* The vendor ramdisk section is consist of multiple ramdisk images concatenated
|
||||
* one after another, and vendor_ramdisk_size is the size of the section, which
|
||||
* is the total size of all the ramdisks included in the vendor boot image.
|
||||
*
|
||||
* The vendor ramdisk table holds the size, offset, type, name and hardware
|
||||
* identifiers of each ramdisk. The type field denotes the type of its content.
|
||||
* The vendor ramdisk names are unique. The hardware identifiers are specified
|
||||
* in the board_id field in each table entry. The board_id field is consist of a
|
||||
* vector of unsigned integer words, and the encoding scheme is defined by the
|
||||
* hardware vendor.
|
||||
*
|
||||
* For the different type of ramdisks, there are:
|
||||
* - VENDOR_RAMDISK_TYPE_NONE indicates the value is unspecified.
|
||||
* - VENDOR_RAMDISK_TYPE_PLATFORM ramdisks contain platform specific bits, so
|
||||
* the bootloader should always load these into memory.
|
||||
* - VENDOR_RAMDISK_TYPE_RECOVERY ramdisks contain recovery resources, so
|
||||
* the bootloader should load these when booting into recovery.
|
||||
* - VENDOR_RAMDISK_TYPE_DLKM ramdisks contain dynamic loadable kernel
|
||||
* modules.
|
||||
*
|
||||
* Version 4 of the vendor boot image also adds a bootconfig section to the end
|
||||
* of the image. This section contains Boot Configuration parameters known at
|
||||
* build time. The bootloader is responsible for placing this section directly
|
||||
* after the generic ramdisk, followed by the bootconfig trailer, before
|
||||
* entering the kernel.
|
||||
*
|
||||
* 0. all entities in the boot image are 4096-byte aligned in flash, all
|
||||
* entities in the vendor boot image are page_size (determined by the vendor
|
||||
* and specified in the vendor boot image header) aligned in flash
|
||||
* 1. kernel, ramdisk, and DTB are required (size != 0)
|
||||
* 2. load the kernel and DTB at the specified physical address (kernel_addr,
|
||||
* dtb_addr)
|
||||
* 3. load the vendor ramdisks at ramdisk_addr
|
||||
* 4. load the generic ramdisk immediately following the vendor ramdisk in
|
||||
* memory
|
||||
* 5. load the bootconfig immediately following the generic ramdisk. Add
|
||||
* additional bootconfig parameters followed by the bootconfig trailer.
|
||||
* 6. set up registers for kernel entry as required by your architecture
|
||||
* 7. if the platform has a second stage bootloader jump to it (must be
|
||||
* contained outside boot and vendor boot partitions), otherwise
|
||||
* jump to kernel_addr
|
||||
*/
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user