Commit | Line | Data |
---|---|---|
4615e5a3 JW |
1 | /* SPDX-License-Identifier: BSD-2-Clause */ |
2 | /* | |
3 | * Copyright (c) 2019-2021, 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: Note 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) | |
a639b2b1 JW |
84 | * w5: Bitfield of secure world capabilities OPTEE_FFA_SEC_CAP_* below, |
85 | * unused bits MBZ. | |
86 | * w6-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 | |
4615e5a3 | 91 | */ |
a639b2b1 JW |
92 | #define OPTEE_FFA_SEC_CAP_ARG_OFFSET BIT(0) |
93 | ||
4615e5a3 JW |
94 | #define OPTEE_FFA_EXCHANGE_CAPABILITIES OPTEE_FFA_BLOCKING_CALL(2) |
95 | ||
96 | /* | |
97 | * Unregister shared memory | |
98 | * | |
99 | * Call register usage: | |
100 | * w3: Service ID, OPTEE_FFA_YIELDING_CALL_UNREGISTER_SHM | |
101 | * w4: Shared memory handle, lower bits | |
102 | * w5: Shared memory handle, higher bits | |
103 | * w6-w7: Not used (MBZ) | |
104 | * | |
105 | * Return register usage: | |
106 | * w3: Error code, 0 on success | |
107 | * w4-w7: Note used (MBZ) | |
108 | */ | |
109 | #define OPTEE_FFA_UNREGISTER_SHM OPTEE_FFA_BLOCKING_CALL(3) | |
110 | ||
111 | /* | |
112 | * Call with struct optee_msg_arg as argument in the supplied shared memory | |
113 | * with a zero internal offset and normal cached memory attributes. | |
114 | * Register usage: | |
115 | * w3: Service ID, OPTEE_FFA_YIELDING_CALL_WITH_ARG | |
116 | * w4: Lower 32 bits of a 64-bit Shared memory handle | |
117 | * w5: Upper 32 bits of a 64-bit Shared memory handle | |
118 | * w6: Offset into shared memory pointing to a struct optee_msg_arg | |
119 | * right after the parameters of this struct (at offset | |
120 | * OPTEE_MSG_GET_ARG_SIZE(num_params) follows a struct optee_msg_arg | |
121 | * for RPC, this struct has reserved space for the number of RPC | |
122 | * parameters as returned by OPTEE_FFA_EXCHANGE_CAPABILITIES. | |
a639b2b1 JW |
123 | * MBZ unless the bit OPTEE_FFA_SEC_CAP_ARG_OFFSET is received with |
124 | * OPTEE_FFA_EXCHANGE_CAPABILITIES. | |
4615e5a3 JW |
125 | * w7: Not used (MBZ) |
126 | * Resume from RPC. Register usage: | |
127 | * w3: Service ID, OPTEE_FFA_YIELDING_CALL_RESUME | |
128 | * w4-w6: Not used (MBZ) | |
129 | * w7: Resume info | |
130 | * | |
131 | * Normal return (yielding call is completed). Register usage: | |
132 | * w3: Error code, 0 on success | |
133 | * w4: OPTEE_FFA_YIELDING_CALL_RETURN_DONE | |
134 | * w5-w7: Not used (MBZ) | |
135 | * | |
136 | * RPC interrupt return (RPC from secure world). Register usage: | |
137 | * w3: Error code == 0 | |
138 | * w4: Any defined RPC code but OPTEE_FFA_YIELDING_CALL_RETURN_DONE | |
139 | * w5-w6: Not used (MBZ) | |
140 | * w7: Resume info | |
141 | * | |
142 | * Possible error codes in register w3: | |
143 | * 0: Success | |
144 | * FFA_DENIED: w4 isn't one of OPTEE_FFA_YIELDING_CALL_START | |
145 | * OPTEE_FFA_YIELDING_CALL_RESUME | |
146 | * | |
147 | * Possible error codes for OPTEE_FFA_YIELDING_CALL_START, | |
148 | * FFA_BUSY: Number of OP-TEE OS threads exceeded, | |
149 | * try again later | |
150 | * FFA_DENIED: RPC shared memory object not found | |
151 | * FFA_INVALID_PARAMETER: Bad shared memory handle or offset into the memory | |
152 | * | |
153 | * Possible error codes for OPTEE_FFA_YIELDING_CALL_RESUME | |
154 | * FFA_INVALID_PARAMETER: Bad resume info | |
155 | */ | |
156 | #define OPTEE_FFA_YIELDING_CALL_WITH_ARG OPTEE_FFA_YIELDING_CALL(0) | |
157 | #define OPTEE_FFA_YIELDING_CALL_RESUME OPTEE_FFA_YIELDING_CALL(1) | |
158 | ||
159 | #define OPTEE_FFA_YIELDING_CALL_RETURN_DONE 0 | |
160 | #define OPTEE_FFA_YIELDING_CALL_RETURN_RPC_CMD 1 | |
161 | #define OPTEE_FFA_YIELDING_CALL_RETURN_INTERRUPT 2 | |
162 | ||
163 | #endif /*__OPTEE_FFA_H*/ |