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 14*cf87ffd3SJason Zhu #define ANDROID_PARTITION_BOOT "boot" 15*cf87ffd3SJason Zhu #define ANDROID_PARTITION_VENDOR_BOOT "vendor_boot" 16*cf87ffd3SJason Zhu #define ANDROID_PARTITION_MISC "misc" 17*cf87ffd3SJason Zhu #define ANDROID_PARTITION_OEM "oem" 18*cf87ffd3SJason Zhu #define ANDROID_PARTITION_RECOVERY "recovery" 19*cf87ffd3SJason Zhu #define ANDROID_PARTITION_SYSTEM "system" 20*cf87ffd3SJason Zhu #define ANDROID_PARTITION_VBMETA "vbmeta" 21*cf87ffd3SJason Zhu #define ANDROID_PARTITION_SUPER "super" 22*cf87ffd3SJason Zhu 23*cf87ffd3SJason Zhu #define ANDROID_ARG_SLOT_SUFFIX "androidboot.slot_suffix=" 24*cf87ffd3SJason Zhu #define ANDROID_ARG_ROOT "root=" 25*cf87ffd3SJason Zhu #define ANDROID_ARG_SERIALNO "androidboot.serialno=" 26*cf87ffd3SJason Zhu #define ANDROID_VERIFY_STATE "androidboot.verifiedbootstate=" 27*cf87ffd3SJason Zhu #ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE 28*cf87ffd3SJason Zhu #define ANDROID_ARG_FDT_FILENAME "rk-kernel.dtb" 29*cf87ffd3SJason Zhu #else 30*cf87ffd3SJason Zhu #define ANDROID_ARG_FDT_FILENAME "kernel.dtb" 31*cf87ffd3SJason Zhu #endif 32*cf87ffd3SJason Zhu #define OEM_UNLOCK_ARG_SIZE 30 33*cf87ffd3SJason Zhu #define UUID_SIZE 37 34*cf87ffd3SJason 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) 48745aeb1aSJoseph Chen #define VENDOR_BOOT_HDR_SIZE 2112 499ace3fc8SSebastian Siewior 5043d520f3SAlex Deymo /* 5143d520f3SAlex Deymo * It is expected that callers would explicitly specify which version of the 5243d520f3SAlex Deymo * boot image header they need to use. 5343d520f3SAlex Deymo */ 5443d520f3SAlex Deymo typedef struct andr_img_hdr andr_img_hdr; 5543d520f3SAlex Deymo 5643d520f3SAlex Deymo /* The bootloader expects the structure of andr_img_hdr with header 5743d520f3SAlex Deymo * version 0 to be as follows: */ 589ace3fc8SSebastian Siewior struct andr_img_hdr { 5943d520f3SAlex Deymo /* Must be ANDR_BOOT_MAGIC. */ 609ace3fc8SSebastian Siewior char magic[ANDR_BOOT_MAGIC_SIZE]; 619ace3fc8SSebastian Siewior 629ace3fc8SSebastian Siewior u32 kernel_size; /* size in bytes */ 639ace3fc8SSebastian Siewior u32 kernel_addr; /* physical load addr */ 649ace3fc8SSebastian Siewior 659ace3fc8SSebastian Siewior u32 ramdisk_size; /* size in bytes */ 669ace3fc8SSebastian Siewior u32 ramdisk_addr; /* physical load addr */ 679ace3fc8SSebastian Siewior 689ace3fc8SSebastian Siewior u32 second_size; /* size in bytes */ 699ace3fc8SSebastian Siewior u32 second_addr; /* physical load addr */ 709ace3fc8SSebastian Siewior 719ace3fc8SSebastian Siewior u32 tags_addr; /* physical addr for kernel tags */ 729ace3fc8SSebastian Siewior u32 page_size; /* flash page size we assume */ 7309f4e561SJoseph Chen 7443d520f3SAlex Deymo /* Version of the boot image header. */ 7509f4e561SJoseph Chen u32 header_version; 76210a7176SAlex Deymo 7743d520f3SAlex Deymo /* Operating system version and security patch level. 7843d520f3SAlex Deymo * For version "A.B.C" and patch level "Y-M-D": 7943d520f3SAlex Deymo * (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M) 8043d520f3SAlex Deymo * os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */ 81210a7176SAlex Deymo u32 os_version; 829ace3fc8SSebastian Siewior 839ace3fc8SSebastian Siewior char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */ 849ace3fc8SSebastian Siewior 859ace3fc8SSebastian Siewior char cmdline[ANDR_BOOT_ARGS_SIZE]; 869ace3fc8SSebastian Siewior 879ace3fc8SSebastian Siewior u32 id[8]; /* timestamp / checksum / sha1 / etc */ 88210a7176SAlex Deymo 89210a7176SAlex Deymo /* Supplemental command line data; kept here to maintain 9043d520f3SAlex Deymo * binary compatibility with older versions of mkbootimg. */ 91210a7176SAlex Deymo char extra_cmdline[ANDR_BOOT_EXTRA_ARGS_SIZE]; 9209f4e561SJoseph Chen 93745aeb1aSJoseph Chen /* Fields in boot_img_hdr_v1(Android-9) and newer. */ 9443d520f3SAlex Deymo u32 recovery_dtbo_size; /* size in bytes for recovery DTBO/ACPIO image */ 9543d520f3SAlex Deymo u64 recovery_dtbo_offset; /* offset to recovery dtbo/acpio in boot image */ 9643d520f3SAlex Deymo u32 header_size; 9743d520f3SAlex Deymo 98745aeb1aSJoseph Chen /* Fields in boot_img_hdr_v2(Android-10) and newer. */ 9943d520f3SAlex Deymo u32 dtb_size; /* size in bytes for DTB image */ 10043d520f3SAlex Deymo u64 dtb_addr; /* physical load address for DTB image */ 101745aeb1aSJoseph Chen 102745aeb1aSJoseph Chen /* 103745aeb1aSJoseph Chen * [Rockchip compatibility] 104745aeb1aSJoseph Chen * 105745aeb1aSJoseph Chen * boot_img_hdr_v3(Android-11) is not compatible with boot_img_hdr_v012, 106745aeb1aSJoseph Chen * we have to partly merge fields from boot_img_hdr_v3 and vendor_boot_img_hdr_v3 107745aeb1aSJoseph Chen * into this structure to compatible with boot_img_hdr_v012. 108745aeb1aSJoseph Chen */ 109e7498cb0SJoseph Chen u32 boot_ramdisk_size; /* size in bytes */ 110745aeb1aSJoseph Chen u32 vendor_ramdisk_size; /* size in bytes */ 111745aeb1aSJoseph Chen u32 vendor_page_size; 112745aeb1aSJoseph Chen u32 vendor_header_version; 113745aeb1aSJoseph Chen u32 vendor_header_size; 114745aeb1aSJoseph Chen /* 115745aeb1aSJoseph Chen * Don't define 'char total_cmdline[TOTAL_BOOT_ARGS_SIZE]' to avoid 116745aeb1aSJoseph Chen * this structrue is over size than page_size. 117745aeb1aSJoseph Chen */ 118745aeb1aSJoseph Chen char *total_cmdline; 119745aeb1aSJoseph Chen } __attribute__((packed)); 120745aeb1aSJoseph Chen 121745aeb1aSJoseph Chen struct boot_img_hdr_v3 { 122745aeb1aSJoseph Chen /* Must be ANDR_BOOT_MAGIC. */ 123745aeb1aSJoseph Chen uint8_t magic[ANDR_BOOT_MAGIC_SIZE]; 124745aeb1aSJoseph Chen 125745aeb1aSJoseph Chen uint32_t kernel_size; /* size in bytes */ 126745aeb1aSJoseph Chen uint32_t ramdisk_size; /* size in bytes */ 127745aeb1aSJoseph Chen 128745aeb1aSJoseph Chen /* Operating system version and security patch level. 129745aeb1aSJoseph Chen * For version "A.B.C" and patch level "Y-M-D": 130745aeb1aSJoseph Chen * (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M) 131745aeb1aSJoseph Chen * os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */ 132745aeb1aSJoseph Chen uint32_t os_version; 133745aeb1aSJoseph Chen 134745aeb1aSJoseph Chen uint32_t header_size; 135745aeb1aSJoseph Chen 136745aeb1aSJoseph Chen uint32_t reserved[4]; 137745aeb1aSJoseph Chen 138745aeb1aSJoseph Chen uint32_t header_version; 139745aeb1aSJoseph Chen 140745aeb1aSJoseph Chen uint8_t cmdline[ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE]; 141745aeb1aSJoseph Chen } __attribute__((packed)); 142745aeb1aSJoseph Chen 143745aeb1aSJoseph Chen struct vendor_boot_img_hdr_v3 { 144745aeb1aSJoseph Chen /* Must be VENDOR_BOOT_MAGIC. */ 145745aeb1aSJoseph Chen uint8_t magic[VENDOR_BOOT_MAGIC_SIZE]; 146745aeb1aSJoseph Chen 147745aeb1aSJoseph Chen /* Version of the vendor boot image header. */ 148745aeb1aSJoseph Chen uint32_t header_version; 149745aeb1aSJoseph Chen 150745aeb1aSJoseph Chen uint32_t page_size; /* flash page size we assume */ 151745aeb1aSJoseph Chen 152745aeb1aSJoseph Chen uint32_t kernel_addr; /* physical load addr */ 153745aeb1aSJoseph Chen uint32_t ramdisk_addr; /* physical load addr */ 154745aeb1aSJoseph Chen 155745aeb1aSJoseph Chen uint32_t vendor_ramdisk_size; /* size in bytes */ 156745aeb1aSJoseph Chen 157745aeb1aSJoseph Chen uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE]; 158745aeb1aSJoseph Chen 159745aeb1aSJoseph Chen uint32_t tags_addr; /* physical addr for kernel tags (if required) */ 160745aeb1aSJoseph Chen uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */ 161745aeb1aSJoseph Chen 162745aeb1aSJoseph Chen uint32_t header_size; 163745aeb1aSJoseph Chen 164745aeb1aSJoseph Chen uint32_t dtb_size; /* size in bytes for DTB image */ 165745aeb1aSJoseph Chen uint64_t dtb_addr; /* physical load address for DTB image */ 166210a7176SAlex Deymo } __attribute__((packed)); 1679ace3fc8SSebastian Siewior 16843d520f3SAlex Deymo /* When a boot header is of version 0, the structure of boot image is as 16943d520f3SAlex Deymo * follows: 17043d520f3SAlex Deymo * 1719ace3fc8SSebastian Siewior * +-----------------+ 1729ace3fc8SSebastian Siewior * | boot header | 1 page 1739ace3fc8SSebastian Siewior * +-----------------+ 1749ace3fc8SSebastian Siewior * | kernel | n pages 1759ace3fc8SSebastian Siewior * +-----------------+ 1769ace3fc8SSebastian Siewior * | ramdisk | m pages 1779ace3fc8SSebastian Siewior * +-----------------+ 1789ace3fc8SSebastian Siewior * | second stage | o pages 1799ace3fc8SSebastian Siewior * +-----------------+ 1809ace3fc8SSebastian Siewior * 1819ace3fc8SSebastian Siewior * n = (kernel_size + page_size - 1) / page_size 1829ace3fc8SSebastian Siewior * m = (ramdisk_size + page_size - 1) / page_size 1839ace3fc8SSebastian Siewior * o = (second_size + page_size - 1) / page_size 1849ace3fc8SSebastian Siewior * 1859ace3fc8SSebastian Siewior * 0. all entities are page_size aligned in flash 1869ace3fc8SSebastian Siewior * 1. kernel and ramdisk are required (size != 0) 1879ace3fc8SSebastian Siewior * 2. second is optional (second_size == 0 -> no second) 1889ace3fc8SSebastian Siewior * 3. load each element (kernel, ramdisk, second) at 1899ace3fc8SSebastian Siewior * the specified physical address (kernel_addr, etc) 1909ace3fc8SSebastian Siewior * 4. prepare tags at tag_addr. kernel_args[] is 1919ace3fc8SSebastian Siewior * appended to the kernel commandline in the tags. 1929ace3fc8SSebastian Siewior * 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 1939ace3fc8SSebastian Siewior * 6. if second_size != 0: jump to second_addr 1949ace3fc8SSebastian Siewior * else: jump to kernel_addr 1959ace3fc8SSebastian Siewior */ 19643d520f3SAlex Deymo 19743d520f3SAlex Deymo /* When the boot image header has a version of 2, the structure of the boot 19843d520f3SAlex Deymo * image is as follows: 19943d520f3SAlex Deymo * 20043d520f3SAlex Deymo * +---------------------+ 20143d520f3SAlex Deymo * | boot header | 1 page 20243d520f3SAlex Deymo * +---------------------+ 20343d520f3SAlex Deymo * | kernel | n pages 20443d520f3SAlex Deymo * +---------------------+ 20543d520f3SAlex Deymo * | ramdisk | m pages 20643d520f3SAlex Deymo * +---------------------+ 20743d520f3SAlex Deymo * | second stage | o pages 20843d520f3SAlex Deymo * +---------------------+ 20943d520f3SAlex Deymo * | recovery dtbo/acpio | p pages 21043d520f3SAlex Deymo * +---------------------+ 21143d520f3SAlex Deymo * | dtb | q pages 21243d520f3SAlex Deymo * +---------------------+ 21343d520f3SAlex Deymo 21443d520f3SAlex Deymo * n = (kernel_size + page_size - 1) / page_size 21543d520f3SAlex Deymo * m = (ramdisk_size + page_size - 1) / page_size 21643d520f3SAlex Deymo * o = (second_size + page_size - 1) / page_size 21743d520f3SAlex Deymo * p = (recovery_dtbo_size + page_size - 1) / page_size 21843d520f3SAlex Deymo * q = (dtb_size + page_size - 1) / page_size 21943d520f3SAlex Deymo * 22043d520f3SAlex Deymo * 0. all entities are page_size aligned in flash 22143d520f3SAlex Deymo * 1. kernel, ramdisk and DTB are required (size != 0) 22243d520f3SAlex Deymo * 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B 22343d520f3SAlex Deymo * devices(recovery_dtbo_size != 0) 22443d520f3SAlex Deymo * 3. second is optional (second_size == 0 -> no second) 22543d520f3SAlex Deymo * 4. load each element (kernel, ramdisk, second, dtb) at 22643d520f3SAlex Deymo * the specified physical address (kernel_addr, etc) 22743d520f3SAlex Deymo * 5. If booting to recovery mode in a non-A/B device, extract recovery 22843d520f3SAlex Deymo * dtbo/acpio and apply the correct set of overlays on the base device tree 22943d520f3SAlex Deymo * depending on the hardware/product revision. 23043d520f3SAlex Deymo * 6. prepare tags at tag_addr. kernel_args[] is 23143d520f3SAlex Deymo * appended to the kernel commandline in the tags. 23243d520f3SAlex Deymo * 7. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 23343d520f3SAlex Deymo * 8. if second_size != 0: jump to second_addr 23443d520f3SAlex Deymo * else: jump to kernel_addr 23543d520f3SAlex Deymo */ 23643d520f3SAlex Deymo 237745aeb1aSJoseph Chen /* When the boot image header has a version of 3, the structure of the boot 238745aeb1aSJoseph Chen * image is as follows: 239745aeb1aSJoseph Chen * 240745aeb1aSJoseph Chen * +---------------------+ 241745aeb1aSJoseph Chen * | boot header | 4096 bytes 242745aeb1aSJoseph Chen * +---------------------+ 243745aeb1aSJoseph Chen * | kernel | m pages 244745aeb1aSJoseph Chen * +---------------------+ 245745aeb1aSJoseph Chen * | ramdisk | n pages 246745aeb1aSJoseph Chen * +---------------------+ 247745aeb1aSJoseph Chen * 248745aeb1aSJoseph Chen * m = (kernel_size + 4096 - 1) / 4096 249745aeb1aSJoseph Chen * n = (ramdisk_size + 4096 - 1) / 4096 250745aeb1aSJoseph Chen * 251745aeb1aSJoseph Chen * Note that in version 3 of the boot image header, page size is fixed at 4096 bytes. 252745aeb1aSJoseph Chen * 253745aeb1aSJoseph Chen * The structure of the vendor boot image (introduced with version 3 and 254745aeb1aSJoseph Chen * required to be present when a v3 boot image is used) is as follows: 255745aeb1aSJoseph Chen * 256745aeb1aSJoseph Chen * +---------------------+ 257745aeb1aSJoseph Chen * | vendor boot header | o pages 258745aeb1aSJoseph Chen * +---------------------+ 259745aeb1aSJoseph Chen * | vendor ramdisk | p pages 260745aeb1aSJoseph Chen * +---------------------+ 261745aeb1aSJoseph Chen * | dtb | q pages 262745aeb1aSJoseph Chen * +---------------------+ 263745aeb1aSJoseph Chen * 264745aeb1aSJoseph Chen * o = (2112 + page_size - 1) / page_size 265745aeb1aSJoseph Chen * p = (vendor_ramdisk_size + page_size - 1) / page_size 266745aeb1aSJoseph Chen * q = (dtb_size + page_size - 1) / page_size 267745aeb1aSJoseph Chen * 268745aeb1aSJoseph Chen * 0. all entities in the boot image are 4096-byte aligned in flash, all 269745aeb1aSJoseph Chen * entities in the vendor boot image are page_size (determined by the vendor 270745aeb1aSJoseph Chen * and specified in the vendor boot image header) aligned in flash 271745aeb1aSJoseph Chen * 1. kernel, ramdisk, vendor ramdisk, and DTB are required (size != 0) 272745aeb1aSJoseph Chen * 2. load the kernel and DTB at the specified physical address (kernel_addr, 273745aeb1aSJoseph Chen * dtb_addr) 274745aeb1aSJoseph Chen * 3. load the vendor ramdisk at ramdisk_addr 275745aeb1aSJoseph Chen * 4. load the generic ramdisk immediately following the vendor ramdisk in 276745aeb1aSJoseph Chen * memory 277745aeb1aSJoseph Chen * 5. set up registers for kernel entry as required by your architecture 278745aeb1aSJoseph Chen * 6. if the platform has a second stage bootloader jump to it (must be 279745aeb1aSJoseph Chen * contained outside boot and vendor boot partitions), otherwise 280745aeb1aSJoseph Chen * jump to kernel_addr 281745aeb1aSJoseph Chen */ 282745aeb1aSJoseph Chen 2839ace3fc8SSebastian Siewior #endif 284