1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright 2018-2021 NXP 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu * 6*91f16700Schasinglulu */ 7*91f16700Schasinglulu 8*91f16700Schasinglulu #ifndef PLAT_COMMON_H 9*91f16700Schasinglulu #define PLAT_COMMON_H 10*91f16700Schasinglulu 11*91f16700Schasinglulu #include <stdbool.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #include <dcfg.h> 14*91f16700Schasinglulu #include <lib/el3_runtime/cpu_data.h> 15*91f16700Schasinglulu 16*91f16700Schasinglulu #include <platform_def.h> 17*91f16700Schasinglulu 18*91f16700Schasinglulu #ifdef IMAGE_BL31 19*91f16700Schasinglulu 20*91f16700Schasinglulu #define BL31_END (uintptr_t)(&__BL31_END__) 21*91f16700Schasinglulu 22*91f16700Schasinglulu /******************************************************************************* 23*91f16700Schasinglulu * This structure represents the superset of information that can be passed to 24*91f16700Schasinglulu * BL31 e.g. while passing control to it from BL2. The BL32 parameters will be 25*91f16700Schasinglulu * populated only if BL2 detects its presence. A pointer to a structure of this 26*91f16700Schasinglulu * type should be passed in X0 to BL31's cold boot entrypoint. 27*91f16700Schasinglulu * 28*91f16700Schasinglulu * Use of this structure and the X0 parameter is not mandatory: the BL31 29*91f16700Schasinglulu * platform code can use other mechanisms to provide the necessary information 30*91f16700Schasinglulu * about BL32 and BL33 to the common and SPD code. 31*91f16700Schasinglulu * 32*91f16700Schasinglulu * BL31 image information is mandatory if this structure is used. If either of 33*91f16700Schasinglulu * the optional BL32 and BL33 image information is not provided, this is 34*91f16700Schasinglulu * indicated by the respective image_info pointers being zero. 35*91f16700Schasinglulu ******************************************************************************/ 36*91f16700Schasinglulu typedef struct bl31_params { 37*91f16700Schasinglulu param_header_t h; 38*91f16700Schasinglulu image_info_t *bl31_image_info; 39*91f16700Schasinglulu entry_point_info_t *bl32_ep_info; 40*91f16700Schasinglulu image_info_t *bl32_image_info; 41*91f16700Schasinglulu entry_point_info_t *bl33_ep_info; 42*91f16700Schasinglulu image_info_t *bl33_image_info; 43*91f16700Schasinglulu } bl31_params_t; 44*91f16700Schasinglulu 45*91f16700Schasinglulu /* BL3 utility functions */ 46*91f16700Schasinglulu void ls_bl31_early_platform_setup(void *from_bl2, 47*91f16700Schasinglulu void *plat_params_from_bl2); 48*91f16700Schasinglulu /* LS Helper functions */ 49*91f16700Schasinglulu unsigned int plat_my_core_mask(void); 50*91f16700Schasinglulu unsigned int plat_core_mask(u_register_t mpidr); 51*91f16700Schasinglulu unsigned int plat_core_pos(u_register_t mpidr); 52*91f16700Schasinglulu //unsigned int plat_my_core_pos(void); 53*91f16700Schasinglulu 54*91f16700Schasinglulu /* BL31 Data API(s) */ 55*91f16700Schasinglulu void _init_global_data(void); 56*91f16700Schasinglulu void _initialize_psci(void); 57*91f16700Schasinglulu uint32_t _getCoreState(u_register_t core_mask); 58*91f16700Schasinglulu void _setCoreState(u_register_t core_mask, u_register_t core_state); 59*91f16700Schasinglulu 60*91f16700Schasinglulu /* SoC defined structure and API(s) */ 61*91f16700Schasinglulu void soc_runtime_setup(void); 62*91f16700Schasinglulu void soc_init(void); 63*91f16700Schasinglulu void soc_platform_setup(void); 64*91f16700Schasinglulu void soc_early_platform_setup2(void); 65*91f16700Schasinglulu #endif /* IMAGE_BL31 */ 66*91f16700Schasinglulu 67*91f16700Schasinglulu #ifdef IMAGE_BL2 68*91f16700Schasinglulu void soc_early_init(void); 69*91f16700Schasinglulu void soc_mem_access(void); 70*91f16700Schasinglulu void soc_preload_setup(void); 71*91f16700Schasinglulu void soc_bl2_prepare_exit(void); 72*91f16700Schasinglulu 73*91f16700Schasinglulu /* IO storage utility functions */ 74*91f16700Schasinglulu int plat_io_setup(void); 75*91f16700Schasinglulu int open_backend(const uintptr_t spec); 76*91f16700Schasinglulu 77*91f16700Schasinglulu void ls_bl2_plat_arch_setup(void); 78*91f16700Schasinglulu void ls_bl2_el3_plat_arch_setup(void); 79*91f16700Schasinglulu 80*91f16700Schasinglulu enum boot_device { 81*91f16700Schasinglulu BOOT_DEVICE_IFC_NOR, 82*91f16700Schasinglulu BOOT_DEVICE_IFC_NAND, 83*91f16700Schasinglulu BOOT_DEVICE_QSPI, 84*91f16700Schasinglulu BOOT_DEVICE_EMMC, 85*91f16700Schasinglulu BOOT_DEVICE_SDHC2_EMMC, 86*91f16700Schasinglulu BOOT_DEVICE_FLEXSPI_NOR, 87*91f16700Schasinglulu BOOT_DEVICE_FLEXSPI_NAND, 88*91f16700Schasinglulu BOOT_DEVICE_NONE 89*91f16700Schasinglulu }; 90*91f16700Schasinglulu 91*91f16700Schasinglulu enum boot_device get_boot_dev(void); 92*91f16700Schasinglulu 93*91f16700Schasinglulu /* DDR Related functions */ 94*91f16700Schasinglulu #if DDR_INIT 95*91f16700Schasinglulu #ifdef NXP_WARM_BOOT 96*91f16700Schasinglulu long long init_ddr(uint32_t wrm_bt_flg); 97*91f16700Schasinglulu #else 98*91f16700Schasinglulu long long init_ddr(void); 99*91f16700Schasinglulu #endif 100*91f16700Schasinglulu #endif 101*91f16700Schasinglulu 102*91f16700Schasinglulu /* Board specific weak functions */ 103*91f16700Schasinglulu bool board_enable_povdd(void); 104*91f16700Schasinglulu bool board_disable_povdd(void); 105*91f16700Schasinglulu 106*91f16700Schasinglulu void mmap_add_ddr_region_dynamically(void); 107*91f16700Schasinglulu #endif /* IMAGE_BL2 */ 108*91f16700Schasinglulu 109*91f16700Schasinglulu typedef struct { 110*91f16700Schasinglulu uint64_t addr; 111*91f16700Schasinglulu uint64_t size; 112*91f16700Schasinglulu } region_info_t; 113*91f16700Schasinglulu 114*91f16700Schasinglulu typedef struct { 115*91f16700Schasinglulu uint64_t num_dram_regions; 116*91f16700Schasinglulu int64_t total_dram_size; 117*91f16700Schasinglulu region_info_t region[NUM_DRAM_REGIONS]; 118*91f16700Schasinglulu } dram_regions_info_t; 119*91f16700Schasinglulu 120*91f16700Schasinglulu dram_regions_info_t *get_dram_regions_info(void); 121*91f16700Schasinglulu 122*91f16700Schasinglulu void ls_setup_page_tables(uintptr_t total_base, 123*91f16700Schasinglulu size_t total_size, 124*91f16700Schasinglulu uintptr_t code_start, 125*91f16700Schasinglulu uintptr_t code_limit, 126*91f16700Schasinglulu uintptr_t rodata_start, 127*91f16700Schasinglulu uintptr_t rodata_limit 128*91f16700Schasinglulu #if USE_COHERENT_MEM 129*91f16700Schasinglulu , uintptr_t coh_start, 130*91f16700Schasinglulu uintptr_t coh_limit 131*91f16700Schasinglulu #endif 132*91f16700Schasinglulu ); 133*91f16700Schasinglulu 134*91f16700Schasinglulu #define SOC_NAME_MAX_LEN (20) 135*91f16700Schasinglulu 136*91f16700Schasinglulu /* Structure to define SoC personality */ 137*91f16700Schasinglulu struct soc_type { 138*91f16700Schasinglulu char name[SOC_NAME_MAX_LEN]; 139*91f16700Schasinglulu uint32_t version; 140*91f16700Schasinglulu uint8_t num_clusters; 141*91f16700Schasinglulu uint8_t cores_per_cluster; 142*91f16700Schasinglulu }; 143*91f16700Schasinglulu void get_cluster_info(const struct soc_type *soc_list, uint8_t ps_count, 144*91f16700Schasinglulu uint8_t *num_clusters, uint8_t *cores_per_cluster); 145*91f16700Schasinglulu 146*91f16700Schasinglulu #define SOC_ENTRY(n, v, ncl, nc) { \ 147*91f16700Schasinglulu .name = #n, \ 148*91f16700Schasinglulu .version = SVR_##v, \ 149*91f16700Schasinglulu .num_clusters = (ncl), \ 150*91f16700Schasinglulu .cores_per_cluster = (nc)} 151*91f16700Schasinglulu 152*91f16700Schasinglulu #endif /* PLAT_COMMON_H */ 153