Root/drivers/staging/sep/sep_driver_api.h

1/*
2 *
3 * sep_driver_api.h - Security Processor Driver api definitions
4 *
5 * Copyright(c) 2009-2011 Intel Corporation. All rights reserved.
6 * Contributions(c) 2009-2011 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; version 2 of the License.
11 *
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * more details.
16 *
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc., 59
19 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 *
21 * CONTACTS:
22 *
23 * Mark Allyn mark.a.allyn@intel.com
24 * Jayant Mangalampalli jayant.mangalampalli@intel.com
25 *
26 * CHANGES:
27 *
28 * 2010.09.14 Upgrade to Medfield
29 * 2011.02.22 Enable kernel crypto
30 *
31 */
32
33#ifndef __SEP_DRIVER_API_H__
34#define __SEP_DRIVER_API_H__
35
36/* Type of request from device */
37#define SEP_DRIVER_SRC_REPLY 1
38#define SEP_DRIVER_SRC_REQ 2
39#define SEP_DRIVER_SRC_PRINTF 3
40
41/* Power state */
42#define SEP_DRIVER_POWERON 1
43#define SEP_DRIVER_POWEROFF 2
44
45/* Following enums are used only for kernel crypto api */
46enum type_of_request {
47    NO_REQUEST,
48    AES_CBC,
49    AES_ECB,
50    DES_CBC,
51    DES_ECB,
52    DES3_ECB,
53    DES3_CBC,
54    SHA1,
55    MD5,
56    SHA224,
57    SHA256
58    };
59
60enum hash_stage {
61    HASH_INIT,
62    HASH_UPDATE,
63    HASH_FINISH,
64    HASH_DIGEST,
65    HASH_FINUP_DATA,
66    HASH_FINUP_FINISH
67};
68
69/*
70  structure that represents DCB
71*/
72struct sep_dcblock {
73    /* physical address of the first input mlli */
74    u32 input_mlli_address;
75    /* num of entries in the first input mlli */
76    u32 input_mlli_num_entries;
77    /* size of data in the first input mlli */
78    u32 input_mlli_data_size;
79    /* physical address of the first output mlli */
80    u32 output_mlli_address;
81    /* num of entries in the first output mlli */
82    u32 output_mlli_num_entries;
83    /* size of data in the first output mlli */
84    u32 output_mlli_data_size;
85    /* pointer to the output virtual tail */
86    aligned_u64 out_vr_tail_pt;
87    /* size of tail data */
88    u32 tail_data_size;
89    /* input tail data array */
90    u8 tail_data[68];
91};
92
93/*
94    command structure for building dcb block (currently for ext app only)
95*/
96struct build_dcb_struct {
97    /* address value of the data in */
98    aligned_u64 app_in_address;
99    /* size of data in */
100    u32 data_in_size;
101    /* address of the data out */
102    aligned_u64 app_out_address;
103    /* the size of the block of the operation - if needed,
104    every table will be modulo this parameter */
105    u32 block_size;
106    /* the size of the block of the operation - if needed,
107    every table will be modulo this parameter */
108    u32 tail_block_size;
109
110    /* which application calls the driver DX or applet */
111    u32 is_applet;
112};
113
114/*
115    command structure for building dcb block for kernel crypto
116*/
117struct build_dcb_struct_kernel {
118    /* address value of the data in */
119    void *app_in_address;
120    /* size of data in */
121    ssize_t data_in_size;
122    /* address of the data out */
123    void *app_out_address;
124    /* the size of the block of the operation - if needed,
125    every table will be modulo this parameter */
126    u32 block_size;
127    /* the size of the block of the operation - if needed,
128    every table will be modulo this parameter */
129    u32 tail_block_size;
130
131    /* which application calls the driver DX or applet */
132    u32 is_applet;
133
134    struct scatterlist *src_sg;
135    struct scatterlist *dst_sg;
136};
137
138/**
139 * @struct sep_dma_map
140 *
141 * Structure that contains all information needed for mapping the user pages
142 * or kernel buffers for dma operations
143 *
144 *
145 */
146struct sep_dma_map {
147    /* mapped dma address */
148    dma_addr_t dma_addr;
149    /* size of the mapped data */
150    size_t size;
151};
152
153struct sep_dma_resource {
154    /* array of pointers to the pages that represent
155    input data for the synchronic DMA action */
156    struct page **in_page_array;
157
158    /* array of pointers to the pages that represent out
159    data for the synchronic DMA action */
160    struct page **out_page_array;
161
162    /* number of pages in the sep_in_page_array */
163    u32 in_num_pages;
164
165    /* number of pages in the sep_out_page_array */
166    u32 out_num_pages;
167
168    /* map array of the input data */
169    struct sep_dma_map *in_map_array;
170
171    /* map array of the output data */
172    struct sep_dma_map *out_map_array;
173
174    /* number of entries of the input mapp array */
175    u32 in_map_num_entries;
176
177    /* number of entries of the output mapp array */
178    u32 out_map_num_entries;
179
180    /* Scatter list for kernel operations */
181    struct scatterlist *src_sg;
182    struct scatterlist *dst_sg;
183};
184
185
186/* command struct for translating rar handle to bus address
187   and setting it at predefined location */
188struct rar_hndl_to_bus_struct {
189
190    /* rar handle */
191    aligned_u64 rar_handle;
192};
193
194/*
195  structure that represent one entry in the DMA LLI table
196*/
197struct sep_lli_entry {
198    /* physical address */
199    u32 bus_address;
200
201    /* block size */
202    u32 block_size;
203};
204
205/*
206 * header format for each fastcall write operation
207 */
208struct sep_fastcall_hdr {
209    u32 magic;
210    u32 secure_dma;
211    u32 msg_len;
212    u32 num_dcbs;
213};
214
215/*
216 * structure used in file pointer's private data field
217 * to track the status of the calls to the various
218 * driver interface
219 */
220struct sep_call_status {
221    unsigned long status;
222};
223
224/*
225 * format of dma context buffer used to store all DMA-related
226 * context information of a particular transaction
227 */
228struct sep_dma_context {
229    /* number of data control blocks */
230    u32 nr_dcb_creat;
231    /* number of the lli tables created in the current transaction */
232    u32 num_lli_tables_created;
233    /* size of currently allocated dma tables region */
234    u32 dmatables_len;
235    /* size of input data */
236    u32 input_data_len;
237    /* secure dma use (for imr memory restricted area in output) */
238    bool secure_dma;
239    struct sep_dma_resource dma_res_arr[SEP_MAX_NUM_SYNC_DMA_OPS];
240    /* Scatter gather for kernel crypto */
241    struct scatterlist *src_sg;
242    struct scatterlist *dst_sg;
243};
244
245/*
246 * format for file pointer's private_data field
247 */
248struct sep_private_data {
249    struct sep_queue_info *my_queue_elem;
250    struct sep_device *device;
251    struct sep_call_status call_status;
252    struct sep_dma_context *dma_ctx;
253};
254
255
256/* Functions used by sep_crypto */
257
258/**
259 * sep_queue_status_remove - Removes transaction from status queue
260 * @sep: SEP device
261 * @sep_queue_info: pointer to status queue
262 *
263 * This function will removes information about transaction from the queue.
264 */
265void sep_queue_status_remove(struct sep_device *sep,
266                      struct sep_queue_info **queue_elem);
267/**
268 * sep_queue_status_add - Adds transaction to status queue
269 * @sep: SEP device
270 * @opcode: transaction opcode
271 * @size: input data size
272 * @pid: pid of current process
273 * @name: current process name
274 * @name_len: length of name (current process)
275 *
276 * This function adds information about about transaction started to the status
277 * queue.
278 */
279struct sep_queue_info *sep_queue_status_add(
280                        struct sep_device *sep,
281                        u32 opcode,
282                        u32 size,
283                        u32 pid,
284                        u8 *name, size_t name_len);
285
286/**
287 * sep_create_dcb_dmatables_context_kernel - Creates DCB & MLLI/DMA table context
288 * for kernel crypto
289 * @sep: SEP device
290 * @dcb_region: DCB region buf to create for current transaction
291 * @dmatables_region: MLLI/DMA tables buf to create for current transaction
292 * @dma_ctx: DMA context buf to create for current transaction
293 * @user_dcb_args: User arguments for DCB/MLLI creation
294 * @num_dcbs: Number of DCBs to create
295 */
296int sep_create_dcb_dmatables_context_kernel(struct sep_device *sep,
297            struct sep_dcblock **dcb_region,
298            void **dmatables_region,
299            struct sep_dma_context **dma_ctx,
300            const struct build_dcb_struct_kernel *dcb_data,
301            const u32 num_dcbs);
302
303/**
304 * sep_activate_dcb_dmatables_context - Takes DCB & DMA tables
305 * contexts into use
306 * @sep: SEP device
307 * @dcb_region: DCB region copy
308 * @dmatables_region: MLLI/DMA tables copy
309 * @dma_ctx: DMA context for current transaction
310 */
311ssize_t sep_activate_dcb_dmatables_context(struct sep_device *sep,
312                    struct sep_dcblock **dcb_region,
313                    void **dmatables_region,
314                    struct sep_dma_context *dma_ctx);
315
316/**
317 * sep_prepare_input_output_dma_table_in_dcb - prepare control blocks
318 * @app_in_address: unsigned long; for data buffer in (user space)
319 * @app_out_address: unsigned long; for data buffer out (user space)
320 * @data_in_size: u32; for size of data
321 * @block_size: u32; for block size
322 * @tail_block_size: u32; for size of tail block
323 * @isapplet: bool; to indicate external app
324 * @is_kva: bool; kernel buffer; only used for kernel crypto module
325 * @secure_dma; indicates whether this is secure_dma using IMR
326 *
327 * This function prepares the linked DMA tables and puts the
328 * address for the linked list of tables inta a DCB (data control
329 * block) the address of which is known by the SEP hardware
330 * Note that all bus addresses that are passed to the SEP
331 * are in 32 bit format; the SEP is a 32 bit device
332 */
333int sep_prepare_input_output_dma_table_in_dcb(struct sep_device *sep,
334    unsigned long app_in_address,
335    unsigned long app_out_address,
336    u32 data_in_size,
337    u32 block_size,
338    u32 tail_block_size,
339    bool isapplet,
340    bool is_kva,
341    bool secure_dma,
342    struct sep_dcblock *dcb_region,
343    void **dmatables_region,
344    struct sep_dma_context **dma_ctx,
345    struct scatterlist *src_sg,
346    struct scatterlist *dst_sg);
347
348/**
349 * sep_free_dma_table_data_handler - free DMA table
350 * @sep: pointer to struct sep_device
351 * @dma_ctx: dma context
352 *
353 * Handles the request to free DMA table for synchronic actions
354 */
355int sep_free_dma_table_data_handler(struct sep_device *sep,
356                       struct sep_dma_context **dma_ctx);
357/**
358 * sep_send_command_handler - kick off a command
359 * @sep: SEP being signalled
360 *
361 * This function raises interrupt to SEP that signals that is has a new
362 * command from the host
363 *
364 * Note that this function does fall under the ioctl lock
365 */
366int sep_send_command_handler(struct sep_device *sep);
367
368/**
369 * sep_wait_transaction - Used for synchronizing transactions
370 * @sep: SEP device
371 */
372int sep_wait_transaction(struct sep_device *sep);
373
374/**
375 * IOCTL command defines
376 */
377/* magic number 1 of the sep IOCTL command */
378#define SEP_IOC_MAGIC_NUMBER 's'
379
380/* sends interrupt to sep that message is ready */
381#define SEP_IOCSENDSEPCOMMAND \
382    _IO(SEP_IOC_MAGIC_NUMBER, 0)
383
384/* end transaction command */
385#define SEP_IOCENDTRANSACTION \
386    _IO(SEP_IOC_MAGIC_NUMBER, 15)
387
388#define SEP_IOCPREPAREDCB \
389    _IOW(SEP_IOC_MAGIC_NUMBER, 35, struct build_dcb_struct)
390
391#define SEP_IOCFREEDCB \
392    _IO(SEP_IOC_MAGIC_NUMBER, 36)
393
394struct sep_device;
395
396#define SEP_IOCPREPAREDCB_SECURE_DMA \
397    _IOW(SEP_IOC_MAGIC_NUMBER, 38, struct build_dcb_struct)
398
399#define SEP_IOCFREEDCB_SECURE_DMA \
400    _IO(SEP_IOC_MAGIC_NUMBER, 39)
401
402#endif
403

Archive Download this file



interactive