xref: /arm-trusted-firmware/plat/nxp/common/setup/include/plat_common.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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