linux/drivers/staging/sep/sep_driver_api.h
<<
>>
Prefs
   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
  68/* get the static pool area addersses (physical and virtual) */
  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
  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 {
 106        /* start of the 1G of the host memory address that SEP can access */
 107        unsigned long message_addr;
 108
 109        /* start address of resident */
 110        unsigned long message_size_in_words;
 111
 112};
 113
 114
 115/*
 116  realloc cache resident command
 117*/
 118struct sep_driver_realloc_cache_resident_t {
 119        /* new cache address */
 120        u64 new_cache_addr;
 121        /* new resident address */
 122        u64 new_resident_addr;
 123        /* new resident address */
 124        u64  new_shared_area_addr;
 125        /* new base address */
 126        u64 new_base_addr;
 127};
 128
 129struct sep_driver_alloc_t {
 130        /* virtual address of allocated space */
 131        unsigned long offset;
 132
 133        /* physical address of allocated space */
 134        unsigned long phys_address;
 135
 136        /* number of bytes to allocate */
 137        unsigned long num_bytes;
 138};
 139
 140/*
 141 */
 142struct sep_driver_write_t {
 143        /* application space address */
 144        unsigned long app_address;
 145
 146        /* address of the data pool */
 147        unsigned long datapool_address;
 148
 149        /* number of bytes to write */
 150        unsigned long num_bytes;
 151};
 152
 153/*
 154 */
 155struct sep_driver_read_t {
 156        /* application space address */
 157        unsigned long app_address;
 158
 159        /* address of the data pool */
 160        unsigned long datapool_address;
 161
 162        /* number of bytes to read */
 163        unsigned long num_bytes;
 164};
 165
 166/*
 167*/
 168struct sep_driver_build_sync_table_t {
 169        /* address value of the data in */
 170        unsigned long app_in_address;
 171
 172        /* size of data in */
 173        unsigned long data_in_size;
 174
 175        /* address of the data out */
 176        unsigned long app_out_address;
 177
 178        /* the size of the block of the operation - if needed,
 179           every table will be modulo this parameter */
 180        unsigned long block_size;
 181
 182        /* the physical address of the first input DMA table */
 183        unsigned long in_table_address;
 184
 185        /* number of entries in the first input DMA table */
 186        unsigned long in_table_num_entries;
 187
 188        /* the physical address of the first output DMA table */
 189        unsigned long out_table_address;
 190
 191        /* number of entries in the first output DMA table */
 192        unsigned long out_table_num_entries;
 193
 194        /* data in the first input table */
 195        unsigned long table_data_size;
 196
 197        /* distinct user/kernel layout */
 198        bool isKernelVirtualAddress;
 199
 200};
 201
 202/*
 203*/
 204struct sep_driver_build_flow_table_t {
 205        /* flow type */
 206        unsigned long flow_type;
 207
 208        /* flag for input output */
 209        unsigned long input_output_flag;
 210
 211        /* address value of the data in */
 212        unsigned long virt_buff_data_addr;
 213
 214        /* size of data in */
 215        unsigned long num_virtual_buffers;
 216
 217        /* the physical address of the first input DMA table */
 218        unsigned long first_table_addr;
 219
 220        /* number of entries in the first input DMA table */
 221        unsigned long first_table_num_entries;
 222
 223        /* data in the first input table */
 224        unsigned long first_table_data_size;
 225
 226        /* distinct user/kernel layout */
 227        bool isKernelVirtualAddress;
 228};
 229
 230
 231struct sep_driver_add_flow_table_t {
 232        /* flow id  */
 233        unsigned long flow_id;
 234
 235        /* flag for input output */
 236        unsigned long inputOutputFlag;
 237
 238        /* address value of the data in */
 239        unsigned long virt_buff_data_addr;
 240
 241        /* size of data in */
 242        unsigned long num_virtual_buffers;
 243
 244        /* address of the first table */
 245        unsigned long first_table_addr;
 246
 247        /* number of entries in the first table */
 248        unsigned long first_table_num_entries;
 249
 250        /* data size of the first table */
 251        unsigned long first_table_data_size;
 252
 253        /* distinct user/kernel layout */
 254        bool isKernelVirtualAddress;
 255
 256};
 257
 258/*
 259  command struct for set flow id
 260*/
 261struct sep_driver_set_flow_id_t {
 262        /* flow id to set */
 263        unsigned long flow_id;
 264};
 265
 266
 267/* command struct for add tables message */
 268struct sep_driver_add_message_t {
 269        /* flow id to set */
 270        unsigned long flow_id;
 271
 272        /* message size in bytes */
 273        unsigned long message_size_in_bytes;
 274
 275        /* address of the message */
 276        unsigned long message_address;
 277};
 278
 279/* command struct for static pool addresses  */
 280struct sep_driver_static_pool_addr_t {
 281        /* physical address of the static pool */
 282        unsigned long physical_static_address;
 283
 284        /* virtual address of the static pool */
 285        unsigned long virtual_static_address;
 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 {
 291        /* physical address of the static pool */
 292        unsigned long physical_address;
 293
 294        /* virtual address of the static pool */
 295        unsigned long offset;
 296};
 297
 298/* command struct for getting time value and address */
 299struct sep_driver_get_time_t {
 300        /* physical address of stored time */
 301        unsigned long time_physical_address;
 302
 303        /* value of the stored time */
 304        unsigned long time_value;
 305};
 306
 307
 308/*
 309  structure that represent one entry in the DMA LLI table
 310*/
 311struct sep_lli_entry_t {
 312        /* physical address */
 313        unsigned long physical_address;
 314
 315        /* block size */
 316        unsigned long block_size;
 317};
 318
 319/*
 320  structure that reperesents data needed for lli table construction
 321*/
 322struct sep_lli_prepare_table_data_t {
 323        /* pointer to the memory where the first lli entry to be built */
 324        struct sep_lli_entry_t *lli_entry_ptr;
 325
 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;
 328
 329        /* number of elements in lli array */
 330        int lli_array_size;
 331
 332        /* number of entries in the created table */
 333        int num_table_entries;
 334
 335        /* number of array entries processed during table creation */
 336        int num_array_entries_processed;
 337
 338        /* the totatl data size in the created table */
 339        int lli_table_total_data_size;
 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 {
 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];
 360};
 361
 362
 363/*
 364  structure for keeping the mapping of the virtual buffer into physical pages
 365*/
 366struct sep_flow_buffer_data {
 367        /* pointer to the array of page structs pointers to the pages of the
 368           virtual buffer */
 369        struct page **page_array_ptr;
 370
 371        /* number of pages taken by the virtual buffer */
 372        unsigned long num_pages;
 373
 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;
 377};
 378
 379/*
 380  struct that keeps all the data for one flow
 381*/
 382struct sep_flow_context_t {
 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;
 389
 390        /* flow id */
 391        unsigned long flow_id;
 392
 393        /* additional input tables exists */
 394        unsigned long input_tables_flag;
 395
 396        /* additional output tables exists */
 397        unsigned long output_tables_flag;
 398
 399        /*  data of the first input file */
 400        struct sep_lli_entry_t first_input_table;
 401
 402        /* data of the first output table */
 403        struct sep_lli_entry_t first_output_table;
 404
 405        /* last input table data */
 406        struct sep_lli_entry_t last_input_table;
 407
 408        /* last output table data */
 409        struct sep_lli_entry_t last_output_table;
 410
 411        /* first list of table */
 412        struct sep_lli_entry_t input_tables_in_process;
 413
 414        /* output table in process (in sep) */
 415        struct sep_lli_entry_t output_tables_in_process;
 416
 417        /* size of messages in bytes */
 418        unsigned long message_size_in_bytes;
 419
 420        /* message */
 421        unsigned char message[SEP_MAX_ADD_MESSAGE_LENGTH_IN_BYTES];
 422};
 423
 424
 425#endif
 426