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