xref: /arm-trusted-firmware/include/bl32/tsp/tsp.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2013-2022, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #ifndef TSP_H
8*91f16700Schasinglulu #define TSP_H
9*91f16700Schasinglulu 
10*91f16700Schasinglulu /*
11*91f16700Schasinglulu  * SMC function IDs that TSP uses to signal various forms of completions
12*91f16700Schasinglulu  * to the secure payload dispatcher.
13*91f16700Schasinglulu  */
14*91f16700Schasinglulu #define TSP_ENTRY_DONE		0xf2000000
15*91f16700Schasinglulu #define TSP_ON_DONE		0xf2000001
16*91f16700Schasinglulu #define TSP_OFF_DONE		0xf2000002
17*91f16700Schasinglulu #define TSP_SUSPEND_DONE	0xf2000003
18*91f16700Schasinglulu #define TSP_RESUME_DONE		0xf2000004
19*91f16700Schasinglulu #define TSP_PREEMPTED		0xf2000005
20*91f16700Schasinglulu #define TSP_ABORT_DONE		0xf2000007
21*91f16700Schasinglulu #define TSP_SYSTEM_OFF_DONE	0xf2000008
22*91f16700Schasinglulu #define TSP_SYSTEM_RESET_DONE	0xf2000009
23*91f16700Schasinglulu 
24*91f16700Schasinglulu /*
25*91f16700Schasinglulu  * Function identifiers to handle S-EL1 interrupt through the synchronous
26*91f16700Schasinglulu  * handling model. If the TSP was previously interrupted then control has to
27*91f16700Schasinglulu  * be returned to the TSPD after handling the interrupt else execution can
28*91f16700Schasinglulu  * remain in the TSP.
29*91f16700Schasinglulu  */
30*91f16700Schasinglulu #define TSP_HANDLED_S_EL1_INTR		0xf2000006
31*91f16700Schasinglulu 
32*91f16700Schasinglulu /* SMC function ID that TSP uses to request service from secure monitor */
33*91f16700Schasinglulu #define TSP_GET_ARGS		0xf2001000
34*91f16700Schasinglulu 
35*91f16700Schasinglulu /*
36*91f16700Schasinglulu  * Identifiers for various TSP services. Corresponding function IDs (whether
37*91f16700Schasinglulu  * fast or yielding) are generated by macros defined below
38*91f16700Schasinglulu  */
39*91f16700Schasinglulu #define TSP_ADD		0x2000
40*91f16700Schasinglulu #define TSP_SUB		0x2001
41*91f16700Schasinglulu #define TSP_MUL		0x2002
42*91f16700Schasinglulu #define TSP_DIV		0x2003
43*91f16700Schasinglulu #define TSP_HANDLE_SEL1_INTR_AND_RETURN	0x2004
44*91f16700Schasinglulu #define TSP_CHECK_DIT	0x2005
45*91f16700Schasinglulu 
46*91f16700Schasinglulu /*
47*91f16700Schasinglulu  * Identify a TSP service from function ID filtering the last 16 bits from the
48*91f16700Schasinglulu  * SMC function ID
49*91f16700Schasinglulu  */
50*91f16700Schasinglulu #define TSP_BARE_FID(fid)	((fid) & 0xffff)
51*91f16700Schasinglulu 
52*91f16700Schasinglulu /*
53*91f16700Schasinglulu  * Generate function IDs for TSP services to be used in SMC calls, by
54*91f16700Schasinglulu  * appropriately setting bit 31 to differentiate yielding and fast SMC calls
55*91f16700Schasinglulu  */
56*91f16700Schasinglulu #define TSP_YIELD_FID(fid)	((TSP_BARE_FID(fid) | 0x72000000))
57*91f16700Schasinglulu #define TSP_FAST_FID(fid)	((TSP_BARE_FID(fid) | 0x72000000) | (1u << 31))
58*91f16700Schasinglulu 
59*91f16700Schasinglulu /* SMC function ID to request a previously preempted yielding smc */
60*91f16700Schasinglulu #define TSP_FID_RESUME		TSP_YIELD_FID(0x3000)
61*91f16700Schasinglulu /*
62*91f16700Schasinglulu  * SMC function ID to request abortion of a previously preempted yielding SMC. A
63*91f16700Schasinglulu  * fast SMC is used so that the TSP abort handler does not have to be
64*91f16700Schasinglulu  * reentrant.
65*91f16700Schasinglulu  */
66*91f16700Schasinglulu #define TSP_FID_ABORT		TSP_FAST_FID(0x3001)
67*91f16700Schasinglulu 
68*91f16700Schasinglulu /*
69*91f16700Schasinglulu  * Total number of function IDs implemented for services offered to NS clients.
70*91f16700Schasinglulu  * The function IDs are defined above
71*91f16700Schasinglulu  */
72*91f16700Schasinglulu #define TSP_NUM_FID		0x5
73*91f16700Schasinglulu 
74*91f16700Schasinglulu /* TSP implementation version numbers */
75*91f16700Schasinglulu #define TSP_VERSION_MAJOR	0x0 /* Major version */
76*91f16700Schasinglulu #define TSP_VERSION_MINOR	0x1 /* Minor version */
77*91f16700Schasinglulu 
78*91f16700Schasinglulu /*
79*91f16700Schasinglulu  * Standard Trusted OS Function IDs that fall under Trusted OS call range
80*91f16700Schasinglulu  * according to SMC calling convention
81*91f16700Schasinglulu  */
82*91f16700Schasinglulu #define TOS_CALL_COUNT		0xbf00ff00 /* Number of calls implemented */
83*91f16700Schasinglulu #define TOS_UID			0xbf00ff01 /* Implementation UID */
84*91f16700Schasinglulu /*				0xbf00ff02 is reserved */
85*91f16700Schasinglulu #define TOS_CALL_VERSION	0xbf00ff03 /* Trusted OS Call Version */
86*91f16700Schasinglulu 
87*91f16700Schasinglulu 
88*91f16700Schasinglulu #ifndef __ASSEMBLER__
89*91f16700Schasinglulu 
90*91f16700Schasinglulu #include <stdint.h>
91*91f16700Schasinglulu 
92*91f16700Schasinglulu 
93*91f16700Schasinglulu typedef uint32_t tsp_vector_isn_t;
94*91f16700Schasinglulu 
95*91f16700Schasinglulu typedef struct tsp_vectors {
96*91f16700Schasinglulu 	tsp_vector_isn_t yield_smc_entry;
97*91f16700Schasinglulu 	tsp_vector_isn_t fast_smc_entry;
98*91f16700Schasinglulu 	tsp_vector_isn_t cpu_on_entry;
99*91f16700Schasinglulu 	tsp_vector_isn_t cpu_off_entry;
100*91f16700Schasinglulu 	tsp_vector_isn_t cpu_resume_entry;
101*91f16700Schasinglulu 	tsp_vector_isn_t cpu_suspend_entry;
102*91f16700Schasinglulu 	tsp_vector_isn_t sel1_intr_entry;
103*91f16700Schasinglulu 	tsp_vector_isn_t system_off_entry;
104*91f16700Schasinglulu 	tsp_vector_isn_t system_reset_entry;
105*91f16700Schasinglulu 	tsp_vector_isn_t abort_yield_smc_entry;
106*91f16700Schasinglulu } tsp_vectors_t;
107*91f16700Schasinglulu 
108*91f16700Schasinglulu void tsp_setup(void);
109*91f16700Schasinglulu 
110*91f16700Schasinglulu #endif /* __ASSEMBLER__ */
111*91f16700Schasinglulu 
112*91f16700Schasinglulu #endif /* TSP_H */
113