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" 16cf87ffd3SJason Zhu #define ANDROID_PARTITION_MISC "misc" 17cf87ffd3SJason Zhu #define ANDROID_PARTITION_OEM "oem" 18cf87ffd3SJason Zhu #define ANDROID_PARTITION_RECOVERY "recovery" 19cf87ffd3SJason Zhu #define ANDROID_PARTITION_SYSTEM "system" 20cf87ffd3SJason Zhu #define ANDROID_PARTITION_VBMETA "vbmeta" 21cf87ffd3SJason Zhu #define ANDROID_PARTITION_SUPER "super" 22cf87ffd3SJason Zhu 23cf87ffd3SJason Zhu #define ANDROID_ARG_SLOT_SUFFIX "androidboot.slot_suffix=" 24cf87ffd3SJason Zhu #define ANDROID_ARG_ROOT "root=" 25cf87ffd3SJason Zhu #define ANDROID_ARG_SERIALNO "androidboot.serialno=" 26cf87ffd3SJason Zhu #define ANDROID_VERIFY_STATE "androidboot.verifiedbootstate=" 27cf87ffd3SJason Zhu #ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE 28cf87ffd3SJason Zhu #define ANDROID_ARG_FDT_FILENAME "rk-kernel.dtb" 29cf87ffd3SJason Zhu #else 30cf87ffd3SJason Zhu #define ANDROID_ARG_FDT_FILENAME "kernel.dtb" 31cf87ffd3SJason Zhu #endif 32cf87ffd3SJason Zhu #define OEM_UNLOCK_ARG_SIZE 30 33cf87ffd3SJason Zhu #define UUID_SIZE 37 34cf87ffd3SJason Zhu 359ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC "ANDROID!" 36745aeb1aSJoseph Chen #define VENDOR_BOOT_MAGIC "VNDRBOOT" 379ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC_SIZE 8 38745aeb1aSJoseph Chen #define VENDOR_BOOT_MAGIC_SIZE 8 399ace3fc8SSebastian Siewior #define ANDR_BOOT_NAME_SIZE 16 40745aeb1aSJoseph Chen #define VENDOR_BOOT_NAME_SIZE 16 419ace3fc8SSebastian Siewior #define ANDR_BOOT_ARGS_SIZE 512 42210a7176SAlex Deymo #define ANDR_BOOT_EXTRA_ARGS_SIZE 1024 43745aeb1aSJoseph Chen #define VENDOR_BOOT_ARGS_SIZE 2048 44745aeb1aSJoseph Chen #define ANDR_BOOT_IMG_PAGE_SIZE 4096 45745aeb1aSJoseph Chen #define ANDR_BOOT_IMG_HDR_SIZE (ANDR_BOOT_IMG_PAGE_SIZE) 46745aeb1aSJoseph Chen #define TOTAL_BOOT_ARGS_SIZE (ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE + \ 47745aeb1aSJoseph Chen VENDOR_BOOT_ARGS_SIZE + 1) 48*39bac655SJoseph Chen #define VENDOR_BOOT_HDRv3_SIZE 2112 49*39bac655SJoseph Chen #define VENDOR_BOOT_HDRv4_SIZE 2124 50*39bac655SJoseph Chen 51*39bac655SJoseph Chen #define VENDOR_RAMDISK_TYPE_NONE 0 52*39bac655SJoseph Chen #define VENDOR_RAMDISK_TYPE_PLATFORM 1 53*39bac655SJoseph Chen #define VENDOR_RAMDISK_TYPE_RECOVERY 2 54*39bac655SJoseph Chen #define VENDOR_RAMDISK_TYPE_DLKM 3 55*39bac655SJoseph Chen #define VENDOR_RAMDISK_NAME_SIZE 32 56*39bac655SJoseph Chen #define VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE 16 57*39bac655SJoseph Chen 58*39bac655SJoseph Chen /* defined by rockchip but not google, it's adjustable */ 59*39bac655SJoseph Chen #define ANDROID_ADDITION_BOOTCONFIG_PARAMS_MAX_SIZE SZ_8K 609ace3fc8SSebastian Siewior 6143d520f3SAlex Deymo /* 6243d520f3SAlex Deymo * It is expected that callers would explicitly specify which version of the 6343d520f3SAlex Deymo * boot image header they need to use. 6443d520f3SAlex Deymo */ 6543d520f3SAlex Deymo typedef struct andr_img_hdr andr_img_hdr; 6643d520f3SAlex Deymo 6743d520f3SAlex Deymo /* The bootloader expects the structure of andr_img_hdr with header 6843d520f3SAlex Deymo * version 0 to be as follows: */ 699ace3fc8SSebastian Siewior struct andr_img_hdr { 7043d520f3SAlex Deymo /* Must be ANDR_BOOT_MAGIC. */ 719ace3fc8SSebastian Siewior char magic[ANDR_BOOT_MAGIC_SIZE]; 729ace3fc8SSebastian Siewior 739ace3fc8SSebastian Siewior u32 kernel_size; /* size in bytes */ 749ace3fc8SSebastian Siewior u32 kernel_addr; /* physical load addr */ 759ace3fc8SSebastian Siewior 769ace3fc8SSebastian Siewior u32 ramdisk_size; /* size in bytes */ 779ace3fc8SSebastian Siewior u32 ramdisk_addr; /* physical load addr */ 789ace3fc8SSebastian Siewior 799ace3fc8SSebastian Siewior u32 second_size; /* size in bytes */ 809ace3fc8SSebastian Siewior u32 second_addr; /* physical load addr */ 819ace3fc8SSebastian Siewior 829ace3fc8SSebastian Siewior u32 tags_addr; /* physical addr for kernel tags */ 839ace3fc8SSebastian Siewior u32 page_size; /* flash page size we assume */ 8409f4e561SJoseph Chen 8543d520f3SAlex Deymo /* Version of the boot image header. */ 8609f4e561SJoseph Chen u32 header_version; 87210a7176SAlex Deymo 8843d520f3SAlex Deymo /* Operating system version and security patch level. 8943d520f3SAlex Deymo * For version "A.B.C" and patch level "Y-M-D": 9043d520f3SAlex Deymo * (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M) 9143d520f3SAlex Deymo * os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */ 92210a7176SAlex Deymo u32 os_version; 939ace3fc8SSebastian Siewior 949ace3fc8SSebastian Siewior char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */ 959ace3fc8SSebastian Siewior 969ace3fc8SSebastian Siewior char cmdline[ANDR_BOOT_ARGS_SIZE]; 979ace3fc8SSebastian Siewior 989ace3fc8SSebastian Siewior u32 id[8]; /* timestamp / checksum / sha1 / etc */ 99210a7176SAlex Deymo 100210a7176SAlex Deymo /* Supplemental command line data; kept here to maintain 10143d520f3SAlex Deymo * binary compatibility with older versions of mkbootimg. */ 102210a7176SAlex Deymo char extra_cmdline[ANDR_BOOT_EXTRA_ARGS_SIZE]; 10309f4e561SJoseph Chen 104745aeb1aSJoseph Chen /* Fields in boot_img_hdr_v1(Android-9) and newer. */ 10543d520f3SAlex Deymo u32 recovery_dtbo_size; /* size in bytes for recovery DTBO/ACPIO image */ 10643d520f3SAlex Deymo u64 recovery_dtbo_offset; /* offset to recovery dtbo/acpio in boot image */ 10743d520f3SAlex Deymo u32 header_size; 10843d520f3SAlex Deymo 109745aeb1aSJoseph Chen /* Fields in boot_img_hdr_v2(Android-10) and newer. */ 11043d520f3SAlex Deymo u32 dtb_size; /* size in bytes for DTB image */ 11143d520f3SAlex Deymo u64 dtb_addr; /* physical load address for DTB image */ 112745aeb1aSJoseph Chen 113745aeb1aSJoseph Chen /* 114*39bac655SJoseph Chen * [Rockchip compatibility Android v3] 115745aeb1aSJoseph Chen * 116745aeb1aSJoseph Chen * boot_img_hdr_v3(Android-11) is not compatible with boot_img_hdr_v012, 117*39bac655SJoseph Chen * we have to partly merge fields from boot_img_hdr_v34 and vendor_boot_img_hdr_v34 118745aeb1aSJoseph Chen * into this structure to compatible with boot_img_hdr_v012. 119745aeb1aSJoseph Chen */ 120e7498cb0SJoseph Chen u32 boot_ramdisk_size; /* size in bytes */ 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; 125*39bac655SJoseph Chen 126*39bac655SJoseph Chen /* 127*39bac655SJoseph Chen * [Rockchip compatibility Android v4] 128*39bac655SJoseph Chen * 129*39bac655SJoseph Chen * boot_img_hdr_v4(Android-12) is not compatible with boot_img_hdr_v012, 130*39bac655SJoseph Chen * we have to partly merge fields from boot_img_hdr_v34 and vendor_boot_img_hdr_v34 131*39bac655SJoseph Chen * into this structure to compatible with boot_img_hdr_v012. 132*39bac655SJoseph Chen */ 133*39bac655SJoseph Chen u32 vendor_ramdisk_table_size; 134*39bac655SJoseph Chen u32 vendor_ramdisk_table_entry_num; 135*39bac655SJoseph Chen u32 vendor_ramdisk_table_entry_size; 136*39bac655SJoseph Chen u32 vendor_bootconfig_size; /* size in bytes for bootconfig image */ 137*39bac655SJoseph Chen 138745aeb1aSJoseph Chen /* 139745aeb1aSJoseph Chen * Don't define 'char total_cmdline[TOTAL_BOOT_ARGS_SIZE]' to avoid 140745aeb1aSJoseph Chen * this structrue is over size than page_size. 141745aeb1aSJoseph Chen */ 142745aeb1aSJoseph Chen char *total_cmdline; 143745aeb1aSJoseph Chen } __attribute__((packed)); 144745aeb1aSJoseph Chen 145*39bac655SJoseph Chen struct boot_img_hdr_v34 { 146745aeb1aSJoseph Chen /* Must be ANDR_BOOT_MAGIC. */ 147745aeb1aSJoseph Chen uint8_t magic[ANDR_BOOT_MAGIC_SIZE]; 148745aeb1aSJoseph Chen 149745aeb1aSJoseph Chen uint32_t kernel_size; /* size in bytes */ 150745aeb1aSJoseph Chen uint32_t ramdisk_size; /* size in bytes */ 151745aeb1aSJoseph Chen 152745aeb1aSJoseph Chen /* Operating system version and security patch level. 153745aeb1aSJoseph Chen * For version "A.B.C" and patch level "Y-M-D": 154745aeb1aSJoseph Chen * (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M) 155745aeb1aSJoseph Chen * os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */ 156745aeb1aSJoseph Chen uint32_t os_version; 157745aeb1aSJoseph Chen 158745aeb1aSJoseph Chen uint32_t header_size; 159745aeb1aSJoseph Chen 160745aeb1aSJoseph Chen uint32_t reserved[4]; 161745aeb1aSJoseph Chen 162745aeb1aSJoseph Chen uint32_t header_version; 163745aeb1aSJoseph Chen 164745aeb1aSJoseph Chen uint8_t cmdline[ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE]; 165745aeb1aSJoseph Chen } __attribute__((packed)); 166745aeb1aSJoseph Chen 167*39bac655SJoseph Chen struct vendor_boot_img_hdr_v34 { 168745aeb1aSJoseph Chen /* Must be VENDOR_BOOT_MAGIC. */ 169745aeb1aSJoseph Chen uint8_t magic[VENDOR_BOOT_MAGIC_SIZE]; 170745aeb1aSJoseph Chen 171745aeb1aSJoseph Chen /* Version of the vendor boot image header. */ 172745aeb1aSJoseph Chen uint32_t header_version; 173745aeb1aSJoseph Chen 174745aeb1aSJoseph Chen uint32_t page_size; /* flash page size we assume */ 175745aeb1aSJoseph Chen 176745aeb1aSJoseph Chen uint32_t kernel_addr; /* physical load addr */ 177745aeb1aSJoseph Chen uint32_t ramdisk_addr; /* physical load addr */ 178745aeb1aSJoseph Chen 179745aeb1aSJoseph Chen uint32_t vendor_ramdisk_size; /* size in bytes */ 180745aeb1aSJoseph Chen 181745aeb1aSJoseph Chen uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE]; 182745aeb1aSJoseph Chen 183745aeb1aSJoseph Chen uint32_t tags_addr; /* physical addr for kernel tags (if required) */ 184745aeb1aSJoseph Chen uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */ 185745aeb1aSJoseph Chen 186745aeb1aSJoseph Chen uint32_t header_size; 187745aeb1aSJoseph Chen 188745aeb1aSJoseph Chen uint32_t dtb_size; /* size in bytes for DTB image */ 189745aeb1aSJoseph Chen uint64_t dtb_addr; /* physical load address for DTB image */ 190*39bac655SJoseph Chen 191*39bac655SJoseph Chen /* new for v4 */ 192*39bac655SJoseph Chen uint32_t vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk table */ 193*39bac655SJoseph Chen uint32_t vendor_ramdisk_table_entry_num; /* number of entries in the vendor ramdisk table */ 194*39bac655SJoseph Chen uint32_t vendor_ramdisk_table_entry_size; 195*39bac655SJoseph Chen uint32_t vendor_bootconfig_size; /* size in bytes for bootconfig image */ 196210a7176SAlex Deymo } __attribute__((packed)); 1979ace3fc8SSebastian Siewior 198*39bac655SJoseph Chen struct vendor_ramdisk_table_entry_v4 { 199*39bac655SJoseph Chen uint32_t ramdisk_size; /* size in bytes for the ramdisk image */ 200*39bac655SJoseph Chen uint32_t ramdisk_offset; /* offset to the ramdisk image in vendor ramdisk section */ 201*39bac655SJoseph Chen uint32_t ramdisk_type; /* type of the ramdisk */ 202*39bac655SJoseph Chen uint8_t ramdisk_name[VENDOR_RAMDISK_NAME_SIZE]; /* asciiz ramdisk name */ 203*39bac655SJoseph Chen 204*39bac655SJoseph Chen // Hardware identifiers describing the board, soc or platform which this 205*39bac655SJoseph Chen // ramdisk is intended to be loaded on. 206*39bac655SJoseph Chen uint32_t board_id[VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE]; 207*39bac655SJoseph Chen } __attribute__((packed)); 208*39bac655SJoseph Chen 209*39bac655SJoseph Chen /* When the boot image header has a version of 4, the structure of the boot 210*39bac655SJoseph Chen * image is the same as version 3: 211*39bac655SJoseph Chen * 212*39bac655SJoseph Chen * +---------------------+ 213*39bac655SJoseph Chen * | boot header | 4096 bytes 214*39bac655SJoseph Chen * +---------------------+ 215*39bac655SJoseph Chen * | kernel | m pages 216*39bac655SJoseph Chen * +---------------------+ 217*39bac655SJoseph Chen * | ramdisk | n pages 218*39bac655SJoseph Chen * +---------------------+ 219*39bac655SJoseph Chen * 220*39bac655SJoseph Chen * m = (kernel_size + 4096 - 1) / 4096 221*39bac655SJoseph Chen * n = (ramdisk_size + 4096 - 1) / 4096 222*39bac655SJoseph Chen * 223*39bac655SJoseph Chen * Note that in version 4 of the boot image header, page size is fixed at 4096 224*39bac655SJoseph Chen * bytes. 225*39bac655SJoseph Chen * 226*39bac655SJoseph Chen * The structure of the vendor boot image version 4, which is required to be 227*39bac655SJoseph Chen * present when a version 4 boot image is used, is as follows: 228*39bac655SJoseph Chen * 229*39bac655SJoseph Chen * +------------------------+ 230*39bac655SJoseph Chen * | vendor boot header | o pages 231*39bac655SJoseph Chen * +------------------------+ 232*39bac655SJoseph Chen * | vendor ramdisk section | p pages 233*39bac655SJoseph Chen * +------------------------+ 234*39bac655SJoseph Chen * | dtb | q pages 235*39bac655SJoseph Chen * +------------------------+ 236*39bac655SJoseph Chen * | vendor ramdisk table | r pages 237*39bac655SJoseph Chen * +------------------------+ 238*39bac655SJoseph Chen * | bootconfig | s pages 239*39bac655SJoseph Chen * +------------------------+ 240*39bac655SJoseph Chen * 241*39bac655SJoseph Chen * o = (2124 + page_size - 1) / page_size 242*39bac655SJoseph Chen * p = (vendor_ramdisk_size + page_size - 1) / page_size 243*39bac655SJoseph Chen * q = (dtb_size + page_size - 1) / page_size 244*39bac655SJoseph Chen * r = (vendor_ramdisk_table_size + page_size - 1) / page_size 245*39bac655SJoseph Chen * s = (vendor_bootconfig_size + page_size - 1) / page_size 246*39bac655SJoseph Chen * 247*39bac655SJoseph Chen * Note that in version 4 of the vendor boot image, multiple vendor ramdisks can 248*39bac655SJoseph Chen * be included in the vendor boot image. The bootloader can select a subset of 249*39bac655SJoseph Chen * ramdisks to load at runtime. To help the bootloader select the ramdisks, each 250*39bac655SJoseph Chen * ramdisk is tagged with a type tag and a set of hardware identifiers 251*39bac655SJoseph Chen * describing the board, soc or platform that this ramdisk is intended for. 252*39bac655SJoseph Chen * 253*39bac655SJoseph Chen * The vendor ramdisk section is consist of multiple ramdisk images concatenated 254*39bac655SJoseph Chen * one after another, and vendor_ramdisk_size is the size of the section, which 255*39bac655SJoseph Chen * is the total size of all the ramdisks included in the vendor boot image. 256*39bac655SJoseph Chen * 257*39bac655SJoseph Chen * The vendor ramdisk table holds the size, offset, type, name and hardware 258*39bac655SJoseph Chen * identifiers of each ramdisk. The type field denotes the type of its content. 259*39bac655SJoseph Chen * The hardware identifiers are specified in the board_id field in each table 260*39bac655SJoseph Chen * entry. The board_id field is consist of a vector of unsigned integer words, 261*39bac655SJoseph Chen * and the encoding scheme is defined by the hardware vendor. 262*39bac655SJoseph Chen * 263*39bac655SJoseph Chen * For the different type of ramdisks, there are: 264*39bac655SJoseph Chen * - VENDOR_RAMDISK_TYPE_NONE indicates the value is unspecified. 265*39bac655SJoseph Chen * - VENDOR_RAMDISK_TYPE_PLATFORM ramdisk contains platform specific bits. 266*39bac655SJoseph Chen * - VENDOR_RAMDISK_TYPE_RECOVERY ramdisk contains recovery resources. 267*39bac655SJoseph Chen * - VENDOR_RAMDISK_TYPE_DLKM ramdisk contains dynamic loadable kernel 268*39bac655SJoseph Chen * modules. 269*39bac655SJoseph Chen * 270*39bac655SJoseph Chen * Version 4 of the vendor boot image also adds a bootconfig section to the end 271*39bac655SJoseph Chen * of the image. This section contains Boot Configuration parameters known at 272*39bac655SJoseph Chen * build time. The bootloader is responsible for placing this section directly 273*39bac655SJoseph Chen * after the boot image ramdisk, followed by the bootconfig trailer, before 274*39bac655SJoseph Chen * entering the kernel. 275*39bac655SJoseph Chen * 276*39bac655SJoseph Chen * 0. all entities in the boot image are 4096-byte aligned in flash, all 277*39bac655SJoseph Chen * entities in the vendor boot image are page_size (determined by the vendor 278*39bac655SJoseph Chen * and specified in the vendor boot image header) aligned in flash 279*39bac655SJoseph Chen * 1. kernel, ramdisk, and DTB are required (size != 0) 280*39bac655SJoseph Chen * 2. load the kernel and DTB at the specified physical address (kernel_addr, 281*39bac655SJoseph Chen * dtb_addr) 282*39bac655SJoseph Chen * 3. load the vendor ramdisks at ramdisk_addr 283*39bac655SJoseph Chen * 4. load the generic ramdisk immediately following the vendor ramdisk in 284*39bac655SJoseph Chen * memory 285*39bac655SJoseph Chen * 5. load the vendor bootconfig immediately following the generic ramdisk. Add 286*39bac655SJoseph Chen * additional bootconfig parameters followed by the bootconfig trailer. 287*39bac655SJoseph Chen * 6. set up registers for kernel entry as required by your architecture 288*39bac655SJoseph Chen * 7. if the platform has a second stage bootloader jump to it (must be 289*39bac655SJoseph Chen * contained outside boot and vendor boot partitions), otherwise 290*39bac655SJoseph Chen * jump to kernel_addr 291*39bac655SJoseph Chen * 292*39bac655SJoseph Chen * When a boot header is of version 0, the structure of boot image is as 29343d520f3SAlex Deymo * follows: 29443d520f3SAlex Deymo * 2959ace3fc8SSebastian Siewior * +-----------------+ 2969ace3fc8SSebastian Siewior * | boot header | 1 page 2979ace3fc8SSebastian Siewior * +-----------------+ 2989ace3fc8SSebastian Siewior * | kernel | n pages 2999ace3fc8SSebastian Siewior * +-----------------+ 3009ace3fc8SSebastian Siewior * | ramdisk | m pages 3019ace3fc8SSebastian Siewior * +-----------------+ 3029ace3fc8SSebastian Siewior * | second stage | o pages 3039ace3fc8SSebastian Siewior * +-----------------+ 3049ace3fc8SSebastian Siewior * 3059ace3fc8SSebastian Siewior * n = (kernel_size + page_size - 1) / page_size 3069ace3fc8SSebastian Siewior * m = (ramdisk_size + page_size - 1) / page_size 3079ace3fc8SSebastian Siewior * o = (second_size + page_size - 1) / page_size 3089ace3fc8SSebastian Siewior * 3099ace3fc8SSebastian Siewior * 0. all entities are page_size aligned in flash 3109ace3fc8SSebastian Siewior * 1. kernel and ramdisk are required (size != 0) 3119ace3fc8SSebastian Siewior * 2. second is optional (second_size == 0 -> no second) 3129ace3fc8SSebastian Siewior * 3. load each element (kernel, ramdisk, second) at 3139ace3fc8SSebastian Siewior * the specified physical address (kernel_addr, etc) 3149ace3fc8SSebastian Siewior * 4. prepare tags at tag_addr. kernel_args[] is 3159ace3fc8SSebastian Siewior * appended to the kernel commandline in the tags. 3169ace3fc8SSebastian Siewior * 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 3179ace3fc8SSebastian Siewior * 6. if second_size != 0: jump to second_addr 3189ace3fc8SSebastian Siewior * else: jump to kernel_addr 3199ace3fc8SSebastian Siewior */ 32043d520f3SAlex Deymo 32143d520f3SAlex Deymo /* When the boot image header has a version of 2, the structure of the boot 32243d520f3SAlex Deymo * image is as follows: 32343d520f3SAlex Deymo * 32443d520f3SAlex Deymo * +---------------------+ 32543d520f3SAlex Deymo * | boot header | 1 page 32643d520f3SAlex Deymo * +---------------------+ 32743d520f3SAlex Deymo * | kernel | n pages 32843d520f3SAlex Deymo * +---------------------+ 32943d520f3SAlex Deymo * | ramdisk | m pages 33043d520f3SAlex Deymo * +---------------------+ 33143d520f3SAlex Deymo * | second stage | o pages 33243d520f3SAlex Deymo * +---------------------+ 33343d520f3SAlex Deymo * | recovery dtbo/acpio | p pages 33443d520f3SAlex Deymo * +---------------------+ 33543d520f3SAlex Deymo * | dtb | q pages 33643d520f3SAlex Deymo * +---------------------+ 33743d520f3SAlex Deymo 33843d520f3SAlex Deymo * n = (kernel_size + page_size - 1) / page_size 33943d520f3SAlex Deymo * m = (ramdisk_size + page_size - 1) / page_size 34043d520f3SAlex Deymo * o = (second_size + page_size - 1) / page_size 34143d520f3SAlex Deymo * p = (recovery_dtbo_size + page_size - 1) / page_size 34243d520f3SAlex Deymo * q = (dtb_size + page_size - 1) / page_size 34343d520f3SAlex Deymo * 34443d520f3SAlex Deymo * 0. all entities are page_size aligned in flash 34543d520f3SAlex Deymo * 1. kernel, ramdisk and DTB are required (size != 0) 34643d520f3SAlex Deymo * 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B 34743d520f3SAlex Deymo * devices(recovery_dtbo_size != 0) 34843d520f3SAlex Deymo * 3. second is optional (second_size == 0 -> no second) 34943d520f3SAlex Deymo * 4. load each element (kernel, ramdisk, second, dtb) at 35043d520f3SAlex Deymo * the specified physical address (kernel_addr, etc) 35143d520f3SAlex Deymo * 5. If booting to recovery mode in a non-A/B device, extract recovery 35243d520f3SAlex Deymo * dtbo/acpio and apply the correct set of overlays on the base device tree 35343d520f3SAlex Deymo * depending on the hardware/product revision. 35443d520f3SAlex Deymo * 6. prepare tags at tag_addr. kernel_args[] is 35543d520f3SAlex Deymo * appended to the kernel commandline in the tags. 35643d520f3SAlex Deymo * 7. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 35743d520f3SAlex Deymo * 8. if second_size != 0: jump to second_addr 35843d520f3SAlex Deymo * else: jump to kernel_addr 35943d520f3SAlex Deymo */ 36043d520f3SAlex Deymo 361745aeb1aSJoseph Chen /* When the boot image header has a version of 3, the structure of the boot 362745aeb1aSJoseph Chen * image is as follows: 363745aeb1aSJoseph Chen * 364745aeb1aSJoseph Chen * +---------------------+ 365745aeb1aSJoseph Chen * | boot header | 4096 bytes 366745aeb1aSJoseph Chen * +---------------------+ 367745aeb1aSJoseph Chen * | kernel | m pages 368745aeb1aSJoseph Chen * +---------------------+ 369745aeb1aSJoseph Chen * | ramdisk | n pages 370745aeb1aSJoseph Chen * +---------------------+ 371745aeb1aSJoseph Chen * 372745aeb1aSJoseph Chen * m = (kernel_size + 4096 - 1) / 4096 373745aeb1aSJoseph Chen * n = (ramdisk_size + 4096 - 1) / 4096 374745aeb1aSJoseph Chen * 375745aeb1aSJoseph Chen * Note that in version 3 of the boot image header, page size is fixed at 4096 bytes. 376745aeb1aSJoseph Chen * 377745aeb1aSJoseph Chen * The structure of the vendor boot image (introduced with version 3 and 378745aeb1aSJoseph Chen * required to be present when a v3 boot image is used) is as follows: 379745aeb1aSJoseph Chen * 380745aeb1aSJoseph Chen * +---------------------+ 381745aeb1aSJoseph Chen * | vendor boot header | o pages 382745aeb1aSJoseph Chen * +---------------------+ 383745aeb1aSJoseph Chen * | vendor ramdisk | p pages 384745aeb1aSJoseph Chen * +---------------------+ 385745aeb1aSJoseph Chen * | dtb | q pages 386745aeb1aSJoseph Chen * +---------------------+ 387745aeb1aSJoseph Chen * 388745aeb1aSJoseph Chen * o = (2112 + page_size - 1) / page_size 389745aeb1aSJoseph Chen * p = (vendor_ramdisk_size + page_size - 1) / page_size 390745aeb1aSJoseph Chen * q = (dtb_size + page_size - 1) / page_size 391745aeb1aSJoseph Chen * 392745aeb1aSJoseph Chen * 0. all entities in the boot image are 4096-byte aligned in flash, all 393745aeb1aSJoseph Chen * entities in the vendor boot image are page_size (determined by the vendor 394745aeb1aSJoseph Chen * and specified in the vendor boot image header) aligned in flash 395745aeb1aSJoseph Chen * 1. kernel, ramdisk, vendor ramdisk, and DTB are required (size != 0) 396745aeb1aSJoseph Chen * 2. load the kernel and DTB at the specified physical address (kernel_addr, 397745aeb1aSJoseph Chen * dtb_addr) 398745aeb1aSJoseph Chen * 3. load the vendor ramdisk at ramdisk_addr 399745aeb1aSJoseph Chen * 4. load the generic ramdisk immediately following the vendor ramdisk in 400745aeb1aSJoseph Chen * memory 401745aeb1aSJoseph Chen * 5. set up registers for kernel entry as required by your architecture 402745aeb1aSJoseph Chen * 6. if the platform has a second stage bootloader jump to it (must be 403745aeb1aSJoseph Chen * contained outside boot and vendor boot partitions), otherwise 404745aeb1aSJoseph Chen * jump to kernel_addr 405745aeb1aSJoseph Chen */ 406745aeb1aSJoseph Chen 4079ace3fc8SSebastian Siewior #endif 408