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