[FOSS_TLK]security: tlk_driver: new ss protocol support
[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 /* secure storage ioctl */
52 #define TE_IOCTL_SS_CMD \
53         _IOR(TE_IOCTL_MAGIC_NUMBER,  0x30, int)
54
55 #define TE_IOCTL_SS_CMD_GET_NEW_REQ     1
56 #define TE_IOCTL_SS_CMD_REQ_COMPLETE    2
57
58 #define TE_IOCTL_MIN_NR _IOC_NR(TE_IOCTL_OPEN_CLIENT_SESSION)
59 #define TE_IOCTL_MAX_NR _IOC_NR(TE_IOCTL_SS_CMD)
60
61 /* shared buffer is 2 pages: 1st are requests, 2nd are params */
62 #define TE_CMD_DESC_MAX (PAGE_SIZE / sizeof(struct te_request))
63 #define TE_PARAM_MAX    (PAGE_SIZE / sizeof(struct te_oper_param))
64
65 #define TE_CMD_DESC_MAX_COMPAT \
66         (PAGE_SIZE / sizeof(struct te_request_compat))
67 #define TE_PARAM_MAX_COMPAT \
68         (PAGE_SIZE / sizeof(struct te_oper_param_compat))
69
70 #define MAX_EXT_SMC_ARGS        12
71
72 extern struct mutex smc_lock;
73 extern struct tlk_device tlk_dev;
74
75 uint32_t _tlk_generic_smc(uint32_t arg0, uintptr_t arg1, uintptr_t arg2);
76 uint32_t tlk_generic_smc(uint32_t arg0, uintptr_t arg1, uintptr_t arg2);
77 uint32_t _tlk_extended_smc(uintptr_t *args);
78 uint32_t tlk_extended_smc(uintptr_t *args);
79 void tlk_irq_handler(void);
80
81 /* errors returned by secure world in reponse to SMC calls */
82 enum {
83         TE_ERROR_PREEMPT_BY_IRQ = 0xFFFFFFFD,
84         TE_ERROR_PREEMPT_BY_FS = 0xFFFFFFFE,
85 };
86
87 struct tlk_device {
88         struct te_request *req_addr;
89         dma_addr_t req_addr_phys;
90         struct te_oper_param *param_addr;
91         dma_addr_t param_addr_phys;
92
93         struct te_request_compat *req_addr_compat;
94         struct te_oper_param_compat *param_addr_compat;
95
96         char *req_param_buf;
97
98         unsigned long *param_bitmap;
99
100         struct list_head used_cmd_list;
101         struct list_head free_cmd_list;
102 };
103
104 struct te_cmd_req_desc {
105         struct te_request *req_addr;
106         struct list_head list;
107 };
108
109 struct te_cmd_req_desc_compat {
110         struct te_request_compat *req_addr;
111         struct list_head list;
112 };
113
114 struct te_shmem_desc {
115         struct list_head list;
116         uint32_t type;
117         bool active;
118         uint32_t session_id;
119         void *buffer;
120         size_t size;
121         struct page **pages;
122         unsigned int nr_pages;
123 };
124
125 struct tlk_context {
126         struct tlk_device *dev;
127         struct list_head temp_shmem_list;
128         struct list_head persist_shmem_list;
129 };
130
131 enum {
132         /* Trusted Application Calls */
133         TE_SMC_OPEN_SESSION             = 0x30000001,
134         TE_SMC_CLOSE_SESSION            = 0x30000002,
135         TE_SMC_LAUNCH_OPERATION         = 0x30000003,
136
137         /* Trusted OS calls */
138         TE_SMC_REGISTER_REQ_BUF         = 0x32000002,
139         TE_SMC_REGISTER_IRQ_HANDLER     = 0x32000004,
140         TE_SMC_NS_IRQ_DONE              = 0x32000005,
141         TE_SMC_INIT_LOGGER              = 0x32000007,
142         TE_SMC_SS_REGISTER_HANDLER_LEGACY       = 0x32000008,
143         TE_SMC_SS_REQ_COMPLETE          = 0x32000009,
144         TE_SMC_SS_REGISTER_HANDLER      = 0x32000010,
145
146         /* SIP (SOC specific) calls.  */
147         TE_SMC_PROGRAM_VPR              = 0x82000003,
148 };
149
150 enum {
151         TE_PARAM_TYPE_NONE              = 0x0,
152         TE_PARAM_TYPE_INT_RO            = 0x1,
153         TE_PARAM_TYPE_INT_RW            = 0x2,
154         TE_PARAM_TYPE_MEM_RO            = 0x3,
155         TE_PARAM_TYPE_MEM_RW            = 0x4,
156         TE_PARAM_TYPE_PERSIST_MEM_RO    = 0x100,
157         TE_PARAM_TYPE_PERSIST_MEM_RW    = 0x101,
158 };
159
160 struct te_oper_param {
161         uint32_t index;
162         uint32_t type;
163         union {
164                 struct {
165                         uint32_t val;
166                 } Int;
167                 struct {
168                         void  *base;
169                         uint32_t len;
170                 } Mem;
171         } u;
172         void *next_ptr_user;
173 };
174
175 struct te_oper_param_compat {
176         uint32_t index;
177         uint32_t type;
178         union {
179                 struct {
180                         uint32_t val;
181                 } Int;
182                 struct {
183                         uint64_t base;
184                         uint32_t len;
185                 } Mem;
186         } u;
187         uint64_t next_ptr_user;
188 };
189
190 struct te_operation {
191         uint32_t command;
192         struct te_oper_param *list_head;
193         /* Maintain a pointer to tail of list to easily add new param node */
194         struct te_oper_param *list_tail;
195         uint32_t list_count;
196         uint32_t status;
197         uint32_t iterface_side;
198 };
199
200 struct te_service_id {
201         uint32_t time_low;
202         uint16_t time_mid;
203         uint16_t time_hi_and_version;
204         uint8_t clock_seq_and_node[8];
205 };
206
207 /*
208  * OpenSession
209  */
210 struct te_opensession {
211         struct te_service_id dest_uuid;
212         struct te_operation operation;
213         uint32_t answer;
214 };
215
216 /*
217  * CloseSession
218  */
219 struct te_closesession {
220         uint32_t        session_id;
221         uint32_t        answer;
222 };
223
224 /*
225  * LaunchOperation
226  */
227 struct te_launchop {
228         uint32_t                session_id;
229         struct te_operation     operation;
230         uint32_t                answer;
231 };
232
233 union te_cmd {
234         struct te_opensession   opensession;
235         struct te_closesession  closesession;
236         struct te_launchop      launchop;
237 };
238
239 /*
240  * Compat versions of the original structs (eventually to replace
241  * the old structs, once the lib/TLK kernel changes are in).
242  */
243 struct te_operation_compat {
244         uint32_t        command;
245         uint32_t        status;
246         uint64_t        list_head;
247         uint64_t        list_tail;
248         uint32_t        list_count;
249         uint32_t        interface_side;
250 };
251
252 /*
253  * OpenSession
254  */
255 struct te_opensession_compat {
256         struct te_service_id            dest_uuid;
257         struct te_operation_compat      operation;
258         uint64_t                        answer;
259 };
260
261 /*
262  * CloseSession
263  */
264 struct te_closesession_compat {
265         uint32_t        session_id;
266         uint64_t        answer;
267 };
268
269 /*
270  * LaunchOperation
271  */
272 struct te_launchop_compat {
273         uint32_t                        session_id;
274         struct te_operation_compat      operation;
275         uint64_t                        answer;
276 };
277
278 union te_cmd_compat {
279         struct te_opensession_compat    opensession;
280         struct te_closesession_compat   closesession;
281         struct te_launchop_compat       launchop;
282 };
283
284 struct te_request {
285         uint32_t                type;
286         uint32_t                session_id;
287         uint32_t                command_id;
288         struct te_oper_param    *params;
289         uint32_t                params_size;
290         uint32_t                dest_uuid[4];
291         uint32_t                result;
292         uint32_t                result_origin;
293 };
294
295 struct te_request_compat {
296         uint32_t                type;
297         uint32_t                session_id;
298         uint32_t                command_id;
299         uint64_t                params;
300         uint32_t                params_size;
301         uint32_t                dest_uuid[4];
302         uint32_t                result;
303         uint32_t                result_origin;
304 };
305
306 struct te_answer {
307         uint32_t        result;
308         uint32_t        session_id;
309         uint32_t        result_origin;
310 };
311
312 void te_open_session(struct te_opensession *cmd,
313         struct te_request *request,
314         struct tlk_context *context);
315
316 void te_close_session(struct te_closesession *cmd,
317         struct te_request *request,
318         struct tlk_context *context);
319
320 void te_launch_operation(struct te_launchop *cmd,
321         struct te_request *request,
322         struct tlk_context *context);
323
324 void te_open_session_compat(struct te_opensession_compat *cmd,
325         struct te_request_compat *request,
326         struct tlk_context *context);
327
328 void te_close_session_compat(struct te_closesession_compat *cmd,
329         struct te_request_compat *request,
330         struct tlk_context *context);
331
332 void te_launch_operation_compat(struct te_launchop_compat *cmd,
333         struct te_request_compat *request,
334         struct tlk_context *context);
335
336 #define SS_OP_MAX_DATA_SIZE     0x1000
337 struct te_ss_op {
338         uint32_t        req_size;
339         uint8_t         data[SS_OP_MAX_DATA_SIZE];
340 };
341
342 struct te_ss_op_legacy {
343         uint8_t         data[SS_OP_MAX_DATA_SIZE];
344 };
345
346 int te_handle_ss_ioctl_legacy(struct file *file, unsigned int ioctl_num,
347                 unsigned long ioctl_param);
348 int te_handle_ss_ioctl(struct file *file, unsigned int ioctl_num,
349                 unsigned long ioctl_param);
350 int te_handle_fs_ioctl(struct file *file, unsigned int ioctl_num,
351                 unsigned long ioctl_param);
352 void ote_print_logs(void);
353 void tlk_ss_op(void);
354
355 #endif