Blame view

tools/omapimage.c 4.07 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
3decb14ab   John Rigby   mkimage: Add OMAP...
2
3
4
5
6
7
8
9
10
11
12
13
  /*
   * (C) Copyright 2010
   * Linaro LTD, www.linaro.org
   * Author: John Rigby <john.rigby@linaro.org>
   * Based on TI's signGP.c
   *
   * (C) Copyright 2009
   * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
   *
   * (C) Copyright 2008
   * Marvell Semiconductor <www.marvell.com>
   * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
3decb14ab   John Rigby   mkimage: Add OMAP...
14
   */
f86ed6a8d   Guilherme Maciel Ferreira   tools: moved code...
15
  #include "imagetool.h"
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
16
  #include <compiler.h>
3decb14ab   John Rigby   mkimage: Add OMAP...
17
  #include <image.h>
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
18
  #include "gpheader.h"
3decb14ab   John Rigby   mkimage: Add OMAP...
19
  #include "omapimage.h"
c8e1ca3eb   Philipp Tomsich   tools: omapimage:...
20
  #define DIV_ROUND_UP(n, d)     (((n) + (d) - 1) / (d))
3decb14ab   John Rigby   mkimage: Add OMAP...
21
22
  /* Header size is CH header rounded up to 512 bytes plus GP header */
  #define OMAP_CH_HDR_SIZE 512
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
23
  #define OMAP_FILE_HDR_SIZE (OMAP_CH_HDR_SIZE + GPIMAGE_HDR_SIZE)
3decb14ab   John Rigby   mkimage: Add OMAP...
24

79b9ebb70   Tom Rini   omapimage: Add su...
25
  static int do_swap32 = 0;
3decb14ab   John Rigby   mkimage: Add OMAP...
26
27
28
29
30
31
  static uint8_t omapimage_header[OMAP_FILE_HDR_SIZE];
  
  static int omapimage_check_image_types(uint8_t type)
  {
  	if (type == IH_TYPE_OMAPIMAGE)
  		return EXIT_SUCCESS;
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
32
  	return EXIT_FAILURE;
3decb14ab   John Rigby   mkimage: Add OMAP...
33
34
35
  }
  
  static int omapimage_verify_header(unsigned char *ptr, int image_size,
f86ed6a8d   Guilherme Maciel Ferreira   tools: moved code...
36
  			struct image_tool_params *params)
3decb14ab   John Rigby   mkimage: Add OMAP...
37
38
39
  {
  	struct ch_toc *toc = (struct ch_toc *)ptr;
  	struct gp_header *gph = (struct gp_header *)(ptr+OMAP_CH_HDR_SIZE);
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
40
  	uint32_t offset, size;
3decb14ab   John Rigby   mkimage: Add OMAP...
41
42
43
  
  	while (toc->section_offset != 0xffffffff
  			&& toc->section_size != 0xffffffff) {
79b9ebb70   Tom Rini   omapimage: Add su...
44
  		if (do_swap32) {
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
45
46
  			offset = cpu_to_be32(toc->section_offset);
  			size = cpu_to_be32(toc->section_size);
79b9ebb70   Tom Rini   omapimage: Add su...
47
48
49
50
  		} else {
  			offset = toc->section_offset;
  			size = toc->section_size;
  		}
3decb14ab   John Rigby   mkimage: Add OMAP...
51
52
53
54
55
56
57
  		if (!offset || !size)
  			return -1;
  		if (offset >= OMAP_CH_HDR_SIZE ||
  		    offset+size >= OMAP_CH_HDR_SIZE)
  			return -1;
  		toc++;
  	}
79b9ebb70   Tom Rini   omapimage: Add su...
58

bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
59
  	return gph_verify_header(gph, do_swap32);
3decb14ab   John Rigby   mkimage: Add OMAP...
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  }
  
  static void omapimage_print_section(struct ch_settings *chs)
  {
  	const char *section_name;
  
  	if (chs->section_key)
  		section_name = "CHSETTINGS";
  	else
  		section_name = "UNKNOWNKEY";
  
  	printf("%s (%x) "
  		"valid:%x "
  		"version:%x "
  		"reserved:%x "
  		"flags:%x
  ",
  		section_name,
  		chs->section_key,
  		chs->valid,
  		chs->version,
  		chs->reserved,
  		chs->flags);
  }
  
  static void omapimage_print_header(const void *ptr)
  {
  	const struct ch_toc *toc = (struct ch_toc *)ptr;
  	const struct gp_header *gph =
  			(struct gp_header *)(ptr+OMAP_CH_HDR_SIZE);
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
90
  	uint32_t offset, size;
3decb14ab   John Rigby   mkimage: Add OMAP...
91
92
93
  
  	while (toc->section_offset != 0xffffffff
  			&& toc->section_size != 0xffffffff) {
79b9ebb70   Tom Rini   omapimage: Add su...
94
  		if (do_swap32) {
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
95
96
  			offset = cpu_to_be32(toc->section_offset);
  			size = cpu_to_be32(toc->section_size);
79b9ebb70   Tom Rini   omapimage: Add su...
97
98
99
100
  		} else {
  			offset = toc->section_offset;
  			size = toc->section_size;
  		}
3decb14ab   John Rigby   mkimage: Add OMAP...
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  
  		if (offset >= OMAP_CH_HDR_SIZE ||
  		    offset+size >= OMAP_CH_HDR_SIZE)
  			exit(EXIT_FAILURE);
  
  		printf("Section %s offset %x length %x
  ",
  			toc->section_name,
  			toc->section_offset,
  			toc->section_size);
  
  		omapimage_print_section((struct ch_settings *)(ptr+offset));
  		toc++;
  	}
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
115
  	gph_print_header(gph, do_swap32);
3decb14ab   John Rigby   mkimage: Add OMAP...
116
117
118
119
120
121
122
123
  }
  
  static int toc_offset(void *hdr, void *member)
  {
  	return member - hdr;
  }
  
  static void omapimage_set_header(void *ptr, struct stat *sbuf, int ifd,
f86ed6a8d   Guilherme Maciel Ferreira   tools: moved code...
124
  				struct image_tool_params *params)
