Blame view

common/image.c 43.4 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
2
3
4
5
6
  /*
   * (C) Copyright 2008 Semihalf
   *
   * (C) Copyright 2000-2006
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
7
   */
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
8

b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
9
  #ifndef USE_HOSTCC
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
10
  #include <common.h>
7b51b576d   Simon Glass   env: Move env_get...
11
  #include <env.h>
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
12
13
14
15
16
  #include <watchdog.h>
  
  #ifdef CONFIG_SHOW_BOOT_PROGRESS
  #include <status_led.h>
  #endif
2242f5369   Marian Balakowicz   [new uImage] Rena...
17
  #include <rtc.h>
2242f5369   Marian Balakowicz   [new uImage] Rena...
18

0c670fc14   Simon Glass   common: Move gzip...
19
  #include <gzip.h>
5dfb52138   Marian Balakowicz   [new uImage] New ...
20
  #include <image.h>
0eb25b619   Joe Hershberger   common: Make sure...
21
  #include <mapmem.h>
5dfb52138   Marian Balakowicz   [new uImage] New ...
22

aa34fbc08   Simon Glass   fdt: Allow libfdt...
23
  #if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
b08c8c487   Masahiro Yamada   libfdt: move head...
24
  #include <linux/libfdt.h>
fff888a19   Marian Balakowicz   [new uImage] Add ...
25
  #include <fdt_support.h>
62afc6018   Michal Simek   image: Add boot_g...
26
27
  #include <fpga.h>
  #include <xilinx.h>
c87796483   Marian Balakowicz   [new uImage] Add ...
28
  #endif
20a14a42a   Andy Fleming   Rename include/md...
29
  #include <u-boot/md5.h>
2b9912e6a   Jeroen Hofstee   includes: move op...
30
  #include <u-boot/sha1.h>
1221ce459   Masahiro Yamada   treewide: replace...
31
  #include <linux/errno.h>
35e7b0f17   Simon Glass   sandbox: image: A...
32
  #include <asm/io.h>
c87796483   Marian Balakowicz   [new uImage] Add ...
33

2090854cd   Julius Werner   common: Move boot...
34
35
36
37
38
  #include <bzlib.h>
  #include <linux/lzo.h>
  #include <lzma/LzmaTypes.h>
  #include <lzma/LzmaDec.h>
  #include <lzma/LzmaTools.h>
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
39
  #ifdef CONFIG_CMD_BDI
54841ab50   Wolfgang Denk   Make sure that ar...
40
  extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
41
42
43
  #endif
  
  DECLARE_GLOBAL_DATA_PTR;
8a5ea3e61   Marian Balakowicz   [new uImage] Move...
44

c76c93a3d   Tom Rini   configs: Rename C...
45
  #if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
712fbcf38   Stephen Warren   checkpatch whites...
46
  static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
d985c8498   Marian Balakowicz   [new uImage] Remo...
47
  						int verify);
21d29f7f9   Heiko Schocher   bootm: make use o...
48
  #endif
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
49
  #else
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
50
  #include "mkimage.h"
20a14a42a   Andy Fleming   Rename include/md...
51
  #include <u-boot/md5.h>
5dfb52138   Marian Balakowicz   [new uImage] New ...
52
  #include <time.h>
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
53
  #include <image.h>
80402f34f   Heiko Schocher   spl, common, seri...
54
55
56
57
  
  #ifndef __maybe_unused
  # define __maybe_unused		/* unimplemented */
  #endif
5dfb52138   Marian Balakowicz   [new uImage] New ...
58
  #endif /* !USE_HOSTCC*/
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
59

0ccff500c   Simon Glass   image: Use crc he...
60
  #include <u-boot/crc.h>
5b20d141f   Breno Matheus Lima   imx: Kconfig: Red...
61
  #include <imximage.h>
0ccff500c   Simon Glass   image: Use crc he...
62

13d06981a   Simon Glass   image: Add device...
63
64
65
  #ifndef CONFIG_SYS_BARGSIZE
  #define CONFIG_SYS_BARGSIZE 512
  #endif
