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