• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2015-2017, Renesas Electronics Corporation. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <string.h>
8 
9 #include <platform_def.h>
10 
11 #include <common/debug.h>
12 #include <drivers/io/io_driver.h>
13 #include <drivers/io/io_storage.h>
14 #include <drivers/io/io_semihosting.h>
15 
16 #include "io_common.h"
17 #include "io_rcar.h"
18 #include "io_memdrv.h"
19 #include "io_emmcdrv.h"
20 #include "io_private.h"
21 
22 static uintptr_t emmcdrv_dev_handle;
23 static uintptr_t memdrv_dev_handle;
24 static uintptr_t rcar_dev_handle;
25 
26 static uintptr_t boot_io_drv_id;
27 
28 static const io_block_spec_t rcar_block_spec = {
29 	.offset = FLASH0_BASE,
30 	.length = FLASH0_SIZE
31 };
32 
33 static const io_block_spec_t bl2_file_spec = {
34 	.offset = BL2_IMAGE_ID,
35 };
36 
37 static const io_block_spec_t bl31_file_spec = {
38 	.offset = BL31_IMAGE_ID,
39 };
40 
41 static const io_block_spec_t bl32_file_spec = {
42 	.offset = BL32_IMAGE_ID,
43 };
44 
45 static const io_block_spec_t bl33_file_spec = {
46 	.offset = BL33_IMAGE_ID,
47 };
48 
49 static const io_block_spec_t bl332_file_spec = {
50 	.offset = BL332_IMAGE_ID,
51 };
52 
53 static const io_block_spec_t bl333_file_spec = {
54 	.offset = BL333_IMAGE_ID,
55 };
56 
57 static const io_block_spec_t bl334_file_spec = {
58 	.offset = BL334_IMAGE_ID,
59 };
60 
61 static const io_block_spec_t bl335_file_spec = {
62 	.offset = BL335_IMAGE_ID,
63 };
64 
65 static const io_block_spec_t bl336_file_spec = {
66 	.offset = BL336_IMAGE_ID,
67 };
68 
69 static const io_block_spec_t bl337_file_spec = {
70 	.offset = BL337_IMAGE_ID,
71 };
72 
73 static const io_block_spec_t bl338_file_spec = {
74 	.offset = BL338_IMAGE_ID,
75 };
76 
77 #if TRUSTED_BOARD_BOOT
78 static const io_block_spec_t trusted_key_cert_file_spec = {
79 	.offset = TRUSTED_KEY_CERT_ID,
80 };
81 
82 static const io_block_spec_t bl31_key_cert_file_spec = {
83 	.offset = SOC_FW_KEY_CERT_ID,
84 };
85 
86 static const io_block_spec_t bl32_key_cert_file_spec = {
87 	.offset = TRUSTED_OS_FW_KEY_CERT_ID,
88 };
89 
90 static const io_block_spec_t bl33_key_cert_file_spec = {
91 	.offset = NON_TRUSTED_FW_KEY_CERT_ID,
92 };
93 
94 static const io_block_spec_t bl332_key_cert_file_spec = {
95 	.offset = BL332_KEY_CERT_ID,
96 };
97 
98 static const io_block_spec_t bl333_key_cert_file_spec = {
99 	.offset = BL333_KEY_CERT_ID,
100 };
101 
102 static const io_block_spec_t bl334_key_cert_file_spec = {
103 	.offset = BL334_KEY_CERT_ID,
104 };
105 
106 static const io_block_spec_t bl335_key_cert_file_spec = {
107 	.offset = BL335_KEY_CERT_ID,
108 };
109 
110 static const io_block_spec_t bl336_key_cert_file_spec = {
111 	.offset = BL336_KEY_CERT_ID,
112 };
113 
114 static const io_block_spec_t bl337_key_cert_file_spec = {
115 	.offset = BL337_KEY_CERT_ID,
116 };
117 
118 static const io_block_spec_t bl338_key_cert_file_spec = {
119 	.offset = BL338_KEY_CERT_ID,
120 };
121 
122 static const io_block_spec_t bl31_cert_file_spec = {
123 	.offset = SOC_FW_CONTENT_CERT_ID,
124 };
125 
126 static const io_block_spec_t bl32_cert_file_spec = {
127 	.offset = TRUSTED_OS_FW_CONTENT_CERT_ID,
128 };
129 
130 static const io_block_spec_t bl33_cert_file_spec = {
131 	.offset = NON_TRUSTED_FW_CONTENT_CERT_ID,
132 };
133 
134 static const io_block_spec_t bl332_cert_file_spec = {
135 	.offset = BL332_CERT_ID,
136 };
137 
138 static const io_block_spec_t bl333_cert_file_spec = {
139 	.offset = BL333_CERT_ID,
140 };
141 
142 static const io_block_spec_t bl334_cert_file_spec = {
143 	.offset = BL334_CERT_ID,
144 };
145 
146 static const io_block_spec_t bl335_cert_file_spec = {
147 	.offset = BL335_CERT_ID,
148 };
149 
150 static const io_block_spec_t bl336_cert_file_spec = {
151 	.offset = BL336_CERT_ID,
152 };
153 
154 static const io_block_spec_t bl337_cert_file_spec = {
155 	.offset = BL337_CERT_ID,
156 };
157 
158 static const io_block_spec_t bl338_cert_file_spec = {
159 	.offset = BL338_CERT_ID,
160 };
161 #endif
162 
163 static int32_t open_emmcdrv(const uintptr_t spec);
164 static int32_t open_memmap(const uintptr_t spec);
165 static int32_t open_rcar(const uintptr_t spec);
166 
167 struct plat_io_policy {
168 	uintptr_t *dev_handle;
169 	uintptr_t image_spec;
170 	 int32_t(*check) (const uintptr_t spec);
171 };
172 
173 static const struct plat_io_policy policies[] = {
174 	[FIP_IMAGE_ID] = {
175 			  &memdrv_dev_handle,
176 			  (uintptr_t) &rcar_block_spec,
177 			  &open_memmap},
178 	[BL2_IMAGE_ID] = {
179 			  &rcar_dev_handle,
180 			  (uintptr_t) &bl2_file_spec,
181 			  &open_rcar},
182 	[BL31_IMAGE_ID] = {
183 			   &rcar_dev_handle,
184 			   (uintptr_t) &bl31_file_spec,
185 			   &open_rcar},
186 	[BL32_IMAGE_ID] = {
187 			   &rcar_dev_handle,
188 			   (uintptr_t) &bl32_file_spec,
189 			   &open_rcar},
190 	[BL33_IMAGE_ID] = {
191 			   &rcar_dev_handle,
192 			   (uintptr_t) &bl33_file_spec,
193 			   &open_rcar},
194 	[BL332_IMAGE_ID] = {
195 			    &rcar_dev_handle,
196 			    (uintptr_t) &bl332_file_spec,
197 			    &open_rcar},
198 	[BL333_IMAGE_ID] = {
199 			    &rcar_dev_handle,
200 			    (uintptr_t) &bl333_file_spec,
201 			    &open_rcar},
202 	[BL334_IMAGE_ID] = {
203 			    &rcar_dev_handle,
204 			    (uintptr_t) &bl334_file_spec,
205 			    &open_rcar},
206 	[BL335_IMAGE_ID] = {
207 			    &rcar_dev_handle,
208 			    (uintptr_t) &bl335_file_spec,
209 			    &open_rcar},
210 	[BL336_IMAGE_ID] = {
211 			    &rcar_dev_handle,
212 			    (uintptr_t) &bl336_file_spec,
213 			    &open_rcar},
214 	[BL337_IMAGE_ID] = {
215 			    &rcar_dev_handle,
216 			    (uintptr_t) &bl337_file_spec,
217 			    &open_rcar},
218 	[BL338_IMAGE_ID] = {
219 			    &rcar_dev_handle,
220 			    (uintptr_t) &bl338_file_spec,
221 			    &open_rcar},
222 #if TRUSTED_BOARD_BOOT
223 	[TRUSTED_KEY_CERT_ID] = {
224 				 &rcar_dev_handle,
225 				 (uintptr_t) &trusted_key_cert_file_spec,
226 				 &open_rcar},
227 	[SOC_FW_KEY_CERT_ID] = {
228 				&rcar_dev_handle,
229 				(uintptr_t) &bl31_key_cert_file_spec,
230 				&open_rcar},
231 	[TRUSTED_OS_FW_KEY_CERT_ID] = {
232 				       &rcar_dev_handle,
233 				       (uintptr_t) &bl32_key_cert_file_spec,
234 				       &open_rcar},
235 	[NON_TRUSTED_FW_KEY_CERT_ID] = {
236 					&rcar_dev_handle,
237 					(uintptr_t) &bl33_key_cert_file_spec,
238 					&open_rcar},
239 	[BL332_KEY_CERT_ID] = {
240 			       &rcar_dev_handle,
241 			       (uintptr_t) &bl332_key_cert_file_spec,
242 			       &open_rcar},
243 	[BL333_KEY_CERT_ID] = {
244 			       &rcar_dev_handle,
245 			       (uintptr_t) &bl333_key_cert_file_spec,
246 			       &open_rcar},
247 	[BL334_KEY_CERT_ID] = {
248 			       &rcar_dev_handle,
249 			       (uintptr_t) &bl334_key_cert_file_spec,
250 			       &open_rcar},
251 	[BL335_KEY_CERT_ID] = {
252 			       &rcar_dev_handle,
253 			       (uintptr_t) &bl335_key_cert_file_spec,
254 			       &open_rcar},
255 	[BL336_KEY_CERT_ID] = {
256 			       &rcar_dev_handle,
257 			       (uintptr_t) &bl336_key_cert_file_spec,
258 			       &open_rcar},
259 	[BL337_KEY_CERT_ID] = {
260 			       &rcar_dev_handle,
261 			       (uintptr_t) &bl337_key_cert_file_spec,
262 			       &open_rcar},
263 	[BL338_KEY_CERT_ID] = {
264 			       &rcar_dev_handle,
265 			       (uintptr_t) &bl338_key_cert_file_spec,
266 			       &open_rcar},
267 	[SOC_FW_CONTENT_CERT_ID] = {
268 				    &rcar_dev_handle,
269 				    (uintptr_t) &bl31_cert_file_spec,
270 				    &open_rcar},
271 	[TRUSTED_OS_FW_CONTENT_CERT_ID] = {
272 					   &rcar_dev_handle,
273 					   (uintptr_t) &bl32_cert_file_spec,
274 					   &open_rcar},
275 	[NON_TRUSTED_FW_CONTENT_CERT_ID] = {
276 					    &rcar_dev_handle,
277 					    (uintptr_t) &bl33_cert_file_spec,
278 					    &open_rcar},
279 	[BL332_CERT_ID] = {
280 			   &rcar_dev_handle,
281 			   (uintptr_t) &bl332_cert_file_spec,
282 			   &open_rcar},
283 	[BL333_CERT_ID] = {
284 			   &rcar_dev_handle,
285 			   (uintptr_t) &bl333_cert_file_spec,
286 			   &open_rcar},
287 	[BL334_CERT_ID] = {
288 			   &rcar_dev_handle,
289 			   (uintptr_t) &bl334_cert_file_spec,
290 			   &open_rcar},
291 	[BL335_CERT_ID] = {
292 			   &rcar_dev_handle,
293 			   (uintptr_t) &bl335_cert_file_spec,
294 			   &open_rcar},
295 	[BL336_CERT_ID] = {
296 			   &rcar_dev_handle,
297 			   (uintptr_t) &bl336_cert_file_spec,
298 			   &open_rcar},
299 	[BL337_CERT_ID] = {
300 			   &rcar_dev_handle,
301 			   (uintptr_t) &bl337_cert_file_spec,
302 			   &open_rcar},
303 	[BL338_CERT_ID] = {
304 			   &rcar_dev_handle,
305 			   (uintptr_t) &bl338_cert_file_spec,
306 			   &open_rcar}, {
307 #else
308 				   {
309 #endif
310 					 0, 0, 0}
311 };
312 
313 static io_drv_spec_t io_drv_spec_memdrv = {
314 	FLASH0_BASE,
315 	FLASH0_SIZE,
316 	0,
317 };
318 
319 static io_drv_spec_t io_drv_spec_emmcdrv = {
320 	0,
321 	0,
322 	0,
323 };
324 
325 static struct plat_io_policy drv_policies[]
326     __attribute__ ((section(".data"))) = {
327 	/* FLASH_DEV_ID */
328 	{
329 	&memdrv_dev_handle,
330 		    (uintptr_t) &io_drv_spec_memdrv, &open_memmap,},
331 	    /* EMMC_DEV_ID */
332 	{
333 	&emmcdrv_dev_handle,
334 		    (uintptr_t) &io_drv_spec_emmcdrv, &open_emmcdrv,}
335 };
336 
open_rcar(const uintptr_t spec)337 static int32_t open_rcar(const uintptr_t spec)
338 {
339 	return io_dev_init(rcar_dev_handle, boot_io_drv_id);
340 }
341 
open_memmap(const uintptr_t spec)342 static int32_t open_memmap(const uintptr_t spec)
343 {
344 	uintptr_t handle;
345 	int32_t result;
346 
347 	result = io_dev_init(memdrv_dev_handle, 0);
348 	if (result != IO_SUCCESS)
349 		return result;
350 
351 	result = io_open(memdrv_dev_handle, spec, &handle);
352 	if (result == IO_SUCCESS)
353 		io_close(handle);
354 
355 	return result;
356 }
357 
open_emmcdrv(const uintptr_t spec)358 static int32_t open_emmcdrv(const uintptr_t spec)
359 {
360 	return io_dev_init(emmcdrv_dev_handle, 0);
361 }
362 
rcar_io_setup(void)363 void rcar_io_setup(void)
364 {
365 	const io_dev_connector_t *memmap;
366 	const io_dev_connector_t *rcar;
367 
368 	boot_io_drv_id = FLASH_DEV_ID;
369 
370 	rcar_register_io_dev(&rcar);
371 	rcar_register_io_dev_memdrv(&memmap);
372 	io_dev_open(rcar, 0, &rcar_dev_handle);
373 	io_dev_open(memmap, 0, &memdrv_dev_handle);
374 }
375 
rcar_io_emmc_setup(void)376 void rcar_io_emmc_setup(void)
377 {
378 	const io_dev_connector_t *rcar;
379 	const io_dev_connector_t *emmc;
380 
381 	boot_io_drv_id = EMMC_DEV_ID;
382 
383 	rcar_register_io_dev(&rcar);
384 	rcar_register_io_dev_emmcdrv(&emmc);
385 	io_dev_open(rcar, 0, &rcar_dev_handle);
386 	io_dev_open(emmc, 0, &emmcdrv_dev_handle);
387 }
388 
plat_get_image_source(unsigned int image_id,uintptr_t * dev_handle,uintptr_t * image_spec)389 int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
390 			  uintptr_t *image_spec)
391 {
392 	const struct plat_io_policy *policy;
393 	int result;
394 
395 	policy = &policies[image_id];
396 
397 	result = policy->check(policy->image_spec);
398 	if (result != IO_SUCCESS)
399 		return result;
400 
401 	*image_spec = policy->image_spec;
402 	*dev_handle = *(policy->dev_handle);
403 
404 	return IO_SUCCESS;
405 }
406 
plat_get_drv_source(uint32_t io_drv_id,uintptr_t * dev_handle,uintptr_t * image_spec)407 int32_t plat_get_drv_source(uint32_t io_drv_id, uintptr_t *dev_handle,
408 			    uintptr_t *image_spec)
409 {
410 	const struct plat_io_policy *policy;
411 	int32_t result;
412 
413 	policy = &drv_policies[io_drv_id];
414 
415 	result = policy->check(policy->image_spec);
416 	if (result != IO_SUCCESS)
417 		return result;
418 
419 	*image_spec = policy->image_spec;
420 	*dev_handle = *(policy->dev_handle);
421 
422 	return IO_SUCCESS;
423 }
424