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