xref: /linux/drivers/tee/qcomtee/qcomtee_msg.h (revision 38057e323657695ec8f814aff0cdd1c7e00d3e9b)
1*d6e29083SAmirreza Zarrabi /* SPDX-License-Identifier: GPL-2.0-only */
2*d6e29083SAmirreza Zarrabi /*
3*d6e29083SAmirreza Zarrabi  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
4*d6e29083SAmirreza Zarrabi  */
5*d6e29083SAmirreza Zarrabi 
6*d6e29083SAmirreza Zarrabi #ifndef QCOMTEE_MSG_H
7*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_H
8*d6e29083SAmirreza Zarrabi 
9*d6e29083SAmirreza Zarrabi #include <linux/bitfield.h>
10*d6e29083SAmirreza Zarrabi 
11*d6e29083SAmirreza Zarrabi /**
12*d6e29083SAmirreza Zarrabi  * DOC: ''Qualcomm TEE'' (QTEE) Transport Message
13*d6e29083SAmirreza Zarrabi  *
14*d6e29083SAmirreza Zarrabi  * There are two buffers shared with QTEE: inbound and outbound buffers.
15*d6e29083SAmirreza Zarrabi  * The inbound buffer is used for direct object invocation, and the outbound
16*d6e29083SAmirreza Zarrabi  * buffer is used to make a request from QTEE to the kernel; i.e., a callback
17*d6e29083SAmirreza Zarrabi  * request.
18*d6e29083SAmirreza Zarrabi  *
19*d6e29083SAmirreza Zarrabi  * The unused tail of the outbound buffer is also used for sending and
20*d6e29083SAmirreza Zarrabi  * receiving asynchronous messages. An asynchronous message is independent of
21*d6e29083SAmirreza Zarrabi  * the current object invocation (i.e., contents of the inbound buffer) or
22*d6e29083SAmirreza Zarrabi  * callback request (i.e., the head of the outbound buffer); see
23*d6e29083SAmirreza Zarrabi  * qcomtee_get_async_buffer(). It is used by endpoints (QTEE or kernel) as an
24*d6e29083SAmirreza Zarrabi  * optimization to reduce the number of context switches between the secure and
25*d6e29083SAmirreza Zarrabi  * non-secure worlds.
26*d6e29083SAmirreza Zarrabi  *
27*d6e29083SAmirreza Zarrabi  * For instance, QTEE never sends an explicit callback request to release an
28*d6e29083SAmirreza Zarrabi  * object in the kernel. Instead, it sends asynchronous release messages in the
29*d6e29083SAmirreza Zarrabi  * outbound buffer when QTEE returns from the previous direct object invocation,
30*d6e29083SAmirreza Zarrabi  * or appends asynchronous release messages after the current callback request.
31*d6e29083SAmirreza Zarrabi  *
32*d6e29083SAmirreza Zarrabi  * QTEE supports two types of arguments in a message: buffer and object
33*d6e29083SAmirreza Zarrabi  * arguments. Depending on the direction of data flow, they could be input
34*d6e29083SAmirreza Zarrabi  * buffer (IO) to QTEE, output buffer (OB) from QTEE, input object (IO) to QTEE,
35*d6e29083SAmirreza Zarrabi  * or output object (OO) from QTEE. Object arguments hold object IDs. Buffer
36*d6e29083SAmirreza Zarrabi  * arguments hold (offset, size) pairs into the inbound or outbound buffers.
37*d6e29083SAmirreza Zarrabi  *
38*d6e29083SAmirreza Zarrabi  * QTEE holds an object table for objects it hosts and exposes to the kernel.
39*d6e29083SAmirreza Zarrabi  * An object ID is an index to the object table in QTEE.
40*d6e29083SAmirreza Zarrabi  *
41*d6e29083SAmirreza Zarrabi  * For the direct object invocation message format in the inbound buffer, see
42*d6e29083SAmirreza Zarrabi  * &struct qcomtee_msg_object_invoke. For the callback request message format
43*d6e29083SAmirreza Zarrabi  * in the outbound buffer, see &struct qcomtee_msg_callback. For the message
44*d6e29083SAmirreza Zarrabi  * format for asynchronous messages in the outbound buffer, see
45*d6e29083SAmirreza Zarrabi  * &struct qcomtee_async_msg_hdr.
46*d6e29083SAmirreza Zarrabi  */
47*d6e29083SAmirreza Zarrabi 
48*d6e29083SAmirreza Zarrabi /**
49*d6e29083SAmirreza Zarrabi  * define QCOMTEE_MSG_OBJECT_NS_BIT - Non-secure bit
50*d6e29083SAmirreza Zarrabi  *
51*d6e29083SAmirreza Zarrabi  * Object ID is a globally unique 32-bit number. IDs referencing objects
52*d6e29083SAmirreza Zarrabi  * in the kernel should have %QCOMTEE_MSG_OBJECT_NS_BIT set.
53*d6e29083SAmirreza Zarrabi  */
54*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_OBJECT_NS_BIT BIT(31)
55*d6e29083SAmirreza Zarrabi 
56*d6e29083SAmirreza Zarrabi /* Static object IDs recognized by QTEE. */
57*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_OBJECT_NULL (0U)
58*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_OBJECT_ROOT (1U)
59*d6e29083SAmirreza Zarrabi 
60*d6e29083SAmirreza Zarrabi /* Definitions from QTEE as part of the transport protocol. */
61*d6e29083SAmirreza Zarrabi 
62*d6e29083SAmirreza Zarrabi /* qcomtee_msg_arg is an argument as recognized by QTEE. */
63*d6e29083SAmirreza Zarrabi union qcomtee_msg_arg {
64*d6e29083SAmirreza Zarrabi 	struct {
65*d6e29083SAmirreza Zarrabi 		u32 offset;
66*d6e29083SAmirreza Zarrabi 		u32 size;
67*d6e29083SAmirreza Zarrabi 	} b;
68*d6e29083SAmirreza Zarrabi 	u32 o;
69*d6e29083SAmirreza Zarrabi };
70*d6e29083SAmirreza Zarrabi 
71*d6e29083SAmirreza Zarrabi /* BI and BO payloads in QTEE messages should be at 64-bit boundaries. */
72*d6e29083SAmirreza Zarrabi #define qcomtee_msg_offset_align(o) ALIGN((o), sizeof(u64))
73*d6e29083SAmirreza Zarrabi 
74*d6e29083SAmirreza Zarrabi /* Operations for objects are 32-bit. Transport uses the upper 16 bits. */
75*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_OBJECT_OP_MASK GENMASK(15, 0)
76*d6e29083SAmirreza Zarrabi 
77*d6e29083SAmirreza Zarrabi /* Reserved Operation IDs sent to QTEE: */
78*d6e29083SAmirreza Zarrabi /* QCOMTEE_MSG_OBJECT_OP_RELEASE - Reduces the refcount and releases the object.
79*d6e29083SAmirreza Zarrabi  * QCOMTEE_MSG_OBJECT_OP_RETAIN  - Increases the refcount.
80*d6e29083SAmirreza Zarrabi  *
81*d6e29083SAmirreza Zarrabi  * These operation IDs are valid for all objects.
82*d6e29083SAmirreza Zarrabi  */
83*d6e29083SAmirreza Zarrabi 
84*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_OBJECT_OP_RELEASE (QCOMTEE_MSG_OBJECT_OP_MASK - 0)
85*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_OBJECT_OP_RETAIN  (QCOMTEE_MSG_OBJECT_OP_MASK - 1)
86*d6e29083SAmirreza Zarrabi 
87*d6e29083SAmirreza Zarrabi /* Subset of operations supported by QTEE root object. */
88*d6e29083SAmirreza Zarrabi 
89*d6e29083SAmirreza Zarrabi #define QCOMTEE_ROOT_OP_REG_WITH_CREDENTIALS	5
90*d6e29083SAmirreza Zarrabi #define QCOMTEE_ROOT_OP_NOTIFY_DOMAIN_CHANGE	4
91*d6e29083SAmirreza Zarrabi #define QCOMTEE_ROOT_OP_ADCI_ACCEPT		8
92*d6e29083SAmirreza Zarrabi #define QCOMTEE_ROOT_OP_ADCI_SHUTDOWN		9
93*d6e29083SAmirreza Zarrabi 
94*d6e29083SAmirreza Zarrabi /* Subset of operations supported by client_env object. */
95*d6e29083SAmirreza Zarrabi 
96*d6e29083SAmirreza Zarrabi #define QCOMTEE_CLIENT_ENV_OPEN 0
97*d6e29083SAmirreza Zarrabi 
98*d6e29083SAmirreza Zarrabi /* List of available QTEE service UIDs and subset of operations. */
99*d6e29083SAmirreza Zarrabi 
100*d6e29083SAmirreza Zarrabi #define QCOMTEE_FEATURE_VER_UID		2033
101*d6e29083SAmirreza Zarrabi #define QCOMTEE_FEATURE_VER_OP_GET	0
102*d6e29083SAmirreza Zarrabi /* Get QTEE version number. */
103*d6e29083SAmirreza Zarrabi #define QCOMTEE_FEATURE_VER_OP_GET_QTEE_ID 10
104*d6e29083SAmirreza Zarrabi #define QTEE_VERSION_GET_MAJOR(x) (((x) >> 22) & 0xffU)
105*d6e29083SAmirreza Zarrabi #define QTEE_VERSION_GET_MINOR(x) (((x) >> 12) & 0xffU)
106*d6e29083SAmirreza Zarrabi #define QTEE_VERSION_GET_PATCH(x) ((x) >> 0 & 0xfffU)
107*d6e29083SAmirreza Zarrabi 
108*d6e29083SAmirreza Zarrabi /* Response types as returned from qcomtee_object_invoke_ctx_invoke(). */
109*d6e29083SAmirreza Zarrabi 
110*d6e29083SAmirreza Zarrabi /* The message contains a callback request. */
111*d6e29083SAmirreza Zarrabi #define QCOMTEE_RESULT_INBOUND_REQ_NEEDED 3
112*d6e29083SAmirreza Zarrabi 
113*d6e29083SAmirreza Zarrabi /**
114*d6e29083SAmirreza Zarrabi  * struct qcomtee_msg_object_invoke - Direct object invocation message.
115*d6e29083SAmirreza Zarrabi  * @ctx: object ID hosted in QTEE.
116*d6e29083SAmirreza Zarrabi  * @op: operation for the object.
117*d6e29083SAmirreza Zarrabi  * @counts: number of different types of arguments in @args.
118*d6e29083SAmirreza Zarrabi  * @args: array of arguments.
119*d6e29083SAmirreza Zarrabi  *
120*d6e29083SAmirreza Zarrabi  * @counts consists of 4 * 4-bit fields. Bits 0 - 3 represent the number of
121*d6e29083SAmirreza Zarrabi  * input buffers, bits 4 - 7 represent the number of output buffers,
122*d6e29083SAmirreza Zarrabi  * bits 8 - 11 represent the number of input objects, and bits 12 - 15
123*d6e29083SAmirreza Zarrabi  * represent the number of output objects. The remaining bits should be zero.
124*d6e29083SAmirreza Zarrabi  *
125*d6e29083SAmirreza Zarrabi  *    15            12 11             8 7              4 3              0
126*d6e29083SAmirreza Zarrabi  *   +----------------+----------------+----------------+----------------+
127*d6e29083SAmirreza Zarrabi  *   |  #OO objects   |  #IO objects   |  #OB buffers   |  #IB buffers   |
128*d6e29083SAmirreza Zarrabi  *   +----------------+----------------+----------------+----------------+
129*d6e29083SAmirreza Zarrabi  *
130*d6e29083SAmirreza Zarrabi  * The maximum number of arguments of each type is defined by
131*d6e29083SAmirreza Zarrabi  * %QCOMTEE_ARGS_PER_TYPE.
132*d6e29083SAmirreza Zarrabi  */
133*d6e29083SAmirreza Zarrabi struct qcomtee_msg_object_invoke {
134*d6e29083SAmirreza Zarrabi 	u32 cxt;
135*d6e29083SAmirreza Zarrabi 	u32 op;
136*d6e29083SAmirreza Zarrabi 	u32 counts;
137*d6e29083SAmirreza Zarrabi 	union qcomtee_msg_arg args[];
138*d6e29083SAmirreza Zarrabi };
139*d6e29083SAmirreza Zarrabi 
140*d6e29083SAmirreza Zarrabi /* Bit masks for the four 4-bit nibbles holding the counts. */
141*d6e29083SAmirreza Zarrabi #define QCOMTEE_MASK_IB GENMASK(3, 0)
142*d6e29083SAmirreza Zarrabi #define QCOMTEE_MASK_OB GENMASK(7, 4)
143*d6e29083SAmirreza Zarrabi #define QCOMTEE_MASK_IO GENMASK(11, 8)
144*d6e29083SAmirreza Zarrabi #define QCOMTEE_MASK_OO GENMASK(15, 12)
145*d6e29083SAmirreza Zarrabi 
146*d6e29083SAmirreza Zarrabi /**
147*d6e29083SAmirreza Zarrabi  * struct qcomtee_msg_callback - Callback request message.
148*d6e29083SAmirreza Zarrabi  * @result: result of operation @op on the object referenced by @cxt.
149*d6e29083SAmirreza Zarrabi  * @cxt: object ID hosted in the kernel.
150*d6e29083SAmirreza Zarrabi  * @op: operation for the object.
151*d6e29083SAmirreza Zarrabi  * @counts: number of different types of arguments in @args.
152*d6e29083SAmirreza Zarrabi  * @args: array of arguments.
153*d6e29083SAmirreza Zarrabi  *
154*d6e29083SAmirreza Zarrabi  * For details of @counts, see &qcomtee_msg_object_invoke.counts.
155*d6e29083SAmirreza Zarrabi  */
156*d6e29083SAmirreza Zarrabi struct qcomtee_msg_callback {
157*d6e29083SAmirreza Zarrabi 	u32 result;
158*d6e29083SAmirreza Zarrabi 	u32 cxt;
159*d6e29083SAmirreza Zarrabi 	u32 op;
160*d6e29083SAmirreza Zarrabi 	u32 counts;
161*d6e29083SAmirreza Zarrabi 	union qcomtee_msg_arg args[];
162*d6e29083SAmirreza Zarrabi };
163*d6e29083SAmirreza Zarrabi 
164*d6e29083SAmirreza Zarrabi /* Offset in the message for the beginning of the buffer argument's contents. */
165*d6e29083SAmirreza Zarrabi #define qcomtee_msg_buffer_args(t, n) \
166*d6e29083SAmirreza Zarrabi 	qcomtee_msg_offset_align(struct_size_t(t, args, n))
167*d6e29083SAmirreza Zarrabi /* Pointer to the beginning of a buffer argument's content at an offset. */
168*d6e29083SAmirreza Zarrabi #define qcomtee_msg_offset_to_ptr(m, off) ((void *)&((char *)(m))[(off)])
169*d6e29083SAmirreza Zarrabi 
170*d6e29083SAmirreza Zarrabi /* Some helpers to manage msg.counts. */
171*d6e29083SAmirreza Zarrabi 
172*d6e29083SAmirreza Zarrabi static inline unsigned int qcomtee_msg_num_ib(u32 counts)
173*d6e29083SAmirreza Zarrabi {
174*d6e29083SAmirreza Zarrabi 	return FIELD_GET(QCOMTEE_MASK_IB, counts);
175*d6e29083SAmirreza Zarrabi }
176*d6e29083SAmirreza Zarrabi 
177*d6e29083SAmirreza Zarrabi static inline unsigned int qcomtee_msg_num_ob(u32 counts)
178*d6e29083SAmirreza Zarrabi {
179*d6e29083SAmirreza Zarrabi 	return FIELD_GET(QCOMTEE_MASK_OB, counts);
180*d6e29083SAmirreza Zarrabi }
181*d6e29083SAmirreza Zarrabi 
182*d6e29083SAmirreza Zarrabi static inline unsigned int qcomtee_msg_num_io(u32 counts)
183*d6e29083SAmirreza Zarrabi {
184*d6e29083SAmirreza Zarrabi 	return FIELD_GET(QCOMTEE_MASK_IO, counts);
185*d6e29083SAmirreza Zarrabi }
186*d6e29083SAmirreza Zarrabi 
187*d6e29083SAmirreza Zarrabi static inline unsigned int qcomtee_msg_num_oo(u32 counts)
188*d6e29083SAmirreza Zarrabi {
189*d6e29083SAmirreza Zarrabi 	return FIELD_GET(QCOMTEE_MASK_OO, counts);
190*d6e29083SAmirreza Zarrabi }
191*d6e29083SAmirreza Zarrabi 
192*d6e29083SAmirreza Zarrabi static inline unsigned int qcomtee_msg_idx_ib(u32 counts)
193*d6e29083SAmirreza Zarrabi {
194*d6e29083SAmirreza Zarrabi 	return 0;
195*d6e29083SAmirreza Zarrabi }
196*d6e29083SAmirreza Zarrabi 
197*d6e29083SAmirreza Zarrabi static inline unsigned int qcomtee_msg_idx_ob(u32 counts)
198*d6e29083SAmirreza Zarrabi {
199*d6e29083SAmirreza Zarrabi 	return qcomtee_msg_num_ib(counts);
200*d6e29083SAmirreza Zarrabi }
201*d6e29083SAmirreza Zarrabi 
202*d6e29083SAmirreza Zarrabi static inline unsigned int qcomtee_msg_idx_io(u32 counts)
203*d6e29083SAmirreza Zarrabi {
204*d6e29083SAmirreza Zarrabi 	return qcomtee_msg_idx_ob(counts) + qcomtee_msg_num_ob(counts);
205*d6e29083SAmirreza Zarrabi }
206*d6e29083SAmirreza Zarrabi 
207*d6e29083SAmirreza Zarrabi static inline unsigned int qcomtee_msg_idx_oo(u32 counts)
208*d6e29083SAmirreza Zarrabi {
209*d6e29083SAmirreza Zarrabi 	return qcomtee_msg_idx_io(counts) + qcomtee_msg_num_io(counts);
210*d6e29083SAmirreza Zarrabi }
211*d6e29083SAmirreza Zarrabi 
212*d6e29083SAmirreza Zarrabi #define qcomtee_msg_for_each(i, first, num) \
213*d6e29083SAmirreza Zarrabi 	for ((i) = (first); (i) < (first) + (num); (i)++)
214*d6e29083SAmirreza Zarrabi 
215*d6e29083SAmirreza Zarrabi #define qcomtee_msg_for_each_input_buffer(i, m)                  \
216*d6e29083SAmirreza Zarrabi 	qcomtee_msg_for_each(i, qcomtee_msg_idx_ib((m)->counts), \
217*d6e29083SAmirreza Zarrabi 			     qcomtee_msg_num_ib((m)->counts))
218*d6e29083SAmirreza Zarrabi 
219*d6e29083SAmirreza Zarrabi #define qcomtee_msg_for_each_output_buffer(i, m)                 \
220*d6e29083SAmirreza Zarrabi 	qcomtee_msg_for_each(i, qcomtee_msg_idx_ob((m)->counts), \
221*d6e29083SAmirreza Zarrabi 			     qcomtee_msg_num_ob((m)->counts))
222*d6e29083SAmirreza Zarrabi 
223*d6e29083SAmirreza Zarrabi #define qcomtee_msg_for_each_input_object(i, m)                  \
224*d6e29083SAmirreza Zarrabi 	qcomtee_msg_for_each(i, qcomtee_msg_idx_io((m)->counts), \
225*d6e29083SAmirreza Zarrabi 			     qcomtee_msg_num_io((m)->counts))
226*d6e29083SAmirreza Zarrabi 
227*d6e29083SAmirreza Zarrabi #define qcomtee_msg_for_each_output_object(i, m)                 \
228*d6e29083SAmirreza Zarrabi 	qcomtee_msg_for_each(i, qcomtee_msg_idx_oo((m)->counts), \
229*d6e29083SAmirreza Zarrabi 			     qcomtee_msg_num_oo((m)->counts))
230*d6e29083SAmirreza Zarrabi 
231*d6e29083SAmirreza Zarrabi /* Sum of arguments in a message. */
232*d6e29083SAmirreza Zarrabi #define qcomtee_msg_args(m) \
233*d6e29083SAmirreza Zarrabi 	(qcomtee_msg_idx_oo((m)->counts) + qcomtee_msg_num_oo((m)->counts))
234*d6e29083SAmirreza Zarrabi 
235*d6e29083SAmirreza Zarrabi static inline void qcomtee_msg_init(struct qcomtee_msg_object_invoke *msg,
236*d6e29083SAmirreza Zarrabi 				    u32 cxt, u32 op, int in_buffer,
237*d6e29083SAmirreza Zarrabi 				    int out_buffer, int in_object,
238*d6e29083SAmirreza Zarrabi 				    int out_object)
239*d6e29083SAmirreza Zarrabi {
240*d6e29083SAmirreza Zarrabi 	u32 counts = 0;
241*d6e29083SAmirreza Zarrabi 
242*d6e29083SAmirreza Zarrabi 	counts |= (in_buffer & 0xfU);
243*d6e29083SAmirreza Zarrabi 	counts |= ((out_buffer - in_buffer) & 0xfU) << 4;
244*d6e29083SAmirreza Zarrabi 	counts |= ((in_object - out_buffer) & 0xfU) << 8;
245*d6e29083SAmirreza Zarrabi 	counts |= ((out_object - in_object) & 0xfU) << 12;
246*d6e29083SAmirreza Zarrabi 
247*d6e29083SAmirreza Zarrabi 	msg->cxt = cxt;
248*d6e29083SAmirreza Zarrabi 	msg->op = op;
249*d6e29083SAmirreza Zarrabi 	msg->counts = counts;
250*d6e29083SAmirreza Zarrabi }
251*d6e29083SAmirreza Zarrabi 
252*d6e29083SAmirreza Zarrabi /* Generic error codes. */
253*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_OK			0 /* non-specific success code. */
254*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR		1 /* non-specific error. */
255*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_INVALID	2 /* unsupported/unrecognized request. */
256*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_SIZE_IN	3 /* supplied buffer/string too large. */
257*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_SIZE_OUT	4 /* supplied output buffer too small. */
258*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_USERBASE	10 /* start of user-defined error range. */
259*d6e29083SAmirreza Zarrabi 
260*d6e29083SAmirreza Zarrabi /* Transport layer error codes. */
261*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_DEFUNCT	-90 /* object no longer exists. */
262*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_ABORT		-91 /* calling thread must exit. */
263*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_BADOBJ	-92 /* invalid object context. */
264*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_NOSLOTS	-93 /* caller's object table full. */
265*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_MAXARGS	-94 /* too many args. */
266*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_MAXDATA	-95 /* buffers too large. */
267*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_UNAVAIL	-96 /* the request could not be processed. */
268*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_KMEM		-97 /* kernel out of memory. */
269*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_REMOTE	-98 /* local method sent to remote object. */
270*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_BUSY		-99 /* Object is busy. */
271*d6e29083SAmirreza Zarrabi #define QCOMTEE_MSG_ERROR_TIMEOUT	-103 /* Call Back Object invocation timed out. */
272*d6e29083SAmirreza Zarrabi 
273*d6e29083SAmirreza Zarrabi static inline void qcomtee_msg_set_result(struct qcomtee_msg_callback *cb_msg,
274*d6e29083SAmirreza Zarrabi 					  int err)
275*d6e29083SAmirreza Zarrabi {
276*d6e29083SAmirreza Zarrabi 	if (!err) {
277*d6e29083SAmirreza Zarrabi 		cb_msg->result = QCOMTEE_MSG_OK;
278*d6e29083SAmirreza Zarrabi 	} else if (err < 0) {
279*d6e29083SAmirreza Zarrabi 		/* If err < 0, then it is a transport error. */
280*d6e29083SAmirreza Zarrabi 		switch (err) {
281*d6e29083SAmirreza Zarrabi 		case -ENOMEM:
282*d6e29083SAmirreza Zarrabi 			cb_msg->result = QCOMTEE_MSG_ERROR_KMEM;
283*d6e29083SAmirreza Zarrabi 			break;
284*d6e29083SAmirreza Zarrabi 		case -ENODEV:
285*d6e29083SAmirreza Zarrabi 			cb_msg->result = QCOMTEE_MSG_ERROR_DEFUNCT;
286*d6e29083SAmirreza Zarrabi 			break;
287*d6e29083SAmirreza Zarrabi 		case -ENOSPC:
288*d6e29083SAmirreza Zarrabi 		case -EBUSY:
289*d6e29083SAmirreza Zarrabi 			cb_msg->result = QCOMTEE_MSG_ERROR_BUSY;
290*d6e29083SAmirreza Zarrabi 			break;
291*d6e29083SAmirreza Zarrabi 		case -EBADF:
292*d6e29083SAmirreza Zarrabi 		case -EINVAL:
293*d6e29083SAmirreza Zarrabi 			cb_msg->result = QCOMTEE_MSG_ERROR_UNAVAIL;
294*d6e29083SAmirreza Zarrabi 			break;
295*d6e29083SAmirreza Zarrabi 		default:
296*d6e29083SAmirreza Zarrabi 			cb_msg->result = QCOMTEE_MSG_ERROR;
297*d6e29083SAmirreza Zarrabi 		}
298*d6e29083SAmirreza Zarrabi 	} else {
299*d6e29083SAmirreza Zarrabi 		/* If err > 0, then it is user defined error, pass it as is. */
300*d6e29083SAmirreza Zarrabi 		cb_msg->result = err;
301*d6e29083SAmirreza Zarrabi 	}
302*d6e29083SAmirreza Zarrabi }
303*d6e29083SAmirreza Zarrabi 
304*d6e29083SAmirreza Zarrabi #endif /* QCOMTEE_MSG_H */
305