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_OBJECT_H 7*d6e29083SAmirreza Zarrabi #define QCOMTEE_OBJECT_H 8*d6e29083SAmirreza Zarrabi 9*d6e29083SAmirreza Zarrabi #include <linux/completion.h> 10*d6e29083SAmirreza Zarrabi #include <linux/kref.h> 11*d6e29083SAmirreza Zarrabi #include <linux/slab.h> 12*d6e29083SAmirreza Zarrabi #include <linux/workqueue.h> 13*d6e29083SAmirreza Zarrabi 14*d6e29083SAmirreza Zarrabi struct qcomtee_object; 15*d6e29083SAmirreza Zarrabi 16*d6e29083SAmirreza Zarrabi /** 17*d6e29083SAmirreza Zarrabi * DOC: Overview 18*d6e29083SAmirreza Zarrabi * 19*d6e29083SAmirreza Zarrabi * qcomtee_object provides object refcounting, ID allocation for objects hosted 20*d6e29083SAmirreza Zarrabi * in the kernel, and necessary message marshaling for Qualcomm TEE (QTEE). 21*d6e29083SAmirreza Zarrabi * 22*d6e29083SAmirreza Zarrabi * To invoke an object in QTEE, the user calls qcomtee_object_do_invoke() 23*d6e29083SAmirreza Zarrabi * while passing an instance of &struct qcomtee_object and the requested 24*d6e29083SAmirreza Zarrabi * operation + arguments. 25*d6e29083SAmirreza Zarrabi * 26*d6e29083SAmirreza Zarrabi * After boot, QTEE provides a static object %ROOT_QCOMTEE_OBJECT (type of 27*d6e29083SAmirreza Zarrabi * %QCOMTEE_OBJECT_TYPE_ROOT). The root object is invoked to pass the user's 28*d6e29083SAmirreza Zarrabi * credentials and obtain other instances of &struct qcomtee_object (type of 29*d6e29083SAmirreza Zarrabi * %QCOMTEE_OBJECT_TYPE_TEE) that represent services and TAs in QTEE; 30*d6e29083SAmirreza Zarrabi * see &enum qcomtee_object_type. 31*d6e29083SAmirreza Zarrabi * 32*d6e29083SAmirreza Zarrabi * The objects received from QTEE are refcounted. So the owner of these objects 33*d6e29083SAmirreza Zarrabi * can issue qcomtee_object_get() to increase the refcount and pass objects 34*d6e29083SAmirreza Zarrabi * to other clients, or issue qcomtee_object_put() to decrease the refcount 35*d6e29083SAmirreza Zarrabi * and release the resources in QTEE. 36*d6e29083SAmirreza Zarrabi * 37*d6e29083SAmirreza Zarrabi * The kernel can host services accessible to QTEE. A driver should embed 38*d6e29083SAmirreza Zarrabi * an instance of &struct qcomtee_object in the struct it wants to export to 39*d6e29083SAmirreza Zarrabi * QTEE (this is called a callback object). It issues qcomtee_object_user_init() 40*d6e29083SAmirreza Zarrabi * to set the dispatch() operation for the callback object and set its type 41*d6e29083SAmirreza Zarrabi * to %QCOMTEE_OBJECT_TYPE_CB. 42*d6e29083SAmirreza Zarrabi * 43*d6e29083SAmirreza Zarrabi * core.c holds an object table for callback objects. An object ID is assigned 44*d6e29083SAmirreza Zarrabi * to each callback object, which is an index to the object table. QTEE uses 45*d6e29083SAmirreza Zarrabi * these IDs to reference or invoke callback objects. 46*d6e29083SAmirreza Zarrabi * 47*d6e29083SAmirreza Zarrabi * If QTEE invokes a callback object in the kernel, the dispatch() operation is 48*d6e29083SAmirreza Zarrabi * called in the context of the thread that originally called 49*d6e29083SAmirreza Zarrabi * qcomtee_object_do_invoke(). 50*d6e29083SAmirreza Zarrabi */ 51*d6e29083SAmirreza Zarrabi 52*d6e29083SAmirreza Zarrabi /** 53*d6e29083SAmirreza Zarrabi * enum qcomtee_object_type - Object types. 54*d6e29083SAmirreza Zarrabi * @QCOMTEE_OBJECT_TYPE_TEE: object hosted on QTEE. 55*d6e29083SAmirreza Zarrabi * @QCOMTEE_OBJECT_TYPE_CB: object hosted on kernel. 56*d6e29083SAmirreza Zarrabi * @QCOMTEE_OBJECT_TYPE_ROOT: 'primordial' object. 57*d6e29083SAmirreza Zarrabi * @QCOMTEE_OBJECT_TYPE_NULL: NULL object. 58*d6e29083SAmirreza Zarrabi * 59*d6e29083SAmirreza Zarrabi * The primordial object is used for bootstrapping the IPC connection between 60*d6e29083SAmirreza Zarrabi * the kernel and QTEE. It is invoked by the kernel when it wants to get a 61*d6e29083SAmirreza Zarrabi * 'client env'. 62*d6e29083SAmirreza Zarrabi */ 63*d6e29083SAmirreza Zarrabi enum qcomtee_object_type { 64*d6e29083SAmirreza Zarrabi QCOMTEE_OBJECT_TYPE_TEE, 65*d6e29083SAmirreza Zarrabi QCOMTEE_OBJECT_TYPE_CB, 66*d6e29083SAmirreza Zarrabi QCOMTEE_OBJECT_TYPE_ROOT, 67*d6e29083SAmirreza Zarrabi QCOMTEE_OBJECT_TYPE_NULL, 68*d6e29083SAmirreza Zarrabi }; 69*d6e29083SAmirreza Zarrabi 70*d6e29083SAmirreza Zarrabi /** 71*d6e29083SAmirreza Zarrabi * enum qcomtee_arg_type - Type of QTEE argument. 72*d6e29083SAmirreza Zarrabi * @QCOMTEE_ARG_TYPE_INV: invalid type. 73*d6e29083SAmirreza Zarrabi * @QCOMTEE_ARG_TYPE_OB: output buffer (OB). 74*d6e29083SAmirreza Zarrabi * @QCOMTEE_ARG_TYPE_OO: output object (OO). 75*d6e29083SAmirreza Zarrabi * @QCOMTEE_ARG_TYPE_IB: input buffer (IB). 76*d6e29083SAmirreza Zarrabi * @QCOMTEE_ARG_TYPE_IO: input object (IO). 77*d6e29083SAmirreza Zarrabi * 78*d6e29083SAmirreza Zarrabi * Use the invalid type to specify the end of the argument array. 79*d6e29083SAmirreza Zarrabi */ 80*d6e29083SAmirreza Zarrabi enum qcomtee_arg_type { 81*d6e29083SAmirreza Zarrabi QCOMTEE_ARG_TYPE_INV = 0, 82*d6e29083SAmirreza Zarrabi QCOMTEE_ARG_TYPE_OB, 83*d6e29083SAmirreza Zarrabi QCOMTEE_ARG_TYPE_OO, 84*d6e29083SAmirreza Zarrabi QCOMTEE_ARG_TYPE_IB, 85*d6e29083SAmirreza Zarrabi QCOMTEE_ARG_TYPE_IO, 86*d6e29083SAmirreza Zarrabi QCOMTEE_ARG_TYPE_NR, 87*d6e29083SAmirreza Zarrabi }; 88*d6e29083SAmirreza Zarrabi 89*d6e29083SAmirreza Zarrabi /** 90*d6e29083SAmirreza Zarrabi * define QCOMTEE_ARGS_PER_TYPE - Maximum arguments of a specific type. 91*d6e29083SAmirreza Zarrabi * 92*d6e29083SAmirreza Zarrabi * The QTEE transport protocol limits the maximum number of arguments of 93*d6e29083SAmirreza Zarrabi * a specific type (i.e., IB, OB, IO, and OO). 94*d6e29083SAmirreza Zarrabi */ 95*d6e29083SAmirreza Zarrabi #define QCOMTEE_ARGS_PER_TYPE 16 96*d6e29083SAmirreza Zarrabi 97*d6e29083SAmirreza Zarrabi /* Maximum arguments that can fit in a QTEE message, ignoring the type. */ 98*d6e29083SAmirreza Zarrabi #define QCOMTEE_ARGS_MAX (QCOMTEE_ARGS_PER_TYPE * (QCOMTEE_ARG_TYPE_NR - 1)) 99*d6e29083SAmirreza Zarrabi 100*d6e29083SAmirreza Zarrabi struct qcomtee_buffer { 101*d6e29083SAmirreza Zarrabi union { 102*d6e29083SAmirreza Zarrabi void *addr; 103*d6e29083SAmirreza Zarrabi void __user *uaddr; 104*d6e29083SAmirreza Zarrabi }; 105*d6e29083SAmirreza Zarrabi size_t size; 106*d6e29083SAmirreza Zarrabi }; 107*d6e29083SAmirreza Zarrabi 108*d6e29083SAmirreza Zarrabi /** 109*d6e29083SAmirreza Zarrabi * struct qcomtee_arg - Argument for QTEE object invocation. 110*d6e29083SAmirreza Zarrabi * @type: type of argument as &enum qcomtee_arg_type. 111*d6e29083SAmirreza Zarrabi * @flags: extra flags. 112*d6e29083SAmirreza Zarrabi * @b: address and size if the type of argument is a buffer. 113*d6e29083SAmirreza Zarrabi * @o: object instance if the type of argument is an object. 114*d6e29083SAmirreza Zarrabi * 115*d6e29083SAmirreza Zarrabi * &qcomtee_arg.flags only accepts %QCOMTEE_ARG_FLAGS_UADDR for now, which 116*d6e29083SAmirreza Zarrabi * states that &qcomtee_arg.b contains a userspace address in uaddr. 117*d6e29083SAmirreza Zarrabi */ 118*d6e29083SAmirreza Zarrabi struct qcomtee_arg { 119*d6e29083SAmirreza Zarrabi enum qcomtee_arg_type type; 120*d6e29083SAmirreza Zarrabi /* 'b.uaddr' holds a __user address. */ 121*d6e29083SAmirreza Zarrabi #define QCOMTEE_ARG_FLAGS_UADDR BIT(0) 122*d6e29083SAmirreza Zarrabi unsigned int flags; 123*d6e29083SAmirreza Zarrabi union { 124*d6e29083SAmirreza Zarrabi struct qcomtee_buffer b; 125*d6e29083SAmirreza Zarrabi struct qcomtee_object *o; 126*d6e29083SAmirreza Zarrabi }; 127*d6e29083SAmirreza Zarrabi }; 128*d6e29083SAmirreza Zarrabi 129*d6e29083SAmirreza Zarrabi static inline int qcomtee_args_len(struct qcomtee_arg *args) 130*d6e29083SAmirreza Zarrabi { 131*d6e29083SAmirreza Zarrabi int i = 0; 132*d6e29083SAmirreza Zarrabi 133*d6e29083SAmirreza Zarrabi while (args[i].type != QCOMTEE_ARG_TYPE_INV) 134*d6e29083SAmirreza Zarrabi i++; 135*d6e29083SAmirreza Zarrabi return i; 136*d6e29083SAmirreza Zarrabi } 137*d6e29083SAmirreza Zarrabi 138*d6e29083SAmirreza Zarrabi /* Context is busy (callback is in progress). */ 139*d6e29083SAmirreza Zarrabi #define QCOMTEE_OIC_FLAG_BUSY BIT(1) 140*d6e29083SAmirreza Zarrabi /* Context needs to notify the current object. */ 141*d6e29083SAmirreza Zarrabi #define QCOMTEE_OIC_FLAG_NOTIFY BIT(2) 142*d6e29083SAmirreza Zarrabi /* Context has shared state with QTEE. */ 143*d6e29083SAmirreza Zarrabi #define QCOMTEE_OIC_FLAG_SHARED BIT(3) 144*d6e29083SAmirreza Zarrabi 145*d6e29083SAmirreza Zarrabi /** 146*d6e29083SAmirreza Zarrabi * struct qcomtee_object_invoke_ctx - QTEE context for object invocation. 147*d6e29083SAmirreza Zarrabi * @ctx: TEE context for this invocation. 148*d6e29083SAmirreza Zarrabi * @flags: flags for the invocation context. 149*d6e29083SAmirreza Zarrabi * @errno: error code for the invocation. 150*d6e29083SAmirreza Zarrabi * @object: current object invoked in this callback context. 151*d6e29083SAmirreza Zarrabi * @u: array of arguments for the current invocation (+1 for ending arg). 152*d6e29083SAmirreza Zarrabi * @in_msg: inbound buffer shared with QTEE. 153*d6e29083SAmirreza Zarrabi * @out_msg: outbound buffer shared with QTEE. 154*d6e29083SAmirreza Zarrabi * @in_shm: TEE shm allocated for inbound buffer. 155*d6e29083SAmirreza Zarrabi * @out_shm: TEE shm allocated for outbound buffer. 156*d6e29083SAmirreza Zarrabi * @data: extra data attached to this context. 157*d6e29083SAmirreza Zarrabi */ 158*d6e29083SAmirreza Zarrabi struct qcomtee_object_invoke_ctx { 159*d6e29083SAmirreza Zarrabi struct tee_context *ctx; 160*d6e29083SAmirreza Zarrabi unsigned long flags; 161*d6e29083SAmirreza Zarrabi int errno; 162*d6e29083SAmirreza Zarrabi 163*d6e29083SAmirreza Zarrabi struct qcomtee_object *object; 164*d6e29083SAmirreza Zarrabi struct qcomtee_arg u[QCOMTEE_ARGS_MAX + 1]; 165*d6e29083SAmirreza Zarrabi 166*d6e29083SAmirreza Zarrabi struct qcomtee_buffer in_msg; 167*d6e29083SAmirreza Zarrabi struct qcomtee_buffer out_msg; 168*d6e29083SAmirreza Zarrabi struct tee_shm *in_shm; 169*d6e29083SAmirreza Zarrabi struct tee_shm *out_shm; 170*d6e29083SAmirreza Zarrabi 171*d6e29083SAmirreza Zarrabi void *data; 172*d6e29083SAmirreza Zarrabi }; 173*d6e29083SAmirreza Zarrabi 174*d6e29083SAmirreza Zarrabi static inline struct qcomtee_object_invoke_ctx * 175*d6e29083SAmirreza Zarrabi qcomtee_object_invoke_ctx_alloc(struct tee_context *ctx) 176*d6e29083SAmirreza Zarrabi { 177*d6e29083SAmirreza Zarrabi struct qcomtee_object_invoke_ctx *oic; 178*d6e29083SAmirreza Zarrabi 179*d6e29083SAmirreza Zarrabi oic = kzalloc(sizeof(*oic), GFP_KERNEL); 180*d6e29083SAmirreza Zarrabi if (oic) 181*d6e29083SAmirreza Zarrabi oic->ctx = ctx; 182*d6e29083SAmirreza Zarrabi return oic; 183*d6e29083SAmirreza Zarrabi } 184*d6e29083SAmirreza Zarrabi 185*d6e29083SAmirreza Zarrabi /** 186*d6e29083SAmirreza Zarrabi * qcomtee_object_do_invoke() - Submit an invocation for an object. 187*d6e29083SAmirreza Zarrabi * @oic: context to use for the current invocation. 188*d6e29083SAmirreza Zarrabi * @object: object being invoked. 189*d6e29083SAmirreza Zarrabi * @op: requested operation on the object. 190*d6e29083SAmirreza Zarrabi * @u: array of arguments for the current invocation. 191*d6e29083SAmirreza Zarrabi * @result: result returned from QTEE. 192*d6e29083SAmirreza Zarrabi * 193*d6e29083SAmirreza Zarrabi * The caller is responsible for keeping track of the refcount for each object, 194*d6e29083SAmirreza Zarrabi * including @object. On return, the caller loses ownership of all input 195*d6e29083SAmirreza Zarrabi * objects of type %QCOMTEE_OBJECT_TYPE_CB. 196*d6e29083SAmirreza Zarrabi * 197*d6e29083SAmirreza Zarrabi * @object can be of %QCOMTEE_OBJECT_TYPE_ROOT or %QCOMTEE_OBJECT_TYPE_TEE. 198*d6e29083SAmirreza Zarrabi * 199*d6e29083SAmirreza Zarrabi * Return: On success, returns 0; on failure, returns < 0. 200*d6e29083SAmirreza Zarrabi */ 201*d6e29083SAmirreza Zarrabi int qcomtee_object_do_invoke(struct qcomtee_object_invoke_ctx *oic, 202*d6e29083SAmirreza Zarrabi struct qcomtee_object *object, u32 op, 203*d6e29083SAmirreza Zarrabi struct qcomtee_arg *u, int *result); 204*d6e29083SAmirreza Zarrabi 205*d6e29083SAmirreza Zarrabi /** 206*d6e29083SAmirreza Zarrabi * struct qcomtee_object_operations - Callback object operations. 207*d6e29083SAmirreza Zarrabi * @release: release the object if QTEE is not using it. 208*d6e29083SAmirreza Zarrabi * @dispatch: dispatch the operation requested by QTEE. 209*d6e29083SAmirreza Zarrabi * @notify: report the status of any pending response submitted by @dispatch. 210*d6e29083SAmirreza Zarrabi */ 211*d6e29083SAmirreza Zarrabi struct qcomtee_object_operations { 212*d6e29083SAmirreza Zarrabi void (*release)(struct qcomtee_object *object); 213*d6e29083SAmirreza Zarrabi int (*dispatch)(struct qcomtee_object_invoke_ctx *oic, 214*d6e29083SAmirreza Zarrabi struct qcomtee_object *object, u32 op, 215*d6e29083SAmirreza Zarrabi struct qcomtee_arg *args); 216*d6e29083SAmirreza Zarrabi void (*notify)(struct qcomtee_object_invoke_ctx *oic, 217*d6e29083SAmirreza Zarrabi struct qcomtee_object *object, int err); 218*d6e29083SAmirreza Zarrabi }; 219*d6e29083SAmirreza Zarrabi 220*d6e29083SAmirreza Zarrabi /** 221*d6e29083SAmirreza Zarrabi * struct qcomtee_object - QTEE or kernel object. 222*d6e29083SAmirreza Zarrabi * @name: object name. 223*d6e29083SAmirreza Zarrabi * @refcount: reference counter. 224*d6e29083SAmirreza Zarrabi * @object_type: object type as &enum qcomtee_object_type. 225*d6e29083SAmirreza Zarrabi * @info: extra information for the object. 226*d6e29083SAmirreza Zarrabi * @ops: callback operations for objects of type %QCOMTEE_OBJECT_TYPE_CB. 227*d6e29083SAmirreza Zarrabi * @work: work for async operations on the object. 228*d6e29083SAmirreza Zarrabi * 229*d6e29083SAmirreza Zarrabi * @work is used for releasing objects of %QCOMTEE_OBJECT_TYPE_TEE type. 230*d6e29083SAmirreza Zarrabi */ 231*d6e29083SAmirreza Zarrabi struct qcomtee_object { 232*d6e29083SAmirreza Zarrabi const char *name; 233*d6e29083SAmirreza Zarrabi struct kref refcount; 234*d6e29083SAmirreza Zarrabi 235*d6e29083SAmirreza Zarrabi enum qcomtee_object_type object_type; 236*d6e29083SAmirreza Zarrabi struct object_info { 237*d6e29083SAmirreza Zarrabi unsigned long qtee_id; 238*d6e29083SAmirreza Zarrabi /* TEE context for QTEE object async requests. */ 239*d6e29083SAmirreza Zarrabi struct tee_context *qcomtee_async_ctx; 240*d6e29083SAmirreza Zarrabi } info; 241*d6e29083SAmirreza Zarrabi 242*d6e29083SAmirreza Zarrabi struct qcomtee_object_operations *ops; 243*d6e29083SAmirreza Zarrabi struct work_struct work; 244*d6e29083SAmirreza Zarrabi }; 245*d6e29083SAmirreza Zarrabi 246*d6e29083SAmirreza Zarrabi /* Static instances of qcomtee_object objects. */ 247*d6e29083SAmirreza Zarrabi #define NULL_QCOMTEE_OBJECT ((struct qcomtee_object *)(0)) 248*d6e29083SAmirreza Zarrabi extern struct qcomtee_object qcomtee_object_root; 249*d6e29083SAmirreza Zarrabi #define ROOT_QCOMTEE_OBJECT (&qcomtee_object_root) 250*d6e29083SAmirreza Zarrabi 251*d6e29083SAmirreza Zarrabi static inline enum qcomtee_object_type 252*d6e29083SAmirreza Zarrabi typeof_qcomtee_object(struct qcomtee_object *object) 253*d6e29083SAmirreza Zarrabi { 254*d6e29083SAmirreza Zarrabi if (object == NULL_QCOMTEE_OBJECT) 255*d6e29083SAmirreza Zarrabi return QCOMTEE_OBJECT_TYPE_NULL; 256*d6e29083SAmirreza Zarrabi return object->object_type; 257*d6e29083SAmirreza Zarrabi } 258*d6e29083SAmirreza Zarrabi 259*d6e29083SAmirreza Zarrabi static inline const char *qcomtee_object_name(struct qcomtee_object *object) 260*d6e29083SAmirreza Zarrabi { 261*d6e29083SAmirreza Zarrabi if (object == NULL_QCOMTEE_OBJECT) 262*d6e29083SAmirreza Zarrabi return "null"; 263*d6e29083SAmirreza Zarrabi 264*d6e29083SAmirreza Zarrabi if (!object->name) 265*d6e29083SAmirreza Zarrabi return "no-name"; 266*d6e29083SAmirreza Zarrabi return object->name; 267*d6e29083SAmirreza Zarrabi } 268*d6e29083SAmirreza Zarrabi 269*d6e29083SAmirreza Zarrabi /** 270*d6e29083SAmirreza Zarrabi * qcomtee_object_user_init() - Initialize an object for the user. 271*d6e29083SAmirreza Zarrabi * @object: object to initialize. 272*d6e29083SAmirreza Zarrabi * @ot: type of object as &enum qcomtee_object_type. 273*d6e29083SAmirreza Zarrabi * @ops: instance of callbacks. 274*d6e29083SAmirreza Zarrabi * @fmt: name assigned to the object. 275*d6e29083SAmirreza Zarrabi * 276*d6e29083SAmirreza Zarrabi * Return: On success, returns 0; on failure, returns < 0. 277*d6e29083SAmirreza Zarrabi */ 278*d6e29083SAmirreza Zarrabi int qcomtee_object_user_init(struct qcomtee_object *object, 279*d6e29083SAmirreza Zarrabi enum qcomtee_object_type ot, 280*d6e29083SAmirreza Zarrabi struct qcomtee_object_operations *ops, 281*d6e29083SAmirreza Zarrabi const char *fmt, ...) __printf(4, 5); 282*d6e29083SAmirreza Zarrabi 283*d6e29083SAmirreza Zarrabi /* Object release is RCU protected. */ 284*d6e29083SAmirreza Zarrabi int qcomtee_object_get(struct qcomtee_object *object); 285*d6e29083SAmirreza Zarrabi void qcomtee_object_put(struct qcomtee_object *object); 286*d6e29083SAmirreza Zarrabi 287*d6e29083SAmirreza Zarrabi #define qcomtee_arg_for_each(i, args) \ 288*d6e29083SAmirreza Zarrabi for (i = 0; args[i].type != QCOMTEE_ARG_TYPE_INV; i++) 289*d6e29083SAmirreza Zarrabi 290*d6e29083SAmirreza Zarrabi /* Next argument of type @type after index @i. */ 291*d6e29083SAmirreza Zarrabi int qcomtee_next_arg_type(struct qcomtee_arg *u, int i, 292*d6e29083SAmirreza Zarrabi enum qcomtee_arg_type type); 293*d6e29083SAmirreza Zarrabi 294*d6e29083SAmirreza Zarrabi /* Iterate over argument of given type. */ 295*d6e29083SAmirreza Zarrabi #define qcomtee_arg_for_each_type(i, args, at) \ 296*d6e29083SAmirreza Zarrabi for (i = qcomtee_next_arg_type(args, 0, at); \ 297*d6e29083SAmirreza Zarrabi args[i].type != QCOMTEE_ARG_TYPE_INV; \ 298*d6e29083SAmirreza Zarrabi i = qcomtee_next_arg_type(args, i + 1, at)) 299*d6e29083SAmirreza Zarrabi 300*d6e29083SAmirreza Zarrabi #define qcomtee_arg_for_each_input_buffer(i, args) \ 301*d6e29083SAmirreza Zarrabi qcomtee_arg_for_each_type(i, args, QCOMTEE_ARG_TYPE_IB) 302*d6e29083SAmirreza Zarrabi #define qcomtee_arg_for_each_output_buffer(i, args) \ 303*d6e29083SAmirreza Zarrabi qcomtee_arg_for_each_type(i, args, QCOMTEE_ARG_TYPE_OB) 304*d6e29083SAmirreza Zarrabi #define qcomtee_arg_for_each_input_object(i, args) \ 305*d6e29083SAmirreza Zarrabi qcomtee_arg_for_each_type(i, args, QCOMTEE_ARG_TYPE_IO) 306*d6e29083SAmirreza Zarrabi #define qcomtee_arg_for_each_output_object(i, args) \ 307*d6e29083SAmirreza Zarrabi qcomtee_arg_for_each_type(i, args, QCOMTEE_ARG_TYPE_OO) 308*d6e29083SAmirreza Zarrabi 309*d6e29083SAmirreza Zarrabi struct qcomtee_object * 310*d6e29083SAmirreza Zarrabi qcomtee_object_get_client_env(struct qcomtee_object_invoke_ctx *oic); 311*d6e29083SAmirreza Zarrabi 312*d6e29083SAmirreza Zarrabi struct qcomtee_object * 313*d6e29083SAmirreza Zarrabi qcomtee_object_get_service(struct qcomtee_object_invoke_ctx *oic, 314*d6e29083SAmirreza Zarrabi struct qcomtee_object *client_env, u32 uid); 315*d6e29083SAmirreza Zarrabi 316*d6e29083SAmirreza Zarrabi #endif /* QCOMTEE_OBJECT_H */ 317