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