3decb14ab   John Rigby   mkimage: Add OMAP...
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
  {
  	struct ch_toc *toc = (struct ch_toc *)ptr;
  	struct ch_settings *chs = (struct ch_settings *)
  					(ptr + 2 * sizeof(*toc));
  	struct gp_header *gph = (struct gp_header *)(ptr + OMAP_CH_HDR_SIZE);
  
  	toc->section_offset = toc_offset(ptr, chs);
  	toc->section_size = sizeof(struct ch_settings);
  	strcpy((char *)toc->section_name, "CHSETTINGS");
  
  	chs->section_key = KEY_CHSETTINGS;
  	chs->valid = 0;
  	chs->version = 1;
  	chs->reserved = 0;
  	chs->flags = 0;
  
  	toc++;
  	memset(toc, 0xff, sizeof(*toc));
3a0e70f18   Lokesh Vutla   tools: omapimage:...
143
  	gph_set_header(gph, sbuf->st_size - OMAP_CH_HDR_SIZE,
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
144
  		       params->addr, 0);
79b9ebb70   Tom Rini   omapimage: Add su...
145
146
147
148
149
  
  	if (strncmp(params->imagename, "byteswap", 8) == 0) {
  		do_swap32 = 1;
  		int swapped = 0;
  		uint32_t *data = (uint32_t *)ptr;
c8e1ca3eb   Philipp Tomsich   tools: omapimage:...
150
151
  		const off_t size_in_words =
  			DIV_ROUND_UP(sbuf->st_size, sizeof(uint32_t));
79b9ebb70   Tom Rini   omapimage: Add su...
152

c8e1ca3eb   Philipp Tomsich   tools: omapimage:...
153
  		while (swapped < size_in_words) {
bf411ea9f   Karicheri, Muralidharan   tools: mkimage: a...
154
  			*data = cpu_to_be32(*data);
79b9ebb70   Tom Rini   omapimage: Add su...
155
156
157
158
  			swapped++;
  			data++;
  		}
  	}
3decb14ab   John Rigby   mkimage: Add OMAP...
159
  }
3decb14ab   John Rigby   mkimage: Add OMAP...
160
161
162
  /*
   * omapimage parameters
   */
a93648d19   Guilherme Maciel Ferreira   imagetool: replac...
163
164
165
166
167
168
169
170
171
172
173
174
175
176
  U_BOOT_IMAGE_TYPE(
  	omapimage,
  	"TI OMAP CH/GP Boot Image support",
  	OMAP_FILE_HDR_SIZE,
  	(void *)&omapimage_header,
  	gpimage_check_params,
  	omapimage_verify_header,
  	omapimage_print_header,
  	omapimage_set_header,
  	NULL,
  	omapimage_check_image_types,
  	NULL,
  	NULL
  );