1*81d1d86cSYing-Chun Liu (PaulLiu) /*
2*81d1d86cSYing-Chun Liu (PaulLiu) * Copyright (c) 2021, ARM Limited and Contributors. All rights reserved.
3*81d1d86cSYing-Chun Liu (PaulLiu) *
4*81d1d86cSYing-Chun Liu (PaulLiu) * SPDX-License-Identifier: BSD-3-Clause
5*81d1d86cSYing-Chun Liu (PaulLiu) */
6*81d1d86cSYing-Chun Liu (PaulLiu)
7*81d1d86cSYing-Chun Liu (PaulLiu) #include <assert.h>
8*81d1d86cSYing-Chun Liu (PaulLiu)
9*81d1d86cSYing-Chun Liu (PaulLiu) #include <common/debug.h>
10*81d1d86cSYing-Chun Liu (PaulLiu) #include <drivers/io/io_block.h>
11*81d1d86cSYing-Chun Liu (PaulLiu) #include <drivers/io/io_driver.h>
12*81d1d86cSYing-Chun Liu (PaulLiu) #include <drivers/io/io_fip.h>
13*81d1d86cSYing-Chun Liu (PaulLiu) #include <drivers/io/io_memmap.h>
14*81d1d86cSYing-Chun Liu (PaulLiu) #include <drivers/mmc.h>
15*81d1d86cSYing-Chun Liu (PaulLiu) #include <lib/utils_def.h>
16*81d1d86cSYing-Chun Liu (PaulLiu) #include <tbbr_img_def.h>
17*81d1d86cSYing-Chun Liu (PaulLiu) #include <tools_share/firmware_image_package.h>
18*81d1d86cSYing-Chun Liu (PaulLiu)
19*81d1d86cSYing-Chun Liu (PaulLiu) #include <platform_def.h>
20*81d1d86cSYing-Chun Liu (PaulLiu)
21*81d1d86cSYing-Chun Liu (PaulLiu) static const io_dev_connector_t *fip_dev_con;
22*81d1d86cSYing-Chun Liu (PaulLiu) static uintptr_t fip_dev_handle;
23*81d1d86cSYing-Chun Liu (PaulLiu)
24*81d1d86cSYing-Chun Liu (PaulLiu) #ifndef IMX_FIP_MMAP
25*81d1d86cSYing-Chun Liu (PaulLiu) static const io_dev_connector_t *mmc_dev_con;
26*81d1d86cSYing-Chun Liu (PaulLiu) static uintptr_t mmc_dev_handle;
27*81d1d86cSYing-Chun Liu (PaulLiu)
28*81d1d86cSYing-Chun Liu (PaulLiu) static const io_block_spec_t mmc_fip_spec = {
29*81d1d86cSYing-Chun Liu (PaulLiu) .offset = IMX_FIP_MMC_BASE,
30*81d1d86cSYing-Chun Liu (PaulLiu) .length = IMX_FIP_SIZE
31*81d1d86cSYing-Chun Liu (PaulLiu) };
32*81d1d86cSYing-Chun Liu (PaulLiu)
33*81d1d86cSYing-Chun Liu (PaulLiu) static const io_block_dev_spec_t mmc_dev_spec = {
34*81d1d86cSYing-Chun Liu (PaulLiu) /* It's used as temp buffer in block driver. */
35*81d1d86cSYing-Chun Liu (PaulLiu) .buffer = {
36*81d1d86cSYing-Chun Liu (PaulLiu) .offset = IMX_FIP_BASE,
37*81d1d86cSYing-Chun Liu (PaulLiu) /* do we need a new value? */
38*81d1d86cSYing-Chun Liu (PaulLiu) .length = IMX_FIP_SIZE
39*81d1d86cSYing-Chun Liu (PaulLiu) },
40*81d1d86cSYing-Chun Liu (PaulLiu) .ops = {
41*81d1d86cSYing-Chun Liu (PaulLiu) .read = mmc_read_blocks,
42*81d1d86cSYing-Chun Liu (PaulLiu) .write = mmc_write_blocks,
43*81d1d86cSYing-Chun Liu (PaulLiu) },
44*81d1d86cSYing-Chun Liu (PaulLiu) .block_size = MMC_BLOCK_SIZE,
45*81d1d86cSYing-Chun Liu (PaulLiu) };
46*81d1d86cSYing-Chun Liu (PaulLiu)
47*81d1d86cSYing-Chun Liu (PaulLiu) static int open_mmc(const uintptr_t spec);
48*81d1d86cSYing-Chun Liu (PaulLiu)
49*81d1d86cSYing-Chun Liu (PaulLiu) #else
50*81d1d86cSYing-Chun Liu (PaulLiu) static const io_dev_connector_t *memmap_dev_con;
51*81d1d86cSYing-Chun Liu (PaulLiu) static uintptr_t memmap_dev_handle;
52*81d1d86cSYing-Chun Liu (PaulLiu)
53*81d1d86cSYing-Chun Liu (PaulLiu) static const io_block_spec_t fip_block_spec = {
54*81d1d86cSYing-Chun Liu (PaulLiu) .offset = IMX_FIP_BASE,
55*81d1d86cSYing-Chun Liu (PaulLiu) .length = IMX_FIP_SIZE
56*81d1d86cSYing-Chun Liu (PaulLiu) };
57*81d1d86cSYing-Chun Liu (PaulLiu) static int open_memmap(const uintptr_t spec);
58*81d1d86cSYing-Chun Liu (PaulLiu) #endif
59*81d1d86cSYing-Chun Liu (PaulLiu)
60*81d1d86cSYing-Chun Liu (PaulLiu) static int open_fip(const uintptr_t spec);
61*81d1d86cSYing-Chun Liu (PaulLiu)
62*81d1d86cSYing-Chun Liu (PaulLiu) static const io_uuid_spec_t bl31_uuid_spec = {
63*81d1d86cSYing-Chun Liu (PaulLiu) .uuid = UUID_EL3_RUNTIME_FIRMWARE_BL31,
64*81d1d86cSYing-Chun Liu (PaulLiu) };
65*81d1d86cSYing-Chun Liu (PaulLiu)
66*81d1d86cSYing-Chun Liu (PaulLiu) static const io_uuid_spec_t bl32_uuid_spec = {
67*81d1d86cSYing-Chun Liu (PaulLiu) .uuid = UUID_SECURE_PAYLOAD_BL32,
68*81d1d86cSYing-Chun Liu (PaulLiu) };
69*81d1d86cSYing-Chun Liu (PaulLiu)
70*81d1d86cSYing-Chun Liu (PaulLiu) static const io_uuid_spec_t bl32_extra1_uuid_spec = {
71*81d1d86cSYing-Chun Liu (PaulLiu) .uuid = UUID_SECURE_PAYLOAD_BL32_EXTRA1,
72*81d1d86cSYing-Chun Liu (PaulLiu) };
73*81d1d86cSYing-Chun Liu (PaulLiu)
74*81d1d86cSYing-Chun Liu (PaulLiu) static const io_uuid_spec_t bl32_extra2_uuid_spec = {
75*81d1d86cSYing-Chun Liu (PaulLiu) .uuid = UUID_SECURE_PAYLOAD_BL32_EXTRA2,
76*81d1d86cSYing-Chun Liu (PaulLiu) };
77*81d1d86cSYing-Chun Liu (PaulLiu)
78*81d1d86cSYing-Chun Liu (PaulLiu) static const io_uuid_spec_t bl33_uuid_spec = {
79*81d1d86cSYing-Chun Liu (PaulLiu) .uuid = UUID_NON_TRUSTED_FIRMWARE_BL33,
80*81d1d86cSYing-Chun Liu (PaulLiu) };
81*81d1d86cSYing-Chun Liu (PaulLiu)
82*81d1d86cSYing-Chun Liu (PaulLiu) #if TRUSTED_BOARD_BOOT
83*81d1d86cSYing-Chun Liu (PaulLiu) static const io_uuid_spec_t tb_fw_cert_uuid_spec = {
84*81d1d86cSYing-Chun Liu (PaulLiu) .uuid = UUID_TRUSTED_BOOT_FW_CERT,
85*81d1d86cSYing-Chun Liu (PaulLiu) };
86*81d1d86cSYing-Chun Liu (PaulLiu)
87*81d1d86cSYing-Chun Liu (PaulLiu) static const io_uuid_spec_t trusted_key_cert_uuid_spec = {
88*81d1d86cSYing-Chun Liu (PaulLiu) .uuid = UUID_TRUSTED_KEY_CERT,
89*81d1d86cSYing-Chun Liu (PaulLiu) };
90*81d1d86cSYing-Chun Liu (PaulLiu)
91*81d1d86cSYing-Chun Liu (PaulLiu) static const io_uuid_spec_t soc_fw_key_cert_uuid_spec = {
92*81d1d86cSYing-Chun Liu (PaulLiu) .uuid = UUID_SOC_FW_KEY_CERT,
93*81d1d86cSYing-Chun Liu (PaulLiu) };
94*81d1d86cSYing-Chun Liu (PaulLiu)
95*81d1d86cSYing-Chun Liu (PaulLiu) static const io_uuid_spec_t tos_fw_key_cert_uuid_spec = {
96*81d1d86cSYing-Chun Liu (PaulLiu) .uuid = UUID_TRUSTED_OS_FW_KEY_CERT,
97*81d1d86cSYing-Chun Liu (PaulLiu) };
98*81d1d86cSYing-Chun Liu (PaulLiu)
99*81d1d86cSYing-Chun Liu (PaulLiu) static const io_uuid_spec_t tos_fw_cert_uuid_spec = {
100*81d1d86cSYing-Chun Liu (PaulLiu) .uuid = UUID_TRUSTED_OS_FW_CONTENT_CERT,
101*81d1d86cSYing-Chun Liu (PaulLiu) };
102*81d1d86cSYing-Chun Liu (PaulLiu)
103*81d1d86cSYing-Chun Liu (PaulLiu) static const io_uuid_spec_t soc_fw_content_cert_uuid_spec = {
104*81d1d86cSYing-Chun Liu (PaulLiu) .uuid = UUID_SOC_FW_CONTENT_CERT,
105*81d1d86cSYing-Chun Liu (PaulLiu) };
106*81d1d86cSYing-Chun Liu (PaulLiu)
107*81d1d86cSYing-Chun Liu (PaulLiu) static const io_uuid_spec_t nt_fw_key_cert_uuid_spec = {
108*81d1d86cSYing-Chun Liu (PaulLiu) .uuid = UUID_NON_TRUSTED_FW_KEY_CERT,
109*81d1d86cSYing-Chun Liu (PaulLiu) };
110*81d1d86cSYing-Chun Liu (PaulLiu)
111*81d1d86cSYing-Chun Liu (PaulLiu) static const io_uuid_spec_t nt_fw_cert_uuid_spec = {
112*81d1d86cSYing-Chun Liu (PaulLiu) .uuid = UUID_NON_TRUSTED_FW_CONTENT_CERT,
113*81d1d86cSYing-Chun Liu (PaulLiu) };
114*81d1d86cSYing-Chun Liu (PaulLiu) #endif /* TRUSTED_BOARD_BOOT */
115*81d1d86cSYing-Chun Liu (PaulLiu)
116*81d1d86cSYing-Chun Liu (PaulLiu) /* TODO: this structure is replicated multiple times. rationalize it ! */
117*81d1d86cSYing-Chun Liu (PaulLiu) struct plat_io_policy {
118*81d1d86cSYing-Chun Liu (PaulLiu) uintptr_t *dev_handle;
119*81d1d86cSYing-Chun Liu (PaulLiu) uintptr_t image_spec;
120*81d1d86cSYing-Chun Liu (PaulLiu) int (*check)(const uintptr_t spec);
121*81d1d86cSYing-Chun Liu (PaulLiu) };
122*81d1d86cSYing-Chun Liu (PaulLiu)
123*81d1d86cSYing-Chun Liu (PaulLiu) static const struct plat_io_policy policies[] = {
124*81d1d86cSYing-Chun Liu (PaulLiu) #ifndef IMX_FIP_MMAP
125*81d1d86cSYing-Chun Liu (PaulLiu) [FIP_IMAGE_ID] = {
126*81d1d86cSYing-Chun Liu (PaulLiu) &mmc_dev_handle,
127*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&mmc_fip_spec,
128*81d1d86cSYing-Chun Liu (PaulLiu) open_mmc
129*81d1d86cSYing-Chun Liu (PaulLiu) },
130*81d1d86cSYing-Chun Liu (PaulLiu) #else
131*81d1d86cSYing-Chun Liu (PaulLiu) [FIP_IMAGE_ID] = {
132*81d1d86cSYing-Chun Liu (PaulLiu) &memmap_dev_handle,
133*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&fip_block_spec,
134*81d1d86cSYing-Chun Liu (PaulLiu) open_memmap
135*81d1d86cSYing-Chun Liu (PaulLiu) },
136*81d1d86cSYing-Chun Liu (PaulLiu) #endif
137*81d1d86cSYing-Chun Liu (PaulLiu) [BL31_IMAGE_ID] = {
138*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle,
139*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&bl31_uuid_spec,
140*81d1d86cSYing-Chun Liu (PaulLiu) open_fip
141*81d1d86cSYing-Chun Liu (PaulLiu) },
142*81d1d86cSYing-Chun Liu (PaulLiu) [BL32_IMAGE_ID] = {
143*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle,
144*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&bl32_uuid_spec,
145*81d1d86cSYing-Chun Liu (PaulLiu) open_fip
146*81d1d86cSYing-Chun Liu (PaulLiu) },
147*81d1d86cSYing-Chun Liu (PaulLiu) [BL32_EXTRA1_IMAGE_ID] = {
148*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle,
149*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&bl32_extra1_uuid_spec,
150*81d1d86cSYing-Chun Liu (PaulLiu) open_fip
151*81d1d86cSYing-Chun Liu (PaulLiu) },
152*81d1d86cSYing-Chun Liu (PaulLiu) [BL32_EXTRA2_IMAGE_ID] = {
153*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle,
154*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&bl32_extra2_uuid_spec,
155*81d1d86cSYing-Chun Liu (PaulLiu) open_fip
156*81d1d86cSYing-Chun Liu (PaulLiu) },
157*81d1d86cSYing-Chun Liu (PaulLiu) [BL33_IMAGE_ID] = {
158*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle,
159*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&bl33_uuid_spec,
160*81d1d86cSYing-Chun Liu (PaulLiu) open_fip
161*81d1d86cSYing-Chun Liu (PaulLiu) },
162*81d1d86cSYing-Chun Liu (PaulLiu) #if TRUSTED_BOARD_BOOT
163*81d1d86cSYing-Chun Liu (PaulLiu) [TRUSTED_BOOT_FW_CERT_ID] = {
164*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle,
165*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&tb_fw_cert_uuid_spec,
166*81d1d86cSYing-Chun Liu (PaulLiu) open_fip
167*81d1d86cSYing-Chun Liu (PaulLiu) },
168*81d1d86cSYing-Chun Liu (PaulLiu) [SOC_FW_KEY_CERT_ID] = {
169*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle,
170*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&soc_fw_key_cert_uuid_spec,
171*81d1d86cSYing-Chun Liu (PaulLiu) open_fip
172*81d1d86cSYing-Chun Liu (PaulLiu) },
173*81d1d86cSYing-Chun Liu (PaulLiu) [TRUSTED_KEY_CERT_ID] = {
174*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle,
175*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&trusted_key_cert_uuid_spec,
176*81d1d86cSYing-Chun Liu (PaulLiu) open_fip
177*81d1d86cSYing-Chun Liu (PaulLiu) },
178*81d1d86cSYing-Chun Liu (PaulLiu) [TRUSTED_OS_FW_KEY_CERT_ID] = {
179*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle,
180*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&tos_fw_key_cert_uuid_spec,
181*81d1d86cSYing-Chun Liu (PaulLiu) open_fip
182*81d1d86cSYing-Chun Liu (PaulLiu) },
183*81d1d86cSYing-Chun Liu (PaulLiu) [NON_TRUSTED_FW_KEY_CERT_ID] = {
184*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle,
185*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&nt_fw_key_cert_uuid_spec,
186*81d1d86cSYing-Chun Liu (PaulLiu) open_fip
187*81d1d86cSYing-Chun Liu (PaulLiu) },
188*81d1d86cSYing-Chun Liu (PaulLiu) [SOC_FW_CONTENT_CERT_ID] = {
189*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle,
190*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&soc_fw_content_cert_uuid_spec,
191*81d1d86cSYing-Chun Liu (PaulLiu) open_fip
192*81d1d86cSYing-Chun Liu (PaulLiu) },
193*81d1d86cSYing-Chun Liu (PaulLiu) [TRUSTED_OS_FW_CONTENT_CERT_ID] = {
194*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle,
195*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&tos_fw_cert_uuid_spec,
196*81d1d86cSYing-Chun Liu (PaulLiu) open_fip
197*81d1d86cSYing-Chun Liu (PaulLiu) },
198*81d1d86cSYing-Chun Liu (PaulLiu) [NON_TRUSTED_FW_CONTENT_CERT_ID] = {
199*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle,
200*81d1d86cSYing-Chun Liu (PaulLiu) (uintptr_t)&nt_fw_cert_uuid_spec,
201*81d1d86cSYing-Chun Liu (PaulLiu) open_fip
202*81d1d86cSYing-Chun Liu (PaulLiu) },
203*81d1d86cSYing-Chun Liu (PaulLiu) #endif /* TRUSTED_BOARD_BOOT */
204*81d1d86cSYing-Chun Liu (PaulLiu) };
205*81d1d86cSYing-Chun Liu (PaulLiu)
open_fip(const uintptr_t spec)206*81d1d86cSYing-Chun Liu (PaulLiu) static int open_fip(const uintptr_t spec)
207*81d1d86cSYing-Chun Liu (PaulLiu) {
208*81d1d86cSYing-Chun Liu (PaulLiu) int result;
209*81d1d86cSYing-Chun Liu (PaulLiu) uintptr_t local_image_handle;
210*81d1d86cSYing-Chun Liu (PaulLiu)
211*81d1d86cSYing-Chun Liu (PaulLiu) /* See if a Firmware Image Package is available */
212*81d1d86cSYing-Chun Liu (PaulLiu) result = io_dev_init(fip_dev_handle, (uintptr_t)FIP_IMAGE_ID);
213*81d1d86cSYing-Chun Liu (PaulLiu) if (result == 0) {
214*81d1d86cSYing-Chun Liu (PaulLiu) result = io_open(fip_dev_handle, spec, &local_image_handle);
215*81d1d86cSYing-Chun Liu (PaulLiu) if (result == 0) {
216*81d1d86cSYing-Chun Liu (PaulLiu) VERBOSE("Using FIP\n");
217*81d1d86cSYing-Chun Liu (PaulLiu) io_close(local_image_handle);
218*81d1d86cSYing-Chun Liu (PaulLiu) }
219*81d1d86cSYing-Chun Liu (PaulLiu) }
220*81d1d86cSYing-Chun Liu (PaulLiu) return result;
221*81d1d86cSYing-Chun Liu (PaulLiu) }
222*81d1d86cSYing-Chun Liu (PaulLiu)
223*81d1d86cSYing-Chun Liu (PaulLiu) #ifndef IMX_FIP_MMAP
open_mmc(const uintptr_t spec)224*81d1d86cSYing-Chun Liu (PaulLiu) static int open_mmc(const uintptr_t spec)
225*81d1d86cSYing-Chun Liu (PaulLiu) {
226*81d1d86cSYing-Chun Liu (PaulLiu) int result;
227*81d1d86cSYing-Chun Liu (PaulLiu) uintptr_t local_handle;
228*81d1d86cSYing-Chun Liu (PaulLiu)
229*81d1d86cSYing-Chun Liu (PaulLiu) result = io_dev_init(mmc_dev_handle, (uintptr_t)NULL);
230*81d1d86cSYing-Chun Liu (PaulLiu) if (result == 0) {
231*81d1d86cSYing-Chun Liu (PaulLiu) result = io_open(mmc_dev_handle, spec, &local_handle);
232*81d1d86cSYing-Chun Liu (PaulLiu) if (result == 0) {
233*81d1d86cSYing-Chun Liu (PaulLiu) io_close(local_handle);
234*81d1d86cSYing-Chun Liu (PaulLiu) }
235*81d1d86cSYing-Chun Liu (PaulLiu) }
236*81d1d86cSYing-Chun Liu (PaulLiu) return result;
237*81d1d86cSYing-Chun Liu (PaulLiu) }
238*81d1d86cSYing-Chun Liu (PaulLiu) #else
open_memmap(const uintptr_t spec)239*81d1d86cSYing-Chun Liu (PaulLiu) static int open_memmap(const uintptr_t spec)
240*81d1d86cSYing-Chun Liu (PaulLiu) {
241*81d1d86cSYing-Chun Liu (PaulLiu) int result;
242*81d1d86cSYing-Chun Liu (PaulLiu) uintptr_t local_image_handle;
243*81d1d86cSYing-Chun Liu (PaulLiu)
244*81d1d86cSYing-Chun Liu (PaulLiu) result = io_dev_init(memmap_dev_handle, (uintptr_t)NULL);
245*81d1d86cSYing-Chun Liu (PaulLiu) if (result == 0) {
246*81d1d86cSYing-Chun Liu (PaulLiu) result = io_open(memmap_dev_handle, spec, &local_image_handle);
247*81d1d86cSYing-Chun Liu (PaulLiu) if (result == 0) {
248*81d1d86cSYing-Chun Liu (PaulLiu) VERBOSE("Using Memmap\n");
249*81d1d86cSYing-Chun Liu (PaulLiu) io_close(local_image_handle);
250*81d1d86cSYing-Chun Liu (PaulLiu) }
251*81d1d86cSYing-Chun Liu (PaulLiu) }
252*81d1d86cSYing-Chun Liu (PaulLiu) return result;
253*81d1d86cSYing-Chun Liu (PaulLiu) }
254*81d1d86cSYing-Chun Liu (PaulLiu) #endif
255*81d1d86cSYing-Chun Liu (PaulLiu)
plat_get_image_source(unsigned int image_id,uintptr_t * dev_handle,uintptr_t * image_spec)256*81d1d86cSYing-Chun Liu (PaulLiu) int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
257*81d1d86cSYing-Chun Liu (PaulLiu) uintptr_t *image_spec)
258*81d1d86cSYing-Chun Liu (PaulLiu) {
259*81d1d86cSYing-Chun Liu (PaulLiu) int result;
260*81d1d86cSYing-Chun Liu (PaulLiu) const struct plat_io_policy *policy;
261*81d1d86cSYing-Chun Liu (PaulLiu)
262*81d1d86cSYing-Chun Liu (PaulLiu) assert(image_id < ARRAY_SIZE(policies));
263*81d1d86cSYing-Chun Liu (PaulLiu)
264*81d1d86cSYing-Chun Liu (PaulLiu) policy = &policies[image_id];
265*81d1d86cSYing-Chun Liu (PaulLiu) result = policy->check(policy->image_spec);
266*81d1d86cSYing-Chun Liu (PaulLiu) assert(result == 0);
267*81d1d86cSYing-Chun Liu (PaulLiu)
268*81d1d86cSYing-Chun Liu (PaulLiu) *image_spec = policy->image_spec;
269*81d1d86cSYing-Chun Liu (PaulLiu) *dev_handle = *policy->dev_handle;
270*81d1d86cSYing-Chun Liu (PaulLiu)
271*81d1d86cSYing-Chun Liu (PaulLiu) return result;
272*81d1d86cSYing-Chun Liu (PaulLiu) }
273*81d1d86cSYing-Chun Liu (PaulLiu)
plat_imx_io_setup(void)274*81d1d86cSYing-Chun Liu (PaulLiu) void plat_imx_io_setup(void)
275*81d1d86cSYing-Chun Liu (PaulLiu) {
276*81d1d86cSYing-Chun Liu (PaulLiu) int result __unused;
277*81d1d86cSYing-Chun Liu (PaulLiu)
278*81d1d86cSYing-Chun Liu (PaulLiu) #ifndef IMX_FIP_MMAP
279*81d1d86cSYing-Chun Liu (PaulLiu) result = register_io_dev_block(&mmc_dev_con);
280*81d1d86cSYing-Chun Liu (PaulLiu) assert(result == 0);
281*81d1d86cSYing-Chun Liu (PaulLiu)
282*81d1d86cSYing-Chun Liu (PaulLiu) result = io_dev_open(mmc_dev_con, (uintptr_t)&mmc_dev_spec,
283*81d1d86cSYing-Chun Liu (PaulLiu) &mmc_dev_handle);
284*81d1d86cSYing-Chun Liu (PaulLiu) assert(result == 0);
285*81d1d86cSYing-Chun Liu (PaulLiu)
286*81d1d86cSYing-Chun Liu (PaulLiu) #else
287*81d1d86cSYing-Chun Liu (PaulLiu) result = register_io_dev_memmap(&memmap_dev_con);
288*81d1d86cSYing-Chun Liu (PaulLiu) assert(result == 0);
289*81d1d86cSYing-Chun Liu (PaulLiu)
290*81d1d86cSYing-Chun Liu (PaulLiu) result = io_dev_open(memmap_dev_con, (uintptr_t)NULL,
291*81d1d86cSYing-Chun Liu (PaulLiu) &memmap_dev_handle);
292*81d1d86cSYing-Chun Liu (PaulLiu) assert(result == 0);
293*81d1d86cSYing-Chun Liu (PaulLiu) #endif
294*81d1d86cSYing-Chun Liu (PaulLiu)
295*81d1d86cSYing-Chun Liu (PaulLiu) result = register_io_dev_fip(&fip_dev_con);
296*81d1d86cSYing-Chun Liu (PaulLiu) assert(result == 0);
297*81d1d86cSYing-Chun Liu (PaulLiu)
298*81d1d86cSYing-Chun Liu (PaulLiu) result = io_dev_open(fip_dev_con, (uintptr_t)NULL,
299*81d1d86cSYing-Chun Liu (PaulLiu) &fip_dev_handle);
300*81d1d86cSYing-Chun Liu (PaulLiu) assert(result == 0);
301*81d1d86cSYing-Chun Liu (PaulLiu) }
302