xref: /OK3568_Linux_fs/kernel/drivers/tee/optee/optee_smc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2015-2019, Linaro Limited
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun #ifndef OPTEE_SMC_H
6*4882a593Smuzhiyun #define OPTEE_SMC_H
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/arm-smccc.h>
9*4882a593Smuzhiyun #include <linux/bitops.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #define OPTEE_SMC_STD_CALL_VAL(func_num) \
12*4882a593Smuzhiyun 	ARM_SMCCC_CALL_VAL(ARM_SMCCC_STD_CALL, ARM_SMCCC_SMC_32, \
13*4882a593Smuzhiyun 			   ARM_SMCCC_OWNER_TRUSTED_OS, (func_num))
14*4882a593Smuzhiyun #define OPTEE_SMC_FAST_CALL_VAL(func_num) \
15*4882a593Smuzhiyun 	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, ARM_SMCCC_SMC_32, \
16*4882a593Smuzhiyun 			   ARM_SMCCC_OWNER_TRUSTED_OS, (func_num))
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /*
19*4882a593Smuzhiyun  * Function specified by SMC Calling convention.
20*4882a593Smuzhiyun  */
21*4882a593Smuzhiyun #define OPTEE_SMC_FUNCID_CALLS_COUNT	0xFF00
22*4882a593Smuzhiyun #define OPTEE_SMC_CALLS_COUNT \
23*4882a593Smuzhiyun 	ARM_SMCCC_CALL_VAL(OPTEE_SMC_FAST_CALL, SMCCC_SMC_32, \
24*4882a593Smuzhiyun 			   SMCCC_OWNER_TRUSTED_OS_END, \
25*4882a593Smuzhiyun 			   OPTEE_SMC_FUNCID_CALLS_COUNT)
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /*
28*4882a593Smuzhiyun  * Normal cached memory (write-back), shareable for SMP systems and not
29*4882a593Smuzhiyun  * shareable for UP systems.
30*4882a593Smuzhiyun  */
31*4882a593Smuzhiyun #define OPTEE_SMC_SHM_CACHED		1
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /*
34*4882a593Smuzhiyun  * a0..a7 is used as register names in the descriptions below, on arm32
35*4882a593Smuzhiyun  * that translates to r0..r7 and on arm64 to w0..w7. In both cases it's
36*4882a593Smuzhiyun  * 32-bit registers.
37*4882a593Smuzhiyun  */
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun /*
40*4882a593Smuzhiyun  * Function specified by SMC Calling convention
41*4882a593Smuzhiyun  *
42*4882a593Smuzhiyun  * Return one of the following UIDs if using API specified in this file
43*4882a593Smuzhiyun  * without further extentions:
44*4882a593Smuzhiyun  * 65cb6b93-af0c-4617-8ed6-644a8d1140f8
45*4882a593Smuzhiyun  * see also OPTEE_SMC_UID_* in optee_msg.h
46*4882a593Smuzhiyun  */
47*4882a593Smuzhiyun #define OPTEE_SMC_FUNCID_CALLS_UID OPTEE_MSG_FUNCID_CALLS_UID
48*4882a593Smuzhiyun #define OPTEE_SMC_CALLS_UID \
49*4882a593Smuzhiyun 	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, ARM_SMCCC_SMC_32, \
50*4882a593Smuzhiyun 			   ARM_SMCCC_OWNER_TRUSTED_OS_END, \
51*4882a593Smuzhiyun 			   OPTEE_SMC_FUNCID_CALLS_UID)
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun /*
54*4882a593Smuzhiyun  * Function specified by SMC Calling convention
55*4882a593Smuzhiyun  *
56*4882a593Smuzhiyun  * Returns 2.0 if using API specified in this file without further extentions.
57*4882a593Smuzhiyun  * see also OPTEE_MSG_REVISION_* in optee_msg.h
58*4882a593Smuzhiyun  */
59*4882a593Smuzhiyun #define OPTEE_SMC_FUNCID_CALLS_REVISION OPTEE_MSG_FUNCID_CALLS_REVISION
60*4882a593Smuzhiyun #define OPTEE_SMC_CALLS_REVISION \
61*4882a593Smuzhiyun 	ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, ARM_SMCCC_SMC_32, \
62*4882a593Smuzhiyun 			   ARM_SMCCC_OWNER_TRUSTED_OS_END, \
63*4882a593Smuzhiyun 			   OPTEE_SMC_FUNCID_CALLS_REVISION)
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun struct optee_smc_calls_revision_result {
66*4882a593Smuzhiyun 	unsigned long major;
67*4882a593Smuzhiyun 	unsigned long minor;
68*4882a593Smuzhiyun 	unsigned long reserved0;
69*4882a593Smuzhiyun 	unsigned long reserved1;
70*4882a593Smuzhiyun };
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun /*
73*4882a593Smuzhiyun  * Get UUID of Trusted OS.
74*4882a593Smuzhiyun  *
75*4882a593Smuzhiyun  * Used by non-secure world to figure out which Trusted OS is installed.
76*4882a593Smuzhiyun  * Note that returned UUID is the UUID of the Trusted OS, not of the API.
77*4882a593Smuzhiyun  *
78*4882a593Smuzhiyun  * Returns UUID in a0-4 in the same way as OPTEE_SMC_CALLS_UID
79*4882a593Smuzhiyun  * described above.
80*4882a593Smuzhiyun  */
81*4882a593Smuzhiyun #define OPTEE_SMC_FUNCID_GET_OS_UUID OPTEE_MSG_FUNCID_GET_OS_UUID
82*4882a593Smuzhiyun #define OPTEE_SMC_CALL_GET_OS_UUID \
83*4882a593Smuzhiyun 	OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_GET_OS_UUID)
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun /*
86*4882a593Smuzhiyun  * Get revision of Trusted OS.
87*4882a593Smuzhiyun  *
88*4882a593Smuzhiyun  * Used by non-secure world to figure out which version of the Trusted OS
89*4882a593Smuzhiyun  * is installed. Note that the returned revision is the revision of the
90*4882a593Smuzhiyun  * Trusted OS, not of the API.
91*4882a593Smuzhiyun  *
92*4882a593Smuzhiyun  * Returns revision in a0-1 in the same way as OPTEE_SMC_CALLS_REVISION
93*4882a593Smuzhiyun  * described above. May optionally return a 32-bit build identifier in a2,
94*4882a593Smuzhiyun  * with zero meaning unspecified.
95*4882a593Smuzhiyun  */
96*4882a593Smuzhiyun #define OPTEE_SMC_FUNCID_GET_OS_REVISION OPTEE_MSG_FUNCID_GET_OS_REVISION
97*4882a593Smuzhiyun #define OPTEE_SMC_CALL_GET_OS_REVISION \
98*4882a593Smuzhiyun 	OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_GET_OS_REVISION)
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun struct optee_smc_call_get_os_revision_result {
101*4882a593Smuzhiyun 	unsigned long major;
102*4882a593Smuzhiyun 	unsigned long minor;
103*4882a593Smuzhiyun 	unsigned long build_id;
104*4882a593Smuzhiyun 	unsigned long reserved1;
105*4882a593Smuzhiyun };
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun /*
108*4882a593Smuzhiyun  * Call with struct optee_msg_arg as argument
109*4882a593Smuzhiyun  *
110*4882a593Smuzhiyun  * Call register usage:
111*4882a593Smuzhiyun  * a0	SMC Function ID, OPTEE_SMC*CALL_WITH_ARG
112*4882a593Smuzhiyun  * a1	Upper 32bit of a 64bit physical pointer to a struct optee_msg_arg
113*4882a593Smuzhiyun  * a2	Lower 32bit of a 64bit physical pointer to a struct optee_msg_arg
114*4882a593Smuzhiyun  * a3	Cache settings, not used if physical pointer is in a predefined shared
115*4882a593Smuzhiyun  *	memory area else per OPTEE_SMC_SHM_*
116*4882a593Smuzhiyun  * a4-6	Not used
117*4882a593Smuzhiyun  * a7	Hypervisor Client ID register
118*4882a593Smuzhiyun  *
119*4882a593Smuzhiyun  * Normal return register usage:
120*4882a593Smuzhiyun  * a0	Return value, OPTEE_SMC_RETURN_*
121*4882a593Smuzhiyun  * a1-3	Not used
122*4882a593Smuzhiyun  * a4-7	Preserved
123*4882a593Smuzhiyun  *
124*4882a593Smuzhiyun  * OPTEE_SMC_RETURN_ETHREAD_LIMIT return register usage:
125*4882a593Smuzhiyun  * a0	Return value, OPTEE_SMC_RETURN_ETHREAD_LIMIT
126*4882a593Smuzhiyun  * a1-3	Preserved
127*4882a593Smuzhiyun  * a4-7	Preserved
128*4882a593Smuzhiyun  *
129*4882a593Smuzhiyun  * RPC return register usage:
130*4882a593Smuzhiyun  * a0	Return value, OPTEE_SMC_RETURN_IS_RPC(val)
131*4882a593Smuzhiyun  * a1-2	RPC parameters
132*4882a593Smuzhiyun  * a3-7	Resume information, must be preserved
133*4882a593Smuzhiyun  *
134*4882a593Smuzhiyun  * Possible return values:
135*4882a593Smuzhiyun  * OPTEE_SMC_RETURN_UNKNOWN_FUNCTION	Trusted OS does not recognize this
136*4882a593Smuzhiyun  *					function.
137*4882a593Smuzhiyun  * OPTEE_SMC_RETURN_OK			Call completed, result updated in
138*4882a593Smuzhiyun  *					the previously supplied struct
139*4882a593Smuzhiyun  *					optee_msg_arg.
140*4882a593Smuzhiyun  * OPTEE_SMC_RETURN_ETHREAD_LIMIT	Number of Trusted OS threads exceeded,
141*4882a593Smuzhiyun  *					try again later.
142*4882a593Smuzhiyun  * OPTEE_SMC_RETURN_EBADADDR		Bad physcial pointer to struct
143*4882a593Smuzhiyun  *					optee_msg_arg.
144*4882a593Smuzhiyun  * OPTEE_SMC_RETURN_EBADCMD		Bad/unknown cmd in struct optee_msg_arg
145*4882a593Smuzhiyun  * OPTEE_SMC_RETURN_IS_RPC()		Call suspended by RPC call to normal
146*4882a593Smuzhiyun  *					world.
147*4882a593Smuzhiyun  */
148*4882a593Smuzhiyun #define OPTEE_SMC_FUNCID_CALL_WITH_ARG OPTEE_MSG_FUNCID_CALL_WITH_ARG
149*4882a593Smuzhiyun #define OPTEE_SMC_CALL_WITH_ARG \
150*4882a593Smuzhiyun 	OPTEE_SMC_STD_CALL_VAL(OPTEE_SMC_FUNCID_CALL_WITH_ARG)
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun /*
153*4882a593Smuzhiyun  * Get Shared Memory Config
154*4882a593Smuzhiyun  *
155*4882a593Smuzhiyun  * Returns the Secure/Non-secure shared memory config.
156*4882a593Smuzhiyun  *
157*4882a593Smuzhiyun  * Call register usage:
158*4882a593Smuzhiyun  * a0	SMC Function ID, OPTEE_SMC_GET_SHM_CONFIG
159*4882a593Smuzhiyun  * a1-6	Not used
160*4882a593Smuzhiyun  * a7	Hypervisor Client ID register
161*4882a593Smuzhiyun  *
162*4882a593Smuzhiyun  * Have config return register usage:
163*4882a593Smuzhiyun  * a0	OPTEE_SMC_RETURN_OK
164*4882a593Smuzhiyun  * a1	Physical address of start of SHM
165*4882a593Smuzhiyun  * a2	Size of of SHM
166*4882a593Smuzhiyun  * a3	Cache settings of memory, as defined by the
167*4882a593Smuzhiyun  *	OPTEE_SMC_SHM_* values above
168*4882a593Smuzhiyun  * a4-7	Preserved
169*4882a593Smuzhiyun  *
170*4882a593Smuzhiyun  * Not available register usage:
171*4882a593Smuzhiyun  * a0	OPTEE_SMC_RETURN_ENOTAVAIL
172*4882a593Smuzhiyun  * a1-3 Not used
173*4882a593Smuzhiyun  * a4-7	Preserved
174*4882a593Smuzhiyun  */
175*4882a593Smuzhiyun #define OPTEE_SMC_FUNCID_GET_SHM_CONFIG	7
176*4882a593Smuzhiyun #define OPTEE_SMC_GET_SHM_CONFIG \
177*4882a593Smuzhiyun 	OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_GET_SHM_CONFIG)
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun struct optee_smc_get_shm_config_result {
180*4882a593Smuzhiyun 	unsigned long status;
181*4882a593Smuzhiyun 	unsigned long start;
182*4882a593Smuzhiyun 	unsigned long size;
183*4882a593Smuzhiyun 	unsigned long settings;
184*4882a593Smuzhiyun };
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun /*
187*4882a593Smuzhiyun  * Exchanges capabilities between normal world and secure world
188*4882a593Smuzhiyun  *
189*4882a593Smuzhiyun  * Call register usage:
190*4882a593Smuzhiyun  * a0	SMC Function ID, OPTEE_SMC_EXCHANGE_CAPABILITIES
191*4882a593Smuzhiyun  * a1	bitfield of normal world capabilities OPTEE_SMC_NSEC_CAP_*
192*4882a593Smuzhiyun  * a2-6	Not used
193*4882a593Smuzhiyun  * a7	Hypervisor Client ID register
194*4882a593Smuzhiyun  *
195*4882a593Smuzhiyun  * Normal return register usage:
196*4882a593Smuzhiyun  * a0	OPTEE_SMC_RETURN_OK
197*4882a593Smuzhiyun  * a1	bitfield of secure world capabilities OPTEE_SMC_SEC_CAP_*
198*4882a593Smuzhiyun  * a2-7	Preserved
199*4882a593Smuzhiyun  *
200*4882a593Smuzhiyun  * Error return register usage:
201*4882a593Smuzhiyun  * a0	OPTEE_SMC_RETURN_ENOTAVAIL, can't use the capabilities from normal world
202*4882a593Smuzhiyun  * a1	bitfield of secure world capabilities OPTEE_SMC_SEC_CAP_*
203*4882a593Smuzhiyun  * a2-7 Preserved
204*4882a593Smuzhiyun  */
205*4882a593Smuzhiyun /* Normal world works as a uniprocessor system */
206*4882a593Smuzhiyun #define OPTEE_SMC_NSEC_CAP_UNIPROCESSOR		BIT(0)
207*4882a593Smuzhiyun /* Secure world has reserved shared memory for normal world to use */
208*4882a593Smuzhiyun #define OPTEE_SMC_SEC_CAP_HAVE_RESERVED_SHM	BIT(0)
209*4882a593Smuzhiyun /* Secure world can communicate via previously unregistered shared memory */
210*4882a593Smuzhiyun #define OPTEE_SMC_SEC_CAP_UNREGISTERED_SHM	BIT(1)
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun /*
213*4882a593Smuzhiyun  * Secure world supports commands "register/unregister shared memory",
214*4882a593Smuzhiyun  * secure world accepts command buffers located in any parts of non-secure RAM
215*4882a593Smuzhiyun  */
216*4882a593Smuzhiyun #define OPTEE_SMC_SEC_CAP_DYNAMIC_SHM		BIT(2)
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun /* Secure world supports Shared Memory with a NULL buffer reference */
219*4882a593Smuzhiyun #define OPTEE_SMC_SEC_CAP_MEMREF_NULL		BIT(4)
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun #define OPTEE_SMC_FUNCID_EXCHANGE_CAPABILITIES	9
222*4882a593Smuzhiyun #define OPTEE_SMC_EXCHANGE_CAPABILITIES \
223*4882a593Smuzhiyun 	OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_EXCHANGE_CAPABILITIES)
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun struct optee_smc_exchange_capabilities_result {
226*4882a593Smuzhiyun 	unsigned long status;
227*4882a593Smuzhiyun 	unsigned long capabilities;
228*4882a593Smuzhiyun 	unsigned long reserved0;
229*4882a593Smuzhiyun 	unsigned long reserved1;
230*4882a593Smuzhiyun };
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun /*
233*4882a593Smuzhiyun  * Disable and empties cache of shared memory objects
234*4882a593Smuzhiyun  *
235*4882a593Smuzhiyun  * Secure world can cache frequently used shared memory objects, for
236*4882a593Smuzhiyun  * example objects used as RPC arguments. When secure world is idle this
237*4882a593Smuzhiyun  * function returns one shared memory reference to free. To disable the
238*4882a593Smuzhiyun  * cache and free all cached objects this function has to be called until
239*4882a593Smuzhiyun  * it returns OPTEE_SMC_RETURN_ENOTAVAIL.
240*4882a593Smuzhiyun  *
241*4882a593Smuzhiyun  * Call register usage:
242*4882a593Smuzhiyun  * a0	SMC Function ID, OPTEE_SMC_DISABLE_SHM_CACHE
243*4882a593Smuzhiyun  * a1-6	Not used
244*4882a593Smuzhiyun  * a7	Hypervisor Client ID register
245*4882a593Smuzhiyun  *
246*4882a593Smuzhiyun  * Normal return register usage:
247*4882a593Smuzhiyun  * a0	OPTEE_SMC_RETURN_OK
248*4882a593Smuzhiyun  * a1	Upper 32bit of a 64bit Shared memory cookie
249*4882a593Smuzhiyun  * a2	Lower 32bit of a 64bit Shared memory cookie
250*4882a593Smuzhiyun  * a3-7	Preserved
251*4882a593Smuzhiyun  *
252*4882a593Smuzhiyun  * Cache empty return register usage:
253*4882a593Smuzhiyun  * a0	OPTEE_SMC_RETURN_ENOTAVAIL
254*4882a593Smuzhiyun  * a1-7	Preserved
255*4882a593Smuzhiyun  *
256*4882a593Smuzhiyun  * Not idle return register usage:
257*4882a593Smuzhiyun  * a0	OPTEE_SMC_RETURN_EBUSY
258*4882a593Smuzhiyun  * a1-7	Preserved
259*4882a593Smuzhiyun  */
260*4882a593Smuzhiyun #define OPTEE_SMC_FUNCID_DISABLE_SHM_CACHE	10
261*4882a593Smuzhiyun #define OPTEE_SMC_DISABLE_SHM_CACHE \
262*4882a593Smuzhiyun 	OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_DISABLE_SHM_CACHE)
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun struct optee_smc_disable_shm_cache_result {
265*4882a593Smuzhiyun 	unsigned long status;
266*4882a593Smuzhiyun 	unsigned long shm_upper32;
267*4882a593Smuzhiyun 	unsigned long shm_lower32;
268*4882a593Smuzhiyun 	unsigned long reserved0;
269*4882a593Smuzhiyun };
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun /*
272*4882a593Smuzhiyun  * Enable cache of shared memory objects
273*4882a593Smuzhiyun  *
274*4882a593Smuzhiyun  * Secure world can cache frequently used shared memory objects, for
275*4882a593Smuzhiyun  * example objects used as RPC arguments. When secure world is idle this
276*4882a593Smuzhiyun  * function returns OPTEE_SMC_RETURN_OK and the cache is enabled. If
277*4882a593Smuzhiyun  * secure world isn't idle OPTEE_SMC_RETURN_EBUSY is returned.
278*4882a593Smuzhiyun  *
279*4882a593Smuzhiyun  * Call register usage:
280*4882a593Smuzhiyun  * a0	SMC Function ID, OPTEE_SMC_ENABLE_SHM_CACHE
281*4882a593Smuzhiyun  * a1-6	Not used
282*4882a593Smuzhiyun  * a7	Hypervisor Client ID register
283*4882a593Smuzhiyun  *
284*4882a593Smuzhiyun  * Normal return register usage:
285*4882a593Smuzhiyun  * a0	OPTEE_SMC_RETURN_OK
286*4882a593Smuzhiyun  * a1-7	Preserved
287*4882a593Smuzhiyun  *
288*4882a593Smuzhiyun  * Not idle return register usage:
289*4882a593Smuzhiyun  * a0	OPTEE_SMC_RETURN_EBUSY
290*4882a593Smuzhiyun  * a1-7	Preserved
291*4882a593Smuzhiyun  */
292*4882a593Smuzhiyun #define OPTEE_SMC_FUNCID_ENABLE_SHM_CACHE	11
293*4882a593Smuzhiyun #define OPTEE_SMC_ENABLE_SHM_CACHE \
294*4882a593Smuzhiyun 	OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_ENABLE_SHM_CACHE)
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun /*
297*4882a593Smuzhiyun  * Resume from RPC (for example after processing a foreign interrupt)
298*4882a593Smuzhiyun  *
299*4882a593Smuzhiyun  * Call register usage:
300*4882a593Smuzhiyun  * a0	SMC Function ID, OPTEE_SMC_CALL_RETURN_FROM_RPC
301*4882a593Smuzhiyun  * a1-3	Value of a1-3 when OPTEE_SMC_CALL_WITH_ARG returned
302*4882a593Smuzhiyun  *	OPTEE_SMC_RETURN_RPC in a0
303*4882a593Smuzhiyun  *
304*4882a593Smuzhiyun  * Return register usage is the same as for OPTEE_SMC_*CALL_WITH_ARG above.
305*4882a593Smuzhiyun  *
306*4882a593Smuzhiyun  * Possible return values
307*4882a593Smuzhiyun  * OPTEE_SMC_RETURN_UNKNOWN_FUNCTION	Trusted OS does not recognize this
308*4882a593Smuzhiyun  *					function.
309*4882a593Smuzhiyun  * OPTEE_SMC_RETURN_OK			Original call completed, result
310*4882a593Smuzhiyun  *					updated in the previously supplied.
311*4882a593Smuzhiyun  *					struct optee_msg_arg
312*4882a593Smuzhiyun  * OPTEE_SMC_RETURN_RPC			Call suspended by RPC call to normal
313*4882a593Smuzhiyun  *					world.
314*4882a593Smuzhiyun  * OPTEE_SMC_RETURN_ERESUME		Resume failed, the opaque resume
315*4882a593Smuzhiyun  *					information was corrupt.
316*4882a593Smuzhiyun  */
317*4882a593Smuzhiyun #define OPTEE_SMC_FUNCID_RETURN_FROM_RPC	3
318*4882a593Smuzhiyun #define OPTEE_SMC_CALL_RETURN_FROM_RPC \
319*4882a593Smuzhiyun 	OPTEE_SMC_STD_CALL_VAL(OPTEE_SMC_FUNCID_RETURN_FROM_RPC)
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_RPC_PREFIX_MASK	0xFFFF0000
322*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_RPC_PREFIX		0xFFFF0000
323*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_RPC_FUNC_MASK		0x0000FFFF
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_GET_RPC_FUNC(ret) \
326*4882a593Smuzhiyun 	((ret) & OPTEE_SMC_RETURN_RPC_FUNC_MASK)
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun #define OPTEE_SMC_RPC_VAL(func)		((func) | OPTEE_SMC_RETURN_RPC_PREFIX)
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun /*
331*4882a593Smuzhiyun  * Allocate memory for RPC parameter passing. The memory is used to hold a
332*4882a593Smuzhiyun  * struct optee_msg_arg.
333*4882a593Smuzhiyun  *
334*4882a593Smuzhiyun  * "Call" register usage:
335*4882a593Smuzhiyun  * a0	This value, OPTEE_SMC_RETURN_RPC_ALLOC
336*4882a593Smuzhiyun  * a1	Size in bytes of required argument memory
337*4882a593Smuzhiyun  * a2	Not used
338*4882a593Smuzhiyun  * a3	Resume information, must be preserved
339*4882a593Smuzhiyun  * a4-5	Not used
340*4882a593Smuzhiyun  * a6-7	Resume information, must be preserved
341*4882a593Smuzhiyun  *
342*4882a593Smuzhiyun  * "Return" register usage:
343*4882a593Smuzhiyun  * a0	SMC Function ID, OPTEE_SMC_CALL_RETURN_FROM_RPC.
344*4882a593Smuzhiyun  * a1	Upper 32bits of 64bit physical pointer to allocated
345*4882a593Smuzhiyun  *	memory, (a1 == 0 && a2 == 0) if size was 0 or if memory can't
346*4882a593Smuzhiyun  *	be allocated.
347*4882a593Smuzhiyun  * a2	Lower 32bits of 64bit physical pointer to allocated
348*4882a593Smuzhiyun  *	memory, (a1 == 0 && a2 == 0) if size was 0 or if memory can't
349*4882a593Smuzhiyun  *	be allocated
350*4882a593Smuzhiyun  * a3	Preserved
351*4882a593Smuzhiyun  * a4	Upper 32bits of 64bit Shared memory cookie used when freeing
352*4882a593Smuzhiyun  *	the memory or doing an RPC
353*4882a593Smuzhiyun  * a5	Lower 32bits of 64bit Shared memory cookie used when freeing
354*4882a593Smuzhiyun  *	the memory or doing an RPC
355*4882a593Smuzhiyun  * a6-7	Preserved
356*4882a593Smuzhiyun  */
357*4882a593Smuzhiyun #define OPTEE_SMC_RPC_FUNC_ALLOC	0
358*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_RPC_ALLOC \
359*4882a593Smuzhiyun 	OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_ALLOC)
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun /*
362*4882a593Smuzhiyun  * Free memory previously allocated by OPTEE_SMC_RETURN_RPC_ALLOC
363*4882a593Smuzhiyun  *
364*4882a593Smuzhiyun  * "Call" register usage:
365*4882a593Smuzhiyun  * a0	This value, OPTEE_SMC_RETURN_RPC_FREE
366*4882a593Smuzhiyun  * a1	Upper 32bits of 64bit shared memory cookie belonging to this
367*4882a593Smuzhiyun  *	argument memory
368*4882a593Smuzhiyun  * a2	Lower 32bits of 64bit shared memory cookie belonging to this
369*4882a593Smuzhiyun  *	argument memory
370*4882a593Smuzhiyun  * a3-7	Resume information, must be preserved
371*4882a593Smuzhiyun  *
372*4882a593Smuzhiyun  * "Return" register usage:
373*4882a593Smuzhiyun  * a0	SMC Function ID, OPTEE_SMC_CALL_RETURN_FROM_RPC.
374*4882a593Smuzhiyun  * a1-2	Not used
375*4882a593Smuzhiyun  * a3-7	Preserved
376*4882a593Smuzhiyun  */
377*4882a593Smuzhiyun #define OPTEE_SMC_RPC_FUNC_FREE		2
378*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_RPC_FREE \
379*4882a593Smuzhiyun 	OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_FREE)
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun /*
382*4882a593Smuzhiyun  * Deliver foreign interrupt to normal world.
383*4882a593Smuzhiyun  *
384*4882a593Smuzhiyun  * "Call" register usage:
385*4882a593Smuzhiyun  * a0	OPTEE_SMC_RETURN_RPC_FOREIGN_INTR
386*4882a593Smuzhiyun  * a1-7	Resume information, must be preserved
387*4882a593Smuzhiyun  *
388*4882a593Smuzhiyun  * "Return" register usage:
389*4882a593Smuzhiyun  * a0	SMC Function ID, OPTEE_SMC_CALL_RETURN_FROM_RPC.
390*4882a593Smuzhiyun  * a1-7	Preserved
391*4882a593Smuzhiyun  */
392*4882a593Smuzhiyun #define OPTEE_SMC_RPC_FUNC_FOREIGN_INTR		4
393*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_RPC_FOREIGN_INTR \
394*4882a593Smuzhiyun 	OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_FOREIGN_INTR)
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun /*
397*4882a593Smuzhiyun  * Do an RPC request. The supplied struct optee_msg_arg tells which
398*4882a593Smuzhiyun  * request to do and the parameters for the request. The following fields
399*4882a593Smuzhiyun  * are used (the rest are unused):
400*4882a593Smuzhiyun  * - cmd		the Request ID
401*4882a593Smuzhiyun  * - ret		return value of the request, filled in by normal world
402*4882a593Smuzhiyun  * - num_params		number of parameters for the request
403*4882a593Smuzhiyun  * - params		the parameters
404*4882a593Smuzhiyun  * - param_attrs	attributes of the parameters
405*4882a593Smuzhiyun  *
406*4882a593Smuzhiyun  * "Call" register usage:
407*4882a593Smuzhiyun  * a0	OPTEE_SMC_RETURN_RPC_CMD
408*4882a593Smuzhiyun  * a1	Upper 32bit of a 64bit Shared memory cookie holding a
409*4882a593Smuzhiyun  *	struct optee_msg_arg, must be preserved, only the data should
410*4882a593Smuzhiyun  *	be updated
411*4882a593Smuzhiyun  * a2	Lower 32bit of a 64bit Shared memory cookie holding a
412*4882a593Smuzhiyun  *	struct optee_msg_arg, must be preserved, only the data should
413*4882a593Smuzhiyun  *	be updated
414*4882a593Smuzhiyun  * a3-7	Resume information, must be preserved
415*4882a593Smuzhiyun  *
416*4882a593Smuzhiyun  * "Return" register usage:
417*4882a593Smuzhiyun  * a0	SMC Function ID, OPTEE_SMC_CALL_RETURN_FROM_RPC.
418*4882a593Smuzhiyun  * a1-2	Not used
419*4882a593Smuzhiyun  * a3-7	Preserved
420*4882a593Smuzhiyun  */
421*4882a593Smuzhiyun #define OPTEE_SMC_RPC_FUNC_CMD		5
422*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_RPC_CMD \
423*4882a593Smuzhiyun 	OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_CMD)
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun /* Returned in a0 */
426*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_UNKNOWN_FUNCTION 0xFFFFFFFF
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun /* Returned in a0 only from Trusted OS functions */
429*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_OK		0x0
430*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_ETHREAD_LIMIT	0x1
431*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_EBUSY		0x2
432*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_ERESUME	0x3
433*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_EBADADDR	0x4
434*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_EBADCMD	0x5
435*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_ENOMEM		0x6
436*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_ENOTAVAIL	0x7
437*4882a593Smuzhiyun #define OPTEE_SMC_RETURN_IS_RPC(ret)	__optee_smc_return_is_rpc((ret))
438*4882a593Smuzhiyun 
__optee_smc_return_is_rpc(u32 ret)439*4882a593Smuzhiyun static inline bool __optee_smc_return_is_rpc(u32 ret)
440*4882a593Smuzhiyun {
441*4882a593Smuzhiyun 	return ret != OPTEE_SMC_RETURN_UNKNOWN_FUNCTION &&
442*4882a593Smuzhiyun 	       (ret & OPTEE_SMC_RETURN_RPC_PREFIX_MASK) ==
443*4882a593Smuzhiyun 			OPTEE_SMC_RETURN_RPC_PREFIX;
444*4882a593Smuzhiyun }
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun #endif /* OPTEE_SMC_H */
447