xref: /rk3399_ARM-atf/services/spd/tlkd/tlkd_private.h (revision 82cb2c1ad9897473743f08437d0a3995bed561b9)
1 /*
2  * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef __TLKD_PRIVATE_H__
8 #define __TLKD_PRIVATE_H__
9 
10 #include <arch.h>
11 #include <context.h>
12 #include <interrupt_mgmt.h>
13 #include <platform_def.h>
14 #include <psci.h>
15 
16 /*
17  * This flag is used by the TLKD to determine if the SP is servicing a standard
18  * SMC request prior to programming the next entry into the SP e.g. if SP
19  * execution is preempted by a non-secure interrupt and handed control to the
20  * normal world. If another request which is distinct from what the SP was
21  * previously doing arrives, then this flag will be help the TLKD to either
22  * reject the new request or service it while ensuring that the previous context
23  * is not corrupted.
24  */
25 #define STD_SMC_ACTIVE_FLAG_SHIFT	2
26 #define STD_SMC_ACTIVE_FLAG_MASK	1
27 #define get_std_smc_active_flag(state)	(((state) >> STD_SMC_ACTIVE_FLAG_SHIFT) \
28 					 & STD_SMC_ACTIVE_FLAG_MASK)
29 #define set_std_smc_active_flag(state)	((state) |=                           \
30 					 (1 << STD_SMC_ACTIVE_FLAG_SHIFT))
31 #define clr_std_smc_active_flag(state)	((state) &=                           \
32 					 ~(STD_SMC_ACTIVE_FLAG_MASK           \
33 					   << STD_SMC_ACTIVE_FLAG_SHIFT))
34 
35 /*******************************************************************************
36  * Translate virtual address received from the NS world
37  ******************************************************************************/
38 #define TLK_TRANSLATE_NS_VADDR		4
39 
40 /*******************************************************************************
41  * Secure Payload execution state information i.e. aarch32 or aarch64
42  ******************************************************************************/
43 #define SP_AARCH32		MODE_RW_32
44 #define SP_AARCH64		MODE_RW_64
45 
46 /*******************************************************************************
47  * Number of cpus that the present on this platform. TODO: Rely on a topology
48  * tree to determine this in the future to avoid assumptions about mpidr
49  * allocation
50  ******************************************************************************/
51 #define TLKD_CORE_COUNT		PLATFORM_CORE_COUNT
52 
53 /*******************************************************************************
54  * Constants that allow assembler code to preserve callee-saved registers of the
55  * C runtime context while performing a security state switch.
56  ******************************************************************************/
57 #define TLKD_C_RT_CTX_X19		0x0
58 #define TLKD_C_RT_CTX_X20		0x8
59 #define TLKD_C_RT_CTX_X21		0x10
60 #define TLKD_C_RT_CTX_X22		0x18
61 #define TLKD_C_RT_CTX_X23		0x20
62 #define TLKD_C_RT_CTX_X24		0x28
63 #define TLKD_C_RT_CTX_X25		0x30
64 #define TLKD_C_RT_CTX_X26		0x38
65 #define TLKD_C_RT_CTX_X27		0x40
66 #define TLKD_C_RT_CTX_X28		0x48
67 #define TLKD_C_RT_CTX_X29		0x50
68 #define TLKD_C_RT_CTX_X30		0x58
69 #define TLKD_C_RT_CTX_SIZE		0x60
70 #define TLKD_C_RT_CTX_ENTRIES		(TLKD_C_RT_CTX_SIZE >> DWORD_SHIFT)
71 
72 #ifndef __ASSEMBLY__
73 
74 #include <cassert.h>
75 #include <stdint.h>
76 
77 /* AArch64 callee saved general purpose register context structure. */
78 DEFINE_REG_STRUCT(c_rt_regs, TLKD_C_RT_CTX_ENTRIES);
79 
80 /*
81  * Compile time assertion to ensure that both the compiler and linker
82  * have the same double word aligned view of the size of the C runtime
83  * register context.
84  */
85 CASSERT(TLKD_C_RT_CTX_SIZE == sizeof(c_rt_regs_t),	\
86 	assert_tlkd_c_rt_regs_size_mismatch);
87 
88 /*******************************************************************************
89  * Structure which helps the SPD to maintain the per-cpu state of the SP.
90  * 'state'          - collection of flags to track SP state e.g. on/off
91  * 'mpidr'          - mpidr to associate a context with a cpu
92  * 'c_rt_ctx'       - stack address to restore C runtime context from after
93  *                    returning from a synchronous entry into the SP.
94  * 'cpu_ctx'        - space to maintain SP architectural state
95  * 'saved_tsp_args' - space to store arguments for TSP arithmetic operations
96  *                    which will queried using the TSP_GET_ARGS SMC by TSP.
97  ******************************************************************************/
98 typedef struct tlk_context {
99 	uint32_t state;
100 	uint64_t mpidr;
101 	uint64_t c_rt_ctx;
102 	cpu_context_t cpu_ctx;
103 } tlk_context_t;
104 
105 /*******************************************************************************
106  * Function & Data prototypes
107  ******************************************************************************/
108 uint64_t tlkd_va_translate(uintptr_t va, int type);
109 uint64_t tlkd_enter_sp(uint64_t *c_rt_ctx);
110 void __dead2 tlkd_exit_sp(uint64_t c_rt_ctx, uint64_t ret);
111 uint64_t tlkd_synchronous_sp_entry(tlk_context_t *tlk_ctx);
112 void __dead2 tlkd_synchronous_sp_exit(tlk_context_t *tlk_ctx,
113 			uint64_t ret);
114 void tlkd_init_tlk_ep_state(struct entry_point_info *tlk_entry_point,
115 				uint32_t rw,
116 				uint64_t pc,
117 				tlk_context_t *tlk_ctx);
118 
119 #endif /*__ASSEMBLY__*/
120 
121 #endif /* __TLKD_PRIVATE_H__ */
122