/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. */ #ifndef QCOMTEE_H #define QCOMTEE_H #include #include #include "qcomtee_msg.h" #include "qcomtee_object.h" /* Flags relating to object reference. */ #define QCOMTEE_OBJREF_FLAG_TEE BIT(0) #define QCOMTEE_OBJREF_FLAG_USER BIT(1) #define QCOMTEE_OBJREF_FLAG_MEM BIT(2) /** * struct qcomtee - Main service struct. * @teedev: client device. * @pool: shared memory pool. * @ctx: driver private context. * @oic: context to use for the current driver invocation. * @wq: workqueue for QTEE async operations. * @xa_local_objects: array of objects exported to QTEE. * @xa_last_id: next ID to allocate. * @qtee_version: QTEE version. */ struct qcomtee { struct tee_device *teedev; struct tee_shm_pool *pool; struct tee_context *ctx; struct qcomtee_object_invoke_ctx oic; struct workqueue_struct *wq; struct xarray xa_local_objects; u32 xa_last_id; u32 qtee_version; }; void qcomtee_fetch_async_reqs(struct qcomtee_object_invoke_ctx *oic); struct qcomtee_object *qcomtee_idx_erase(struct qcomtee_object_invoke_ctx *oic, u32 idx); struct tee_shm_pool *qcomtee_shm_pool_alloc(void); void qcomtee_msg_buffers_free(struct qcomtee_object_invoke_ctx *oic); int qcomtee_msg_buffers_alloc(struct qcomtee_object_invoke_ctx *oic, struct qcomtee_arg *u); /** * qcomtee_object_do_invoke_internal() - Submit an invocation for an object. * @oic: context to use for the current invocation. * @object: object being invoked. * @op: requested operation on the object. * @u: array of arguments for the current invocation. * @result: result returned from QTEE. * * The caller is responsible for keeping track of the refcount for each * object, including @object. On return, the caller loses ownership of all * input objects of type %QCOMTEE_OBJECT_TYPE_CB. * * Return: On success, returns 0; on failure, returns < 0. */ int qcomtee_object_do_invoke_internal(struct qcomtee_object_invoke_ctx *oic, struct qcomtee_object *object, u32 op, struct qcomtee_arg *u, int *result); /** * struct qcomtee_context_data - Clients' or supplicants' context. * @qtee_objects_idr: QTEE objects in this context. * @qtee_lock: mutex for @qtee_objects_idr. * @reqs_idr: requests in this context that hold ID. * @reqs_list: FIFO for requests in PROCESSING or QUEUED state. * @reqs_lock: mutex for @reqs_idr, @reqs_list and request states. * @req_c: completion used when the supplicant is waiting for requests. * @released: state of this context. */ struct qcomtee_context_data { struct idr qtee_objects_idr; /* Synchronize access to @qtee_objects_idr. */ struct mutex qtee_lock; struct idr reqs_idr; struct list_head reqs_list; /* Synchronize access to @reqs_idr, @reqs_list and updating requests states. */ struct mutex reqs_lock; struct completion req_c; bool released; }; int qcomtee_context_add_qtee_object(struct tee_param *param, struct qcomtee_object *object, struct tee_context *ctx); int qcomtee_context_find_qtee_object(struct qcomtee_object **object, struct tee_param *param, struct tee_context *ctx); void qcomtee_context_del_qtee_object(struct tee_param *param, struct tee_context *ctx); int qcomtee_objref_to_arg(struct qcomtee_arg *arg, struct tee_param *param, struct tee_context *ctx); int qcomtee_objref_from_arg(struct tee_param *param, struct qcomtee_arg *arg, struct tee_context *ctx); /* OBJECTS: */ /* (1) User Object API. */ int is_qcomtee_user_object(struct qcomtee_object *object); void qcomtee_user_object_set_notify(struct qcomtee_object *object, bool notify); void qcomtee_requests_destroy(struct qcomtee_context_data *ctxdata); int qcomtee_user_param_to_object(struct qcomtee_object **object, struct tee_param *param, struct tee_context *ctx); int qcomtee_user_param_from_object(struct tee_param *param, struct qcomtee_object *object, struct tee_context *ctx); /** * struct qcomtee_user_object_request_data - Data for user object request. * @id: ID assigned to the request. * @object_id: Object ID being invoked by QTEE. * @op: Requested operation on object. * @np: Number of parameters in the request. */ struct qcomtee_user_object_request_data { int id; u64 object_id; u32 op; int np; }; int qcomtee_user_object_select(struct tee_context *ctx, struct tee_param *params, int num_params, void __user *uaddr, size_t size, struct qcomtee_user_object_request_data *data); int qcomtee_user_object_submit(struct tee_context *ctx, struct tee_param *params, int num_params, int req_id, int errno); /* (2) Primordial Object. */ extern struct qcomtee_object qcomtee_primordial_object; /* (3) Memory Object API. */ /* Is it a memory object using tee_shm? */ int is_qcomtee_memobj_object(struct qcomtee_object *object); /** * qcomtee_memobj_param_to_object() - OBJREF parameter to &struct qcomtee_object. * @object: object returned. * @param: TEE parameter. * @ctx: context in which the conversion should happen. * * @param is an OBJREF with %QCOMTEE_OBJREF_FLAG_MEM flags. * * Return: On success return 0 or <0 on failure. */ int qcomtee_memobj_param_to_object(struct qcomtee_object **object, struct tee_param *param, struct tee_context *ctx); /* Reverse what qcomtee_memobj_param_to_object() does. */ int qcomtee_memobj_param_from_object(struct tee_param *param, struct qcomtee_object *object, struct tee_context *ctx); /** * qcomtee_mem_object_map() - Map a memory object. * @object: memory object. * @map_object: created mapping object. * @mem_paddr: physical address of the memory. * @mem_size: size of the memory. * @perms: QTEE access permissions. * * Return: On success return 0 or <0 on failure. */ int qcomtee_mem_object_map(struct qcomtee_object *object, struct qcomtee_object **map_object, u64 *mem_paddr, u64 *mem_size, u32 *perms); #endif /* QCOMTEE_H */