xref: /optee_os/core/include/optee_msg.h (revision 3c2e09b3ea5528a679a4f0532d844c4352937629)
11bb92983SJerome Forissier /* SPDX-License-Identifier: BSD-2-Clause */
2e43888b8SJens Wiklander /*
3*3c2e09b3SJens Wiklander  * Copyright (c) 2015-2025, Linaro Limited
4e43888b8SJens Wiklander  */
5d50fee03SEtienne Carriere #ifndef __OPTEE_MSG_H
6d50fee03SEtienne Carriere #define __OPTEE_MSG_H
7e43888b8SJens Wiklander 
80638aa9fSJens Wiklander #include <compiler.h>
90638aa9fSJens Wiklander #include <types_ext.h>
105cf48737SJens Wiklander #include <util.h>
110638aa9fSJens Wiklander 
12e43888b8SJens Wiklander /*
130cbde272SJens Wiklander  * This file defines the OP-TEE message protocol (ABI) used to communicate
14e43888b8SJens Wiklander  * with an instance of OP-TEE running in secure world.
150cbde272SJens Wiklander  *
160cbde272SJens Wiklander  * This file is divided into two sections.
170cbde272SJens Wiklander  * 1. Formatting of messages.
180cbde272SJens Wiklander  * 2. Requests from normal world
19e43888b8SJens Wiklander  */
20e43888b8SJens Wiklander 
21e43888b8SJens Wiklander /*****************************************************************************
22e43888b8SJens Wiklander  * Part 1 - formatting of messages
23e43888b8SJens Wiklander  *****************************************************************************/
24e43888b8SJens Wiklander 
2557f197ecSJens Wiklander #define OPTEE_MSG_ATTR_TYPE_NONE		U(0x0)
2657f197ecSJens Wiklander #define OPTEE_MSG_ATTR_TYPE_VALUE_INPUT		U(0x1)
2757f197ecSJens Wiklander #define OPTEE_MSG_ATTR_TYPE_VALUE_OUTPUT	U(0x2)
2857f197ecSJens Wiklander #define OPTEE_MSG_ATTR_TYPE_VALUE_INOUT		U(0x3)
2957f197ecSJens Wiklander #define OPTEE_MSG_ATTR_TYPE_RMEM_INPUT		U(0x5)
3057f197ecSJens Wiklander #define OPTEE_MSG_ATTR_TYPE_RMEM_OUTPUT		U(0x6)
3157f197ecSJens Wiklander #define OPTEE_MSG_ATTR_TYPE_RMEM_INOUT		U(0x7)
32c13d4bd7SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_FMEM_INPUT		OPTEE_MSG_ATTR_TYPE_RMEM_INPUT
33c13d4bd7SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_FMEM_OUTPUT		OPTEE_MSG_ATTR_TYPE_RMEM_OUTPUT
34c13d4bd7SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_FMEM_INOUT		OPTEE_MSG_ATTR_TYPE_RMEM_INOUT
3557f197ecSJens Wiklander #define OPTEE_MSG_ATTR_TYPE_TMEM_INPUT		U(0x9)
3657f197ecSJens Wiklander #define OPTEE_MSG_ATTR_TYPE_TMEM_OUTPUT		U(0xa)
3757f197ecSJens Wiklander #define OPTEE_MSG_ATTR_TYPE_TMEM_INOUT		U(0xb)
38e43888b8SJens Wiklander 
395cf48737SJens Wiklander #define OPTEE_MSG_ATTR_TYPE_MASK		GENMASK_32(7, 0)
40e43888b8SJens Wiklander 
41e43888b8SJens Wiklander /*
42e43888b8SJens Wiklander  * Meta parameter to be absorbed by the Secure OS and not passed
43e43888b8SJens Wiklander  * to the Trusted Application.
44e43888b8SJens Wiklander  *
45e43888b8SJens Wiklander  * Currently only used with OPTEE_MSG_CMD_OPEN_SESSION.
46e43888b8SJens Wiklander  */
475cf48737SJens Wiklander #define OPTEE_MSG_ATTR_META			BIT(8)
48e43888b8SJens Wiklander 
49e43888b8SJens Wiklander /*
50e7a8839bSVolodymyr Babchuk  * Pointer to a list of pages used to register user-defined SHM buffer.
51e7a8839bSVolodymyr Babchuk  * Used with OPTEE_MSG_ATTR_TYPE_TMEM_*.
52e7a8839bSVolodymyr Babchuk  * buf_ptr should point to the beginning of the buffer. Buffer will contain
53e7a8839bSVolodymyr Babchuk  * list of page addresses. OP-TEE core can reconstruct contiguous buffer from
54e7a8839bSVolodymyr Babchuk  * that page addresses list. Page addresses are stored as 64 bit values.
55e7a8839bSVolodymyr Babchuk  * Last entry on a page should point to the next page of buffer.
56e7a8839bSVolodymyr Babchuk  * Every entry in buffer should point to a 4k page beginning (12 least
57e7a8839bSVolodymyr Babchuk  * significant bits must be equal to zero).
58e7a8839bSVolodymyr Babchuk  *
59c13d4bd7SJens Wiklander  * 12 least significant bits of optee_msg_param.u.tmem.buf_ptr should hold
60c13d4bd7SJens Wiklander  * page offset of user buffer.
61e7a8839bSVolodymyr Babchuk  *
62e7a8839bSVolodymyr Babchuk  * So, entries should be placed like members of this structure:
63e7a8839bSVolodymyr Babchuk  *
64e7a8839bSVolodymyr Babchuk  * struct page_data {
65e7a8839bSVolodymyr Babchuk  *   uint64_t pages_array[OPTEE_MSG_NONCONTIG_PAGE_SIZE/sizeof(uint64_t) - 1];
66e7a8839bSVolodymyr Babchuk  *   uint64_t next_page_data;
67e7a8839bSVolodymyr Babchuk  * };
68e7a8839bSVolodymyr Babchuk  *
69e7a8839bSVolodymyr Babchuk  * Structure is designed to exactly fit into the page size
70e7a8839bSVolodymyr Babchuk  * OPTEE_MSG_NONCONTIG_PAGE_SIZE which is a standard 4KB page.
71e7a8839bSVolodymyr Babchuk  *
72e7a8839bSVolodymyr Babchuk  * The size of 4KB is chosen because this is the smallest page size for ARM
73e7a8839bSVolodymyr Babchuk  * architectures. If REE uses larger pages, it should divide them to 4KB ones.
74e43888b8SJens Wiklander  */
75e7a8839bSVolodymyr Babchuk #define OPTEE_MSG_ATTR_NONCONTIG		BIT(9)
76e43888b8SJens Wiklander 
77e43888b8SJens Wiklander /*
78e43888b8SJens Wiklander  * Memory attributes for caching passed with temp memrefs. The actual value
79e43888b8SJens Wiklander  * used is defined outside the message protocol with the exception of
80e43888b8SJens Wiklander  * OPTEE_MSG_ATTR_CACHE_PREDEFINED which means the attributes already
81e43888b8SJens Wiklander  * defined for the memory range should be used. If optee_smc.h is used as
82e43888b8SJens Wiklander  * bearer of this protocol OPTEE_SMC_SHM_* is used for values.
83e43888b8SJens Wiklander  */
8457f197ecSJens Wiklander #define OPTEE_MSG_ATTR_CACHE_SHIFT		U(16)
855cf48737SJens Wiklander #define OPTEE_MSG_ATTR_CACHE_MASK		GENMASK_32(2, 0)
8657f197ecSJens Wiklander #define OPTEE_MSG_ATTR_CACHE_PREDEFINED		U(0)
87e43888b8SJens Wiklander 
88e43888b8SJens Wiklander /*
89e43888b8SJens Wiklander  * Same values as TEE_LOGIN_* from TEE Internal API
90e43888b8SJens Wiklander  */
9157f197ecSJens Wiklander #define OPTEE_MSG_LOGIN_PUBLIC			U(0x00000000)
9257f197ecSJens Wiklander #define OPTEE_MSG_LOGIN_USER			U(0x00000001)
9357f197ecSJens Wiklander #define OPTEE_MSG_LOGIN_GROUP			U(0x00000002)
9457f197ecSJens Wiklander #define OPTEE_MSG_LOGIN_APPLICATION		U(0x00000004)
9557f197ecSJens Wiklander #define OPTEE_MSG_LOGIN_APPLICATION_USER	U(0x00000005)
9657f197ecSJens Wiklander #define OPTEE_MSG_LOGIN_APPLICATION_GROUP	U(0x00000006)
97e43888b8SJens Wiklander 
98e7a8839bSVolodymyr Babchuk /*
99e7a8839bSVolodymyr Babchuk  * Page size used in non-contiguous buffer entries
100e7a8839bSVolodymyr Babchuk  */
10157f197ecSJens Wiklander #define OPTEE_MSG_NONCONTIG_PAGE_SIZE		U(4096)
102e7a8839bSVolodymyr Babchuk 
103c1bdf4fcSJens Wiklander #define OPTEE_MSG_FMEM_INVALID_GLOBAL_ID	0xffffffffffffffff
104c1bdf4fcSJens Wiklander 
105757331fcSJens Wiklander #ifndef __ASSEMBLER__
106e43888b8SJens Wiklander /**
1075cf48737SJens Wiklander  * struct optee_msg_param_tmem - temporary memory reference parameter
108e43888b8SJens Wiklander  * @buf_ptr:	Address of the buffer
109e43888b8SJens Wiklander  * @size:	Size of the buffer
110e43888b8SJens Wiklander  * @shm_ref:	Temporary shared memory reference, pointer to a struct tee_shm
111e43888b8SJens Wiklander  *
112e43888b8SJens Wiklander  * Secure and normal world communicates pointers as physical address
113e43888b8SJens Wiklander  * instead of the virtual address. This is because secure and normal world
114e43888b8SJens Wiklander  * have completely independent memory mapping. Normal world can even have a
115e43888b8SJens Wiklander  * hypervisor which need to translate the guest physical address (AKA IPA
116e43888b8SJens Wiklander  * in ARM documentation) to a real physical address before passing the
117e43888b8SJens Wiklander  * structure to secure world.
118e43888b8SJens Wiklander  */
119e43888b8SJens Wiklander struct optee_msg_param_tmem {
120e43888b8SJens Wiklander 	uint64_t buf_ptr;
121e43888b8SJens Wiklander 	uint64_t size;
122e43888b8SJens Wiklander 	uint64_t shm_ref;
123e43888b8SJens Wiklander };
124e43888b8SJens Wiklander 
125e43888b8SJens Wiklander /**
1265cf48737SJens Wiklander  * struct optee_msg_param_rmem - registered memory reference parameter
127e43888b8SJens Wiklander  * @offs:	Offset into shared memory reference
128e43888b8SJens Wiklander  * @size:	Size of the buffer
129e43888b8SJens Wiklander  * @shm_ref:	Shared memory reference, pointer to a struct tee_shm
130e43888b8SJens Wiklander  */
131e43888b8SJens Wiklander struct optee_msg_param_rmem {
132e43888b8SJens Wiklander 	uint64_t offs;
133e43888b8SJens Wiklander 	uint64_t size;
134e43888b8SJens Wiklander 	uint64_t shm_ref;
135e43888b8SJens Wiklander };
136e43888b8SJens Wiklander 
137e43888b8SJens Wiklander /**
138c13d4bd7SJens Wiklander  * struct optee_msg_param_fmem - FF-A memory reference parameter
139c13d4bd7SJens Wiklander  * @offs_lower:	   Lower bits of offset into shared memory reference
140c13d4bd7SJens Wiklander  * @offs_upper:	   Upper bits of offset into shared memory reference
141c13d4bd7SJens Wiklander  * @internal_offs: Internal offset into the first page of shared memory
142c13d4bd7SJens Wiklander  *		   reference
143c13d4bd7SJens Wiklander  * @size:	   Size of the buffer
144c13d4bd7SJens Wiklander  * @global_id:	   Global identifier of the shared memory
145c13d4bd7SJens Wiklander  */
146c13d4bd7SJens Wiklander struct optee_msg_param_fmem {
147c13d4bd7SJens Wiklander 	uint32_t offs_low;
148c13d4bd7SJens Wiklander 	uint16_t offs_high;
149c13d4bd7SJens Wiklander 	uint16_t internal_offs;
150c13d4bd7SJens Wiklander 	uint64_t size;
151c13d4bd7SJens Wiklander 	uint64_t global_id;
152c13d4bd7SJens Wiklander };
153c13d4bd7SJens Wiklander 
154c13d4bd7SJens Wiklander /**
155c13d4bd7SJens Wiklander  * struct optee_msg_param_value - opaque value parameter
156c13d4bd7SJens Wiklander  *
157c13d4bd7SJens Wiklander  * Value parameters are passed unchecked between normal and secure world.
158e43888b8SJens Wiklander  */
159e43888b8SJens Wiklander struct optee_msg_param_value {
160e43888b8SJens Wiklander 	uint64_t a;
161e43888b8SJens Wiklander 	uint64_t b;
162e43888b8SJens Wiklander 	uint64_t c;
163e43888b8SJens Wiklander };
164e43888b8SJens Wiklander 
165e43888b8SJens Wiklander /**
166c13d4bd7SJens Wiklander  * struct optee_msg_param - parameter used together with struct optee_msg_arg
167e43888b8SJens Wiklander  * @attr:	attributes
168c13d4bd7SJens Wiklander  * @tmem:	parameter by temporary memory reference
169c13d4bd7SJens Wiklander  * @rmem:	parameter by registered memory reference
170c13d4bd7SJens Wiklander  * @fmem:	parameter by FF-A registered memory reference
171c13d4bd7SJens Wiklander  * @value:	parameter by opaque value
1720cbde272SJens Wiklander  * @octets:	parameter by octet string
173e43888b8SJens Wiklander  *
174e43888b8SJens Wiklander  * @attr & OPTEE_MSG_ATTR_TYPE_MASK indicates if tmem, rmem or value is used in
1750cbde272SJens Wiklander  * the union. OPTEE_MSG_ATTR_TYPE_VALUE_* indicates value or octets,
176c13d4bd7SJens Wiklander  * OPTEE_MSG_ATTR_TYPE_TMEM_* indicates @tmem and
177c13d4bd7SJens Wiklander  * OPTEE_MSG_ATTR_TYPE_RMEM_* or the alias PTEE_MSG_ATTR_TYPE_FMEM_* indicates
178c13d4bd7SJens Wiklander  * @rmem or @fmem depending on the conduit.
179e43888b8SJens Wiklander  * OPTEE_MSG_ATTR_TYPE_NONE indicates that none of the members are used.
180e43888b8SJens Wiklander  */
181e43888b8SJens Wiklander struct optee_msg_param {
182e43888b8SJens Wiklander 	uint64_t attr;
183e43888b8SJens Wiklander 	union {
184e43888b8SJens Wiklander 		struct optee_msg_param_tmem tmem;
185e43888b8SJens Wiklander 		struct optee_msg_param_rmem rmem;
186c13d4bd7SJens Wiklander 		struct optee_msg_param_fmem fmem;
187e43888b8SJens Wiklander 		struct optee_msg_param_value value;
1880cbde272SJens Wiklander 		uint8_t octets[24];
189e43888b8SJens Wiklander 	} u;
190e43888b8SJens Wiklander };
191e43888b8SJens Wiklander 
192e43888b8SJens Wiklander /**
193e43888b8SJens Wiklander  * struct optee_msg_arg - call argument
194e43888b8SJens Wiklander  * @cmd: Command, one of OPTEE_MSG_CMD_* or OPTEE_MSG_RPC_CMD_*
195e43888b8SJens Wiklander  * @func: Trusted Application function, specific to the Trusted Application,
196e43888b8SJens Wiklander  *	     used if cmd == OPTEE_MSG_CMD_INVOKE_COMMAND
197e43888b8SJens Wiklander  * @session: In parameter for all OPTEE_MSG_CMD_* except
198e43888b8SJens Wiklander  *	     OPTEE_MSG_CMD_OPEN_SESSION where it's an output parameter instead
199e43888b8SJens Wiklander  * @cancel_id: Cancellation id, a unique value to identify this request
200e43888b8SJens Wiklander  * @ret: return value
201e43888b8SJens Wiklander  * @ret_origin: origin of the return value
202e43888b8SJens Wiklander  * @num_params: number of parameters supplied to the OS Command
203e43888b8SJens Wiklander  * @params: the parameters supplied to the OS Command
204e43888b8SJens Wiklander  *
205e43888b8SJens Wiklander  * All normal calls to Trusted OS uses this struct. If cmd requires further
206e43888b8SJens Wiklander  * information than what these fields hold it can be passed as a parameter
207e43888b8SJens Wiklander  * tagged as meta (setting the OPTEE_MSG_ATTR_META bit in corresponding
208e43888b8SJens Wiklander  * attrs field). All parameters tagged as meta have to come first.
209e43888b8SJens Wiklander  */
210e43888b8SJens Wiklander struct optee_msg_arg {
211e43888b8SJens Wiklander 	uint32_t cmd;
212e43888b8SJens Wiklander 	uint32_t func;
213e43888b8SJens Wiklander 	uint32_t session;
214e43888b8SJens Wiklander 	uint32_t cancel_id;
215e43888b8SJens Wiklander 	uint32_t pad;
216e43888b8SJens Wiklander 	uint32_t ret;
217e43888b8SJens Wiklander 	uint32_t ret_origin;
218e43888b8SJens Wiklander 	uint32_t num_params;
219e43888b8SJens Wiklander 
2205cf48737SJens Wiklander 	/* num_params tells the actual number of element in params */
2215cf48737SJens Wiklander 	struct optee_msg_param params[];
2225cf48737SJens Wiklander };
223e43888b8SJens Wiklander 
224e43888b8SJens Wiklander /**
225e43888b8SJens Wiklander  * OPTEE_MSG_GET_ARG_SIZE - return size of struct optee_msg_arg
226e43888b8SJens Wiklander  *
227e43888b8SJens Wiklander  * @num_params: Number of parameters embedded in the struct optee_msg_arg
228e43888b8SJens Wiklander  *
229e43888b8SJens Wiklander  * Returns the size of the struct optee_msg_arg together with the number
230e43888b8SJens Wiklander  * of embedded parameters.
231e43888b8SJens Wiklander  */
232e43888b8SJens Wiklander #define OPTEE_MSG_GET_ARG_SIZE(num_params) \
233e43888b8SJens Wiklander 	(sizeof(struct optee_msg_arg) + \
234e43888b8SJens Wiklander 	 sizeof(struct optee_msg_param) * (num_params))
235c4f75cc6SJens Wiklander 
236c4f75cc6SJens Wiklander /*
237c4f75cc6SJens Wiklander  * Defines the maximum value of @num_params that can be passed to
238c4f75cc6SJens Wiklander  * OPTEE_MSG_GET_ARG_SIZE without a risk of crossing page boundary.
239c4f75cc6SJens Wiklander  */
240c4f75cc6SJens Wiklander #define OPTEE_MSG_MAX_NUM_PARAMS	\
241c4f75cc6SJens Wiklander 	((OPTEE_MSG_NONCONTIG_PAGE_SIZE - sizeof(struct optee_msg_arg)) / \
242c4f75cc6SJens Wiklander 	 sizeof(struct optee_msg_param))
243c4f75cc6SJens Wiklander 
244757331fcSJens Wiklander #endif /*__ASSEMBLER__*/
245e43888b8SJens Wiklander 
246e43888b8SJens Wiklander /*****************************************************************************
247e43888b8SJens Wiklander  * Part 2 - requests from normal world
248e43888b8SJens Wiklander  *****************************************************************************/
249e43888b8SJens Wiklander 
250e43888b8SJens Wiklander /*
251e43888b8SJens Wiklander  * Return the following UID if using API specified in this file without
252e43888b8SJens Wiklander  * further extensions:
253e43888b8SJens Wiklander  * 384fb3e0-e7f8-11e3-af63-0002a5d5c51b.
254e43888b8SJens Wiklander  * Represented in 4 32-bit words in OPTEE_MSG_UID_0, OPTEE_MSG_UID_1,
255e43888b8SJens Wiklander  * OPTEE_MSG_UID_2, OPTEE_MSG_UID_3.
256e43888b8SJens Wiklander  */
25757f197ecSJens Wiklander #define OPTEE_MSG_UID_0			U(0x384fb3e0)
25857f197ecSJens Wiklander #define OPTEE_MSG_UID_1			U(0xe7f811e3)
25957f197ecSJens Wiklander #define OPTEE_MSG_UID_2			U(0xaf630002)
26057f197ecSJens Wiklander #define OPTEE_MSG_UID_3			U(0xa5d5c51b)
26157f197ecSJens Wiklander #define OPTEE_MSG_FUNCID_CALLS_UID	U(0xFF01)
262e43888b8SJens Wiklander 
263e43888b8SJens Wiklander /*
264e43888b8SJens Wiklander  * Returns 2.0 if using API specified in this file without further
265e43888b8SJens Wiklander  * extensions. Represented in 2 32-bit words in OPTEE_MSG_REVISION_MAJOR
266e43888b8SJens Wiklander  * and OPTEE_MSG_REVISION_MINOR
267e43888b8SJens Wiklander  */
26857f197ecSJens Wiklander #define OPTEE_MSG_REVISION_MAJOR	U(2)
26957f197ecSJens Wiklander #define OPTEE_MSG_REVISION_MINOR	U(0)
27057f197ecSJens Wiklander #define OPTEE_MSG_FUNCID_CALLS_REVISION	U(0xFF03)
271e43888b8SJens Wiklander 
272e43888b8SJens Wiklander /*
273e43888b8SJens Wiklander  * Get UUID of Trusted OS.
274e43888b8SJens Wiklander  *
275e43888b8SJens Wiklander  * Used by non-secure world to figure out which Trusted OS is installed.
276e43888b8SJens Wiklander  * Note that returned UUID is the UUID of the Trusted OS, not of the API.
277e43888b8SJens Wiklander  *
278e43888b8SJens Wiklander  * Returns UUID in 4 32-bit words in the same way as
279e43888b8SJens Wiklander  * OPTEE_MSG_FUNCID_CALLS_UID described above.
280e43888b8SJens Wiklander  */
28157f197ecSJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_0	U(0x486178e0)
28257f197ecSJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_1	U(0xe7f811e3)
28357f197ecSJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_2	U(0xbc5e0002)
28457f197ecSJens Wiklander #define OPTEE_MSG_OS_OPTEE_UUID_3	U(0xa5d5c51b)
28557f197ecSJens Wiklander #define OPTEE_MSG_FUNCID_GET_OS_UUID	U(0x0000)
286e43888b8SJens Wiklander 
287e43888b8SJens Wiklander /*
288e43888b8SJens Wiklander  * Get revision of Trusted OS.
289e43888b8SJens Wiklander  *
290e43888b8SJens Wiklander  * Used by non-secure world to figure out which version of the Trusted OS
291e43888b8SJens Wiklander  * is installed. Note that the returned revision is the revision of the
292e43888b8SJens Wiklander  * Trusted OS, not of the API.
293e43888b8SJens Wiklander  *
294e43888b8SJens Wiklander  * Returns revision in 2 32-bit words in the same way as
295e43888b8SJens Wiklander  * OPTEE_MSG_CALLS_REVISION described above.
296e43888b8SJens Wiklander  */
29757f197ecSJens Wiklander #define OPTEE_MSG_FUNCID_GET_OS_REVISION	U(0x0001)
298e43888b8SJens Wiklander 
299e43888b8SJens Wiklander /*
300*3c2e09b3SJens Wiklander  * Values used in OPTEE_MSG_CMD_LEND_PROTMEM below
301*3c2e09b3SJens Wiklander  * OPTEE_MSG_PROTMEM_RESERVED		 Reserved
302*3c2e09b3SJens Wiklander  * OPTEE_MSG_PROTMEM_SECURE_VIDEO_PLAY	 Secure Video Playback
303*3c2e09b3SJens Wiklander  * OPTEE_MSG_PROTMEM_TRUSTED_UI		 Trusted UI
304*3c2e09b3SJens Wiklander  * OPTEE_MSG_PROTMEM_SECURE_VIDEO_RECORD Secure Video Recording
305*3c2e09b3SJens Wiklander  */
306*3c2e09b3SJens Wiklander #define OPTEE_MSG_PROTMEM_RESERVED		U(0)
307*3c2e09b3SJens Wiklander #define OPTEE_MSG_PROTMEM_SECURE_VIDEO_PLAY	U(1)
308*3c2e09b3SJens Wiklander #define OPTEE_MSG_PROTMEM_TRUSTED_UI		U(2)
309*3c2e09b3SJens Wiklander #define OPTEE_MSG_PROTMEM_SECURE_VIDEO_RECORD	U(3)
310*3c2e09b3SJens Wiklander 
311*3c2e09b3SJens Wiklander /*
312e43888b8SJens Wiklander  * Do a secure call with struct optee_msg_arg as argument
313e43888b8SJens Wiklander  * The OPTEE_MSG_CMD_* below defines what goes in struct optee_msg_arg::cmd
314e43888b8SJens Wiklander  *
315e43888b8SJens Wiklander  * OPTEE_MSG_CMD_OPEN_SESSION opens a session to a Trusted Application.
316e43888b8SJens Wiklander  * The first two parameters are tagged as meta, holding two value
317e43888b8SJens Wiklander  * parameters to pass the following information:
318e43888b8SJens Wiklander  * param[0].u.value.a-b uuid of Trusted Application
319e43888b8SJens Wiklander  * param[1].u.value.a-b uuid of Client
320e43888b8SJens Wiklander  * param[1].u.value.c Login class of client OPTEE_MSG_LOGIN_*
321e43888b8SJens Wiklander  *
322e43888b8SJens Wiklander  * OPTEE_MSG_CMD_INVOKE_COMMAND invokes a command a previously opened
323e43888b8SJens Wiklander  * session to a Trusted Application.  struct optee_msg_arg::func is Trusted
324e43888b8SJens Wiklander  * Application function, specific to the Trusted Application.
325e43888b8SJens Wiklander  *
326e43888b8SJens Wiklander  * OPTEE_MSG_CMD_CLOSE_SESSION closes a previously opened session to
327e43888b8SJens Wiklander  * Trusted Application.
328e43888b8SJens Wiklander  *
329e43888b8SJens Wiklander  * OPTEE_MSG_CMD_CANCEL cancels a currently invoked command.
330e43888b8SJens Wiklander  *
331e43888b8SJens Wiklander  * OPTEE_MSG_CMD_REGISTER_SHM registers a shared memory reference. The
332e43888b8SJens Wiklander  * information is passed as:
333e43888b8SJens Wiklander  * [in] param[0].attr			OPTEE_MSG_ATTR_TYPE_TMEM_INPUT
3342197c7c2SJens Wiklander  *					[| OPTEE_MSG_ATTR_NONCONTIG]
335e43888b8SJens Wiklander  * [in] param[0].u.tmem.buf_ptr		physical address (of first fragment)
336e43888b8SJens Wiklander  * [in] param[0].u.tmem.size		size (of first fragment)
337e43888b8SJens Wiklander  * [in] param[0].u.tmem.shm_ref		holds shared memory reference
338e43888b8SJens Wiklander  *
3390cbde272SJens Wiklander  * OPTEE_MSG_CMD_UNREGISTER_SHM unregisters a previously registered shared
340e43888b8SJens Wiklander  * memory reference. The information is passed as:
341e43888b8SJens Wiklander  * [in] param[0].attr			OPTEE_MSG_ATTR_TYPE_RMEM_INPUT
342e43888b8SJens Wiklander  * [in] param[0].u.rmem.shm_ref		holds shared memory reference
343e43888b8SJens Wiklander  * [in] param[0].u.rmem.offs		0
344e43888b8SJens Wiklander  * [in] param[0].u.rmem.size		0
345c2d44948SJens Wiklander  *
346c2d44948SJens Wiklander  * OPTEE_MSG_CMD_DO_BOTTOM_HALF does the scheduled bottom half processing
347c2d44948SJens Wiklander  * of a driver.
348c2d44948SJens Wiklander  *
349c2d44948SJens Wiklander  * OPTEE_MSG_CMD_STOP_ASYNC_NOTIF informs secure world that from now is
350c2d44948SJens Wiklander  * normal world unable to process asynchronous notifications. Typically
351c2d44948SJens Wiklander  * used when the driver is shut down.
352*3c2e09b3SJens Wiklander  *
353*3c2e09b3SJens Wiklander  * OPTEE_MSG_CMD_LEND_PROTMEM lends protected memory. The passed normal
354*3c2e09b3SJens Wiklander  * physical memory is protected from normal world access. The memory should
355*3c2e09b3SJens Wiklander  * be unmapped prior to this call since it becomes inaccessible during the
356*3c2e09b3SJens Wiklander  * request.
357*3c2e09b3SJens Wiklander  * Parameters are passed as:
358*3c2e09b3SJens Wiklander  * [in] param[0].attr			OPTEE_MSG_ATTR_TYPE_VALUE_INPUT
359*3c2e09b3SJens Wiklander  * [in] param[0].u.value.a		OPTEE_MSG_PROTMEM_* defined above
360*3c2e09b3SJens Wiklander  * [in] param[1].attr			OPTEE_MSG_ATTR_TYPE_TMEM_INPUT
361*3c2e09b3SJens Wiklander  * [in] param[1].u.tmem.buf_ptr		physical address
362*3c2e09b3SJens Wiklander  * [in] param[1].u.tmem.size		size
363*3c2e09b3SJens Wiklander  * [in] param[1].u.tmem.shm_ref		holds protected memory reference
364*3c2e09b3SJens Wiklander  *
365*3c2e09b3SJens Wiklander  * OPTEE_MSG_CMD_RECLAIM_PROTMEM reclaims a previously lent protected
366*3c2e09b3SJens Wiklander  * memory reference. The physical memory is accessible by the normal world
367*3c2e09b3SJens Wiklander  * after this function has return and can be mapped again. The information
368*3c2e09b3SJens Wiklander  * is passed as:
369*3c2e09b3SJens Wiklander  * [in] param[0].attr			OPTEE_MSG_ATTR_TYPE_VALUE_INPUT
370*3c2e09b3SJens Wiklander  * [in] param[0].u.value.a		holds protected memory cookie
371*3c2e09b3SJens Wiklander  *
372*3c2e09b3SJens Wiklander  * OPTEE_MSG_CMD_GET_PROTMEM_CONFIG get configuration for a specific
373*3c2e09b3SJens Wiklander  * protected memory use case. Parameters are passed as:
374*3c2e09b3SJens Wiklander  * [in] param[0].attr			OPTEE_MSG_ATTR_TYPE_VALUE_INOUT
375*3c2e09b3SJens Wiklander  * [in] param[0].value.a		OPTEE_MSG_PROTMEM_*
376*3c2e09b3SJens Wiklander  * [in] param[1].attr			OPTEE_MSG_ATTR_TYPE_{R,F}MEM_OUTPUT
377*3c2e09b3SJens Wiklander  * [in] param[1].u.{r,f}mem		Buffer or NULL
378*3c2e09b3SJens Wiklander  * [in] param[1].u.{r,f}mem.size	Provided size of buffer or 0 for query
379*3c2e09b3SJens Wiklander  * output for the protected use case:
380*3c2e09b3SJens Wiklander  * [out] param[0].value.a		Minimal size of SDP memory
381*3c2e09b3SJens Wiklander  * [out] param[0].value.b		Required alignment of size and start of
382*3c2e09b3SJens Wiklander  *					protected memory
383*3c2e09b3SJens Wiklander  * [out] param[0].value.c		PA width, max 64
384*3c2e09b3SJens Wiklander  * [out] param[1].{r,f}mem.size		Size of output data
385*3c2e09b3SJens Wiklander  * [out] param[1].{r,f}mem		If non-NULL, contains an array of
386*3c2e09b3SJens Wiklander  *					uint32_t holding memory attributes that
387*3c2e09b3SJens Wiklander  *					must be included when lending
388*3c2e09b3SJens Wiklander  *					memory for this use case
389*3c2e09b3SJens Wiklander  *
390*3c2e09b3SJens Wiklander  * OPTEE_MSG_CMD_ASSIGN_PROTMEM assigns use-case to protected memory
391*3c2e09b3SJens Wiklander  * previously lent using the FFA_LEND framework ABI. Parameters are passed
392*3c2e09b3SJens Wiklander  * as:
393*3c2e09b3SJens Wiklander  * [in] param[0].attr			OPTEE_MSG_ATTR_TYPE_VALUE_INPUT
394*3c2e09b3SJens Wiklander  * [in] param[0].u.value.a		holds protected memory cookie
395*3c2e09b3SJens Wiklander  * [in] param[0].u.value.b		OPTEE_MSG_PROTMEM_* defined above
396e43888b8SJens Wiklander  */
39757f197ecSJens Wiklander #define OPTEE_MSG_CMD_OPEN_SESSION		U(0)
39857f197ecSJens Wiklander #define OPTEE_MSG_CMD_INVOKE_COMMAND		U(1)
39957f197ecSJens Wiklander #define OPTEE_MSG_CMD_CLOSE_SESSION		U(2)
40057f197ecSJens Wiklander #define OPTEE_MSG_CMD_CANCEL			U(3)
40157f197ecSJens Wiklander #define OPTEE_MSG_CMD_REGISTER_SHM		U(4)
40257f197ecSJens Wiklander #define OPTEE_MSG_CMD_UNREGISTER_SHM		U(5)
403c2d44948SJens Wiklander #define OPTEE_MSG_CMD_DO_BOTTOM_HALF		U(6)
404c2d44948SJens Wiklander #define OPTEE_MSG_CMD_STOP_ASYNC_NOTIF		U(7)
405*3c2e09b3SJens Wiklander #define OPTEE_MSG_CMD_LEND_PROTMEM		U(8)
406*3c2e09b3SJens Wiklander #define OPTEE_MSG_CMD_RECLAIM_PROTMEM		U(9)
407*3c2e09b3SJens Wiklander #define OPTEE_MSG_CMD_GET_PROTMEM_CONFIG	U(10)
408*3c2e09b3SJens Wiklander #define OPTEE_MSG_CMD_ASSIGN_PROTMEM		U(11)
40957f197ecSJens Wiklander #define OPTEE_MSG_FUNCID_CALL_WITH_ARG		U(0x0004)
410e43888b8SJens Wiklander 
411d50fee03SEtienne Carriere #endif /* __OPTEE_MSG_H */
412