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