xref: /openbmc/u-boot/drivers/tee/optee/optee_msg.h (revision d4bd3d25d8b032da8de9c79cbe103d47a3d160df)
1*d4bd3d25SJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
2*d4bd3d25SJens Wiklander /*
3*d4bd3d25SJens Wiklander  * Copyright (c) 2015-2018, Linaro Limited
4*d4bd3d25SJens Wiklander  */
5*d4bd3d25SJens Wiklander 
6*d4bd3d25SJens Wiklander #ifndef _OPTEE_MSG_H
7*d4bd3d25SJens Wiklander #define _OPTEE_MSG_H
8*d4bd3d25SJens Wiklander 
9*d4bd3d25SJens Wiklander #include <linux/bitops.h>
10*d4bd3d25SJens Wiklander #include <linux/types.h>
11*d4bd3d25SJens Wiklander 
12*d4bd3d25SJens Wiklander /*
13*d4bd3d25SJens Wiklander  * This file defines the OP-TEE message protocol used to communicate with
14*d4bd3d25SJens Wiklander  * an instance of OP-TEE running in secure world. This file is based on
15*d4bd3d25SJens Wiklander  * https://github.com/OP-TEE/optee_os/blob/master/core/include/optee_msg.h
16*d4bd3d25SJens Wiklander  * and may need to be updated when introducing new features.
17*d4bd3d25SJens Wiklander  *
18*d4bd3d25SJens Wiklander  * This file is divided into three sections.
19*d4bd3d25SJens Wiklander  * 1. Formatting of messages.
20*d4bd3d25SJens Wiklander  * 2. Requests from normal world
21*d4bd3d25SJens Wiklander  * 3. Requests from secure world, Remote Procedure Call (RPC), handled by
22*d4bd3d25SJens Wiklander  *    tee-supplicant.
23*d4bd3d25SJens Wiklander  */
24*d4bd3d25SJens Wiklander 
25*d4bd3d25SJens Wiklander /*****************************************************************************
26*d4bd3d25SJens Wiklander  * Part 1 - formatting of messages
27*d4bd3d25SJens Wiklander  *****************************************************************************/
28*d4bd3d25SJens Wiklander 
29*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_NONE		0x0
30*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_VALUE_INPUT		0x1
31*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_VALUE_OUTPUT	0x2
32*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_VALUE_INOUT		0x3
33*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_RMEM_INPUT		0x5
34*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_RMEM_OUTPUT		0x6
35*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_RMEM_INOUT		0x7
36*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_TMEM_INPUT		0x9
37*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT		0xa
38*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_TMEM_INOUT		0xb
39*d4bd3d25SJens Wiklander 
40*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_MASK		GENMASK(7, 0)
41*d4bd3d25SJens Wiklander 
42*d4bd3d25SJens Wiklander /*
43*d4bd3d25SJens Wiklander  * Meta parameter to be absorbed by the Secure OS and not passed
44*d4bd3d25SJens Wiklander  * to the Trusted Application.
45*d4bd3d25SJens Wiklander  *
46*d4bd3d25SJens Wiklander  * Currently only used with OPTEE_MSG_CMD_OPEN_SESSION.
47*d4bd3d25SJens Wiklander  */
48*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_META			BIT(8)
49*d4bd3d25SJens Wiklander 
50*d4bd3d25SJens Wiklander /*
51*d4bd3d25SJens Wiklander  * Pointer to a list of pages used to register user-defined SHM buffer.
52*d4bd3d25SJens Wiklander  * Used with OPTEE_MSG_ATTR_TYPE_TMEM_*.
53*d4bd3d25SJens Wiklander  * buf_ptr should point to the beginning of the buffer. Buffer will contain
54*d4bd3d25SJens Wiklander  * list of page addresses. OP-TEE core can reconstruct contiguous buffer from
55*d4bd3d25SJens Wiklander  * that page addresses list. Page addresses are stored as 64 bit values.
56*d4bd3d25SJens Wiklander  * Last entry on a page should point to the next page of buffer.
57*d4bd3d25SJens Wiklander  * Every entry in buffer should point to a 4k page beginning (12 least
58*d4bd3d25SJens Wiklander  * significant bits must be equal to zero).
59*d4bd3d25SJens Wiklander  *
60*d4bd3d25SJens Wiklander  * 12 least significant bints of optee_msg_param.u.tmem.buf_ptr should hold page
61*d4bd3d25SJens Wiklander  * offset of the user buffer.
62*d4bd3d25SJens Wiklander  *
63*d4bd3d25SJens Wiklander  * So, entries should be placed like members of this structure:
64*d4bd3d25SJens Wiklander  *
65*d4bd3d25SJens Wiklander  * struct page_data {
66*d4bd3d25SJens Wiklander  *   uint64_t pages_array[OPTEE_MSG_NONCONTIG_PAGE_SIZE/sizeof(uint64_t) - 1];
67*d4bd3d25SJens Wiklander  *   uint64_t next_page_data;
68*d4bd3d25SJens Wiklander  * };
69*d4bd3d25SJens Wiklander  *
70*d4bd3d25SJens Wiklander  * Structure is designed to exactly fit into the page size
71*d4bd3d25SJens Wiklander  * OPTEE_MSG_NONCONTIG_PAGE_SIZE which is a standard 4KB page.
72*d4bd3d25SJens Wiklander  *
73*d4bd3d25SJens Wiklander  * The size of 4KB is chosen because this is the smallest page size for ARM
74*d4bd3d25SJens Wiklander  * architectures. If REE uses larger pages, it should divide them to 4KB ones.
75*d4bd3d25SJens Wiklander  */
76*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_NONCONTIG		BIT(9)
77*d4bd3d25SJens Wiklander 
78*d4bd3d25SJens Wiklander /*
79*d4bd3d25SJens Wiklander  * Memory attributes for caching passed with temp memrefs. The actual value
80*d4bd3d25SJens Wiklander  * used is defined outside the message protocol with the exception of
81*d4bd3d25SJens Wiklander  * OPTEE_MSG_ATTR_CACHE_PREDEFINED which means the attributes already
82*d4bd3d25SJens Wiklander  * defined for the memory range should be used. If optee_smc.h is used as
83*d4bd3d25SJens Wiklander  * bearer of this protocol OPTEE_SMC_SHM_* is used for values.
84*d4bd3d25SJens Wiklander  */
85*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_CACHE_SHIFT		16
86*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_CACHE_MASK		GENMASK(2, 0)
87*d4bd3d25SJens Wiklander #define OPTEE_MSG_ATTR_CACHE_PREDEFINED		0
88*d4bd3d25SJens Wiklander 
89*d4bd3d25SJens Wiklander /*
90*d4bd3d25SJens Wiklander  * Same values as TEE_LOGIN_* from TEE Internal API
91*d4bd3d25SJens Wiklander  */
92*d4bd3d25SJens Wiklander #define OPTEE_MSG_LOGIN_PUBLIC			0x00000000
93*d4bd3d25SJens Wiklander #define OPTEE_MSG_LOGIN_USER			0x00000001
94*d4bd3d25SJens Wiklander #define OPTEE_MSG_LOGIN_GROUP			0x00000002
95*d4bd3d25SJens Wiklander #define OPTEE_MSG_LOGIN_APPLICATION		0x00000004
96*d4bd3d25SJens Wiklander #define OPTEE_MSG_LOGIN_APPLICATION_USER	0x00000005
97*d4bd3d25SJens Wiklander #define OPTEE_MSG_LOGIN_APPLICATION_GROUP	0x00000006
98*d4bd3d25SJens Wiklander 
99*d4bd3d25SJens Wiklander /*
100*d4bd3d25SJens Wiklander  * Page size used in non-contiguous buffer entries
101*d4bd3d25SJens Wiklander  */
102*d4bd3d25SJens Wiklander #define OPTEE_MSG_NONCONTIG_PAGE_SIZE		4096
103*d4bd3d25SJens Wiklander 
104*d4bd3d25SJens Wiklander /**
105*d4bd3d25SJens Wiklander  * struct optee_msg_param_tmem - temporary memory reference parameter
106*d4bd3d25SJens Wiklander  * @buf_ptr:	Address of the buffer
107*d4bd3d25SJens Wiklander  * @size:	Size of the buffer
108*d4bd3d25SJens Wiklander  * @shm_ref:	Temporary shared memory reference, pointer to a struct tee_shm
109*d4bd3d25SJens Wiklander  *
110*d4bd3d25SJens Wiklander  * Secure and normal world communicates pointers as physical address
111*d4bd3d25SJens Wiklander  * instead of the virtual address. This is because secure and normal world
112*d4bd3d25SJens Wiklander  * have completely independent memory mapping. Normal world can even have a
113*d4bd3d25SJens Wiklander  * hypervisor which need to translate the guest physical address (AKA IPA
114*d4bd3d25SJens Wiklander  * in ARM documentation) to a real physical address before passing the
115*d4bd3d25SJens Wiklander  * structure to secure world.
116*d4bd3d25SJens Wiklander  */
117*d4bd3d25SJens Wiklander struct optee_msg_param_tmem {
118*d4bd3d25SJens Wiklander 	u64 buf_ptr;
119*d4bd3d25SJens Wiklander 	u64 size;
120*d4bd3d25SJens Wiklander 	u64 shm_ref;
121*d4bd3d25SJens Wiklander };
122*d4bd3d25SJens Wiklander 
123*d4bd3d25SJens Wiklander /**
124*d4bd3d25SJens Wiklander  * struct optee_msg_param_rmem - registered memory reference parameter
125*d4bd3d25SJens Wiklander  * @offs:	Offset into shared memory reference
126*d4bd3d25SJens Wiklander  * @size:	Size of the buffer
127*d4bd3d25SJens Wiklander  * @shm_ref:	Shared memory reference, pointer to a struct tee_shm
128*d4bd3d25SJens Wiklander  */
129*d4bd3d25SJens Wiklander struct optee_msg_param_rmem {
130*d4bd3d25SJens Wiklander 	u64 offs;
131*d4bd3d25SJens Wiklander 	u64 size;
132*d4bd3d25SJens Wiklander 	u64 shm_ref;
133*d4bd3d25SJens Wiklander };
134*d4bd3d25SJens Wiklander 
135*d4bd3d25SJens Wiklander /**
136*d4bd3d25SJens Wiklander  * struct optee_msg_param_value - opaque value parameter
137*d4bd3d25SJens Wiklander  *
138*d4bd3d25SJens Wiklander  * Value parameters are passed unchecked between normal and secure world.
139*d4bd3d25SJens Wiklander  */
140*d4bd3d25SJens Wiklander struct optee_msg_param_value {
141*d4bd3d25SJens Wiklander 	u64 a;
142*d4bd3d25SJens Wiklander 	u64 b;
143*d4bd3d25SJens Wiklander 	u64 c;
144*d4bd3d25SJens Wiklander };
145*d4bd3d25SJens Wiklander 
146*d4bd3d25SJens Wiklander /**
147*d4bd3d25SJens Wiklander  * struct optee_msg_param - parameter used together with struct optee_msg_arg
148*d4bd3d25SJens Wiklander  * @attr:	attributes
149*d4bd3d25SJens Wiklander  * @tmem:	parameter by temporary memory reference
150*d4bd3d25SJens Wiklander  * @rmem:	parameter by registered memory reference
151*d4bd3d25SJens Wiklander  * @value:	parameter by opaque value
152*d4bd3d25SJens Wiklander  *
153*d4bd3d25SJens Wiklander  * @attr & OPTEE_MSG_ATTR_TYPE_MASK indicates if tmem, rmem or value is used in
154*d4bd3d25SJens Wiklander  * the union. OPTEE_MSG_ATTR_TYPE_VALUE_* indicates value,
155*d4bd3d25SJens Wiklander  * OPTEE_MSG_ATTR_TYPE_TMEM_* indicates @tmem and
156*d4bd3d25SJens Wiklander  * OPTEE_MSG_ATTR_TYPE_RMEM_* indicates @rmem,
157*d4bd3d25SJens Wiklander  * OPTEE_MSG_ATTR_TYPE_NONE indicates that none of the members are used.
158*d4bd3d25SJens Wiklander  */
159*d4bd3d25SJens Wiklander struct optee_msg_param {
160*d4bd3d25SJens Wiklander 	u64 attr;
161*d4bd3d25SJens Wiklander 	union {
162*d4bd3d25SJens Wiklander 		struct optee_msg_param_tmem tmem;
163*d4bd3d25SJens Wiklander 		struct optee_msg_param_rmem rmem;
164*d4bd3d25SJens Wiklander 		struct optee_msg_param_value value;
165*d4bd3d25SJens Wiklander 	} u;
166*d4bd3d25SJens Wiklander };
167*d4bd3d25SJens Wiklander 
168*d4bd3d25SJens Wiklander /**
169*d4bd3d25SJens Wiklander  * struct optee_msg_arg - call argument
170*d4bd3d25SJens Wiklander  * @cmd: Command, one of OPTEE_MSG_CMD_* or OPTEE_MSG_RPC_CMD_*
171*d4bd3d25SJens Wiklander  * @func: Trusted Application function, specific to the Trusted Application,
172*d4bd3d25SJens Wiklander  *	     used if cmd == OPTEE_MSG_CMD_INVOKE_COMMAND
173*d4bd3d25SJens Wiklander  * @session: In parameter for all OPTEE_MSG_CMD_* except
174*d4bd3d25SJens Wiklander  *	     OPTEE_MSG_CMD_OPEN_SESSION where it's an output parameter instead
175*d4bd3d25SJens Wiklander  * @cancel_id: Cancellation id, a unique value to identify this request
176*d4bd3d25SJens Wiklander  * @ret: return value
177*d4bd3d25SJens Wiklander  * @ret_origin: origin of the return value
178*d4bd3d25SJens Wiklander  * @num_params: number of parameters supplied to the OS Command
179*d4bd3d25SJens Wiklander  * @params: the parameters supplied to the OS Command
180*d4bd3d25SJens Wiklander  *
181*d4bd3d25SJens Wiklander  * All normal calls to Trusted OS uses this struct. If cmd requires further
182*d4bd3d25SJens Wiklander  * information than what these field holds it can be passed as a parameter
183*d4bd3d25SJens Wiklander  * tagged as meta (setting the OPTEE_MSG_ATTR_META bit in corresponding
184*d4bd3d25SJens Wiklander  * attrs field). All parameters tagged as meta has to come first.
185*d4bd3d25SJens Wiklander  *
186*d4bd3d25SJens Wiklander  * Temp memref parameters can be fragmented if supported by the Trusted OS
187*d4bd3d25SJens Wiklander  * (when optee_smc.h is bearer of this protocol this is indicated with
188*d4bd3d25SJens Wiklander  * OPTEE_SMC_SEC_CAP_UNREGISTERED_SHM). If a logical memref parameter is
189*d4bd3d25SJens Wiklander  * fragmented then has all but the last fragment the
190*d4bd3d25SJens Wiklander  * OPTEE_MSG_ATTR_FRAGMENT bit set in attrs. Even if a memref is fragmented
191*d4bd3d25SJens Wiklander  * it will still be presented as a single logical memref to the Trusted
192*d4bd3d25SJens Wiklander  * Application.
193*d4bd3d25SJens Wiklander  */
194*d4bd3d25SJens Wiklander struct optee_msg_arg {
195*d4bd3d25SJens Wiklander 	u32 cmd;
196*d4bd3d25SJens Wiklander 	u32 func;
197*d4bd3d25SJens Wiklander 	u32 session;
198*d4bd3d25SJens Wiklander 	u32 cancel_id;
199*d4bd3d25SJens Wiklander 	u32 pad;
200*d4bd3d25SJens Wiklander 	u32 ret;
201*d4bd3d25SJens Wiklander 	u32 ret_origin;
202*d4bd3d25SJens Wiklander 	u32 num_params;
203*d4bd3d25SJens Wiklander 
204*d4bd3d25SJens Wiklander 	/* num_params tells the actual number of element in params */
205*d4bd3d25SJens Wiklander 	struct optee_msg_param params[0];
206*d4bd3d25SJens Wiklander };
207*d4bd3d25SJens Wiklander 
208*d4bd3d25SJens Wiklander /**
209*d4bd3d25SJens Wiklander  * OPTEE_MSG_GET_ARG_SIZE - return size of struct optee_msg_arg
210*d4bd3d25SJens Wiklander  *
211*d4bd3d25SJens Wiklander  * @num_params: Number of parameters embedded in the struct optee_msg_arg
212*d4bd3d25SJens Wiklander  *
213*d4bd3d25SJens Wiklander  * Returns the size of the struct optee_msg_arg together with the number
214*d4bd3d25SJens Wiklander  * of embedded parameters.
215*d4bd3d25SJens Wiklander  */
216*d4bd3d25SJens Wiklander #define OPTEE_MSG_GET_ARG_SIZE(num_params) \
217*d4bd3d25SJens Wiklander 	(sizeof(struct optee_msg_arg) + \
218*d4bd3d25SJens Wiklander 	 sizeof(struct optee_msg_param) * (num_params))
219*d4bd3d25SJens Wiklander 
220*d4bd3d25SJens Wiklander /*****************************************************************************
221*d4bd3d25SJens Wiklander  * Part 2 - requests from normal world
222*d4bd3d25SJens Wiklander  *****************************************************************************/
223*d4bd3d25SJens Wiklander 
224*d4bd3d25SJens Wiklander /*
225*d4bd3d25SJens Wiklander  * Return the following UID if using API specified in this file without
226*d4bd3d25SJens Wiklander  * further extensions:
227*d4bd3d25SJens Wiklander  * 384fb3e0-e7f8-11e3-af63-0002a5d5c51b.
228*d4bd3d25SJens Wiklander  * Represented in 4 32-bit words in OPTEE_MSG_UID_0, OPTEE_MSG_UID_1,
229*d4bd3d25SJens Wiklander  * OPTEE_MSG_UID_2, OPTEE_MSG_UID_3.
230*d4bd3d25SJens Wiklander  */
231*d4bd3d25SJens Wiklander #define OPTEE_MSG_UID_0			0x384fb3e0
232*d4bd3d25SJens Wiklander #define OPTEE_MSG_UID_1			0xe7f811e3
233*d4bd3d25SJens Wiklander #define OPTEE_MSG_UID_2			0xaf630002
234*d4bd3d25SJens Wiklander #define OPTEE_MSG_UID_3			0xa5d5c51b
235*d4bd3d25SJens Wiklander #define OPTEE_MSG_FUNCID_CALLS_UID	0xFF01
236*d4bd3d25SJens Wiklander 
237*d4bd3d25SJens Wiklander /*
238*d4bd3d25SJens Wiklander  * Returns 2.0 if using API specified in this file without further
239*d4bd3d25SJens Wiklander  * extensions. Represented in 2 32-bit words in OPTEE_MSG_REVISION_MAJOR
240*d4bd3d25SJens Wiklander  * and OPTEE_MSG_REVISION_MINOR
241*d4bd3d25SJens Wiklander  */
242*d4bd3d25SJens Wiklander #define OPTEE_MSG_REVISION_MAJOR	2
243*d4bd3d25SJens Wiklander #define OPTEE_MSG_REVISION_MINOR	0
244*d4bd3d25SJens Wiklander #define OPTEE_MSG_FUNCID_CALLS_REVISION	0xFF03
245*d4bd3d25SJens Wiklander 
246*d4bd3d25SJens Wiklander /*
247*d4bd3d25SJens Wiklander  * Get UUID of Trusted OS.
248*d4bd3d25SJens Wiklander  *
249*d4bd3d25SJens Wiklander  * Used by non-secure world to figure out which Trusted OS is installed.
250*d4bd3d25SJens Wiklander  * Note that returned UUID is the UUID of the Trusted OS, not of the API.
251*d4bd3d25SJens Wiklander  *
252*d4bd3d25SJens Wiklander  * Returns UUID in 4 32-bit words in the same way as
253*d4bd3d25SJens Wiklander  * OPTEE_MSG_FUNCID_CALLS_UID described above.
254*d4bd3d25SJens Wiklander  */
255*d4bd3d25SJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_0	0x486178e0
256*d4bd3d25SJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_1	0xe7f811e3
257*d4bd3d25SJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_2	0xbc5e0002
258*d4bd3d25SJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_3	0xa5d5c51b
259*d4bd3d25SJens Wiklander #define OPTEE_MSG_FUNCID_GET_OS_UUID	0x0000
260*d4bd3d25SJens Wiklander 
261*d4bd3d25SJens Wiklander /*
262*d4bd3d25SJens Wiklander  * Get revision of Trusted OS.
263*d4bd3d25SJens Wiklander  *
264*d4bd3d25SJens Wiklander  * Used by non-secure world to figure out which version of the Trusted OS
265*d4bd3d25SJens Wiklander  * is installed. Note that the returned revision is the revision of the
266*d4bd3d25SJens Wiklander  * Trusted OS, not of the API.
267*d4bd3d25SJens Wiklander  *
268*d4bd3d25SJens Wiklander  * Returns revision in 2 32-bit words in the same way as
269*d4bd3d25SJens Wiklander  * OPTEE_MSG_CALLS_REVISION described above.
270*d4bd3d25SJens Wiklander  */
271*d4bd3d25SJens Wiklander #define OPTEE_MSG_FUNCID_GET_OS_REVISION	0x0001
272*d4bd3d25SJens Wiklander 
273*d4bd3d25SJens Wiklander /*
274*d4bd3d25SJens Wiklander  * Do a secure call with struct optee_msg_arg as argument
275*d4bd3d25SJens Wiklander  * The OPTEE_MSG_CMD_* below defines what goes in struct optee_msg_arg::cmd
276*d4bd3d25SJens Wiklander  *
277*d4bd3d25SJens Wiklander  * OPTEE_MSG_CMD_OPEN_SESSION opens a session to a Trusted Application.
278*d4bd3d25SJens Wiklander  * The first two parameters are tagged as meta, holding two value
279*d4bd3d25SJens Wiklander  * parameters to pass the following information:
280*d4bd3d25SJens Wiklander  * param[0].u.value.a-b uuid of Trusted Application
281*d4bd3d25SJens Wiklander  * param[1].u.value.a-b uuid of Client
282*d4bd3d25SJens Wiklander  * param[1].u.value.c Login class of client OPTEE_MSG_LOGIN_*
283*d4bd3d25SJens Wiklander  *
284*d4bd3d25SJens Wiklander  * OPTEE_MSG_CMD_INVOKE_COMMAND invokes a command a previously opened
285*d4bd3d25SJens Wiklander  * session to a Trusted Application.  struct optee_msg_arg::func is Trusted
286*d4bd3d25SJens Wiklander  * Application function, specific to the Trusted Application.
287*d4bd3d25SJens Wiklander  *
288*d4bd3d25SJens Wiklander  * OPTEE_MSG_CMD_CLOSE_SESSION closes a previously opened session to
289*d4bd3d25SJens Wiklander  * Trusted Application.
290*d4bd3d25SJens Wiklander  *
291*d4bd3d25SJens Wiklander  * OPTEE_MSG_CMD_CANCEL cancels a currently invoked command.
292*d4bd3d25SJens Wiklander  *
293*d4bd3d25SJens Wiklander  * OPTEE_MSG_CMD_REGISTER_SHM registers a shared memory reference. The
294*d4bd3d25SJens Wiklander  * information is passed as:
295*d4bd3d25SJens Wiklander  * [in] param[0].attr			OPTEE_MSG_ATTR_TYPE_TMEM_INPUT
296*d4bd3d25SJens Wiklander  *					[| OPTEE_MSG_ATTR_FRAGMENT]
297*d4bd3d25SJens Wiklander  * [in] param[0].u.tmem.buf_ptr		physical address (of first fragment)
298*d4bd3d25SJens Wiklander  * [in] param[0].u.tmem.size		size (of first fragment)
299*d4bd3d25SJens Wiklander  * [in] param[0].u.tmem.shm_ref		holds shared memory reference
300*d4bd3d25SJens Wiklander  * ...
301*d4bd3d25SJens Wiklander  * The shared memory can optionally be fragmented, temp memrefs can follow
302*d4bd3d25SJens Wiklander  * each other with all but the last with the OPTEE_MSG_ATTR_FRAGMENT bit set.
303*d4bd3d25SJens Wiklander  *
304*d4bd3d25SJens Wiklander  * OPTEE_MSG_CMD_UNREGISTER_SHM unregisteres a previously registered shared
305*d4bd3d25SJens Wiklander  * memory reference. The information is passed as:
306*d4bd3d25SJens Wiklander  * [in] param[0].attr			OPTEE_MSG_ATTR_TYPE_RMEM_INPUT
307*d4bd3d25SJens Wiklander  * [in] param[0].u.rmem.shm_ref		holds shared memory reference
308*d4bd3d25SJens Wiklander  * [in] param[0].u.rmem.offs		0
309*d4bd3d25SJens Wiklander  * [in] param[0].u.rmem.size		0
310*d4bd3d25SJens Wiklander  */
311*d4bd3d25SJens Wiklander #define OPTEE_MSG_CMD_OPEN_SESSION	0
312*d4bd3d25SJens Wiklander #define OPTEE_MSG_CMD_INVOKE_COMMAND	1
313*d4bd3d25SJens Wiklander #define OPTEE_MSG_CMD_CLOSE_SESSION	2
314*d4bd3d25SJens Wiklander #define OPTEE_MSG_CMD_CANCEL		3
315*d4bd3d25SJens Wiklander #define OPTEE_MSG_CMD_REGISTER_SHM	4
316*d4bd3d25SJens Wiklander #define OPTEE_MSG_CMD_UNREGISTER_SHM	5
317*d4bd3d25SJens Wiklander #define OPTEE_MSG_FUNCID_CALL_WITH_ARG	0x0004
318*d4bd3d25SJens Wiklander 
319*d4bd3d25SJens Wiklander /*****************************************************************************
320*d4bd3d25SJens Wiklander  * Part 3 - Requests from secure world, RPC
321*d4bd3d25SJens Wiklander  *****************************************************************************/
322*d4bd3d25SJens Wiklander 
323*d4bd3d25SJens Wiklander /*
324*d4bd3d25SJens Wiklander  * All RPC is done with a struct optee_msg_arg as bearer of information,
325*d4bd3d25SJens Wiklander  * struct optee_msg_arg::arg holds values defined by OPTEE_MSG_RPC_CMD_* below
326*d4bd3d25SJens Wiklander  *
327*d4bd3d25SJens Wiklander  * RPC communication with tee-supplicant is reversed compared to normal
328*d4bd3d25SJens Wiklander  * client communication desribed above. The supplicant receives requests
329*d4bd3d25SJens Wiklander  * and sends responses.
330*d4bd3d25SJens Wiklander  */
331*d4bd3d25SJens Wiklander 
332*d4bd3d25SJens Wiklander /*
333*d4bd3d25SJens Wiklander  * Load a TA into memory, defined in tee-supplicant
334*d4bd3d25SJens Wiklander  */
335*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_LOAD_TA	0
336*d4bd3d25SJens Wiklander 
337*d4bd3d25SJens Wiklander /*
338*d4bd3d25SJens Wiklander  * Reserved
339*d4bd3d25SJens Wiklander  */
340*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_RPMB		1
341*d4bd3d25SJens Wiklander 
342*d4bd3d25SJens Wiklander /*
343*d4bd3d25SJens Wiklander  * File system access, defined in tee-supplicant
344*d4bd3d25SJens Wiklander  */
345*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_FS		2
346*d4bd3d25SJens Wiklander 
347*d4bd3d25SJens Wiklander /*
348*d4bd3d25SJens Wiklander  * Get time
349*d4bd3d25SJens Wiklander  *
350*d4bd3d25SJens Wiklander  * Returns number of seconds and nano seconds since the Epoch,
351*d4bd3d25SJens Wiklander  * 1970-01-01 00:00:00 +0000 (UTC).
352*d4bd3d25SJens Wiklander  *
353*d4bd3d25SJens Wiklander  * [out] param[0].u.value.a	Number of seconds
354*d4bd3d25SJens Wiklander  * [out] param[0].u.value.b	Number of nano seconds.
355*d4bd3d25SJens Wiklander  */
356*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_GET_TIME	3
357*d4bd3d25SJens Wiklander 
358*d4bd3d25SJens Wiklander /*
359*d4bd3d25SJens Wiklander  * Wait queue primitive, helper for secure world to implement a wait queue.
360*d4bd3d25SJens Wiklander  *
361*d4bd3d25SJens Wiklander  * If secure world need to wait for a secure world mutex it issues a sleep
362*d4bd3d25SJens Wiklander  * request instead of spinning in secure world. Conversely is a wakeup
363*d4bd3d25SJens Wiklander  * request issued when a secure world mutex with a thread waiting thread is
364*d4bd3d25SJens Wiklander  * unlocked.
365*d4bd3d25SJens Wiklander  *
366*d4bd3d25SJens Wiklander  * Waiting on a key
367*d4bd3d25SJens Wiklander  * [in] param[0].u.value.a OPTEE_MSG_RPC_WAIT_QUEUE_SLEEP
368*d4bd3d25SJens Wiklander  * [in] param[0].u.value.b wait key
369*d4bd3d25SJens Wiklander  *
370*d4bd3d25SJens Wiklander  * Waking up a key
371*d4bd3d25SJens Wiklander  * [in] param[0].u.value.a OPTEE_MSG_RPC_WAIT_QUEUE_WAKEUP
372*d4bd3d25SJens Wiklander  * [in] param[0].u.value.b wakeup key
373*d4bd3d25SJens Wiklander  */
374*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_WAIT_QUEUE	4
375*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_WAIT_QUEUE_SLEEP	0
376*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_WAIT_QUEUE_WAKEUP	1
377*d4bd3d25SJens Wiklander 
378*d4bd3d25SJens Wiklander /*
379*d4bd3d25SJens Wiklander  * Suspend execution
380*d4bd3d25SJens Wiklander  *
381*d4bd3d25SJens Wiklander  * [in] param[0].value	.a number of milliseconds to suspend
382*d4bd3d25SJens Wiklander  */
383*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_SUSPEND	5
384*d4bd3d25SJens Wiklander 
385*d4bd3d25SJens Wiklander /*
386*d4bd3d25SJens Wiklander  * Allocate a piece of shared memory
387*d4bd3d25SJens Wiklander  *
388*d4bd3d25SJens Wiklander  * Shared memory can optionally be fragmented, to support that additional
389*d4bd3d25SJens Wiklander  * spare param entries are allocated to make room for eventual fragments.
390*d4bd3d25SJens Wiklander  * The spare param entries has .attr = OPTEE_MSG_ATTR_TYPE_NONE when
391*d4bd3d25SJens Wiklander  * unused. All returned temp memrefs except the last should have the
392*d4bd3d25SJens Wiklander  * OPTEE_MSG_ATTR_FRAGMENT bit set in the attr field.
393*d4bd3d25SJens Wiklander  *
394*d4bd3d25SJens Wiklander  * [in]  param[0].u.value.a		type of memory one of
395*d4bd3d25SJens Wiklander  *					OPTEE_MSG_RPC_SHM_TYPE_* below
396*d4bd3d25SJens Wiklander  * [in]  param[0].u.value.b		requested size
397*d4bd3d25SJens Wiklander  * [in]  param[0].u.value.c		required alignment
398*d4bd3d25SJens Wiklander  *
399*d4bd3d25SJens Wiklander  * [out] param[0].u.tmem.buf_ptr	physical address (of first fragment)
400*d4bd3d25SJens Wiklander  * [out] param[0].u.tmem.size		size (of first fragment)
401*d4bd3d25SJens Wiklander  * [out] param[0].u.tmem.shm_ref	shared memory reference
402*d4bd3d25SJens Wiklander  * ...
403*d4bd3d25SJens Wiklander  * [out] param[n].u.tmem.buf_ptr	physical address
404*d4bd3d25SJens Wiklander  * [out] param[n].u.tmem.size		size
405*d4bd3d25SJens Wiklander  * [out] param[n].u.tmem.shm_ref	shared memory reference (same value
406*d4bd3d25SJens Wiklander  *					as in param[n-1].u.tmem.shm_ref)
407*d4bd3d25SJens Wiklander  */
408*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_SHM_ALLOC	6
409*d4bd3d25SJens Wiklander /* Memory that can be shared with a non-secure user space application */
410*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_SHM_TYPE_APPL	0
411*d4bd3d25SJens Wiklander /* Memory only shared with non-secure kernel */
412*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_SHM_TYPE_KERNEL	1
413*d4bd3d25SJens Wiklander 
414*d4bd3d25SJens Wiklander /*
415*d4bd3d25SJens Wiklander  * Free shared memory previously allocated with OPTEE_MSG_RPC_CMD_SHM_ALLOC
416*d4bd3d25SJens Wiklander  *
417*d4bd3d25SJens Wiklander  * [in]  param[0].u.value.a		type of memory one of
418*d4bd3d25SJens Wiklander  *					OPTEE_MSG_RPC_SHM_TYPE_* above
419*d4bd3d25SJens Wiklander  * [in]  param[0].u.value.b		value of shared memory reference
420*d4bd3d25SJens Wiklander  *					returned in param[0].u.tmem.shm_ref
421*d4bd3d25SJens Wiklander  *					above
422*d4bd3d25SJens Wiklander  */
423*d4bd3d25SJens Wiklander #define OPTEE_MSG_RPC_CMD_SHM_FREE	7
424*d4bd3d25SJens Wiklander 
425*d4bd3d25SJens Wiklander #endif /* _OPTEE_MSG_H */
426