3 * Linaro LTD, www.linaro.org
4 * Author: John Rigby <john.rigby@linaro.org>
5 * Based on TI's signGP.c
8 * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
11 * Marvell Semiconductor <www.marvell.com>
12 * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
14 * SPDX-License-Identifier: GPL-2.0+
19 #include "omapimage.h"
21 /* Header size is CH header rounded up to 512 bytes plus GP header */
22 #define OMAP_CH_HDR_SIZE 512
23 #define OMAP_GP_HDR_SIZE (sizeof(struct gp_header))
24 #define OMAP_FILE_HDR_SIZE (OMAP_CH_HDR_SIZE+OMAP_GP_HDR_SIZE)
26 static int do_swap32
= 0;
28 static uint32_t omapimage_swap32(uint32_t data
)
31 result
= (data
& 0xFF000000) >> 24;
32 result
|= (data
& 0x00FF0000) >> 8;
33 result
|= (data
& 0x0000FF00) << 8;
34 result
|= (data
& 0x000000FF) << 24;
38 static uint8_t omapimage_header
[OMAP_FILE_HDR_SIZE
];
40 static int omapimage_check_image_types(uint8_t type
)
42 if (type
== IH_TYPE_OMAPIMAGE
)
50 * Only the simplest image type is currently supported:
51 * TOC pointing to CHSETTINGS
55 * padding to OMAP_CH_HDR_SIZE bytes
61 static int valid_gph_size(uint32_t size
)
66 static int valid_gph_load_addr(uint32_t load_addr
)
71 static int omapimage_verify_header(unsigned char *ptr
, int image_size
,
72 struct mkimage_params
*params
)
74 struct ch_toc
*toc
= (struct ch_toc
*)ptr
;
75 struct gp_header
*gph
= (struct gp_header
*)(ptr
+OMAP_CH_HDR_SIZE
);
76 uint32_t offset
, size
, gph_size
, gph_load_addr
;
78 while (toc
->section_offset
!= 0xffffffff
79 && toc
->section_size
!= 0xffffffff) {
81 offset
= omapimage_swap32(toc
->section_offset
);
82 size
= omapimage_swap32(toc
->section_size
);
84 offset
= toc
->section_offset
;
85 size
= toc
->section_size
;
89 if (offset
>= OMAP_CH_HDR_SIZE
||
90 offset
+size
>= OMAP_CH_HDR_SIZE
)
96 gph_size
= omapimage_swap32(gph
->size
);
97 gph_load_addr
= omapimage_swap32(gph
->load_addr
);
100 gph_load_addr
= gph
->load_addr
;
103 if (!valid_gph_size(gph_size
))
105 if (!valid_gph_load_addr(gph_load_addr
))
111 static void omapimage_print_section(struct ch_settings
*chs
)
113 const char *section_name
;
115 if (chs
->section_key
)
116 section_name
= "CHSETTINGS";
118 section_name
= "UNKNOWNKEY";
133 static void omapimage_print_header(const void *ptr
)
135 const struct ch_toc
*toc
= (struct ch_toc
*)ptr
;
136 const struct gp_header
*gph
=
137 (struct gp_header
*)(ptr
+OMAP_CH_HDR_SIZE
);
138 uint32_t offset
, size
, gph_size
, gph_load_addr
;
140 while (toc
->section_offset
!= 0xffffffff
141 && toc
->section_size
!= 0xffffffff) {
143 offset
= omapimage_swap32(toc
->section_offset
);
144 size
= omapimage_swap32(toc
->section_size
);
146 offset
= toc
->section_offset
;
147 size
= toc
->section_size
;
150 if (offset
>= OMAP_CH_HDR_SIZE
||
151 offset
+size
>= OMAP_CH_HDR_SIZE
)
154 printf("Section %s offset %x length %x\n",
159 omapimage_print_section((struct ch_settings
*)(ptr
+offset
));
164 gph_size
= omapimage_swap32(gph
->size
);
165 gph_load_addr
= omapimage_swap32(gph
->load_addr
);
167 gph_size
= gph
->size
;
168 gph_load_addr
= gph
->load_addr
;
171 if (!valid_gph_size(gph_size
)) {
172 fprintf(stderr
, "Error: invalid image size %x\n", gph_size
);
176 if (!valid_gph_load_addr(gph_load_addr
)) {
177 fprintf(stderr
, "Error: invalid image load address %x\n",
182 printf("GP Header: Size %x LoadAddr %x\n", gph_size
, gph_load_addr
);
185 static int toc_offset(void *hdr
, void *member
)
190 static void omapimage_set_header(void *ptr
, struct stat
*sbuf
, int ifd
,
191 struct mkimage_params
*params
)
193 struct ch_toc
*toc
= (struct ch_toc
*)ptr
;
194 struct ch_settings
*chs
= (struct ch_settings
*)
195 (ptr
+ 2 * sizeof(*toc
));
196 struct gp_header
*gph
= (struct gp_header
*)(ptr
+ OMAP_CH_HDR_SIZE
);
198 toc
->section_offset
= toc_offset(ptr
, chs
);
199 toc
->section_size
= sizeof(struct ch_settings
);
200 strcpy((char *)toc
->section_name
, "CHSETTINGS");
202 chs
->section_key
= KEY_CHSETTINGS
;
209 memset(toc
, 0xff, sizeof(*toc
));
211 gph
->size
= sbuf
->st_size
- OMAP_FILE_HDR_SIZE
;
212 gph
->load_addr
= params
->addr
;
214 if (strncmp(params
->imagename
, "byteswap", 8) == 0) {
217 uint32_t *data
= (uint32_t *)ptr
;
219 while (swapped
<= (sbuf
->st_size
/ sizeof(uint32_t))) {
220 *data
= omapimage_swap32(*data
);
227 int omapimage_check_params(struct mkimage_params
*params
)
229 return (params
->dflag
&& (params
->fflag
|| params
->lflag
)) ||
230 (params
->fflag
&& (params
->dflag
|| params
->lflag
)) ||
231 (params
->lflag
&& (params
->dflag
|| params
->fflag
));
235 * omapimage parameters
237 static struct image_type_params omapimage_params
= {
238 .name
= "TI OMAP CH/GP Boot Image support",
239 .header_size
= OMAP_FILE_HDR_SIZE
,
240 .hdr
= (void *)&omapimage_header
,
241 .check_image_type
= omapimage_check_image_types
,
242 .verify_header
= omapimage_verify_header
,
243 .print_header
= omapimage_print_header
,
244 .set_header
= omapimage_set_header
,
245 .check_params
= omapimage_check_params
,
248 void init_omap_image_type(void)
250 mkimage_register(&omapimage_params
);