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