xref: /OK3568_Linux_fs/u-boot/include/android_image.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: BSD-3-Clause */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * This is from the Android Project,
4*4882a593Smuzhiyun  * Repository: https://android.googlesource.com/platform/system/tools/mkbootimg
5*4882a593Smuzhiyun  * File: include/bootimg/bootimg.h
6*4882a593Smuzhiyun  * Commit: e55998a0f2b61b685d5eb4a486ca3a0c680b1a2f
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Copyright (C) 2007 The Android Open Source Project
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #ifndef _ANDROID_IMAGE_H_
12*4882a593Smuzhiyun #define _ANDROID_IMAGE_H_
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define ANDROID_PARTITION_BOOT "boot"
15*4882a593Smuzhiyun #define ANDROID_PARTITION_VENDOR_BOOT "vendor_boot"
16*4882a593Smuzhiyun #define ANDROID_PARTITION_INIT_BOOT "init_boot"
17*4882a593Smuzhiyun #define ANDROID_PARTITION_MISC "misc"
18*4882a593Smuzhiyun #define ANDROID_PARTITION_OEM  "oem"
19*4882a593Smuzhiyun #define ANDROID_PARTITION_RESOURCE  "resource"
20*4882a593Smuzhiyun #define ANDROID_PARTITION_RECOVERY  "recovery"
21*4882a593Smuzhiyun #define ANDROID_PARTITION_SYSTEM "system"
22*4882a593Smuzhiyun #define ANDROID_PARTITION_VBMETA "vbmeta"
23*4882a593Smuzhiyun #define ANDROID_PARTITION_SUPER "super"
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define ANDROID_ARG_SLOT_SUFFIX "androidboot.slot_suffix="
26*4882a593Smuzhiyun #define ANDROID_ARG_ROOT "root="
27*4882a593Smuzhiyun #define ANDROID_ARG_SERIALNO "androidboot.serialno="
28*4882a593Smuzhiyun #define ANDROID_VERIFY_STATE "androidboot.verifiedbootstate="
29*4882a593Smuzhiyun #ifdef CONFIG_ROCKCHIP_RESOURCE_IMAGE
30*4882a593Smuzhiyun #define ANDROID_ARG_FDT_FILENAME "rk-kernel.dtb"
31*4882a593Smuzhiyun #else
32*4882a593Smuzhiyun #define ANDROID_ARG_FDT_FILENAME "kernel.dtb"
33*4882a593Smuzhiyun #endif
34*4882a593Smuzhiyun #define OEM_UNLOCK_ARG_SIZE 30
35*4882a593Smuzhiyun #define UUID_SIZE 37
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define ANDR_BOOT_MAGIC "ANDROID!"
38*4882a593Smuzhiyun #define VENDOR_BOOT_MAGIC "VNDRBOOT"
39*4882a593Smuzhiyun #define ANDR_BOOT_MAGIC_SIZE 8
40*4882a593Smuzhiyun #define VENDOR_BOOT_MAGIC_SIZE 8
41*4882a593Smuzhiyun #define ANDR_BOOT_NAME_SIZE 16
42*4882a593Smuzhiyun #define VENDOR_BOOT_NAME_SIZE 16
43*4882a593Smuzhiyun #define ANDR_BOOT_ARGS_SIZE 512
44*4882a593Smuzhiyun #define ANDR_BOOT_EXTRA_ARGS_SIZE 1024
45*4882a593Smuzhiyun #define VENDOR_BOOT_ARGS_SIZE 2048
46*4882a593Smuzhiyun #define ANDR_BOOT_IMG_PAGE_SIZE 4096
47*4882a593Smuzhiyun #define ANDR_BOOT_IMG_HDR_SIZE (ANDR_BOOT_IMG_PAGE_SIZE)
48*4882a593Smuzhiyun #define TOTAL_BOOT_ARGS_SIZE (ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE + \
49*4882a593Smuzhiyun                               VENDOR_BOOT_ARGS_SIZE + 1)
50*4882a593Smuzhiyun #define VENDOR_BOOT_HDRv3_SIZE	2112
51*4882a593Smuzhiyun #define VENDOR_BOOT_HDRv4_SIZE	2124
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #define VENDOR_RAMDISK_TYPE_NONE 0
54*4882a593Smuzhiyun #define VENDOR_RAMDISK_TYPE_PLATFORM 1
55*4882a593Smuzhiyun #define VENDOR_RAMDISK_TYPE_RECOVERY 2
56*4882a593Smuzhiyun #define VENDOR_RAMDISK_TYPE_DLKM 3
57*4882a593Smuzhiyun #define VENDOR_RAMDISK_NAME_SIZE 32
58*4882a593Smuzhiyun #define VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE 16
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun /* defined by rockchip but not google, it's adjustable */
61*4882a593Smuzhiyun #define ANDROID_ADDITION_BOOTCONFIG_PARAMS_MAX_SIZE SZ_8K
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /*
64*4882a593Smuzhiyun  * It is expected that callers would explicitly specify which version of the
65*4882a593Smuzhiyun  * boot image header they need to use.
66*4882a593Smuzhiyun  */
67*4882a593Smuzhiyun typedef struct andr_img_hdr andr_img_hdr;
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun /* The bootloader expects the structure of andr_img_hdr with header
70*4882a593Smuzhiyun  * version 0 to be as follows: */
71*4882a593Smuzhiyun struct andr_img_hdr {
72*4882a593Smuzhiyun     /* Must be ANDR_BOOT_MAGIC. */
73*4882a593Smuzhiyun     char magic[ANDR_BOOT_MAGIC_SIZE];
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun     u32 kernel_size; /* size in bytes */
76*4882a593Smuzhiyun     u32 kernel_addr; /* physical load addr */
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun     u32 ramdisk_size; /* size in bytes */
79*4882a593Smuzhiyun     u32 ramdisk_addr; /* physical load addr */
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun     u32 second_size; /* size in bytes */
82*4882a593Smuzhiyun     u32 second_addr; /* physical load addr */
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun     u32 tags_addr; /* physical addr for kernel tags */
85*4882a593Smuzhiyun     u32 page_size; /* flash page size we assume */
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun     /* Version of the boot image header. */
88*4882a593Smuzhiyun     u32 header_version;
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun     /* Operating system version and security patch level.
91*4882a593Smuzhiyun      * For version "A.B.C" and patch level "Y-M-D":
92*4882a593Smuzhiyun      *   (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M)
93*4882a593Smuzhiyun      *   os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */
94*4882a593Smuzhiyun     u32 os_version;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun     char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun     char cmdline[ANDR_BOOT_ARGS_SIZE];
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun     u32 id[8]; /* timestamp / checksum / sha1 / etc */
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun     /* Supplemental command line data; kept here to maintain
103*4882a593Smuzhiyun      * binary compatibility with older versions of mkbootimg. */
104*4882a593Smuzhiyun     char extra_cmdline[ANDR_BOOT_EXTRA_ARGS_SIZE];
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun     /* Fields in boot_img_hdr_v1(Android-9) and newer. */
107*4882a593Smuzhiyun     u32 recovery_dtbo_size;   /* size in bytes for recovery DTBO/ACPIO image */
108*4882a593Smuzhiyun     u64 recovery_dtbo_offset; /* offset to recovery dtbo/acpio in boot image */
109*4882a593Smuzhiyun     u32 header_size;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun     /* Fields in boot_img_hdr_v2(Android-10) and newer. */
112*4882a593Smuzhiyun     u32 dtb_size; /* size in bytes for DTB image */
113*4882a593Smuzhiyun     u64 dtb_addr; /* physical load address for DTB image */
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun     /*
116*4882a593Smuzhiyun      * [Rockchip compatibility Android v3]
117*4882a593Smuzhiyun      *
118*4882a593Smuzhiyun      * boot_img_hdr_v3(Android-11) is not compatible with boot_img_hdr_v012,
119*4882a593Smuzhiyun      * we have to partly merge fields from boot_img_hdr_v34 and vendor_boot_img_hdr_v34
120*4882a593Smuzhiyun      * into this structure to compatible with boot_img_hdr_v012.
121*4882a593Smuzhiyun      */
122*4882a593Smuzhiyun     u32 vendor_ramdisk_size; /* size in bytes */
123*4882a593Smuzhiyun     u32 vendor_page_size;
124*4882a593Smuzhiyun     u32 vendor_header_version;
125*4882a593Smuzhiyun     u32 vendor_header_size;
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun     /*
128*4882a593Smuzhiyun      * [Rockchip compatibility Android v4]
129*4882a593Smuzhiyun      *
130*4882a593Smuzhiyun      * boot_img_hdr_v4(Android-12) is not compatible with boot_img_hdr_v012,
131*4882a593Smuzhiyun      * we have to partly merge fields from boot_img_hdr_v34 and vendor_boot_img_hdr_v34
132*4882a593Smuzhiyun      * into this structure to compatible with boot_img_hdr_v012.
133*4882a593Smuzhiyun      */
134*4882a593Smuzhiyun     u32 vendor_ramdisk_table_size;
135*4882a593Smuzhiyun     u32 vendor_ramdisk_table_entry_num;
136*4882a593Smuzhiyun     u32 vendor_ramdisk_table_entry_size;
137*4882a593Smuzhiyun     u32 vendor_bootconfig_size; /* size in bytes for bootconfig image */
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun     void *init_boot_buf;
140*4882a593Smuzhiyun     void *vendor_boot_buf;
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun     /*
143*4882a593Smuzhiyun      * Don't define 'char total_cmdline[TOTAL_BOOT_ARGS_SIZE]' to avoid
144*4882a593Smuzhiyun      * this structrue is over size than page_size.
145*4882a593Smuzhiyun      */
146*4882a593Smuzhiyun     char *total_cmdline;
147*4882a593Smuzhiyun } __attribute__((packed));
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun struct boot_img_hdr_v34 {
150*4882a593Smuzhiyun     /* Must be ANDR_BOOT_MAGIC. */
151*4882a593Smuzhiyun     uint8_t magic[ANDR_BOOT_MAGIC_SIZE];
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun     uint32_t kernel_size; /* size in bytes */
154*4882a593Smuzhiyun     uint32_t ramdisk_size; /* size in bytes */
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun     /* Operating system version and security patch level.
157*4882a593Smuzhiyun      * For version "A.B.C" and patch level "Y-M-D":
158*4882a593Smuzhiyun      *   (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M)
159*4882a593Smuzhiyun      *   os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */
160*4882a593Smuzhiyun     uint32_t os_version;
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun     uint32_t header_size;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun     uint32_t reserved[4];
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun     uint32_t header_version;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun     uint8_t cmdline[ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE];
169*4882a593Smuzhiyun } __attribute__((packed));
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun struct vendor_boot_img_hdr_v34 {
172*4882a593Smuzhiyun     /* Must be VENDOR_BOOT_MAGIC. */
173*4882a593Smuzhiyun     uint8_t magic[VENDOR_BOOT_MAGIC_SIZE];
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun     /* Version of the vendor boot image header. */
176*4882a593Smuzhiyun     uint32_t header_version;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun     uint32_t page_size; /* flash page size we assume */
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun     uint32_t kernel_addr; /* physical load addr */
181*4882a593Smuzhiyun     uint32_t ramdisk_addr; /* physical load addr */
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun     uint32_t vendor_ramdisk_size; /* size in bytes */
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun     uint8_t cmdline[VENDOR_BOOT_ARGS_SIZE];
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun     uint32_t tags_addr; /* physical addr for kernel tags (if required) */
188*4882a593Smuzhiyun     uint8_t name[VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun     uint32_t header_size;
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun     uint32_t dtb_size; /* size in bytes for DTB image */
193*4882a593Smuzhiyun     uint64_t dtb_addr; /* physical load address for DTB image */
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun     /* new for v4 */
196*4882a593Smuzhiyun     uint32_t vendor_ramdisk_table_size; /* size in bytes for the vendor ramdisk table */
197*4882a593Smuzhiyun     uint32_t vendor_ramdisk_table_entry_num; /* number of entries in the vendor ramdisk table */
198*4882a593Smuzhiyun     uint32_t vendor_ramdisk_table_entry_size;
199*4882a593Smuzhiyun     uint32_t vendor_bootconfig_size; /* size in bytes for bootconfig image */
200*4882a593Smuzhiyun } __attribute__((packed));
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun struct vendor_ramdisk_table_entry_v4 {
203*4882a593Smuzhiyun     uint32_t ramdisk_size; /* size in bytes for the ramdisk image */
204*4882a593Smuzhiyun     uint32_t ramdisk_offset; /* offset to the ramdisk image in vendor ramdisk section */
205*4882a593Smuzhiyun     uint32_t ramdisk_type; /* type of the ramdisk */
206*4882a593Smuzhiyun     uint8_t ramdisk_name[VENDOR_RAMDISK_NAME_SIZE]; /* asciiz ramdisk name */
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun     // Hardware identifiers describing the board, soc or platform which this
209*4882a593Smuzhiyun     // ramdisk is intended to be loaded on.
210*4882a593Smuzhiyun     uint32_t board_id[VENDOR_RAMDISK_TABLE_ENTRY_BOARD_ID_SIZE];
211*4882a593Smuzhiyun } __attribute__((packed));
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun /* When the boot image header has a version of 4, the structure of the boot
214*4882a593Smuzhiyun  * image is the same as version 3:
215*4882a593Smuzhiyun  *
216*4882a593Smuzhiyun  * +---------------------+
217*4882a593Smuzhiyun  * | boot header         | 4096 bytes
218*4882a593Smuzhiyun  * +---------------------+
219*4882a593Smuzhiyun  * | kernel              | m pages
220*4882a593Smuzhiyun  * +---------------------+
221*4882a593Smuzhiyun  * | ramdisk             | n pages
222*4882a593Smuzhiyun  * +---------------------+
223*4882a593Smuzhiyun  *
224*4882a593Smuzhiyun  * m = (kernel_size + 4096 - 1) / 4096
225*4882a593Smuzhiyun  * n = (ramdisk_size + 4096 - 1) / 4096
226*4882a593Smuzhiyun  *
227*4882a593Smuzhiyun  * Note that in version 4 of the boot image header, page size is fixed at 4096
228*4882a593Smuzhiyun  * bytes.
229*4882a593Smuzhiyun  *
230*4882a593Smuzhiyun  * The structure of the vendor boot image version 4, which is required to be
231*4882a593Smuzhiyun  * present when a version 4 boot image is used, is as follows:
232*4882a593Smuzhiyun  *
233*4882a593Smuzhiyun  * +------------------------+
234*4882a593Smuzhiyun  * | vendor boot header     | o pages
235*4882a593Smuzhiyun  * +------------------------+
236*4882a593Smuzhiyun  * | vendor ramdisk section | p pages
237*4882a593Smuzhiyun  * +------------------------+
238*4882a593Smuzhiyun  * | dtb                    | q pages
239*4882a593Smuzhiyun  * +------------------------+
240*4882a593Smuzhiyun  * | vendor ramdisk table   | r pages
241*4882a593Smuzhiyun  * +------------------------+
242*4882a593Smuzhiyun  * | bootconfig             | s pages
243*4882a593Smuzhiyun  * +------------------------+
244*4882a593Smuzhiyun  *
245*4882a593Smuzhiyun  * o = (2124 + page_size - 1) / page_size
246*4882a593Smuzhiyun  * p = (vendor_ramdisk_size + page_size - 1) / page_size
247*4882a593Smuzhiyun  * q = (dtb_size + page_size - 1) / page_size
248*4882a593Smuzhiyun  * r = (vendor_ramdisk_table_size + page_size - 1) / page_size
249*4882a593Smuzhiyun  * s = (vendor_bootconfig_size + page_size - 1) / page_size
250*4882a593Smuzhiyun  *
251*4882a593Smuzhiyun  * Note that in version 4 of the vendor boot image, multiple vendor ramdisks can
252*4882a593Smuzhiyun  * be included in the vendor boot image. The bootloader can select a subset of
253*4882a593Smuzhiyun  * ramdisks to load at runtime. To help the bootloader select the ramdisks, each
254*4882a593Smuzhiyun  * ramdisk is tagged with a type tag and a set of hardware identifiers
255*4882a593Smuzhiyun  * describing the board, soc or platform that this ramdisk is intended for.
256*4882a593Smuzhiyun  *
257*4882a593Smuzhiyun  * The vendor ramdisk section is consist of multiple ramdisk images concatenated
258*4882a593Smuzhiyun  * one after another, and vendor_ramdisk_size is the size of the section, which
259*4882a593Smuzhiyun  * is the total size of all the ramdisks included in the vendor boot image.
260*4882a593Smuzhiyun  *
261*4882a593Smuzhiyun  * The vendor ramdisk table holds the size, offset, type, name and hardware
262*4882a593Smuzhiyun  * identifiers of each ramdisk. The type field denotes the type of its content.
263*4882a593Smuzhiyun  * The hardware identifiers are specified in the board_id field in each table
264*4882a593Smuzhiyun  * entry. The board_id field is consist of a vector of unsigned integer words,
265*4882a593Smuzhiyun  * and the encoding scheme is defined by the hardware vendor.
266*4882a593Smuzhiyun  *
267*4882a593Smuzhiyun  * For the different type of ramdisks, there are:
268*4882a593Smuzhiyun  *    - VENDOR_RAMDISK_TYPE_NONE indicates the value is unspecified.
269*4882a593Smuzhiyun  *    - VENDOR_RAMDISK_TYPE_PLATFORM ramdisk contains platform specific bits.
270*4882a593Smuzhiyun  *    - VENDOR_RAMDISK_TYPE_RECOVERY ramdisk contains recovery resources.
271*4882a593Smuzhiyun  *    - VENDOR_RAMDISK_TYPE_DLKM ramdisk contains dynamic loadable kernel
272*4882a593Smuzhiyun  *      modules.
273*4882a593Smuzhiyun  *
274*4882a593Smuzhiyun  * Version 4 of the vendor boot image also adds a bootconfig section to the end
275*4882a593Smuzhiyun  * of the image. This section contains Boot Configuration parameters known at
276*4882a593Smuzhiyun  * build time. The bootloader is responsible for placing this section directly
277*4882a593Smuzhiyun  * after the boot image ramdisk, followed by the bootconfig trailer, before
278*4882a593Smuzhiyun  * entering the kernel.
279*4882a593Smuzhiyun  *
280*4882a593Smuzhiyun  * 0. all entities in the boot image are 4096-byte aligned in flash, all
281*4882a593Smuzhiyun  *    entities in the vendor boot image are page_size (determined by the vendor
282*4882a593Smuzhiyun  *    and specified in the vendor boot image header) aligned in flash
283*4882a593Smuzhiyun  * 1. kernel, ramdisk, and DTB are required (size != 0)
284*4882a593Smuzhiyun  * 2. load the kernel and DTB at the specified physical address (kernel_addr,
285*4882a593Smuzhiyun  *    dtb_addr)
286*4882a593Smuzhiyun  * 3. load the vendor ramdisks at ramdisk_addr
287*4882a593Smuzhiyun  * 4. load the generic ramdisk immediately following the vendor ramdisk in
288*4882a593Smuzhiyun  *    memory
289*4882a593Smuzhiyun  * 5. load the vendor bootconfig immediately following the generic ramdisk. Add
290*4882a593Smuzhiyun  *    additional bootconfig parameters followed by the bootconfig trailer.
291*4882a593Smuzhiyun  * 6. set up registers for kernel entry as required by your architecture
292*4882a593Smuzhiyun  * 7. if the platform has a second stage bootloader jump to it (must be
293*4882a593Smuzhiyun  *    contained outside boot and vendor boot partitions), otherwise
294*4882a593Smuzhiyun  *    jump to kernel_addr
295*4882a593Smuzhiyun  *
296*4882a593Smuzhiyun  * When a boot header is of version 0, the structure of boot image is as
297*4882a593Smuzhiyun  * follows:
298*4882a593Smuzhiyun  *
299*4882a593Smuzhiyun  * +-----------------+
300*4882a593Smuzhiyun  * | boot header     | 1 page
301*4882a593Smuzhiyun  * +-----------------+
302*4882a593Smuzhiyun  * | kernel          | n pages
303*4882a593Smuzhiyun  * +-----------------+
304*4882a593Smuzhiyun  * | ramdisk         | m pages
305*4882a593Smuzhiyun  * +-----------------+
306*4882a593Smuzhiyun  * | second stage    | o pages
307*4882a593Smuzhiyun  * +-----------------+
308*4882a593Smuzhiyun  *
309*4882a593Smuzhiyun  * n = (kernel_size + page_size - 1) / page_size
310*4882a593Smuzhiyun  * m = (ramdisk_size + page_size - 1) / page_size
311*4882a593Smuzhiyun  * o = (second_size + page_size - 1) / page_size
312*4882a593Smuzhiyun  *
313*4882a593Smuzhiyun  * 0. all entities are page_size aligned in flash
314*4882a593Smuzhiyun  * 1. kernel and ramdisk are required (size != 0)
315*4882a593Smuzhiyun  * 2. second is optional (second_size == 0 -> no second)
316*4882a593Smuzhiyun  * 3. load each element (kernel, ramdisk, second) at
317*4882a593Smuzhiyun  *    the specified physical address (kernel_addr, etc)
318*4882a593Smuzhiyun  * 4. prepare tags at tag_addr.  kernel_args[] is
319*4882a593Smuzhiyun  *    appended to the kernel commandline in the tags.
320*4882a593Smuzhiyun  * 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
321*4882a593Smuzhiyun  * 6. if second_size != 0: jump to second_addr
322*4882a593Smuzhiyun  *    else: jump to kernel_addr
323*4882a593Smuzhiyun  */
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun /* When the boot image header has a version of 2, the structure of the boot
326*4882a593Smuzhiyun  * image is as follows:
327*4882a593Smuzhiyun  *
328*4882a593Smuzhiyun  * +---------------------+
329*4882a593Smuzhiyun  * | boot header         | 1 page
330*4882a593Smuzhiyun  * +---------------------+
331*4882a593Smuzhiyun  * | kernel              | n pages
332*4882a593Smuzhiyun  * +---------------------+
333*4882a593Smuzhiyun  * | ramdisk             | m pages
334*4882a593Smuzhiyun  * +---------------------+
335*4882a593Smuzhiyun  * | second stage        | o pages
336*4882a593Smuzhiyun  * +---------------------+
337*4882a593Smuzhiyun  * | recovery dtbo/acpio | p pages
338*4882a593Smuzhiyun  * +---------------------+
339*4882a593Smuzhiyun  * | dtb                 | q pages
340*4882a593Smuzhiyun  * +---------------------+
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun  * n = (kernel_size + page_size - 1) / page_size
343*4882a593Smuzhiyun  * m = (ramdisk_size + page_size - 1) / page_size
344*4882a593Smuzhiyun  * o = (second_size + page_size - 1) / page_size
345*4882a593Smuzhiyun  * p = (recovery_dtbo_size + page_size - 1) / page_size
346*4882a593Smuzhiyun  * q = (dtb_size + page_size - 1) / page_size
347*4882a593Smuzhiyun  *
348*4882a593Smuzhiyun  * 0. all entities are page_size aligned in flash
349*4882a593Smuzhiyun  * 1. kernel, ramdisk and DTB are required (size != 0)
350*4882a593Smuzhiyun  * 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B
351*4882a593Smuzhiyun  *    devices(recovery_dtbo_size != 0)
352*4882a593Smuzhiyun  * 3. second is optional (second_size == 0 -> no second)
353*4882a593Smuzhiyun  * 4. load each element (kernel, ramdisk, second, dtb) at
354*4882a593Smuzhiyun  *    the specified physical address (kernel_addr, etc)
355*4882a593Smuzhiyun  * 5. If booting to recovery mode in a non-A/B device, extract recovery
356*4882a593Smuzhiyun  *    dtbo/acpio and apply the correct set of overlays on the base device tree
357*4882a593Smuzhiyun  *    depending on the hardware/product revision.
358*4882a593Smuzhiyun  * 6. prepare tags at tag_addr.  kernel_args[] is
359*4882a593Smuzhiyun  *    appended to the kernel commandline in the tags.
360*4882a593Smuzhiyun  * 7. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
361*4882a593Smuzhiyun  * 8. if second_size != 0: jump to second_addr
362*4882a593Smuzhiyun  *    else: jump to kernel_addr
363*4882a593Smuzhiyun  */
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun /* When the boot image header has a version of 3, the structure of the boot
366*4882a593Smuzhiyun  * image is as follows:
367*4882a593Smuzhiyun  *
368*4882a593Smuzhiyun  * +---------------------+
369*4882a593Smuzhiyun  * | boot header         | 4096 bytes
370*4882a593Smuzhiyun  * +---------------------+
371*4882a593Smuzhiyun  * | kernel              | m pages
372*4882a593Smuzhiyun  * +---------------------+
373*4882a593Smuzhiyun  * | ramdisk             | n pages
374*4882a593Smuzhiyun  * +---------------------+
375*4882a593Smuzhiyun  *
376*4882a593Smuzhiyun  * m = (kernel_size + 4096 - 1) / 4096
377*4882a593Smuzhiyun  * n = (ramdisk_size + 4096 - 1) / 4096
378*4882a593Smuzhiyun  *
379*4882a593Smuzhiyun  * Note that in version 3 of the boot image header, page size is fixed at 4096 bytes.
380*4882a593Smuzhiyun  *
381*4882a593Smuzhiyun  * The structure of the vendor boot image (introduced with version 3 and
382*4882a593Smuzhiyun  * required to be present when a v3 boot image is used) is as follows:
383*4882a593Smuzhiyun  *
384*4882a593Smuzhiyun  * +---------------------+
385*4882a593Smuzhiyun  * | vendor boot header  | o pages
386*4882a593Smuzhiyun  * +---------------------+
387*4882a593Smuzhiyun  * | vendor ramdisk      | p pages
388*4882a593Smuzhiyun  * +---------------------+
389*4882a593Smuzhiyun  * | dtb                 | q pages
390*4882a593Smuzhiyun  * +---------------------+
391*4882a593Smuzhiyun  *
392*4882a593Smuzhiyun  * o = (2112 + page_size - 1) / page_size
393*4882a593Smuzhiyun  * p = (vendor_ramdisk_size + page_size - 1) / page_size
394*4882a593Smuzhiyun  * q = (dtb_size + page_size - 1) / page_size
395*4882a593Smuzhiyun  *
396*4882a593Smuzhiyun  * 0. all entities in the boot image are 4096-byte aligned in flash, all
397*4882a593Smuzhiyun  *    entities in the vendor boot image are page_size (determined by the vendor
398*4882a593Smuzhiyun  *    and specified in the vendor boot image header) aligned in flash
399*4882a593Smuzhiyun  * 1. kernel, ramdisk, vendor ramdisk, and DTB are required (size != 0)
400*4882a593Smuzhiyun  * 2. load the kernel and DTB at the specified physical address (kernel_addr,
401*4882a593Smuzhiyun  *    dtb_addr)
402*4882a593Smuzhiyun  * 3. load the vendor ramdisk at ramdisk_addr
403*4882a593Smuzhiyun  * 4. load the generic ramdisk immediately following the vendor ramdisk in
404*4882a593Smuzhiyun  *    memory
405*4882a593Smuzhiyun  * 5. set up registers for kernel entry as required by your architecture
406*4882a593Smuzhiyun  * 6. if the platform has a second stage bootloader jump to it (must be
407*4882a593Smuzhiyun  *    contained outside boot and vendor boot partitions), otherwise
408*4882a593Smuzhiyun  *    jump to kernel_addr
409*4882a593Smuzhiyun  */
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun #endif
412