Merge branch 'topic/isa' into topic/misc
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / sep / sep_driver_api.h
CommitLineData
cd1bb431
MA
1/*
2 *
3 * sep_driver_api.h - Security Processor Driver api definitions
4 *
5 * Copyright(c) 2009 Intel Corporation. All rights reserved.
6 * Copyright(c) 2009 Discretix. All rights reserved.
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the Free
10 * Software Foundation; either version 2 of the License, or (at your option)
11 * any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * more details.
17 *
18 * You should have received a copy of the GNU General Public License along with
19 * this program; if not, write to the Free Software Foundation, Inc., 59
20 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 *
22 * CONTACTS:
23 *
24 * Mark Allyn mark.a.allyn@intel.com
25 *
26 * CHANGES:
27 *
28 * 2009.06.26 Initial publish
29 *
30 */
31
32#ifndef __SEP_DRIVER_API_H__
33#define __SEP_DRIVER_API_H__
34
35
36
37/*----------------------------------------------------------------
38 IOCTL command defines
39 -----------------------------------------------------------------*/
40
41/* magic number 1 of the sep IOCTL command */
42#define SEP_IOC_MAGIC_NUMBER 's'
43
44/* sends interrupt to sep that message is ready */
45#define SEP_IOCSENDSEPCOMMAND _IO(SEP_IOC_MAGIC_NUMBER , 0)
46
47/* sends interrupt to sep that message is ready */
48#define SEP_IOCSENDSEPRPLYCOMMAND _IO(SEP_IOC_MAGIC_NUMBER , 1)
49
50/* allocate memory in data pool */
51#define SEP_IOCALLOCDATAPOLL _IO(SEP_IOC_MAGIC_NUMBER , 2)
52
53/* write to pre-allocated memory in data pool */
54#define SEP_IOCWRITEDATAPOLL _IO(SEP_IOC_MAGIC_NUMBER , 3)
55
56/* read from pre-allocated memory in data pool */
57#define SEP_IOCREADDATAPOLL _IO(SEP_IOC_MAGIC_NUMBER , 4)
58
59/* create sym dma lli tables */
60#define SEP_IOCCREATESYMDMATABLE _IO(SEP_IOC_MAGIC_NUMBER , 5)
61
62/* create flow dma lli tables */
63#define SEP_IOCCREATEFLOWDMATABLE _IO(SEP_IOC_MAGIC_NUMBER , 6)
64
65/* free dynamic data aalocated during table creation */
66#define SEP_IOCFREEDMATABLEDATA _IO(SEP_IOC_MAGIC_NUMBER , 7)
67
f69b0d64 68/* get the static pool area addresses (physical and virtual) */
cd1bb431
MA
69#define SEP_IOCGETSTATICPOOLADDR _IO(SEP_IOC_MAGIC_NUMBER , 8)
70
71/* set flow id command */
72#define SEP_IOCSETFLOWID _IO(SEP_IOC_MAGIC_NUMBER , 9)
73
74/* add tables to the dynamic flow */
75#define SEP_IOCADDFLOWTABLE _IO(SEP_IOC_MAGIC_NUMBER , 10)
76
77/* add flow add tables message */
78#define SEP_IOCADDFLOWMESSAGE _IO(SEP_IOC_MAGIC_NUMBER , 11)
79
80/* start sep command */
81#define SEP_IOCSEPSTART _IO(SEP_IOC_MAGIC_NUMBER , 12)
82
83/* init sep command */
84#define SEP_IOCSEPINIT _IO(SEP_IOC_MAGIC_NUMBER , 13)
85
cd1bb431
MA
86/* end transaction command */
87#define SEP_IOCENDTRANSACTION _IO(SEP_IOC_MAGIC_NUMBER , 15)
88
89/* reallocate cache and resident */
90#define SEP_IOCREALLOCCACHERES _IO(SEP_IOC_MAGIC_NUMBER , 16)
91
92/* get the offset of the address starting from the beginnnig of the map area */
93#define SEP_IOCGETMAPPEDADDROFFSET _IO(SEP_IOC_MAGIC_NUMBER , 17)
94
95/* get time address and value */
96#define SEP_IOCGETIME _IO(SEP_IOC_MAGIC_NUMBER , 19)
97
98/*-------------------------------------------
99 TYPEDEFS
100----------------------------------------------*/
101
102/*
103 init command struct
104*/
105struct sep_driver_init_t {
d19cf32f
AC
106 /* start of the 1G of the host memory address that SEP can access */
107 unsigned long message_addr;
cd1bb431 108
d19cf32f
AC
109 /* start address of resident */
110 unsigned long message_size_in_words;
cd1bb431
MA
111
112};
113
114
115/*
116 realloc cache resident command
117*/
118struct sep_driver_realloc_cache_resident_t {
d19cf32f 119 /* new cache address */
6f13ea3d 120 u64 new_cache_addr;
d19cf32f 121 /* new resident address */
6f13ea3d 122 u64 new_resident_addr;
d19cf32f 123 /* new resident address */
6f13ea3d 124 u64 new_shared_area_addr;
d19cf32f 125 /* new base address */
6f13ea3d 126 u64 new_base_addr;
cd1bb431
MA
127};
128
cd1bb431 129struct sep_driver_alloc_t {
d19cf32f
AC
130 /* virtual address of allocated space */
131 unsigned long offset;
cd1bb431 132
d19cf32f
AC
133 /* physical address of allocated space */
134 unsigned long phys_address;
cd1bb431 135
d19cf32f
AC
136 /* number of bytes to allocate */
137 unsigned long num_bytes;
cd1bb431
MA
138};
139
140/*
141 */
142struct sep_driver_write_t {
d19cf32f
AC
143 /* application space address */
144 unsigned long app_address;
cd1bb431 145
d19cf32f
AC
146 /* address of the data pool */
147 unsigned long datapool_address;
cd1bb431 148
d19cf32f
AC
149 /* number of bytes to write */
150 unsigned long num_bytes;
cd1bb431
MA
151};
152
153/*
154 */
155struct sep_driver_read_t {
d19cf32f
AC
156 /* application space address */
157 unsigned long app_address;
cd1bb431 158
d19cf32f
AC
159 /* address of the data pool */
160 unsigned long datapool_address;
cd1bb431 161
d19cf32f
AC
162 /* number of bytes to read */
163 unsigned long num_bytes;
cd1bb431
MA
164};
165
166/*
167*/
168struct sep_driver_build_sync_table_t {
d19cf32f
AC
169 /* address value of the data in */
170 unsigned long app_in_address;
cd1bb431 171
d19cf32f
AC
172 /* size of data in */
173 unsigned long data_in_size;
cd1bb431 174
d19cf32f
AC
175 /* address of the data out */
176 unsigned long app_out_address;
cd1bb431 177
d19cf32f
AC
178 /* the size of the block of the operation - if needed,
179 every table will be modulo this parameter */
180 unsigned long block_size;
cd1bb431 181
d19cf32f
AC
182 /* the physical address of the first input DMA table */
183 unsigned long in_table_address;
cd1bb431 184
d19cf32f
AC
185 /* number of entries in the first input DMA table */
186 unsigned long in_table_num_entries;
cd1bb431 187
d19cf32f
AC
188 /* the physical address of the first output DMA table */
189 unsigned long out_table_address;
cd1bb431 190
d19cf32f
AC
191 /* number of entries in the first output DMA table */
192 unsigned long out_table_num_entries;
cd1bb431 193
d19cf32f
AC
194 /* data in the first input table */
195 unsigned long table_data_size;
cd1bb431 196
d19cf32f
AC
197 /* distinct user/kernel layout */
198 bool isKernelVirtualAddress;
cd1bb431
MA
199
200};
201
202/*
203*/
204struct sep_driver_build_flow_table_t {
d19cf32f
AC
205 /* flow type */
206 unsigned long flow_type;
cd1bb431 207
d19cf32f
AC
208 /* flag for input output */
209 unsigned long input_output_flag;
cd1bb431 210
d19cf32f
AC
211 /* address value of the data in */
212 unsigned long virt_buff_data_addr;
cd1bb431 213
d19cf32f
AC
214 /* size of data in */
215 unsigned long num_virtual_buffers;
cd1bb431 216
d19cf32f
AC
217 /* the physical address of the first input DMA table */
218 unsigned long first_table_addr;
cd1bb431 219
d19cf32f
AC
220 /* number of entries in the first input DMA table */
221 unsigned long first_table_num_entries;
cd1bb431 222
d19cf32f
AC
223 /* data in the first input table */
224 unsigned long first_table_data_size;
cd1bb431 225
d19cf32f
AC
226 /* distinct user/kernel layout */
227 bool isKernelVirtualAddress;
cd1bb431
MA
228};
229
230
231struct sep_driver_add_flow_table_t {
d19cf32f
AC
232 /* flow id */
233 unsigned long flow_id;
cd1bb431 234
d19cf32f
AC
235 /* flag for input output */
236 unsigned long inputOutputFlag;
cd1bb431 237
d19cf32f
AC
238 /* address value of the data in */
239 unsigned long virt_buff_data_addr;
cd1bb431 240
d19cf32f
AC
241 /* size of data in */
242 unsigned long num_virtual_buffers;
cd1bb431 243
d19cf32f
AC
244 /* address of the first table */
245 unsigned long first_table_addr;
cd1bb431 246
d19cf32f
AC
247 /* number of entries in the first table */
248 unsigned long first_table_num_entries;
cd1bb431 249
d19cf32f
AC
250 /* data size of the first table */
251 unsigned long first_table_data_size;
cd1bb431 252
d19cf32f
AC
253 /* distinct user/kernel layout */
254 bool isKernelVirtualAddress;
cd1bb431
MA
255
256};
257
258/*
259 command struct for set flow id
260*/
261struct sep_driver_set_flow_id_t {
d19cf32f
AC
262 /* flow id to set */
263 unsigned long flow_id;
cd1bb431
MA
264};
265
266
267/* command struct for add tables message */
268struct sep_driver_add_message_t {
d19cf32f
AC
269 /* flow id to set */
270 unsigned long flow_id;
cd1bb431 271
d19cf32f
AC
272 /* message size in bytes */
273 unsigned long message_size_in_bytes;
cd1bb431 274
d19cf32f
AC
275 /* address of the message */
276 unsigned long message_address;
cd1bb431
MA
277};
278
279/* command struct for static pool addresses */
280struct sep_driver_static_pool_addr_t {
d19cf32f
AC
281 /* physical address of the static pool */
282 unsigned long physical_static_address;
cd1bb431 283
d19cf32f
AC
284 /* virtual address of the static pool */
285 unsigned long virtual_static_address;
cd1bb431
MA
286};
287
288/* command struct for getiing offset of the physical address from
289 the start of the mapped area */
290struct sep_driver_get_mapped_offset_t {
d19cf32f
AC
291 /* physical address of the static pool */
292 unsigned long physical_address;
cd1bb431 293
d19cf32f
AC
294 /* virtual address of the static pool */
295 unsigned long offset;
cd1bb431
MA
296};
297
298/* command struct for getting time value and address */
299struct sep_driver_get_time_t {
d19cf32f
AC
300 /* physical address of stored time */
301 unsigned long time_physical_address;
cd1bb431 302
d19cf32f
AC
303 /* value of the stored time */
304 unsigned long time_value;
cd1bb431
MA
305};
306
307
308/*
309 structure that represent one entry in the DMA LLI table
310*/
311struct sep_lli_entry_t {
d19cf32f
AC
312 /* physical address */
313 unsigned long physical_address;
cd1bb431 314
d19cf32f
AC
315 /* block size */
316 unsigned long block_size;
cd1bb431
MA
317};
318
319/*
320 structure that reperesents data needed for lli table construction
321*/
322struct sep_lli_prepare_table_data_t {
d19cf32f
AC
323 /* pointer to the memory where the first lli entry to be built */
324 struct sep_lli_entry_t *lli_entry_ptr;
cd1bb431 325
d19cf32f
AC
326 /* pointer to the array of lli entries from which the table is to be built */
327 struct sep_lli_entry_t *lli_array_ptr;
cd1bb431 328
d19cf32f
AC
329 /* number of elements in lli array */
330 int lli_array_size;
cd1bb431 331
d19cf32f
AC
332 /* number of entries in the created table */
333 int num_table_entries;
cd1bb431 334
d19cf32f
AC
335 /* number of array entries processed during table creation */
336 int num_array_entries_processed;
cd1bb431 337
d19cf32f
AC
338 /* the totatl data size in the created table */
339 int lli_table_total_data_size;
cd1bb431
MA
340};
341
342/*
343 structure that represent tone table - it is not used in code, jkust
344 to show what table looks like
345*/
346struct sep_lli_table_t {
d19cf32f
AC
347 /* number of pages mapped in this tables. If 0 - means that the table
348 is not defined (used as a valid flag) */
349 unsigned long num_pages;
350 /*
351 pointer to array of page pointers that represent the mapping of the
352 virtual buffer defined by the table to the physical memory. If this
353 pointer is NULL, it means that the table is not defined
354 (used as a valid flag)
355 */
356 struct page **table_page_array_ptr;
357
358 /* maximum flow entries in table */
359 struct sep_lli_entry_t lli_entries[SEP_DRIVER_MAX_FLOW_NUM_ENTRIES_IN_TABLE];
cd1bb431
MA
360};
361
362
363/*
364 structure for keeping the mapping of the virtual buffer into physical pages
365*/
366struct sep_flow_buffer_data {
d19cf32f
AC
367 /* pointer to the array of page structs pointers to the pages of the
368 virtual buffer */
369 struct page **page_array_ptr;
cd1bb431 370
d19cf32f
AC
371 /* number of pages taken by the virtual buffer */
372 unsigned long num_pages;
cd1bb431 373
d19cf32f
AC
374 /* this flag signals if this page_array is the last one among many that were
375 sent in one setting to SEP */
376 unsigned long last_page_array_flag;
cd1bb431
MA
377};
378
379/*
380 struct that keeps all the data for one flow
381*/
382struct sep_flow_context_t {
d19cf32f
AC
383 /*
384 work struct for handling the flow done interrupt in the workqueue
385 this structure must be in the first place, since it will be used
386 forcasting to the containing flow context
387 */
388 struct work_struct flow_wq;
cd1bb431 389
d19cf32f
AC
390 /* flow id */
391 unsigned long flow_id;
cd1bb431 392
d19cf32f
AC
393 /* additional input tables exists */
394 unsigned long input_tables_flag;
cd1bb431 395
d19cf32f
AC
396 /* additional output tables exists */
397 unsigned long output_tables_flag;
cd1bb431 398
d19cf32f
AC
399 /* data of the first input file */
400 struct sep_lli_entry_t first_input_table;
cd1bb431 401
d19cf32f
AC
402 /* data of the first output table */
403 struct sep_lli_entry_t first_output_table;
cd1bb431 404
d19cf32f
AC
405 /* last input table data */
406 struct sep_lli_entry_t last_input_table;
cd1bb431 407
d19cf32f
AC
408 /* last output table data */
409 struct sep_lli_entry_t last_output_table;
cd1bb431 410
d19cf32f
AC
411 /* first list of table */
412 struct sep_lli_entry_t input_tables_in_process;
cd1bb431 413
d19cf32f
AC
414 /* output table in process (in sep) */
415 struct sep_lli_entry_t output_tables_in_process;
cd1bb431 416
d19cf32f
AC
417 /* size of messages in bytes */
418 unsigned long message_size_in_bytes;
cd1bb431 419
d19cf32f
AC
420 /* message */
421 unsigned char message[SEP_MAX_ADD_MESSAGE_LENGTH_IN_BYTES];
cd1bb431
MA
422};
423
424
cd1bb431 425#endif