1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*2d9fd380Sjfb8856606 * Copyright(c) 2015-2020 Intel Corporation.
3a9643ea8Slogwang */
4a9643ea8Slogwang
5a9643ea8Slogwang #ifndef _RTE_CRYPTODEV_PMD_H_
6a9643ea8Slogwang #define _RTE_CRYPTODEV_PMD_H_
7a9643ea8Slogwang
8a9643ea8Slogwang /** @file
9a9643ea8Slogwang * RTE Crypto PMD APIs
10a9643ea8Slogwang *
11a9643ea8Slogwang * @note
12a9643ea8Slogwang * These API are from crypto PMD only and user applications should not call
13a9643ea8Slogwang * them directly.
14a9643ea8Slogwang */
15a9643ea8Slogwang
16a9643ea8Slogwang #ifdef __cplusplus
17a9643ea8Slogwang extern "C" {
18a9643ea8Slogwang #endif
19a9643ea8Slogwang
20a9643ea8Slogwang #include <string.h>
21a9643ea8Slogwang
222bfe3f2eSlogwang #include <rte_config.h>
23a9643ea8Slogwang #include <rte_dev.h>
24a9643ea8Slogwang #include <rte_malloc.h>
25a9643ea8Slogwang #include <rte_mbuf.h>
26a9643ea8Slogwang #include <rte_mempool.h>
27a9643ea8Slogwang #include <rte_log.h>
282bfe3f2eSlogwang #include <rte_common.h>
29a9643ea8Slogwang
30a9643ea8Slogwang #include "rte_crypto.h"
31a9643ea8Slogwang #include "rte_cryptodev.h"
32a9643ea8Slogwang
33a9643ea8Slogwang
342bfe3f2eSlogwang #define RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS 8
35a9643ea8Slogwang
362bfe3f2eSlogwang #define RTE_CRYPTODEV_PMD_NAME_ARG ("name")
372bfe3f2eSlogwang #define RTE_CRYPTODEV_PMD_MAX_NB_QP_ARG ("max_nb_queue_pairs")
382bfe3f2eSlogwang #define RTE_CRYPTODEV_PMD_SOCKET_ID_ARG ("socket_id")
39a9643ea8Slogwang
402bfe3f2eSlogwang
412bfe3f2eSlogwang static const char * const cryptodev_pmd_valid_params[] = {
422bfe3f2eSlogwang RTE_CRYPTODEV_PMD_NAME_ARG,
432bfe3f2eSlogwang RTE_CRYPTODEV_PMD_MAX_NB_QP_ARG,
440c6bd470Sfengbojiang RTE_CRYPTODEV_PMD_SOCKET_ID_ARG,
450c6bd470Sfengbojiang NULL
46a9643ea8Slogwang };
47a9643ea8Slogwang
48a9643ea8Slogwang /**
492bfe3f2eSlogwang * @internal
502bfe3f2eSlogwang * Initialisation parameters for crypto devices
51a9643ea8Slogwang */
522bfe3f2eSlogwang struct rte_cryptodev_pmd_init_params {
532bfe3f2eSlogwang char name[RTE_CRYPTODEV_NAME_MAX_LEN];
542bfe3f2eSlogwang size_t private_data_size;
552bfe3f2eSlogwang int socket_id;
562bfe3f2eSlogwang unsigned int max_nb_queue_pairs;
57a9643ea8Slogwang };
58a9643ea8Slogwang
59a9643ea8Slogwang /** Global structure used for maintaining state of allocated crypto devices */
60a9643ea8Slogwang struct rte_cryptodev_global {
61a9643ea8Slogwang struct rte_cryptodev *devs; /**< Device information array */
62a9643ea8Slogwang struct rte_cryptodev_data *data[RTE_CRYPTO_MAX_DEVS];
63a9643ea8Slogwang /**< Device private data */
64a9643ea8Slogwang uint8_t nb_devs; /**< Number of devices found */
65a9643ea8Slogwang };
66a9643ea8Slogwang
672bfe3f2eSlogwang /* Cryptodev driver, containing the driver ID */
682bfe3f2eSlogwang struct cryptodev_driver {
692bfe3f2eSlogwang TAILQ_ENTRY(cryptodev_driver) next; /**< Next in list. */
702bfe3f2eSlogwang const struct rte_driver *driver;
712bfe3f2eSlogwang uint8_t id;
722bfe3f2eSlogwang };
732bfe3f2eSlogwang
74a9643ea8Slogwang /**
75a9643ea8Slogwang * Get the rte_cryptodev structure device pointer for the device. Assumes a
76a9643ea8Slogwang * valid device index.
77a9643ea8Slogwang *
78a9643ea8Slogwang * @param dev_id Device ID value to select the device structure.
79a9643ea8Slogwang *
80a9643ea8Slogwang * @return
81a9643ea8Slogwang * - The rte_cryptodev structure pointer for the given device ID.
82a9643ea8Slogwang */
832bfe3f2eSlogwang struct rte_cryptodev *
842bfe3f2eSlogwang rte_cryptodev_pmd_get_dev(uint8_t dev_id);
85a9643ea8Slogwang
86a9643ea8Slogwang /**
87a9643ea8Slogwang * Get the rte_cryptodev structure device pointer for the named device.
88a9643ea8Slogwang *
89a9643ea8Slogwang * @param name device name to select the device structure.
90a9643ea8Slogwang *
91a9643ea8Slogwang * @return
92a9643ea8Slogwang * - The rte_cryptodev structure pointer for the given device ID.
93a9643ea8Slogwang */
942bfe3f2eSlogwang struct rte_cryptodev *
952bfe3f2eSlogwang rte_cryptodev_pmd_get_named_dev(const char *name);
96a9643ea8Slogwang
97a9643ea8Slogwang /**
98a9643ea8Slogwang * Validate if the crypto device index is valid attached crypto device.
99a9643ea8Slogwang *
100a9643ea8Slogwang * @param dev_id Crypto device index.
101a9643ea8Slogwang *
102a9643ea8Slogwang * @return
103a9643ea8Slogwang * - If the device index is valid (1) or not (0).
104a9643ea8Slogwang */
1052bfe3f2eSlogwang unsigned int
1062bfe3f2eSlogwang rte_cryptodev_pmd_is_valid_dev(uint8_t dev_id);
107a9643ea8Slogwang
108a9643ea8Slogwang /**
109a9643ea8Slogwang * The pool of rte_cryptodev structures.
110a9643ea8Slogwang */
111a9643ea8Slogwang extern struct rte_cryptodev *rte_cryptodevs;
112a9643ea8Slogwang
113a9643ea8Slogwang
114a9643ea8Slogwang /**
115a9643ea8Slogwang * Definitions of all functions exported by a driver through the
116a9643ea8Slogwang * the generic structure of type *crypto_dev_ops* supplied in the
117a9643ea8Slogwang * *rte_cryptodev* structure associated with a device.
118a9643ea8Slogwang */
119a9643ea8Slogwang
120a9643ea8Slogwang /**
121a9643ea8Slogwang * Function used to configure device.
122a9643ea8Slogwang *
123a9643ea8Slogwang * @param dev Crypto device pointer
1242bfe3f2eSlogwang * config Crypto device configurations
125a9643ea8Slogwang *
126a9643ea8Slogwang * @return Returns 0 on success
127a9643ea8Slogwang */
1282bfe3f2eSlogwang typedef int (*cryptodev_configure_t)(struct rte_cryptodev *dev,
1292bfe3f2eSlogwang struct rte_cryptodev_config *config);
130a9643ea8Slogwang
131a9643ea8Slogwang /**
132a9643ea8Slogwang * Function used to start a configured device.
133a9643ea8Slogwang *
134a9643ea8Slogwang * @param dev Crypto device pointer
135a9643ea8Slogwang *
136a9643ea8Slogwang * @return Returns 0 on success
137a9643ea8Slogwang */
138a9643ea8Slogwang typedef int (*cryptodev_start_t)(struct rte_cryptodev *dev);
139a9643ea8Slogwang
140a9643ea8Slogwang /**
141a9643ea8Slogwang * Function used to stop a configured device.
142a9643ea8Slogwang *
143a9643ea8Slogwang * @param dev Crypto device pointer
144a9643ea8Slogwang */
145a9643ea8Slogwang typedef void (*cryptodev_stop_t)(struct rte_cryptodev *dev);
146a9643ea8Slogwang
147a9643ea8Slogwang /**
148a9643ea8Slogwang * Function used to close a configured device.
149a9643ea8Slogwang *
150a9643ea8Slogwang * @param dev Crypto device pointer
151a9643ea8Slogwang * @return
152a9643ea8Slogwang * - 0 on success.
153a9643ea8Slogwang * - EAGAIN if can't close as device is busy
154a9643ea8Slogwang */
155a9643ea8Slogwang typedef int (*cryptodev_close_t)(struct rte_cryptodev *dev);
156a9643ea8Slogwang
157a9643ea8Slogwang
158a9643ea8Slogwang /**
159a9643ea8Slogwang * Function used to get statistics of a device.
160a9643ea8Slogwang *
161a9643ea8Slogwang * @param dev Crypto device pointer
162a9643ea8Slogwang * @param stats Pointer to crypto device stats structure to populate
163a9643ea8Slogwang */
164a9643ea8Slogwang typedef void (*cryptodev_stats_get_t)(struct rte_cryptodev *dev,
165a9643ea8Slogwang struct rte_cryptodev_stats *stats);
166a9643ea8Slogwang
167a9643ea8Slogwang
168a9643ea8Slogwang /**
169a9643ea8Slogwang * Function used to reset statistics of a device.
170a9643ea8Slogwang *
171a9643ea8Slogwang * @param dev Crypto device pointer
172a9643ea8Slogwang */
173a9643ea8Slogwang typedef void (*cryptodev_stats_reset_t)(struct rte_cryptodev *dev);
174a9643ea8Slogwang
175a9643ea8Slogwang
176a9643ea8Slogwang /**
177a9643ea8Slogwang * Function used to get specific information of a device.
178a9643ea8Slogwang *
179a9643ea8Slogwang * @param dev Crypto device pointer
180a9643ea8Slogwang */
181a9643ea8Slogwang typedef void (*cryptodev_info_get_t)(struct rte_cryptodev *dev,
182a9643ea8Slogwang struct rte_cryptodev_info *dev_info);
183a9643ea8Slogwang
184a9643ea8Slogwang /**
185a9643ea8Slogwang * Setup a queue pair for a device.
186a9643ea8Slogwang *
187a9643ea8Slogwang * @param dev Crypto device pointer
188a9643ea8Slogwang * @param qp_id Queue Pair Index
189a9643ea8Slogwang * @param qp_conf Queue configuration structure
190a9643ea8Slogwang * @param socket_id Socket Index
191a9643ea8Slogwang *
192a9643ea8Slogwang * @return Returns 0 on success.
193a9643ea8Slogwang */
194a9643ea8Slogwang typedef int (*cryptodev_queue_pair_setup_t)(struct rte_cryptodev *dev,
195a9643ea8Slogwang uint16_t qp_id, const struct rte_cryptodev_qp_conf *qp_conf,
1964418919fSjohnjiang int socket_id);
197a9643ea8Slogwang
198a9643ea8Slogwang /**
199a9643ea8Slogwang * Release memory resources allocated by given queue pair.
200a9643ea8Slogwang *
201a9643ea8Slogwang * @param dev Crypto device pointer
202a9643ea8Slogwang * @param qp_id Queue Pair Index
203a9643ea8Slogwang *
204a9643ea8Slogwang * @return
205a9643ea8Slogwang * - 0 on success.
206a9643ea8Slogwang * - EAGAIN if can't close as device is busy
207a9643ea8Slogwang */
208a9643ea8Slogwang typedef int (*cryptodev_queue_pair_release_t)(struct rte_cryptodev *dev,
209a9643ea8Slogwang uint16_t qp_id);
210a9643ea8Slogwang
211a9643ea8Slogwang /**
212a9643ea8Slogwang * Create a session mempool to allocate sessions from
213a9643ea8Slogwang *
214a9643ea8Slogwang * @param dev Crypto device pointer
215a9643ea8Slogwang * @param nb_objs number of sessions objects in mempool
216a9643ea8Slogwang * @param obj_cache l-core object cache size, see *rte_ring_create*
217a9643ea8Slogwang * @param socket_id Socket Id to allocate mempool on.
218a9643ea8Slogwang *
219a9643ea8Slogwang * @return
220a9643ea8Slogwang * - On success returns a pointer to a rte_mempool
221a9643ea8Slogwang * - On failure returns a NULL pointer
222a9643ea8Slogwang */
223a9643ea8Slogwang typedef int (*cryptodev_sym_create_session_pool_t)(
224a9643ea8Slogwang struct rte_cryptodev *dev, unsigned nb_objs,
225a9643ea8Slogwang unsigned obj_cache_size, int socket_id);
226a9643ea8Slogwang
227a9643ea8Slogwang
228a9643ea8Slogwang /**
229a9643ea8Slogwang * Get the size of a cryptodev session
230a9643ea8Slogwang *
231a9643ea8Slogwang * @param dev Crypto device pointer
232a9643ea8Slogwang *
233a9643ea8Slogwang * @return
234a9643ea8Slogwang * - On success returns the size of the session structure for device
235a9643ea8Slogwang * - On failure returns 0
236a9643ea8Slogwang */
237a9643ea8Slogwang typedef unsigned (*cryptodev_sym_get_session_private_size_t)(
238a9643ea8Slogwang struct rte_cryptodev *dev);
239d30ea906Sjfb8856606 /**
240d30ea906Sjfb8856606 * Get the size of a asymmetric cryptodev session
241d30ea906Sjfb8856606 *
242d30ea906Sjfb8856606 * @param dev Crypto device pointer
243d30ea906Sjfb8856606 *
244d30ea906Sjfb8856606 * @return
245d30ea906Sjfb8856606 * - On success returns the size of the session structure for device
246d30ea906Sjfb8856606 * - On failure returns 0
247d30ea906Sjfb8856606 */
248d30ea906Sjfb8856606 typedef unsigned int (*cryptodev_asym_get_session_private_size_t)(
249d30ea906Sjfb8856606 struct rte_cryptodev *dev);
250a9643ea8Slogwang
251a9643ea8Slogwang /**
252a9643ea8Slogwang * Configure a Crypto session on a device.
253a9643ea8Slogwang *
254a9643ea8Slogwang * @param dev Crypto device pointer
255a9643ea8Slogwang * @param xform Single or chain of crypto xforms
256a9643ea8Slogwang * @param priv_sess Pointer to cryptodev's private session structure
2572bfe3f2eSlogwang * @param mp Mempool where the private session is allocated
258a9643ea8Slogwang *
259a9643ea8Slogwang * @return
2602bfe3f2eSlogwang * - Returns 0 if private session structure have been created successfully.
2612bfe3f2eSlogwang * - Returns -EINVAL if input parameters are invalid.
2622bfe3f2eSlogwang * - Returns -ENOTSUP if crypto device does not support the crypto transform.
2632bfe3f2eSlogwang * - Returns -ENOMEM if the private session could not be allocated.
264a9643ea8Slogwang */
2652bfe3f2eSlogwang typedef int (*cryptodev_sym_configure_session_t)(struct rte_cryptodev *dev,
2662bfe3f2eSlogwang struct rte_crypto_sym_xform *xform,
2672bfe3f2eSlogwang struct rte_cryptodev_sym_session *session,
2682bfe3f2eSlogwang struct rte_mempool *mp);
269d30ea906Sjfb8856606 /**
270d30ea906Sjfb8856606 * Configure a Crypto asymmetric session on a device.
271d30ea906Sjfb8856606 *
272d30ea906Sjfb8856606 * @param dev Crypto device pointer
273d30ea906Sjfb8856606 * @param xform Single or chain of crypto xforms
274d30ea906Sjfb8856606 * @param priv_sess Pointer to cryptodev's private session structure
275d30ea906Sjfb8856606 * @param mp Mempool where the private session is allocated
276d30ea906Sjfb8856606 *
277d30ea906Sjfb8856606 * @return
278d30ea906Sjfb8856606 * - Returns 0 if private session structure have been created successfully.
279d30ea906Sjfb8856606 * - Returns -EINVAL if input parameters are invalid.
280d30ea906Sjfb8856606 * - Returns -ENOTSUP if crypto device does not support the crypto transform.
281d30ea906Sjfb8856606 * - Returns -ENOMEM if the private session could not be allocated.
282d30ea906Sjfb8856606 */
283d30ea906Sjfb8856606 typedef int (*cryptodev_asym_configure_session_t)(struct rte_cryptodev *dev,
284d30ea906Sjfb8856606 struct rte_crypto_asym_xform *xform,
285d30ea906Sjfb8856606 struct rte_cryptodev_asym_session *session,
286d30ea906Sjfb8856606 struct rte_mempool *mp);
287a9643ea8Slogwang /**
2882bfe3f2eSlogwang * Free driver private session data.
2892bfe3f2eSlogwang *
2902bfe3f2eSlogwang * @param dev Crypto device pointer
2912bfe3f2eSlogwang * @param sess Cryptodev session structure
292a9643ea8Slogwang */
293a9643ea8Slogwang typedef void (*cryptodev_sym_free_session_t)(struct rte_cryptodev *dev,
2942bfe3f2eSlogwang struct rte_cryptodev_sym_session *sess);
2952bfe3f2eSlogwang /**
296d30ea906Sjfb8856606 * Free asymmetric session private data.
297d30ea906Sjfb8856606 *
2982bfe3f2eSlogwang * @param dev Crypto device pointer
299d30ea906Sjfb8856606 * @param sess Cryptodev session structure
3002bfe3f2eSlogwang */
301d30ea906Sjfb8856606 typedef void (*cryptodev_asym_free_session_t)(struct rte_cryptodev *dev,
302d30ea906Sjfb8856606 struct rte_cryptodev_asym_session *sess);
303*2d9fd380Sjfb8856606 /**
304*2d9fd380Sjfb8856606 * Perform actual crypto processing (encrypt/digest or auth/decrypt)
305*2d9fd380Sjfb8856606 * on user provided data.
306*2d9fd380Sjfb8856606 *
307*2d9fd380Sjfb8856606 * @param dev Crypto device pointer
308*2d9fd380Sjfb8856606 * @param sess Cryptodev session structure
309*2d9fd380Sjfb8856606 * @param ofs Start and stop offsets for auth and cipher operations
310*2d9fd380Sjfb8856606 * @param vec Vectorized operation descriptor
311*2d9fd380Sjfb8856606 *
312*2d9fd380Sjfb8856606 * @return
313*2d9fd380Sjfb8856606 * - Returns number of successfully processed packets.
314*2d9fd380Sjfb8856606 *
315*2d9fd380Sjfb8856606 */
316*2d9fd380Sjfb8856606 typedef uint32_t (*cryptodev_sym_cpu_crypto_process_t)
317*2d9fd380Sjfb8856606 (struct rte_cryptodev *dev, struct rte_cryptodev_sym_session *sess,
318*2d9fd380Sjfb8856606 union rte_crypto_sym_ofs ofs, struct rte_crypto_sym_vec *vec);
319*2d9fd380Sjfb8856606
320*2d9fd380Sjfb8856606 /**
321*2d9fd380Sjfb8856606 * Typedef that the driver provided to get service context private date size.
322*2d9fd380Sjfb8856606 *
323*2d9fd380Sjfb8856606 * @param dev Crypto device pointer.
324*2d9fd380Sjfb8856606 *
325*2d9fd380Sjfb8856606 * @return
326*2d9fd380Sjfb8856606 * - On success return the size of the device's service context private data.
327*2d9fd380Sjfb8856606 * - On failure return negative integer.
328*2d9fd380Sjfb8856606 */
329*2d9fd380Sjfb8856606 typedef int (*cryptodev_sym_get_raw_dp_ctx_size_t)(struct rte_cryptodev *dev);
330*2d9fd380Sjfb8856606
331*2d9fd380Sjfb8856606 /**
332*2d9fd380Sjfb8856606 * Typedef that the driver provided to configure raw data-path context.
333*2d9fd380Sjfb8856606 *
334*2d9fd380Sjfb8856606 * @param dev Crypto device pointer.
335*2d9fd380Sjfb8856606 * @param qp_id Crypto device queue pair index.
336*2d9fd380Sjfb8856606 * @param service_type Type of the service requested.
337*2d9fd380Sjfb8856606 * @param ctx The raw data-path context data.
338*2d9fd380Sjfb8856606 * @param sess_type session type.
339*2d9fd380Sjfb8856606 * @param session_ctx Session context data. If NULL the driver
340*2d9fd380Sjfb8856606 * shall only configure the drv_ctx_data in
341*2d9fd380Sjfb8856606 * ctx buffer. Otherwise the driver shall only
342*2d9fd380Sjfb8856606 * parse the session_ctx to set appropriate
343*2d9fd380Sjfb8856606 * function pointers in ctx.
344*2d9fd380Sjfb8856606 * @param is_update Set 0 if it is to initialize the ctx.
345*2d9fd380Sjfb8856606 * Set 1 if ctx is initialized and only to update
346*2d9fd380Sjfb8856606 * session context data.
347*2d9fd380Sjfb8856606 * @return
348*2d9fd380Sjfb8856606 * - On success return 0.
349*2d9fd380Sjfb8856606 * - On failure return negative integer.
350*2d9fd380Sjfb8856606 */
351*2d9fd380Sjfb8856606 typedef int (*cryptodev_sym_configure_raw_dp_ctx_t)(
352*2d9fd380Sjfb8856606 struct rte_cryptodev *dev, uint16_t qp_id,
353*2d9fd380Sjfb8856606 struct rte_crypto_raw_dp_ctx *ctx,
354*2d9fd380Sjfb8856606 enum rte_crypto_op_sess_type sess_type,
355*2d9fd380Sjfb8856606 union rte_cryptodev_session_ctx session_ctx, uint8_t is_update);
356a9643ea8Slogwang
357a9643ea8Slogwang /** Crypto device operations function pointer table */
358a9643ea8Slogwang struct rte_cryptodev_ops {
359a9643ea8Slogwang cryptodev_configure_t dev_configure; /**< Configure device. */
360a9643ea8Slogwang cryptodev_start_t dev_start; /**< Start device. */
361a9643ea8Slogwang cryptodev_stop_t dev_stop; /**< Stop device. */
362a9643ea8Slogwang cryptodev_close_t dev_close; /**< Close device. */
363a9643ea8Slogwang
364a9643ea8Slogwang cryptodev_info_get_t dev_infos_get; /**< Get device info. */
365a9643ea8Slogwang
366a9643ea8Slogwang cryptodev_stats_get_t stats_get;
367a9643ea8Slogwang /**< Get device statistics. */
368a9643ea8Slogwang cryptodev_stats_reset_t stats_reset;
369a9643ea8Slogwang /**< Reset device statistics. */
370a9643ea8Slogwang
371a9643ea8Slogwang cryptodev_queue_pair_setup_t queue_pair_setup;
372a9643ea8Slogwang /**< Set up a device queue pair. */
373a9643ea8Slogwang cryptodev_queue_pair_release_t queue_pair_release;
374a9643ea8Slogwang /**< Release a queue pair. */
375a9643ea8Slogwang
376d30ea906Sjfb8856606 cryptodev_sym_get_session_private_size_t sym_session_get_size;
377a9643ea8Slogwang /**< Return private session. */
378d30ea906Sjfb8856606 cryptodev_asym_get_session_private_size_t asym_session_get_size;
379d30ea906Sjfb8856606 /**< Return asym session private size. */
380d30ea906Sjfb8856606 cryptodev_sym_configure_session_t sym_session_configure;
381a9643ea8Slogwang /**< Configure a Crypto session. */
382d30ea906Sjfb8856606 cryptodev_asym_configure_session_t asym_session_configure;
383d30ea906Sjfb8856606 /**< Configure asymmetric Crypto session. */
384d30ea906Sjfb8856606 cryptodev_sym_free_session_t sym_session_clear;
385a9643ea8Slogwang /**< Clear a Crypto sessions private data. */
386d30ea906Sjfb8856606 cryptodev_asym_free_session_t asym_session_clear;
387d30ea906Sjfb8856606 /**< Clear a Crypto sessions private data. */
388*2d9fd380Sjfb8856606 union {
389*2d9fd380Sjfb8856606 cryptodev_sym_cpu_crypto_process_t sym_cpu_process;
390*2d9fd380Sjfb8856606 /**< process input data synchronously (cpu-crypto). */
391*2d9fd380Sjfb8856606 __extension__
392*2d9fd380Sjfb8856606 struct {
393*2d9fd380Sjfb8856606 cryptodev_sym_get_raw_dp_ctx_size_t
394*2d9fd380Sjfb8856606 sym_get_raw_dp_ctx_size;
395*2d9fd380Sjfb8856606 /**< Get raw data path service context data size. */
396*2d9fd380Sjfb8856606 cryptodev_sym_configure_raw_dp_ctx_t
397*2d9fd380Sjfb8856606 sym_configure_raw_dp_ctx;
398*2d9fd380Sjfb8856606 /**< Initialize raw data path context data. */
399*2d9fd380Sjfb8856606 };
400*2d9fd380Sjfb8856606 };
401a9643ea8Slogwang };
402a9643ea8Slogwang
403a9643ea8Slogwang
404a9643ea8Slogwang /**
405a9643ea8Slogwang * Function for internal use by dummy drivers primarily, e.g. ring-based
406a9643ea8Slogwang * driver.
407a9643ea8Slogwang * Allocates a new cryptodev slot for an crypto device and returns the pointer
408a9643ea8Slogwang * to that slot for the driver to use.
409a9643ea8Slogwang *
410a9643ea8Slogwang * @param name Unique identifier name for each device
411a9643ea8Slogwang * @param socket_id Socket to allocate resources on.
412a9643ea8Slogwang * @return
413a9643ea8Slogwang * - Slot in the rte_dev_devices array for a new device;
414a9643ea8Slogwang */
415a9643ea8Slogwang struct rte_cryptodev *
4162bfe3f2eSlogwang rte_cryptodev_pmd_allocate(const char *name, int socket_id);
417a9643ea8Slogwang
418a9643ea8Slogwang /**
419a9643ea8Slogwang * Function for internal use by dummy drivers primarily, e.g. ring-based
420a9643ea8Slogwang * driver.
421a9643ea8Slogwang * Release the specified cryptodev device.
422a9643ea8Slogwang *
423a9643ea8Slogwang * @param cryptodev
424a9643ea8Slogwang * The *cryptodev* pointer is the address of the *rte_cryptodev* structure.
425a9643ea8Slogwang * @return
426a9643ea8Slogwang * - 0 on success, negative on error
427a9643ea8Slogwang */
428a9643ea8Slogwang extern int
429a9643ea8Slogwang rte_cryptodev_pmd_release_device(struct rte_cryptodev *cryptodev);
430a9643ea8Slogwang
431a9643ea8Slogwang
432a9643ea8Slogwang /**
4332bfe3f2eSlogwang * @internal
434a9643ea8Slogwang *
4352bfe3f2eSlogwang * PMD assist function to parse initialisation arguments for crypto driver
4362bfe3f2eSlogwang * when creating a new crypto PMD device instance.
437a9643ea8Slogwang *
4382bfe3f2eSlogwang * PMD driver should set default values for that PMD before calling function,
4392bfe3f2eSlogwang * these default values will be over-written with successfully parsed values
4402bfe3f2eSlogwang * from args string.
441a9643ea8Slogwang *
4422bfe3f2eSlogwang * @param params parsed PMD initialisation parameters
4432bfe3f2eSlogwang * @param args input argument string to parse
444a9643ea8Slogwang *
4452bfe3f2eSlogwang * @return
4462bfe3f2eSlogwang * - 0 on success
4472bfe3f2eSlogwang * - errno on failure
448a9643ea8Slogwang */
4492bfe3f2eSlogwang int
4502bfe3f2eSlogwang rte_cryptodev_pmd_parse_input_args(
4512bfe3f2eSlogwang struct rte_cryptodev_pmd_init_params *params,
4522bfe3f2eSlogwang const char *args);
4532bfe3f2eSlogwang
4542bfe3f2eSlogwang /**
4552bfe3f2eSlogwang * @internal
4562bfe3f2eSlogwang *
4572bfe3f2eSlogwang * PMD assist function to provide boiler plate code for crypto driver to create
4582bfe3f2eSlogwang * and allocate resources for a new crypto PMD device instance.
4592bfe3f2eSlogwang *
4602bfe3f2eSlogwang * @param name crypto device name.
4612bfe3f2eSlogwang * @param device base device instance
4622bfe3f2eSlogwang * @param params PMD initialisation parameters
4632bfe3f2eSlogwang *
4642bfe3f2eSlogwang * @return
4652bfe3f2eSlogwang * - crypto device instance on success
4662bfe3f2eSlogwang * - NULL on creation failure
4672bfe3f2eSlogwang */
4682bfe3f2eSlogwang struct rte_cryptodev *
4692bfe3f2eSlogwang rte_cryptodev_pmd_create(const char *name,
4702bfe3f2eSlogwang struct rte_device *device,
4712bfe3f2eSlogwang struct rte_cryptodev_pmd_init_params *params);
4722bfe3f2eSlogwang
4732bfe3f2eSlogwang /**
4742bfe3f2eSlogwang * @internal
4752bfe3f2eSlogwang *
4762bfe3f2eSlogwang * PMD assist function to provide boiler plate code for crypto driver to
4772bfe3f2eSlogwang * destroy and free resources associated with a crypto PMD device instance.
4782bfe3f2eSlogwang *
4792bfe3f2eSlogwang * @param cryptodev crypto device handle.
4802bfe3f2eSlogwang *
4812bfe3f2eSlogwang * @return
4822bfe3f2eSlogwang * - 0 on success
4832bfe3f2eSlogwang * - errno on failure
4842bfe3f2eSlogwang */
4852bfe3f2eSlogwang int
4862bfe3f2eSlogwang rte_cryptodev_pmd_destroy(struct rte_cryptodev *cryptodev);
487a9643ea8Slogwang
488a9643ea8Slogwang /**
489a9643ea8Slogwang * Executes all the user application registered callbacks for the specific
490a9643ea8Slogwang * device.
491a9643ea8Slogwang * *
492a9643ea8Slogwang * @param dev Pointer to cryptodev struct
493a9643ea8Slogwang * @param event Crypto device interrupt event type.
494a9643ea8Slogwang *
495a9643ea8Slogwang * @return
496a9643ea8Slogwang * void
497a9643ea8Slogwang */
498a9643ea8Slogwang void rte_cryptodev_pmd_callback_process(struct rte_cryptodev *dev,
499a9643ea8Slogwang enum rte_cryptodev_event_type event);
500a9643ea8Slogwang
5012bfe3f2eSlogwang /**
5022bfe3f2eSlogwang * @internal
5032bfe3f2eSlogwang * Create unique device name
5042bfe3f2eSlogwang */
5052bfe3f2eSlogwang int
5062bfe3f2eSlogwang rte_cryptodev_pmd_create_dev_name(char *name, const char *dev_name_prefix);
5072bfe3f2eSlogwang
5082bfe3f2eSlogwang /**
5092bfe3f2eSlogwang * @internal
5102bfe3f2eSlogwang * Allocate Cryptodev driver.
5112bfe3f2eSlogwang *
5122bfe3f2eSlogwang * @param crypto_drv
5132bfe3f2eSlogwang * Pointer to cryptodev_driver.
5142bfe3f2eSlogwang * @param drv
5152bfe3f2eSlogwang * Pointer to rte_driver.
5162bfe3f2eSlogwang *
5172bfe3f2eSlogwang * @return
5182bfe3f2eSlogwang * The driver type identifier
5192bfe3f2eSlogwang */
5202bfe3f2eSlogwang uint8_t rte_cryptodev_allocate_driver(struct cryptodev_driver *crypto_drv,
5212bfe3f2eSlogwang const struct rte_driver *drv);
5222bfe3f2eSlogwang
5232bfe3f2eSlogwang
5242bfe3f2eSlogwang #define RTE_PMD_REGISTER_CRYPTO_DRIVER(crypto_drv, drv, driver_id)\
525d30ea906Sjfb8856606 RTE_INIT(init_ ##driver_id)\
5262bfe3f2eSlogwang {\
527d30ea906Sjfb8856606 driver_id = rte_cryptodev_allocate_driver(&crypto_drv, &(drv));\
5282bfe3f2eSlogwang }
5292bfe3f2eSlogwang
5302bfe3f2eSlogwang static inline void *
get_sym_session_private_data(const struct rte_cryptodev_sym_session * sess,uint8_t driver_id)531d30ea906Sjfb8856606 get_sym_session_private_data(const struct rte_cryptodev_sym_session *sess,
5322bfe3f2eSlogwang uint8_t driver_id) {
5334418919fSjohnjiang if (unlikely(sess->nb_drivers <= driver_id))
5344418919fSjohnjiang return NULL;
5354418919fSjohnjiang
5364418919fSjohnjiang return sess->sess_data[driver_id].data;
5372bfe3f2eSlogwang }
5382bfe3f2eSlogwang
5392bfe3f2eSlogwang static inline void
set_sym_session_private_data(struct rte_cryptodev_sym_session * sess,uint8_t driver_id,void * private_data)540d30ea906Sjfb8856606 set_sym_session_private_data(struct rte_cryptodev_sym_session *sess,
541d30ea906Sjfb8856606 uint8_t driver_id, void *private_data)
542d30ea906Sjfb8856606 {
5434418919fSjohnjiang if (unlikely(sess->nb_drivers <= driver_id)) {
5444418919fSjohnjiang CDEV_LOG_ERR("Set private data for driver %u not allowed\n",
5454418919fSjohnjiang driver_id);
5464418919fSjohnjiang return;
5474418919fSjohnjiang }
5484418919fSjohnjiang
5494418919fSjohnjiang sess->sess_data[driver_id].data = private_data;
550d30ea906Sjfb8856606 }
551d30ea906Sjfb8856606
552d30ea906Sjfb8856606 static inline void *
get_asym_session_private_data(const struct rte_cryptodev_asym_session * sess,uint8_t driver_id)553d30ea906Sjfb8856606 get_asym_session_private_data(const struct rte_cryptodev_asym_session *sess,
554d30ea906Sjfb8856606 uint8_t driver_id) {
555d30ea906Sjfb8856606 return sess->sess_private_data[driver_id];
556d30ea906Sjfb8856606 }
557d30ea906Sjfb8856606
558d30ea906Sjfb8856606 static inline void
set_asym_session_private_data(struct rte_cryptodev_asym_session * sess,uint8_t driver_id,void * private_data)559d30ea906Sjfb8856606 set_asym_session_private_data(struct rte_cryptodev_asym_session *sess,
5602bfe3f2eSlogwang uint8_t driver_id, void *private_data)
5612bfe3f2eSlogwang {
5622bfe3f2eSlogwang sess->sess_private_data[driver_id] = private_data;
5632bfe3f2eSlogwang }
564a9643ea8Slogwang
565a9643ea8Slogwang #ifdef __cplusplus
566a9643ea8Slogwang }
567a9643ea8Slogwang #endif
568a9643ea8Slogwang
569a9643ea8Slogwang #endif /* _RTE_CRYPTODEV_PMD_H_ */
570