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