1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * (C) Copyright 2008 Semihalf
4  *
5  * (C) Copyright 2000-2005
6  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
7  ********************************************************************
8  * NOTE: This header file defines an interface to U-Boot. Including
9  * this (unmodified) header file in another file is considered normal
10  * use of U-Boot, and does *not* fall under the heading of "derived
11  * work".
12  ********************************************************************
13  */
14 
15 #ifndef __IMAGE_H__
16 #define __IMAGE_H__
17 
18 #include "compiler.h"
19 #include <asm/byteorder.h>
20 #include <stdbool.h>
21 
22 /* Define this to avoid #ifdefs later on */
23 struct fdt_region;
24 
25 #ifdef USE_HOSTCC
26 #include <sys/types.h>
27 #include <linux/kconfig.h>
28 
29 #define IMAGE_INDENT_STRING	""
30 
31 #else
32 
33 #include <lmb.h>
34 #include <asm/u-boot.h>
35 #include <command.h>
36 #include <linker_lists.h>
37 
38 #define IMAGE_INDENT_STRING	"   "
39 
40 #endif /* USE_HOSTCC */
41 
42 #include <hash.h>
43 #include <linux/libfdt.h>
44 #include <fdt_support.h>
45 #include <u-boot/hash-checksum.h>
46 
47 extern ulong image_load_addr;		/* Default Load Address */
48 extern ulong image_save_addr;		/* Default Save Address */
49 extern ulong image_save_size;		/* Default Save Size */
50 extern ulong image_load_offset;	/* Default Load Address Offset */
51 
52 /* An invalid size, meaning that the image size is not known */
53 #define IMAGE_SIZE_INVAL	(-1UL)
54 
55 enum ih_category {
56 	IH_ARCH,
57 	IH_COMP,
58 	IH_OS,
59 	IH_TYPE,
60 	IH_PHASE,
61 
62 	IH_COUNT,
63 };
64 
65 /*
66  * Operating System Codes
67  *
68  * The following are exposed to uImage header.
69  * New IDs *MUST* be appended at the end of the list and *NEVER*
70  * inserted for backward compatibility.
71  */
72 enum {
73 	IH_OS_INVALID		= 0,	/* Invalid OS	*/
74 	IH_OS_OPENBSD,			/* OpenBSD	*/
75 	IH_OS_NETBSD,			/* NetBSD	*/
76 	IH_OS_FREEBSD,			/* FreeBSD	*/
77 	IH_OS_4_4BSD,			/* 4.4BSD	*/
78 	IH_OS_LINUX,			/* Linux	*/
79 	IH_OS_SVR4,			/* SVR4		*/
80 	IH_OS_ESIX,			/* Esix		*/
81 	IH_OS_SOLARIS,			/* Solaris	*/
82 	IH_OS_IRIX,			/* Irix		*/
83 	IH_OS_SCO,			/* SCO		*/
84 	IH_OS_DELL,			/* Dell		*/
85 	IH_OS_NCR,			/* NCR		*/
86 	IH_OS_LYNXOS,			/* LynxOS	*/
87 	IH_OS_VXWORKS,			/* VxWorks	*/
88 	IH_OS_PSOS,			/* pSOS		*/
89 	IH_OS_QNX,			/* QNX		*/
90 	IH_OS_U_BOOT,			/* Firmware	*/
91 	IH_OS_RTEMS,			/* RTEMS	*/
92 	IH_OS_ARTOS,			/* ARTOS	*/
93 	IH_OS_UNITY,			/* Unity OS	*/
94 	IH_OS_INTEGRITY,		/* INTEGRITY	*/
95 	IH_OS_OSE,			/* OSE		*/
96 	IH_OS_PLAN9,			/* Plan 9	*/
97 	IH_OS_OPENRTOS,		/* OpenRTOS	*/
98 	IH_OS_ARM_TRUSTED_FIRMWARE,     /* ARM Trusted Firmware */
99 	IH_OS_TEE,			/* Trusted Execution Environment */
100 	IH_OS_OPENSBI,			/* RISC-V OpenSBI */
101 	IH_OS_EFI,			/* EFI Firmware (e.g. GRUB2) */
102 	IH_OS_ELF,			/* ELF Image (e.g. seL4) */
103 
104 	IH_OS_COUNT,
105 };
106 
107 /*
108  * CPU Architecture Codes (supported by Linux)
109  *
110  * The following are exposed to uImage header.
111  * New IDs *MUST* be appended at the end of the list and *NEVER*
112  * inserted for backward compatibility.
113  */
114 enum {
115 	IH_ARCH_INVALID		= 0,	/* Invalid CPU	*/
116 	IH_ARCH_ALPHA,			/* Alpha	*/
117 	IH_ARCH_ARM,			/* ARM		*/
118 	IH_ARCH_I386,			/* Intel x86	*/
119 	IH_ARCH_IA64,			/* IA64		*/
120 	IH_ARCH_MIPS,			/* MIPS		*/
121 	IH_ARCH_MIPS64,			/* MIPS	 64 Bit */
122 	IH_ARCH_PPC,			/* PowerPC	*/
123 	IH_ARCH_S390,			/* IBM S390	*/
124 	IH_ARCH_SH,			/* SuperH	*/
125 	IH_ARCH_SPARC,			/* Sparc	*/
126 	IH_ARCH_SPARC64,		/* Sparc 64 Bit */
127 	IH_ARCH_M68K,			/* M68K		*/
128 	IH_ARCH_NIOS,			/* Nios-32	*/
129 	IH_ARCH_MICROBLAZE,		/* MicroBlaze   */
130 	IH_ARCH_NIOS2,			/* Nios-II	*/
131 	IH_ARCH_BLACKFIN,		/* Blackfin	*/
132 	IH_ARCH_AVR32,			/* AVR32	*/
133 	IH_ARCH_ST200,			/* STMicroelectronics ST200  */
134 	IH_ARCH_SANDBOX,		/* Sandbox architecture (test only) */
135 	IH_ARCH_NDS32,			/* ANDES Technology - NDS32  */
136 	IH_ARCH_OPENRISC,		/* OpenRISC 1000  */
137 	IH_ARCH_ARM64,			/* ARM64	*/
138 	IH_ARCH_ARC,			/* Synopsys DesignWare ARC */
139 	IH_ARCH_X86_64,			/* AMD x86_64, Intel and Via */
140 	IH_ARCH_XTENSA,			/* Xtensa	*/
141 	IH_ARCH_RISCV,			/* RISC-V */
142 
143 	IH_ARCH_COUNT,
144 };
145 
146 /*
147  * Image Types
148  *
149  * "Standalone Programs" are directly runnable in the environment
150  *	provided by U-Boot; it is expected that (if they behave
151  *	well) you can continue to work in U-Boot after return from
152  *	the Standalone Program.
153  * "OS Kernel Images" are usually images of some Embedded OS which
154  *	will take over control completely. Usually these programs
155  *	will install their own set of exception handlers, device
156  *	drivers, set up the MMU, etc. - this means, that you cannot
157  *	expect to re-enter U-Boot except by resetting the CPU.
158  * "RAMDisk Images" are more or less just data blocks, and their
159  *	parameters (address, size) are passed to an OS kernel that is
160  *	being started.
161  * "Multi-File Images" contain several images, typically an OS
162  *	(Linux) kernel image and one or more data images like
163  *	RAMDisks. This construct is useful for instance when you want
164  *	to boot over the network using BOOTP etc., where the boot
165  *	server provides just a single image file, but you want to get
166  *	for instance an OS kernel and a RAMDisk image.
167  *
168  *	"Multi-File Images" start with a list of image sizes, each
169  *	image size (in bytes) specified by an "uint32_t" in network
170  *	byte order. This list is terminated by an "(uint32_t)0".
171  *	Immediately after the terminating 0 follow the images, one by
172  *	one, all aligned on "uint32_t" boundaries (size rounded up to
173  *	a multiple of 4 bytes - except for the last file).
174  *
175  * "Firmware Images" are binary images containing firmware (like
176  *	U-Boot or FPGA images) which usually will be programmed to
177  *	flash memory.
178  *
179  * "Script files" are command sequences that will be executed by
180  *	U-Boot's command interpreter; this feature is especially
181  *	useful when you configure U-Boot to use a real shell (hush)
182  *	as command interpreter (=> Shell Scripts).
183  *
184  * The following are exposed to uImage header.
185  * New IDs *MUST* be appended at the end of the list and *NEVER*
186  * inserted for backward compatibility.
187  */
188 enum image_type_t {
189 	IH_TYPE_INVALID		= 0,	/* Invalid Image		*/
190 	IH_TYPE_STANDALONE,		/* Standalone Program		*/
191 	IH_TYPE_KERNEL,			/* OS Kernel Image		*/
192 	IH_TYPE_RAMDISK,		/* RAMDisk Image		*/
193 	IH_TYPE_MULTI,			/* Multi-File Image		*/
194 	IH_TYPE_FIRMWARE,		/* Firmware Image		*/
195 	IH_TYPE_SCRIPT,			/* Script file			*/
196 	IH_TYPE_FILESYSTEM,		/* Filesystem Image (any type)	*/
197 	IH_TYPE_FLATDT,			/* Binary Flat Device Tree Blob	*/
198 	IH_TYPE_KWBIMAGE,		/* Kirkwood Boot Image		*/
199 	IH_TYPE_IMXIMAGE,		/* Freescale IMXBoot Image	*/
200 	IH_TYPE_UBLIMAGE,		/* Davinci UBL Image		*/
201 	IH_TYPE_OMAPIMAGE,		/* TI OMAP Config Header Image	*/
202 	IH_TYPE_AISIMAGE,		/* TI Davinci AIS Image		*/
203 	/* OS Kernel Image, can run from any load address */
204 	IH_TYPE_KERNEL_NOLOAD,
205 	IH_TYPE_PBLIMAGE,		/* Freescale PBL Boot Image	*/
206 	IH_TYPE_MXSIMAGE,		/* Freescale MXSBoot Image	*/
207 	IH_TYPE_GPIMAGE,		/* TI Keystone GPHeader Image	*/
208 	IH_TYPE_ATMELIMAGE,		/* ATMEL ROM bootable Image	*/
209 	IH_TYPE_SOCFPGAIMAGE,		/* Altera SOCFPGA CV/AV Preloader */
210 	IH_TYPE_X86_SETUP,		/* x86 setup.bin Image		*/
211 	IH_TYPE_LPC32XXIMAGE,		/* x86 setup.bin Image		*/
212 	IH_TYPE_LOADABLE,		/* A list of typeless images	*/
213 	IH_TYPE_RKIMAGE,		/* Rockchip Boot Image		*/
214 	IH_TYPE_RKSD,			/* Rockchip SD card		*/
215 	IH_TYPE_RKSPI,			/* Rockchip SPI image		*/
216 	IH_TYPE_ZYNQIMAGE,		/* Xilinx Zynq Boot Image */
217 	IH_TYPE_ZYNQMPIMAGE,		/* Xilinx ZynqMP Boot Image */
218 	IH_TYPE_ZYNQMPBIF,		/* Xilinx ZynqMP Boot Image (bif) */
219 	IH_TYPE_FPGA,			/* FPGA Image */
220 	IH_TYPE_VYBRIDIMAGE,	/* VYBRID .vyb Image */
221 	IH_TYPE_TEE,            /* Trusted Execution Environment OS Image */
222 	IH_TYPE_FIRMWARE_IVT,		/* Firmware Image with HABv4 IVT */
223 	IH_TYPE_PMMC,            /* TI Power Management Micro-Controller Firmware */
224 	IH_TYPE_STM32IMAGE,		/* STMicroelectronics STM32 Image */
225 	IH_TYPE_SOCFPGAIMAGE_V1,	/* Altera SOCFPGA A10 Preloader	*/
226 	IH_TYPE_MTKIMAGE,		/* MediaTek BootROM loadable Image */
227 	IH_TYPE_IMX8MIMAGE,		/* Freescale IMX8MBoot Image	*/
228 	IH_TYPE_IMX8IMAGE,		/* Freescale IMX8Boot Image	*/
229 	IH_TYPE_COPRO,			/* Coprocessor Image for remoteproc*/
230 	IH_TYPE_SUNXI_EGON,		/* Allwinner eGON Boot Image */
231 	IH_TYPE_SUNXI_TOC0,		/* Allwinner TOC0 Boot Image */
232 	IH_TYPE_FDT_LEGACY,		/* Binary Flat Device Tree Blob	in a Legacy Image */
233 	IH_TYPE_RENESAS_SPKG,		/* Renesas SPKG image */
234 	IH_TYPE_STARFIVE_SPL,		/* StarFive SPL image */
235 	IH_TYPE_TFA_BL31,		/* TFA BL31 image */
236 	IH_TYPE_STM32IMAGE_V2,		/* STMicroelectronics STM32 Image V2.0 */
237 
238 	IH_TYPE_COUNT,			/* Number of image types */
239 };
240 
241 /*
242  * Compression Types
243  *
244  * The following are exposed to uImage header.
245  * New IDs *MUST* be appended at the end of the list and *NEVER*
246  * inserted for backward compatibility.
247  */
248 enum {
249 	IH_COMP_NONE		= 0,	/*  No	 Compression Used	*/
250 	IH_COMP_GZIP,			/* gzip	 Compression Used	*/
251 	IH_COMP_BZIP2,			/* bzip2 Compression Used	*/
252 	IH_COMP_LZMA,			/* lzma  Compression Used	*/
253 	IH_COMP_LZO,			/* lzo   Compression Used	*/
254 	IH_COMP_LZ4,			/* lz4   Compression Used	*/
255 	IH_COMP_ZSTD,			/* zstd   Compression Used	*/
256 
257 	IH_COMP_COUNT,
258 };
259 
260 /**
261  * Phases - images intended for particular U-Boot phases (SPL, etc.)
262  *
263  * @IH_PHASE_NONE: No phase information, can be loaded by any phase
264  * @IH_PHASE_U_BOOT: Only for U-Boot proper
265  * @IH_PHASE_SPL: Only for SPL
266  */
267 enum image_phase_t {
268 	IH_PHASE_NONE		= 0,
269 	IH_PHASE_U_BOOT,
270 	IH_PHASE_SPL,
271 
272 	IH_PHASE_COUNT,
273 };
274 
275 #define IMAGE_PHASE_SHIFT	8
276 #define IMAGE_PHASE_MASK	(0xff << IMAGE_PHASE_SHIFT)
277 #define IMAGE_TYPE_MASK		0xff
278 
279 /**
280  * image_ph() - build a composite value combining and type
281  *
282  * @phase: Image phase value
283  * @type: Image type value
284  * Returns: Composite value containing both
285  */
image_ph(enum image_phase_t phase,enum image_type_t type)286 static inline int image_ph(enum image_phase_t phase, enum image_type_t type)
287 {
288 	return type | (phase << IMAGE_PHASE_SHIFT);
289 }
290 
291 /**
292  * image_ph_phase() - obtain the phase from a composite phase/type value
293  *
294  * @image_ph_type: Composite value to convert
295  * Returns: Phase value taken from the composite value
296  */
image_ph_phase(int image_ph_type)297 static inline int image_ph_phase(int image_ph_type)
298 {
299 	return (image_ph_type & IMAGE_PHASE_MASK) >> IMAGE_PHASE_SHIFT;
300 }
301 
302 /**
303  * image_ph_type() - obtain the type from a composite phase/type value
304  *
305  * @image_ph_type: Composite value to convert
306  * Returns: Type value taken from the composite value
307  */
image_ph_type(int image_ph_type)308 static inline int image_ph_type(int image_ph_type)
309 {
310 	return image_ph_type & IMAGE_TYPE_MASK;
311 }
312 
313 #define LZ4F_MAGIC	0x184D2204	/* LZ4 Magic Number		*/
314 #define IH_MAGIC	0x27051956	/* Image Magic Number		*/
315 #define IH_NMLEN		32	/* Image Name Length		*/
316 
317 /* Reused from common.h */
318 #define ROUND(a, b)		(((a) + (b) - 1) & ~((b) - 1))
319 
320 /*
321  * Legacy format image header,
322  * all data in network byte order (aka natural aka bigendian).
323  */
324 struct legacy_img_hdr {
325 	uint32_t	ih_magic;	/* Image Header Magic Number	*/
326 	uint32_t	ih_hcrc;	/* Image Header CRC Checksum	*/
327 	uint32_t	ih_time;	/* Image Creation Timestamp	*/
328 	uint32_t	ih_size;	/* Image Data Size		*/
329 	uint32_t	ih_load;	/* Data	 Load  Address		*/
330 	uint32_t	ih_ep;		/* Entry Point Address		*/
331 	uint32_t	ih_dcrc;	/* Image Data CRC Checksum	*/
332 	uint8_t		ih_os;		/* Operating System		*/
333 	uint8_t		ih_arch;	/* CPU architecture		*/
334 	uint8_t		ih_type;	/* Image Type			*/
335 	uint8_t		ih_comp;	/* Compression Type		*/
336 	uint8_t		ih_name[IH_NMLEN];	/* Image Name		*/
337 };
338 
339 struct image_info {
340 	ulong		start, end;		/* start/end of blob */
341 	ulong		image_start, image_len; /* start of image within blob, len of image */
342 	ulong		load;			/* load addr for the image */
343 	uint8_t		comp, type, os;		/* compression, type of image, os type */
344 	uint8_t		arch;			/* CPU architecture */
345 };
346 
347 /*
348  * Legacy and FIT format headers used by do_bootm() and do_bootm_<os>()
349  * routines.
350  */
351 struct bootm_headers {
352 	/*
353 	 * Legacy os image header, if it is a multi component image
354 	 * then boot_get_ramdisk() and get_fdt() will attempt to get
355 	 * data from second and third component accordingly.
356 	 */
357 	struct legacy_img_hdr	*legacy_hdr_os;		/* image header pointer */
358 	struct legacy_img_hdr	legacy_hdr_os_copy;	/* header copy */
359 	ulong		legacy_hdr_valid;
360 
361 	/*
362 	 * The fit_ members are only used with FIT, but it involves a lot of
363 	 * #ifdefs to avoid compiling that code. Since FIT is the standard
364 	 * format, even for SPL, this extra data size seems worth it.
365 	 */
366 	const char	*fit_uname_cfg;	/* configuration node unit name */
367 
368 	void		*fit_hdr_os;	/* os FIT image header */
369 	const char	*fit_uname_os;	/* os subimage node unit name */
370 	int		fit_noffset_os;	/* os subimage node offset */
371 
372 	void		*fit_hdr_rd;	/* init ramdisk FIT image header */
373 	const char	*fit_uname_rd;	/* init ramdisk subimage node unit name */
374 	int		fit_noffset_rd;	/* init ramdisk subimage node offset */
375 
376 	void		*fit_hdr_fdt;	/* FDT blob FIT image header */
377 	const char	*fit_uname_fdt;	/* FDT blob subimage node unit name */
378 	int		fit_noffset_fdt;/* FDT blob subimage node offset */
379 
380 	void		*fit_hdr_setup;	/* x86 setup FIT image header */
381 	const char	*fit_uname_setup; /* x86 setup subimage node name */
382 	int		fit_noffset_setup;/* x86 setup subimage node offset */
383 
384 #ifndef USE_HOSTCC
385 	struct image_info	os;		/* os image info */
386 	ulong		ep;		/* entry point of OS */
387 
388 	ulong		rd_start, rd_end;/* ramdisk start/end */
389 
390 	char		*ft_addr;	/* flat dev tree address */
391 	ulong		ft_len;		/* length of flat device tree */
392 
393 	ulong		initrd_start;
394 	ulong		initrd_end;
395 	ulong		cmdline_start;
396 	ulong		cmdline_end;
397 	struct bd_info		*kbd;
398 #endif
399 
400 	int		verify;		/* env_get("verify")[0] != 'n' */
401 
402 #define BOOTM_STATE_START	0x00000001
403 #define BOOTM_STATE_FINDOS	0x00000002
404 #define BOOTM_STATE_FINDOTHER	0x00000004
405 #define BOOTM_STATE_LOADOS	0x00000008
406 #define BOOTM_STATE_RAMDISK	0x00000010
407 #define BOOTM_STATE_FDT		0x00000020
408 #define BOOTM_STATE_OS_CMDLINE	0x00000040
409 #define BOOTM_STATE_OS_BD_T	0x00000080
410 #define BOOTM_STATE_OS_PREP	0x00000100
411 #define BOOTM_STATE_OS_FAKE_GO	0x00000200	/* 'Almost' run the OS */
412 #define BOOTM_STATE_OS_GO	0x00000400
413 #define BOOTM_STATE_PRE_LOAD	0x00000800
414 #define BOOTM_STATE_MEASURE	0x00001000
415 	int		state;
416 };
417 
418 extern struct bootm_headers images;
419 
420 /*
421  * Some systems (for example LWMON) have very short watchdog periods;
422  * we must make sure to split long operations like memmove() or
423  * checksum calculations into reasonable chunks.
424  */
425 #ifndef CHUNKSZ
426 #define CHUNKSZ (64 * 1024)
427 #endif
428 
429 #ifndef CHUNKSZ_CRC32
430 #define CHUNKSZ_CRC32 (64 * 1024)
431 #endif
432 
433 #ifndef CHUNKSZ_MD5
434 #define CHUNKSZ_MD5 (64 * 1024)
435 #endif
436 
437 #ifndef CHUNKSZ_SHA1
438 #define CHUNKSZ_SHA1 (64 * 1024)
439 #endif
440 
441 #define uimage_to_cpu(x)		be32_to_cpu(x)
442 #define cpu_to_uimage(x)		cpu_to_be32(x)
443 
444 /*
445  * Translation table for entries of a specific type; used by
446  * get_table_entry_id() and get_table_entry_name().
447  */
448 typedef struct table_entry {
449 	int	id;
450 	char	*sname;		/* short (input) name to find table entry */
451 	char	*lname;		/* long (output) name to print for messages */
452 } table_entry_t;
453 
454 /*
455  * Compression type and magic number mapping table.
456  */
457 struct comp_magic_map {
458 	int		comp_id;
459 	const char	*name;
460 	unsigned char	magic[2];
461 };
462 
463 /*
464  * get_table_entry_id() scans the translation table trying to find an
465  * entry that matches the given short name. If a matching entry is
466  * found, it's id is returned to the caller.
467  */
468 int get_table_entry_id(const table_entry_t *table,
469 		const char *table_name, const char *name);
470 /*
471  * get_table_entry_name() scans the translation table trying to find
472  * an entry that matches the given id. If a matching entry is found,
473  * its long name is returned to the caller.
474  */
475 char *get_table_entry_name(const table_entry_t *table, char *msg, int id);
476 
477 const char *genimg_get_os_name(uint8_t os);
478 
479 /**
480  * genimg_get_os_short_name() - get the short name for an OS
481  *
482  * @param os	OS (IH_OS_...)
483  * Return: OS short name, or "unknown" if unknown
484  */
485 const char *genimg_get_os_short_name(uint8_t comp);
486 
487 const char *genimg_get_arch_name(uint8_t arch);
488 
489 /**
490  * genimg_get_phase_name() - Get the friendly name for a phase
491  *
492  * @phase: Phase value to look up
493  * Returns: Friendly name for the phase (e.g. "U-Boot phase")
494  */
495 const char *genimg_get_phase_name(enum image_phase_t phase);
496 
497 /**
498  * genimg_get_phase_id() - Convert a phase name to an ID
499  *
500  * @name: Name to convert (e.g. "u-boot")
501  * Returns: ID for that phase (e.g. IH_PHASE_U_BOOT)
502  */
503 int genimg_get_phase_id(const char *name);
504 
505 /**
506  * genimg_get_arch_short_name() - get the short name for an architecture
507  *
508  * @param arch	Architecture type (IH_ARCH_...)
509  * Return: architecture short name, or "unknown" if unknown
510  */
511 const char *genimg_get_arch_short_name(uint8_t arch);
512 
513 const char *genimg_get_type_name(uint8_t type);
514 
515 /**
516  * genimg_get_type_short_name() - get the short name for an image type
517  *
518  * @param type	Image type (IH_TYPE_...)
519  * Return: image short name, or "unknown" if unknown
520  */
521 const char *genimg_get_type_short_name(uint8_t type);
522 
523 const char *genimg_get_comp_name(uint8_t comp);
524 
525 /**
526  * genimg_get_comp_short_name() - get the short name for a compression method
527  *
528  * @param comp	compression method (IH_COMP_...)
529  * Return: compression method short name, or "unknown" if unknown
530  */
531 const char *genimg_get_comp_short_name(uint8_t comp);
532 
533 /**
534  * genimg_get_cat_name() - Get the name of an item in a category
535  *
536  * @category:	Category of item
537  * @id:		Item ID
538  * Return: name of item, or "Unknown ..." if unknown
539  */
540 const char *genimg_get_cat_name(enum ih_category category, uint id);
541 
542 /**
543  * genimg_get_cat_short_name() - Get the short name of an item in a category
544  *
545  * @category:	Category of item
546  * @id:		Item ID
547  * Return: short name of item, or "Unknown ..." if unknown
548  */
549 const char *genimg_get_cat_short_name(enum ih_category category, uint id);
550 
551 /**
552  * genimg_get_cat_count() - Get the number of items in a category
553  *
554  * @category:	Category to check
555  * Return: the number of items in the category (IH_xxx_COUNT)
556  */
557 int genimg_get_cat_count(enum ih_category category);
558 
559 /**
560  * genimg_get_cat_desc() - Get the description of a category
561  *
562  * @category:	Category to check
563  * Return: the description of a category, e.g. "architecture". This
564  * effectively converts the enum to a string.
565  */
566 const char *genimg_get_cat_desc(enum ih_category category);
567 
568 /**
569  * genimg_cat_has_id() - Check whether a category has an item
570  *
571  * @category:	Category to check
572  * @id:		Item ID
573  * Return: true or false as to whether a category has an item
574  */
575 bool genimg_cat_has_id(enum ih_category category, uint id);
576 
577 int genimg_get_os_id(const char *name);
578 int genimg_get_arch_id(const char *name);
579 int genimg_get_type_id(const char *name);
580 int genimg_get_comp_id(const char *name);
581 void genimg_print_size(uint32_t size);
582 
583 #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || defined(USE_HOSTCC)
584 #define IMAGE_ENABLE_TIMESTAMP 1
585 #else
586 #define IMAGE_ENABLE_TIMESTAMP 0
587 #endif
588 void genimg_print_time(time_t timestamp);
589 
590 /* What to do with a image load address ('load = <> 'in the FIT) */
591 enum fit_load_op {
592 	FIT_LOAD_IGNORED,	/* Ignore load address */
593 	FIT_LOAD_OPTIONAL,	/* Can be provided, but optional */
594 	FIT_LOAD_OPTIONAL_NON_ZERO,	/* Optional, a value of 0 is ignored */
595 	FIT_LOAD_REQUIRED,	/* Must be provided */
596 };
597 
598 int boot_get_setup(struct bootm_headers *images, uint8_t arch, ulong *setup_start,
599 		   ulong *setup_len);
600 
601 /* Image format types, returned by _get_format() routine */
602 #define IMAGE_FORMAT_INVALID	0x00
603 #define IMAGE_FORMAT_LEGACY	0x01	/* legacy image_header based format */
604 #define IMAGE_FORMAT_FIT	0x02	/* new, libfdt based format */
605 #define IMAGE_FORMAT_ANDROID	0x03	/* Android boot image */
606 
607 /**
608  * genimg_get_kernel_addr_fit() - Parse FIT specifier
609  *
610  * Get the real kernel start address from a string which is normally the first
611  * argv of bootm/bootz
612  *
613  * These cases are dealt with, based on the value of @img_addr:
614  *    NULL: Returns image_load_addr, does not set last two args
615  *    "<addr>": Returns address
616  *
617  * For FIT:
618  *    "[<addr>]#<conf>": Returns address (or image_load_addr),
619  *	sets fit_uname_config to config name
620  *    "[<addr>]:<subimage>": Returns address (or image_load_addr) and sets
621  *	fit_uname_kernel to the subimage name
622  *
623  * @img_addr: a string might contain real image address (or NULL)
624  * @fit_uname_config: Returns configuration unit name
625  * @fit_uname_kernel: Returns subimage name
626  *
627  * Returns: kernel start address
628  */
629 ulong genimg_get_kernel_addr_fit(const char *const img_addr,
630 				 const char **fit_uname_config,
631 				 const char **fit_uname_kernel);
632 
633 ulong genimg_get_kernel_addr(char * const img_addr);
634 int genimg_get_format(const void *img_addr);
635 int genimg_has_config(struct bootm_headers *images);
636 
637 /**
638  * boot_get_fpga() - Locate the FPGA image
639  *
640  * @images: Information about images being loaded
641  * Return 0 if OK, non-zero on failure
642  */
643 int boot_get_fpga(struct bootm_headers *images);
644 
645 /**
646  * boot_get_ramdisk() - Locate the ramdisk
647  *
648  * @select: address or name of ramdisk to use, or NULL for default
649  * @images: pointer to the bootm images structure
650  * @arch: expected ramdisk architecture
651  * @rd_start: pointer to a ulong variable, will hold ramdisk start address
652  * @rd_end: pointer to a ulong variable, will hold ramdisk end
653  *
654  * boot_get_ramdisk() is responsible for finding a valid ramdisk image.
655  * Currently supported are the following ramdisk sources:
656  *      - multicomponent kernel/ramdisk image,
657  *      - commandline provided address of decicated ramdisk image.
658  *
659  * returns:
660  *     0, if ramdisk image was found and valid, or skiped
661  *     rd_start and rd_end are set to ramdisk start/end addresses if
662  *     ramdisk image is found and valid
663  *
664  *     1, if ramdisk image is found but corrupted, or invalid
665  *     rd_start and rd_end are set to 0 if no ramdisk exists
666  */
667 int boot_get_ramdisk(char const *select, struct bootm_headers *images,
668 		     uint arch, ulong *rd_start, ulong *rd_end);
669 
670 /**
671  * boot_get_loadable() - load a list of binaries to memory
672  *
673  * @images: pointer to the bootm images structure
674  *
675  * Takes the given FIT configuration, then looks for a field named
676  * "loadables", a list of elements in the FIT given as strings, e.g.:
677  *   loadables = "linux_kernel", "fdt-2";
678  *
679  * Each string is parsed, loading the corresponding element from the FIT into
680  * memory.  Once placed, no additional actions are taken.
681  *
682  * Return:
683  *     0, if only valid images or no images are found
684  *     error code, if an error occurs during fit_image_load
685  */
686 int boot_get_loadable(struct bootm_headers *images);
687 
688 int boot_get_setup_fit(struct bootm_headers *images, uint8_t arch,
689 		       ulong *setup_start, ulong *setup_len);
690 
691 /**
692  * boot_get_fdt_fit() - load a DTB from a FIT file (applying overlays)
693  *
694  * This deals with all aspects of loading an DTB from a FIT.
695  * The correct base image based on configuration will be selected, and
696  * then any overlays specified will be applied (as present in fit_uname_configp).
697  *
698  * @param images	Boot images structure
699  * @param addr		Address of FIT in memory
700  * @param fit_unamep	On entry this is the requested image name
701  *			(e.g. "kernel") or NULL to use the default. On exit
702  *			points to the selected image name
703  * @param fit_uname_configp	On entry this is the requested configuration
704  *			name (e.g. "conf-1") or NULL to use the default. On
705  *			exit points to the selected configuration name.
706  * @param arch		Expected architecture (IH_ARCH_...)
707  * @param datap		Returns address of loaded image
708  * @param lenp		Returns length of loaded image
709  *
710  * Return: node offset of base image, or -ve error code on error
711  */
712 int boot_get_fdt_fit(struct bootm_headers *images, ulong addr,
713 		     const char **fit_unamep, const char **fit_uname_configp,
714 		     int arch, ulong *datap, ulong *lenp);
715 
716 /**
717  * fit_image_load() - load an image from a FIT
718  *
719  * This deals with all aspects of loading an image from a FIT, including
720  * selecting the right image based on configuration, verifying it, printing
721  * out progress messages, checking the type/arch/os and optionally copying it
722  * to the right load address.
723  *
724  * The property to look up is defined by image_type.
725  *
726  * @param images	Boot images structure
727  * @param addr		Address of FIT in memory
728  * @param fit_unamep	On entry this is the requested image name
729  *			(e.g. "kernel") or NULL to use the default. On exit
730  *			points to the selected image name
731  * @param fit_uname_configp	On entry this is the requested configuration
732  *			name (e.g. "conf-1") or NULL to use the default. On
733  *			exit points to the selected configuration name.
734  * @param arch		Expected architecture (IH_ARCH_...)
735  * @param image_ph_type	Required image type (IH_TYPE_...). If this is
736  *			IH_TYPE_KERNEL then we allow IH_TYPE_KERNEL_NOLOAD
737  *			also. If a phase is required, this is included also,
738  *			see image_phase_and_type()
739  * @param bootstage_id	ID of starting bootstage to use for progress updates.
740  *			This will be added to the BOOTSTAGE_SUB values when
741  *			calling bootstage_mark()
742  * @param load_op	Decribes what to do with the load address
743  * @param datap		Returns address of loaded image
744  * @param lenp		Returns length of loaded image
745  * Return: node offset of image, or -ve error code on error:
746  *   -ENOEXEC - unsupported architecture
747  *   -ENOENT - could not find image / subimage
748  *   -EACCES - hash, signature or decryptions failure
749  *   -EBADF - invalid OS or image type, or cannot get image load-address
750  *   -EXDEV - memory overwritten / overlap
751  *   -NOEXEC - image decompression error, or invalid FDT
752  */
753 int fit_image_load(struct bootm_headers *images, ulong addr,
754 		   const char **fit_unamep, const char **fit_uname_configp,
755 		   int arch, int image_ph_type, int bootstage_id,
756 		   enum fit_load_op load_op, ulong *datap, ulong *lenp);
757 
758 /**
759  * image_locate_script() - Locate the raw script in an image
760  *
761  * @buf: Address of image
762  * @size: Size of image in bytes
763  * @fit_uname: Node name of FIT image to read
764  * @confname: Node name of FIT config to read
765  * @datap: Returns pointer to raw script on success
766  * @lenp: Returns size of raw script on success
767  * @return 0 if OK, non-zero on error
768  */
769 int image_locate_script(void *buf, int size, const char *fit_uname,
770 			const char *confname, char **datap, uint *lenp);
771 
772 /**
773  * fit_get_node_from_config() - Look up an image a FIT by type
774  *
775  * This looks in the selected conf- node (images->fit_uname_cfg) for a
776  * particular image type (e.g. "kernel") and then finds the image that is
777  * referred to.
778  *
779  * For example, for something like:
780  *
781  * images {
782  *	kernel {
783  *		...
784  *	};
785  * };
786  * configurations {
787  *	conf-1 {
788  *		kernel = "kernel";
789  *	};
790  * };
791  *
792  * the function will return the node offset of the kernel@1 node, assuming
793  * that conf-1 is the chosen configuration.
794  *
795  * @param images	Boot images structure
796  * @param prop_name	Property name to look up (FIT_..._PROP)
797  * @param addr		Address of FIT in memory
798  */
799 int fit_get_node_from_config(struct bootm_headers *images,
800 			     const char *prop_name, ulong addr);
801 
802 /**
803  * boot_get_fdt() - locate FDT devicetree to use for booting
804  *
805  * @buf: Pointer to image
806  * @select: FDT to select (this is normally argv[2] of the bootm command)
807  * @arch: architecture (IH_ARCH_...)
808  * @images: pointer to the bootm images structure
809  * @of_flat_tree: pointer to a char* variable, will hold fdt start address
810  * @of_size: pointer to a ulong variable, will hold fdt length
811  *
812  * boot_get_fdt() is responsible for finding a valid flat device tree image.
813  * Currently supported are the following FDT sources:
814  *      - multicomponent kernel/ramdisk/FDT image,
815  *      - commandline provided address of decicated FDT image.
816  *
817  * Return:
818  *     0, if fdt image was found and valid, or skipped
819  *     of_flat_tree and of_size are set to fdt start address and length if
820  *     fdt image is found and valid
821  *
822  *     1, if fdt image is found but corrupted
823  *     of_flat_tree and of_size are set to 0 if no fdt exists
824  */
825 int boot_get_fdt(void *buf, const char *select, uint arch,
826 		 struct bootm_headers *images, char **of_flat_tree,
827 		 ulong *of_size);
828 
829 void boot_fdt_add_mem_rsv_regions(void *fdt_blob);
830 int boot_relocate_fdt(char **of_flat_tree, ulong *of_size);
831 
832 int boot_ramdisk_high(ulong rd_data, ulong rd_len, ulong *initrd_start,
833 		      ulong *initrd_end);
834 int boot_get_cmdline(ulong *cmd_start, ulong *cmd_end);
835 int boot_get_kbd(struct bd_info **kbd);
836 
837 /*******************************************************************/
838 /* Legacy format specific code (prefixed with image_) */
839 /*******************************************************************/
image_get_header_size(void)840 static inline uint32_t image_get_header_size(void)
841 {
842 	return sizeof(struct legacy_img_hdr);
843 }
844 
845 #define image_get_hdr_l(f) \
846 	static inline uint32_t image_get_##f(const struct legacy_img_hdr *hdr) \
847 	{ \
848 		return uimage_to_cpu(hdr->ih_##f); \
849 	}
850 image_get_hdr_l(magic)		/* image_get_magic */
image_get_hdr_l(hcrc)851 image_get_hdr_l(hcrc)		/* image_get_hcrc */
852 image_get_hdr_l(time)		/* image_get_time */
853 image_get_hdr_l(size)		/* image_get_size */
854 image_get_hdr_l(load)		/* image_get_load */
855 image_get_hdr_l(ep)		/* image_get_ep */
856 image_get_hdr_l(dcrc)		/* image_get_dcrc */
857 
858 #define image_get_hdr_b(f) \
859 	static inline uint8_t image_get_##f(const struct legacy_img_hdr *hdr) \
860 	{ \
861 		return hdr->ih_##f; \
862 	}
863 image_get_hdr_b(os)		/* image_get_os */
864 image_get_hdr_b(arch)		/* image_get_arch */
865 image_get_hdr_b(type)		/* image_get_type */
866 image_get_hdr_b(comp)		/* image_get_comp */
867 
868 static inline char *image_get_name(const struct legacy_img_hdr *hdr)
869 {
870 	return (char *)hdr->ih_name;
871 }
872 
image_get_data_size(const struct legacy_img_hdr * hdr)873 static inline uint32_t image_get_data_size(const struct legacy_img_hdr *hdr)
874 {
875 	return image_get_size(hdr);
876 }
877 
878 /**
879  * image_get_data - get image payload start address
880  * @hdr: image header
881  *
882  * image_get_data() returns address of the image payload. For single
883  * component images it is image data start. For multi component
884  * images it points to the null terminated table of sub-images sizes.
885  *
886  * returns:
887  *     image payload data start address
888  */
image_get_data(const struct legacy_img_hdr * hdr)889 static inline ulong image_get_data(const struct legacy_img_hdr *hdr)
890 {
891 	return ((ulong)hdr + image_get_header_size());
892 }
893 
image_get_image_size(const struct legacy_img_hdr * hdr)894 static inline uint32_t image_get_image_size(const struct legacy_img_hdr *hdr)
895 {
896 	return (image_get_size(hdr) + image_get_header_size());
897 }
898 
image_get_image_end(const struct legacy_img_hdr * hdr)899 static inline ulong image_get_image_end(const struct legacy_img_hdr *hdr)
900 {
901 	return ((ulong)hdr + image_get_image_size(hdr));
902 }
903 
904 #define image_set_hdr_l(f) \
905 	static inline void image_set_##f(struct legacy_img_hdr *hdr, uint32_t val) \
906 	{ \
907 		hdr->ih_##f = cpu_to_uimage(val); \
908 	}
909 image_set_hdr_l(magic)		/* image_set_magic */
image_set_hdr_l(hcrc)910 image_set_hdr_l(hcrc)		/* image_set_hcrc */
911 image_set_hdr_l(time)		/* image_set_time */
912 image_set_hdr_l(size)		/* image_set_size */
913 image_set_hdr_l(load)		/* image_set_load */
914 image_set_hdr_l(ep)		/* image_set_ep */
915 image_set_hdr_l(dcrc)		/* image_set_dcrc */
916 
917 #define image_set_hdr_b(f) \
918 	static inline void image_set_##f(struct legacy_img_hdr *hdr, uint8_t val) \
919 	{ \
920 		hdr->ih_##f = val; \
921 	}
922 image_set_hdr_b(os)		/* image_set_os */
923 image_set_hdr_b(arch)		/* image_set_arch */
924 image_set_hdr_b(type)		/* image_set_type */
925 image_set_hdr_b(comp)		/* image_set_comp */
926 
927 static inline void image_set_name(struct legacy_img_hdr *hdr, const char *name)
928 {
929 	/*
930 	 * This is equivalent to: strncpy(image_get_name(hdr), name, IH_NMLEN);
931 	 *
932 	 * Use the tortured code below to avoid a warning with gcc 12. We do not
933 	 * want to include a nul terminator if the name is of length IH_NMLEN
934 	 */
935 	memcpy(image_get_name(hdr), name, strnlen(name, IH_NMLEN));
936 }
937 
938 int image_check_hcrc(const struct legacy_img_hdr *hdr);
939 int image_check_dcrc(const struct legacy_img_hdr *hdr);
940 #ifndef USE_HOSTCC
941 phys_addr_t env_get_bootm_low(void);
942 phys_size_t env_get_bootm_size(void);
943 phys_size_t env_get_bootm_mapsize(void);
944 #endif
945 void memmove_wd(void *to, void *from, size_t len, ulong chunksz);
946 
image_check_magic(const struct legacy_img_hdr * hdr)947 static inline int image_check_magic(const struct legacy_img_hdr *hdr)
948 {
949 	return (image_get_magic(hdr) == IH_MAGIC);
950 }
951 
image_check_type(const struct legacy_img_hdr * hdr,uint8_t type)952 static inline int image_check_type(const struct legacy_img_hdr *hdr, uint8_t type)
953 {
954 	return (image_get_type(hdr) == type);
955 }
956 
image_check_arch(const struct legacy_img_hdr * hdr,uint8_t arch)957 static inline int image_check_arch(const struct legacy_img_hdr *hdr, uint8_t arch)
958 {
959 	/* Let's assume that sandbox can load any architecture */
960 	if (!tools_build() && IS_ENABLED(CONFIG_SANDBOX))
961 		return true;
962 	return (image_get_arch(hdr) == arch) ||
963 		(image_get_arch(hdr) == IH_ARCH_ARM && arch == IH_ARCH_ARM64);
964 }
965 
image_check_os(const struct legacy_img_hdr * hdr,uint8_t os)966 static inline int image_check_os(const struct legacy_img_hdr *hdr, uint8_t os)
967 {
968 	return (image_get_os(hdr) == os);
969 }
970 
971 ulong image_multi_count(const struct legacy_img_hdr *hdr);
972 void image_multi_getimg(const struct legacy_img_hdr *hdr, ulong idx,
973 			ulong *data, ulong *len);
974 
975 void image_print_contents(const void *hdr);
976 
977 #ifndef USE_HOSTCC
image_check_target_arch(const struct legacy_img_hdr * hdr)978 static inline int image_check_target_arch(const struct legacy_img_hdr *hdr)
979 {
980 #ifndef IH_ARCH_DEFAULT
981 # error "please define IH_ARCH_DEFAULT in your arch asm/u-boot.h"
982 #endif
983 	return image_check_arch(hdr, IH_ARCH_DEFAULT);
984 }
985 #endif /* USE_HOSTCC */
986 
987 /**
988  * image_decomp_type() - Find out compression type of an image
989  *
990  * @buf:	Address in U-Boot memory where image is loaded.
991  * @len:	Length of the compressed image.
992  * Return:	compression type or IH_COMP_NONE if not compressed.
993  *
994  * Note: Only following compression types are supported now.
995  * lzo, lzma, gzip, bzip2
996  */
997 int image_decomp_type(const unsigned char *buf, ulong len);
998 
999 /**
1000  * image_decomp() - decompress an image
1001  *
1002  * @comp:	Compression algorithm that is used (IH_COMP_...)
1003  * @load:	Destination load address in U-Boot memory
1004  * @image_start Image start address (where we are decompressing from)
1005  * @type:	OS type (IH_OS_...)
1006  * @load_buf:	Place to decompress to
1007  * @image_buf:	Address to decompress from
1008  * @image_len:	Number of bytes in @image_buf to decompress
1009  * @unc_len:	Available space for decompression
1010  * Return: 0 if OK, -ve on error (BOOTM_ERR_...)
1011  */
1012 int image_decomp(int comp, ulong load, ulong image_start, int type,
1013 		 void *load_buf, void *image_buf, ulong image_len,
1014 		 uint unc_len, ulong *load_end);
1015 
1016 /**
1017  * Set up properties in the FDT
1018  *
1019  * This sets up properties in the FDT that is to be passed to linux.
1020  *
1021  * @images:	Images information
1022  * @blob:	FDT to update
1023  * @lmb:	Flag indicating use of lmb for reserving FDT memory region
1024  * Return: 0 if ok, <0 on failure
1025  */
1026 int image_setup_libfdt(struct bootm_headers *images, void *blob, bool lmb);
1027 
1028 /**
1029  * Set up the FDT to use for booting a kernel
1030  *
1031  * This performs ramdisk setup, sets up the FDT if required, and adds
1032  * paramters to the FDT if libfdt is available.
1033  *
1034  * @param images	Images information
1035  * Return: 0 if ok, <0 on failure
1036  */
1037 int image_setup_linux(struct bootm_headers *images);
1038 
1039 /**
1040  * bootz_setup() - Extract stat and size of a Linux xImage
1041  *
1042  * @image: Address of image
1043  * @start: Returns start address of image
1044  * @end : Returns end address of image
1045  * Return: 0 if OK, 1 if the image was not recognised
1046  */
1047 int bootz_setup(ulong image, ulong *start, ulong *end);
1048 
1049 /**
1050  * Return the correct start address and size of a Linux aarch64 Image.
1051  *
1052  * @image: Address of image
1053  * @start: Returns start address of image
1054  * @size : Returns size image
1055  * @force_reloc: Ignore image->ep field, always place image to RAM start
1056  * Return: 0 if OK, 1 if the image was not recognised
1057  */
1058 int booti_setup(ulong image, ulong *relocated_addr, ulong *size,
1059 		bool force_reloc);
1060 
1061 /*******************************************************************/
1062 /* New uImage format specific code (prefixed with fit_) */
1063 /*******************************************************************/
1064 
1065 #define FIT_IMAGES_PATH		"/images"
1066 #define FIT_CONFS_PATH		"/configurations"
1067 
1068 /* hash/signature/key node */
1069 #define FIT_HASH_NODENAME	"hash"
1070 #define FIT_ALGO_PROP		"algo"
1071 #define FIT_VALUE_PROP		"value"
1072 #define FIT_IGNORE_PROP		"uboot-ignore"
1073 #define FIT_SIG_NODENAME	"signature"
1074 #define FIT_KEY_REQUIRED	"required"
1075 #define FIT_KEY_HINT		"key-name-hint"
1076 
1077 /* cipher node */
1078 #define FIT_CIPHER_NODENAME	"cipher"
1079 #define FIT_ALGO_PROP		"algo"
1080 
1081 /* image node */
1082 #define FIT_DATA_PROP		"data"
1083 #define FIT_DATA_POSITION_PROP	"data-position"
1084 #define FIT_DATA_OFFSET_PROP	"data-offset"
1085 #define FIT_DATA_SIZE_PROP	"data-size"
1086 #define FIT_TIMESTAMP_PROP	"timestamp"
1087 #define FIT_DESC_PROP		"description"
1088 #define FIT_ARCH_PROP		"arch"
1089 #define FIT_TYPE_PROP		"type"
1090 #define FIT_OS_PROP		"os"
1091 #define FIT_COMP_PROP		"compression"
1092 #define FIT_ENTRY_PROP		"entry"
1093 #define FIT_LOAD_PROP		"load"
1094 
1095 /* configuration node */
1096 #define FIT_KERNEL_PROP		"kernel"
1097 #define FIT_RAMDISK_PROP	"ramdisk"
1098 #define FIT_FDT_PROP		"fdt"
1099 #define FIT_LOADABLE_PROP	"loadables"
1100 #define FIT_DEFAULT_PROP	"default"
1101 #define FIT_SETUP_PROP		"setup"
1102 #define FIT_FPGA_PROP		"fpga"
1103 #define FIT_FIRMWARE_PROP	"firmware"
1104 #define FIT_STANDALONE_PROP	"standalone"
1105 #define FIT_SCRIPT_PROP		"script"
1106 #define FIT_PHASE_PROP		"phase"
1107 
1108 #define FIT_MAX_HASH_LEN	HASH_MAX_DIGEST_SIZE
1109 
1110 /* cmdline argument format parsing */
1111 int fit_parse_conf(const char *spec, ulong addr_curr,
1112 		ulong *addr, const char **conf_name);
1113 int fit_parse_subimage(const char *spec, ulong addr_curr,
1114 		ulong *addr, const char **image_name);
1115 
1116 int fit_get_subimage_count(const void *fit, int images_noffset);
1117 void fit_print_contents(const void *fit);
1118 void fit_image_print(const void *fit, int noffset, const char *p);
1119 
1120 /**
1121  * fit_get_end - get FIT image size
1122  * @fit: pointer to the FIT format image header
1123  *
1124  * returns:
1125  *     size of the FIT image (blob) in memory
1126  */
fit_get_size(const void * fit)1127 static inline ulong fit_get_size(const void *fit)
1128 {
1129 	return fdt_totalsize(fit);
1130 }
1131 
1132 /**
1133  * fit_get_end - get FIT image end
1134  * @fit: pointer to the FIT format image header
1135  *
1136  * returns:
1137  *     end address of the FIT image (blob) in memory
1138  */
1139 ulong fit_get_end(const void *fit);
1140 
1141 /**
1142  * fit_get_name - get FIT node name
1143  * @fit: pointer to the FIT format image header
1144  *
1145  * returns:
1146  *     NULL, on error
1147  *     pointer to node name, on success
1148  */
fit_get_name(const void * fit_hdr,int noffset,int * len)1149 static inline const char *fit_get_name(const void *fit_hdr,
1150 		int noffset, int *len)
1151 {
1152 	return fdt_get_name(fit_hdr, noffset, len);
1153 }
1154 
1155 int fit_get_desc(const void *fit, int noffset, char **desc);
1156 int fit_get_timestamp(const void *fit, int noffset, time_t *timestamp);
1157 
1158 int fit_image_get_node(const void *fit, const char *image_uname);
1159 int fit_image_get_os(const void *fit, int noffset, uint8_t *os);
1160 int fit_image_get_arch(const void *fit, int noffset, uint8_t *arch);
1161 int fit_image_get_type(const void *fit, int noffset, uint8_t *type);
1162 int fit_image_get_comp(const void *fit, int noffset, uint8_t *comp);
1163 int fit_image_get_load(const void *fit, int noffset, ulong *load);
1164 int fit_image_get_entry(const void *fit, int noffset, ulong *entry);
1165 int fit_image_get_emb_data(const void *fit, int noffset, const void **data,
1166 			   size_t *size);
1167 int fit_image_get_data_offset(const void *fit, int noffset, int *data_offset);
1168 int fit_image_get_data_position(const void *fit, int noffset,
1169 				int *data_position);
1170 int fit_image_get_data_size(const void *fit, int noffset, int *data_size);
1171 int fit_image_get_data_size_unciphered(const void *fit, int noffset,
1172 				       size_t *data_size);
1173 int fit_image_get_data(const void *fit, int noffset, const void **data,
1174 		       size_t *size);
1175 
1176 /**
1177  * fit_image_get_phase() - Get the phase from a FIT image
1178  *
1179  * @fit: FIT to read from
1180  * @offset: offset node to read
1181  * @phasep: Returns phase, if any
1182  * Return: 0 if read OK and *phasep is value, -ENOENT if there was no phase
1183  * property in the node, other -ve value on other error
1184  */
1185 int fit_image_get_phase(const void *fit, int offset,
1186 			enum image_phase_t *phasep);
1187 
1188 /**
1189  * fit_get_data_node() - Get verified image data for an image
1190  * @fit: Pointer to the FIT format image header
1191  * @image_uname: The name of the image node
1192  * @data: A pointer which will be filled with the location of the image data
1193  * @size: A pointer which will be filled with the size of the image data
1194  *
1195  * This function looks up the location and size of an image specified by its
1196  * name. For example, if you had a FIT like::
1197  *
1198  *     images {
1199  *         my-firmware {
1200  *             ...
1201  *	   };
1202  *      };
1203  *
1204  * Then you could look up the data location and size of the my-firmware image
1205  * by calling this function with @image_uname set to "my-firmware". This
1206  * function also verifies the image data (if enabled) before returning. The
1207  * image description is printed out on success. @data and @size will not be
1208  * modified on faulure.
1209  *
1210  * Return:
1211  * * 0 on success
1212  * * -EINVAL if the image could not be verified
1213  * * -ENOENT if there was a problem getting the data/size
1214  * * Another negative error if there was a problem looking up the image node.
1215  */
1216 int fit_get_data_node(const void *fit, const char *image_uname,
1217 		      const void **data, size_t *size);
1218 
1219 /**
1220  * fit_get_data_conf_prop() - Get verified image data for a property in /conf
1221  * @fit: Pointer to the FIT format image header
1222  * @prop_name: The name of the property in /conf referencing the image
1223  * @data: A pointer which will be filled with the location of the image data
1224  * @size: A pointer which will be filled with the size of the image data
1225  *
1226  * This function looks up the location and size of an image specified by a
1227  * property in /conf. For example, if you had a FIT like::
1228  *
1229  *     images {
1230  *         my-firmware {
1231  *             ...
1232  *	   };
1233  *      };
1234  *
1235  *      configurations {
1236  *          default = "conf-1";
1237  *          conf-1 {
1238  *              some-firmware = "my-firmware";
1239  *          };
1240  *      };
1241  *
1242  * Then you could look up the data location and size of the my-firmware image
1243  * by calling this function with @prop_name set to "some-firmware". This
1244  * function also verifies the image data (if enabled) before returning. The
1245  * image description is printed out on success. @data and @size will not be
1246  * modified on faulure.
1247  *
1248  * Return:
1249  * * 0 on success
1250  * * -EINVAL if the image could not be verified
1251  * * -ENOENT if there was a problem getting the data/size
1252  * * Another negative error if there was a problem looking up the configuration
1253  *   or image node.
1254  */
1255 int fit_get_data_conf_prop(const void *fit, const char *prop_name,
1256 			   const void **data, size_t *size);
1257 
1258 int fit_image_hash_get_algo(const void *fit, int noffset, const char **algo);
1259 int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value,
1260 				int *value_len);
1261 
1262 int fit_set_timestamp(void *fit, int noffset, time_t timestamp);
1263 
1264 /**
1265  * fit_pre_load_data() - add public key to fdt blob
1266  *
1267  * Adds public key to the node pre load.
1268  *
1269  * @keydir:	Directory containing keys
1270  * @keydest:	FDT blob to write public key
1271  * @fit:	Pointer to the FIT format image header
1272  *
1273  * returns:
1274  *	0, on success
1275  *	< 0, on failure
1276  */
1277 int fit_pre_load_data(const char *keydir, void *keydest, void *fit);
1278 
1279 int fit_cipher_data(const char *keydir, void *keydest, void *fit,
1280 		    const char *comment, int require_keys,
1281 		    const char *engine_id, const char *cmdname);
1282 
1283 #define NODE_MAX_NAME_LEN	80
1284 
1285 /**
1286  * struct image_summary  - Provides information about signing info added
1287  *
1288  * @sig_offset: Offset of the node in the blob devicetree where the signature
1289  *	was wriiten
1290  * @sig_path: Path to @sig_offset
1291  * @keydest_offset: Offset of the node in the keydest devicetree where the
1292  *	public key was written (-1 if none)
1293  * @keydest_path: Path to @keydest_offset
1294  */
1295 struct image_summary {
1296 	int sig_offset;
1297 	char sig_path[NODE_MAX_NAME_LEN];
1298 	int keydest_offset;
1299 	char keydest_path[NODE_MAX_NAME_LEN];
1300 };
1301 
1302 /**
1303  * fit_add_verification_data() - add verification data to FIT image nodes
1304  *
1305  * @keydir:	Directory containing keys
1306  * @kwydest:	FDT blob to write public key information to (NULL if none)
1307  * @fit:	Pointer to the FIT format image header
1308  * @comment:	Comment to add to signature nodes
1309  * @require_keys: Mark all keys as 'required'
1310  * @engine_id:	Engine to use for signing
1311  * @cmdname:	Command name used when reporting errors
1312  * @algo_name:	Algorithm name, or NULL if to be read from FIT
1313  * @summary:	Returns information about what data was written
1314  *
1315  * Adds hash values for all component images in the FIT blob.
1316  * Hashes are calculated for all component images which have hash subnodes
1317  * with algorithm property set to one of the supported hash algorithms.
1318  *
1319  * Also add signatures if signature nodes are present.
1320  *
1321  * returns
1322  *     0, on success
1323  *     libfdt error code, on failure
1324  */
1325 int fit_add_verification_data(const char *keydir, const char *keyfile,
1326 			      void *keydest, void *fit, const char *comment,
1327 			      int require_keys, const char *engine_id,
1328 			      const char *cmdname, const char *algo_name,
1329 			      struct image_summary *summary);
1330 
1331 /**
1332  * fit_image_verify_with_data() - Verify an image with given data
1333  *
1334  * @fit:	Pointer to the FIT format image header
1335  * @image_offset: Offset in @fit of image to verify
1336  * @key_blob:	FDT containing public keys
1337  * @data:	Image data to verify
1338  * @size:	Size of image data
1339  */
1340 int fit_image_verify_with_data(const void *fit, int image_noffset,
1341 			       const void *key_blob, const void *data,
1342 			       size_t size);
1343 
1344 int fit_image_verify(const void *fit, int noffset);
1345 #if CONFIG_IS_ENABLED(FIT_SIGNATURE)
1346 int fit_config_verify(const void *fit, int conf_noffset);
1347 #else
fit_config_verify(const void * fit,int conf_noffset)1348 static inline int fit_config_verify(const void *fit, int conf_noffset)
1349 {
1350 	return 0;
1351 }
1352 #endif
1353 int fit_all_image_verify(const void *fit);
1354 int fit_config_decrypt(const void *fit, int conf_noffset);
1355 int fit_image_check_os(const void *fit, int noffset, uint8_t os);
1356 int fit_image_check_arch(const void *fit, int noffset, uint8_t arch);
1357 int fit_image_check_type(const void *fit, int noffset, uint8_t type);
1358 int fit_image_check_comp(const void *fit, int noffset, uint8_t comp);
1359 
1360 /**
1361  * fit_check_format() - Check that the FIT is valid
1362  *
1363  * This performs various checks on the FIT to make sure it is suitable for
1364  * use, looking for mandatory properties, nodes, etc.
1365  *
1366  * If FIT_FULL_CHECK is enabled, it also runs it through libfdt to make
1367  * sure that there are no strange tags or broken nodes in the FIT.
1368  *
1369  * @fit: pointer to the FIT format image header
1370  * Return: 0 if OK, -ENOEXEC if not an FDT file, -EINVAL if the full FDT check
1371  *	failed (e.g. due to bad structure), -ENOMSG if the description is
1372  *	missing, -EBADMSG if the timestamp is missing, -ENOENT if the /images
1373  *	path is missing
1374  */
1375 int fit_check_format(const void *fit, ulong size);
1376 
1377 /**
1378  * fit_conf_find_compat() - find most compatible configuration
1379  * @fit: pointer to the FIT format image header
1380  * @fdt: pointer to the device tree to compare against
1381  *
1382  * Attempts to find the configuration whose fdt is the most compatible with the
1383  * passed in device tree
1384  *
1385  * Example::
1386  *
1387  *    / o image-tree
1388  *      |-o images
1389  *      | |-o fdt-1
1390  *      | |-o fdt-2
1391  *      |
1392  *      |-o configurations
1393  *        |-o config-1
1394  *        | |-fdt = fdt-1
1395  *        |
1396  *        |-o config-2
1397  *          |-fdt = fdt-2
1398  *
1399  *    / o U-Boot fdt
1400  *      |-compatible = "foo,bar", "bim,bam"
1401  *
1402  *    / o kernel fdt1
1403  *      |-compatible = "foo,bar",
1404  *
1405  *    / o kernel fdt2
1406  *      |-compatible = "bim,bam", "baz,biz"
1407  *
1408  * Configuration 1 would be picked because the first string in U-Boot's
1409  * compatible list, "foo,bar", matches a compatible string in the root of fdt1.
1410  * "bim,bam" in fdt2 matches the second string which isn't as good as fdt1.
1411  *
1412  * As an optimization, the compatible property from the FDT's root node can be
1413  * copied into the configuration node in the FIT image. This is required to
1414  * match configurations with compressed FDTs.
1415  *
1416  * Returns: offset to the configuration to use if one was found, -EINVAL if
1417  * there a /configurations or /images node is missing, -ENOENT if no match was
1418  * found, -ENXIO if the FDT node has no compatible string
1419  */
1420 int fit_conf_find_compat(const void *fit, const void *fdt);
1421 
1422 /**
1423  * fit_conf_get_node - get node offset for configuration of a given unit name
1424  * @fit: pointer to the FIT format image header
1425  * @conf_uname: configuration node unit name (NULL to use default)
1426  *
1427  * fit_conf_get_node() finds a configuration (within the '/configurations'
1428  * parent node) of a provided unit name. If configuration is found its node
1429  * offset is returned to the caller.
1430  *
1431  * When NULL is provided in second argument fit_conf_get_node() will search
1432  * for a default configuration node instead. Default configuration node unit
1433  * name is retrieved from FIT_DEFAULT_PROP property of the '/configurations'
1434  * node.
1435  *
1436  * returns:
1437  *     configuration node offset when found (>=0)
1438  *     negative number on failure (FDT_ERR_* code)
1439  */
1440 int fit_conf_get_node(const void *fit, const char *conf_uname);
1441 
1442 int fit_conf_get_prop_node_count(const void *fit, int noffset,
1443 		const char *prop_name);
1444 int fit_conf_get_prop_node_index(const void *fit, int noffset,
1445 		const char *prop_name, int index);
1446 
1447 /**
1448  * fit_conf_get_prop_node() - Get node refered to by a configuration
1449  * @fit:	FIT to check
1450  * @noffset:	Offset of conf@xxx node to check
1451  * @prop_name:	Property to read from the conf node
1452  * @phase:	Image phase to use, IH_PHASE_NONE for any
1453  *
1454  * The conf- nodes contain references to other nodes, using properties
1455  * like 'kernel = "kernel"'. Given such a property name (e.g. "kernel"),
1456  * return the offset of the node referred to (e.g. offset of node
1457  * "/images/kernel".
1458  */
1459 int fit_conf_get_prop_node(const void *fit, int noffset, const char *prop_name,
1460 			   enum image_phase_t phase);
1461 
1462 int fit_check_ramdisk(const void *fit, int os_noffset,
1463 		uint8_t arch, int verify);
1464 
1465 int calculate_hash(const void *data, int data_len, const char *algo,
1466 			uint8_t *value, int *value_len);
1467 
1468 /*
1469  * At present we only support signing on the host, and verification on the
1470  * device
1471  */
1472 #if defined(USE_HOSTCC)
1473 # if CONFIG_IS_ENABLED(FIT_SIGNATURE)
1474 #  define IMAGE_ENABLE_SIGN	1
1475 #  define FIT_IMAGE_ENABLE_VERIFY	1
1476 #  include <openssl/evp.h>
1477 # else
1478 #  define IMAGE_ENABLE_SIGN	0
1479 #  define FIT_IMAGE_ENABLE_VERIFY	0
1480 # endif
1481 #else
1482 # define IMAGE_ENABLE_SIGN	0
1483 # define FIT_IMAGE_ENABLE_VERIFY	CONFIG_IS_ENABLED(FIT_SIGNATURE)
1484 #endif
1485 
1486 #ifdef USE_HOSTCC
1487 void *image_get_host_blob(void);
1488 void image_set_host_blob(void *host_blob);
1489 # define gd_fdt_blob()		image_get_host_blob()
1490 #else
1491 # define gd_fdt_blob()		(gd->fdt_blob)
1492 #endif
1493 
1494 /*
1495  * Information passed to the signing routines
1496  *
1497  * Either 'keydir',  'keyname', or 'keyfile' can be NULL. However, either
1498  * 'keyfile', or both 'keydir' and 'keyname' should have valid values. If
1499  * neither are valid, some operations might fail with EINVAL.
1500  */
1501 struct image_sign_info {
1502 	const char *keydir;		/* Directory conaining keys */
1503 	const char *keyname;		/* Name of key to use */
1504 	const char *keyfile;		/* Filename of private or public key */
1505 	const void *fit;		/* Pointer to FIT blob */
1506 	int node_offset;		/* Offset of signature node */
1507 	const char *name;		/* Algorithm name */
1508 	struct checksum_algo *checksum;	/* Checksum algorithm information */
1509 	struct padding_algo *padding;	/* Padding algorithm information */
1510 	struct crypto_algo *crypto;	/* Crypto algorithm information */
1511 	const void *fdt_blob;		/* FDT containing public keys */
1512 	int required_keynode;		/* Node offset of key to use: -1=any */
1513 	const char *require_keys;	/* Value for 'required' property */
1514 	const char *engine_id;		/* Engine to use for signing */
1515 	/*
1516 	 * Note: the following two fields are always valid even w/o
1517 	 * RSA_VERIFY_WITH_PKEY in order to make sure this structure is
1518 	 * the same on target and host. Otherwise, vboot test may fail.
1519 	 */
1520 	const void *key;		/* Pointer to public key in DER */
1521 	int keylen;			/* Length of public key */
1522 };
1523 
1524 /* A part of an image, used for hashing */
1525 struct image_region {
1526 	const void *data;
1527 	int size;
1528 };
1529 
1530 struct checksum_algo {
1531 	const char *name;
1532 	const int checksum_len;
1533 	const int der_len;
1534 	const uint8_t *der_prefix;
1535 #if IMAGE_ENABLE_SIGN
1536 	const EVP_MD *(*calculate_sign)(void);
1537 #endif
1538 	int (*calculate)(const char *name,
1539 			 const struct image_region *region,
1540 			 int region_count, uint8_t *checksum);
1541 };
1542 
1543 struct crypto_algo {
1544 	const char *name;		/* Name of algorithm */
1545 	const int key_len;
1546 
1547 	/**
1548 	 * sign() - calculate and return signature for given input data
1549 	 *
1550 	 * @info:	Specifies key and FIT information
1551 	 * @data:	Pointer to the input data
1552 	 * @data_len:	Data length
1553 	 * @sigp:	Set to an allocated buffer holding the signature
1554 	 * @sig_len:	Set to length of the calculated hash
1555 	 *
1556 	 * This computes input data signature according to selected algorithm.
1557 	 * Resulting signature value is placed in an allocated buffer, the
1558 	 * pointer is returned as *sigp. The length of the calculated
1559 	 * signature is returned via the sig_len pointer argument. The caller
1560 	 * should free *sigp.
1561 	 *
1562 	 * @return: 0, on success, -ve on error
1563 	 */
1564 	int (*sign)(struct image_sign_info *info,
1565 		    const struct image_region region[],
1566 		    int region_count, uint8_t **sigp, uint *sig_len);
1567 
1568 	/**
1569 	 * add_verify_data() - Add verification information to FDT
1570 	 *
1571 	 * Add public key information to the FDT node, suitable for
1572 	 * verification at run-time. The information added depends on the
1573 	 * algorithm being used.
1574 	 *
1575 	 * @info:	Specifies key and FIT information
1576 	 * @keydest:	Destination FDT blob for public key data
1577 	 * @return: node offset within the FDT blob where the data was written,
1578 	 *	or -ve on error
1579 	 */
1580 	int (*add_verify_data)(struct image_sign_info *info, void *keydest);
1581 
1582 	/**
1583 	 * verify() - Verify a signature against some data
1584 	 *
1585 	 * @info:	Specifies key and FIT information
1586 	 * @data:	Pointer to the input data
1587 	 * @data_len:	Data length
1588 	 * @sig:	Signature
1589 	 * @sig_len:	Number of bytes in signature
1590 	 * @return 0 if verified, -ve on error
1591 	 */
1592 	int (*verify)(struct image_sign_info *info,
1593 		      const struct image_region region[], int region_count,
1594 		      uint8_t *sig, uint sig_len);
1595 };
1596 
1597 /* Declare a new U-Boot crypto algorithm handler */
1598 #define U_BOOT_CRYPTO_ALGO(__name)						\
1599 ll_entry_declare(struct crypto_algo, __name, cryptos)
1600 
1601 struct padding_algo {
1602 	const char *name;
1603 	int (*verify)(struct image_sign_info *info,
1604 		      const uint8_t *pad, int pad_len,
1605 		      const uint8_t *hash, int hash_len);
1606 };
1607 
1608 /* Declare a new U-Boot padding algorithm handler */
1609 #define U_BOOT_PADDING_ALGO(__name)						\
1610 ll_entry_declare(struct padding_algo, __name, paddings)
1611 
1612 /**
1613  * image_get_checksum_algo() - Look up a checksum algorithm
1614  *
1615  * @param full_name	Name of algorithm in the form "checksum,crypto"
1616  * Return: pointer to algorithm information, or NULL if not found
1617  */
1618 struct checksum_algo *image_get_checksum_algo(const char *full_name);
1619 
1620 /**
1621  * image_get_crypto_algo() - Look up a cryptosystem algorithm
1622  *
1623  * @param full_name	Name of algorithm in the form "checksum,crypto"
1624  * Return: pointer to algorithm information, or NULL if not found
1625  */
1626 struct crypto_algo *image_get_crypto_algo(const char *full_name);
1627 
1628 /**
1629  * image_get_padding_algo() - Look up a padding algorithm
1630  *
1631  * @param name		Name of padding algorithm
1632  * Return: pointer to algorithm information, or NULL if not found
1633  */
1634 struct padding_algo *image_get_padding_algo(const char *name);
1635 
1636 #define IMAGE_PRE_LOAD_SIG_MAGIC		0x55425348
1637 #define IMAGE_PRE_LOAD_SIG_OFFSET_MAGIC		0
1638 #define IMAGE_PRE_LOAD_SIG_OFFSET_IMG_LEN	4
1639 #define IMAGE_PRE_LOAD_SIG_OFFSET_SIG		8
1640 
1641 #define IMAGE_PRE_LOAD_PATH			"/image/pre-load/sig"
1642 #define IMAGE_PRE_LOAD_PROP_ALGO_NAME		"algo-name"
1643 #define IMAGE_PRE_LOAD_PROP_PADDING_NAME	"padding-name"
1644 #define IMAGE_PRE_LOAD_PROP_SIG_SIZE		"signature-size"
1645 #define IMAGE_PRE_LOAD_PROP_PUBLIC_KEY		"public-key"
1646 #define IMAGE_PRE_LOAD_PROP_MANDATORY		"mandatory"
1647 
1648 /*
1649  * Information in the device-tree about the signature in the header
1650  */
1651 struct image_sig_info {
1652 	char *algo_name;	/* Name of the algo (eg: sha256,rsa2048) */
1653 	char *padding_name;	/* Name of the padding */
1654 	uint8_t *key;		/* Public signature key */
1655 	int key_len;		/* Length of the public key */
1656 	uint32_t sig_size;		/* size of the signature (in the header) */
1657 	int mandatory;		/* Set if the signature is mandatory */
1658 
1659 	struct image_sign_info sig_info; /* Signature info */
1660 };
1661 
1662 /*
1663  * Header of the signature header
1664  */
1665 struct sig_header_s {
1666 	uint32_t magic;
1667 	uint32_t version;
1668 	uint32_t header_size;
1669 	uint32_t image_size;
1670 	uint32_t offset_img_sig;
1671 	uint32_t flags;
1672 	uint32_t reserved0;
1673 	uint32_t reserved1;
1674 	uint8_t sha256_img_sig[SHA256_SUM_LEN];
1675 };
1676 
1677 #define SIG_HEADER_LEN			(sizeof(struct sig_header_s))
1678 
1679 /**
1680  * image_pre_load() - Manage pre load header
1681  *
1682  * Manage the pre-load header before launching the image.
1683  * It checks the signature of the image. It also set the
1684  * variable image_load_offset to skip this header before
1685  * launching the image.
1686  *
1687  * @param addr		Address of the image
1688  * @return: 0 on success, -ve on error
1689  */
1690 int image_pre_load(ulong addr);
1691 
1692 #if defined(USE_HOSTCC) && CONFIG_IS_ENABLED(LIBCRYPTO)
1693 /**
1694  * rsa_verify_openssl() - Verify a signature against some data with openssl API
1695  *
1696  * Verify a RSA PKCS1.5/PSS signature against an expected hash.
1697  *
1698  * @info:		Specifies the key and algorithms
1699  * @region:		Pointer to the input data
1700  * @region_count:	Number of region
1701  * @sig:		Signature
1702  * @sig_len:		Number of bytes in the signature
1703  * Return: 0 if verified, -ve on error
1704  */
1705 int rsa_verify_openssl(struct image_sign_info *info,
1706 		       const struct image_region region[], int region_count,
1707 		       uint8_t *sig, uint sig_len);
1708 #endif
1709 
1710 /**
1711  * fit_image_verify_required_sigs() - Verify signatures marked as 'required'
1712  *
1713  * @fit:		FIT to check
1714  * @image_noffset:	Offset of image node to check
1715  * @data:		Image data to check
1716  * @size:		Size of image data
1717  * @key_blob:		FDT containing public keys
1718  * @no_sigsp:		Returns 1 if no signatures were required, and
1719  *			therefore nothing was checked. The caller may wish
1720  *			to fall back to other mechanisms, or refuse to
1721  *			boot.
1722  * Return: 0 if all verified ok, <0 on error
1723  */
1724 int fit_image_verify_required_sigs(const void *fit, int image_noffset,
1725 		const char *data, size_t size, const void *key_blob,
1726 		int *no_sigsp);
1727 
1728 /**
1729  * fit_image_check_sig() - Check a single image signature node
1730  *
1731  * @fit:		FIT to check
1732  * @noffset:		Offset of signature node to check
1733  * @data:		Image data to check
1734  * @size:		Size of image data
1735  * @keyblob:		Key blob to check (typically the control FDT)
1736  * @required_keynode:	Offset in the keyblob of the required key node,
1737  *			if any. If this is given, then the image wil not
1738  *			pass verification unless that key is used. If this is
1739  *			-1 then any signature will do.
1740  * @err_msgp:		In the event of an error, this will be pointed to a
1741  *			help error string to display to the user.
1742  * Return: 0 if all verified ok, <0 on error
1743  */
1744 int fit_image_check_sig(const void *fit, int noffset, const void *data,
1745 			size_t size, const void *key_blob, int required_keynode,
1746 			char **err_msgp);
1747 
1748 int fit_image_decrypt_data(const void *fit,
1749 			   int image_noffset, int cipher_noffset,
1750 			   const void *data, size_t size,
1751 			   void **data_unciphered, size_t *size_unciphered);
1752 
1753 /**
1754  * fit_region_make_list() - Make a list of regions to hash
1755  *
1756  * Given a list of FIT regions (offset, size) provided by libfdt, create
1757  * a list of regions (void *, size) for use by the signature creationg
1758  * and verification code.
1759  *
1760  * @fit:		FIT image to process
1761  * @fdt_regions:	Regions as returned by libfdt
1762  * @count:		Number of regions returned by libfdt
1763  * @region:		Place to put list of regions (NULL to allocate it)
1764  * Return: pointer to list of regions, or NULL if out of memory
1765  */
1766 struct image_region *fit_region_make_list(const void *fit,
1767 		struct fdt_region *fdt_regions, int count,
1768 		struct image_region *region);
1769 
fit_image_check_target_arch(const void * fdt,int node)1770 static inline int fit_image_check_target_arch(const void *fdt, int node)
1771 {
1772 #ifndef USE_HOSTCC
1773 	return fit_image_check_arch(fdt, node, IH_ARCH_DEFAULT);
1774 #else
1775 	return 0;
1776 #endif
1777 }
1778 
1779 /*
1780  * At present we only support ciphering on the host, and unciphering on the
1781  * device
1782  */
1783 #if defined(USE_HOSTCC)
1784 # if defined(CONFIG_FIT_CIPHER)
1785 #  define IMAGE_ENABLE_ENCRYPT	1
1786 #  define IMAGE_ENABLE_DECRYPT	1
1787 #  include <openssl/evp.h>
1788 # else
1789 #  define IMAGE_ENABLE_ENCRYPT	0
1790 #  define IMAGE_ENABLE_DECRYPT	0
1791 # endif
1792 #else
1793 # define IMAGE_ENABLE_ENCRYPT	0
1794 # define IMAGE_ENABLE_DECRYPT	CONFIG_IS_ENABLED(FIT_CIPHER)
1795 #endif
1796 
1797 /* Information passed to the ciphering routines */
1798 struct image_cipher_info {
1799 	const char *keydir;		/* Directory containing keys */
1800 	const char *keyname;		/* Name of key to use */
1801 	const char *ivname;		/* Name of IV to use */
1802 	const void *fit;		/* Pointer to FIT blob */
1803 	int node_noffset;		/* Offset of the cipher node */
1804 	const char *name;		/* Algorithm name */
1805 	struct cipher_algo *cipher;	/* Cipher algorithm information */
1806 	const void *fdt_blob;		/* FDT containing key and IV */
1807 	const void *key;		/* Value of the key */
1808 	const void *iv;			/* Value of the IV */
1809 	size_t size_unciphered;		/* Size of the unciphered data */
1810 };
1811 
1812 struct cipher_algo {
1813 	const char *name;		/* Name of algorithm */
1814 	int key_len;			/* Length of the key */
1815 	int iv_len;			/* Length of the IV */
1816 
1817 #if IMAGE_ENABLE_ENCRYPT
1818 	const EVP_CIPHER * (*calculate_type)(void);
1819 #endif
1820 
1821 	int (*encrypt)(struct image_cipher_info *info,
1822 		       const unsigned char *data, int data_len,
1823 		       unsigned char **cipher, int *cipher_len);
1824 
1825 	/**
1826 	 * add_cipher_data() - Add cipher data to the FIT and device tree
1827 	 *
1828 	 * This is used to add the ciphered data to the FIT and other cipher
1829 	 * related information (key and initialization vector) to a device tree.
1830 	 *
1831 	 * @info: Pointer to image cipher information.
1832 	 * @keydest: Pointer to a device tree where the key and IV can be
1833 	 *           stored. keydest can be NULL when the key is retrieved at
1834 	 *           runtime by another mean.
1835 	 * @fit: Pointer to the FIT image.
1836 	 * @node_noffset: Offset where the cipher information are stored in the
1837 	 *                FIT.
1838 	 * return: 0 on success, a negative error code otherwise.
1839 	 */
1840 	int (*add_cipher_data)(struct image_cipher_info *info,
1841 			       void *keydest, void *fit, int node_noffset);
1842 
1843 	int (*decrypt)(struct image_cipher_info *info,
1844 		       const void *cipher, size_t cipher_len,
1845 		       void **data, size_t *data_len);
1846 };
1847 
1848 int fit_image_cipher_get_algo(const void *fit, int noffset, char **algo);
1849 
1850 struct cipher_algo *image_get_cipher_algo(const char *full_name);
1851 struct andr_image_data;
1852 
1853 /**
1854  * android_image_get_bootimg_size() - Extract size of Android boot image
1855  *
1856  * This is used to extract the size of an Android boot image
1857  * from boot image header.
1858  *
1859  * @hdr: Pointer to boot image header
1860  * @boot_img_size: On exit returns the size in bytes of the boot image
1861  * Return: true if succeeded, false otherwise
1862  */
1863 bool android_image_get_bootimg_size(const void *hdr, u32 *boot_img_size);
1864 
1865 /**
1866  * android_image_get_vendor_bootimg_size() - Extract size of Android vendor-boot image
1867  *
1868  * This is used to extract the size of an Android vendor-boot image
1869  * from vendor-boot image header.
1870  *
1871  * @hdr: Pointer to vendor-boot image header
1872  * @vendor_boot_img_size: On exit returns the size in bytes of the vendor-boot image
1873  * Return: true if succeeded, false otherwise
1874  */
1875 bool android_image_get_vendor_bootimg_size(const void *hdr, u32 *vendor_boot_img_size);
1876 
1877 /**
1878  * android_image_get_data() - Parse Android boot images
1879  *
1880  * This is used to parse boot and vendor-boot header into
1881  * andr_image_data generic structure.
1882  *
1883  * @boot_hdr: Pointer to boot image header
1884  * @vendor_boot_hdr: Pointer to vendor boot image header
1885  * @data: Pointer to generic boot format structure
1886  * Return: true if succeeded, false otherwise
1887  */
1888 bool android_image_get_data(const void *boot_hdr, const void *vendor_boot_hdr,
1889 			    struct andr_image_data *data);
1890 
1891 struct andr_boot_img_hdr_v0;
1892 
1893 /**
1894  * android_image_get_kernel() - Processes kernel part of Android boot images
1895  *
1896  * This function returns the os image's start address and length. Also,
1897  * it appends the kernel command line to the bootargs env variable.
1898  *
1899  * @hdr:	Pointer to image header, which is at the start
1900  *			of the image.
1901  * @vendor_boot_img : Pointer to vendor boot image header
1902  * @verify:	Checksum verification flag. Currently unimplemented.
1903  * @os_data:	Pointer to a ulong variable, will hold os data start
1904  *			address.
1905  * @os_len:	Pointer to a ulong variable, will hold os data length.
1906  * Return: Zero, os start address and length on success,
1907  *		otherwise on failure.
1908  */
1909 int android_image_get_kernel(const void *hdr,
1910 			     const void *vendor_boot_img, int verify,
1911 			     ulong *os_data, ulong *os_len);
1912 
1913 /**
1914  * android_image_get_ramdisk() - Extracts the ramdisk load address and its size
1915  *
1916  * This extracts the load address of the ramdisk and its size
1917  *
1918  * @hdr:	Pointer to image header
1919  * @vendor_boot_img : Pointer to vendor boot image header
1920  * @rd_data:	Pointer to a ulong variable, will hold ramdisk address
1921  * @rd_len:	Pointer to a ulong variable, will hold ramdisk length
1922  * Return: 0 if OK, -ENOPKG if no ramdisk, -EINVAL if invalid image
1923  */
1924 int android_image_get_ramdisk(const void *hdr, const void *vendor_boot_img,
1925 			      ulong *rd_data, ulong *rd_len);
1926 
1927 /**
1928  * android_image_get_second() - Extracts the secondary bootloader address
1929  * and its size
1930  *
1931  * This extracts the address of the secondary bootloader and its size
1932  *
1933  * @hdr:	 Pointer to image header
1934  * @second_data: Pointer to a ulong variable, will hold secondary bootloader address
1935  * @second_len : Pointer to a ulong variable, will hold secondary bootloader length
1936  * Return: 0 if succeeded, -1 if secondary bootloader size is 0
1937  */
1938 int android_image_get_second(const void *hdr, ulong *second_data, ulong *second_len);
1939 bool android_image_get_dtbo(ulong hdr_addr, ulong *addr, u32 *size);
1940 
1941 /**
1942  * android_image_get_dtb_by_index() - Get address and size of blob in DTB area.
1943  * @hdr_addr: Boot image header address
1944  * @vendor_boot_img: Pointer to vendor boot image header, which is at the start of the image.
1945  * @index: Index of desired DTB in DTB area (starting from 0)
1946  * @addr: If not NULL, will contain address to specified DTB
1947  * @size: If not NULL, will contain size of specified DTB
1948  *
1949  * Get the address and size of DTB blob by its index in DTB area of Android
1950  * Boot Image in RAM.
1951  *
1952  * Return: true on success or false on error.
1953  */
1954 bool android_image_get_dtb_by_index(ulong hdr_addr, ulong vendor_boot_img,
1955 				    u32 index, ulong *addr, u32 *size);
1956 
1957 /**
1958  * android_image_get_end() - Get the end of Android boot image
1959  *
1960  * This returns the end address of Android boot image address
1961  *
1962  * @hdr: Pointer to image header
1963  * @vendor_boot_img : Pointer to vendor boot image header
1964  * Return: The end address of Android boot image
1965  */
1966 ulong android_image_get_end(const struct andr_boot_img_hdr_v0 *hdr,
1967 			    const void *vendor_boot_img);
1968 
1969 /**
1970  * android_image_get_kload() - Get the kernel load address
1971  *
1972  * This returns the kernel load address. The load address is extracted
1973  * from the boot image header or the "kernel_addr_r" environment variable
1974  *
1975  * @hdr: Pointer to image header
1976  * @vendor_boot_img : Pointer to vendor boot image header
1977  * Return: The kernel load address
1978  */
1979 ulong android_image_get_kload(const void *hdr,
1980 			      const void *vendor_boot_img);
1981 
1982 /**
1983  * android_image_get_kcomp() - Get kernel compression type
1984  *
1985  * This gets the kernel compression type from the boot image header
1986  *
1987  * @hdr: Pointer to image header
1988  * @vendor_boot_img : Pointer to vendor boot image header
1989  * Return: Kernel compression type
1990  */
1991 ulong android_image_get_kcomp(const void *hdr,
1992 			      const void *vendor_boot_img);
1993 
1994 /**
1995  * android_print_contents() - Prints out the contents of the Android format image
1996  *
1997  * This formats a multi line Android image contents description.
1998  * The routine prints out Android image properties
1999  *
2000  * @hdr: Pointer to the Android format image header
2001  * Return: no returned results
2002  */
2003 void android_print_contents(const struct andr_boot_img_hdr_v0 *hdr);
2004 bool android_image_print_dtb_contents(ulong hdr_addr);
2005 
2006 /**
2007  * is_android_boot_image_header() - Check the magic of boot image
2008  *
2009  * This checks the header of Android boot image and verifies the
2010  * magic is "ANDROID!"
2011  *
2012  * @hdr: Pointer to boot image
2013  * Return: non-zero if the magic is correct, zero otherwise
2014  */
2015 bool is_android_boot_image_header(const void *hdr);
2016 
2017 /**
2018  * is_android_vendor_boot_image_header() - Check the magic of vendor boot image
2019  *
2020  * This checks the header of Android vendor boot image and verifies the magic
2021  * is "VNDRBOOT"
2022  *
2023  * @vendor_boot_img: Pointer to boot image
2024  * Return: non-zero if the magic is correct, zero otherwise
2025  */
2026 bool is_android_vendor_boot_image_header(const void *vendor_boot_img);
2027 
2028 /**
2029  * get_abootimg_addr() - Get Android boot image address
2030  *
2031  * Return: Android boot image address
2032  */
2033 ulong get_abootimg_addr(void);
2034 
2035 /**
2036  * set_abootimg_addr() - Set Android boot image address
2037  *
2038  * Return: no returned results
2039  */
2040 void set_abootimg_addr(ulong addr);
2041 
2042 /**
2043  * get_ainit_bootimg_addr() - Get Android init boot image address
2044  *
2045  * Return: Android init boot image address
2046  */
2047 ulong get_ainit_bootimg_addr(void);
2048 
2049 /**
2050  * get_avendor_bootimg_addr() - Get Android vendor boot image address
2051  *
2052  * Return: Android vendor boot image address
2053  */
2054 ulong get_avendor_bootimg_addr(void);
2055 
2056 /**
2057  * set_abootimg_addr() - Set Android vendor boot image address
2058  *
2059  * Return: no returned results
2060  */
2061 void set_avendor_bootimg_addr(ulong addr);
2062 
2063 /**
2064  * board_fit_config_name_match() - Check for a matching board name
2065  *
2066  * This is used when SPL loads a FIT containing multiple device tree files
2067  * and wants to work out which one to use. The description of each one is
2068  * passed to this function. The description comes from the 'description' field
2069  * in each (FDT) image node.
2070  *
2071  * @name: Device tree description
2072  * Return: 0 if this device tree should be used, non-zero to try the next
2073  */
2074 int board_fit_config_name_match(const char *name);
2075 
2076 /**
2077  * board_fit_image_post_process() - Do any post-process on FIT binary data
2078  *
2079  * This is used to do any sort of image manipulation, verification, decryption
2080  * etc. in a platform or board specific way. Obviously, anything done here would
2081  * need to be comprehended in how the images were prepared before being injected
2082  * into the FIT creation (i.e. the binary blobs would have been pre-processed
2083  * before being added to the FIT image).
2084  *
2085  * @fit: pointer to fit image
2086  * @node: offset of image node
2087  * @image: pointer to the image start pointer
2088  * @size: pointer to the image size
2089  * Return: no return value (failure should be handled internally)
2090  */
2091 void board_fit_image_post_process(const void *fit, int node, void **p_image,
2092 				  size_t *p_size);
2093 
2094 #define FDT_ERROR	((ulong)(-1))
2095 
2096 ulong fdt_getprop_u32(const void *fdt, int node, const char *prop);
2097 
2098 /**
2099  * fit_find_config_node() - Find the node for the best DTB in a FIT image
2100  *
2101  * A FIT image contains one or more DTBs. This function parses the
2102  * configurations described in the FIT images and returns the node of
2103  * the first matching DTB. To check if a DTB matches a board, this function
2104  * calls board_fit_config_name_match(). If no matching DTB is found, it returns
2105  * the node described by the default configuration if it exists.
2106  *
2107  * @fdt: pointer to flat device tree
2108  * Return: the node if found, -ve otherwise
2109  */
2110 int fit_find_config_node(const void *fdt);
2111 
2112 /**
2113  * Mapping of image types to function handlers to be invoked on the associated
2114  * loaded images
2115  *
2116  * @type: Type of image, I.E. IH_TYPE_*
2117  * @handler: Function to call on loaded image
2118  */
2119 struct fit_loadable_tbl {
2120 	int type;
2121 	/**
2122 	 * handler() - Process a loaded image
2123 	 *
2124 	 * @data: Pointer to start of loaded image data
2125 	 * @size: Size of loaded image data
2126 	 */
2127 	void (*handler)(ulong data, size_t size);
2128 };
2129 
2130 /*
2131  * Define a FIT loadable image type handler
2132  *
2133  * _type is a valid uimage_type ID as defined in the "Image Type" enum above
2134  * _handler is the handler function to call after this image type is loaded
2135  */
2136 #define U_BOOT_FIT_LOADABLE_HANDLER(_type, _handler) \
2137 	ll_entry_declare(struct fit_loadable_tbl, _type, fit_loadable) = { \
2138 		.type = _type, \
2139 		.handler = _handler, \
2140 	}
2141 
2142 /**
2143  * fit_update - update storage with FIT image
2144  * @fit:        Pointer to FIT image
2145  *
2146  * Update firmware on storage using FIT image as input.
2147  * The storage area to be update will be identified by the name
2148  * in FIT and matching it to "dfu_alt_info" variable.
2149  *
2150  * Return:      0 on success, non-zero otherwise
2151  */
2152 int fit_update(const void *fit);
2153 
2154 #endif	/* __IMAGE_H__ */
2155