Imported Upstream version 16.11.1
[deb_dpdk.git] / lib / librte_cryptodev / rte_cryptodev_pmd.h
1 /*-
2  *
3  *   Copyright(c) 2015-2016 Intel Corporation. All rights reserved.
4  *
5  *   Redistribution and use in source and binary forms, with or without
6  *   modification, are permitted provided that the following conditions
7  *   are met:
8  *
9  *     * Redistributions of source code must retain the above copyright
10  *       notice, this list of conditions and the following disclaimer.
11  *     * Redistributions in binary form must reproduce the above copyright
12  *       notice, this list of conditions and the following disclaimer in
13  *       the documentation and/or other materials provided with the
14  *       distribution.
15  *     * Neither the name of Intel Corporation nor the names of its
16  *       contributors may be used to endorse or promote products derived
17  *       from this software without specific prior written permission.
18  *
19  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31
32 #ifndef _RTE_CRYPTODEV_PMD_H_
33 #define _RTE_CRYPTODEV_PMD_H_
34
35 /** @file
36  * RTE Crypto PMD APIs
37  *
38  * @note
39  * These API are from crypto PMD only and user applications should not call
40  * them directly.
41  */
42
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46
47 #include <string.h>
48
49 #include <rte_dev.h>
50 #include <rte_pci.h>
51 #include <rte_malloc.h>
52 #include <rte_mbuf.h>
53 #include <rte_mempool.h>
54 #include <rte_log.h>
55 #include <rte_common.h>
56
57 #include "rte_crypto.h"
58 #include "rte_cryptodev.h"
59
60
61 #ifdef RTE_LIBRTE_CRYPTODEV_DEBUG
62 #define RTE_PMD_DEBUG_TRACE(...) \
63         rte_pmd_debug_trace(__func__, __VA_ARGS__)
64 #else
65 #define RTE_PMD_DEBUG_TRACE(...)
66 #endif
67
68 struct rte_cryptodev_session {
69         RTE_STD_C11
70         struct {
71                 uint8_t dev_id;
72                 enum rte_cryptodev_type type;
73                 struct rte_mempool *mp;
74         } __rte_aligned(8);
75
76         __extension__ char _private[0];
77 };
78
79 struct rte_cryptodev_driver;
80
81 /**
82  * Initialisation function of a crypto driver invoked for each matching
83  * crypto PCI device detected during the PCI probing phase.
84  *
85  * @param       drv     The pointer to the [matching] crypto driver structure
86  *                      supplied by the PMD when it registered itself.
87  * @param       dev     The dev pointer is the address of the *rte_cryptodev*
88  *                      structure associated with the matching device and which
89  *                      has been [automatically] allocated in the
90  *                      *rte_crypto_devices* array.
91  *
92  * @return
93  *   - 0: Success, the device is properly initialised by the driver.
94  *        In particular, the driver MUST have set up the *dev_ops* pointer
95  *        of the *dev* structure.
96  *   - <0: Error code of the device initialisation failure.
97  */
98 typedef int (*cryptodev_init_t)(struct rte_cryptodev_driver *drv,
99                 struct rte_cryptodev *dev);
100
101 /**
102  * Finalisation function of a driver invoked for each matching
103  * PCI device detected during the PCI closing phase.
104  *
105  * @param       drv     The pointer to the [matching] driver structure supplied
106  *                      by the PMD when it registered itself.
107  * @param       dev     The dev pointer is the address of the *rte_cryptodev*
108  *                      structure associated with the matching device and which
109  *                      has been [automatically] allocated in the
110  *                      *rte_crypto_devices* array.
111  *
112  *  * @return
113  *   - 0: Success, the device is properly finalised by the driver.
114  *        In particular, the driver MUST free the *dev_ops* pointer
115  *        of the *dev* structure.
116  *   - <0: Error code of the device initialisation failure.
117  */
118 typedef int (*cryptodev_uninit_t)(const struct rte_cryptodev_driver  *drv,
119                                 struct rte_cryptodev *dev);
120
121 /**
122  * The structure associated with a PMD driver.
123  *
124  * Each driver acts as a PCI driver and is represented by a generic
125  * *crypto_driver* structure that holds:
126  *
127  * - An *rte_pci_driver* structure (which must be the first field).
128  *
129  * - The *cryptodev_init* function invoked for each matching PCI device.
130  *
131  * - The size of the private data to allocate for each matching device.
132  */
133 struct rte_cryptodev_driver {
134         struct rte_pci_driver pci_drv;  /**< The PMD is also a PCI driver. */
135         unsigned dev_private_size;      /**< Size of device private data. */
136
137         cryptodev_init_t cryptodev_init;        /**< Device init function. */
138         cryptodev_uninit_t cryptodev_uninit;    /**< Device uninit function. */
139 };
140
141
142 /** Global structure used for maintaining state of allocated crypto devices */
143 struct rte_cryptodev_global {
144         struct rte_cryptodev *devs;     /**< Device information array */
145         struct rte_cryptodev_data *data[RTE_CRYPTO_MAX_DEVS];
146         /**< Device private data */
147         uint8_t nb_devs;                /**< Number of devices found */
148         uint8_t max_devs;               /**< Max number of devices */
149 };
150
151 /** pointer to global crypto devices data structure. */
152 extern struct rte_cryptodev_global *rte_cryptodev_globals;
153
154 /**
155  * Get the rte_cryptodev structure device pointer for the device. Assumes a
156  * valid device index.
157  *
158  * @param       dev_id  Device ID value to select the device structure.
159  *
160  * @return
161  *   - The rte_cryptodev structure pointer for the given device ID.
162  */
163 static inline struct rte_cryptodev *
164 rte_cryptodev_pmd_get_dev(uint8_t dev_id)
165 {
166         return &rte_cryptodev_globals->devs[dev_id];
167 }
168
169 /**
170  * Get the rte_cryptodev structure device pointer for the named device.
171  *
172  * @param       name    device name to select the device structure.
173  *
174  * @return
175  *   - The rte_cryptodev structure pointer for the given device ID.
176  */
177 static inline struct rte_cryptodev *
178 rte_cryptodev_pmd_get_named_dev(const char *name)
179 {
180         struct rte_cryptodev *dev;
181         unsigned i;
182
183         if (name == NULL)
184                 return NULL;
185
186         for (i = 0; i < rte_cryptodev_globals->max_devs; i++) {
187                 dev = &rte_cryptodev_globals->devs[i];
188
189                 if ((dev->attached == RTE_CRYPTODEV_ATTACHED) &&
190                                 (strcmp(dev->data->name, name) == 0))
191                         return dev;
192         }
193
194         return NULL;
195 }
196
197 /**
198  * Validate if the crypto device index is valid attached crypto device.
199  *
200  * @param       dev_id  Crypto device index.
201  *
202  * @return
203  *   - If the device index is valid (1) or not (0).
204  */
205 static inline unsigned
206 rte_cryptodev_pmd_is_valid_dev(uint8_t dev_id)
207 {
208         struct rte_cryptodev *dev = NULL;
209
210         if (dev_id >= rte_cryptodev_globals->nb_devs)
211                 return 0;
212
213         dev = rte_cryptodev_pmd_get_dev(dev_id);
214         if (dev->attached != RTE_CRYPTODEV_ATTACHED)
215                 return 0;
216         else
217                 return 1;
218 }
219
220 /**
221  * The pool of rte_cryptodev structures.
222  */
223 extern struct rte_cryptodev *rte_cryptodevs;
224
225
226 /**
227  * Definitions of all functions exported by a driver through the
228  * the generic structure of type *crypto_dev_ops* supplied in the
229  * *rte_cryptodev* structure associated with a device.
230  */
231
232 /**
233  *      Function used to configure device.
234  *
235  * @param       dev     Crypto device pointer
236  *
237  * @return      Returns 0 on success
238  */
239 typedef int (*cryptodev_configure_t)(struct rte_cryptodev *dev);
240
241 /**
242  * Function used to start a configured device.
243  *
244  * @param       dev     Crypto device pointer
245  *
246  * @return      Returns 0 on success
247  */
248 typedef int (*cryptodev_start_t)(struct rte_cryptodev *dev);
249
250 /**
251  * Function used to stop a configured device.
252  *
253  * @param       dev     Crypto device pointer
254  */
255 typedef void (*cryptodev_stop_t)(struct rte_cryptodev *dev);
256
257 /**
258  * Function used to close a configured device.
259  *
260  * @param       dev     Crypto device pointer
261  * @return
262  * - 0 on success.
263  * - EAGAIN if can't close as device is busy
264  */
265 typedef int (*cryptodev_close_t)(struct rte_cryptodev *dev);
266
267
268 /**
269  * Function used to get statistics of a device.
270  *
271  * @param       dev     Crypto device pointer
272  * @param       stats   Pointer to crypto device stats structure to populate
273  */
274 typedef void (*cryptodev_stats_get_t)(struct rte_cryptodev *dev,
275                                 struct rte_cryptodev_stats *stats);
276
277
278 /**
279  * Function used to reset statistics of a device.
280  *
281  * @param       dev     Crypto device pointer
282  */
283 typedef void (*cryptodev_stats_reset_t)(struct rte_cryptodev *dev);
284
285
286 /**
287  * Function used to get specific information of a device.
288  *
289  * @param       dev     Crypto device pointer
290  */
291 typedef void (*cryptodev_info_get_t)(struct rte_cryptodev *dev,
292                                 struct rte_cryptodev_info *dev_info);
293
294 /**
295  * Start queue pair of a device.
296  *
297  * @param       dev     Crypto device pointer
298  * @param       qp_id   Queue Pair Index
299  *
300  * @return      Returns 0 on success.
301  */
302 typedef int (*cryptodev_queue_pair_start_t)(struct rte_cryptodev *dev,
303                                 uint16_t qp_id);
304
305 /**
306  * Stop queue pair of a device.
307  *
308  * @param       dev     Crypto device pointer
309  * @param       qp_id   Queue Pair Index
310  *
311  * @return      Returns 0 on success.
312  */
313 typedef int (*cryptodev_queue_pair_stop_t)(struct rte_cryptodev *dev,
314                                 uint16_t qp_id);
315
316 /**
317  * Setup a queue pair for a device.
318  *
319  * @param       dev             Crypto device pointer
320  * @param       qp_id           Queue Pair Index
321  * @param       qp_conf         Queue configuration structure
322  * @param       socket_id       Socket Index
323  *
324  * @return      Returns 0 on success.
325  */
326 typedef int (*cryptodev_queue_pair_setup_t)(struct rte_cryptodev *dev,
327                 uint16_t qp_id, const struct rte_cryptodev_qp_conf *qp_conf,
328                 int socket_id);
329
330 /**
331  * Release memory resources allocated by given queue pair.
332  *
333  * @param       dev     Crypto device pointer
334  * @param       qp_id   Queue Pair Index
335  *
336  * @return
337  * - 0 on success.
338  * - EAGAIN if can't close as device is busy
339  */
340 typedef int (*cryptodev_queue_pair_release_t)(struct rte_cryptodev *dev,
341                 uint16_t qp_id);
342
343 /**
344  * Get number of available queue pairs of a device.
345  *
346  * @param       dev     Crypto device pointer
347  *
348  * @return      Returns number of queue pairs on success.
349  */
350 typedef uint32_t (*cryptodev_queue_pair_count_t)(struct rte_cryptodev *dev);
351
352 /**
353  * Create a session mempool to allocate sessions from
354  *
355  * @param       dev             Crypto device pointer
356  * @param       nb_objs         number of sessions objects in mempool
357  * @param       obj_cache       l-core object cache size, see *rte_ring_create*
358  * @param       socket_id       Socket Id to allocate  mempool on.
359  *
360  * @return
361  * - On success returns a pointer to a rte_mempool
362  * - On failure returns a NULL pointer
363  */
364 typedef int (*cryptodev_sym_create_session_pool_t)(
365                 struct rte_cryptodev *dev, unsigned nb_objs,
366                 unsigned obj_cache_size, int socket_id);
367
368
369 /**
370  * Get the size of a cryptodev session
371  *
372  * @param       dev             Crypto device pointer
373  *
374  * @return
375  *  - On success returns the size of the session structure for device
376  *  - On failure returns 0
377  */
378 typedef unsigned (*cryptodev_sym_get_session_private_size_t)(
379                 struct rte_cryptodev *dev);
380
381 /**
382  * Initialize a Crypto session on a device.
383  *
384  * @param       dev             Crypto device pointer
385  * @param       xform           Single or chain of crypto xforms
386  * @param       priv_sess       Pointer to cryptodev's private session structure
387  *
388  * @return
389  *  - Returns private session structure on success.
390  *  - Returns NULL on failure.
391  */
392 typedef void (*cryptodev_sym_initialize_session_t)(struct rte_mempool *mempool,
393                 void *session_private);
394
395 /**
396  * Configure a Crypto session on a device.
397  *
398  * @param       dev             Crypto device pointer
399  * @param       xform           Single or chain of crypto xforms
400  * @param       priv_sess       Pointer to cryptodev's private session structure
401  *
402  * @return
403  *  - Returns private session structure on success.
404  *  - Returns NULL on failure.
405  */
406 typedef void * (*cryptodev_sym_configure_session_t)(struct rte_cryptodev *dev,
407                 struct rte_crypto_sym_xform *xform, void *session_private);
408
409 /**
410  * Free Crypto session.
411  * @param       session         Cryptodev session structure to free
412  */
413 typedef void (*cryptodev_sym_free_session_t)(struct rte_cryptodev *dev,
414                 void *session_private);
415
416
417 /** Crypto device operations function pointer table */
418 struct rte_cryptodev_ops {
419         cryptodev_configure_t dev_configure;    /**< Configure device. */
420         cryptodev_start_t dev_start;            /**< Start device. */
421         cryptodev_stop_t dev_stop;              /**< Stop device. */
422         cryptodev_close_t dev_close;            /**< Close device. */
423
424         cryptodev_info_get_t dev_infos_get;     /**< Get device info. */
425
426         cryptodev_stats_get_t stats_get;
427         /**< Get device statistics. */
428         cryptodev_stats_reset_t stats_reset;
429         /**< Reset device statistics. */
430
431         cryptodev_queue_pair_setup_t queue_pair_setup;
432         /**< Set up a device queue pair. */
433         cryptodev_queue_pair_release_t queue_pair_release;
434         /**< Release a queue pair. */
435         cryptodev_queue_pair_start_t queue_pair_start;
436         /**< Start a queue pair. */
437         cryptodev_queue_pair_stop_t queue_pair_stop;
438         /**< Stop a queue pair. */
439         cryptodev_queue_pair_count_t queue_pair_count;
440         /**< Get count of the queue pairs. */
441
442         cryptodev_sym_get_session_private_size_t session_get_size;
443         /**< Return private session. */
444         cryptodev_sym_initialize_session_t session_initialize;
445         /**< Initialization function for private session data */
446         cryptodev_sym_configure_session_t session_configure;
447         /**< Configure a Crypto session. */
448         cryptodev_sym_free_session_t session_clear;
449         /**< Clear a Crypto sessions private data. */
450 };
451
452
453 /**
454  * Function for internal use by dummy drivers primarily, e.g. ring-based
455  * driver.
456  * Allocates a new cryptodev slot for an crypto device and returns the pointer
457  * to that slot for the driver to use.
458  *
459  * @param       name            Unique identifier name for each device
460  * @param       socket_id       Socket to allocate resources on.
461  * @return
462  *   - Slot in the rte_dev_devices array for a new device;
463  */
464 struct rte_cryptodev *
465 rte_cryptodev_pmd_allocate(const char *name, int socket_id);
466
467 /**
468  * Creates a new virtual crypto device and returns the pointer
469  * to that device.
470  *
471  * @param       name                    PMD type name
472  * @param       dev_private_size        Size of crypto PMDs private data
473  * @param       socket_id               Socket to allocate resources on.
474  *
475  * @return
476  *   - Cryptodev pointer if device is successfully created.
477  *   - NULL if device cannot be created.
478  */
479 struct rte_cryptodev *
480 rte_cryptodev_pmd_virtual_dev_init(const char *name, size_t dev_private_size,
481                 int socket_id);
482
483
484 /**
485  * Function for internal use by dummy drivers primarily, e.g. ring-based
486  * driver.
487  * Release the specified cryptodev device.
488  *
489  * @param cryptodev
490  * The *cryptodev* pointer is the address of the *rte_cryptodev* structure.
491  * @return
492  *   - 0 on success, negative on error
493  */
494 extern int
495 rte_cryptodev_pmd_release_device(struct rte_cryptodev *cryptodev);
496
497 /**
498  * Executes all the user application registered callbacks for the specific
499  * device.
500  *  *
501  * @param       dev     Pointer to cryptodev struct
502  * @param       event   Crypto device interrupt event type.
503  *
504  * @return
505  *  void
506  */
507 void rte_cryptodev_pmd_callback_process(struct rte_cryptodev *dev,
508                                 enum rte_cryptodev_event_type event);
509
510 /**
511  * Wrapper for use by pci drivers as a .probe function to attach to a crypto
512  * interface.
513  */
514 int rte_cryptodev_pci_probe(struct rte_pci_driver *pci_drv,
515                             struct rte_pci_device *pci_dev);
516
517 /**
518  * Wrapper for use by pci drivers as a .remove function to detach a crypto
519  * interface.
520  */
521 int rte_cryptodev_pci_remove(struct rte_pci_device *pci_dev);
522
523 #ifdef __cplusplus
524 }
525 #endif
526
527 #endif /* _RTE_CRYPTODEV_PMD_H_ */