Blame view

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

b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
10
  #ifndef USE_HOSTCC
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
11
12
13
14
15
16
17
18
19
20
  #include <common.h>
  #include <watchdog.h>
  
  #ifdef CONFIG_SHOW_BOOT_PROGRESS
  #include <status_led.h>
  #endif
  
  #ifdef CONFIG_HAS_DATAFLASH
  #include <dataflash.h>
  #endif
95d449ad4   Marian Balakowicz   Avoid initrd and ...
21
22
23
  #ifdef CONFIG_LOGBUFFER
  #include <logbuff.h>
  #endif
2242f5369   Marian Balakowicz   [new uImage] Rena...
24
  #include <rtc.h>
2242f5369   Marian Balakowicz   [new uImage] Rena...
25

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

aa34fbc08   Simon Glass   fdt: Allow libfdt...
30
  #if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
fff888a19   Marian Balakowicz   [new uImage] Add ...
31
32
  #include <libfdt.h>
  #include <fdt_support.h>
c87796483   Marian Balakowicz   [new uImage] Add ...
33
  #endif
20a14a42a   Andy Fleming   Rename include/md...
34
  #include <u-boot/md5.h>
2b9912e6a   Jeroen Hofstee   includes: move op...
35
  #include <u-boot/sha1.h>
a51ec63b8   Simon Glass   image: Use fit_im...
36
  #include <asm/errno.h>
35e7b0f17   Simon Glass   sandbox: image: A...
37
  #include <asm/io.h>
c87796483   Marian Balakowicz   [new uImage] Add ...
38

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

21d29f7f9   Heiko Schocher   bootm: make use o...
45
  #if defined(CONFIG_IMAGE_FORMAT_LEGACY)
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>
13d06981a   Simon Glass   image: Add device...
61
62
63
  #ifndef CONFIG_SYS_BARGSIZE
  #define CONFIG_SYS_BARGSIZE 512
  #endif
