1
2
3
4
5
6
7
8
9#ifndef USE_HOSTCC
10#include <common.h>
11#include <bootstage.h>
12#include <cpu_func.h>
13#include <env.h>
14#include <lmb.h>
15#include <log.h>
16#include <malloc.h>
17#include <asm/cache.h>
18#include <u-boot/crc.h>
19#include <watchdog.h>
20
21#ifdef CONFIG_SHOW_BOOT_PROGRESS
22#include <status_led.h>
23#endif
24
25#include <rtc.h>
26
27#include <gzip.h>
28#include <image.h>
29#include <lz4.h>
30#include <mapmem.h>
31
32#if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
33#include <linux/libfdt.h>
34#include <fdt_support.h>
35#include <fpga.h>
36#include <xilinx.h>
37#endif
38
39#include <u-boot/md5.h>
40#include <u-boot/sha1.h>
41#include <linux/errno.h>
42#include <asm/io.h>
43
44#include <bzlib.h>
45#include <linux/lzo.h>
46#include <lzma/LzmaTypes.h>
47#include <lzma/LzmaDec.h>
48#include <lzma/LzmaTools.h>
49#include <linux/zstd.h>
50
51#ifdef CONFIG_CMD_BDI
52extern int do_bdinfo(struct cmd_tbl *cmdtp, int flag, int argc,
53 char *const argv[]);
54#endif
55
56DECLARE_GLOBAL_DATA_PTR;
57
58#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
59static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
60 int verify);
61#endif
62#else
63#include "mkimage.h"
64#include <u-boot/md5.h>
65#include <time.h>
66#include <image.h>
67
68#ifndef __maybe_unused
69# define __maybe_unused
70#endif
71#endif
72
73#include <u-boot/crc.h>
74#include <imximage.h>
75
76#ifndef CONFIG_SYS_BARGSIZE
77#define CONFIG_SYS_BARGSIZE 512
78#endif
79
80static const table_entry_t uimage_arch[] = {
81 { IH_ARCH_INVALID, "invalid", "Invalid ARCH", },
82 { IH_ARCH_ALPHA, "alpha", "Alpha", },
83 { IH_ARCH_ARM, "arm", "ARM", },
84 { IH_ARCH_I386, "x86", "Intel x86", },
85 { IH_ARCH_IA64, "ia64", "IA64", },
86 { IH_ARCH_M68K, "m68k", "M68K", },
87 { IH_ARCH_MICROBLAZE, "microblaze", "MicroBlaze", },
88 { IH_ARCH_MIPS, "mips", "MIPS", },
89 { IH_ARCH_MIPS64, "mips64", "MIPS 64 Bit", },
90 { IH_ARCH_NIOS2, "nios2", "NIOS II", },
91 { IH_ARCH_PPC, "powerpc", "PowerPC", },
92 { IH_ARCH_PPC, "ppc", "PowerPC", },
93 { IH_ARCH_S390, "s390", "IBM S390", },
94 { IH_ARCH_SH, "sh", "SuperH", },
95 { IH_ARCH_SPARC, "sparc", "SPARC", },
96 { IH_ARCH_SPARC64, "sparc64", "SPARC 64 Bit", },
97 { IH_ARCH_BLACKFIN, "blackfin", "Blackfin", },
98 { IH_ARCH_AVR32, "avr32", "AVR32", },
99 { IH_ARCH_NDS32, "nds32", "NDS32", },
100 { IH_ARCH_OPENRISC, "or1k", "OpenRISC 1000",},
101 { IH_ARCH_SANDBOX, "sandbox", "Sandbox", },
102 { IH_ARCH_ARM64, "arm64", "AArch64", },
103 { IH_ARCH_ARC, "arc", "ARC", },
104 { IH_ARCH_X86_64, "x86_64", "AMD x86_64", },
105 { IH_ARCH_XTENSA, "xtensa", "Xtensa", },
106 { IH_ARCH_RISCV, "riscv", "RISC-V", },
107 { -1, "", "", },
108};
109
110static const table_entry_t uimage_os[] = {
111 { IH_OS_INVALID, "invalid", "Invalid OS", },
112 { IH_OS_ARM_TRUSTED_FIRMWARE, "arm-trusted-firmware", "ARM Trusted Firmware" },
113 { IH_OS_LINUX, "linux", "Linux", },
114#if defined(CONFIG_LYNXKDI) || defined(USE_HOSTCC)
115 { IH_OS_LYNXOS, "lynxos", "LynxOS", },
116#endif
117 { IH_OS_NETBSD, "netbsd", "NetBSD", },
118 { IH_OS_OSE, "ose", "Enea OSE", },
119 { IH_OS_PLAN9, "plan9", "Plan 9", },
120 { IH_OS_RTEMS, "rtems", "RTEMS", },
121 { IH_OS_TEE, "tee", "Trusted Execution Environment" },
122 { IH_OS_U_BOOT, "u-boot", "U-Boot", },
123 { IH_OS_VXWORKS, "vxworks", "VxWorks", },
124#if defined(CONFIG_CMD_ELF) || defined(USE_HOSTCC)
125 { IH_OS_QNX, "qnx", "QNX", },
126#endif
127#if defined(CONFIG_INTEGRITY) || defined(USE_HOSTCC)
128 { IH_OS_INTEGRITY,"integrity", "INTEGRITY", },
129#endif
130#ifdef USE_HOSTCC
131 { IH_OS_4_4BSD, "4_4bsd", "4_4BSD", },
132 { IH_OS_DELL, "dell", "Dell", },
133 { IH_OS_ESIX, "esix", "Esix", },
134 { IH_OS_FREEBSD, "freebsd", "FreeBSD", },
135 { IH_OS_IRIX, "irix", "Irix", },
136 { IH_OS_NCR, "ncr", "NCR", },
137 { IH_OS_OPENBSD, "openbsd", "OpenBSD", },
138 { IH_OS_PSOS, "psos", "pSOS", },
139 { IH_OS_SCO, "sco", "SCO", },
140 { IH_OS_SOLARIS, "solaris", "Solaris", },
141 { IH_OS_SVR4, "svr4", "SVR4", },
142#endif
143#if defined(CONFIG_BOOTM_OPENRTOS) || defined(USE_HOSTCC)
144 { IH_OS_OPENRTOS, "openrtos", "OpenRTOS", },
145#endif
146 { IH_OS_OPENSBI, "opensbi", "RISC-V OpenSBI", },
147 { IH_OS_EFI, "efi", "EFI Firmware" },
148
149 { -1, "", "", },
150};
151
152static const table_entry_t uimage_type[] = {
153 { IH_TYPE_AISIMAGE, "aisimage", "Davinci AIS image",},
154 { IH_TYPE_FILESYSTEM, "filesystem", "Filesystem Image", },
155 { IH_TYPE_FIRMWARE, "firmware", "Firmware", },
156 { IH_TYPE_FLATDT, "flat_dt", "Flat Device Tree", },
157 { IH_TYPE_GPIMAGE, "gpimage", "TI Keystone SPL Image",},
158 { IH_TYPE_KERNEL, "kernel", "Kernel Image", },
159 { IH_TYPE_KERNEL_NOLOAD, "kernel_noload", "Kernel Image (no loading done)", },
160 { IH_TYPE_KWBIMAGE, "kwbimage", "Kirkwood Boot Image",},
161 { IH_TYPE_IMXIMAGE, "imximage", "Freescale i.MX Boot Image",},
162 { IH_TYPE_IMX8IMAGE, "imx8image", "NXP i.MX8 Boot Image",},
163 { IH_TYPE_IMX8MIMAGE, "imx8mimage", "NXP i.MX8M Boot Image",},
164 { IH_TYPE_INVALID, "invalid", "Invalid Image", },
165 { IH_TYPE_MULTI, "multi", "Multi-File Image", },
166 { IH_TYPE_OMAPIMAGE, "omapimage", "TI OMAP SPL With GP CH",},
167 { IH_TYPE_PBLIMAGE, "pblimage", "Freescale PBL Boot Image",},
168 { IH_TYPE_RAMDISK, "ramdisk", "RAMDisk Image", },
169 { IH_TYPE_SCRIPT, "script", "Script", },
170 { IH_TYPE_SOCFPGAIMAGE, "socfpgaimage", "Altera SoCFPGA CV/AV preloader",},
171 { IH_TYPE_SOCFPGAIMAGE_V1, "socfpgaimage_v1", "Altera SoCFPGA A10 preloader",},
172 { IH_TYPE_STANDALONE, "standalone", "Standalone Program", },
173 { IH_TYPE_UBLIMAGE, "ublimage", "Davinci UBL image",},
174 { IH_TYPE_MXSIMAGE, "mxsimage", "Freescale MXS Boot Image",},
175 { IH_TYPE_ATMELIMAGE, "atmelimage", "ATMEL ROM-Boot Image",},
176 { IH_TYPE_X86_SETUP, "x86_setup", "x86 setup.bin", },
177 { IH_TYPE_LPC32XXIMAGE, "lpc32xximage", "LPC32XX Boot Image", },
178 { IH_TYPE_RKIMAGE, "rkimage", "Rockchip Boot Image" },
179 { IH_TYPE_RKSD, "rksd", "Rockchip SD Boot Image" },
180 { IH_TYPE_RKSPI, "rkspi", "Rockchip SPI Boot Image" },
181 { IH_TYPE_VYBRIDIMAGE, "vybridimage", "Vybrid Boot Image", },
182 { IH_TYPE_ZYNQIMAGE, "zynqimage", "Xilinx Zynq Boot Image" },
183 { IH_TYPE_ZYNQMPIMAGE, "zynqmpimage", "Xilinx ZynqMP Boot Image" },
184 { IH_TYPE_ZYNQMPBIF, "zynqmpbif", "Xilinx ZynqMP Boot Image (bif)" },
185 { IH_TYPE_FPGA, "fpga", "FPGA Image" },
186 { IH_TYPE_TEE, "tee", "Trusted Execution Environment Image",},
187 { IH_TYPE_FIRMWARE_IVT, "firmware_ivt", "Firmware with HABv4 IVT" },
188 { IH_TYPE_PMMC, "pmmc", "TI Power Management Micro-Controller Firmware",},
189 { IH_TYPE_STM32IMAGE, "stm32image", "STMicroelectronics STM32 Image" },
190 { IH_TYPE_MTKIMAGE, "mtk_image", "MediaTek BootROM loadable Image" },
191 { IH_TYPE_COPRO, "copro", "Coprocessor Image"},
192 { -1, "", "", },
193};
194
195static const table_entry_t uimage_comp[] = {
196 { IH_COMP_NONE, "none", "uncompressed", },
197 { IH_COMP_BZIP2, "bzip2", "bzip2 compressed", },
198 { IH_COMP_GZIP, "gzip", "gzip compressed", },
199 { IH_COMP_LZMA, "lzma", "lzma compressed", },
200 { IH_COMP_LZO, "lzo", "lzo compressed", },
201 { IH_COMP_LZ4, "lz4", "lz4 compressed", },
202 { IH_COMP_ZSTD, "zstd", "zstd compressed", },
203 { -1, "", "", },
204};
205
206struct table_info {
207 const char *desc;
208 int count;
209 const table_entry_t *table;
210};
211
212static const struct comp_magic_map image_comp[] = {
213 { IH_COMP_BZIP2, "bzip2", {0x42, 0x5a},},
214 { IH_COMP_GZIP, "gzip", {0x1f, 0x8b},},
215 { IH_COMP_LZMA, "lzma", {0x5d, 0x00},},
216 { IH_COMP_LZO, "lzo", {0x89, 0x4c},},
217 { IH_COMP_NONE, "none", {}, },
218};
219
220static const struct table_info table_info[IH_COUNT] = {
221 { "architecture", IH_ARCH_COUNT, uimage_arch },
222 { "compression", IH_COMP_COUNT, uimage_comp },
223 { "operating system", IH_OS_COUNT, uimage_os },
224 { "image type", IH_TYPE_COUNT, uimage_type },
225};
226
227
228
229
230int image_check_hcrc(const image_header_t *hdr)
231{
232 ulong hcrc;
233 ulong len = image_get_header_size();
234 image_header_t header;
235
236
237 memmove(&header, (char *)hdr, image_get_header_size());
238 image_set_hcrc(&header, 0);
239
240 hcrc = crc32(0, (unsigned char *)&header, len);
241
242 return (hcrc == image_get_hcrc(hdr));
243}
244
245int image_check_dcrc(const image_header_t *hdr)
246{
247 ulong data = image_get_data(hdr);
248 ulong len = image_get_data_size(hdr);
249 ulong dcrc = crc32_wd(0, (unsigned char *)data, len, CHUNKSZ_CRC32);
250
251 return (dcrc == image_get_dcrc(hdr));
252}
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267ulong image_multi_count(const image_header_t *hdr)
268{
269 ulong i, count = 0;
270 uint32_t *size;
271
272
273
274 size = (uint32_t *)image_get_data(hdr);
275
276
277 for (i = 0; size[i]; ++i)
278 count++;
279
280 return count;
281}
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300void image_multi_getimg(const image_header_t *hdr, ulong idx,
301 ulong *data, ulong *len)
302{
303 int i;
304 uint32_t *size;
305 ulong offset, count, img_data;
306
307
308 count = image_multi_count(hdr);
309
310
311
312 size = (uint32_t *)image_get_data(hdr);
313
314
315
316 img_data = image_get_data(hdr) + (count + 1) * sizeof(uint32_t);
317
318 if (idx < count) {
319 *len = uimage_to_cpu(size[idx]);
320 offset = 0;
321
322
323 for (i = 0; i < idx; i++) {
324
325 offset += (uimage_to_cpu(size[i]) + 3) & ~3 ;
326 }
327
328
329 *data = img_data + offset;
330 } else {
331 *len = 0;
332 *data = 0;
333 }
334}
335
336static void image_print_type(const image_header_t *hdr)
337{
338 const char __maybe_unused *os, *arch, *type, *comp;
339
340 os = genimg_get_os_name(image_get_os(hdr));
341 arch = genimg_get_arch_name(image_get_arch(hdr));
342 type = genimg_get_type_name(image_get_type(hdr));
343 comp = genimg_get_comp_name(image_get_comp(hdr));
344
345 printf("%s %s %s (%s)\n", arch, os, type, comp);
346}
347
348
349
350
351
352
353
354
355
356
357
358
359
360void image_print_contents(const void *ptr)
361{
362 const image_header_t *hdr = (const image_header_t *)ptr;
363 const char __maybe_unused *p;
364
365 p = IMAGE_INDENT_STRING;
366 printf("%sImage Name: %.*s\n", p, IH_NMLEN, image_get_name(hdr));
367 if (IMAGE_ENABLE_TIMESTAMP) {
368 printf("%sCreated: ", p);
369 genimg_print_time((time_t)image_get_time(hdr));
370 }
371 printf("%sImage Type: ", p);
372 image_print_type(hdr);
373 printf("%sData Size: ", p);
374 genimg_print_size(image_get_data_size(hdr));
375 printf("%sLoad Address: %08x\n", p, image_get_load(hdr));
376 printf("%sEntry Point: %08x\n", p, image_get_ep(hdr));
377
378 if (image_check_type(hdr, IH_TYPE_MULTI) ||
379 image_check_type(hdr, IH_TYPE_SCRIPT)) {
380 int i;
381 ulong data, len;
382 ulong count = image_multi_count(hdr);
383
384 printf("%sContents:\n", p);
385 for (i = 0; i < count; i++) {
386 image_multi_getimg(hdr, i, &data, &len);
387
388 printf("%s Image %d: ", p, i);
389 genimg_print_size(len);
390
391 if (image_check_type(hdr, IH_TYPE_SCRIPT) && i > 0) {
392
393
394
395
396
397 printf("%s Offset = 0x%08lx\n", p, data);
398 }
399 }
400 } else if (image_check_type(hdr, IH_TYPE_FIRMWARE_IVT)) {
401 printf("HAB Blocks: 0x%08x 0x0000 0x%08x\n",
402 image_get_load(hdr) - image_get_header_size(),
403 (int)(image_get_size(hdr) + image_get_header_size()
404 + sizeof(flash_header_v2_t) - 0x2060));
405 }
406}
407
408
409
410
411
412
413
414
415static void print_decomp_msg(int comp_type, int type, bool is_xip)
416{
417 const char *name = genimg_get_type_name(type);
418
419 if (comp_type == IH_COMP_NONE)
420 printf(" %s %s\n", is_xip ? "XIP" : "Loading", name);
421 else
422 printf(" Uncompressing %s\n", name);
423}
424
425int image_decomp_type(const unsigned char *buf, ulong len)
426{
427 const struct comp_magic_map *cmagic = image_comp;
428
429 if (len < 2)
430 return -EINVAL;
431
432 for (; cmagic->comp_id > 0; cmagic++) {
433 if (!memcmp(buf, cmagic->magic, 2))
434 break;
435 }
436
437 return cmagic->comp_id;
438}
439
440int image_decomp(int comp, ulong load, ulong image_start, int type,
441 void *load_buf, void *image_buf, ulong image_len,
442 uint unc_len, ulong *load_end)
443{
444 int ret = 0;
445
446 *load_end = load;
447 print_decomp_msg(comp, type, load == image_start);
448
449
450
451
452
453
454 switch (comp) {
455 case IH_COMP_NONE:
456 if (load == image_start)
457 break;
458 if (image_len <= unc_len)
459 memmove_wd(load_buf, image_buf, image_len, CHUNKSZ);
460 else
461 ret = -ENOSPC;
462 break;
463#ifdef CONFIG_GZIP
464 case IH_COMP_GZIP: {
465 ret = gunzip(load_buf, unc_len, image_buf, &image_len);
466 break;
467 }
468#endif
469#ifdef CONFIG_BZIP2
470 case IH_COMP_BZIP2: {
471 uint size = unc_len;
472
473
474
475
476
477
478 ret = BZ2_bzBuffToBuffDecompress(load_buf, &size,
479 image_buf, image_len,
480 CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0);
481 image_len = size;
482 break;
483 }
484#endif
485#ifdef CONFIG_LZMA
486 case IH_COMP_LZMA: {
487 SizeT lzma_len = unc_len;
488
489 ret = lzmaBuffToBuffDecompress(load_buf, &lzma_len,
490 image_buf, image_len);
491 image_len = lzma_len;
492 break;
493 }
494#endif
495#ifdef CONFIG_LZO
496 case IH_COMP_LZO: {
497 size_t size = unc_len;
498
499 ret = lzop_decompress(image_buf, image_len, load_buf, &size);
500 image_len = size;
501 break;
502 }
503#endif
504#ifdef CONFIG_LZ4
505 case IH_COMP_LZ4: {
506 size_t size = unc_len;
507
508 ret = ulz4fn(image_buf, image_len, load_buf, &size);
509 image_len = size;
510 break;
511 }
512#endif
513#ifdef CONFIG_ZSTD
514 case IH_COMP_ZSTD: {
515 size_t size = unc_len;
516 ZSTD_DStream *dstream;
517 ZSTD_inBuffer in_buf;
518 ZSTD_outBuffer out_buf;
519 void *workspace;
520 size_t wsize;
521
522 wsize = ZSTD_DStreamWorkspaceBound(image_len);
523 workspace = malloc(wsize);
524 if (!workspace) {
525 debug("%s: cannot allocate workspace of size %zu\n", __func__,
526 wsize);
527 return -1;
528 }
529
530 dstream = ZSTD_initDStream(image_len, workspace, wsize);
531 if (!dstream) {
532 printf("%s: ZSTD_initDStream failed\n", __func__);
533 return ZSTD_getErrorCode(ret);
534 }
535
536 in_buf.src = image_buf;
537 in_buf.pos = 0;
538 in_buf.size = image_len;
539
540 out_buf.dst = load_buf;
541 out_buf.pos = 0;
542 out_buf.size = size;
543
544 while (1) {
545 size_t ret;
546
547 ret = ZSTD_decompressStream(dstream, &out_buf, &in_buf);
548 if (ZSTD_isError(ret)) {
549 printf("%s: ZSTD_decompressStream error %d\n", __func__,
550 ZSTD_getErrorCode(ret));
551 return ZSTD_getErrorCode(ret);
552 }
553
554 if (in_buf.pos >= image_len || !ret)
555 break;
556 }
557
558 image_len = out_buf.pos;
559
560 break;
561 }
562#endif
563 default:
564 printf("Unimplemented compression type %d\n", comp);
565 return -ENOSYS;
566 }
567
568 *load_end = load + image_len;
569
570 return ret;
571}
572
573
574#ifndef USE_HOSTCC
575#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
592 int verify)
593{
594 const image_header_t *rd_hdr = (const image_header_t *)rd_addr;
595
596 if (!image_check_magic(rd_hdr)) {
597 puts("Bad Magic Number\n");
598 bootstage_error(BOOTSTAGE_ID_RD_MAGIC);
599 return NULL;
600 }
601
602 if (!image_check_hcrc(rd_hdr)) {
603 puts("Bad Header Checksum\n");
604 bootstage_error(BOOTSTAGE_ID_RD_HDR_CHECKSUM);
605 return NULL;
606 }
607
608 bootstage_mark(BOOTSTAGE_ID_RD_MAGIC);
609 image_print_contents(rd_hdr);
610
611 if (verify) {
612 puts(" Verifying Checksum ... ");
613 if (!image_check_dcrc(rd_hdr)) {
614 puts("Bad Data CRC\n");
615 bootstage_error(BOOTSTAGE_ID_RD_CHECKSUM);
616 return NULL;
617 }
618 puts("OK\n");
619 }
620
621 bootstage_mark(BOOTSTAGE_ID_RD_HDR_CHECKSUM);
622
623 if (!image_check_os(rd_hdr, IH_OS_LINUX) ||
624 !image_check_arch(rd_hdr, arch) ||
625 !image_check_type(rd_hdr, IH_TYPE_RAMDISK)) {
626 printf("No Linux %s Ramdisk Image\n",
627 genimg_get_arch_name(arch));
628 bootstage_error(BOOTSTAGE_ID_RAMDISK);
629 return NULL;
630 }
631
632 return rd_hdr;
633}
634#endif
635#endif
636
637
638
639
640#ifndef USE_HOSTCC
641ulong image_load_addr = CONFIG_SYS_LOAD_ADDR;
642ulong image_save_addr;
643ulong image_save_size;
644
645static int on_loadaddr(const char *name, const char *value, enum env_op op,
646 int flags)
647{
648 switch (op) {
649 case env_op_create:
650 case env_op_overwrite:
651 image_load_addr = simple_strtoul(value, NULL, 16);
652 break;
653 default:
654 break;
655 }
656
657 return 0;
658}
659U_BOOT_ENV_CALLBACK(loadaddr, on_loadaddr);
660
661ulong env_get_bootm_low(void)
662{
663 char *s = env_get("bootm_low");
664 if (s) {
665 ulong tmp = simple_strtoul(s, NULL, 16);
666 return tmp;
667 }
668
669#if defined(CONFIG_SYS_SDRAM_BASE)
670 return CONFIG_SYS_SDRAM_BASE;
671#elif defined(CONFIG_ARM) || defined(CONFIG_MICROBLAZE)
672 return gd->bd->bi_dram[0].start;
673#else
674 return 0;
675#endif
676}
677
678phys_size_t env_get_bootm_size(void)
679{
680 phys_size_t tmp, size;
681 phys_addr_t start;
682 char *s = env_get("bootm_size");
683 if (s) {
684 tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
685 return tmp;
686 }
687
688 start = gd->ram_base;
689 size = gd->ram_size;
690
691 if (start + size > gd->ram_top)
692 size = gd->ram_top - start;
693
694 s = env_get("bootm_low");
695 if (s)
696 tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
697 else
698 tmp = start;
699
700 return size - (tmp - start);
701}
702
703phys_size_t env_get_bootm_mapsize(void)
704{
705 phys_size_t tmp;
706 char *s = env_get("bootm_mapsize");
707 if (s) {
708 tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
709 return tmp;
710 }
711
712#if defined(CONFIG_SYS_BOOTMAPSZ)
713 return CONFIG_SYS_BOOTMAPSZ;
714#else
715 return env_get_bootm_size();
716#endif
717}
718
719void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
720{
721 if (to == from)
722 return;
723
724#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
725 if (to > from) {
726 from += len;
727 to += len;
728 }
729 while (len > 0) {
730 size_t tail = (len > chunksz) ? chunksz : len;
731 WATCHDOG_RESET();
732 if (to > from) {
733 to -= tail;
734 from -= tail;
735 }
736 memmove(to, from, tail);
737 if (to < from) {
738 to += tail;
739 from += tail;
740 }
741 len -= tail;
742 }
743#else
744 memmove(to, from, len);
745#endif
746}
747#else
748void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
749{
750 memmove(to, from, len);
751}
752#endif
753
754void genimg_print_size(uint32_t size)
755{
756#ifndef USE_HOSTCC
757 printf("%d Bytes = ", size);
758 print_size(size, "\n");
759#else
760 printf("%d Bytes = %.2f KiB = %.2f MiB\n",
761 size, (double)size / 1.024e3,
762 (double)size / 1.048576e6);
763#endif
764}
765
766#if IMAGE_ENABLE_TIMESTAMP
767void genimg_print_time(time_t timestamp)
768{
769#ifndef USE_HOSTCC
770 struct rtc_time tm;
771
772 rtc_to_tm(timestamp, &tm);
773 printf("%4d-%02d-%02d %2d:%02d:%02d UTC\n",
774 tm.tm_year, tm.tm_mon, tm.tm_mday,
775 tm.tm_hour, tm.tm_min, tm.tm_sec);
776#else
777 printf("%s", ctime(×tamp));
778#endif
779}
780#endif
781
782const table_entry_t *get_table_entry(const table_entry_t *table, int id)
783{
784 for (; table->id >= 0; ++table) {
785 if (table->id == id)
786 return table;
787 }
788 return NULL;
789}
790
791static const char *unknown_msg(enum ih_category category)
792{
793 static const char unknown_str[] = "Unknown ";
794 static char msg[30];
795
796 strcpy(msg, unknown_str);
797 strncat(msg, table_info[category].desc,
798 sizeof(msg) - sizeof(unknown_str));
799
800 return msg;
801}
802
803
804
805
806
807
808
809
810
811
812
813const char *genimg_get_cat_name(enum ih_category category, uint id)
814{
815 const table_entry_t *entry;
816
817 entry = get_table_entry(table_info[category].table, id);
818 if (!entry)
819 return unknown_msg(category);
820#if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
821 return entry->lname;
822#else
823 return entry->lname + gd->reloc_off;
824#endif
825}
826
827
828
829
830
831
832
833
834
835
836
837const char *genimg_get_cat_short_name(enum ih_category category, uint id)
838{
839 const table_entry_t *entry;
840
841 entry = get_table_entry(table_info[category].table, id);
842 if (!entry)
843 return unknown_msg(category);
844#if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
845 return entry->sname;
846#else
847 return entry->sname + gd->reloc_off;
848#endif
849}
850
851int genimg_get_cat_count(enum ih_category category)
852{
853 return table_info[category].count;
854}
855
856const char *genimg_get_cat_desc(enum ih_category category)
857{
858 return table_info[category].desc;
859}
860
861
862
863
864
865
866
867
868
869
870
871bool genimg_cat_has_id(enum ih_category category, uint id)
872{
873 if (get_table_entry(table_info[category].table, id))
874 return true;
875
876 return false;
877}
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893char *get_table_entry_name(const table_entry_t *table, char *msg, int id)
894{
895 table = get_table_entry(table, id);
896 if (!table)
897 return msg;
898#if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
899 return table->lname;
900#else
901 return table->lname + gd->reloc_off;
902#endif
903}
904
905const char *genimg_get_os_name(uint8_t os)
906{
907 return (get_table_entry_name(uimage_os, "Unknown OS", os));
908}
909
910const char *genimg_get_arch_name(uint8_t arch)
911{
912 return (get_table_entry_name(uimage_arch, "Unknown Architecture",
913 arch));
914}
915
916const char *genimg_get_type_name(uint8_t type)
917{
918 return (get_table_entry_name(uimage_type, "Unknown Image", type));
919}
920
921const char *genimg_get_comp_name(uint8_t comp)
922{
923 return (get_table_entry_name(uimage_comp, "Unknown Compression",
924 comp));
925}
926
927static const char *genimg_get_short_name(const table_entry_t *table, int val)
928{
929 table = get_table_entry(table, val);
930 if (!table)
931 return "unknown";
932#if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
933 return table->sname;
934#else
935 return table->sname + gd->reloc_off;
936#endif
937}
938
939const char *genimg_get_type_short_name(uint8_t type)
940{
941 return genimg_get_short_name(uimage_type, type);
942}
943
944const char *genimg_get_comp_short_name(uint8_t comp)
945{
946 return genimg_get_short_name(uimage_comp, comp);
947}
948
949const char *genimg_get_os_short_name(uint8_t os)
950{
951 return genimg_get_short_name(uimage_os, os);
952}
953
954const char *genimg_get_arch_short_name(uint8_t arch)
955{
956 return genimg_get_short_name(uimage_arch, arch);
957}
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973int get_table_entry_id(const table_entry_t *table,
974 const char *table_name, const char *name)
975{
976 const table_entry_t *t;
977
978 for (t = table; t->id >= 0; ++t) {
979#ifdef CONFIG_NEEDS_MANUAL_RELOC
980 if (t->sname && strcasecmp(t->sname + gd->reloc_off, name) == 0)
981#else
982 if (t->sname && strcasecmp(t->sname, name) == 0)
983#endif
984 return (t->id);
985 }
986 debug("Invalid %s Type: %s\n", table_name, name);
987
988 return -1;
989}
990
991int genimg_get_os_id(const char *name)
992{
993 return (get_table_entry_id(uimage_os, "OS", name));
994}
995
996int genimg_get_arch_id(const char *name)
997{
998 return (get_table_entry_id(uimage_arch, "CPU", name));
999}
1000
1001int genimg_get_type_id(const char *name)
1002{
1003 return (get_table_entry_id(uimage_type, "Image", name));
1004}
1005
1006int genimg_get_comp_id(const char *name)
1007{
1008 return (get_table_entry_id(uimage_comp, "Compression", name));
1009}
1010
1011#ifndef USE_HOSTCC
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027ulong genimg_get_kernel_addr_fit(char * const img_addr,
1028 const char **fit_uname_config,
1029 const char **fit_uname_kernel)
1030{
1031 ulong kernel_addr;
1032
1033
1034 if (!img_addr) {
1035 kernel_addr = image_load_addr;
1036 debug("* kernel: default image load address = 0x%08lx\n",
1037 image_load_addr);
1038#if CONFIG_IS_ENABLED(FIT)
1039 } else if (fit_parse_conf(img_addr, image_load_addr, &kernel_addr,
1040 fit_uname_config)) {
1041 debug("* kernel: config '%s' from image at 0x%08lx\n",
1042 *fit_uname_config, kernel_addr);
1043 } else if (fit_parse_subimage(img_addr, image_load_addr, &kernel_addr,
1044 fit_uname_kernel)) {
1045 debug("* kernel: subimage '%s' from image at 0x%08lx\n",
1046 *fit_uname_kernel, kernel_addr);
1047#endif
1048 } else {
1049 kernel_addr = simple_strtoul(img_addr, NULL, 16);
1050 debug("* kernel: cmdline image address = 0x%08lx\n",
1051 kernel_addr);
1052 }
1053
1054 return kernel_addr;
1055}
1056
1057
1058
1059
1060
1061ulong genimg_get_kernel_addr(char * const img_addr)
1062{
1063 const char *fit_uname_config = NULL;
1064 const char *fit_uname_kernel = NULL;
1065
1066 return genimg_get_kernel_addr_fit(img_addr, &fit_uname_config,
1067 &fit_uname_kernel);
1068}
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084int genimg_get_format(const void *img_addr)
1085{
1086#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
1087 const image_header_t *hdr;
1088
1089 hdr = (const image_header_t *)img_addr;
1090 if (image_check_magic(hdr))
1091 return IMAGE_FORMAT_LEGACY;
1092#endif
1093#if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
1094 if (fdt_check_header(img_addr) == 0)
1095 return IMAGE_FORMAT_FIT;
1096#endif
1097#ifdef CONFIG_ANDROID_BOOT_IMAGE
1098 if (android_image_check_header(img_addr) == 0)
1099 return IMAGE_FORMAT_ANDROID;
1100#endif
1101
1102 return IMAGE_FORMAT_INVALID;
1103}
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116int genimg_has_config(bootm_headers_t *images)
1117{
1118#if IMAGE_ENABLE_FIT
1119 if (images->fit_uname_cfg)
1120 return 1;
1121#endif
1122 return 0;
1123}
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147int boot_get_ramdisk(int argc, char *const argv[], bootm_headers_t *images,
1148 uint8_t arch, ulong *rd_start, ulong *rd_end)
1149{
1150 ulong rd_addr, rd_load;
1151 ulong rd_data, rd_len;
1152#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
1153 const image_header_t *rd_hdr;
1154#endif
1155 void *buf;
1156#ifdef CONFIG_SUPPORT_RAW_INITRD
1157 char *end;
1158#endif
1159#if IMAGE_ENABLE_FIT
1160 const char *fit_uname_config = images->fit_uname_cfg;
1161 const char *fit_uname_ramdisk = NULL;
1162 ulong default_addr;
1163 int rd_noffset;
1164#endif
1165 const char *select = NULL;
1166
1167 *rd_start = 0;
1168 *rd_end = 0;
1169
1170#ifdef CONFIG_ANDROID_BOOT_IMAGE
1171
1172
1173
1174 buf = map_sysmem(images->os.start, 0);
1175 if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)
1176 select = (argc == 0) ? env_get("loadaddr") : argv[0];
1177#endif
1178
1179 if (argc >= 2)
1180 select = argv[1];
1181
1182
1183
1184
1185
1186 if (select && strcmp(select, "-") == 0) {
1187 debug("## Skipping init Ramdisk\n");
1188 rd_len = rd_data = 0;
1189 } else if (select || genimg_has_config(images)) {
1190#if IMAGE_ENABLE_FIT
1191 if (select) {
1192
1193
1194
1195
1196
1197
1198 if (images->fit_uname_os)
1199 default_addr = (ulong)images->fit_hdr_os;
1200 else
1201 default_addr = image_load_addr;
1202
1203 if (fit_parse_conf(select, default_addr,
1204 &rd_addr, &fit_uname_config)) {
1205 debug("* ramdisk: config '%s' from image at "
1206 "0x%08lx\n",
1207 fit_uname_config, rd_addr);
1208 } else if (fit_parse_subimage(select, default_addr,
1209 &rd_addr, &fit_uname_ramdisk)) {
1210 debug("* ramdisk: subimage '%s' from image at "
1211 "0x%08lx\n",
1212 fit_uname_ramdisk, rd_addr);
1213 } else
1214#endif
1215 {
1216 rd_addr = simple_strtoul(select, NULL, 16);
1217 debug("* ramdisk: cmdline image address = "
1218 "0x%08lx\n",
1219 rd_addr);
1220 }
1221#if IMAGE_ENABLE_FIT
1222 } else {
1223
1224
1225
1226
1227 rd_addr = map_to_sysmem(images->fit_hdr_os);
1228 rd_noffset = fit_get_node_from_config(images,
1229 FIT_RAMDISK_PROP, rd_addr);
1230 if (rd_noffset == -ENOENT)
1231 return 0;
1232 else if (rd_noffset < 0)
1233 return 1;
1234 }
1235#endif
1236
1237
1238
1239
1240
1241
1242 buf = map_sysmem(rd_addr, 0);
1243 switch (genimg_get_format(buf)) {
1244#if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
1245 case IMAGE_FORMAT_LEGACY:
1246 printf("## Loading init Ramdisk from Legacy "
1247 "Image at %08lx ...\n", rd_addr);
1248
1249 bootstage_mark(BOOTSTAGE_ID_CHECK_RAMDISK);
1250 rd_hdr = image_get_ramdisk(rd_addr, arch,
1251 images->verify);
1252
1253 if (rd_hdr == NULL)
1254 return 1;
1255
1256 rd_data = image_get_data(rd_hdr);
1257 rd_len = image_get_data_size(rd_hdr);
1258 rd_load = image_get_load(rd_hdr);
1259 break;
1260#endif
1261#if IMAGE_ENABLE_FIT
1262 case IMAGE_FORMAT_FIT:
1263 rd_noffset = fit_image_load(images,
1264 rd_addr, &fit_uname_ramdisk,
1265 &fit_uname_config, arch,
1266 IH_TYPE_RAMDISK,
1267 BOOTSTAGE_ID_FIT_RD_START,
1268 FIT_LOAD_OPTIONAL_NON_ZERO,
1269 &rd_data, &rd_len);
1270 if (rd_noffset < 0)
1271 return 1;
1272
1273 images->fit_hdr_rd = map_sysmem(rd_addr, 0);
1274 images->fit_uname_rd = fit_uname_ramdisk;
1275 images->fit_noffset_rd = rd_noffset;
1276 break;
1277#endif
1278#ifdef CONFIG_ANDROID_BOOT_IMAGE
1279 case IMAGE_FORMAT_ANDROID:
1280 android_image_get_ramdisk((void *)images->os.start,
1281 &rd_data, &rd_len);
1282 break;
1283#endif
1284 default:
1285#ifdef CONFIG_SUPPORT_RAW_INITRD
1286 end = NULL;
1287 if (select)
1288 end = strchr(select, ':');
1289 if (end) {
1290 rd_len = simple_strtoul(++end, NULL, 16);
1291 rd_data = rd_addr;
1292 } else
1293#endif
1294 {
1295 puts("Wrong Ramdisk Image Format\n");
1296 rd_data = rd_len = rd_load = 0;
1297 return 1;
1298 }
1299 }
1300 } else if (images->legacy_hdr_valid &&
1301 image_check_type(&images->legacy_hdr_os_copy,
1302 IH_TYPE_MULTI)) {
1303
1304
1305
1306
1307
1308 bootstage_mark(BOOTSTAGE_ID_RAMDISK);
1309 printf("## Loading init Ramdisk from multi component "
1310 "Legacy Image at %08lx ...\n",
1311 (ulong)images->legacy_hdr_os);
1312
1313 image_multi_getimg(images->legacy_hdr_os, 1, &rd_data, &rd_len);
1314 } else {
1315
1316
1317
1318 bootstage_mark(BOOTSTAGE_ID_NO_RAMDISK);
1319 rd_len = rd_data = 0;
1320 }
1321
1322 if (!rd_data) {
1323 debug("## No init Ramdisk\n");
1324 } else {
1325 *rd_start = rd_data;
1326 *rd_end = rd_data + rd_len;
1327 }
1328 debug(" ramdisk start = 0x%08lx, ramdisk end = 0x%08lx\n",
1329 *rd_start, *rd_end);
1330
1331 return 0;
1332}
1333
1334#ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
1357 ulong *initrd_start, ulong *initrd_end)
1358{
1359 char *s;
1360 ulong initrd_high;
1361 int initrd_copy_to_ram = 1;
1362
1363 s = env_get("initrd_high");
1364 if (s) {
1365
1366
1367
1368 initrd_high = simple_strtoul(s, NULL, 16);
1369 if (initrd_high == ~0)
1370 initrd_copy_to_ram = 0;
1371 } else {
1372 initrd_high = env_get_bootm_mapsize() + env_get_bootm_low();
1373 }
1374
1375
1376 debug("## initrd_high = 0x%08lx, copy_to_ram = %d\n",
1377 initrd_high, initrd_copy_to_ram);
1378
1379 if (rd_data) {
1380 if (!initrd_copy_to_ram) {
1381 debug(" in-place initrd\n");
1382 *initrd_start = rd_data;
1383 *initrd_end = rd_data + rd_len;
1384 lmb_reserve(lmb, rd_data, rd_len);
1385 } else {
1386 if (initrd_high)
1387 *initrd_start = (ulong)lmb_alloc_base(lmb,
1388 rd_len, 0x1000, initrd_high);
1389 else
1390 *initrd_start = (ulong)lmb_alloc(lmb, rd_len,
1391 0x1000);
1392
1393 if (*initrd_start == 0) {
1394 puts("ramdisk - allocation error\n");
1395 goto error;
1396 }
1397 bootstage_mark(BOOTSTAGE_ID_COPY_RAMDISK);
1398
1399 *initrd_end = *initrd_start + rd_len;
1400 printf(" Loading Ramdisk to %08lx, end %08lx ... ",
1401 *initrd_start, *initrd_end);
1402
1403 memmove_wd((void *)*initrd_start,
1404 (void *)rd_data, rd_len, CHUNKSZ);
1405
1406#ifdef CONFIG_MP
1407
1408
1409
1410
1411
1412 flush_cache((unsigned long)*initrd_start,
1413 ALIGN(rd_len, ARCH_DMA_MINALIGN));
1414#endif
1415 puts("OK\n");
1416 }
1417 } else {
1418 *initrd_start = 0;
1419 *initrd_end = 0;
1420 }
1421 debug(" ramdisk load start = 0x%08lx, ramdisk load end = 0x%08lx\n",
1422 *initrd_start, *initrd_end);
1423
1424 return 0;
1425
1426error:
1427 return -1;
1428}
1429#endif
1430
1431int boot_get_setup(bootm_headers_t *images, uint8_t arch,
1432 ulong *setup_start, ulong *setup_len)
1433{
1434#if IMAGE_ENABLE_FIT
1435 return boot_get_setup_fit(images, arch, setup_start, setup_len);
1436#else
1437 return -ENOENT;
1438#endif
1439}
1440
1441#if IMAGE_ENABLE_FIT
1442#if defined(CONFIG_FPGA)
1443int boot_get_fpga(int argc, char *const argv[], bootm_headers_t *images,
1444 uint8_t arch, const ulong *ld_start, ulong * const ld_len)
1445{
1446 ulong tmp_img_addr, img_data, img_len;
1447 void *buf;
1448 int conf_noffset;
1449 int fit_img_result;
1450 const char *uname, *name;
1451 int err;
1452 int devnum = 0;
1453
1454
1455 if (!genimg_has_config(images)) {
1456 debug("## FIT configuration was not specified\n");
1457 return 0;
1458 }
1459
1460
1461
1462
1463 tmp_img_addr = map_to_sysmem(images->fit_hdr_os);
1464 buf = map_sysmem(tmp_img_addr, 0);
1465
1466
1467
1468
1469 switch (genimg_get_format(buf)) {
1470 case IMAGE_FORMAT_FIT:
1471 conf_noffset = fit_conf_get_node(buf, images->fit_uname_cfg);
1472
1473 uname = fdt_stringlist_get(buf, conf_noffset, FIT_FPGA_PROP, 0,
1474 NULL);
1475 if (!uname) {
1476 debug("## FPGA image is not specified\n");
1477 return 0;
1478 }
1479 fit_img_result = fit_image_load(images,
1480 tmp_img_addr,
1481 (const char **)&uname,
1482 &(images->fit_uname_cfg),
1483 arch,
1484 IH_TYPE_FPGA,
1485 BOOTSTAGE_ID_FPGA_INIT,
1486 FIT_LOAD_OPTIONAL_NON_ZERO,
1487 &img_data, &img_len);
1488
1489 debug("FPGA image (%s) loaded to 0x%lx/size 0x%lx\n",
1490 uname, img_data, img_len);
1491
1492 if (fit_img_result < 0) {
1493
1494 return fit_img_result;
1495 }
1496
1497 if (!fpga_is_partial_data(devnum, img_len)) {
1498 name = "full";
1499 err = fpga_loadbitstream(devnum, (char *)img_data,
1500 img_len, BIT_FULL);
1501 if (err)
1502 err = fpga_load(devnum, (const void *)img_data,
1503 img_len, BIT_FULL);
1504 } else {
1505 name = "partial";
1506 err = fpga_loadbitstream(devnum, (char *)img_data,
1507 img_len, BIT_PARTIAL);
1508 if (err)
1509 err = fpga_load(devnum, (const void *)img_data,
1510 img_len, BIT_PARTIAL);
1511 }
1512
1513 if (err)
1514 return err;
1515
1516 printf(" Programming %s bitstream... OK\n", name);
1517 break;
1518 default:
1519 printf("The given image format is not supported (corrupt?)\n");
1520 return 1;
1521 }
1522
1523 return 0;
1524}
1525#endif
1526
1527static void fit_loadable_process(uint8_t img_type,
1528 ulong img_data,
1529 ulong img_len)
1530{
1531 int i;
1532 const unsigned int count =
1533 ll_entry_count(struct fit_loadable_tbl, fit_loadable);
1534 struct fit_loadable_tbl *fit_loadable_handler =
1535 ll_entry_start(struct fit_loadable_tbl, fit_loadable);
1536
1537 for (i = 0; i < count; i++, fit_loadable_handler++)
1538
1539 if (fit_loadable_handler->type == img_type)
1540
1541 fit_loadable_handler->handler(img_data, img_len);
1542}
1543
1544int boot_get_loadable(int argc, char *const argv[], bootm_headers_t *images,
1545 uint8_t arch, const ulong *ld_start, ulong * const ld_len)
1546{
1547
1548
1549
1550
1551 ulong tmp_img_addr;
1552
1553
1554
1555
1556 ulong img_data, img_len;
1557 void *buf;
1558 int loadables_index;
1559 int conf_noffset;
1560 int fit_img_result;
1561 const char *uname;
1562 uint8_t img_type;
1563
1564
1565 if (!genimg_has_config(images)) {
1566 debug("## FIT configuration was not specified\n");
1567 return 0;
1568 }
1569
1570
1571
1572
1573 tmp_img_addr = map_to_sysmem(images->fit_hdr_os);
1574 buf = map_sysmem(tmp_img_addr, 0);
1575
1576
1577
1578
1579 switch (genimg_get_format(buf)) {
1580 case IMAGE_FORMAT_FIT:
1581 conf_noffset = fit_conf_get_node(buf, images->fit_uname_cfg);
1582
1583 for (loadables_index = 0;
1584 uname = fdt_stringlist_get(buf, conf_noffset,
1585 FIT_LOADABLE_PROP, loadables_index,
1586 NULL), uname;
1587 loadables_index++)
1588 {
1589 fit_img_result = fit_image_load(images,
1590 tmp_img_addr,
1591 &uname,
1592 &(images->fit_uname_cfg), arch,
1593 IH_TYPE_LOADABLE,
1594 BOOTSTAGE_ID_FIT_LOADABLE_START,
1595 FIT_LOAD_OPTIONAL_NON_ZERO,
1596 &img_data, &img_len);
1597 if (fit_img_result < 0) {
1598
1599 return fit_img_result;
1600 }
1601
1602 fit_img_result = fit_image_get_node(buf, uname);
1603 if (fit_img_result < 0) {
1604
1605 return fit_img_result;
1606 }
1607 fit_img_result = fit_image_get_type(buf,
1608 fit_img_result,
1609 &img_type);
1610 if (fit_img_result < 0) {
1611
1612 return fit_img_result;
1613 }
1614
1615 fit_loadable_process(img_type, img_data, img_len);
1616 }
1617 break;
1618 default:
1619 printf("The given image format is not supported (corrupt?)\n");
1620 return 1;
1621 }
1622
1623 return 0;
1624}
1625#endif
1626
1627#ifdef CONFIG_SYS_BOOT_GET_CMDLINE
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
1644{
1645 char *cmdline;
1646 char *s;
1647
1648 cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf,
1649 env_get_bootm_mapsize() + env_get_bootm_low());
1650
1651 if (cmdline == NULL)
1652 return -1;
1653
1654 s = env_get("bootargs");
1655 if (!s)
1656 s = "";
1657
1658 strcpy(cmdline, s);
1659
1660 *cmd_start = (ulong) & cmdline[0];
1661 *cmd_end = *cmd_start + strlen(cmdline);
1662
1663 debug("## cmdline at 0x%08lx ... 0x%08lx\n", *cmd_start, *cmd_end);
1664
1665 return 0;
1666}
1667#endif
1668
1669#ifdef CONFIG_SYS_BOOT_GET_KBD
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683int boot_get_kbd(struct lmb *lmb, struct bd_info **kbd)
1684{
1685 *kbd = (struct bd_info *)(ulong)lmb_alloc_base(lmb,
1686 sizeof(struct bd_info),
1687 0xf,
1688 env_get_bootm_mapsize() + env_get_bootm_low());
1689 if (*kbd == NULL)
1690 return -1;
1691
1692 **kbd = *(gd->bd);
1693
1694 debug("## kernel board info at 0x%08lx\n", (ulong)*kbd);
1695
1696#if defined(DEBUG) && defined(CONFIG_CMD_BDI)
1697 do_bdinfo(NULL, 0, 0, NULL);
1698#endif
1699
1700 return 0;
1701}
1702#endif
1703
1704#ifdef CONFIG_LMB
1705int image_setup_linux(bootm_headers_t *images)
1706{
1707 ulong of_size = images->ft_len;
1708 char **of_flat_tree = &images->ft_addr;
1709 struct lmb *lmb = &images->lmb;
1710 int ret;
1711
1712 if (IMAGE_ENABLE_OF_LIBFDT)
1713 boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
1714
1715 if (IMAGE_BOOT_GET_CMDLINE) {
1716 ret = boot_get_cmdline(lmb, &images->cmdline_start,
1717 &images->cmdline_end);
1718 if (ret) {
1719 puts("ERROR with allocation of cmdline\n");
1720 return ret;
1721 }
1722 }
1723
1724 if (IMAGE_ENABLE_OF_LIBFDT) {
1725 ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size);
1726 if (ret)
1727 return ret;
1728 }
1729
1730 if (IMAGE_ENABLE_OF_LIBFDT && of_size) {
1731 ret = image_setup_libfdt(images, *of_flat_tree, of_size, lmb);
1732 if (ret)
1733 return ret;
1734 }
1735
1736 return 0;
1737}
1738#endif
1739#endif
1740