xref: /rk3399_ARM-atf/plat/socionext/uniphier/uniphier_io_storage.c (revision c948f77136c42a92d0bb660543a3600c36dcf7f1)
1 /*
2  * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <assert.h>
8 #include <errno.h>
9 #include <stdint.h>
10 
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>
20 
21 #include "uniphier.h"
22 
23 #define UNIPHIER_ROM_REGION_BASE	0x00000000ULL
24 #define UNIPHIER_ROM_REGION_SIZE	0x10000000ULL
25 
26 #define UNIPHIER_OCM_REGION_BASE	0x30000000ULL
27 #define UNIPHIER_OCM_REGION_SIZE	0x00040000ULL
28 
29 static const io_dev_connector_t *uniphier_fip_dev_con;
30 static uintptr_t uniphier_fip_dev_handle;
31 
32 static const io_dev_connector_t *uniphier_backend_dev_con;
33 static uintptr_t uniphier_backend_dev_handle;
34 
35 static io_block_spec_t uniphier_fip_spec = {
36 	/* .offset will be set by the io_setup func */
37 	.length = 0x00200000,
38 };
39 
40 static const io_uuid_spec_t uniphier_bl2_spec = {
41 	.uuid = UUID_TRUSTED_BOOT_FIRMWARE_BL2,
42 };
43 
44 static const io_uuid_spec_t uniphier_scp_spec = {
45 	.uuid = UUID_SCP_FIRMWARE_SCP_BL2,
46 };
47 
48 static const io_uuid_spec_t uniphier_bl31_spec = {
49 	.uuid = UUID_EL3_RUNTIME_FIRMWARE_BL31,
50 };
51 
52 static const io_uuid_spec_t uniphier_bl32_spec = {
53 	.uuid = UUID_SECURE_PAYLOAD_BL32,
54 };
55 
56 static const io_uuid_spec_t uniphier_bl33_spec = {
57 	.uuid = UUID_NON_TRUSTED_FIRMWARE_BL33,
58 };
59 
60 #if TRUSTED_BOARD_BOOT
61 static const io_uuid_spec_t uniphier_tb_fw_cert_spec = {
62 	.uuid = UUID_TRUSTED_BOOT_FW_CERT,
63 };
64 
65 static const io_uuid_spec_t uniphier_trusted_key_cert_spec = {
66 	.uuid = UUID_TRUSTED_KEY_CERT,
67 };
68 
69 static const io_uuid_spec_t uniphier_scp_fw_key_cert_spec = {
70 	.uuid = UUID_SCP_FW_KEY_CERT,
71 };
72 
73 static const io_uuid_spec_t uniphier_soc_fw_key_cert_spec = {
74 	.uuid = UUID_SOC_FW_KEY_CERT,
75 };
76 
77 static const io_uuid_spec_t uniphier_tos_fw_key_cert_spec = {
78 	.uuid = UUID_TRUSTED_OS_FW_KEY_CERT,
79 };
80 
81 static const io_uuid_spec_t uniphier_nt_fw_key_cert_spec = {
82 	.uuid = UUID_NON_TRUSTED_FW_KEY_CERT,
83 };
84 
85 static const io_uuid_spec_t uniphier_scp_fw_cert_spec = {
86 	.uuid = UUID_SCP_FW_CONTENT_CERT,
87 };
88 
89 static const io_uuid_spec_t uniphier_soc_fw_cert_spec = {
90 	.uuid = UUID_SOC_FW_CONTENT_CERT,
91 };
92 
93 static const io_uuid_spec_t uniphier_tos_fw_cert_spec = {
94 	.uuid = UUID_TRUSTED_OS_FW_CONTENT_CERT,
95 };
96 
97 static 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 
102 struct uniphier_io_policy {
103 	uintptr_t *dev_handle;
104 	uintptr_t image_spec;
105 	uintptr_t init_params;
106 };
107 
108 static 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 
192 static 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 
198 	ret = register_io_dev_block(&uniphier_backend_dev_con);
199 	if (ret)
200 		return ret;
201 
202 	return io_dev_open(uniphier_backend_dev_con, block_dev_spec,
203 			   &uniphier_backend_dev_handle);
204 }
205 
206 static int uniphier_io_memmap_setup(size_t fip_offset)
207 {
208 	int ret;
209 
210 	uniphier_fip_spec.offset = fip_offset;
211 
212 	ret = mmap_add_dynamic_region(fip_offset, fip_offset,
213 				      uniphier_fip_spec.length,
214 				      MT_RO_DATA | MT_SECURE);
215 	if (ret)
216 		return ret;
217 
218 	ret = register_io_dev_memmap(&uniphier_backend_dev_con);
219 	if (ret)
220 		return ret;
221 
222 	return io_dev_open(uniphier_backend_dev_con, 0,
223 			   &uniphier_backend_dev_handle);
224 }
225 
226 static int uniphier_io_fip_setup(void)
227 {
228 	int ret;
229 
230 	ret = register_io_dev_fip(&uniphier_fip_dev_con);
231 	if (ret)
232 		return ret;
233 
234 	return io_dev_open(uniphier_fip_dev_con, 0, &uniphier_fip_dev_handle);
235 }
236 
237 static int uniphier_io_emmc_setup(unsigned int soc_id)
238 {
239 	uintptr_t block_dev_spec;
240 	int ret;
241 
242 	ret = uniphier_emmc_init(&block_dev_spec);
243 	if (ret)
244 		return ret;
245 
246 	return uniphier_io_block_setup(0x20000, block_dev_spec);
247 }
248 
249 static int uniphier_io_nand_setup(unsigned int soc_id)
250 {
251 	uintptr_t block_dev_spec;
252 	int ret;
253 
254 	ret = uniphier_nand_init(&block_dev_spec);
255 	if (ret)
256 		return ret;
257 
258 	return uniphier_io_block_setup(0x20000, block_dev_spec);
259 }
260 
261 static int uniphier_io_nor_setup(unsigned int soc_id)
262 {
263 	return uniphier_io_memmap_setup(0x70000);
264 }
265 
266 static int uniphier_io_usb_setup(unsigned int soc_id)
267 {
268 	uintptr_t block_dev_spec;
269 	int ret;
270 
271 	/* use ROM API for loading images from USB storage */
272 	ret = mmap_add_dynamic_region(UNIPHIER_ROM_REGION_BASE,
273 				      UNIPHIER_ROM_REGION_BASE,
274 				      UNIPHIER_ROM_REGION_SIZE,
275 				      MT_CODE | MT_SECURE);
276 	if (ret)
277 		return ret;
278 
279 	/*
280 	 * on-chip SRAM region: should be DEVICE attribute because the USB
281 	 * load functions provided by the ROM use this memory region as a work
282 	 * area, but do not cater to cache coherency.
283 	 */
284 	ret = mmap_add_dynamic_region(UNIPHIER_OCM_REGION_BASE,
285 				      UNIPHIER_OCM_REGION_BASE,
286 				      UNIPHIER_OCM_REGION_SIZE,
287 				      MT_DEVICE | MT_RW | MT_SECURE);
288 	if (ret)
289 		return ret;
290 
291 	ret = uniphier_usb_init(soc_id, &block_dev_spec);
292 	if (ret)
293 		return ret;
294 
295 	return uniphier_io_block_setup(0x20000, block_dev_spec);
296 }
297 
298 static int (* const uniphier_io_setup_table[])(unsigned int) = {
299 	[UNIPHIER_BOOT_DEVICE_EMMC] = uniphier_io_emmc_setup,
300 	[UNIPHIER_BOOT_DEVICE_NAND] = uniphier_io_nand_setup,
301 	[UNIPHIER_BOOT_DEVICE_NOR] = uniphier_io_nor_setup,
302 	[UNIPHIER_BOOT_DEVICE_USB] = uniphier_io_usb_setup,
303 };
304 
305 int uniphier_io_setup(unsigned int soc_id)
306 {
307 	int (*io_setup)(unsigned int soc_id);
308 	unsigned int boot_dev;
309 	int ret;
310 
311 	boot_dev = uniphier_get_boot_device(soc_id);
312 	if (boot_dev == UNIPHIER_BOOT_DEVICE_RSV)
313 		return -EINVAL;
314 
315 	io_setup = uniphier_io_setup_table[boot_dev];
316 	ret = io_setup(soc_id);
317 	if (ret)
318 		return ret;
319 
320 	ret = uniphier_io_fip_setup();
321 	if (ret)
322 		return ret;
323 
324 	return 0;
325 }
326 
327 int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
328 			  uintptr_t *image_spec)
329 {
330 	uintptr_t init_params;
331 
332 	assert(image_id < ARRAY_SIZE(uniphier_io_policies));
333 
334 	*dev_handle = *(uniphier_io_policies[image_id].dev_handle);
335 	*image_spec = uniphier_io_policies[image_id].image_spec;
336 	init_params = uniphier_io_policies[image_id].init_params;
337 
338 	return io_dev_init(*dev_handle, init_params);
339 }
340