xref: /optee_os/core/arch/arm/include/optee_ffa.h (revision 3c2e09b3ea5528a679a4f0532d844c4352937629)
1c13d4bd7SJens Wiklander /* SPDX-License-Identifier: BSD-2-Clause */
2c13d4bd7SJens Wiklander /*
3*3c2e09b3SJens Wiklander  * Copyright (c) 2019-2025, Linaro Limited
4c13d4bd7SJens Wiklander  */
5c13d4bd7SJens Wiklander 
6c13d4bd7SJens Wiklander /*
7c13d4bd7SJens Wiklander  * This file is exported by OP-TEE and is kept in sync between secure world
8c1bdf4fcSJens Wiklander  * and normal world drivers. We're using ARM FF-A 1.0 specification.
9c13d4bd7SJens Wiklander  */
10c13d4bd7SJens Wiklander 
11c13d4bd7SJens Wiklander #ifndef __OPTEE_FFA_H
12c13d4bd7SJens Wiklander #define __OPTEE_FFA_H
13c13d4bd7SJens Wiklander 
14c13d4bd7SJens Wiklander #include <ffa.h>
15c13d4bd7SJens Wiklander 
16c13d4bd7SJens Wiklander /*
17c13d4bd7SJens Wiklander  * Normal world sends requests with FFA_MSG_SEND_DIRECT_REQ and
18c13d4bd7SJens Wiklander  * responses are returned with FFA_MSG_SEND_DIRECT_RESP for normal
19c13d4bd7SJens Wiklander  * messages.
20c13d4bd7SJens Wiklander  *
21c13d4bd7SJens Wiklander  * All requests with FFA_MSG_SEND_DIRECT_REQ and FFA_MSG_SEND_DIRECT_RESP
22c13d4bd7SJens Wiklander  * are using the AArch32 SMC calling convention with register usage as
23c13d4bd7SJens Wiklander  * defined in FF-A specification:
24c13d4bd7SJens Wiklander  * w0:    Function ID (0x8400006F or 0x84000070)
25c13d4bd7SJens Wiklander  * w1:    Source/Destination IDs
26c13d4bd7SJens Wiklander  * w2:    Reserved (MBZ)
27c13d4bd7SJens Wiklander  * w3-w7: Implementation defined, free to be used below
28c13d4bd7SJens Wiklander  */
29c13d4bd7SJens Wiklander 
30c1bdf4fcSJens Wiklander #define OPTEE_FFA_VERSION_MAJOR	UINT32_C(1)
31c1bdf4fcSJens Wiklander #define OPTEE_FFA_VERSION_MINOR	UINT32_C(0)
32c13d4bd7SJens Wiklander 
33c13d4bd7SJens Wiklander #define OPTEE_FFA_BLOCKING_CALL(id)	UINT32_C(id)
344a6784caSJens Wiklander #define OPTEE_FFA_YIELDING_CALL_BIT	U(31)
35c13d4bd7SJens Wiklander #define OPTEE_FFA_YIELDING_CALL(id)	(UINT32_C(id) | \
36c13d4bd7SJens Wiklander 					 BIT32(OPTEE_FFA_YIELDING_CALL_BIT))
37c13d4bd7SJens Wiklander 
38c13d4bd7SJens Wiklander /*
39c13d4bd7SJens Wiklander  * Returns the API version implemented, currently follows the FF-A version.
40c13d4bd7SJens Wiklander  * Call register usage:
41c13d4bd7SJens Wiklander  * w3:    Service ID, OPTEE_FFA_GET_API_VERSION
42c13d4bd7SJens Wiklander  * w4-w7: Not used (MBZ)
43c13d4bd7SJens Wiklander  *
44c13d4bd7SJens Wiklander  * Return register usage:
45c13d4bd7SJens Wiklander  * w3:    OPTEE_FFA_VERSION_MAJOR
46c13d4bd7SJens Wiklander  * w4:    OPTEE_FFA_VERSION_MINOR
47c13d4bd7SJens Wiklander  * w5-w7: Not used (MBZ)
48c13d4bd7SJens Wiklander  */
49c13d4bd7SJens Wiklander #define OPTEE_FFA_GET_API_VERSION	OPTEE_FFA_BLOCKING_CALL(0)
50c13d4bd7SJens Wiklander 
51c13d4bd7SJens Wiklander /*
52c13d4bd7SJens Wiklander  * Returns the revision of OP-TEE.
53c13d4bd7SJens Wiklander  *
54c13d4bd7SJens Wiklander  * Used by non-secure world to figure out which version of the Trusted OS
55c13d4bd7SJens Wiklander  * is installed. Note that the returned revision is the revision of the
56c13d4bd7SJens Wiklander  * Trusted OS, not of the API.
57c13d4bd7SJens Wiklander  *
58c13d4bd7SJens Wiklander  * Call register usage:
59c13d4bd7SJens Wiklander  * w3:    Service ID, OPTEE_FFA_GET_OS_VERSION
60c13d4bd7SJens Wiklander  * w4-w7: Unused (MBZ)
61c13d4bd7SJens Wiklander  *
62c13d4bd7SJens Wiklander  * Return register usage:
63c13d4bd7SJens Wiklander  * w3:    CFG_OPTEE_REVISION_MAJOR
64c13d4bd7SJens Wiklander  * w4:    CFG_OPTEE_REVISION_MINOR
65c13d4bd7SJens Wiklander  * w5:    TEE_IMPL_GIT_SHA1 (or zero if not supported)
66c13d4bd7SJens Wiklander  */
67c13d4bd7SJens Wiklander #define OPTEE_FFA_GET_OS_VERSION	OPTEE_FFA_BLOCKING_CALL(1)
68c13d4bd7SJens Wiklander 
69c13d4bd7SJens Wiklander /*
70c13d4bd7SJens Wiklander  * Exchange capabilities between normal world and secure world.
71c13d4bd7SJens Wiklander  *
72c13d4bd7SJens Wiklander  * Currently there are no defined capabilities. When features are added new
73c13d4bd7SJens Wiklander  * capabilities may be added.
74c13d4bd7SJens Wiklander  *
75c13d4bd7SJens Wiklander  * Call register usage:
76c13d4bd7SJens Wiklander  * w3:    Service ID, OPTEE_FFA_EXCHANGE_CAPABILITIES
772e02a737SJens Wiklander  * w4-w7: Not used (MBZ)
78c13d4bd7SJens Wiklander  *
79c13d4bd7SJens Wiklander  * Return register usage:
80c13d4bd7SJens Wiklander  * w3:    Error code, 0 on success
81c1bdf4fcSJens Wiklander  * w4:    Bit[7:0]:  Number of parameters needed for RPC to be supplied
82c1bdf4fcSJens Wiklander  *                   as the second MSG arg struct for
83c1bdf4fcSJens Wiklander  *                   OPTEE_FFA_YIELDING_CALL_WITH_ARG.
84c1bdf4fcSJens Wiklander  *        Bit[31:8]: Reserved (MBZ)
852e02a737SJens Wiklander  * w5:	  Bitfield of OP-TEE capabilities OPTEE_FFA_SEC_CAP_*
862e02a737SJens Wiklander  * w6:	  The maximum secure world notification number
872e02a737SJens Wiklander  * w7:	  Not used (MBZ)
88c13d4bd7SJens Wiklander  */
8989d99135SJens Wiklander /*
900cbde272SJens Wiklander  * Secure world supports giving an offset into the argument shared memory
9189d99135SJens Wiklander  * object, see also OPTEE_FFA_YIELDING_CALL_WITH_ARG
9289d99135SJens Wiklander  */
9389d99135SJens Wiklander #define OPTEE_FFA_SEC_CAP_ARG_OFFSET	BIT(0)
942e02a737SJens Wiklander /* OP-TEE supports asynchronous notification via FF-A */
952e02a737SJens Wiklander #define OPTEE_FFA_SEC_CAP_ASYNC_NOTIF	BIT(1)
968dfdf392SJens Wiklander /* OP-TEE supports probing for RPMB device if needed */
978dfdf392SJens Wiklander #define OPTEE_FFA_SEC_CAP_RPMB_PROBE	BIT(2)
98*3c2e09b3SJens Wiklander /* OP-TEE supports Protected Memory for secure data path */
99*3c2e09b3SJens Wiklander #define OPTEE_FFA_SEC_CAP_PROTMEM	BIT(3)
10089d99135SJens Wiklander 
101c13d4bd7SJens Wiklander #define OPTEE_FFA_EXCHANGE_CAPABILITIES OPTEE_FFA_BLOCKING_CALL(2)
102c13d4bd7SJens Wiklander 
103c13d4bd7SJens Wiklander /*
104c1bdf4fcSJens Wiklander  * Unregister shared memory
105c1bdf4fcSJens Wiklander  *
106c1bdf4fcSJens Wiklander  * Call register usage:
107c1bdf4fcSJens Wiklander  * w3:    Service ID, OPTEE_FFA_YIELDING_CALL_UNREGISTER_SHM
108c1bdf4fcSJens Wiklander  * w4:    Shared memory handle, lower bits
109c1bdf4fcSJens Wiklander  * w5:    Shared memory handle, higher bits
110c1bdf4fcSJens Wiklander  * w6-w7: Not used (MBZ)
111c1bdf4fcSJens Wiklander  *
112c1bdf4fcSJens Wiklander  * Return register usage:
113c1bdf4fcSJens Wiklander  * w3:    Error code, 0 on success
114d2d2912dSJens Wiklander  * w4-w7: Not used (MBZ)
115c1bdf4fcSJens Wiklander  */
116c1bdf4fcSJens Wiklander #define OPTEE_FFA_UNREGISTER_SHM	OPTEE_FFA_BLOCKING_CALL(3)
117c1bdf4fcSJens Wiklander 
118c1bdf4fcSJens Wiklander /*
1190cbde272SJens Wiklander  * Inform OP-TEE that the normal world is able to receive asynchronous
1202e02a737SJens Wiklander  * notifications.
1212e02a737SJens Wiklander  *
1222e02a737SJens Wiklander  * Call register usage:
1232e02a737SJens Wiklander  * w3:    Service ID, OPTEE_FFA_ENABLE_ASYNC_NOTIF
12455cd94d1SJens Wiklander  * w4:	  Notification value to request bottom half processing, should be
12555cd94d1SJens Wiklander  *	  less than OPTEE_FFA_MAX_ASYNC_NOTIF_VALUE
1262e02a737SJens Wiklander  * w5-w7: Not used (MBZ)
1272e02a737SJens Wiklander  *
1282e02a737SJens Wiklander  * Return register usage:
1292e02a737SJens Wiklander  * w3:    Error code, 0 on success
1302e02a737SJens Wiklander  * w4-w7: Not used (MBZ)
1312e02a737SJens Wiklander  */
1322e02a737SJens Wiklander #define OPTEE_FFA_ENABLE_ASYNC_NOTIF	OPTEE_FFA_BLOCKING_CALL(5)
1332e02a737SJens Wiklander 
13455cd94d1SJens Wiklander #define OPTEE_FFA_MAX_ASYNC_NOTIF_VALUE	64
13555cd94d1SJens Wiklander 
1362e02a737SJens Wiklander /*
137*3c2e09b3SJens Wiklander  * Release Protected memory
138*3c2e09b3SJens Wiklander  *
139*3c2e09b3SJens Wiklander  * Call register usage:
140*3c2e09b3SJens Wiklander  * w3:    Service ID, OPTEE_FFA_RECLAIM_PROTMEM
141*3c2e09b3SJens Wiklander  * w4:    Shared memory handle, lower bits
142*3c2e09b3SJens Wiklander  * w5:    Shared memory handle, higher bits
143*3c2e09b3SJens Wiklander  * w6-w7: Not used (MBZ)
144*3c2e09b3SJens Wiklander  *
145*3c2e09b3SJens Wiklander  * Return register usage:
146*3c2e09b3SJens Wiklander  * w3:    Error code, 0 on success
147*3c2e09b3SJens Wiklander  * w4-w7: Note used (MBZ)
148*3c2e09b3SJens Wiklander  */
149*3c2e09b3SJens Wiklander #define OPTEE_FFA_RELEASE_PROTMEM	OPTEE_FFA_BLOCKING_CALL(8)
150*3c2e09b3SJens Wiklander 
151*3c2e09b3SJens Wiklander /*
152c13d4bd7SJens Wiklander  * Call with struct optee_msg_arg as argument in the supplied shared memory
153c13d4bd7SJens Wiklander  * with a zero internal offset and normal cached memory attributes.
154c13d4bd7SJens Wiklander  * Register usage:
155c13d4bd7SJens Wiklander  * w3:    Service ID, OPTEE_FFA_YIELDING_CALL_WITH_ARG
156c13d4bd7SJens Wiklander  * w4:    Lower 32 bits of a 64-bit Shared memory handle
157c13d4bd7SJens Wiklander  * w5:    Upper 32 bits of a 64-bit Shared memory handle
158c13d4bd7SJens Wiklander  * w6:    Offset into shared memory pointing to a struct optee_msg_arg
159c1bdf4fcSJens Wiklander  *	  right after the parameters of this struct (at offset
160c1bdf4fcSJens Wiklander  *	  OPTEE_MSG_GET_ARG_SIZE(num_params) follows a struct optee_msg_arg
161c1bdf4fcSJens Wiklander  *	  for RPC, this struct has reserved space for the number of RPC
162c1bdf4fcSJens Wiklander  *	  parameters as returned by OPTEE_FFA_EXCHANGE_CAPABILITIES.
16389d99135SJens Wiklander  *	  MBZ unless the bit OPTEE_FFA_SEC_CAP_ARG_OFFSET is received with
16489d99135SJens Wiklander  *	  OPTEE_FFA_EXCHANGE_CAPABILITIES.
165c13d4bd7SJens Wiklander  * w7:    Not used (MBZ)
166c13d4bd7SJens Wiklander  * Resume from RPC. Register usage:
167c13d4bd7SJens Wiklander  * w3:    Service ID, OPTEE_FFA_YIELDING_CALL_RESUME
168c13d4bd7SJens Wiklander  * w4-w6: Not used (MBZ)
169c13d4bd7SJens Wiklander  * w7:    Resume info
170c13d4bd7SJens Wiklander  *
171c13d4bd7SJens Wiklander  * Normal return (yielding call is completed). Register usage:
172c13d4bd7SJens Wiklander  * w3:    Error code, 0 on success
173c13d4bd7SJens Wiklander  * w4:    OPTEE_FFA_YIELDING_CALL_RETURN_DONE
174c13d4bd7SJens Wiklander  * w5-w7: Not used (MBZ)
175c13d4bd7SJens Wiklander  *
176c13d4bd7SJens Wiklander  * RPC interrupt return (RPC from secure world). Register usage:
177c13d4bd7SJens Wiklander  * w3:    Error code == 0
178c1bdf4fcSJens Wiklander  * w4:    Any defined RPC code but OPTEE_FFA_YIELDING_CALL_RETURN_DONE
179c13d4bd7SJens Wiklander  * w5-w6: Not used (MBZ)
180c13d4bd7SJens Wiklander  * w7:    Resume info
181c13d4bd7SJens Wiklander  *
182c13d4bd7SJens Wiklander  * Possible error codes in register w3:
183c13d4bd7SJens Wiklander  * 0:                       Success
184c13d4bd7SJens Wiklander  * FFA_DENIED:              w4 isn't one of OPTEE_FFA_YIELDING_CALL_START
185c13d4bd7SJens Wiklander  *                          OPTEE_FFA_YIELDING_CALL_RESUME
186c13d4bd7SJens Wiklander  *
187c13d4bd7SJens Wiklander  * Possible error codes for OPTEE_FFA_YIELDING_CALL_START,
188c13d4bd7SJens Wiklander  * FFA_BUSY:               Number of OP-TEE OS threads exceeded,
189c13d4bd7SJens Wiklander  *                         try again later
190c13d4bd7SJens Wiklander  * FFA_DENIED:             RPC shared memory object not found
191c13d4bd7SJens Wiklander  * FFA_INVALID_PARAMETER:  Bad shared memory handle or offset into the memory
192c13d4bd7SJens Wiklander  *
193c13d4bd7SJens Wiklander  * Possible error codes for OPTEE_FFA_YIELDING_CALL_RESUME
194c13d4bd7SJens Wiklander  * FFA_INVALID_PARAMETER:  Bad resume info
195c13d4bd7SJens Wiklander  */
196c13d4bd7SJens Wiklander #define OPTEE_FFA_YIELDING_CALL_WITH_ARG	OPTEE_FFA_YIELDING_CALL(0)
197c1bdf4fcSJens Wiklander #define OPTEE_FFA_YIELDING_CALL_RESUME		OPTEE_FFA_YIELDING_CALL(1)
198c13d4bd7SJens Wiklander 
1994a6784caSJens Wiklander #define OPTEE_FFA_YIELDING_CALL_RETURN_DONE		U(0)
2004a6784caSJens Wiklander #define OPTEE_FFA_YIELDING_CALL_RETURN_RPC_CMD		U(1)
2014a6784caSJens Wiklander #define OPTEE_FFA_YIELDING_CALL_RETURN_INTERRUPT	U(2)
202c13d4bd7SJens Wiklander 
203c13d4bd7SJens Wiklander #endif /*__OPTEE_FFA_H*/
204