Home | History | Annotate | Download | only in common
      1 /*
      2  * Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved.
      3  *
      4  * SPDX-License-Identifier: BSD-3-Clause
      5  */
      6 
      7 #ifndef __PLATFORM_H__
      8 #define __PLATFORM_H__
      9 
     10 #include <psci.h>
     11 #include <stdint.h>
     12 #include <types.h>
     13 
     14 
     15 /*******************************************************************************
     16  * Forward declarations
     17  ******************************************************************************/
     18 struct auth_img_desc_s;
     19 struct meminfo;
     20 struct image_info;
     21 struct entry_point_info;
     22 struct bl31_params;
     23 struct image_desc;
     24 struct bl_load_info;
     25 struct bl_params;
     26 
     27 /*******************************************************************************
     28  * plat_get_rotpk_info() flags
     29  ******************************************************************************/
     30 #define ROTPK_IS_HASH			(1 << 0)
     31 /* Flag used to skip verification of the certificate ROTPK while the platform
     32    ROTPK is not deployed */
     33 #define ROTPK_NOT_DEPLOYED		(1 << 1)
     34 
     35 /*******************************************************************************
     36  * Function declarations
     37  ******************************************************************************/
     38 /*******************************************************************************
     39  * Mandatory common functions
     40  ******************************************************************************/
     41 unsigned long long plat_get_syscnt_freq(void) __deprecated;
     42 unsigned int plat_get_syscnt_freq2(void);
     43 
     44 int plat_get_image_source(unsigned int image_id,
     45 			uintptr_t *dev_handle,
     46 			uintptr_t *image_spec);
     47 uintptr_t plat_get_ns_image_entrypoint(void);
     48 unsigned int plat_my_core_pos(void);
     49 int plat_core_pos_by_mpidr(u_register_t mpidr);
     50 
     51 #if STACK_PROTECTOR_ENABLED
     52 /*
     53  * Return a new value to be used for the stack protection's canary.
     54  *
     55  * Ideally, this value is a random number that is impossible to predict by an
     56  * attacker.
     57  */
     58 u_register_t plat_get_stack_protector_canary(void);
     59 #endif /* STACK_PROTECTOR_ENABLED */
     60 
     61 /*******************************************************************************
     62  * Mandatory interrupt management functions
     63  ******************************************************************************/
     64 uint32_t plat_ic_get_pending_interrupt_id(void);
     65 uint32_t plat_ic_get_pending_interrupt_type(void);
     66 uint32_t plat_ic_acknowledge_interrupt(void);
     67 uint32_t plat_ic_get_interrupt_type(uint32_t id);
     68 void plat_ic_end_of_interrupt(uint32_t id);
     69 uint32_t plat_interrupt_type_to_line(uint32_t type,
     70 				     uint32_t security_state);
     71 
     72 /*******************************************************************************
     73  * Optional interrupt management functions, depending on chosen EL3 components.
     74  ******************************************************************************/
     75 unsigned int plat_ic_get_running_priority(void);
     76 int plat_ic_is_spi(unsigned int id);
     77 int plat_ic_is_ppi(unsigned int id);
     78 int plat_ic_is_sgi(unsigned int id);
     79 unsigned int plat_ic_get_interrupt_active(unsigned int id);
     80 void plat_ic_disable_interrupt(unsigned int id);
     81 void plat_ic_enable_interrupt(unsigned int id);
     82 int plat_ic_has_interrupt_type(unsigned int type);
     83 void plat_ic_set_interrupt_type(unsigned int id, unsigned int type);
     84 void plat_ic_set_interrupt_priority(unsigned int id, unsigned int priority);
     85 void plat_ic_raise_el3_sgi(int sgi_num, u_register_t target);
     86 void plat_ic_set_spi_routing(unsigned int id, unsigned int routing_mode,
     87 		u_register_t mpidr);
     88 void plat_ic_set_interrupt_pending(unsigned int id);
     89 void plat_ic_clear_interrupt_pending(unsigned int id);
     90 unsigned int plat_ic_set_priority_mask(unsigned int mask);
     91 
     92 /*******************************************************************************
     93  * Optional common functions (may be overridden)
     94  ******************************************************************************/
     95 uintptr_t plat_get_my_stack(void);
     96 void plat_report_exception(unsigned int exception_type);
     97 int plat_crash_console_init(void);
     98 int plat_crash_console_putc(int c);
     99 int plat_crash_console_flush(void);
    100 void plat_error_handler(int err) __dead2;
    101 void plat_panic_handler(void) __dead2;
    102 const char *plat_log_get_prefix(unsigned int log_level);
    103 void bl2_plat_preload_setup(void);
    104 int plat_try_next_boot_source(void);
    105 
    106 /*******************************************************************************
    107  * Mandatory BL1 functions
    108  ******************************************************************************/
    109 void bl1_early_platform_setup(void);
    110 void bl1_plat_arch_setup(void);
    111 void bl1_platform_setup(void);
    112 struct meminfo *bl1_plat_sec_mem_layout(void);
    113 
    114 /*
    115  * The following function is mandatory when the
    116  * firmware update feature is used.
    117  */
    118 int bl1_plat_mem_check(uintptr_t mem_base, unsigned int mem_size,
    119 		unsigned int flags);
    120 
    121 /*******************************************************************************
    122  * Optional BL1 functions (may be overridden)
    123  ******************************************************************************/
    124 void bl1_init_bl2_mem_layout(const struct meminfo *bl1_mem_layout,
    125 			     struct meminfo *bl2_mem_layout);
    126 
    127 /*
    128  * The following functions are used for image loading process in BL1.
    129  */
    130 void bl1_plat_set_ep_info(unsigned int image_id,
    131 		struct entry_point_info *ep_info);
    132 /*
    133  * The following functions are mandatory when firmware update
    134  * feature is used and optional otherwise.
    135  */
    136 unsigned int bl1_plat_get_next_image_id(void);
    137 struct image_desc *bl1_plat_get_image_desc(unsigned int image_id);
    138 
    139 /*
    140  * The following functions are used by firmware update
    141  * feature and may optionally be overridden.
    142  */
    143 __dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved);
    144 
    145 
    146 /*******************************************************************************
    147  * Mandatory BL2 functions
    148  ******************************************************************************/
    149 void bl2_early_platform_setup(struct meminfo *mem_layout);
    150 void bl2_plat_arch_setup(void);
    151 void bl2_platform_setup(void);
    152 struct meminfo *bl2_plat_sec_mem_layout(void);
    153 
    154 #if LOAD_IMAGE_V2
    155 /*
    156  * This function can be used by the platforms to update/use image
    157  * information for given `image_id`.
    158  */
    159 int bl2_plat_handle_post_image_load(unsigned int image_id);
    160 
    161 #else /* LOAD_IMAGE_V2 */
    162 
    163 /*
    164  * This function returns a pointer to the shared memory that the platform has
    165  * kept aside to pass trusted firmware related information that BL31
    166  * could need
    167  */
    168 struct bl31_params *bl2_plat_get_bl31_params(void);
    169 
    170 /*
    171  * This function returns a pointer to the shared memory that the platform
    172  * has kept to point to entry point information of BL31 to BL2
    173  */
    174 struct entry_point_info *bl2_plat_get_bl31_ep_info(void);
    175 
    176 /*
    177  * This function flushes to main memory all the params that are
    178  * passed to BL31
    179  */
    180 void bl2_plat_flush_bl31_params(void);
    181 
    182 /*
    183  * The next 2 functions allow the platform to change the entrypoint information
    184  * for the mandatory 3rd level BL images, BL31 and BL33. This is done after
    185  * BL2 has loaded those images into memory but before BL31 is executed.
    186  */
    187 void bl2_plat_set_bl31_ep_info(struct image_info *image,
    188 			       struct entry_point_info *ep);
    189 
    190 void bl2_plat_set_bl33_ep_info(struct image_info *image,
    191 			       struct entry_point_info *ep);
    192 
    193 /* Gets the memory layout for BL33 */
    194 void bl2_plat_get_bl33_meminfo(struct meminfo *mem_info);
    195 
    196 /*******************************************************************************
    197  * Conditionally mandatory BL2 functions: must be implemented if SCP_BL2 image
    198  * is supported
    199  ******************************************************************************/
    200 /* Gets the memory layout for SCP_BL2 */
    201 void bl2_plat_get_scp_bl2_meminfo(struct meminfo *mem_info);
    202 
    203 /*
    204  * This function is called after loading SCP_BL2 image and it is used to perform
    205  * any platform-specific actions required to handle the SCP firmware.
    206  */
    207 int bl2_plat_handle_scp_bl2(struct image_info *scp_bl2_image_info);
    208 
    209 /*******************************************************************************
    210  * Conditionally mandatory BL2 functions: must be implemented if BL32 image
    211  * is supported
    212  ******************************************************************************/
    213 void bl2_plat_set_bl32_ep_info(struct image_info *image,
    214 			       struct entry_point_info *ep);
    215 
    216 /* Gets the memory layout for BL32 */
    217 void bl2_plat_get_bl32_meminfo(struct meminfo *mem_info);
    218 
    219 #endif /* LOAD_IMAGE_V2 */
    220 
    221 /*******************************************************************************
    222  * Optional BL2 functions (may be overridden)
    223  ******************************************************************************/
    224 
    225 /*******************************************************************************
    226  * Mandatory BL2U functions.
    227  ******************************************************************************/
    228 void bl2u_early_platform_setup(struct meminfo *mem_layout,
    229 		void *plat_info);
    230 void bl2u_plat_arch_setup(void);
    231 void bl2u_platform_setup(void);
    232 
    233 /*******************************************************************************
    234  * Conditionally mandatory BL2U functions for CSS platforms.
    235  ******************************************************************************/
    236 /*
    237  * This function is used to perform any platform-specific actions required to
    238  * handle the BL2U_SCP firmware.
    239  */
    240 int bl2u_plat_handle_scp_bl2u(void);
    241 
    242 /*******************************************************************************
    243  * Mandatory BL31 functions
    244  ******************************************************************************/
    245 #if LOAD_IMAGE_V2
    246 void bl31_early_platform_setup(void *from_bl2,
    247 				void *plat_params_from_bl2);
    248 #else
    249 void bl31_early_platform_setup(struct bl31_params *from_bl2,
    250 				void *plat_params_from_bl2);
    251 #endif
    252 void bl31_plat_arch_setup(void);
    253 void bl31_platform_setup(void);
    254 void bl31_plat_runtime_setup(void);
    255 struct entry_point_info *bl31_plat_get_next_image_ep_info(uint32_t type);
    256 
    257 /*******************************************************************************
    258  * Mandatory PSCI functions (BL31)
    259  ******************************************************************************/
    260 int plat_setup_psci_ops(uintptr_t sec_entrypoint,
    261 			const struct plat_psci_ops **);
    262 const unsigned char *plat_get_power_domain_tree_desc(void);
    263 
    264 /*******************************************************************************
    265  * Optional PSCI functions (BL31).
    266  ******************************************************************************/
    267 void plat_psci_stat_accounting_start(const psci_power_state_t *state_info);
    268 void plat_psci_stat_accounting_stop(const psci_power_state_t *state_info);
    269 u_register_t plat_psci_stat_get_residency(unsigned int lvl,
    270 			const psci_power_state_t *state_info,
    271 			int last_cpu_index);
    272 plat_local_state_t plat_get_target_pwr_state(unsigned int lvl,
    273 			const plat_local_state_t *states,
    274 			unsigned int ncpu);
    275 
    276 /*******************************************************************************
    277  * Optional BL31 functions (may be overridden)
    278  ******************************************************************************/
    279 void bl31_plat_enable_mmu(uint32_t flags);
    280 
    281 /*******************************************************************************
    282  * Optional BL32 functions (may be overridden)
    283  ******************************************************************************/
    284 void bl32_plat_enable_mmu(uint32_t flags);
    285 
    286 /*******************************************************************************
    287  * Trusted Board Boot functions
    288  ******************************************************************************/
    289 int plat_get_rotpk_info(void *cookie, void **key_ptr, unsigned int *key_len,
    290 			unsigned int *flags);
    291 int plat_get_nv_ctr(void *cookie, unsigned int *nv_ctr);
    292 int plat_set_nv_ctr(void *cookie, unsigned int nv_ctr);
    293 int plat_set_nv_ctr2(void *cookie, const struct auth_img_desc_s *img_desc,
    294 		unsigned int nv_ctr);
    295 
    296 #if LOAD_IMAGE_V2
    297 /*******************************************************************************
    298  * Mandatory BL image load functions(may be overridden).
    299  ******************************************************************************/
    300 /*
    301  * This function returns pointer to the list of images that the
    302  * platform has populated to load.
    303  */
    304 struct bl_load_info *plat_get_bl_image_load_info(void);
    305 
    306 /*
    307  * This function returns a pointer to the shared memory that the
    308  * platform has kept aside to pass trusted firmware related
    309  * information that next BL image could need.
    310  */
    311 struct bl_params *plat_get_next_bl_params(void);
    312 
    313 /*
    314  * This function flushes to main memory all the params that are
    315  * passed to next image.
    316  */
    317 void plat_flush_next_bl_params(void);
    318 
    319 #endif /* LOAD_IMAGE_V2 */
    320 
    321 #if ENABLE_PLAT_COMPAT
    322 /*
    323  * The below declarations are to enable compatibility for the platform ports
    324  * using the old platform interface.
    325  */
    326 
    327 /*******************************************************************************
    328  * Optional common functions (may be overridden)
    329  ******************************************************************************/
    330 unsigned int platform_get_core_pos(unsigned long mpidr);
    331 
    332 /*******************************************************************************
    333  * Mandatory PSCI Compatibility functions (BL31)
    334  ******************************************************************************/
    335 int platform_setup_pm(const plat_pm_ops_t **);
    336 
    337 unsigned int plat_get_aff_count(unsigned int, unsigned long);
    338 unsigned int plat_get_aff_state(unsigned int, unsigned long);
    339 #else /* __ENABLE_PLAT_COMPAT__ */
    340 /*
    341  * The below function enable Trusted Firmware components like SPDs which
    342  * haven't migrated to the new platform API to compile on platforms which
    343  * have the compatibility layer disabled.
    344  */
    345 unsigned int platform_get_core_pos(unsigned long mpidr) __deprecated;
    346 
    347 #endif /* __ENABLE_PLAT_COMPAT__ */
    348 
    349 #endif /* __PLATFORM_H__ */
    350 
    351