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