1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef __IMAGE_H__
16#define __IMAGE_H__
17
18#include "compiler.h"
19#include <asm/byteorder.h>
20
21
22struct lmb;
23struct fdt_region;
24
25#ifdef USE_HOSTCC
26#include <sys/types.h>
27
28
29#define IMAGE_ENABLE_FIT 1
30#define IMAGE_ENABLE_OF_LIBFDT 1
31#define CONFIG_FIT_VERBOSE 1
32#define CONFIG_FIT_ENABLE_SHA256_SUPPORT
33#define CONFIG_SHA1
34#define CONFIG_SHA256
35
36#define IMAGE_ENABLE_IGNORE 0
37#define IMAGE_INDENT_STRING ""
38
39#else
40
41#include <lmb.h>
42#include <asm/u-boot.h>
43#include <command.h>
44
45
46#define IMAGE_ENABLE_IGNORE 1
47#define IMAGE_INDENT_STRING " "
48
49#define IMAGE_ENABLE_FIT CONFIG_IS_ENABLED(FIT)
50#define IMAGE_ENABLE_OF_LIBFDT CONFIG_IS_ENABLED(OF_LIBFDT)
51
52#endif
53
54#if IMAGE_ENABLE_FIT
55#include <hash.h>
56#include <linux/libfdt.h>
57#include <fdt_support.h>
58# ifdef CONFIG_SPL_BUILD
59# ifdef CONFIG_SPL_CRC32_SUPPORT
60# define IMAGE_ENABLE_CRC32 1
61# endif
62# ifdef CONFIG_SPL_MD5_SUPPORT
63# define IMAGE_ENABLE_MD5 1
64# endif
65# ifdef CONFIG_SPL_SHA1_SUPPORT
66# define IMAGE_ENABLE_SHA1 1
67# endif
68# else
69# define CONFIG_CRC32
70# define IMAGE_ENABLE_CRC32 1
71# define IMAGE_ENABLE_MD5 1
72# define IMAGE_ENABLE_SHA1 1
73# endif
74
75#ifndef IMAGE_ENABLE_CRC32
76#define IMAGE_ENABLE_CRC32 0
77#endif
78
79#ifndef IMAGE_ENABLE_MD5
80#define IMAGE_ENABLE_MD5 0
81#endif
82
83#ifndef IMAGE_ENABLE_SHA1
84#define IMAGE_ENABLE_SHA1 0
85#endif
86
87#if defined(CONFIG_FIT_ENABLE_SHA256_SUPPORT) || \
88 defined(CONFIG_SPL_SHA256_SUPPORT)
89#define IMAGE_ENABLE_SHA256 1
90#else
91#define IMAGE_ENABLE_SHA256 0
92#endif
93
94#endif
95
96#ifdef CONFIG_SYS_BOOT_GET_CMDLINE
97# define IMAGE_BOOT_GET_CMDLINE 1
98#else
99# define IMAGE_BOOT_GET_CMDLINE 0
100#endif
101
102#ifdef CONFIG_OF_BOARD_SETUP
103# define IMAGE_OF_BOARD_SETUP 1
104#else
105# define IMAGE_OF_BOARD_SETUP 0
106#endif
107
108#ifdef CONFIG_OF_SYSTEM_SETUP
109# define IMAGE_OF_SYSTEM_SETUP 1
110#else
111# define IMAGE_OF_SYSTEM_SETUP 0
112#endif
113
114enum ih_category {
115 IH_ARCH,
116 IH_COMP,
117 IH_OS,
118 IH_TYPE,
119
120 IH_COUNT,
121};
122
123
124
125
126
127
128
129enum {
130 IH_OS_INVALID = 0,
131 IH_OS_OPENBSD,
132 IH_OS_NETBSD,
133 IH_OS_FREEBSD,
134 IH_OS_4_4BSD,
135 IH_OS_LINUX,
136 IH_OS_SVR4,
137 IH_OS_ESIX,
138 IH_OS_SOLARIS,
139 IH_OS_IRIX,
140 IH_OS_SCO,
141 IH_OS_DELL,
142 IH_OS_NCR,
143 IH_OS_LYNXOS,
144 IH_OS_VXWORKS,
145 IH_OS_PSOS,
146 IH_OS_QNX,
147 IH_OS_U_BOOT,
148 IH_OS_RTEMS,
149 IH_OS_ARTOS,
150 IH_OS_UNITY,
151 IH_OS_INTEGRITY,
152 IH_OS_OSE,
153 IH_OS_PLAN9,
154 IH_OS_OPENRTOS,
155 IH_OS_ARM_TRUSTED_FIRMWARE,
156 IH_OS_TEE,
157
158 IH_OS_COUNT,
159};
160
161
162
163
164
165
166
167enum {
168 IH_ARCH_INVALID = 0,
169 IH_ARCH_ALPHA,
170 IH_ARCH_ARM,
171 IH_ARCH_I386,
172 IH_ARCH_IA64,
173 IH_ARCH_MIPS,
174 IH_ARCH_MIPS64,
175 IH_ARCH_PPC,
176 IH_ARCH_S390,
177 IH_ARCH_SH,
178 IH_ARCH_SPARC,
179 IH_ARCH_SPARC64,
180 IH_ARCH_M68K,
181 IH_ARCH_NIOS,
182 IH_ARCH_MICROBLAZE,
183 IH_ARCH_NIOS2,
184 IH_ARCH_BLACKFIN,
185 IH_ARCH_AVR32,
186 IH_ARCH_ST200,
187 IH_ARCH_SANDBOX,
188 IH_ARCH_NDS32,
189 IH_ARCH_OPENRISC,
190 IH_ARCH_ARM64,
191 IH_ARCH_ARC,
192 IH_ARCH_X86_64,
193 IH_ARCH_XTENSA,
194 IH_ARCH_RISCV,
195
196 IH_ARCH_COUNT,
197};
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241enum {
242 IH_TYPE_INVALID = 0,
243 IH_TYPE_STANDALONE,
244 IH_TYPE_KERNEL,
245 IH_TYPE_RAMDISK,
246 IH_TYPE_MULTI,
247 IH_TYPE_FIRMWARE,
248 IH_TYPE_SCRIPT,
249 IH_TYPE_FILESYSTEM,
250 IH_TYPE_FLATDT,
251 IH_TYPE_KWBIMAGE,
252 IH_TYPE_IMXIMAGE,
253 IH_TYPE_UBLIMAGE,
254 IH_TYPE_OMAPIMAGE,
255 IH_TYPE_AISIMAGE,
256
257 IH_TYPE_KERNEL_NOLOAD,
258 IH_TYPE_PBLIMAGE,
259 IH_TYPE_MXSIMAGE,
260 IH_TYPE_GPIMAGE,
261 IH_TYPE_ATMELIMAGE,
262 IH_TYPE_SOCFPGAIMAGE,
263 IH_TYPE_X86_SETUP,
264 IH_TYPE_LPC32XXIMAGE,
265 IH_TYPE_LOADABLE,
266 IH_TYPE_RKIMAGE,
267 IH_TYPE_RKSD,
268 IH_TYPE_RKSPI,
269 IH_TYPE_ZYNQIMAGE,
270 IH_TYPE_ZYNQMPIMAGE,
271 IH_TYPE_FPGA,
272 IH_TYPE_VYBRIDIMAGE,
273 IH_TYPE_TEE,
274 IH_TYPE_FIRMWARE_IVT,
275 IH_TYPE_PMMC,
276 IH_TYPE_STM32IMAGE,
277
278 IH_TYPE_COUNT,
279};
280
281
282
283
284
285
286
287enum {
288 IH_COMP_NONE = 0,
289 IH_COMP_GZIP,
290 IH_COMP_BZIP2,
291 IH_COMP_LZMA,
292 IH_COMP_LZO,
293 IH_COMP_LZ4,
294
295 IH_COMP_COUNT,
296};
297
298#define IH_MAGIC 0x27051956
299#define IH_NMLEN 32
300
301
302#define ROUND(a, b) (((a) + (b) - 1) & ~((b) - 1))
303
304
305
306
307
308typedef struct image_header {
309 __be32 ih_magic;
310 __be32 ih_hcrc;
311 __be32 ih_time;
312 __be32 ih_size;
313 __be32 ih_load;
314 __be32 ih_ep;
315 __be32 ih_dcrc;
316 uint8_t ih_os;
317 uint8_t ih_arch;
318 uint8_t ih_type;
319 uint8_t ih_comp;
320 uint8_t ih_name[IH_NMLEN];
321} image_header_t;
322
323typedef struct image_info {
324 ulong start, end;
325 ulong image_start, image_len;
326 ulong load;
327 uint8_t comp, type, os;
328 uint8_t arch;
329} image_info_t;
330
331
332
333
334
335typedef struct bootm_headers {
336
337
338
339
340
341 image_header_t *legacy_hdr_os;
342 image_header_t legacy_hdr_os_copy;
343 ulong legacy_hdr_valid;
344
345#if IMAGE_ENABLE_FIT
346 const char *fit_uname_cfg;
347
348 void *fit_hdr_os;
349 const char *fit_uname_os;
350 int fit_noffset_os;
351
352 void *fit_hdr_rd;
353 const char *fit_uname_rd;
354 int fit_noffset_rd;
355
356 void *fit_hdr_fdt;
357 const char *fit_uname_fdt;
358 int fit_noffset_fdt;
359
360 void *fit_hdr_setup;
361 const char *fit_uname_setup;
362 int fit_noffset_setup;
363#endif
364
365#ifndef USE_HOSTCC
366 image_info_t os;
367 ulong ep;
368
369 ulong rd_start, rd_end;
370
371 char *ft_addr;
372 ulong ft_len;
373
374 ulong initrd_start;
375 ulong initrd_end;
376 ulong cmdline_start;
377 ulong cmdline_end;
378 bd_t *kbd;
379#endif
380
381 int verify;
382
383#define BOOTM_STATE_START (0x00000001)
384#define BOOTM_STATE_FINDOS (0x00000002)
385#define BOOTM_STATE_FINDOTHER (0x00000004)
386#define BOOTM_STATE_LOADOS (0x00000008)
387#define BOOTM_STATE_RAMDISK (0x00000010)
388#define BOOTM_STATE_FDT (0x00000020)
389#define BOOTM_STATE_OS_CMDLINE (0x00000040)
390#define BOOTM_STATE_OS_BD_T (0x00000080)
391#define BOOTM_STATE_OS_PREP (0x00000100)
392#define BOOTM_STATE_OS_FAKE_GO (0x00000200)
393#define BOOTM_STATE_OS_GO (0x00000400)
394 int state;
395
396#ifdef CONFIG_LMB
397 struct lmb lmb;
398#endif
399} bootm_headers_t;
400
401extern bootm_headers_t images;
402
403
404
405
406
407
408#ifndef CHUNKSZ
409#define CHUNKSZ (64 * 1024)
410#endif
411
412#ifndef CHUNKSZ_CRC32
413#define CHUNKSZ_CRC32 (64 * 1024)
414#endif
415
416#ifndef CHUNKSZ_MD5
417#define CHUNKSZ_MD5 (64 * 1024)
418#endif
419
420#ifndef CHUNKSZ_SHA1
421#define CHUNKSZ_SHA1 (64 * 1024)
422#endif
423
424#define uimage_to_cpu(x) be32_to_cpu(x)
425#define cpu_to_uimage(x) cpu_to_be32(x)
426
427
428
429
430
431typedef struct table_entry {
432 int id;
433 char *sname;
434 char *lname;
435} table_entry_t;
436
437
438
439
440
441
442int get_table_entry_id(const table_entry_t *table,
443 const char *table_name, const char *name);
444
445
446
447
448
449char *get_table_entry_name(const table_entry_t *table, char *msg, int id);
450
451const char *genimg_get_os_name(uint8_t os);
452
453
454
455
456
457
458
459const char *genimg_get_os_short_name(uint8_t comp);
460
461const char *genimg_get_arch_name(uint8_t arch);
462
463
464
465
466
467
468
469const char *genimg_get_arch_short_name(uint8_t arch);
470
471const char *genimg_get_type_name(uint8_t type);
472
473
474
475
476
477
478
479const char *genimg_get_type_short_name(uint8_t type);
480
481const char *genimg_get_comp_name(uint8_t comp);
482
483
484
485
486
487
488
489const char *genimg_get_comp_short_name(uint8_t comp);
490
491
492
493
494
495
496
497
498const char *genimg_get_cat_name(enum ih_category category, uint id);
499
500
501
502
503
504
505
506
507const char *genimg_get_cat_short_name(enum ih_category category, uint id);
508
509
510
511
512
513
514
515int genimg_get_cat_count(enum ih_category category);
516
517
518
519
520
521
522
523const char *genimg_get_cat_desc(enum ih_category category);
524
525int genimg_get_os_id(const char *name);
526int genimg_get_arch_id(const char *name);
527int genimg_get_type_id(const char *name);
528int genimg_get_comp_id(const char *name);
529void genimg_print_size(uint32_t size);
530
531#if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || \
532 defined(USE_HOSTCC)
533#define IMAGE_ENABLE_TIMESTAMP 1
534#else
535#define IMAGE_ENABLE_TIMESTAMP 0
536#endif
537void genimg_print_time(time_t timestamp);
538
539
540enum fit_load_op {
541 FIT_LOAD_IGNORED,
542 FIT_LOAD_OPTIONAL,
543 FIT_LOAD_OPTIONAL_NON_ZERO,
544 FIT_LOAD_REQUIRED,
545};
546
547int boot_get_setup(bootm_headers_t *images, uint8_t arch, ulong *setup_start,
548 ulong *setup_len);
549
550#ifndef USE_HOSTCC
551
552#define IMAGE_FORMAT_INVALID 0x00
553#if defined(CONFIG_IMAGE_FORMAT_LEGACY)
554#define IMAGE_FORMAT_LEGACY 0x01
555#endif
556#define IMAGE_FORMAT_FIT 0x02
557#define IMAGE_FORMAT_ANDROID 0x03
558
559ulong genimg_get_kernel_addr_fit(char * const img_addr,
560 const char **fit_uname_config,
561 const char **fit_uname_kernel);
562ulong genimg_get_kernel_addr(char * const img_addr);
563int genimg_get_format(const void *img_addr);
564int genimg_has_config(bootm_headers_t *images);
565
566int boot_get_fpga(int argc, char * const argv[], bootm_headers_t *images,
567 uint8_t arch, const ulong *ld_start, ulong * const ld_len);
568int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
569 uint8_t arch, ulong *rd_start, ulong *rd_end);
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592int boot_get_loadable(int argc, char * const argv[], bootm_headers_t *images,
593 uint8_t arch, const ulong *ld_start, ulong * const ld_len);
594#endif
595
596int boot_get_setup_fit(bootm_headers_t *images, uint8_t arch,
597 ulong *setup_start, ulong *setup_len);
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620int boot_get_fdt_fit(bootm_headers_t *images, ulong addr,
621 const char **fit_unamep, const char **fit_uname_configp,
622 int arch, ulong *datap, ulong *lenp);
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654int fit_image_load(bootm_headers_t *images, ulong addr,
655 const char **fit_unamep, const char **fit_uname_configp,
656 int arch, int image_type, int bootstage_id,
657 enum fit_load_op load_op, ulong *datap, ulong *lenp);
658
659#ifndef USE_HOSTCC
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687int fit_get_node_from_config(bootm_headers_t *images, const char *prop_name,
688 ulong addr);
689
690int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch,
691 bootm_headers_t *images,
692 char **of_flat_tree, ulong *of_size);
693void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob);
694int boot_relocate_fdt(struct lmb *lmb, char **of_flat_tree, ulong *of_size);
695
696int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
697 ulong *initrd_start, ulong *initrd_end);
698int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end);
699#ifdef CONFIG_SYS_BOOT_GET_KBD
700int boot_get_kbd(struct lmb *lmb, bd_t **kbd);
701#endif
702#endif
703
704
705
706
707static inline uint32_t image_get_header_size(void)
708{
709 return (sizeof(image_header_t));
710}
711
712#define image_get_hdr_l(f) \
713 static inline uint32_t image_get_##f(const image_header_t *hdr) \
714 { \
715 return uimage_to_cpu(hdr->ih_##f); \
716 }
717image_get_hdr_l(magic)
718image_get_hdr_l(hcrc)
719image_get_hdr_l(time)
720image_get_hdr_l(size)
721image_get_hdr_l(load)
722image_get_hdr_l(ep)
723image_get_hdr_l(dcrc)
724
725#define image_get_hdr_b(f) \
726 static inline uint8_t image_get_##f(const image_header_t *hdr) \
727 { \
728 return hdr->ih_##f; \
729 }
730image_get_hdr_b(os)
731image_get_hdr_b(arch)
732image_get_hdr_b(type)
733image_get_hdr_b(comp)
734
735static inline char *image_get_name(const image_header_t *hdr)
736{
737 return (char *)hdr->ih_name;
738}
739
740static inline uint32_t image_get_data_size(const image_header_t *hdr)
741{
742 return image_get_size(hdr);
743}
744
745
746
747
748
749
750
751
752
753
754
755
756static inline ulong image_get_data(const image_header_t *hdr)
757{
758 return ((ulong)hdr + image_get_header_size());
759}
760
761static inline uint32_t image_get_image_size(const image_header_t *hdr)
762{
763 return (image_get_size(hdr) + image_get_header_size());
764}
765static inline ulong image_get_image_end(const image_header_t *hdr)
766{
767 return ((ulong)hdr + image_get_image_size(hdr));
768}
769
770#define image_set_hdr_l(f) \
771 static inline void image_set_##f(image_header_t *hdr, uint32_t val) \
772 { \
773 hdr->ih_##f = cpu_to_uimage(val); \
774 }
775image_set_hdr_l(magic)
776image_set_hdr_l(hcrc)
777image_set_hdr_l(time)
778image_set_hdr_l(size)
779image_set_hdr_l(load)
780image_set_hdr_l(ep)
781image_set_hdr_l(dcrc)
782
783#define image_set_hdr_b(f) \
784 static inline void image_set_##f(image_header_t *hdr, uint8_t val) \
785 { \
786 hdr->ih_##f = val; \
787 }
788image_set_hdr_b(os)
789image_set_hdr_b(arch)
790image_set_hdr_b(type)
791image_set_hdr_b(comp)
792
793static inline void image_set_name(image_header_t *hdr, const char *name)
794{
795 strncpy(image_get_name(hdr), name, IH_NMLEN);
796}
797
798int image_check_hcrc(const image_header_t *hdr);
799int image_check_dcrc(const image_header_t *hdr);
800#ifndef USE_HOSTCC
801ulong env_get_bootm_low(void);
802phys_size_t env_get_bootm_size(void);
803phys_size_t env_get_bootm_mapsize(void);
804#endif
805void memmove_wd(void *to, void *from, size_t len, ulong chunksz);
806
807static inline int image_check_magic(const image_header_t *hdr)
808{
809 return (image_get_magic(hdr) == IH_MAGIC);
810}
811static inline int image_check_type(const image_header_t *hdr, uint8_t type)
812{
813 return (image_get_type(hdr) == type);
814}
815static inline int image_check_arch(const image_header_t *hdr, uint8_t arch)
816{
817 return (image_get_arch(hdr) == arch) ||
818 (image_get_arch(hdr) == IH_ARCH_ARM && arch == IH_ARCH_ARM64);
819}
820static inline int image_check_os(const image_header_t *hdr, uint8_t os)
821{
822 return (image_get_os(hdr) == os);
823}
824
825ulong image_multi_count(const image_header_t *hdr);
826void image_multi_getimg(const image_header_t *hdr, ulong idx,
827 ulong *data, ulong *len);
828
829void image_print_contents(const void *hdr);
830
831#ifndef USE_HOSTCC
832static inline int image_check_target_arch(const image_header_t *hdr)
833{
834#ifndef IH_ARCH_DEFAULT
835# error "please define IH_ARCH_DEFAULT in your arch asm/u-boot.h"
836#endif
837 return image_check_arch(hdr, IH_ARCH_DEFAULT);
838}
839#endif
840
841
842
843
844
845
846
847
848
849
850
851
852int image_setup_libfdt(bootm_headers_t *images, void *blob,
853 int of_size, struct lmb *lmb);
854
855
856
857
858
859
860
861
862
863
864int image_setup_linux(bootm_headers_t *images);
865
866
867
868
869
870
871
872
873
874int bootz_setup(ulong image, ulong *start, ulong *end);
875
876
877
878
879
880
881
882
883
884int booti_setup(ulong image, ulong *relocated_addr, ulong *size);
885
886
887
888
889
890#define FIT_IMAGES_PATH "/images"
891#define FIT_CONFS_PATH "/configurations"
892
893
894#define FIT_HASH_NODENAME "hash"
895#define FIT_ALGO_PROP "algo"
896#define FIT_VALUE_PROP "value"
897#define FIT_IGNORE_PROP "uboot-ignore"
898#define FIT_SIG_NODENAME "signature"
899
900
901#define FIT_DATA_PROP "data"
902#define FIT_DATA_POSITION_PROP "data-position"
903#define FIT_DATA_OFFSET_PROP "data-offset"
904#define FIT_DATA_SIZE_PROP "data-size"
905#define FIT_TIMESTAMP_PROP "timestamp"
906#define FIT_DESC_PROP "description"
907#define FIT_ARCH_PROP "arch"
908#define FIT_TYPE_PROP "type"
909#define FIT_OS_PROP "os"
910#define FIT_COMP_PROP "compression"
911#define FIT_ENTRY_PROP "entry"
912#define FIT_LOAD_PROP "load"
913
914
915#define FIT_KERNEL_PROP "kernel"
916#define FIT_RAMDISK_PROP "ramdisk"
917#define FIT_FDT_PROP "fdt"
918#define FIT_LOADABLE_PROP "loadables"
919#define FIT_DEFAULT_PROP "default"
920#define FIT_SETUP_PROP "setup"
921#define FIT_FPGA_PROP "fpga"
922#define FIT_FIRMWARE_PROP "firmware"
923
924#define FIT_MAX_HASH_LEN HASH_MAX_DIGEST_SIZE
925
926#if IMAGE_ENABLE_FIT
927
928int fit_parse_conf(const char *spec, ulong addr_curr,
929 ulong *addr, const char **conf_name);
930int fit_parse_subimage(const char *spec, ulong addr_curr,
931 ulong *addr, const char **image_name);
932
933int fit_get_subimage_count(const void *fit, int images_noffset);
934void fit_print_contents(const void *fit);
935void fit_image_print(const void *fit, int noffset, const char *p);
936
937
938
939
940
941
942
943
944static inline ulong fit_get_size(const void *fit)
945{
946 return fdt_totalsize(fit);
947}
948
949
950
951
952
953
954
955
956ulong fit_get_end(const void *fit);
957
958
959
960
961
962
963
964
965
966static inline const char *fit_get_name(const void *fit_hdr,
967 int noffset, int *len)
968{
969 return fdt_get_name(fit_hdr, noffset, len);
970}
971
972int fit_get_desc(const void *fit, int noffset, char **desc);
973int fit_get_timestamp(const void *fit, int noffset, time_t *timestamp);
974
975int fit_image_get_node(const void *fit, const char *image_uname);
976int fit_image_get_os(const void *fit, int noffset, uint8_t *os);
977int fit_image_get_arch(const void *fit, int noffset, uint8_t *arch);
978int fit_image_get_type(const void *fit, int noffset, uint8_t *type);
979int fit_image_get_comp(const void *fit, int noffset, uint8_t *comp);
980int fit_image_get_load(const void *fit, int noffset, ulong *load);
981int fit_image_get_entry(const void *fit, int noffset, ulong *entry);
982int fit_image_get_data(const void *fit, int noffset,
983 const void **data, size_t *size);
984int fit_image_get_data_offset(const void *fit, int noffset, int *data_offset);
985int fit_image_get_data_position(const void *fit, int noffset,
986 int *data_position);
987int fit_image_get_data_size(const void *fit, int noffset, int *data_size);
988
989int fit_image_hash_get_algo(const void *fit, int noffset, char **algo);
990int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value,
991 int *value_len);
992
993int fit_set_timestamp(void *fit, int noffset, time_t timestamp);
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015int fit_add_verification_data(const char *keydir, void *keydest, void *fit,
1016 const char *comment, int require_keys,
1017 const char *engine_id);
1018
1019int fit_image_verify_with_data(const void *fit, int image_noffset,
1020 const void *data, size_t size);
1021int fit_image_verify(const void *fit, int noffset);
1022int fit_config_verify(const void *fit, int conf_noffset);
1023int fit_all_image_verify(const void *fit);
1024int fit_image_check_os(const void *fit, int noffset, uint8_t os);
1025int fit_image_check_arch(const void *fit, int noffset, uint8_t arch);
1026int fit_image_check_type(const void *fit, int noffset, uint8_t type);
1027int fit_image_check_comp(const void *fit, int noffset, uint8_t comp);
1028int fit_check_format(const void *fit);
1029
1030int fit_conf_find_compat(const void *fit, const void *fdt);
1031int fit_conf_get_node(const void *fit, const char *conf_uname);
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044int fit_conf_get_prop_node(const void *fit, int noffset,
1045 const char *prop_name);
1046
1047void fit_conf_print(const void *fit, int noffset, const char *p);
1048
1049int fit_check_ramdisk(const void *fit, int os_noffset,
1050 uint8_t arch, int verify);
1051
1052int calculate_hash(const void *data, int data_len, const char *algo,
1053 uint8_t *value, int *value_len);
1054
1055
1056
1057
1058
1059#if defined(CONFIG_FIT_SIGNATURE)
1060# ifdef USE_HOSTCC
1061# define IMAGE_ENABLE_SIGN 1
1062# define IMAGE_ENABLE_VERIFY 1
1063# include <openssl/evp.h>
1064#else
1065# define IMAGE_ENABLE_SIGN 0
1066# define IMAGE_ENABLE_VERIFY 1
1067# endif
1068#else
1069# define IMAGE_ENABLE_SIGN 0
1070# define IMAGE_ENABLE_VERIFY 0
1071#endif
1072
1073#ifdef USE_HOSTCC
1074void *image_get_host_blob(void);
1075void image_set_host_blob(void *host_blob);
1076# define gd_fdt_blob() image_get_host_blob()
1077#else
1078# define gd_fdt_blob() (gd->fdt_blob)
1079#endif
1080
1081#ifdef CONFIG_FIT_BEST_MATCH
1082#define IMAGE_ENABLE_BEST_MATCH 1
1083#else
1084#define IMAGE_ENABLE_BEST_MATCH 0
1085#endif
1086
1087
1088struct image_sign_info {
1089 const char *keydir;
1090 const char *keyname;
1091 void *fit;
1092 int node_offset;
1093 const char *name;
1094 struct checksum_algo *checksum;
1095 struct crypto_algo *crypto;
1096 const void *fdt_blob;
1097 int required_keynode;
1098 const char *require_keys;
1099 const char *engine_id;
1100};
1101#endif
1102
1103
1104struct image_region {
1105 const void *data;
1106 int size;
1107};
1108
1109#if IMAGE_ENABLE_FIT
1110
1111#if IMAGE_ENABLE_VERIFY
1112# include <u-boot/rsa-checksum.h>
1113#endif
1114struct checksum_algo {
1115 const char *name;
1116 const int checksum_len;
1117 const int der_len;
1118 const uint8_t *der_prefix;
1119#if IMAGE_ENABLE_SIGN
1120 const EVP_MD *(*calculate_sign)(void);
1121#endif
1122 int (*calculate)(const char *name,
1123 const struct image_region region[],
1124 int region_count, uint8_t *checksum);
1125};
1126
1127struct crypto_algo {
1128 const char *name;
1129 const int key_len;
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148 int (*sign)(struct image_sign_info *info,
1149 const struct image_region region[],
1150 int region_count, uint8_t **sigp, uint *sig_len);
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163 int (*add_verify_data)(struct image_sign_info *info, void *keydest);
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175 int (*verify)(struct image_sign_info *info,
1176 const struct image_region region[], int region_count,
1177 uint8_t *sig, uint sig_len);
1178};
1179
1180
1181
1182
1183
1184
1185
1186struct checksum_algo *image_get_checksum_algo(const char *full_name);
1187
1188
1189
1190
1191
1192
1193
1194struct crypto_algo *image_get_crypto_algo(const char *full_name);
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210int fit_image_verify_required_sigs(const void *fit, int image_noffset,
1211 const char *data, size_t size, const void *sig_blob,
1212 int *no_sigsp);
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229int fit_image_check_sig(const void *fit, int noffset, const void *data,
1230 size_t size, int required_keynode, char **err_msgp);
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245struct image_region *fit_region_make_list(const void *fit,
1246 struct fdt_region *fdt_regions, int count,
1247 struct image_region *region);
1248
1249static inline int fit_image_check_target_arch(const void *fdt, int node)
1250{
1251#ifndef USE_HOSTCC
1252 return fit_image_check_arch(fdt, node, IH_ARCH_DEFAULT);
1253#else
1254 return 0;
1255#endif
1256}
1257
1258#ifdef CONFIG_FIT_VERBOSE
1259#define fit_unsupported(msg) printf("! %s:%d " \
1260 "FIT images not supported for '%s'\n", \
1261 __FILE__, __LINE__, (msg))
1262
1263#define fit_unsupported_reset(msg) printf("! %s:%d " \
1264 "FIT images not supported for '%s' " \
1265 "- must reset board to recover!\n", \
1266 __FILE__, __LINE__, (msg))
1267#else
1268#define fit_unsupported(msg)
1269#define fit_unsupported_reset(msg)
1270#endif
1271#endif
1272
1273#if defined(CONFIG_ANDROID_BOOT_IMAGE)
1274struct andr_img_hdr;
1275int android_image_check_header(const struct andr_img_hdr *hdr);
1276int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify,
1277 ulong *os_data, ulong *os_len);
1278int android_image_get_ramdisk(const struct andr_img_hdr *hdr,
1279 ulong *rd_data, ulong *rd_len);
1280int android_image_get_second(const struct andr_img_hdr *hdr,
1281 ulong *second_data, ulong *second_len);
1282ulong android_image_get_end(const struct andr_img_hdr *hdr);
1283ulong android_image_get_kload(const struct andr_img_hdr *hdr);
1284void android_print_contents(const struct andr_img_hdr *hdr);
1285
1286#endif
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299int board_fit_config_name_match(const char *name);
1300
1301#if defined(CONFIG_SPL_FIT_IMAGE_POST_PROCESS) || \
1302 defined(CONFIG_FIT_IMAGE_POST_PROCESS)
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316void board_fit_image_post_process(void **p_image, size_t *p_size);
1317#endif
1318
1319#define FDT_ERROR ((ulong)(-1))
1320
1321ulong fdt_getprop_u32(const void *fdt, int node, const char *prop);
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335int fit_find_config_node(const void *fdt);
1336
1337
1338
1339
1340
1341
1342
1343
1344struct fit_loadable_tbl {
1345 int type;
1346
1347
1348
1349
1350
1351
1352 void (*handler)(ulong data, size_t size);
1353};
1354
1355
1356
1357
1358
1359
1360
1361#define U_BOOT_FIT_LOADABLE_HANDLER(_type, _handler) \
1362 ll_entry_declare(struct fit_loadable_tbl, _function, fit_loadable) = { \
1363 .type = _type, \
1364 .handler = _handler, \
1365 }
1366
1367#endif
1368