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" 19*36e836f2SJoseph 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 34cf87ffd3SJason Zhu #define OEM_UNLOCK_ARG_SIZE 30 35cf87ffd3SJason Zhu #define UUID_SIZE 37 36cf87ffd3SJason Zhu 379ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC "ANDROID!" 38745aeb1aSJoseph Chen #define VENDOR_BOOT_MAGIC "VNDRBOOT" 399ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC_SIZE 8 40745aeb1aSJoseph Chen #define VENDOR_BOOT_MAGIC_SIZE 8 419ace3fc8SSebastian Siewior #define ANDR_BOOT_NAME_SIZE 16 42745aeb1aSJoseph Chen #define VENDOR_BOOT_NAME_SIZE 16 439ace3fc8SSebastian Siewior #define ANDR_BOOT_ARGS_SIZE 512 44210a7176SAlex Deymo #define ANDR_BOOT_EXTRA_ARGS_SIZE 1024 45745aeb1aSJoseph Chen #define VENDOR_BOOT_ARGS_SIZE 2048 46745aeb1aSJoseph Chen #define ANDR_BOOT_IMG_PAGE_SIZE 4096 47745aeb1aSJoseph Chen #define ANDR_BOOT_IMG_HDR_SIZE (ANDR_BOOT_IMG_PAGE_SIZE) 48745aeb1aSJoseph Chen #define TOTAL_BOOT_ARGS_SIZE (ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE + \ 49745aeb1aSJoseph Chen VENDOR_BOOT_ARGS_SIZE + 1) 5039bac655SJoseph Chen #define VENDOR_BOOT_HDRv3_SIZE 2112 5139bac655SJoseph Chen #define VENDOR_BOOT_HDRv4_SIZE 2124 5239bac655SJoseph Chen 5339bac655SJoseph Chen #define VENDOR_RAMDISK_TYPE_NONE 0 5439bac655SJoseph Chen #define VENDOR_RAMDISK_TYPE_PLATFORM 1 5539bac655SJoseph Chen #define VENDOR_RAMDISK_TYPE_RECOVERY 2 5639bac655SJoseph Chen #define VENDOR_RAMDISK_TYPE_DLKM 3 5739bac655SJoseph Chen #define VENDOR_RAMDISK_NAME_SIZE 32 5839bac655SJoseph Chen #define VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE 16 5939bac655SJoseph Chen 6039bac655SJoseph Chen /* defined by rockchip but not google, it's adjustable */ 6139bac655SJoseph Chen #define ANDROID_ADDITION_BOOTCONFIG_PARAMS_MAX_SIZE SZ_8K 629ace3fc8SSebastian Siewior 6343d520f3SAlex Deymo /* 6443d520f3SAlex Deymo * It is expected that callers would explicitly specify which version of the 6543d520f3SAlex Deymo * boot image header they need to use. 6643d520f3SAlex Deymo */ 6743d520f3SAlex Deymo typedef struct andr_img_hdr andr_img_hdr; 6843d520f3SAlex Deymo 6943d520f3SAlex Deymo /* The bootloader expects the structure of andr_img_hdr with header 7043d520f3SAlex Deymo * version 0 to be as follows: */ 719ace3fc8SSebastian Siewior struct andr_img_hdr { 7243d520f3SAlex Deymo /* Must be ANDR_BOOT_MAGIC. */ 739ace3fc8SSebastian Siewior char magic[ANDR_BOOT_MAGIC_SIZE]; 749ace3fc8SSebastian Siewior 759ace3fc8SSebastian Siewior u32 kernel_size; /* size in bytes */ 769ace3fc8SSebastian Siewior u32 kernel_addr; /* physical load addr */ 779ace3fc8SSebastian Siewior 789ace3fc8SSebastian Siewior u32 ramdisk_size; /* size in bytes */ 799ace3fc8SSebastian Siewior u32 ramdisk_addr; /* physical load addr */ 809ace3fc8SSebastian Siewior 819ace3fc8SSebastian Siewior u32 second_size; /* size in bytes */ 829ace3fc8SSebastian Siewior u32 second_addr; /* physical load addr */ 839ace3fc8SSebastian Siewior 849ace3fc8SSebastian Siewior u32 tags_addr; /* physical addr for kernel tags */ 859ace3fc8SSebastian Siewior u32 page_size; /* flash page size we assume */ 8609f4e561SJoseph Chen 8743d520f3SAlex Deymo /* Version of the boot image header. */ 8809f4e561SJoseph Chen u32 header_version; 89210a7176SAlex Deymo 9043d520f3SAlex Deymo /* Operating system version and security patch level. 9143d520f3SAlex Deymo * For version "A.B.C" and patch level "Y-M-D": 9243d520f3SAlex Deymo * (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M) 9343d520f3SAlex Deymo * os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */ 94210a7176SAlex Deymo u32 os_version; 959ace3fc8SSebastian Siewior 969ace3fc8SSebastian Siewior char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */ 979ace3fc8SSebastian Siewior 989ace3fc8SSebastian Siewior char cmdline[ANDR_BOOT_ARGS_SIZE]; 999ace3fc8SSebastian Siewior 1009ace3fc8SSebastian Siewior u32 id[8]; /* timestamp / checksum / sha1 / etc */ 101210a7176SAlex Deymo 102210a7176SAlex Deymo /* Supplemental command line data; kept here to maintain 10343d520f3SAlex Deymo * binary compatibility with older versions of mkbootimg. */ 104210a7176SAlex Deymo char extra_cmdline[ANDR_BOOT_EXTRA_ARGS_SIZE]; 10509f4e561SJoseph Chen 106745aeb1aSJoseph Chen /* Fields in boot_img_hdr_v1(Android-9) and newer. */ 10743d520f3SAlex Deymo u32 recovery_dtbo_size; /* size in bytes for recovery DTBO/ACPIO image */ 10843d520f3SAlex Deymo u64 recovery_dtbo_offset; /* offset to recovery dtbo/acpio in boot image */ 10943d520f3SAlex Deymo u32 header_size; 11043d520f3SAlex Deymo 111745aeb1aSJoseph Chen /* Fields in boot_img_hdr_v2(Android-10) and newer. */ 11243d520f3SAlex Deymo u32 dtb_size; /* size in bytes for DTB image */ 11343d520f3SAlex Deymo u64 dtb_addr; /* physical load address for DTB image */ 114745aeb1aSJoseph Chen 115745aeb1aSJoseph Chen /* 11639bac655SJoseph Chen * [Rockchip compatibility Android v3] 117745aeb1aSJoseph Chen * 118745aeb1aSJoseph Chen * boot_img_hdr_v3(Android-11) is not compatible with boot_img_hdr_v012, 11939bac655SJoseph Chen * we have to partly merge fields from boot_img_hdr_v34 and vendor_boot_img_hdr_v34 120745aeb1aSJoseph Chen * into this structure to compatible with boot_img_hdr_v012. 121745aeb1aSJoseph Chen */ 122745aeb1aSJoseph Chen u32 vendor_ramdisk_size; /* size in bytes */ 123745aeb1aSJoseph Chen u32 vendor_page_size; 124745aeb1aSJoseph Chen u32 vendor_header_version; 125745aeb1aSJoseph Chen u32 vendor_header_size; 12639bac655SJoseph Chen 12739bac655SJoseph Chen /* 12839bac655SJoseph Chen * [Rockchip compatibility Android v4] 12939bac655SJoseph Chen * 13039bac655SJoseph Chen * boot_img_hdr_v4(Android-12) is not compatible with boot_img_hdr_v012, 13139bac655SJoseph Chen * we have to partly merge fields from boot_img_hdr_v34 and vendor_boot_img_hdr_v34 13239bac655SJoseph Chen * into this structure to compatible with boot_img_hdr_v012. 13339bac655SJoseph Chen */ 13439bac655SJoseph Chen u32 vendor_ramdisk_table_size; 13539bac655SJoseph Chen u32 vendor_ramdisk_table_entry_num; 13639bac655SJoseph Chen u32 vendor_ramdisk_table_entry_size; 13739bac655SJoseph Chen u32 vendor_bootconfig_size; /* size in bytes for bootconfig image */ 13839bac655SJoseph Chen 13928317110SJoseph Chen void *init_boot_buf; 14028317110SJoseph Chen void *vendor_boot_buf; 14128317110SJoseph Chen 142745aeb1aSJoseph Chen /* 143745aeb1aSJoseph Chen * Don't define 'char total_cmdline[TOTAL_BOOT_ARGS_SIZE]' to avoid 144745aeb1aSJoseph Chen * this structrue is over size than page_size. 145745aeb1aSJoseph Chen */ 146745aeb1aSJoseph Chen char *total_cmdline; 147745aeb1aSJoseph Chen } __attribute__((packed)); 148745aeb1aSJoseph Chen 14939bac655SJoseph Chen struct boot_img_hdr_v34 { 150745aeb1aSJoseph Chen /* Must be ANDR_BOOT_MAGIC. */ 151745aeb1aSJoseph Chen uint8_t magic[ANDR_BOOT_MAGIC_SIZE]; 152745aeb1aSJoseph Chen 153745aeb1aSJoseph Chen uint32_t kernel_size; /* size in bytes */ 154745aeb1aSJoseph Chen uint32_t ramdisk_size; /* size in bytes */ 155745aeb1aSJoseph Chen 156745aeb1aSJoseph Chen /* Operating system version and security patch level. 157745aeb1aSJoseph Chen * For version "A.B.C" and patch level "Y-M-D": 158745aeb1aSJoseph Chen * (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M) 159745aeb1aSJoseph Chen * os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */ 160745aeb1aSJoseph Chen uint32_t os_version; 161745aeb1aSJoseph Chen 162745aeb1aSJoseph Chen uint32_t header_size; 163745aeb1aSJoseph Chen 164745aeb1aSJoseph Chen uint32_t reserved[4]; 165745aeb1aSJoseph Chen 166745aeb1aSJoseph Chen uint32_t header_version; 167745aeb1aSJoseph Chen 168745aeb1aSJoseph Chen uint8_t cmdline[ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE]; 169745aeb1aSJoseph Chen } __attribute__((packed)); 170745aeb1aSJoseph Chen 17139bac655SJoseph Chen struct vendor_boot_img_hdr_v34 { 172745aeb1aSJoseph Chen /* Must be VENDOR_BOOT_MAGIC. */ 173745aeb1aSJoseph Chen uint8_t magic[VENDOR_BOOT_MAGIC_SIZE]; 174745aeb1aSJoseph Chen 175745aeb1aSJoseph Chen /* Version of the vendor boot image header. */ 176745aeb1aSJoseph Chen uint32_t header_version; 177745aeb1aSJoseph Chen 178745aeb1aSJoseph Chen uint32_t page_size; /* flash page size we assume */ 179745aeb1aSJoseph Chen 180745aeb1aSJoseph Chen uint32_t kernel_addr; /* physical load addr */ 181745aeb1aSJoseph Chen uint32_t ramdisk_addr; /* physical load addr */ 182745aeb1aSJoseph Chen 183745aeb1aSJoseph Chen uint32_t vendor_ramdisk_size; /* size in bytes */ 184745aeb1aSJoseph Chen 185745aeb1aSJoseph Chen uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE]; 186745aeb1aSJoseph Chen 187745aeb1aSJoseph Chen uint32_t tags_addr; /* physical addr for kernel tags (if required) */ 188745aeb1aSJoseph Chen uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */ 189745aeb1aSJoseph Chen 190745aeb1aSJoseph Chen uint32_t header_size; 191745aeb1aSJoseph Chen 192745aeb1aSJoseph Chen uint32_t dtb_size; /* size in bytes for DTB image */ 193745aeb1aSJoseph Chen uint64_t dtb_addr; /* physical load address for DTB image */ 19439bac655SJoseph Chen 19539bac655SJoseph Chen /* new for v4 */ 19639bac655SJoseph Chen uint32_t vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk table */ 19739bac655SJoseph Chen uint32_t vendor_ramdisk_table_entry_num; /* number of entries in the vendor ramdisk table */ 19839bac655SJoseph Chen uint32_t vendor_ramdisk_table_entry_size; 19939bac655SJoseph Chen uint32_t vendor_bootconfig_size; /* size in bytes for bootconfig image */ 200210a7176SAlex Deymo } __attribute__((packed)); 2019ace3fc8SSebastian Siewior 20239bac655SJoseph Chen struct vendor_ramdisk_table_entry_v4 { 20339bac655SJoseph Chen uint32_t ramdisk_size; /* size in bytes for the ramdisk image */ 20439bac655SJoseph Chen uint32_t ramdisk_offset; /* offset to the ramdisk image in vendor ramdisk section */ 20539bac655SJoseph Chen uint32_t ramdisk_type; /* type of the ramdisk */ 20639bac655SJoseph Chen uint8_t ramdisk_name[VENDOR_RAMDISK_NAME_SIZE]; /* asciiz ramdisk name */ 20739bac655SJoseph Chen 20839bac655SJoseph Chen // Hardware identifiers describing the board, soc or platform which this 20939bac655SJoseph Chen // ramdisk is intended to be loaded on. 21039bac655SJoseph Chen uint32_t board_id[VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE]; 21139bac655SJoseph Chen } __attribute__((packed)); 21239bac655SJoseph Chen 21339bac655SJoseph Chen /* When the boot image header has a version of 4, the structure of the boot 21439bac655SJoseph Chen * image is the same as version 3: 21539bac655SJoseph Chen * 21639bac655SJoseph Chen * +---------------------+ 21739bac655SJoseph Chen * | boot header | 4096 bytes 21839bac655SJoseph Chen * +---------------------+ 21939bac655SJoseph Chen * | kernel | m pages 22039bac655SJoseph Chen * +---------------------+ 22139bac655SJoseph Chen * | ramdisk | n pages 22239bac655SJoseph Chen * +---------------------+ 22339bac655SJoseph Chen * 22439bac655SJoseph Chen * m = (kernel_size + 4096 - 1) / 4096 22539bac655SJoseph Chen * n = (ramdisk_size + 4096 - 1) / 4096 22639bac655SJoseph Chen * 22739bac655SJoseph Chen * Note that in version 4 of the boot image header, page size is fixed at 4096 22839bac655SJoseph Chen * bytes. 22939bac655SJoseph Chen * 23039bac655SJoseph Chen * The structure of the vendor boot image version 4, which is required to be 23139bac655SJoseph Chen * present when a version 4 boot image is used, is as follows: 23239bac655SJoseph Chen * 23339bac655SJoseph Chen * +------------------------+ 23439bac655SJoseph Chen * | vendor boot header | o pages 23539bac655SJoseph Chen * +------------------------+ 23639bac655SJoseph Chen * | vendor ramdisk section | p pages 23739bac655SJoseph Chen * +------------------------+ 23839bac655SJoseph Chen * | dtb | q pages 23939bac655SJoseph Chen * +------------------------+ 24039bac655SJoseph Chen * | vendor ramdisk table | r pages 24139bac655SJoseph Chen * +------------------------+ 24239bac655SJoseph Chen * | bootconfig | s pages 24339bac655SJoseph Chen * +------------------------+ 24439bac655SJoseph Chen * 24539bac655SJoseph Chen * o = (2124 + page_size - 1) / page_size 24639bac655SJoseph Chen * p = (vendor_ramdisk_size + page_size - 1) / page_size 24739bac655SJoseph Chen * q = (dtb_size + page_size - 1) / page_size 24839bac655SJoseph Chen * r = (vendor_ramdisk_table_size + page_size - 1) / page_size 24939bac655SJoseph Chen * s = (vendor_bootconfig_size + page_size - 1) / page_size 25039bac655SJoseph Chen * 25139bac655SJoseph Chen * Note that in version 4 of the vendor boot image, multiple vendor ramdisks can 25239bac655SJoseph Chen * be included in the vendor boot image. The bootloader can select a subset of 25339bac655SJoseph Chen * ramdisks to load at runtime. To help the bootloader select the ramdisks, each 25439bac655SJoseph Chen * ramdisk is tagged with a type tag and a set of hardware identifiers 25539bac655SJoseph Chen * describing the board, soc or platform that this ramdisk is intended for. 25639bac655SJoseph Chen * 25739bac655SJoseph Chen * The vendor ramdisk section is consist of multiple ramdisk images concatenated 25839bac655SJoseph Chen * one after another, and vendor_ramdisk_size is the size of the section, which 25939bac655SJoseph Chen * is the total size of all the ramdisks included in the vendor boot image. 26039bac655SJoseph Chen * 26139bac655SJoseph Chen * The vendor ramdisk table holds the size, offset, type, name and hardware 26239bac655SJoseph Chen * identifiers of each ramdisk. The type field denotes the type of its content. 26339bac655SJoseph Chen * The hardware identifiers are specified in the board_id field in each table 26439bac655SJoseph Chen * entry. The board_id field is consist of a vector of unsigned integer words, 26539bac655SJoseph Chen * and the encoding scheme is defined by the hardware vendor. 26639bac655SJoseph Chen * 26739bac655SJoseph Chen * For the different type of ramdisks, there are: 26839bac655SJoseph Chen * - VENDOR_RAMDISK_TYPE_NONE indicates the value is unspecified. 26939bac655SJoseph Chen * - VENDOR_RAMDISK_TYPE_PLATFORM ramdisk contains platform specific bits. 27039bac655SJoseph Chen * - VENDOR_RAMDISK_TYPE_RECOVERY ramdisk contains recovery resources. 27139bac655SJoseph Chen * - VENDOR_RAMDISK_TYPE_DLKM ramdisk contains dynamic loadable kernel 27239bac655SJoseph Chen * modules. 27339bac655SJoseph Chen * 27439bac655SJoseph Chen * Version 4 of the vendor boot image also adds a bootconfig section to the end 27539bac655SJoseph Chen * of the image. This section contains Boot Configuration parameters known at 27639bac655SJoseph Chen * build time. The bootloader is responsible for placing this section directly 27739bac655SJoseph Chen * after the boot image ramdisk, followed by the bootconfig trailer, before 27839bac655SJoseph Chen * entering the kernel. 27939bac655SJoseph Chen * 28039bac655SJoseph Chen * 0. all entities in the boot image are 4096-byte aligned in flash, all 28139bac655SJoseph Chen * entities in the vendor boot image are page_size (determined by the vendor 28239bac655SJoseph Chen * and specified in the vendor boot image header) aligned in flash 28339bac655SJoseph Chen * 1. kernel, ramdisk, and DTB are required (size != 0) 28439bac655SJoseph Chen * 2. load the kernel and DTB at the specified physical address (kernel_addr, 28539bac655SJoseph Chen * dtb_addr) 28639bac655SJoseph Chen * 3. load the vendor ramdisks at ramdisk_addr 28739bac655SJoseph Chen * 4. load the generic ramdisk immediately following the vendor ramdisk in 28839bac655SJoseph Chen * memory 28939bac655SJoseph Chen * 5. load the vendor bootconfig immediately following the generic ramdisk. Add 29039bac655SJoseph Chen * additional bootconfig parameters followed by the bootconfig trailer. 29139bac655SJoseph Chen * 6. set up registers for kernel entry as required by your architecture 29239bac655SJoseph Chen * 7. if the platform has a second stage bootloader jump to it (must be 29339bac655SJoseph Chen * contained outside boot and vendor boot partitions), otherwise 29439bac655SJoseph Chen * jump to kernel_addr 29539bac655SJoseph Chen * 29639bac655SJoseph Chen * When a boot header is of version 0, the structure of boot image is as 29743d520f3SAlex Deymo * follows: 29843d520f3SAlex Deymo * 2999ace3fc8SSebastian Siewior * +-----------------+ 3009ace3fc8SSebastian Siewior * | boot header | 1 page 3019ace3fc8SSebastian Siewior * +-----------------+ 3029ace3fc8SSebastian Siewior * | kernel | n pages 3039ace3fc8SSebastian Siewior * +-----------------+ 3049ace3fc8SSebastian Siewior * | ramdisk | m pages 3059ace3fc8SSebastian Siewior * +-----------------+ 3069ace3fc8SSebastian Siewior * | second stage | o pages 3079ace3fc8SSebastian Siewior * +-----------------+ 3089ace3fc8SSebastian Siewior * 3099ace3fc8SSebastian Siewior * n = (kernel_size + page_size - 1) / page_size 3109ace3fc8SSebastian Siewior * m = (ramdisk_size + page_size - 1) / page_size 3119ace3fc8SSebastian Siewior * o = (second_size + page_size - 1) / page_size 3129ace3fc8SSebastian Siewior * 3139ace3fc8SSebastian Siewior * 0. all entities are page_size aligned in flash 3149ace3fc8SSebastian Siewior * 1. kernel and ramdisk are required (size != 0) 3159ace3fc8SSebastian Siewior * 2. second is optional (second_size == 0 -> no second) 3169ace3fc8SSebastian Siewior * 3. load each element (kernel, ramdisk, second) at 3179ace3fc8SSebastian Siewior * the specified physical address (kernel_addr, etc) 3189ace3fc8SSebastian Siewior * 4. prepare tags at tag_addr. kernel_args[] is 3199ace3fc8SSebastian Siewior * appended to the kernel commandline in the tags. 3209ace3fc8SSebastian Siewior * 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 3219ace3fc8SSebastian Siewior * 6. if second_size != 0: jump to second_addr 3229ace3fc8SSebastian Siewior * else: jump to kernel_addr 3239ace3fc8SSebastian Siewior */ 32443d520f3SAlex Deymo 32543d520f3SAlex Deymo /* When the boot image header has a version of 2, the structure of the boot 32643d520f3SAlex Deymo * image is as follows: 32743d520f3SAlex Deymo * 32843d520f3SAlex Deymo * +---------------------+ 32943d520f3SAlex Deymo * | boot header | 1 page 33043d520f3SAlex Deymo * +---------------------+ 33143d520f3SAlex Deymo * | kernel | n pages 33243d520f3SAlex Deymo * +---------------------+ 33343d520f3SAlex Deymo * | ramdisk | m pages 33443d520f3SAlex Deymo * +---------------------+ 33543d520f3SAlex Deymo * | second stage | o pages 33643d520f3SAlex Deymo * +---------------------+ 33743d520f3SAlex Deymo * | recovery dtbo/acpio | p pages 33843d520f3SAlex Deymo * +---------------------+ 33943d520f3SAlex Deymo * | dtb | q pages 34043d520f3SAlex Deymo * +---------------------+ 34143d520f3SAlex Deymo 34243d520f3SAlex Deymo * n = (kernel_size + page_size - 1) / page_size 34343d520f3SAlex Deymo * m = (ramdisk_size + page_size - 1) / page_size 34443d520f3SAlex Deymo * o = (second_size + page_size - 1) / page_size 34543d520f3SAlex Deymo * p = (recovery_dtbo_size + page_size - 1) / page_size 34643d520f3SAlex Deymo * q = (dtb_size + page_size - 1) / page_size 34743d520f3SAlex Deymo * 34843d520f3SAlex Deymo * 0. all entities are page_size aligned in flash 34943d520f3SAlex Deymo * 1. kernel, ramdisk and DTB are required (size != 0) 35043d520f3SAlex Deymo * 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B 35143d520f3SAlex Deymo * devices(recovery_dtbo_size != 0) 35243d520f3SAlex Deymo * 3. second is optional (second_size == 0 -> no second) 35343d520f3SAlex Deymo * 4. load each element (kernel, ramdisk, second, dtb) at 35443d520f3SAlex Deymo * the specified physical address (kernel_addr, etc) 35543d520f3SAlex Deymo * 5. If booting to recovery mode in a non-A/B device, extract recovery 35643d520f3SAlex Deymo * dtbo/acpio and apply the correct set of overlays on the base device tree 35743d520f3SAlex Deymo * depending on the hardware/product revision. 35843d520f3SAlex Deymo * 6. prepare tags at tag_addr. kernel_args[] is 35943d520f3SAlex Deymo * appended to the kernel commandline in the tags. 36043d520f3SAlex Deymo * 7. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 36143d520f3SAlex Deymo * 8. if second_size != 0: jump to second_addr 36243d520f3SAlex Deymo * else: jump to kernel_addr 36343d520f3SAlex Deymo */ 36443d520f3SAlex Deymo 365745aeb1aSJoseph Chen /* When the boot image header has a version of 3, the structure of the boot 366745aeb1aSJoseph Chen * image is as follows: 367745aeb1aSJoseph Chen * 368745aeb1aSJoseph Chen * +---------------------+ 369745aeb1aSJoseph Chen * | boot header | 4096 bytes 370745aeb1aSJoseph Chen * +---------------------+ 371745aeb1aSJoseph Chen * | kernel | m pages 372745aeb1aSJoseph Chen * +---------------------+ 373745aeb1aSJoseph Chen * | ramdisk | n pages 374745aeb1aSJoseph Chen * +---------------------+ 375745aeb1aSJoseph Chen * 376745aeb1aSJoseph Chen * m = (kernel_size + 4096 - 1) / 4096 377745aeb1aSJoseph Chen * n = (ramdisk_size + 4096 - 1) / 4096 378745aeb1aSJoseph Chen * 379745aeb1aSJoseph Chen * Note that in version 3 of the boot image header, page size is fixed at 4096 bytes. 380745aeb1aSJoseph Chen * 381745aeb1aSJoseph Chen * The structure of the vendor boot image (introduced with version 3 and 382745aeb1aSJoseph Chen * required to be present when a v3 boot image is used) is as follows: 383745aeb1aSJoseph Chen * 384745aeb1aSJoseph Chen * +---------------------+ 385745aeb1aSJoseph Chen * | vendor boot header | o pages 386745aeb1aSJoseph Chen * +---------------------+ 387745aeb1aSJoseph Chen * | vendor ramdisk | p pages 388745aeb1aSJoseph Chen * +---------------------+ 389745aeb1aSJoseph Chen * | dtb | q pages 390745aeb1aSJoseph Chen * +---------------------+ 391745aeb1aSJoseph Chen * 392745aeb1aSJoseph Chen * o = (2112 + page_size - 1) / page_size 393745aeb1aSJoseph Chen * p = (vendor_ramdisk_size + page_size - 1) / page_size 394745aeb1aSJoseph Chen * q = (dtb_size + page_size - 1) / page_size 395745aeb1aSJoseph Chen * 396745aeb1aSJoseph Chen * 0. all entities in the boot image are 4096-byte aligned in flash, all 397745aeb1aSJoseph Chen * entities in the vendor boot image are page_size (determined by the vendor 398745aeb1aSJoseph Chen * and specified in the vendor boot image header) aligned in flash 399745aeb1aSJoseph Chen * 1. kernel, ramdisk, vendor ramdisk, and DTB are required (size != 0) 400745aeb1aSJoseph Chen * 2. load the kernel and DTB at the specified physical address (kernel_addr, 401745aeb1aSJoseph Chen * dtb_addr) 402745aeb1aSJoseph Chen * 3. load the vendor ramdisk at ramdisk_addr 403745aeb1aSJoseph Chen * 4. load the generic ramdisk immediately following the vendor ramdisk in 404745aeb1aSJoseph Chen * memory 405745aeb1aSJoseph Chen * 5. set up registers for kernel entry as required by your architecture 406745aeb1aSJoseph Chen * 6. if the platform has a second stage bootloader jump to it (must be 407745aeb1aSJoseph Chen * contained outside boot and vendor boot partitions), otherwise 408745aeb1aSJoseph Chen * jump to kernel_addr 409745aeb1aSJoseph Chen */ 410745aeb1aSJoseph Chen 4119ace3fc8SSebastian Siewior #endif 412