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