101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux/*
201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * Copyright (c) 2014, ARM Limited and Contributors. All rights reserved.
301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux *
401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * Redistribution and use in source and binary forms, with or without
501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * modification, are permitted provided that the following conditions are met:
601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux *
701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * Redistributions of source code must retain the above copyright notice, this
801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * list of conditions and the following disclaimer.
901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux *
1001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * Redistributions in binary form must reproduce the above copyright notice,
1101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * this list of conditions and the following disclaimer in the documentation
1201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * and/or other materials provided with the distribution.
1301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux *
1401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * Neither the name of ARM nor the names of its contributors may be used
1501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * to endorse or promote products derived from this software without specific
1601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * prior written permission.
1701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux *
1801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
2201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * POSSIBILITY OF SUCH DAMAGE.
2901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux */
3001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
3101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux#include <assert.h>
3201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux#include <debug.h>
3301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux#include <io_driver.h>
3401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux#include <io_fip.h>
3501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux#include <io_memmap.h>
3601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux#include <io_storage.h>
3701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux#include <platform_def.h>
3801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux#include <semihosting.h>	/* For FOPEN_MODE_... */
3901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux#include <string.h>
4001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
4101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux/* IO devices */
4201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic const io_dev_connector_t *fip_dev_con;
4301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic uintptr_t fip_dev_spec;
4401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic uintptr_t fip_dev_handle;
4501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic const io_dev_connector_t *memmap_dev_con;
4601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic uintptr_t memmap_dev_spec;
4701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic uintptr_t memmap_init_params;
4801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic uintptr_t memmap_dev_handle;
4901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
5001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic const io_block_spec_t fip_block_spec = {
5101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	.offset = FLASH_BASE,
5201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	.length = FLASH_SIZE
5301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux};
5401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
5501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic const io_file_spec_t bl2_file_spec = {
5601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	.path = BL2_IMAGE_NAME,
5701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	.mode = FOPEN_MODE_RB
5801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux};
5901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
6001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic const io_file_spec_t bl30_file_spec = {
6101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	.path = BL30_IMAGE_NAME,
6201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	.mode = FOPEN_MODE_RB
6301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux};
6401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
6501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic const io_file_spec_t bl31_file_spec = {
6601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	.path = BL31_IMAGE_NAME,
6701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	.mode = FOPEN_MODE_RB
6801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux};
6901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
70edfda10a6b4ac7691746f1cd23e74a8dc3b70f0aSandrine Bailleuxstatic const io_file_spec_t bl32_file_spec = {
71edfda10a6b4ac7691746f1cd23e74a8dc3b70f0aSandrine Bailleux	.path = BL32_IMAGE_NAME,
72edfda10a6b4ac7691746f1cd23e74a8dc3b70f0aSandrine Bailleux	.mode = FOPEN_MODE_RB
73edfda10a6b4ac7691746f1cd23e74a8dc3b70f0aSandrine Bailleux};
74edfda10a6b4ac7691746f1cd23e74a8dc3b70f0aSandrine Bailleux
7501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic const io_file_spec_t bl33_file_spec = {
7601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	.path = BL33_IMAGE_NAME,
7701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	.mode = FOPEN_MODE_RB
7801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux};
7901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
8001df3c14677db0eab68f088f2721542f88ea4004Juan Castillo#if TRUSTED_BOARD_BOOT
8101df3c14677db0eab68f088f2721542f88ea4004Juan Castillostatic const io_file_spec_t bl2_cert_file_spec = {
8201df3c14677db0eab68f088f2721542f88ea4004Juan Castillo	.path = BL2_CERT_NAME,
8301df3c14677db0eab68f088f2721542f88ea4004Juan Castillo	.mode = FOPEN_MODE_RB
8401df3c14677db0eab68f088f2721542f88ea4004Juan Castillo};
85dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo
86dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillostatic const io_file_spec_t trusted_key_cert_file_spec = {
87dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.path = TRUSTED_KEY_CERT_NAME,
88dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.mode = FOPEN_MODE_RB
89dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo};
90dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo
91dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillostatic const io_file_spec_t bl30_key_cert_file_spec = {
92dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.path = BL30_KEY_CERT_NAME,
93dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.mode = FOPEN_MODE_RB
94dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo};
95dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo
96dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillostatic const io_file_spec_t bl31_key_cert_file_spec = {
97dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.path = BL31_KEY_CERT_NAME,
98dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.mode = FOPEN_MODE_RB
99dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo};
100dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo
101dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillostatic const io_file_spec_t bl32_key_cert_file_spec = {
102dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.path = BL32_KEY_CERT_NAME,
103dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.mode = FOPEN_MODE_RB
104dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo};
105dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo
106dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillostatic const io_file_spec_t bl33_key_cert_file_spec = {
107dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.path = BL33_KEY_CERT_NAME,
108dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.mode = FOPEN_MODE_RB
109dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo};
110dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo
111dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillostatic const io_file_spec_t bl30_cert_file_spec = {
112dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.path = BL30_CERT_NAME,
113dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.mode = FOPEN_MODE_RB
114dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo};
115dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo
116dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillostatic const io_file_spec_t bl31_cert_file_spec = {
117dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.path = BL31_CERT_NAME,
118dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.mode = FOPEN_MODE_RB
119dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo};
120dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo
121dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillostatic const io_file_spec_t bl32_cert_file_spec = {
122dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.path = BL32_CERT_NAME,
123dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.mode = FOPEN_MODE_RB
124dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo};
125dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo
126dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillostatic const io_file_spec_t bl33_cert_file_spec = {
127dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.path = BL33_CERT_NAME,
128dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	.mode = FOPEN_MODE_RB
129dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo};
13001df3c14677db0eab68f088f2721542f88ea4004Juan Castillo#endif /* TRUSTED_BOARD_BOOT */
13101df3c14677db0eab68f088f2721542f88ea4004Juan Castillo
13201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic int open_fip(const uintptr_t spec);
13301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic int open_memmap(const uintptr_t spec);
13401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
13501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstruct plat_io_policy {
13601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	const char *image_name;
13701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	uintptr_t *dev_handle;
13801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	uintptr_t image_spec;
13901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	int (*check)(const uintptr_t spec);
14001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux};
14101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
14201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic const struct plat_io_policy policies[] = {
14301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	{
14401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		FIP_IMAGE_NAME,
14501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		&memmap_dev_handle,
14601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		(uintptr_t)&fip_block_spec,
14701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		open_memmap
14801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	}, {
14901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		BL2_IMAGE_NAME,
15001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		&fip_dev_handle,
15101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		(uintptr_t)&bl2_file_spec,
15201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		open_fip
15301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	}, {
15401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		BL30_IMAGE_NAME,
15501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		&fip_dev_handle,
15601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		(uintptr_t)&bl30_file_spec,
15701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		open_fip
15801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	}, {
15901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		BL31_IMAGE_NAME,
16001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		&fip_dev_handle,
16101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		(uintptr_t)&bl31_file_spec,
16201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		open_fip
16301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	}, {
164edfda10a6b4ac7691746f1cd23e74a8dc3b70f0aSandrine Bailleux		BL32_IMAGE_NAME,
165edfda10a6b4ac7691746f1cd23e74a8dc3b70f0aSandrine Bailleux		&fip_dev_handle,
166edfda10a6b4ac7691746f1cd23e74a8dc3b70f0aSandrine Bailleux		(uintptr_t)&bl32_file_spec,
167edfda10a6b4ac7691746f1cd23e74a8dc3b70f0aSandrine Bailleux		open_fip
168edfda10a6b4ac7691746f1cd23e74a8dc3b70f0aSandrine Bailleux	}, {
16901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		BL33_IMAGE_NAME,
17001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		&fip_dev_handle,
17101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		(uintptr_t)&bl33_file_spec,
17201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		open_fip
17301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	}, {
17401df3c14677db0eab68f088f2721542f88ea4004Juan Castillo#if TRUSTED_BOARD_BOOT
17501df3c14677db0eab68f088f2721542f88ea4004Juan Castillo		BL2_CERT_NAME,
17601df3c14677db0eab68f088f2721542f88ea4004Juan Castillo		&fip_dev_handle,
17701df3c14677db0eab68f088f2721542f88ea4004Juan Castillo		(uintptr_t)&bl2_cert_file_spec,
17801df3c14677db0eab68f088f2721542f88ea4004Juan Castillo		open_fip
17901df3c14677db0eab68f088f2721542f88ea4004Juan Castillo	}, {
180dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		TRUSTED_KEY_CERT_NAME,
181dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		&fip_dev_handle,
182dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		(uintptr_t)&trusted_key_cert_file_spec,
183dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		open_fip
184dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	}, {
185dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		BL30_KEY_CERT_NAME,
186dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		&fip_dev_handle,
187dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		(uintptr_t)&bl30_key_cert_file_spec,
188dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		open_fip
189dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	}, {
190dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		BL31_KEY_CERT_NAME,
191dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		&fip_dev_handle,
192dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		(uintptr_t)&bl31_key_cert_file_spec,
193dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		open_fip
194dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	}, {
195dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		BL32_KEY_CERT_NAME,
196dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		&fip_dev_handle,
197dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		(uintptr_t)&bl32_key_cert_file_spec,
198dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		open_fip
199dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	}, {
200dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		BL33_KEY_CERT_NAME,
201dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		&fip_dev_handle,
202dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		(uintptr_t)&bl33_key_cert_file_spec,
203dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		open_fip
204dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	}, {
205dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		BL30_CERT_NAME,
206dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		&fip_dev_handle,
207dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		(uintptr_t)&bl30_cert_file_spec,
208dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		open_fip
209dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	}, {
210dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		BL31_CERT_NAME,
211dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		&fip_dev_handle,
212dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		(uintptr_t)&bl31_cert_file_spec,
213dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		open_fip
214dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	}, {
215dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		BL32_CERT_NAME,
216dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		&fip_dev_handle,
217dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		(uintptr_t)&bl32_cert_file_spec,
218dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		open_fip
219dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	}, {
220dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		BL33_CERT_NAME,
221dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		&fip_dev_handle,
222dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		(uintptr_t)&bl33_cert_file_spec,
223dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo		open_fip
224dec840af4b2d071516863faa274e9fa68a72d42aJuan Castillo	}, {
22501df3c14677db0eab68f088f2721542f88ea4004Juan Castillo#endif /* TRUSTED_BOARD_BOOT */
22601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		0, 0, 0
22701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	}
22801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux};
22901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
23001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
23101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic int open_fip(const uintptr_t spec)
23201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux{
23301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	int result = IO_FAIL;
23401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
23501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	/* See if a Firmware Image Package is available */
23601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	result = io_dev_init(fip_dev_handle, (uintptr_t)FIP_IMAGE_NAME);
23701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	if (result == IO_SUCCESS) {
23801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		INFO("Using FIP\n");
23901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		/*TODO: Check image defined in spec is present in FIP. */
24001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	}
24101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	return result;
24201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux}
24301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
24401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
24501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxstatic int open_memmap(const uintptr_t spec)
24601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux{
24701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	int result = IO_FAIL;
24801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	uintptr_t local_image_handle;
24901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
25001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	result = io_dev_init(memmap_dev_handle, memmap_init_params);
25101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	if (result == IO_SUCCESS) {
25201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		result = io_open(memmap_dev_handle, spec, &local_image_handle);
25301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		if (result == IO_SUCCESS) {
25401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux			/* INFO("Using Memmap IO\n"); */
25501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux			io_close(local_image_handle);
25601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		}
25701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	}
25801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	return result;
25901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux}
26001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
26101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxvoid io_setup(void)
26201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux{
26301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	int io_result = IO_FAIL;
26401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
26501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	/* Register the IO devices on this platform */
26601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	io_result = register_io_dev_fip(&fip_dev_con);
26701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	assert(io_result == IO_SUCCESS);
26801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
26901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	io_result = register_io_dev_memmap(&memmap_dev_con);
27001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	assert(io_result == IO_SUCCESS);
27101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
27201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	/* Open connections to devices and cache the handles */
27301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	io_result = io_dev_open(fip_dev_con, fip_dev_spec, &fip_dev_handle);
27401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	assert(io_result == IO_SUCCESS);
27501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
27601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	io_result = io_dev_open(memmap_dev_con, memmap_dev_spec,
27701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux				&memmap_dev_handle);
27801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	assert(io_result == IO_SUCCESS);
27901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
28001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	/* Ignore improbable errors in release builds */
28101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	(void)io_result;
28201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux}
28301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
28401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
28501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux/* Return an IO device handle and specification which can be used to access
28601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux * an image. Use this to enforce platform load policy */
28701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleuxint plat_get_image_source(const char *image_name, uintptr_t *dev_handle,
28801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux			  uintptr_t *image_spec)
28901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux{
29001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	int result = IO_FAIL;
29101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	const struct plat_io_policy *policy;
29201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux
29301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	if ((image_name != NULL) && (dev_handle != NULL) &&
29401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	    (image_spec != NULL)) {
29501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		policy = policies;
29601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		while (policy->image_name != NULL) {
29701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux			if (strcmp(policy->image_name, image_name) == 0) {
29801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux				result = policy->check(policy->image_spec);
29901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux				if (result == IO_SUCCESS) {
30001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux					*image_spec = policy->image_spec;
30101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux					*dev_handle = *(policy->dev_handle);
30201b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux					break;
30301b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux				}
30401b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux			}
30501b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux			policy++;
30601b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		}
30701b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	} else {
30801b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux		result = IO_FAIL;
30901b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	}
31001b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux	return result;
31101b916bff2dca219d4088b8abca0a02ac06dd615Sandrine Bailleux}
312