]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | /* SPDX-License-Identifier: GPL-2.0+ */ |
b6396403 SG |
2 | /* |
3 | * (C) Copyright 2000-2009 | |
4 | * Wolfgang Denk, DENX Software Engineering, [email protected]. | |
b6396403 SG |
5 | */ |
6 | ||
7 | #ifndef _BOOTM_H | |
8 | #define _BOOTM_H | |
9 | ||
b6396403 SG |
10 | #include <image.h> |
11 | ||
1a081092 | 12 | struct boot_params; |
09140113 SG |
13 | struct cmd_tbl; |
14 | ||
b6396403 SG |
15 | #define BOOTM_ERR_RESET (-1) |
16 | #define BOOTM_ERR_OVERLAP (-2) | |
17 | #define BOOTM_ERR_UNIMPLEMENTED (-3) | |
18 | ||
c4921625 SG |
19 | /** |
20 | * struct bootm_info() - information used when processing images to boot | |
21 | * | |
c2211ff6 SG |
22 | * These mirror the first three arguments of the bootm command. They are |
23 | * designed to handle any type of image, but typically it is a FIT. | |
24 | * | |
25 | * @addr_img: Address of image to bootm, as passed to | |
26 | * genimg_get_kernel_addr_fit() for processing: | |
27 | * | |
28 | * NULL: Usees default load address, i.e. image_load_addr | |
29 | * <addr>: Uses hex address | |
30 | * | |
31 | * For FIT: | |
32 | * "[<addr>]#<conf>": Uses address (or image_load_addr) and also specifies | |
33 | * the FIT configuration to use | |
34 | * "[<addr>]:<subimage>": Uses address (or image_load_addr) and also | |
35 | * specifies the subimage name containing the OS | |
36 | * | |
37 | * @conf_ramdisk: Address (or with FIT, the name) of the ramdisk image, as | |
38 | * passed to boot_get_ramdisk() for processing, or NULL for none | |
39 | * @conf_fdt: Address (or with FIT, the name) of the FDT image, as passed to | |
40 | * boot_get_fdt() for processing, or NULL for none | |
41 | * @boot_progress: true to show boot progress | |
c4921625 | 42 | * @images: images information |
c2211ff6 | 43 | * @cmd_name: command which invoked this operation, e.g. "bootm" |
c4921625 SG |
44 | * @argc: Number of arguments to the command (excluding the actual command). |
45 | * This is 0 if there are no arguments | |
46 | * @argv: NULL-terminated list of arguments, or NULL if there are no arguments | |
47 | */ | |
48 | struct bootm_info { | |
c2211ff6 SG |
49 | const char *addr_img; |
50 | const char *conf_ramdisk; | |
51 | const char *conf_fdt; | |
52 | bool boot_progress; | |
c4921625 | 53 | struct bootm_headers *images; |
c2211ff6 | 54 | const char *cmd_name; |
c4921625 SG |
55 | int argc; |
56 | char *const *argv; | |
57 | }; | |
58 | ||
c2211ff6 SG |
59 | /** |
60 | * bootm_init() - Set up a bootm_info struct with useful defaults | |
61 | * | |
62 | * Set up the struct with default values for all members: | |
63 | * @boot_progress is set to true and @images is set to the global images | |
64 | * variable. Everything else is set to NULL except @argc which is 0 | |
65 | */ | |
66 | void bootm_init(struct bootm_info *bmi); | |
67 | ||
b6396403 SG |
68 | /* |
69 | * Continue booting an OS image; caller already has: | |
70 | * - copied image header to global variable `header' | |
71 | * - checked header magic number, checksums (both header & image), | |
72 | * - verified image architecture (PPC) and type (KERNEL or MULTI), | |
73 | * - loaded (first part of) image to header load address, | |
74 | * - disabled interrupts. | |
75 | * | |
76 | * @flag: Flags indicating what to do (BOOTM_STATE_...) | |
a48336e5 | 77 | * bmi: Bootm information |
185f812c | 78 | * Return: 1 on error. On success the OS boots so this function does |
b6396403 SG |
79 | * not return. |
80 | */ | |
a48336e5 | 81 | typedef int boot_os_fn(int flag, struct bootm_info *bmi); |
b6396403 SG |
82 | |
83 | extern boot_os_fn do_bootm_linux; | |
f2a53c76 BM |
84 | extern boot_os_fn do_bootm_vxworks; |
85 | ||
c4921625 | 86 | int do_bootelf(struct cmd_tbl *cmdtp, int fglag, int argc, char *const argv[]); |
b6396403 SG |
87 | |
88 | boot_os_fn *bootm_os_get_boot_func(int os); | |
89 | ||
93e07880 | 90 | #if defined(CONFIG_FIT_SIGNATURE) |
ce1400f6 | 91 | int bootm_host_load_images(const void *fit, int cfg_noffset); |
93e07880 | 92 | #endif |
ce1400f6 | 93 | |
725ddf1f | 94 | int boot_selected_os(int state, struct bootm_info *bmi, boot_os_fn *boot_fn); |
b6396403 SG |
95 | |
96 | ulong bootm_disable_interrupts(void); | |
97 | ||
3ac85bdc SG |
98 | /** |
99 | * bootm_find_images() - find and locate various images | |
100 | * | |
101 | * @img_addr: Address of image being loaded | |
102 | * @conf_ramdisk: Indicates the ramdisk to use (typically second arg of bootm) | |
103 | * @conf_fdt: Indicates the FDT to use (typically third arg of bootm) | |
104 | * @start: OS image start address | |
105 | * @size: OS image size | |
106 | * | |
107 | * boot_find_images() will attempt to load an available ramdisk, | |
108 | * flattened device tree, as well as specifically marked | |
109 | * "loadable" images (loadables are FIT only) | |
110 | * | |
111 | * Note: bootm_find_images will skip an image if it is not found | |
112 | * | |
113 | * This is a special function used by booti/bootz | |
114 | * | |
115 | * Return: | |
116 | * 0, if all existing images were loaded correctly | |
117 | * 1, if an image is found but corrupted, or invalid | |
118 | */ | |
119 | int bootm_find_images(ulong img_addr, const char *conf_ramdisk, | |
120 | const char *conf_fdt, ulong start, ulong size); | |
b6396403 | 121 | |
dec166d6 EJ |
122 | /* |
123 | * Measure the boot images. Measurement is the process of hashing some binary | |
124 | * data and storing it into secure memory, i.e. TPM PCRs. In addition, each | |
125 | * measurement is logged into the platform event log such that the operating | |
126 | * system can access it and perform attestation of the boot. | |
127 | * | |
128 | * @images: The structure containing the various images to boot (linux, | |
129 | * initrd, dts, etc.) | |
130 | */ | |
131 | int bootm_measure(struct bootm_headers *images); | |
132 | ||
e370e3df | 133 | /** |
b5d397f4 | 134 | * bootm_run_states() - Execute selected states of the bootm command. |
e370e3df SG |
135 | * |
136 | * Note that if states contains more than one flag it MUST contain | |
a6c49161 SG |
137 | * BOOTM_STATE_START, since this handles the addr_fit, conf_ramdisk and conf_fit |
138 | * members of @bmi | |
e370e3df | 139 | * |
a6c49161 SG |
140 | * Also note that aside from boot_os_fn functions and bootm_load_os, no other |
141 | * functions store the return value of in 'ret' may use a negative return | |
e370e3df SG |
142 | * value, without special handling. |
143 | * | |
a6c49161 SG |
144 | * @bmi: bootm information |
145 | * @states Mask containing states to run (BOOTM_STATE_...) | |
e370e3df SG |
146 | * Return: 0 if ok, something else on error. Some errors will cause this |
147 | * function to perform a reboot! If states contains BOOTM_STATE_OS_GO | |
148 | * then the intent is to boot an OS, so this function will not return | |
149 | * unless the image type is standalone. | |
150 | */ | |
b5d397f4 | 151 | int bootm_run_states(struct bootm_info *bmi, int states); |
b6396403 | 152 | |
d37086a9 SG |
153 | /** |
154 | * boot_run() - Run the entire bootm/booti/bootz process | |
155 | * | |
156 | * This runs through the boot process from start to finish, with a base set of | |
157 | * states, along with the extra ones supplied. | |
158 | * | |
159 | * This uses bootm_run_states(). | |
160 | * | |
161 | * Note that it is normally easier to use bootm_run(), etc. since they handle | |
162 | * the extra states correctly. | |
163 | * | |
164 | * @bmi: bootm information | |
165 | * @cmd: command being run, NULL if none | |
166 | * @extra_states: Mask of extra states to use for the boot | |
167 | * Return: 0 if ok, something else on error | |
168 | */ | |
169 | int boot_run(struct bootm_info *bmi, const char *cmd, int extra_states); | |
170 | ||
e1a24c02 SG |
171 | /** |
172 | * bootm_run() - Run the entire bootm process | |
173 | * | |
174 | * This runs through the bootm process from start to finish, using the default | |
175 | * set of states. | |
176 | * | |
177 | * This uses bootm_run_states(). | |
178 | * | |
179 | * @bmi: bootm information | |
180 | * Return: 0 if ok, something else on error | |
181 | */ | |
182 | int bootm_run(struct bootm_info *bmi); | |
183 | ||
3405c9b6 SG |
184 | /** |
185 | * bootz_run() - Run the entire bootz process | |
186 | * | |
187 | * This runs through the bootz process from start to finish, using the default | |
188 | * set of states. | |
189 | * | |
190 | * This uses bootm_run_states(). | |
191 | * | |
192 | * @bmi: bootm information | |
193 | * Return: 0 if ok, something else on error | |
194 | */ | |
195 | int bootz_run(struct bootm_info *bmi); | |
196 | ||
e7683c36 SG |
197 | /** |
198 | * booti_run() - Run the entire booti process | |
199 | * | |
200 | * This runs through the booti process from start to finish, using the default | |
201 | * set of states. | |
202 | * | |
203 | * This uses bootm_run_states(). | |
204 | * | |
205 | * @bmi: bootm information | |
206 | * Return: 0 if ok, something else on error | |
207 | */ | |
208 | int booti_run(struct bootm_info *bmi); | |
209 | ||
f1bd871a JH |
210 | void arch_preboot_os(void); |
211 | ||
896019b1 SG |
212 | /* |
213 | * boards should define this to disable devices when EFI exits from boot | |
214 | * services. | |
215 | * | |
216 | * TODO([email protected]>): Update this to use driver model's device_remove(). | |
217 | */ | |
329da485 SG |
218 | void board_quiesce_devices(void); |
219 | ||
f6c6df7e HS |
220 | /** |
221 | * switch_to_non_secure_mode() - switch to non-secure mode | |
222 | */ | |
223 | void switch_to_non_secure_mode(void); | |
224 | ||
b3c01678 SG |
225 | /* Flags to control bootm_process_cmdline() */ |
226 | enum bootm_cmdline_t { | |
227 | BOOTM_CL_SILENT = 1 << 0, /* Do silent console processing */ | |
51bb3384 | 228 | BOOTM_CL_SUBST = 1 << 1, /* Do substitution */ |
b3c01678 | 229 | |
51bb3384 | 230 | BOOTM_CL_ALL = 3, /* All substitutions */ |
b3c01678 SG |
231 | }; |
232 | ||
73fdb955 HS |
233 | /** |
234 | * arch_preboot_os() - arch specific configuration before booting | |
235 | */ | |
236 | void arch_preboot_os(void); | |
237 | ||
238 | /** | |
239 | * board_preboot_os() - board specific configuration before booting | |
240 | */ | |
241 | void board_preboot_os(void); | |
242 | ||
4ae42643 | 243 | /* |
4448fe8e SG |
244 | * bootm_process_cmdline() - Process fix-ups for the command line |
245 | * | |
51bb3384 SG |
246 | * This handles: |
247 | * | |
248 | * - making Linux boot silently if requested ('silent_linux' envvar) | |
249 | * - performing substitutions in the command line ('bootargs_subst' envvar) | |
4448fe8e SG |
250 | * |
251 | * @maxlen must provide enough space for the string being processed plus the | |
252 | * resulting string | |
253 | * | |
254 | * @buf: buffer holding commandline string to adjust | |
255 | * @maxlen: Maximum length of buffer at @buf (including \0) | |
256 | * @flags: Flags to control what happens (see bootm_cmdline_t) | |
185f812c | 257 | * Return: 0 if OK, -ENOMEM if out of memory, -ENOSPC if the commandline is too |
4448fe8e SG |
258 | * long |
259 | */ | |
260 | int bootm_process_cmdline(char *buf, int maxlen, int flags); | |
261 | ||
262 | /** | |
4dcb8154 | 263 | * bootm_process_cmdline_env() - Process fix-ups for the command line |
4ae42643 | 264 | * |
51bb3384 SG |
265 | * Updates the 'bootargs' envvar as required. This handles: |
266 | * | |
267 | * - making Linux boot silently if requested ('silent_linux' envvar) | |
268 | * - performing substitutions in the command line ('bootargs_subst' envvar) | |
4ae42643 | 269 | * |
b3c01678 | 270 | * @flags: Flags to control what happens (see bootm_cmdline_t) |
185f812c | 271 | * Return: 0 if OK, -ENOMEM if out of memory |
4ae42643 | 272 | */ |
b3c01678 | 273 | int bootm_process_cmdline_env(int flags); |
f158ba15 | 274 | |
1a081092 | 275 | /** |
d2c485a0 | 276 | * zboot_run() - Run through the various steps to boot a zimage |
1a081092 SG |
277 | * |
278 | * Boot a zimage, given the component parts | |
279 | * | |
280 | * @addr: Address where the bzImage is moved before booting, either | |
281 | * BZIMAGE_LOAD_ADDR or ZIMAGE_LOAD_ADDR | |
8d24535e | 282 | * @size: Size of bzImage, or 0 to detect this |
1a081092 SG |
283 | * @initrd: Address of the initial ramdisk, or 0 if none |
284 | * @initrd_size: Size of the initial ramdisk, or 0 if none | |
8d24535e SG |
285 | * @base_addr: If non-zero, this indicates that the boot parameters have already |
286 | * been loaded by the caller to this address, so the load_zimage() call | |
287 | * in zboot_load() will be skipped when booting | |
288 | * @cmdline: If non-NULL, the environment variable containing the command line | |
289 | * to use for booting | |
1a081092 SG |
290 | * Return: -EFAULT on error (normally it does not return) |
291 | */ | |
d2c485a0 SG |
292 | int zboot_run(ulong addr, ulong size, ulong initrd, ulong initrd_size, |
293 | ulong base, char *cmdline); | |
1a081092 SG |
294 | |
295 | /* | |
296 | * zimage_get_kernel_version() - Get the version string from a kernel | |
297 | * | |
298 | * @params: boot_params pointer | |
299 | * @kernel_base: base address of kernel | |
300 | * Return: Kernel version as a NUL-terminated string | |
301 | */ | |
302 | const char *zimage_get_kernel_version(struct boot_params *params, | |
303 | void *kernel_base); | |
304 | ||
cbb607d2 SG |
305 | /** |
306 | * zimage_dump() - Dump the metadata of a zimage | |
307 | * | |
308 | * This shows all available information in a zimage that has been loaded. | |
309 | * | |
310 | * @base_ptr: Pointer to the boot parameters, typically at address | |
311 | * DEFAULT_SETUP_BASE | |
312 | * @show_cmdline: true to show the full command line | |
313 | */ | |
314 | void zimage_dump(struct boot_params *base_ptr, bool show_cmdline); | |
315 | ||
daffb0be SG |
316 | /* |
317 | * bootm_boot_start() - Boot an image at the given address | |
318 | * | |
319 | * @addr: Image address | |
cdd20e3f | 320 | * @cmdline: Command line to set |
daffb0be SG |
321 | */ |
322 | int bootm_boot_start(ulong addr, const char *cmdline); | |
323 | ||
b6396403 | 324 | #endif |