Blame view

common/image.c 40.6 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
11
12
13
14
15
  #include <common.h>
  #include <watchdog.h>
  
  #ifdef CONFIG_SHOW_BOOT_PROGRESS
  #include <status_led.h>
  #endif
2242f5369   Marian Balakowicz   [new uImage] Rena...
16
  #include <rtc.h>
2242f5369   Marian Balakowicz   [new uImage] Rena...
17

1cf0a8b2f   Joe Hershberger   env: Add a loadad...
18
  #include <environment.h>
5dfb52138   Marian Balakowicz   [new uImage] New ...
19
  #include <image.h>
0eb25b619   Joe Hershberger   common: Make sure...
20
  #include <mapmem.h>
5dfb52138   Marian Balakowicz   [new uImage] New ...
21

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

b6b0fe646   Marian Balakowicz   [new uImage] Clea...
33
  #ifdef CONFIG_CMD_BDI
54841ab50   Wolfgang Denk   Make sure that ar...
34
  extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
35
36
37
  #endif
  
  DECLARE_GLOBAL_DATA_PTR;
8a5ea3e61   Marian Balakowicz   [new uImage] Move...
38

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

0ccff500c   Simon Glass   image: Use crc he...
54
  #include <u-boot/crc.h>
13d06981a   Simon Glass   image: Add device...
55
56
57
  #ifndef CONFIG_SYS_BARGSIZE
  #define CONFIG_SYS_BARGSIZE 512
  #endif
