1*717448d6SSheetal Tigadoli /*
2*717448d6SSheetal Tigadoli * Copyright (c) 2019-2020, ARM Limited and Contributors. All rights reserved.
3*717448d6SSheetal Tigadoli *
4*717448d6SSheetal Tigadoli * SPDX-License-Identifier: BSD-3-Clause
5*717448d6SSheetal Tigadoli */
6*717448d6SSheetal Tigadoli
7*717448d6SSheetal Tigadoli #include <assert.h>
8*717448d6SSheetal Tigadoli #include <string.h>
9*717448d6SSheetal Tigadoli
10*717448d6SSheetal Tigadoli #include <common/debug.h>
11*717448d6SSheetal Tigadoli #include <drivers/io/io_driver.h>
12*717448d6SSheetal Tigadoli #include <drivers/io/io_fip.h>
13*717448d6SSheetal Tigadoli #include <drivers/io/io_memmap.h>
14*717448d6SSheetal Tigadoli #include <drivers/io/io_storage.h>
15*717448d6SSheetal Tigadoli #include <tools_share/firmware_image_package.h>
16*717448d6SSheetal Tigadoli
17*717448d6SSheetal Tigadoli #include <cmn_plat_def.h>
18*717448d6SSheetal Tigadoli #include <cmn_plat_util.h>
19*717448d6SSheetal Tigadoli #include <plat_brcm.h>
20*717448d6SSheetal Tigadoli #include <platform_def.h>
21*717448d6SSheetal Tigadoli
22*717448d6SSheetal Tigadoli /* IO devices */
23*717448d6SSheetal Tigadoli static const io_dev_connector_t *fip_dev_con;
24*717448d6SSheetal Tigadoli static uintptr_t fip_dev_handle;
25*717448d6SSheetal Tigadoli static const io_dev_connector_t *memmap_dev_con;
26*717448d6SSheetal Tigadoli static uintptr_t memmap_dev_handle;
27*717448d6SSheetal Tigadoli
28*717448d6SSheetal Tigadoli static const io_block_spec_t fip_block_spec = {
29*717448d6SSheetal Tigadoli .offset = PLAT_BRCM_FIP_BASE,
30*717448d6SSheetal Tigadoli .length = PLAT_BRCM_FIP_MAX_SIZE
31*717448d6SSheetal Tigadoli };
32*717448d6SSheetal Tigadoli
33*717448d6SSheetal Tigadoli static const io_block_spec_t qspi_fip_block_spec = {
34*717448d6SSheetal Tigadoli .offset = PLAT_BRCM_FIP_QSPI_BASE,
35*717448d6SSheetal Tigadoli .length = PLAT_BRCM_FIP_MAX_SIZE
36*717448d6SSheetal Tigadoli };
37*717448d6SSheetal Tigadoli
38*717448d6SSheetal Tigadoli static const io_block_spec_t nand_fip_block_spec = {
39*717448d6SSheetal Tigadoli .offset = PLAT_BRCM_FIP_NAND_BASE,
40*717448d6SSheetal Tigadoli .length = PLAT_BRCM_FIP_MAX_SIZE
41*717448d6SSheetal Tigadoli };
42*717448d6SSheetal Tigadoli
43*717448d6SSheetal Tigadoli static const io_uuid_spec_t bl2_uuid_spec = {
44*717448d6SSheetal Tigadoli .uuid = UUID_TRUSTED_BOOT_FIRMWARE_BL2,
45*717448d6SSheetal Tigadoli };
46*717448d6SSheetal Tigadoli
47*717448d6SSheetal Tigadoli static const io_uuid_spec_t scp_bl2_uuid_spec = {
48*717448d6SSheetal Tigadoli .uuid = UUID_SCP_FIRMWARE_SCP_BL2,
49*717448d6SSheetal Tigadoli };
50*717448d6SSheetal Tigadoli
51*717448d6SSheetal Tigadoli static const io_uuid_spec_t bl31_uuid_spec = {
52*717448d6SSheetal Tigadoli .uuid = UUID_EL3_RUNTIME_FIRMWARE_BL31,
53*717448d6SSheetal Tigadoli };
54*717448d6SSheetal Tigadoli
55*717448d6SSheetal Tigadoli static const io_uuid_spec_t bl32_uuid_spec = {
56*717448d6SSheetal Tigadoli .uuid = UUID_SECURE_PAYLOAD_BL32,
57*717448d6SSheetal Tigadoli };
58*717448d6SSheetal Tigadoli
59*717448d6SSheetal Tigadoli static const io_uuid_spec_t bl32_extra1_uuid_spec = {
60*717448d6SSheetal Tigadoli .uuid = UUID_SECURE_PAYLOAD_BL32_EXTRA1,
61*717448d6SSheetal Tigadoli };
62*717448d6SSheetal Tigadoli
63*717448d6SSheetal Tigadoli static const io_uuid_spec_t bl32_extra2_uuid_spec = {
64*717448d6SSheetal Tigadoli .uuid = UUID_SECURE_PAYLOAD_BL32_EXTRA2,
65*717448d6SSheetal Tigadoli };
66*717448d6SSheetal Tigadoli
67*717448d6SSheetal Tigadoli static const io_uuid_spec_t bl33_uuid_spec = {
68*717448d6SSheetal Tigadoli .uuid = UUID_NON_TRUSTED_FIRMWARE_BL33,
69*717448d6SSheetal Tigadoli };
70*717448d6SSheetal Tigadoli
71*717448d6SSheetal Tigadoli static const io_uuid_spec_t tb_fw_config_uuid_spec = {
72*717448d6SSheetal Tigadoli .uuid = UUID_TB_FW_CONFIG,
73*717448d6SSheetal Tigadoli };
74*717448d6SSheetal Tigadoli
75*717448d6SSheetal Tigadoli static const io_uuid_spec_t hw_config_uuid_spec = {
76*717448d6SSheetal Tigadoli .uuid = UUID_HW_CONFIG,
77*717448d6SSheetal Tigadoli };
78*717448d6SSheetal Tigadoli
79*717448d6SSheetal Tigadoli static const io_uuid_spec_t soc_fw_config_uuid_spec = {
80*717448d6SSheetal Tigadoli .uuid = UUID_SOC_FW_CONFIG,
81*717448d6SSheetal Tigadoli };
82*717448d6SSheetal Tigadoli
83*717448d6SSheetal Tigadoli static const io_uuid_spec_t tos_fw_config_uuid_spec = {
84*717448d6SSheetal Tigadoli .uuid = UUID_TOS_FW_CONFIG,
85*717448d6SSheetal Tigadoli };
86*717448d6SSheetal Tigadoli
87*717448d6SSheetal Tigadoli static const io_uuid_spec_t nt_fw_config_uuid_spec = {
88*717448d6SSheetal Tigadoli .uuid = UUID_NT_FW_CONFIG,
89*717448d6SSheetal Tigadoli };
90*717448d6SSheetal Tigadoli
91*717448d6SSheetal Tigadoli #if TRUSTED_BOARD_BOOT
92*717448d6SSheetal Tigadoli static const io_uuid_spec_t tb_fw_cert_uuid_spec = {
93*717448d6SSheetal Tigadoli .uuid = UUID_TRUSTED_BOOT_FW_CERT,
94*717448d6SSheetal Tigadoli };
95*717448d6SSheetal Tigadoli
96*717448d6SSheetal Tigadoli static const io_uuid_spec_t trusted_key_cert_uuid_spec = {
97*717448d6SSheetal Tigadoli .uuid = UUID_TRUSTED_KEY_CERT,
98*717448d6SSheetal Tigadoli };
99*717448d6SSheetal Tigadoli
100*717448d6SSheetal Tigadoli static const io_uuid_spec_t scp_fw_key_cert_uuid_spec = {
101*717448d6SSheetal Tigadoli .uuid = UUID_SCP_FW_KEY_CERT,
102*717448d6SSheetal Tigadoli };
103*717448d6SSheetal Tigadoli
104*717448d6SSheetal Tigadoli static const io_uuid_spec_t soc_fw_key_cert_uuid_spec = {
105*717448d6SSheetal Tigadoli .uuid = UUID_SOC_FW_KEY_CERT,
106*717448d6SSheetal Tigadoli };
107*717448d6SSheetal Tigadoli
108*717448d6SSheetal Tigadoli static const io_uuid_spec_t tos_fw_key_cert_uuid_spec = {
109*717448d6SSheetal Tigadoli .uuid = UUID_TRUSTED_OS_FW_KEY_CERT,
110*717448d6SSheetal Tigadoli };
111*717448d6SSheetal Tigadoli
112*717448d6SSheetal Tigadoli static const io_uuid_spec_t nt_fw_key_cert_uuid_spec = {
113*717448d6SSheetal Tigadoli .uuid = UUID_NON_TRUSTED_FW_KEY_CERT,
114*717448d6SSheetal Tigadoli };
115*717448d6SSheetal Tigadoli
116*717448d6SSheetal Tigadoli static const io_uuid_spec_t scp_fw_cert_uuid_spec = {
117*717448d6SSheetal Tigadoli .uuid = UUID_SCP_FW_CONTENT_CERT,
118*717448d6SSheetal Tigadoli };
119*717448d6SSheetal Tigadoli
120*717448d6SSheetal Tigadoli static const io_uuid_spec_t soc_fw_cert_uuid_spec = {
121*717448d6SSheetal Tigadoli .uuid = UUID_SOC_FW_CONTENT_CERT,
122*717448d6SSheetal Tigadoli };
123*717448d6SSheetal Tigadoli
124*717448d6SSheetal Tigadoli static const io_uuid_spec_t tos_fw_cert_uuid_spec = {
125*717448d6SSheetal Tigadoli .uuid = UUID_TRUSTED_OS_FW_CONTENT_CERT,
126*717448d6SSheetal Tigadoli };
127*717448d6SSheetal Tigadoli
128*717448d6SSheetal Tigadoli static const io_uuid_spec_t nt_fw_cert_uuid_spec = {
129*717448d6SSheetal Tigadoli .uuid = UUID_NON_TRUSTED_FW_CONTENT_CERT,
130*717448d6SSheetal Tigadoli };
131*717448d6SSheetal Tigadoli #endif /* TRUSTED_BOARD_BOOT */
132*717448d6SSheetal Tigadoli
133*717448d6SSheetal Tigadoli static int open_fip(const uintptr_t spec);
134*717448d6SSheetal Tigadoli static int open_memmap(const uintptr_t spec);
135*717448d6SSheetal Tigadoli static int open_qspi(const uintptr_t spec);
136*717448d6SSheetal Tigadoli static int open_nand(const uintptr_t spec);
137*717448d6SSheetal Tigadoli
138*717448d6SSheetal Tigadoli struct plat_io_policy {
139*717448d6SSheetal Tigadoli uintptr_t *dev_handle;
140*717448d6SSheetal Tigadoli uintptr_t image_spec;
141*717448d6SSheetal Tigadoli int (*check)(const uintptr_t spec);
142*717448d6SSheetal Tigadoli };
143*717448d6SSheetal Tigadoli
144*717448d6SSheetal Tigadoli /* By default, BRCM platforms load images from the FIP */
145*717448d6SSheetal Tigadoli static const struct plat_io_policy policies[] = {
146*717448d6SSheetal Tigadoli [FIP_IMAGE_ID] = {
147*717448d6SSheetal Tigadoli &memmap_dev_handle,
148*717448d6SSheetal Tigadoli (uintptr_t)&fip_block_spec,
149*717448d6SSheetal Tigadoli open_memmap
150*717448d6SSheetal Tigadoli },
151*717448d6SSheetal Tigadoli [BL2_IMAGE_ID] = {
152*717448d6SSheetal Tigadoli &fip_dev_handle,
153*717448d6SSheetal Tigadoli (uintptr_t)&bl2_uuid_spec,
154*717448d6SSheetal Tigadoli open_fip
155*717448d6SSheetal Tigadoli },
156*717448d6SSheetal Tigadoli [SCP_BL2_IMAGE_ID] = {
157*717448d6SSheetal Tigadoli &fip_dev_handle,
158*717448d6SSheetal Tigadoli (uintptr_t)&scp_bl2_uuid_spec,
159*717448d6SSheetal Tigadoli open_fip
160*717448d6SSheetal Tigadoli },
161*717448d6SSheetal Tigadoli [BL31_IMAGE_ID] = {
162*717448d6SSheetal Tigadoli &fip_dev_handle,
163*717448d6SSheetal Tigadoli (uintptr_t)&bl31_uuid_spec,
164*717448d6SSheetal Tigadoli open_fip
165*717448d6SSheetal Tigadoli },
166*717448d6SSheetal Tigadoli [BL32_IMAGE_ID] = {
167*717448d6SSheetal Tigadoli &fip_dev_handle,
168*717448d6SSheetal Tigadoli (uintptr_t)&bl32_uuid_spec,
169*717448d6SSheetal Tigadoli open_fip
170*717448d6SSheetal Tigadoli },
171*717448d6SSheetal Tigadoli [BL32_EXTRA1_IMAGE_ID] = {
172*717448d6SSheetal Tigadoli &fip_dev_handle,
173*717448d6SSheetal Tigadoli (uintptr_t)&bl32_extra1_uuid_spec,
174*717448d6SSheetal Tigadoli open_fip
175*717448d6SSheetal Tigadoli },
176*717448d6SSheetal Tigadoli [BL32_EXTRA2_IMAGE_ID] = {
177*717448d6SSheetal Tigadoli &fip_dev_handle,
178*717448d6SSheetal Tigadoli (uintptr_t)&bl32_extra2_uuid_spec,
179*717448d6SSheetal Tigadoli open_fip
180*717448d6SSheetal Tigadoli },
181*717448d6SSheetal Tigadoli [BL33_IMAGE_ID] = {
182*717448d6SSheetal Tigadoli &fip_dev_handle,
183*717448d6SSheetal Tigadoli (uintptr_t)&bl33_uuid_spec,
184*717448d6SSheetal Tigadoli open_fip
185*717448d6SSheetal Tigadoli },
186*717448d6SSheetal Tigadoli [TB_FW_CONFIG_ID] = {
187*717448d6SSheetal Tigadoli &fip_dev_handle,
188*717448d6SSheetal Tigadoli (uintptr_t)&tb_fw_config_uuid_spec,
189*717448d6SSheetal Tigadoli open_fip
190*717448d6SSheetal Tigadoli },
191*717448d6SSheetal Tigadoli [HW_CONFIG_ID] = {
192*717448d6SSheetal Tigadoli &fip_dev_handle,
193*717448d6SSheetal Tigadoli (uintptr_t)&hw_config_uuid_spec,
194*717448d6SSheetal Tigadoli open_fip
195*717448d6SSheetal Tigadoli },
196*717448d6SSheetal Tigadoli [SOC_FW_CONFIG_ID] = {
197*717448d6SSheetal Tigadoli &fip_dev_handle,
198*717448d6SSheetal Tigadoli (uintptr_t)&soc_fw_config_uuid_spec,
199*717448d6SSheetal Tigadoli open_fip
200*717448d6SSheetal Tigadoli },
201*717448d6SSheetal Tigadoli [TOS_FW_CONFIG_ID] = {
202*717448d6SSheetal Tigadoli &fip_dev_handle,
203*717448d6SSheetal Tigadoli (uintptr_t)&tos_fw_config_uuid_spec,
204*717448d6SSheetal Tigadoli open_fip
205*717448d6SSheetal Tigadoli },
206*717448d6SSheetal Tigadoli [NT_FW_CONFIG_ID] = {
207*717448d6SSheetal Tigadoli &fip_dev_handle,
208*717448d6SSheetal Tigadoli (uintptr_t)&nt_fw_config_uuid_spec,
209*717448d6SSheetal Tigadoli open_fip
210*717448d6SSheetal Tigadoli },
211*717448d6SSheetal Tigadoli #if TRUSTED_BOARD_BOOT
212*717448d6SSheetal Tigadoli [TRUSTED_BOOT_FW_CERT_ID] = {
213*717448d6SSheetal Tigadoli &fip_dev_handle,
214*717448d6SSheetal Tigadoli (uintptr_t)&tb_fw_cert_uuid_spec,
215*717448d6SSheetal Tigadoli open_fip
216*717448d6SSheetal Tigadoli },
217*717448d6SSheetal Tigadoli [TRUSTED_KEY_CERT_ID] = {
218*717448d6SSheetal Tigadoli &fip_dev_handle,
219*717448d6SSheetal Tigadoli (uintptr_t)&trusted_key_cert_uuid_spec,
220*717448d6SSheetal Tigadoli open_fip
221*717448d6SSheetal Tigadoli },
222*717448d6SSheetal Tigadoli [SCP_FW_KEY_CERT_ID] = {
223*717448d6SSheetal Tigadoli &fip_dev_handle,
224*717448d6SSheetal Tigadoli (uintptr_t)&scp_fw_key_cert_uuid_spec,
225*717448d6SSheetal Tigadoli open_fip
226*717448d6SSheetal Tigadoli },
227*717448d6SSheetal Tigadoli [SOC_FW_KEY_CERT_ID] = {
228*717448d6SSheetal Tigadoli &fip_dev_handle,
229*717448d6SSheetal Tigadoli (uintptr_t)&soc_fw_key_cert_uuid_spec,
230*717448d6SSheetal Tigadoli open_fip
231*717448d6SSheetal Tigadoli },
232*717448d6SSheetal Tigadoli [TRUSTED_OS_FW_KEY_CERT_ID] = {
233*717448d6SSheetal Tigadoli &fip_dev_handle,
234*717448d6SSheetal Tigadoli (uintptr_t)&tos_fw_key_cert_uuid_spec,
235*717448d6SSheetal Tigadoli open_fip
236*717448d6SSheetal Tigadoli },
237*717448d6SSheetal Tigadoli [NON_TRUSTED_FW_KEY_CERT_ID] = {
238*717448d6SSheetal Tigadoli &fip_dev_handle,
239*717448d6SSheetal Tigadoli (uintptr_t)&nt_fw_key_cert_uuid_spec,
240*717448d6SSheetal Tigadoli open_fip
241*717448d6SSheetal Tigadoli },
242*717448d6SSheetal Tigadoli [SCP_FW_CONTENT_CERT_ID] = {
243*717448d6SSheetal Tigadoli &fip_dev_handle,
244*717448d6SSheetal Tigadoli (uintptr_t)&scp_fw_cert_uuid_spec,
245*717448d6SSheetal Tigadoli open_fip
246*717448d6SSheetal Tigadoli },
247*717448d6SSheetal Tigadoli [SOC_FW_CONTENT_CERT_ID] = {
248*717448d6SSheetal Tigadoli &fip_dev_handle,
249*717448d6SSheetal Tigadoli (uintptr_t)&soc_fw_cert_uuid_spec,
250*717448d6SSheetal Tigadoli open_fip
251*717448d6SSheetal Tigadoli },
252*717448d6SSheetal Tigadoli [TRUSTED_OS_FW_CONTENT_CERT_ID] = {
253*717448d6SSheetal Tigadoli &fip_dev_handle,
254*717448d6SSheetal Tigadoli (uintptr_t)&tos_fw_cert_uuid_spec,
255*717448d6SSheetal Tigadoli open_fip
256*717448d6SSheetal Tigadoli },
257*717448d6SSheetal Tigadoli [NON_TRUSTED_FW_CONTENT_CERT_ID] = {
258*717448d6SSheetal Tigadoli &fip_dev_handle,
259*717448d6SSheetal Tigadoli (uintptr_t)&nt_fw_cert_uuid_spec,
260*717448d6SSheetal Tigadoli open_fip
261*717448d6SSheetal Tigadoli },
262*717448d6SSheetal Tigadoli #endif /* TRUSTED_BOARD_BOOT */
263*717448d6SSheetal Tigadoli };
264*717448d6SSheetal Tigadoli
265*717448d6SSheetal Tigadoli /* By default, BRCM platforms load images from the FIP */
266*717448d6SSheetal Tigadoli static const struct plat_io_policy boot_source_policies[] = {
267*717448d6SSheetal Tigadoli [BOOT_SOURCE_QSPI] = {
268*717448d6SSheetal Tigadoli &memmap_dev_handle,
269*717448d6SSheetal Tigadoli (uintptr_t)&qspi_fip_block_spec,
270*717448d6SSheetal Tigadoli open_qspi
271*717448d6SSheetal Tigadoli },
272*717448d6SSheetal Tigadoli [BOOT_SOURCE_NAND] = {
273*717448d6SSheetal Tigadoli &memmap_dev_handle,
274*717448d6SSheetal Tigadoli (uintptr_t)&nand_fip_block_spec,
275*717448d6SSheetal Tigadoli open_nand
276*717448d6SSheetal Tigadoli },
277*717448d6SSheetal Tigadoli };
278*717448d6SSheetal Tigadoli
279*717448d6SSheetal Tigadoli /* Weak definitions may be overridden in specific brcm platform */
280*717448d6SSheetal Tigadoli #pragma weak plat_brcm_io_setup
281*717448d6SSheetal Tigadoli #pragma weak plat_brcm_process_flags
282*717448d6SSheetal Tigadoli
open_fip(const uintptr_t spec)283*717448d6SSheetal Tigadoli static int open_fip(const uintptr_t spec)
284*717448d6SSheetal Tigadoli {
285*717448d6SSheetal Tigadoli int result;
286*717448d6SSheetal Tigadoli uintptr_t local_image_handle;
287*717448d6SSheetal Tigadoli
288*717448d6SSheetal Tigadoli /* See if a Firmware Image Package is available */
289*717448d6SSheetal Tigadoli result = io_dev_init(fip_dev_handle, (uintptr_t)FIP_IMAGE_ID);
290*717448d6SSheetal Tigadoli if (result == 0) {
291*717448d6SSheetal Tigadoli result = io_open(fip_dev_handle, spec, &local_image_handle);
292*717448d6SSheetal Tigadoli if (result == 0) {
293*717448d6SSheetal Tigadoli VERBOSE("Using FIP\n");
294*717448d6SSheetal Tigadoli io_close(local_image_handle);
295*717448d6SSheetal Tigadoli }
296*717448d6SSheetal Tigadoli }
297*717448d6SSheetal Tigadoli return result;
298*717448d6SSheetal Tigadoli }
299*717448d6SSheetal Tigadoli
300*717448d6SSheetal Tigadoli
open_memmap(const uintptr_t spec)301*717448d6SSheetal Tigadoli static int open_memmap(const uintptr_t spec)
302*717448d6SSheetal Tigadoli {
303*717448d6SSheetal Tigadoli int result;
304*717448d6SSheetal Tigadoli uintptr_t local_image_handle;
305*717448d6SSheetal Tigadoli
306*717448d6SSheetal Tigadoli result = io_dev_init(memmap_dev_handle, (uintptr_t)NULL);
307*717448d6SSheetal Tigadoli if (result == 0) {
308*717448d6SSheetal Tigadoli result = io_open(memmap_dev_handle, spec, &local_image_handle);
309*717448d6SSheetal Tigadoli if (result == 0) {
310*717448d6SSheetal Tigadoli VERBOSE("Using Memmap\n");
311*717448d6SSheetal Tigadoli io_close(local_image_handle);
312*717448d6SSheetal Tigadoli }
313*717448d6SSheetal Tigadoli }
314*717448d6SSheetal Tigadoli return result;
315*717448d6SSheetal Tigadoli }
316*717448d6SSheetal Tigadoli
open_qspi(const uintptr_t spec)317*717448d6SSheetal Tigadoli static int open_qspi(const uintptr_t spec)
318*717448d6SSheetal Tigadoli {
319*717448d6SSheetal Tigadoli return open_memmap(spec);
320*717448d6SSheetal Tigadoli }
321*717448d6SSheetal Tigadoli
open_nand(const uintptr_t spec)322*717448d6SSheetal Tigadoli static int open_nand(const uintptr_t spec)
323*717448d6SSheetal Tigadoli {
324*717448d6SSheetal Tigadoli return open_memmap(spec);
325*717448d6SSheetal Tigadoli }
326*717448d6SSheetal Tigadoli
327*717448d6SSheetal Tigadoli
brcm_io_setup(void)328*717448d6SSheetal Tigadoli void brcm_io_setup(void)
329*717448d6SSheetal Tigadoli {
330*717448d6SSheetal Tigadoli int io_result;
331*717448d6SSheetal Tigadoli uint32_t boot_source;
332*717448d6SSheetal Tigadoli
333*717448d6SSheetal Tigadoli io_result = register_io_dev_fip(&fip_dev_con);
334*717448d6SSheetal Tigadoli assert(io_result == 0);
335*717448d6SSheetal Tigadoli
336*717448d6SSheetal Tigadoli io_result = register_io_dev_memmap(&memmap_dev_con);
337*717448d6SSheetal Tigadoli assert(io_result == 0);
338*717448d6SSheetal Tigadoli
339*717448d6SSheetal Tigadoli /* Open connections to devices and cache the handles */
340*717448d6SSheetal Tigadoli io_result = io_dev_open(fip_dev_con, (uintptr_t)NULL,
341*717448d6SSheetal Tigadoli &fip_dev_handle);
342*717448d6SSheetal Tigadoli assert(io_result == 0);
343*717448d6SSheetal Tigadoli
344*717448d6SSheetal Tigadoli boot_source = boot_source_get();
345*717448d6SSheetal Tigadoli switch (boot_source) {
346*717448d6SSheetal Tigadoli case BOOT_SOURCE_QSPI:
347*717448d6SSheetal Tigadoli case BOOT_SOURCE_NAND:
348*717448d6SSheetal Tigadoli default:
349*717448d6SSheetal Tigadoli io_result = io_dev_open(memmap_dev_con, (uintptr_t)NULL,
350*717448d6SSheetal Tigadoli &memmap_dev_handle);
351*717448d6SSheetal Tigadoli break;
352*717448d6SSheetal Tigadoli }
353*717448d6SSheetal Tigadoli assert(io_result == 0);
354*717448d6SSheetal Tigadoli
355*717448d6SSheetal Tigadoli /* Ignore improbable errors in release builds */
356*717448d6SSheetal Tigadoli (void)io_result;
357*717448d6SSheetal Tigadoli }
358*717448d6SSheetal Tigadoli
plat_brcm_io_setup(void)359*717448d6SSheetal Tigadoli void plat_brcm_io_setup(void)
360*717448d6SSheetal Tigadoli {
361*717448d6SSheetal Tigadoli brcm_io_setup();
362*717448d6SSheetal Tigadoli }
363*717448d6SSheetal Tigadoli
plat_brcm_process_flags(uint16_t plat_toc_flags __unused)364*717448d6SSheetal Tigadoli void plat_brcm_process_flags(uint16_t plat_toc_flags __unused)
365*717448d6SSheetal Tigadoli {
366*717448d6SSheetal Tigadoli WARN("%s not implemented\n", __func__);
367*717448d6SSheetal Tigadoli }
368*717448d6SSheetal Tigadoli
369*717448d6SSheetal Tigadoli /*
370*717448d6SSheetal Tigadoli * Return an IO device handle and specification which can be used to access
371*717448d6SSheetal Tigadoli * an image. Use this to enforce platform load policy
372*717448d6SSheetal Tigadoli */
plat_get_image_source(unsigned int image_id,uintptr_t * dev_handle,uintptr_t * image_spec)373*717448d6SSheetal Tigadoli int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
374*717448d6SSheetal Tigadoli uintptr_t *image_spec)
375*717448d6SSheetal Tigadoli {
376*717448d6SSheetal Tigadoli int result;
377*717448d6SSheetal Tigadoli const struct plat_io_policy *policy;
378*717448d6SSheetal Tigadoli uint32_t boot_source;
379*717448d6SSheetal Tigadoli uint16_t lcl_plat_toc_flg;
380*717448d6SSheetal Tigadoli
381*717448d6SSheetal Tigadoli assert(image_id < ARRAY_SIZE(policies));
382*717448d6SSheetal Tigadoli
383*717448d6SSheetal Tigadoli boot_source = boot_source_get();
384*717448d6SSheetal Tigadoli if (image_id == FIP_IMAGE_ID)
385*717448d6SSheetal Tigadoli policy = &boot_source_policies[boot_source];
386*717448d6SSheetal Tigadoli else
387*717448d6SSheetal Tigadoli policy = &policies[image_id];
388*717448d6SSheetal Tigadoli
389*717448d6SSheetal Tigadoli result = policy->check(policy->image_spec);
390*717448d6SSheetal Tigadoli if (result == 0) {
391*717448d6SSheetal Tigadoli *image_spec = policy->image_spec;
392*717448d6SSheetal Tigadoli *dev_handle = *(policy->dev_handle);
393*717448d6SSheetal Tigadoli
394*717448d6SSheetal Tigadoli if (image_id == TRUSTED_BOOT_FW_CERT_ID) {
395*717448d6SSheetal Tigadoli /*
396*717448d6SSheetal Tigadoli * Process the header flags to perform
397*717448d6SSheetal Tigadoli * such custom actions as speeding up PLL.
398*717448d6SSheetal Tigadoli * CERT seems to be the first image accessed
399*717448d6SSheetal Tigadoli * by BL1 so this is where we process the flags.
400*717448d6SSheetal Tigadoli */
401*717448d6SSheetal Tigadoli fip_dev_get_plat_toc_flag((io_dev_info_t *)fip_dev_handle,
402*717448d6SSheetal Tigadoli &lcl_plat_toc_flg);
403*717448d6SSheetal Tigadoli plat_brcm_process_flags(lcl_plat_toc_flg);
404*717448d6SSheetal Tigadoli }
405*717448d6SSheetal Tigadoli }
406*717448d6SSheetal Tigadoli
407*717448d6SSheetal Tigadoli return result;
408*717448d6SSheetal Tigadoli }
409