864bf8f2b801f77faac13edacfa2f4cecedcd106
[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 /* secure storage ioctl */
33 #define TE_IOCTL_SS_CMD \
34         _IOR(TE_IOCTL_MAGIC_NUMBER,  0x30, int)
35
36 #define TE_IOCTL_SS_CMD_GET_NEW_REQ     1
37 #define TE_IOCTL_SS_CMD_REQ_COMPLETE    2
38
39 #define TE_IOCTL_MIN_NR _IOC_NR(TE_IOCTL_OPEN_CLIENT_SESSION)
40 #define TE_IOCTL_MAX_NR _IOC_NR(TE_IOCTL_SS_CMD)
41
42 /* shared buffer is 2 pages: 1st are requests, 2nd are params */
43 #define TE_CMD_DESC_MAX (PAGE_SIZE / sizeof(struct te_request))
44 #define TE_PARAM_MAX    (PAGE_SIZE / sizeof(struct te_oper_param))
45
46 #define MAX_EXT_SMC_ARGS        12
47
48 extern struct mutex smc_lock;
49 extern struct tlk_device tlk_dev;
50
51 uint32_t _tlk_generic_smc(uint32_t arg0, uintptr_t arg1, uintptr_t arg2);
52 uint32_t tlk_generic_smc(uint32_t arg0, uintptr_t arg1, uintptr_t arg2);
53 uint32_t _tlk_extended_smc(uintptr_t *args);
54 uint32_t tlk_extended_smc(uintptr_t *args);
55 void tlk_irq_handler(void);
56
57 /* errors returned by secure world in reponse to SMC calls */
58 enum {
59         TE_ERROR_PREEMPT_BY_IRQ = 0xFFFFFFFD,
60         TE_ERROR_PREEMPT_BY_FS = 0xFFFFFFFE,
61 };
62
63 struct tlk_device {
64         struct te_request *req_addr;
65         dma_addr_t req_addr_phys;
66         struct te_oper_param *param_addr;
67         dma_addr_t param_addr_phys;
68
69         char *req_param_buf;
70
71         unsigned long *param_bitmap;
72
73         struct list_head used_cmd_list;
74         struct list_head free_cmd_list;
75 };
76
77 struct te_cmd_req_desc {
78         struct te_request *req_addr;
79         struct list_head list;
80 };
81
82 struct te_shmem_desc {
83         struct list_head list;
84         uint32_t type;
85         bool active;
86         uint32_t session_id;
87         void *buffer;
88         size_t size;
89         struct page **pages;
90         unsigned int nr_pages;
91 };
92
93 struct tlk_context {
94         struct tlk_device *dev;
95         struct list_head temp_shmem_list;
96         struct list_head persist_shmem_list;
97 };
98
99 enum {
100         /* Trusted Application Calls */
101         TE_SMC_OPEN_SESSION             = 0x30000001,
102         TE_SMC_CLOSE_SESSION            = 0x30000002,
103         TE_SMC_LAUNCH_OPERATION         = 0x30000003,
104
105         /* Trusted OS calls */
106         TE_SMC_REGISTER_REQ_BUF         = 0x32000002,
107         TE_SMC_INIT_LOGGER              = 0x32000007,
108         TE_SMC_SS_REQ_COMPLETE          = 0x32000009,
109         TE_SMC_SS_REGISTER_HANDLER      = 0x32000010,
110         TE_SMC_RESTART                  = 0x3C000000,
111
112         /* SIP (SOC specific) calls.  */
113         TE_SMC_PROGRAM_VPR              = 0x82000003,
114 };
115
116 enum {
117         TE_PARAM_TYPE_NONE              = 0x0,
118         TE_PARAM_TYPE_INT_RO            = 0x1,
119         TE_PARAM_TYPE_INT_RW            = 0x2,
120         TE_PARAM_TYPE_MEM_RO            = 0x3,
121         TE_PARAM_TYPE_MEM_RW            = 0x4,
122         TE_PARAM_TYPE_PERSIST_MEM_RO    = 0x100,
123         TE_PARAM_TYPE_PERSIST_MEM_RW    = 0x101,
124 };
125
126 struct te_oper_param {
127         uint32_t index;
128         uint32_t type;
129         union {
130                 struct {
131                         uint32_t val;
132                 } Int;
133                 struct {
134                         uint64_t base;
135                         uint32_t len;
136                 } Mem;
137         } u;
138         uint64_t next_ptr_user;
139 };
140
141 struct te_service_id {
142         uint32_t time_low;
143         uint16_t time_mid;
144         uint16_t time_hi_and_version;
145         uint8_t clock_seq_and_node[8];
146 };
147
148 struct te_operation {
149         uint32_t        command;
150         uint32_t        status;
151         uint64_t        list_head;
152         uint64_t        list_tail;
153         uint32_t        list_count;
154         uint32_t        interface_side;
155 };
156
157 /*
158  * OpenSession
159  */
160 struct te_opensession {
161         struct te_service_id    dest_uuid;
162         struct te_operation     operation;
163         uint64_t                answer;
164 };
165
166 /*
167  * CloseSession
168  */
169 struct te_closesession {
170         uint32_t        session_id;
171         uint64_t        answer;
172 };
173
174 /*
175  * LaunchOperation
176  */
177 struct te_launchop {
178         uint32_t                session_id;
179         struct te_operation     operation;
180         uint64_t                answer;
181 };
182
183 union te_cmd {
184         struct te_opensession   opensession;
185         struct te_closesession  closesession;
186         struct te_launchop      launchop;
187 };
188
189 struct te_request {
190         uint32_t                type;
191         uint32_t                session_id;
192         uint32_t                command_id;
193         uint64_t                params;
194         uint32_t                params_size;
195         uint32_t                dest_uuid[4];
196         uint32_t                result;
197         uint32_t                result_origin;
198 };
199
200 struct te_answer {
201         uint32_t        result;
202         uint32_t        session_id;
203         uint32_t        result_origin;
204 };
205
206 void te_open_session(struct te_opensession *cmd,
207         struct te_request *request,
208         struct tlk_context *context);
209
210 void te_close_session(struct te_closesession *cmd,
211         struct te_request *request,
212         struct tlk_context *context);
213
214 void te_launch_operation(struct te_launchop *cmd,
215         struct te_request *request,
216         struct tlk_context *context);
217
218 #define SS_OP_MAX_DATA_SIZE     0x1000
219 struct te_ss_op {
220         uint32_t        req_size;
221         uint8_t         data[SS_OP_MAX_DATA_SIZE];
222 };
223
224 int te_handle_ss_ioctl(struct file *file, unsigned int ioctl_num,
225                 unsigned long ioctl_param);
226 void ote_print_logs(void);
227 void tlk_ss_op(void);
228
229 #endif