7edb186fc   Mike Frysinger   image: constify l...
58
  static const table_entry_t uimage_arch[] = {
30495bff3   Simon Glass   image: Add a name...
59
  	{	IH_ARCH_INVALID,	"invalid",	"Invalid ARCH",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
60
61
62
63
64
65
66
67
  	{	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...
68
  	{	IH_ARCH_NIOS2,		"nios2",	"NIOS II",	},
e419e12d0   Grant Erickson   Recognize 'powerp...
69
  	{	IH_ARCH_PPC,		"powerpc",	"PowerPC",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
70
71
72
73
74
75
76
  	{	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...
77
  	{	IH_ARCH_NDS32,		"nds32",	"NDS32",	},
3ddcaccda   Stefan Kristiansson   openrisc: Add arc...
78
  	{	IH_ARCH_OPENRISC,	"or1k",		"OpenRISC 1000",},
35e7b0f17   Simon Glass   sandbox: image: A...
79
  	{	IH_ARCH_SANDBOX,	"sandbox",	"Sandbox",	},
0ae765312   David Feng   arm64: core support
80
  	{	IH_ARCH_ARM64,		"arm64",	"AArch64",	},
bc5d54288   Alexey Brodkin   arc: bdinfo, imag...
81
  	{	IH_ARCH_ARC,		"arc",		"ARC",		},
5bda35cff   Simon Glass   x86: image: Add n...
82
  	{	IH_ARCH_X86_64,		"x86_64",	"AMD x86_64",	},
de5e5cea0   Chris Zankel   xtensa: add suppo...
83
  	{	IH_ARCH_XTENSA,		"xtensa",	"Xtensa",	},
86aa65a0c   Rick Chen   tools: mkimage: S...
84
  	{	IH_ARCH_RISCV,		"riscv",	"RISC-V",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
85
86
  	{	-1,			"",		"",		},
  };
7edb186fc   Mike Frysinger   image: constify l...
87
  static const table_entry_t uimage_os[] = {
30495bff3   Simon Glass   image: Add a name...
88
  	{	IH_OS_INVALID,	"invalid",	"Invalid OS",		},
4914af128   Philipp Tomsich   image: add IH_OS_...
89
  	{       IH_OS_ARM_TRUSTED_FIRMWARE, "arm-trusted-firmware", "ARM Trusted Firmware"  },
570abb0ad   Marian Balakowicz   [new uImage] Shar...
90
91
92
93
94
  	{	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...
95
  	{	IH_OS_OSE,	"ose",		"Enea OSE",		},
04d414090   Steven Stallion   image: Add suppor...
96
  	{	IH_OS_PLAN9,	"plan9",	"Plan 9",		},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
97
  	{	IH_OS_RTEMS,	"rtems",	"RTEMS",		},
45b55712d   Bryan O'Donoghue   image: Add IH_OS_...
98
  	{	IH_OS_TEE,	"tee",		"Trusted Execution Environment" },
570abb0ad   Marian Balakowicz   [new uImage] Shar...
99
  	{	IH_OS_U_BOOT,	"u-boot",	"U-Boot",		},
68b15e831   miao.yan@windriver.com   common/image.c: m...
100
  	{	IH_OS_VXWORKS,	"vxworks",	"VxWorks",		},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
101
102
  #if defined(CONFIG_CMD_ELF) || defined(USE_HOSTCC)
  	{	IH_OS_QNX,	"qnx",		"QNX",			},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
103
  #endif
f5ed9e390   Peter Tyser   Add support for b...
104
105
106
  #if defined(CONFIG_INTEGRITY) || defined(USE_HOSTCC)
  	{	IH_OS_INTEGRITY,"integrity",	"INTEGRITY",		},
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
107
108
109
110
111
112
113
114
115
116
117
118
119
  #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...
120
121
122
  #if defined(CONFIG_BOOTM_OPENRTOS) || defined(USE_HOSTCC)
  	{	IH_OS_OPENRTOS,	"openrtos",	"OpenRTOS",		},
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
123
124
  	{	-1,		"",		"",			},
  };
7edb186fc   Mike Frysinger   image: constify l...
125
  static const table_entry_t uimage_type[] = {
4962e38e9   Stefano Babic   mkimage: adding s...
126
  	{	IH_TYPE_AISIMAGE,   "aisimage",   "Davinci AIS image",},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
127
128
  	{	IH_TYPE_FILESYSTEM, "filesystem", "Filesystem Image",	},
  	{	IH_TYPE_FIRMWARE,   "firmware",	  "Firmware",		},
3decb14ab   John Rigby   mkimage: Add OMAP...
129
  	{	IH_TYPE_FLATDT,     "flat_dt",    "Flat Device Tree",	},
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
130
  	{	IH_TYPE_GPIMAGE,    "gpimage",    "TI Keystone SPL Image",},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
131
  	{	IH_TYPE_KERNEL,	    "kernel",	  "Kernel Image",	},
b9b50e89d   Stephen Warren   image: Implement ...
132
  	{	IH_TYPE_KERNEL_NOLOAD, "kernel_noload",  "Kernel Image (no loading done)", },
4962e38e9   Stefano Babic   mkimage: adding s...
133
134
  	{	IH_TYPE_KWBIMAGE,   "kwbimage",   "Kirkwood Boot Image",},
  	{	IH_TYPE_IMXIMAGE,   "imximage",   "Freescale i.MX Boot Image",},
a2b96ece5   Peng Fan   tools: add i.MX8/...
135
  	{	IH_TYPE_IMX8IMAGE,  "imx8image",  "NXP i.MX8 Boot Image",},
6609c2663   Peng Fan   tools: add i.MX8M...
136
  	{	IH_TYPE_IMX8MIMAGE, "imx8mimage", "NXP i.MX8M Boot Image",},
30495bff3   Simon Glass   image: Add a name...
137
  	{	IH_TYPE_INVALID,    "invalid",	  "Invalid Image",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
138
  	{	IH_TYPE_MULTI,	    "multi",	  "Multi-File Image",	},
4962e38e9   Stefano Babic   mkimage: adding s...
139
  	{	IH_TYPE_OMAPIMAGE,  "omapimage",  "TI OMAP SPL With GP CH",},
5d898a00f   Shaohui Xie   powerpc/CoreNet: ...
140
  	{	IH_TYPE_PBLIMAGE,   "pblimage",   "Freescale PBL Boot Image",},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
141
142
  	{	IH_TYPE_RAMDISK,    "ramdisk",	  "RAMDisk Image",	},
  	{	IH_TYPE_SCRIPT,     "script",	  "Script",		},
662abc4fc   Marek Vasut   image: socfpga: A...
143
144
  	{	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...
145
  	{	IH_TYPE_STANDALONE, "standalone", "Standalone Program", },
7816f2cf8   Heiko Schocher   mkimage: add UBL ...
146
  	{	IH_TYPE_UBLIMAGE,   "ublimage",   "Davinci UBL image",},
bce883707   Marek Vasut   ARM: mxs: tools: ...
147
  	{	IH_TYPE_MXSIMAGE,   "mxsimage",   "Freescale MXS Boot Image",},
7b1a41174   Andreas Bießmann   mkimage: add atme...
148
  	{	IH_TYPE_ATMELIMAGE, "atmelimage", "ATMEL ROM-Boot Image",},
90268b878   Simon Glass   x86: Support load...
149
  	{	IH_TYPE_X86_SETUP,  "x86_setup",  "x86 setup.bin",    },
39f520bb6   Albert ARIBAUD \(3ADEV\)   lpc32xx: add lpc3...
150
  	{	IH_TYPE_LPC32XXIMAGE, "lpc32xximage",  "LPC32XX Boot Image", },
a131c1f44   Simon Glass   rockchip: Add the...
151
  	{	IH_TYPE_RKIMAGE,    "rkimage",    "Rockchip Boot Image" },
f9a3c278b   Simon Glass   rockchip: Add sup...
152
  	{	IH_TYPE_RKSD,       "rksd",       "Rockchip SD Boot Image" },
10b84fe1b   Simon Glass   rockchip: Add sup...
153
  	{	IH_TYPE_RKSPI,      "rkspi",      "Rockchip SPI Boot Image" },
ed0c2c0a9   Albert ARIBAUD \(3ADEV\)   tools: mkimage: a...
154
  	{	IH_TYPE_VYBRIDIMAGE, "vybridimage",  "Vybrid Boot Image", },
66eef1e78   Nathan Rossi   tools: zynqimage:...
155
  	{	IH_TYPE_ZYNQIMAGE,  "zynqimage",  "Xilinx Zynq Boot Image" },
d9b58b303   Michal Simek   tools: zynqmpimag...
156
  	{	IH_TYPE_ZYNQMPIMAGE, "zynqmpimage", "Xilinx ZynqMP Boot Image" },
6915dcf35   Alexander Graf   tools: zynqmpimag...
157
  	{	IH_TYPE_ZYNQMPBIF,  "zynqmpbif",  "Xilinx ZynqMP Boot Image (bif)" },
ed0cea7c5   Michal Simek   mkimage: Report i...
158
  	{	IH_TYPE_FPGA,       "fpga",       "FPGA Image" },
7e719ee7d   Andrew F. Davis   image: Add Truste...
159
  	{       IH_TYPE_TEE,        "tee",        "Trusted Execution Environment Image",},
d21bd69b6   Sven Ebenfeld   tools: mkimage: a...
160
  	{	IH_TYPE_FIRMWARE_IVT, "firmware_ivt", "Firmware with HABv4 IVT" },
6442c9643   Andrew F. Davis   image: Add TI PMM...
161
  	{       IH_TYPE_PMMC,        "pmmc",        "TI Power Management Micro-Controller Firmware",},
81260e333   Patrick Delaunay   tools/mkimage: ad...
162
  	{	IH_TYPE_STM32IMAGE, "stm32image", "STMicroelectronics STM32 Image" },
3b975a147   Ryder Lee   tools: MediaTek: ...
163
  	{	IH_TYPE_MTKIMAGE,   "mtk_image",   "MediaTek BootROM loadable Image" },
570abb0ad   Marian Balakowicz   [new uImage] Shar...
164
165
  	{	-1,		    "",		  "",			},
  };
7edb186fc   Mike Frysinger   image: constify l...
166
  static const table_entry_t uimage_comp[] = {
570abb0ad   Marian Balakowicz   [new uImage] Shar...
167
168
169
  	{	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...
170
  	{	IH_COMP_LZMA,	"lzma",		"lzma compressed",	},
20dde48bc   Peter Korsgaard   add lzop decompre...
171
  	{	IH_COMP_LZO,	"lzo",		"lzo compressed",	},
027b728d4   Julius Werner   Add support for L...
172
  	{	IH_COMP_LZ4,	"lz4",		"lz4 compressed",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
173
174
  	{	-1,		"",		"",			},
  };
56d7ab747   Simon Glass   image: Create a t...
175
176
177
178
179
180
181
182
183
184
185
186
  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...
187
188
189
  /*****************************************************************************/
  /* Legacy format routines */
  /*****************************************************************************/
712fbcf38   Stephen Warren   checkpatch whites...
190
  int image_check_hcrc(const image_header_t *hdr)
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
191
192
  {
  	ulong hcrc;
712fbcf38   Stephen Warren   checkpatch whites...
193
  	ulong len = image_get_header_size();
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
194
195
196
  	image_header_t header;
  
  	/* Copy header so we can blank CRC field for re-calculation */
712fbcf38   Stephen Warren   checkpatch whites...
197
198
  	memmove(&header, (char *)hdr, image_get_header_size());
  	image_set_hcrc(&header, 0);
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
199

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

712fbcf38   Stephen Warren   checkpatch whites...
202
  	return (hcrc == image_get_hcrc(hdr));
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
203
  }
712fbcf38   Stephen Warren   checkpatch whites...
204
  int image_check_dcrc(const image_header_t *hdr)
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
205
  {
712fbcf38   Stephen Warren   checkpatch whites...
206
207
208
  	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...
209

712fbcf38   Stephen Warren   checkpatch whites...
210
  	return (dcrc == image_get_dcrc(hdr));
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
211
  }
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
212
213
214
215
216
217
218
219
220
221
222
223
224
  /**
   * 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...
225
  ulong image_multi_count(const image_header_t *hdr)
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
226
227
  {
  	ulong i, count = 0;
df6f1b895   Marian Balakowicz   [new uImage] Fix ...
228
  	uint32_t *size;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
229
230
231
  
  	/* 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...
232
  	size = (uint32_t *)image_get_data(hdr);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
  
  	/* 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...
258
  void image_multi_getimg(const image_header_t *hdr, ulong idx,
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
259
260
261
  			ulong *data, ulong *len)
  {
  	int i;
df6f1b895   Marian Balakowicz   [new uImage] Fix ...
262
  	uint32_t *size;
02b9b2244   Nick Spence   Fix offset calcul...
263
  	ulong offset, count, img_data;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
264
265
  
  	/* get number of component */
712fbcf38   Stephen Warren   checkpatch whites...
266
  	count = image_multi_count(hdr);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
267
268
269
  
  	/* 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...
270
  	size = (uint32_t *)image_get_data(hdr);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
271
272
273
  
  	/* get address of the proper component data start, which means
  	 * skipping sizes table (add 1 for last, null entry) */
712fbcf38   Stephen Warren   checkpatch whites...
274
  	img_data = image_get_data(hdr) + (count + 1) * sizeof(uint32_t);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
275
276
  
  	if (idx < count) {
712fbcf38   Stephen Warren   checkpatch whites...
277
  		*len = uimage_to_cpu(size[idx]);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
278
  		offset = 0;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
279
280
281
  
  		/* go over all indices preceding requested component idx */
  		for (i = 0; i < idx; i++) {
02b9b2244   Nick Spence   Fix offset calcul...
282
  			/* add up i-th component size, rounding up to 4 bytes */
712fbcf38   Stephen Warren   checkpatch whites...
283
  			offset += (uimage_to_cpu(size[i]) + 3) & ~3 ;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
284
285
286
  		}
  
  		/* calculate idx-th component data address */
02b9b2244   Nick Spence   Fix offset calcul...
287
  		*data = img_data + offset;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
288
289
290
291
292
  	} else {
  		*len = 0;
  		*data = 0;
  	}
  }
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
293

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

712fbcf38   Stephen Warren   checkpatch whites...
298
299
300
301
  	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...
302

712fbcf38   Stephen Warren   checkpatch whites...
303
304
  	printf("%s %s %s (%s)
  ", arch, os, type, comp);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
305
  }
5dfb52138   Marian Balakowicz   [new uImage] New ...
306
  /**
edbed247a   Bartlomiej Sieka   Memory footprint ...
307
   * image_print_contents - prints out the contents of the legacy format image
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
308
   * @ptr: pointer to the legacy format image header
5dfb52138   Marian Balakowicz   [new uImage] New ...
309
310
   * @p: pointer to prefix string
   *
edbed247a   Bartlomiej Sieka   Memory footprint ...
311
   * image_print_contents() formats a multi line legacy image contents description.
5dfb52138   Marian Balakowicz   [new uImage] New ...
312
313
314
315
316
317
   * 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...
318
  void image_print_contents(const void *ptr)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
319
  {
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
320
  	const image_header_t *hdr = (const image_header_t *)ptr;
80402f34f   Heiko Schocher   spl, common, seri...
321
  	const char __maybe_unused *p;
edbed247a   Bartlomiej Sieka   Memory footprint ...
322

1fe7d9389   Simon Glass   image: Remove rem...
323
  	p = IMAGE_INDENT_STRING;
712fbcf38   Stephen Warren   checkpatch whites...
324
325
  	printf("%sImage Name:   %.*s
  ", p, IH_NMLEN, image_get_name(hdr));
859e92b77   Simon Glass   image: Move times...
326
327
328
329
  	if (IMAGE_ENABLE_TIMESTAMP) {
  		printf("%sCreated:      ", p);
  		genimg_print_time((time_t)image_get_time(hdr));
  	}
712fbcf38   Stephen Warren   checkpatch whites...
330
331
332
333
334
335
336
337
338
339
340
  	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...
341
342
  		int i;
  		ulong data, len;
712fbcf38   Stephen Warren   checkpatch whites...
343
  		ulong count = image_multi_count(hdr);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
344

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

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

712fbcf38   Stephen Warren   checkpatch whites...
353
  			if (image_check_type(hdr, IH_TYPE_SCRIPT) && i > 0) {
570abb0ad   Marian Balakowicz   [new uImage] Shar...
354
355
356
357
358
  				/*
  				 * the user may need to know offsets
  				 * if planning to do something with
  				 * multiple files
  				 */
712fbcf38   Stephen Warren   checkpatch whites...
359
360
  				printf("%s    Offset = 0x%08lx
  ", p, data);
570abb0ad   Marian Balakowicz   [new uImage] Shar...
361
  			}
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
362
  		}
d21bd69b6   Sven Ebenfeld   tools: mkimage: a...
363
364
365
366
367
368
  	} else if (image_check_type(hdr, IH_TYPE_FIRMWARE_IVT)) {
  		printf("HAB Blocks:   0x%08x   0x0000   0x%08x
  ",
  				image_get_load(hdr) - image_get_header_size(),
  				image_get_size(hdr) + image_get_header_size()
  						- 0x1FE0);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
369
370
  	}
  }
570abb0ad   Marian Balakowicz   [new uImage] Shar...
371
372
  
  #ifndef USE_HOSTCC
21d29f7f9   Heiko Schocher   bootm: make use o...
373
  #if defined(CONFIG_IMAGE_FORMAT_LEGACY)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
374
375
  /**
   * image_get_ramdisk - get and verify ramdisk image
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
376
377
378
379
380
381
382
383
384
   * @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...
385
386
387
388
   * returns:
   *     pointer to a ramdisk image header, if image was found and valid
   *     otherwise, return NULL
   */
712fbcf38   Stephen Warren   checkpatch whites...
389
  static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
d985c8498   Marian Balakowicz   [new uImage] Remo...
390
  						int verify)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
391
  {
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
392
  	const image_header_t *rd_hdr = (const image_header_t *)rd_addr;
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
393

712fbcf38   Stephen Warren   checkpatch whites...
394
395
396
  	if (!image_check_magic(rd_hdr)) {
  		puts("Bad Magic Number
  ");
770605e4f   Simon Glass   bootstage: Replac...
397
  		bootstage_error(BOOTSTAGE_ID_RD_MAGIC);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
398
399
  		return NULL;
  	}
712fbcf38   Stephen Warren   checkpatch whites...
400
401
402
  	if (!image_check_hcrc(rd_hdr)) {
  		puts("Bad Header Checksum
  ");
770605e4f   Simon Glass   bootstage: Replac...
403
  		bootstage_error(BOOTSTAGE_ID_RD_HDR_CHECKSUM);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
404
405
  		return NULL;
  	}
770605e4f   Simon Glass   bootstage: Replac...
406
  	bootstage_mark(BOOTSTAGE_ID_RD_MAGIC);
712fbcf38   Stephen Warren   checkpatch whites...
407
  	image_print_contents(rd_hdr);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
408
409
410
  
  	if (verify) {
  		puts("   Verifying Checksum ... ");
712fbcf38   Stephen Warren   checkpatch whites...
411
412
413
  		if (!image_check_dcrc(rd_hdr)) {
  			puts("Bad Data CRC
  ");
770605e4f   Simon Glass   bootstage: Replac...
414
  			bootstage_error(BOOTSTAGE_ID_RD_CHECKSUM);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
415
416
417
418
419
  			return NULL;
  		}
  		puts("OK
  ");
  	}
770605e4f   Simon Glass   bootstage: Replac...
420
  	bootstage_mark(BOOTSTAGE_ID_RD_HDR_CHECKSUM);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
421

712fbcf38   Stephen Warren   checkpatch whites...
422
423
424
425
426
  	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...
427
  				genimg_get_arch_name(arch));
770605e4f   Simon Glass   bootstage: Replac...
428
  		bootstage_error(BOOTSTAGE_ID_RAMDISK);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
429
430
431
432
433
  		return NULL;
  	}
  
  	return rd_hdr;
  }
21d29f7f9   Heiko Schocher   bootm: make use o...
434
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
435
  #endif /* !USE_HOSTCC */
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
436
437
438
439
  
  /*****************************************************************************/
  /* Shared dual-format routines */
  /*****************************************************************************/
570abb0ad   Marian Balakowicz   [new uImage] Shar...
440
  #ifndef USE_HOSTCC
1cf0a8b2f   Joe Hershberger   env: Add a loadad...
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
  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 ...
460
  ulong env_get_bootm_low(void)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
461
  {
00caae6d4   Simon Glass   env: Rename geten...
462
  	char *s = env_get("bootm_low");
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
463
  	if (s) {
712fbcf38   Stephen Warren   checkpatch whites...
464
  		ulong tmp = simple_strtoul(s, NULL, 16);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
465
466
  		return tmp;
  	}
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
467
468
  #if defined(CONFIG_SYS_SDRAM_BASE)
  	return CONFIG_SYS_SDRAM_BASE;
afe45c87e   Marian Balakowicz   [new uImage] Fix ...
469
470
  #elif defined(CONFIG_ARM)
  	return gd->bd->bi_dram[0].start;
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
471
472
473
474
  #else
  	return 0;
  #endif
  }
723806cc5   Simon Glass   env: Rename some ...
475
  phys_size_t env_get_bootm_size(void)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
476
  {
0cb389dd1   Masahiro Yamada   image: fix getenv...
477
478
  	phys_size_t tmp, size;
  	phys_addr_t start;
00caae6d4   Simon Glass   env: Rename geten...
479
  	char *s = env_get("bootm_size");
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
480
  	if (s) {
712fbcf38   Stephen Warren   checkpatch whites...
481
  		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
482
483
  		return tmp;
  	}
0cb389dd1   Masahiro Yamada   image: fix getenv...
484
485
486
487
488
489
490
491
  
  #if defined(CONFIG_ARM) && defined(CONFIG_NR_DRAM_BANKS)
  	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...
492
  	s = env_get("bootm_low");
c519facc6   Matthew McClintock   Fix condition whe...
493
  	if (s)
712fbcf38   Stephen Warren   checkpatch whites...
494
  		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
c519facc6   Matthew McClintock   Fix condition whe...
495
  	else
0cb389dd1   Masahiro Yamada   image: fix getenv...
496
  		tmp = start;
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
497

0cb389dd1   Masahiro Yamada   image: fix getenv...
498
  	return size - (tmp - start);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
499
  }
723806cc5   Simon Glass   env: Rename some ...
500
  phys_size_t env_get_bootm_mapsize(void)
c3624e6ed   Grant Likely   Default to bootm_...
501
502
  {
  	phys_size_t tmp;
00caae6d4   Simon Glass   env: Rename geten...
503
  	char *s = env_get("bootm_mapsize");
c3624e6ed   Grant Likely   Default to bootm_...
504
  	if (s) {
712fbcf38   Stephen Warren   checkpatch whites...
505
  		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
c3624e6ed   Grant Likely   Default to bootm_...
506
507
508
509
510
511
  		return tmp;
  	}
  
  #if defined(CONFIG_SYS_BOOTMAPSZ)
  	return CONFIG_SYS_BOOTMAPSZ;
  #else
723806cc5   Simon Glass   env: Rename some ...
512
  	return env_get_bootm_size();
c3624e6ed   Grant Likely   Default to bootm_...
513
514
  #endif
  }
712fbcf38   Stephen Warren   checkpatch whites...
515
  void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
516
  {
54fa2c5b5   Larry Johnson   Move test for unn...
517
518
  	if (to == from)
  		return;
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
519
  #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
22cfddc2a   Sonic Zhang   memmove_wd: copy ...
520
521
522
523
  	if (to > from) {
  		from += len;
  		to += len;
  	}
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
524
525
  	while (len > 0) {
  		size_t tail = (len > chunksz) ? chunksz : len;
712fbcf38   Stephen Warren   checkpatch whites...
526
  		WATCHDOG_RESET();
22cfddc2a   Sonic Zhang   memmove_wd: copy ...
527
528
529
530
  		if (to > from) {
  			to -= tail;
  			from -= tail;
  		}
712fbcf38   Stephen Warren   checkpatch whites...
531
  		memmove(to, from, tail);
22cfddc2a   Sonic Zhang   memmove_wd: copy ...
532
533
534
535
  		if (to < from) {
  			to += tail;
  			from += tail;
  		}
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
536
537
538
  		len -= tail;
  	}
  #else	/* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */
712fbcf38   Stephen Warren   checkpatch whites...
539
  	memmove(to, from, len);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
540
541
  #endif	/* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
  }
570abb0ad   Marian Balakowicz   [new uImage] Shar...
542
  #endif /* !USE_HOSTCC */
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
543

712fbcf38   Stephen Warren   checkpatch whites...
544
  void genimg_print_size(uint32_t size)
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
545
  {
570abb0ad   Marian Balakowicz   [new uImage] Shar...
546
  #ifndef USE_HOSTCC
712fbcf38   Stephen Warren   checkpatch whites...
547
548
549
  	printf("%d Bytes = ", size);
  	print_size(size, "
  ");
570abb0ad   Marian Balakowicz   [new uImage] Shar...
550
  #else
cec85d4e0   xypron.glpk@gmx.de   common/image.c: U...
551
552
  	printf("%d Bytes = %.2f KiB = %.2f MiB
  ",
570abb0ad   Marian Balakowicz   [new uImage] Shar...
553
554
  			size, (double)size / 1.024e3,
  			(double)size / 1.048576e6);
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
555
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
556
  }
859e92b77   Simon Glass   image: Move times...
557
558
  #if IMAGE_ENABLE_TIMESTAMP
  void genimg_print_time(time_t timestamp)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
559
560
561
  {
  #ifndef USE_HOSTCC
  	struct rtc_time tm;
9f9276c34   Simon Glass   dm: rtc: Rename t...
562
  	rtc_to_tm(timestamp, &tm);
712fbcf38   Stephen Warren   checkpatch whites...
563
564
  	printf("%4d-%02d-%02d  %2d:%02d:%02d UTC
  ",
570abb0ad   Marian Balakowicz   [new uImage] Shar...
565
566
567
  			tm.tm_year, tm.tm_mon, tm.tm_mday,
  			tm.tm_hour, tm.tm_min, tm.tm_sec);
  #else
712fbcf38   Stephen Warren   checkpatch whites...
568
  	printf("%s", ctime(&timestamp));
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
569
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
570
  }
859e92b77   Simon Glass   image: Move times...
571
  #endif
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
572

5b9d44df2   Simon Glass   mkimage: Display ...
573
574
575
576
577
578
579
580
  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...
581
582
  static const char *unknown_msg(enum ih_category category)
  {
ae3de0d8c   Simon Glass   image: Protect ag...
583
  	static const char unknown_str[] = "Unknown ";
1426220b0   Simon Glass   image: Add functi...
584
  	static char msg[30];
ae3de0d8c   Simon Glass   image: Protect ag...
585
586
587
  	strcpy(msg, unknown_str);
  	strncat(msg, table_info[category].desc,
  		sizeof(msg) - sizeof(unknown_str));
1426220b0   Simon Glass   image: Add functi...
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
  
  	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...
649
650
651
652
653
654
655
656
657
658
659
660
661
662
  /**
   * 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...
663
  char *get_table_entry_name(const table_entry_t *table, char *msg, int id)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
664
  {
5b9d44df2   Simon Glass   mkimage: Display ...
665
666
667
  	table = get_table_entry(table, id);
  	if (!table)
  		return msg;
2e5167cca   Wolfgang Denk   Replace CONFIG_RE...
668
  #if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
5b9d44df2   Simon Glass   mkimage: Display ...
669
  	return table->lname;
e3d1ac7bb   Scott Wood   common/image.c: R...
670
  #else
5b9d44df2   Simon Glass   mkimage: Display ...
671
  	return table->lname + gd->reloc_off;
e3d1ac7bb   Scott Wood   common/image.c: R...
672
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
673
  }
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
674

712fbcf38   Stephen Warren   checkpatch whites...
675
  const char *genimg_get_os_name(uint8_t os)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
676
  {
712fbcf38   Stephen Warren   checkpatch whites...
677
  	return (get_table_entry_name(uimage_os, "Unknown OS", os));
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
678
  }
712fbcf38   Stephen Warren   checkpatch whites...
679
  const char *genimg_get_arch_name(uint8_t arch)
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
680
  {
712fbcf38   Stephen Warren   checkpatch whites...
681
682
  	return (get_table_entry_name(uimage_arch, "Unknown Architecture",
  					arch));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
683
  }
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
684

712fbcf38   Stephen Warren   checkpatch whites...
685
  const char *genimg_get_type_name(uint8_t type)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
686
  {
712fbcf38   Stephen Warren   checkpatch whites...
687
  	return (get_table_entry_name(uimage_type, "Unknown Image", type));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
688
  }
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
689

cef2e5148   Simon Glass   image: Add functi...
690
  static const char *genimg_get_short_name(const table_entry_t *table, int val)
5b9d44df2   Simon Glass   mkimage: Display ...
691
  {
cef2e5148   Simon Glass   image: Add functi...
692
  	table = get_table_entry(table, val);
5b9d44df2   Simon Glass   mkimage: Display ...
693
694
695
696
697
698
699
700
  	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...
701
702
703
704
  const char *genimg_get_type_short_name(uint8_t type)
  {
  	return genimg_get_short_name(uimage_type, type);
  }
712fbcf38   Stephen Warren   checkpatch whites...
705
  const char *genimg_get_comp_name(uint8_t comp)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
706
  {
712fbcf38   Stephen Warren   checkpatch whites...
707
708
  	return (get_table_entry_name(uimage_comp, "Unknown Compression",
  					comp));
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
709
  }
cef2e5148   Simon Glass   image: Add functi...
710
711
712
713
714
715
716
717
718
719
720
721
722
723
  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...
724
725
726
727
728
729
730
731
732
733
734
735
736
737
  /**
   * 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...
738
  int get_table_entry_id(const table_entry_t *table,
570abb0ad   Marian Balakowicz   [new uImage] Shar...
739
  		const char *table_name, const char *name)
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
740
  {
7edb186fc   Mike Frysinger   image: constify l...
741
  	const table_entry_t *t;
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
742

570abb0ad   Marian Balakowicz   [new uImage] Shar...
743
  	for (t = table; t->id >= 0; ++t) {
2e5167cca   Wolfgang Denk   Replace CONFIG_RE...
744
  #ifdef CONFIG_NEEDS_MANUAL_RELOC
5b9d44df2   Simon Glass   mkimage: Display ...
745
  		if (t->sname && strcasecmp(t->sname + gd->reloc_off, name) == 0)
2e5167cca   Wolfgang Denk   Replace CONFIG_RE...
746
  #else
5b9d44df2   Simon Glass   mkimage: Display ...
747
  		if (t->sname && strcasecmp(t->sname, name) == 0)
521af04d8   Peter Tyser   Conditionally per...
748
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
749
750
  			return (t->id);
  	}
712fbcf38   Stephen Warren   checkpatch whites...
751
752
  	debug("Invalid %s Type: %s
  ", table_name, name);
5b9d44df2   Simon Glass   mkimage: Display ...
753
754
  
  	return -1;
570abb0ad   Marian Balakowicz   [new uImage] Shar...
755
  }
712fbcf38   Stephen Warren   checkpatch whites...
756
  int genimg_get_os_id(const char *name)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
757
  {
712fbcf38   Stephen Warren   checkpatch whites...
758
  	return (get_table_entry_id(uimage_os, "OS", name));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
759
  }
712fbcf38   Stephen Warren   checkpatch whites...
760
  int genimg_get_arch_id(const char *name)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
761
  {
712fbcf38   Stephen Warren   checkpatch whites...
762
  	return (get_table_entry_id(uimage_arch, "CPU", name));
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
763
  }
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
764

712fbcf38   Stephen Warren   checkpatch whites...
765
  int genimg_get_type_id(const char *name)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
766
  {
712fbcf38   Stephen Warren   checkpatch whites...
767
  	return (get_table_entry_id(uimage_type, "Image", name));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
768
  }
712fbcf38   Stephen Warren   checkpatch whites...
769
  int genimg_get_comp_id(const char *name)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
770
  {
712fbcf38   Stephen Warren   checkpatch whites...
771
  	return (get_table_entry_id(uimage_comp, "Compression", name));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
772
773
774
  }
  
  #ifndef USE_HOSTCC
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
775
  /**
6c454fedf   Bryan Wu   image: fix bootm ...
776
777
   * genimg_get_kernel_addr_fit - get the real kernel address and return 2
   *                              FIT strings
0f64140b6   Bryan Wu   image: introduce ...
778
   * @img_addr: a string might contain real image address
6c454fedf   Bryan Wu   image: fix bootm ...
779
780
781
782
   * @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 ...
783
   *
6c454fedf   Bryan Wu   image: fix bootm ...
784
   * genimg_get_kernel_addr_fit get the real kernel start address from a string
0f64140b6   Bryan Wu   image: introduce ...
785
786
787
788
789
   * which is normally the first argv of bootm/bootz
   *
   * returns:
   *     kernel start address
   */
6c454fedf   Bryan Wu   image: fix bootm ...
790
791
792
  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 ...
793
  {
0f64140b6   Bryan Wu   image: introduce ...
794
795
796
797
798
799
800
801
  	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...
802
  #if CONFIG_IS_ENABLED(FIT)
0f64140b6   Bryan Wu   image: introduce ...
803
  	} else if (fit_parse_conf(img_addr, load_addr, &kernel_addr,
6c454fedf   Bryan Wu   image: fix bootm ...
804
  				  fit_uname_config)) {
0f64140b6   Bryan Wu   image: introduce ...
805
806
  		debug("*  kernel: config '%s' from image at 0x%08lx
  ",
6c454fedf   Bryan Wu   image: fix bootm ...
807
  		      *fit_uname_config, kernel_addr);
0f64140b6   Bryan Wu   image: introduce ...
808
  	} else if (fit_parse_subimage(img_addr, load_addr, &kernel_addr,
6c454fedf   Bryan Wu   image: fix bootm ...
809
  				     fit_uname_kernel)) {
0f64140b6   Bryan Wu   image: introduce ...
810
811
  		debug("*  kernel: subimage '%s' from image at 0x%08lx
  ",
6c454fedf   Bryan Wu   image: fix bootm ...
812
  		      *fit_uname_kernel, kernel_addr);
0f64140b6   Bryan Wu   image: introduce ...
813
814
815
816
817
818
819
820
821
822
823
824
  #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 ...
825
826
827
828
829
830
831
832
833
834
835
836
837
   * 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...
838
   * genimg_get_format - get image format type
fff888a19   Marian Balakowicz   [new uImage] Add ...
839
840
   * @img_addr: image start address
   *
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
841
   * genimg_get_format() checks whether provided address points to a valid
fff888a19   Marian Balakowicz   [new uImage] Add ...
842
843
   * legacy or FIT image.
   *
4efbe9dbb   Marian Balakowicz   [new uImage] Corr...
844
845
   * 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...
846
   * genimg_get_format() must be able to dectect libfdt header.
4efbe9dbb   Marian Balakowicz   [new uImage] Corr...
847
   *
fff888a19   Marian Balakowicz   [new uImage] Add ...
848
849
850
   * returns:
   *     image format type or IMAGE_FORMAT_INVALID if no image is present
   */
35e7b0f17   Simon Glass   sandbox: image: A...
851
  int genimg_get_format(const void *img_addr)
fff888a19   Marian Balakowicz   [new uImage] Add ...
852
  {
21d29f7f9   Heiko Schocher   bootm: make use o...
853
  #if defined(CONFIG_IMAGE_FORMAT_LEGACY)
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
854
  	const image_header_t *hdr;
fff888a19   Marian Balakowicz   [new uImage] Add ...
855

3a2003f61   Wolfgang Denk   tools/mkimage: fi...
856
  	hdr = (const image_header_t *)img_addr;
fff888a19   Marian Balakowicz   [new uImage] Add ...
857
  	if (image_check_magic(hdr))
21d29f7f9   Heiko Schocher   bootm: make use o...
858
859
  		return IMAGE_FORMAT_LEGACY;
  #endif
aa34fbc08   Simon Glass   fdt: Allow libfdt...
860
  #if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
21d29f7f9   Heiko Schocher   bootm: make use o...
861
862
  	if (fdt_check_header(img_addr) == 0)
  		return IMAGE_FORMAT_FIT;
9ace3fc81   Sebastian Siewior   image: add suppor...
863
864
  #endif
  #ifdef CONFIG_ANDROID_BOOT_IMAGE
21d29f7f9   Heiko Schocher   bootm: make use o...
865
866
  	if (android_image_check_header(img_addr) == 0)
  		return IMAGE_FORMAT_ANDROID;
fff888a19   Marian Balakowicz   [new uImage] Add ...
867
  #endif
21d29f7f9   Heiko Schocher   bootm: make use o...
868
  	return IMAGE_FORMAT_INVALID;
fff888a19   Marian Balakowicz   [new uImage] Add ...
869
870
871
  }
  
  /**
f773bea8e   Marian Balakowicz   [new uImage] Add ...
872
873
874
875
876
877
878
879
880
881
   * 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...
882
  int genimg_has_config(bootm_headers_t *images)
f773bea8e   Marian Balakowicz   [new uImage] Add ...
883
  {
73223f0e1   Simon Glass   Kconfig: Move CON...
884
  #if IMAGE_ENABLE_FIT
f773bea8e   Marian Balakowicz   [new uImage] Add ...
885
886
887
888
889
890
891
  	if (images->fit_uname_cfg)
  		return 1;
  #endif
  	return 0;
  }
  
  /**
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
892
   * boot_get_ramdisk - main ramdisk handling routine
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
893
894
   * @argc: command argument count
   * @argv: command argument list
8a5ea3e61   Marian Balakowicz   [new uImage] Move...
895
   * @images: pointer to the bootm images structure
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
896
897
898
899
   * @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...
900
   * boot_get_ramdisk() is responsible for finding a valid ramdisk image.
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
901
902
903
904
905
   * 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...
906
   *     0, if ramdisk image was found and valid, or skiped
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
907
908
   *     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...
909
   *
ea86b9e64   Kumar Gala   Prevent crash if ...
910
   *     1, if ramdisk image is found but corrupted, or invalid
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
911
   *     rd_start and rd_end are set to 0 if no ramdisk exists
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
912
   */
712fbcf38   Stephen Warren   checkpatch whites...
913
  int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
d985c8498   Marian Balakowicz   [new uImage] Remo...
914
  		uint8_t arch, ulong *rd_start, ulong *rd_end)
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
915
  {
d5934ad77   Marian Balakowicz   [new uImage] Add ...
916
  	ulong rd_addr, rd_load;
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
917
  	ulong rd_data, rd_len;
21d29f7f9   Heiko Schocher   bootm: make use o...
918
  #if defined(CONFIG_IMAGE_FORMAT_LEGACY)
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
919
  	const image_header_t *rd_hdr;
21d29f7f9   Heiko Schocher   bootm: make use o...
920
  #endif
35e7b0f17   Simon Glass   sandbox: image: A...
921
  	void *buf;
57d40ab70   Marek Vasut   RAMDISK: Fix unus...
922
  #ifdef CONFIG_SUPPORT_RAW_INITRD
017e1f3f9   Marek Vasut   BOOT: Add RAW ram...
923
  	char *end;
57d40ab70   Marek Vasut   RAMDISK: Fix unus...
924
  #endif
73223f0e1   Simon Glass   Kconfig: Move CON...
925
  #if IMAGE_ENABLE_FIT
f320a4d84   Simon Glass   bootm: Use select...
926
  	const char	*fit_uname_config = images->fit_uname_cfg;
d5934ad77   Marian Balakowicz   [new uImage] Add ...
927
928
  	const char	*fit_uname_ramdisk = NULL;
  	ulong		default_addr;
c87796483   Marian Balakowicz   [new uImage] Add ...
929
  	int		rd_noffset;
d5934ad77   Marian Balakowicz   [new uImage] Add ...
930
  #endif
983c72f47   Simon Glass   Clarify bootm OS ...
931
  	const char *select = NULL;
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
932

c87796483   Marian Balakowicz   [new uImage] Add ...
933
934
  	*rd_start = 0;
  	*rd_end = 0;
1fec3c5d8   Tom Rini   common/image.c: M...
935
936
937
938
939
  #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-...
940
  	if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)
1fec3c5d8   Tom Rini   common/image.c: M...
941
942
  		select = argv[0];
  #endif
983c72f47   Simon Glass   Clarify bootm OS ...
943
944
  	if (argc >= 2)
  		select = argv[1];
2dd46328f   Rob Herring   image: fix Androi...
945

d5934ad77   Marian Balakowicz   [new uImage] Add ...
946
947
948
949
  	/*
  	 * Look for a '-' which indicates to ignore the
  	 * ramdisk argument
  	 */
983c72f47   Simon Glass   Clarify bootm OS ...
950
  	if (select && strcmp(select, "-") ==  0) {
712fbcf38   Stephen Warren   checkpatch whites...
951
952
  		debug("## Skipping init Ramdisk
  ");
d5934ad77   Marian Balakowicz   [new uImage] Add ...
953
  		rd_len = rd_data = 0;
983c72f47   Simon Glass   Clarify bootm OS ...
954
  	} else if (select || genimg_has_config(images)) {
73223f0e1   Simon Glass   Kconfig: Move CON...
955
  #if IMAGE_ENABLE_FIT
983c72f47   Simon Glass   Clarify bootm OS ...
956
  		if (select) {
f773bea8e   Marian Balakowicz   [new uImage] Add ...
957
958
959
960
961
962
963
964
965
966
  			/*
  			 * 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 ...
967
968
  			if (fit_parse_conf(select, default_addr,
  					   &rd_addr, &fit_uname_config)) {
712fbcf38   Stephen Warren   checkpatch whites...
969
970
971
  				debug("*  ramdisk: config '%s' from image at "
  						"0x%08lx
  ",
f773bea8e   Marian Balakowicz   [new uImage] Add ...
972
  						fit_uname_config, rd_addr);
983c72f47   Simon Glass   Clarify bootm OS ...
973
  			} else if (fit_parse_subimage(select, default_addr,
f773bea8e   Marian Balakowicz   [new uImage] Add ...
974
  						&rd_addr, &fit_uname_ramdisk)) {
712fbcf38   Stephen Warren   checkpatch whites...
975
976
977
  				debug("*  ramdisk: subimage '%s' from image at "
  						"0x%08lx
  ",
f773bea8e   Marian Balakowicz   [new uImage] Add ...
978
979
  						fit_uname_ramdisk, rd_addr);
  			} else
d5934ad77   Marian Balakowicz   [new uImage] Add ...
980
  #endif
f773bea8e   Marian Balakowicz   [new uImage] Add ...
981
  			{
983c72f47   Simon Glass   Clarify bootm OS ...
982
  				rd_addr = simple_strtoul(select, NULL, 16);
712fbcf38   Stephen Warren   checkpatch whites...
983
984
985
  				debug("*  ramdisk: cmdline image address = "
  						"0x%08lx
  ",
f773bea8e   Marian Balakowicz   [new uImage] Add ...
986
987
  						rd_addr);
  			}
73223f0e1   Simon Glass   Kconfig: Move CON...
988
  #if IMAGE_ENABLE_FIT
f773bea8e   Marian Balakowicz   [new uImage] Add ...
989
990
  		} else {
  			/* use FIT configuration provided in first bootm
a51ec63b8   Simon Glass   image: Use fit_im...
991
992
  			 * command argument. If the property is not defined,
  			 * quit silently.
f773bea8e   Marian Balakowicz   [new uImage] Add ...
993
  			 */
35e7b0f17   Simon Glass   sandbox: image: A...
994
  			rd_addr = map_to_sysmem(images->fit_hdr_os);
a51ec63b8   Simon Glass   image: Use fit_im...
995
996
  			rd_noffset = fit_get_node_from_config(images,
  					FIT_RAMDISK_PROP, rd_addr);
bd86ef117   Paul Burton   image-fit: Fix fi...
997
  			if (rd_noffset == -ENOENT)
41266c9b5   Peter Tyser   FIT: Fix handling...
998
  				return 0;
a51ec63b8   Simon Glass   image: Use fit_im...
999
1000
  			else if (rd_noffset < 0)
  				return 1;
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1001
  		}
f773bea8e   Marian Balakowicz   [new uImage] Add ...
1002
  #endif
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1003

d5934ad77   Marian Balakowicz   [new uImage] Add ...
1004
1005
1006
1007
1008
  		/*
  		 * 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...
1009
1010
  		buf = map_sysmem(rd_addr, 0);
  		switch (genimg_get_format(buf)) {
21d29f7f9   Heiko Schocher   bootm: make use o...
1011
  #if defined(CONFIG_IMAGE_FORMAT_LEGACY)
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1012
  		case IMAGE_FORMAT_LEGACY:
712fbcf38   Stephen Warren   checkpatch whites...
1013
  			printf("## Loading init Ramdisk from Legacy "
c87796483   Marian Balakowicz   [new uImage] Add ...
1014
1015
  					"Image at %08lx ...
  ", rd_addr);
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1016

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

c87796483   Marian Balakowicz   [new uImage] Add ...
1021
  			if (rd_hdr == NULL)
274cea2bd   Kumar Gala   [new uImage] rewo...
1022
  				return 1;
274cea2bd   Kumar Gala   [new uImage] rewo...
1023

712fbcf38   Stephen Warren   checkpatch whites...
1024
1025
1026
  			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 ...
1027
  			break;
21d29f7f9   Heiko Schocher   bootm: make use o...
1028
  #endif
73223f0e1   Simon Glass   Kconfig: Move CON...
1029
  #if IMAGE_ENABLE_FIT
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1030
  		case IMAGE_FORMAT_FIT:
126cc8642   Simon Glass   image: Remove the...
1031
  			rd_noffset = fit_image_load(images,
a51ec63b8   Simon Glass   image: Use fit_im...
1032
  					rd_addr, &fit_uname_ramdisk,
f320a4d84   Simon Glass   bootm: Use select...
1033
  					&fit_uname_config, arch,
a51ec63b8   Simon Glass   image: Use fit_im...
1034
1035
  					IH_TYPE_RAMDISK,
  					BOOTSTAGE_ID_FIT_RD_START,
fe20a81a6   Simon Glass   Fix test failure ...
1036
1037
  					FIT_LOAD_OPTIONAL_NON_ZERO,
  					&rd_data, &rd_len);
a51ec63b8   Simon Glass   image: Use fit_im...
1038
  			if (rd_noffset < 0)
c78fce699   Michal Simek   FIS: repare incor...
1039
  				return 1;
c87796483   Marian Balakowicz   [new uImage] Add ...
1040

a51ec63b8   Simon Glass   image: Use fit_im...
1041
  			images->fit_hdr_rd = map_sysmem(rd_addr, 0);
c87796483   Marian Balakowicz   [new uImage] Add ...
1042
  			images->fit_uname_rd = fit_uname_ramdisk;
3dfe11014   Marian Balakowicz   [new uImage] Add ...
1043
  			images->fit_noffset_rd = rd_noffset;
c87796483   Marian Balakowicz   [new uImage] Add ...
1044
  			break;
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1045
  #endif
2dd46328f   Rob Herring   image: fix Androi...
1046
1047
1048
1049
1050
1051
  #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 ...
1052
  		default:
017e1f3f9   Marek Vasut   BOOT: Add RAW ram...
1053
  #ifdef CONFIG_SUPPORT_RAW_INITRD
983c72f47   Simon Glass   Clarify bootm OS ...
1054
1055
1056
1057
  			end = NULL;
  			if (select)
  				end = strchr(select, ':');
  			if (end) {
017e1f3f9   Marek Vasut   BOOT: Add RAW ram...
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
  				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 ...
1068
  		}
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1069
  	} else if (images->legacy_hdr_valid &&
712fbcf38   Stephen Warren   checkpatch whites...
1070
1071
  			image_check_type(&images->legacy_hdr_os_copy,
  						IH_TYPE_MULTI)) {
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1072
  		/*
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1073
1074
  		 * Now check if we have a legacy mult-component image,
  		 * get second entry data start address and len.
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1075
  		 */
770605e4f   Simon Glass   bootstage: Replac...
1076
  		bootstage_mark(BOOTSTAGE_ID_RAMDISK);
712fbcf38   Stephen Warren   checkpatch whites...
1077
  		printf("## Loading init Ramdisk from multi component "
c87796483   Marian Balakowicz   [new uImage] Add ...
1078
1079
  				"Legacy Image at %08lx ...
  ",
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1080
  				(ulong)images->legacy_hdr_os);
712fbcf38   Stephen Warren   checkpatch whites...
1081
  		image_multi_getimg(images->legacy_hdr_os, 1, &rd_data, &rd_len);
2dd46328f   Rob Herring   image: fix Androi...
1082
  	} else {
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1083
1084
1085
  		/*
  		 * no initrd image
  		 */
770605e4f   Simon Glass   bootstage: Replac...
1086
  		bootstage_mark(BOOTSTAGE_ID_NO_RAMDISK);
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1087
1088
1089
1090
  		rd_len = rd_data = 0;
  	}
  
  	if (!rd_data) {
712fbcf38   Stephen Warren   checkpatch whites...
1091
1092
  		debug("## No init Ramdisk
  ");
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1093
1094
1095
1096
  	} else {
  		*rd_start = rd_data;
  		*rd_end = rd_data + rd_len;
  	}
712fbcf38   Stephen Warren   checkpatch whites...
1097
1098
  	debug("   ramdisk start = 0x%08lx, ramdisk end = 0x%08lx
  ",
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1099
  			*rd_start, *rd_end);
274cea2bd   Kumar Gala   [new uImage] rewo...
1100
1101
  
  	return 0;
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1102
  }
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1103

fca43cc80   John Rigby   boot: change some...
1104
  #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1105
  /**
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1106
   * boot_ramdisk_high - relocate init ramdisk
e822d7fc4   Kumar Gala   [new uImage] Use ...
1107
   * @lmb: pointer to lmb handle, will be used for memory mgmt
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1108
1109
   * @rd_data: ramdisk data start address
   * @rd_len: ramdisk data length
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1110
1111
1112
1113
1114
   * @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...
1115
   * boot_ramdisk_high() takes a relocation hint from "initrd_high" environment
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1116
1117
   * variable and if requested ramdisk data is moved to a specified location.
   *
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1118
1119
1120
1121
   * 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...
1122
   * returns:
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1123
1124
   *      0 - success
   *     -1 - failure
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1125
   */
712fbcf38   Stephen Warren   checkpatch whites...
1126
  int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
e822d7fc4   Kumar Gala   [new uImage] Use ...
1127
  		  ulong *initrd_start, ulong *initrd_end)
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1128
1129
1130
1131
  {
  	char	*s;
  	ulong	initrd_high;
  	int	initrd_copy_to_ram = 1;
00caae6d4   Simon Glass   env: Rename geten...
1132
1133
  	s = env_get("initrd_high");
  	if (s) {
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1134
1135
1136
  		/* 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...
1137
  		initrd_high = simple_strtoul(s, NULL, 16);
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1138
1139
1140
  		if (initrd_high == ~0)
  			initrd_copy_to_ram = 0;
  	} else {
723806cc5   Simon Glass   env: Rename some ...
1141
  		initrd_high = env_get_bootm_mapsize() + env_get_bootm_low();
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1142
  	}
95d449ad4   Marian Balakowicz   Avoid initrd and ...
1143

712fbcf38   Stephen Warren   checkpatch whites...
1144
1145
  	debug("## initrd_high = 0x%08lx, copy_to_ram = %d
  ",
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1146
1147
1148
1149
  			initrd_high, initrd_copy_to_ram);
  
  	if (rd_data) {
  		if (!initrd_copy_to_ram) {	/* zero-copy ramdisk support */
712fbcf38   Stephen Warren   checkpatch whites...
1150
1151
  			debug("   in-place initrd
  ");
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1152
1153
  			*initrd_start = rd_data;
  			*initrd_end = rd_data + rd_len;
e822d7fc4   Kumar Gala   [new uImage] Use ...
1154
  			lmb_reserve(lmb, rd_data, rd_len);
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1155
  		} else {
e822d7fc4   Kumar Gala   [new uImage] Use ...
1156
  			if (initrd_high)
712fbcf38   Stephen Warren   checkpatch whites...
1157
1158
  				*initrd_start = (ulong)lmb_alloc_base(lmb,
  						rd_len, 0x1000, initrd_high);
e822d7fc4   Kumar Gala   [new uImage] Use ...
1159
  			else
712fbcf38   Stephen Warren   checkpatch whites...
1160
1161
  				*initrd_start = (ulong)lmb_alloc(lmb, rd_len,
  								 0x1000);
e822d7fc4   Kumar Gala   [new uImage] Use ...
1162
1163
  
  			if (*initrd_start == 0) {
712fbcf38   Stephen Warren   checkpatch whites...
1164
1165
  				puts("ramdisk - allocation error
  ");
e822d7fc4   Kumar Gala   [new uImage] Use ...
1166
  				goto error;
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1167
  			}
770605e4f   Simon Glass   bootstage: Replac...
1168
  			bootstage_mark(BOOTSTAGE_ID_COPY_RAMDISK);
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1169
1170
  
  			*initrd_end = *initrd_start + rd_len;
712fbcf38   Stephen Warren   checkpatch whites...
1171
  			printf("   Loading Ramdisk to %08lx, end %08lx ... ",
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1172
  					*initrd_start, *initrd_end);
712fbcf38   Stephen Warren   checkpatch whites...
1173
  			memmove_wd((void *)*initrd_start,
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1174
  					(void *)rd_data, rd_len, CHUNKSZ);
3b2001105   Kumar Gala   powerpc/bootm: Fl...
1175
1176
1177
1178
1179
1180
  #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: ...
1181
1182
  			flush_cache((unsigned long)*initrd_start,
  				    ALIGN(rd_len, ARCH_DMA_MINALIGN));
3b2001105   Kumar Gala   powerpc/bootm: Fl...
1183
  #endif
712fbcf38   Stephen Warren   checkpatch whites...
1184
1185
  			puts("OK
  ");
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1186
1187
1188
1189
1190
  		}
  	} else {
  		*initrd_start = 0;
  		*initrd_end = 0;
  	}
712fbcf38   Stephen Warren   checkpatch whites...
1191
1192
  	debug("   ramdisk load start = 0x%08lx, ramdisk load end = 0x%08lx
  ",
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1193
  			*initrd_start, *initrd_end);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1194

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

e822d7fc4   Kumar Gala   [new uImage] Use ...
1197
1198
  error:
  	return -1;
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1199
  }
fca43cc80   John Rigby   boot: change some...
1200
  #endif /* CONFIG_SYS_BOOT_RAMDISK_HIGH */
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1201

90268b878   Simon Glass   x86: Support load...
1202
1203
1204
  int boot_get_setup(bootm_headers_t *images, uint8_t arch,
  		   ulong *setup_start, ulong *setup_len)
  {
73223f0e1   Simon Glass   Kconfig: Move CON...
1205
  #if IMAGE_ENABLE_FIT
90268b878   Simon Glass   x86: Support load...
1206
1207
1208
1209
1210
  	return boot_get_setup_fit(images, arch, setup_start, setup_len);
  #else
  	return -ENOENT;
  #endif
  }
73223f0e1   Simon Glass   Kconfig: Move CON...
1211
  #if IMAGE_ENABLE_FIT
8b93a92f6   Goldschmidt Simon   fpga: allow progr...
1212
  #if defined(CONFIG_FPGA)
62afc6018   Michal Simek   image: Add boot_g...
1213
1214
1215
1216
1217
1218
1219
  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 ...
1220
  	const char *uname, *name;
62afc6018   Michal Simek   image: Add boot_g...
1221
1222
  	int err;
  	int devnum = 0; /* TODO support multi fpga platforms */
62afc6018   Michal Simek   image: Add boot_g...
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
  
  	/* 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...
1233
1234
  	 */
  	tmp_img_addr = map_to_sysmem(images->fit_hdr_os);
62afc6018   Michal Simek   image: Add boot_g...
1235
1236
1237
1238
1239
1240
1241
1242
  	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 ...
1243
1244
1245
  		uname = fdt_stringlist_get(buf, conf_noffset, FIT_FPGA_PROP, 0,
  					   NULL);
  		if (!uname) {
62afc6018   Michal Simek   image: Add boot_g...
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
  			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...
1268
  		if (!fpga_is_partial_data(devnum, img_len)) {
62afc6018   Michal Simek   image: Add boot_g...
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
  			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...
1283
  		if (err)
611a9428c   Michal Simek   common: Fix logic...
1284
1285
1286
1287
  			return err;
  
  		printf("   Programming %s bitstream... OK
  ", name);
62afc6018   Michal Simek   image: Add boot_g...
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
  		break;
  	default:
  		printf("The given image format is not supported (corrupt?)
  ");
  		return 1;
  	}
  
  	return 0;
  }
  #endif
d7be50921   Andrew F. Davis   image: Add FIT im...
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
  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...
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
  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 ...
1331
  	const char *uname;
d7be50921   Andrew F. Davis   image: Add FIT im...
1332
  	uint8_t img_type;
84a07dbfd   Karl Apsite   add boot_get_load...
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
  
  	/* 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...
1343
1344
  	 */
  	tmp_img_addr = map_to_sysmem(images->fit_hdr_os);
84a07dbfd   Karl Apsite   add boot_get_load...
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
  	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 ...
1355
1356
1357
  		     uname = fdt_stringlist_get(buf, conf_noffset,
  					FIT_LOADABLE_PROP, loadables_index,
  					NULL), uname;
84a07dbfd   Karl Apsite   add boot_get_load...
1358
1359
1360
1361
  		     loadables_index++)
  		{
  			fit_img_result = fit_image_load(images,
  				tmp_img_addr,
b02e4044f   Simon Glass   libfdt: Bring in ...
1362
  				&uname,
84a07dbfd   Karl Apsite   add boot_get_load...
1363
1364
1365
1366
1367
1368
1369
1370
1371
  				&(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...
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
  
  			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...
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
  		}
  		break;
  	default:
  		printf("The given image format is not supported (corrupt?)
  ");
  		return 1;
  	}
  
  	return 0;
  }
  #endif
fca43cc80   John Rigby   boot: change some...
1398
  #ifdef CONFIG_SYS_BOOT_GET_CMDLINE
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1399
  /**
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1400
   * boot_get_cmdline - allocate and initialize kernel cmdline
e822d7fc4   Kumar Gala   [new uImage] Use ...
1401
   * @lmb: pointer to lmb handle, will be used for memory mgmt
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1402
1403
1404
   * @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...
1405
   * boot_get_cmdline() allocates space for kernel command line below
919d25c92   Shyam Saini   u-boot: Fix sever...
1406
   * BOOTMAPSZ + env_get_bootm_low() address. If "bootargs" U-Boot environment
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1407
1408
1409
1410
   * variable is present its contents is copied to allocated kernel
   * command line.
   *
   * returns:
e822d7fc4   Kumar Gala   [new uImage] Use ...
1411
1412
   *      0 - success
   *     -1 - failure
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1413
   */
712fbcf38   Stephen Warren   checkpatch whites...
1414
  int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1415
1416
1417
  {
  	char *cmdline;
  	char *s;
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
1418
  	cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf,
723806cc5   Simon Glass   env: Rename some ...
1419
  				env_get_bootm_mapsize() + env_get_bootm_low());
e822d7fc4   Kumar Gala   [new uImage] Use ...
1420
1421
1422
  
  	if (cmdline == NULL)
  		return -1;
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1423

00caae6d4   Simon Glass   env: Rename geten...
1424
1425
  	s = env_get("bootargs");
  	if (!s)
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1426
1427
1428
1429
1430
1431
  		s = "";
  
  	strcpy(cmdline, s);
  
  	*cmd_start = (ulong) & cmdline[0];
  	*cmd_end = *cmd_start + strlen(cmdline);
712fbcf38   Stephen Warren   checkpatch whites...
1432
1433
  	debug("## cmdline at 0x%08lx ... 0x%08lx
  ", *cmd_start, *cmd_end);
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1434

e822d7fc4   Kumar Gala   [new uImage] Use ...
1435
  	return 0;
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1436
  }
fca43cc80   John Rigby   boot: change some...
1437
  #endif /* CONFIG_SYS_BOOT_GET_CMDLINE */
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1438

fca43cc80   John Rigby   boot: change some...
1439
  #ifdef CONFIG_SYS_BOOT_GET_KBD
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1440
  /**
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1441
   * boot_get_kbd - allocate and initialize kernel copy of board info
e822d7fc4   Kumar Gala   [new uImage] Use ...
1442
   * @lmb: pointer to lmb handle, will be used for memory mgmt
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1443
1444
   * @kbd: double pointer to board info data
   *
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1445
   * boot_get_kbd() allocates space for kernel copy of board info data below
723806cc5   Simon Glass   env: Rename some ...
1446
   * BOOTMAPSZ + env_get_bootm_low() address and kernel board info is initialized
590d3cacb   Grant Likely   Stop passing arou...
1447
   * with the current u-boot board info data.
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1448
1449
   *
   * returns:
e822d7fc4   Kumar Gala   [new uImage] Use ...
1450
1451
   *      0 - success
   *     -1 - failure
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1452
   */
712fbcf38   Stephen Warren   checkpatch whites...
1453
  int boot_get_kbd(struct lmb *lmb, bd_t **kbd)
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1454
  {
391fd93ab   Becky Bruce   Change lmb to use...
1455
  	*kbd = (bd_t *)(ulong)lmb_alloc_base(lmb, sizeof(bd_t), 0xf,
723806cc5   Simon Glass   env: Rename some ...
1456
  				env_get_bootm_mapsize() + env_get_bootm_low());
e822d7fc4   Kumar Gala   [new uImage] Use ...
1457
1458
  	if (*kbd == NULL)
  		return -1;
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1459
  	**kbd = *(gd->bd);
712fbcf38   Stephen Warren   checkpatch whites...
1460
1461
  	debug("## kernel board info at 0x%08lx
  ", (ulong)*kbd);
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1462
1463
1464
1465
  
  #if defined(DEBUG) && defined(CONFIG_CMD_BDI)
  	do_bdinfo(NULL, 0, 0, NULL);
  #endif
e822d7fc4   Kumar Gala   [new uImage] Use ...
1466
  	return 0;
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1467
  }
fca43cc80   John Rigby   boot: change some...
1468
  #endif /* CONFIG_SYS_BOOT_GET_KBD */
13d06981a   Simon Glass   image: Add device...
1469
1470
1471
1472
1473
1474
  
  #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...
1475
  	struct lmb *lmb = &images->lmb;
13d06981a   Simon Glass   image: Add device...
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
  	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...
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
  
  	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 ...
1506
  #endif /* !USE_HOSTCC */