1d6e29083SAmirreza Zarrabi /* SPDX-License-Identifier: GPL-2.0-only */ 2d6e29083SAmirreza Zarrabi /* 3d6e29083SAmirreza Zarrabi * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 4d6e29083SAmirreza Zarrabi */ 5d6e29083SAmirreza Zarrabi 6d6e29083SAmirreza Zarrabi #ifndef QCOMTEE_H 7d6e29083SAmirreza Zarrabi #define QCOMTEE_H 8d6e29083SAmirreza Zarrabi 9d6e29083SAmirreza Zarrabi #include <linux/kobject.h> 10d6e29083SAmirreza Zarrabi #include <linux/tee_core.h> 11d6e29083SAmirreza Zarrabi 12d6e29083SAmirreza Zarrabi #include "qcomtee_msg.h" 13d6e29083SAmirreza Zarrabi #include "qcomtee_object.h" 14d6e29083SAmirreza Zarrabi 15d6e29083SAmirreza Zarrabi /* Flags relating to object reference. */ 16d6e29083SAmirreza Zarrabi #define QCOMTEE_OBJREF_FLAG_TEE BIT(0) 17d6e29083SAmirreza Zarrabi #define QCOMTEE_OBJREF_FLAG_USER BIT(1) 18*87ab676dSAmirreza Zarrabi #define QCOMTEE_OBJREF_FLAG_MEM BIT(2) 19d6e29083SAmirreza Zarrabi 20d6e29083SAmirreza Zarrabi /** 21d6e29083SAmirreza Zarrabi * struct qcomtee - Main service struct. 22d6e29083SAmirreza Zarrabi * @teedev: client device. 23d6e29083SAmirreza Zarrabi * @pool: shared memory pool. 24d6e29083SAmirreza Zarrabi * @ctx: driver private context. 25d6e29083SAmirreza Zarrabi * @oic: context to use for the current driver invocation. 26d6e29083SAmirreza Zarrabi * @wq: workqueue for QTEE async operations. 27d6e29083SAmirreza Zarrabi * @xa_local_objects: array of objects exported to QTEE. 28d6e29083SAmirreza Zarrabi * @xa_last_id: next ID to allocate. 29d6e29083SAmirreza Zarrabi * @qtee_version: QTEE version. 30d6e29083SAmirreza Zarrabi */ 31d6e29083SAmirreza Zarrabi struct qcomtee { 32d6e29083SAmirreza Zarrabi struct tee_device *teedev; 33d6e29083SAmirreza Zarrabi struct tee_shm_pool *pool; 34d6e29083SAmirreza Zarrabi struct tee_context *ctx; 35d6e29083SAmirreza Zarrabi struct qcomtee_object_invoke_ctx oic; 36d6e29083SAmirreza Zarrabi struct workqueue_struct *wq; 37d6e29083SAmirreza Zarrabi struct xarray xa_local_objects; 38d6e29083SAmirreza Zarrabi u32 xa_last_id; 39d6e29083SAmirreza Zarrabi u32 qtee_version; 40d6e29083SAmirreza Zarrabi }; 41d6e29083SAmirreza Zarrabi 42d6e29083SAmirreza Zarrabi void qcomtee_fetch_async_reqs(struct qcomtee_object_invoke_ctx *oic); 43d6e29083SAmirreza Zarrabi struct qcomtee_object *qcomtee_idx_erase(struct qcomtee_object_invoke_ctx *oic, 44d6e29083SAmirreza Zarrabi u32 idx); 45d6e29083SAmirreza Zarrabi 46d6e29083SAmirreza Zarrabi struct tee_shm_pool *qcomtee_shm_pool_alloc(void); 47d6e29083SAmirreza Zarrabi void qcomtee_msg_buffers_free(struct qcomtee_object_invoke_ctx *oic); 48d6e29083SAmirreza Zarrabi int qcomtee_msg_buffers_alloc(struct qcomtee_object_invoke_ctx *oic, 49d6e29083SAmirreza Zarrabi struct qcomtee_arg *u); 50d6e29083SAmirreza Zarrabi 51d6e29083SAmirreza Zarrabi /** 52d6e29083SAmirreza Zarrabi * qcomtee_object_do_invoke_internal() - Submit an invocation for an object. 53d6e29083SAmirreza Zarrabi * @oic: context to use for the current invocation. 54d6e29083SAmirreza Zarrabi * @object: object being invoked. 55d6e29083SAmirreza Zarrabi * @op: requested operation on the object. 56d6e29083SAmirreza Zarrabi * @u: array of arguments for the current invocation. 57d6e29083SAmirreza Zarrabi * @result: result returned from QTEE. 58d6e29083SAmirreza Zarrabi * 59d6e29083SAmirreza Zarrabi * The caller is responsible for keeping track of the refcount for each 60d6e29083SAmirreza Zarrabi * object, including @object. On return, the caller loses ownership of all 61d6e29083SAmirreza Zarrabi * input objects of type %QCOMTEE_OBJECT_TYPE_CB. 62d6e29083SAmirreza Zarrabi * 63d6e29083SAmirreza Zarrabi * Return: On success, returns 0; on failure, returns < 0. 64d6e29083SAmirreza Zarrabi */ 65d6e29083SAmirreza Zarrabi int qcomtee_object_do_invoke_internal(struct qcomtee_object_invoke_ctx *oic, 66d6e29083SAmirreza Zarrabi struct qcomtee_object *object, u32 op, 67d6e29083SAmirreza Zarrabi struct qcomtee_arg *u, int *result); 68d6e29083SAmirreza Zarrabi 69d6e29083SAmirreza Zarrabi /** 70d6e29083SAmirreza Zarrabi * struct qcomtee_context_data - Clients' or supplicants' context. 71d6e29083SAmirreza Zarrabi * @qtee_objects_idr: QTEE objects in this context. 72d6e29083SAmirreza Zarrabi * @qtee_lock: mutex for @qtee_objects_idr. 73d6e29083SAmirreza Zarrabi * @reqs_idr: requests in this context that hold ID. 74d6e29083SAmirreza Zarrabi * @reqs_list: FIFO for requests in PROCESSING or QUEUED state. 75d6e29083SAmirreza Zarrabi * @reqs_lock: mutex for @reqs_idr, @reqs_list and request states. 76d6e29083SAmirreza Zarrabi * @req_c: completion used when the supplicant is waiting for requests. 77d6e29083SAmirreza Zarrabi * @released: state of this context. 78d6e29083SAmirreza Zarrabi */ 79d6e29083SAmirreza Zarrabi struct qcomtee_context_data { 80d6e29083SAmirreza Zarrabi struct idr qtee_objects_idr; 81d6e29083SAmirreza Zarrabi /* Synchronize access to @qtee_objects_idr. */ 82d6e29083SAmirreza Zarrabi struct mutex qtee_lock; 83d6e29083SAmirreza Zarrabi 84d6e29083SAmirreza Zarrabi struct idr reqs_idr; 85d6e29083SAmirreza Zarrabi struct list_head reqs_list; 86d6e29083SAmirreza Zarrabi /* Synchronize access to @reqs_idr, @reqs_list and updating requests states. */ 87d6e29083SAmirreza Zarrabi struct mutex reqs_lock; 88d6e29083SAmirreza Zarrabi 89d6e29083SAmirreza Zarrabi struct completion req_c; 90d6e29083SAmirreza Zarrabi 91d6e29083SAmirreza Zarrabi bool released; 92d6e29083SAmirreza Zarrabi }; 93d6e29083SAmirreza Zarrabi 94d6e29083SAmirreza Zarrabi int qcomtee_context_add_qtee_object(struct tee_param *param, 95d6e29083SAmirreza Zarrabi struct qcomtee_object *object, 96d6e29083SAmirreza Zarrabi struct tee_context *ctx); 97d6e29083SAmirreza Zarrabi int qcomtee_context_find_qtee_object(struct qcomtee_object **object, 98d6e29083SAmirreza Zarrabi struct tee_param *param, 99d6e29083SAmirreza Zarrabi struct tee_context *ctx); 100d6e29083SAmirreza Zarrabi void qcomtee_context_del_qtee_object(struct tee_param *param, 101d6e29083SAmirreza Zarrabi struct tee_context *ctx); 102d6e29083SAmirreza Zarrabi 103d6e29083SAmirreza Zarrabi int qcomtee_objref_to_arg(struct qcomtee_arg *arg, struct tee_param *param, 104d6e29083SAmirreza Zarrabi struct tee_context *ctx); 105d6e29083SAmirreza Zarrabi int qcomtee_objref_from_arg(struct tee_param *param, struct qcomtee_arg *arg, 106d6e29083SAmirreza Zarrabi struct tee_context *ctx); 107d6e29083SAmirreza Zarrabi 108d6e29083SAmirreza Zarrabi /* OBJECTS: */ 109d6e29083SAmirreza Zarrabi 110d6e29083SAmirreza Zarrabi /* (1) User Object API. */ 111d6e29083SAmirreza Zarrabi 112d6e29083SAmirreza Zarrabi int is_qcomtee_user_object(struct qcomtee_object *object); 113d6e29083SAmirreza Zarrabi void qcomtee_user_object_set_notify(struct qcomtee_object *object, bool notify); 114d6e29083SAmirreza Zarrabi void qcomtee_requests_destroy(struct qcomtee_context_data *ctxdata); 115d6e29083SAmirreza Zarrabi int qcomtee_user_param_to_object(struct qcomtee_object **object, 116d6e29083SAmirreza Zarrabi struct tee_param *param, 117d6e29083SAmirreza Zarrabi struct tee_context *ctx); 118d6e29083SAmirreza Zarrabi int qcomtee_user_param_from_object(struct tee_param *param, 119d6e29083SAmirreza Zarrabi struct qcomtee_object *object, 120d6e29083SAmirreza Zarrabi struct tee_context *ctx); 121d6e29083SAmirreza Zarrabi 122d6e29083SAmirreza Zarrabi /** 123d6e29083SAmirreza Zarrabi * struct qcomtee_user_object_request_data - Data for user object request. 124d6e29083SAmirreza Zarrabi * @id: ID assigned to the request. 125d6e29083SAmirreza Zarrabi * @object_id: Object ID being invoked by QTEE. 126d6e29083SAmirreza Zarrabi * @op: Requested operation on object. 127d6e29083SAmirreza Zarrabi * @np: Number of parameters in the request. 128d6e29083SAmirreza Zarrabi */ 129d6e29083SAmirreza Zarrabi struct qcomtee_user_object_request_data { 130d6e29083SAmirreza Zarrabi int id; 131d6e29083SAmirreza Zarrabi u64 object_id; 132d6e29083SAmirreza Zarrabi u32 op; 133d6e29083SAmirreza Zarrabi int np; 134d6e29083SAmirreza Zarrabi }; 135d6e29083SAmirreza Zarrabi 136d6e29083SAmirreza Zarrabi int qcomtee_user_object_select(struct tee_context *ctx, 137d6e29083SAmirreza Zarrabi struct tee_param *params, int num_params, 138d6e29083SAmirreza Zarrabi void __user *uaddr, size_t size, 139d6e29083SAmirreza Zarrabi struct qcomtee_user_object_request_data *data); 140d6e29083SAmirreza Zarrabi int qcomtee_user_object_submit(struct tee_context *ctx, 141d6e29083SAmirreza Zarrabi struct tee_param *params, int num_params, 142d6e29083SAmirreza Zarrabi int req_id, int errno); 143d6e29083SAmirreza Zarrabi 1440f7bfdcbSAmirreza Zarrabi /* (2) Primordial Object. */ 1450f7bfdcbSAmirreza Zarrabi extern struct qcomtee_object qcomtee_primordial_object; 1460f7bfdcbSAmirreza Zarrabi 147*87ab676dSAmirreza Zarrabi /* (3) Memory Object API. */ 148*87ab676dSAmirreza Zarrabi 149*87ab676dSAmirreza Zarrabi /* Is it a memory object using tee_shm? */ 150*87ab676dSAmirreza Zarrabi int is_qcomtee_memobj_object(struct qcomtee_object *object); 151*87ab676dSAmirreza Zarrabi 152*87ab676dSAmirreza Zarrabi /** 153*87ab676dSAmirreza Zarrabi * qcomtee_memobj_param_to_object() - OBJREF parameter to &struct qcomtee_object. 154*87ab676dSAmirreza Zarrabi * @object: object returned. 155*87ab676dSAmirreza Zarrabi * @param: TEE parameter. 156*87ab676dSAmirreza Zarrabi * @ctx: context in which the conversion should happen. 157*87ab676dSAmirreza Zarrabi * 158*87ab676dSAmirreza Zarrabi * @param is an OBJREF with %QCOMTEE_OBJREF_FLAG_MEM flags. 159*87ab676dSAmirreza Zarrabi * 160*87ab676dSAmirreza Zarrabi * Return: On success return 0 or <0 on failure. 161*87ab676dSAmirreza Zarrabi */ 162*87ab676dSAmirreza Zarrabi int qcomtee_memobj_param_to_object(struct qcomtee_object **object, 163*87ab676dSAmirreza Zarrabi struct tee_param *param, 164*87ab676dSAmirreza Zarrabi struct tee_context *ctx); 165*87ab676dSAmirreza Zarrabi 166*87ab676dSAmirreza Zarrabi /* Reverse what qcomtee_memobj_param_to_object() does. */ 167*87ab676dSAmirreza Zarrabi int qcomtee_memobj_param_from_object(struct tee_param *param, 168*87ab676dSAmirreza Zarrabi struct qcomtee_object *object, 169*87ab676dSAmirreza Zarrabi struct tee_context *ctx); 170*87ab676dSAmirreza Zarrabi 171*87ab676dSAmirreza Zarrabi /** 172*87ab676dSAmirreza Zarrabi * qcomtee_mem_object_map() - Map a memory object. 173*87ab676dSAmirreza Zarrabi * @object: memory object. 174*87ab676dSAmirreza Zarrabi * @map_object: created mapping object. 175*87ab676dSAmirreza Zarrabi * @mem_paddr: physical address of the memory. 176*87ab676dSAmirreza Zarrabi * @mem_size: size of the memory. 177*87ab676dSAmirreza Zarrabi * @perms: QTEE access permissions. 178*87ab676dSAmirreza Zarrabi * 179*87ab676dSAmirreza Zarrabi * Return: On success return 0 or <0 on failure. 180*87ab676dSAmirreza Zarrabi */ 181*87ab676dSAmirreza Zarrabi int qcomtee_mem_object_map(struct qcomtee_object *object, 182*87ab676dSAmirreza Zarrabi struct qcomtee_object **map_object, u64 *mem_paddr, 183*87ab676dSAmirreza Zarrabi u64 *mem_size, u32 *perms); 184*87ab676dSAmirreza Zarrabi 185d6e29083SAmirreza Zarrabi #endif /* QCOMTEE_H */ 186