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