550876e45dc9902c77ae177640ca4841200c3d45
[tegra/ote_partner/tlk_driver.git] / security / tlk_driver / ote_protocol.h
1 /*
2  * Copyright (c) 2013-2014 NVIDIA Corporation. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17  */
18
19 #ifndef __OTE_PROTOCOL_H__
20 #define __OTE_PROTOCOL_H__
21
22 #include "ote_types.h"
23
24 #define TE_IOCTL_MAGIC_NUMBER ('t')
25 #define TE_IOCTL_OPEN_CLIENT_SESSION \
26         _IOWR(TE_IOCTL_MAGIC_NUMBER, 0x10, union te_cmd)
27 #define TE_IOCTL_CLOSE_CLIENT_SESSION \
28         _IOWR(TE_IOCTL_MAGIC_NUMBER, 0x11, union te_cmd)
29 #define TE_IOCTL_LAUNCH_OPERATION \
30         _IOWR(TE_IOCTL_MAGIC_NUMBER, 0x14, union te_cmd)
31
32 /* ioctls using new structs (eventually to replace current ioctls) */
33 #define TE_IOCTL_OPEN_CLIENT_SESSION_COMPAT \
34         _IOWR(TE_IOCTL_MAGIC_NUMBER, 0x10, union te_cmd_compat)
35 #define TE_IOCTL_CLOSE_CLIENT_SESSION_COMPAT \
36         _IOWR(TE_IOCTL_MAGIC_NUMBER, 0x11, union te_cmd_compat)
37 #define TE_IOCTL_LAUNCH_OPERATION_COMPAT \
38         _IOWR(TE_IOCTL_MAGIC_NUMBER, 0x14, union te_cmd_compat)
39
40 #define TE_IOCTL_SS_NEW_REQ_LEGACY \
41         _IOR(TE_IOCTL_MAGIC_NUMBER,  0x20, struct te_ss_op_legacy)
42 #define TE_IOCTL_SS_REQ_COMPLETE_LEGACY \
43         _IOWR(TE_IOCTL_MAGIC_NUMBER, 0x21, struct te_ss_op_legacy)
44
45 /* ioctls using new SS structs (eventually to replace current SS ioctls) */
46 #define TE_IOCTL_SS_NEW_REQ \
47         _IOR(TE_IOCTL_MAGIC_NUMBER,  0x20, struct te_ss_op)
48 #define TE_IOCTL_SS_REQ_COMPLETE \
49         _IOWR(TE_IOCTL_MAGIC_NUMBER, 0x21, struct te_ss_op)
50
51 #define TE_IOCTL_MIN_NR _IOC_NR(TE_IOCTL_OPEN_CLIENT_SESSION)
52 #define TE_IOCTL_MAX_NR _IOC_NR(TE_IOCTL_SS_REQ_COMPLETE)
53
54 /* shared buffer is 2 pages: 1st are requests, 2nd are params */
55 #define TE_CMD_DESC_MAX (PAGE_SIZE / sizeof(struct te_request))
56 #define TE_PARAM_MAX    (PAGE_SIZE / sizeof(struct te_oper_param))
57
58 #define TE_CMD_DESC_MAX_COMPAT \
59         (PAGE_SIZE / sizeof(struct te_request_compat))
60 #define TE_PARAM_MAX_COMPAT \
61         (PAGE_SIZE / sizeof(struct te_oper_param_compat))
62
63 #define MAX_EXT_SMC_ARGS        12
64
65 extern struct mutex smc_lock;
66 extern struct tlk_device tlk_dev;
67
68 uint32_t _tlk_generic_smc(uint32_t arg0, uintptr_t arg1, uintptr_t arg2);
69 uint32_t tlk_generic_smc(uint32_t arg0, uintptr_t arg1, uintptr_t arg2);
70 uint32_t _tlk_extended_smc(uintptr_t *args);
71 uint32_t tlk_extended_smc(uintptr_t *args);
72 void tlk_irq_handler(void);
73
74 /* errors returned by secure world in reponse to SMC calls */
75 enum {
76         TE_ERROR_PREEMPT_BY_IRQ = 0xFFFFFFFD,
77         TE_ERROR_PREEMPT_BY_FS = 0xFFFFFFFE,
78 };
79
80 struct tlk_device {
81         struct te_request *req_addr;
82         dma_addr_t req_addr_phys;
83         struct te_oper_param *param_addr;
84         dma_addr_t param_addr_phys;
85
86         struct te_request_compat *req_addr_compat;
87         struct te_oper_param_compat *param_addr_compat;
88
89         char *req_param_buf;
90
91         unsigned long *param_bitmap;
92
93         struct list_head used_cmd_list;
94         struct list_head free_cmd_list;
95 };
96
97 struct te_cmd_req_desc {
98         struct te_request *req_addr;
99         struct list_head list;
100 };
101
102 struct te_cmd_req_desc_compat {
103         struct te_request_compat *req_addr;
104         struct list_head list;
105 };
106
107 struct te_shmem_desc {
108         struct list_head list;
109         void *buffer;
110         size_t size;
111         unsigned int mem_type;
112         struct page **pages;
113         unsigned int nr_pages;
114 };
115
116 struct tlk_context {
117         struct tlk_device *dev;
118         struct list_head shmem_alloc_list;
119 };
120
121 enum {
122         /* Trusted Application Calls */
123         TE_SMC_OPEN_SESSION             = 0x30000001,
124         TE_SMC_CLOSE_SESSION            = 0x30000002,
125         TE_SMC_LAUNCH_OPERATION         = 0x30000003,
126
127         /* Trusted OS calls */
128         TE_SMC_REGISTER_REQ_BUF         = 0x32000002,
129         TE_SMC_REGISTER_IRQ_HANDLER     = 0x32000004,
130         TE_SMC_NS_IRQ_DONE              = 0x32000005,
131         TE_SMC_INIT_LOGGER              = 0x32000007,
132         TE_SMC_SS_REGISTER_HANDLER_LEGACY       = 0x32000008,
133         TE_SMC_SS_REQ_COMPLETE          = 0x32000009,
134         TE_SMC_SS_REGISTER_HANDLER      = 0x32000010,
135
136         /* SIP (SOC specific) calls.  */
137         TE_SMC_PROGRAM_VPR              = 0x82000003,
138 };
139
140 enum {
141         TE_PARAM_TYPE_NONE      = 0,
142         TE_PARAM_TYPE_INT_RO    = 1,
143         TE_PARAM_TYPE_INT_RW    = 2,
144         TE_PARAM_TYPE_MEM_RO    = 3,
145         TE_PARAM_TYPE_MEM_RW    = 4,
146 };
147
148 struct te_oper_param {
149         uint32_t index;
150         uint32_t type;
151         union {
152                 struct {
153                         uint32_t val;
154                 } Int;
155                 struct {
156                         void  *base;
157                         uint32_t len;
158                 } Mem;
159         } u;
160         void *next_ptr_user;
161 };
162
163 struct te_oper_param_compat {
164         uint32_t index;
165         uint32_t type;
166         union {
167                 struct {
168                         uint32_t val;
169                 } Int;
170                 struct {
171                         uint64_t base;
172                         uint32_t len;
173                 } Mem;
174         } u;
175         uint64_t next_ptr_user;
176 };
177
178 struct te_operation {
179         uint32_t command;
180         struct te_oper_param *list_head;
181         /* Maintain a pointer to tail of list to easily add new param node */
182         struct te_oper_param *list_tail;
183         uint32_t list_count;
184         uint32_t status;
185         uint32_t iterface_side;
186 };
187
188 struct te_service_id {
189         uint32_t time_low;
190         uint16_t time_mid;
191         uint16_t time_hi_and_version;
192         uint8_t clock_seq_and_node[8];
193 };
194
195 /*
196  * OpenSession
197  */
198 struct te_opensession {
199         struct te_service_id dest_uuid;
200         struct te_operation operation;
201         uint32_t answer;
202 };
203
204 /*
205  * CloseSession
206  */
207 struct te_closesession {
208         uint32_t        session_id;
209         uint32_t        answer;
210 };
211
212 /*
213  * LaunchOperation
214  */
215 struct te_launchop {
216         uint32_t                session_id;
217         struct te_operation     operation;
218         uint32_t                answer;
219 };
220
221 union te_cmd {
222         struct te_opensession   opensession;
223         struct te_closesession  closesession;
224         struct te_launchop      launchop;
225 };
226
227 /*
228  * Compat versions of the original structs (eventually to replace
229  * the old structs, once the lib/TLK kernel changes are in).
230  */
231 struct te_operation_compat {
232         uint32_t        command;
233         uint32_t        status;
234         uint64_t        list_head;
235         uint64_t        list_tail;
236         uint32_t        list_count;
237         uint32_t        interface_side;
238 };
239
240 /*
241  * OpenSession
242  */
243 struct te_opensession_compat {
244         struct te_service_id            dest_uuid;
245         struct te_operation_compat      operation;
246         uint64_t                        answer;
247 };
248
249 /*
250  * CloseSession
251  */
252 struct te_closesession_compat {
253         uint32_t        session_id;
254         uint64_t        answer;
255 };
256
257 /*
258  * LaunchOperation
259  */
260 struct te_launchop_compat {
261         uint32_t                        session_id;
262         struct te_operation_compat      operation;
263         uint64_t                        answer;
264 };
265
266 union te_cmd_compat {
267         struct te_opensession_compat    opensession;
268         struct te_closesession_compat   closesession;
269         struct te_launchop_compat       launchop;
270 };
271
272 struct te_request {
273         uint32_t                type;
274         uint32_t                session_id;
275         uint32_t                command_id;
276         struct te_oper_param    *params;
277         uint32_t                params_size;
278         uint32_t                dest_uuid[4];
279         uint32_t                result;
280         uint32_t                result_origin;
281 };
282
283 struct te_request_compat {
284         uint32_t                type;
285         uint32_t                session_id;
286         uint32_t                command_id;
287         uint64_t                params;
288         uint32_t                params_size;
289         uint32_t                dest_uuid[4];
290         uint32_t                result;
291         uint32_t                result_origin;
292 };
293
294 struct te_answer {
295         uint32_t        result;
296         uint32_t        session_id;
297         uint32_t        result_origin;
298 };
299
300 void te_open_session(struct te_opensession *cmd,
301         struct te_request *request,
302         struct tlk_context *context);
303
304 void te_close_session(struct te_closesession *cmd,
305         struct te_request *request,
306         struct tlk_context *context);
307
308 void te_launch_operation(struct te_launchop *cmd,
309         struct te_request *request,
310         struct tlk_context *context);
311
312 void te_open_session_compat(struct te_opensession_compat *cmd,
313         struct te_request_compat *request,
314         struct tlk_context *context);
315
316 void te_close_session_compat(struct te_closesession_compat *cmd,
317         struct te_request_compat *request,
318         struct tlk_context *context);
319
320 void te_launch_operation_compat(struct te_launchop_compat *cmd,
321         struct te_request_compat *request,
322         struct tlk_context *context);
323
324 #define SS_OP_MAX_DATA_SIZE     0x1000
325 struct te_ss_op {
326         uint32_t        req_size;
327         uint8_t         data[SS_OP_MAX_DATA_SIZE];
328 };
329
330 struct te_ss_op_legacy {
331         uint8_t         data[SS_OP_MAX_DATA_SIZE];
332 };
333
334 int te_handle_ss_ioctl_legacy(struct file *file, unsigned int ioctl_num,
335                 unsigned long ioctl_param);
336 int te_handle_ss_ioctl(struct file *file, unsigned int ioctl_num,
337                 unsigned long ioctl_param);
338 int te_handle_fs_ioctl(struct file *file, unsigned int ioctl_num,
339                 unsigned long ioctl_param);
340 void ote_print_logs(void);
341 void tlk_ss_op(void);
342
343 #endif