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