1 /* 2 * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are met: 6 * 7 * Redistributions of source code must retain the above copyright notice, this 8 * list of conditions and the following disclaimer. 9 * 10 * Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 14 * Neither the name of ARM nor the names of its contributors may be used 15 * to endorse or promote products derived from this software without specific 16 * prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #ifndef __PLATFORM_H__ 32 #define __PLATFORM_H__ 33 34 #include <psci.h> 35 #include <stdint.h> 36 #include <types.h> 37 38 39 /******************************************************************************* 40 * Forward declarations 41 ******************************************************************************/ 42 struct auth_img_desc_s; 43 struct meminfo; 44 struct image_info; 45 struct entry_point_info; 46 struct bl31_params; 47 struct image_desc; 48 struct bl_load_info; 49 struct bl_params; 50 51 /******************************************************************************* 52 * plat_get_rotpk_info() flags 53 ******************************************************************************/ 54 #define ROTPK_IS_HASH (1 << 0) 55 /* Flag used to skip verification of the certificate ROTPK while the platform 56 ROTPK is not deployed */ 57 #define ROTPK_NOT_DEPLOYED (1 << 1) 58 59 /******************************************************************************* 60 * Function declarations 61 ******************************************************************************/ 62 /******************************************************************************* 63 * Mandatory common functions 64 ******************************************************************************/ 65 unsigned long long plat_get_syscnt_freq(void) __deprecated; 66 unsigned int plat_get_syscnt_freq2(void); 67 68 int plat_get_image_source(unsigned int image_id, 69 uintptr_t *dev_handle, 70 uintptr_t *image_spec); 71 uintptr_t plat_get_ns_image_entrypoint(void); 72 unsigned int plat_my_core_pos(void); 73 int plat_core_pos_by_mpidr(u_register_t mpidr); 74 75 /******************************************************************************* 76 * Mandatory interrupt management functions 77 ******************************************************************************/ 78 uint32_t plat_ic_get_pending_interrupt_id(void); 79 uint32_t plat_ic_get_pending_interrupt_type(void); 80 uint32_t plat_ic_acknowledge_interrupt(void); 81 uint32_t plat_ic_get_interrupt_type(uint32_t id); 82 void plat_ic_end_of_interrupt(uint32_t id); 83 uint32_t plat_interrupt_type_to_line(uint32_t type, 84 uint32_t security_state); 85 86 /******************************************************************************* 87 * Optional common functions (may be overridden) 88 ******************************************************************************/ 89 uintptr_t plat_get_my_stack(void); 90 void plat_report_exception(unsigned int exception_type); 91 int plat_crash_console_init(void); 92 int plat_crash_console_putc(int c); 93 int plat_crash_console_flush(void); 94 void plat_error_handler(int err) __dead2; 95 void plat_panic_handler(void) __dead2; 96 97 /******************************************************************************* 98 * Mandatory BL1 functions 99 ******************************************************************************/ 100 void bl1_early_platform_setup(void); 101 void bl1_plat_arch_setup(void); 102 void bl1_platform_setup(void); 103 struct meminfo *bl1_plat_sec_mem_layout(void); 104 105 /* 106 * The following function is mandatory when the 107 * firmware update feature is used. 108 */ 109 int bl1_plat_mem_check(uintptr_t mem_base, unsigned int mem_size, 110 unsigned int flags); 111 112 /******************************************************************************* 113 * Optional BL1 functions (may be overridden) 114 ******************************************************************************/ 115 void bl1_init_bl2_mem_layout(const struct meminfo *bl1_mem_layout, 116 struct meminfo *bl2_mem_layout); 117 118 /* 119 * The following functions are used for image loading process in BL1. 120 */ 121 void bl1_plat_set_ep_info(unsigned int image_id, 122 struct entry_point_info *ep_info); 123 /* 124 * The following functions are mandatory when firmware update 125 * feature is used and optional otherwise. 126 */ 127 unsigned int bl1_plat_get_next_image_id(void); 128 struct image_desc *bl1_plat_get_image_desc(unsigned int image_id); 129 130 /* 131 * The following functions are used by firmware update 132 * feature and may optionally be overridden. 133 */ 134 __dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved); 135 136 137 /******************************************************************************* 138 * Mandatory BL2 functions 139 ******************************************************************************/ 140 void bl2_early_platform_setup(struct meminfo *mem_layout); 141 void bl2_plat_arch_setup(void); 142 void bl2_platform_setup(void); 143 struct meminfo *bl2_plat_sec_mem_layout(void); 144 145 #if LOAD_IMAGE_V2 146 /* 147 * This function can be used by the platforms to update/use image 148 * information for given `image_id`. 149 */ 150 int bl2_plat_handle_post_image_load(unsigned int image_id); 151 152 #else /* LOAD_IMAGE_V2 */ 153 154 /* 155 * This function returns a pointer to the shared memory that the platform has 156 * kept aside to pass trusted firmware related information that BL31 157 * could need 158 */ 159 struct bl31_params *bl2_plat_get_bl31_params(void); 160 161 /* 162 * This function returns a pointer to the shared memory that the platform 163 * has kept to point to entry point information of BL31 to BL2 164 */ 165 struct entry_point_info *bl2_plat_get_bl31_ep_info(void); 166 167 /* 168 * This function flushes to main memory all the params that are 169 * passed to BL31 170 */ 171 void bl2_plat_flush_bl31_params(void); 172 173 /* 174 * The next 2 functions allow the platform to change the entrypoint information 175 * for the mandatory 3rd level BL images, BL31 and BL33. This is done after 176 * BL2 has loaded those images into memory but before BL31 is executed. 177 */ 178 void bl2_plat_set_bl31_ep_info(struct image_info *image, 179 struct entry_point_info *ep); 180 181 void bl2_plat_set_bl33_ep_info(struct image_info *image, 182 struct entry_point_info *ep); 183 184 /* Gets the memory layout for BL33 */ 185 void bl2_plat_get_bl33_meminfo(struct meminfo *mem_info); 186 187 /******************************************************************************* 188 * Conditionally mandatory BL2 functions: must be implemented if SCP_BL2 image 189 * is supported 190 ******************************************************************************/ 191 /* Gets the memory layout for SCP_BL2 */ 192 void bl2_plat_get_scp_bl2_meminfo(struct meminfo *mem_info); 193 194 /* 195 * This function is called after loading SCP_BL2 image and it is used to perform 196 * any platform-specific actions required to handle the SCP firmware. 197 */ 198 int bl2_plat_handle_scp_bl2(struct image_info *scp_bl2_image_info); 199 200 /******************************************************************************* 201 * Conditionally mandatory BL2 functions: must be implemented if BL32 image 202 * is supported 203 ******************************************************************************/ 204 void bl2_plat_set_bl32_ep_info(struct image_info *image, 205 struct entry_point_info *ep); 206 207 /* Gets the memory layout for BL32 */ 208 void bl2_plat_get_bl32_meminfo(struct meminfo *mem_info); 209 210 #endif /* LOAD_IMAGE_V2 */ 211 212 /******************************************************************************* 213 * Optional BL2 functions (may be overridden) 214 ******************************************************************************/ 215 216 /******************************************************************************* 217 * Mandatory BL2U functions. 218 ******************************************************************************/ 219 void bl2u_early_platform_setup(struct meminfo *mem_layout, 220 void *plat_info); 221 void bl2u_plat_arch_setup(void); 222 void bl2u_platform_setup(void); 223 224 /******************************************************************************* 225 * Conditionally mandatory BL2U functions for CSS platforms. 226 ******************************************************************************/ 227 /* 228 * This function is used to perform any platform-specific actions required to 229 * handle the BL2U_SCP firmware. 230 */ 231 int bl2u_plat_handle_scp_bl2u(void); 232 233 /******************************************************************************* 234 * Mandatory BL31 functions 235 ******************************************************************************/ 236 #if LOAD_IMAGE_V2 237 void bl31_early_platform_setup(void *from_bl2, 238 void *plat_params_from_bl2); 239 #else 240 void bl31_early_platform_setup(struct bl31_params *from_bl2, 241 void *plat_params_from_bl2); 242 #endif 243 void bl31_plat_arch_setup(void); 244 void bl31_platform_setup(void); 245 void bl31_plat_runtime_setup(void); 246 struct entry_point_info *bl31_plat_get_next_image_ep_info(uint32_t type); 247 248 /******************************************************************************* 249 * Mandatory PSCI functions (BL31) 250 ******************************************************************************/ 251 int plat_setup_psci_ops(uintptr_t sec_entrypoint, 252 const struct plat_psci_ops **); 253 const unsigned char *plat_get_power_domain_tree_desc(void); 254 255 /******************************************************************************* 256 * Optional PSCI functions (BL31). 257 ******************************************************************************/ 258 void plat_psci_stat_accounting_start(const psci_power_state_t *state_info); 259 void plat_psci_stat_accounting_stop(const psci_power_state_t *state_info); 260 u_register_t plat_psci_stat_get_residency(unsigned int lvl, 261 const psci_power_state_t *state_info, 262 int last_cpu_index); 263 plat_local_state_t plat_get_target_pwr_state(unsigned int lvl, 264 const plat_local_state_t *states, 265 unsigned int ncpu); 266 267 /******************************************************************************* 268 * Optional BL31 functions (may be overridden) 269 ******************************************************************************/ 270 void bl31_plat_enable_mmu(uint32_t flags); 271 272 /******************************************************************************* 273 * Optional BL32 functions (may be overridden) 274 ******************************************************************************/ 275 void bl32_plat_enable_mmu(uint32_t flags); 276 277 /******************************************************************************* 278 * Trusted Board Boot functions 279 ******************************************************************************/ 280 int plat_get_rotpk_info(void *cookie, void **key_ptr, unsigned int *key_len, 281 unsigned int *flags); 282 int plat_get_nv_ctr(void *cookie, unsigned int *nv_ctr); 283 int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr); 284 int plat_set_nv_ctr2(void *cookie, const struct auth_img_desc_s *img_desc, 285 unsigned int nv_ctr); 286 287 #if LOAD_IMAGE_V2 288 /******************************************************************************* 289 * Mandatory BL image load functions(may be overridden). 290 ******************************************************************************/ 291 /* 292 * This function returns pointer to the list of images that the 293 * platform has populated to load. 294 */ 295 struct bl_load_info *plat_get_bl_image_load_info(void); 296 297 /* 298 * This function returns a pointer to the shared memory that the 299 * platform has kept aside to pass trusted firmware related 300 * information that next BL image could need. 301 */ 302 struct bl_params *plat_get_next_bl_params(void); 303 304 /* 305 * This function flushes to main memory all the params that are 306 * passed to next image. 307 */ 308 void plat_flush_next_bl_params(void); 309 310 #endif /* LOAD_IMAGE_V2 */ 311 312 #if ENABLE_PLAT_COMPAT 313 /* 314 * The below declarations are to enable compatibility for the platform ports 315 * using the old platform interface. 316 */ 317 318 /******************************************************************************* 319 * Optional common functions (may be overridden) 320 ******************************************************************************/ 321 unsigned int platform_get_core_pos(unsigned long mpidr); 322 323 /******************************************************************************* 324 * Mandatory PSCI Compatibility functions (BL31) 325 ******************************************************************************/ 326 int platform_setup_pm(const plat_pm_ops_t **); 327 328 unsigned int plat_get_aff_count(unsigned int, unsigned long); 329 unsigned int plat_get_aff_state(unsigned int, unsigned long); 330 #else 331 /* 332 * The below function enable Trusted Firmware components like SPDs which 333 * haven't migrated to the new platform API to compile on platforms which 334 * have the compatibility layer disabled. 335 */ 336 unsigned int platform_get_core_pos(unsigned long mpidr) __deprecated; 337 338 #endif /* __ENABLE_PLAT_COMPAT__ */ 339 #endif /* __PLATFORM_H__ */ 340