xref: /rk3399_rockchip-uboot/include/image.h (revision 1fe7d93891905b9af1d81c9aef7b5646452ceb41)
1 /*
2  * (C) Copyright 2008 Semihalf
3  *
4  * (C) Copyright 2000-2005
5  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
6  *
7  * See file CREDITS for list of people who contributed to this
8  * project.
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License as
12  * published by the Free Software Foundation; either version 2 of
13  * the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
23  * MA 02111-1307 USA
24  *
25  ********************************************************************
26  * NOTE: This header file defines an interface to U-Boot. Including
27  * this (unmodified) header file in another file is considered normal
28  * use of U-Boot, and does *not* fall under the heading of "derived
29  * work".
30  ********************************************************************
31  */
32 
33 #ifndef __IMAGE_H__
34 #define __IMAGE_H__
35 
36 #include "compiler.h"
37 #include <asm/byteorder.h>
38 
39 #ifdef USE_HOSTCC
40 
41 /* new uImage format support enabled on host */
42 #define CONFIG_FIT		1
43 #define CONFIG_OF_LIBFDT	1
44 #define CONFIG_FIT_VERBOSE	1 /* enable fit_format_{error,warning}() */
45 
46 #define IMAGE_ENABLE_IGNORE	0
47 #define IMAGE_INDENT_STRING	""
48 
49 #else
50 
51 #include <lmb.h>
52 #include <asm/u-boot.h>
53 #include <command.h>
54 
55 /* Take notice of the 'ignore' property for hashes */
56 #define IMAGE_ENABLE_IGNORE	1
57 #define IMAGE_INDENT_STRING	"   "
58 
59 #endif /* USE_HOSTCC */
60 
61 #if defined(CONFIG_FIT)
62 #include <libfdt.h>
63 #include <fdt_support.h>
64 #define CONFIG_MD5		/* FIT images need MD5 support */
65 #define CONFIG_SHA1		/* and SHA1 */
66 #endif
67 
68 /*
69  * Operating System Codes
70  */
71 #define IH_OS_INVALID		0	/* Invalid OS	*/
72 #define IH_OS_OPENBSD		1	/* OpenBSD	*/
73 #define IH_OS_NETBSD		2	/* NetBSD	*/
74 #define IH_OS_FREEBSD		3	/* FreeBSD	*/
75 #define IH_OS_4_4BSD		4	/* 4.4BSD	*/
76 #define IH_OS_LINUX		5	/* Linux	*/
77 #define IH_OS_SVR4		6	/* SVR4		*/
78 #define IH_OS_ESIX		7	/* Esix		*/
79 #define IH_OS_SOLARIS		8	/* Solaris	*/
80 #define IH_OS_IRIX		9	/* Irix		*/
81 #define IH_OS_SCO		10	/* SCO		*/
82 #define IH_OS_DELL		11	/* Dell		*/
83 #define IH_OS_NCR		12	/* NCR		*/
84 #define IH_OS_LYNXOS		13	/* LynxOS	*/
85 #define IH_OS_VXWORKS		14	/* VxWorks	*/
86 #define IH_OS_PSOS		15	/* pSOS		*/
87 #define IH_OS_QNX		16	/* QNX		*/
88 #define IH_OS_U_BOOT		17	/* Firmware	*/
89 #define IH_OS_RTEMS		18	/* RTEMS	*/
90 #define IH_OS_ARTOS		19	/* ARTOS	*/
91 #define IH_OS_UNITY		20	/* Unity OS	*/
92 #define IH_OS_INTEGRITY		21	/* INTEGRITY	*/
93 #define IH_OS_OSE		22	/* OSE		*/
94 #define IH_OS_PLAN9		23	/* Plan 9	*/
95 
96 /*
97  * CPU Architecture Codes (supported by Linux)
98  */
99 #define IH_ARCH_INVALID		0	/* Invalid CPU	*/
100 #define IH_ARCH_ALPHA		1	/* Alpha	*/
101 #define IH_ARCH_ARM		2	/* ARM		*/
102 #define IH_ARCH_I386		3	/* Intel x86	*/
103 #define IH_ARCH_IA64		4	/* IA64		*/
104 #define IH_ARCH_MIPS		5	/* MIPS		*/
105 #define IH_ARCH_MIPS64		6	/* MIPS	 64 Bit */
106 #define IH_ARCH_PPC		7	/* PowerPC	*/
107 #define IH_ARCH_S390		8	/* IBM S390	*/
108 #define IH_ARCH_SH		9	/* SuperH	*/
109 #define IH_ARCH_SPARC		10	/* Sparc	*/
110 #define IH_ARCH_SPARC64		11	/* Sparc 64 Bit */
111 #define IH_ARCH_M68K		12	/* M68K		*/
112 #define IH_ARCH_MICROBLAZE	14	/* MicroBlaze   */
113 #define IH_ARCH_NIOS2		15	/* Nios-II	*/
114 #define IH_ARCH_BLACKFIN	16	/* Blackfin	*/
115 #define IH_ARCH_AVR32		17	/* AVR32	*/
116 #define IH_ARCH_ST200	        18	/* STMicroelectronics ST200  */
117 #define IH_ARCH_SANDBOX		19	/* Sandbox architecture (test only) */
118 #define IH_ARCH_NDS32	        20	/* ANDES Technology - NDS32  */
119 #define IH_ARCH_OPENRISC        21	/* OpenRISC 1000  */
120 
121 /*
122  * Image Types
123  *
124  * "Standalone Programs" are directly runnable in the environment
125  *	provided by U-Boot; it is expected that (if they behave
126  *	well) you can continue to work in U-Boot after return from
127  *	the Standalone Program.
128  * "OS Kernel Images" are usually images of some Embedded OS which
129  *	will take over control completely. Usually these programs
130  *	will install their own set of exception handlers, device
131  *	drivers, set up the MMU, etc. - this means, that you cannot
132  *	expect to re-enter U-Boot except by resetting the CPU.
133  * "RAMDisk Images" are more or less just data blocks, and their
134  *	parameters (address, size) are passed to an OS kernel that is
135  *	being started.
136  * "Multi-File Images" contain several images, typically an OS
137  *	(Linux) kernel image and one or more data images like
138  *	RAMDisks. This construct is useful for instance when you want
139  *	to boot over the network using BOOTP etc., where the boot
140  *	server provides just a single image file, but you want to get
141  *	for instance an OS kernel and a RAMDisk image.
142  *
143  *	"Multi-File Images" start with a list of image sizes, each
144  *	image size (in bytes) specified by an "uint32_t" in network
145  *	byte order. This list is terminated by an "(uint32_t)0".
146  *	Immediately after the terminating 0 follow the images, one by
147  *	one, all aligned on "uint32_t" boundaries (size rounded up to
148  *	a multiple of 4 bytes - except for the last file).
149  *
150  * "Firmware Images" are binary images containing firmware (like
151  *	U-Boot or FPGA images) which usually will be programmed to
152  *	flash memory.
153  *
154  * "Script files" are command sequences that will be executed by
155  *	U-Boot's command interpreter; this feature is especially
156  *	useful when you configure U-Boot to use a real shell (hush)
157  *	as command interpreter (=> Shell Scripts).
158  */
159 
160 #define IH_TYPE_INVALID		0	/* Invalid Image		*/
161 #define IH_TYPE_STANDALONE	1	/* Standalone Program		*/
162 #define IH_TYPE_KERNEL		2	/* OS Kernel Image		*/
163 #define IH_TYPE_RAMDISK		3	/* RAMDisk Image		*/
164 #define IH_TYPE_MULTI		4	/* Multi-File Image		*/
165 #define IH_TYPE_FIRMWARE	5	/* Firmware Image		*/
166 #define IH_TYPE_SCRIPT		6	/* Script file			*/
167 #define IH_TYPE_FILESYSTEM	7	/* Filesystem Image (any type)	*/
168 #define IH_TYPE_FLATDT		8	/* Binary Flat Device Tree Blob	*/
169 #define IH_TYPE_KWBIMAGE	9	/* Kirkwood Boot Image		*/
170 #define IH_TYPE_IMXIMAGE	10	/* Freescale IMXBoot Image	*/
171 #define IH_TYPE_UBLIMAGE	11	/* Davinci UBL Image		*/
172 #define IH_TYPE_OMAPIMAGE	12	/* TI OMAP Config Header Image	*/
173 #define IH_TYPE_AISIMAGE	13	/* TI Davinci AIS Image		*/
174 #define IH_TYPE_KERNEL_NOLOAD	14	/* OS Kernel Image, can run from any load address */
175 #define IH_TYPE_PBLIMAGE	15	/* Freescale PBL Boot Image	*/
176 
177 /*
178  * Compression Types
179  */
180 #define IH_COMP_NONE		0	/*  No	 Compression Used	*/
181 #define IH_COMP_GZIP		1	/* gzip	 Compression Used	*/
182 #define IH_COMP_BZIP2		2	/* bzip2 Compression Used	*/
183 #define IH_COMP_LZMA		3	/* lzma  Compression Used	*/
184 #define IH_COMP_LZO		4	/* lzo   Compression Used	*/
185 
186 #define IH_MAGIC	0x27051956	/* Image Magic Number		*/
187 #define IH_NMLEN		32	/* Image Name Length		*/
188 
189 /* Reused from common.h */
190 #define ROUND(a, b)		(((a) + (b) - 1) & ~((b) - 1))
191 
192 /*
193  * Legacy format image header,
194  * all data in network byte order (aka natural aka bigendian).
195  */
196 typedef struct image_header {
197 	__be32		ih_magic;	/* Image Header Magic Number	*/
198 	__be32		ih_hcrc;	/* Image Header CRC Checksum	*/
199 	__be32		ih_time;	/* Image Creation Timestamp	*/
200 	__be32		ih_size;	/* Image Data Size		*/
201 	__be32		ih_load;	/* Data	 Load  Address		*/
202 	__be32		ih_ep;		/* Entry Point Address		*/
203 	__be32		ih_dcrc;	/* Image Data CRC Checksum	*/
204 	uint8_t		ih_os;		/* Operating System		*/
205 	uint8_t		ih_arch;	/* CPU architecture		*/
206 	uint8_t		ih_type;	/* Image Type			*/
207 	uint8_t		ih_comp;	/* Compression Type		*/
208 	uint8_t		ih_name[IH_NMLEN];	/* Image Name		*/
209 } image_header_t;
210 
211 typedef struct image_info {
212 	ulong		start, end;		/* start/end of blob */
213 	ulong		image_start, image_len; /* start of image within blob, len of image */
214 	ulong		load;			/* load addr for the image */
215 	uint8_t		comp, type, os;		/* compression, type of image, os type */
216 } image_info_t;
217 
218 /*
219  * Legacy and FIT format headers used by do_bootm() and do_bootm_<os>()
220  * routines.
221  */
222 typedef struct bootm_headers {
223 	/*
224 	 * Legacy os image header, if it is a multi component image
225 	 * then boot_get_ramdisk() and get_fdt() will attempt to get
226 	 * data from second and third component accordingly.
227 	 */
228 	image_header_t	*legacy_hdr_os;		/* image header pointer */
229 	image_header_t	legacy_hdr_os_copy;	/* header copy */
230 	ulong		legacy_hdr_valid;
231 
232 #if defined(CONFIG_FIT)
233 	const char	*fit_uname_cfg;	/* configuration node unit name */
234 
235 	void		*fit_hdr_os;	/* os FIT image header */
236 	const char	*fit_uname_os;	/* os subimage node unit name */
237 	int		fit_noffset_os;	/* os subimage node offset */
238 
239 	void		*fit_hdr_rd;	/* init ramdisk FIT image header */
240 	const char	*fit_uname_rd;	/* init ramdisk subimage node unit name */
241 	int		fit_noffset_rd;	/* init ramdisk subimage node offset */
242 
243 	void		*fit_hdr_fdt;	/* FDT blob FIT image header */
244 	const char	*fit_uname_fdt;	/* FDT blob subimage node unit name */
245 	int		fit_noffset_fdt;/* FDT blob subimage node offset */
246 #endif
247 
248 #ifndef USE_HOSTCC
249 	image_info_t	os;		/* os image info */
250 	ulong		ep;		/* entry point of OS */
251 
252 	ulong		rd_start, rd_end;/* ramdisk start/end */
253 
254 #ifdef CONFIG_OF_LIBFDT
255 	char		*ft_addr;	/* flat dev tree address */
256 #endif
257 	ulong		ft_len;		/* length of flat device tree */
258 
259 	ulong		initrd_start;
260 	ulong		initrd_end;
261 	ulong		cmdline_start;
262 	ulong		cmdline_end;
263 	bd_t		*kbd;
264 #endif
265 
266 	int		verify;		/* getenv("verify")[0] != 'n' */
267 
268 #define	BOOTM_STATE_START	(0x00000001)
269 #define	BOOTM_STATE_LOADOS	(0x00000002)
270 #define	BOOTM_STATE_RAMDISK	(0x00000004)
271 #define	BOOTM_STATE_FDT		(0x00000008)
272 #define	BOOTM_STATE_OS_CMDLINE	(0x00000010)
273 #define	BOOTM_STATE_OS_BD_T	(0x00000020)
274 #define	BOOTM_STATE_OS_PREP	(0x00000040)
275 #define	BOOTM_STATE_OS_GO	(0x00000080)
276 	int		state;
277 
278 #ifdef CONFIG_LMB
279 	struct lmb	lmb;		/* for memory mgmt */
280 #endif
281 } bootm_headers_t;
282 
283 extern bootm_headers_t images;
284 
285 /*
286  * Some systems (for example LWMON) have very short watchdog periods;
287  * we must make sure to split long operations like memmove() or
288  * checksum calculations into reasonable chunks.
289  */
290 #ifndef CHUNKSZ
291 #define CHUNKSZ (64 * 1024)
292 #endif
293 
294 #ifndef CHUNKSZ_CRC32
295 #define CHUNKSZ_CRC32 (64 * 1024)
296 #endif
297 
298 #ifndef CHUNKSZ_MD5
299 #define CHUNKSZ_MD5 (64 * 1024)
300 #endif
301 
302 #ifndef CHUNKSZ_SHA1
303 #define CHUNKSZ_SHA1 (64 * 1024)
304 #endif
305 
306 #define uimage_to_cpu(x)		be32_to_cpu(x)
307 #define cpu_to_uimage(x)		cpu_to_be32(x)
308 
309 /*
310  * Translation table for entries of a specific type; used by
311  * get_table_entry_id() and get_table_entry_name().
312  */
313 typedef struct table_entry {
314 	int	id;
315 	char	*sname;		/* short (input) name to find table entry */
316 	char	*lname;		/* long (output) name to print for messages */
317 } table_entry_t;
318 
319 /*
320  * get_table_entry_id() scans the translation table trying to find an
321  * entry that matches the given short name. If a matching entry is
322  * found, it's id is returned to the caller.
323  */
324 int get_table_entry_id(const table_entry_t *table,
325 		const char *table_name, const char *name);
326 /*
327  * get_table_entry_name() scans the translation table trying to find
328  * an entry that matches the given id. If a matching entry is found,
329  * its long name is returned to the caller.
330  */
331 char *get_table_entry_name(const table_entry_t *table, char *msg, int id);
332 
333 const char *genimg_get_os_name(uint8_t os);
334 const char *genimg_get_arch_name(uint8_t arch);
335 const char *genimg_get_type_name(uint8_t type);
336 const char *genimg_get_comp_name(uint8_t comp);
337 int genimg_get_os_id(const char *name);
338 int genimg_get_arch_id(const char *name);
339 int genimg_get_type_id(const char *name);
340 int genimg_get_comp_id(const char *name);
341 void genimg_print_size(uint32_t size);
342 
343 #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || \
344 	defined(USE_HOSTCC)
345 #define IMAGE_ENABLE_TIMESTAMP 1
346 #else
347 #define IMAGE_ENABLE_TIMESTAMP 0
348 #endif
349 void genimg_print_time(time_t timestamp);
350 
351 #ifndef USE_HOSTCC
352 /* Image format types, returned by _get_format() routine */
353 #define IMAGE_FORMAT_INVALID	0x00
354 #define IMAGE_FORMAT_LEGACY	0x01	/* legacy image_header based format */
355 #define IMAGE_FORMAT_FIT	0x02	/* new, libfdt based format */
356 
357 int genimg_get_format(const void *img_addr);
358 int genimg_has_config(bootm_headers_t *images);
359 ulong genimg_get_image(ulong img_addr);
360 
361 int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
362 		uint8_t arch, ulong *rd_start, ulong *rd_end);
363 
364 
365 #ifdef CONFIG_OF_LIBFDT
366 int boot_get_fdt(int flag, int argc, char * const argv[],
367 		bootm_headers_t *images, char **of_flat_tree, ulong *of_size);
368 void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob);
369 int boot_relocate_fdt(struct lmb *lmb, char **of_flat_tree, ulong *of_size);
370 #endif
371 
372 #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
373 int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
374 		  ulong *initrd_start, ulong *initrd_end);
375 #endif /* CONFIG_SYS_BOOT_RAMDISK_HIGH */
376 #ifdef CONFIG_SYS_BOOT_GET_CMDLINE
377 int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end);
378 #endif /* CONFIG_SYS_BOOT_GET_CMDLINE */
379 #ifdef CONFIG_SYS_BOOT_GET_KBD
380 int boot_get_kbd(struct lmb *lmb, bd_t **kbd);
381 #endif /* CONFIG_SYS_BOOT_GET_KBD */
382 #endif /* !USE_HOSTCC */
383 
384 /*******************************************************************/
385 /* Legacy format specific code (prefixed with image_) */
386 /*******************************************************************/
387 static inline uint32_t image_get_header_size(void)
388 {
389 	return (sizeof(image_header_t));
390 }
391 
392 #define image_get_hdr_l(f) \
393 	static inline uint32_t image_get_##f(const image_header_t *hdr) \
394 	{ \
395 		return uimage_to_cpu(hdr->ih_##f); \
396 	}
397 image_get_hdr_l(magic)		/* image_get_magic */
398 image_get_hdr_l(hcrc)		/* image_get_hcrc */
399 image_get_hdr_l(time)		/* image_get_time */
400 image_get_hdr_l(size)		/* image_get_size */
401 image_get_hdr_l(load)		/* image_get_load */
402 image_get_hdr_l(ep)		/* image_get_ep */
403 image_get_hdr_l(dcrc)		/* image_get_dcrc */
404 
405 #define image_get_hdr_b(f) \
406 	static inline uint8_t image_get_##f(const image_header_t *hdr) \
407 	{ \
408 		return hdr->ih_##f; \
409 	}
410 image_get_hdr_b(os)		/* image_get_os */
411 image_get_hdr_b(arch)		/* image_get_arch */
412 image_get_hdr_b(type)		/* image_get_type */
413 image_get_hdr_b(comp)		/* image_get_comp */
414 
415 static inline char *image_get_name(const image_header_t *hdr)
416 {
417 	return (char *)hdr->ih_name;
418 }
419 
420 static inline uint32_t image_get_data_size(const image_header_t *hdr)
421 {
422 	return image_get_size(hdr);
423 }
424 
425 /**
426  * image_get_data - get image payload start address
427  * @hdr: image header
428  *
429  * image_get_data() returns address of the image payload. For single
430  * component images it is image data start. For multi component
431  * images it points to the null terminated table of sub-images sizes.
432  *
433  * returns:
434  *     image payload data start address
435  */
436 static inline ulong image_get_data(const image_header_t *hdr)
437 {
438 	return ((ulong)hdr + image_get_header_size());
439 }
440 
441 static inline uint32_t image_get_image_size(const image_header_t *hdr)
442 {
443 	return (image_get_size(hdr) + image_get_header_size());
444 }
445 static inline ulong image_get_image_end(const image_header_t *hdr)
446 {
447 	return ((ulong)hdr + image_get_image_size(hdr));
448 }
449 
450 #define image_set_hdr_l(f) \
451 	static inline void image_set_##f(image_header_t *hdr, uint32_t val) \
452 	{ \
453 		hdr->ih_##f = cpu_to_uimage(val); \
454 	}
455 image_set_hdr_l(magic)		/* image_set_magic */
456 image_set_hdr_l(hcrc)		/* image_set_hcrc */
457 image_set_hdr_l(time)		/* image_set_time */
458 image_set_hdr_l(size)		/* image_set_size */
459 image_set_hdr_l(load)		/* image_set_load */
460 image_set_hdr_l(ep)		/* image_set_ep */
461 image_set_hdr_l(dcrc)		/* image_set_dcrc */
462 
463 #define image_set_hdr_b(f) \
464 	static inline void image_set_##f(image_header_t *hdr, uint8_t val) \
465 	{ \
466 		hdr->ih_##f = val; \
467 	}
468 image_set_hdr_b(os)		/* image_set_os */
469 image_set_hdr_b(arch)		/* image_set_arch */
470 image_set_hdr_b(type)		/* image_set_type */
471 image_set_hdr_b(comp)		/* image_set_comp */
472 
473 static inline void image_set_name(image_header_t *hdr, const char *name)
474 {
475 	strncpy(image_get_name(hdr), name, IH_NMLEN);
476 }
477 
478 int image_check_hcrc(const image_header_t *hdr);
479 int image_check_dcrc(const image_header_t *hdr);
480 #ifndef USE_HOSTCC
481 ulong getenv_bootm_low(void);
482 phys_size_t getenv_bootm_size(void);
483 phys_size_t getenv_bootm_mapsize(void);
484 void memmove_wd(void *to, void *from, size_t len, ulong chunksz);
485 #endif
486 
487 static inline int image_check_magic(const image_header_t *hdr)
488 {
489 	return (image_get_magic(hdr) == IH_MAGIC);
490 }
491 static inline int image_check_type(const image_header_t *hdr, uint8_t type)
492 {
493 	return (image_get_type(hdr) == type);
494 }
495 static inline int image_check_arch(const image_header_t *hdr, uint8_t arch)
496 {
497 	return (image_get_arch(hdr) == arch);
498 }
499 static inline int image_check_os(const image_header_t *hdr, uint8_t os)
500 {
501 	return (image_get_os(hdr) == os);
502 }
503 
504 ulong image_multi_count(const image_header_t *hdr);
505 void image_multi_getimg(const image_header_t *hdr, ulong idx,
506 			ulong *data, ulong *len);
507 
508 void image_print_contents(const void *hdr);
509 
510 #ifndef USE_HOSTCC
511 static inline int image_check_target_arch(const image_header_t *hdr)
512 {
513 #ifndef IH_ARCH_DEFAULT
514 # error "please define IH_ARCH_DEFAULT in your arch asm/u-boot.h"
515 #endif
516 	return image_check_arch(hdr, IH_ARCH_DEFAULT);
517 }
518 #endif /* USE_HOSTCC */
519 
520 /*******************************************************************/
521 /* New uImage format specific code (prefixed with fit_) */
522 /*******************************************************************/
523 #if defined(CONFIG_FIT)
524 
525 #define FIT_IMAGES_PATH		"/images"
526 #define FIT_CONFS_PATH		"/configurations"
527 
528 /* hash node */
529 #define FIT_HASH_NODENAME	"hash"
530 #define FIT_ALGO_PROP		"algo"
531 #define FIT_VALUE_PROP		"value"
532 #define FIT_IGNORE_PROP		"uboot-ignore"
533 
534 /* image node */
535 #define FIT_DATA_PROP		"data"
536 #define FIT_TIMESTAMP_PROP	"timestamp"
537 #define FIT_DESC_PROP		"description"
538 #define FIT_ARCH_PROP		"arch"
539 #define FIT_TYPE_PROP		"type"
540 #define FIT_OS_PROP		"os"
541 #define FIT_COMP_PROP		"compression"
542 #define FIT_ENTRY_PROP		"entry"
543 #define FIT_LOAD_PROP		"load"
544 
545 /* configuration node */
546 #define FIT_KERNEL_PROP		"kernel"
547 #define FIT_RAMDISK_PROP	"ramdisk"
548 #define FIT_FDT_PROP		"fdt"
549 #define FIT_DEFAULT_PROP	"default"
550 
551 #define FIT_MAX_HASH_LEN	20	/* max(crc32_len(4), sha1_len(20)) */
552 
553 /* cmdline argument format parsing */
554 int fit_parse_conf(const char *spec, ulong addr_curr,
555 		ulong *addr, const char **conf_name);
556 int fit_parse_subimage(const char *spec, ulong addr_curr,
557 		ulong *addr, const char **image_name);
558 
559 void fit_print_contents(const void *fit);
560 void fit_image_print(const void *fit, int noffset, const char *p);
561 
562 /**
563  * fit_get_end - get FIT image size
564  * @fit: pointer to the FIT format image header
565  *
566  * returns:
567  *     size of the FIT image (blob) in memory
568  */
569 static inline ulong fit_get_size(const void *fit)
570 {
571 	return fdt_totalsize(fit);
572 }
573 
574 /**
575  * fit_get_end - get FIT image end
576  * @fit: pointer to the FIT format image header
577  *
578  * returns:
579  *     end address of the FIT image (blob) in memory
580  */
581 static inline ulong fit_get_end(const void *fit)
582 {
583 	return (ulong)fit + fdt_totalsize(fit);
584 }
585 
586 /**
587  * fit_get_name - get FIT node name
588  * @fit: pointer to the FIT format image header
589  *
590  * returns:
591  *     NULL, on error
592  *     pointer to node name, on success
593  */
594 static inline const char *fit_get_name(const void *fit_hdr,
595 		int noffset, int *len)
596 {
597 	return fdt_get_name(fit_hdr, noffset, len);
598 }
599 
600 int fit_get_desc(const void *fit, int noffset, char **desc);
601 int fit_get_timestamp(const void *fit, int noffset, time_t *timestamp);
602 
603 int fit_image_get_node(const void *fit, const char *image_uname);
604 int fit_image_get_os(const void *fit, int noffset, uint8_t *os);
605 int fit_image_get_arch(const void *fit, int noffset, uint8_t *arch);
606 int fit_image_get_type(const void *fit, int noffset, uint8_t *type);
607 int fit_image_get_comp(const void *fit, int noffset, uint8_t *comp);
608 int fit_image_get_load(const void *fit, int noffset, ulong *load);
609 int fit_image_get_entry(const void *fit, int noffset, ulong *entry);
610 int fit_image_get_data(const void *fit, int noffset,
611 				const void **data, size_t *size);
612 
613 int fit_image_hash_get_algo(const void *fit, int noffset, char **algo);
614 int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value,
615 				int *value_len);
616 
617 int fit_set_timestamp(void *fit, int noffset, time_t timestamp);
618 
619 /**
620  * fit_add_verification_data() - Calculate and add hashes to FIT
621  *
622  * @fit:	Fit image to process
623  * @return 0 if ok, <0 for error
624  */
625 int fit_add_verification_data(void *fit);
626 
627 int fit_image_verify(const void *fit, int noffset);
628 int fit_all_image_verify(const void *fit);
629 int fit_image_check_os(const void *fit, int noffset, uint8_t os);
630 int fit_image_check_arch(const void *fit, int noffset, uint8_t arch);
631 int fit_image_check_type(const void *fit, int noffset, uint8_t type);
632 int fit_image_check_comp(const void *fit, int noffset, uint8_t comp);
633 int fit_check_format(const void *fit);
634 
635 int fit_conf_find_compat(const void *fit, const void *fdt);
636 int fit_conf_get_node(const void *fit, const char *conf_uname);
637 int fit_conf_get_kernel_node(const void *fit, int noffset);
638 int fit_conf_get_ramdisk_node(const void *fit, int noffset);
639 int fit_conf_get_fdt_node(const void *fit, int noffset);
640 
641 /**
642  * fit_conf_get_prop_node() - Get node refered to by a configuration
643  * @fit:	FIT to check
644  * @noffset:	Offset of conf@xxx node to check
645  * @prop_name:	Property to read from the conf node
646  *
647  * The conf@ nodes contain references to other nodes, using properties
648  * like 'kernel = "kernel@1"'. Given such a property name (e.g. "kernel"),
649  * return the offset of the node referred to (e.g. offset of node
650  * "/images/kernel@1".
651  */
652 int fit_conf_get_prop_node(const void *fit, int noffset,
653 		const char *prop_name);
654 
655 void fit_conf_print(const void *fit, int noffset, const char *p);
656 
657 int fit_check_ramdisk(const void *fit, int os_noffset,
658 		uint8_t arch, int verify);
659 
660 int calculate_hash(const void *data, int data_len, const char *algo,
661 			uint8_t *value, int *value_len);
662 
663 #ifndef USE_HOSTCC
664 static inline int fit_image_check_target_arch(const void *fdt, int node)
665 {
666 	return fit_image_check_arch(fdt, node, IH_ARCH_DEFAULT);
667 }
668 #endif /* USE_HOSTCC */
669 
670 #ifdef CONFIG_FIT_VERBOSE
671 #define fit_unsupported(msg)	printf("! %s:%d " \
672 				"FIT images not supported for '%s'\n", \
673 				__FILE__, __LINE__, (msg))
674 
675 #define fit_unsupported_reset(msg)	printf("! %s:%d " \
676 				"FIT images not supported for '%s' " \
677 				"- must reset board to recover!\n", \
678 				__FILE__, __LINE__, (msg))
679 #else
680 #define fit_unsupported(msg)
681 #define fit_unsupported_reset(msg)
682 #endif /* CONFIG_FIT_VERBOSE */
683 #endif /* CONFIG_FIT */
684 
685 #endif	/* __IMAGE_H__ */
686