1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2015-2020, Renesas Electronics Corporation. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <string.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <common/debug.h> 10*91f16700Schasinglulu #include <drivers/io/io_driver.h> 11*91f16700Schasinglulu #include <drivers/io/io_storage.h> 12*91f16700Schasinglulu #include <drivers/io/io_semihosting.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu #include "io_common.h" 15*91f16700Schasinglulu #include "io_memdrv.h" 16*91f16700Schasinglulu #include "io_emmcdrv.h" 17*91f16700Schasinglulu #include "io_private.h" 18*91f16700Schasinglulu #include "io_rcar.h" 19*91f16700Schasinglulu #include <platform_def.h> 20*91f16700Schasinglulu 21*91f16700Schasinglulu static uintptr_t emmcdrv_dev_handle; 22*91f16700Schasinglulu static uintptr_t memdrv_dev_handle; 23*91f16700Schasinglulu static uintptr_t rcar_dev_handle; 24*91f16700Schasinglulu 25*91f16700Schasinglulu static uintptr_t boot_io_drv_id; 26*91f16700Schasinglulu 27*91f16700Schasinglulu static const io_block_spec_t rcar_block_spec = { 28*91f16700Schasinglulu .offset = FLASH0_BASE, 29*91f16700Schasinglulu .length = FLASH0_SIZE 30*91f16700Schasinglulu }; 31*91f16700Schasinglulu 32*91f16700Schasinglulu static const io_block_spec_t bl2_file_spec = { 33*91f16700Schasinglulu .offset = BL2_IMAGE_ID, 34*91f16700Schasinglulu }; 35*91f16700Schasinglulu 36*91f16700Schasinglulu static const io_block_spec_t bl31_file_spec = { 37*91f16700Schasinglulu .offset = BL31_IMAGE_ID, 38*91f16700Schasinglulu }; 39*91f16700Schasinglulu 40*91f16700Schasinglulu static const io_block_spec_t bl32_file_spec = { 41*91f16700Schasinglulu .offset = BL32_IMAGE_ID, 42*91f16700Schasinglulu }; 43*91f16700Schasinglulu 44*91f16700Schasinglulu static const io_block_spec_t bl33_file_spec = { 45*91f16700Schasinglulu .offset = BL33_IMAGE_ID, 46*91f16700Schasinglulu }; 47*91f16700Schasinglulu 48*91f16700Schasinglulu static const io_block_spec_t bl332_file_spec = { 49*91f16700Schasinglulu .offset = BL332_IMAGE_ID, 50*91f16700Schasinglulu }; 51*91f16700Schasinglulu 52*91f16700Schasinglulu static const io_block_spec_t bl333_file_spec = { 53*91f16700Schasinglulu .offset = BL333_IMAGE_ID, 54*91f16700Schasinglulu }; 55*91f16700Schasinglulu 56*91f16700Schasinglulu static const io_block_spec_t bl334_file_spec = { 57*91f16700Schasinglulu .offset = BL334_IMAGE_ID, 58*91f16700Schasinglulu }; 59*91f16700Schasinglulu 60*91f16700Schasinglulu static const io_block_spec_t bl335_file_spec = { 61*91f16700Schasinglulu .offset = BL335_IMAGE_ID, 62*91f16700Schasinglulu }; 63*91f16700Schasinglulu 64*91f16700Schasinglulu static const io_block_spec_t bl336_file_spec = { 65*91f16700Schasinglulu .offset = BL336_IMAGE_ID, 66*91f16700Schasinglulu }; 67*91f16700Schasinglulu 68*91f16700Schasinglulu static const io_block_spec_t bl337_file_spec = { 69*91f16700Schasinglulu .offset = BL337_IMAGE_ID, 70*91f16700Schasinglulu }; 71*91f16700Schasinglulu 72*91f16700Schasinglulu static const io_block_spec_t bl338_file_spec = { 73*91f16700Schasinglulu .offset = BL338_IMAGE_ID, 74*91f16700Schasinglulu }; 75*91f16700Schasinglulu 76*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT 77*91f16700Schasinglulu static const io_block_spec_t trusted_key_cert_file_spec = { 78*91f16700Schasinglulu .offset = TRUSTED_KEY_CERT_ID, 79*91f16700Schasinglulu }; 80*91f16700Schasinglulu 81*91f16700Schasinglulu static const io_block_spec_t bl31_key_cert_file_spec = { 82*91f16700Schasinglulu .offset = SOC_FW_KEY_CERT_ID, 83*91f16700Schasinglulu }; 84*91f16700Schasinglulu 85*91f16700Schasinglulu static const io_block_spec_t bl32_key_cert_file_spec = { 86*91f16700Schasinglulu .offset = TRUSTED_OS_FW_KEY_CERT_ID, 87*91f16700Schasinglulu }; 88*91f16700Schasinglulu 89*91f16700Schasinglulu static const io_block_spec_t bl33_key_cert_file_spec = { 90*91f16700Schasinglulu .offset = NON_TRUSTED_FW_KEY_CERT_ID, 91*91f16700Schasinglulu }; 92*91f16700Schasinglulu 93*91f16700Schasinglulu static const io_block_spec_t bl332_key_cert_file_spec = { 94*91f16700Schasinglulu .offset = BL332_KEY_CERT_ID, 95*91f16700Schasinglulu }; 96*91f16700Schasinglulu 97*91f16700Schasinglulu static const io_block_spec_t bl333_key_cert_file_spec = { 98*91f16700Schasinglulu .offset = BL333_KEY_CERT_ID, 99*91f16700Schasinglulu }; 100*91f16700Schasinglulu 101*91f16700Schasinglulu static const io_block_spec_t bl334_key_cert_file_spec = { 102*91f16700Schasinglulu .offset = BL334_KEY_CERT_ID, 103*91f16700Schasinglulu }; 104*91f16700Schasinglulu 105*91f16700Schasinglulu static const io_block_spec_t bl335_key_cert_file_spec = { 106*91f16700Schasinglulu .offset = BL335_KEY_CERT_ID, 107*91f16700Schasinglulu }; 108*91f16700Schasinglulu 109*91f16700Schasinglulu static const io_block_spec_t bl336_key_cert_file_spec = { 110*91f16700Schasinglulu .offset = BL336_KEY_CERT_ID, 111*91f16700Schasinglulu }; 112*91f16700Schasinglulu 113*91f16700Schasinglulu static const io_block_spec_t bl337_key_cert_file_spec = { 114*91f16700Schasinglulu .offset = BL337_KEY_CERT_ID, 115*91f16700Schasinglulu }; 116*91f16700Schasinglulu 117*91f16700Schasinglulu static const io_block_spec_t bl338_key_cert_file_spec = { 118*91f16700Schasinglulu .offset = BL338_KEY_CERT_ID, 119*91f16700Schasinglulu }; 120*91f16700Schasinglulu 121*91f16700Schasinglulu static const io_block_spec_t bl31_cert_file_spec = { 122*91f16700Schasinglulu .offset = SOC_FW_CONTENT_CERT_ID, 123*91f16700Schasinglulu }; 124*91f16700Schasinglulu 125*91f16700Schasinglulu static const io_block_spec_t bl32_cert_file_spec = { 126*91f16700Schasinglulu .offset = TRUSTED_OS_FW_CONTENT_CERT_ID, 127*91f16700Schasinglulu }; 128*91f16700Schasinglulu 129*91f16700Schasinglulu static const io_block_spec_t bl33_cert_file_spec = { 130*91f16700Schasinglulu .offset = NON_TRUSTED_FW_CONTENT_CERT_ID, 131*91f16700Schasinglulu }; 132*91f16700Schasinglulu 133*91f16700Schasinglulu static const io_block_spec_t bl332_cert_file_spec = { 134*91f16700Schasinglulu .offset = BL332_CERT_ID, 135*91f16700Schasinglulu }; 136*91f16700Schasinglulu 137*91f16700Schasinglulu static const io_block_spec_t bl333_cert_file_spec = { 138*91f16700Schasinglulu .offset = BL333_CERT_ID, 139*91f16700Schasinglulu }; 140*91f16700Schasinglulu 141*91f16700Schasinglulu static const io_block_spec_t bl334_cert_file_spec = { 142*91f16700Schasinglulu .offset = BL334_CERT_ID, 143*91f16700Schasinglulu }; 144*91f16700Schasinglulu 145*91f16700Schasinglulu static const io_block_spec_t bl335_cert_file_spec = { 146*91f16700Schasinglulu .offset = BL335_CERT_ID, 147*91f16700Schasinglulu }; 148*91f16700Schasinglulu 149*91f16700Schasinglulu static const io_block_spec_t bl336_cert_file_spec = { 150*91f16700Schasinglulu .offset = BL336_CERT_ID, 151*91f16700Schasinglulu }; 152*91f16700Schasinglulu 153*91f16700Schasinglulu static const io_block_spec_t bl337_cert_file_spec = { 154*91f16700Schasinglulu .offset = BL337_CERT_ID, 155*91f16700Schasinglulu }; 156*91f16700Schasinglulu 157*91f16700Schasinglulu static const io_block_spec_t bl338_cert_file_spec = { 158*91f16700Schasinglulu .offset = BL338_CERT_ID, 159*91f16700Schasinglulu }; 160*91f16700Schasinglulu #endif 161*91f16700Schasinglulu 162*91f16700Schasinglulu static int32_t open_emmcdrv(const uintptr_t spec); 163*91f16700Schasinglulu static int32_t open_memmap(const uintptr_t spec); 164*91f16700Schasinglulu static int32_t open_rcar(const uintptr_t spec); 165*91f16700Schasinglulu 166*91f16700Schasinglulu struct plat_io_policy { 167*91f16700Schasinglulu uintptr_t *dev_handle; 168*91f16700Schasinglulu uintptr_t image_spec; 169*91f16700Schasinglulu int32_t (*check)(const uintptr_t spec); 170*91f16700Schasinglulu }; 171*91f16700Schasinglulu 172*91f16700Schasinglulu static const struct plat_io_policy policies[] = { 173*91f16700Schasinglulu [FIP_IMAGE_ID] = { 174*91f16700Schasinglulu &memdrv_dev_handle, 175*91f16700Schasinglulu (uintptr_t) &rcar_block_spec, 176*91f16700Schasinglulu &open_memmap}, 177*91f16700Schasinglulu [BL2_IMAGE_ID] = { 178*91f16700Schasinglulu &rcar_dev_handle, 179*91f16700Schasinglulu (uintptr_t) &bl2_file_spec, 180*91f16700Schasinglulu &open_rcar}, 181*91f16700Schasinglulu [BL31_IMAGE_ID] = { 182*91f16700Schasinglulu &rcar_dev_handle, 183*91f16700Schasinglulu (uintptr_t) &bl31_file_spec, 184*91f16700Schasinglulu &open_rcar}, 185*91f16700Schasinglulu [BL32_IMAGE_ID] = { 186*91f16700Schasinglulu &rcar_dev_handle, 187*91f16700Schasinglulu (uintptr_t) &bl32_file_spec, 188*91f16700Schasinglulu &open_rcar}, 189*91f16700Schasinglulu [BL33_IMAGE_ID] = { 190*91f16700Schasinglulu &rcar_dev_handle, 191*91f16700Schasinglulu (uintptr_t) &bl33_file_spec, 192*91f16700Schasinglulu &open_rcar}, 193*91f16700Schasinglulu [BL332_IMAGE_ID] = { 194*91f16700Schasinglulu &rcar_dev_handle, 195*91f16700Schasinglulu (uintptr_t) &bl332_file_spec, 196*91f16700Schasinglulu &open_rcar}, 197*91f16700Schasinglulu [BL333_IMAGE_ID] = { 198*91f16700Schasinglulu &rcar_dev_handle, 199*91f16700Schasinglulu (uintptr_t) &bl333_file_spec, 200*91f16700Schasinglulu &open_rcar}, 201*91f16700Schasinglulu [BL334_IMAGE_ID] = { 202*91f16700Schasinglulu &rcar_dev_handle, 203*91f16700Schasinglulu (uintptr_t) &bl334_file_spec, 204*91f16700Schasinglulu &open_rcar}, 205*91f16700Schasinglulu [BL335_IMAGE_ID] = { 206*91f16700Schasinglulu &rcar_dev_handle, 207*91f16700Schasinglulu (uintptr_t) &bl335_file_spec, 208*91f16700Schasinglulu &open_rcar}, 209*91f16700Schasinglulu [BL336_IMAGE_ID] = { 210*91f16700Schasinglulu &rcar_dev_handle, 211*91f16700Schasinglulu (uintptr_t) &bl336_file_spec, 212*91f16700Schasinglulu &open_rcar}, 213*91f16700Schasinglulu [BL337_IMAGE_ID] = { 214*91f16700Schasinglulu &rcar_dev_handle, 215*91f16700Schasinglulu (uintptr_t) &bl337_file_spec, 216*91f16700Schasinglulu &open_rcar}, 217*91f16700Schasinglulu [BL338_IMAGE_ID] = { 218*91f16700Schasinglulu &rcar_dev_handle, 219*91f16700Schasinglulu (uintptr_t) &bl338_file_spec, 220*91f16700Schasinglulu &open_rcar}, 221*91f16700Schasinglulu #if TRUSTED_BOARD_BOOT 222*91f16700Schasinglulu [TRUSTED_KEY_CERT_ID] = { 223*91f16700Schasinglulu &rcar_dev_handle, 224*91f16700Schasinglulu (uintptr_t) &trusted_key_cert_file_spec, 225*91f16700Schasinglulu &open_rcar}, 226*91f16700Schasinglulu [SOC_FW_KEY_CERT_ID] = { 227*91f16700Schasinglulu &rcar_dev_handle, 228*91f16700Schasinglulu (uintptr_t) &bl31_key_cert_file_spec, 229*91f16700Schasinglulu &open_rcar}, 230*91f16700Schasinglulu [TRUSTED_OS_FW_KEY_CERT_ID] = { 231*91f16700Schasinglulu &rcar_dev_handle, 232*91f16700Schasinglulu (uintptr_t) &bl32_key_cert_file_spec, 233*91f16700Schasinglulu &open_rcar}, 234*91f16700Schasinglulu [NON_TRUSTED_FW_KEY_CERT_ID] = { 235*91f16700Schasinglulu &rcar_dev_handle, 236*91f16700Schasinglulu (uintptr_t) &bl33_key_cert_file_spec, 237*91f16700Schasinglulu &open_rcar}, 238*91f16700Schasinglulu [BL332_KEY_CERT_ID] = { 239*91f16700Schasinglulu &rcar_dev_handle, 240*91f16700Schasinglulu (uintptr_t) &bl332_key_cert_file_spec, 241*91f16700Schasinglulu &open_rcar}, 242*91f16700Schasinglulu [BL333_KEY_CERT_ID] = { 243*91f16700Schasinglulu &rcar_dev_handle, 244*91f16700Schasinglulu (uintptr_t) &bl333_key_cert_file_spec, 245*91f16700Schasinglulu &open_rcar}, 246*91f16700Schasinglulu [BL334_KEY_CERT_ID] = { 247*91f16700Schasinglulu &rcar_dev_handle, 248*91f16700Schasinglulu (uintptr_t) &bl334_key_cert_file_spec, 249*91f16700Schasinglulu &open_rcar}, 250*91f16700Schasinglulu [BL335_KEY_CERT_ID] = { 251*91f16700Schasinglulu &rcar_dev_handle, 252*91f16700Schasinglulu (uintptr_t) &bl335_key_cert_file_spec, 253*91f16700Schasinglulu &open_rcar}, 254*91f16700Schasinglulu [BL336_KEY_CERT_ID] = { 255*91f16700Schasinglulu &rcar_dev_handle, 256*91f16700Schasinglulu (uintptr_t) &bl336_key_cert_file_spec, 257*91f16700Schasinglulu &open_rcar}, 258*91f16700Schasinglulu [BL337_KEY_CERT_ID] = { 259*91f16700Schasinglulu &rcar_dev_handle, 260*91f16700Schasinglulu (uintptr_t) &bl337_key_cert_file_spec, 261*91f16700Schasinglulu &open_rcar}, 262*91f16700Schasinglulu [BL338_KEY_CERT_ID] = { 263*91f16700Schasinglulu &rcar_dev_handle, 264*91f16700Schasinglulu (uintptr_t) &bl338_key_cert_file_spec, 265*91f16700Schasinglulu &open_rcar}, 266*91f16700Schasinglulu [SOC_FW_CONTENT_CERT_ID] = { 267*91f16700Schasinglulu &rcar_dev_handle, 268*91f16700Schasinglulu (uintptr_t) &bl31_cert_file_spec, 269*91f16700Schasinglulu &open_rcar}, 270*91f16700Schasinglulu [TRUSTED_OS_FW_CONTENT_CERT_ID] = { 271*91f16700Schasinglulu &rcar_dev_handle, 272*91f16700Schasinglulu (uintptr_t) &bl32_cert_file_spec, 273*91f16700Schasinglulu &open_rcar}, 274*91f16700Schasinglulu [NON_TRUSTED_FW_CONTENT_CERT_ID] = { 275*91f16700Schasinglulu &rcar_dev_handle, 276*91f16700Schasinglulu (uintptr_t) &bl33_cert_file_spec, 277*91f16700Schasinglulu &open_rcar}, 278*91f16700Schasinglulu [BL332_CERT_ID] = { 279*91f16700Schasinglulu &rcar_dev_handle, 280*91f16700Schasinglulu (uintptr_t) &bl332_cert_file_spec, 281*91f16700Schasinglulu &open_rcar}, 282*91f16700Schasinglulu [BL333_CERT_ID] = { 283*91f16700Schasinglulu &rcar_dev_handle, 284*91f16700Schasinglulu (uintptr_t) &bl333_cert_file_spec, 285*91f16700Schasinglulu &open_rcar}, 286*91f16700Schasinglulu [BL334_CERT_ID] = { 287*91f16700Schasinglulu &rcar_dev_handle, 288*91f16700Schasinglulu (uintptr_t) &bl334_cert_file_spec, 289*91f16700Schasinglulu &open_rcar}, 290*91f16700Schasinglulu [BL335_CERT_ID] = { 291*91f16700Schasinglulu &rcar_dev_handle, 292*91f16700Schasinglulu (uintptr_t) &bl335_cert_file_spec, 293*91f16700Schasinglulu &open_rcar}, 294*91f16700Schasinglulu [BL336_CERT_ID] = { 295*91f16700Schasinglulu &rcar_dev_handle, 296*91f16700Schasinglulu (uintptr_t) &bl336_cert_file_spec, 297*91f16700Schasinglulu &open_rcar}, 298*91f16700Schasinglulu [BL337_CERT_ID] = { 299*91f16700Schasinglulu &rcar_dev_handle, 300*91f16700Schasinglulu (uintptr_t) &bl337_cert_file_spec, 301*91f16700Schasinglulu &open_rcar}, 302*91f16700Schasinglulu [BL338_CERT_ID] = { 303*91f16700Schasinglulu &rcar_dev_handle, 304*91f16700Schasinglulu (uintptr_t) &bl338_cert_file_spec, 305*91f16700Schasinglulu &open_rcar}, { 306*91f16700Schasinglulu #else 307*91f16700Schasinglulu { 308*91f16700Schasinglulu #endif 309*91f16700Schasinglulu 0, 0, 0} 310*91f16700Schasinglulu }; 311*91f16700Schasinglulu 312*91f16700Schasinglulu static io_drv_spec_t io_drv_spec_memdrv = { 313*91f16700Schasinglulu FLASH0_BASE, 314*91f16700Schasinglulu FLASH0_SIZE, 315*91f16700Schasinglulu 0, 316*91f16700Schasinglulu }; 317*91f16700Schasinglulu 318*91f16700Schasinglulu static io_drv_spec_t io_drv_spec_emmcdrv = { 319*91f16700Schasinglulu 0, 320*91f16700Schasinglulu 0, 321*91f16700Schasinglulu 0, 322*91f16700Schasinglulu }; 323*91f16700Schasinglulu 324*91f16700Schasinglulu static struct plat_io_policy drv_policies[] __attribute__ ((section(".data"))) = { 325*91f16700Schasinglulu /* FLASH_DEV_ID */ 326*91f16700Schasinglulu { &memdrv_dev_handle, (uintptr_t) &io_drv_spec_memdrv, &open_memmap, }, 327*91f16700Schasinglulu /* EMMC_DEV_ID */ 328*91f16700Schasinglulu { &emmcdrv_dev_handle, (uintptr_t) &io_drv_spec_emmcdrv, &open_emmcdrv, } 329*91f16700Schasinglulu }; 330*91f16700Schasinglulu 331*91f16700Schasinglulu static int32_t open_rcar(const uintptr_t spec) 332*91f16700Schasinglulu { 333*91f16700Schasinglulu return io_dev_init(rcar_dev_handle, boot_io_drv_id); 334*91f16700Schasinglulu } 335*91f16700Schasinglulu 336*91f16700Schasinglulu static int32_t open_memmap(const uintptr_t spec) 337*91f16700Schasinglulu { 338*91f16700Schasinglulu uintptr_t handle; 339*91f16700Schasinglulu int32_t result; 340*91f16700Schasinglulu 341*91f16700Schasinglulu result = io_dev_init(memdrv_dev_handle, 0); 342*91f16700Schasinglulu if (result != IO_SUCCESS) 343*91f16700Schasinglulu return result; 344*91f16700Schasinglulu 345*91f16700Schasinglulu result = io_open(memdrv_dev_handle, spec, &handle); 346*91f16700Schasinglulu if (result == IO_SUCCESS) 347*91f16700Schasinglulu io_close(handle); 348*91f16700Schasinglulu 349*91f16700Schasinglulu return result; 350*91f16700Schasinglulu } 351*91f16700Schasinglulu 352*91f16700Schasinglulu static int32_t open_emmcdrv(const uintptr_t spec) 353*91f16700Schasinglulu { 354*91f16700Schasinglulu return io_dev_init(emmcdrv_dev_handle, 0); 355*91f16700Schasinglulu } 356*91f16700Schasinglulu 357*91f16700Schasinglulu void rcar_io_setup(void) 358*91f16700Schasinglulu { 359*91f16700Schasinglulu const io_dev_connector_t *memmap; 360*91f16700Schasinglulu const io_dev_connector_t *rcar; 361*91f16700Schasinglulu 362*91f16700Schasinglulu boot_io_drv_id = FLASH_DEV_ID; 363*91f16700Schasinglulu 364*91f16700Schasinglulu rcar_register_io_dev(&rcar); 365*91f16700Schasinglulu rcar_register_io_dev_memdrv(&memmap); 366*91f16700Schasinglulu io_dev_open(rcar, 0, &rcar_dev_handle); 367*91f16700Schasinglulu io_dev_open(memmap, 0, &memdrv_dev_handle); 368*91f16700Schasinglulu } 369*91f16700Schasinglulu 370*91f16700Schasinglulu void rcar_io_emmc_setup(void) 371*91f16700Schasinglulu { 372*91f16700Schasinglulu const io_dev_connector_t *rcar; 373*91f16700Schasinglulu const io_dev_connector_t *emmc; 374*91f16700Schasinglulu 375*91f16700Schasinglulu boot_io_drv_id = EMMC_DEV_ID; 376*91f16700Schasinglulu 377*91f16700Schasinglulu rcar_register_io_dev(&rcar); 378*91f16700Schasinglulu rcar_register_io_dev_emmcdrv(&emmc); 379*91f16700Schasinglulu io_dev_open(rcar, 0, &rcar_dev_handle); 380*91f16700Schasinglulu io_dev_open(emmc, 0, &emmcdrv_dev_handle); 381*91f16700Schasinglulu } 382*91f16700Schasinglulu 383*91f16700Schasinglulu int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle, 384*91f16700Schasinglulu uintptr_t *image_spec) 385*91f16700Schasinglulu { 386*91f16700Schasinglulu const struct plat_io_policy *policy; 387*91f16700Schasinglulu int result; 388*91f16700Schasinglulu 389*91f16700Schasinglulu policy = &policies[image_id]; 390*91f16700Schasinglulu 391*91f16700Schasinglulu result = policy->check(policy->image_spec); 392*91f16700Schasinglulu if (result != IO_SUCCESS) 393*91f16700Schasinglulu return result; 394*91f16700Schasinglulu 395*91f16700Schasinglulu *image_spec = policy->image_spec; 396*91f16700Schasinglulu *dev_handle = *(policy->dev_handle); 397*91f16700Schasinglulu 398*91f16700Schasinglulu return IO_SUCCESS; 399*91f16700Schasinglulu } 400*91f16700Schasinglulu 401*91f16700Schasinglulu int32_t plat_get_drv_source(uint32_t io_drv_id, uintptr_t *dev_handle, 402*91f16700Schasinglulu uintptr_t *image_spec) 403*91f16700Schasinglulu { 404*91f16700Schasinglulu const struct plat_io_policy *policy; 405*91f16700Schasinglulu int32_t result; 406*91f16700Schasinglulu 407*91f16700Schasinglulu policy = &drv_policies[io_drv_id]; 408*91f16700Schasinglulu 409*91f16700Schasinglulu result = policy->check(policy->image_spec); 410*91f16700Schasinglulu if (result != IO_SUCCESS) 411*91f16700Schasinglulu return result; 412*91f16700Schasinglulu 413*91f16700Schasinglulu *image_spec = policy->image_spec; 414*91f16700Schasinglulu *dev_handle = *(policy->dev_handle); 415*91f16700Schasinglulu 416*91f16700Schasinglulu return IO_SUCCESS; 417*91f16700Schasinglulu } 418