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) 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 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 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) 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) 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