xref: /rk3399_ARM-atf/include/plat/common/platform.h (revision 63a6d09a084386f27a240602fd3be9a975ba65df)
1 /*
2  * Copyright (c) 2013-2016, 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 meminfo;
43 struct image_info;
44 struct entry_point_info;
45 struct bl31_params;
46 struct image_desc;
47 
48 /*******************************************************************************
49  * plat_get_rotpk_info() flags
50  ******************************************************************************/
51 #define ROTPK_IS_HASH			(1 << 0)
52 
53 /*******************************************************************************
54  * Function declarations
55  ******************************************************************************/
56 /*******************************************************************************
57  * Mandatory common functions
58  ******************************************************************************/
59 uint64_t plat_get_syscnt_freq(void);
60 int plat_get_image_source(unsigned int image_id,
61 			uintptr_t *dev_handle,
62 			uintptr_t *image_spec);
63 unsigned long plat_get_ns_image_entrypoint(void);
64 unsigned int plat_my_core_pos(void);
65 int plat_core_pos_by_mpidr(u_register_t mpidr);
66 
67 /*******************************************************************************
68  * Mandatory interrupt management functions
69  ******************************************************************************/
70 uint32_t plat_ic_get_pending_interrupt_id(void);
71 uint32_t plat_ic_get_pending_interrupt_type(void);
72 uint32_t plat_ic_acknowledge_interrupt(void);
73 uint32_t plat_ic_get_interrupt_type(uint32_t id);
74 void plat_ic_end_of_interrupt(uint32_t id);
75 uint32_t plat_interrupt_type_to_line(uint32_t type,
76 				     uint32_t security_state);
77 
78 /*******************************************************************************
79  * Optional common functions (may be overridden)
80  ******************************************************************************/
81 unsigned long plat_get_my_stack(void);
82 void plat_report_exception(unsigned long);
83 int plat_crash_console_init(void);
84 int plat_crash_console_putc(int c);
85 void plat_error_handler(int err) __dead2;
86 void plat_panic_handler(void) __dead2;
87 
88 /*******************************************************************************
89  * Mandatory BL1 functions
90  ******************************************************************************/
91 void bl1_early_platform_setup(void);
92 void bl1_plat_arch_setup(void);
93 void bl1_platform_setup(void);
94 struct meminfo *bl1_plat_sec_mem_layout(void);
95 
96 /*
97  * The following function is mandatory when the
98  * firmware update feature is used.
99  */
100 int bl1_plat_mem_check(uintptr_t mem_base, unsigned int mem_size,
101 		unsigned int flags);
102 
103 /*******************************************************************************
104  * Optional BL1 functions (may be overridden)
105  ******************************************************************************/
106 void bl1_init_bl2_mem_layout(const struct meminfo *bl1_mem_layout,
107 			     struct meminfo *bl2_mem_layout);
108 
109 /*
110  * The following functions are used for image loading process in BL1.
111  */
112 void bl1_plat_set_ep_info(unsigned int image_id,
113 		struct entry_point_info *ep_info);
114 /*
115  * The following functions are mandatory when firmware update
116  * feature is used and optional otherwise.
117  */
118 unsigned int bl1_plat_get_next_image_id(void);
119 struct image_desc *bl1_plat_get_image_desc(unsigned int image_id);
120 
121 /*
122  * The following functions are used by firmware update
123  * feature and may optionally be overridden.
124  */
125 __dead2 void bl1_plat_fwu_done(void *client_cookie, void *reserved);
126 
127 
128 /*******************************************************************************
129  * Mandatory BL2 functions
130  ******************************************************************************/
131 void bl2_early_platform_setup(struct meminfo *mem_layout);
132 void bl2_plat_arch_setup(void);
133 void bl2_platform_setup(void);
134 struct meminfo *bl2_plat_sec_mem_layout(void);
135 
136 /*
137  * This function returns a pointer to the shared memory that the platform has
138  * kept aside to pass trusted firmware related information that BL31
139  * could need
140  */
141 struct bl31_params *bl2_plat_get_bl31_params(void);
142 
143 /*
144  * This function returns a pointer to the shared memory that the platform
145  * has kept to point to entry point information of BL31 to BL2
146  */
147 struct entry_point_info *bl2_plat_get_bl31_ep_info(void);
148 
149 /*
150  * This function flushes to main memory all the params that are
151  * passed to BL31
152  */
153 void bl2_plat_flush_bl31_params(void);
154 
155 /*
156  * The next 2 functions allow the platform to change the entrypoint information
157  * for the mandatory 3rd level BL images, BL31 and BL33. This is done after
158  * BL2 has loaded those images into memory but before BL31 is executed.
159  */
160 void bl2_plat_set_bl31_ep_info(struct image_info *image,
161 			       struct entry_point_info *ep);
162 
163 void bl2_plat_set_bl33_ep_info(struct image_info *image,
164 			       struct entry_point_info *ep);
165 
166 /* Gets the memory layout for BL33 */
167 void bl2_plat_get_bl33_meminfo(struct meminfo *mem_info);
168 
169 /*******************************************************************************
170  * Conditionally mandatory BL2 functions: must be implemented if SCP_BL2 image
171  * is supported
172  ******************************************************************************/
173 /* Gets the memory layout for SCP_BL2 */
174 void bl2_plat_get_scp_bl2_meminfo(struct meminfo *mem_info);
175 
176 /*
177  * This function is called after loading SCP_BL2 image and it is used to perform
178  * any platform-specific actions required to handle the SCP firmware.
179  */
180 int bl2_plat_handle_scp_bl2(struct image_info *scp_bl2_image_info);
181 
182 /*******************************************************************************
183  * Conditionally mandatory BL2 functions: must be implemented if BL32 image
184  * is supported
185  ******************************************************************************/
186 void bl2_plat_set_bl32_ep_info(struct image_info *image,
187 			       struct entry_point_info *ep);
188 
189 /* Gets the memory layout for BL32 */
190 void bl2_plat_get_bl32_meminfo(struct meminfo *mem_info);
191 
192 /*******************************************************************************
193  * Optional BL2 functions (may be overridden)
194  ******************************************************************************/
195 
196 /*******************************************************************************
197  * Mandatory BL2U functions.
198  ******************************************************************************/
199 void bl2u_early_platform_setup(struct meminfo *mem_layout,
200 		void *plat_info);
201 void bl2u_plat_arch_setup(void);
202 void bl2u_platform_setup(void);
203 
204 /*******************************************************************************
205  * Conditionally mandatory BL2U functions for CSS platforms.
206  ******************************************************************************/
207 /*
208  * This function is used to perform any platform-specific actions required to
209  * handle the BL2U_SCP firmware.
210  */
211 int bl2u_plat_handle_scp_bl2u(void);
212 
213 /*******************************************************************************
214  * Mandatory BL31 functions
215  ******************************************************************************/
216 void bl31_early_platform_setup(struct bl31_params *from_bl2,
217 				void *plat_params_from_bl2);
218 void bl31_plat_arch_setup(void);
219 void bl31_platform_setup(void);
220 void bl31_plat_runtime_setup(void);
221 struct entry_point_info *bl31_plat_get_next_image_ep_info(uint32_t type);
222 
223 /*******************************************************************************
224  * Mandatory PSCI functions (BL31)
225  ******************************************************************************/
226 int plat_setup_psci_ops(uintptr_t sec_entrypoint,
227 			const struct plat_psci_ops **);
228 const unsigned char *plat_get_power_domain_tree_desc(void);
229 
230 /*******************************************************************************
231  * Optional PSCI functions (BL31).
232  ******************************************************************************/
233 plat_local_state_t plat_get_target_pwr_state(unsigned int lvl,
234 			const plat_local_state_t *states,
235 			unsigned int ncpu);
236 
237 /*******************************************************************************
238  * Optional BL31 functions (may be overridden)
239  ******************************************************************************/
240 void bl31_plat_enable_mmu(uint32_t flags);
241 
242 /*******************************************************************************
243  * Optional BL32 functions (may be overridden)
244  ******************************************************************************/
245 void bl32_plat_enable_mmu(uint32_t flags);
246 
247 /*******************************************************************************
248  * Trusted Board Boot functions
249  ******************************************************************************/
250 int plat_get_rotpk_info(void *cookie, void **key_ptr, unsigned int *key_len,
251 			unsigned int *flags);
252 
253 #if ENABLE_PLAT_COMPAT
254 /*
255  * The below declarations are to enable compatibility for the platform ports
256  * using the old platform interface.
257  */
258 
259 /*******************************************************************************
260  * Optional common functions (may be overridden)
261  ******************************************************************************/
262 unsigned int platform_get_core_pos(unsigned long mpidr);
263 
264 /*******************************************************************************
265  * Mandatory PSCI Compatibility functions (BL31)
266  ******************************************************************************/
267 int platform_setup_pm(const plat_pm_ops_t **);
268 
269 unsigned int plat_get_aff_count(unsigned int, unsigned long);
270 unsigned int plat_get_aff_state(unsigned int, unsigned long);
271 #else
272 /*
273  * The below function enable Trusted Firmware components like SPDs which
274  * haven't migrated to the new platform API to compile on platforms which
275  * have the compatibility layer disabled.
276  */
277 unsigned int platform_get_core_pos(unsigned long mpidr) __deprecated;
278 
279 #endif /* __ENABLE_PLAT_COMPAT__ */
280 #endif /* __PLATFORM_H__ */
281