blob: c039acc86fdaa526e7576d9460cf5dacfb9e10d4 [file] [log] [blame]
Masahiro Yamada574388c2016-09-03 11:37:40 +09001/*
Masahiro Yamadae44b8c62020-01-17 13:46:02 +09002 * Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved.
Masahiro Yamada574388c2016-09-03 11:37:40 +09003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <assert.h>
8#include <errno.h>
Antonio Nino Diaz4b32e622018-08-16 16:52:57 +01009#include <stdint.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000010
11#include <platform_def.h>
12
13#include <drivers/io/io_block.h>
14#include <drivers/io/io_driver.h>
15#include <drivers/io/io_fip.h>
16#include <drivers/io/io_memmap.h>
17#include <lib/utils_def.h>
18#include <lib/xlat_tables/xlat_tables_v2.h>
19#include <tools_share/firmware_image_package.h>
Masahiro Yamada574388c2016-09-03 11:37:40 +090020
21#include "uniphier.h"
22
Masahiro Yamadadb72b0c2018-02-02 15:55:13 +090023#define UNIPHIER_ROM_REGION_BASE 0x00000000ULL
24#define UNIPHIER_ROM_REGION_SIZE 0x10000000ULL
Masahiro Yamada574388c2016-09-03 11:37:40 +090025
Masahiro Yamadadb72b0c2018-02-02 15:55:13 +090026#define UNIPHIER_OCM_REGION_BASE 0x30000000ULL
27#define UNIPHIER_OCM_REGION_SIZE 0x00040000ULL
Masahiro Yamada8f642922018-01-30 19:30:39 +090028
Masahiro Yamada574388c2016-09-03 11:37:40 +090029static const io_dev_connector_t *uniphier_fip_dev_con;
30static uintptr_t uniphier_fip_dev_handle;
31
32static const io_dev_connector_t *uniphier_backend_dev_con;
33static uintptr_t uniphier_backend_dev_handle;
34
35static io_block_spec_t uniphier_fip_spec = {
36 /* .offset will be set by the io_setup func */
37 .length = 0x00200000,
38};
39
40static const io_uuid_spec_t uniphier_bl2_spec = {
41 .uuid = UUID_TRUSTED_BOOT_FIRMWARE_BL2,
42};
43
44static const io_uuid_spec_t uniphier_scp_spec = {
45 .uuid = UUID_SCP_FIRMWARE_SCP_BL2,
46};
47
48static const io_uuid_spec_t uniphier_bl31_spec = {
49 .uuid = UUID_EL3_RUNTIME_FIRMWARE_BL31,
50};
51
52static const io_uuid_spec_t uniphier_bl32_spec = {
53 .uuid = UUID_SECURE_PAYLOAD_BL32,
54};
55
56static const io_uuid_spec_t uniphier_bl33_spec = {
57 .uuid = UUID_NON_TRUSTED_FIRMWARE_BL33,
58};
59
60#if TRUSTED_BOARD_BOOT
61static const io_uuid_spec_t uniphier_tb_fw_cert_spec = {
62 .uuid = UUID_TRUSTED_BOOT_FW_CERT,
63};
64
65static const io_uuid_spec_t uniphier_trusted_key_cert_spec = {
66 .uuid = UUID_TRUSTED_KEY_CERT,
67};
68
69static const io_uuid_spec_t uniphier_scp_fw_key_cert_spec = {
70 .uuid = UUID_SCP_FW_KEY_CERT,
71};
72
73static const io_uuid_spec_t uniphier_soc_fw_key_cert_spec = {
74 .uuid = UUID_SOC_FW_KEY_CERT,
75};
76
77static const io_uuid_spec_t uniphier_tos_fw_key_cert_spec = {
78 .uuid = UUID_TRUSTED_OS_FW_KEY_CERT,
79};
80
81static const io_uuid_spec_t uniphier_nt_fw_key_cert_spec = {
82 .uuid = UUID_NON_TRUSTED_FW_KEY_CERT,
83};
84
85static const io_uuid_spec_t uniphier_scp_fw_cert_spec = {
86 .uuid = UUID_SCP_FW_CONTENT_CERT,
87};
88
89static const io_uuid_spec_t uniphier_soc_fw_cert_spec = {
90 .uuid = UUID_SOC_FW_CONTENT_CERT,
91};
92
93static const io_uuid_spec_t uniphier_tos_fw_cert_spec = {
94 .uuid = UUID_TRUSTED_OS_FW_CONTENT_CERT,
95};
96
97static const io_uuid_spec_t uniphier_nt_fw_cert_spec = {
98 .uuid = UUID_NON_TRUSTED_FW_CONTENT_CERT,
99};
100#endif /* TRUSTED_BOARD_BOOT */
101
102struct uniphier_io_policy {
103 uintptr_t *dev_handle;
104 uintptr_t image_spec;
105 uintptr_t init_params;
106};
107
108static const struct uniphier_io_policy uniphier_io_policies[] = {
109 [FIP_IMAGE_ID] = {
110 .dev_handle = &uniphier_backend_dev_handle,
111 .image_spec = (uintptr_t)&uniphier_fip_spec,
112 },
113 [BL2_IMAGE_ID] = {
114 .dev_handle = &uniphier_fip_dev_handle,
115 .image_spec = (uintptr_t)&uniphier_bl2_spec,
116 .init_params = FIP_IMAGE_ID,
117 },
118 [SCP_BL2_IMAGE_ID] = {
119 .dev_handle = &uniphier_fip_dev_handle,
120 .image_spec = (uintptr_t)&uniphier_scp_spec,
121 .init_params = FIP_IMAGE_ID,
122 },
123 [BL31_IMAGE_ID] = {
124 .dev_handle = &uniphier_fip_dev_handle,
125 .image_spec = (uintptr_t)&uniphier_bl31_spec,
126 .init_params = FIP_IMAGE_ID,
127 },
128 [BL32_IMAGE_ID] = {
129 .dev_handle = &uniphier_fip_dev_handle,
130 .image_spec = (uintptr_t)&uniphier_bl32_spec,
131 .init_params = FIP_IMAGE_ID,
132 },
133 [BL33_IMAGE_ID] = {
134 .dev_handle = &uniphier_fip_dev_handle,
135 .image_spec = (uintptr_t)&uniphier_bl33_spec,
136 .init_params = FIP_IMAGE_ID,
137 },
138#if TRUSTED_BOARD_BOOT
139 [TRUSTED_BOOT_FW_CERT_ID] = {
140 .dev_handle = &uniphier_fip_dev_handle,
141 .image_spec = (uintptr_t)&uniphier_tb_fw_cert_spec,
142 .init_params = FIP_IMAGE_ID,
143 },
144 [TRUSTED_KEY_CERT_ID] = {
145 .dev_handle = &uniphier_fip_dev_handle,
146 .image_spec = (uintptr_t)&uniphier_trusted_key_cert_spec,
147 .init_params = FIP_IMAGE_ID,
148 },
149 [SCP_FW_KEY_CERT_ID] = {
150 .dev_handle = &uniphier_fip_dev_handle,
151 .image_spec = (uintptr_t)&uniphier_scp_fw_key_cert_spec,
152 .init_params = FIP_IMAGE_ID,
153 },
154 [SOC_FW_KEY_CERT_ID] = {
155 .dev_handle = &uniphier_fip_dev_handle,
156 .image_spec = (uintptr_t)&uniphier_soc_fw_key_cert_spec,
157 .init_params = FIP_IMAGE_ID,
158 },
159 [TRUSTED_OS_FW_KEY_CERT_ID] = {
160 .dev_handle = &uniphier_fip_dev_handle,
161 .image_spec = (uintptr_t)&uniphier_tos_fw_key_cert_spec,
162 .init_params = FIP_IMAGE_ID,
163 },
164 [NON_TRUSTED_FW_KEY_CERT_ID] = {
165 .dev_handle = &uniphier_fip_dev_handle,
166 .image_spec = (uintptr_t)&uniphier_nt_fw_key_cert_spec,
167 .init_params = FIP_IMAGE_ID,
168 },
169 [SCP_FW_CONTENT_CERT_ID] = {
170 .dev_handle = &uniphier_fip_dev_handle,
171 .image_spec = (uintptr_t)&uniphier_scp_fw_cert_spec,
172 .init_params = FIP_IMAGE_ID,
173 },
174 [SOC_FW_CONTENT_CERT_ID] = {
175 .dev_handle = &uniphier_fip_dev_handle,
176 .image_spec = (uintptr_t)&uniphier_soc_fw_cert_spec,
177 .init_params = FIP_IMAGE_ID,
178 },
179 [TRUSTED_OS_FW_CONTENT_CERT_ID] = {
180 .dev_handle = &uniphier_fip_dev_handle,
181 .image_spec = (uintptr_t)&uniphier_tos_fw_cert_spec,
182 .init_params = FIP_IMAGE_ID,
183 },
184 [NON_TRUSTED_FW_CONTENT_CERT_ID] = {
185 .dev_handle = &uniphier_fip_dev_handle,
186 .image_spec = (uintptr_t)&uniphier_nt_fw_cert_spec,
187 .init_params = FIP_IMAGE_ID,
188 },
189#endif
190};
191
192static int uniphier_io_block_setup(size_t fip_offset, uintptr_t block_dev_spec)
193{
194 int ret;
195
196 uniphier_fip_spec.offset = fip_offset;
197
Masahiro Yamadae44b8c62020-01-17 13:46:02 +0900198 ret = mmap_add_dynamic_region(UNIPHIER_BLOCK_BUF_BASE,
199 UNIPHIER_BLOCK_BUF_BASE,
200 UNIPHIER_BLOCK_BUF_SIZE,
201 MT_MEMORY | MT_RW | MT_NS);
202 if (ret)
203 return ret;
204
Masahiro Yamada574388c2016-09-03 11:37:40 +0900205 ret = register_io_dev_block(&uniphier_backend_dev_con);
206 if (ret)
207 return ret;
208
209 return io_dev_open(uniphier_backend_dev_con, block_dev_spec,
210 &uniphier_backend_dev_handle);
211}
212
213static int uniphier_io_memmap_setup(size_t fip_offset)
214{
215 int ret;
216
217 uniphier_fip_spec.offset = fip_offset;
218
219 ret = mmap_add_dynamic_region(fip_offset, fip_offset,
220 uniphier_fip_spec.length,
221 MT_RO_DATA | MT_SECURE);
222 if (ret)
223 return ret;
224
225 ret = register_io_dev_memmap(&uniphier_backend_dev_con);
226 if (ret)
227 return ret;
228
229 return io_dev_open(uniphier_backend_dev_con, 0,
230 &uniphier_backend_dev_handle);
231}
232
233static int uniphier_io_fip_setup(void)
234{
235 int ret;
236
237 ret = register_io_dev_fip(&uniphier_fip_dev_con);
238 if (ret)
239 return ret;
240
241 return io_dev_open(uniphier_fip_dev_con, 0, &uniphier_fip_dev_handle);
242}
243
244static int uniphier_io_emmc_setup(unsigned int soc_id)
245{
246 uintptr_t block_dev_spec;
247 int ret;
248
249 ret = uniphier_emmc_init(&block_dev_spec);
250 if (ret)
251 return ret;
252
253 return uniphier_io_block_setup(0x20000, block_dev_spec);
254}
255
256static int uniphier_io_nand_setup(unsigned int soc_id)
257{
258 uintptr_t block_dev_spec;
259 int ret;
260
261 ret = uniphier_nand_init(&block_dev_spec);
262 if (ret)
263 return ret;
264
265 return uniphier_io_block_setup(0x20000, block_dev_spec);
266}
267
268static int uniphier_io_nor_setup(unsigned int soc_id)
269{
270 return uniphier_io_memmap_setup(0x70000);
271}
272
273static int uniphier_io_usb_setup(unsigned int soc_id)
274{
275 uintptr_t block_dev_spec;
276 int ret;
277
278 /* use ROM API for loading images from USB storage */
279 ret = mmap_add_dynamic_region(UNIPHIER_ROM_REGION_BASE,
280 UNIPHIER_ROM_REGION_BASE,
281 UNIPHIER_ROM_REGION_SIZE,
282 MT_CODE | MT_SECURE);
283 if (ret)
284 return ret;
285
Masahiro Yamada8f642922018-01-30 19:30:39 +0900286 /*
287 * on-chip SRAM region: should be DEVICE attribute because the USB
288 * load functions provided by the ROM use this memory region as a work
289 * area, but do not cater to cache coherency.
290 */
291 ret = mmap_add_dynamic_region(UNIPHIER_OCM_REGION_BASE,
292 UNIPHIER_OCM_REGION_BASE,
293 UNIPHIER_OCM_REGION_SIZE,
294 MT_DEVICE | MT_RW | MT_SECURE);
295 if (ret)
296 return ret;
297
Masahiro Yamada574388c2016-09-03 11:37:40 +0900298 ret = uniphier_usb_init(soc_id, &block_dev_spec);
299 if (ret)
300 return ret;
301
302 return uniphier_io_block_setup(0x20000, block_dev_spec);
303}
304
305static int (* const uniphier_io_setup_table[])(unsigned int) = {
306 [UNIPHIER_BOOT_DEVICE_EMMC] = uniphier_io_emmc_setup,
307 [UNIPHIER_BOOT_DEVICE_NAND] = uniphier_io_nand_setup,
308 [UNIPHIER_BOOT_DEVICE_NOR] = uniphier_io_nor_setup,
309 [UNIPHIER_BOOT_DEVICE_USB] = uniphier_io_usb_setup,
310};
311
312int uniphier_io_setup(unsigned int soc_id)
313{
314 int (*io_setup)(unsigned int soc_id);
315 unsigned int boot_dev;
316 int ret;
317
318 boot_dev = uniphier_get_boot_device(soc_id);
319 if (boot_dev == UNIPHIER_BOOT_DEVICE_RSV)
320 return -EINVAL;
321
322 io_setup = uniphier_io_setup_table[boot_dev];
323 ret = io_setup(soc_id);
324 if (ret)
325 return ret;
326
327 ret = uniphier_io_fip_setup();
328 if (ret)
329 return ret;
330
331 return 0;
332}
333
334int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
335 uintptr_t *image_spec)
336{
337 uintptr_t init_params;
338
339 assert(image_id < ARRAY_SIZE(uniphier_io_policies));
340
Masahiro Yamada501b88b2019-07-26 20:04:28 +0900341 *dev_handle = *uniphier_io_policies[image_id].dev_handle;
Masahiro Yamada574388c2016-09-03 11:37:40 +0900342 *image_spec = uniphier_io_policies[image_id].image_spec;
343 init_params = uniphier_io_policies[image_id].init_params;
344
345 return io_dev_init(*dev_handle, init_params);
346}