xref: /linux/drivers/tee/qcomtee/qcomtee.h (revision 38057e323657695ec8f814aff0cdd1c7e00d3e9b)
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