7edb186fc   Mike Frysinger   image: constify l...
66
  static const table_entry_t uimage_arch[] = {
30495bff3   Simon Glass   image: Add a name...
67
  	{	IH_ARCH_INVALID,	"invalid",	"Invalid ARCH",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
68
69
70
71
72
73
74
75
  	{	IH_ARCH_ALPHA,		"alpha",	"Alpha",	},
  	{	IH_ARCH_ARM,		"arm",		"ARM",		},
  	{	IH_ARCH_I386,		"x86",		"Intel x86",	},
  	{	IH_ARCH_IA64,		"ia64",		"IA64",		},
  	{	IH_ARCH_M68K,		"m68k",		"M68K",		},
  	{	IH_ARCH_MICROBLAZE,	"microblaze",	"MicroBlaze",	},
  	{	IH_ARCH_MIPS,		"mips",		"MIPS",		},
  	{	IH_ARCH_MIPS64,		"mips64",	"MIPS 64 Bit",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
76
  	{	IH_ARCH_NIOS2,		"nios2",	"NIOS II",	},
e419e12d0   Grant Erickson   Recognize 'powerp...
77
  	{	IH_ARCH_PPC,		"powerpc",	"PowerPC",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
78
79
80
81
82
83
84
  	{	IH_ARCH_PPC,		"ppc",		"PowerPC",	},
  	{	IH_ARCH_S390,		"s390",		"IBM S390",	},
  	{	IH_ARCH_SH,		"sh",		"SuperH",	},
  	{	IH_ARCH_SPARC,		"sparc",	"SPARC",	},
  	{	IH_ARCH_SPARC64,	"sparc64",	"SPARC 64 Bit",	},
  	{	IH_ARCH_BLACKFIN,	"blackfin",	"Blackfin",	},
  	{	IH_ARCH_AVR32,		"avr32",	"AVR32",	},
64d614617   Macpaul Lin   nds32: common bdi...
85
  	{	IH_ARCH_NDS32,		"nds32",	"NDS32",	},
3ddcaccda   Stefan Kristiansson   openrisc: Add arc...
86
  	{	IH_ARCH_OPENRISC,	"or1k",		"OpenRISC 1000",},
35e7b0f17   Simon Glass   sandbox: image: A...
87
  	{	IH_ARCH_SANDBOX,	"sandbox",	"Sandbox",	},
0ae765312   David Feng   arm64: core support
88
  	{	IH_ARCH_ARM64,		"arm64",	"AArch64",	},
bc5d54288   Alexey Brodkin   arc: bdinfo, imag...
89
  	{	IH_ARCH_ARC,		"arc",		"ARC",		},
5bda35cff   Simon Glass   x86: image: Add n...
90
  	{	IH_ARCH_X86_64,		"x86_64",	"AMD x86_64",	},
de5e5cea0   Chris Zankel   xtensa: add suppo...
91
  	{	IH_ARCH_XTENSA,		"xtensa",	"Xtensa",	},
86aa65a0c   Rick Chen   tools: mkimage: S...
92
  	{	IH_ARCH_RISCV,		"riscv",	"RISC-V",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
93
94
  	{	-1,			"",		"",		},
  };
7edb186fc   Mike Frysinger   image: constify l...
95
  static const table_entry_t uimage_os[] = {
30495bff3   Simon Glass   image: Add a name...
96
  	{	IH_OS_INVALID,	"invalid",	"Invalid OS",		},
4914af128   Philipp Tomsich   image: add IH_OS_...
97
  	{       IH_OS_ARM_TRUSTED_FIRMWARE, "arm-trusted-firmware", "ARM Trusted Firmware"  },
570abb0ad   Marian Balakowicz   [new uImage] Shar...
98
99
100
101
102
  	{	IH_OS_LINUX,	"linux",	"Linux",		},
  #if defined(CONFIG_LYNXKDI) || defined(USE_HOSTCC)
  	{	IH_OS_LYNXOS,	"lynxos",	"LynxOS",		},
  #endif
  	{	IH_OS_NETBSD,	"netbsd",	"NetBSD",		},
3df619579   Torkel Lundgren   Add support for o...
103
  	{	IH_OS_OSE,	"ose",		"Enea OSE",		},
04d414090   Steven Stallion   image: Add suppor...
104
  	{	IH_OS_PLAN9,	"plan9",	"Plan 9",		},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
105
  	{	IH_OS_RTEMS,	"rtems",	"RTEMS",		},
45b55712d   Bryan O'Donoghue   image: Add IH_OS_...
106
  	{	IH_OS_TEE,	"tee",		"Trusted Execution Environment" },
570abb0ad   Marian Balakowicz   [new uImage] Shar...
107
  	{	IH_OS_U_BOOT,	"u-boot",	"U-Boot",		},
68b15e831   miao.yan@windriver.com   common/image.c: m...
108
  	{	IH_OS_VXWORKS,	"vxworks",	"VxWorks",		},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
109
110
  #if defined(CONFIG_CMD_ELF) || defined(USE_HOSTCC)
  	{	IH_OS_QNX,	"qnx",		"QNX",			},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
111
  #endif
f5ed9e390   Peter Tyser   Add support for b...
112
113
114
  #if defined(CONFIG_INTEGRITY) || defined(USE_HOSTCC)
  	{	IH_OS_INTEGRITY,"integrity",	"INTEGRITY",		},
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
115
116
117
118
119
120
121
122
123
124
125
126
127
  #ifdef USE_HOSTCC
  	{	IH_OS_4_4BSD,	"4_4bsd",	"4_4BSD",		},
  	{	IH_OS_DELL,	"dell",		"Dell",			},
  	{	IH_OS_ESIX,	"esix",		"Esix",			},
  	{	IH_OS_FREEBSD,	"freebsd",	"FreeBSD",		},
  	{	IH_OS_IRIX,	"irix",		"Irix",			},
  	{	IH_OS_NCR,	"ncr",		"NCR",			},
  	{	IH_OS_OPENBSD,	"openbsd",	"OpenBSD",		},
  	{	IH_OS_PSOS,	"psos",		"pSOS",			},
  	{	IH_OS_SCO,	"sco",		"SCO",			},
  	{	IH_OS_SOLARIS,	"solaris",	"Solaris",		},
  	{	IH_OS_SVR4,	"svr4",		"SVR4",			},
  #endif
67ddd955f   Marek Vasut   image: bootm: Add...
128
129
130
  #if defined(CONFIG_BOOTM_OPENRTOS) || defined(USE_HOSTCC)
  	{	IH_OS_OPENRTOS,	"openrtos",	"OpenRTOS",		},
  #endif
5e30e45c8   Lukas Auer   spl: support boot...
131
  	{	IH_OS_OPENSBI,	"opensbi",	"RISC-V OpenSBI",	},
67ddd955f   Marek Vasut   image: bootm: Add...
132

570abb0ad   Marian Balakowicz   [new uImage] Shar...
133
134
  	{	-1,		"",		"",			},
  };
7edb186fc   Mike Frysinger   image: constify l...
135
  static const table_entry_t uimage_type[] = {
4962e38e9   Stefano Babic   mkimage: adding s...
136
  	{	IH_TYPE_AISIMAGE,   "aisimage",   "Davinci AIS image",},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
137
138
  	{	IH_TYPE_FILESYSTEM, "filesystem", "Filesystem Image",	},
  	{	IH_TYPE_FIRMWARE,   "firmware",	  "Firmware",		},
3decb14ab   John Rigby   mkimage: Add OMAP...
139
  	{	IH_TYPE_FLATDT,     "flat_dt",    "Flat Device Tree",	},
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
140
  	{	IH_TYPE_GPIMAGE,    "gpimage",    "TI Keystone SPL Image",},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
141
  	{	IH_TYPE_KERNEL,	    "kernel",	  "Kernel Image",	},
b9b50e89d   Stephen Warren   image: Implement ...
142
  	{	IH_TYPE_KERNEL_NOLOAD, "kernel_noload",  "Kernel Image (no loading done)", },
4962e38e9   Stefano Babic   mkimage: adding s...
143
144
  	{	IH_TYPE_KWBIMAGE,   "kwbimage",   "Kirkwood Boot Image",},
  	{	IH_TYPE_IMXIMAGE,   "imximage",   "Freescale i.MX Boot Image",},
a2b96ece5   Peng Fan   tools: add i.MX8/...
145
  	{	IH_TYPE_IMX8IMAGE,  "imx8image",  "NXP i.MX8 Boot Image",},
6609c2663   Peng Fan   tools: add i.MX8M...
146
  	{	IH_TYPE_IMX8MIMAGE, "imx8mimage", "NXP i.MX8M Boot Image",},
30495bff3   Simon Glass   image: Add a name...
147
  	{	IH_TYPE_INVALID,    "invalid",	  "Invalid Image",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
148
  	{	IH_TYPE_MULTI,	    "multi",	  "Multi-File Image",	},
4962e38e9   Stefano Babic   mkimage: adding s...
149
  	{	IH_TYPE_OMAPIMAGE,  "omapimage",  "TI OMAP SPL With GP CH",},
5d898a00f   Shaohui Xie   powerpc/CoreNet: ...
150
  	{	IH_TYPE_PBLIMAGE,   "pblimage",   "Freescale PBL Boot Image",},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
151
152
  	{	IH_TYPE_RAMDISK,    "ramdisk",	  "RAMDisk Image",	},
  	{	IH_TYPE_SCRIPT,     "script",	  "Script",		},
662abc4fc   Marek Vasut   image: socfpga: A...
153
154
  	{	IH_TYPE_SOCFPGAIMAGE, "socfpgaimage", "Altera SoCFPGA CV/AV preloader",},
  	{	IH_TYPE_SOCFPGAIMAGE_V1, "socfpgaimage_v1", "Altera SoCFPGA A10 preloader",},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
155
  	{	IH_TYPE_STANDALONE, "standalone", "Standalone Program", },
7816f2cf8   Heiko Schocher   mkimage: add UBL ...
156
  	{	IH_TYPE_UBLIMAGE,   "ublimage",   "Davinci UBL image",},
bce883707   Marek Vasut   ARM: mxs: tools: ...
157
  	{	IH_TYPE_MXSIMAGE,   "mxsimage",   "Freescale MXS Boot Image",},
7b1a41174   Andreas Bießmann   mkimage: add atme...
158
  	{	IH_TYPE_ATMELIMAGE, "atmelimage", "ATMEL ROM-Boot Image",},
90268b878   Simon Glass   x86: Support load...
159
  	{	IH_TYPE_X86_SETUP,  "x86_setup",  "x86 setup.bin",    },
39f520bb6   Albert ARIBAUD \(3ADEV\)   lpc32xx: add lpc3...
160
  	{	IH_TYPE_LPC32XXIMAGE, "lpc32xximage",  "LPC32XX Boot Image", },
a131c1f44   Simon Glass   rockchip: Add the...
161
  	{	IH_TYPE_RKIMAGE,    "rkimage",    "Rockchip Boot Image" },
f9a3c278b   Simon Glass   rockchip: Add sup...
162
  	{	IH_TYPE_RKSD,       "rksd",       "Rockchip SD Boot Image" },
10b84fe1b   Simon Glass   rockchip: Add sup...
163
  	{	IH_TYPE_RKSPI,      "rkspi",      "Rockchip SPI Boot Image" },
ed0c2c0a9   Albert ARIBAUD \(3ADEV\)   tools: mkimage: a...
164
  	{	IH_TYPE_VYBRIDIMAGE, "vybridimage",  "Vybrid Boot Image", },
66eef1e78   Nathan Rossi   tools: zynqimage:...
165
  	{	IH_TYPE_ZYNQIMAGE,  "zynqimage",  "Xilinx Zynq Boot Image" },
d9b58b303   Michal Simek   tools: zynqmpimag...
166
  	{	IH_TYPE_ZYNQMPIMAGE, "zynqmpimage", "Xilinx ZynqMP Boot Image" },
6915dcf35   Alexander Graf   tools: zynqmpimag...
167
  	{	IH_TYPE_ZYNQMPBIF,  "zynqmpbif",  "Xilinx ZynqMP Boot Image (bif)" },
ed0cea7c5   Michal Simek   mkimage: Report i...
168
  	{	IH_TYPE_FPGA,       "fpga",       "FPGA Image" },
7e719ee7d   Andrew F. Davis   image: Add Truste...
169
  	{       IH_TYPE_TEE,        "tee",        "Trusted Execution Environment Image",},
d21bd69b6   Sven Ebenfeld   tools: mkimage: a...
170
  	{	IH_TYPE_FIRMWARE_IVT, "firmware_ivt", "Firmware with HABv4 IVT" },
6442c9643   Andrew F. Davis   image: Add TI PMM...
171
  	{       IH_TYPE_PMMC,        "pmmc",        "TI Power Management Micro-Controller Firmware",},
81260e333   Patrick Delaunay   tools/mkimage: ad...
172
  	{	IH_TYPE_STM32IMAGE, "stm32image", "STMicroelectronics STM32 Image" },
3b975a147   Ryder Lee   tools: MediaTek: ...
173
  	{	IH_TYPE_MTKIMAGE,   "mtk_image",   "MediaTek BootROM loadable Image" },
e7fabe75a   Patrick Delaunay   image: add new "c...
174
  	{	IH_TYPE_COPRO, "copro", "Coprocessor Image"},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
175
176
  	{	-1,		    "",		  "",			},
  };
7edb186fc   Mike Frysinger   image: constify l...
177
  static const table_entry_t uimage_comp[] = {
570abb0ad   Marian Balakowicz   [new uImage] Shar...
178
179
180
  	{	IH_COMP_NONE,	"none",		"uncompressed",		},
  	{	IH_COMP_BZIP2,	"bzip2",	"bzip2 compressed",	},
  	{	IH_COMP_GZIP,	"gzip",		"gzip compressed",	},
fc9c1727b   Luigi 'Comio' Mantellini   Add support for L...
181
  	{	IH_COMP_LZMA,	"lzma",		"lzma compressed",	},
20dde48bc   Peter Korsgaard   add lzop decompre...
182
  	{	IH_COMP_LZO,	"lzo",		"lzo compressed",	},
027b728d4   Julius Werner   Add support for L...
183
  	{	IH_COMP_LZ4,	"lz4",		"lz4 compressed",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
184
185
  	{	-1,		"",		"",			},
  };
56d7ab747   Simon Glass   image: Create a t...
186
187
188
189
190
191
192
193
194
195
196
197
  struct table_info {
  	const char *desc;
  	int count;
  	const table_entry_t *table;
  };
  
  static const struct table_info table_info[IH_COUNT] = {
  	{ "architecture", IH_ARCH_COUNT, uimage_arch },
  	{ "compression", IH_COMP_COUNT, uimage_comp },
  	{ "operating system", IH_OS_COUNT, uimage_os },
  	{ "image type", IH_TYPE_COUNT, uimage_type },
  };
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
198
199
200
  /*****************************************************************************/
  /* Legacy format routines */
  /*****************************************************************************/
712fbcf38   Stephen Warren   checkpatch whites...
201
  int image_check_hcrc(const image_header_t *hdr)
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
202
203
  {
  	ulong hcrc;
712fbcf38   Stephen Warren   checkpatch whites...
204
  	ulong len = image_get_header_size();
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
205
206
207
  	image_header_t header;
  
  	/* Copy header so we can blank CRC field for re-calculation */
712fbcf38   Stephen Warren   checkpatch whites...
208
209
  	memmove(&header, (char *)hdr, image_get_header_size());
  	image_set_hcrc(&header, 0);
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
210

712fbcf38   Stephen Warren   checkpatch whites...
211
  	hcrc = crc32(0, (unsigned char *)&header, len);
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
212

712fbcf38   Stephen Warren   checkpatch whites...
213
  	return (hcrc == image_get_hcrc(hdr));
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
214
  }
712fbcf38   Stephen Warren   checkpatch whites...
215
  int image_check_dcrc(const image_header_t *hdr)
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
216
  {
712fbcf38   Stephen Warren   checkpatch whites...
217
218
219
  	ulong data = image_get_data(hdr);
  	ulong len = image_get_data_size(hdr);
  	ulong dcrc = crc32_wd(0, (unsigned char *)data, len, CHUNKSZ_CRC32);
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
220

712fbcf38   Stephen Warren   checkpatch whites...
221
  	return (dcrc == image_get_dcrc(hdr));
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
222
  }
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
223
224
225
226
227
228
229
230
231
232
233
234
235
  /**
   * image_multi_count - get component (sub-image) count
   * @hdr: pointer to the header of the multi component image
   *
   * image_multi_count() returns number of components in a multi
   * component image.
   *
   * Note: no checking of the image type is done, caller must pass
   * a valid multi component image.
   *
   * returns:
   *     number of components
   */
712fbcf38   Stephen Warren   checkpatch whites...
236
  ulong image_multi_count(const image_header_t *hdr)
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
237
238
  {
  	ulong i, count = 0;
df6f1b895   Marian Balakowicz   [new uImage] Fix ...
239
  	uint32_t *size;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
240
241
242
  
  	/* get start of the image payload, which in case of multi
  	 * component images that points to a table of component sizes */
712fbcf38   Stephen Warren   checkpatch whites...
243
  	size = (uint32_t *)image_get_data(hdr);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
  
  	/* count non empty slots */
  	for (i = 0; size[i]; ++i)
  		count++;
  
  	return count;
  }
  
  /**
   * image_multi_getimg - get component data address and size
   * @hdr: pointer to the header of the multi component image
   * @idx: index of the requested component
   * @data: pointer to a ulong variable, will hold component data address
   * @len: pointer to a ulong variable, will hold component size
   *
   * image_multi_getimg() returns size and data address for the requested
   * component in a multi component image.
   *
   * Note: no checking of the image type is done, caller must pass
   * a valid multi component image.
   *
   * returns:
   *     data address and size of the component, if idx is valid
   *     0 in data and len, if idx is out of range
   */
712fbcf38   Stephen Warren   checkpatch whites...
269
  void image_multi_getimg(const image_header_t *hdr, ulong idx,
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
270
271
272
  			ulong *data, ulong *len)
  {
  	int i;
df6f1b895   Marian Balakowicz   [new uImage] Fix ...
273
  	uint32_t *size;
02b9b2244   Nick Spence   Fix offset calcul...
274
  	ulong offset, count, img_data;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
275
276
  
  	/* get number of component */
712fbcf38   Stephen Warren   checkpatch whites...
277
  	count = image_multi_count(hdr);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
278
279
280
  
  	/* get start of the image payload, which in case of multi
  	 * component images that points to a table of component sizes */
712fbcf38   Stephen Warren   checkpatch whites...
281
  	size = (uint32_t *)image_get_data(hdr);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
282
283
284
  
  	/* get address of the proper component data start, which means
  	 * skipping sizes table (add 1 for last, null entry) */
712fbcf38   Stephen Warren   checkpatch whites...
285
  	img_data = image_get_data(hdr) + (count + 1) * sizeof(uint32_t);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
286
287
  
  	if (idx < count) {
712fbcf38   Stephen Warren   checkpatch whites...
288
  		*len = uimage_to_cpu(size[idx]);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
289
  		offset = 0;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
290
291
292
  
  		/* go over all indices preceding requested component idx */
  		for (i = 0; i < idx; i++) {
02b9b2244   Nick Spence   Fix offset calcul...
293
  			/* add up i-th component size, rounding up to 4 bytes */
712fbcf38   Stephen Warren   checkpatch whites...
294
  			offset += (uimage_to_cpu(size[i]) + 3) & ~3 ;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
295
296
297
  		}
  
  		/* calculate idx-th component data address */
02b9b2244   Nick Spence   Fix offset calcul...
298
  		*data = img_data + offset;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
299
300
301
302
303
  	} else {
  		*len = 0;
  		*data = 0;
  	}
  }
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
304

712fbcf38   Stephen Warren   checkpatch whites...
305
  static void image_print_type(const image_header_t *hdr)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
306
  {
80402f34f   Heiko Schocher   spl, common, seri...
307
  	const char __maybe_unused *os, *arch, *type, *comp;
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
308

712fbcf38   Stephen Warren   checkpatch whites...
309
310
311
312
  	os = genimg_get_os_name(image_get_os(hdr));
  	arch = genimg_get_arch_name(image_get_arch(hdr));
  	type = genimg_get_type_name(image_get_type(hdr));
  	comp = genimg_get_comp_name(image_get_comp(hdr));
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
313

712fbcf38   Stephen Warren   checkpatch whites...
314
315
  	printf("%s %s %s (%s)
  ", arch, os, type, comp);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
316
  }
5dfb52138   Marian Balakowicz   [new uImage] New ...
317
  /**
edbed247a   Bartlomiej Sieka   Memory footprint ...
318
   * image_print_contents - prints out the contents of the legacy format image
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
319
   * @ptr: pointer to the legacy format image header
5dfb52138   Marian Balakowicz   [new uImage] New ...
320
321
   * @p: pointer to prefix string
   *
edbed247a   Bartlomiej Sieka   Memory footprint ...
322
   * image_print_contents() formats a multi line legacy image contents description.
5dfb52138   Marian Balakowicz   [new uImage] New ...
323
324
325
326
327
328
   * The routine prints out all header fields followed by the size/offset data
   * for MULTI/SCRIPT images.
   *
   * returns:
   *     no returned results
   */
712fbcf38   Stephen Warren   checkpatch whites...
329
  void image_print_contents(const void *ptr)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
330
  {
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
331
  	const image_header_t *hdr = (const image_header_t *)ptr;
80402f34f   Heiko Schocher   spl, common, seri...
332
  	const char __maybe_unused *p;
edbed247a   Bartlomiej Sieka   Memory footprint ...
333

1fe7d9389   Simon Glass   image: Remove rem...
334
  	p = IMAGE_INDENT_STRING;
712fbcf38   Stephen Warren   checkpatch whites...
335
336
  	printf("%sImage Name:   %.*s
  ", p, IH_NMLEN, image_get_name(hdr));
859e92b77   Simon Glass   image: Move times...
337
338
339
340
  	if (IMAGE_ENABLE_TIMESTAMP) {
  		printf("%sCreated:      ", p);
  		genimg_print_time((time_t)image_get_time(hdr));
  	}
712fbcf38   Stephen Warren   checkpatch whites...
341
342
343
344
345
346
347
348
349
350
351
  	printf("%sImage Type:   ", p);
  	image_print_type(hdr);
  	printf("%sData Size:    ", p);
  	genimg_print_size(image_get_data_size(hdr));
  	printf("%sLoad Address: %08x
  ", p, image_get_load(hdr));
  	printf("%sEntry Point:  %08x
  ", p, image_get_ep(hdr));
  
  	if (image_check_type(hdr, IH_TYPE_MULTI) ||
  			image_check_type(hdr, IH_TYPE_SCRIPT)) {
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
352
353
  		int i;
  		ulong data, len;
712fbcf38   Stephen Warren   checkpatch whites...
354
  		ulong count = image_multi_count(hdr);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
355

712fbcf38   Stephen Warren   checkpatch whites...
356
357
  		printf("%sContents:
  ", p);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
358
  		for (i = 0; i < count; i++) {
712fbcf38   Stephen Warren   checkpatch whites...
359
  			image_multi_getimg(hdr, i, &data, &len);
570abb0ad   Marian Balakowicz   [new uImage] Shar...
360

712fbcf38   Stephen Warren   checkpatch whites...
361
362
  			printf("%s   Image %d: ", p, i);
  			genimg_print_size(len);
570abb0ad   Marian Balakowicz   [new uImage] Shar...
363

712fbcf38   Stephen Warren   checkpatch whites...
364
  			if (image_check_type(hdr, IH_TYPE_SCRIPT) && i > 0) {
570abb0ad   Marian Balakowicz   [new uImage] Shar...
365
366
367
368
369
  				/*
  				 * the user may need to know offsets
  				 * if planning to do something with
  				 * multiple files
  				 */
712fbcf38   Stephen Warren   checkpatch whites...
370
371
  				printf("%s    Offset = 0x%08lx
  ", p, data);
570abb0ad   Marian Balakowicz   [new uImage] Shar...
372
  			}
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
373
  		}
d21bd69b6   Sven Ebenfeld   tools: mkimage: a...
374
375
376
  	} else if (image_check_type(hdr, IH_TYPE_FIRMWARE_IVT)) {
  		printf("HAB Blocks:   0x%08x   0x0000   0x%08x
  ",
5b20d141f   Breno Matheus Lima   imx: Kconfig: Red...
377
378
379
  			image_get_load(hdr) - image_get_header_size(),
  			(int)(image_get_size(hdr) + image_get_header_size()
  			+ sizeof(flash_header_v2_t) - 0x2060));
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
380
381
  	}
  }
2090854cd   Julius Werner   common: Move boot...
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
  /**
   * print_decomp_msg() - Print a suitable decompression/loading message
   *
   * @type:	OS type (IH_OS_...)
   * @comp_type:	Compression type being used (IH_COMP_...)
   * @is_xip:	true if the load address matches the image start
   */
  static void print_decomp_msg(int comp_type, int type, bool is_xip)
  {
  	const char *name = genimg_get_type_name(type);
  
  	if (comp_type == IH_COMP_NONE)
  		printf("   %s %s
  ", is_xip ? "XIP" : "Loading", name);
  	else
  		printf("   Uncompressing %s
  ", name);
  }
  
  int image_decomp(int comp, ulong load, ulong image_start, int type,
  		 void *load_buf, void *image_buf, ulong image_len,
  		 uint unc_len, ulong *load_end)
  {
  	int ret = 0;
  
  	*load_end = load;
  	print_decomp_msg(comp, type, load == image_start);
  
  	/*
  	 * Load the image to the right place, decompressing if needed. After
  	 * this, image_len will be set to the number of uncompressed bytes
  	 * loaded, ret will be non-zero on error.
  	 */
  	switch (comp) {
  	case IH_COMP_NONE:
  		if (load == image_start)
  			break;
  		if (image_len <= unc_len)
  			memmove_wd(load_buf, image_buf, image_len, CHUNKSZ);
  		else
  			ret = -ENOSPC;
  		break;
  #ifdef CONFIG_GZIP
  	case IH_COMP_GZIP: {
  		ret = gunzip(load_buf, unc_len, image_buf, &image_len);
  		break;
  	}
  #endif /* CONFIG_GZIP */
  #ifdef CONFIG_BZIP2
  	case IH_COMP_BZIP2: {
  		uint size = unc_len;
  
  		/*
  		 * If we've got less than 4 MB of malloc() space,
  		 * use slower decompression algorithm which requires
  		 * at most 2300 KB of memory.
  		 */
  		ret = BZ2_bzBuffToBuffDecompress(load_buf, &size,
  			image_buf, image_len,
  			CONFIG_SYS_MALLOC_LEN < (4096 * 1024), 0);
  		image_len = size;
  		break;
  	}
  #endif /* CONFIG_BZIP2 */
  #ifdef CONFIG_LZMA
  	case IH_COMP_LZMA: {
  		SizeT lzma_len = unc_len;
  
  		ret = lzmaBuffToBuffDecompress(load_buf, &lzma_len,
  					       image_buf, image_len);
  		image_len = lzma_len;
  		break;
  	}
  #endif /* CONFIG_LZMA */
  #ifdef CONFIG_LZO
  	case IH_COMP_LZO: {
  		size_t size = unc_len;
  
  		ret = lzop_decompress(image_buf, image_len, load_buf, &size);
  		image_len = size;
  		break;
  	}
  #endif /* CONFIG_LZO */
  #ifdef CONFIG_LZ4
  	case IH_COMP_LZ4: {
  		size_t size = unc_len;
  
  		ret = ulz4fn(image_buf, image_len, load_buf, &size);
  		image_len = size;
  		break;
  	}
  #endif /* CONFIG_LZ4 */
  	default:
  		printf("Unimplemented compression type %d
  ", comp);
  		return -ENOSYS;
  	}
  
  	*load_end = load + image_len;
  
  	return ret;
  }
570abb0ad   Marian Balakowicz   [new uImage] Shar...
484
485
  
  #ifndef USE_HOSTCC
c76c93a3d   Tom Rini   configs: Rename C...
486
  #if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
487
488
  /**
   * image_get_ramdisk - get and verify ramdisk image
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
489
490
491
492
493
494
495
496
497
   * @rd_addr: ramdisk image start address
   * @arch: expected ramdisk architecture
   * @verify: checksum verification flag
   *
   * image_get_ramdisk() returns a pointer to the verified ramdisk image
   * header. Routine receives image start address and expected architecture
   * flag. Verification done covers data and header integrity and os/type/arch
   * fields checking.
   *
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
498
499
500
501
   * returns:
   *     pointer to a ramdisk image header, if image was found and valid
   *     otherwise, return NULL
   */
712fbcf38   Stephen Warren   checkpatch whites...
502
  static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
d985c8498   Marian Balakowicz   [new uImage] Remo...
503
  						int verify)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
504
  {
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
505
  	const image_header_t *rd_hdr = (const image_header_t *)rd_addr;
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
506

712fbcf38   Stephen Warren   checkpatch whites...
507
508
509
  	if (!image_check_magic(rd_hdr)) {
  		puts("Bad Magic Number
  ");
770605e4f   Simon Glass   bootstage: Replac...
510
  		bootstage_error(BOOTSTAGE_ID_RD_MAGIC);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
511
512
  		return NULL;
  	}
712fbcf38   Stephen Warren   checkpatch whites...
513
514
515
  	if (!image_check_hcrc(rd_hdr)) {
  		puts("Bad Header Checksum
  ");
770605e4f   Simon Glass   bootstage: Replac...
516
  		bootstage_error(BOOTSTAGE_ID_RD_HDR_CHECKSUM);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
517
518
  		return NULL;
  	}
770605e4f   Simon Glass   bootstage: Replac...
519
  	bootstage_mark(BOOTSTAGE_ID_RD_MAGIC);
712fbcf38   Stephen Warren   checkpatch whites...
520
  	image_print_contents(rd_hdr);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
521
522
523
  
  	if (verify) {
  		puts("   Verifying Checksum ... ");
712fbcf38   Stephen Warren   checkpatch whites...
524
525
526
  		if (!image_check_dcrc(rd_hdr)) {
  			puts("Bad Data CRC
  ");
770605e4f   Simon Glass   bootstage: Replac...
527
  			bootstage_error(BOOTSTAGE_ID_RD_CHECKSUM);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
528
529
530
531
532
  			return NULL;
  		}
  		puts("OK
  ");
  	}
770605e4f   Simon Glass   bootstage: Replac...
533
  	bootstage_mark(BOOTSTAGE_ID_RD_HDR_CHECKSUM);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
534

712fbcf38   Stephen Warren   checkpatch whites...
535
536
537
538
539
  	if (!image_check_os(rd_hdr, IH_OS_LINUX) ||
  	    !image_check_arch(rd_hdr, arch) ||
  	    !image_check_type(rd_hdr, IH_TYPE_RAMDISK)) {
  		printf("No Linux %s Ramdisk Image
  ",
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
540
  				genimg_get_arch_name(arch));
770605e4f   Simon Glass   bootstage: Replac...
541
  		bootstage_error(BOOTSTAGE_ID_RAMDISK);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
542
543
544
545
546
  		return NULL;
  	}
  
  	return rd_hdr;
  }
21d29f7f9   Heiko Schocher   bootm: make use o...
547
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
548
  #endif /* !USE_HOSTCC */
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
549
550
551
552
  
  /*****************************************************************************/
  /* Shared dual-format routines */
  /*****************************************************************************/
570abb0ad   Marian Balakowicz   [new uImage] Shar...
553
  #ifndef USE_HOSTCC
1cf0a8b2f   Joe Hershberger   env: Add a loadad...
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
  ulong load_addr = CONFIG_SYS_LOAD_ADDR;	/* Default Load Address */
  ulong save_addr;			/* Default Save Address */
  ulong save_size;			/* Default Save Size (in bytes) */
  
  static int on_loadaddr(const char *name, const char *value, enum env_op op,
  	int flags)
  {
  	switch (op) {
  	case env_op_create:
  	case env_op_overwrite:
  		load_addr = simple_strtoul(value, NULL, 16);
  		break;
  	default:
  		break;
  	}
  
  	return 0;
  }
  U_BOOT_ENV_CALLBACK(loadaddr, on_loadaddr);
723806cc5   Simon Glass   env: Rename some ...
573
  ulong env_get_bootm_low(void)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
574
  {
00caae6d4   Simon Glass   env: Rename geten...
575
  	char *s = env_get("bootm_low");
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
576
  	if (s) {
712fbcf38   Stephen Warren   checkpatch whites...
577
  		ulong tmp = simple_strtoul(s, NULL, 16);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
578
579
  		return tmp;
  	}
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
580
581
  #if defined(CONFIG_SYS_SDRAM_BASE)
  	return CONFIG_SYS_SDRAM_BASE;
a750ded46   Michal Simek   microblaze: Fix l...
582
  #elif defined(CONFIG_ARM) || defined(CONFIG_MICROBLAZE)
afe45c87e   Marian Balakowicz   [new uImage] Fix ...
583
  	return gd->bd->bi_dram[0].start;
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
584
585
586
587
  #else
  	return 0;
  #endif
  }
723806cc5   Simon Glass   env: Rename some ...
588
  phys_size_t env_get_bootm_size(void)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
589
  {
0cb389dd1   Masahiro Yamada   image: fix getenv...
590
591
  	phys_size_t tmp, size;
  	phys_addr_t start;
00caae6d4   Simon Glass   env: Rename geten...
592
  	char *s = env_get("bootm_size");
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
593
  	if (s) {
712fbcf38   Stephen Warren   checkpatch whites...
594
  		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
595
596
  		return tmp;
  	}
0cb389dd1   Masahiro Yamada   image: fix getenv...
597

a750ded46   Michal Simek   microblaze: Fix l...
598
599
  #if (defined(CONFIG_ARM) || defined(CONFIG_MICROBLAZE)) && \
       defined(CONFIG_NR_DRAM_BANKS)
0cb389dd1   Masahiro Yamada   image: fix getenv...
600
601
602
603
604
605
  	start = gd->bd->bi_dram[0].start;
  	size = gd->bd->bi_dram[0].size;
  #else
  	start = gd->bd->bi_memstart;
  	size = gd->bd->bi_memsize;
  #endif
00caae6d4   Simon Glass   env: Rename geten...
606
  	s = env_get("bootm_low");
c519facc6   Matthew McClintock   Fix condition whe...
607
  	if (s)
712fbcf38   Stephen Warren   checkpatch whites...
608
  		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
c519facc6   Matthew McClintock   Fix condition whe...
609
  	else
0cb389dd1   Masahiro Yamada   image: fix getenv...
610
  		tmp = start;
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
611

0cb389dd1   Masahiro Yamada   image: fix getenv...
612
  	return size - (tmp - start);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
613
  }
723806cc5   Simon Glass   env: Rename some ...
614
  phys_size_t env_get_bootm_mapsize(void)
c3624e6ed   Grant Likely   Default to bootm_...
615
616
  {
  	phys_size_t tmp;
00caae6d4   Simon Glass   env: Rename geten...
617
  	char *s = env_get("bootm_mapsize");
c3624e6ed   Grant Likely   Default to bootm_...
618
  	if (s) {
712fbcf38   Stephen Warren   checkpatch whites...
619
  		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
c3624e6ed   Grant Likely   Default to bootm_...
620
621
622
623
624
625
  		return tmp;
  	}
  
  #if defined(CONFIG_SYS_BOOTMAPSZ)
  	return CONFIG_SYS_BOOTMAPSZ;
  #else
723806cc5   Simon Glass   env: Rename some ...
626
  	return env_get_bootm_size();
c3624e6ed   Grant Likely   Default to bootm_...
627
628
  #endif
  }
712fbcf38   Stephen Warren   checkpatch whites...
629
  void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
630
  {
54fa2c5b5   Larry Johnson   Move test for unn...
631
632
  	if (to == from)
  		return;
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
633
  #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
22cfddc2a   Sonic Zhang   memmove_wd: copy ...
634
635
636
637
  	if (to > from) {
  		from += len;
  		to += len;
  	}
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
638
639
  	while (len > 0) {
  		size_t tail = (len > chunksz) ? chunksz : len;
712fbcf38   Stephen Warren   checkpatch whites...
640
  		WATCHDOG_RESET();
22cfddc2a   Sonic Zhang   memmove_wd: copy ...
641
642
643
644
  		if (to > from) {
  			to -= tail;
  			from -= tail;
  		}
712fbcf38   Stephen Warren   checkpatch whites...
645
  		memmove(to, from, tail);
22cfddc2a   Sonic Zhang   memmove_wd: copy ...
646
647
648
649
  		if (to < from) {
  			to += tail;
  			from += tail;
  		}
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
650
651
652
  		len -= tail;
  	}
  #else	/* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */
712fbcf38   Stephen Warren   checkpatch whites...
653
  	memmove(to, from, len);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
654
655
  #endif	/* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
  }
2090854cd   Julius Werner   common: Move boot...
656
657
658
659
660
  #else	/* USE_HOSTCC */
  void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
  {
  	memmove(to, from, len);
  }
570abb0ad   Marian Balakowicz   [new uImage] Shar...
661
  #endif /* !USE_HOSTCC */
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
662

712fbcf38   Stephen Warren   checkpatch whites...
663
  void genimg_print_size(uint32_t size)
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
664
  {
570abb0ad   Marian Balakowicz   [new uImage] Shar...
665
  #ifndef USE_HOSTCC
712fbcf38   Stephen Warren   checkpatch whites...
666
667
668
  	printf("%d Bytes = ", size);
  	print_size(size, "
  ");
570abb0ad   Marian Balakowicz   [new uImage] Shar...
669
  #else
cec85d4e0   xypron.glpk@gmx.de   common/image.c: U...
670
671
  	printf("%d Bytes = %.2f KiB = %.2f MiB
  ",
570abb0ad   Marian Balakowicz   [new uImage] Shar...
672
673
  			size, (double)size / 1.024e3,
  			(double)size / 1.048576e6);
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
674
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
675
  }
859e92b77   Simon Glass   image: Move times...
676
677
  #if IMAGE_ENABLE_TIMESTAMP
  void genimg_print_time(time_t timestamp)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
678
679
680
  {
  #ifndef USE_HOSTCC
  	struct rtc_time tm;
9f9276c34   Simon Glass   dm: rtc: Rename t...
681
  	rtc_to_tm(timestamp, &tm);
712fbcf38   Stephen Warren   checkpatch whites...
682
683
  	printf("%4d-%02d-%02d  %2d:%02d:%02d UTC
  ",
570abb0ad   Marian Balakowicz   [new uImage] Shar...
684
685
686
  			tm.tm_year, tm.tm_mon, tm.tm_mday,
  			tm.tm_hour, tm.tm_min, tm.tm_sec);
  #else
712fbcf38   Stephen Warren   checkpatch whites...
687
  	printf("%s", ctime(&timestamp));
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
688
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
689
  }
859e92b77   Simon Glass   image: Move times...
690
  #endif
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
691

5b9d44df2   Simon Glass   mkimage: Display ...
692
693
694
695
696
697
698
699
  const table_entry_t *get_table_entry(const table_entry_t *table, int id)
  {
  	for (; table->id >= 0; ++table) {
  		if (table->id == id)
  			return table;
  	}
  	return NULL;
  }
1426220b0   Simon Glass   image: Add functi...
700
701
  static const char *unknown_msg(enum ih_category category)
  {
ae3de0d8c   Simon Glass   image: Protect ag...
702
  	static const char unknown_str[] = "Unknown ";
1426220b0   Simon Glass   image: Add functi...
703
  	static char msg[30];
ae3de0d8c   Simon Glass   image: Protect ag...
704
705
706
  	strcpy(msg, unknown_str);
  	strncat(msg, table_info[category].desc,
  		sizeof(msg) - sizeof(unknown_str));
1426220b0   Simon Glass   image: Add functi...
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
  
  	return msg;
  }
  
  /**
   * get_cat_table_entry_name - translate entry id to long name
   * @category: category to look up (enum ih_category)
   * @id: entry id to be translated
   *
   * This will scan the translation table trying to find the entry that matches
   * the given id.
   *
   * @retur long entry name if translation succeeds; error string on failure
   */
  const char *genimg_get_cat_name(enum ih_category category, uint id)
  {
  	const table_entry_t *entry;
  
  	entry = get_table_entry(table_info[category].table, id);
  	if (!entry)
  		return unknown_msg(category);
  #if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
  	return entry->lname;
  #else
  	return entry->lname + gd->reloc_off;
  #endif
  }
  
  /**
   * get_cat_table_entry_short_name - translate entry id to short name
   * @category: category to look up (enum ih_category)
   * @id: entry id to be translated
   *
   * This will scan the translation table trying to find the entry that matches
   * the given id.
   *
   * @retur short entry name if translation succeeds; error string on failure
   */
  const char *genimg_get_cat_short_name(enum ih_category category, uint id)
  {
  	const table_entry_t *entry;
  
  	entry = get_table_entry(table_info[category].table, id);
  	if (!entry)
  		return unknown_msg(category);
  #if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
  	return entry->sname;
  #else
  	return entry->sname + gd->reloc_off;
  #endif
  }
  
  int genimg_get_cat_count(enum ih_category category)
  {
  	return table_info[category].count;
  }
  
  const char *genimg_get_cat_desc(enum ih_category category)
  {
  	return table_info[category].desc;
  }
570abb0ad   Marian Balakowicz   [new uImage] Shar...
768
769
770
771
772
773
774
775
776
777
778
779
780
781
  /**
   * get_table_entry_name - translate entry id to long name
   * @table: pointer to a translation table for entries of a specific type
   * @msg: message to be returned when translation fails
   * @id: entry id to be translated
   *
   * get_table_entry_name() will go over translation table trying to find
   * entry that matches given id. If matching entry is found, its long
   * name is returned to the caller.
   *
   * returns:
   *     long entry name if translation succeeds
   *     msg otherwise
   */
7edb186fc   Mike Frysinger   image: constify l...
782
  char *get_table_entry_name(const table_entry_t *table, char *msg, int id)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
783
  {
5b9d44df2   Simon Glass   mkimage: Display ...
784
785
786
  	table = get_table_entry(table, id);
  	if (!table)
  		return msg;
2e5167cca   Wolfgang Denk   Replace CONFIG_RE...
787
  #if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
5b9d44df2   Simon Glass   mkimage: Display ...
788
  	return table->lname;
e3d1ac7bb   Scott Wood   common/image.c: R...
789
  #else
5b9d44df2   Simon Glass   mkimage: Display ...
790
  	return table->lname + gd->reloc_off;
e3d1ac7bb   Scott Wood   common/image.c: R...
791
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
792
  }
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
793

712fbcf38   Stephen Warren   checkpatch whites...
794
  const char *genimg_get_os_name(uint8_t os)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
795
  {
712fbcf38   Stephen Warren   checkpatch whites...
796
  	return (get_table_entry_name(uimage_os, "Unknown OS", os));
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
797
  }
712fbcf38   Stephen Warren   checkpatch whites...
798
  const char *genimg_get_arch_name(uint8_t arch)
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
799
  {
712fbcf38   Stephen Warren   checkpatch whites...
800
801
  	return (get_table_entry_name(uimage_arch, "Unknown Architecture",
  					arch));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
802
  }
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
803

712fbcf38   Stephen Warren   checkpatch whites...
804
  const char *genimg_get_type_name(uint8_t type)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
805
  {
712fbcf38   Stephen Warren   checkpatch whites...
806
  	return (get_table_entry_name(uimage_type, "Unknown Image", type));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
807
  }
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
808

cef2e5148   Simon Glass   image: Add functi...
809
  static const char *genimg_get_short_name(const table_entry_t *table, int val)
5b9d44df2   Simon Glass   mkimage: Display ...
810
  {
cef2e5148   Simon Glass   image: Add functi...
811
  	table = get_table_entry(table, val);
5b9d44df2   Simon Glass   mkimage: Display ...
812
813
814
815
816
817
818
819
  	if (!table)
  		return "unknown";
  #if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
  	return table->sname;
  #else
  	return table->sname + gd->reloc_off;
  #endif
  }
cef2e5148   Simon Glass   image: Add functi...
820
821
822
823
  const char *genimg_get_type_short_name(uint8_t type)
  {
  	return genimg_get_short_name(uimage_type, type);
  }
712fbcf38   Stephen Warren   checkpatch whites...
824
  const char *genimg_get_comp_name(uint8_t comp)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
825
  {
712fbcf38   Stephen Warren   checkpatch whites...
826
827
  	return (get_table_entry_name(uimage_comp, "Unknown Compression",
  					comp));
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
828
  }
cef2e5148   Simon Glass   image: Add functi...
829
830
831
832
833
834
835
836
837
838
839
840
841
842
  const char *genimg_get_comp_short_name(uint8_t comp)
  {
  	return genimg_get_short_name(uimage_comp, comp);
  }
  
  const char *genimg_get_os_short_name(uint8_t os)
  {
  	return genimg_get_short_name(uimage_os, os);
  }
  
  const char *genimg_get_arch_short_name(uint8_t arch)
  {
  	return genimg_get_short_name(uimage_arch, arch);
  }
570abb0ad   Marian Balakowicz   [new uImage] Shar...
843
844
845
846
847
848
849
850
851
852
853
854
855
856
  /**
   * get_table_entry_id - translate short entry name to id
   * @table: pointer to a translation table for entries of a specific type
   * @table_name: to be used in case of error
   * @name: entry short name to be translated
   *
   * get_table_entry_id() will go over translation table trying to find
   * entry that matches given short name. If matching entry is found,
   * its id returned to the caller.
   *
   * returns:
   *     entry id if translation succeeds
   *     -1 otherwise
   */
7edb186fc   Mike Frysinger   image: constify l...
857
  int get_table_entry_id(const table_entry_t *table,
570abb0ad   Marian Balakowicz   [new uImage] Shar...
858
  		const char *table_name, const char *name)
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
859
  {
7edb186fc   Mike Frysinger   image: constify l...
860
  	const table_entry_t *t;
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
861

570abb0ad   Marian Balakowicz   [new uImage] Shar...
862
  	for (t = table; t->id >= 0; ++t) {
2e5167cca   Wolfgang Denk   Replace CONFIG_RE...
863
  #ifdef CONFIG_NEEDS_MANUAL_RELOC
5b9d44df2   Simon Glass   mkimage: Display ...
864
  		if (t->sname && strcasecmp(t->sname + gd->reloc_off, name) == 0)
2e5167cca   Wolfgang Denk   Replace CONFIG_RE...
865
  #else
5b9d44df2   Simon Glass   mkimage: Display ...
866
  		if (t->sname && strcasecmp(t->sname, name) == 0)
521af04d8   Peter Tyser   Conditionally per...
867
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
868
869
  			return (t->id);
  	}
712fbcf38   Stephen Warren   checkpatch whites...
870
871
  	debug("Invalid %s Type: %s
  ", table_name, name);
5b9d44df2   Simon Glass   mkimage: Display ...
872
873
  
  	return -1;
570abb0ad   Marian Balakowicz   [new uImage] Shar...
874
  }
712fbcf38   Stephen Warren   checkpatch whites...
875
  int genimg_get_os_id(const char *name)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
876
  {
712fbcf38   Stephen Warren   checkpatch whites...
877
  	return (get_table_entry_id(uimage_os, "OS", name));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
878
  }
712fbcf38   Stephen Warren   checkpatch whites...
879
  int genimg_get_arch_id(const char *name)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
880
  {
712fbcf38   Stephen Warren   checkpatch whites...
881
  	return (get_table_entry_id(uimage_arch, "CPU", name));
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
882
  }
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
883

712fbcf38   Stephen Warren   checkpatch whites...
884
  int genimg_get_type_id(const char *name)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
885
  {
712fbcf38   Stephen Warren   checkpatch whites...
886
  	return (get_table_entry_id(uimage_type, "Image", name));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
887
  }
712fbcf38   Stephen Warren   checkpatch whites...
888
  int genimg_get_comp_id(const char *name)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
889
  {
712fbcf38   Stephen Warren   checkpatch whites...
890
  	return (get_table_entry_id(uimage_comp, "Compression", name));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
891
892
893
  }
  
  #ifndef USE_HOSTCC
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
894
  /**
6c454fedf   Bryan Wu   image: fix bootm ...
895
896
   * genimg_get_kernel_addr_fit - get the real kernel address and return 2
   *                              FIT strings
0f64140b6   Bryan Wu   image: introduce ...
897
   * @img_addr: a string might contain real image address
6c454fedf   Bryan Wu   image: fix bootm ...
898
899
900
901
   * @fit_uname_config: double pointer to a char, will hold pointer to a
   *                    configuration unit name
   * @fit_uname_kernel: double pointer to a char, will hold pointer to a subimage
   *                    name
0f64140b6   Bryan Wu   image: introduce ...
902
   *
6c454fedf   Bryan Wu   image: fix bootm ...
903
   * genimg_get_kernel_addr_fit get the real kernel start address from a string
0f64140b6   Bryan Wu   image: introduce ...
904
905
906
907
908
   * which is normally the first argv of bootm/bootz
   *
   * returns:
   *     kernel start address
   */
6c454fedf   Bryan Wu   image: fix bootm ...
909
910
911
  ulong genimg_get_kernel_addr_fit(char * const img_addr,
  			     const char **fit_uname_config,
  			     const char **fit_uname_kernel)
0f64140b6   Bryan Wu   image: introduce ...
912
  {
0f64140b6   Bryan Wu   image: introduce ...
913
914
915
916
917
918
919
920
  	ulong kernel_addr;
  
  	/* find out kernel image address */
  	if (!img_addr) {
  		kernel_addr = load_addr;
  		debug("*  kernel: default image load address = 0x%08lx
  ",
  		      load_addr);
73223f0e1   Simon Glass   Kconfig: Move CON...
921
  #if CONFIG_IS_ENABLED(FIT)
0f64140b6   Bryan Wu   image: introduce ...
922
  	} else if (fit_parse_conf(img_addr, load_addr, &kernel_addr,
6c454fedf   Bryan Wu   image: fix bootm ...
923
  				  fit_uname_config)) {
0f64140b6   Bryan Wu   image: introduce ...
924
925
  		debug("*  kernel: config '%s' from image at 0x%08lx
  ",
6c454fedf   Bryan Wu   image: fix bootm ...
926
  		      *fit_uname_config, kernel_addr);
0f64140b6   Bryan Wu   image: introduce ...
927
  	} else if (fit_parse_subimage(img_addr, load_addr, &kernel_addr,
6c454fedf   Bryan Wu   image: fix bootm ...
928
  				     fit_uname_kernel)) {
0f64140b6   Bryan Wu   image: introduce ...
929
930
  		debug("*  kernel: subimage '%s' from image at 0x%08lx
  ",
6c454fedf   Bryan Wu   image: fix bootm ...
931
  		      *fit_uname_kernel, kernel_addr);
0f64140b6   Bryan Wu   image: introduce ...
932
933
934
935
936
937
938
939
940
941
942
943
  #endif
  	} else {
  		kernel_addr = simple_strtoul(img_addr, NULL, 16);
  		debug("*  kernel: cmdline image address = 0x%08lx
  ",
  		      kernel_addr);
  	}
  
  	return kernel_addr;
  }
  
  /**
6c454fedf   Bryan Wu   image: fix bootm ...
944
945
946
947
948
949
950
951
952
953
954
955
956
   * genimg_get_kernel_addr() is the simple version of
   * genimg_get_kernel_addr_fit(). It ignores those return FIT strings
   */
  ulong genimg_get_kernel_addr(char * const img_addr)
  {
  	const char *fit_uname_config = NULL;
  	const char *fit_uname_kernel = NULL;
  
  	return genimg_get_kernel_addr_fit(img_addr, &fit_uname_config,
  					  &fit_uname_kernel);
  }
  
  /**
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
957
   * genimg_get_format - get image format type
fff888a19   Marian Balakowicz   [new uImage] Add ...
958
959
   * @img_addr: image start address
   *
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
960
   * genimg_get_format() checks whether provided address points to a valid
fff888a19   Marian Balakowicz   [new uImage] Add ...
961
962
   * legacy or FIT image.
   *
4efbe9dbb   Marian Balakowicz   [new uImage] Corr...
963
964
   * New uImage format and FDT blob are based on a libfdt. FDT blob
   * may be passed directly or embedded in a FIT image. In both situations
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
965
   * genimg_get_format() must be able to dectect libfdt header.
4efbe9dbb   Marian Balakowicz   [new uImage] Corr...
966
   *
fff888a19   Marian Balakowicz   [new uImage] Add ...
967
968
969
   * returns:
   *     image format type or IMAGE_FORMAT_INVALID if no image is present
   */
35e7b0f17   Simon Glass   sandbox: image: A...
970
  int genimg_get_format(const void *img_addr)
fff888a19   Marian Balakowicz   [new uImage] Add ...
971
  {
c76c93a3d   Tom Rini   configs: Rename C...
972
  #if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
973
  	const image_header_t *hdr;
fff888a19   Marian Balakowicz   [new uImage] Add ...
974

3a2003f61   Wolfgang Denk   tools/mkimage: fi...
975
  	hdr = (const image_header_t *)img_addr;
fff888a19   Marian Balakowicz   [new uImage] Add ...
976
  	if (image_check_magic(hdr))
21d29f7f9   Heiko Schocher   bootm: make use o...
977
978
  		return IMAGE_FORMAT_LEGACY;
  #endif
aa34fbc08   Simon Glass   fdt: Allow libfdt...
979
  #if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
21d29f7f9   Heiko Schocher   bootm: make use o...
980
981
  	if (fdt_check_header(img_addr) == 0)
  		return IMAGE_FORMAT_FIT;
9ace3fc81   Sebastian Siewior   image: add suppor...
982
983
  #endif
  #ifdef CONFIG_ANDROID_BOOT_IMAGE
21d29f7f9   Heiko Schocher   bootm: make use o...
984
985
  	if (android_image_check_header(img_addr) == 0)
  		return IMAGE_FORMAT_ANDROID;
fff888a19   Marian Balakowicz   [new uImage] Add ...
986
  #endif
21d29f7f9   Heiko Schocher   bootm: make use o...
987
  	return IMAGE_FORMAT_INVALID;
fff888a19   Marian Balakowicz   [new uImage] Add ...
988
989
990
  }
  
  /**
f773bea8e   Marian Balakowicz   [new uImage] Add ...
991
992
993
994
995
996
997
998
999
1000
   * fit_has_config - check if there is a valid FIT configuration
   * @images: pointer to the bootm command headers structure
   *
   * fit_has_config() checks if there is a FIT configuration in use
   * (if FTI support is present).
   *
   * returns:
   *     0, no FIT support or no configuration found
   *     1, configuration found
   */
712fbcf38   Stephen Warren   checkpatch whites...
1001
  int genimg_has_config(bootm_headers_t *images)
f773bea8e   Marian Balakowicz   [new uImage] Add ...
1002
  {
73223f0e1   Simon Glass   Kconfig: Move CON...
1003
  #if IMAGE_ENABLE_FIT
f773bea8e   Marian Balakowicz   [new uImage] Add ...
1004
1005
1006
1007
1008
1009
1010
  	if (images->fit_uname_cfg)
  		return 1;
  #endif
  	return 0;
  }
  
  /**
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1011
   * boot_get_ramdisk - main ramdisk handling routine
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1012
1013
   * @argc: command argument count
   * @argv: command argument list
8a5ea3e61   Marian Balakowicz   [new uImage] Move...
1014
   * @images: pointer to the bootm images structure
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1015
1016
1017
1018
   * @arch: expected ramdisk architecture
   * @rd_start: pointer to a ulong variable, will hold ramdisk start address
   * @rd_end: pointer to a ulong variable, will hold ramdisk end
   *
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1019
   * boot_get_ramdisk() is responsible for finding a valid ramdisk image.
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1020
1021
1022
1023
1024
   * Curently supported are the following ramdisk sources:
   *      - multicomponent kernel/ramdisk image,
   *      - commandline provided address of decicated ramdisk image.
   *
   * returns:
d985c8498   Marian Balakowicz   [new uImage] Remo...
1025
   *     0, if ramdisk image was found and valid, or skiped
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1026
1027
   *     rd_start and rd_end are set to ramdisk start/end addresses if
   *     ramdisk image is found and valid
d985c8498   Marian Balakowicz   [new uImage] Remo...
1028
   *
ea86b9e64   Kumar Gala   Prevent crash if ...
1029
   *     1, if ramdisk image is found but corrupted, or invalid
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1030
   *     rd_start and rd_end are set to 0 if no ramdisk exists
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1031
   */
712fbcf38   Stephen Warren   checkpatch whites...
1032
  int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
d985c8498   Marian Balakowicz   [new uImage] Remo...
1033
  		uint8_t arch, ulong *rd_start, ulong *rd_end)
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1034
  {
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1035
  	ulong rd_addr, rd_load;
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1036
  	ulong rd_data, rd_len;
c76c93a3d   Tom Rini   configs: Rename C...
1037
  #if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
1038
  	const image_header_t *rd_hdr;
21d29f7f9   Heiko Schocher   bootm: make use o...
1039
  #endif
35e7b0f17   Simon Glass   sandbox: image: A...
1040
  	void *buf;
57d40ab70   Marek Vasut   RAMDISK: Fix unus...
1041
  #ifdef CONFIG_SUPPORT_RAW_INITRD
017e1f3f9   Marek Vasut   BOOT: Add RAW ram...
1042
  	char *end;
57d40ab70   Marek Vasut   RAMDISK: Fix unus...
1043
  #endif
73223f0e1   Simon Glass   Kconfig: Move CON...
1044
  #if IMAGE_ENABLE_FIT
f320a4d84   Simon Glass   bootm: Use select...
1045
  	const char	*fit_uname_config = images->fit_uname_cfg;
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1046
1047
  	const char	*fit_uname_ramdisk = NULL;
  	ulong		default_addr;
c87796483   Marian Balakowicz   [new uImage] Add ...
1048
  	int		rd_noffset;
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1049
  #endif
983c72f47   Simon Glass   Clarify bootm OS ...
1050
  	const char *select = NULL;
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1051

c87796483   Marian Balakowicz   [new uImage] Add ...
1052
1053
  	*rd_start = 0;
  	*rd_end = 0;
1fec3c5d8   Tom Rini   common/image.c: M...
1054
1055
1056
1057
1058
  #ifdef CONFIG_ANDROID_BOOT_IMAGE
  	/*
  	 * Look for an Android boot image.
  	 */
  	buf = map_sysmem(images->os.start, 0);
c139b5ff0   Tom Rini   image.c: Fix non-...
1059
  	if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)
5e218862b   Shawn Guo   Support boot Andr...
1060
  		select = (argc == 0) ? env_get("loadaddr") : argv[0];
1fec3c5d8   Tom Rini   common/image.c: M...
1061
  #endif
983c72f47   Simon Glass   Clarify bootm OS ...
1062
1063
  	if (argc >= 2)
  		select = argv[1];
2dd46328f   Rob Herring   image: fix Androi...
1064

d5934ad77   Marian Balakowicz   [new uImage] Add ...
1065
1066
1067
1068
  	/*
  	 * Look for a '-' which indicates to ignore the
  	 * ramdisk argument
  	 */
983c72f47   Simon Glass   Clarify bootm OS ...
1069
  	if (select && strcmp(select, "-") ==  0) {
712fbcf38   Stephen Warren   checkpatch whites...
1070
1071
  		debug("## Skipping init Ramdisk
  ");
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1072
  		rd_len = rd_data = 0;
983c72f47   Simon Glass   Clarify bootm OS ...
1073
  	} else if (select || genimg_has_config(images)) {
73223f0e1   Simon Glass   Kconfig: Move CON...
1074
  #if IMAGE_ENABLE_FIT
983c72f47   Simon Glass   Clarify bootm OS ...
1075
  		if (select) {
f773bea8e   Marian Balakowicz   [new uImage] Add ...
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
  			/*
  			 * If the init ramdisk comes from the FIT image and
  			 * the FIT image address is omitted in the command
  			 * line argument, try to use os FIT image address or
  			 * default load address.
  			 */
  			if (images->fit_uname_os)
  				default_addr = (ulong)images->fit_hdr_os;
  			else
  				default_addr = load_addr;
983c72f47   Simon Glass   Clarify bootm OS ...
1086
1087
  			if (fit_parse_conf(select, default_addr,
  					   &rd_addr, &fit_uname_config)) {
712fbcf38   Stephen Warren   checkpatch whites...
1088
1089
1090
  				debug("*  ramdisk: config '%s' from image at "
  						"0x%08lx
  ",
f773bea8e   Marian Balakowicz   [new uImage] Add ...
1091
  						fit_uname_config, rd_addr);
983c72f47   Simon Glass   Clarify bootm OS ...
1092
  			} else if (fit_parse_subimage(select, default_addr,
f773bea8e   Marian Balakowicz   [new uImage] Add ...
1093
  						&rd_addr, &fit_uname_ramdisk)) {
712fbcf38   Stephen Warren   checkpatch whites...
1094
1095
1096
  				debug("*  ramdisk: subimage '%s' from image at "
  						"0x%08lx
  ",
f773bea8e   Marian Balakowicz   [new uImage] Add ...
1097
1098
  						fit_uname_ramdisk, rd_addr);
  			} else
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1099
  #endif
f773bea8e   Marian Balakowicz   [new uImage] Add ...
1100
  			{
983c72f47   Simon Glass   Clarify bootm OS ...
1101
  				rd_addr = simple_strtoul(select, NULL, 16);
712fbcf38   Stephen Warren   checkpatch whites...
1102
1103
1104
  				debug("*  ramdisk: cmdline image address = "
  						"0x%08lx
  ",
f773bea8e   Marian Balakowicz   [new uImage] Add ...
1105
1106
  						rd_addr);
  			}
73223f0e1   Simon Glass   Kconfig: Move CON...
1107
  #if IMAGE_ENABLE_FIT
f773bea8e   Marian Balakowicz   [new uImage] Add ...
1108
1109
  		} else {
  			/* use FIT configuration provided in first bootm
a51ec63b8   Simon Glass   image: Use fit_im...
1110
1111
  			 * command argument. If the property is not defined,
  			 * quit silently.
f773bea8e   Marian Balakowicz   [new uImage] Add ...
1112
  			 */
35e7b0f17   Simon Glass   sandbox: image: A...
1113
  			rd_addr = map_to_sysmem(images->fit_hdr_os);
a51ec63b8   Simon Glass   image: Use fit_im...
1114
1115
  			rd_noffset = fit_get_node_from_config(images,
  					FIT_RAMDISK_PROP, rd_addr);
bd86ef117   Paul Burton   image-fit: Fix fi...
1116
  			if (rd_noffset == -ENOENT)
41266c9b5   Peter Tyser   FIT: Fix handling...
1117
  				return 0;
a51ec63b8   Simon Glass   image: Use fit_im...
1118
1119
  			else if (rd_noffset < 0)
  				return 1;
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1120
  		}
f773bea8e   Marian Balakowicz   [new uImage] Add ...
1121
  #endif
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1122

d5934ad77   Marian Balakowicz   [new uImage] Add ...
1123
1124
1125
1126
1127
  		/*
  		 * Check if there is an initrd image at the
  		 * address provided in the second bootm argument
  		 * check image type, for FIT images get FIT node.
  		 */
35e7b0f17   Simon Glass   sandbox: image: A...
1128
1129
  		buf = map_sysmem(rd_addr, 0);
  		switch (genimg_get_format(buf)) {
c76c93a3d   Tom Rini   configs: Rename C...
1130
  #if CONFIG_IS_ENABLED(LEGACY_IMAGE_FORMAT)
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1131
  		case IMAGE_FORMAT_LEGACY:
712fbcf38   Stephen Warren   checkpatch whites...
1132
  			printf("## Loading init Ramdisk from Legacy "
c87796483   Marian Balakowicz   [new uImage] Add ...
1133
1134
  					"Image at %08lx ...
  ", rd_addr);
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1135

770605e4f   Simon Glass   bootstage: Replac...
1136
  			bootstage_mark(BOOTSTAGE_ID_CHECK_RAMDISK);
712fbcf38   Stephen Warren   checkpatch whites...
1137
  			rd_hdr = image_get_ramdisk(rd_addr, arch,
d985c8498   Marian Balakowicz   [new uImage] Remo...
1138
  							images->verify);
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1139

c87796483   Marian Balakowicz   [new uImage] Add ...
1140
  			if (rd_hdr == NULL)
274cea2bd   Kumar Gala   [new uImage] rewo...
1141
  				return 1;
274cea2bd   Kumar Gala   [new uImage] rewo...
1142

712fbcf38   Stephen Warren   checkpatch whites...
1143
1144
1145
  			rd_data = image_get_data(rd_hdr);
  			rd_len = image_get_data_size(rd_hdr);
  			rd_load = image_get_load(rd_hdr);
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1146
  			break;
21d29f7f9   Heiko Schocher   bootm: make use o...
1147
  #endif
73223f0e1   Simon Glass   Kconfig: Move CON...
1148
  #if IMAGE_ENABLE_FIT
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1149
  		case IMAGE_FORMAT_FIT:
126cc8642   Simon Glass   image: Remove the...
1150
  			rd_noffset = fit_image_load(images,
a51ec63b8   Simon Glass   image: Use fit_im...
1151
  					rd_addr, &fit_uname_ramdisk,
f320a4d84   Simon Glass   bootm: Use select...
1152
  					&fit_uname_config, arch,
a51ec63b8   Simon Glass   image: Use fit_im...
1153
1154
  					IH_TYPE_RAMDISK,
  					BOOTSTAGE_ID_FIT_RD_START,
fe20a81a6   Simon Glass   Fix test failure ...
1155
1156
  					FIT_LOAD_OPTIONAL_NON_ZERO,
  					&rd_data, &rd_len);
a51ec63b8   Simon Glass   image: Use fit_im...
1157
  			if (rd_noffset < 0)
c78fce699   Michal Simek   FIS: repare incor...
1158
  				return 1;
c87796483   Marian Balakowicz   [new uImage] Add ...
1159

a51ec63b8   Simon Glass   image: Use fit_im...
1160
  			images->fit_hdr_rd = map_sysmem(rd_addr, 0);
c87796483   Marian Balakowicz   [new uImage] Add ...
1161
  			images->fit_uname_rd = fit_uname_ramdisk;
3dfe11014   Marian Balakowicz   [new uImage] Add ...
1162
  			images->fit_noffset_rd = rd_noffset;
c87796483   Marian Balakowicz   [new uImage] Add ...
1163
  			break;
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1164
  #endif
2dd46328f   Rob Herring   image: fix Androi...
1165
1166
1167
1168
1169
1170
  #ifdef CONFIG_ANDROID_BOOT_IMAGE
  		case IMAGE_FORMAT_ANDROID:
  			android_image_get_ramdisk((void *)images->os.start,
  				&rd_data, &rd_len);
  			break;
  #endif
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1171
  		default:
017e1f3f9   Marek Vasut   BOOT: Add RAW ram...
1172
  #ifdef CONFIG_SUPPORT_RAW_INITRD
983c72f47   Simon Glass   Clarify bootm OS ...
1173
1174
1175
1176
  			end = NULL;
  			if (select)
  				end = strchr(select, ':');
  			if (end) {
017e1f3f9   Marek Vasut   BOOT: Add RAW ram...
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
  				rd_len = simple_strtoul(++end, NULL, 16);
  				rd_data = rd_addr;
  			} else
  #endif
  			{
  				puts("Wrong Ramdisk Image Format
  ");
  				rd_data = rd_len = rd_load = 0;
  				return 1;
  			}
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1187
  		}
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1188
  	} else if (images->legacy_hdr_valid &&
712fbcf38   Stephen Warren   checkpatch whites...
1189
1190
  			image_check_type(&images->legacy_hdr_os_copy,
  						IH_TYPE_MULTI)) {
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1191
  		/*
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1192
1193
  		 * Now check if we have a legacy mult-component image,
  		 * get second entry data start address and len.
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1194
  		 */
770605e4f   Simon Glass   bootstage: Replac...
1195
  		bootstage_mark(BOOTSTAGE_ID_RAMDISK);
712fbcf38   Stephen Warren   checkpatch whites...
1196
  		printf("## Loading init Ramdisk from multi component "
c87796483   Marian Balakowicz   [new uImage] Add ...
1197
1198
  				"Legacy Image at %08lx ...
  ",
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1199
  				(ulong)images->legacy_hdr_os);
712fbcf38   Stephen Warren   checkpatch whites...
1200
  		image_multi_getimg(images->legacy_hdr_os, 1, &rd_data, &rd_len);
2dd46328f   Rob Herring   image: fix Androi...
1201
  	} else {
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1202
1203
1204
  		/*
  		 * no initrd image
  		 */
770605e4f   Simon Glass   bootstage: Replac...
1205
  		bootstage_mark(BOOTSTAGE_ID_NO_RAMDISK);
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1206
1207
1208
1209
  		rd_len = rd_data = 0;
  	}
  
  	if (!rd_data) {
712fbcf38   Stephen Warren   checkpatch whites...
1210
1211
  		debug("## No init Ramdisk
  ");
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1212
1213
1214
1215
  	} else {
  		*rd_start = rd_data;
  		*rd_end = rd_data + rd_len;
  	}
712fbcf38   Stephen Warren   checkpatch whites...
1216
1217
  	debug("   ramdisk start = 0x%08lx, ramdisk end = 0x%08lx
  ",
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1218
  			*rd_start, *rd_end);
274cea2bd   Kumar Gala   [new uImage] rewo...
1219
1220
  
  	return 0;
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1221
  }
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1222

fca43cc80   John Rigby   boot: change some...
1223
  #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1224
  /**
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1225
   * boot_ramdisk_high - relocate init ramdisk
e822d7fc4   Kumar Gala   [new uImage] Use ...
1226
   * @lmb: pointer to lmb handle, will be used for memory mgmt
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1227
1228
   * @rd_data: ramdisk data start address
   * @rd_len: ramdisk data length
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1229
1230
1231
1232
1233
   * @initrd_start: pointer to a ulong variable, will hold final init ramdisk
   *      start address (after possible relocation)
   * @initrd_end: pointer to a ulong variable, will hold final init ramdisk
   *      end address (after possible relocation)
   *
1bce2aeb6   Robert P. J. Day   Cosmetic: Fix a n...
1234
   * boot_ramdisk_high() takes a relocation hint from "initrd_high" environment
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1235
1236
   * variable and if requested ramdisk data is moved to a specified location.
   *
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1237
1238
1239
1240
   * Initrd_start and initrd_end are set to final (after relocation) ramdisk
   * start/end addresses if ramdisk image start and len were provided,
   * otherwise set initrd_start and initrd_end set to zeros.
   *
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1241
   * returns:
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1242
1243
   *      0 - success
   *     -1 - failure
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1244
   */
712fbcf38   Stephen Warren   checkpatch whites...
1245
  int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
e822d7fc4   Kumar Gala   [new uImage] Use ...
1246
  		  ulong *initrd_start, ulong *initrd_end)
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1247
1248
1249
1250
  {
  	char	*s;
  	ulong	initrd_high;
  	int	initrd_copy_to_ram = 1;
00caae6d4   Simon Glass   env: Rename geten...
1251
1252
  	s = env_get("initrd_high");
  	if (s) {
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1253
1254
1255
  		/* a value of "no" or a similar string will act like 0,
  		 * turning the "load high" feature off. This is intentional.
  		 */
712fbcf38   Stephen Warren   checkpatch whites...
1256
  		initrd_high = simple_strtoul(s, NULL, 16);
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1257
1258
1259
  		if (initrd_high == ~0)
  			initrd_copy_to_ram = 0;
  	} else {
723806cc5   Simon Glass   env: Rename some ...
1260
  		initrd_high = env_get_bootm_mapsize() + env_get_bootm_low();
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1261
  	}
95d449ad4   Marian Balakowicz   Avoid initrd and ...
1262

712fbcf38   Stephen Warren   checkpatch whites...
1263
1264
  	debug("## initrd_high = 0x%08lx, copy_to_ram = %d
  ",
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1265
1266
1267
1268
  			initrd_high, initrd_copy_to_ram);
  
  	if (rd_data) {
  		if (!initrd_copy_to_ram) {	/* zero-copy ramdisk support */
712fbcf38   Stephen Warren   checkpatch whites...
1269
1270
  			debug("   in-place initrd
  ");
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1271
1272
  			*initrd_start = rd_data;
  			*initrd_end = rd_data + rd_len;
e822d7fc4   Kumar Gala   [new uImage] Use ...
1273
  			lmb_reserve(lmb, rd_data, rd_len);
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1274
  		} else {
e822d7fc4   Kumar Gala   [new uImage] Use ...
1275
  			if (initrd_high)
712fbcf38   Stephen Warren   checkpatch whites...
1276
1277
  				*initrd_start = (ulong)lmb_alloc_base(lmb,
  						rd_len, 0x1000, initrd_high);
e822d7fc4   Kumar Gala   [new uImage] Use ...
1278
  			else
712fbcf38   Stephen Warren   checkpatch whites...
1279
1280
  				*initrd_start = (ulong)lmb_alloc(lmb, rd_len,
  								 0x1000);
e822d7fc4   Kumar Gala   [new uImage] Use ...
1281
1282
  
  			if (*initrd_start == 0) {
712fbcf38   Stephen Warren   checkpatch whites...
1283
1284
  				puts("ramdisk - allocation error
  ");
e822d7fc4   Kumar Gala   [new uImage] Use ...
1285
  				goto error;
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1286
  			}
770605e4f   Simon Glass   bootstage: Replac...
1287
  			bootstage_mark(BOOTSTAGE_ID_COPY_RAMDISK);
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1288
1289
  
  			*initrd_end = *initrd_start + rd_len;
712fbcf38   Stephen Warren   checkpatch whites...
1290
  			printf("   Loading Ramdisk to %08lx, end %08lx ... ",
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1291
  					*initrd_start, *initrd_end);
712fbcf38   Stephen Warren   checkpatch whites...
1292
  			memmove_wd((void *)*initrd_start,
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1293
  					(void *)rd_data, rd_len, CHUNKSZ);
3b2001105   Kumar Gala   powerpc/bootm: Fl...
1294
1295
1296
1297
1298
1299
  #ifdef CONFIG_MP
  			/*
  			 * Ensure the image is flushed to memory to handle
  			 * AMP boot scenarios in which we might not be
  			 * HW cache coherent
  			 */
1a1e7072e   Heiko Schocher   common: image.c: ...
1300
1301
  			flush_cache((unsigned long)*initrd_start,
  				    ALIGN(rd_len, ARCH_DMA_MINALIGN));
3b2001105   Kumar Gala   powerpc/bootm: Fl...
1302
  #endif
712fbcf38   Stephen Warren   checkpatch whites...
1303
1304
  			puts("OK
  ");
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1305
1306
1307
1308
1309
  		}
  	} else {
  		*initrd_start = 0;
  		*initrd_end = 0;
  	}
712fbcf38   Stephen Warren   checkpatch whites...
1310
1311
  	debug("   ramdisk load start = 0x%08lx, ramdisk load end = 0x%08lx
  ",
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1312
  			*initrd_start, *initrd_end);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1313

e822d7fc4   Kumar Gala   [new uImage] Use ...
1314
  	return 0;
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1315

e822d7fc4   Kumar Gala   [new uImage] Use ...
1316
1317
  error:
  	return -1;
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1318
  }
fca43cc80   John Rigby   boot: change some...
1319
  #endif /* CONFIG_SYS_BOOT_RAMDISK_HIGH */
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1320

90268b878   Simon Glass   x86: Support load...
1321
1322
1323
  int boot_get_setup(bootm_headers_t *images, uint8_t arch,
  		   ulong *setup_start, ulong *setup_len)
  {
73223f0e1   Simon Glass   Kconfig: Move CON...
1324
  #if IMAGE_ENABLE_FIT
90268b878   Simon Glass   x86: Support load...
1325
1326
1327
1328
1329
  	return boot_get_setup_fit(images, arch, setup_start, setup_len);
  #else
  	return -ENOENT;
  #endif
  }
73223f0e1   Simon Glass   Kconfig: Move CON...
1330
  #if IMAGE_ENABLE_FIT
8b93a92f6   Goldschmidt Simon   fpga: allow progr...
1331
  #if defined(CONFIG_FPGA)
62afc6018   Michal Simek   image: Add boot_g...
1332
1333
1334
1335
1336
1337
1338
  int boot_get_fpga(int argc, char * const argv[], bootm_headers_t *images,
  		  uint8_t arch, const ulong *ld_start, ulong * const ld_len)
  {
  	ulong tmp_img_addr, img_data, img_len;
  	void *buf;
  	int conf_noffset;
  	int fit_img_result;
b02e4044f   Simon Glass   libfdt: Bring in ...
1339
  	const char *uname, *name;
62afc6018   Michal Simek   image: Add boot_g...
1340
1341
  	int err;
  	int devnum = 0; /* TODO support multi fpga platforms */
62afc6018   Michal Simek   image: Add boot_g...
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
  
  	/* Check to see if the images struct has a FIT configuration */
  	if (!genimg_has_config(images)) {
  		debug("## FIT configuration was not specified
  ");
  		return 0;
  	}
  
  	/*
  	 * Obtain the os FIT header from the images struct
62afc6018   Michal Simek   image: Add boot_g...
1352
1353
  	 */
  	tmp_img_addr = map_to_sysmem(images->fit_hdr_os);
62afc6018   Michal Simek   image: Add boot_g...
1354
1355
1356
1357
1358
1359
1360
1361
  	buf = map_sysmem(tmp_img_addr, 0);
  	/*
  	 * Check image type. For FIT images get FIT node
  	 * and attempt to locate a generic binary.
  	 */
  	switch (genimg_get_format(buf)) {
  	case IMAGE_FORMAT_FIT:
  		conf_noffset = fit_conf_get_node(buf, images->fit_uname_cfg);
b02e4044f   Simon Glass   libfdt: Bring in ...
1362
1363
1364
  		uname = fdt_stringlist_get(buf, conf_noffset, FIT_FPGA_PROP, 0,
  					   NULL);
  		if (!uname) {
62afc6018   Michal Simek   image: Add boot_g...
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
  			debug("## FPGA image is not specified
  ");
  			return 0;
  		}
  		fit_img_result = fit_image_load(images,
  						tmp_img_addr,
  						(const char **)&uname,
  						&(images->fit_uname_cfg),
  						arch,
  						IH_TYPE_FPGA,
  						BOOTSTAGE_ID_FPGA_INIT,
  						FIT_LOAD_OPTIONAL_NON_ZERO,
  						&img_data, &img_len);
  
  		debug("FPGA image (%s) loaded to 0x%lx/size 0x%lx
  ",
  		      uname, img_data, img_len);
  
  		if (fit_img_result < 0) {
  			/* Something went wrong! */
  			return fit_img_result;
  		}
8b93a92f6   Goldschmidt Simon   fpga: allow progr...
1387
  		if (!fpga_is_partial_data(devnum, img_len)) {
62afc6018   Michal Simek   image: Add boot_g...
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
  			name = "full";
  			err = fpga_loadbitstream(devnum, (char *)img_data,
  						 img_len, BIT_FULL);
  			if (err)
  				err = fpga_load(devnum, (const void *)img_data,
  						img_len, BIT_FULL);
  		} else {
  			name = "partial";
  			err = fpga_loadbitstream(devnum, (char *)img_data,
  						 img_len, BIT_PARTIAL);
  			if (err)
  				err = fpga_load(devnum, (const void *)img_data,
  						img_len, BIT_PARTIAL);
  		}
62afc6018   Michal Simek   image: Add boot_g...
1402
  		if (err)
611a9428c   Michal Simek   common: Fix logic...
1403
1404
1405
1406
  			return err;
  
  		printf("   Programming %s bitstream... OK
  ", name);
62afc6018   Michal Simek   image: Add boot_g...
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
  		break;
  	default:
  		printf("The given image format is not supported (corrupt?)
  ");
  		return 1;
  	}
  
  	return 0;
  }
  #endif
d7be50921   Andrew F. Davis   image: Add FIT im...
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
  static void fit_loadable_process(uint8_t img_type,
  				 ulong img_data,
  				 ulong img_len)
  {
  	int i;
  	const unsigned int count =
  			ll_entry_count(struct fit_loadable_tbl, fit_loadable);
  	struct fit_loadable_tbl *fit_loadable_handler =
  			ll_entry_start(struct fit_loadable_tbl, fit_loadable);
  	/* For each loadable handler */
  	for (i = 0; i < count; i++, fit_loadable_handler++)
  		/* matching this type */
  		if (fit_loadable_handler->type == img_type)
  			/* call that handler with this image data */
  			fit_loadable_handler->handler(img_data, img_len);
  }
84a07dbfd   Karl Apsite   add boot_get_load...
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
  int boot_get_loadable(int argc, char * const argv[], bootm_headers_t *images,
  		uint8_t arch, const ulong *ld_start, ulong * const ld_len)
  {
  	/*
  	 * These variables are used to hold the current image location
  	 * in system memory.
  	 */
  	ulong tmp_img_addr;
  	/*
  	 * These two variables are requirements for fit_image_load, but
  	 * their values are not used
  	 */
  	ulong img_data, img_len;
  	void *buf;
  	int loadables_index;
  	int conf_noffset;
  	int fit_img_result;
b02e4044f   Simon Glass   libfdt: Bring in ...
1450
  	const char *uname;
d7be50921   Andrew F. Davis   image: Add FIT im...
1451
  	uint8_t img_type;
84a07dbfd   Karl Apsite   add boot_get_load...
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
  
  	/* Check to see if the images struct has a FIT configuration */
  	if (!genimg_has_config(images)) {
  		debug("## FIT configuration was not specified
  ");
  		return 0;
  	}
  
  	/*
  	 * Obtain the os FIT header from the images struct
84a07dbfd   Karl Apsite   add boot_get_load...
1462
1463
  	 */
  	tmp_img_addr = map_to_sysmem(images->fit_hdr_os);
84a07dbfd   Karl Apsite   add boot_get_load...
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
  	buf = map_sysmem(tmp_img_addr, 0);
  	/*
  	 * Check image type. For FIT images get FIT node
  	 * and attempt to locate a generic binary.
  	 */
  	switch (genimg_get_format(buf)) {
  	case IMAGE_FORMAT_FIT:
  		conf_noffset = fit_conf_get_node(buf, images->fit_uname_cfg);
  
  		for (loadables_index = 0;
b02e4044f   Simon Glass   libfdt: Bring in ...
1474
1475
1476
  		     uname = fdt_stringlist_get(buf, conf_noffset,
  					FIT_LOADABLE_PROP, loadables_index,
  					NULL), uname;
84a07dbfd   Karl Apsite   add boot_get_load...
1477
1478
1479
1480
  		     loadables_index++)
  		{
  			fit_img_result = fit_image_load(images,
  				tmp_img_addr,
b02e4044f   Simon Glass   libfdt: Bring in ...
1481
  				&uname,
84a07dbfd   Karl Apsite   add boot_get_load...
1482
1483
1484
1485
1486
1487
1488
1489
1490
  				&(images->fit_uname_cfg), arch,
  				IH_TYPE_LOADABLE,
  				BOOTSTAGE_ID_FIT_LOADABLE_START,
  				FIT_LOAD_OPTIONAL_NON_ZERO,
  				&img_data, &img_len);
  			if (fit_img_result < 0) {
  				/* Something went wrong! */
  				return fit_img_result;
  			}
d7be50921   Andrew F. Davis   image: Add FIT im...
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
  
  			fit_img_result = fit_image_get_node(buf, uname);
  			if (fit_img_result < 0) {
  				/* Something went wrong! */
  				return fit_img_result;
  			}
  			fit_img_result = fit_image_get_type(buf,
  							    fit_img_result,
  							    &img_type);
  			if (fit_img_result < 0) {
  				/* Something went wrong! */
  				return fit_img_result;
  			}
  
  			fit_loadable_process(img_type, img_data, img_len);
84a07dbfd   Karl Apsite   add boot_get_load...
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
  		}
  		break;
  	default:
  		printf("The given image format is not supported (corrupt?)
  ");
  		return 1;
  	}
  
  	return 0;
  }
  #endif
fca43cc80   John Rigby   boot: change some...
1517
  #ifdef CONFIG_SYS_BOOT_GET_CMDLINE
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1518
  /**
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1519
   * boot_get_cmdline - allocate and initialize kernel cmdline
e822d7fc4   Kumar Gala   [new uImage] Use ...
1520
   * @lmb: pointer to lmb handle, will be used for memory mgmt
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1521
1522
1523
   * @cmd_start: pointer to a ulong variable, will hold cmdline start
   * @cmd_end: pointer to a ulong variable, will hold cmdline end
   *
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1524
   * boot_get_cmdline() allocates space for kernel command line below
919d25c92   Shyam Saini   u-boot: Fix sever...
1525
   * BOOTMAPSZ + env_get_bootm_low() address. If "bootargs" U-Boot environment
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1526
1527
1528
1529
   * variable is present its contents is copied to allocated kernel
   * command line.
   *
   * returns:
e822d7fc4   Kumar Gala   [new uImage] Use ...
1530
1531
   *      0 - success
   *     -1 - failure
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1532
   */
712fbcf38   Stephen Warren   checkpatch whites...
1533
  int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1534
1535
1536
  {
  	char *cmdline;
  	char *s;
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
1537
  	cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf,
723806cc5   Simon Glass   env: Rename some ...
1538
  				env_get_bootm_mapsize() + env_get_bootm_low());
e822d7fc4   Kumar Gala   [new uImage] Use ...
1539
1540
1541
  
  	if (cmdline == NULL)
  		return -1;
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1542

00caae6d4   Simon Glass   env: Rename geten...
1543
1544
  	s = env_get("bootargs");
  	if (!s)
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1545
1546
1547
1548
1549
1550
  		s = "";
  
  	strcpy(cmdline, s);
  
  	*cmd_start = (ulong) & cmdline[0];
  	*cmd_end = *cmd_start + strlen(cmdline);
712fbcf38   Stephen Warren   checkpatch whites...
1551
1552
  	debug("## cmdline at 0x%08lx ... 0x%08lx
  ", *cmd_start, *cmd_end);
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1553

e822d7fc4   Kumar Gala   [new uImage] Use ...
1554
  	return 0;
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1555
  }
fca43cc80   John Rigby   boot: change some...
1556
  #endif /* CONFIG_SYS_BOOT_GET_CMDLINE */
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1557

fca43cc80   John Rigby   boot: change some...
1558
  #ifdef CONFIG_SYS_BOOT_GET_KBD
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1559
  /**
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1560
   * boot_get_kbd - allocate and initialize kernel copy of board info
e822d7fc4   Kumar Gala   [new uImage] Use ...
1561
   * @lmb: pointer to lmb handle, will be used for memory mgmt
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1562
1563
   * @kbd: double pointer to board info data
   *
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1564
   * boot_get_kbd() allocates space for kernel copy of board info data below
723806cc5   Simon Glass   env: Rename some ...
1565
   * BOOTMAPSZ + env_get_bootm_low() address and kernel board info is initialized
590d3cacb   Grant Likely   Stop passing arou...
1566
   * with the current u-boot board info data.
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1567
1568
   *
   * returns:
e822d7fc4   Kumar Gala   [new uImage] Use ...
1569
1570
   *      0 - success
   *     -1 - failure
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1571
   */
712fbcf38   Stephen Warren   checkpatch whites...
1572
  int boot_get_kbd(struct lmb *lmb, bd_t **kbd)
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1573
  {
391fd93ab   Becky Bruce   Change lmb to use...
1574
  	*kbd = (bd_t *)(ulong)lmb_alloc_base(lmb, sizeof(bd_t), 0xf,
723806cc5   Simon Glass   env: Rename some ...
1575
  				env_get_bootm_mapsize() + env_get_bootm_low());
e822d7fc4   Kumar Gala   [new uImage] Use ...
1576
1577
  	if (*kbd == NULL)
  		return -1;
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1578
  	**kbd = *(gd->bd);
712fbcf38   Stephen Warren   checkpatch whites...
1579
1580
  	debug("## kernel board info at 0x%08lx
  ", (ulong)*kbd);
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1581
1582
1583
1584
  
  #if defined(DEBUG) && defined(CONFIG_CMD_BDI)
  	do_bdinfo(NULL, 0, 0, NULL);
  #endif
e822d7fc4   Kumar Gala   [new uImage] Use ...
1585
  	return 0;
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1586
  }
fca43cc80   John Rigby   boot: change some...
1587
  #endif /* CONFIG_SYS_BOOT_GET_KBD */
13d06981a   Simon Glass   image: Add device...
1588
1589
1590
1591
1592
1593
  
  #ifdef CONFIG_LMB
  int image_setup_linux(bootm_headers_t *images)
  {
  	ulong of_size = images->ft_len;
  	char **of_flat_tree = &images->ft_addr;
13d06981a   Simon Glass   image: Add device...
1594
  	struct lmb *lmb = &images->lmb;
13d06981a   Simon Glass   image: Add device...
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
  	int ret;
  
  	if (IMAGE_ENABLE_OF_LIBFDT)
  		boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree);
  
  	if (IMAGE_BOOT_GET_CMDLINE) {
  		ret = boot_get_cmdline(lmb, &images->cmdline_start,
  				&images->cmdline_end);
  		if (ret) {
  			puts("ERROR with allocation of cmdline
  ");
  			return ret;
  		}
  	}
13d06981a   Simon Glass   image: Add device...
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
  
  	if (IMAGE_ENABLE_OF_LIBFDT) {
  		ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size);
  		if (ret)
  			return ret;
  	}
  
  	if (IMAGE_ENABLE_OF_LIBFDT && of_size) {
  		ret = image_setup_libfdt(images, *of_flat_tree, of_size, lmb);
  		if (ret)
  			return ret;
  	}
  
  	return 0;
  }
  #endif /* CONFIG_LMB */
5dfb52138   Marian Balakowicz   [new uImage] New ...
1625
  #endif /* !USE_HOSTCC */