Commit 39f520bb62be67ef98303c47dd5c2d76861fea0f
Committed by
Albert ARIBAUD
1 parent
24d528e3fa
Exists in
v2017.01-smarct4x
and in
37 other branches
lpc32xx: add lpc32xx-spl.bin boot image target
Signed-off-by: Albert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr>
Showing 4 changed files with 181 additions and 0 deletions Inline Diff
common/image.c
1 | /* | 1 | /* |
2 | * (C) Copyright 2008 Semihalf | 2 | * (C) Copyright 2008 Semihalf |
3 | * | 3 | * |
4 | * (C) Copyright 2000-2006 | 4 | * (C) Copyright 2000-2006 |
5 | * Wolfgang Denk, DENX Software Engineering, wd@denx.de. | 5 | * Wolfgang Denk, DENX Software Engineering, wd@denx.de. |
6 | * | 6 | * |
7 | * SPDX-License-Identifier: GPL-2.0+ | 7 | * SPDX-License-Identifier: GPL-2.0+ |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #ifndef USE_HOSTCC | 10 | #ifndef USE_HOSTCC |
11 | #include <common.h> | 11 | #include <common.h> |
12 | #include <watchdog.h> | 12 | #include <watchdog.h> |
13 | 13 | ||
14 | #ifdef CONFIG_SHOW_BOOT_PROGRESS | 14 | #ifdef CONFIG_SHOW_BOOT_PROGRESS |
15 | #include <status_led.h> | 15 | #include <status_led.h> |
16 | #endif | 16 | #endif |
17 | 17 | ||
18 | #ifdef CONFIG_HAS_DATAFLASH | 18 | #ifdef CONFIG_HAS_DATAFLASH |
19 | #include <dataflash.h> | 19 | #include <dataflash.h> |
20 | #endif | 20 | #endif |
21 | 21 | ||
22 | #ifdef CONFIG_LOGBUFFER | 22 | #ifdef CONFIG_LOGBUFFER |
23 | #include <logbuff.h> | 23 | #include <logbuff.h> |
24 | #endif | 24 | #endif |
25 | 25 | ||
26 | #include <rtc.h> | 26 | #include <rtc.h> |
27 | 27 | ||
28 | #include <environment.h> | 28 | #include <environment.h> |
29 | #include <image.h> | 29 | #include <image.h> |
30 | 30 | ||
31 | #if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT) | 31 | #if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT) |
32 | #include <libfdt.h> | 32 | #include <libfdt.h> |
33 | #include <fdt_support.h> | 33 | #include <fdt_support.h> |
34 | #endif | 34 | #endif |
35 | 35 | ||
36 | #include <u-boot/md5.h> | 36 | #include <u-boot/md5.h> |
37 | #include <u-boot/sha1.h> | 37 | #include <u-boot/sha1.h> |
38 | #include <asm/errno.h> | 38 | #include <asm/errno.h> |
39 | #include <asm/io.h> | 39 | #include <asm/io.h> |
40 | 40 | ||
41 | #ifdef CONFIG_CMD_BDI | 41 | #ifdef CONFIG_CMD_BDI |
42 | extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); | 42 | extern int do_bdinfo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); |
43 | #endif | 43 | #endif |
44 | 44 | ||
45 | DECLARE_GLOBAL_DATA_PTR; | 45 | DECLARE_GLOBAL_DATA_PTR; |
46 | 46 | ||
47 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) | 47 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
48 | static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch, | 48 | static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch, |
49 | int verify); | 49 | int verify); |
50 | #endif | 50 | #endif |
51 | #else | 51 | #else |
52 | #include "mkimage.h" | 52 | #include "mkimage.h" |
53 | #include <u-boot/md5.h> | 53 | #include <u-boot/md5.h> |
54 | #include <time.h> | 54 | #include <time.h> |
55 | #include <image.h> | 55 | #include <image.h> |
56 | #endif /* !USE_HOSTCC*/ | 56 | #endif /* !USE_HOSTCC*/ |
57 | 57 | ||
58 | #include <u-boot/crc.h> | 58 | #include <u-boot/crc.h> |
59 | 59 | ||
60 | #ifndef CONFIG_SYS_BARGSIZE | 60 | #ifndef CONFIG_SYS_BARGSIZE |
61 | #define CONFIG_SYS_BARGSIZE 512 | 61 | #define CONFIG_SYS_BARGSIZE 512 |
62 | #endif | 62 | #endif |
63 | 63 | ||
64 | static const table_entry_t uimage_arch[] = { | 64 | static const table_entry_t uimage_arch[] = { |
65 | { IH_ARCH_INVALID, NULL, "Invalid ARCH", }, | 65 | { IH_ARCH_INVALID, NULL, "Invalid ARCH", }, |
66 | { IH_ARCH_ALPHA, "alpha", "Alpha", }, | 66 | { IH_ARCH_ALPHA, "alpha", "Alpha", }, |
67 | { IH_ARCH_ARM, "arm", "ARM", }, | 67 | { IH_ARCH_ARM, "arm", "ARM", }, |
68 | { IH_ARCH_I386, "x86", "Intel x86", }, | 68 | { IH_ARCH_I386, "x86", "Intel x86", }, |
69 | { IH_ARCH_IA64, "ia64", "IA64", }, | 69 | { IH_ARCH_IA64, "ia64", "IA64", }, |
70 | { IH_ARCH_M68K, "m68k", "M68K", }, | 70 | { IH_ARCH_M68K, "m68k", "M68K", }, |
71 | { IH_ARCH_MICROBLAZE, "microblaze", "MicroBlaze", }, | 71 | { IH_ARCH_MICROBLAZE, "microblaze", "MicroBlaze", }, |
72 | { IH_ARCH_MIPS, "mips", "MIPS", }, | 72 | { IH_ARCH_MIPS, "mips", "MIPS", }, |
73 | { IH_ARCH_MIPS64, "mips64", "MIPS 64 Bit", }, | 73 | { IH_ARCH_MIPS64, "mips64", "MIPS 64 Bit", }, |
74 | { IH_ARCH_NIOS2, "nios2", "NIOS II", }, | 74 | { IH_ARCH_NIOS2, "nios2", "NIOS II", }, |
75 | { IH_ARCH_PPC, "powerpc", "PowerPC", }, | 75 | { IH_ARCH_PPC, "powerpc", "PowerPC", }, |
76 | { IH_ARCH_PPC, "ppc", "PowerPC", }, | 76 | { IH_ARCH_PPC, "ppc", "PowerPC", }, |
77 | { IH_ARCH_S390, "s390", "IBM S390", }, | 77 | { IH_ARCH_S390, "s390", "IBM S390", }, |
78 | { IH_ARCH_SH, "sh", "SuperH", }, | 78 | { IH_ARCH_SH, "sh", "SuperH", }, |
79 | { IH_ARCH_SPARC, "sparc", "SPARC", }, | 79 | { IH_ARCH_SPARC, "sparc", "SPARC", }, |
80 | { IH_ARCH_SPARC64, "sparc64", "SPARC 64 Bit", }, | 80 | { IH_ARCH_SPARC64, "sparc64", "SPARC 64 Bit", }, |
81 | { IH_ARCH_BLACKFIN, "blackfin", "Blackfin", }, | 81 | { IH_ARCH_BLACKFIN, "blackfin", "Blackfin", }, |
82 | { IH_ARCH_AVR32, "avr32", "AVR32", }, | 82 | { IH_ARCH_AVR32, "avr32", "AVR32", }, |
83 | { IH_ARCH_NDS32, "nds32", "NDS32", }, | 83 | { IH_ARCH_NDS32, "nds32", "NDS32", }, |
84 | { IH_ARCH_OPENRISC, "or1k", "OpenRISC 1000",}, | 84 | { IH_ARCH_OPENRISC, "or1k", "OpenRISC 1000",}, |
85 | { IH_ARCH_SANDBOX, "sandbox", "Sandbox", }, | 85 | { IH_ARCH_SANDBOX, "sandbox", "Sandbox", }, |
86 | { IH_ARCH_ARM64, "arm64", "AArch64", }, | 86 | { IH_ARCH_ARM64, "arm64", "AArch64", }, |
87 | { IH_ARCH_ARC, "arc", "ARC", }, | 87 | { IH_ARCH_ARC, "arc", "ARC", }, |
88 | { IH_ARCH_X86_64, "x86_64", "AMD x86_64", }, | 88 | { IH_ARCH_X86_64, "x86_64", "AMD x86_64", }, |
89 | { -1, "", "", }, | 89 | { -1, "", "", }, |
90 | }; | 90 | }; |
91 | 91 | ||
92 | static const table_entry_t uimage_os[] = { | 92 | static const table_entry_t uimage_os[] = { |
93 | { IH_OS_INVALID, NULL, "Invalid OS", }, | 93 | { IH_OS_INVALID, NULL, "Invalid OS", }, |
94 | { IH_OS_LINUX, "linux", "Linux", }, | 94 | { IH_OS_LINUX, "linux", "Linux", }, |
95 | #if defined(CONFIG_LYNXKDI) || defined(USE_HOSTCC) | 95 | #if defined(CONFIG_LYNXKDI) || defined(USE_HOSTCC) |
96 | { IH_OS_LYNXOS, "lynxos", "LynxOS", }, | 96 | { IH_OS_LYNXOS, "lynxos", "LynxOS", }, |
97 | #endif | 97 | #endif |
98 | { IH_OS_NETBSD, "netbsd", "NetBSD", }, | 98 | { IH_OS_NETBSD, "netbsd", "NetBSD", }, |
99 | { IH_OS_OSE, "ose", "Enea OSE", }, | 99 | { IH_OS_OSE, "ose", "Enea OSE", }, |
100 | { IH_OS_PLAN9, "plan9", "Plan 9", }, | 100 | { IH_OS_PLAN9, "plan9", "Plan 9", }, |
101 | { IH_OS_RTEMS, "rtems", "RTEMS", }, | 101 | { IH_OS_RTEMS, "rtems", "RTEMS", }, |
102 | { IH_OS_U_BOOT, "u-boot", "U-Boot", }, | 102 | { IH_OS_U_BOOT, "u-boot", "U-Boot", }, |
103 | { IH_OS_VXWORKS, "vxworks", "VxWorks", }, | 103 | { IH_OS_VXWORKS, "vxworks", "VxWorks", }, |
104 | #if defined(CONFIG_CMD_ELF) || defined(USE_HOSTCC) | 104 | #if defined(CONFIG_CMD_ELF) || defined(USE_HOSTCC) |
105 | { IH_OS_QNX, "qnx", "QNX", }, | 105 | { IH_OS_QNX, "qnx", "QNX", }, |
106 | #endif | 106 | #endif |
107 | #if defined(CONFIG_INTEGRITY) || defined(USE_HOSTCC) | 107 | #if defined(CONFIG_INTEGRITY) || defined(USE_HOSTCC) |
108 | { IH_OS_INTEGRITY,"integrity", "INTEGRITY", }, | 108 | { IH_OS_INTEGRITY,"integrity", "INTEGRITY", }, |
109 | #endif | 109 | #endif |
110 | #ifdef USE_HOSTCC | 110 | #ifdef USE_HOSTCC |
111 | { IH_OS_4_4BSD, "4_4bsd", "4_4BSD", }, | 111 | { IH_OS_4_4BSD, "4_4bsd", "4_4BSD", }, |
112 | { IH_OS_DELL, "dell", "Dell", }, | 112 | { IH_OS_DELL, "dell", "Dell", }, |
113 | { IH_OS_ESIX, "esix", "Esix", }, | 113 | { IH_OS_ESIX, "esix", "Esix", }, |
114 | { IH_OS_FREEBSD, "freebsd", "FreeBSD", }, | 114 | { IH_OS_FREEBSD, "freebsd", "FreeBSD", }, |
115 | { IH_OS_IRIX, "irix", "Irix", }, | 115 | { IH_OS_IRIX, "irix", "Irix", }, |
116 | { IH_OS_NCR, "ncr", "NCR", }, | 116 | { IH_OS_NCR, "ncr", "NCR", }, |
117 | { IH_OS_OPENBSD, "openbsd", "OpenBSD", }, | 117 | { IH_OS_OPENBSD, "openbsd", "OpenBSD", }, |
118 | { IH_OS_PSOS, "psos", "pSOS", }, | 118 | { IH_OS_PSOS, "psos", "pSOS", }, |
119 | { IH_OS_SCO, "sco", "SCO", }, | 119 | { IH_OS_SCO, "sco", "SCO", }, |
120 | { IH_OS_SOLARIS, "solaris", "Solaris", }, | 120 | { IH_OS_SOLARIS, "solaris", "Solaris", }, |
121 | { IH_OS_SVR4, "svr4", "SVR4", }, | 121 | { IH_OS_SVR4, "svr4", "SVR4", }, |
122 | #endif | 122 | #endif |
123 | #if defined(CONFIG_BOOTM_OPENRTOS) || defined(USE_HOSTCC) | 123 | #if defined(CONFIG_BOOTM_OPENRTOS) || defined(USE_HOSTCC) |
124 | { IH_OS_OPENRTOS, "openrtos", "OpenRTOS", }, | 124 | { IH_OS_OPENRTOS, "openrtos", "OpenRTOS", }, |
125 | #endif | 125 | #endif |
126 | 126 | ||
127 | { -1, "", "", }, | 127 | { -1, "", "", }, |
128 | }; | 128 | }; |
129 | 129 | ||
130 | static const table_entry_t uimage_type[] = { | 130 | static const table_entry_t uimage_type[] = { |
131 | { IH_TYPE_AISIMAGE, "aisimage", "Davinci AIS image",}, | 131 | { IH_TYPE_AISIMAGE, "aisimage", "Davinci AIS image",}, |
132 | { IH_TYPE_FILESYSTEM, "filesystem", "Filesystem Image", }, | 132 | { IH_TYPE_FILESYSTEM, "filesystem", "Filesystem Image", }, |
133 | { IH_TYPE_FIRMWARE, "firmware", "Firmware", }, | 133 | { IH_TYPE_FIRMWARE, "firmware", "Firmware", }, |
134 | { IH_TYPE_FLATDT, "flat_dt", "Flat Device Tree", }, | 134 | { IH_TYPE_FLATDT, "flat_dt", "Flat Device Tree", }, |
135 | { IH_TYPE_GPIMAGE, "gpimage", "TI Keystone SPL Image",}, | 135 | { IH_TYPE_GPIMAGE, "gpimage", "TI Keystone SPL Image",}, |
136 | { IH_TYPE_KERNEL, "kernel", "Kernel Image", }, | 136 | { IH_TYPE_KERNEL, "kernel", "Kernel Image", }, |
137 | { IH_TYPE_KERNEL_NOLOAD, "kernel_noload", "Kernel Image (no loading done)", }, | 137 | { IH_TYPE_KERNEL_NOLOAD, "kernel_noload", "Kernel Image (no loading done)", }, |
138 | { IH_TYPE_KWBIMAGE, "kwbimage", "Kirkwood Boot Image",}, | 138 | { IH_TYPE_KWBIMAGE, "kwbimage", "Kirkwood Boot Image",}, |
139 | { IH_TYPE_IMXIMAGE, "imximage", "Freescale i.MX Boot Image",}, | 139 | { IH_TYPE_IMXIMAGE, "imximage", "Freescale i.MX Boot Image",}, |
140 | { IH_TYPE_INVALID, NULL, "Invalid Image", }, | 140 | { IH_TYPE_INVALID, NULL, "Invalid Image", }, |
141 | { IH_TYPE_MULTI, "multi", "Multi-File Image", }, | 141 | { IH_TYPE_MULTI, "multi", "Multi-File Image", }, |
142 | { IH_TYPE_OMAPIMAGE, "omapimage", "TI OMAP SPL With GP CH",}, | 142 | { IH_TYPE_OMAPIMAGE, "omapimage", "TI OMAP SPL With GP CH",}, |
143 | { IH_TYPE_PBLIMAGE, "pblimage", "Freescale PBL Boot Image",}, | 143 | { IH_TYPE_PBLIMAGE, "pblimage", "Freescale PBL Boot Image",}, |
144 | { IH_TYPE_RAMDISK, "ramdisk", "RAMDisk Image", }, | 144 | { IH_TYPE_RAMDISK, "ramdisk", "RAMDisk Image", }, |
145 | { IH_TYPE_SCRIPT, "script", "Script", }, | 145 | { IH_TYPE_SCRIPT, "script", "Script", }, |
146 | { IH_TYPE_SOCFPGAIMAGE, "socfpgaimage", "Altera SOCFPGA preloader",}, | 146 | { IH_TYPE_SOCFPGAIMAGE, "socfpgaimage", "Altera SOCFPGA preloader",}, |
147 | { IH_TYPE_STANDALONE, "standalone", "Standalone Program", }, | 147 | { IH_TYPE_STANDALONE, "standalone", "Standalone Program", }, |
148 | { IH_TYPE_UBLIMAGE, "ublimage", "Davinci UBL image",}, | 148 | { IH_TYPE_UBLIMAGE, "ublimage", "Davinci UBL image",}, |
149 | { IH_TYPE_MXSIMAGE, "mxsimage", "Freescale MXS Boot Image",}, | 149 | { IH_TYPE_MXSIMAGE, "mxsimage", "Freescale MXS Boot Image",}, |
150 | { IH_TYPE_ATMELIMAGE, "atmelimage", "ATMEL ROM-Boot Image",}, | 150 | { IH_TYPE_ATMELIMAGE, "atmelimage", "ATMEL ROM-Boot Image",}, |
151 | { IH_TYPE_X86_SETUP, "x86_setup", "x86 setup.bin", }, | 151 | { IH_TYPE_X86_SETUP, "x86_setup", "x86 setup.bin", }, |
152 | { IH_TYPE_LPC32XXIMAGE, "lpc32xximage", "LPC32XX Boot Image", }, | ||
152 | { -1, "", "", }, | 153 | { -1, "", "", }, |
153 | }; | 154 | }; |
154 | 155 | ||
155 | static const table_entry_t uimage_comp[] = { | 156 | static const table_entry_t uimage_comp[] = { |
156 | { IH_COMP_NONE, "none", "uncompressed", }, | 157 | { IH_COMP_NONE, "none", "uncompressed", }, |
157 | { IH_COMP_BZIP2, "bzip2", "bzip2 compressed", }, | 158 | { IH_COMP_BZIP2, "bzip2", "bzip2 compressed", }, |
158 | { IH_COMP_GZIP, "gzip", "gzip compressed", }, | 159 | { IH_COMP_GZIP, "gzip", "gzip compressed", }, |
159 | { IH_COMP_LZMA, "lzma", "lzma compressed", }, | 160 | { IH_COMP_LZMA, "lzma", "lzma compressed", }, |
160 | { IH_COMP_LZO, "lzo", "lzo compressed", }, | 161 | { IH_COMP_LZO, "lzo", "lzo compressed", }, |
161 | { -1, "", "", }, | 162 | { -1, "", "", }, |
162 | }; | 163 | }; |
163 | 164 | ||
164 | /*****************************************************************************/ | 165 | /*****************************************************************************/ |
165 | /* Legacy format routines */ | 166 | /* Legacy format routines */ |
166 | /*****************************************************************************/ | 167 | /*****************************************************************************/ |
167 | int image_check_hcrc(const image_header_t *hdr) | 168 | int image_check_hcrc(const image_header_t *hdr) |
168 | { | 169 | { |
169 | ulong hcrc; | 170 | ulong hcrc; |
170 | ulong len = image_get_header_size(); | 171 | ulong len = image_get_header_size(); |
171 | image_header_t header; | 172 | image_header_t header; |
172 | 173 | ||
173 | /* Copy header so we can blank CRC field for re-calculation */ | 174 | /* Copy header so we can blank CRC field for re-calculation */ |
174 | memmove(&header, (char *)hdr, image_get_header_size()); | 175 | memmove(&header, (char *)hdr, image_get_header_size()); |
175 | image_set_hcrc(&header, 0); | 176 | image_set_hcrc(&header, 0); |
176 | 177 | ||
177 | hcrc = crc32(0, (unsigned char *)&header, len); | 178 | hcrc = crc32(0, (unsigned char *)&header, len); |
178 | 179 | ||
179 | return (hcrc == image_get_hcrc(hdr)); | 180 | return (hcrc == image_get_hcrc(hdr)); |
180 | } | 181 | } |
181 | 182 | ||
182 | int image_check_dcrc(const image_header_t *hdr) | 183 | int image_check_dcrc(const image_header_t *hdr) |
183 | { | 184 | { |
184 | ulong data = image_get_data(hdr); | 185 | ulong data = image_get_data(hdr); |
185 | ulong len = image_get_data_size(hdr); | 186 | ulong len = image_get_data_size(hdr); |
186 | ulong dcrc = crc32_wd(0, (unsigned char *)data, len, CHUNKSZ_CRC32); | 187 | ulong dcrc = crc32_wd(0, (unsigned char *)data, len, CHUNKSZ_CRC32); |
187 | 188 | ||
188 | return (dcrc == image_get_dcrc(hdr)); | 189 | return (dcrc == image_get_dcrc(hdr)); |
189 | } | 190 | } |
190 | 191 | ||
191 | /** | 192 | /** |
192 | * image_multi_count - get component (sub-image) count | 193 | * image_multi_count - get component (sub-image) count |
193 | * @hdr: pointer to the header of the multi component image | 194 | * @hdr: pointer to the header of the multi component image |
194 | * | 195 | * |
195 | * image_multi_count() returns number of components in a multi | 196 | * image_multi_count() returns number of components in a multi |
196 | * component image. | 197 | * component image. |
197 | * | 198 | * |
198 | * Note: no checking of the image type is done, caller must pass | 199 | * Note: no checking of the image type is done, caller must pass |
199 | * a valid multi component image. | 200 | * a valid multi component image. |
200 | * | 201 | * |
201 | * returns: | 202 | * returns: |
202 | * number of components | 203 | * number of components |
203 | */ | 204 | */ |
204 | ulong image_multi_count(const image_header_t *hdr) | 205 | ulong image_multi_count(const image_header_t *hdr) |
205 | { | 206 | { |
206 | ulong i, count = 0; | 207 | ulong i, count = 0; |
207 | uint32_t *size; | 208 | uint32_t *size; |
208 | 209 | ||
209 | /* get start of the image payload, which in case of multi | 210 | /* get start of the image payload, which in case of multi |
210 | * component images that points to a table of component sizes */ | 211 | * component images that points to a table of component sizes */ |
211 | size = (uint32_t *)image_get_data(hdr); | 212 | size = (uint32_t *)image_get_data(hdr); |
212 | 213 | ||
213 | /* count non empty slots */ | 214 | /* count non empty slots */ |
214 | for (i = 0; size[i]; ++i) | 215 | for (i = 0; size[i]; ++i) |
215 | count++; | 216 | count++; |
216 | 217 | ||
217 | return count; | 218 | return count; |
218 | } | 219 | } |
219 | 220 | ||
220 | /** | 221 | /** |
221 | * image_multi_getimg - get component data address and size | 222 | * image_multi_getimg - get component data address and size |
222 | * @hdr: pointer to the header of the multi component image | 223 | * @hdr: pointer to the header of the multi component image |
223 | * @idx: index of the requested component | 224 | * @idx: index of the requested component |
224 | * @data: pointer to a ulong variable, will hold component data address | 225 | * @data: pointer to a ulong variable, will hold component data address |
225 | * @len: pointer to a ulong variable, will hold component size | 226 | * @len: pointer to a ulong variable, will hold component size |
226 | * | 227 | * |
227 | * image_multi_getimg() returns size and data address for the requested | 228 | * image_multi_getimg() returns size and data address for the requested |
228 | * component in a multi component image. | 229 | * component in a multi component image. |
229 | * | 230 | * |
230 | * Note: no checking of the image type is done, caller must pass | 231 | * Note: no checking of the image type is done, caller must pass |
231 | * a valid multi component image. | 232 | * a valid multi component image. |
232 | * | 233 | * |
233 | * returns: | 234 | * returns: |
234 | * data address and size of the component, if idx is valid | 235 | * data address and size of the component, if idx is valid |
235 | * 0 in data and len, if idx is out of range | 236 | * 0 in data and len, if idx is out of range |
236 | */ | 237 | */ |
237 | void image_multi_getimg(const image_header_t *hdr, ulong idx, | 238 | void image_multi_getimg(const image_header_t *hdr, ulong idx, |
238 | ulong *data, ulong *len) | 239 | ulong *data, ulong *len) |
239 | { | 240 | { |
240 | int i; | 241 | int i; |
241 | uint32_t *size; | 242 | uint32_t *size; |
242 | ulong offset, count, img_data; | 243 | ulong offset, count, img_data; |
243 | 244 | ||
244 | /* get number of component */ | 245 | /* get number of component */ |
245 | count = image_multi_count(hdr); | 246 | count = image_multi_count(hdr); |
246 | 247 | ||
247 | /* get start of the image payload, which in case of multi | 248 | /* get start of the image payload, which in case of multi |
248 | * component images that points to a table of component sizes */ | 249 | * component images that points to a table of component sizes */ |
249 | size = (uint32_t *)image_get_data(hdr); | 250 | size = (uint32_t *)image_get_data(hdr); |
250 | 251 | ||
251 | /* get address of the proper component data start, which means | 252 | /* get address of the proper component data start, which means |
252 | * skipping sizes table (add 1 for last, null entry) */ | 253 | * skipping sizes table (add 1 for last, null entry) */ |
253 | img_data = image_get_data(hdr) + (count + 1) * sizeof(uint32_t); | 254 | img_data = image_get_data(hdr) + (count + 1) * sizeof(uint32_t); |
254 | 255 | ||
255 | if (idx < count) { | 256 | if (idx < count) { |
256 | *len = uimage_to_cpu(size[idx]); | 257 | *len = uimage_to_cpu(size[idx]); |
257 | offset = 0; | 258 | offset = 0; |
258 | 259 | ||
259 | /* go over all indices preceding requested component idx */ | 260 | /* go over all indices preceding requested component idx */ |
260 | for (i = 0; i < idx; i++) { | 261 | for (i = 0; i < idx; i++) { |
261 | /* add up i-th component size, rounding up to 4 bytes */ | 262 | /* add up i-th component size, rounding up to 4 bytes */ |
262 | offset += (uimage_to_cpu(size[i]) + 3) & ~3 ; | 263 | offset += (uimage_to_cpu(size[i]) + 3) & ~3 ; |
263 | } | 264 | } |
264 | 265 | ||
265 | /* calculate idx-th component data address */ | 266 | /* calculate idx-th component data address */ |
266 | *data = img_data + offset; | 267 | *data = img_data + offset; |
267 | } else { | 268 | } else { |
268 | *len = 0; | 269 | *len = 0; |
269 | *data = 0; | 270 | *data = 0; |
270 | } | 271 | } |
271 | } | 272 | } |
272 | 273 | ||
273 | static void image_print_type(const image_header_t *hdr) | 274 | static void image_print_type(const image_header_t *hdr) |
274 | { | 275 | { |
275 | const char *os, *arch, *type, *comp; | 276 | const char *os, *arch, *type, *comp; |
276 | 277 | ||
277 | os = genimg_get_os_name(image_get_os(hdr)); | 278 | os = genimg_get_os_name(image_get_os(hdr)); |
278 | arch = genimg_get_arch_name(image_get_arch(hdr)); | 279 | arch = genimg_get_arch_name(image_get_arch(hdr)); |
279 | type = genimg_get_type_name(image_get_type(hdr)); | 280 | type = genimg_get_type_name(image_get_type(hdr)); |
280 | comp = genimg_get_comp_name(image_get_comp(hdr)); | 281 | comp = genimg_get_comp_name(image_get_comp(hdr)); |
281 | 282 | ||
282 | printf("%s %s %s (%s)\n", arch, os, type, comp); | 283 | printf("%s %s %s (%s)\n", arch, os, type, comp); |
283 | } | 284 | } |
284 | 285 | ||
285 | /** | 286 | /** |
286 | * image_print_contents - prints out the contents of the legacy format image | 287 | * image_print_contents - prints out the contents of the legacy format image |
287 | * @ptr: pointer to the legacy format image header | 288 | * @ptr: pointer to the legacy format image header |
288 | * @p: pointer to prefix string | 289 | * @p: pointer to prefix string |
289 | * | 290 | * |
290 | * image_print_contents() formats a multi line legacy image contents description. | 291 | * image_print_contents() formats a multi line legacy image contents description. |
291 | * The routine prints out all header fields followed by the size/offset data | 292 | * The routine prints out all header fields followed by the size/offset data |
292 | * for MULTI/SCRIPT images. | 293 | * for MULTI/SCRIPT images. |
293 | * | 294 | * |
294 | * returns: | 295 | * returns: |
295 | * no returned results | 296 | * no returned results |
296 | */ | 297 | */ |
297 | void image_print_contents(const void *ptr) | 298 | void image_print_contents(const void *ptr) |
298 | { | 299 | { |
299 | const image_header_t *hdr = (const image_header_t *)ptr; | 300 | const image_header_t *hdr = (const image_header_t *)ptr; |
300 | const char *p; | 301 | const char *p; |
301 | 302 | ||
302 | p = IMAGE_INDENT_STRING; | 303 | p = IMAGE_INDENT_STRING; |
303 | printf("%sImage Name: %.*s\n", p, IH_NMLEN, image_get_name(hdr)); | 304 | printf("%sImage Name: %.*s\n", p, IH_NMLEN, image_get_name(hdr)); |
304 | if (IMAGE_ENABLE_TIMESTAMP) { | 305 | if (IMAGE_ENABLE_TIMESTAMP) { |
305 | printf("%sCreated: ", p); | 306 | printf("%sCreated: ", p); |
306 | genimg_print_time((time_t)image_get_time(hdr)); | 307 | genimg_print_time((time_t)image_get_time(hdr)); |
307 | } | 308 | } |
308 | printf("%sImage Type: ", p); | 309 | printf("%sImage Type: ", p); |
309 | image_print_type(hdr); | 310 | image_print_type(hdr); |
310 | printf("%sData Size: ", p); | 311 | printf("%sData Size: ", p); |
311 | genimg_print_size(image_get_data_size(hdr)); | 312 | genimg_print_size(image_get_data_size(hdr)); |
312 | printf("%sLoad Address: %08x\n", p, image_get_load(hdr)); | 313 | printf("%sLoad Address: %08x\n", p, image_get_load(hdr)); |
313 | printf("%sEntry Point: %08x\n", p, image_get_ep(hdr)); | 314 | printf("%sEntry Point: %08x\n", p, image_get_ep(hdr)); |
314 | 315 | ||
315 | if (image_check_type(hdr, IH_TYPE_MULTI) || | 316 | if (image_check_type(hdr, IH_TYPE_MULTI) || |
316 | image_check_type(hdr, IH_TYPE_SCRIPT)) { | 317 | image_check_type(hdr, IH_TYPE_SCRIPT)) { |
317 | int i; | 318 | int i; |
318 | ulong data, len; | 319 | ulong data, len; |
319 | ulong count = image_multi_count(hdr); | 320 | ulong count = image_multi_count(hdr); |
320 | 321 | ||
321 | printf("%sContents:\n", p); | 322 | printf("%sContents:\n", p); |
322 | for (i = 0; i < count; i++) { | 323 | for (i = 0; i < count; i++) { |
323 | image_multi_getimg(hdr, i, &data, &len); | 324 | image_multi_getimg(hdr, i, &data, &len); |
324 | 325 | ||
325 | printf("%s Image %d: ", p, i); | 326 | printf("%s Image %d: ", p, i); |
326 | genimg_print_size(len); | 327 | genimg_print_size(len); |
327 | 328 | ||
328 | if (image_check_type(hdr, IH_TYPE_SCRIPT) && i > 0) { | 329 | if (image_check_type(hdr, IH_TYPE_SCRIPT) && i > 0) { |
329 | /* | 330 | /* |
330 | * the user may need to know offsets | 331 | * the user may need to know offsets |
331 | * if planning to do something with | 332 | * if planning to do something with |
332 | * multiple files | 333 | * multiple files |
333 | */ | 334 | */ |
334 | printf("%s Offset = 0x%08lx\n", p, data); | 335 | printf("%s Offset = 0x%08lx\n", p, data); |
335 | } | 336 | } |
336 | } | 337 | } |
337 | } | 338 | } |
338 | } | 339 | } |
339 | 340 | ||
340 | 341 | ||
341 | #ifndef USE_HOSTCC | 342 | #ifndef USE_HOSTCC |
342 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) | 343 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
343 | /** | 344 | /** |
344 | * image_get_ramdisk - get and verify ramdisk image | 345 | * image_get_ramdisk - get and verify ramdisk image |
345 | * @rd_addr: ramdisk image start address | 346 | * @rd_addr: ramdisk image start address |
346 | * @arch: expected ramdisk architecture | 347 | * @arch: expected ramdisk architecture |
347 | * @verify: checksum verification flag | 348 | * @verify: checksum verification flag |
348 | * | 349 | * |
349 | * image_get_ramdisk() returns a pointer to the verified ramdisk image | 350 | * image_get_ramdisk() returns a pointer to the verified ramdisk image |
350 | * header. Routine receives image start address and expected architecture | 351 | * header. Routine receives image start address and expected architecture |
351 | * flag. Verification done covers data and header integrity and os/type/arch | 352 | * flag. Verification done covers data and header integrity and os/type/arch |
352 | * fields checking. | 353 | * fields checking. |
353 | * | 354 | * |
354 | * If dataflash support is enabled routine checks for dataflash addresses | 355 | * If dataflash support is enabled routine checks for dataflash addresses |
355 | * and handles required dataflash reads. | 356 | * and handles required dataflash reads. |
356 | * | 357 | * |
357 | * returns: | 358 | * returns: |
358 | * pointer to a ramdisk image header, if image was found and valid | 359 | * pointer to a ramdisk image header, if image was found and valid |
359 | * otherwise, return NULL | 360 | * otherwise, return NULL |
360 | */ | 361 | */ |
361 | static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch, | 362 | static const image_header_t *image_get_ramdisk(ulong rd_addr, uint8_t arch, |
362 | int verify) | 363 | int verify) |
363 | { | 364 | { |
364 | const image_header_t *rd_hdr = (const image_header_t *)rd_addr; | 365 | const image_header_t *rd_hdr = (const image_header_t *)rd_addr; |
365 | 366 | ||
366 | if (!image_check_magic(rd_hdr)) { | 367 | if (!image_check_magic(rd_hdr)) { |
367 | puts("Bad Magic Number\n"); | 368 | puts("Bad Magic Number\n"); |
368 | bootstage_error(BOOTSTAGE_ID_RD_MAGIC); | 369 | bootstage_error(BOOTSTAGE_ID_RD_MAGIC); |
369 | return NULL; | 370 | return NULL; |
370 | } | 371 | } |
371 | 372 | ||
372 | if (!image_check_hcrc(rd_hdr)) { | 373 | if (!image_check_hcrc(rd_hdr)) { |
373 | puts("Bad Header Checksum\n"); | 374 | puts("Bad Header Checksum\n"); |
374 | bootstage_error(BOOTSTAGE_ID_RD_HDR_CHECKSUM); | 375 | bootstage_error(BOOTSTAGE_ID_RD_HDR_CHECKSUM); |
375 | return NULL; | 376 | return NULL; |
376 | } | 377 | } |
377 | 378 | ||
378 | bootstage_mark(BOOTSTAGE_ID_RD_MAGIC); | 379 | bootstage_mark(BOOTSTAGE_ID_RD_MAGIC); |
379 | image_print_contents(rd_hdr); | 380 | image_print_contents(rd_hdr); |
380 | 381 | ||
381 | if (verify) { | 382 | if (verify) { |
382 | puts(" Verifying Checksum ... "); | 383 | puts(" Verifying Checksum ... "); |
383 | if (!image_check_dcrc(rd_hdr)) { | 384 | if (!image_check_dcrc(rd_hdr)) { |
384 | puts("Bad Data CRC\n"); | 385 | puts("Bad Data CRC\n"); |
385 | bootstage_error(BOOTSTAGE_ID_RD_CHECKSUM); | 386 | bootstage_error(BOOTSTAGE_ID_RD_CHECKSUM); |
386 | return NULL; | 387 | return NULL; |
387 | } | 388 | } |
388 | puts("OK\n"); | 389 | puts("OK\n"); |
389 | } | 390 | } |
390 | 391 | ||
391 | bootstage_mark(BOOTSTAGE_ID_RD_HDR_CHECKSUM); | 392 | bootstage_mark(BOOTSTAGE_ID_RD_HDR_CHECKSUM); |
392 | 393 | ||
393 | if (!image_check_os(rd_hdr, IH_OS_LINUX) || | 394 | if (!image_check_os(rd_hdr, IH_OS_LINUX) || |
394 | !image_check_arch(rd_hdr, arch) || | 395 | !image_check_arch(rd_hdr, arch) || |
395 | !image_check_type(rd_hdr, IH_TYPE_RAMDISK)) { | 396 | !image_check_type(rd_hdr, IH_TYPE_RAMDISK)) { |
396 | printf("No Linux %s Ramdisk Image\n", | 397 | printf("No Linux %s Ramdisk Image\n", |
397 | genimg_get_arch_name(arch)); | 398 | genimg_get_arch_name(arch)); |
398 | bootstage_error(BOOTSTAGE_ID_RAMDISK); | 399 | bootstage_error(BOOTSTAGE_ID_RAMDISK); |
399 | return NULL; | 400 | return NULL; |
400 | } | 401 | } |
401 | 402 | ||
402 | return rd_hdr; | 403 | return rd_hdr; |
403 | } | 404 | } |
404 | #endif | 405 | #endif |
405 | #endif /* !USE_HOSTCC */ | 406 | #endif /* !USE_HOSTCC */ |
406 | 407 | ||
407 | /*****************************************************************************/ | 408 | /*****************************************************************************/ |
408 | /* Shared dual-format routines */ | 409 | /* Shared dual-format routines */ |
409 | /*****************************************************************************/ | 410 | /*****************************************************************************/ |
410 | #ifndef USE_HOSTCC | 411 | #ifndef USE_HOSTCC |
411 | ulong load_addr = CONFIG_SYS_LOAD_ADDR; /* Default Load Address */ | 412 | ulong load_addr = CONFIG_SYS_LOAD_ADDR; /* Default Load Address */ |
412 | ulong save_addr; /* Default Save Address */ | 413 | ulong save_addr; /* Default Save Address */ |
413 | ulong save_size; /* Default Save Size (in bytes) */ | 414 | ulong save_size; /* Default Save Size (in bytes) */ |
414 | 415 | ||
415 | static int on_loadaddr(const char *name, const char *value, enum env_op op, | 416 | static int on_loadaddr(const char *name, const char *value, enum env_op op, |
416 | int flags) | 417 | int flags) |
417 | { | 418 | { |
418 | switch (op) { | 419 | switch (op) { |
419 | case env_op_create: | 420 | case env_op_create: |
420 | case env_op_overwrite: | 421 | case env_op_overwrite: |
421 | load_addr = simple_strtoul(value, NULL, 16); | 422 | load_addr = simple_strtoul(value, NULL, 16); |
422 | break; | 423 | break; |
423 | default: | 424 | default: |
424 | break; | 425 | break; |
425 | } | 426 | } |
426 | 427 | ||
427 | return 0; | 428 | return 0; |
428 | } | 429 | } |
429 | U_BOOT_ENV_CALLBACK(loadaddr, on_loadaddr); | 430 | U_BOOT_ENV_CALLBACK(loadaddr, on_loadaddr); |
430 | 431 | ||
431 | ulong getenv_bootm_low(void) | 432 | ulong getenv_bootm_low(void) |
432 | { | 433 | { |
433 | char *s = getenv("bootm_low"); | 434 | char *s = getenv("bootm_low"); |
434 | if (s) { | 435 | if (s) { |
435 | ulong tmp = simple_strtoul(s, NULL, 16); | 436 | ulong tmp = simple_strtoul(s, NULL, 16); |
436 | return tmp; | 437 | return tmp; |
437 | } | 438 | } |
438 | 439 | ||
439 | #if defined(CONFIG_SYS_SDRAM_BASE) | 440 | #if defined(CONFIG_SYS_SDRAM_BASE) |
440 | return CONFIG_SYS_SDRAM_BASE; | 441 | return CONFIG_SYS_SDRAM_BASE; |
441 | #elif defined(CONFIG_ARM) | 442 | #elif defined(CONFIG_ARM) |
442 | return gd->bd->bi_dram[0].start; | 443 | return gd->bd->bi_dram[0].start; |
443 | #else | 444 | #else |
444 | return 0; | 445 | return 0; |
445 | #endif | 446 | #endif |
446 | } | 447 | } |
447 | 448 | ||
448 | phys_size_t getenv_bootm_size(void) | 449 | phys_size_t getenv_bootm_size(void) |
449 | { | 450 | { |
450 | phys_size_t tmp; | 451 | phys_size_t tmp; |
451 | char *s = getenv("bootm_size"); | 452 | char *s = getenv("bootm_size"); |
452 | if (s) { | 453 | if (s) { |
453 | tmp = (phys_size_t)simple_strtoull(s, NULL, 16); | 454 | tmp = (phys_size_t)simple_strtoull(s, NULL, 16); |
454 | return tmp; | 455 | return tmp; |
455 | } | 456 | } |
456 | s = getenv("bootm_low"); | 457 | s = getenv("bootm_low"); |
457 | if (s) | 458 | if (s) |
458 | tmp = (phys_size_t)simple_strtoull(s, NULL, 16); | 459 | tmp = (phys_size_t)simple_strtoull(s, NULL, 16); |
459 | else | 460 | else |
460 | tmp = 0; | 461 | tmp = 0; |
461 | 462 | ||
462 | 463 | ||
463 | #if defined(CONFIG_ARM) | 464 | #if defined(CONFIG_ARM) |
464 | return gd->bd->bi_dram[0].size - tmp; | 465 | return gd->bd->bi_dram[0].size - tmp; |
465 | #else | 466 | #else |
466 | return gd->bd->bi_memsize - tmp; | 467 | return gd->bd->bi_memsize - tmp; |
467 | #endif | 468 | #endif |
468 | } | 469 | } |
469 | 470 | ||
470 | phys_size_t getenv_bootm_mapsize(void) | 471 | phys_size_t getenv_bootm_mapsize(void) |
471 | { | 472 | { |
472 | phys_size_t tmp; | 473 | phys_size_t tmp; |
473 | char *s = getenv("bootm_mapsize"); | 474 | char *s = getenv("bootm_mapsize"); |
474 | if (s) { | 475 | if (s) { |
475 | tmp = (phys_size_t)simple_strtoull(s, NULL, 16); | 476 | tmp = (phys_size_t)simple_strtoull(s, NULL, 16); |
476 | return tmp; | 477 | return tmp; |
477 | } | 478 | } |
478 | 479 | ||
479 | #if defined(CONFIG_SYS_BOOTMAPSZ) | 480 | #if defined(CONFIG_SYS_BOOTMAPSZ) |
480 | return CONFIG_SYS_BOOTMAPSZ; | 481 | return CONFIG_SYS_BOOTMAPSZ; |
481 | #else | 482 | #else |
482 | return getenv_bootm_size(); | 483 | return getenv_bootm_size(); |
483 | #endif | 484 | #endif |
484 | } | 485 | } |
485 | 486 | ||
486 | void memmove_wd(void *to, void *from, size_t len, ulong chunksz) | 487 | void memmove_wd(void *to, void *from, size_t len, ulong chunksz) |
487 | { | 488 | { |
488 | if (to == from) | 489 | if (to == from) |
489 | return; | 490 | return; |
490 | 491 | ||
491 | #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) | 492 | #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) |
492 | if (to > from) { | 493 | if (to > from) { |
493 | from += len; | 494 | from += len; |
494 | to += len; | 495 | to += len; |
495 | } | 496 | } |
496 | while (len > 0) { | 497 | while (len > 0) { |
497 | size_t tail = (len > chunksz) ? chunksz : len; | 498 | size_t tail = (len > chunksz) ? chunksz : len; |
498 | WATCHDOG_RESET(); | 499 | WATCHDOG_RESET(); |
499 | if (to > from) { | 500 | if (to > from) { |
500 | to -= tail; | 501 | to -= tail; |
501 | from -= tail; | 502 | from -= tail; |
502 | } | 503 | } |
503 | memmove(to, from, tail); | 504 | memmove(to, from, tail); |
504 | if (to < from) { | 505 | if (to < from) { |
505 | to += tail; | 506 | to += tail; |
506 | from += tail; | 507 | from += tail; |
507 | } | 508 | } |
508 | len -= tail; | 509 | len -= tail; |
509 | } | 510 | } |
510 | #else /* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */ | 511 | #else /* !(CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG) */ |
511 | memmove(to, from, len); | 512 | memmove(to, from, len); |
512 | #endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */ | 513 | #endif /* CONFIG_HW_WATCHDOG || CONFIG_WATCHDOG */ |
513 | } | 514 | } |
514 | #endif /* !USE_HOSTCC */ | 515 | #endif /* !USE_HOSTCC */ |
515 | 516 | ||
516 | void genimg_print_size(uint32_t size) | 517 | void genimg_print_size(uint32_t size) |
517 | { | 518 | { |
518 | #ifndef USE_HOSTCC | 519 | #ifndef USE_HOSTCC |
519 | printf("%d Bytes = ", size); | 520 | printf("%d Bytes = ", size); |
520 | print_size(size, "\n"); | 521 | print_size(size, "\n"); |
521 | #else | 522 | #else |
522 | printf("%d Bytes = %.2f kB = %.2f MB\n", | 523 | printf("%d Bytes = %.2f kB = %.2f MB\n", |
523 | size, (double)size / 1.024e3, | 524 | size, (double)size / 1.024e3, |
524 | (double)size / 1.048576e6); | 525 | (double)size / 1.048576e6); |
525 | #endif | 526 | #endif |
526 | } | 527 | } |
527 | 528 | ||
528 | #if IMAGE_ENABLE_TIMESTAMP | 529 | #if IMAGE_ENABLE_TIMESTAMP |
529 | void genimg_print_time(time_t timestamp) | 530 | void genimg_print_time(time_t timestamp) |
530 | { | 531 | { |
531 | #ifndef USE_HOSTCC | 532 | #ifndef USE_HOSTCC |
532 | struct rtc_time tm; | 533 | struct rtc_time tm; |
533 | 534 | ||
534 | to_tm(timestamp, &tm); | 535 | to_tm(timestamp, &tm); |
535 | printf("%4d-%02d-%02d %2d:%02d:%02d UTC\n", | 536 | printf("%4d-%02d-%02d %2d:%02d:%02d UTC\n", |
536 | tm.tm_year, tm.tm_mon, tm.tm_mday, | 537 | tm.tm_year, tm.tm_mon, tm.tm_mday, |
537 | tm.tm_hour, tm.tm_min, tm.tm_sec); | 538 | tm.tm_hour, tm.tm_min, tm.tm_sec); |
538 | #else | 539 | #else |
539 | printf("%s", ctime(×tamp)); | 540 | printf("%s", ctime(×tamp)); |
540 | #endif | 541 | #endif |
541 | } | 542 | } |
542 | #endif | 543 | #endif |
543 | 544 | ||
544 | /** | 545 | /** |
545 | * get_table_entry_name - translate entry id to long name | 546 | * get_table_entry_name - translate entry id to long name |
546 | * @table: pointer to a translation table for entries of a specific type | 547 | * @table: pointer to a translation table for entries of a specific type |
547 | * @msg: message to be returned when translation fails | 548 | * @msg: message to be returned when translation fails |
548 | * @id: entry id to be translated | 549 | * @id: entry id to be translated |
549 | * | 550 | * |
550 | * get_table_entry_name() will go over translation table trying to find | 551 | * get_table_entry_name() will go over translation table trying to find |
551 | * entry that matches given id. If matching entry is found, its long | 552 | * entry that matches given id. If matching entry is found, its long |
552 | * name is returned to the caller. | 553 | * name is returned to the caller. |
553 | * | 554 | * |
554 | * returns: | 555 | * returns: |
555 | * long entry name if translation succeeds | 556 | * long entry name if translation succeeds |
556 | * msg otherwise | 557 | * msg otherwise |
557 | */ | 558 | */ |
558 | char *get_table_entry_name(const table_entry_t *table, char *msg, int id) | 559 | char *get_table_entry_name(const table_entry_t *table, char *msg, int id) |
559 | { | 560 | { |
560 | for (; table->id >= 0; ++table) { | 561 | for (; table->id >= 0; ++table) { |
561 | if (table->id == id) | 562 | if (table->id == id) |
562 | #if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC) | 563 | #if defined(USE_HOSTCC) || !defined(CONFIG_NEEDS_MANUAL_RELOC) |
563 | return table->lname; | 564 | return table->lname; |
564 | #else | 565 | #else |
565 | return table->lname + gd->reloc_off; | 566 | return table->lname + gd->reloc_off; |
566 | #endif | 567 | #endif |
567 | } | 568 | } |
568 | return (msg); | 569 | return (msg); |
569 | } | 570 | } |
570 | 571 | ||
571 | const char *genimg_get_os_name(uint8_t os) | 572 | const char *genimg_get_os_name(uint8_t os) |
572 | { | 573 | { |
573 | return (get_table_entry_name(uimage_os, "Unknown OS", os)); | 574 | return (get_table_entry_name(uimage_os, "Unknown OS", os)); |
574 | } | 575 | } |
575 | 576 | ||
576 | const char *genimg_get_arch_name(uint8_t arch) | 577 | const char *genimg_get_arch_name(uint8_t arch) |
577 | { | 578 | { |
578 | return (get_table_entry_name(uimage_arch, "Unknown Architecture", | 579 | return (get_table_entry_name(uimage_arch, "Unknown Architecture", |
579 | arch)); | 580 | arch)); |
580 | } | 581 | } |
581 | 582 | ||
582 | const char *genimg_get_type_name(uint8_t type) | 583 | const char *genimg_get_type_name(uint8_t type) |
583 | { | 584 | { |
584 | return (get_table_entry_name(uimage_type, "Unknown Image", type)); | 585 | return (get_table_entry_name(uimage_type, "Unknown Image", type)); |
585 | } | 586 | } |
586 | 587 | ||
587 | const char *genimg_get_comp_name(uint8_t comp) | 588 | const char *genimg_get_comp_name(uint8_t comp) |
588 | { | 589 | { |
589 | return (get_table_entry_name(uimage_comp, "Unknown Compression", | 590 | return (get_table_entry_name(uimage_comp, "Unknown Compression", |
590 | comp)); | 591 | comp)); |
591 | } | 592 | } |
592 | 593 | ||
593 | /** | 594 | /** |
594 | * get_table_entry_id - translate short entry name to id | 595 | * get_table_entry_id - translate short entry name to id |
595 | * @table: pointer to a translation table for entries of a specific type | 596 | * @table: pointer to a translation table for entries of a specific type |
596 | * @table_name: to be used in case of error | 597 | * @table_name: to be used in case of error |
597 | * @name: entry short name to be translated | 598 | * @name: entry short name to be translated |
598 | * | 599 | * |
599 | * get_table_entry_id() will go over translation table trying to find | 600 | * get_table_entry_id() will go over translation table trying to find |
600 | * entry that matches given short name. If matching entry is found, | 601 | * entry that matches given short name. If matching entry is found, |
601 | * its id returned to the caller. | 602 | * its id returned to the caller. |
602 | * | 603 | * |
603 | * returns: | 604 | * returns: |
604 | * entry id if translation succeeds | 605 | * entry id if translation succeeds |
605 | * -1 otherwise | 606 | * -1 otherwise |
606 | */ | 607 | */ |
607 | int get_table_entry_id(const table_entry_t *table, | 608 | int get_table_entry_id(const table_entry_t *table, |
608 | const char *table_name, const char *name) | 609 | const char *table_name, const char *name) |
609 | { | 610 | { |
610 | const table_entry_t *t; | 611 | const table_entry_t *t; |
611 | #ifdef USE_HOSTCC | 612 | #ifdef USE_HOSTCC |
612 | int first = 1; | 613 | int first = 1; |
613 | 614 | ||
614 | for (t = table; t->id >= 0; ++t) { | 615 | for (t = table; t->id >= 0; ++t) { |
615 | if (t->sname && strcasecmp(t->sname, name) == 0) | 616 | if (t->sname && strcasecmp(t->sname, name) == 0) |
616 | return(t->id); | 617 | return(t->id); |
617 | } | 618 | } |
618 | 619 | ||
619 | fprintf(stderr, "\nInvalid %s Type - valid names are", table_name); | 620 | fprintf(stderr, "\nInvalid %s Type - valid names are", table_name); |
620 | for (t = table; t->id >= 0; ++t) { | 621 | for (t = table; t->id >= 0; ++t) { |
621 | if (t->sname == NULL) | 622 | if (t->sname == NULL) |
622 | continue; | 623 | continue; |
623 | fprintf(stderr, "%c %s", (first) ? ':' : ',', t->sname); | 624 | fprintf(stderr, "%c %s", (first) ? ':' : ',', t->sname); |
624 | first = 0; | 625 | first = 0; |
625 | } | 626 | } |
626 | fprintf(stderr, "\n"); | 627 | fprintf(stderr, "\n"); |
627 | #else | 628 | #else |
628 | for (t = table; t->id >= 0; ++t) { | 629 | for (t = table; t->id >= 0; ++t) { |
629 | #ifdef CONFIG_NEEDS_MANUAL_RELOC | 630 | #ifdef CONFIG_NEEDS_MANUAL_RELOC |
630 | if (t->sname && strcmp(t->sname + gd->reloc_off, name) == 0) | 631 | if (t->sname && strcmp(t->sname + gd->reloc_off, name) == 0) |
631 | #else | 632 | #else |
632 | if (t->sname && strcmp(t->sname, name) == 0) | 633 | if (t->sname && strcmp(t->sname, name) == 0) |
633 | #endif | 634 | #endif |
634 | return (t->id); | 635 | return (t->id); |
635 | } | 636 | } |
636 | debug("Invalid %s Type: %s\n", table_name, name); | 637 | debug("Invalid %s Type: %s\n", table_name, name); |
637 | #endif /* USE_HOSTCC */ | 638 | #endif /* USE_HOSTCC */ |
638 | return (-1); | 639 | return (-1); |
639 | } | 640 | } |
640 | 641 | ||
641 | int genimg_get_os_id(const char *name) | 642 | int genimg_get_os_id(const char *name) |
642 | { | 643 | { |
643 | return (get_table_entry_id(uimage_os, "OS", name)); | 644 | return (get_table_entry_id(uimage_os, "OS", name)); |
644 | } | 645 | } |
645 | 646 | ||
646 | int genimg_get_arch_id(const char *name) | 647 | int genimg_get_arch_id(const char *name) |
647 | { | 648 | { |
648 | return (get_table_entry_id(uimage_arch, "CPU", name)); | 649 | return (get_table_entry_id(uimage_arch, "CPU", name)); |
649 | } | 650 | } |
650 | 651 | ||
651 | int genimg_get_type_id(const char *name) | 652 | int genimg_get_type_id(const char *name) |
652 | { | 653 | { |
653 | return (get_table_entry_id(uimage_type, "Image", name)); | 654 | return (get_table_entry_id(uimage_type, "Image", name)); |
654 | } | 655 | } |
655 | 656 | ||
656 | int genimg_get_comp_id(const char *name) | 657 | int genimg_get_comp_id(const char *name) |
657 | { | 658 | { |
658 | return (get_table_entry_id(uimage_comp, "Compression", name)); | 659 | return (get_table_entry_id(uimage_comp, "Compression", name)); |
659 | } | 660 | } |
660 | 661 | ||
661 | #ifndef USE_HOSTCC | 662 | #ifndef USE_HOSTCC |
662 | /** | 663 | /** |
663 | * genimg_get_kernel_addr_fit - get the real kernel address and return 2 | 664 | * genimg_get_kernel_addr_fit - get the real kernel address and return 2 |
664 | * FIT strings | 665 | * FIT strings |
665 | * @img_addr: a string might contain real image address | 666 | * @img_addr: a string might contain real image address |
666 | * @fit_uname_config: double pointer to a char, will hold pointer to a | 667 | * @fit_uname_config: double pointer to a char, will hold pointer to a |
667 | * configuration unit name | 668 | * configuration unit name |
668 | * @fit_uname_kernel: double pointer to a char, will hold pointer to a subimage | 669 | * @fit_uname_kernel: double pointer to a char, will hold pointer to a subimage |
669 | * name | 670 | * name |
670 | * | 671 | * |
671 | * genimg_get_kernel_addr_fit get the real kernel start address from a string | 672 | * genimg_get_kernel_addr_fit get the real kernel start address from a string |
672 | * which is normally the first argv of bootm/bootz | 673 | * which is normally the first argv of bootm/bootz |
673 | * | 674 | * |
674 | * returns: | 675 | * returns: |
675 | * kernel start address | 676 | * kernel start address |
676 | */ | 677 | */ |
677 | ulong genimg_get_kernel_addr_fit(char * const img_addr, | 678 | ulong genimg_get_kernel_addr_fit(char * const img_addr, |
678 | const char **fit_uname_config, | 679 | const char **fit_uname_config, |
679 | const char **fit_uname_kernel) | 680 | const char **fit_uname_kernel) |
680 | { | 681 | { |
681 | ulong kernel_addr; | 682 | ulong kernel_addr; |
682 | 683 | ||
683 | /* find out kernel image address */ | 684 | /* find out kernel image address */ |
684 | if (!img_addr) { | 685 | if (!img_addr) { |
685 | kernel_addr = load_addr; | 686 | kernel_addr = load_addr; |
686 | debug("* kernel: default image load address = 0x%08lx\n", | 687 | debug("* kernel: default image load address = 0x%08lx\n", |
687 | load_addr); | 688 | load_addr); |
688 | #if defined(CONFIG_FIT) | 689 | #if defined(CONFIG_FIT) |
689 | } else if (fit_parse_conf(img_addr, load_addr, &kernel_addr, | 690 | } else if (fit_parse_conf(img_addr, load_addr, &kernel_addr, |
690 | fit_uname_config)) { | 691 | fit_uname_config)) { |
691 | debug("* kernel: config '%s' from image at 0x%08lx\n", | 692 | debug("* kernel: config '%s' from image at 0x%08lx\n", |
692 | *fit_uname_config, kernel_addr); | 693 | *fit_uname_config, kernel_addr); |
693 | } else if (fit_parse_subimage(img_addr, load_addr, &kernel_addr, | 694 | } else if (fit_parse_subimage(img_addr, load_addr, &kernel_addr, |
694 | fit_uname_kernel)) { | 695 | fit_uname_kernel)) { |
695 | debug("* kernel: subimage '%s' from image at 0x%08lx\n", | 696 | debug("* kernel: subimage '%s' from image at 0x%08lx\n", |
696 | *fit_uname_kernel, kernel_addr); | 697 | *fit_uname_kernel, kernel_addr); |
697 | #endif | 698 | #endif |
698 | } else { | 699 | } else { |
699 | kernel_addr = simple_strtoul(img_addr, NULL, 16); | 700 | kernel_addr = simple_strtoul(img_addr, NULL, 16); |
700 | debug("* kernel: cmdline image address = 0x%08lx\n", | 701 | debug("* kernel: cmdline image address = 0x%08lx\n", |
701 | kernel_addr); | 702 | kernel_addr); |
702 | } | 703 | } |
703 | 704 | ||
704 | return kernel_addr; | 705 | return kernel_addr; |
705 | } | 706 | } |
706 | 707 | ||
707 | /** | 708 | /** |
708 | * genimg_get_kernel_addr() is the simple version of | 709 | * genimg_get_kernel_addr() is the simple version of |
709 | * genimg_get_kernel_addr_fit(). It ignores those return FIT strings | 710 | * genimg_get_kernel_addr_fit(). It ignores those return FIT strings |
710 | */ | 711 | */ |
711 | ulong genimg_get_kernel_addr(char * const img_addr) | 712 | ulong genimg_get_kernel_addr(char * const img_addr) |
712 | { | 713 | { |
713 | const char *fit_uname_config = NULL; | 714 | const char *fit_uname_config = NULL; |
714 | const char *fit_uname_kernel = NULL; | 715 | const char *fit_uname_kernel = NULL; |
715 | 716 | ||
716 | return genimg_get_kernel_addr_fit(img_addr, &fit_uname_config, | 717 | return genimg_get_kernel_addr_fit(img_addr, &fit_uname_config, |
717 | &fit_uname_kernel); | 718 | &fit_uname_kernel); |
718 | } | 719 | } |
719 | 720 | ||
720 | /** | 721 | /** |
721 | * genimg_get_format - get image format type | 722 | * genimg_get_format - get image format type |
722 | * @img_addr: image start address | 723 | * @img_addr: image start address |
723 | * | 724 | * |
724 | * genimg_get_format() checks whether provided address points to a valid | 725 | * genimg_get_format() checks whether provided address points to a valid |
725 | * legacy or FIT image. | 726 | * legacy or FIT image. |
726 | * | 727 | * |
727 | * New uImage format and FDT blob are based on a libfdt. FDT blob | 728 | * New uImage format and FDT blob are based on a libfdt. FDT blob |
728 | * may be passed directly or embedded in a FIT image. In both situations | 729 | * may be passed directly or embedded in a FIT image. In both situations |
729 | * genimg_get_format() must be able to dectect libfdt header. | 730 | * genimg_get_format() must be able to dectect libfdt header. |
730 | * | 731 | * |
731 | * returns: | 732 | * returns: |
732 | * image format type or IMAGE_FORMAT_INVALID if no image is present | 733 | * image format type or IMAGE_FORMAT_INVALID if no image is present |
733 | */ | 734 | */ |
734 | int genimg_get_format(const void *img_addr) | 735 | int genimg_get_format(const void *img_addr) |
735 | { | 736 | { |
736 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) | 737 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
737 | const image_header_t *hdr; | 738 | const image_header_t *hdr; |
738 | 739 | ||
739 | hdr = (const image_header_t *)img_addr; | 740 | hdr = (const image_header_t *)img_addr; |
740 | if (image_check_magic(hdr)) | 741 | if (image_check_magic(hdr)) |
741 | return IMAGE_FORMAT_LEGACY; | 742 | return IMAGE_FORMAT_LEGACY; |
742 | #endif | 743 | #endif |
743 | #if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT) | 744 | #if defined(CONFIG_FIT) || defined(CONFIG_OF_LIBFDT) |
744 | if (fdt_check_header(img_addr) == 0) | 745 | if (fdt_check_header(img_addr) == 0) |
745 | return IMAGE_FORMAT_FIT; | 746 | return IMAGE_FORMAT_FIT; |
746 | #endif | 747 | #endif |
747 | #ifdef CONFIG_ANDROID_BOOT_IMAGE | 748 | #ifdef CONFIG_ANDROID_BOOT_IMAGE |
748 | if (android_image_check_header(img_addr) == 0) | 749 | if (android_image_check_header(img_addr) == 0) |
749 | return IMAGE_FORMAT_ANDROID; | 750 | return IMAGE_FORMAT_ANDROID; |
750 | #endif | 751 | #endif |
751 | 752 | ||
752 | return IMAGE_FORMAT_INVALID; | 753 | return IMAGE_FORMAT_INVALID; |
753 | } | 754 | } |
754 | 755 | ||
755 | /** | 756 | /** |
756 | * genimg_get_image - get image from special storage (if necessary) | 757 | * genimg_get_image - get image from special storage (if necessary) |
757 | * @img_addr: image start address | 758 | * @img_addr: image start address |
758 | * | 759 | * |
759 | * genimg_get_image() checks if provided image start address is located | 760 | * genimg_get_image() checks if provided image start address is located |
760 | * in a dataflash storage. If so, image is moved to a system RAM memory. | 761 | * in a dataflash storage. If so, image is moved to a system RAM memory. |
761 | * | 762 | * |
762 | * returns: | 763 | * returns: |
763 | * image start address after possible relocation from special storage | 764 | * image start address after possible relocation from special storage |
764 | */ | 765 | */ |
765 | ulong genimg_get_image(ulong img_addr) | 766 | ulong genimg_get_image(ulong img_addr) |
766 | { | 767 | { |
767 | ulong ram_addr = img_addr; | 768 | ulong ram_addr = img_addr; |
768 | 769 | ||
769 | #ifdef CONFIG_HAS_DATAFLASH | 770 | #ifdef CONFIG_HAS_DATAFLASH |
770 | ulong h_size, d_size; | 771 | ulong h_size, d_size; |
771 | 772 | ||
772 | if (addr_dataflash(img_addr)) { | 773 | if (addr_dataflash(img_addr)) { |
773 | void *buf; | 774 | void *buf; |
774 | 775 | ||
775 | /* ger RAM address */ | 776 | /* ger RAM address */ |
776 | ram_addr = CONFIG_SYS_LOAD_ADDR; | 777 | ram_addr = CONFIG_SYS_LOAD_ADDR; |
777 | 778 | ||
778 | /* get header size */ | 779 | /* get header size */ |
779 | h_size = image_get_header_size(); | 780 | h_size = image_get_header_size(); |
780 | #if defined(CONFIG_FIT) | 781 | #if defined(CONFIG_FIT) |
781 | if (sizeof(struct fdt_header) > h_size) | 782 | if (sizeof(struct fdt_header) > h_size) |
782 | h_size = sizeof(struct fdt_header); | 783 | h_size = sizeof(struct fdt_header); |
783 | #endif | 784 | #endif |
784 | 785 | ||
785 | /* read in header */ | 786 | /* read in header */ |
786 | debug(" Reading image header from dataflash address " | 787 | debug(" Reading image header from dataflash address " |
787 | "%08lx to RAM address %08lx\n", img_addr, ram_addr); | 788 | "%08lx to RAM address %08lx\n", img_addr, ram_addr); |
788 | 789 | ||
789 | buf = map_sysmem(ram_addr, 0); | 790 | buf = map_sysmem(ram_addr, 0); |
790 | read_dataflash(img_addr, h_size, buf); | 791 | read_dataflash(img_addr, h_size, buf); |
791 | 792 | ||
792 | /* get data size */ | 793 | /* get data size */ |
793 | switch (genimg_get_format(buf)) { | 794 | switch (genimg_get_format(buf)) { |
794 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) | 795 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
795 | case IMAGE_FORMAT_LEGACY: | 796 | case IMAGE_FORMAT_LEGACY: |
796 | d_size = image_get_data_size(buf); | 797 | d_size = image_get_data_size(buf); |
797 | debug(" Legacy format image found at 0x%08lx, " | 798 | debug(" Legacy format image found at 0x%08lx, " |
798 | "size 0x%08lx\n", | 799 | "size 0x%08lx\n", |
799 | ram_addr, d_size); | 800 | ram_addr, d_size); |
800 | break; | 801 | break; |
801 | #endif | 802 | #endif |
802 | #if defined(CONFIG_FIT) | 803 | #if defined(CONFIG_FIT) |
803 | case IMAGE_FORMAT_FIT: | 804 | case IMAGE_FORMAT_FIT: |
804 | d_size = fit_get_size(buf) - h_size; | 805 | d_size = fit_get_size(buf) - h_size; |
805 | debug(" FIT/FDT format image found at 0x%08lx, " | 806 | debug(" FIT/FDT format image found at 0x%08lx, " |
806 | "size 0x%08lx\n", | 807 | "size 0x%08lx\n", |
807 | ram_addr, d_size); | 808 | ram_addr, d_size); |
808 | break; | 809 | break; |
809 | #endif | 810 | #endif |
810 | default: | 811 | default: |
811 | printf(" No valid image found at 0x%08lx\n", | 812 | printf(" No valid image found at 0x%08lx\n", |
812 | img_addr); | 813 | img_addr); |
813 | return ram_addr; | 814 | return ram_addr; |
814 | } | 815 | } |
815 | 816 | ||
816 | /* read in image data */ | 817 | /* read in image data */ |
817 | debug(" Reading image remaining data from dataflash address " | 818 | debug(" Reading image remaining data from dataflash address " |
818 | "%08lx to RAM address %08lx\n", img_addr + h_size, | 819 | "%08lx to RAM address %08lx\n", img_addr + h_size, |
819 | ram_addr + h_size); | 820 | ram_addr + h_size); |
820 | 821 | ||
821 | read_dataflash(img_addr + h_size, d_size, | 822 | read_dataflash(img_addr + h_size, d_size, |
822 | (char *)(buf + h_size)); | 823 | (char *)(buf + h_size)); |
823 | 824 | ||
824 | } | 825 | } |
825 | #endif /* CONFIG_HAS_DATAFLASH */ | 826 | #endif /* CONFIG_HAS_DATAFLASH */ |
826 | 827 | ||
827 | return ram_addr; | 828 | return ram_addr; |
828 | } | 829 | } |
829 | 830 | ||
830 | /** | 831 | /** |
831 | * fit_has_config - check if there is a valid FIT configuration | 832 | * fit_has_config - check if there is a valid FIT configuration |
832 | * @images: pointer to the bootm command headers structure | 833 | * @images: pointer to the bootm command headers structure |
833 | * | 834 | * |
834 | * fit_has_config() checks if there is a FIT configuration in use | 835 | * fit_has_config() checks if there is a FIT configuration in use |
835 | * (if FTI support is present). | 836 | * (if FTI support is present). |
836 | * | 837 | * |
837 | * returns: | 838 | * returns: |
838 | * 0, no FIT support or no configuration found | 839 | * 0, no FIT support or no configuration found |
839 | * 1, configuration found | 840 | * 1, configuration found |
840 | */ | 841 | */ |
841 | int genimg_has_config(bootm_headers_t *images) | 842 | int genimg_has_config(bootm_headers_t *images) |
842 | { | 843 | { |
843 | #if defined(CONFIG_FIT) | 844 | #if defined(CONFIG_FIT) |
844 | if (images->fit_uname_cfg) | 845 | if (images->fit_uname_cfg) |
845 | return 1; | 846 | return 1; |
846 | #endif | 847 | #endif |
847 | return 0; | 848 | return 0; |
848 | } | 849 | } |
849 | 850 | ||
850 | /** | 851 | /** |
851 | * boot_get_ramdisk - main ramdisk handling routine | 852 | * boot_get_ramdisk - main ramdisk handling routine |
852 | * @argc: command argument count | 853 | * @argc: command argument count |
853 | * @argv: command argument list | 854 | * @argv: command argument list |
854 | * @images: pointer to the bootm images structure | 855 | * @images: pointer to the bootm images structure |
855 | * @arch: expected ramdisk architecture | 856 | * @arch: expected ramdisk architecture |
856 | * @rd_start: pointer to a ulong variable, will hold ramdisk start address | 857 | * @rd_start: pointer to a ulong variable, will hold ramdisk start address |
857 | * @rd_end: pointer to a ulong variable, will hold ramdisk end | 858 | * @rd_end: pointer to a ulong variable, will hold ramdisk end |
858 | * | 859 | * |
859 | * boot_get_ramdisk() is responsible for finding a valid ramdisk image. | 860 | * boot_get_ramdisk() is responsible for finding a valid ramdisk image. |
860 | * Curently supported are the following ramdisk sources: | 861 | * Curently supported are the following ramdisk sources: |
861 | * - multicomponent kernel/ramdisk image, | 862 | * - multicomponent kernel/ramdisk image, |
862 | * - commandline provided address of decicated ramdisk image. | 863 | * - commandline provided address of decicated ramdisk image. |
863 | * | 864 | * |
864 | * returns: | 865 | * returns: |
865 | * 0, if ramdisk image was found and valid, or skiped | 866 | * 0, if ramdisk image was found and valid, or skiped |
866 | * rd_start and rd_end are set to ramdisk start/end addresses if | 867 | * rd_start and rd_end are set to ramdisk start/end addresses if |
867 | * ramdisk image is found and valid | 868 | * ramdisk image is found and valid |
868 | * | 869 | * |
869 | * 1, if ramdisk image is found but corrupted, or invalid | 870 | * 1, if ramdisk image is found but corrupted, or invalid |
870 | * rd_start and rd_end are set to 0 if no ramdisk exists | 871 | * rd_start and rd_end are set to 0 if no ramdisk exists |
871 | */ | 872 | */ |
872 | int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images, | 873 | int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images, |
873 | uint8_t arch, ulong *rd_start, ulong *rd_end) | 874 | uint8_t arch, ulong *rd_start, ulong *rd_end) |
874 | { | 875 | { |
875 | ulong rd_addr, rd_load; | 876 | ulong rd_addr, rd_load; |
876 | ulong rd_data, rd_len; | 877 | ulong rd_data, rd_len; |
877 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) | 878 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
878 | const image_header_t *rd_hdr; | 879 | const image_header_t *rd_hdr; |
879 | #endif | 880 | #endif |
880 | void *buf; | 881 | void *buf; |
881 | #ifdef CONFIG_SUPPORT_RAW_INITRD | 882 | #ifdef CONFIG_SUPPORT_RAW_INITRD |
882 | char *end; | 883 | char *end; |
883 | #endif | 884 | #endif |
884 | #if defined(CONFIG_FIT) | 885 | #if defined(CONFIG_FIT) |
885 | const char *fit_uname_config = images->fit_uname_cfg; | 886 | const char *fit_uname_config = images->fit_uname_cfg; |
886 | const char *fit_uname_ramdisk = NULL; | 887 | const char *fit_uname_ramdisk = NULL; |
887 | ulong default_addr; | 888 | ulong default_addr; |
888 | int rd_noffset; | 889 | int rd_noffset; |
889 | #endif | 890 | #endif |
890 | const char *select = NULL; | 891 | const char *select = NULL; |
891 | 892 | ||
892 | *rd_start = 0; | 893 | *rd_start = 0; |
893 | *rd_end = 0; | 894 | *rd_end = 0; |
894 | 895 | ||
895 | if (argc >= 2) | 896 | if (argc >= 2) |
896 | select = argv[1]; | 897 | select = argv[1]; |
897 | /* | 898 | /* |
898 | * Look for a '-' which indicates to ignore the | 899 | * Look for a '-' which indicates to ignore the |
899 | * ramdisk argument | 900 | * ramdisk argument |
900 | */ | 901 | */ |
901 | if (select && strcmp(select, "-") == 0) { | 902 | if (select && strcmp(select, "-") == 0) { |
902 | debug("## Skipping init Ramdisk\n"); | 903 | debug("## Skipping init Ramdisk\n"); |
903 | rd_len = rd_data = 0; | 904 | rd_len = rd_data = 0; |
904 | } else if (select || genimg_has_config(images)) { | 905 | } else if (select || genimg_has_config(images)) { |
905 | #if defined(CONFIG_FIT) | 906 | #if defined(CONFIG_FIT) |
906 | if (select) { | 907 | if (select) { |
907 | /* | 908 | /* |
908 | * If the init ramdisk comes from the FIT image and | 909 | * If the init ramdisk comes from the FIT image and |
909 | * the FIT image address is omitted in the command | 910 | * the FIT image address is omitted in the command |
910 | * line argument, try to use os FIT image address or | 911 | * line argument, try to use os FIT image address or |
911 | * default load address. | 912 | * default load address. |
912 | */ | 913 | */ |
913 | if (images->fit_uname_os) | 914 | if (images->fit_uname_os) |
914 | default_addr = (ulong)images->fit_hdr_os; | 915 | default_addr = (ulong)images->fit_hdr_os; |
915 | else | 916 | else |
916 | default_addr = load_addr; | 917 | default_addr = load_addr; |
917 | 918 | ||
918 | if (fit_parse_conf(select, default_addr, | 919 | if (fit_parse_conf(select, default_addr, |
919 | &rd_addr, &fit_uname_config)) { | 920 | &rd_addr, &fit_uname_config)) { |
920 | debug("* ramdisk: config '%s' from image at " | 921 | debug("* ramdisk: config '%s' from image at " |
921 | "0x%08lx\n", | 922 | "0x%08lx\n", |
922 | fit_uname_config, rd_addr); | 923 | fit_uname_config, rd_addr); |
923 | } else if (fit_parse_subimage(select, default_addr, | 924 | } else if (fit_parse_subimage(select, default_addr, |
924 | &rd_addr, &fit_uname_ramdisk)) { | 925 | &rd_addr, &fit_uname_ramdisk)) { |
925 | debug("* ramdisk: subimage '%s' from image at " | 926 | debug("* ramdisk: subimage '%s' from image at " |
926 | "0x%08lx\n", | 927 | "0x%08lx\n", |
927 | fit_uname_ramdisk, rd_addr); | 928 | fit_uname_ramdisk, rd_addr); |
928 | } else | 929 | } else |
929 | #endif | 930 | #endif |
930 | { | 931 | { |
931 | rd_addr = simple_strtoul(select, NULL, 16); | 932 | rd_addr = simple_strtoul(select, NULL, 16); |
932 | debug("* ramdisk: cmdline image address = " | 933 | debug("* ramdisk: cmdline image address = " |
933 | "0x%08lx\n", | 934 | "0x%08lx\n", |
934 | rd_addr); | 935 | rd_addr); |
935 | } | 936 | } |
936 | #if defined(CONFIG_FIT) | 937 | #if defined(CONFIG_FIT) |
937 | } else { | 938 | } else { |
938 | /* use FIT configuration provided in first bootm | 939 | /* use FIT configuration provided in first bootm |
939 | * command argument. If the property is not defined, | 940 | * command argument. If the property is not defined, |
940 | * quit silently. | 941 | * quit silently. |
941 | */ | 942 | */ |
942 | rd_addr = map_to_sysmem(images->fit_hdr_os); | 943 | rd_addr = map_to_sysmem(images->fit_hdr_os); |
943 | rd_noffset = fit_get_node_from_config(images, | 944 | rd_noffset = fit_get_node_from_config(images, |
944 | FIT_RAMDISK_PROP, rd_addr); | 945 | FIT_RAMDISK_PROP, rd_addr); |
945 | if (rd_noffset == -ENOLINK) | 946 | if (rd_noffset == -ENOLINK) |
946 | return 0; | 947 | return 0; |
947 | else if (rd_noffset < 0) | 948 | else if (rd_noffset < 0) |
948 | return 1; | 949 | return 1; |
949 | } | 950 | } |
950 | #endif | 951 | #endif |
951 | 952 | ||
952 | /* copy from dataflash if needed */ | 953 | /* copy from dataflash if needed */ |
953 | rd_addr = genimg_get_image(rd_addr); | 954 | rd_addr = genimg_get_image(rd_addr); |
954 | 955 | ||
955 | /* | 956 | /* |
956 | * Check if there is an initrd image at the | 957 | * Check if there is an initrd image at the |
957 | * address provided in the second bootm argument | 958 | * address provided in the second bootm argument |
958 | * check image type, for FIT images get FIT node. | 959 | * check image type, for FIT images get FIT node. |
959 | */ | 960 | */ |
960 | buf = map_sysmem(rd_addr, 0); | 961 | buf = map_sysmem(rd_addr, 0); |
961 | switch (genimg_get_format(buf)) { | 962 | switch (genimg_get_format(buf)) { |
962 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) | 963 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
963 | case IMAGE_FORMAT_LEGACY: | 964 | case IMAGE_FORMAT_LEGACY: |
964 | printf("## Loading init Ramdisk from Legacy " | 965 | printf("## Loading init Ramdisk from Legacy " |
965 | "Image at %08lx ...\n", rd_addr); | 966 | "Image at %08lx ...\n", rd_addr); |
966 | 967 | ||
967 | bootstage_mark(BOOTSTAGE_ID_CHECK_RAMDISK); | 968 | bootstage_mark(BOOTSTAGE_ID_CHECK_RAMDISK); |
968 | rd_hdr = image_get_ramdisk(rd_addr, arch, | 969 | rd_hdr = image_get_ramdisk(rd_addr, arch, |
969 | images->verify); | 970 | images->verify); |
970 | 971 | ||
971 | if (rd_hdr == NULL) | 972 | if (rd_hdr == NULL) |
972 | return 1; | 973 | return 1; |
973 | 974 | ||
974 | rd_data = image_get_data(rd_hdr); | 975 | rd_data = image_get_data(rd_hdr); |
975 | rd_len = image_get_data_size(rd_hdr); | 976 | rd_len = image_get_data_size(rd_hdr); |
976 | rd_load = image_get_load(rd_hdr); | 977 | rd_load = image_get_load(rd_hdr); |
977 | break; | 978 | break; |
978 | #endif | 979 | #endif |
979 | #if defined(CONFIG_FIT) | 980 | #if defined(CONFIG_FIT) |
980 | case IMAGE_FORMAT_FIT: | 981 | case IMAGE_FORMAT_FIT: |
981 | rd_noffset = fit_image_load(images, | 982 | rd_noffset = fit_image_load(images, |
982 | rd_addr, &fit_uname_ramdisk, | 983 | rd_addr, &fit_uname_ramdisk, |
983 | &fit_uname_config, arch, | 984 | &fit_uname_config, arch, |
984 | IH_TYPE_RAMDISK, | 985 | IH_TYPE_RAMDISK, |
985 | BOOTSTAGE_ID_FIT_RD_START, | 986 | BOOTSTAGE_ID_FIT_RD_START, |
986 | FIT_LOAD_OPTIONAL_NON_ZERO, | 987 | FIT_LOAD_OPTIONAL_NON_ZERO, |
987 | &rd_data, &rd_len); | 988 | &rd_data, &rd_len); |
988 | if (rd_noffset < 0) | 989 | if (rd_noffset < 0) |
989 | return 1; | 990 | return 1; |
990 | 991 | ||
991 | images->fit_hdr_rd = map_sysmem(rd_addr, 0); | 992 | images->fit_hdr_rd = map_sysmem(rd_addr, 0); |
992 | images->fit_uname_rd = fit_uname_ramdisk; | 993 | images->fit_uname_rd = fit_uname_ramdisk; |
993 | images->fit_noffset_rd = rd_noffset; | 994 | images->fit_noffset_rd = rd_noffset; |
994 | break; | 995 | break; |
995 | #endif | 996 | #endif |
996 | default: | 997 | default: |
997 | #ifdef CONFIG_SUPPORT_RAW_INITRD | 998 | #ifdef CONFIG_SUPPORT_RAW_INITRD |
998 | end = NULL; | 999 | end = NULL; |
999 | if (select) | 1000 | if (select) |
1000 | end = strchr(select, ':'); | 1001 | end = strchr(select, ':'); |
1001 | if (end) { | 1002 | if (end) { |
1002 | rd_len = simple_strtoul(++end, NULL, 16); | 1003 | rd_len = simple_strtoul(++end, NULL, 16); |
1003 | rd_data = rd_addr; | 1004 | rd_data = rd_addr; |
1004 | } else | 1005 | } else |
1005 | #endif | 1006 | #endif |
1006 | { | 1007 | { |
1007 | puts("Wrong Ramdisk Image Format\n"); | 1008 | puts("Wrong Ramdisk Image Format\n"); |
1008 | rd_data = rd_len = rd_load = 0; | 1009 | rd_data = rd_len = rd_load = 0; |
1009 | return 1; | 1010 | return 1; |
1010 | } | 1011 | } |
1011 | } | 1012 | } |
1012 | } else if (images->legacy_hdr_valid && | 1013 | } else if (images->legacy_hdr_valid && |
1013 | image_check_type(&images->legacy_hdr_os_copy, | 1014 | image_check_type(&images->legacy_hdr_os_copy, |
1014 | IH_TYPE_MULTI)) { | 1015 | IH_TYPE_MULTI)) { |
1015 | 1016 | ||
1016 | /* | 1017 | /* |
1017 | * Now check if we have a legacy mult-component image, | 1018 | * Now check if we have a legacy mult-component image, |
1018 | * get second entry data start address and len. | 1019 | * get second entry data start address and len. |
1019 | */ | 1020 | */ |
1020 | bootstage_mark(BOOTSTAGE_ID_RAMDISK); | 1021 | bootstage_mark(BOOTSTAGE_ID_RAMDISK); |
1021 | printf("## Loading init Ramdisk from multi component " | 1022 | printf("## Loading init Ramdisk from multi component " |
1022 | "Legacy Image at %08lx ...\n", | 1023 | "Legacy Image at %08lx ...\n", |
1023 | (ulong)images->legacy_hdr_os); | 1024 | (ulong)images->legacy_hdr_os); |
1024 | 1025 | ||
1025 | image_multi_getimg(images->legacy_hdr_os, 1, &rd_data, &rd_len); | 1026 | image_multi_getimg(images->legacy_hdr_os, 1, &rd_data, &rd_len); |
1026 | } | 1027 | } |
1027 | #ifdef CONFIG_ANDROID_BOOT_IMAGE | 1028 | #ifdef CONFIG_ANDROID_BOOT_IMAGE |
1028 | else if ((genimg_get_format((void *)images->os.start) | 1029 | else if ((genimg_get_format((void *)images->os.start) |
1029 | == IMAGE_FORMAT_ANDROID) && | 1030 | == IMAGE_FORMAT_ANDROID) && |
1030 | (!android_image_get_ramdisk((void *)images->os.start, | 1031 | (!android_image_get_ramdisk((void *)images->os.start, |
1031 | &rd_data, &rd_len))) { | 1032 | &rd_data, &rd_len))) { |
1032 | /* empty */ | 1033 | /* empty */ |
1033 | } | 1034 | } |
1034 | #endif | 1035 | #endif |
1035 | else { | 1036 | else { |
1036 | /* | 1037 | /* |
1037 | * no initrd image | 1038 | * no initrd image |
1038 | */ | 1039 | */ |
1039 | bootstage_mark(BOOTSTAGE_ID_NO_RAMDISK); | 1040 | bootstage_mark(BOOTSTAGE_ID_NO_RAMDISK); |
1040 | rd_len = rd_data = 0; | 1041 | rd_len = rd_data = 0; |
1041 | } | 1042 | } |
1042 | 1043 | ||
1043 | if (!rd_data) { | 1044 | if (!rd_data) { |
1044 | debug("## No init Ramdisk\n"); | 1045 | debug("## No init Ramdisk\n"); |
1045 | } else { | 1046 | } else { |
1046 | *rd_start = rd_data; | 1047 | *rd_start = rd_data; |
1047 | *rd_end = rd_data + rd_len; | 1048 | *rd_end = rd_data + rd_len; |
1048 | } | 1049 | } |
1049 | debug(" ramdisk start = 0x%08lx, ramdisk end = 0x%08lx\n", | 1050 | debug(" ramdisk start = 0x%08lx, ramdisk end = 0x%08lx\n", |
1050 | *rd_start, *rd_end); | 1051 | *rd_start, *rd_end); |
1051 | 1052 | ||
1052 | return 0; | 1053 | return 0; |
1053 | } | 1054 | } |
1054 | 1055 | ||
1055 | #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH | 1056 | #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH |
1056 | /** | 1057 | /** |
1057 | * boot_ramdisk_high - relocate init ramdisk | 1058 | * boot_ramdisk_high - relocate init ramdisk |
1058 | * @lmb: pointer to lmb handle, will be used for memory mgmt | 1059 | * @lmb: pointer to lmb handle, will be used for memory mgmt |
1059 | * @rd_data: ramdisk data start address | 1060 | * @rd_data: ramdisk data start address |
1060 | * @rd_len: ramdisk data length | 1061 | * @rd_len: ramdisk data length |
1061 | * @initrd_start: pointer to a ulong variable, will hold final init ramdisk | 1062 | * @initrd_start: pointer to a ulong variable, will hold final init ramdisk |
1062 | * start address (after possible relocation) | 1063 | * start address (after possible relocation) |
1063 | * @initrd_end: pointer to a ulong variable, will hold final init ramdisk | 1064 | * @initrd_end: pointer to a ulong variable, will hold final init ramdisk |
1064 | * end address (after possible relocation) | 1065 | * end address (after possible relocation) |
1065 | * | 1066 | * |
1066 | * boot_ramdisk_high() takes a relocation hint from "initrd_high" environment | 1067 | * boot_ramdisk_high() takes a relocation hint from "initrd_high" environment |
1067 | * variable and if requested ramdisk data is moved to a specified location. | 1068 | * variable and if requested ramdisk data is moved to a specified location. |
1068 | * | 1069 | * |
1069 | * Initrd_start and initrd_end are set to final (after relocation) ramdisk | 1070 | * Initrd_start and initrd_end are set to final (after relocation) ramdisk |
1070 | * start/end addresses if ramdisk image start and len were provided, | 1071 | * start/end addresses if ramdisk image start and len were provided, |
1071 | * otherwise set initrd_start and initrd_end set to zeros. | 1072 | * otherwise set initrd_start and initrd_end set to zeros. |
1072 | * | 1073 | * |
1073 | * returns: | 1074 | * returns: |
1074 | * 0 - success | 1075 | * 0 - success |
1075 | * -1 - failure | 1076 | * -1 - failure |
1076 | */ | 1077 | */ |
1077 | int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len, | 1078 | int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len, |
1078 | ulong *initrd_start, ulong *initrd_end) | 1079 | ulong *initrd_start, ulong *initrd_end) |
1079 | { | 1080 | { |
1080 | char *s; | 1081 | char *s; |
1081 | ulong initrd_high; | 1082 | ulong initrd_high; |
1082 | int initrd_copy_to_ram = 1; | 1083 | int initrd_copy_to_ram = 1; |
1083 | 1084 | ||
1084 | if ((s = getenv("initrd_high")) != NULL) { | 1085 | if ((s = getenv("initrd_high")) != NULL) { |
1085 | /* a value of "no" or a similar string will act like 0, | 1086 | /* a value of "no" or a similar string will act like 0, |
1086 | * turning the "load high" feature off. This is intentional. | 1087 | * turning the "load high" feature off. This is intentional. |
1087 | */ | 1088 | */ |
1088 | initrd_high = simple_strtoul(s, NULL, 16); | 1089 | initrd_high = simple_strtoul(s, NULL, 16); |
1089 | if (initrd_high == ~0) | 1090 | if (initrd_high == ~0) |
1090 | initrd_copy_to_ram = 0; | 1091 | initrd_copy_to_ram = 0; |
1091 | } else { | 1092 | } else { |
1092 | /* not set, no restrictions to load high */ | 1093 | /* not set, no restrictions to load high */ |
1093 | initrd_high = ~0; | 1094 | initrd_high = ~0; |
1094 | } | 1095 | } |
1095 | 1096 | ||
1096 | 1097 | ||
1097 | #ifdef CONFIG_LOGBUFFER | 1098 | #ifdef CONFIG_LOGBUFFER |
1098 | /* Prevent initrd from overwriting logbuffer */ | 1099 | /* Prevent initrd from overwriting logbuffer */ |
1099 | lmb_reserve(lmb, logbuffer_base() - LOGBUFF_OVERHEAD, LOGBUFF_RESERVE); | 1100 | lmb_reserve(lmb, logbuffer_base() - LOGBUFF_OVERHEAD, LOGBUFF_RESERVE); |
1100 | #endif | 1101 | #endif |
1101 | 1102 | ||
1102 | debug("## initrd_high = 0x%08lx, copy_to_ram = %d\n", | 1103 | debug("## initrd_high = 0x%08lx, copy_to_ram = %d\n", |
1103 | initrd_high, initrd_copy_to_ram); | 1104 | initrd_high, initrd_copy_to_ram); |
1104 | 1105 | ||
1105 | if (rd_data) { | 1106 | if (rd_data) { |
1106 | if (!initrd_copy_to_ram) { /* zero-copy ramdisk support */ | 1107 | if (!initrd_copy_to_ram) { /* zero-copy ramdisk support */ |
1107 | debug(" in-place initrd\n"); | 1108 | debug(" in-place initrd\n"); |
1108 | *initrd_start = rd_data; | 1109 | *initrd_start = rd_data; |
1109 | *initrd_end = rd_data + rd_len; | 1110 | *initrd_end = rd_data + rd_len; |
1110 | lmb_reserve(lmb, rd_data, rd_len); | 1111 | lmb_reserve(lmb, rd_data, rd_len); |
1111 | } else { | 1112 | } else { |
1112 | if (initrd_high) | 1113 | if (initrd_high) |
1113 | *initrd_start = (ulong)lmb_alloc_base(lmb, | 1114 | *initrd_start = (ulong)lmb_alloc_base(lmb, |
1114 | rd_len, 0x1000, initrd_high); | 1115 | rd_len, 0x1000, initrd_high); |
1115 | else | 1116 | else |
1116 | *initrd_start = (ulong)lmb_alloc(lmb, rd_len, | 1117 | *initrd_start = (ulong)lmb_alloc(lmb, rd_len, |
1117 | 0x1000); | 1118 | 0x1000); |
1118 | 1119 | ||
1119 | if (*initrd_start == 0) { | 1120 | if (*initrd_start == 0) { |
1120 | puts("ramdisk - allocation error\n"); | 1121 | puts("ramdisk - allocation error\n"); |
1121 | goto error; | 1122 | goto error; |
1122 | } | 1123 | } |
1123 | bootstage_mark(BOOTSTAGE_ID_COPY_RAMDISK); | 1124 | bootstage_mark(BOOTSTAGE_ID_COPY_RAMDISK); |
1124 | 1125 | ||
1125 | *initrd_end = *initrd_start + rd_len; | 1126 | *initrd_end = *initrd_start + rd_len; |
1126 | printf(" Loading Ramdisk to %08lx, end %08lx ... ", | 1127 | printf(" Loading Ramdisk to %08lx, end %08lx ... ", |
1127 | *initrd_start, *initrd_end); | 1128 | *initrd_start, *initrd_end); |
1128 | 1129 | ||
1129 | memmove_wd((void *)*initrd_start, | 1130 | memmove_wd((void *)*initrd_start, |
1130 | (void *)rd_data, rd_len, CHUNKSZ); | 1131 | (void *)rd_data, rd_len, CHUNKSZ); |
1131 | 1132 | ||
1132 | #ifdef CONFIG_MP | 1133 | #ifdef CONFIG_MP |
1133 | /* | 1134 | /* |
1134 | * Ensure the image is flushed to memory to handle | 1135 | * Ensure the image is flushed to memory to handle |
1135 | * AMP boot scenarios in which we might not be | 1136 | * AMP boot scenarios in which we might not be |
1136 | * HW cache coherent | 1137 | * HW cache coherent |
1137 | */ | 1138 | */ |
1138 | flush_cache((unsigned long)*initrd_start, rd_len); | 1139 | flush_cache((unsigned long)*initrd_start, rd_len); |
1139 | #endif | 1140 | #endif |
1140 | puts("OK\n"); | 1141 | puts("OK\n"); |
1141 | } | 1142 | } |
1142 | } else { | 1143 | } else { |
1143 | *initrd_start = 0; | 1144 | *initrd_start = 0; |
1144 | *initrd_end = 0; | 1145 | *initrd_end = 0; |
1145 | } | 1146 | } |
1146 | debug(" ramdisk load start = 0x%08lx, ramdisk load end = 0x%08lx\n", | 1147 | debug(" ramdisk load start = 0x%08lx, ramdisk load end = 0x%08lx\n", |
1147 | *initrd_start, *initrd_end); | 1148 | *initrd_start, *initrd_end); |
1148 | 1149 | ||
1149 | return 0; | 1150 | return 0; |
1150 | 1151 | ||
1151 | error: | 1152 | error: |
1152 | return -1; | 1153 | return -1; |
1153 | } | 1154 | } |
1154 | #endif /* CONFIG_SYS_BOOT_RAMDISK_HIGH */ | 1155 | #endif /* CONFIG_SYS_BOOT_RAMDISK_HIGH */ |
1155 | 1156 | ||
1156 | int boot_get_setup(bootm_headers_t *images, uint8_t arch, | 1157 | int boot_get_setup(bootm_headers_t *images, uint8_t arch, |
1157 | ulong *setup_start, ulong *setup_len) | 1158 | ulong *setup_start, ulong *setup_len) |
1158 | { | 1159 | { |
1159 | #if defined(CONFIG_FIT) | 1160 | #if defined(CONFIG_FIT) |
1160 | return boot_get_setup_fit(images, arch, setup_start, setup_len); | 1161 | return boot_get_setup_fit(images, arch, setup_start, setup_len); |
1161 | #else | 1162 | #else |
1162 | return -ENOENT; | 1163 | return -ENOENT; |
1163 | #endif | 1164 | #endif |
1164 | } | 1165 | } |
1165 | 1166 | ||
1166 | #ifdef CONFIG_SYS_BOOT_GET_CMDLINE | 1167 | #ifdef CONFIG_SYS_BOOT_GET_CMDLINE |
1167 | /** | 1168 | /** |
1168 | * boot_get_cmdline - allocate and initialize kernel cmdline | 1169 | * boot_get_cmdline - allocate and initialize kernel cmdline |
1169 | * @lmb: pointer to lmb handle, will be used for memory mgmt | 1170 | * @lmb: pointer to lmb handle, will be used for memory mgmt |
1170 | * @cmd_start: pointer to a ulong variable, will hold cmdline start | 1171 | * @cmd_start: pointer to a ulong variable, will hold cmdline start |
1171 | * @cmd_end: pointer to a ulong variable, will hold cmdline end | 1172 | * @cmd_end: pointer to a ulong variable, will hold cmdline end |
1172 | * | 1173 | * |
1173 | * boot_get_cmdline() allocates space for kernel command line below | 1174 | * boot_get_cmdline() allocates space for kernel command line below |
1174 | * BOOTMAPSZ + getenv_bootm_low() address. If "bootargs" U-boot environemnt | 1175 | * BOOTMAPSZ + getenv_bootm_low() address. If "bootargs" U-boot environemnt |
1175 | * variable is present its contents is copied to allocated kernel | 1176 | * variable is present its contents is copied to allocated kernel |
1176 | * command line. | 1177 | * command line. |
1177 | * | 1178 | * |
1178 | * returns: | 1179 | * returns: |
1179 | * 0 - success | 1180 | * 0 - success |
1180 | * -1 - failure | 1181 | * -1 - failure |
1181 | */ | 1182 | */ |
1182 | int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end) | 1183 | int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end) |
1183 | { | 1184 | { |
1184 | char *cmdline; | 1185 | char *cmdline; |
1185 | char *s; | 1186 | char *s; |
1186 | 1187 | ||
1187 | cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf, | 1188 | cmdline = (char *)(ulong)lmb_alloc_base(lmb, CONFIG_SYS_BARGSIZE, 0xf, |
1188 | getenv_bootm_mapsize() + getenv_bootm_low()); | 1189 | getenv_bootm_mapsize() + getenv_bootm_low()); |
1189 | 1190 | ||
1190 | if (cmdline == NULL) | 1191 | if (cmdline == NULL) |
1191 | return -1; | 1192 | return -1; |
1192 | 1193 | ||
1193 | if ((s = getenv("bootargs")) == NULL) | 1194 | if ((s = getenv("bootargs")) == NULL) |
1194 | s = ""; | 1195 | s = ""; |
1195 | 1196 | ||
1196 | strcpy(cmdline, s); | 1197 | strcpy(cmdline, s); |
1197 | 1198 | ||
1198 | *cmd_start = (ulong) & cmdline[0]; | 1199 | *cmd_start = (ulong) & cmdline[0]; |
1199 | *cmd_end = *cmd_start + strlen(cmdline); | 1200 | *cmd_end = *cmd_start + strlen(cmdline); |
1200 | 1201 | ||
1201 | debug("## cmdline at 0x%08lx ... 0x%08lx\n", *cmd_start, *cmd_end); | 1202 | debug("## cmdline at 0x%08lx ... 0x%08lx\n", *cmd_start, *cmd_end); |
1202 | 1203 | ||
1203 | return 0; | 1204 | return 0; |
1204 | } | 1205 | } |
1205 | #endif /* CONFIG_SYS_BOOT_GET_CMDLINE */ | 1206 | #endif /* CONFIG_SYS_BOOT_GET_CMDLINE */ |
1206 | 1207 | ||
1207 | #ifdef CONFIG_SYS_BOOT_GET_KBD | 1208 | #ifdef CONFIG_SYS_BOOT_GET_KBD |
1208 | /** | 1209 | /** |
1209 | * boot_get_kbd - allocate and initialize kernel copy of board info | 1210 | * boot_get_kbd - allocate and initialize kernel copy of board info |
1210 | * @lmb: pointer to lmb handle, will be used for memory mgmt | 1211 | * @lmb: pointer to lmb handle, will be used for memory mgmt |
1211 | * @kbd: double pointer to board info data | 1212 | * @kbd: double pointer to board info data |
1212 | * | 1213 | * |
1213 | * boot_get_kbd() allocates space for kernel copy of board info data below | 1214 | * boot_get_kbd() allocates space for kernel copy of board info data below |
1214 | * BOOTMAPSZ + getenv_bootm_low() address and kernel board info is initialized | 1215 | * BOOTMAPSZ + getenv_bootm_low() address and kernel board info is initialized |
1215 | * with the current u-boot board info data. | 1216 | * with the current u-boot board info data. |
1216 | * | 1217 | * |
1217 | * returns: | 1218 | * returns: |
1218 | * 0 - success | 1219 | * 0 - success |
1219 | * -1 - failure | 1220 | * -1 - failure |
1220 | */ | 1221 | */ |
1221 | int boot_get_kbd(struct lmb *lmb, bd_t **kbd) | 1222 | int boot_get_kbd(struct lmb *lmb, bd_t **kbd) |
1222 | { | 1223 | { |
1223 | *kbd = (bd_t *)(ulong)lmb_alloc_base(lmb, sizeof(bd_t), 0xf, | 1224 | *kbd = (bd_t *)(ulong)lmb_alloc_base(lmb, sizeof(bd_t), 0xf, |
1224 | getenv_bootm_mapsize() + getenv_bootm_low()); | 1225 | getenv_bootm_mapsize() + getenv_bootm_low()); |
1225 | if (*kbd == NULL) | 1226 | if (*kbd == NULL) |
1226 | return -1; | 1227 | return -1; |
1227 | 1228 | ||
1228 | **kbd = *(gd->bd); | 1229 | **kbd = *(gd->bd); |
1229 | 1230 | ||
1230 | debug("## kernel board info at 0x%08lx\n", (ulong)*kbd); | 1231 | debug("## kernel board info at 0x%08lx\n", (ulong)*kbd); |
1231 | 1232 | ||
1232 | #if defined(DEBUG) && defined(CONFIG_CMD_BDI) | 1233 | #if defined(DEBUG) && defined(CONFIG_CMD_BDI) |
1233 | do_bdinfo(NULL, 0, 0, NULL); | 1234 | do_bdinfo(NULL, 0, 0, NULL); |
1234 | #endif | 1235 | #endif |
1235 | 1236 | ||
1236 | return 0; | 1237 | return 0; |
1237 | } | 1238 | } |
1238 | #endif /* CONFIG_SYS_BOOT_GET_KBD */ | 1239 | #endif /* CONFIG_SYS_BOOT_GET_KBD */ |
1239 | 1240 | ||
1240 | #ifdef CONFIG_LMB | 1241 | #ifdef CONFIG_LMB |
1241 | int image_setup_linux(bootm_headers_t *images) | 1242 | int image_setup_linux(bootm_headers_t *images) |
1242 | { | 1243 | { |
1243 | ulong of_size = images->ft_len; | 1244 | ulong of_size = images->ft_len; |
1244 | char **of_flat_tree = &images->ft_addr; | 1245 | char **of_flat_tree = &images->ft_addr; |
1245 | ulong *initrd_start = &images->initrd_start; | 1246 | ulong *initrd_start = &images->initrd_start; |
1246 | ulong *initrd_end = &images->initrd_end; | 1247 | ulong *initrd_end = &images->initrd_end; |
1247 | struct lmb *lmb = &images->lmb; | 1248 | struct lmb *lmb = &images->lmb; |
1248 | ulong rd_len; | 1249 | ulong rd_len; |
1249 | int ret; | 1250 | int ret; |
1250 | 1251 | ||
1251 | if (IMAGE_ENABLE_OF_LIBFDT) | 1252 | if (IMAGE_ENABLE_OF_LIBFDT) |
1252 | boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree); | 1253 | boot_fdt_add_mem_rsv_regions(lmb, *of_flat_tree); |
1253 | 1254 | ||
1254 | if (IMAGE_BOOT_GET_CMDLINE) { | 1255 | if (IMAGE_BOOT_GET_CMDLINE) { |
1255 | ret = boot_get_cmdline(lmb, &images->cmdline_start, | 1256 | ret = boot_get_cmdline(lmb, &images->cmdline_start, |
1256 | &images->cmdline_end); | 1257 | &images->cmdline_end); |
1257 | if (ret) { | 1258 | if (ret) { |
1258 | puts("ERROR with allocation of cmdline\n"); | 1259 | puts("ERROR with allocation of cmdline\n"); |
1259 | return ret; | 1260 | return ret; |
1260 | } | 1261 | } |
1261 | } | 1262 | } |
1262 | if (IMAGE_ENABLE_RAMDISK_HIGH) { | 1263 | if (IMAGE_ENABLE_RAMDISK_HIGH) { |
1263 | rd_len = images->rd_end - images->rd_start; | 1264 | rd_len = images->rd_end - images->rd_start; |
1264 | ret = boot_ramdisk_high(lmb, images->rd_start, rd_len, | 1265 | ret = boot_ramdisk_high(lmb, images->rd_start, rd_len, |
1265 | initrd_start, initrd_end); | 1266 | initrd_start, initrd_end); |
1266 | if (ret) | 1267 | if (ret) |
1267 | return ret; | 1268 | return ret; |
1268 | } | 1269 | } |
1269 | 1270 | ||
1270 | if (IMAGE_ENABLE_OF_LIBFDT) { | 1271 | if (IMAGE_ENABLE_OF_LIBFDT) { |
1271 | ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size); | 1272 | ret = boot_relocate_fdt(lmb, of_flat_tree, &of_size); |
1272 | if (ret) | 1273 | if (ret) |
1273 | return ret; | 1274 | return ret; |
1274 | } | 1275 | } |
1275 | 1276 | ||
1276 | if (IMAGE_ENABLE_OF_LIBFDT && of_size) { | 1277 | if (IMAGE_ENABLE_OF_LIBFDT && of_size) { |
1277 | ret = image_setup_libfdt(images, *of_flat_tree, of_size, lmb); | 1278 | ret = image_setup_libfdt(images, *of_flat_tree, of_size, lmb); |
1278 | if (ret) | 1279 | if (ret) |
1279 | return ret; | 1280 | return ret; |
1280 | } | 1281 | } |
1281 | 1282 | ||
1282 | return 0; | 1283 | return 0; |
1283 | } | 1284 | } |
1284 | #endif /* CONFIG_LMB */ | 1285 | #endif /* CONFIG_LMB */ |
1285 | #endif /* !USE_HOSTCC */ | 1286 | #endif /* !USE_HOSTCC */ |
1286 | 1287 |
include/image.h
1 | /* | 1 | /* |
2 | * (C) Copyright 2008 Semihalf | 2 | * (C) Copyright 2008 Semihalf |
3 | * | 3 | * |
4 | * (C) Copyright 2000-2005 | 4 | * (C) Copyright 2000-2005 |
5 | * Wolfgang Denk, DENX Software Engineering, wd@denx.de. | 5 | * Wolfgang Denk, DENX Software Engineering, wd@denx.de. |
6 | * | 6 | * |
7 | * SPDX-License-Identifier: GPL-2.0+ | 7 | * SPDX-License-Identifier: GPL-2.0+ |
8 | ******************************************************************** | 8 | ******************************************************************** |
9 | * NOTE: This header file defines an interface to U-Boot. Including | 9 | * NOTE: This header file defines an interface to U-Boot. Including |
10 | * this (unmodified) header file in another file is considered normal | 10 | * this (unmodified) header file in another file is considered normal |
11 | * use of U-Boot, and does *not* fall under the heading of "derived | 11 | * use of U-Boot, and does *not* fall under the heading of "derived |
12 | * work". | 12 | * work". |
13 | ******************************************************************** | 13 | ******************************************************************** |
14 | */ | 14 | */ |
15 | 15 | ||
16 | #ifndef __IMAGE_H__ | 16 | #ifndef __IMAGE_H__ |
17 | #define __IMAGE_H__ | 17 | #define __IMAGE_H__ |
18 | 18 | ||
19 | #include "compiler.h" | 19 | #include "compiler.h" |
20 | #include <asm/byteorder.h> | 20 | #include <asm/byteorder.h> |
21 | 21 | ||
22 | /* Define this to avoid #ifdefs later on */ | 22 | /* Define this to avoid #ifdefs later on */ |
23 | struct lmb; | 23 | struct lmb; |
24 | 24 | ||
25 | #ifdef USE_HOSTCC | 25 | #ifdef USE_HOSTCC |
26 | 26 | ||
27 | /* new uImage format support enabled on host */ | 27 | /* new uImage format support enabled on host */ |
28 | #define CONFIG_FIT 1 | 28 | #define CONFIG_FIT 1 |
29 | #define CONFIG_OF_LIBFDT 1 | 29 | #define CONFIG_OF_LIBFDT 1 |
30 | #define CONFIG_FIT_VERBOSE 1 /* enable fit_format_{error,warning}() */ | 30 | #define CONFIG_FIT_VERBOSE 1 /* enable fit_format_{error,warning}() */ |
31 | 31 | ||
32 | #define IMAGE_ENABLE_IGNORE 0 | 32 | #define IMAGE_ENABLE_IGNORE 0 |
33 | #define IMAGE_INDENT_STRING "" | 33 | #define IMAGE_INDENT_STRING "" |
34 | 34 | ||
35 | #else | 35 | #else |
36 | 36 | ||
37 | #include <lmb.h> | 37 | #include <lmb.h> |
38 | #include <asm/u-boot.h> | 38 | #include <asm/u-boot.h> |
39 | #include <command.h> | 39 | #include <command.h> |
40 | 40 | ||
41 | /* Take notice of the 'ignore' property for hashes */ | 41 | /* Take notice of the 'ignore' property for hashes */ |
42 | #define IMAGE_ENABLE_IGNORE 1 | 42 | #define IMAGE_ENABLE_IGNORE 1 |
43 | #define IMAGE_INDENT_STRING " " | 43 | #define IMAGE_INDENT_STRING " " |
44 | 44 | ||
45 | #endif /* USE_HOSTCC */ | 45 | #endif /* USE_HOSTCC */ |
46 | 46 | ||
47 | #if defined(CONFIG_FIT) | 47 | #if defined(CONFIG_FIT) |
48 | #include <hash.h> | 48 | #include <hash.h> |
49 | #include <libfdt.h> | 49 | #include <libfdt.h> |
50 | #include <fdt_support.h> | 50 | #include <fdt_support.h> |
51 | # ifdef CONFIG_SPL_BUILD | 51 | # ifdef CONFIG_SPL_BUILD |
52 | # ifdef CONFIG_SPL_CRC32_SUPPORT | 52 | # ifdef CONFIG_SPL_CRC32_SUPPORT |
53 | # define IMAGE_ENABLE_CRC32 1 | 53 | # define IMAGE_ENABLE_CRC32 1 |
54 | # endif | 54 | # endif |
55 | # ifdef CONFIG_SPL_MD5_SUPPORT | 55 | # ifdef CONFIG_SPL_MD5_SUPPORT |
56 | # define IMAGE_ENABLE_MD5 1 | 56 | # define IMAGE_ENABLE_MD5 1 |
57 | # endif | 57 | # endif |
58 | # ifdef CONFIG_SPL_SHA1_SUPPORT | 58 | # ifdef CONFIG_SPL_SHA1_SUPPORT |
59 | # define IMAGE_ENABLE_SHA1 1 | 59 | # define IMAGE_ENABLE_SHA1 1 |
60 | # endif | 60 | # endif |
61 | # ifdef CONFIG_SPL_SHA256_SUPPORT | 61 | # ifdef CONFIG_SPL_SHA256_SUPPORT |
62 | # define IMAGE_ENABLE_SHA256 1 | 62 | # define IMAGE_ENABLE_SHA256 1 |
63 | # endif | 63 | # endif |
64 | # else | 64 | # else |
65 | # define CONFIG_CRC32 /* FIT images need CRC32 support */ | 65 | # define CONFIG_CRC32 /* FIT images need CRC32 support */ |
66 | # define CONFIG_MD5 /* and MD5 */ | 66 | # define CONFIG_MD5 /* and MD5 */ |
67 | # define CONFIG_SHA1 /* and SHA1 */ | 67 | # define CONFIG_SHA1 /* and SHA1 */ |
68 | # define CONFIG_SHA256 /* and SHA256 */ | 68 | # define CONFIG_SHA256 /* and SHA256 */ |
69 | # define IMAGE_ENABLE_CRC32 1 | 69 | # define IMAGE_ENABLE_CRC32 1 |
70 | # define IMAGE_ENABLE_MD5 1 | 70 | # define IMAGE_ENABLE_MD5 1 |
71 | # define IMAGE_ENABLE_SHA1 1 | 71 | # define IMAGE_ENABLE_SHA1 1 |
72 | # define IMAGE_ENABLE_SHA256 1 | 72 | # define IMAGE_ENABLE_SHA256 1 |
73 | # endif | 73 | # endif |
74 | 74 | ||
75 | #ifdef CONFIG_FIT_DISABLE_SHA256 | 75 | #ifdef CONFIG_FIT_DISABLE_SHA256 |
76 | #undef CONFIG_SHA256 | 76 | #undef CONFIG_SHA256 |
77 | #undef IMAGE_ENABLE_SHA256 | 77 | #undef IMAGE_ENABLE_SHA256 |
78 | #endif | 78 | #endif |
79 | 79 | ||
80 | #ifndef IMAGE_ENABLE_CRC32 | 80 | #ifndef IMAGE_ENABLE_CRC32 |
81 | #define IMAGE_ENABLE_CRC32 0 | 81 | #define IMAGE_ENABLE_CRC32 0 |
82 | #endif | 82 | #endif |
83 | 83 | ||
84 | #ifndef IMAGE_ENABLE_MD5 | 84 | #ifndef IMAGE_ENABLE_MD5 |
85 | #define IMAGE_ENABLE_MD5 0 | 85 | #define IMAGE_ENABLE_MD5 0 |
86 | #endif | 86 | #endif |
87 | 87 | ||
88 | #ifndef IMAGE_ENABLE_SHA1 | 88 | #ifndef IMAGE_ENABLE_SHA1 |
89 | #define IMAGE_ENABLE_SHA1 0 | 89 | #define IMAGE_ENABLE_SHA1 0 |
90 | #endif | 90 | #endif |
91 | 91 | ||
92 | #ifndef IMAGE_ENABLE_SHA256 | 92 | #ifndef IMAGE_ENABLE_SHA256 |
93 | #define IMAGE_ENABLE_SHA256 0 | 93 | #define IMAGE_ENABLE_SHA256 0 |
94 | #endif | 94 | #endif |
95 | 95 | ||
96 | #endif /* CONFIG_FIT */ | 96 | #endif /* CONFIG_FIT */ |
97 | 97 | ||
98 | #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH | 98 | #ifdef CONFIG_SYS_BOOT_RAMDISK_HIGH |
99 | # define IMAGE_ENABLE_RAMDISK_HIGH 1 | 99 | # define IMAGE_ENABLE_RAMDISK_HIGH 1 |
100 | #else | 100 | #else |
101 | # define IMAGE_ENABLE_RAMDISK_HIGH 0 | 101 | # define IMAGE_ENABLE_RAMDISK_HIGH 0 |
102 | #endif | 102 | #endif |
103 | 103 | ||
104 | #ifdef CONFIG_OF_LIBFDT | 104 | #ifdef CONFIG_OF_LIBFDT |
105 | # define IMAGE_ENABLE_OF_LIBFDT 1 | 105 | # define IMAGE_ENABLE_OF_LIBFDT 1 |
106 | #else | 106 | #else |
107 | # define IMAGE_ENABLE_OF_LIBFDT 0 | 107 | # define IMAGE_ENABLE_OF_LIBFDT 0 |
108 | #endif | 108 | #endif |
109 | 109 | ||
110 | #ifdef CONFIG_SYS_BOOT_GET_CMDLINE | 110 | #ifdef CONFIG_SYS_BOOT_GET_CMDLINE |
111 | # define IMAGE_BOOT_GET_CMDLINE 1 | 111 | # define IMAGE_BOOT_GET_CMDLINE 1 |
112 | #else | 112 | #else |
113 | # define IMAGE_BOOT_GET_CMDLINE 0 | 113 | # define IMAGE_BOOT_GET_CMDLINE 0 |
114 | #endif | 114 | #endif |
115 | 115 | ||
116 | #ifdef CONFIG_OF_BOARD_SETUP | 116 | #ifdef CONFIG_OF_BOARD_SETUP |
117 | # define IMAGE_OF_BOARD_SETUP 1 | 117 | # define IMAGE_OF_BOARD_SETUP 1 |
118 | #else | 118 | #else |
119 | # define IMAGE_OF_BOARD_SETUP 0 | 119 | # define IMAGE_OF_BOARD_SETUP 0 |
120 | #endif | 120 | #endif |
121 | 121 | ||
122 | #ifdef CONFIG_OF_SYSTEM_SETUP | 122 | #ifdef CONFIG_OF_SYSTEM_SETUP |
123 | # define IMAGE_OF_SYSTEM_SETUP 1 | 123 | # define IMAGE_OF_SYSTEM_SETUP 1 |
124 | #else | 124 | #else |
125 | # define IMAGE_OF_SYSTEM_SETUP 0 | 125 | # define IMAGE_OF_SYSTEM_SETUP 0 |
126 | #endif | 126 | #endif |
127 | 127 | ||
128 | /* | 128 | /* |
129 | * Operating System Codes | 129 | * Operating System Codes |
130 | */ | 130 | */ |
131 | #define IH_OS_INVALID 0 /* Invalid OS */ | 131 | #define IH_OS_INVALID 0 /* Invalid OS */ |
132 | #define IH_OS_OPENBSD 1 /* OpenBSD */ | 132 | #define IH_OS_OPENBSD 1 /* OpenBSD */ |
133 | #define IH_OS_NETBSD 2 /* NetBSD */ | 133 | #define IH_OS_NETBSD 2 /* NetBSD */ |
134 | #define IH_OS_FREEBSD 3 /* FreeBSD */ | 134 | #define IH_OS_FREEBSD 3 /* FreeBSD */ |
135 | #define IH_OS_4_4BSD 4 /* 4.4BSD */ | 135 | #define IH_OS_4_4BSD 4 /* 4.4BSD */ |
136 | #define IH_OS_LINUX 5 /* Linux */ | 136 | #define IH_OS_LINUX 5 /* Linux */ |
137 | #define IH_OS_SVR4 6 /* SVR4 */ | 137 | #define IH_OS_SVR4 6 /* SVR4 */ |
138 | #define IH_OS_ESIX 7 /* Esix */ | 138 | #define IH_OS_ESIX 7 /* Esix */ |
139 | #define IH_OS_SOLARIS 8 /* Solaris */ | 139 | #define IH_OS_SOLARIS 8 /* Solaris */ |
140 | #define IH_OS_IRIX 9 /* Irix */ | 140 | #define IH_OS_IRIX 9 /* Irix */ |
141 | #define IH_OS_SCO 10 /* SCO */ | 141 | #define IH_OS_SCO 10 /* SCO */ |
142 | #define IH_OS_DELL 11 /* Dell */ | 142 | #define IH_OS_DELL 11 /* Dell */ |
143 | #define IH_OS_NCR 12 /* NCR */ | 143 | #define IH_OS_NCR 12 /* NCR */ |
144 | #define IH_OS_LYNXOS 13 /* LynxOS */ | 144 | #define IH_OS_LYNXOS 13 /* LynxOS */ |
145 | #define IH_OS_VXWORKS 14 /* VxWorks */ | 145 | #define IH_OS_VXWORKS 14 /* VxWorks */ |
146 | #define IH_OS_PSOS 15 /* pSOS */ | 146 | #define IH_OS_PSOS 15 /* pSOS */ |
147 | #define IH_OS_QNX 16 /* QNX */ | 147 | #define IH_OS_QNX 16 /* QNX */ |
148 | #define IH_OS_U_BOOT 17 /* Firmware */ | 148 | #define IH_OS_U_BOOT 17 /* Firmware */ |
149 | #define IH_OS_RTEMS 18 /* RTEMS */ | 149 | #define IH_OS_RTEMS 18 /* RTEMS */ |
150 | #define IH_OS_ARTOS 19 /* ARTOS */ | 150 | #define IH_OS_ARTOS 19 /* ARTOS */ |
151 | #define IH_OS_UNITY 20 /* Unity OS */ | 151 | #define IH_OS_UNITY 20 /* Unity OS */ |
152 | #define IH_OS_INTEGRITY 21 /* INTEGRITY */ | 152 | #define IH_OS_INTEGRITY 21 /* INTEGRITY */ |
153 | #define IH_OS_OSE 22 /* OSE */ | 153 | #define IH_OS_OSE 22 /* OSE */ |
154 | #define IH_OS_PLAN9 23 /* Plan 9 */ | 154 | #define IH_OS_PLAN9 23 /* Plan 9 */ |
155 | #define IH_OS_OPENRTOS 24 /* OpenRTOS */ | 155 | #define IH_OS_OPENRTOS 24 /* OpenRTOS */ |
156 | 156 | ||
157 | /* | 157 | /* |
158 | * CPU Architecture Codes (supported by Linux) | 158 | * CPU Architecture Codes (supported by Linux) |
159 | */ | 159 | */ |
160 | #define IH_ARCH_INVALID 0 /* Invalid CPU */ | 160 | #define IH_ARCH_INVALID 0 /* Invalid CPU */ |
161 | #define IH_ARCH_ALPHA 1 /* Alpha */ | 161 | #define IH_ARCH_ALPHA 1 /* Alpha */ |
162 | #define IH_ARCH_ARM 2 /* ARM */ | 162 | #define IH_ARCH_ARM 2 /* ARM */ |
163 | #define IH_ARCH_I386 3 /* Intel x86 */ | 163 | #define IH_ARCH_I386 3 /* Intel x86 */ |
164 | #define IH_ARCH_IA64 4 /* IA64 */ | 164 | #define IH_ARCH_IA64 4 /* IA64 */ |
165 | #define IH_ARCH_MIPS 5 /* MIPS */ | 165 | #define IH_ARCH_MIPS 5 /* MIPS */ |
166 | #define IH_ARCH_MIPS64 6 /* MIPS 64 Bit */ | 166 | #define IH_ARCH_MIPS64 6 /* MIPS 64 Bit */ |
167 | #define IH_ARCH_PPC 7 /* PowerPC */ | 167 | #define IH_ARCH_PPC 7 /* PowerPC */ |
168 | #define IH_ARCH_S390 8 /* IBM S390 */ | 168 | #define IH_ARCH_S390 8 /* IBM S390 */ |
169 | #define IH_ARCH_SH 9 /* SuperH */ | 169 | #define IH_ARCH_SH 9 /* SuperH */ |
170 | #define IH_ARCH_SPARC 10 /* Sparc */ | 170 | #define IH_ARCH_SPARC 10 /* Sparc */ |
171 | #define IH_ARCH_SPARC64 11 /* Sparc 64 Bit */ | 171 | #define IH_ARCH_SPARC64 11 /* Sparc 64 Bit */ |
172 | #define IH_ARCH_M68K 12 /* M68K */ | 172 | #define IH_ARCH_M68K 12 /* M68K */ |
173 | #define IH_ARCH_MICROBLAZE 14 /* MicroBlaze */ | 173 | #define IH_ARCH_MICROBLAZE 14 /* MicroBlaze */ |
174 | #define IH_ARCH_NIOS2 15 /* Nios-II */ | 174 | #define IH_ARCH_NIOS2 15 /* Nios-II */ |
175 | #define IH_ARCH_BLACKFIN 16 /* Blackfin */ | 175 | #define IH_ARCH_BLACKFIN 16 /* Blackfin */ |
176 | #define IH_ARCH_AVR32 17 /* AVR32 */ | 176 | #define IH_ARCH_AVR32 17 /* AVR32 */ |
177 | #define IH_ARCH_ST200 18 /* STMicroelectronics ST200 */ | 177 | #define IH_ARCH_ST200 18 /* STMicroelectronics ST200 */ |
178 | #define IH_ARCH_SANDBOX 19 /* Sandbox architecture (test only) */ | 178 | #define IH_ARCH_SANDBOX 19 /* Sandbox architecture (test only) */ |
179 | #define IH_ARCH_NDS32 20 /* ANDES Technology - NDS32 */ | 179 | #define IH_ARCH_NDS32 20 /* ANDES Technology - NDS32 */ |
180 | #define IH_ARCH_OPENRISC 21 /* OpenRISC 1000 */ | 180 | #define IH_ARCH_OPENRISC 21 /* OpenRISC 1000 */ |
181 | #define IH_ARCH_ARM64 22 /* ARM64 */ | 181 | #define IH_ARCH_ARM64 22 /* ARM64 */ |
182 | #define IH_ARCH_ARC 23 /* Synopsys DesignWare ARC */ | 182 | #define IH_ARCH_ARC 23 /* Synopsys DesignWare ARC */ |
183 | #define IH_ARCH_X86_64 24 /* AMD x86_64, Intel and Via */ | 183 | #define IH_ARCH_X86_64 24 /* AMD x86_64, Intel and Via */ |
184 | 184 | ||
185 | /* | 185 | /* |
186 | * Image Types | 186 | * Image Types |
187 | * | 187 | * |
188 | * "Standalone Programs" are directly runnable in the environment | 188 | * "Standalone Programs" are directly runnable in the environment |
189 | * provided by U-Boot; it is expected that (if they behave | 189 | * provided by U-Boot; it is expected that (if they behave |
190 | * well) you can continue to work in U-Boot after return from | 190 | * well) you can continue to work in U-Boot after return from |
191 | * the Standalone Program. | 191 | * the Standalone Program. |
192 | * "OS Kernel Images" are usually images of some Embedded OS which | 192 | * "OS Kernel Images" are usually images of some Embedded OS which |
193 | * will take over control completely. Usually these programs | 193 | * will take over control completely. Usually these programs |
194 | * will install their own set of exception handlers, device | 194 | * will install their own set of exception handlers, device |
195 | * drivers, set up the MMU, etc. - this means, that you cannot | 195 | * drivers, set up the MMU, etc. - this means, that you cannot |
196 | * expect to re-enter U-Boot except by resetting the CPU. | 196 | * expect to re-enter U-Boot except by resetting the CPU. |
197 | * "RAMDisk Images" are more or less just data blocks, and their | 197 | * "RAMDisk Images" are more or less just data blocks, and their |
198 | * parameters (address, size) are passed to an OS kernel that is | 198 | * parameters (address, size) are passed to an OS kernel that is |
199 | * being started. | 199 | * being started. |
200 | * "Multi-File Images" contain several images, typically an OS | 200 | * "Multi-File Images" contain several images, typically an OS |
201 | * (Linux) kernel image and one or more data images like | 201 | * (Linux) kernel image and one or more data images like |
202 | * RAMDisks. This construct is useful for instance when you want | 202 | * RAMDisks. This construct is useful for instance when you want |
203 | * to boot over the network using BOOTP etc., where the boot | 203 | * to boot over the network using BOOTP etc., where the boot |
204 | * server provides just a single image file, but you want to get | 204 | * server provides just a single image file, but you want to get |
205 | * for instance an OS kernel and a RAMDisk image. | 205 | * for instance an OS kernel and a RAMDisk image. |
206 | * | 206 | * |
207 | * "Multi-File Images" start with a list of image sizes, each | 207 | * "Multi-File Images" start with a list of image sizes, each |
208 | * image size (in bytes) specified by an "uint32_t" in network | 208 | * image size (in bytes) specified by an "uint32_t" in network |
209 | * byte order. This list is terminated by an "(uint32_t)0". | 209 | * byte order. This list is terminated by an "(uint32_t)0". |
210 | * Immediately after the terminating 0 follow the images, one by | 210 | * Immediately after the terminating 0 follow the images, one by |
211 | * one, all aligned on "uint32_t" boundaries (size rounded up to | 211 | * one, all aligned on "uint32_t" boundaries (size rounded up to |
212 | * a multiple of 4 bytes - except for the last file). | 212 | * a multiple of 4 bytes - except for the last file). |
213 | * | 213 | * |
214 | * "Firmware Images" are binary images containing firmware (like | 214 | * "Firmware Images" are binary images containing firmware (like |
215 | * U-Boot or FPGA images) which usually will be programmed to | 215 | * U-Boot or FPGA images) which usually will be programmed to |
216 | * flash memory. | 216 | * flash memory. |
217 | * | 217 | * |
218 | * "Script files" are command sequences that will be executed by | 218 | * "Script files" are command sequences that will be executed by |
219 | * U-Boot's command interpreter; this feature is especially | 219 | * U-Boot's command interpreter; this feature is especially |
220 | * useful when you configure U-Boot to use a real shell (hush) | 220 | * useful when you configure U-Boot to use a real shell (hush) |
221 | * as command interpreter (=> Shell Scripts). | 221 | * as command interpreter (=> Shell Scripts). |
222 | */ | 222 | */ |
223 | 223 | ||
224 | #define IH_TYPE_INVALID 0 /* Invalid Image */ | 224 | #define IH_TYPE_INVALID 0 /* Invalid Image */ |
225 | #define IH_TYPE_STANDALONE 1 /* Standalone Program */ | 225 | #define IH_TYPE_STANDALONE 1 /* Standalone Program */ |
226 | #define IH_TYPE_KERNEL 2 /* OS Kernel Image */ | 226 | #define IH_TYPE_KERNEL 2 /* OS Kernel Image */ |
227 | #define IH_TYPE_RAMDISK 3 /* RAMDisk Image */ | 227 | #define IH_TYPE_RAMDISK 3 /* RAMDisk Image */ |
228 | #define IH_TYPE_MULTI 4 /* Multi-File Image */ | 228 | #define IH_TYPE_MULTI 4 /* Multi-File Image */ |
229 | #define IH_TYPE_FIRMWARE 5 /* Firmware Image */ | 229 | #define IH_TYPE_FIRMWARE 5 /* Firmware Image */ |
230 | #define IH_TYPE_SCRIPT 6 /* Script file */ | 230 | #define IH_TYPE_SCRIPT 6 /* Script file */ |
231 | #define IH_TYPE_FILESYSTEM 7 /* Filesystem Image (any type) */ | 231 | #define IH_TYPE_FILESYSTEM 7 /* Filesystem Image (any type) */ |
232 | #define IH_TYPE_FLATDT 8 /* Binary Flat Device Tree Blob */ | 232 | #define IH_TYPE_FLATDT 8 /* Binary Flat Device Tree Blob */ |
233 | #define IH_TYPE_KWBIMAGE 9 /* Kirkwood Boot Image */ | 233 | #define IH_TYPE_KWBIMAGE 9 /* Kirkwood Boot Image */ |
234 | #define IH_TYPE_IMXIMAGE 10 /* Freescale IMXBoot Image */ | 234 | #define IH_TYPE_IMXIMAGE 10 /* Freescale IMXBoot Image */ |
235 | #define IH_TYPE_UBLIMAGE 11 /* Davinci UBL Image */ | 235 | #define IH_TYPE_UBLIMAGE 11 /* Davinci UBL Image */ |
236 | #define IH_TYPE_OMAPIMAGE 12 /* TI OMAP Config Header Image */ | 236 | #define IH_TYPE_OMAPIMAGE 12 /* TI OMAP Config Header Image */ |
237 | #define IH_TYPE_AISIMAGE 13 /* TI Davinci AIS Image */ | 237 | #define IH_TYPE_AISIMAGE 13 /* TI Davinci AIS Image */ |
238 | #define IH_TYPE_KERNEL_NOLOAD 14 /* OS Kernel Image, can run from any load address */ | 238 | #define IH_TYPE_KERNEL_NOLOAD 14 /* OS Kernel Image, can run from any load address */ |
239 | #define IH_TYPE_PBLIMAGE 15 /* Freescale PBL Boot Image */ | 239 | #define IH_TYPE_PBLIMAGE 15 /* Freescale PBL Boot Image */ |
240 | #define IH_TYPE_MXSIMAGE 16 /* Freescale MXSBoot Image */ | 240 | #define IH_TYPE_MXSIMAGE 16 /* Freescale MXSBoot Image */ |
241 | #define IH_TYPE_GPIMAGE 17 /* TI Keystone GPHeader Image */ | 241 | #define IH_TYPE_GPIMAGE 17 /* TI Keystone GPHeader Image */ |
242 | #define IH_TYPE_ATMELIMAGE 18 /* ATMEL ROM bootable Image */ | 242 | #define IH_TYPE_ATMELIMAGE 18 /* ATMEL ROM bootable Image */ |
243 | #define IH_TYPE_SOCFPGAIMAGE 19 /* Altera SOCFPGA Preloader */ | 243 | #define IH_TYPE_SOCFPGAIMAGE 19 /* Altera SOCFPGA Preloader */ |
244 | #define IH_TYPE_X86_SETUP 20 /* x86 setup.bin Image */ | 244 | #define IH_TYPE_X86_SETUP 20 /* x86 setup.bin Image */ |
245 | #define IH_TYPE_LPC32XXIMAGE 21 /* x86 setup.bin Image */ | ||
245 | 246 | ||
246 | /* | 247 | /* |
247 | * Compression Types | 248 | * Compression Types |
248 | */ | 249 | */ |
249 | #define IH_COMP_NONE 0 /* No Compression Used */ | 250 | #define IH_COMP_NONE 0 /* No Compression Used */ |
250 | #define IH_COMP_GZIP 1 /* gzip Compression Used */ | 251 | #define IH_COMP_GZIP 1 /* gzip Compression Used */ |
251 | #define IH_COMP_BZIP2 2 /* bzip2 Compression Used */ | 252 | #define IH_COMP_BZIP2 2 /* bzip2 Compression Used */ |
252 | #define IH_COMP_LZMA 3 /* lzma Compression Used */ | 253 | #define IH_COMP_LZMA 3 /* lzma Compression Used */ |
253 | #define IH_COMP_LZO 4 /* lzo Compression Used */ | 254 | #define IH_COMP_LZO 4 /* lzo Compression Used */ |
254 | 255 | ||
255 | #define IH_MAGIC 0x27051956 /* Image Magic Number */ | 256 | #define IH_MAGIC 0x27051956 /* Image Magic Number */ |
256 | #define IH_NMLEN 32 /* Image Name Length */ | 257 | #define IH_NMLEN 32 /* Image Name Length */ |
257 | 258 | ||
258 | /* Reused from common.h */ | 259 | /* Reused from common.h */ |
259 | #define ROUND(a, b) (((a) + (b) - 1) & ~((b) - 1)) | 260 | #define ROUND(a, b) (((a) + (b) - 1) & ~((b) - 1)) |
260 | 261 | ||
261 | /* | 262 | /* |
262 | * Legacy format image header, | 263 | * Legacy format image header, |
263 | * all data in network byte order (aka natural aka bigendian). | 264 | * all data in network byte order (aka natural aka bigendian). |
264 | */ | 265 | */ |
265 | typedef struct image_header { | 266 | typedef struct image_header { |
266 | __be32 ih_magic; /* Image Header Magic Number */ | 267 | __be32 ih_magic; /* Image Header Magic Number */ |
267 | __be32 ih_hcrc; /* Image Header CRC Checksum */ | 268 | __be32 ih_hcrc; /* Image Header CRC Checksum */ |
268 | __be32 ih_time; /* Image Creation Timestamp */ | 269 | __be32 ih_time; /* Image Creation Timestamp */ |
269 | __be32 ih_size; /* Image Data Size */ | 270 | __be32 ih_size; /* Image Data Size */ |
270 | __be32 ih_load; /* Data Load Address */ | 271 | __be32 ih_load; /* Data Load Address */ |
271 | __be32 ih_ep; /* Entry Point Address */ | 272 | __be32 ih_ep; /* Entry Point Address */ |
272 | __be32 ih_dcrc; /* Image Data CRC Checksum */ | 273 | __be32 ih_dcrc; /* Image Data CRC Checksum */ |
273 | uint8_t ih_os; /* Operating System */ | 274 | uint8_t ih_os; /* Operating System */ |
274 | uint8_t ih_arch; /* CPU architecture */ | 275 | uint8_t ih_arch; /* CPU architecture */ |
275 | uint8_t ih_type; /* Image Type */ | 276 | uint8_t ih_type; /* Image Type */ |
276 | uint8_t ih_comp; /* Compression Type */ | 277 | uint8_t ih_comp; /* Compression Type */ |
277 | uint8_t ih_name[IH_NMLEN]; /* Image Name */ | 278 | uint8_t ih_name[IH_NMLEN]; /* Image Name */ |
278 | } image_header_t; | 279 | } image_header_t; |
279 | 280 | ||
280 | typedef struct image_info { | 281 | typedef struct image_info { |
281 | ulong start, end; /* start/end of blob */ | 282 | ulong start, end; /* start/end of blob */ |
282 | ulong image_start, image_len; /* start of image within blob, len of image */ | 283 | ulong image_start, image_len; /* start of image within blob, len of image */ |
283 | ulong load; /* load addr for the image */ | 284 | ulong load; /* load addr for the image */ |
284 | uint8_t comp, type, os; /* compression, type of image, os type */ | 285 | uint8_t comp, type, os; /* compression, type of image, os type */ |
285 | uint8_t arch; /* CPU architecture */ | 286 | uint8_t arch; /* CPU architecture */ |
286 | } image_info_t; | 287 | } image_info_t; |
287 | 288 | ||
288 | /* | 289 | /* |
289 | * Legacy and FIT format headers used by do_bootm() and do_bootm_<os>() | 290 | * Legacy and FIT format headers used by do_bootm() and do_bootm_<os>() |
290 | * routines. | 291 | * routines. |
291 | */ | 292 | */ |
292 | typedef struct bootm_headers { | 293 | typedef struct bootm_headers { |
293 | /* | 294 | /* |
294 | * Legacy os image header, if it is a multi component image | 295 | * Legacy os image header, if it is a multi component image |
295 | * then boot_get_ramdisk() and get_fdt() will attempt to get | 296 | * then boot_get_ramdisk() and get_fdt() will attempt to get |
296 | * data from second and third component accordingly. | 297 | * data from second and third component accordingly. |
297 | */ | 298 | */ |
298 | image_header_t *legacy_hdr_os; /* image header pointer */ | 299 | image_header_t *legacy_hdr_os; /* image header pointer */ |
299 | image_header_t legacy_hdr_os_copy; /* header copy */ | 300 | image_header_t legacy_hdr_os_copy; /* header copy */ |
300 | ulong legacy_hdr_valid; | 301 | ulong legacy_hdr_valid; |
301 | 302 | ||
302 | #if defined(CONFIG_FIT) | 303 | #if defined(CONFIG_FIT) |
303 | const char *fit_uname_cfg; /* configuration node unit name */ | 304 | const char *fit_uname_cfg; /* configuration node unit name */ |
304 | 305 | ||
305 | void *fit_hdr_os; /* os FIT image header */ | 306 | void *fit_hdr_os; /* os FIT image header */ |
306 | const char *fit_uname_os; /* os subimage node unit name */ | 307 | const char *fit_uname_os; /* os subimage node unit name */ |
307 | int fit_noffset_os; /* os subimage node offset */ | 308 | int fit_noffset_os; /* os subimage node offset */ |
308 | 309 | ||
309 | void *fit_hdr_rd; /* init ramdisk FIT image header */ | 310 | void *fit_hdr_rd; /* init ramdisk FIT image header */ |
310 | const char *fit_uname_rd; /* init ramdisk subimage node unit name */ | 311 | const char *fit_uname_rd; /* init ramdisk subimage node unit name */ |
311 | int fit_noffset_rd; /* init ramdisk subimage node offset */ | 312 | int fit_noffset_rd; /* init ramdisk subimage node offset */ |
312 | 313 | ||
313 | void *fit_hdr_fdt; /* FDT blob FIT image header */ | 314 | void *fit_hdr_fdt; /* FDT blob FIT image header */ |
314 | const char *fit_uname_fdt; /* FDT blob subimage node unit name */ | 315 | const char *fit_uname_fdt; /* FDT blob subimage node unit name */ |
315 | int fit_noffset_fdt;/* FDT blob subimage node offset */ | 316 | int fit_noffset_fdt;/* FDT blob subimage node offset */ |
316 | 317 | ||
317 | void *fit_hdr_setup; /* x86 setup FIT image header */ | 318 | void *fit_hdr_setup; /* x86 setup FIT image header */ |
318 | const char *fit_uname_setup; /* x86 setup subimage node name */ | 319 | const char *fit_uname_setup; /* x86 setup subimage node name */ |
319 | int fit_noffset_setup;/* x86 setup subimage node offset */ | 320 | int fit_noffset_setup;/* x86 setup subimage node offset */ |
320 | #endif | 321 | #endif |
321 | 322 | ||
322 | #ifndef USE_HOSTCC | 323 | #ifndef USE_HOSTCC |
323 | image_info_t os; /* os image info */ | 324 | image_info_t os; /* os image info */ |
324 | ulong ep; /* entry point of OS */ | 325 | ulong ep; /* entry point of OS */ |
325 | 326 | ||
326 | ulong rd_start, rd_end;/* ramdisk start/end */ | 327 | ulong rd_start, rd_end;/* ramdisk start/end */ |
327 | 328 | ||
328 | char *ft_addr; /* flat dev tree address */ | 329 | char *ft_addr; /* flat dev tree address */ |
329 | ulong ft_len; /* length of flat device tree */ | 330 | ulong ft_len; /* length of flat device tree */ |
330 | 331 | ||
331 | ulong initrd_start; | 332 | ulong initrd_start; |
332 | ulong initrd_end; | 333 | ulong initrd_end; |
333 | ulong cmdline_start; | 334 | ulong cmdline_start; |
334 | ulong cmdline_end; | 335 | ulong cmdline_end; |
335 | bd_t *kbd; | 336 | bd_t *kbd; |
336 | #endif | 337 | #endif |
337 | 338 | ||
338 | int verify; /* getenv("verify")[0] != 'n' */ | 339 | int verify; /* getenv("verify")[0] != 'n' */ |
339 | 340 | ||
340 | #define BOOTM_STATE_START (0x00000001) | 341 | #define BOOTM_STATE_START (0x00000001) |
341 | #define BOOTM_STATE_FINDOS (0x00000002) | 342 | #define BOOTM_STATE_FINDOS (0x00000002) |
342 | #define BOOTM_STATE_FINDOTHER (0x00000004) | 343 | #define BOOTM_STATE_FINDOTHER (0x00000004) |
343 | #define BOOTM_STATE_LOADOS (0x00000008) | 344 | #define BOOTM_STATE_LOADOS (0x00000008) |
344 | #define BOOTM_STATE_RAMDISK (0x00000010) | 345 | #define BOOTM_STATE_RAMDISK (0x00000010) |
345 | #define BOOTM_STATE_FDT (0x00000020) | 346 | #define BOOTM_STATE_FDT (0x00000020) |
346 | #define BOOTM_STATE_OS_CMDLINE (0x00000040) | 347 | #define BOOTM_STATE_OS_CMDLINE (0x00000040) |
347 | #define BOOTM_STATE_OS_BD_T (0x00000080) | 348 | #define BOOTM_STATE_OS_BD_T (0x00000080) |
348 | #define BOOTM_STATE_OS_PREP (0x00000100) | 349 | #define BOOTM_STATE_OS_PREP (0x00000100) |
349 | #define BOOTM_STATE_OS_FAKE_GO (0x00000200) /* 'Almost' run the OS */ | 350 | #define BOOTM_STATE_OS_FAKE_GO (0x00000200) /* 'Almost' run the OS */ |
350 | #define BOOTM_STATE_OS_GO (0x00000400) | 351 | #define BOOTM_STATE_OS_GO (0x00000400) |
351 | int state; | 352 | int state; |
352 | 353 | ||
353 | #ifdef CONFIG_LMB | 354 | #ifdef CONFIG_LMB |
354 | struct lmb lmb; /* for memory mgmt */ | 355 | struct lmb lmb; /* for memory mgmt */ |
355 | #endif | 356 | #endif |
356 | } bootm_headers_t; | 357 | } bootm_headers_t; |
357 | 358 | ||
358 | extern bootm_headers_t images; | 359 | extern bootm_headers_t images; |
359 | 360 | ||
360 | /* | 361 | /* |
361 | * Some systems (for example LWMON) have very short watchdog periods; | 362 | * Some systems (for example LWMON) have very short watchdog periods; |
362 | * we must make sure to split long operations like memmove() or | 363 | * we must make sure to split long operations like memmove() or |
363 | * checksum calculations into reasonable chunks. | 364 | * checksum calculations into reasonable chunks. |
364 | */ | 365 | */ |
365 | #ifndef CHUNKSZ | 366 | #ifndef CHUNKSZ |
366 | #define CHUNKSZ (64 * 1024) | 367 | #define CHUNKSZ (64 * 1024) |
367 | #endif | 368 | #endif |
368 | 369 | ||
369 | #ifndef CHUNKSZ_CRC32 | 370 | #ifndef CHUNKSZ_CRC32 |
370 | #define CHUNKSZ_CRC32 (64 * 1024) | 371 | #define CHUNKSZ_CRC32 (64 * 1024) |
371 | #endif | 372 | #endif |
372 | 373 | ||
373 | #ifndef CHUNKSZ_MD5 | 374 | #ifndef CHUNKSZ_MD5 |
374 | #define CHUNKSZ_MD5 (64 * 1024) | 375 | #define CHUNKSZ_MD5 (64 * 1024) |
375 | #endif | 376 | #endif |
376 | 377 | ||
377 | #ifndef CHUNKSZ_SHA1 | 378 | #ifndef CHUNKSZ_SHA1 |
378 | #define CHUNKSZ_SHA1 (64 * 1024) | 379 | #define CHUNKSZ_SHA1 (64 * 1024) |
379 | #endif | 380 | #endif |
380 | 381 | ||
381 | #define uimage_to_cpu(x) be32_to_cpu(x) | 382 | #define uimage_to_cpu(x) be32_to_cpu(x) |
382 | #define cpu_to_uimage(x) cpu_to_be32(x) | 383 | #define cpu_to_uimage(x) cpu_to_be32(x) |
383 | 384 | ||
384 | /* | 385 | /* |
385 | * Translation table for entries of a specific type; used by | 386 | * Translation table for entries of a specific type; used by |
386 | * get_table_entry_id() and get_table_entry_name(). | 387 | * get_table_entry_id() and get_table_entry_name(). |
387 | */ | 388 | */ |
388 | typedef struct table_entry { | 389 | typedef struct table_entry { |
389 | int id; | 390 | int id; |
390 | char *sname; /* short (input) name to find table entry */ | 391 | char *sname; /* short (input) name to find table entry */ |
391 | char *lname; /* long (output) name to print for messages */ | 392 | char *lname; /* long (output) name to print for messages */ |
392 | } table_entry_t; | 393 | } table_entry_t; |
393 | 394 | ||
394 | /* | 395 | /* |
395 | * get_table_entry_id() scans the translation table trying to find an | 396 | * get_table_entry_id() scans the translation table trying to find an |
396 | * entry that matches the given short name. If a matching entry is | 397 | * entry that matches the given short name. If a matching entry is |
397 | * found, it's id is returned to the caller. | 398 | * found, it's id is returned to the caller. |
398 | */ | 399 | */ |
399 | int get_table_entry_id(const table_entry_t *table, | 400 | int get_table_entry_id(const table_entry_t *table, |
400 | const char *table_name, const char *name); | 401 | const char *table_name, const char *name); |
401 | /* | 402 | /* |
402 | * get_table_entry_name() scans the translation table trying to find | 403 | * get_table_entry_name() scans the translation table trying to find |
403 | * an entry that matches the given id. If a matching entry is found, | 404 | * an entry that matches the given id. If a matching entry is found, |
404 | * its long name is returned to the caller. | 405 | * its long name is returned to the caller. |
405 | */ | 406 | */ |
406 | char *get_table_entry_name(const table_entry_t *table, char *msg, int id); | 407 | char *get_table_entry_name(const table_entry_t *table, char *msg, int id); |
407 | 408 | ||
408 | const char *genimg_get_os_name(uint8_t os); | 409 | const char *genimg_get_os_name(uint8_t os); |
409 | const char *genimg_get_arch_name(uint8_t arch); | 410 | const char *genimg_get_arch_name(uint8_t arch); |
410 | const char *genimg_get_type_name(uint8_t type); | 411 | const char *genimg_get_type_name(uint8_t type); |
411 | const char *genimg_get_comp_name(uint8_t comp); | 412 | const char *genimg_get_comp_name(uint8_t comp); |
412 | int genimg_get_os_id(const char *name); | 413 | int genimg_get_os_id(const char *name); |
413 | int genimg_get_arch_id(const char *name); | 414 | int genimg_get_arch_id(const char *name); |
414 | int genimg_get_type_id(const char *name); | 415 | int genimg_get_type_id(const char *name); |
415 | int genimg_get_comp_id(const char *name); | 416 | int genimg_get_comp_id(const char *name); |
416 | void genimg_print_size(uint32_t size); | 417 | void genimg_print_size(uint32_t size); |
417 | 418 | ||
418 | #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || \ | 419 | #if defined(CONFIG_TIMESTAMP) || defined(CONFIG_CMD_DATE) || \ |
419 | defined(USE_HOSTCC) | 420 | defined(USE_HOSTCC) |
420 | #define IMAGE_ENABLE_TIMESTAMP 1 | 421 | #define IMAGE_ENABLE_TIMESTAMP 1 |
421 | #else | 422 | #else |
422 | #define IMAGE_ENABLE_TIMESTAMP 0 | 423 | #define IMAGE_ENABLE_TIMESTAMP 0 |
423 | #endif | 424 | #endif |
424 | void genimg_print_time(time_t timestamp); | 425 | void genimg_print_time(time_t timestamp); |
425 | 426 | ||
426 | /* What to do with a image load address ('load = <> 'in the FIT) */ | 427 | /* What to do with a image load address ('load = <> 'in the FIT) */ |
427 | enum fit_load_op { | 428 | enum fit_load_op { |
428 | FIT_LOAD_IGNORED, /* Ignore load address */ | 429 | FIT_LOAD_IGNORED, /* Ignore load address */ |
429 | FIT_LOAD_OPTIONAL, /* Can be provided, but optional */ | 430 | FIT_LOAD_OPTIONAL, /* Can be provided, but optional */ |
430 | FIT_LOAD_OPTIONAL_NON_ZERO, /* Optional, a value of 0 is ignored */ | 431 | FIT_LOAD_OPTIONAL_NON_ZERO, /* Optional, a value of 0 is ignored */ |
431 | FIT_LOAD_REQUIRED, /* Must be provided */ | 432 | FIT_LOAD_REQUIRED, /* Must be provided */ |
432 | }; | 433 | }; |
433 | 434 | ||
434 | int boot_get_setup(bootm_headers_t *images, uint8_t arch, ulong *setup_start, | 435 | int boot_get_setup(bootm_headers_t *images, uint8_t arch, ulong *setup_start, |
435 | ulong *setup_len); | 436 | ulong *setup_len); |
436 | 437 | ||
437 | #ifndef USE_HOSTCC | 438 | #ifndef USE_HOSTCC |
438 | /* Image format types, returned by _get_format() routine */ | 439 | /* Image format types, returned by _get_format() routine */ |
439 | #define IMAGE_FORMAT_INVALID 0x00 | 440 | #define IMAGE_FORMAT_INVALID 0x00 |
440 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) | 441 | #if defined(CONFIG_IMAGE_FORMAT_LEGACY) |
441 | #define IMAGE_FORMAT_LEGACY 0x01 /* legacy image_header based format */ | 442 | #define IMAGE_FORMAT_LEGACY 0x01 /* legacy image_header based format */ |
442 | #endif | 443 | #endif |
443 | #define IMAGE_FORMAT_FIT 0x02 /* new, libfdt based format */ | 444 | #define IMAGE_FORMAT_FIT 0x02 /* new, libfdt based format */ |
444 | #define IMAGE_FORMAT_ANDROID 0x03 /* Android boot image */ | 445 | #define IMAGE_FORMAT_ANDROID 0x03 /* Android boot image */ |
445 | 446 | ||
446 | ulong genimg_get_kernel_addr_fit(char * const img_addr, | 447 | ulong genimg_get_kernel_addr_fit(char * const img_addr, |
447 | const char **fit_uname_config, | 448 | const char **fit_uname_config, |
448 | const char **fit_uname_kernel); | 449 | const char **fit_uname_kernel); |
449 | ulong genimg_get_kernel_addr(char * const img_addr); | 450 | ulong genimg_get_kernel_addr(char * const img_addr); |
450 | int genimg_get_format(const void *img_addr); | 451 | int genimg_get_format(const void *img_addr); |
451 | int genimg_has_config(bootm_headers_t *images); | 452 | int genimg_has_config(bootm_headers_t *images); |
452 | ulong genimg_get_image(ulong img_addr); | 453 | ulong genimg_get_image(ulong img_addr); |
453 | 454 | ||
454 | int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images, | 455 | int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images, |
455 | uint8_t arch, ulong *rd_start, ulong *rd_end); | 456 | uint8_t arch, ulong *rd_start, ulong *rd_end); |
456 | #endif | 457 | #endif |
457 | 458 | ||
458 | int boot_get_setup_fit(bootm_headers_t *images, uint8_t arch, | 459 | int boot_get_setup_fit(bootm_headers_t *images, uint8_t arch, |
459 | ulong *setup_start, ulong *setup_len); | 460 | ulong *setup_start, ulong *setup_len); |
460 | 461 | ||
461 | /** | 462 | /** |
462 | * fit_image_load() - load an image from a FIT | 463 | * fit_image_load() - load an image from a FIT |
463 | * | 464 | * |
464 | * This deals with all aspects of loading an image from a FIT, including | 465 | * This deals with all aspects of loading an image from a FIT, including |
465 | * selecting the right image based on configuration, verifying it, printing | 466 | * selecting the right image based on configuration, verifying it, printing |
466 | * out progress messages, checking the type/arch/os and optionally copying it | 467 | * out progress messages, checking the type/arch/os and optionally copying it |
467 | * to the right load address. | 468 | * to the right load address. |
468 | * | 469 | * |
469 | * The property to look up is defined by image_type. | 470 | * The property to look up is defined by image_type. |
470 | * | 471 | * |
471 | * @param images Boot images structure | 472 | * @param images Boot images structure |
472 | * @param addr Address of FIT in memory | 473 | * @param addr Address of FIT in memory |
473 | * @param fit_unamep On entry this is the requested image name | 474 | * @param fit_unamep On entry this is the requested image name |
474 | * (e.g. "kernel@1") or NULL to use the default. On exit | 475 | * (e.g. "kernel@1") or NULL to use the default. On exit |
475 | * points to the selected image name | 476 | * points to the selected image name |
476 | * @param fit_uname_configp On entry this is the requested configuration | 477 | * @param fit_uname_configp On entry this is the requested configuration |
477 | * name (e.g. "conf@1") or NULL to use the default. On | 478 | * name (e.g. "conf@1") or NULL to use the default. On |
478 | * exit points to the selected configuration name. | 479 | * exit points to the selected configuration name. |
479 | * @param arch Expected architecture (IH_ARCH_...) | 480 | * @param arch Expected architecture (IH_ARCH_...) |
480 | * @param image_type Required image type (IH_TYPE_...). If this is | 481 | * @param image_type Required image type (IH_TYPE_...). If this is |
481 | * IH_TYPE_KERNEL then we allow IH_TYPE_KERNEL_NOLOAD | 482 | * IH_TYPE_KERNEL then we allow IH_TYPE_KERNEL_NOLOAD |
482 | * also. | 483 | * also. |
483 | * @param bootstage_id ID of starting bootstage to use for progress updates. | 484 | * @param bootstage_id ID of starting bootstage to use for progress updates. |
484 | * This will be added to the BOOTSTAGE_SUB values when | 485 | * This will be added to the BOOTSTAGE_SUB values when |
485 | * calling bootstage_mark() | 486 | * calling bootstage_mark() |
486 | * @param load_op Decribes what to do with the load address | 487 | * @param load_op Decribes what to do with the load address |
487 | * @param datap Returns address of loaded image | 488 | * @param datap Returns address of loaded image |
488 | * @param lenp Returns length of loaded image | 489 | * @param lenp Returns length of loaded image |
489 | * @return node offset of image, or -ve error code on error | 490 | * @return node offset of image, or -ve error code on error |
490 | */ | 491 | */ |
491 | int fit_image_load(bootm_headers_t *images, ulong addr, | 492 | int fit_image_load(bootm_headers_t *images, ulong addr, |
492 | const char **fit_unamep, const char **fit_uname_configp, | 493 | const char **fit_unamep, const char **fit_uname_configp, |
493 | int arch, int image_type, int bootstage_id, | 494 | int arch, int image_type, int bootstage_id, |
494 | enum fit_load_op load_op, ulong *datap, ulong *lenp); | 495 | enum fit_load_op load_op, ulong *datap, ulong *lenp); |
495 | 496 | ||
496 | #ifndef USE_HOSTCC | 497 | #ifndef USE_HOSTCC |
497 | /** | 498 | /** |
498 | * fit_get_node_from_config() - Look up an image a FIT by type | 499 | * fit_get_node_from_config() - Look up an image a FIT by type |
499 | * | 500 | * |
500 | * This looks in the selected conf@ node (images->fit_uname_cfg) for a | 501 | * This looks in the selected conf@ node (images->fit_uname_cfg) for a |
501 | * particular image type (e.g. "kernel") and then finds the image that is | 502 | * particular image type (e.g. "kernel") and then finds the image that is |
502 | * referred to. | 503 | * referred to. |
503 | * | 504 | * |
504 | * For example, for something like: | 505 | * For example, for something like: |
505 | * | 506 | * |
506 | * images { | 507 | * images { |
507 | * kernel@1 { | 508 | * kernel@1 { |
508 | * ... | 509 | * ... |
509 | * }; | 510 | * }; |
510 | * }; | 511 | * }; |
511 | * configurations { | 512 | * configurations { |
512 | * conf@1 { | 513 | * conf@1 { |
513 | * kernel = "kernel@1"; | 514 | * kernel = "kernel@1"; |
514 | * }; | 515 | * }; |
515 | * }; | 516 | * }; |
516 | * | 517 | * |
517 | * the function will return the node offset of the kernel@1 node, assuming | 518 | * the function will return the node offset of the kernel@1 node, assuming |
518 | * that conf@1 is the chosen configuration. | 519 | * that conf@1 is the chosen configuration. |
519 | * | 520 | * |
520 | * @param images Boot images structure | 521 | * @param images Boot images structure |
521 | * @param prop_name Property name to look up (FIT_..._PROP) | 522 | * @param prop_name Property name to look up (FIT_..._PROP) |
522 | * @param addr Address of FIT in memory | 523 | * @param addr Address of FIT in memory |
523 | */ | 524 | */ |
524 | int fit_get_node_from_config(bootm_headers_t *images, const char *prop_name, | 525 | int fit_get_node_from_config(bootm_headers_t *images, const char *prop_name, |
525 | ulong addr); | 526 | ulong addr); |
526 | 527 | ||
527 | int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch, | 528 | int boot_get_fdt(int flag, int argc, char * const argv[], uint8_t arch, |
528 | bootm_headers_t *images, | 529 | bootm_headers_t *images, |
529 | char **of_flat_tree, ulong *of_size); | 530 | char **of_flat_tree, ulong *of_size); |
530 | void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob); | 531 | void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob); |
531 | int boot_relocate_fdt(struct lmb *lmb, char **of_flat_tree, ulong *of_size); | 532 | int boot_relocate_fdt(struct lmb *lmb, char **of_flat_tree, ulong *of_size); |
532 | 533 | ||
533 | int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len, | 534 | int boot_ramdisk_high(struct lmb *lmb, ulong rd_data, ulong rd_len, |
534 | ulong *initrd_start, ulong *initrd_end); | 535 | ulong *initrd_start, ulong *initrd_end); |
535 | int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end); | 536 | int boot_get_cmdline(struct lmb *lmb, ulong *cmd_start, ulong *cmd_end); |
536 | #ifdef CONFIG_SYS_BOOT_GET_KBD | 537 | #ifdef CONFIG_SYS_BOOT_GET_KBD |
537 | int boot_get_kbd(struct lmb *lmb, bd_t **kbd); | 538 | int boot_get_kbd(struct lmb *lmb, bd_t **kbd); |
538 | #endif /* CONFIG_SYS_BOOT_GET_KBD */ | 539 | #endif /* CONFIG_SYS_BOOT_GET_KBD */ |
539 | #endif /* !USE_HOSTCC */ | 540 | #endif /* !USE_HOSTCC */ |
540 | 541 | ||
541 | /*******************************************************************/ | 542 | /*******************************************************************/ |
542 | /* Legacy format specific code (prefixed with image_) */ | 543 | /* Legacy format specific code (prefixed with image_) */ |
543 | /*******************************************************************/ | 544 | /*******************************************************************/ |
544 | static inline uint32_t image_get_header_size(void) | 545 | static inline uint32_t image_get_header_size(void) |
545 | { | 546 | { |
546 | return (sizeof(image_header_t)); | 547 | return (sizeof(image_header_t)); |
547 | } | 548 | } |
548 | 549 | ||
549 | #define image_get_hdr_l(f) \ | 550 | #define image_get_hdr_l(f) \ |
550 | static inline uint32_t image_get_##f(const image_header_t *hdr) \ | 551 | static inline uint32_t image_get_##f(const image_header_t *hdr) \ |
551 | { \ | 552 | { \ |
552 | return uimage_to_cpu(hdr->ih_##f); \ | 553 | return uimage_to_cpu(hdr->ih_##f); \ |
553 | } | 554 | } |
554 | image_get_hdr_l(magic) /* image_get_magic */ | 555 | image_get_hdr_l(magic) /* image_get_magic */ |
555 | image_get_hdr_l(hcrc) /* image_get_hcrc */ | 556 | image_get_hdr_l(hcrc) /* image_get_hcrc */ |
556 | image_get_hdr_l(time) /* image_get_time */ | 557 | image_get_hdr_l(time) /* image_get_time */ |
557 | image_get_hdr_l(size) /* image_get_size */ | 558 | image_get_hdr_l(size) /* image_get_size */ |
558 | image_get_hdr_l(load) /* image_get_load */ | 559 | image_get_hdr_l(load) /* image_get_load */ |
559 | image_get_hdr_l(ep) /* image_get_ep */ | 560 | image_get_hdr_l(ep) /* image_get_ep */ |
560 | image_get_hdr_l(dcrc) /* image_get_dcrc */ | 561 | image_get_hdr_l(dcrc) /* image_get_dcrc */ |
561 | 562 | ||
562 | #define image_get_hdr_b(f) \ | 563 | #define image_get_hdr_b(f) \ |
563 | static inline uint8_t image_get_##f(const image_header_t *hdr) \ | 564 | static inline uint8_t image_get_##f(const image_header_t *hdr) \ |
564 | { \ | 565 | { \ |
565 | return hdr->ih_##f; \ | 566 | return hdr->ih_##f; \ |
566 | } | 567 | } |
567 | image_get_hdr_b(os) /* image_get_os */ | 568 | image_get_hdr_b(os) /* image_get_os */ |
568 | image_get_hdr_b(arch) /* image_get_arch */ | 569 | image_get_hdr_b(arch) /* image_get_arch */ |
569 | image_get_hdr_b(type) /* image_get_type */ | 570 | image_get_hdr_b(type) /* image_get_type */ |
570 | image_get_hdr_b(comp) /* image_get_comp */ | 571 | image_get_hdr_b(comp) /* image_get_comp */ |
571 | 572 | ||
572 | static inline char *image_get_name(const image_header_t *hdr) | 573 | static inline char *image_get_name(const image_header_t *hdr) |
573 | { | 574 | { |
574 | return (char *)hdr->ih_name; | 575 | return (char *)hdr->ih_name; |
575 | } | 576 | } |
576 | 577 | ||
577 | static inline uint32_t image_get_data_size(const image_header_t *hdr) | 578 | static inline uint32_t image_get_data_size(const image_header_t *hdr) |
578 | { | 579 | { |
579 | return image_get_size(hdr); | 580 | return image_get_size(hdr); |
580 | } | 581 | } |
581 | 582 | ||
582 | /** | 583 | /** |
583 | * image_get_data - get image payload start address | 584 | * image_get_data - get image payload start address |
584 | * @hdr: image header | 585 | * @hdr: image header |
585 | * | 586 | * |
586 | * image_get_data() returns address of the image payload. For single | 587 | * image_get_data() returns address of the image payload. For single |
587 | * component images it is image data start. For multi component | 588 | * component images it is image data start. For multi component |
588 | * images it points to the null terminated table of sub-images sizes. | 589 | * images it points to the null terminated table of sub-images sizes. |
589 | * | 590 | * |
590 | * returns: | 591 | * returns: |
591 | * image payload data start address | 592 | * image payload data start address |
592 | */ | 593 | */ |
593 | static inline ulong image_get_data(const image_header_t *hdr) | 594 | static inline ulong image_get_data(const image_header_t *hdr) |
594 | { | 595 | { |
595 | return ((ulong)hdr + image_get_header_size()); | 596 | return ((ulong)hdr + image_get_header_size()); |
596 | } | 597 | } |
597 | 598 | ||
598 | static inline uint32_t image_get_image_size(const image_header_t *hdr) | 599 | static inline uint32_t image_get_image_size(const image_header_t *hdr) |
599 | { | 600 | { |
600 | return (image_get_size(hdr) + image_get_header_size()); | 601 | return (image_get_size(hdr) + image_get_header_size()); |
601 | } | 602 | } |
602 | static inline ulong image_get_image_end(const image_header_t *hdr) | 603 | static inline ulong image_get_image_end(const image_header_t *hdr) |
603 | { | 604 | { |
604 | return ((ulong)hdr + image_get_image_size(hdr)); | 605 | return ((ulong)hdr + image_get_image_size(hdr)); |
605 | } | 606 | } |
606 | 607 | ||
607 | #define image_set_hdr_l(f) \ | 608 | #define image_set_hdr_l(f) \ |
608 | static inline void image_set_##f(image_header_t *hdr, uint32_t val) \ | 609 | static inline void image_set_##f(image_header_t *hdr, uint32_t val) \ |
609 | { \ | 610 | { \ |
610 | hdr->ih_##f = cpu_to_uimage(val); \ | 611 | hdr->ih_##f = cpu_to_uimage(val); \ |
611 | } | 612 | } |
612 | image_set_hdr_l(magic) /* image_set_magic */ | 613 | image_set_hdr_l(magic) /* image_set_magic */ |
613 | image_set_hdr_l(hcrc) /* image_set_hcrc */ | 614 | image_set_hdr_l(hcrc) /* image_set_hcrc */ |
614 | image_set_hdr_l(time) /* image_set_time */ | 615 | image_set_hdr_l(time) /* image_set_time */ |
615 | image_set_hdr_l(size) /* image_set_size */ | 616 | image_set_hdr_l(size) /* image_set_size */ |
616 | image_set_hdr_l(load) /* image_set_load */ | 617 | image_set_hdr_l(load) /* image_set_load */ |
617 | image_set_hdr_l(ep) /* image_set_ep */ | 618 | image_set_hdr_l(ep) /* image_set_ep */ |
618 | image_set_hdr_l(dcrc) /* image_set_dcrc */ | 619 | image_set_hdr_l(dcrc) /* image_set_dcrc */ |
619 | 620 | ||
620 | #define image_set_hdr_b(f) \ | 621 | #define image_set_hdr_b(f) \ |
621 | static inline void image_set_##f(image_header_t *hdr, uint8_t val) \ | 622 | static inline void image_set_##f(image_header_t *hdr, uint8_t val) \ |
622 | { \ | 623 | { \ |
623 | hdr->ih_##f = val; \ | 624 | hdr->ih_##f = val; \ |
624 | } | 625 | } |
625 | image_set_hdr_b(os) /* image_set_os */ | 626 | image_set_hdr_b(os) /* image_set_os */ |
626 | image_set_hdr_b(arch) /* image_set_arch */ | 627 | image_set_hdr_b(arch) /* image_set_arch */ |
627 | image_set_hdr_b(type) /* image_set_type */ | 628 | image_set_hdr_b(type) /* image_set_type */ |
628 | image_set_hdr_b(comp) /* image_set_comp */ | 629 | image_set_hdr_b(comp) /* image_set_comp */ |
629 | 630 | ||
630 | static inline void image_set_name(image_header_t *hdr, const char *name) | 631 | static inline void image_set_name(image_header_t *hdr, const char *name) |
631 | { | 632 | { |
632 | strncpy(image_get_name(hdr), name, IH_NMLEN); | 633 | strncpy(image_get_name(hdr), name, IH_NMLEN); |
633 | } | 634 | } |
634 | 635 | ||
635 | int image_check_hcrc(const image_header_t *hdr); | 636 | int image_check_hcrc(const image_header_t *hdr); |
636 | int image_check_dcrc(const image_header_t *hdr); | 637 | int image_check_dcrc(const image_header_t *hdr); |
637 | #ifndef USE_HOSTCC | 638 | #ifndef USE_HOSTCC |
638 | ulong getenv_bootm_low(void); | 639 | ulong getenv_bootm_low(void); |
639 | phys_size_t getenv_bootm_size(void); | 640 | phys_size_t getenv_bootm_size(void); |
640 | phys_size_t getenv_bootm_mapsize(void); | 641 | phys_size_t getenv_bootm_mapsize(void); |
641 | #endif | 642 | #endif |
642 | void memmove_wd(void *to, void *from, size_t len, ulong chunksz); | 643 | void memmove_wd(void *to, void *from, size_t len, ulong chunksz); |
643 | 644 | ||
644 | static inline int image_check_magic(const image_header_t *hdr) | 645 | static inline int image_check_magic(const image_header_t *hdr) |
645 | { | 646 | { |
646 | return (image_get_magic(hdr) == IH_MAGIC); | 647 | return (image_get_magic(hdr) == IH_MAGIC); |
647 | } | 648 | } |
648 | static inline int image_check_type(const image_header_t *hdr, uint8_t type) | 649 | static inline int image_check_type(const image_header_t *hdr, uint8_t type) |
649 | { | 650 | { |
650 | return (image_get_type(hdr) == type); | 651 | return (image_get_type(hdr) == type); |
651 | } | 652 | } |
652 | static inline int image_check_arch(const image_header_t *hdr, uint8_t arch) | 653 | static inline int image_check_arch(const image_header_t *hdr, uint8_t arch) |
653 | { | 654 | { |
654 | return (image_get_arch(hdr) == arch); | 655 | return (image_get_arch(hdr) == arch); |
655 | } | 656 | } |
656 | static inline int image_check_os(const image_header_t *hdr, uint8_t os) | 657 | static inline int image_check_os(const image_header_t *hdr, uint8_t os) |
657 | { | 658 | { |
658 | return (image_get_os(hdr) == os); | 659 | return (image_get_os(hdr) == os); |
659 | } | 660 | } |
660 | 661 | ||
661 | ulong image_multi_count(const image_header_t *hdr); | 662 | ulong image_multi_count(const image_header_t *hdr); |
662 | void image_multi_getimg(const image_header_t *hdr, ulong idx, | 663 | void image_multi_getimg(const image_header_t *hdr, ulong idx, |
663 | ulong *data, ulong *len); | 664 | ulong *data, ulong *len); |
664 | 665 | ||
665 | void image_print_contents(const void *hdr); | 666 | void image_print_contents(const void *hdr); |
666 | 667 | ||
667 | #ifndef USE_HOSTCC | 668 | #ifndef USE_HOSTCC |
668 | static inline int image_check_target_arch(const image_header_t *hdr) | 669 | static inline int image_check_target_arch(const image_header_t *hdr) |
669 | { | 670 | { |
670 | #ifndef IH_ARCH_DEFAULT | 671 | #ifndef IH_ARCH_DEFAULT |
671 | # error "please define IH_ARCH_DEFAULT in your arch asm/u-boot.h" | 672 | # error "please define IH_ARCH_DEFAULT in your arch asm/u-boot.h" |
672 | #endif | 673 | #endif |
673 | return image_check_arch(hdr, IH_ARCH_DEFAULT); | 674 | return image_check_arch(hdr, IH_ARCH_DEFAULT); |
674 | } | 675 | } |
675 | #endif /* USE_HOSTCC */ | 676 | #endif /* USE_HOSTCC */ |
676 | 677 | ||
677 | /** | 678 | /** |
678 | * Set up properties in the FDT | 679 | * Set up properties in the FDT |
679 | * | 680 | * |
680 | * This sets up properties in the FDT that is to be passed to linux. | 681 | * This sets up properties in the FDT that is to be passed to linux. |
681 | * | 682 | * |
682 | * @images: Images information | 683 | * @images: Images information |
683 | * @blob: FDT to update | 684 | * @blob: FDT to update |
684 | * @of_size: Size of the FDT | 685 | * @of_size: Size of the FDT |
685 | * @lmb: Points to logical memory block structure | 686 | * @lmb: Points to logical memory block structure |
686 | * @return 0 if ok, <0 on failure | 687 | * @return 0 if ok, <0 on failure |
687 | */ | 688 | */ |
688 | int image_setup_libfdt(bootm_headers_t *images, void *blob, | 689 | int image_setup_libfdt(bootm_headers_t *images, void *blob, |
689 | int of_size, struct lmb *lmb); | 690 | int of_size, struct lmb *lmb); |
690 | 691 | ||
691 | /** | 692 | /** |
692 | * Set up the FDT to use for booting a kernel | 693 | * Set up the FDT to use for booting a kernel |
693 | * | 694 | * |
694 | * This performs ramdisk setup, sets up the FDT if required, and adds | 695 | * This performs ramdisk setup, sets up the FDT if required, and adds |
695 | * paramters to the FDT if libfdt is available. | 696 | * paramters to the FDT if libfdt is available. |
696 | * | 697 | * |
697 | * @param images Images information | 698 | * @param images Images information |
698 | * @return 0 if ok, <0 on failure | 699 | * @return 0 if ok, <0 on failure |
699 | */ | 700 | */ |
700 | int image_setup_linux(bootm_headers_t *images); | 701 | int image_setup_linux(bootm_headers_t *images); |
701 | 702 | ||
702 | /** | 703 | /** |
703 | * bootz_setup() - Extract stat and size of a Linux xImage | 704 | * bootz_setup() - Extract stat and size of a Linux xImage |
704 | * | 705 | * |
705 | * @image: Address of image | 706 | * @image: Address of image |
706 | * @start: Returns start address of image | 707 | * @start: Returns start address of image |
707 | * @end : Returns end address of image | 708 | * @end : Returns end address of image |
708 | * @return 0 if OK, 1 if the image was not recognised | 709 | * @return 0 if OK, 1 if the image was not recognised |
709 | */ | 710 | */ |
710 | int bootz_setup(ulong image, ulong *start, ulong *end); | 711 | int bootz_setup(ulong image, ulong *start, ulong *end); |
711 | 712 | ||
712 | 713 | ||
713 | /*******************************************************************/ | 714 | /*******************************************************************/ |
714 | /* New uImage format specific code (prefixed with fit_) */ | 715 | /* New uImage format specific code (prefixed with fit_) */ |
715 | /*******************************************************************/ | 716 | /*******************************************************************/ |
716 | #if defined(CONFIG_FIT) | 717 | #if defined(CONFIG_FIT) |
717 | 718 | ||
718 | #define FIT_IMAGES_PATH "/images" | 719 | #define FIT_IMAGES_PATH "/images" |
719 | #define FIT_CONFS_PATH "/configurations" | 720 | #define FIT_CONFS_PATH "/configurations" |
720 | 721 | ||
721 | /* hash/signature node */ | 722 | /* hash/signature node */ |
722 | #define FIT_HASH_NODENAME "hash" | 723 | #define FIT_HASH_NODENAME "hash" |
723 | #define FIT_ALGO_PROP "algo" | 724 | #define FIT_ALGO_PROP "algo" |
724 | #define FIT_VALUE_PROP "value" | 725 | #define FIT_VALUE_PROP "value" |
725 | #define FIT_IGNORE_PROP "uboot-ignore" | 726 | #define FIT_IGNORE_PROP "uboot-ignore" |
726 | #define FIT_SIG_NODENAME "signature" | 727 | #define FIT_SIG_NODENAME "signature" |
727 | 728 | ||
728 | /* image node */ | 729 | /* image node */ |
729 | #define FIT_DATA_PROP "data" | 730 | #define FIT_DATA_PROP "data" |
730 | #define FIT_TIMESTAMP_PROP "timestamp" | 731 | #define FIT_TIMESTAMP_PROP "timestamp" |
731 | #define FIT_DESC_PROP "description" | 732 | #define FIT_DESC_PROP "description" |
732 | #define FIT_ARCH_PROP "arch" | 733 | #define FIT_ARCH_PROP "arch" |
733 | #define FIT_TYPE_PROP "type" | 734 | #define FIT_TYPE_PROP "type" |
734 | #define FIT_OS_PROP "os" | 735 | #define FIT_OS_PROP "os" |
735 | #define FIT_COMP_PROP "compression" | 736 | #define FIT_COMP_PROP "compression" |
736 | #define FIT_ENTRY_PROP "entry" | 737 | #define FIT_ENTRY_PROP "entry" |
737 | #define FIT_LOAD_PROP "load" | 738 | #define FIT_LOAD_PROP "load" |
738 | 739 | ||
739 | /* configuration node */ | 740 | /* configuration node */ |
740 | #define FIT_KERNEL_PROP "kernel" | 741 | #define FIT_KERNEL_PROP "kernel" |
741 | #define FIT_RAMDISK_PROP "ramdisk" | 742 | #define FIT_RAMDISK_PROP "ramdisk" |
742 | #define FIT_FDT_PROP "fdt" | 743 | #define FIT_FDT_PROP "fdt" |
743 | #define FIT_DEFAULT_PROP "default" | 744 | #define FIT_DEFAULT_PROP "default" |
744 | #define FIT_SETUP_PROP "setup" | 745 | #define FIT_SETUP_PROP "setup" |
745 | 746 | ||
746 | #define FIT_MAX_HASH_LEN HASH_MAX_DIGEST_SIZE | 747 | #define FIT_MAX_HASH_LEN HASH_MAX_DIGEST_SIZE |
747 | 748 | ||
748 | /* cmdline argument format parsing */ | 749 | /* cmdline argument format parsing */ |
749 | int fit_parse_conf(const char *spec, ulong addr_curr, | 750 | int fit_parse_conf(const char *spec, ulong addr_curr, |
750 | ulong *addr, const char **conf_name); | 751 | ulong *addr, const char **conf_name); |
751 | int fit_parse_subimage(const char *spec, ulong addr_curr, | 752 | int fit_parse_subimage(const char *spec, ulong addr_curr, |
752 | ulong *addr, const char **image_name); | 753 | ulong *addr, const char **image_name); |
753 | 754 | ||
754 | int fit_get_subimage_count(const void *fit, int images_noffset); | 755 | int fit_get_subimage_count(const void *fit, int images_noffset); |
755 | void fit_print_contents(const void *fit); | 756 | void fit_print_contents(const void *fit); |
756 | void fit_image_print(const void *fit, int noffset, const char *p); | 757 | void fit_image_print(const void *fit, int noffset, const char *p); |
757 | 758 | ||
758 | /** | 759 | /** |
759 | * fit_get_end - get FIT image size | 760 | * fit_get_end - get FIT image size |
760 | * @fit: pointer to the FIT format image header | 761 | * @fit: pointer to the FIT format image header |
761 | * | 762 | * |
762 | * returns: | 763 | * returns: |
763 | * size of the FIT image (blob) in memory | 764 | * size of the FIT image (blob) in memory |
764 | */ | 765 | */ |
765 | static inline ulong fit_get_size(const void *fit) | 766 | static inline ulong fit_get_size(const void *fit) |
766 | { | 767 | { |
767 | return fdt_totalsize(fit); | 768 | return fdt_totalsize(fit); |
768 | } | 769 | } |
769 | 770 | ||
770 | /** | 771 | /** |
771 | * fit_get_end - get FIT image end | 772 | * fit_get_end - get FIT image end |
772 | * @fit: pointer to the FIT format image header | 773 | * @fit: pointer to the FIT format image header |
773 | * | 774 | * |
774 | * returns: | 775 | * returns: |
775 | * end address of the FIT image (blob) in memory | 776 | * end address of the FIT image (blob) in memory |
776 | */ | 777 | */ |
777 | static inline ulong fit_get_end(const void *fit) | 778 | static inline ulong fit_get_end(const void *fit) |
778 | { | 779 | { |
779 | return (ulong)fit + fdt_totalsize(fit); | 780 | return (ulong)fit + fdt_totalsize(fit); |
780 | } | 781 | } |
781 | 782 | ||
782 | /** | 783 | /** |
783 | * fit_get_name - get FIT node name | 784 | * fit_get_name - get FIT node name |
784 | * @fit: pointer to the FIT format image header | 785 | * @fit: pointer to the FIT format image header |
785 | * | 786 | * |
786 | * returns: | 787 | * returns: |
787 | * NULL, on error | 788 | * NULL, on error |
788 | * pointer to node name, on success | 789 | * pointer to node name, on success |
789 | */ | 790 | */ |
790 | static inline const char *fit_get_name(const void *fit_hdr, | 791 | static inline const char *fit_get_name(const void *fit_hdr, |
791 | int noffset, int *len) | 792 | int noffset, int *len) |
792 | { | 793 | { |
793 | return fdt_get_name(fit_hdr, noffset, len); | 794 | return fdt_get_name(fit_hdr, noffset, len); |
794 | } | 795 | } |
795 | 796 | ||
796 | int fit_get_desc(const void *fit, int noffset, char **desc); | 797 | int fit_get_desc(const void *fit, int noffset, char **desc); |
797 | int fit_get_timestamp(const void *fit, int noffset, time_t *timestamp); | 798 | int fit_get_timestamp(const void *fit, int noffset, time_t *timestamp); |
798 | 799 | ||
799 | int fit_image_get_node(const void *fit, const char *image_uname); | 800 | int fit_image_get_node(const void *fit, const char *image_uname); |
800 | int fit_image_get_os(const void *fit, int noffset, uint8_t *os); | 801 | int fit_image_get_os(const void *fit, int noffset, uint8_t *os); |
801 | int fit_image_get_arch(const void *fit, int noffset, uint8_t *arch); | 802 | int fit_image_get_arch(const void *fit, int noffset, uint8_t *arch); |
802 | int fit_image_get_type(const void *fit, int noffset, uint8_t *type); | 803 | int fit_image_get_type(const void *fit, int noffset, uint8_t *type); |
803 | int fit_image_get_comp(const void *fit, int noffset, uint8_t *comp); | 804 | int fit_image_get_comp(const void *fit, int noffset, uint8_t *comp); |
804 | int fit_image_get_load(const void *fit, int noffset, ulong *load); | 805 | int fit_image_get_load(const void *fit, int noffset, ulong *load); |
805 | int fit_image_get_entry(const void *fit, int noffset, ulong *entry); | 806 | int fit_image_get_entry(const void *fit, int noffset, ulong *entry); |
806 | int fit_image_get_data(const void *fit, int noffset, | 807 | int fit_image_get_data(const void *fit, int noffset, |
807 | const void **data, size_t *size); | 808 | const void **data, size_t *size); |
808 | 809 | ||
809 | int fit_image_hash_get_algo(const void *fit, int noffset, char **algo); | 810 | int fit_image_hash_get_algo(const void *fit, int noffset, char **algo); |
810 | int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value, | 811 | int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value, |
811 | int *value_len); | 812 | int *value_len); |
812 | 813 | ||
813 | int fit_set_timestamp(void *fit, int noffset, time_t timestamp); | 814 | int fit_set_timestamp(void *fit, int noffset, time_t timestamp); |
814 | 815 | ||
815 | /** | 816 | /** |
816 | * fit_add_verification_data() - add verification data to FIT image nodes | 817 | * fit_add_verification_data() - add verification data to FIT image nodes |
817 | * | 818 | * |
818 | * @keydir: Directory containing keys | 819 | * @keydir: Directory containing keys |
819 | * @kwydest: FDT blob to write public key information to | 820 | * @kwydest: FDT blob to write public key information to |
820 | * @fit: Pointer to the FIT format image header | 821 | * @fit: Pointer to the FIT format image header |
821 | * @comment: Comment to add to signature nodes | 822 | * @comment: Comment to add to signature nodes |
822 | * @require_keys: Mark all keys as 'required' | 823 | * @require_keys: Mark all keys as 'required' |
823 | * | 824 | * |
824 | * Adds hash values for all component images in the FIT blob. | 825 | * Adds hash values for all component images in the FIT blob. |
825 | * Hashes are calculated for all component images which have hash subnodes | 826 | * Hashes are calculated for all component images which have hash subnodes |
826 | * with algorithm property set to one of the supported hash algorithms. | 827 | * with algorithm property set to one of the supported hash algorithms. |
827 | * | 828 | * |
828 | * Also add signatures if signature nodes are present. | 829 | * Also add signatures if signature nodes are present. |
829 | * | 830 | * |
830 | * returns | 831 | * returns |
831 | * 0, on success | 832 | * 0, on success |
832 | * libfdt error code, on failure | 833 | * libfdt error code, on failure |
833 | */ | 834 | */ |
834 | int fit_add_verification_data(const char *keydir, void *keydest, void *fit, | 835 | int fit_add_verification_data(const char *keydir, void *keydest, void *fit, |
835 | const char *comment, int require_keys); | 836 | const char *comment, int require_keys); |
836 | 837 | ||
837 | int fit_image_verify(const void *fit, int noffset); | 838 | int fit_image_verify(const void *fit, int noffset); |
838 | int fit_config_verify(const void *fit, int conf_noffset); | 839 | int fit_config_verify(const void *fit, int conf_noffset); |
839 | int fit_all_image_verify(const void *fit); | 840 | int fit_all_image_verify(const void *fit); |
840 | int fit_image_check_os(const void *fit, int noffset, uint8_t os); | 841 | int fit_image_check_os(const void *fit, int noffset, uint8_t os); |
841 | int fit_image_check_arch(const void *fit, int noffset, uint8_t arch); | 842 | int fit_image_check_arch(const void *fit, int noffset, uint8_t arch); |
842 | int fit_image_check_type(const void *fit, int noffset, uint8_t type); | 843 | int fit_image_check_type(const void *fit, int noffset, uint8_t type); |
843 | int fit_image_check_comp(const void *fit, int noffset, uint8_t comp); | 844 | int fit_image_check_comp(const void *fit, int noffset, uint8_t comp); |
844 | int fit_check_format(const void *fit); | 845 | int fit_check_format(const void *fit); |
845 | 846 | ||
846 | int fit_conf_find_compat(const void *fit, const void *fdt); | 847 | int fit_conf_find_compat(const void *fit, const void *fdt); |
847 | int fit_conf_get_node(const void *fit, const char *conf_uname); | 848 | int fit_conf_get_node(const void *fit, const char *conf_uname); |
848 | 849 | ||
849 | /** | 850 | /** |
850 | * fit_conf_get_prop_node() - Get node refered to by a configuration | 851 | * fit_conf_get_prop_node() - Get node refered to by a configuration |
851 | * @fit: FIT to check | 852 | * @fit: FIT to check |
852 | * @noffset: Offset of conf@xxx node to check | 853 | * @noffset: Offset of conf@xxx node to check |
853 | * @prop_name: Property to read from the conf node | 854 | * @prop_name: Property to read from the conf node |
854 | * | 855 | * |
855 | * The conf@ nodes contain references to other nodes, using properties | 856 | * The conf@ nodes contain references to other nodes, using properties |
856 | * like 'kernel = "kernel@1"'. Given such a property name (e.g. "kernel"), | 857 | * like 'kernel = "kernel@1"'. Given such a property name (e.g. "kernel"), |
857 | * return the offset of the node referred to (e.g. offset of node | 858 | * return the offset of the node referred to (e.g. offset of node |
858 | * "/images/kernel@1". | 859 | * "/images/kernel@1". |
859 | */ | 860 | */ |
860 | int fit_conf_get_prop_node(const void *fit, int noffset, | 861 | int fit_conf_get_prop_node(const void *fit, int noffset, |
861 | const char *prop_name); | 862 | const char *prop_name); |
862 | 863 | ||
863 | void fit_conf_print(const void *fit, int noffset, const char *p); | 864 | void fit_conf_print(const void *fit, int noffset, const char *p); |
864 | 865 | ||
865 | int fit_check_ramdisk(const void *fit, int os_noffset, | 866 | int fit_check_ramdisk(const void *fit, int os_noffset, |
866 | uint8_t arch, int verify); | 867 | uint8_t arch, int verify); |
867 | 868 | ||
868 | int calculate_hash(const void *data, int data_len, const char *algo, | 869 | int calculate_hash(const void *data, int data_len, const char *algo, |
869 | uint8_t *value, int *value_len); | 870 | uint8_t *value, int *value_len); |
870 | 871 | ||
871 | /* | 872 | /* |
872 | * At present we only support signing on the host, and verification on the | 873 | * At present we only support signing on the host, and verification on the |
873 | * device | 874 | * device |
874 | */ | 875 | */ |
875 | #if defined(CONFIG_FIT_SIGNATURE) | 876 | #if defined(CONFIG_FIT_SIGNATURE) |
876 | # ifdef USE_HOSTCC | 877 | # ifdef USE_HOSTCC |
877 | # define IMAGE_ENABLE_SIGN 1 | 878 | # define IMAGE_ENABLE_SIGN 1 |
878 | # define IMAGE_ENABLE_VERIFY 1 | 879 | # define IMAGE_ENABLE_VERIFY 1 |
879 | # include <openssl/evp.h> | 880 | # include <openssl/evp.h> |
880 | #else | 881 | #else |
881 | # define IMAGE_ENABLE_SIGN 0 | 882 | # define IMAGE_ENABLE_SIGN 0 |
882 | # define IMAGE_ENABLE_VERIFY 1 | 883 | # define IMAGE_ENABLE_VERIFY 1 |
883 | # endif | 884 | # endif |
884 | #else | 885 | #else |
885 | # define IMAGE_ENABLE_SIGN 0 | 886 | # define IMAGE_ENABLE_SIGN 0 |
886 | # define IMAGE_ENABLE_VERIFY 0 | 887 | # define IMAGE_ENABLE_VERIFY 0 |
887 | #endif | 888 | #endif |
888 | 889 | ||
889 | #ifdef USE_HOSTCC | 890 | #ifdef USE_HOSTCC |
890 | void *image_get_host_blob(void); | 891 | void *image_get_host_blob(void); |
891 | void image_set_host_blob(void *host_blob); | 892 | void image_set_host_blob(void *host_blob); |
892 | # define gd_fdt_blob() image_get_host_blob() | 893 | # define gd_fdt_blob() image_get_host_blob() |
893 | #else | 894 | #else |
894 | # define gd_fdt_blob() (gd->fdt_blob) | 895 | # define gd_fdt_blob() (gd->fdt_blob) |
895 | #endif | 896 | #endif |
896 | 897 | ||
897 | #ifdef CONFIG_FIT_BEST_MATCH | 898 | #ifdef CONFIG_FIT_BEST_MATCH |
898 | #define IMAGE_ENABLE_BEST_MATCH 1 | 899 | #define IMAGE_ENABLE_BEST_MATCH 1 |
899 | #else | 900 | #else |
900 | #define IMAGE_ENABLE_BEST_MATCH 0 | 901 | #define IMAGE_ENABLE_BEST_MATCH 0 |
901 | #endif | 902 | #endif |
902 | 903 | ||
903 | /* Information passed to the signing routines */ | 904 | /* Information passed to the signing routines */ |
904 | struct image_sign_info { | 905 | struct image_sign_info { |
905 | const char *keydir; /* Directory conaining keys */ | 906 | const char *keydir; /* Directory conaining keys */ |
906 | const char *keyname; /* Name of key to use */ | 907 | const char *keyname; /* Name of key to use */ |
907 | void *fit; /* Pointer to FIT blob */ | 908 | void *fit; /* Pointer to FIT blob */ |
908 | int node_offset; /* Offset of signature node */ | 909 | int node_offset; /* Offset of signature node */ |
909 | struct image_sig_algo *algo; /* Algorithm information */ | 910 | struct image_sig_algo *algo; /* Algorithm information */ |
910 | const void *fdt_blob; /* FDT containing public keys */ | 911 | const void *fdt_blob; /* FDT containing public keys */ |
911 | int required_keynode; /* Node offset of key to use: -1=any */ | 912 | int required_keynode; /* Node offset of key to use: -1=any */ |
912 | const char *require_keys; /* Value for 'required' property */ | 913 | const char *require_keys; /* Value for 'required' property */ |
913 | }; | 914 | }; |
914 | 915 | ||
915 | /* A part of an image, used for hashing */ | 916 | /* A part of an image, used for hashing */ |
916 | struct image_region { | 917 | struct image_region { |
917 | const void *data; | 918 | const void *data; |
918 | int size; | 919 | int size; |
919 | }; | 920 | }; |
920 | 921 | ||
921 | #if IMAGE_ENABLE_VERIFY | 922 | #if IMAGE_ENABLE_VERIFY |
922 | # include <u-boot/rsa-checksum.h> | 923 | # include <u-boot/rsa-checksum.h> |
923 | #endif | 924 | #endif |
924 | struct checksum_algo { | 925 | struct checksum_algo { |
925 | const char *name; | 926 | const char *name; |
926 | const int checksum_len; | 927 | const int checksum_len; |
927 | const int pad_len; | 928 | const int pad_len; |
928 | #if IMAGE_ENABLE_SIGN | 929 | #if IMAGE_ENABLE_SIGN |
929 | const EVP_MD *(*calculate_sign)(void); | 930 | const EVP_MD *(*calculate_sign)(void); |
930 | #endif | 931 | #endif |
931 | int (*calculate)(const char *name, | 932 | int (*calculate)(const char *name, |
932 | const struct image_region region[], | 933 | const struct image_region region[], |
933 | int region_count, uint8_t *checksum); | 934 | int region_count, uint8_t *checksum); |
934 | const uint8_t *rsa_padding; | 935 | const uint8_t *rsa_padding; |
935 | }; | 936 | }; |
936 | 937 | ||
937 | struct image_sig_algo { | 938 | struct image_sig_algo { |
938 | const char *name; /* Name of algorithm */ | 939 | const char *name; /* Name of algorithm */ |
939 | 940 | ||
940 | /** | 941 | /** |
941 | * sign() - calculate and return signature for given input data | 942 | * sign() - calculate and return signature for given input data |
942 | * | 943 | * |
943 | * @info: Specifies key and FIT information | 944 | * @info: Specifies key and FIT information |
944 | * @data: Pointer to the input data | 945 | * @data: Pointer to the input data |
945 | * @data_len: Data length | 946 | * @data_len: Data length |
946 | * @sigp: Set to an allocated buffer holding the signature | 947 | * @sigp: Set to an allocated buffer holding the signature |
947 | * @sig_len: Set to length of the calculated hash | 948 | * @sig_len: Set to length of the calculated hash |
948 | * | 949 | * |
949 | * This computes input data signature according to selected algorithm. | 950 | * This computes input data signature according to selected algorithm. |
950 | * Resulting signature value is placed in an allocated buffer, the | 951 | * Resulting signature value is placed in an allocated buffer, the |
951 | * pointer is returned as *sigp. The length of the calculated | 952 | * pointer is returned as *sigp. The length of the calculated |
952 | * signature is returned via the sig_len pointer argument. The caller | 953 | * signature is returned via the sig_len pointer argument. The caller |
953 | * should free *sigp. | 954 | * should free *sigp. |
954 | * | 955 | * |
955 | * @return: 0, on success, -ve on error | 956 | * @return: 0, on success, -ve on error |
956 | */ | 957 | */ |
957 | int (*sign)(struct image_sign_info *info, | 958 | int (*sign)(struct image_sign_info *info, |
958 | const struct image_region region[], | 959 | const struct image_region region[], |
959 | int region_count, uint8_t **sigp, uint *sig_len); | 960 | int region_count, uint8_t **sigp, uint *sig_len); |
960 | 961 | ||
961 | /** | 962 | /** |
962 | * add_verify_data() - Add verification information to FDT | 963 | * add_verify_data() - Add verification information to FDT |
963 | * | 964 | * |
964 | * Add public key information to the FDT node, suitable for | 965 | * Add public key information to the FDT node, suitable for |
965 | * verification at run-time. The information added depends on the | 966 | * verification at run-time. The information added depends on the |
966 | * algorithm being used. | 967 | * algorithm being used. |
967 | * | 968 | * |
968 | * @info: Specifies key and FIT information | 969 | * @info: Specifies key and FIT information |
969 | * @keydest: Destination FDT blob for public key data | 970 | * @keydest: Destination FDT blob for public key data |
970 | * @return: 0, on success, -ve on error | 971 | * @return: 0, on success, -ve on error |
971 | */ | 972 | */ |
972 | int (*add_verify_data)(struct image_sign_info *info, void *keydest); | 973 | int (*add_verify_data)(struct image_sign_info *info, void *keydest); |
973 | 974 | ||
974 | /** | 975 | /** |
975 | * verify() - Verify a signature against some data | 976 | * verify() - Verify a signature against some data |
976 | * | 977 | * |
977 | * @info: Specifies key and FIT information | 978 | * @info: Specifies key and FIT information |
978 | * @data: Pointer to the input data | 979 | * @data: Pointer to the input data |
979 | * @data_len: Data length | 980 | * @data_len: Data length |
980 | * @sig: Signature | 981 | * @sig: Signature |
981 | * @sig_len: Number of bytes in signature | 982 | * @sig_len: Number of bytes in signature |
982 | * @return 0 if verified, -ve on error | 983 | * @return 0 if verified, -ve on error |
983 | */ | 984 | */ |
984 | int (*verify)(struct image_sign_info *info, | 985 | int (*verify)(struct image_sign_info *info, |
985 | const struct image_region region[], int region_count, | 986 | const struct image_region region[], int region_count, |
986 | uint8_t *sig, uint sig_len); | 987 | uint8_t *sig, uint sig_len); |
987 | 988 | ||
988 | /* pointer to checksum algorithm */ | 989 | /* pointer to checksum algorithm */ |
989 | struct checksum_algo *checksum; | 990 | struct checksum_algo *checksum; |
990 | }; | 991 | }; |
991 | 992 | ||
992 | /** | 993 | /** |
993 | * image_get_sig_algo() - Look up a signature algortihm | 994 | * image_get_sig_algo() - Look up a signature algortihm |
994 | * | 995 | * |
995 | * @param name Name of algorithm | 996 | * @param name Name of algorithm |
996 | * @return pointer to algorithm information, or NULL if not found | 997 | * @return pointer to algorithm information, or NULL if not found |
997 | */ | 998 | */ |
998 | struct image_sig_algo *image_get_sig_algo(const char *name); | 999 | struct image_sig_algo *image_get_sig_algo(const char *name); |
999 | 1000 | ||
1000 | /** | 1001 | /** |
1001 | * fit_image_verify_required_sigs() - Verify signatures marked as 'required' | 1002 | * fit_image_verify_required_sigs() - Verify signatures marked as 'required' |
1002 | * | 1003 | * |
1003 | * @fit: FIT to check | 1004 | * @fit: FIT to check |
1004 | * @image_noffset: Offset of image node to check | 1005 | * @image_noffset: Offset of image node to check |
1005 | * @data: Image data to check | 1006 | * @data: Image data to check |
1006 | * @size: Size of image data | 1007 | * @size: Size of image data |
1007 | * @sig_blob: FDT containing public keys | 1008 | * @sig_blob: FDT containing public keys |
1008 | * @no_sigsp: Returns 1 if no signatures were required, and | 1009 | * @no_sigsp: Returns 1 if no signatures were required, and |
1009 | * therefore nothing was checked. The caller may wish | 1010 | * therefore nothing was checked. The caller may wish |
1010 | * to fall back to other mechanisms, or refuse to | 1011 | * to fall back to other mechanisms, or refuse to |
1011 | * boot. | 1012 | * boot. |
1012 | * @return 0 if all verified ok, <0 on error | 1013 | * @return 0 if all verified ok, <0 on error |
1013 | */ | 1014 | */ |
1014 | int fit_image_verify_required_sigs(const void *fit, int image_noffset, | 1015 | int fit_image_verify_required_sigs(const void *fit, int image_noffset, |
1015 | const char *data, size_t size, const void *sig_blob, | 1016 | const char *data, size_t size, const void *sig_blob, |
1016 | int *no_sigsp); | 1017 | int *no_sigsp); |
1017 | 1018 | ||
1018 | /** | 1019 | /** |
1019 | * fit_image_check_sig() - Check a single image signature node | 1020 | * fit_image_check_sig() - Check a single image signature node |
1020 | * | 1021 | * |
1021 | * @fit: FIT to check | 1022 | * @fit: FIT to check |
1022 | * @noffset: Offset of signature node to check | 1023 | * @noffset: Offset of signature node to check |
1023 | * @data: Image data to check | 1024 | * @data: Image data to check |
1024 | * @size: Size of image data | 1025 | * @size: Size of image data |
1025 | * @required_keynode: Offset in the control FDT of the required key node, | 1026 | * @required_keynode: Offset in the control FDT of the required key node, |
1026 | * if any. If this is given, then the image wil not | 1027 | * if any. If this is given, then the image wil not |
1027 | * pass verification unless that key is used. If this is | 1028 | * pass verification unless that key is used. If this is |
1028 | * -1 then any signature will do. | 1029 | * -1 then any signature will do. |
1029 | * @err_msgp: In the event of an error, this will be pointed to a | 1030 | * @err_msgp: In the event of an error, this will be pointed to a |
1030 | * help error string to display to the user. | 1031 | * help error string to display to the user. |
1031 | * @return 0 if all verified ok, <0 on error | 1032 | * @return 0 if all verified ok, <0 on error |
1032 | */ | 1033 | */ |
1033 | int fit_image_check_sig(const void *fit, int noffset, const void *data, | 1034 | int fit_image_check_sig(const void *fit, int noffset, const void *data, |
1034 | size_t size, int required_keynode, char **err_msgp); | 1035 | size_t size, int required_keynode, char **err_msgp); |
1035 | 1036 | ||
1036 | /** | 1037 | /** |
1037 | * fit_region_make_list() - Make a list of regions to hash | 1038 | * fit_region_make_list() - Make a list of regions to hash |
1038 | * | 1039 | * |
1039 | * Given a list of FIT regions (offset, size) provided by libfdt, create | 1040 | * Given a list of FIT regions (offset, size) provided by libfdt, create |
1040 | * a list of regions (void *, size) for use by the signature creationg | 1041 | * a list of regions (void *, size) for use by the signature creationg |
1041 | * and verification code. | 1042 | * and verification code. |
1042 | * | 1043 | * |
1043 | * @fit: FIT image to process | 1044 | * @fit: FIT image to process |
1044 | * @fdt_regions: Regions as returned by libfdt | 1045 | * @fdt_regions: Regions as returned by libfdt |
1045 | * @count: Number of regions returned by libfdt | 1046 | * @count: Number of regions returned by libfdt |
1046 | * @region: Place to put list of regions (NULL to allocate it) | 1047 | * @region: Place to put list of regions (NULL to allocate it) |
1047 | * @return pointer to list of regions, or NULL if out of memory | 1048 | * @return pointer to list of regions, or NULL if out of memory |
1048 | */ | 1049 | */ |
1049 | struct image_region *fit_region_make_list(const void *fit, | 1050 | struct image_region *fit_region_make_list(const void *fit, |
1050 | struct fdt_region *fdt_regions, int count, | 1051 | struct fdt_region *fdt_regions, int count, |
1051 | struct image_region *region); | 1052 | struct image_region *region); |
1052 | 1053 | ||
1053 | static inline int fit_image_check_target_arch(const void *fdt, int node) | 1054 | static inline int fit_image_check_target_arch(const void *fdt, int node) |
1054 | { | 1055 | { |
1055 | #ifndef USE_HOSTCC | 1056 | #ifndef USE_HOSTCC |
1056 | return fit_image_check_arch(fdt, node, IH_ARCH_DEFAULT); | 1057 | return fit_image_check_arch(fdt, node, IH_ARCH_DEFAULT); |
1057 | #else | 1058 | #else |
1058 | return 0; | 1059 | return 0; |
1059 | #endif | 1060 | #endif |
1060 | } | 1061 | } |
1061 | 1062 | ||
1062 | #ifdef CONFIG_FIT_VERBOSE | 1063 | #ifdef CONFIG_FIT_VERBOSE |
1063 | #define fit_unsupported(msg) printf("! %s:%d " \ | 1064 | #define fit_unsupported(msg) printf("! %s:%d " \ |
1064 | "FIT images not supported for '%s'\n", \ | 1065 | "FIT images not supported for '%s'\n", \ |
1065 | __FILE__, __LINE__, (msg)) | 1066 | __FILE__, __LINE__, (msg)) |
1066 | 1067 | ||
1067 | #define fit_unsupported_reset(msg) printf("! %s:%d " \ | 1068 | #define fit_unsupported_reset(msg) printf("! %s:%d " \ |
1068 | "FIT images not supported for '%s' " \ | 1069 | "FIT images not supported for '%s' " \ |
1069 | "- must reset board to recover!\n", \ | 1070 | "- must reset board to recover!\n", \ |
1070 | __FILE__, __LINE__, (msg)) | 1071 | __FILE__, __LINE__, (msg)) |
1071 | #else | 1072 | #else |
1072 | #define fit_unsupported(msg) | 1073 | #define fit_unsupported(msg) |
1073 | #define fit_unsupported_reset(msg) | 1074 | #define fit_unsupported_reset(msg) |
1074 | #endif /* CONFIG_FIT_VERBOSE */ | 1075 | #endif /* CONFIG_FIT_VERBOSE */ |
1075 | #endif /* CONFIG_FIT */ | 1076 | #endif /* CONFIG_FIT */ |
1076 | 1077 | ||
1077 | #if defined(CONFIG_ANDROID_BOOT_IMAGE) | 1078 | #if defined(CONFIG_ANDROID_BOOT_IMAGE) |
1078 | struct andr_img_hdr; | 1079 | struct andr_img_hdr; |
1079 | int android_image_check_header(const struct andr_img_hdr *hdr); | 1080 | int android_image_check_header(const struct andr_img_hdr *hdr); |
1080 | int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify, | 1081 | int android_image_get_kernel(const struct andr_img_hdr *hdr, int verify, |
1081 | ulong *os_data, ulong *os_len); | 1082 | ulong *os_data, ulong *os_len); |
1082 | int android_image_get_ramdisk(const struct andr_img_hdr *hdr, | 1083 | int android_image_get_ramdisk(const struct andr_img_hdr *hdr, |
1083 | ulong *rd_data, ulong *rd_len); | 1084 | ulong *rd_data, ulong *rd_len); |
1084 | ulong android_image_get_end(const struct andr_img_hdr *hdr); | 1085 | ulong android_image_get_end(const struct andr_img_hdr *hdr); |
1085 | ulong android_image_get_kload(const struct andr_img_hdr *hdr); | 1086 | ulong android_image_get_kload(const struct andr_img_hdr *hdr); |
1086 | 1087 | ||
1087 | #endif /* CONFIG_ANDROID_BOOT_IMAGE */ | 1088 | #endif /* CONFIG_ANDROID_BOOT_IMAGE */ |
1088 | 1089 | ||
1089 | #endif /* __IMAGE_H__ */ | 1090 | #endif /* __IMAGE_H__ */ |
1090 | 1091 |
tools/Makefile
1 | # | 1 | # |
2 | # (C) Copyright 2000-2006 | 2 | # (C) Copyright 2000-2006 |
3 | # Wolfgang Denk, DENX Software Engineering, wd@denx.de. | 3 | # Wolfgang Denk, DENX Software Engineering, wd@denx.de. |
4 | # | 4 | # |
5 | # SPDX-License-Identifier: GPL-2.0+ | 5 | # SPDX-License-Identifier: GPL-2.0+ |
6 | # | 6 | # |
7 | 7 | ||
8 | # Enable all the config-independent tools | 8 | # Enable all the config-independent tools |
9 | ifneq ($(HOST_TOOLS_ALL),) | 9 | ifneq ($(HOST_TOOLS_ALL),) |
10 | CONFIG_LCD_LOGO = y | 10 | CONFIG_LCD_LOGO = y |
11 | CONFIG_CMD_LOADS = y | 11 | CONFIG_CMD_LOADS = y |
12 | CONFIG_CMD_NET = y | 12 | CONFIG_CMD_NET = y |
13 | CONFIG_XWAY_SWAP_BYTES = y | 13 | CONFIG_XWAY_SWAP_BYTES = y |
14 | CONFIG_NETCONSOLE = y | 14 | CONFIG_NETCONSOLE = y |
15 | CONFIG_SHA1_CHECK_UB_IMG = y | 15 | CONFIG_SHA1_CHECK_UB_IMG = y |
16 | endif | 16 | endif |
17 | 17 | ||
18 | subdir-$(HOST_TOOLS_ALL) += easylogo | 18 | subdir-$(HOST_TOOLS_ALL) += easylogo |
19 | subdir-$(HOST_TOOLS_ALL) += gdb | 19 | subdir-$(HOST_TOOLS_ALL) += gdb |
20 | 20 | ||
21 | # Merge all the different vars for envcrc into one | 21 | # Merge all the different vars for envcrc into one |
22 | ENVCRC-$(CONFIG_ENV_IS_EMBEDDED) = y | 22 | ENVCRC-$(CONFIG_ENV_IS_EMBEDDED) = y |
23 | ENVCRC-$(CONFIG_ENV_IS_IN_DATAFLASH) = y | 23 | ENVCRC-$(CONFIG_ENV_IS_IN_DATAFLASH) = y |
24 | ENVCRC-$(CONFIG_ENV_IS_IN_EEPROM) = y | 24 | ENVCRC-$(CONFIG_ENV_IS_IN_EEPROM) = y |
25 | ENVCRC-$(CONFIG_ENV_IS_IN_FLASH) = y | 25 | ENVCRC-$(CONFIG_ENV_IS_IN_FLASH) = y |
26 | ENVCRC-$(CONFIG_ENV_IS_IN_ONENAND) = y | 26 | ENVCRC-$(CONFIG_ENV_IS_IN_ONENAND) = y |
27 | ENVCRC-$(CONFIG_ENV_IS_IN_NAND) = y | 27 | ENVCRC-$(CONFIG_ENV_IS_IN_NAND) = y |
28 | ENVCRC-$(CONFIG_ENV_IS_IN_NVRAM) = y | 28 | ENVCRC-$(CONFIG_ENV_IS_IN_NVRAM) = y |
29 | ENVCRC-$(CONFIG_ENV_IS_IN_SPI_FLASH) = y | 29 | ENVCRC-$(CONFIG_ENV_IS_IN_SPI_FLASH) = y |
30 | CONFIG_BUILD_ENVCRC ?= $(ENVCRC-y) | 30 | CONFIG_BUILD_ENVCRC ?= $(ENVCRC-y) |
31 | 31 | ||
32 | hostprogs-$(CONFIG_SPL_GENERATE_ATMEL_PMECC_HEADER) += atmel_pmecc_params | 32 | hostprogs-$(CONFIG_SPL_GENERATE_ATMEL_PMECC_HEADER) += atmel_pmecc_params |
33 | 33 | ||
34 | # TODO: CONFIG_CMD_LICENSE does not work | 34 | # TODO: CONFIG_CMD_LICENSE does not work |
35 | hostprogs-$(CONFIG_CMD_LICENSE) += bin2header | 35 | hostprogs-$(CONFIG_CMD_LICENSE) += bin2header |
36 | hostprogs-$(CONFIG_LCD_LOGO) += bmp_logo | 36 | hostprogs-$(CONFIG_LCD_LOGO) += bmp_logo |
37 | hostprogs-$(CONFIG_VIDEO_LOGO) += bmp_logo | 37 | hostprogs-$(CONFIG_VIDEO_LOGO) += bmp_logo |
38 | HOSTCFLAGS_bmp_logo.o := -pedantic | 38 | HOSTCFLAGS_bmp_logo.o := -pedantic |
39 | 39 | ||
40 | hostprogs-$(CONFIG_BUILD_ENVCRC) += envcrc | 40 | hostprogs-$(CONFIG_BUILD_ENVCRC) += envcrc |
41 | envcrc-objs := envcrc.o lib/crc32.o common/env_embedded.o lib/sha1.o | 41 | envcrc-objs := envcrc.o lib/crc32.o common/env_embedded.o lib/sha1.o |
42 | 42 | ||
43 | hostprogs-$(CONFIG_CMD_NET) += gen_eth_addr | 43 | hostprogs-$(CONFIG_CMD_NET) += gen_eth_addr |
44 | HOSTCFLAGS_gen_eth_addr.o := -pedantic | 44 | HOSTCFLAGS_gen_eth_addr.o := -pedantic |
45 | 45 | ||
46 | hostprogs-$(CONFIG_CMD_LOADS) += img2srec | 46 | hostprogs-$(CONFIG_CMD_LOADS) += img2srec |
47 | HOSTCFLAGS_img2srec.o := -pedantic | 47 | HOSTCFLAGS_img2srec.o := -pedantic |
48 | 48 | ||
49 | hostprogs-$(CONFIG_XWAY_SWAP_BYTES) += xway-swap-bytes | 49 | hostprogs-$(CONFIG_XWAY_SWAP_BYTES) += xway-swap-bytes |
50 | HOSTCFLAGS_xway-swap-bytes.o := -pedantic | 50 | HOSTCFLAGS_xway-swap-bytes.o := -pedantic |
51 | 51 | ||
52 | hostprogs-y += mkenvimage | 52 | hostprogs-y += mkenvimage |
53 | mkenvimage-objs := mkenvimage.o os_support.o lib/crc32.o | 53 | mkenvimage-objs := mkenvimage.o os_support.o lib/crc32.o |
54 | 54 | ||
55 | hostprogs-y += dumpimage mkimage | 55 | hostprogs-y += dumpimage mkimage |
56 | hostprogs-$(CONFIG_FIT_SIGNATURE) += fit_info fit_check_sign | 56 | hostprogs-$(CONFIG_FIT_SIGNATURE) += fit_info fit_check_sign |
57 | 57 | ||
58 | FIT_SIG_OBJS-$(CONFIG_FIT_SIGNATURE) := common/image-sig.o | 58 | FIT_SIG_OBJS-$(CONFIG_FIT_SIGNATURE) := common/image-sig.o |
59 | # Flattened device tree objects | 59 | # Flattened device tree objects |
60 | LIBFDT_OBJS := $(addprefix lib/libfdt/, \ | 60 | LIBFDT_OBJS := $(addprefix lib/libfdt/, \ |
61 | fdt.o fdt_ro.o fdt_rw.o fdt_strerror.o fdt_wip.o) | 61 | fdt.o fdt_ro.o fdt_rw.o fdt_strerror.o fdt_wip.o) |
62 | RSA_OBJS-$(CONFIG_FIT_SIGNATURE) := $(addprefix lib/rsa/, \ | 62 | RSA_OBJS-$(CONFIG_FIT_SIGNATURE) := $(addprefix lib/rsa/, \ |
63 | rsa-sign.o rsa-verify.o rsa-checksum.o \ | 63 | rsa-sign.o rsa-verify.o rsa-checksum.o \ |
64 | rsa-mod-exp.o) | 64 | rsa-mod-exp.o) |
65 | 65 | ||
66 | # common objs for dumpimage and mkimage | 66 | # common objs for dumpimage and mkimage |
67 | dumpimage-mkimage-objs := aisimage.o \ | 67 | dumpimage-mkimage-objs := aisimage.o \ |
68 | atmelimage.o \ | 68 | atmelimage.o \ |
69 | $(FIT_SIG_OBJS-y) \ | 69 | $(FIT_SIG_OBJS-y) \ |
70 | common/bootm.o \ | 70 | common/bootm.o \ |
71 | lib/crc32.o \ | 71 | lib/crc32.o \ |
72 | default_image.o \ | 72 | default_image.o \ |
73 | lib/fdtdec_common.o \ | 73 | lib/fdtdec_common.o \ |
74 | lib/fdtdec.o \ | 74 | lib/fdtdec.o \ |
75 | fit_common.o \ | 75 | fit_common.o \ |
76 | fit_image.o \ | 76 | fit_image.o \ |
77 | gpimage.o \ | 77 | gpimage.o \ |
78 | gpimage-common.o \ | 78 | gpimage-common.o \ |
79 | common/image-fit.o \ | 79 | common/image-fit.o \ |
80 | image-host.o \ | 80 | image-host.o \ |
81 | common/image.o \ | 81 | common/image.o \ |
82 | imagetool.o \ | 82 | imagetool.o \ |
83 | imximage.o \ | 83 | imximage.o \ |
84 | kwbimage.o \ | 84 | kwbimage.o \ |
85 | lib/md5.o \ | 85 | lib/md5.o \ |
86 | lpc32xximage.o \ | ||
86 | mxsimage.o \ | 87 | mxsimage.o \ |
87 | omapimage.o \ | 88 | omapimage.o \ |
88 | os_support.o \ | 89 | os_support.o \ |
89 | pblimage.o \ | 90 | pblimage.o \ |
90 | pbl_crc32.o \ | 91 | pbl_crc32.o \ |
91 | socfpgaimage.o \ | 92 | socfpgaimage.o \ |
92 | lib/sha1.o \ | 93 | lib/sha1.o \ |
93 | lib/sha256.o \ | 94 | lib/sha256.o \ |
94 | common/hash.o \ | 95 | common/hash.o \ |
95 | ublimage.o \ | 96 | ublimage.o \ |
96 | $(LIBFDT_OBJS) \ | 97 | $(LIBFDT_OBJS) \ |
97 | $(RSA_OBJS-y) | 98 | $(RSA_OBJS-y) |
98 | 99 | ||
99 | dumpimage-objs := $(dumpimage-mkimage-objs) dumpimage.o | 100 | dumpimage-objs := $(dumpimage-mkimage-objs) dumpimage.o |
100 | mkimage-objs := $(dumpimage-mkimage-objs) mkimage.o | 101 | mkimage-objs := $(dumpimage-mkimage-objs) mkimage.o |
101 | fit_info-objs := $(dumpimage-mkimage-objs) fit_info.o | 102 | fit_info-objs := $(dumpimage-mkimage-objs) fit_info.o |
102 | fit_check_sign-objs := $(dumpimage-mkimage-objs) fit_check_sign.o | 103 | fit_check_sign-objs := $(dumpimage-mkimage-objs) fit_check_sign.o |
103 | 104 | ||
104 | # TODO(sjg@chromium.org): Is this correct on Mac OS? | 105 | # TODO(sjg@chromium.org): Is this correct on Mac OS? |
105 | 106 | ||
106 | ifneq ($(CONFIG_MX23)$(CONFIG_MX28),) | 107 | ifneq ($(CONFIG_MX23)$(CONFIG_MX28),) |
107 | # Add CONFIG_MXS into host CFLAGS, so we can check whether or not register | 108 | # Add CONFIG_MXS into host CFLAGS, so we can check whether or not register |
108 | # the mxsimage support within tools/mxsimage.c . | 109 | # the mxsimage support within tools/mxsimage.c . |
109 | HOSTCFLAGS_mxsimage.o += -DCONFIG_MXS | 110 | HOSTCFLAGS_mxsimage.o += -DCONFIG_MXS |
110 | endif | 111 | endif |
111 | 112 | ||
112 | ifdef CONFIG_FIT_SIGNATURE | 113 | ifdef CONFIG_FIT_SIGNATURE |
113 | # This affects include/image.h, but including the board config file | 114 | # This affects include/image.h, but including the board config file |
114 | # is tricky, so manually define this options here. | 115 | # is tricky, so manually define this options here. |
115 | HOST_EXTRACFLAGS += -DCONFIG_FIT_SIGNATURE | 116 | HOST_EXTRACFLAGS += -DCONFIG_FIT_SIGNATURE |
116 | endif | 117 | endif |
117 | 118 | ||
118 | ifdef CONFIG_SYS_SPI_U_BOOT_OFFS | 119 | ifdef CONFIG_SYS_SPI_U_BOOT_OFFS |
119 | HOSTCFLAGS_kwbimage.o += -DCONFIG_SYS_SPI_U_BOOT_OFFS=$(CONFIG_SYS_SPI_U_BOOT_OFFS) | 120 | HOSTCFLAGS_kwbimage.o += -DCONFIG_SYS_SPI_U_BOOT_OFFS=$(CONFIG_SYS_SPI_U_BOOT_OFFS) |
120 | endif | 121 | endif |
121 | 122 | ||
122 | # MXSImage needs LibSSL | 123 | # MXSImage needs LibSSL |
123 | ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_FIT_SIGNATURE),) | 124 | ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_FIT_SIGNATURE),) |
124 | HOSTLOADLIBES_mkimage += -lssl -lcrypto | 125 | HOSTLOADLIBES_mkimage += -lssl -lcrypto |
125 | endif | 126 | endif |
126 | 127 | ||
127 | HOSTLOADLIBES_dumpimage := $(HOSTLOADLIBES_mkimage) | 128 | HOSTLOADLIBES_dumpimage := $(HOSTLOADLIBES_mkimage) |
128 | HOSTLOADLIBES_fit_info := $(HOSTLOADLIBES_mkimage) | 129 | HOSTLOADLIBES_fit_info := $(HOSTLOADLIBES_mkimage) |
129 | HOSTLOADLIBES_fit_check_sign := $(HOSTLOADLIBES_mkimage) | 130 | HOSTLOADLIBES_fit_check_sign := $(HOSTLOADLIBES_mkimage) |
130 | 131 | ||
131 | hostprogs-$(CONFIG_EXYNOS5250) += mkexynosspl | 132 | hostprogs-$(CONFIG_EXYNOS5250) += mkexynosspl |
132 | hostprogs-$(CONFIG_EXYNOS5420) += mkexynosspl | 133 | hostprogs-$(CONFIG_EXYNOS5420) += mkexynosspl |
133 | HOSTCFLAGS_mkexynosspl.o := -pedantic | 134 | HOSTCFLAGS_mkexynosspl.o := -pedantic |
134 | 135 | ||
135 | ifdtool-objs := $(LIBFDT_OBJS) ifdtool.o | 136 | ifdtool-objs := $(LIBFDT_OBJS) ifdtool.o |
136 | hostprogs-$(CONFIG_X86) += ifdtool | 137 | hostprogs-$(CONFIG_X86) += ifdtool |
137 | 138 | ||
138 | hostprogs-$(CONFIG_MX23) += mxsboot | 139 | hostprogs-$(CONFIG_MX23) += mxsboot |
139 | hostprogs-$(CONFIG_MX28) += mxsboot | 140 | hostprogs-$(CONFIG_MX28) += mxsboot |
140 | HOSTCFLAGS_mxsboot.o := -pedantic | 141 | HOSTCFLAGS_mxsboot.o := -pedantic |
141 | 142 | ||
142 | hostprogs-$(CONFIG_SUNXI) += mksunxiboot | 143 | hostprogs-$(CONFIG_SUNXI) += mksunxiboot |
143 | 144 | ||
144 | hostprogs-$(CONFIG_NETCONSOLE) += ncb | 145 | hostprogs-$(CONFIG_NETCONSOLE) += ncb |
145 | hostprogs-$(CONFIG_SHA1_CHECK_UB_IMG) += ubsha1 | 146 | hostprogs-$(CONFIG_SHA1_CHECK_UB_IMG) += ubsha1 |
146 | 147 | ||
147 | ubsha1-objs := os_support.o ubsha1.o lib/sha1.o | 148 | ubsha1-objs := os_support.o ubsha1.o lib/sha1.o |
148 | 149 | ||
149 | HOSTCFLAGS_ubsha1.o := -pedantic | 150 | HOSTCFLAGS_ubsha1.o := -pedantic |
150 | 151 | ||
151 | hostprogs-$(CONFIG_KIRKWOOD) += kwboot | 152 | hostprogs-$(CONFIG_KIRKWOOD) += kwboot |
152 | hostprogs-$(CONFIG_ARMADA_XP) += kwboot | 153 | hostprogs-$(CONFIG_ARMADA_XP) += kwboot |
153 | hostprogs-y += proftool | 154 | hostprogs-y += proftool |
154 | hostprogs-$(CONFIG_STATIC_RELA) += relocate-rela | 155 | hostprogs-$(CONFIG_STATIC_RELA) += relocate-rela |
155 | 156 | ||
156 | # We build some files with extra pedantic flags to try to minimize things | 157 | # We build some files with extra pedantic flags to try to minimize things |
157 | # that won't build on some weird host compiler -- though there are lots of | 158 | # that won't build on some weird host compiler -- though there are lots of |
158 | # exceptions for files that aren't complaint. | 159 | # exceptions for files that aren't complaint. |
159 | HOSTCFLAGS_crc32.o := -pedantic | 160 | HOSTCFLAGS_crc32.o := -pedantic |
160 | HOSTCFLAGS_md5.o := -pedantic | 161 | HOSTCFLAGS_md5.o := -pedantic |
161 | HOSTCFLAGS_sha1.o := -pedantic | 162 | HOSTCFLAGS_sha1.o := -pedantic |
162 | HOSTCFLAGS_sha256.o := -pedantic | 163 | HOSTCFLAGS_sha256.o := -pedantic |
163 | 164 | ||
164 | # Don't build by default | 165 | # Don't build by default |
165 | #hostprogs-$(CONFIG_PPC) += mpc86x_clk | 166 | #hostprogs-$(CONFIG_PPC) += mpc86x_clk |
166 | #HOSTCFLAGS_mpc86x_clk.o := -pedantic | 167 | #HOSTCFLAGS_mpc86x_clk.o := -pedantic |
167 | 168 | ||
168 | quiet_cmd_wrap = WRAP $@ | 169 | quiet_cmd_wrap = WRAP $@ |
169 | cmd_wrap = echo "\#include <../$(patsubst $(obj)/%,%,$@)>" >$@ | 170 | cmd_wrap = echo "\#include <../$(patsubst $(obj)/%,%,$@)>" >$@ |
170 | 171 | ||
171 | $(obj)/lib/%.c $(obj)/common/%.c: | 172 | $(obj)/lib/%.c $(obj)/common/%.c: |
172 | $(call cmd,wrap) | 173 | $(call cmd,wrap) |
173 | 174 | ||
174 | clean-dirs := lib common | 175 | clean-dirs := lib common |
175 | 176 | ||
176 | always := $(hostprogs-y) | 177 | always := $(hostprogs-y) |
177 | 178 | ||
178 | # Generated LCD/video logo | 179 | # Generated LCD/video logo |
179 | LOGO_H = $(objtree)/include/bmp_logo.h | 180 | LOGO_H = $(objtree)/include/bmp_logo.h |
180 | LOGO_DATA_H = $(objtree)/include/bmp_logo_data.h | 181 | LOGO_DATA_H = $(objtree)/include/bmp_logo_data.h |
181 | LOGO-$(CONFIG_LCD_LOGO) += $(LOGO_H) | 182 | LOGO-$(CONFIG_LCD_LOGO) += $(LOGO_H) |
182 | LOGO-$(CONFIG_LCD_LOGO) += $(LOGO_DATA_H) | 183 | LOGO-$(CONFIG_LCD_LOGO) += $(LOGO_DATA_H) |
183 | LOGO-$(CONFIG_VIDEO_LOGO) += $(LOGO_H) | 184 | LOGO-$(CONFIG_VIDEO_LOGO) += $(LOGO_H) |
184 | LOGO-$(CONFIG_VIDEO_LOGO) += $(LOGO_DATA_H) | 185 | LOGO-$(CONFIG_VIDEO_LOGO) += $(LOGO_DATA_H) |
185 | 186 | ||
186 | # Generic logo | 187 | # Generic logo |
187 | ifeq ($(LOGO_BMP),) | 188 | ifeq ($(LOGO_BMP),) |
188 | LOGO_BMP= $(srctree)/$(src)/logos/denx.bmp | 189 | LOGO_BMP= $(srctree)/$(src)/logos/denx.bmp |
189 | 190 | ||
190 | # Use board logo and fallback to vendor | 191 | # Use board logo and fallback to vendor |
191 | ifneq ($(wildcard $(srctree)/$(src)/logos/$(BOARD).bmp),) | 192 | ifneq ($(wildcard $(srctree)/$(src)/logos/$(BOARD).bmp),) |
192 | LOGO_BMP= $(srctree)/$(src)/logos/$(BOARD).bmp | 193 | LOGO_BMP= $(srctree)/$(src)/logos/$(BOARD).bmp |
193 | else | 194 | else |
194 | ifneq ($(wildcard $(srctree)/$(src)/logos/$(VENDOR).bmp),) | 195 | ifneq ($(wildcard $(srctree)/$(src)/logos/$(VENDOR).bmp),) |
195 | LOGO_BMP= $(srctree)/$(src)/logos/$(VENDOR).bmp | 196 | LOGO_BMP= $(srctree)/$(src)/logos/$(VENDOR).bmp |
196 | endif | 197 | endif |
197 | endif | 198 | endif |
198 | 199 | ||
199 | endif # !LOGO_BMP | 200 | endif # !LOGO_BMP |
200 | 201 | ||
201 | # | 202 | # |
202 | # Use native tools and options | 203 | # Use native tools and options |
203 | # Define __KERNEL_STRICT_NAMES to prevent typedef overlaps | 204 | # Define __KERNEL_STRICT_NAMES to prevent typedef overlaps |
204 | # Define _GNU_SOURCE to obtain the getline prototype from stdio.h | 205 | # Define _GNU_SOURCE to obtain the getline prototype from stdio.h |
205 | # | 206 | # |
206 | HOST_EXTRACFLAGS += -include $(srctree)/include/libfdt_env.h \ | 207 | HOST_EXTRACFLAGS += -include $(srctree)/include/libfdt_env.h \ |
207 | $(patsubst -I%,-idirafter%, $(filter -I%, $(UBOOTINCLUDE))) \ | 208 | $(patsubst -I%,-idirafter%, $(filter -I%, $(UBOOTINCLUDE))) \ |
208 | -I$(srctree)/lib/libfdt \ | 209 | -I$(srctree)/lib/libfdt \ |
209 | -I$(srctree)/tools \ | 210 | -I$(srctree)/tools \ |
210 | -DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE) \ | 211 | -DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE) \ |
211 | -DUSE_HOSTCC \ | 212 | -DUSE_HOSTCC \ |
212 | -D__KERNEL_STRICT_NAMES \ | 213 | -D__KERNEL_STRICT_NAMES \ |
213 | -D_GNU_SOURCE | 214 | -D_GNU_SOURCE |
214 | 215 | ||
215 | __build: $(LOGO-y) | 216 | __build: $(LOGO-y) |
216 | 217 | ||
217 | $(LOGO_H): $(obj)/bmp_logo $(LOGO_BMP) | 218 | $(LOGO_H): $(obj)/bmp_logo $(LOGO_BMP) |
218 | $(obj)/bmp_logo --gen-info $(LOGO_BMP) > $@ | 219 | $(obj)/bmp_logo --gen-info $(LOGO_BMP) > $@ |
219 | 220 | ||
220 | $(LOGO_DATA_H): $(obj)/bmp_logo $(LOGO_BMP) | 221 | $(LOGO_DATA_H): $(obj)/bmp_logo $(LOGO_BMP) |
221 | $(obj)/bmp_logo --gen-data $(LOGO_BMP) > $@ | 222 | $(obj)/bmp_logo --gen-data $(LOGO_BMP) > $@ |
222 | 223 | ||
223 | # Let clean descend into subdirs | 224 | # Let clean descend into subdirs |
224 | subdir- += env | 225 | subdir- += env |
225 | 226 | ||
226 | ifneq ($(CROSS_BUILD_TOOLS),) | 227 | ifneq ($(CROSS_BUILD_TOOLS),) |
227 | HOSTCC = $(CC) | 228 | HOSTCC = $(CC) |
228 | 229 | ||
229 | quiet_cmd_crosstools_strip = STRIP $^ | 230 | quiet_cmd_crosstools_strip = STRIP $^ |
230 | cmd_crosstools_strip = $(STRIP) $^; touch $@ | 231 | cmd_crosstools_strip = $(STRIP) $^; touch $@ |
231 | $(obj)/.strip: $(call objectify,$(filter $(always),$(hostprogs-y))) | 232 | $(obj)/.strip: $(call objectify,$(filter $(always),$(hostprogs-y))) |
232 | $(call cmd,crosstools_strip) | 233 | $(call cmd,crosstools_strip) |
233 | 234 | ||
234 | always += .strip | 235 | always += .strip |
235 | endif | 236 | endif |
236 | clean-files += .strip | 237 | clean-files += .strip |
237 | 238 |
tools/lpc32xximage.c
File was created | 1 | /* | |
2 | * Image manipulator for LPC32XX SoCs | ||
3 | * | ||
4 | * (C) Copyright 2015 DENX Software Engineering GmbH | ||
5 | * Written-by: Albert ARIBAUD <albert.aribaud@3adev.fr> | ||
6 | * | ||
7 | * Derived from omapimage.c: | ||
8 | * | ||
9 | * (C) Copyright 2010 | ||
10 | * Linaro LTD, www.linaro.org | ||
11 | * Author: John Rigby <john.rigby@linaro.org> | ||
12 | * Based on TI's signGP.c | ||
13 | * | ||
14 | * (C) Copyright 2009 | ||
15 | * Stefano Babic, DENX Software Engineering, sbabic@denx.de. | ||
16 | * | ||
17 | * (C) Copyright 2008 | ||
18 | * Marvell Semiconductor <www.marvell.com> | ||
19 | * Written-by: Prafulla Wadaskar <prafulla@marvell.com> | ||
20 | * | ||
21 | * SPDX-License-Identifier: GPL-2.0+ | ||
22 | */ | ||
23 | |||
24 | #include "imagetool.h" | ||
25 | #include <compiler.h> | ||
26 | #include <image.h> | ||
27 | |||
28 | /* | ||
29 | * NAND page 0 boot header | ||
30 | */ | ||
31 | |||
32 | struct nand_page_0_boot_header { | ||
33 | uint32_t data[129]; | ||
34 | uint32_t pad[383]; | ||
35 | }; | ||
36 | |||
37 | /* | ||
38 | * Default ICC (interface configuration data [sic]) if none specified | ||
39 | * in board config | ||
40 | */ | ||
41 | |||
42 | #ifndef LPC32XX_BOOT_ICR | ||
43 | #define LPC32XX_BOOT_ICR 0x00000096 | ||
44 | #endif | ||
45 | |||
46 | /* | ||
47 | * Default boot NAND page size if none specified in board config | ||
48 | */ | ||
49 | |||
50 | #ifndef LPC32XX_BOOT_NAND_PAGESIZE | ||
51 | #define LPC32XX_BOOT_NAND_PAGESIZE 2048 | ||
52 | #endif | ||
53 | |||
54 | /* | ||
55 | * Default boot NAND pages per sector if none specified in board config | ||
56 | */ | ||
57 | |||
58 | #ifndef LPC32XX_BOOT_NAND_PAGES_PER_SECTOR | ||
59 | #define LPC32XX_BOOT_NAND_PAGES_PER_SECTOR 64 | ||
60 | #endif | ||
61 | |||
62 | /* | ||
63 | * Maximum size for boot code is 56K unless defined in board config | ||
64 | */ | ||
65 | |||
66 | #ifndef LPC32XX_BOOT_CODESIZE | ||
67 | #define LPC32XX_BOOT_CODESIZE (56*1024) | ||
68 | #endif | ||
69 | |||
70 | /* signature byte for a readable block */ | ||
71 | |||
72 | #define LPC32XX_BOOT_BLOCK_OK 0xaa | ||
73 | |||
74 | static struct nand_page_0_boot_header lpc32xximage_header; | ||
75 | |||
76 | static int lpc32xximage_check_image_types(uint8_t type) | ||
77 | { | ||
78 | if (type == IH_TYPE_LPC32XXIMAGE) | ||
79 | return EXIT_SUCCESS; | ||
80 | return EXIT_FAILURE; | ||
81 | } | ||
82 | |||
83 | static int lpc32xximage_verify_header(unsigned char *ptr, int image_size, | ||
84 | struct image_tool_params *params) | ||
85 | { | ||
86 | struct nand_page_0_boot_header *hdr = | ||
87 | (struct nand_page_0_boot_header *)ptr; | ||
88 | |||
89 | /* turn image size from bytes to NAND pages, page 0 included */ | ||
90 | int image_size_in_pages = ((image_size - 1) | ||
91 | / LPC32XX_BOOT_NAND_PAGESIZE); | ||
92 | |||
93 | if (hdr->data[0] != (0xff & LPC32XX_BOOT_ICR)) | ||
94 | return -1; | ||
95 | if (hdr->data[1] != (0xff & ~LPC32XX_BOOT_ICR)) | ||
96 | return -1; | ||
97 | if (hdr->data[2] != (0xff & LPC32XX_BOOT_ICR)) | ||
98 | return -1; | ||
99 | if (hdr->data[3] != (0xff & ~LPC32XX_BOOT_ICR)) | ||
100 | return -1; | ||
101 | if (hdr->data[4] != (0xff & image_size_in_pages)) | ||
102 | return -1; | ||
103 | if (hdr->data[5] != (0xff & ~image_size_in_pages)) | ||
104 | return -1; | ||
105 | if (hdr->data[6] != (0xff & image_size_in_pages)) | ||
106 | return -1; | ||
107 | if (hdr->data[7] != (0xff & ~image_size_in_pages)) | ||
108 | return -1; | ||
109 | if (hdr->data[8] != (0xff & image_size_in_pages)) | ||
110 | return -1; | ||
111 | if (hdr->data[9] != (0xff & ~image_size_in_pages)) | ||
112 | return -1; | ||
113 | if (hdr->data[10] != (0xff & image_size_in_pages)) | ||
114 | return -1; | ||
115 | if (hdr->data[11] != (0xff & ~image_size_in_pages)) | ||
116 | return -1; | ||
117 | if (hdr->data[12] != LPC32XX_BOOT_BLOCK_OK) | ||
118 | return -1; | ||
119 | if (hdr->data[128] != LPC32XX_BOOT_BLOCK_OK) | ||
120 | return -1; | ||
121 | return 0; | ||
122 | } | ||
123 | |||
124 | static void print_hdr_byte(struct nand_page_0_boot_header *hdr, int ofs) | ||
125 | { | ||
126 | printf("header[%d] = %02x\n", ofs, hdr->data[ofs]); | ||
127 | } | ||
128 | |||
129 | static void lpc32xximage_print_header(const void *ptr) | ||
130 | { | ||
131 | struct nand_page_0_boot_header *hdr = | ||
132 | (struct nand_page_0_boot_header *)ptr; | ||
133 | int ofs; | ||
134 | |||
135 | for (ofs = 0; ofs <= 12; ofs++) | ||
136 | print_hdr_byte(hdr, ofs); | ||
137 | print_hdr_byte(hdr, 128); | ||
138 | } | ||
139 | |||
140 | static void lpc32xximage_set_header(void *ptr, struct stat *sbuf, int ifd, | ||
141 | struct image_tool_params *params) | ||
142 | { | ||
143 | struct nand_page_0_boot_header *hdr = | ||
144 | (struct nand_page_0_boot_header *)ptr; | ||
145 | |||
146 | /* turn image size from bytes to NAND pages, page 0 included */ | ||
147 | int image_size_in_pages = ((sbuf->st_size | ||
148 | + LPC32XX_BOOT_NAND_PAGESIZE - 1) | ||
149 | / LPC32XX_BOOT_NAND_PAGESIZE); | ||
150 | |||
151 | /* fill header -- default byte value is 0x00, not 0xFF */ | ||
152 | memset((void *)hdr, 0, sizeof(*hdr)); | ||
153 | hdr->data[0] = (hdr->data[2] = 0xff & LPC32XX_BOOT_ICR); | ||
154 | hdr->data[1] = (hdr->data[3] = 0xff & ~LPC32XX_BOOT_ICR); | ||
155 | hdr->data[4] = (hdr->data[6] = (hdr->data[8] | ||
156 | = (hdr->data[10] = 0xff & image_size_in_pages))); | ||
157 | hdr->data[5] = (hdr->data[7] = (hdr->data[9] | ||
158 | = (hdr->data[11] = 0xff & ~image_size_in_pages))); | ||
159 | hdr->data[12] = (hdr->data[128] = LPC32XX_BOOT_BLOCK_OK); | ||
160 | } | ||
161 | |||
162 | /* | ||
163 | * lpc32xximage parameters | ||
164 | */ | ||
165 | U_BOOT_IMAGE_TYPE( | ||
166 | lpc32xximage, | ||
167 | "LPC32XX Boot Image", | ||
168 | sizeof(lpc32xximage_header), | ||
169 | (void *)&lpc32xximage_header, | ||
170 | NULL, | ||
171 | lpc32xximage_verify_header, | ||
172 | lpc32xximage_print_header, | ||
173 | lpc32xximage_set_header, | ||
174 | NULL, | ||
175 | lpc32xximage_check_image_types, | ||
176 | NULL, | ||
177 | NULL | ||
178 | ); | ||
179 |