7edb186fc   Mike Frysinger   image: constify l...
64
  static const table_entry_t uimage_arch[] = {
570abb0ad   Marian Balakowicz   [new uImage] Shar...
65
66
67
68
69
70
71
72
73
  	{	IH_ARCH_INVALID,	NULL,		"Invalid ARCH",	},
  	{	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...
74
  	{	IH_ARCH_NIOS2,		"nios2",	"NIOS II",	},
e419e12d0   Grant Erickson   Recognize 'powerp...
75
  	{	IH_ARCH_PPC,		"powerpc",	"PowerPC",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
76
77
78
79
80
81
82
  	{	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...
83
  	{	IH_ARCH_NDS32,		"nds32",	"NDS32",	},
3ddcaccda   Stefan Kristiansson   openrisc: Add arc...
84
  	{	IH_ARCH_OPENRISC,	"or1k",		"OpenRISC 1000",},
35e7b0f17   Simon Glass   sandbox: image: A...
85
  	{	IH_ARCH_SANDBOX,	"sandbox",	"Sandbox",	},
0ae765312   David Feng   arm64: core support
86
  	{	IH_ARCH_ARM64,		"arm64",	"AArch64",	},
bc5d54288   Alexey Brodkin   arc: bdinfo, imag...
87
  	{	IH_ARCH_ARC,		"arc",		"ARC",		},
5bda35cff   Simon Glass   x86: image: Add n...
88
  	{	IH_ARCH_X86_64,		"x86_64",	"AMD x86_64",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
89
90
  	{	-1,			"",		"",		},
  };
7edb186fc   Mike Frysinger   image: constify l...
91
  static const table_entry_t uimage_os[] = {
570abb0ad   Marian Balakowicz   [new uImage] Shar...
92
  	{	IH_OS_INVALID,	NULL,		"Invalid OS",		},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
93
94
95
96
97
  	{	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...
98
  	{	IH_OS_OSE,	"ose",		"Enea OSE",		},
04d414090   Steven Stallion   image: Add suppor...
99
  	{	IH_OS_PLAN9,	"plan9",	"Plan 9",		},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
100
101
  	{	IH_OS_RTEMS,	"rtems",	"RTEMS",		},
  	{	IH_OS_U_BOOT,	"u-boot",	"U-Boot",		},
68b15e831   miao.yan@windriver.com   common/image.c: m...
102
  	{	IH_OS_VXWORKS,	"vxworks",	"VxWorks",		},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
103
104
  #if defined(CONFIG_CMD_ELF) || defined(USE_HOSTCC)
  	{	IH_OS_QNX,	"qnx",		"QNX",			},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
105
  #endif
f5ed9e390   Peter Tyser   Add support for b...
106
107
108
  #if defined(CONFIG_INTEGRITY) || defined(USE_HOSTCC)
  	{	IH_OS_INTEGRITY,"integrity",	"INTEGRITY",		},
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
109
110
111
112
113
114
115
116
117
118
119
120
121
  #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...
122
123
124
  #if defined(CONFIG_BOOTM_OPENRTOS) || defined(USE_HOSTCC)
  	{	IH_OS_OPENRTOS,	"openrtos",	"OpenRTOS",		},
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
125
126
  	{	-1,		"",		"",			},
  };
7edb186fc   Mike Frysinger   image: constify l...
127
  static const table_entry_t uimage_type[] = {
4962e38e9   Stefano Babic   mkimage: adding s...
128
  	{	IH_TYPE_AISIMAGE,   "aisimage",   "Davinci AIS image",},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
129
130
  	{	IH_TYPE_FILESYSTEM, "filesystem", "Filesystem Image",	},
  	{	IH_TYPE_FIRMWARE,   "firmware",	  "Firmware",		},
3decb14ab   John Rigby   mkimage: Add OMAP...
131
  	{	IH_TYPE_FLATDT,     "flat_dt",    "Flat Device Tree",	},
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
132
  	{	IH_TYPE_GPIMAGE,    "gpimage",    "TI Keystone SPL Image",},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
133
  	{	IH_TYPE_KERNEL,	    "kernel",	  "Kernel Image",	},
b9b50e89d   Stephen Warren   image: Implement ...
134
  	{	IH_TYPE_KERNEL_NOLOAD, "kernel_noload",  "Kernel Image (no loading done)", },
4962e38e9   Stefano Babic   mkimage: adding s...
135
136
137
  	{	IH_TYPE_KWBIMAGE,   "kwbimage",   "Kirkwood Boot Image",},
  	{	IH_TYPE_IMXIMAGE,   "imximage",   "Freescale i.MX Boot Image",},
  	{	IH_TYPE_INVALID,    NULL,	  "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",		},
832472a94   Charles Manning   tools: socfpga: A...
143
  	{	IH_TYPE_SOCFPGAIMAGE, "socfpgaimage", "Altera SOCFPGA preloader",},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
144
  	{	IH_TYPE_STANDALONE, "standalone", "Standalone Program", },
7816f2cf8   Heiko Schocher   mkimage: add UBL ...
145
  	{	IH_TYPE_UBLIMAGE,   "ublimage",   "Davinci UBL image",},
bce883707   Marek Vasut   ARM: mxs: tools: ...
146
  	{	IH_TYPE_MXSIMAGE,   "mxsimage",   "Freescale MXS Boot Image",},
7b1a41174   Andreas Bießmann   mkimage: add atme...
147
  	{	IH_TYPE_ATMELIMAGE, "atmelimage", "ATMEL ROM-Boot Image",},
90268b878   Simon Glass   x86: Support load...
148
  	{	IH_TYPE_X86_SETUP,  "x86_setup",  "x86 setup.bin",    },
39f520bb6   Albert ARIBAUD \(3ADEV\)   lpc32xx: add lpc3...
149
  	{	IH_TYPE_LPC32XXIMAGE, "lpc32xximage",  "LPC32XX Boot Image", },
a131c1f44   Simon Glass   rockchip: Add the...
150
  	{	IH_TYPE_RKIMAGE,    "rkimage",    "Rockchip Boot Image" },
f9a3c278b   Simon Glass   rockchip: Add sup...
151
  	{	IH_TYPE_RKSD,       "rksd",       "Rockchip SD Boot Image" },
10b84fe1b   Simon Glass   rockchip: Add sup...
152
  	{	IH_TYPE_RKSPI,      "rkspi",      "Rockchip SPI Boot Image" },
66eef1e78   Nathan Rossi   tools: zynqimage:...
153
  	{	IH_TYPE_ZYNQIMAGE,  "zynqimage",  "Xilinx Zynq Boot Image" },
570abb0ad   Marian Balakowicz   [new uImage] Shar...
154
155
  	{	-1,		    "",		  "",			},
  };
7edb186fc   Mike Frysinger   image: constify l...
156
  static const table_entry_t uimage_comp[] = {
570abb0ad   Marian Balakowicz   [new uImage] Shar...
157
158
159
  	{	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...
160
  	{	IH_COMP_LZMA,	"lzma",		"lzma compressed",	},
20dde48bc   Peter Korsgaard   add lzop decompre...
161
  	{	IH_COMP_LZO,	"lzo",		"lzo compressed",	},
027b728d4   Julius Werner   Add support for L...
162
  	{	IH_COMP_LZ4,	"lz4",		"lz4 compressed",	},
570abb0ad   Marian Balakowicz   [new uImage] Shar...
163
164
  	{	-1,		"",		"",			},
  };
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
165
166
167
  /*****************************************************************************/
  /* Legacy format routines */
  /*****************************************************************************/
712fbcf38   Stephen Warren   checkpatch whites...
168
  int image_check_hcrc(const image_header_t *hdr)
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
169
170
  {
  	ulong hcrc;
712fbcf38   Stephen Warren   checkpatch whites...
171
  	ulong len = image_get_header_size();
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
172
173
174
  	image_header_t header;
  
  	/* Copy header so we can blank CRC field for re-calculation */
712fbcf38   Stephen Warren   checkpatch whites...
175
176
  	memmove(&header, (char *)hdr, image_get_header_size());
  	image_set_hcrc(&header, 0);
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
177

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

712fbcf38   Stephen Warren   checkpatch whites...
180
  	return (hcrc == image_get_hcrc(hdr));
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
181
  }
712fbcf38   Stephen Warren   checkpatch whites...
182
  int image_check_dcrc(const image_header_t *hdr)
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
183
  {
712fbcf38   Stephen Warren   checkpatch whites...
184
185
186
  	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...
187

712fbcf38   Stephen Warren   checkpatch whites...
188
  	return (dcrc == image_get_dcrc(hdr));
b97a2a0a2   Marian Balakowicz   [new uImage] Defi...
189
  }
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
190
191
192
193
194
195
196
197
198
199
200
201
202
  /**
   * 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...
203
  ulong image_multi_count(const image_header_t *hdr)
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
204
205
  {
  	ulong i, count = 0;
df6f1b895   Marian Balakowicz   [new uImage] Fix ...
206
  	uint32_t *size;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
207
208
209
  
  	/* 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...
210
  	size = (uint32_t *)image_get_data(hdr);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
  
  	/* 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...
236
  void image_multi_getimg(const image_header_t *hdr, ulong idx,
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
237
238
239
  			ulong *data, ulong *len)
  {
  	int i;
df6f1b895   Marian Balakowicz   [new uImage] Fix ...
240
  	uint32_t *size;
02b9b2244   Nick Spence   Fix offset calcul...
241
  	ulong offset, count, img_data;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
242
243
  
  	/* get number of component */
712fbcf38   Stephen Warren   checkpatch whites...
244
  	count = image_multi_count(hdr);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
245
246
247
  
  	/* 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...
248
  	size = (uint32_t *)image_get_data(hdr);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
249
250
251
  
  	/* get address of the proper component data start, which means
  	 * skipping sizes table (add 1 for last, null entry) */
712fbcf38   Stephen Warren   checkpatch whites...
252
  	img_data = image_get_data(hdr) + (count + 1) * sizeof(uint32_t);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
253
254
  
  	if (idx < count) {
712fbcf38   Stephen Warren   checkpatch whites...
255
  		*len = uimage_to_cpu(size[idx]);
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
256
  		offset = 0;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
257
258
259
  
  		/* go over all indices preceding requested component idx */
  		for (i = 0; i < idx; i++) {
02b9b2244   Nick Spence   Fix offset calcul...
260
  			/* add up i-th component size, rounding up to 4 bytes */
712fbcf38   Stephen Warren   checkpatch whites...
261
  			offset += (uimage_to_cpu(size[i]) + 3) & ~3 ;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
262
263
264
  		}
  
  		/* calculate idx-th component data address */
02b9b2244   Nick Spence   Fix offset calcul...
265
  		*data = img_data + offset;
f13e7b2e9   Marian Balakowicz   [new uImage] Clea...
266
267
268
269
270
  	} else {
  		*len = 0;
  		*data = 0;
  	}
  }
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
271

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

712fbcf38   Stephen Warren   checkpatch whites...
276
277
278
279
  	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...
280

712fbcf38   Stephen Warren   checkpatch whites...
281
282
  	printf("%s %s %s (%s)
  ", arch, os, type, comp);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
283
  }
5dfb52138   Marian Balakowicz   [new uImage] New ...
284
  /**
edbed247a   Bartlomiej Sieka   Memory footprint ...
285
   * image_print_contents - prints out the contents of the legacy format image
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
286
   * @ptr: pointer to the legacy format image header
5dfb52138   Marian Balakowicz   [new uImage] New ...
287
288
   * @p: pointer to prefix string
   *
edbed247a   Bartlomiej Sieka   Memory footprint ...
289
   * image_print_contents() formats a multi line legacy image contents description.
5dfb52138   Marian Balakowicz   [new uImage] New ...
290
291
292
293
294
295
   * 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...
296
  void image_print_contents(const void *ptr)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
297
  {
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
298
  	const image_header_t *hdr = (const image_header_t *)ptr;
80402f34f   Heiko Schocher   spl, common, seri...
299
  	const char __maybe_unused *p;
edbed247a   Bartlomiej Sieka   Memory footprint ...
300

1fe7d9389   Simon Glass   image: Remove rem...
301
  	p = IMAGE_INDENT_STRING;
712fbcf38   Stephen Warren   checkpatch whites...
302
303
  	printf("%sImage Name:   %.*s
  ", p, IH_NMLEN, image_get_name(hdr));
859e92b77   Simon Glass   image: Move times...
304
305
306
307
  	if (IMAGE_ENABLE_TIMESTAMP) {
  		printf("%sCreated:      ", p);
  		genimg_print_time((time_t)image_get_time(hdr));
  	}
712fbcf38   Stephen Warren   checkpatch whites...
308
309
310
311
312
313
314
315
316
317
318
  	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...
319
320
  		int i;
  		ulong data, len;
712fbcf38   Stephen Warren   checkpatch whites...
321
  		ulong count = image_multi_count(hdr);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
322

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

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

712fbcf38   Stephen Warren   checkpatch whites...
331
  			if (image_check_type(hdr, IH_TYPE_SCRIPT) && i > 0) {
570abb0ad   Marian Balakowicz   [new uImage] Shar...
332
333
334
335
336
  				/*
  				 * the user may need to know offsets
  				 * if planning to do something with
  				 * multiple files
  				 */
712fbcf38   Stephen Warren   checkpatch whites...
337
338
  				printf("%s    Offset = 0x%08lx
  ", p, data);
570abb0ad   Marian Balakowicz   [new uImage] Shar...
339
  			}
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
340
341
342
  		}
  	}
  }
570abb0ad   Marian Balakowicz   [new uImage] Shar...
343
344
  
  #ifndef USE_HOSTCC
21d29f7f9   Heiko Schocher   bootm: make use o...
345
  #if defined(CONFIG_IMAGE_FORMAT_LEGACY)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
346
347
  /**
   * image_get_ramdisk - get and verify ramdisk image
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
   * @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.
   *
   * If dataflash support is enabled routine checks for dataflash addresses
   * and handles required dataflash reads.
   *
   * returns:
   *     pointer to a ramdisk image header, if image was found and valid
   *     otherwise, return NULL
   */
712fbcf38   Stephen Warren   checkpatch whites...
364
  static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch,
d985c8498   Marian Balakowicz   [new uImage] Remo...
365
  						int verify)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
366
  {
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
367
  	const image_header_t *rd_hdr = (const image_header_t *)rd_addr;
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
368

712fbcf38   Stephen Warren   checkpatch whites...
369
370
371
  	if (!image_check_magic(rd_hdr)) {
  		puts("Bad Magic Number
  ");
770605e4f   Simon Glass   bootstage: Replac...
372
  		bootstage_error(BOOTSTAGE_ID_RD_MAGIC);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
373
374
  		return NULL;
  	}
712fbcf38   Stephen Warren   checkpatch whites...
375
376
377
  	if (!image_check_hcrc(rd_hdr)) {
  		puts("Bad Header Checksum
  ");
770605e4f   Simon Glass   bootstage: Replac...
378
  		bootstage_error(BOOTSTAGE_ID_RD_HDR_CHECKSUM);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
379
380
  		return NULL;
  	}
770605e4f   Simon Glass   bootstage: Replac...
381
  	bootstage_mark(BOOTSTAGE_ID_RD_MAGIC);
712fbcf38   Stephen Warren   checkpatch whites...
382
  	image_print_contents(rd_hdr);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
383
384
385
  
  	if (verify) {
  		puts("   Verifying Checksum ... ");
712fbcf38   Stephen Warren   checkpatch whites...
386
387
388
  		if (!image_check_dcrc(rd_hdr)) {
  			puts("Bad Data CRC
  ");
770605e4f   Simon Glass   bootstage: Replac...
389
  			bootstage_error(BOOTSTAGE_ID_RD_CHECKSUM);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
390
391
392
393
394
  			return NULL;
  		}
  		puts("OK
  ");
  	}
770605e4f   Simon Glass   bootstage: Replac...
395
  	bootstage_mark(BOOTSTAGE_ID_RD_HDR_CHECKSUM);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
396

712fbcf38   Stephen Warren   checkpatch whites...
397
398
399
400
401
  	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...
402
  				genimg_get_arch_name(arch));
770605e4f   Simon Glass   bootstage: Replac...
403
  		bootstage_error(BOOTSTAGE_ID_RAMDISK);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
404
405
406
407
408
  		return NULL;
  	}
  
  	return rd_hdr;
  }
21d29f7f9   Heiko Schocher   bootm: make use o...
409
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
410
  #endif /* !USE_HOSTCC */
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
411
412
413
414
  
  /*****************************************************************************/
  /* Shared dual-format routines */
  /*****************************************************************************/
570abb0ad   Marian Balakowicz   [new uImage] Shar...
415
  #ifndef USE_HOSTCC
1cf0a8b2f   Joe Hershberger   env: Add a loadad...
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
  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);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
435
436
  ulong getenv_bootm_low(void)
  {
712fbcf38   Stephen Warren   checkpatch whites...
437
  	char *s = getenv("bootm_low");
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
438
  	if (s) {
712fbcf38   Stephen Warren   checkpatch whites...
439
  		ulong tmp = simple_strtoul(s, NULL, 16);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
440
441
  		return tmp;
  	}
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
442
443
  #if defined(CONFIG_SYS_SDRAM_BASE)
  	return CONFIG_SYS_SDRAM_BASE;
afe45c87e   Marian Balakowicz   [new uImage] Fix ...
444
445
  #elif defined(CONFIG_ARM)
  	return gd->bd->bi_dram[0].start;
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
446
447
448
449
  #else
  	return 0;
  #endif
  }
391fd93ab   Becky Bruce   Change lmb to use...
450
  phys_size_t getenv_bootm_size(void)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
451
  {
0cb389dd1   Masahiro Yamada   image: fix getenv...
452
453
  	phys_size_t tmp, size;
  	phys_addr_t start;
712fbcf38   Stephen Warren   checkpatch whites...
454
  	char *s = getenv("bootm_size");
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
455
  	if (s) {
712fbcf38   Stephen Warren   checkpatch whites...
456
  		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
457
458
  		return tmp;
  	}
0cb389dd1   Masahiro Yamada   image: fix getenv...
459
460
461
462
463
464
465
466
  
  #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
c519facc6   Matthew McClintock   Fix condition whe...
467
468
  	s = getenv("bootm_low");
  	if (s)
712fbcf38   Stephen Warren   checkpatch whites...
469
  		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
c519facc6   Matthew McClintock   Fix condition whe...
470
  	else
0cb389dd1   Masahiro Yamada   image: fix getenv...
471
  		tmp = start;
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
472

0cb389dd1   Masahiro Yamada   image: fix getenv...
473
  	return size - (tmp - start);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
474
  }
c3624e6ed   Grant Likely   Default to bootm_...
475
476
477
  phys_size_t getenv_bootm_mapsize(void)
  {
  	phys_size_t tmp;
712fbcf38   Stephen Warren   checkpatch whites...
478
  	char *s = getenv("bootm_mapsize");
c3624e6ed   Grant Likely   Default to bootm_...
479
  	if (s) {
712fbcf38   Stephen Warren   checkpatch whites...
480
  		tmp = (phys_size_t)simple_strtoull(s, NULL, 16);
c3624e6ed   Grant Likely   Default to bootm_...
481
482
483
484
485
486
487
488
489
  		return tmp;
  	}
  
  #if defined(CONFIG_SYS_BOOTMAPSZ)
  	return CONFIG_SYS_BOOTMAPSZ;
  #else
  	return getenv_bootm_size();
  #endif
  }
712fbcf38   Stephen Warren   checkpatch whites...
490
  void memmove_wd(void *to, void *from, size_t len, ulong chunksz)
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
491
  {
54fa2c5b5   Larry Johnson   Move test for unn...
492
493
  	if (to == from)
  		return;
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
494
  #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
22cfddc2a   Sonic Zhang   memmove_wd: copy ...
495
496
497
498
  	if (to > from) {
  		from += len;
  		to += len;
  	}
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
499
500
  	while (len > 0) {
  		size_t tail = (len > chunksz) ? chunksz : len;
712fbcf38   Stephen Warren   checkpatch whites...
501
  		WATCHDOG_RESET();
22cfddc2a   Sonic Zhang   memmove_wd: copy ...
502
503
504
505
  		if (to > from) {
  			to -= tail;
  			from -= tail;
  		}
712fbcf38   Stephen Warren   checkpatch whites...
506
  		memmove(to, from, tail);
22cfddc2a   Sonic Zhang   memmove_wd: copy ...
507
508
509
510
  		if (to < from) {
  			to += tail;
  			from += tail;
  		}
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
511
512
513
  		len -= tail;
  	}
  #else	/* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */
712fbcf38   Stephen Warren   checkpatch whites...
514
  	memmove(to, from, len);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
515
516
  #endif	/* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */
  }
570abb0ad   Marian Balakowicz   [new uImage] Shar...
517
  #endif /* !USE_HOSTCC */
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
518

712fbcf38   Stephen Warren   checkpatch whites...
519
  void genimg_print_size(uint32_t size)
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
520
  {
570abb0ad   Marian Balakowicz   [new uImage] Shar...
521
  #ifndef USE_HOSTCC
712fbcf38   Stephen Warren   checkpatch whites...
522
523
524
  	printf("%d Bytes = ", size);
  	print_size(size, "
  ");
570abb0ad   Marian Balakowicz   [new uImage] Shar...
525
  #else
712fbcf38   Stephen Warren   checkpatch whites...
526
527
  	printf("%d Bytes = %.2f kB = %.2f MB
  ",
570abb0ad   Marian Balakowicz   [new uImage] Shar...
528
529
  			size, (double)size / 1.024e3,
  			(double)size / 1.048576e6);
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
530
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
531
  }
859e92b77   Simon Glass   image: Move times...
532
533
  #if IMAGE_ENABLE_TIMESTAMP
  void genimg_print_time(time_t timestamp)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
534
535
536
  {
  #ifndef USE_HOSTCC
  	struct rtc_time tm;
9f9276c34   Simon Glass   dm: rtc: Rename t...
537
  	rtc_to_tm(timestamp, &tm);
712fbcf38   Stephen Warren   checkpatch whites...
538
539
  	printf("%4d-%02d-%02d  %2d:%02d:%02d UTC
  ",
570abb0ad   Marian Balakowicz   [new uImage] Shar...
540
541
542
  			tm.tm_year, tm.tm_mon, tm.tm_mday,
  			tm.tm_hour, tm.tm_min, tm.tm_sec);
  #else
712fbcf38   Stephen Warren   checkpatch whites...
543
  	printf("%s", ctime(&timestamp));
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
544
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
545
  }
859e92b77   Simon Glass   image: Move times...
546
  #endif
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
547

5b9d44df2   Simon Glass   mkimage: Display ...
548
549
550
551
552
553
554
555
  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;
  }
570abb0ad   Marian Balakowicz   [new uImage] Shar...
556
557
558
559
560
561
562
563
564
565
566
567
568
569
  /**
   * 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...
570
  char *get_table_entry_name(const table_entry_t *table, char *msg, int id)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
571
  {
5b9d44df2   Simon Glass   mkimage: Display ...
572
573
574
  	table = get_table_entry(table, id);
  	if (!table)
  		return msg;
2e5167cca   Wolfgang Denk   Replace CONFIG_RE...
575
  #if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC)
5b9d44df2   Simon Glass   mkimage: Display ...
576
  	return table->lname;
e3d1ac7bb   Scott Wood   common/image.c: R...
577
  #else
5b9d44df2   Simon Glass   mkimage: Display ...
578
  	return table->lname + gd->reloc_off;
e3d1ac7bb   Scott Wood   common/image.c: R...
579
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
580
  }
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
581

712fbcf38   Stephen Warren   checkpatch whites...
582
  const char *genimg_get_os_name(uint8_t os)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
583
  {
712fbcf38   Stephen Warren   checkpatch whites...
584
  	return (get_table_entry_name(uimage_os, "Unknown OS", os));
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
585
  }
712fbcf38   Stephen Warren   checkpatch whites...
586
  const char *genimg_get_arch_name(uint8_t arch)
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
587
  {
712fbcf38   Stephen Warren   checkpatch whites...
588
589
  	return (get_table_entry_name(uimage_arch, "Unknown Architecture",
  					arch));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
590
  }
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
591

712fbcf38   Stephen Warren   checkpatch whites...
592
  const char *genimg_get_type_name(uint8_t type)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
593
  {
712fbcf38   Stephen Warren   checkpatch whites...
594
  	return (get_table_entry_name(uimage_type, "Unknown Image", type));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
595
  }
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
596

cef2e5148   Simon Glass   image: Add functi...
597
  static const char *genimg_get_short_name(const table_entry_t *table, int val)
5b9d44df2   Simon Glass   mkimage: Display ...
598
  {
cef2e5148   Simon Glass   image: Add functi...
599
  	table = get_table_entry(table, val);
5b9d44df2   Simon Glass   mkimage: Display ...
600
601
602
603
604
605
606
607
  	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...
608
609
610
611
  const char *genimg_get_type_short_name(uint8_t type)
  {
  	return genimg_get_short_name(uimage_type, type);
  }
712fbcf38   Stephen Warren   checkpatch whites...
612
  const char *genimg_get_comp_name(uint8_t comp)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
613
  {
712fbcf38   Stephen Warren   checkpatch whites...
614
615
  	return (get_table_entry_name(uimage_comp, "Unknown Compression",
  					comp));
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
616
  }
cef2e5148   Simon Glass   image: Add functi...
617
618
619
620
621
622
623
624
625
626
627
628
629
630
  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...
631
632
633
634
635
636
637
638
639
640
641
642
643
644
  /**
   * 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...
645
  int get_table_entry_id(const table_entry_t *table,
570abb0ad   Marian Balakowicz   [new uImage] Shar...
646
  		const char *table_name, const char *name)
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
647
  {
7edb186fc   Mike Frysinger   image: constify l...
648
  	const table_entry_t *t;
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
649

570abb0ad   Marian Balakowicz   [new uImage] Shar...
650
  	for (t = table; t->id >= 0; ++t) {
2e5167cca   Wolfgang Denk   Replace CONFIG_RE...
651
  #ifdef CONFIG_NEEDS_MANUAL_RELOC
5b9d44df2   Simon Glass   mkimage: Display ...
652
  		if (t->sname && strcasecmp(t->sname + gd->reloc_off, name) == 0)
2e5167cca   Wolfgang Denk   Replace CONFIG_RE...
653
  #else
5b9d44df2   Simon Glass   mkimage: Display ...
654
  		if (t->sname && strcasecmp(t->sname, name) == 0)
521af04d8   Peter Tyser   Conditionally per...
655
  #endif
570abb0ad   Marian Balakowicz   [new uImage] Shar...
656
657
  			return (t->id);
  	}
712fbcf38   Stephen Warren   checkpatch whites...
658
659
  	debug("Invalid %s Type: %s
  ", table_name, name);
5b9d44df2   Simon Glass   mkimage: Display ...
660
661
  
  	return -1;
570abb0ad   Marian Balakowicz   [new uImage] Shar...
662
  }
712fbcf38   Stephen Warren   checkpatch whites...
663
  int genimg_get_os_id(const char *name)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
664
  {
712fbcf38   Stephen Warren   checkpatch whites...
665
  	return (get_table_entry_id(uimage_os, "OS", name));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
666
  }
712fbcf38   Stephen Warren   checkpatch whites...
667
  int genimg_get_arch_id(const char *name)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
668
  {
712fbcf38   Stephen Warren   checkpatch whites...
669
  	return (get_table_entry_id(uimage_arch, "CPU", name));
42b73e8ee   Marian Balakowicz   [new uImage] Fact...
670
  }
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
671

712fbcf38   Stephen Warren   checkpatch whites...
672
  int genimg_get_type_id(const char *name)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
673
  {
712fbcf38   Stephen Warren   checkpatch whites...
674
  	return (get_table_entry_id(uimage_type, "Image", name));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
675
  }
712fbcf38   Stephen Warren   checkpatch whites...
676
  int genimg_get_comp_id(const char *name)
570abb0ad   Marian Balakowicz   [new uImage] Shar...
677
  {
712fbcf38   Stephen Warren   checkpatch whites...
678
  	return (get_table_entry_id(uimage_comp, "Compression", name));
570abb0ad   Marian Balakowicz   [new uImage] Shar...
679
680
681
  }
  
  #ifndef USE_HOSTCC
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
682
  /**
6c454fedf   Bryan Wu   image: fix bootm ...
683
684
   * genimg_get_kernel_addr_fit - get the real kernel address and return 2
   *                              FIT strings
0f64140b6   Bryan Wu   image: introduce ...
685
   * @img_addr: a string might contain real image address
6c454fedf   Bryan Wu   image: fix bootm ...
686
687
688
689
   * @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 ...
690
   *
6c454fedf   Bryan Wu   image: fix bootm ...
691
   * genimg_get_kernel_addr_fit get the real kernel start address from a string
0f64140b6   Bryan Wu   image: introduce ...
692
693
694
695
696
   * which is normally the first argv of bootm/bootz
   *
   * returns:
   *     kernel start address
   */
6c454fedf   Bryan Wu   image: fix bootm ...
697
698
699
  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 ...
700
  {
0f64140b6   Bryan Wu   image: introduce ...
701
702
703
704
705
706
707
708
  	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...
709
  #if CONFIG_IS_ENABLED(FIT)
0f64140b6   Bryan Wu   image: introduce ...
710
  	} else if (fit_parse_conf(img_addr, load_addr, &kernel_addr,
6c454fedf   Bryan Wu   image: fix bootm ...
711
  				  fit_uname_config)) {
0f64140b6   Bryan Wu   image: introduce ...
712
713
  		debug("*  kernel: config '%s' from image at 0x%08lx
  ",
6c454fedf   Bryan Wu   image: fix bootm ...
714
  		      *fit_uname_config, kernel_addr);
0f64140b6   Bryan Wu   image: introduce ...
715
  	} else if (fit_parse_subimage(img_addr, load_addr, &kernel_addr,
6c454fedf   Bryan Wu   image: fix bootm ...
716
  				     fit_uname_kernel)) {
0f64140b6   Bryan Wu   image: introduce ...
717
718
  		debug("*  kernel: subimage '%s' from image at 0x%08lx
  ",
6c454fedf   Bryan Wu   image: fix bootm ...
719
  		      *fit_uname_kernel, kernel_addr);
0f64140b6   Bryan Wu   image: introduce ...
720
721
722
723
724
725
726
727
728
729
730
731
  #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 ...
732
733
734
735
736
737
738
739
740
741
742
743
744
   * 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...
745
   * genimg_get_format - get image format type
fff888a19   Marian Balakowicz   [new uImage] Add ...
746
747
   * @img_addr: image start address
   *
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
748
   * genimg_get_format() checks whether provided address points to a valid
fff888a19   Marian Balakowicz   [new uImage] Add ...
749
750
   * legacy or FIT image.
   *
4efbe9dbb   Marian Balakowicz   [new uImage] Corr...
751
752
   * 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...
753
   * genimg_get_format() must be able to dectect libfdt header.
4efbe9dbb   Marian Balakowicz   [new uImage] Corr...
754
   *
fff888a19   Marian Balakowicz   [new uImage] Add ...
755
756
757
   * returns:
   *     image format type or IMAGE_FORMAT_INVALID if no image is present
   */
35e7b0f17   Simon Glass   sandbox: image: A...
758
  int genimg_get_format(const void *img_addr)
fff888a19   Marian Balakowicz   [new uImage] Add ...
759
  {
21d29f7f9   Heiko Schocher   bootm: make use o...
760
  #if defined(CONFIG_IMAGE_FORMAT_LEGACY)
3a2003f61   Wolfgang Denk   tools/mkimage: fi...
761
  	const image_header_t *hdr;
fff888a19   Marian Balakowicz   [new uImage] Add ...
762

3a2003f61   Wolfgang Denk   tools/mkimage: fi...
763
  	hdr = (const image_header_t *)img_addr;
fff888a19   Marian Balakowicz   [new uImage] Add ...
764
  	if (image_check_magic(hdr))
21d29f7f9   Heiko Schocher   bootm: make use o...
765
766
  		return IMAGE_FORMAT_LEGACY;
  #endif
aa34fbc08   Simon Glass   fdt: Allow libfdt...
767
  #if IMAGE_ENABLE_FIT || IMAGE_ENABLE_OF_LIBFDT
21d29f7f9   Heiko Schocher   bootm: make use o...
768
769
  	if (fdt_check_header(img_addr) == 0)
  		return IMAGE_FORMAT_FIT;
9ace3fc81   Sebastian Siewior   image: add suppor...
770
771
  #endif
  #ifdef CONFIG_ANDROID_BOOT_IMAGE
21d29f7f9   Heiko Schocher   bootm: make use o...
772
773
  	if (android_image_check_header(img_addr) == 0)
  		return IMAGE_FORMAT_ANDROID;
fff888a19   Marian Balakowicz   [new uImage] Add ...
774
  #endif
21d29f7f9   Heiko Schocher   bootm: make use o...
775
  	return IMAGE_FORMAT_INVALID;
fff888a19   Marian Balakowicz   [new uImage] Add ...
776
777
778
  }
  
  /**
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
779
   * genimg_get_image - get image from special storage (if necessary)
fff888a19   Marian Balakowicz   [new uImage] Add ...
780
781
   * @img_addr: image start address
   *
067d15607   Guilherme Maciel Ferreira   imagetool: make t...
782
   * genimg_get_image() checks if provided image start address is located
fff888a19   Marian Balakowicz   [new uImage] Add ...
783
784
785
786
787
   * in a dataflash storage. If so, image is moved to a system RAM memory.
   *
   * returns:
   *     image start address after possible relocation from special storage
   */
712fbcf38   Stephen Warren   checkpatch whites...
788
  ulong genimg_get_image(ulong img_addr)
fff888a19   Marian Balakowicz   [new uImage] Add ...
789
  {
6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
790
  	ulong ram_addr = img_addr;
fff888a19   Marian Balakowicz   [new uImage] Add ...
791
792
  
  #ifdef CONFIG_HAS_DATAFLASH
6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
793
  	ulong h_size, d_size;
712fbcf38   Stephen Warren   checkpatch whites...
794
  	if (addr_dataflash(img_addr)) {
35e7b0f17   Simon Glass   sandbox: image: A...
795
  		void *buf;
6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
796
  		/* ger RAM address */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
797
  		ram_addr = CONFIG_SYS_LOAD_ADDR;
6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
798
799
  
  		/* get header size */
712fbcf38   Stephen Warren   checkpatch whites...
800
  		h_size = image_get_header_size();
73223f0e1   Simon Glass   Kconfig: Move CON...
801
  #if IMAGE_ENABLE_FIT
6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
802
803
804
805
806
  		if (sizeof(struct fdt_header) > h_size)
  			h_size = sizeof(struct fdt_header);
  #endif
  
  		/* read in header */
712fbcf38   Stephen Warren   checkpatch whites...
807
  		debug("   Reading image header from dataflash address "
fff888a19   Marian Balakowicz   [new uImage] Add ...
808
809
  			"%08lx to RAM address %08lx
  ", img_addr, ram_addr);
fff888a19   Marian Balakowicz   [new uImage] Add ...
810

35e7b0f17   Simon Glass   sandbox: image: A...
811
812
  		buf = map_sysmem(ram_addr, 0);
  		read_dataflash(img_addr, h_size, buf);
fff888a19   Marian Balakowicz   [new uImage] Add ...
813

6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
814
  		/* get data size */
35e7b0f17   Simon Glass   sandbox: image: A...
815
  		switch (genimg_get_format(buf)) {
21d29f7f9   Heiko Schocher   bootm: make use o...
816
  #if defined(CONFIG_IMAGE_FORMAT_LEGACY)
6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
817
  		case IMAGE_FORMAT_LEGACY:
35e7b0f17   Simon Glass   sandbox: image: A...
818
  			d_size = image_get_data_size(buf);
712fbcf38   Stephen Warren   checkpatch whites...
819
820
821
  			debug("   Legacy format image found at 0x%08lx, "
  					"size 0x%08lx
  ",
6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
822
823
  					ram_addr, d_size);
  			break;
21d29f7f9   Heiko Schocher   bootm: make use o...
824
  #endif
73223f0e1   Simon Glass   Kconfig: Move CON...
825
  #if IMAGE_ENABLE_FIT
6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
826
  		case IMAGE_FORMAT_FIT:
35e7b0f17   Simon Glass   sandbox: image: A...
827
  			d_size = fit_get_size(buf) - h_size;
712fbcf38   Stephen Warren   checkpatch whites...
828
829
830
  			debug("   FIT/FDT format image found at 0x%08lx, "
  					"size 0x%08lx
  ",
6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
831
832
  					ram_addr, d_size);
  			break;
fff888a19   Marian Balakowicz   [new uImage] Add ...
833
  #endif
6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
834
  		default:
712fbcf38   Stephen Warren   checkpatch whites...
835
836
837
  			printf("   No valid image found at 0x%08lx
  ",
  				img_addr);
6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
838
839
  			return ram_addr;
  		}
fff888a19   Marian Balakowicz   [new uImage] Add ...
840

6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
841
  		/* read in image data */
712fbcf38   Stephen Warren   checkpatch whites...
842
  		debug("   Reading image remaining data from dataflash address "
fff888a19   Marian Balakowicz   [new uImage] Add ...
843
844
845
  			"%08lx to RAM address %08lx
  ", img_addr + h_size,
  			ram_addr + h_size);
712fbcf38   Stephen Warren   checkpatch whites...
846
  		read_dataflash(img_addr + h_size, d_size,
35e7b0f17   Simon Glass   sandbox: image: A...
847
  				(char *)(buf + h_size));
6f0f9dfc4   Marian Balakowicz   [new uImage] Opti...
848

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

c87796483   Marian Balakowicz   [new uImage] Add ...
917
918
  	*rd_start = 0;
  	*rd_end = 0;
1fec3c5d8   Tom Rini   common/image.c: M...
919
920
921
922
923
  #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-...
924
  	if (buf && genimg_get_format(buf) == IMAGE_FORMAT_ANDROID)
1fec3c5d8   Tom Rini   common/image.c: M...
925
926
  		select = argv[0];
  #endif
983c72f47   Simon Glass   Clarify bootm OS ...
927
928
  	if (argc >= 2)
  		select = argv[1];
2dd46328f   Rob Herring   image: fix Androi...
929

d5934ad77   Marian Balakowicz   [new uImage] Add ...
930
931
932
933
  	/*
  	 * Look for a '-' which indicates to ignore the
  	 * ramdisk argument
  	 */
983c72f47   Simon Glass   Clarify bootm OS ...
934
  	if (select && strcmp(select, "-") ==  0) {
712fbcf38   Stephen Warren   checkpatch whites...
935
936
  		debug("## Skipping init Ramdisk
  ");
d5934ad77   Marian Balakowicz   [new uImage] Add ...
937
  		rd_len = rd_data = 0;
983c72f47   Simon Glass   Clarify bootm OS ...
938
  	} else if (select || genimg_has_config(images)) {
73223f0e1   Simon Glass   Kconfig: Move CON...
939
  #if IMAGE_ENABLE_FIT
983c72f47   Simon Glass   Clarify bootm OS ...
940
  		if (select) {
f773bea8e   Marian Balakowicz   [new uImage] Add ...
941
942
943
944
945
946
947
948
949
950
  			/*
  			 * 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 ...
951
952
  			if (fit_parse_conf(select, default_addr,
  					   &rd_addr, &fit_uname_config)) {
712fbcf38   Stephen Warren   checkpatch whites...
953
954
955
  				debug("*  ramdisk: config '%s' from image at "
  						"0x%08lx
  ",
f773bea8e   Marian Balakowicz   [new uImage] Add ...
956
  						fit_uname_config, rd_addr);
983c72f47   Simon Glass   Clarify bootm OS ...
957
  			} else if (fit_parse_subimage(select, default_addr,
f773bea8e   Marian Balakowicz   [new uImage] Add ...
958
  						&rd_addr, &fit_uname_ramdisk)) {
712fbcf38   Stephen Warren   checkpatch whites...
959
960
961
  				debug("*  ramdisk: subimage '%s' from image at "
  						"0x%08lx
  ",
f773bea8e   Marian Balakowicz   [new uImage] Add ...
962
963
  						fit_uname_ramdisk, rd_addr);
  			} else
d5934ad77   Marian Balakowicz   [new uImage] Add ...
964
  #endif
f773bea8e   Marian Balakowicz   [new uImage] Add ...
965
  			{
983c72f47   Simon Glass   Clarify bootm OS ...
966
  				rd_addr = simple_strtoul(select, NULL, 16);
712fbcf38   Stephen Warren   checkpatch whites...
967
968
969
  				debug("*  ramdisk: cmdline image address = "
  						"0x%08lx
  ",
f773bea8e   Marian Balakowicz   [new uImage] Add ...
970
971
  						rd_addr);
  			}
73223f0e1   Simon Glass   Kconfig: Move CON...
972
  #if IMAGE_ENABLE_FIT
f773bea8e   Marian Balakowicz   [new uImage] Add ...
973
974
  		} else {
  			/* use FIT configuration provided in first bootm
a51ec63b8   Simon Glass   image: Use fit_im...
975
976
  			 * command argument. If the property is not defined,
  			 * quit silently.
f773bea8e   Marian Balakowicz   [new uImage] Add ...
977
  			 */
35e7b0f17   Simon Glass   sandbox: image: A...
978
  			rd_addr = map_to_sysmem(images->fit_hdr_os);
a51ec63b8   Simon Glass   image: Use fit_im...
979
980
981
  			rd_noffset = fit_get_node_from_config(images,
  					FIT_RAMDISK_PROP, rd_addr);
  			if (rd_noffset == -ENOLINK)
41266c9b5   Peter Tyser   FIT: Fix handling...
982
  				return 0;
a51ec63b8   Simon Glass   image: Use fit_im...
983
984
  			else if (rd_noffset < 0)
  				return 1;
d5934ad77   Marian Balakowicz   [new uImage] Add ...
985
  		}
f773bea8e   Marian Balakowicz   [new uImage] Add ...
986
  #endif
d5934ad77   Marian Balakowicz   [new uImage] Add ...
987
988
  
  		/* copy from dataflash if needed */
712fbcf38   Stephen Warren   checkpatch whites...
989
  		rd_addr = genimg_get_image(rd_addr);
d5934ad77   Marian Balakowicz   [new uImage] Add ...
990
991
992
993
994
995
  
  		/*
  		 * 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...
996
997
  		buf = map_sysmem(rd_addr, 0);
  		switch (genimg_get_format(buf)) {
21d29f7f9   Heiko Schocher   bootm: make use o...
998
  #if defined(CONFIG_IMAGE_FORMAT_LEGACY)
d5934ad77   Marian Balakowicz   [new uImage] Add ...
999
  		case IMAGE_FORMAT_LEGACY:
712fbcf38   Stephen Warren   checkpatch whites...
1000
  			printf("## Loading init Ramdisk from Legacy "
c87796483   Marian Balakowicz   [new uImage] Add ...
1001
1002
  					"Image at %08lx ...
  ", rd_addr);
5ad03eb38   Marian Balakowicz   [new uImage] Fact...
1003

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

c87796483   Marian Balakowicz   [new uImage] Add ...
1008
  			if (rd_hdr == NULL)
274cea2bd   Kumar Gala   [new uImage] rewo...
1009
  				return 1;
274cea2bd   Kumar Gala   [new uImage] rewo...
1010

712fbcf38   Stephen Warren   checkpatch whites...
1011
1012
1013
  			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 ...
1014
  			break;
21d29f7f9   Heiko Schocher   bootm: make use o...
1015
  #endif
73223f0e1   Simon Glass   Kconfig: Move CON...
1016
  #if IMAGE_ENABLE_FIT
d5934ad77   Marian Balakowicz   [new uImage] Add ...
1017
  		case IMAGE_FORMAT_FIT:
126cc8642   Simon Glass   image: Remove the...
1018
  			rd_noffset = fit_image_load(images,
a51ec63b8   Simon Glass   image: Use fit_im...
1019
  					rd_addr, &fit_uname_ramdisk,
f320a4d84   Simon Glass   bootm: Use select...
1020
  					&fit_uname_config, arch,
a51ec63b8   Simon Glass   image: Use fit_im...
1021
1022
  					IH_TYPE_RAMDISK,
  					BOOTSTAGE_ID_FIT_RD_START,
fe20a81a6   Simon Glass   Fix test failure ...
1023
1024
  					FIT_LOAD_OPTIONAL_NON_ZERO,
  					&rd_data, &rd_len);
a51ec63b8   Simon Glass   image: Use fit_im...
1025
  			if (rd_noffset < 0)
c78fce699   Michal Simek   FIS: repare incor...
1026
  				return 1;
c87796483   Marian Balakowicz   [new uImage] Add ...
1027

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

fca43cc80   John Rigby   boot: change some...
1091
  #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1092
  /**
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1093
   * boot_ramdisk_high - relocate init ramdisk
e822d7fc4   Kumar Gala   [new uImage] Use ...
1094
   * @lmb: pointer to lmb handle, will be used for memory mgmt
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1095
1096
   * @rd_data: ramdisk data start address
   * @rd_len: ramdisk data length
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1097
1098
1099
1100
1101
   * @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...
1102
   * boot_ramdisk_high() takes a relocation hint from "initrd_high" environment
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1103
1104
   * variable and if requested ramdisk data is moved to a specified location.
   *
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1105
1106
1107
1108
   * 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...
1109
   * returns:
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1110
1111
   *      0 - success
   *     -1 - failure
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1112
   */
712fbcf38   Stephen Warren   checkpatch whites...
1113
  int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len,
e822d7fc4   Kumar Gala   [new uImage] Use ...
1114
  		  ulong *initrd_start, ulong *initrd_end)
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1115
1116
1117
1118
  {
  	char	*s;
  	ulong	initrd_high;
  	int	initrd_copy_to_ram = 1;
712fbcf38   Stephen Warren   checkpatch whites...
1119
  	if ((s = getenv("initrd_high")) != NULL) {
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1120
1121
1122
  		/* 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...
1123
  		initrd_high = simple_strtoul(s, NULL, 16);
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1124
1125
1126
  		if (initrd_high == ~0)
  			initrd_copy_to_ram = 0;
  	} else {
20e072f37   Masahiro Yamada   image: check "boo...
1127
  		initrd_high = getenv_bootm_mapsize() + getenv_bootm_low();
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1128
  	}
95d449ad4   Marian Balakowicz   Avoid initrd and ...
1129
1130
1131
1132
1133
  
  #ifdef CONFIG_LOGBUFFER
  	/* Prevent initrd from overwriting logbuffer */
  	lmb_reserve(lmb, logbuffer_base() - LOGBUFF_OVERHEAD, LOGBUFF_RESERVE);
  #endif
712fbcf38   Stephen Warren   checkpatch whites...
1134
1135
  	debug("## initrd_high = 0x%08lx, copy_to_ram = %d
  ",
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1136
1137
1138
1139
  			initrd_high, initrd_copy_to_ram);
  
  	if (rd_data) {
  		if (!initrd_copy_to_ram) {	/* zero-copy ramdisk support */
712fbcf38   Stephen Warren   checkpatch whites...
1140
1141
  			debug("   in-place initrd
  ");
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1142
1143
  			*initrd_start = rd_data;
  			*initrd_end = rd_data + rd_len;
e822d7fc4   Kumar Gala   [new uImage] Use ...
1144
  			lmb_reserve(lmb, rd_data, rd_len);
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1145
  		} else {
e822d7fc4   Kumar Gala   [new uImage] Use ...
1146
  			if (initrd_high)
712fbcf38   Stephen Warren   checkpatch whites...
1147
1148
  				*initrd_start = (ulong)lmb_alloc_base(lmb,
  						rd_len, 0x1000, initrd_high);
e822d7fc4   Kumar Gala   [new uImage] Use ...
1149
  			else
712fbcf38   Stephen Warren   checkpatch whites...
1150
1151
  				*initrd_start = (ulong)lmb_alloc(lmb, rd_len,
  								 0x1000);
e822d7fc4   Kumar Gala   [new uImage] Use ...
1152
1153
  
  			if (*initrd_start == 0) {
712fbcf38   Stephen Warren   checkpatch whites...
1154
1155
  				puts("ramdisk - allocation error
  ");
e822d7fc4   Kumar Gala   [new uImage] Use ...
1156
  				goto error;
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1157
  			}
770605e4f   Simon Glass   bootstage: Replac...
1158
  			bootstage_mark(BOOTSTAGE_ID_COPY_RAMDISK);
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1159
1160
  
  			*initrd_end = *initrd_start + rd_len;
712fbcf38   Stephen Warren   checkpatch whites...
1161
  			printf("   Loading Ramdisk to %08lx, end %08lx ... ",
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1162
  					*initrd_start, *initrd_end);
712fbcf38   Stephen Warren   checkpatch whites...
1163
  			memmove_wd((void *)*initrd_start,
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1164
  					(void *)rd_data, rd_len, CHUNKSZ);
3b2001105   Kumar Gala   powerpc/bootm: Fl...
1165
1166
1167
1168
1169
1170
1171
1172
  #ifdef CONFIG_MP
  			/*
  			 * Ensure the image is flushed to memory to handle
  			 * AMP boot scenarios in which we might not be
  			 * HW cache coherent
  			 */
  			flush_cache((unsigned long)*initrd_start, rd_len);
  #endif
712fbcf38   Stephen Warren   checkpatch whites...
1173
1174
  			puts("OK
  ");
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1175
1176
1177
1178
1179
  		}
  	} else {
  		*initrd_start = 0;
  		*initrd_end = 0;
  	}
712fbcf38   Stephen Warren   checkpatch whites...
1180
1181
  	debug("   ramdisk load start = 0x%08lx, ramdisk load end = 0x%08lx
  ",
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1182
  			*initrd_start, *initrd_end);
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1183

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

e822d7fc4   Kumar Gala   [new uImage] Use ...
1186
1187
  error:
  	return -1;
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1188
  }
fca43cc80   John Rigby   boot: change some...
1189
  #endif /* CONFIG_SYS_BOOT_RAMDISK_HIGH */
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1190

90268b878   Simon Glass   x86: Support load...
1191
1192
1193
  int boot_get_setup(bootm_headers_t *images, uint8_t arch,
  		   ulong *setup_start, ulong *setup_len)
  {
73223f0e1   Simon Glass   Kconfig: Move CON...
1194
  #if IMAGE_ENABLE_FIT
90268b878   Simon Glass   x86: Support load...
1195
1196
1197
1198
1199
  	return boot_get_setup_fit(images, arch, setup_start, setup_len);
  #else
  	return -ENOENT;
  #endif
  }
73223f0e1   Simon Glass   Kconfig: Move CON...
1200
  #if IMAGE_ENABLE_FIT
84a07dbfd   Karl Apsite   add boot_get_load...
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
  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;
  	char *uname;
  
  	/* 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
  	 * copy from dataflash if needed
  	 */
  	tmp_img_addr = map_to_sysmem(images->fit_hdr_os);
  	tmp_img_addr = genimg_get_image(tmp_img_addr);
  	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;
9734b97f7   Thierry Reding   image: Fix loop c...
1243
  		     fdt_get_string_index(buf, conf_noffset,
84a07dbfd   Karl Apsite   add boot_get_load...
1244
1245
  				FIT_LOADABLE_PROP,
  				loadables_index,
9734b97f7   Thierry Reding   image: Fix loop c...
1246
  				(const char **)&uname) == 0;
84a07dbfd   Karl Apsite   add boot_get_load...
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
  		     loadables_index++)
  		{
  			fit_img_result = fit_image_load(images,
  				tmp_img_addr,
  				(const char **)&uname,
  				&(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;
  			}
  		}
  		break;
  	default:
  		printf("The given image format is not supported (corrupt?)
  ");
  		return 1;
  	}
  
  	return 0;
  }
  #endif
fca43cc80   John Rigby   boot: change some...
1272
  #ifdef CONFIG_SYS_BOOT_GET_CMDLINE
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1273
  /**
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1274
   * boot_get_cmdline - allocate and initialize kernel cmdline
e822d7fc4   Kumar Gala   [new uImage] Use ...
1275
   * @lmb: pointer to lmb handle, will be used for memory mgmt
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1276
1277
1278
   * @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...
1279
   * boot_get_cmdline() allocates space for kernel command line below
a187559e3   Bin Meng   Use correct spell...
1280
   * BOOTMAPSZ + getenv_bootm_low() address. If "bootargs" U-Boot environemnt
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1281
1282
1283
1284
   * variable is present its contents is copied to allocated kernel
   * command line.
   *
   * returns:
e822d7fc4   Kumar Gala   [new uImage] Use ...
1285
1286
   *      0 - success
   *     -1 - failure
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1287
   */
712fbcf38   Stephen Warren   checkpatch whites...
1288
  int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end)
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1289
1290
1291
  {
  	char *cmdline;
  	char *s;
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
1292
  	cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf,
c3624e6ed   Grant Likely   Default to bootm_...
1293
  				getenv_bootm_mapsize() + getenv_bootm_low());
e822d7fc4   Kumar Gala   [new uImage] Use ...
1294
1295
1296
  
  	if (cmdline == NULL)
  		return -1;
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1297
1298
1299
1300
1301
1302
1303
1304
  
  	if ((s = getenv("bootargs")) == NULL)
  		s = "";
  
  	strcpy(cmdline, s);
  
  	*cmd_start = (ulong) & cmdline[0];
  	*cmd_end = *cmd_start + strlen(cmdline);
712fbcf38   Stephen Warren   checkpatch whites...
1305
1306
  	debug("## cmdline at 0x%08lx ... 0x%08lx
  ", *cmd_start, *cmd_end);
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1307

e822d7fc4   Kumar Gala   [new uImage] Use ...
1308
  	return 0;
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1309
  }
fca43cc80   John Rigby   boot: change some...
1310
  #endif /* CONFIG_SYS_BOOT_GET_CMDLINE */
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1311

fca43cc80   John Rigby   boot: change some...
1312
  #ifdef CONFIG_SYS_BOOT_GET_KBD
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1313
  /**
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1314
   * boot_get_kbd - allocate and initialize kernel copy of board info
e822d7fc4   Kumar Gala   [new uImage] Use ...
1315
   * @lmb: pointer to lmb handle, will be used for memory mgmt
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1316
1317
   * @kbd: double pointer to board info data
   *
9a4daad0a   Marian Balakowicz   [new uImage] Upda...
1318
   * boot_get_kbd() allocates space for kernel copy of board info data below
590d3cacb   Grant Likely   Stop passing arou...
1319
1320
   * BOOTMAPSZ + getenv_bootm_low() address and kernel board info is initialized
   * with the current u-boot board info data.
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1321
1322
   *
   * returns:
e822d7fc4   Kumar Gala   [new uImage] Use ...
1323
1324
   *      0 - success
   *     -1 - failure
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1325
   */
712fbcf38   Stephen Warren   checkpatch whites...
1326
  int boot_get_kbd(struct lmb *lmb, bd_t **kbd)
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1327
  {
391fd93ab   Becky Bruce   Change lmb to use...
1328
  	*kbd = (bd_t *)(ulong)lmb_alloc_base(lmb, sizeof(bd_t), 0xf,
c3624e6ed   Grant Likely   Default to bootm_...
1329
  				getenv_bootm_mapsize() + getenv_bootm_low());
e822d7fc4   Kumar Gala   [new uImage] Use ...
1330
1331
  	if (*kbd == NULL)
  		return -1;
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1332
  	**kbd = *(gd->bd);
712fbcf38   Stephen Warren   checkpatch whites...
1333
1334
  	debug("## kernel board info at 0x%08lx
  ", (ulong)*kbd);
b6b0fe646   Marian Balakowicz   [new uImage] Clea...
1335
1336
1337
1338
  
  #if defined(DEBUG) && defined(CONFIG_CMD_BDI)
  	do_bdinfo(NULL, 0, 0, NULL);
  #endif
e822d7fc4   Kumar Gala   [new uImage] Use ...
1339
  	return 0;
ceaed2b1e   Marian Balakowicz   [new uImage] Move...
1340
  }
fca43cc80   John Rigby   boot: change some...
1341
  #endif /* CONFIG_SYS_BOOT_GET_KBD */
13d06981a   Simon Glass   image: Add device...
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
  
  #ifdef CONFIG_LMB
  int image_setup_linux(bootm_headers_t *images)
  {
  	ulong of_size = images->ft_len;
  	char **of_flat_tree = &images->ft_addr;
  	ulong *initrd_start = &images->initrd_start;
  	ulong *initrd_end = &images->initrd_end;
  	struct lmb *lmb = &images->lmb;
  	ulong rd_len;
  	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;
  		}
  	}
  	if (IMAGE_ENABLE_RAMDISK_HIGH) {
  		rd_len = images->rd_end - images->rd_start;
  		ret = boot_ramdisk_high(lmb, images->rd_start, rd_len,
  				initrd_start, initrd_end);
  		if (ret)
  			return ret;
  	}
  
  	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 ...
1389
  #endif /* !USE_HOSTCC */