1/* SPDX-License-Identifier: BSD-2-Clause */
2/*
3 * Copyright (c) 2019-2021, 2023 Linaro Limited
4 */
5
6/*
7 * This file is exported by OP-TEE and is kept in sync between secure world
8 * and normal world drivers. We're using ARM FF-A 1.0 specification.
9 */
10
11#ifndef __OPTEE_FFA_H
12#define __OPTEE_FFA_H
13
14#include <linux/arm_ffa.h>
15
16/*
17 * Normal world sends requests with FFA_MSG_SEND_DIRECT_REQ and
18 * responses are returned with FFA_MSG_SEND_DIRECT_RESP for normal
19 * messages.
20 *
21 * All requests with FFA_MSG_SEND_DIRECT_REQ and FFA_MSG_SEND_DIRECT_RESP
22 * are using the AArch32 SMC calling convention with register usage as
23 * defined in FF-A specification:
24 * w0:    Function ID (0x8400006F or 0x84000070)
25 * w1:    Source/Destination IDs
26 * w2:    Reserved (MBZ)
27 * w3-w7: Implementation defined, free to be used below
28 */
29
30#define OPTEE_FFA_VERSION_MAJOR	1
31#define OPTEE_FFA_VERSION_MINOR	0
32
33#define OPTEE_FFA_BLOCKING_CALL(id)	(id)
34#define OPTEE_FFA_YIELDING_CALL_BIT	31
35#define OPTEE_FFA_YIELDING_CALL(id)	((id) | BIT(OPTEE_FFA_YIELDING_CALL_BIT))
36
37/*
38 * Returns the API version implemented, currently follows the FF-A version.
39 * Call register usage:
40 * w3:    Service ID, OPTEE_FFA_GET_API_VERSION
41 * w4-w7: Not used (MBZ)
42 *
43 * Return register usage:
44 * w3:    OPTEE_FFA_VERSION_MAJOR
45 * w4:    OPTEE_FFA_VERSION_MINOR
46 * w5-w7: Not used (MBZ)
47 */
48#define OPTEE_FFA_GET_API_VERSION	OPTEE_FFA_BLOCKING_CALL(0)
49
50/*
51 * Returns the revision of OP-TEE.
52 *
53 * Used by non-secure world to figure out which version of the Trusted OS
54 * is installed. Note that the returned revision is the revision of the
55 * Trusted OS, not of the API.
56 *
57 * Call register usage:
58 * w3:    Service ID, OPTEE_FFA_GET_OS_VERSION
59 * w4-w7: Unused (MBZ)
60 *
61 * Return register usage:
62 * w3:    CFG_OPTEE_REVISION_MAJOR
63 * w4:    CFG_OPTEE_REVISION_MINOR
64 * w5:    TEE_IMPL_GIT_SHA1 (or zero if not supported)
65 */
66#define OPTEE_FFA_GET_OS_VERSION	OPTEE_FFA_BLOCKING_CALL(1)
67
68/*
69 * Exchange capabilities between normal world and secure world.
70 *
71 * Currently there are no defined capabilities. When features are added new
72 * capabilities may be added.
73 *
74 * Call register usage:
75 * w3:    Service ID, OPTEE_FFA_EXCHANGE_CAPABILITIES
76 * w4-w7: Not used (MBZ)
77 *
78 * Return register usage:
79 * w3:    Error code, 0 on success
80 * w4:    Bit[7:0]:  Number of parameters needed for RPC to be supplied
81 *                   as the second MSG arg struct for
82 *                   OPTEE_FFA_YIELDING_CALL_WITH_ARG.
83 *        Bit[31:8]: Reserved (MBZ)
84 * w5:	  Bitfield of secure world capabilities OPTEE_FFA_SEC_CAP_* below,
85 * w6:	  The maximum secure world notification number
86 * w7:	  Not used (MBZ)
87 */
88/*
89 * Secure world supports giving an offset into the argument shared memory
90 * object, see also OPTEE_FFA_YIELDING_CALL_WITH_ARG
91 */
92#define OPTEE_FFA_SEC_CAP_ARG_OFFSET	BIT(0)
93/* OP-TEE supports asynchronous notification via FF-A */
94#define OPTEE_FFA_SEC_CAP_ASYNC_NOTIF	BIT(1)
95
96#define OPTEE_FFA_EXCHANGE_CAPABILITIES OPTEE_FFA_BLOCKING_CALL(2)
97
98/*
99 * Unregister shared memory
100 *
101 * Call register usage:
102 * w3:    Service ID, OPTEE_FFA_YIELDING_CALL_UNREGISTER_SHM
103 * w4:    Shared memory handle, lower bits
104 * w5:    Shared memory handle, higher bits
105 * w6-w7: Not used (MBZ)
106 *
107 * Return register usage:
108 * w3:    Error code, 0 on success
109 * w4-w7: Note used (MBZ)
110 */
111#define OPTEE_FFA_UNREGISTER_SHM	OPTEE_FFA_BLOCKING_CALL(3)
112
113/*
114 * Inform OP-TEE that the normal world is able to receive asynchronous
115 * notifications.
116 *
117 * Call register usage:
118 * w3:    Service ID, OPTEE_FFA_ENABLE_ASYNC_NOTIF
119 * w4:	  Notification value to request bottom half processing, should be
120 *	  less than OPTEE_FFA_MAX_ASYNC_NOTIF_VALUE.
121 * w5-w7: Not used (MBZ)
122 *
123 * Return register usage:
124 * w3:    Error code, 0 on success
125 * w4-w7: Note used (MBZ)
126 */
127#define OPTEE_FFA_ENABLE_ASYNC_NOTIF	OPTEE_FFA_BLOCKING_CALL(5)
128
129#define OPTEE_FFA_MAX_ASYNC_NOTIF_VALUE 64
130
131/*
132 * Call with struct optee_msg_arg as argument in the supplied shared memory
133 * with a zero internal offset and normal cached memory attributes.
134 * Register usage:
135 * w3:    Service ID, OPTEE_FFA_YIELDING_CALL_WITH_ARG
136 * w4:    Lower 32 bits of a 64-bit Shared memory handle
137 * w5:    Upper 32 bits of a 64-bit Shared memory handle
138 * w6:    Offset into shared memory pointing to a struct optee_msg_arg
139 *	  right after the parameters of this struct (at offset
140 *	  OPTEE_MSG_GET_ARG_SIZE(num_params) follows a struct optee_msg_arg
141 *	  for RPC, this struct has reserved space for the number of RPC
142 *	  parameters as returned by OPTEE_FFA_EXCHANGE_CAPABILITIES.
143 *	  MBZ unless the bit OPTEE_FFA_SEC_CAP_ARG_OFFSET is received with
144 *	  OPTEE_FFA_EXCHANGE_CAPABILITIES.
145 * w7:    Not used (MBZ)
146 * Resume from RPC. Register usage:
147 * w3:    Service ID, OPTEE_FFA_YIELDING_CALL_RESUME
148 * w4-w6: Not used (MBZ)
149 * w7:    Resume info
150 *
151 * Normal return (yielding call is completed). Register usage:
152 * w3:    Error code, 0 on success
153 * w4:    OPTEE_FFA_YIELDING_CALL_RETURN_DONE
154 * w5-w7: Not used (MBZ)
155 *
156 * RPC interrupt return (RPC from secure world). Register usage:
157 * w3:    Error code == 0
158 * w4:    Any defined RPC code but OPTEE_FFA_YIELDING_CALL_RETURN_DONE
159 * w5-w6: Not used (MBZ)
160 * w7:    Resume info
161 *
162 * Possible error codes in register w3:
163 * 0:                       Success
164 * FFA_DENIED:              w4 isn't one of OPTEE_FFA_YIELDING_CALL_START
165 *                          OPTEE_FFA_YIELDING_CALL_RESUME
166 *
167 * Possible error codes for OPTEE_FFA_YIELDING_CALL_START,
168 * FFA_BUSY:               Number of OP-TEE OS threads exceeded,
169 *                         try again later
170 * FFA_DENIED:             RPC shared memory object not found
171 * FFA_INVALID_PARAMETER:  Bad shared memory handle or offset into the memory
172 *
173 * Possible error codes for OPTEE_FFA_YIELDING_CALL_RESUME
174 * FFA_INVALID_PARAMETER:  Bad resume info
175 */
176#define OPTEE_FFA_YIELDING_CALL_WITH_ARG	OPTEE_FFA_YIELDING_CALL(0)
177#define OPTEE_FFA_YIELDING_CALL_RESUME		OPTEE_FFA_YIELDING_CALL(1)
178
179#define OPTEE_FFA_YIELDING_CALL_RETURN_DONE		0
180#define OPTEE_FFA_YIELDING_CALL_RETURN_RPC_CMD		1
181#define OPTEE_FFA_YIELDING_CALL_RETURN_INTERRUPT	2
182
183#endif /*__OPTEE_FFA_H*/
184