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