1 /* SPDX-License-Identifier: BSD-2-Clause */
3 * Copyright (c) 2019-2021, Linaro Limited
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.
14 #include <linux/arm_ffa.h>
17 * Normal world sends requests with FFA_MSG_SEND_DIRECT_REQ and
18 * responses are returned with FFA_MSG_SEND_DIRECT_RESP for normal
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
27 * w3-w7: Implementation defined, free to be used below
30 #define OPTEE_FFA_VERSION_MAJOR 1
31 #define OPTEE_FFA_VERSION_MINOR 0
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))
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)
43 * Return register usage:
44 * w3: OPTEE_FFA_VERSION_MAJOR
45 * w4: OPTEE_FFA_VERSION_MINOR
46 * w5-w7: Not used (MBZ)
48 #define OPTEE_FFA_GET_API_VERSION OPTEE_FFA_BLOCKING_CALL(0)
51 * Returns the revision of OP-TEE.
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.
57 * Call register usage:
58 * w3: Service ID, OPTEE_FFA_GET_OS_VERSION
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)
66 #define OPTEE_FFA_GET_OS_VERSION OPTEE_FFA_BLOCKING_CALL(1)
69 * Exchange capabilities between normal world and secure world.
71 * Currently there are no defined capabilities. When features are added new
72 * capabilities may be added.
74 * Call register usage:
75 * w3: Service ID, OPTEE_FFA_EXCHANGE_CAPABILITIES
76 * w4-w7: Note used (MBZ)
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-w7: Note used (MBZ)
86 #define OPTEE_FFA_EXCHANGE_CAPABILITIES OPTEE_FFA_BLOCKING_CALL(2)
89 * Unregister shared memory
91 * Call register usage:
92 * w3: Service ID, OPTEE_FFA_YIELDING_CALL_UNREGISTER_SHM
93 * w4: Shared memory handle, lower bits
94 * w5: Shared memory handle, higher bits
95 * w6-w7: Not used (MBZ)
97 * Return register usage:
98 * w3: Error code, 0 on success
99 * w4-w7: Note used (MBZ)
101 #define OPTEE_FFA_UNREGISTER_SHM OPTEE_FFA_BLOCKING_CALL(3)
104 * Call with struct optee_msg_arg as argument in the supplied shared memory
105 * with a zero internal offset and normal cached memory attributes.
107 * w3: Service ID, OPTEE_FFA_YIELDING_CALL_WITH_ARG
108 * w4: Lower 32 bits of a 64-bit Shared memory handle
109 * w5: Upper 32 bits of a 64-bit Shared memory handle
110 * w6: Offset into shared memory pointing to a struct optee_msg_arg
111 * right after the parameters of this struct (at offset
112 * OPTEE_MSG_GET_ARG_SIZE(num_params) follows a struct optee_msg_arg
113 * for RPC, this struct has reserved space for the number of RPC
114 * parameters as returned by OPTEE_FFA_EXCHANGE_CAPABILITIES.
116 * Resume from RPC. Register usage:
117 * w3: Service ID, OPTEE_FFA_YIELDING_CALL_RESUME
118 * w4-w6: Not used (MBZ)
121 * Normal return (yielding call is completed). Register usage:
122 * w3: Error code, 0 on success
123 * w4: OPTEE_FFA_YIELDING_CALL_RETURN_DONE
124 * w5-w7: Not used (MBZ)
126 * RPC interrupt return (RPC from secure world). Register usage:
127 * w3: Error code == 0
128 * w4: Any defined RPC code but OPTEE_FFA_YIELDING_CALL_RETURN_DONE
129 * w5-w6: Not used (MBZ)
132 * Possible error codes in register w3:
134 * FFA_DENIED: w4 isn't one of OPTEE_FFA_YIELDING_CALL_START
135 * OPTEE_FFA_YIELDING_CALL_RESUME
137 * Possible error codes for OPTEE_FFA_YIELDING_CALL_START,
138 * FFA_BUSY: Number of OP-TEE OS threads exceeded,
140 * FFA_DENIED: RPC shared memory object not found
141 * FFA_INVALID_PARAMETER: Bad shared memory handle or offset into the memory
143 * Possible error codes for OPTEE_FFA_YIELDING_CALL_RESUME
144 * FFA_INVALID_PARAMETER: Bad resume info
146 #define OPTEE_FFA_YIELDING_CALL_WITH_ARG OPTEE_FFA_YIELDING_CALL(0)
147 #define OPTEE_FFA_YIELDING_CALL_RESUME OPTEE_FFA_YIELDING_CALL(1)
149 #define OPTEE_FFA_YIELDING_CALL_RETURN_DONE 0
150 #define OPTEE_FFA_YIELDING_CALL_RETURN_RPC_CMD 1
151 #define OPTEE_FFA_YIELDING_CALL_RETURN_INTERRUPT 2
153 #endif /*__OPTEE_FFA_H*/