143d520f3SAlex Deymo /* SPDX-License-Identifier: BSD-3-Clause */ 29ace3fc8SSebastian Siewior /* 39ace3fc8SSebastian Siewior * This is from the Android Project, 443d520f3SAlex Deymo * Repository: https://android.googlesource.com/platform/system/tools/mkbootimg 543d520f3SAlex Deymo * File: include/bootimg/bootimg.h 643d520f3SAlex Deymo * Commit: e55998a0f2b61b685d5eb4a486ca3a0c680b1a2f 79ace3fc8SSebastian Siewior * 843d520f3SAlex Deymo * Copyright (C) 2007 The Android Open Source Project 99ace3fc8SSebastian Siewior */ 109ace3fc8SSebastian Siewior 119ace3fc8SSebastian Siewior #ifndef _ANDROID_IMAGE_H_ 129ace3fc8SSebastian Siewior #define _ANDROID_IMAGE_H_ 139ace3fc8SSebastian Siewior 14cf87ffd3SJason Zhu #define ANDROID_PARTITION_BOOT "boot" 15cf87ffd3SJason Zhu #define ANDROID_PARTITION_VENDOR_BOOT "vendor_boot" 1628317110SJoseph Chen #define ANDROID_PARTITION_INIT_BOOT "init_boot" 17cf87ffd3SJason Zhu #define ANDROID_PARTITION_MISC "misc" 18cf87ffd3SJason Zhu #define ANDROID_PARTITION_OEM "oem" 1936e836f2SJoseph Chen #define ANDROID_PARTITION_RESOURCE "resource" 20cf87ffd3SJason Zhu #define ANDROID_PARTITION_RECOVERY "recovery" 21cf87ffd3SJason Zhu #define ANDROID_PARTITION_SYSTEM "system" 22cf87ffd3SJason Zhu #define ANDROID_PARTITION_VBMETA "vbmeta" 23cf87ffd3SJason Zhu #define ANDROID_PARTITION_SUPER "super" 24cf87ffd3SJason Zhu 25cf87ffd3SJason Zhu #define ANDROID_ARG_SLOT_SUFFIX "androidboot.slot_suffix=" 26cf87ffd3SJason Zhu #define ANDROID_ARG_ROOT "root=" 27cf87ffd3SJason Zhu #define ANDROID_ARG_SERIALNO "androidboot.serialno=" 28cf87ffd3SJason Zhu #define ANDROID_VERIFY_STATE "androidboot.verifiedbootstate=" 29cf87ffd3SJason Zhu #ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE 30cf87ffd3SJason Zhu #define ANDROID_ARG_FDT_FILENAME "rk-kernel.dtb" 31cf87ffd3SJason Zhu #else 32cf87ffd3SJason Zhu #define ANDROID_ARG_FDT_FILENAME "kernel.dtb" 33cf87ffd3SJason Zhu #endif 34*9e98cd54SJoseph Chen #define ANDROID_IMAGE_DEFAULT_KERNEL_ADDR 0x10008000 35*9e98cd54SJoseph Chen 36cf87ffd3SJason Zhu #define OEM_UNLOCK_ARG_SIZE 30 37cf87ffd3SJason Zhu #define UUID_SIZE 37 38cf87ffd3SJason Zhu 399ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC "ANDROID!" 40745aeb1aSJoseph Chen #define VENDOR_BOOT_MAGIC "VNDRBOOT" 419ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC_SIZE 8 42745aeb1aSJoseph Chen #define VENDOR_BOOT_MAGIC_SIZE 8 439ace3fc8SSebastian Siewior #define ANDR_BOOT_NAME_SIZE 16 44745aeb1aSJoseph Chen #define VENDOR_BOOT_NAME_SIZE 16 459ace3fc8SSebastian Siewior #define ANDR_BOOT_ARGS_SIZE 512 46210a7176SAlex Deymo #define ANDR_BOOT_EXTRA_ARGS_SIZE 1024 47745aeb1aSJoseph Chen #define VENDOR_BOOT_ARGS_SIZE 2048 48745aeb1aSJoseph Chen #define ANDR_BOOT_IMG_PAGE_SIZE 4096 49745aeb1aSJoseph Chen #define ANDR_BOOT_IMG_HDR_SIZE (ANDR_BOOT_IMG_PAGE_SIZE) 50745aeb1aSJoseph Chen #define TOTAL_BOOT_ARGS_SIZE (ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE + \ 51745aeb1aSJoseph Chen VENDOR_BOOT_ARGS_SIZE + 1) 5239bac655SJoseph Chen #define VENDOR_BOOT_HDRv3_SIZE 2112 5339bac655SJoseph Chen #define VENDOR_BOOT_HDRv4_SIZE 2124 5439bac655SJoseph Chen 5539bac655SJoseph Chen #define VENDOR_RAMDISK_TYPE_NONE 0 5639bac655SJoseph Chen #define VENDOR_RAMDISK_TYPE_PLATFORM 1 5739bac655SJoseph Chen #define VENDOR_RAMDISK_TYPE_RECOVERY 2 5839bac655SJoseph Chen #define VENDOR_RAMDISK_TYPE_DLKM 3 5939bac655SJoseph Chen #define VENDOR_RAMDISK_NAME_SIZE 32 6039bac655SJoseph Chen #define VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE 16 6139bac655SJoseph Chen 6239bac655SJoseph Chen /* defined by rockchip but not google, it's adjustable */ 6339bac655SJoseph Chen #define ANDROID_ADDITION_BOOTCONFIG_PARAMS_MAX_SIZE SZ_8K 649ace3fc8SSebastian Siewior 6543d520f3SAlex Deymo /* 6643d520f3SAlex Deymo * It is expected that callers would explicitly specify which version of the 6743d520f3SAlex Deymo * boot image header they need to use. 6843d520f3SAlex Deymo */ 6943d520f3SAlex Deymo typedef struct andr_img_hdr andr_img_hdr; 7043d520f3SAlex Deymo 7143d520f3SAlex Deymo /* The bootloader expects the structure of andr_img_hdr with header 7243d520f3SAlex Deymo * version 0 to be as follows: */ 739ace3fc8SSebastian Siewior struct andr_img_hdr { 7443d520f3SAlex Deymo /* Must be ANDR_BOOT_MAGIC. */ 759ace3fc8SSebastian Siewior char magic[ANDR_BOOT_MAGIC_SIZE]; 769ace3fc8SSebastian Siewior 779ace3fc8SSebastian Siewior u32 kernel_size; /* size in bytes */ 789ace3fc8SSebastian Siewior u32 kernel_addr; /* physical load addr */ 799ace3fc8SSebastian Siewior 809ace3fc8SSebastian Siewior u32 ramdisk_size; /* size in bytes */ 819ace3fc8SSebastian Siewior u32 ramdisk_addr; /* physical load addr */ 829ace3fc8SSebastian Siewior 839ace3fc8SSebastian Siewior u32 second_size; /* size in bytes */ 849ace3fc8SSebastian Siewior u32 second_addr; /* physical load addr */ 859ace3fc8SSebastian Siewior 869ace3fc8SSebastian Siewior u32 tags_addr; /* physical addr for kernel tags */ 879ace3fc8SSebastian Siewior u32 page_size; /* flash page size we assume */ 8809f4e561SJoseph Chen 8943d520f3SAlex Deymo /* Version of the boot image header. */ 9009f4e561SJoseph Chen u32 header_version; 91210a7176SAlex Deymo 9243d520f3SAlex Deymo /* Operating system version and security patch level. 9343d520f3SAlex Deymo * For version "A.B.C" and patch level "Y-M-D": 9443d520f3SAlex Deymo * (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M) 9543d520f3SAlex Deymo * os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */ 96210a7176SAlex Deymo u32 os_version; 979ace3fc8SSebastian Siewior 989ace3fc8SSebastian Siewior char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */ 999ace3fc8SSebastian Siewior 1009ace3fc8SSebastian Siewior char cmdline[ANDR_BOOT_ARGS_SIZE]; 1019ace3fc8SSebastian Siewior 1029ace3fc8SSebastian Siewior u32 id[8]; /* timestamp / checksum / sha1 / etc */ 103210a7176SAlex Deymo 104210a7176SAlex Deymo /* Supplemental command line data; kept here to maintain 10543d520f3SAlex Deymo * binary compatibility with older versions of mkbootimg. */ 106210a7176SAlex Deymo char extra_cmdline[ANDR_BOOT_EXTRA_ARGS_SIZE]; 10709f4e561SJoseph Chen 108745aeb1aSJoseph Chen /* Fields in boot_img_hdr_v1(Android-9) and newer. */ 10943d520f3SAlex Deymo u32 recovery_dtbo_size; /* size in bytes for recovery DTBO/ACPIO image */ 11043d520f3SAlex Deymo u64 recovery_dtbo_offset; /* offset to recovery dtbo/acpio in boot image */ 11143d520f3SAlex Deymo u32 header_size; 11243d520f3SAlex Deymo 113745aeb1aSJoseph Chen /* Fields in boot_img_hdr_v2(Android-10) and newer. */ 11443d520f3SAlex Deymo u32 dtb_size; /* size in bytes for DTB image */ 11543d520f3SAlex Deymo u64 dtb_addr; /* physical load address for DTB image */ 116745aeb1aSJoseph Chen 117745aeb1aSJoseph Chen /* 11839bac655SJoseph Chen * [Rockchip compatibility Android v3] 119745aeb1aSJoseph Chen * 120745aeb1aSJoseph Chen * boot_img_hdr_v3(Android-11) is not compatible with boot_img_hdr_v012, 12139bac655SJoseph Chen * we have to partly merge fields from boot_img_hdr_v34 and vendor_boot_img_hdr_v34 122745aeb1aSJoseph Chen * into this structure to compatible with boot_img_hdr_v012. 123745aeb1aSJoseph Chen */ 124745aeb1aSJoseph Chen u32 vendor_ramdisk_size; /* size in bytes */ 125745aeb1aSJoseph Chen u32 vendor_page_size; 126745aeb1aSJoseph Chen u32 vendor_header_version; 127745aeb1aSJoseph Chen u32 vendor_header_size; 12839bac655SJoseph Chen 12939bac655SJoseph Chen /* 13039bac655SJoseph Chen * [Rockchip compatibility Android v4] 13139bac655SJoseph Chen * 13239bac655SJoseph Chen * boot_img_hdr_v4(Android-12) is not compatible with boot_img_hdr_v012, 13339bac655SJoseph Chen * we have to partly merge fields from boot_img_hdr_v34 and vendor_boot_img_hdr_v34 13439bac655SJoseph Chen * into this structure to compatible with boot_img_hdr_v012. 13539bac655SJoseph Chen */ 13639bac655SJoseph Chen u32 vendor_ramdisk_table_size; 13739bac655SJoseph Chen u32 vendor_ramdisk_table_entry_num; 13839bac655SJoseph Chen u32 vendor_ramdisk_table_entry_size; 13939bac655SJoseph Chen u32 vendor_bootconfig_size; /* size in bytes for bootconfig image */ 14039bac655SJoseph Chen 14128317110SJoseph Chen void *init_boot_buf; 14228317110SJoseph Chen void *vendor_boot_buf; 14328317110SJoseph Chen 144745aeb1aSJoseph Chen /* 145745aeb1aSJoseph Chen * Don't define 'char total_cmdline[TOTAL_BOOT_ARGS_SIZE]' to avoid 146745aeb1aSJoseph Chen * this structrue is over size than page_size. 147745aeb1aSJoseph Chen */ 148745aeb1aSJoseph Chen char *total_cmdline; 149745aeb1aSJoseph Chen } __attribute__((packed)); 150745aeb1aSJoseph Chen 15139bac655SJoseph Chen struct boot_img_hdr_v34 { 152745aeb1aSJoseph Chen /* Must be ANDR_BOOT_MAGIC. */ 153745aeb1aSJoseph Chen uint8_t magic[ANDR_BOOT_MAGIC_SIZE]; 154745aeb1aSJoseph Chen 155745aeb1aSJoseph Chen uint32_t kernel_size; /* size in bytes */ 156745aeb1aSJoseph Chen uint32_t ramdisk_size; /* size in bytes */ 157745aeb1aSJoseph Chen 158745aeb1aSJoseph Chen /* Operating system version and security patch level. 159745aeb1aSJoseph Chen * For version "A.B.C" and patch level "Y-M-D": 160745aeb1aSJoseph Chen * (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M) 161745aeb1aSJoseph Chen * os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */ 162745aeb1aSJoseph Chen uint32_t os_version; 163745aeb1aSJoseph Chen 164745aeb1aSJoseph Chen uint32_t header_size; 165745aeb1aSJoseph Chen 166745aeb1aSJoseph Chen uint32_t reserved[4]; 167745aeb1aSJoseph Chen 168745aeb1aSJoseph Chen uint32_t header_version; 169745aeb1aSJoseph Chen 170745aeb1aSJoseph Chen uint8_t cmdline[ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE]; 171745aeb1aSJoseph Chen } __attribute__((packed)); 172745aeb1aSJoseph Chen 17339bac655SJoseph Chen struct vendor_boot_img_hdr_v34 { 174745aeb1aSJoseph Chen /* Must be VENDOR_BOOT_MAGIC. */ 175745aeb1aSJoseph Chen uint8_t magic[VENDOR_BOOT_MAGIC_SIZE]; 176745aeb1aSJoseph Chen 177745aeb1aSJoseph Chen /* Version of the vendor boot image header. */ 178745aeb1aSJoseph Chen uint32_t header_version; 179745aeb1aSJoseph Chen 180745aeb1aSJoseph Chen uint32_t page_size; /* flash page size we assume */ 181745aeb1aSJoseph Chen 182745aeb1aSJoseph Chen uint32_t kernel_addr; /* physical load addr */ 183745aeb1aSJoseph Chen uint32_t ramdisk_addr; /* physical load addr */ 184745aeb1aSJoseph Chen 185745aeb1aSJoseph Chen uint32_t vendor_ramdisk_size; /* size in bytes */ 186745aeb1aSJoseph Chen 187745aeb1aSJoseph Chen uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE]; 188745aeb1aSJoseph Chen 189745aeb1aSJoseph Chen uint32_t tags_addr; /* physical addr for kernel tags (if required) */ 190745aeb1aSJoseph Chen uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */ 191745aeb1aSJoseph Chen 192745aeb1aSJoseph Chen uint32_t header_size; 193745aeb1aSJoseph Chen 194745aeb1aSJoseph Chen uint32_t dtb_size; /* size in bytes for DTB image */ 195745aeb1aSJoseph Chen uint64_t dtb_addr; /* physical load address for DTB image */ 19639bac655SJoseph Chen 19739bac655SJoseph Chen /* new for v4 */ 19839bac655SJoseph Chen uint32_t vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk table */ 19939bac655SJoseph Chen uint32_t vendor_ramdisk_table_entry_num; /* number of entries in the vendor ramdisk table */ 20039bac655SJoseph Chen uint32_t vendor_ramdisk_table_entry_size; 20139bac655SJoseph Chen uint32_t vendor_bootconfig_size; /* size in bytes for bootconfig image */ 202210a7176SAlex Deymo } __attribute__((packed)); 2039ace3fc8SSebastian Siewior 20439bac655SJoseph Chen struct vendor_ramdisk_table_entry_v4 { 20539bac655SJoseph Chen uint32_t ramdisk_size; /* size in bytes for the ramdisk image */ 20639bac655SJoseph Chen uint32_t ramdisk_offset; /* offset to the ramdisk image in vendor ramdisk section */ 20739bac655SJoseph Chen uint32_t ramdisk_type; /* type of the ramdisk */ 20839bac655SJoseph Chen uint8_t ramdisk_name[VENDOR_RAMDISK_NAME_SIZE]; /* asciiz ramdisk name */ 20939bac655SJoseph Chen 21039bac655SJoseph Chen // Hardware identifiers describing the board, soc or platform which this 21139bac655SJoseph Chen // ramdisk is intended to be loaded on. 21239bac655SJoseph Chen uint32_t board_id[VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE]; 21339bac655SJoseph Chen } __attribute__((packed)); 21439bac655SJoseph Chen 21539bac655SJoseph Chen /* When the boot image header has a version of 4, the structure of the boot 21639bac655SJoseph Chen * image is the same as version 3: 21739bac655SJoseph Chen * 21839bac655SJoseph Chen * +---------------------+ 21939bac655SJoseph Chen * | boot header | 4096 bytes 22039bac655SJoseph Chen * +---------------------+ 22139bac655SJoseph Chen * | kernel | m pages 22239bac655SJoseph Chen * +---------------------+ 22339bac655SJoseph Chen * | ramdisk | n pages 22439bac655SJoseph Chen * +---------------------+ 22539bac655SJoseph Chen * 22639bac655SJoseph Chen * m = (kernel_size + 4096 - 1) / 4096 22739bac655SJoseph Chen * n = (ramdisk_size + 4096 - 1) / 4096 22839bac655SJoseph Chen * 22939bac655SJoseph Chen * Note that in version 4 of the boot image header, page size is fixed at 4096 23039bac655SJoseph Chen * bytes. 23139bac655SJoseph Chen * 23239bac655SJoseph Chen * The structure of the vendor boot image version 4, which is required to be 23339bac655SJoseph Chen * present when a version 4 boot image is used, is as follows: 23439bac655SJoseph Chen * 23539bac655SJoseph Chen * +------------------------+ 23639bac655SJoseph Chen * | vendor boot header | o pages 23739bac655SJoseph Chen * +------------------------+ 23839bac655SJoseph Chen * | vendor ramdisk section | p pages 23939bac655SJoseph Chen * +------------------------+ 24039bac655SJoseph Chen * | dtb | q pages 24139bac655SJoseph Chen * +------------------------+ 24239bac655SJoseph Chen * | vendor ramdisk table | r pages 24339bac655SJoseph Chen * +------------------------+ 24439bac655SJoseph Chen * | bootconfig | s pages 24539bac655SJoseph Chen * +------------------------+ 24639bac655SJoseph Chen * 24739bac655SJoseph Chen * o = (2124 + page_size - 1) / page_size 24839bac655SJoseph Chen * p = (vendor_ramdisk_size + page_size - 1) / page_size 24939bac655SJoseph Chen * q = (dtb_size + page_size - 1) / page_size 25039bac655SJoseph Chen * r = (vendor_ramdisk_table_size + page_size - 1) / page_size 25139bac655SJoseph Chen * s = (vendor_bootconfig_size + page_size - 1) / page_size 25239bac655SJoseph Chen * 25339bac655SJoseph Chen * Note that in version 4 of the vendor boot image, multiple vendor ramdisks can 25439bac655SJoseph Chen * be included in the vendor boot image. The bootloader can select a subset of 25539bac655SJoseph Chen * ramdisks to load at runtime. To help the bootloader select the ramdisks, each 25639bac655SJoseph Chen * ramdisk is tagged with a type tag and a set of hardware identifiers 25739bac655SJoseph Chen * describing the board, soc or platform that this ramdisk is intended for. 25839bac655SJoseph Chen * 25939bac655SJoseph Chen * The vendor ramdisk section is consist of multiple ramdisk images concatenated 26039bac655SJoseph Chen * one after another, and vendor_ramdisk_size is the size of the section, which 26139bac655SJoseph Chen * is the total size of all the ramdisks included in the vendor boot image. 26239bac655SJoseph Chen * 26339bac655SJoseph Chen * The vendor ramdisk table holds the size, offset, type, name and hardware 26439bac655SJoseph Chen * identifiers of each ramdisk. The type field denotes the type of its content. 26539bac655SJoseph Chen * The hardware identifiers are specified in the board_id field in each table 26639bac655SJoseph Chen * entry. The board_id field is consist of a vector of unsigned integer words, 26739bac655SJoseph Chen * and the encoding scheme is defined by the hardware vendor. 26839bac655SJoseph Chen * 26939bac655SJoseph Chen * For the different type of ramdisks, there are: 27039bac655SJoseph Chen * - VENDOR_RAMDISK_TYPE_NONE indicates the value is unspecified. 27139bac655SJoseph Chen * - VENDOR_RAMDISK_TYPE_PLATFORM ramdisk contains platform specific bits. 27239bac655SJoseph Chen * - VENDOR_RAMDISK_TYPE_RECOVERY ramdisk contains recovery resources. 27339bac655SJoseph Chen * - VENDOR_RAMDISK_TYPE_DLKM ramdisk contains dynamic loadable kernel 27439bac655SJoseph Chen * modules. 27539bac655SJoseph Chen * 27639bac655SJoseph Chen * Version 4 of the vendor boot image also adds a bootconfig section to the end 27739bac655SJoseph Chen * of the image. This section contains Boot Configuration parameters known at 27839bac655SJoseph Chen * build time. The bootloader is responsible for placing this section directly 27939bac655SJoseph Chen * after the boot image ramdisk, followed by the bootconfig trailer, before 28039bac655SJoseph Chen * entering the kernel. 28139bac655SJoseph Chen * 28239bac655SJoseph Chen * 0. all entities in the boot image are 4096-byte aligned in flash, all 28339bac655SJoseph Chen * entities in the vendor boot image are page_size (determined by the vendor 28439bac655SJoseph Chen * and specified in the vendor boot image header) aligned in flash 28539bac655SJoseph Chen * 1. kernel, ramdisk, and DTB are required (size != 0) 28639bac655SJoseph Chen * 2. load the kernel and DTB at the specified physical address (kernel_addr, 28739bac655SJoseph Chen * dtb_addr) 28839bac655SJoseph Chen * 3. load the vendor ramdisks at ramdisk_addr 28939bac655SJoseph Chen * 4. load the generic ramdisk immediately following the vendor ramdisk in 29039bac655SJoseph Chen * memory 29139bac655SJoseph Chen * 5. load the vendor bootconfig immediately following the generic ramdisk. Add 29239bac655SJoseph Chen * additional bootconfig parameters followed by the bootconfig trailer. 29339bac655SJoseph Chen * 6. set up registers for kernel entry as required by your architecture 29439bac655SJoseph Chen * 7. if the platform has a second stage bootloader jump to it (must be 29539bac655SJoseph Chen * contained outside boot and vendor boot partitions), otherwise 29639bac655SJoseph Chen * jump to kernel_addr 29739bac655SJoseph Chen * 29839bac655SJoseph Chen * When a boot header is of version 0, the structure of boot image is as 29943d520f3SAlex Deymo * follows: 30043d520f3SAlex Deymo * 3019ace3fc8SSebastian Siewior * +-----------------+ 3029ace3fc8SSebastian Siewior * | boot header | 1 page 3039ace3fc8SSebastian Siewior * +-----------------+ 3049ace3fc8SSebastian Siewior * | kernel | n pages 3059ace3fc8SSebastian Siewior * +-----------------+ 3069ace3fc8SSebastian Siewior * | ramdisk | m pages 3079ace3fc8SSebastian Siewior * +-----------------+ 3089ace3fc8SSebastian Siewior * | second stage | o pages 3099ace3fc8SSebastian Siewior * +-----------------+ 3109ace3fc8SSebastian Siewior * 3119ace3fc8SSebastian Siewior * n = (kernel_size + page_size - 1) / page_size 3129ace3fc8SSebastian Siewior * m = (ramdisk_size + page_size - 1) / page_size 3139ace3fc8SSebastian Siewior * o = (second_size + page_size - 1) / page_size 3149ace3fc8SSebastian Siewior * 3159ace3fc8SSebastian Siewior * 0. all entities are page_size aligned in flash 3169ace3fc8SSebastian Siewior * 1. kernel and ramdisk are required (size != 0) 3179ace3fc8SSebastian Siewior * 2. second is optional (second_size == 0 -> no second) 3189ace3fc8SSebastian Siewior * 3. load each element (kernel, ramdisk, second) at 3199ace3fc8SSebastian Siewior * the specified physical address (kernel_addr, etc) 3209ace3fc8SSebastian Siewior * 4. prepare tags at tag_addr. kernel_args[] is 3219ace3fc8SSebastian Siewior * appended to the kernel commandline in the tags. 3229ace3fc8SSebastian Siewior * 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 3239ace3fc8SSebastian Siewior * 6. if second_size != 0: jump to second_addr 3249ace3fc8SSebastian Siewior * else: jump to kernel_addr 3259ace3fc8SSebastian Siewior */ 32643d520f3SAlex Deymo 32743d520f3SAlex Deymo /* When the boot image header has a version of 2, the structure of the boot 32843d520f3SAlex Deymo * image is as follows: 32943d520f3SAlex Deymo * 33043d520f3SAlex Deymo * +---------------------+ 33143d520f3SAlex Deymo * | boot header | 1 page 33243d520f3SAlex Deymo * +---------------------+ 33343d520f3SAlex Deymo * | kernel | n pages 33443d520f3SAlex Deymo * +---------------------+ 33543d520f3SAlex Deymo * | ramdisk | m pages 33643d520f3SAlex Deymo * +---------------------+ 33743d520f3SAlex Deymo * | second stage | o pages 33843d520f3SAlex Deymo * +---------------------+ 33943d520f3SAlex Deymo * | recovery dtbo/acpio | p pages 34043d520f3SAlex Deymo * +---------------------+ 34143d520f3SAlex Deymo * | dtb | q pages 34243d520f3SAlex Deymo * +---------------------+ 34343d520f3SAlex Deymo 34443d520f3SAlex Deymo * n = (kernel_size + page_size - 1) / page_size 34543d520f3SAlex Deymo * m = (ramdisk_size + page_size - 1) / page_size 34643d520f3SAlex Deymo * o = (second_size + page_size - 1) / page_size 34743d520f3SAlex Deymo * p = (recovery_dtbo_size + page_size - 1) / page_size 34843d520f3SAlex Deymo * q = (dtb_size + page_size - 1) / page_size 34943d520f3SAlex Deymo * 35043d520f3SAlex Deymo * 0. all entities are page_size aligned in flash 35143d520f3SAlex Deymo * 1. kernel, ramdisk and DTB are required (size != 0) 35243d520f3SAlex Deymo * 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B 35343d520f3SAlex Deymo * devices(recovery_dtbo_size != 0) 35443d520f3SAlex Deymo * 3. second is optional (second_size == 0 -> no second) 35543d520f3SAlex Deymo * 4. load each element (kernel, ramdisk, second, dtb) at 35643d520f3SAlex Deymo * the specified physical address (kernel_addr, etc) 35743d520f3SAlex Deymo * 5. If booting to recovery mode in a non-A/B device, extract recovery 35843d520f3SAlex Deymo * dtbo/acpio and apply the correct set of overlays on the base device tree 35943d520f3SAlex Deymo * depending on the hardware/product revision. 36043d520f3SAlex Deymo * 6. prepare tags at tag_addr. kernel_args[] is 36143d520f3SAlex Deymo * appended to the kernel commandline in the tags. 36243d520f3SAlex Deymo * 7. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 36343d520f3SAlex Deymo * 8. if second_size != 0: jump to second_addr 36443d520f3SAlex Deymo * else: jump to kernel_addr 36543d520f3SAlex Deymo */ 36643d520f3SAlex Deymo 367745aeb1aSJoseph Chen /* When the boot image header has a version of 3, the structure of the boot 368745aeb1aSJoseph Chen * image is as follows: 369745aeb1aSJoseph Chen * 370745aeb1aSJoseph Chen * +---------------------+ 371745aeb1aSJoseph Chen * | boot header | 4096 bytes 372745aeb1aSJoseph Chen * +---------------------+ 373745aeb1aSJoseph Chen * | kernel | m pages 374745aeb1aSJoseph Chen * +---------------------+ 375745aeb1aSJoseph Chen * | ramdisk | n pages 376745aeb1aSJoseph Chen * +---------------------+ 377745aeb1aSJoseph Chen * 378745aeb1aSJoseph Chen * m = (kernel_size + 4096 - 1) / 4096 379745aeb1aSJoseph Chen * n = (ramdisk_size + 4096 - 1) / 4096 380745aeb1aSJoseph Chen * 381745aeb1aSJoseph Chen * Note that in version 3 of the boot image header, page size is fixed at 4096 bytes. 382745aeb1aSJoseph Chen * 383745aeb1aSJoseph Chen * The structure of the vendor boot image (introduced with version 3 and 384745aeb1aSJoseph Chen * required to be present when a v3 boot image is used) is as follows: 385745aeb1aSJoseph Chen * 386745aeb1aSJoseph Chen * +---------------------+ 387745aeb1aSJoseph Chen * | vendor boot header | o pages 388745aeb1aSJoseph Chen * +---------------------+ 389745aeb1aSJoseph Chen * | vendor ramdisk | p pages 390745aeb1aSJoseph Chen * +---------------------+ 391745aeb1aSJoseph Chen * | dtb | q pages 392745aeb1aSJoseph Chen * +---------------------+ 393745aeb1aSJoseph Chen * 394745aeb1aSJoseph Chen * o = (2112 + page_size - 1) / page_size 395745aeb1aSJoseph Chen * p = (vendor_ramdisk_size + page_size - 1) / page_size 396745aeb1aSJoseph Chen * q = (dtb_size + page_size - 1) / page_size 397745aeb1aSJoseph Chen * 398745aeb1aSJoseph Chen * 0. all entities in the boot image are 4096-byte aligned in flash, all 399745aeb1aSJoseph Chen * entities in the vendor boot image are page_size (determined by the vendor 400745aeb1aSJoseph Chen * and specified in the vendor boot image header) aligned in flash 401745aeb1aSJoseph Chen * 1. kernel, ramdisk, vendor ramdisk, and DTB are required (size != 0) 402745aeb1aSJoseph Chen * 2. load the kernel and DTB at the specified physical address (kernel_addr, 403745aeb1aSJoseph Chen * dtb_addr) 404745aeb1aSJoseph Chen * 3. load the vendor ramdisk at ramdisk_addr 405745aeb1aSJoseph Chen * 4. load the generic ramdisk immediately following the vendor ramdisk in 406745aeb1aSJoseph Chen * memory 407745aeb1aSJoseph Chen * 5. set up registers for kernel entry as required by your architecture 408745aeb1aSJoseph Chen * 6. if the platform has a second stage bootloader jump to it (must be 409745aeb1aSJoseph Chen * contained outside boot and vendor boot partitions), otherwise 410745aeb1aSJoseph Chen * jump to kernel_addr 411745aeb1aSJoseph Chen */ 412745aeb1aSJoseph Chen 4139ace3fc8SSebastian Siewior #endif 414