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