xref: /dpdk/lib/cryptodev/rte_cryptodev.c (revision 4acc862b18a2f1691d1561f7b75542f6a056d41f)
199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
299a2dd95SBruce Richardson  * Copyright(c) 2015-2020 Intel Corporation
399a2dd95SBruce Richardson  */
499a2dd95SBruce Richardson 
599a2dd95SBruce Richardson #include <sys/queue.h>
699a2dd95SBruce Richardson #include <ctype.h>
799a2dd95SBruce Richardson #include <stdio.h>
899a2dd95SBruce Richardson #include <stdlib.h>
999a2dd95SBruce Richardson #include <string.h>
1099a2dd95SBruce Richardson #include <errno.h>
1199a2dd95SBruce Richardson #include <stdint.h>
1299a2dd95SBruce Richardson #include <inttypes.h>
1399a2dd95SBruce Richardson 
1499a2dd95SBruce Richardson #include <rte_log.h>
1599a2dd95SBruce Richardson #include <rte_debug.h>
161acb7f54SDavid Marchand #include <dev_driver.h>
1799a2dd95SBruce Richardson #include <rte_memory.h>
1899a2dd95SBruce Richardson #include <rte_memcpy.h>
1999a2dd95SBruce Richardson #include <rte_memzone.h>
2099a2dd95SBruce Richardson #include <rte_eal.h>
2199a2dd95SBruce Richardson #include <rte_common.h>
2299a2dd95SBruce Richardson #include <rte_mempool.h>
2399a2dd95SBruce Richardson #include <rte_malloc.h>
2499a2dd95SBruce Richardson #include <rte_errno.h>
2599a2dd95SBruce Richardson #include <rte_spinlock.h>
2699a2dd95SBruce Richardson #include <rte_string_fns.h>
27d3d98f5cSRebecca Troy #include <rte_telemetry.h>
2899a2dd95SBruce Richardson 
2999a2dd95SBruce Richardson #include "rte_crypto.h"
3099a2dd95SBruce Richardson #include "rte_cryptodev.h"
31af668035SAkhil Goyal #include "cryptodev_pmd.h"
323ac1fb17SAnkur Dwivedi #include "cryptodev_trace.h"
3399a2dd95SBruce Richardson 
3499a2dd95SBruce Richardson static uint8_t nb_drivers;
3599a2dd95SBruce Richardson 
3699a2dd95SBruce Richardson static struct rte_cryptodev rte_crypto_devices[RTE_CRYPTO_MAX_DEVS];
3799a2dd95SBruce Richardson 
3899a2dd95SBruce Richardson struct rte_cryptodev *rte_cryptodevs = rte_crypto_devices;
3999a2dd95SBruce Richardson 
4099a2dd95SBruce Richardson static struct rte_cryptodev_global cryptodev_globals = {
4199a2dd95SBruce Richardson 		.devs			= rte_crypto_devices,
4299a2dd95SBruce Richardson 		.data			= { NULL },
4399a2dd95SBruce Richardson 		.nb_devs		= 0
4499a2dd95SBruce Richardson };
4599a2dd95SBruce Richardson 
462fd66f75SAkhil Goyal /* Public fastpath APIs. */
472fd66f75SAkhil Goyal struct rte_crypto_fp_ops rte_crypto_fp_ops[RTE_CRYPTO_MAX_DEVS];
482fd66f75SAkhil Goyal 
4999a2dd95SBruce Richardson /* spinlock for crypto device callbacks */
5099a2dd95SBruce Richardson static rte_spinlock_t rte_cryptodev_cb_lock = RTE_SPINLOCK_INITIALIZER;
5199a2dd95SBruce Richardson 
52e5dc404dSStephen Hemminger RTE_LOG_REGISTER_DEFAULT(rte_cryptodev_logtype, INFO);
53e5dc404dSStephen Hemminger 
5499a2dd95SBruce Richardson /**
5599a2dd95SBruce Richardson  * The user application callback description.
5699a2dd95SBruce Richardson  *
5799a2dd95SBruce Richardson  * It contains callback address to be registered by user application,
5899a2dd95SBruce Richardson  * the pointer to the parameters for callback, and the event type.
5999a2dd95SBruce Richardson  */
6099a2dd95SBruce Richardson struct rte_cryptodev_callback {
6199a2dd95SBruce Richardson 	TAILQ_ENTRY(rte_cryptodev_callback) next; /**< Callbacks list */
6299a2dd95SBruce Richardson 	rte_cryptodev_cb_fn cb_fn;		/**< Callback address */
6399a2dd95SBruce Richardson 	void *cb_arg;				/**< Parameter for callback */
6499a2dd95SBruce Richardson 	enum rte_cryptodev_event_type event;	/**< Interrupt event type */
6599a2dd95SBruce Richardson 	uint32_t active;			/**< Callback is executing */
6699a2dd95SBruce Richardson };
6799a2dd95SBruce Richardson 
6899a2dd95SBruce Richardson /**
697e1e1277SAkhil Goyal  * The crypto cipher algorithm strings identifiers.
707e1e1277SAkhil Goyal  * Not to be used in application directly.
717e1e1277SAkhil Goyal  * Application can use rte_cryptodev_get_cipher_algo_string().
727e1e1277SAkhil Goyal  */
737e1e1277SAkhil Goyal static const char *
747e1e1277SAkhil Goyal crypto_cipher_algorithm_strings[] = {
757e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_3DES_CBC]	= "3des-cbc",
767e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_3DES_ECB]	= "3des-ecb",
777e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_3DES_CTR]	= "3des-ctr",
787e1e1277SAkhil Goyal 
797e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_AES_CBC]	= "aes-cbc",
807e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_AES_CTR]	= "aes-ctr",
817e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_AES_DOCSISBPI]	= "aes-docsisbpi",
827e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_AES_ECB]	= "aes-ecb",
837e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_AES_F8]	= "aes-f8",
847e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_AES_XTS]	= "aes-xts",
857e1e1277SAkhil Goyal 
867e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_ARC4]	= "arc4",
877e1e1277SAkhil Goyal 
887e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_DES_CBC]     = "des-cbc",
897e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_DES_DOCSISBPI]	= "des-docsisbpi",
907e1e1277SAkhil Goyal 
917e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_NULL]	= "null",
927e1e1277SAkhil Goyal 
937e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_KASUMI_F8]	= "kasumi-f8",
947e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_SNOW3G_UEA2]	= "snow3g-uea2",
957e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_ZUC_EEA3]	= "zuc-eea3",
967e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_SM4_ECB]	= "sm4-ecb",
977e1e1277SAkhil Goyal 	[RTE_CRYPTO_CIPHER_SM4_CBC]	= "sm4-cbc",
981daecf63SSunyang Wu 	[RTE_CRYPTO_CIPHER_SM4_CTR]	= "sm4-ctr",
991daecf63SSunyang Wu 	[RTE_CRYPTO_CIPHER_SM4_CFB]	= "sm4-cfb",
100*4acc862bSHanxiao Li 	[RTE_CRYPTO_CIPHER_SM4_OFB]	= "sm4-ofb",
101*4acc862bSHanxiao Li 	[RTE_CRYPTO_CIPHER_SM4_XTS]	= "sm4-xts"
1027e1e1277SAkhil Goyal };
1037e1e1277SAkhil Goyal 
1047e1e1277SAkhil Goyal /**
10599a2dd95SBruce Richardson  * The crypto cipher operation strings identifiers.
10699a2dd95SBruce Richardson  * It could be used in application command line.
10799a2dd95SBruce Richardson  */
10899a2dd95SBruce Richardson const char *
10999a2dd95SBruce Richardson rte_crypto_cipher_operation_strings[] = {
11099a2dd95SBruce Richardson 		[RTE_CRYPTO_CIPHER_OP_ENCRYPT]	= "encrypt",
11199a2dd95SBruce Richardson 		[RTE_CRYPTO_CIPHER_OP_DECRYPT]	= "decrypt"
11299a2dd95SBruce Richardson };
11399a2dd95SBruce Richardson 
11499a2dd95SBruce Richardson /**
1157e1e1277SAkhil Goyal  * The crypto auth algorithm strings identifiers.
1167e1e1277SAkhil Goyal  * Not to be used in application directly.
1177e1e1277SAkhil Goyal  * Application can use rte_cryptodev_get_auth_algo_string().
1187e1e1277SAkhil Goyal  */
1197e1e1277SAkhil Goyal static const char *
1207e1e1277SAkhil Goyal crypto_auth_algorithm_strings[] = {
1217e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_AES_CBC_MAC]	= "aes-cbc-mac",
1227e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_AES_CMAC]	= "aes-cmac",
1237e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_AES_GMAC]	= "aes-gmac",
1247e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_AES_XCBC_MAC]	= "aes-xcbc-mac",
1257e1e1277SAkhil Goyal 
1267e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_MD5]		= "md5",
1277e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_MD5_HMAC]	= "md5-hmac",
1287e1e1277SAkhil Goyal 
1297e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_NULL]		= "null",
1307e1e1277SAkhil Goyal 
1317e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA1]		= "sha1",
1327e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA1_HMAC]	= "sha1-hmac",
1337e1e1277SAkhil Goyal 
1347e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA224]	= "sha2-224",
1357e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA224_HMAC]	= "sha2-224-hmac",
1367e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA256]	= "sha2-256",
1377e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA256_HMAC]	= "sha2-256-hmac",
1387e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA384]	= "sha2-384",
1397e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA384_HMAC]	= "sha2-384-hmac",
1407e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA512]	= "sha2-512",
1417e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA512_HMAC]	= "sha2-512-hmac",
1427e1e1277SAkhil Goyal 
1437e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA3_224]	= "sha3-224",
1447e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA3_224_HMAC] = "sha3-224-hmac",
1457e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA3_256]	= "sha3-256",
1467e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA3_256_HMAC] = "sha3-256-hmac",
1477e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA3_384]	= "sha3-384",
1487e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA3_384_HMAC] = "sha3-384-hmac",
1497e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA3_512]	= "sha3-512",
1507e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SHA3_512_HMAC]	= "sha3-512-hmac",
1517e1e1277SAkhil Goyal 
1527e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_KASUMI_F9]	= "kasumi-f9",
1537e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_SNOW3G_UIA2]	= "snow3g-uia2",
1547e1e1277SAkhil Goyal 	[RTE_CRYPTO_AUTH_ZUC_EIA3]	= "zuc-eia3",
15556ee8af9SVolodymyr Fialko 	[RTE_CRYPTO_AUTH_SM3]		= "sm3",
1561daecf63SSunyang Wu 	[RTE_CRYPTO_AUTH_SM3_HMAC]	= "sm3-hmac",
15756ee8af9SVolodymyr Fialko 
15856ee8af9SVolodymyr Fialko 	[RTE_CRYPTO_AUTH_SHAKE_128]	 = "shake-128",
15956ee8af9SVolodymyr Fialko 	[RTE_CRYPTO_AUTH_SHAKE_256]	 = "shake-256",
1607e1e1277SAkhil Goyal };
1617e1e1277SAkhil Goyal 
1627e1e1277SAkhil Goyal /**
1637e1e1277SAkhil Goyal  * The crypto AEAD algorithm strings identifiers.
1647e1e1277SAkhil Goyal  * Not to be used in application directly.
1657e1e1277SAkhil Goyal  * Application can use rte_cryptodev_get_aead_algo_string().
1667e1e1277SAkhil Goyal  */
1677e1e1277SAkhil Goyal static const char *
1687e1e1277SAkhil Goyal crypto_aead_algorithm_strings[] = {
1697e1e1277SAkhil Goyal 	[RTE_CRYPTO_AEAD_AES_CCM]	= "aes-ccm",
1707e1e1277SAkhil Goyal 	[RTE_CRYPTO_AEAD_AES_GCM]	= "aes-gcm",
1717e1e1277SAkhil Goyal 	[RTE_CRYPTO_AEAD_CHACHA20_POLY1305] = "chacha20-poly1305"
1727e1e1277SAkhil Goyal };
1737e1e1277SAkhil Goyal 
1747e1e1277SAkhil Goyal 
1757e1e1277SAkhil Goyal /**
17699a2dd95SBruce Richardson  * The crypto AEAD operation strings identifiers.
17799a2dd95SBruce Richardson  * It could be used in application command line.
17899a2dd95SBruce Richardson  */
17999a2dd95SBruce Richardson const char *
18099a2dd95SBruce Richardson rte_crypto_aead_operation_strings[] = {
18199a2dd95SBruce Richardson 	[RTE_CRYPTO_AEAD_OP_ENCRYPT]	= "encrypt",
18299a2dd95SBruce Richardson 	[RTE_CRYPTO_AEAD_OP_DECRYPT]	= "decrypt"
18399a2dd95SBruce Richardson };
18499a2dd95SBruce Richardson 
18599a2dd95SBruce Richardson /**
1867e1e1277SAkhil Goyal  * Asymmetric crypto transform operation strings identifiers.
1877e1e1277SAkhil Goyal  * Not to be used in application directly.
1887e1e1277SAkhil Goyal  * Application can use rte_cryptodev_asym_get_xform_string().
1897e1e1277SAkhil Goyal  */
1907e1e1277SAkhil Goyal static const char *
1917e1e1277SAkhil Goyal crypto_asym_xform_strings[] = {
1927e1e1277SAkhil Goyal 	[RTE_CRYPTO_ASYM_XFORM_NONE]	= "none",
1937e1e1277SAkhil Goyal 	[RTE_CRYPTO_ASYM_XFORM_RSA]	= "rsa",
1947e1e1277SAkhil Goyal 	[RTE_CRYPTO_ASYM_XFORM_MODEX]	= "modexp",
1957e1e1277SAkhil Goyal 	[RTE_CRYPTO_ASYM_XFORM_MODINV]	= "modinv",
1967e1e1277SAkhil Goyal 	[RTE_CRYPTO_ASYM_XFORM_DH]	= "dh",
1977e1e1277SAkhil Goyal 	[RTE_CRYPTO_ASYM_XFORM_DSA]	= "dsa",
1987e1e1277SAkhil Goyal 	[RTE_CRYPTO_ASYM_XFORM_ECDSA]	= "ecdsa",
1997e1e1277SAkhil Goyal 	[RTE_CRYPTO_ASYM_XFORM_ECPM]	= "ecpm",
2002d970c66SGowrishankar Muthukrishnan 	[RTE_CRYPTO_ASYM_XFORM_SM2]	= "sm2",
2017e1e1277SAkhil Goyal };
2027e1e1277SAkhil Goyal 
2037e1e1277SAkhil Goyal /**
20499a2dd95SBruce Richardson  * Asymmetric crypto operation strings identifiers.
20599a2dd95SBruce Richardson  */
20699a2dd95SBruce Richardson const char *rte_crypto_asym_op_strings[] = {
20799a2dd95SBruce Richardson 	[RTE_CRYPTO_ASYM_OP_ENCRYPT]	= "encrypt",
20899a2dd95SBruce Richardson 	[RTE_CRYPTO_ASYM_OP_DECRYPT]	= "decrypt",
20999a2dd95SBruce Richardson 	[RTE_CRYPTO_ASYM_OP_SIGN]	= "sign",
2105fa1fb29SArek Kusztal 	[RTE_CRYPTO_ASYM_OP_VERIFY]	= "verify"
2115fa1fb29SArek Kusztal };
2125fa1fb29SArek Kusztal 
2135fa1fb29SArek Kusztal /**
2145fa1fb29SArek Kusztal  * Asymmetric crypto key exchange operation strings identifiers.
2155fa1fb29SArek Kusztal  */
2165fa1fb29SArek Kusztal const char *rte_crypto_asym_ke_strings[] = {
2175fa1fb29SArek Kusztal 	[RTE_CRYPTO_ASYM_KE_PRIV_KEY_GENERATE] = "priv_key_generate",
2185fa1fb29SArek Kusztal 	[RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE] = "pub_key_generate",
2192adb8529SArek Kusztal 	[RTE_CRYPTO_ASYM_KE_SHARED_SECRET_COMPUTE] = "sharedsecret_compute",
2202adb8529SArek Kusztal 	[RTE_CRYPTO_ASYM_KE_PUB_KEY_VERIFY] = "pub_ec_key_verify"
22199a2dd95SBruce Richardson };
22299a2dd95SBruce Richardson 
22399a2dd95SBruce Richardson struct rte_cryptodev_sym_session_pool_private_data {
224bdce2564SAkhil Goyal 	uint16_t sess_data_sz;
225bdce2564SAkhil Goyal 	/**< driver session data size */
22699a2dd95SBruce Richardson 	uint16_t user_data_sz;
22799a2dd95SBruce Richardson 	/**< session user data will be placed after sess_data */
22899a2dd95SBruce Richardson };
22999a2dd95SBruce Richardson 
2301f1e4b7cSCiara Power /**
2311f1e4b7cSCiara Power  * The private data structure stored in the asym session mempool private data.
2321f1e4b7cSCiara Power  */
2331f1e4b7cSCiara Power struct rte_cryptodev_asym_session_pool_private_data {
2341f1e4b7cSCiara Power 	uint16_t max_priv_session_sz;
2351f1e4b7cSCiara Power 	/**< Size of private session data used when creating mempool */
23692d55afeSCiara Power 	uint16_t user_data_sz;
23792d55afeSCiara Power 	/**< Session user data will be placed after sess_private_data */
2381f1e4b7cSCiara Power };
2391f1e4b7cSCiara Power 
24099a2dd95SBruce Richardson int
24199a2dd95SBruce Richardson rte_cryptodev_get_cipher_algo_enum(enum rte_crypto_cipher_algorithm *algo_enum,
24299a2dd95SBruce Richardson 		const char *algo_string)
24399a2dd95SBruce Richardson {
24499a2dd95SBruce Richardson 	unsigned int i;
2453ebb587eSAmit Prakash Shukla 	int ret = -1;	/* Invalid string */
24699a2dd95SBruce Richardson 
2477e1e1277SAkhil Goyal 	for (i = 1; i < RTE_DIM(crypto_cipher_algorithm_strings); i++) {
2487e1e1277SAkhil Goyal 		if (strcmp(algo_string, crypto_cipher_algorithm_strings[i]) == 0) {
24999a2dd95SBruce Richardson 			*algo_enum = (enum rte_crypto_cipher_algorithm) i;
2503ebb587eSAmit Prakash Shukla 			ret = 0;
2513ebb587eSAmit Prakash Shukla 			break;
25299a2dd95SBruce Richardson 		}
25399a2dd95SBruce Richardson 	}
25499a2dd95SBruce Richardson 
2553ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_get_cipher_algo_enum(algo_string, *algo_enum, ret);
2563ebb587eSAmit Prakash Shukla 
2573ebb587eSAmit Prakash Shukla 	return ret;
25899a2dd95SBruce Richardson }
25999a2dd95SBruce Richardson 
26099a2dd95SBruce Richardson int
26199a2dd95SBruce Richardson rte_cryptodev_get_auth_algo_enum(enum rte_crypto_auth_algorithm *algo_enum,
26299a2dd95SBruce Richardson 		const char *algo_string)
26399a2dd95SBruce Richardson {
26499a2dd95SBruce Richardson 	unsigned int i;
2653ebb587eSAmit Prakash Shukla 	int ret = -1;	/* Invalid string */
26699a2dd95SBruce Richardson 
2677e1e1277SAkhil Goyal 	for (i = 1; i < RTE_DIM(crypto_auth_algorithm_strings); i++) {
2687e1e1277SAkhil Goyal 		if (strcmp(algo_string, crypto_auth_algorithm_strings[i]) == 0) {
26999a2dd95SBruce Richardson 			*algo_enum = (enum rte_crypto_auth_algorithm) i;
2703ebb587eSAmit Prakash Shukla 			ret = 0;
2713ebb587eSAmit Prakash Shukla 			break;
27299a2dd95SBruce Richardson 		}
27399a2dd95SBruce Richardson 	}
27499a2dd95SBruce Richardson 
2753ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_get_auth_algo_enum(algo_string, *algo_enum, ret);
2763ebb587eSAmit Prakash Shukla 
2773ebb587eSAmit Prakash Shukla 	return ret;
27899a2dd95SBruce Richardson }
27999a2dd95SBruce Richardson 
28099a2dd95SBruce Richardson int
28199a2dd95SBruce Richardson rte_cryptodev_get_aead_algo_enum(enum rte_crypto_aead_algorithm *algo_enum,
28299a2dd95SBruce Richardson 		const char *algo_string)
28399a2dd95SBruce Richardson {
28499a2dd95SBruce Richardson 	unsigned int i;
2853ebb587eSAmit Prakash Shukla 	int ret = -1;	/* Invalid string */
28699a2dd95SBruce Richardson 
2877e1e1277SAkhil Goyal 	for (i = 1; i < RTE_DIM(crypto_aead_algorithm_strings); i++) {
2887e1e1277SAkhil Goyal 		if (strcmp(algo_string, crypto_aead_algorithm_strings[i]) == 0) {
28999a2dd95SBruce Richardson 			*algo_enum = (enum rte_crypto_aead_algorithm) i;
2903ebb587eSAmit Prakash Shukla 			ret = 0;
2913ebb587eSAmit Prakash Shukla 			break;
29299a2dd95SBruce Richardson 		}
29399a2dd95SBruce Richardson 	}
29499a2dd95SBruce Richardson 
2953ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_get_aead_algo_enum(algo_string, *algo_enum, ret);
2963ebb587eSAmit Prakash Shukla 
2973ebb587eSAmit Prakash Shukla 	return ret;
29899a2dd95SBruce Richardson }
29999a2dd95SBruce Richardson 
30099a2dd95SBruce Richardson int
30199a2dd95SBruce Richardson rte_cryptodev_asym_get_xform_enum(enum rte_crypto_asym_xform_type *xform_enum,
30299a2dd95SBruce Richardson 		const char *xform_string)
30399a2dd95SBruce Richardson {
30499a2dd95SBruce Richardson 	unsigned int i;
3053ebb587eSAmit Prakash Shukla 	int ret = -1;	/* Invalid string */
30699a2dd95SBruce Richardson 
3077e1e1277SAkhil Goyal 	for (i = 1; i < RTE_DIM(crypto_asym_xform_strings); i++) {
30899a2dd95SBruce Richardson 		if (strcmp(xform_string,
3097e1e1277SAkhil Goyal 			crypto_asym_xform_strings[i]) == 0) {
31099a2dd95SBruce Richardson 			*xform_enum = (enum rte_crypto_asym_xform_type) i;
3113ebb587eSAmit Prakash Shukla 			ret = 0;
3123ebb587eSAmit Prakash Shukla 			break;
31399a2dd95SBruce Richardson 		}
31499a2dd95SBruce Richardson 	}
31599a2dd95SBruce Richardson 
3163ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_asym_get_xform_enum(xform_string, *xform_enum, ret);
3173ebb587eSAmit Prakash Shukla 
3183ebb587eSAmit Prakash Shukla 	return ret;
31999a2dd95SBruce Richardson }
32099a2dd95SBruce Richardson 
3217e1e1277SAkhil Goyal const char *
3227e1e1277SAkhil Goyal rte_cryptodev_get_cipher_algo_string(enum rte_crypto_cipher_algorithm algo_enum)
3237e1e1277SAkhil Goyal {
3247e1e1277SAkhil Goyal 	const char *alg_str = NULL;
3257e1e1277SAkhil Goyal 
3267e1e1277SAkhil Goyal 	if ((unsigned int)algo_enum < RTE_DIM(crypto_cipher_algorithm_strings))
3277e1e1277SAkhil Goyal 		alg_str = crypto_cipher_algorithm_strings[algo_enum];
3287e1e1277SAkhil Goyal 
3297e1e1277SAkhil Goyal 	rte_cryptodev_trace_get_cipher_algo_string(algo_enum, alg_str);
3307e1e1277SAkhil Goyal 
3317e1e1277SAkhil Goyal 	return alg_str;
3327e1e1277SAkhil Goyal }
3337e1e1277SAkhil Goyal 
3347e1e1277SAkhil Goyal const char *
3357e1e1277SAkhil Goyal rte_cryptodev_get_auth_algo_string(enum rte_crypto_auth_algorithm algo_enum)
3367e1e1277SAkhil Goyal {
3377e1e1277SAkhil Goyal 	const char *alg_str = NULL;
3387e1e1277SAkhil Goyal 
3397e1e1277SAkhil Goyal 	if ((unsigned int)algo_enum < RTE_DIM(crypto_auth_algorithm_strings))
3407e1e1277SAkhil Goyal 		alg_str = crypto_auth_algorithm_strings[algo_enum];
3417e1e1277SAkhil Goyal 
3427e1e1277SAkhil Goyal 	rte_cryptodev_trace_get_auth_algo_string(algo_enum, alg_str);
3437e1e1277SAkhil Goyal 
3447e1e1277SAkhil Goyal 	return alg_str;
3457e1e1277SAkhil Goyal }
3467e1e1277SAkhil Goyal 
3477e1e1277SAkhil Goyal const char *
3487e1e1277SAkhil Goyal rte_cryptodev_get_aead_algo_string(enum rte_crypto_aead_algorithm algo_enum)
3497e1e1277SAkhil Goyal {
3507e1e1277SAkhil Goyal 	const char *alg_str = NULL;
3517e1e1277SAkhil Goyal 
3527e1e1277SAkhil Goyal 	if ((unsigned int)algo_enum < RTE_DIM(crypto_aead_algorithm_strings))
3537e1e1277SAkhil Goyal 		alg_str = crypto_aead_algorithm_strings[algo_enum];
3547e1e1277SAkhil Goyal 
3557e1e1277SAkhil Goyal 	rte_cryptodev_trace_get_aead_algo_string(algo_enum, alg_str);
3567e1e1277SAkhil Goyal 
3577e1e1277SAkhil Goyal 	return alg_str;
3587e1e1277SAkhil Goyal }
3597e1e1277SAkhil Goyal 
3607e1e1277SAkhil Goyal const char *
3617e1e1277SAkhil Goyal rte_cryptodev_asym_get_xform_string(enum rte_crypto_asym_xform_type xform_enum)
3627e1e1277SAkhil Goyal {
3637e1e1277SAkhil Goyal 	const char *xform_str = NULL;
3647e1e1277SAkhil Goyal 
3657e1e1277SAkhil Goyal 	if ((unsigned int)xform_enum < RTE_DIM(crypto_asym_xform_strings))
3667e1e1277SAkhil Goyal 		xform_str = crypto_asym_xform_strings[xform_enum];
3677e1e1277SAkhil Goyal 
3687e1e1277SAkhil Goyal 	rte_cryptodev_trace_asym_get_xform_string(xform_enum, xform_str);
3697e1e1277SAkhil Goyal 
3707e1e1277SAkhil Goyal 	return xform_str;
3717e1e1277SAkhil Goyal }
3727e1e1277SAkhil Goyal 
37399a2dd95SBruce Richardson /**
37499a2dd95SBruce Richardson  * The crypto auth operation strings identifiers.
37599a2dd95SBruce Richardson  * It could be used in application command line.
37699a2dd95SBruce Richardson  */
37799a2dd95SBruce Richardson const char *
37899a2dd95SBruce Richardson rte_crypto_auth_operation_strings[] = {
37999a2dd95SBruce Richardson 		[RTE_CRYPTO_AUTH_OP_VERIFY]	= "verify",
38099a2dd95SBruce Richardson 		[RTE_CRYPTO_AUTH_OP_GENERATE]	= "generate"
38199a2dd95SBruce Richardson };
38299a2dd95SBruce Richardson 
38399a2dd95SBruce Richardson const struct rte_cryptodev_symmetric_capability *
38499a2dd95SBruce Richardson rte_cryptodev_sym_capability_get(uint8_t dev_id,
38599a2dd95SBruce Richardson 		const struct rte_cryptodev_sym_capability_idx *idx)
38699a2dd95SBruce Richardson {
38799a2dd95SBruce Richardson 	const struct rte_cryptodev_capabilities *capability;
3883ebb587eSAmit Prakash Shukla 	const struct rte_cryptodev_symmetric_capability *sym_capability = NULL;
38999a2dd95SBruce Richardson 	struct rte_cryptodev_info dev_info;
39099a2dd95SBruce Richardson 	int i = 0;
39199a2dd95SBruce Richardson 
39299a2dd95SBruce Richardson 	rte_cryptodev_info_get(dev_id, &dev_info);
39399a2dd95SBruce Richardson 
39499a2dd95SBruce Richardson 	while ((capability = &dev_info.capabilities[i++])->op !=
39599a2dd95SBruce Richardson 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
39699a2dd95SBruce Richardson 		if (capability->op != RTE_CRYPTO_OP_TYPE_SYMMETRIC)
39799a2dd95SBruce Richardson 			continue;
39899a2dd95SBruce Richardson 
39999a2dd95SBruce Richardson 		if (capability->sym.xform_type != idx->type)
40099a2dd95SBruce Richardson 			continue;
40199a2dd95SBruce Richardson 
40299a2dd95SBruce Richardson 		if (idx->type == RTE_CRYPTO_SYM_XFORM_AUTH &&
4033ebb587eSAmit Prakash Shukla 			capability->sym.auth.algo == idx->algo.auth) {
4043ebb587eSAmit Prakash Shukla 			sym_capability = &capability->sym;
4053ebb587eSAmit Prakash Shukla 			break;
40699a2dd95SBruce Richardson 		}
40799a2dd95SBruce Richardson 
4083ebb587eSAmit Prakash Shukla 		if (idx->type == RTE_CRYPTO_SYM_XFORM_CIPHER &&
4093ebb587eSAmit Prakash Shukla 			capability->sym.cipher.algo == idx->algo.cipher) {
4103ebb587eSAmit Prakash Shukla 			sym_capability = &capability->sym;
4113ebb587eSAmit Prakash Shukla 			break;
4123ebb587eSAmit Prakash Shukla 		}
4133ebb587eSAmit Prakash Shukla 
4143ebb587eSAmit Prakash Shukla 		if (idx->type == RTE_CRYPTO_SYM_XFORM_AEAD &&
4153ebb587eSAmit Prakash Shukla 				capability->sym.aead.algo == idx->algo.aead) {
4163ebb587eSAmit Prakash Shukla 			sym_capability = &capability->sym;
4173ebb587eSAmit Prakash Shukla 			break;
4183ebb587eSAmit Prakash Shukla 		}
4193ebb587eSAmit Prakash Shukla 	}
4203ebb587eSAmit Prakash Shukla 
4213ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_sym_capability_get(dev_id, dev_info.driver_name,
4223ebb587eSAmit Prakash Shukla 		dev_info.driver_id, idx->type, sym_capability);
4233ebb587eSAmit Prakash Shukla 
4243ebb587eSAmit Prakash Shukla 	return sym_capability;
42599a2dd95SBruce Richardson }
42699a2dd95SBruce Richardson 
42799a2dd95SBruce Richardson static int
42899a2dd95SBruce Richardson param_range_check(uint16_t size, const struct rte_crypto_param_range *range)
42999a2dd95SBruce Richardson {
43099a2dd95SBruce Richardson 	unsigned int next_size;
43199a2dd95SBruce Richardson 
43299a2dd95SBruce Richardson 	/* Check lower/upper bounds */
43399a2dd95SBruce Richardson 	if (size < range->min)
43499a2dd95SBruce Richardson 		return -1;
43599a2dd95SBruce Richardson 
43699a2dd95SBruce Richardson 	if (size > range->max)
43799a2dd95SBruce Richardson 		return -1;
43899a2dd95SBruce Richardson 
43999a2dd95SBruce Richardson 	/* If range is actually only one value, size is correct */
44099a2dd95SBruce Richardson 	if (range->increment == 0)
44199a2dd95SBruce Richardson 		return 0;
44299a2dd95SBruce Richardson 
44399a2dd95SBruce Richardson 	/* Check if value is one of the supported sizes */
44499a2dd95SBruce Richardson 	for (next_size = range->min; next_size <= range->max;
44599a2dd95SBruce Richardson 			next_size += range->increment)
44699a2dd95SBruce Richardson 		if (size == next_size)
44799a2dd95SBruce Richardson 			return 0;
44899a2dd95SBruce Richardson 
44999a2dd95SBruce Richardson 	return -1;
45099a2dd95SBruce Richardson }
45199a2dd95SBruce Richardson 
45299a2dd95SBruce Richardson const struct rte_cryptodev_asymmetric_xform_capability *
45399a2dd95SBruce Richardson rte_cryptodev_asym_capability_get(uint8_t dev_id,
45499a2dd95SBruce Richardson 		const struct rte_cryptodev_asym_capability_idx *idx)
45599a2dd95SBruce Richardson {
45699a2dd95SBruce Richardson 	const struct rte_cryptodev_capabilities *capability;
4573ebb587eSAmit Prakash Shukla 	const struct rte_cryptodev_asymmetric_xform_capability *asym_cap = NULL;
45899a2dd95SBruce Richardson 	struct rte_cryptodev_info dev_info;
45999a2dd95SBruce Richardson 	unsigned int i = 0;
46099a2dd95SBruce Richardson 
46199a2dd95SBruce Richardson 	memset(&dev_info, 0, sizeof(struct rte_cryptodev_info));
46299a2dd95SBruce Richardson 	rte_cryptodev_info_get(dev_id, &dev_info);
46399a2dd95SBruce Richardson 
46499a2dd95SBruce Richardson 	while ((capability = &dev_info.capabilities[i++])->op !=
46599a2dd95SBruce Richardson 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
46699a2dd95SBruce Richardson 		if (capability->op != RTE_CRYPTO_OP_TYPE_ASYMMETRIC)
46799a2dd95SBruce Richardson 			continue;
46899a2dd95SBruce Richardson 
4693ebb587eSAmit Prakash Shukla 		if (capability->asym.xform_capa.xform_type == idx->type) {
4703ebb587eSAmit Prakash Shukla 			asym_cap = &capability->asym.xform_capa;
4713ebb587eSAmit Prakash Shukla 			break;
47299a2dd95SBruce Richardson 		}
4733ebb587eSAmit Prakash Shukla 	}
4743ebb587eSAmit Prakash Shukla 
4753ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_asym_capability_get(dev_info.driver_name,
4763ebb587eSAmit Prakash Shukla 		dev_info.driver_id, idx->type, asym_cap);
4773ebb587eSAmit Prakash Shukla 
4783ebb587eSAmit Prakash Shukla 	return asym_cap;
47999a2dd95SBruce Richardson };
48099a2dd95SBruce Richardson 
48199a2dd95SBruce Richardson int
48299a2dd95SBruce Richardson rte_cryptodev_sym_capability_check_cipher(
48399a2dd95SBruce Richardson 		const struct rte_cryptodev_symmetric_capability *capability,
48499a2dd95SBruce Richardson 		uint16_t key_size, uint16_t iv_size)
48599a2dd95SBruce Richardson {
4863ebb587eSAmit Prakash Shukla 	int ret = 0; /* success */
4873ebb587eSAmit Prakash Shukla 
4883ebb587eSAmit Prakash Shukla 	if (param_range_check(key_size, &capability->cipher.key_size) != 0) {
4893ebb587eSAmit Prakash Shukla 		ret = -1;
4903ebb587eSAmit Prakash Shukla 		goto done;
4913ebb587eSAmit Prakash Shukla 	}
49299a2dd95SBruce Richardson 
49399a2dd95SBruce Richardson 	if (param_range_check(iv_size, &capability->cipher.iv_size) != 0)
4943ebb587eSAmit Prakash Shukla 		ret = -1;
49599a2dd95SBruce Richardson 
4963ebb587eSAmit Prakash Shukla done:
4973ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_sym_capability_check_cipher(capability, key_size,
4983ebb587eSAmit Prakash Shukla 		iv_size, ret);
4993ebb587eSAmit Prakash Shukla 
5003ebb587eSAmit Prakash Shukla 	return ret;
50199a2dd95SBruce Richardson }
50299a2dd95SBruce Richardson 
50399a2dd95SBruce Richardson int
50499a2dd95SBruce Richardson rte_cryptodev_sym_capability_check_auth(
50599a2dd95SBruce Richardson 		const struct rte_cryptodev_symmetric_capability *capability,
50699a2dd95SBruce Richardson 		uint16_t key_size, uint16_t digest_size, uint16_t iv_size)
50799a2dd95SBruce Richardson {
5083ebb587eSAmit Prakash Shukla 	int ret = 0; /* success */
50999a2dd95SBruce Richardson 
5103ebb587eSAmit Prakash Shukla 	if (param_range_check(key_size, &capability->auth.key_size) != 0) {
5113ebb587eSAmit Prakash Shukla 		ret = -1;
5123ebb587eSAmit Prakash Shukla 		goto done;
5133ebb587eSAmit Prakash Shukla 	}
5143ebb587eSAmit Prakash Shukla 
5153ebb587eSAmit Prakash Shukla 	if (param_range_check(digest_size,
5163ebb587eSAmit Prakash Shukla 		&capability->auth.digest_size) != 0) {
5173ebb587eSAmit Prakash Shukla 		ret = -1;
5183ebb587eSAmit Prakash Shukla 		goto done;
5193ebb587eSAmit Prakash Shukla 	}
52099a2dd95SBruce Richardson 
52199a2dd95SBruce Richardson 	if (param_range_check(iv_size, &capability->auth.iv_size) != 0)
5223ebb587eSAmit Prakash Shukla 		ret = -1;
52399a2dd95SBruce Richardson 
5243ebb587eSAmit Prakash Shukla done:
5253ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_sym_capability_check_auth(capability, key_size,
5263ebb587eSAmit Prakash Shukla 		digest_size, iv_size, ret);
5273ebb587eSAmit Prakash Shukla 
5283ebb587eSAmit Prakash Shukla 	return ret;
52999a2dd95SBruce Richardson }
53099a2dd95SBruce Richardson 
53199a2dd95SBruce Richardson int
53299a2dd95SBruce Richardson rte_cryptodev_sym_capability_check_aead(
53399a2dd95SBruce Richardson 		const struct rte_cryptodev_symmetric_capability *capability,
53499a2dd95SBruce Richardson 		uint16_t key_size, uint16_t digest_size, uint16_t aad_size,
53599a2dd95SBruce Richardson 		uint16_t iv_size)
53699a2dd95SBruce Richardson {
5373ebb587eSAmit Prakash Shukla 	int ret = 0; /* success */
53899a2dd95SBruce Richardson 
5393ebb587eSAmit Prakash Shukla 	if (param_range_check(key_size, &capability->aead.key_size) != 0) {
5403ebb587eSAmit Prakash Shukla 		ret = -1;
5413ebb587eSAmit Prakash Shukla 		goto done;
5423ebb587eSAmit Prakash Shukla 	}
54399a2dd95SBruce Richardson 
5443ebb587eSAmit Prakash Shukla 	if (param_range_check(digest_size,
5453ebb587eSAmit Prakash Shukla 		&capability->aead.digest_size) != 0) {
5463ebb587eSAmit Prakash Shukla 		ret = -1;
5473ebb587eSAmit Prakash Shukla 		goto done;
5483ebb587eSAmit Prakash Shukla 	}
5493ebb587eSAmit Prakash Shukla 
5503ebb587eSAmit Prakash Shukla 	if (param_range_check(aad_size, &capability->aead.aad_size) != 0) {
5513ebb587eSAmit Prakash Shukla 		ret = -1;
5523ebb587eSAmit Prakash Shukla 		goto done;
5533ebb587eSAmit Prakash Shukla 	}
55499a2dd95SBruce Richardson 
55599a2dd95SBruce Richardson 	if (param_range_check(iv_size, &capability->aead.iv_size) != 0)
5563ebb587eSAmit Prakash Shukla 		ret = -1;
55799a2dd95SBruce Richardson 
5583ebb587eSAmit Prakash Shukla done:
5593ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_sym_capability_check_aead(capability, key_size,
5603ebb587eSAmit Prakash Shukla 		digest_size, aad_size, iv_size, ret);
5613ebb587eSAmit Prakash Shukla 
5623ebb587eSAmit Prakash Shukla 	return ret;
56399a2dd95SBruce Richardson }
5643ebb587eSAmit Prakash Shukla 
56599a2dd95SBruce Richardson int
56699a2dd95SBruce Richardson rte_cryptodev_asym_xform_capability_check_optype(
56799a2dd95SBruce Richardson 	const struct rte_cryptodev_asymmetric_xform_capability *capability,
56899a2dd95SBruce Richardson 	enum rte_crypto_asym_op_type op_type)
56999a2dd95SBruce Richardson {
5703ebb587eSAmit Prakash Shukla 	int ret = 0;
57199a2dd95SBruce Richardson 
5723ebb587eSAmit Prakash Shukla 	if (capability->op_types & (1 << op_type))
5733ebb587eSAmit Prakash Shukla 		ret = 1;
5743ebb587eSAmit Prakash Shukla 
5753ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_asym_xform_capability_check_optype(
5763ebb587eSAmit Prakash Shukla 		capability->op_types, op_type, ret);
5773ebb587eSAmit Prakash Shukla 
5783ebb587eSAmit Prakash Shukla 	return ret;
57999a2dd95SBruce Richardson }
58099a2dd95SBruce Richardson 
58199a2dd95SBruce Richardson int
58299a2dd95SBruce Richardson rte_cryptodev_asym_xform_capability_check_modlen(
58399a2dd95SBruce Richardson 	const struct rte_cryptodev_asymmetric_xform_capability *capability,
58499a2dd95SBruce Richardson 	uint16_t modlen)
58599a2dd95SBruce Richardson {
5863ebb587eSAmit Prakash Shukla 	int ret = 0; /* success */
5873ebb587eSAmit Prakash Shukla 
58899a2dd95SBruce Richardson 	/* no need to check for limits, if min or max = 0 */
58999a2dd95SBruce Richardson 	if (capability->modlen.min != 0) {
5903ebb587eSAmit Prakash Shukla 		if (modlen < capability->modlen.min) {
5913ebb587eSAmit Prakash Shukla 			ret = -1;
5923ebb587eSAmit Prakash Shukla 			goto done;
5933ebb587eSAmit Prakash Shukla 		}
59499a2dd95SBruce Richardson 	}
59599a2dd95SBruce Richardson 
59699a2dd95SBruce Richardson 	if (capability->modlen.max != 0) {
5973ebb587eSAmit Prakash Shukla 		if (modlen > capability->modlen.max) {
5983ebb587eSAmit Prakash Shukla 			ret = -1;
5993ebb587eSAmit Prakash Shukla 			goto done;
6003ebb587eSAmit Prakash Shukla 		}
60199a2dd95SBruce Richardson 	}
60299a2dd95SBruce Richardson 
60399a2dd95SBruce Richardson 	/* in any case, check if given modlen is module increment */
60499a2dd95SBruce Richardson 	if (capability->modlen.increment != 0) {
60599a2dd95SBruce Richardson 		if (modlen % (capability->modlen.increment))
6063ebb587eSAmit Prakash Shukla 			ret = -1;
60799a2dd95SBruce Richardson 	}
60899a2dd95SBruce Richardson 
6093ebb587eSAmit Prakash Shukla done:
6103ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_asym_xform_capability_check_modlen(capability,
6113ebb587eSAmit Prakash Shukla 		modlen, ret);
6123ebb587eSAmit Prakash Shukla 
6133ebb587eSAmit Prakash Shukla 	return ret;
61499a2dd95SBruce Richardson }
61599a2dd95SBruce Richardson 
6166f8ef8b6SGowrishankar Muthukrishnan bool
6176f8ef8b6SGowrishankar Muthukrishnan rte_cryptodev_asym_xform_capability_check_hash(
6186f8ef8b6SGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *capability,
6196f8ef8b6SGowrishankar Muthukrishnan 	enum rte_crypto_auth_algorithm hash)
6206f8ef8b6SGowrishankar Muthukrishnan {
6216f8ef8b6SGowrishankar Muthukrishnan 	bool ret = false;
6226f8ef8b6SGowrishankar Muthukrishnan 
6236f8ef8b6SGowrishankar Muthukrishnan 	if (capability->hash_algos & (1 << hash))
6246f8ef8b6SGowrishankar Muthukrishnan 		ret = true;
6256f8ef8b6SGowrishankar Muthukrishnan 
6266f8ef8b6SGowrishankar Muthukrishnan 	rte_cryptodev_trace_asym_xform_capability_check_hash(
6276f8ef8b6SGowrishankar Muthukrishnan 		capability->hash_algos, hash, ret);
6286f8ef8b6SGowrishankar Muthukrishnan 
6296f8ef8b6SGowrishankar Muthukrishnan 	return ret;
6306f8ef8b6SGowrishankar Muthukrishnan }
6316f8ef8b6SGowrishankar Muthukrishnan 
63253c65a3cSGowrishankar Muthukrishnan int
63353c65a3cSGowrishankar Muthukrishnan rte_cryptodev_asym_xform_capability_check_opcap(
63453c65a3cSGowrishankar Muthukrishnan 	const struct rte_cryptodev_asymmetric_xform_capability *capability,
63553c65a3cSGowrishankar Muthukrishnan 	enum rte_crypto_asym_op_type op_type, uint8_t cap)
63653c65a3cSGowrishankar Muthukrishnan {
63753c65a3cSGowrishankar Muthukrishnan 	int ret = 0;
63853c65a3cSGowrishankar Muthukrishnan 
63953c65a3cSGowrishankar Muthukrishnan 	if (!(capability->op_types & (1 << op_type)))
64053c65a3cSGowrishankar Muthukrishnan 		return ret;
64153c65a3cSGowrishankar Muthukrishnan 
64253c65a3cSGowrishankar Muthukrishnan 	if (capability->op_capa[op_type] & (1 << cap))
64353c65a3cSGowrishankar Muthukrishnan 		ret = 1;
64453c65a3cSGowrishankar Muthukrishnan 
64553c65a3cSGowrishankar Muthukrishnan 	return ret;
64653c65a3cSGowrishankar Muthukrishnan }
64753c65a3cSGowrishankar Muthukrishnan 
64899a2dd95SBruce Richardson /* spinlock for crypto device enq callbacks */
64999a2dd95SBruce Richardson static rte_spinlock_t rte_cryptodev_callback_lock = RTE_SPINLOCK_INITIALIZER;
65099a2dd95SBruce Richardson 
65199a2dd95SBruce Richardson static void
65299a2dd95SBruce Richardson cryptodev_cb_cleanup(struct rte_cryptodev *dev)
65399a2dd95SBruce Richardson {
65499a2dd95SBruce Richardson 	struct rte_cryptodev_cb_rcu *list;
65599a2dd95SBruce Richardson 	struct rte_cryptodev_cb *cb, *next;
65699a2dd95SBruce Richardson 	uint16_t qp_id;
65799a2dd95SBruce Richardson 
65899a2dd95SBruce Richardson 	if (dev->enq_cbs == NULL && dev->deq_cbs == NULL)
65999a2dd95SBruce Richardson 		return;
66099a2dd95SBruce Richardson 
66199a2dd95SBruce Richardson 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
66299a2dd95SBruce Richardson 		list = &dev->enq_cbs[qp_id];
66399a2dd95SBruce Richardson 		cb = list->next;
66499a2dd95SBruce Richardson 		while (cb != NULL) {
66599a2dd95SBruce Richardson 			next = cb->next;
66699a2dd95SBruce Richardson 			rte_free(cb);
66799a2dd95SBruce Richardson 			cb = next;
66899a2dd95SBruce Richardson 		}
66999a2dd95SBruce Richardson 
67099a2dd95SBruce Richardson 		rte_free(list->qsbr);
67199a2dd95SBruce Richardson 	}
67299a2dd95SBruce Richardson 
67399a2dd95SBruce Richardson 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
67499a2dd95SBruce Richardson 		list = &dev->deq_cbs[qp_id];
67599a2dd95SBruce Richardson 		cb = list->next;
67699a2dd95SBruce Richardson 		while (cb != NULL) {
67799a2dd95SBruce Richardson 			next = cb->next;
67899a2dd95SBruce Richardson 			rte_free(cb);
67999a2dd95SBruce Richardson 			cb = next;
68099a2dd95SBruce Richardson 		}
68199a2dd95SBruce Richardson 
68299a2dd95SBruce Richardson 		rte_free(list->qsbr);
68399a2dd95SBruce Richardson 	}
68499a2dd95SBruce Richardson 
68599a2dd95SBruce Richardson 	rte_free(dev->enq_cbs);
68699a2dd95SBruce Richardson 	dev->enq_cbs = NULL;
68799a2dd95SBruce Richardson 	rte_free(dev->deq_cbs);
68899a2dd95SBruce Richardson 	dev->deq_cbs = NULL;
68999a2dd95SBruce Richardson }
69099a2dd95SBruce Richardson 
69199a2dd95SBruce Richardson static int
69299a2dd95SBruce Richardson cryptodev_cb_init(struct rte_cryptodev *dev)
69399a2dd95SBruce Richardson {
69499a2dd95SBruce Richardson 	struct rte_cryptodev_cb_rcu *list;
69599a2dd95SBruce Richardson 	struct rte_rcu_qsbr *qsbr;
69699a2dd95SBruce Richardson 	uint16_t qp_id;
69799a2dd95SBruce Richardson 	size_t size;
69899a2dd95SBruce Richardson 
69999a2dd95SBruce Richardson 	/* Max thread set to 1, as one DP thread accessing a queue-pair */
70099a2dd95SBruce Richardson 	const uint32_t max_threads = 1;
70199a2dd95SBruce Richardson 
70299a2dd95SBruce Richardson 	dev->enq_cbs = rte_zmalloc(NULL,
70399a2dd95SBruce Richardson 				   sizeof(struct rte_cryptodev_cb_rcu) *
70499a2dd95SBruce Richardson 				   dev->data->nb_queue_pairs, 0);
70599a2dd95SBruce Richardson 	if (dev->enq_cbs == NULL) {
70699a2dd95SBruce Richardson 		CDEV_LOG_ERR("Failed to allocate memory for enq callbacks");
70799a2dd95SBruce Richardson 		return -ENOMEM;
70899a2dd95SBruce Richardson 	}
70999a2dd95SBruce Richardson 
71099a2dd95SBruce Richardson 	dev->deq_cbs = rte_zmalloc(NULL,
71199a2dd95SBruce Richardson 				   sizeof(struct rte_cryptodev_cb_rcu) *
71299a2dd95SBruce Richardson 				   dev->data->nb_queue_pairs, 0);
71399a2dd95SBruce Richardson 	if (dev->deq_cbs == NULL) {
71499a2dd95SBruce Richardson 		CDEV_LOG_ERR("Failed to allocate memory for deq callbacks");
71599a2dd95SBruce Richardson 		rte_free(dev->enq_cbs);
71699a2dd95SBruce Richardson 		return -ENOMEM;
71799a2dd95SBruce Richardson 	}
71899a2dd95SBruce Richardson 
71999a2dd95SBruce Richardson 	/* Create RCU QSBR variable */
72099a2dd95SBruce Richardson 	size = rte_rcu_qsbr_get_memsize(max_threads);
72199a2dd95SBruce Richardson 
72299a2dd95SBruce Richardson 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
72399a2dd95SBruce Richardson 		list = &dev->enq_cbs[qp_id];
72499a2dd95SBruce Richardson 		qsbr = rte_zmalloc(NULL, size, RTE_CACHE_LINE_SIZE);
72599a2dd95SBruce Richardson 		if (qsbr == NULL) {
72699a2dd95SBruce Richardson 			CDEV_LOG_ERR("Failed to allocate memory for RCU on "
72799a2dd95SBruce Richardson 				"queue_pair_id=%d", qp_id);
72899a2dd95SBruce Richardson 			goto cb_init_err;
72999a2dd95SBruce Richardson 		}
73099a2dd95SBruce Richardson 
73199a2dd95SBruce Richardson 		if (rte_rcu_qsbr_init(qsbr, max_threads)) {
73299a2dd95SBruce Richardson 			CDEV_LOG_ERR("Failed to initialize for RCU on "
73399a2dd95SBruce Richardson 				"queue_pair_id=%d", qp_id);
73499a2dd95SBruce Richardson 			goto cb_init_err;
73599a2dd95SBruce Richardson 		}
73699a2dd95SBruce Richardson 
73799a2dd95SBruce Richardson 		list->qsbr = qsbr;
73899a2dd95SBruce Richardson 	}
73999a2dd95SBruce Richardson 
74099a2dd95SBruce Richardson 	for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
74199a2dd95SBruce Richardson 		list = &dev->deq_cbs[qp_id];
74299a2dd95SBruce Richardson 		qsbr = rte_zmalloc(NULL, size, RTE_CACHE_LINE_SIZE);
74399a2dd95SBruce Richardson 		if (qsbr == NULL) {
74499a2dd95SBruce Richardson 			CDEV_LOG_ERR("Failed to allocate memory for RCU on "
74599a2dd95SBruce Richardson 				"queue_pair_id=%d", qp_id);
74699a2dd95SBruce Richardson 			goto cb_init_err;
74799a2dd95SBruce Richardson 		}
74899a2dd95SBruce Richardson 
74999a2dd95SBruce Richardson 		if (rte_rcu_qsbr_init(qsbr, max_threads)) {
75099a2dd95SBruce Richardson 			CDEV_LOG_ERR("Failed to initialize for RCU on "
75199a2dd95SBruce Richardson 				"queue_pair_id=%d", qp_id);
75299a2dd95SBruce Richardson 			goto cb_init_err;
75399a2dd95SBruce Richardson 		}
75499a2dd95SBruce Richardson 
75599a2dd95SBruce Richardson 		list->qsbr = qsbr;
75699a2dd95SBruce Richardson 	}
75799a2dd95SBruce Richardson 
75899a2dd95SBruce Richardson 	return 0;
75999a2dd95SBruce Richardson 
76099a2dd95SBruce Richardson cb_init_err:
76199a2dd95SBruce Richardson 	cryptodev_cb_cleanup(dev);
76299a2dd95SBruce Richardson 	return -ENOMEM;
76399a2dd95SBruce Richardson }
76499a2dd95SBruce Richardson 
76599a2dd95SBruce Richardson const char *
76699a2dd95SBruce Richardson rte_cryptodev_get_feature_name(uint64_t flag)
76799a2dd95SBruce Richardson {
7683ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_get_feature_name(flag);
7693ebb587eSAmit Prakash Shukla 
77099a2dd95SBruce Richardson 	switch (flag) {
77199a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO:
77299a2dd95SBruce Richardson 		return "SYMMETRIC_CRYPTO";
77399a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO:
77499a2dd95SBruce Richardson 		return "ASYMMETRIC_CRYPTO";
77599a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING:
77699a2dd95SBruce Richardson 		return "SYM_OPERATION_CHAINING";
77799a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_CPU_SSE:
77899a2dd95SBruce Richardson 		return "CPU_SSE";
77999a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_CPU_AVX:
78099a2dd95SBruce Richardson 		return "CPU_AVX";
78199a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_CPU_AVX2:
78299a2dd95SBruce Richardson 		return "CPU_AVX2";
78399a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_CPU_AVX512:
78499a2dd95SBruce Richardson 		return "CPU_AVX512";
78599a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_CPU_AESNI:
78699a2dd95SBruce Richardson 		return "CPU_AESNI";
78799a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_HW_ACCELERATED:
78899a2dd95SBruce Richardson 		return "HW_ACCELERATED";
78999a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_IN_PLACE_SGL:
79099a2dd95SBruce Richardson 		return "IN_PLACE_SGL";
79199a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT:
79299a2dd95SBruce Richardson 		return "OOP_SGL_IN_SGL_OUT";
79399a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT:
79499a2dd95SBruce Richardson 		return "OOP_SGL_IN_LB_OUT";
79599a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT:
79699a2dd95SBruce Richardson 		return "OOP_LB_IN_SGL_OUT";
79799a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT:
79899a2dd95SBruce Richardson 		return "OOP_LB_IN_LB_OUT";
79999a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_CPU_NEON:
80099a2dd95SBruce Richardson 		return "CPU_NEON";
80199a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_CPU_ARM_CE:
80299a2dd95SBruce Richardson 		return "CPU_ARM_CE";
80399a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_SECURITY:
80499a2dd95SBruce Richardson 		return "SECURITY_PROTOCOL";
80599a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_EXP:
80699a2dd95SBruce Richardson 		return "RSA_PRIV_OP_KEY_EXP";
80799a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT:
80899a2dd95SBruce Richardson 		return "RSA_PRIV_OP_KEY_QT";
80999a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED:
81099a2dd95SBruce Richardson 		return "DIGEST_ENCRYPTED";
81199a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_SYM_CPU_CRYPTO:
81299a2dd95SBruce Richardson 		return "SYM_CPU_CRYPTO";
81399a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_ASYM_SESSIONLESS:
81499a2dd95SBruce Richardson 		return "ASYM_SESSIONLESS";
81599a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_SYM_SESSIONLESS:
81699a2dd95SBruce Richardson 		return "SYM_SESSIONLESS";
81799a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA:
81899a2dd95SBruce Richardson 		return "NON_BYTE_ALIGNED_DATA";
81999a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_CIPHER_MULTIPLE_DATA_UNITS:
82099a2dd95SBruce Richardson 		return "CIPHER_MULTIPLE_DATA_UNITS";
82199a2dd95SBruce Richardson 	case RTE_CRYPTODEV_FF_CIPHER_WRAPPED_KEY:
82299a2dd95SBruce Richardson 		return "CIPHER_WRAPPED_KEY";
82399a2dd95SBruce Richardson 	default:
82499a2dd95SBruce Richardson 		return NULL;
82599a2dd95SBruce Richardson 	}
82699a2dd95SBruce Richardson }
82799a2dd95SBruce Richardson 
82899a2dd95SBruce Richardson struct rte_cryptodev *
82999a2dd95SBruce Richardson rte_cryptodev_pmd_get_dev(uint8_t dev_id)
83099a2dd95SBruce Richardson {
83199a2dd95SBruce Richardson 	return &cryptodev_globals.devs[dev_id];
83299a2dd95SBruce Richardson }
83399a2dd95SBruce Richardson 
83499a2dd95SBruce Richardson struct rte_cryptodev *
83599a2dd95SBruce Richardson rte_cryptodev_pmd_get_named_dev(const char *name)
83699a2dd95SBruce Richardson {
83799a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
83899a2dd95SBruce Richardson 	unsigned int i;
83999a2dd95SBruce Richardson 
84099a2dd95SBruce Richardson 	if (name == NULL)
84199a2dd95SBruce Richardson 		return NULL;
84299a2dd95SBruce Richardson 
84399a2dd95SBruce Richardson 	for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++) {
84499a2dd95SBruce Richardson 		dev = &cryptodev_globals.devs[i];
84599a2dd95SBruce Richardson 
84699a2dd95SBruce Richardson 		if ((dev->attached == RTE_CRYPTODEV_ATTACHED) &&
84799a2dd95SBruce Richardson 				(strcmp(dev->data->name, name) == 0))
84899a2dd95SBruce Richardson 			return dev;
84999a2dd95SBruce Richardson 	}
85099a2dd95SBruce Richardson 
85199a2dd95SBruce Richardson 	return NULL;
85299a2dd95SBruce Richardson }
85399a2dd95SBruce Richardson 
85499a2dd95SBruce Richardson static inline uint8_t
85599a2dd95SBruce Richardson rte_cryptodev_is_valid_device_data(uint8_t dev_id)
85699a2dd95SBruce Richardson {
85799a2dd95SBruce Richardson 	if (dev_id >= RTE_CRYPTO_MAX_DEVS ||
85899a2dd95SBruce Richardson 			rte_crypto_devices[dev_id].data == NULL)
85999a2dd95SBruce Richardson 		return 0;
86099a2dd95SBruce Richardson 
86199a2dd95SBruce Richardson 	return 1;
86299a2dd95SBruce Richardson }
86399a2dd95SBruce Richardson 
86499a2dd95SBruce Richardson unsigned int
865e74abd48SAkhil Goyal rte_cryptodev_is_valid_dev(uint8_t dev_id)
86699a2dd95SBruce Richardson {
86799a2dd95SBruce Richardson 	struct rte_cryptodev *dev = NULL;
8683ebb587eSAmit Prakash Shukla 	unsigned int ret = 1;
86999a2dd95SBruce Richardson 
8703ebb587eSAmit Prakash Shukla 	if (!rte_cryptodev_is_valid_device_data(dev_id)) {
8713ebb587eSAmit Prakash Shukla 		ret = 0;
8723ebb587eSAmit Prakash Shukla 		goto done;
8733ebb587eSAmit Prakash Shukla 	}
87499a2dd95SBruce Richardson 
87599a2dd95SBruce Richardson 	dev = rte_cryptodev_pmd_get_dev(dev_id);
87699a2dd95SBruce Richardson 	if (dev->attached != RTE_CRYPTODEV_ATTACHED)
8773ebb587eSAmit Prakash Shukla 		ret = 0;
87899a2dd95SBruce Richardson 
8793ebb587eSAmit Prakash Shukla done:
8803ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_is_valid_dev(dev_id, ret);
8813ebb587eSAmit Prakash Shukla 
8823ebb587eSAmit Prakash Shukla 	return ret;
8833ebb587eSAmit Prakash Shukla }
88499a2dd95SBruce Richardson 
88599a2dd95SBruce Richardson int
88699a2dd95SBruce Richardson rte_cryptodev_get_dev_id(const char *name)
88799a2dd95SBruce Richardson {
88899a2dd95SBruce Richardson 	unsigned i;
8893ebb587eSAmit Prakash Shukla 	int ret = -1;
89099a2dd95SBruce Richardson 
89199a2dd95SBruce Richardson 	if (name == NULL)
89299a2dd95SBruce Richardson 		return -1;
89399a2dd95SBruce Richardson 
89499a2dd95SBruce Richardson 	for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++) {
89599a2dd95SBruce Richardson 		if (!rte_cryptodev_is_valid_device_data(i))
89699a2dd95SBruce Richardson 			continue;
89799a2dd95SBruce Richardson 		if ((strcmp(cryptodev_globals.devs[i].data->name, name)
89899a2dd95SBruce Richardson 				== 0) &&
89999a2dd95SBruce Richardson 				(cryptodev_globals.devs[i].attached ==
9003ebb587eSAmit Prakash Shukla 						RTE_CRYPTODEV_ATTACHED)) {
9013ebb587eSAmit Prakash Shukla 			ret = (int)i;
9023ebb587eSAmit Prakash Shukla 			break;
9033ebb587eSAmit Prakash Shukla 		}
90499a2dd95SBruce Richardson 	}
90599a2dd95SBruce Richardson 
9063ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_get_dev_id(name, ret);
9073ebb587eSAmit Prakash Shukla 
9083ebb587eSAmit Prakash Shukla 	return ret;
90999a2dd95SBruce Richardson }
91099a2dd95SBruce Richardson 
91199a2dd95SBruce Richardson uint8_t
91299a2dd95SBruce Richardson rte_cryptodev_count(void)
91399a2dd95SBruce Richardson {
9143ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_count(cryptodev_globals.nb_devs);
9153ebb587eSAmit Prakash Shukla 
91699a2dd95SBruce Richardson 	return cryptodev_globals.nb_devs;
91799a2dd95SBruce Richardson }
91899a2dd95SBruce Richardson 
91999a2dd95SBruce Richardson uint8_t
92099a2dd95SBruce Richardson rte_cryptodev_device_count_by_driver(uint8_t driver_id)
92199a2dd95SBruce Richardson {
92299a2dd95SBruce Richardson 	uint8_t i, dev_count = 0;
92399a2dd95SBruce Richardson 
92499a2dd95SBruce Richardson 	for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++)
92599a2dd95SBruce Richardson 		if (cryptodev_globals.devs[i].driver_id == driver_id &&
92699a2dd95SBruce Richardson 			cryptodev_globals.devs[i].attached ==
92799a2dd95SBruce Richardson 					RTE_CRYPTODEV_ATTACHED)
92899a2dd95SBruce Richardson 			dev_count++;
92999a2dd95SBruce Richardson 
9303ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_device_count_by_driver(driver_id, dev_count);
9313ebb587eSAmit Prakash Shukla 
93299a2dd95SBruce Richardson 	return dev_count;
93399a2dd95SBruce Richardson }
93499a2dd95SBruce Richardson 
93599a2dd95SBruce Richardson uint8_t
93699a2dd95SBruce Richardson rte_cryptodev_devices_get(const char *driver_name, uint8_t *devices,
93799a2dd95SBruce Richardson 	uint8_t nb_devices)
93899a2dd95SBruce Richardson {
93999a2dd95SBruce Richardson 	uint8_t i, count = 0;
94099a2dd95SBruce Richardson 	struct rte_cryptodev *devs = cryptodev_globals.devs;
94199a2dd95SBruce Richardson 
94299a2dd95SBruce Richardson 	for (i = 0; i < RTE_CRYPTO_MAX_DEVS && count < nb_devices; i++) {
94399a2dd95SBruce Richardson 		if (!rte_cryptodev_is_valid_device_data(i))
94499a2dd95SBruce Richardson 			continue;
94599a2dd95SBruce Richardson 
94699a2dd95SBruce Richardson 		if (devs[i].attached == RTE_CRYPTODEV_ATTACHED) {
94799a2dd95SBruce Richardson 			int cmp;
94899a2dd95SBruce Richardson 
94999a2dd95SBruce Richardson 			cmp = strncmp(devs[i].device->driver->name,
95099a2dd95SBruce Richardson 					driver_name,
95199a2dd95SBruce Richardson 					strlen(driver_name) + 1);
95299a2dd95SBruce Richardson 
95399a2dd95SBruce Richardson 			if (cmp == 0)
95499a2dd95SBruce Richardson 				devices[count++] = devs[i].data->dev_id;
95599a2dd95SBruce Richardson 		}
95699a2dd95SBruce Richardson 	}
95799a2dd95SBruce Richardson 
9583ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_devices_get(driver_name, count);
9593ebb587eSAmit Prakash Shukla 
96099a2dd95SBruce Richardson 	return count;
96199a2dd95SBruce Richardson }
96299a2dd95SBruce Richardson 
96399a2dd95SBruce Richardson void *
96499a2dd95SBruce Richardson rte_cryptodev_get_sec_ctx(uint8_t dev_id)
96599a2dd95SBruce Richardson {
9663ebb587eSAmit Prakash Shukla 	void *sec_ctx = NULL;
9673ebb587eSAmit Prakash Shukla 
96899a2dd95SBruce Richardson 	if (dev_id < RTE_CRYPTO_MAX_DEVS &&
96999a2dd95SBruce Richardson 			(rte_crypto_devices[dev_id].feature_flags &
97099a2dd95SBruce Richardson 			RTE_CRYPTODEV_FF_SECURITY))
9713ebb587eSAmit Prakash Shukla 		sec_ctx = rte_crypto_devices[dev_id].security_ctx;
97299a2dd95SBruce Richardson 
9733ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_get_sec_ctx(dev_id, sec_ctx);
9743ebb587eSAmit Prakash Shukla 
9753ebb587eSAmit Prakash Shukla 	return sec_ctx;
97699a2dd95SBruce Richardson }
97799a2dd95SBruce Richardson 
97899a2dd95SBruce Richardson int
97999a2dd95SBruce Richardson rte_cryptodev_socket_id(uint8_t dev_id)
98099a2dd95SBruce Richardson {
98199a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
98299a2dd95SBruce Richardson 
983e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id))
98499a2dd95SBruce Richardson 		return -1;
98599a2dd95SBruce Richardson 
98699a2dd95SBruce Richardson 	dev = rte_cryptodev_pmd_get_dev(dev_id);
98799a2dd95SBruce Richardson 
9883ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_socket_id(dev_id, dev->data->name,
9893ebb587eSAmit Prakash Shukla 		dev->data->socket_id);
99099a2dd95SBruce Richardson 	return dev->data->socket_id;
99199a2dd95SBruce Richardson }
99299a2dd95SBruce Richardson 
99399a2dd95SBruce Richardson static inline int
99499a2dd95SBruce Richardson rte_cryptodev_data_alloc(uint8_t dev_id, struct rte_cryptodev_data **data,
99599a2dd95SBruce Richardson 		int socket_id)
99699a2dd95SBruce Richardson {
99799a2dd95SBruce Richardson 	char mz_name[RTE_MEMZONE_NAMESIZE];
99899a2dd95SBruce Richardson 	const struct rte_memzone *mz;
99999a2dd95SBruce Richardson 	int n;
100099a2dd95SBruce Richardson 
100199a2dd95SBruce Richardson 	/* generate memzone name */
100299a2dd95SBruce Richardson 	n = snprintf(mz_name, sizeof(mz_name), "rte_cryptodev_data_%u", dev_id);
100399a2dd95SBruce Richardson 	if (n >= (int)sizeof(mz_name))
100499a2dd95SBruce Richardson 		return -EINVAL;
100599a2dd95SBruce Richardson 
100699a2dd95SBruce Richardson 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
100799a2dd95SBruce Richardson 		mz = rte_memzone_reserve(mz_name,
100899a2dd95SBruce Richardson 				sizeof(struct rte_cryptodev_data),
100999a2dd95SBruce Richardson 				socket_id, 0);
101099a2dd95SBruce Richardson 		CDEV_LOG_DEBUG("PRIMARY:reserved memzone for %s (%p)",
101199a2dd95SBruce Richardson 				mz_name, mz);
101299a2dd95SBruce Richardson 	} else {
101399a2dd95SBruce Richardson 		mz = rte_memzone_lookup(mz_name);
101499a2dd95SBruce Richardson 		CDEV_LOG_DEBUG("SECONDARY:looked up memzone for %s (%p)",
101599a2dd95SBruce Richardson 				mz_name, mz);
101699a2dd95SBruce Richardson 	}
101799a2dd95SBruce Richardson 
101899a2dd95SBruce Richardson 	if (mz == NULL)
101999a2dd95SBruce Richardson 		return -ENOMEM;
102099a2dd95SBruce Richardson 
102199a2dd95SBruce Richardson 	*data = mz->addr;
102299a2dd95SBruce Richardson 	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
102399a2dd95SBruce Richardson 		memset(*data, 0, sizeof(struct rte_cryptodev_data));
102499a2dd95SBruce Richardson 
102599a2dd95SBruce Richardson 	return 0;
102699a2dd95SBruce Richardson }
102799a2dd95SBruce Richardson 
102899a2dd95SBruce Richardson static inline int
102999a2dd95SBruce Richardson rte_cryptodev_data_free(uint8_t dev_id, struct rte_cryptodev_data **data)
103099a2dd95SBruce Richardson {
103199a2dd95SBruce Richardson 	char mz_name[RTE_MEMZONE_NAMESIZE];
103299a2dd95SBruce Richardson 	const struct rte_memzone *mz;
103399a2dd95SBruce Richardson 	int n;
103499a2dd95SBruce Richardson 
103599a2dd95SBruce Richardson 	/* generate memzone name */
103699a2dd95SBruce Richardson 	n = snprintf(mz_name, sizeof(mz_name), "rte_cryptodev_data_%u", dev_id);
103799a2dd95SBruce Richardson 	if (n >= (int)sizeof(mz_name))
103899a2dd95SBruce Richardson 		return -EINVAL;
103999a2dd95SBruce Richardson 
104099a2dd95SBruce Richardson 	mz = rte_memzone_lookup(mz_name);
104199a2dd95SBruce Richardson 	if (mz == NULL)
104299a2dd95SBruce Richardson 		return -ENOMEM;
104399a2dd95SBruce Richardson 
104499a2dd95SBruce Richardson 	RTE_ASSERT(*data == mz->addr);
104599a2dd95SBruce Richardson 	*data = NULL;
104699a2dd95SBruce Richardson 
104799a2dd95SBruce Richardson 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
104899a2dd95SBruce Richardson 		CDEV_LOG_DEBUG("PRIMARY:free memzone of %s (%p)",
104999a2dd95SBruce Richardson 				mz_name, mz);
105099a2dd95SBruce Richardson 		return rte_memzone_free(mz);
105199a2dd95SBruce Richardson 	} else {
105299a2dd95SBruce Richardson 		CDEV_LOG_DEBUG("SECONDARY:don't free memzone of %s (%p)",
105399a2dd95SBruce Richardson 				mz_name, mz);
105499a2dd95SBruce Richardson 	}
105599a2dd95SBruce Richardson 
105699a2dd95SBruce Richardson 	return 0;
105799a2dd95SBruce Richardson }
105899a2dd95SBruce Richardson 
105999a2dd95SBruce Richardson static uint8_t
106099a2dd95SBruce Richardson rte_cryptodev_find_free_device_index(void)
106199a2dd95SBruce Richardson {
106299a2dd95SBruce Richardson 	uint8_t dev_id;
106399a2dd95SBruce Richardson 
106499a2dd95SBruce Richardson 	for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++) {
106599a2dd95SBruce Richardson 		if (rte_crypto_devices[dev_id].attached ==
106699a2dd95SBruce Richardson 				RTE_CRYPTODEV_DETACHED)
106799a2dd95SBruce Richardson 			return dev_id;
106899a2dd95SBruce Richardson 	}
106999a2dd95SBruce Richardson 	return RTE_CRYPTO_MAX_DEVS;
107099a2dd95SBruce Richardson }
107199a2dd95SBruce Richardson 
107299a2dd95SBruce Richardson struct rte_cryptodev *
107399a2dd95SBruce Richardson rte_cryptodev_pmd_allocate(const char *name, int socket_id)
107499a2dd95SBruce Richardson {
107599a2dd95SBruce Richardson 	struct rte_cryptodev *cryptodev;
107699a2dd95SBruce Richardson 	uint8_t dev_id;
107799a2dd95SBruce Richardson 
107899a2dd95SBruce Richardson 	if (rte_cryptodev_pmd_get_named_dev(name) != NULL) {
107999a2dd95SBruce Richardson 		CDEV_LOG_ERR("Crypto device with name %s already "
108099a2dd95SBruce Richardson 				"allocated!", name);
108199a2dd95SBruce Richardson 		return NULL;
108299a2dd95SBruce Richardson 	}
108399a2dd95SBruce Richardson 
108499a2dd95SBruce Richardson 	dev_id = rte_cryptodev_find_free_device_index();
108599a2dd95SBruce Richardson 	if (dev_id == RTE_CRYPTO_MAX_DEVS) {
108699a2dd95SBruce Richardson 		CDEV_LOG_ERR("Reached maximum number of crypto devices");
108799a2dd95SBruce Richardson 		return NULL;
108899a2dd95SBruce Richardson 	}
108999a2dd95SBruce Richardson 
109099a2dd95SBruce Richardson 	cryptodev = rte_cryptodev_pmd_get_dev(dev_id);
109199a2dd95SBruce Richardson 
109299a2dd95SBruce Richardson 	if (cryptodev->data == NULL) {
109399a2dd95SBruce Richardson 		struct rte_cryptodev_data **cryptodev_data =
109499a2dd95SBruce Richardson 				&cryptodev_globals.data[dev_id];
109599a2dd95SBruce Richardson 
109699a2dd95SBruce Richardson 		int retval = rte_cryptodev_data_alloc(dev_id, cryptodev_data,
109799a2dd95SBruce Richardson 				socket_id);
109899a2dd95SBruce Richardson 
109999a2dd95SBruce Richardson 		if (retval < 0 || *cryptodev_data == NULL)
110099a2dd95SBruce Richardson 			return NULL;
110199a2dd95SBruce Richardson 
110299a2dd95SBruce Richardson 		cryptodev->data = *cryptodev_data;
110399a2dd95SBruce Richardson 
110499a2dd95SBruce Richardson 		if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
110599a2dd95SBruce Richardson 			strlcpy(cryptodev->data->name, name,
110699a2dd95SBruce Richardson 				RTE_CRYPTODEV_NAME_MAX_LEN);
110799a2dd95SBruce Richardson 
110899a2dd95SBruce Richardson 			cryptodev->data->dev_id = dev_id;
110999a2dd95SBruce Richardson 			cryptodev->data->socket_id = socket_id;
111099a2dd95SBruce Richardson 			cryptodev->data->dev_started = 0;
111199a2dd95SBruce Richardson 			CDEV_LOG_DEBUG("PRIMARY:init data");
111299a2dd95SBruce Richardson 		}
111399a2dd95SBruce Richardson 
111499a2dd95SBruce Richardson 		CDEV_LOG_DEBUG("Data for %s: dev_id %d, socket %d, started %d",
111599a2dd95SBruce Richardson 				cryptodev->data->name,
111699a2dd95SBruce Richardson 				cryptodev->data->dev_id,
111799a2dd95SBruce Richardson 				cryptodev->data->socket_id,
111899a2dd95SBruce Richardson 				cryptodev->data->dev_started);
111999a2dd95SBruce Richardson 
112099a2dd95SBruce Richardson 		/* init user callbacks */
112199a2dd95SBruce Richardson 		TAILQ_INIT(&(cryptodev->link_intr_cbs));
112299a2dd95SBruce Richardson 
112399a2dd95SBruce Richardson 		cryptodev->attached = RTE_CRYPTODEV_ATTACHED;
112499a2dd95SBruce Richardson 
112599a2dd95SBruce Richardson 		cryptodev_globals.nb_devs++;
112699a2dd95SBruce Richardson 	}
112799a2dd95SBruce Richardson 
112899a2dd95SBruce Richardson 	return cryptodev;
112999a2dd95SBruce Richardson }
113099a2dd95SBruce Richardson 
113199a2dd95SBruce Richardson int
113299a2dd95SBruce Richardson rte_cryptodev_pmd_release_device(struct rte_cryptodev *cryptodev)
113399a2dd95SBruce Richardson {
113499a2dd95SBruce Richardson 	int ret;
113599a2dd95SBruce Richardson 	uint8_t dev_id;
113699a2dd95SBruce Richardson 
113799a2dd95SBruce Richardson 	if (cryptodev == NULL)
113899a2dd95SBruce Richardson 		return -EINVAL;
113999a2dd95SBruce Richardson 
114099a2dd95SBruce Richardson 	dev_id = cryptodev->data->dev_id;
114199a2dd95SBruce Richardson 
11422fd66f75SAkhil Goyal 	cryptodev_fp_ops_reset(rte_crypto_fp_ops + dev_id);
11432fd66f75SAkhil Goyal 
114499a2dd95SBruce Richardson 	/* Close device only if device operations have been set */
114599a2dd95SBruce Richardson 	if (cryptodev->dev_ops) {
114699a2dd95SBruce Richardson 		ret = rte_cryptodev_close(dev_id);
114799a2dd95SBruce Richardson 		if (ret < 0)
114899a2dd95SBruce Richardson 			return ret;
114999a2dd95SBruce Richardson 	}
115099a2dd95SBruce Richardson 
115199a2dd95SBruce Richardson 	ret = rte_cryptodev_data_free(dev_id, &cryptodev_globals.data[dev_id]);
115299a2dd95SBruce Richardson 	if (ret < 0)
115399a2dd95SBruce Richardson 		return ret;
115499a2dd95SBruce Richardson 
115599a2dd95SBruce Richardson 	cryptodev->attached = RTE_CRYPTODEV_DETACHED;
115699a2dd95SBruce Richardson 	cryptodev_globals.nb_devs--;
115799a2dd95SBruce Richardson 	return 0;
115899a2dd95SBruce Richardson }
115999a2dd95SBruce Richardson 
116099a2dd95SBruce Richardson uint16_t
116199a2dd95SBruce Richardson rte_cryptodev_queue_pair_count(uint8_t dev_id)
116299a2dd95SBruce Richardson {
116399a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
116499a2dd95SBruce Richardson 
116599a2dd95SBruce Richardson 	if (!rte_cryptodev_is_valid_device_data(dev_id)) {
116699a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
116799a2dd95SBruce Richardson 		return 0;
116899a2dd95SBruce Richardson 	}
116999a2dd95SBruce Richardson 
117099a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
11713ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_queue_pair_count(dev, dev->data->name,
11723ebb587eSAmit Prakash Shukla 		dev->data->socket_id, dev->data->dev_id,
11733ebb587eSAmit Prakash Shukla 		dev->data->nb_queue_pairs);
11743ebb587eSAmit Prakash Shukla 
117599a2dd95SBruce Richardson 	return dev->data->nb_queue_pairs;
117699a2dd95SBruce Richardson }
117799a2dd95SBruce Richardson 
117899a2dd95SBruce Richardson static int
117999a2dd95SBruce Richardson rte_cryptodev_queue_pairs_config(struct rte_cryptodev *dev, uint16_t nb_qpairs,
118099a2dd95SBruce Richardson 		int socket_id)
118199a2dd95SBruce Richardson {
118299a2dd95SBruce Richardson 	struct rte_cryptodev_info dev_info;
118399a2dd95SBruce Richardson 	void **qp;
118499a2dd95SBruce Richardson 	unsigned i;
118599a2dd95SBruce Richardson 
118699a2dd95SBruce Richardson 	if ((dev == NULL) || (nb_qpairs < 1)) {
118799a2dd95SBruce Richardson 		CDEV_LOG_ERR("invalid param: dev %p, nb_queues %u",
118899a2dd95SBruce Richardson 							dev, nb_qpairs);
118999a2dd95SBruce Richardson 		return -EINVAL;
119099a2dd95SBruce Richardson 	}
119199a2dd95SBruce Richardson 
119299a2dd95SBruce Richardson 	CDEV_LOG_DEBUG("Setup %d queues pairs on device %u",
119399a2dd95SBruce Richardson 			nb_qpairs, dev->data->dev_id);
119499a2dd95SBruce Richardson 
119599a2dd95SBruce Richardson 	memset(&dev_info, 0, sizeof(struct rte_cryptodev_info));
119699a2dd95SBruce Richardson 
11978f1d23ecSDavid Marchand 	if (*dev->dev_ops->dev_infos_get == NULL)
11988f1d23ecSDavid Marchand 		return -ENOTSUP;
119999a2dd95SBruce Richardson 	(*dev->dev_ops->dev_infos_get)(dev, &dev_info);
120099a2dd95SBruce Richardson 
120199a2dd95SBruce Richardson 	if (nb_qpairs > (dev_info.max_nb_queue_pairs)) {
120299a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid num queue_pairs (%u) for dev %u",
120399a2dd95SBruce Richardson 				nb_qpairs, dev->data->dev_id);
120499a2dd95SBruce Richardson 	    return -EINVAL;
120599a2dd95SBruce Richardson 	}
120699a2dd95SBruce Richardson 
120799a2dd95SBruce Richardson 	if (dev->data->queue_pairs == NULL) { /* first time configuration */
120899a2dd95SBruce Richardson 		dev->data->queue_pairs = rte_zmalloc_socket(
120999a2dd95SBruce Richardson 				"cryptodev->queue_pairs",
12107f3876adSAkhil Goyal 				sizeof(dev->data->queue_pairs[0]) *
12117f3876adSAkhil Goyal 				dev_info.max_nb_queue_pairs,
121299a2dd95SBruce Richardson 				RTE_CACHE_LINE_SIZE, socket_id);
121399a2dd95SBruce Richardson 
121499a2dd95SBruce Richardson 		if (dev->data->queue_pairs == NULL) {
121599a2dd95SBruce Richardson 			dev->data->nb_queue_pairs = 0;
121699a2dd95SBruce Richardson 			CDEV_LOG_ERR("failed to get memory for qp meta data, "
121799a2dd95SBruce Richardson 							"nb_queues %u",
121899a2dd95SBruce Richardson 							nb_qpairs);
121999a2dd95SBruce Richardson 			return -(ENOMEM);
122099a2dd95SBruce Richardson 		}
122199a2dd95SBruce Richardson 	} else { /* re-configure */
122299a2dd95SBruce Richardson 		int ret;
122399a2dd95SBruce Richardson 		uint16_t old_nb_queues = dev->data->nb_queue_pairs;
122499a2dd95SBruce Richardson 
122599a2dd95SBruce Richardson 		qp = dev->data->queue_pairs;
122699a2dd95SBruce Richardson 
12278f1d23ecSDavid Marchand 		if (*dev->dev_ops->queue_pair_release == NULL)
12288f1d23ecSDavid Marchand 			return -ENOTSUP;
122999a2dd95SBruce Richardson 
123099a2dd95SBruce Richardson 		for (i = nb_qpairs; i < old_nb_queues; i++) {
123199a2dd95SBruce Richardson 			ret = (*dev->dev_ops->queue_pair_release)(dev, i);
123299a2dd95SBruce Richardson 			if (ret < 0)
123399a2dd95SBruce Richardson 				return ret;
12347f3876adSAkhil Goyal 			qp[i] = NULL;
123599a2dd95SBruce Richardson 		}
123699a2dd95SBruce Richardson 
123799a2dd95SBruce Richardson 	}
123899a2dd95SBruce Richardson 	dev->data->nb_queue_pairs = nb_qpairs;
123999a2dd95SBruce Richardson 	return 0;
124099a2dd95SBruce Richardson }
124199a2dd95SBruce Richardson 
124299a2dd95SBruce Richardson int
12430a054e8dSVidya Sagar Velumuri rte_cryptodev_queue_pair_reset(uint8_t dev_id, uint16_t queue_pair_id,
12440a054e8dSVidya Sagar Velumuri 		const struct rte_cryptodev_qp_conf *qp_conf, int socket_id)
12450a054e8dSVidya Sagar Velumuri {
12460a054e8dSVidya Sagar Velumuri 	struct rte_cryptodev *dev;
12470a054e8dSVidya Sagar Velumuri 
12480a054e8dSVidya Sagar Velumuri 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
12490a054e8dSVidya Sagar Velumuri 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
12500a054e8dSVidya Sagar Velumuri 		return -EINVAL;
12510a054e8dSVidya Sagar Velumuri 	}
12520a054e8dSVidya Sagar Velumuri 
12530a054e8dSVidya Sagar Velumuri 	dev = &rte_crypto_devices[dev_id];
12540a054e8dSVidya Sagar Velumuri 	if (queue_pair_id >= dev->data->nb_queue_pairs) {
12550a054e8dSVidya Sagar Velumuri 		CDEV_LOG_ERR("Invalid queue_pair_id=%d", queue_pair_id);
12560a054e8dSVidya Sagar Velumuri 		return -EINVAL;
12570a054e8dSVidya Sagar Velumuri 	}
12580a054e8dSVidya Sagar Velumuri 
12590a054e8dSVidya Sagar Velumuri 	if (*dev->dev_ops->queue_pair_reset == NULL)
12600a054e8dSVidya Sagar Velumuri 		return -ENOTSUP;
12610a054e8dSVidya Sagar Velumuri 
12620a054e8dSVidya Sagar Velumuri 	rte_cryptodev_trace_queue_pair_reset(dev_id, queue_pair_id, qp_conf, socket_id);
12630a054e8dSVidya Sagar Velumuri 	return (*dev->dev_ops->queue_pair_reset)(dev, queue_pair_id, qp_conf, socket_id);
12640a054e8dSVidya Sagar Velumuri }
12650a054e8dSVidya Sagar Velumuri 
12660a054e8dSVidya Sagar Velumuri int
126799a2dd95SBruce Richardson rte_cryptodev_configure(uint8_t dev_id, struct rte_cryptodev_config *config)
126899a2dd95SBruce Richardson {
126999a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
127099a2dd95SBruce Richardson 	int diag;
127199a2dd95SBruce Richardson 
1272e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
127399a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
127499a2dd95SBruce Richardson 		return -EINVAL;
127599a2dd95SBruce Richardson 	}
127699a2dd95SBruce Richardson 
127799a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
127899a2dd95SBruce Richardson 
127999a2dd95SBruce Richardson 	if (dev->data->dev_started) {
128099a2dd95SBruce Richardson 		CDEV_LOG_ERR(
128199a2dd95SBruce Richardson 		    "device %d must be stopped to allow configuration", dev_id);
128299a2dd95SBruce Richardson 		return -EBUSY;
128399a2dd95SBruce Richardson 	}
128499a2dd95SBruce Richardson 
12858f1d23ecSDavid Marchand 	if (*dev->dev_ops->dev_configure == NULL)
12868f1d23ecSDavid Marchand 		return -ENOTSUP;
128799a2dd95SBruce Richardson 
128899a2dd95SBruce Richardson 	rte_spinlock_lock(&rte_cryptodev_callback_lock);
128999a2dd95SBruce Richardson 	cryptodev_cb_cleanup(dev);
129099a2dd95SBruce Richardson 	rte_spinlock_unlock(&rte_cryptodev_callback_lock);
129199a2dd95SBruce Richardson 
129299a2dd95SBruce Richardson 	/* Setup new number of queue pairs and reconfigure device. */
129399a2dd95SBruce Richardson 	diag = rte_cryptodev_queue_pairs_config(dev, config->nb_queue_pairs,
129499a2dd95SBruce Richardson 			config->socket_id);
129599a2dd95SBruce Richardson 	if (diag != 0) {
129699a2dd95SBruce Richardson 		CDEV_LOG_ERR("dev%d rte_crypto_dev_queue_pairs_config = %d",
129799a2dd95SBruce Richardson 				dev_id, diag);
129899a2dd95SBruce Richardson 		return diag;
129999a2dd95SBruce Richardson 	}
130099a2dd95SBruce Richardson 
130199a2dd95SBruce Richardson 	rte_spinlock_lock(&rte_cryptodev_callback_lock);
130299a2dd95SBruce Richardson 	diag = cryptodev_cb_init(dev);
130399a2dd95SBruce Richardson 	rte_spinlock_unlock(&rte_cryptodev_callback_lock);
130499a2dd95SBruce Richardson 	if (diag) {
130599a2dd95SBruce Richardson 		CDEV_LOG_ERR("Callback init failed for dev_id=%d", dev_id);
130699a2dd95SBruce Richardson 		return diag;
130799a2dd95SBruce Richardson 	}
130899a2dd95SBruce Richardson 
130999a2dd95SBruce Richardson 	rte_cryptodev_trace_configure(dev_id, config);
131099a2dd95SBruce Richardson 	return (*dev->dev_ops->dev_configure)(dev, config);
131199a2dd95SBruce Richardson }
131299a2dd95SBruce Richardson 
131399a2dd95SBruce Richardson int
131499a2dd95SBruce Richardson rte_cryptodev_start(uint8_t dev_id)
131599a2dd95SBruce Richardson {
131699a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
131799a2dd95SBruce Richardson 	int diag;
131899a2dd95SBruce Richardson 
131999a2dd95SBruce Richardson 	CDEV_LOG_DEBUG("Start dev_id=%" PRIu8, dev_id);
132099a2dd95SBruce Richardson 
1321e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
132299a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
132399a2dd95SBruce Richardson 		return -EINVAL;
132499a2dd95SBruce Richardson 	}
132599a2dd95SBruce Richardson 
132699a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
132799a2dd95SBruce Richardson 
13288f1d23ecSDavid Marchand 	if (*dev->dev_ops->dev_start == NULL)
13298f1d23ecSDavid Marchand 		return -ENOTSUP;
133099a2dd95SBruce Richardson 
133199a2dd95SBruce Richardson 	if (dev->data->dev_started != 0) {
133299a2dd95SBruce Richardson 		CDEV_LOG_ERR("Device with dev_id=%" PRIu8 " already started",
133399a2dd95SBruce Richardson 			dev_id);
133499a2dd95SBruce Richardson 		return 0;
133599a2dd95SBruce Richardson 	}
133699a2dd95SBruce Richardson 
133799a2dd95SBruce Richardson 	diag = (*dev->dev_ops->dev_start)(dev);
13382fd66f75SAkhil Goyal 	/* expose selection of PMD fast-path functions */
13392fd66f75SAkhil Goyal 	cryptodev_fp_ops_set(rte_crypto_fp_ops + dev_id, dev);
13402fd66f75SAkhil Goyal 
134199a2dd95SBruce Richardson 	rte_cryptodev_trace_start(dev_id, diag);
134299a2dd95SBruce Richardson 	if (diag == 0)
134399a2dd95SBruce Richardson 		dev->data->dev_started = 1;
134499a2dd95SBruce Richardson 	else
134599a2dd95SBruce Richardson 		return diag;
134699a2dd95SBruce Richardson 
134799a2dd95SBruce Richardson 	return 0;
134899a2dd95SBruce Richardson }
134999a2dd95SBruce Richardson 
135099a2dd95SBruce Richardson void
135199a2dd95SBruce Richardson rte_cryptodev_stop(uint8_t dev_id)
135299a2dd95SBruce Richardson {
135399a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
135499a2dd95SBruce Richardson 
1355e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
135699a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
135799a2dd95SBruce Richardson 		return;
135899a2dd95SBruce Richardson 	}
135999a2dd95SBruce Richardson 
136099a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
136199a2dd95SBruce Richardson 
13628f1d23ecSDavid Marchand 	if (*dev->dev_ops->dev_stop == NULL)
13638f1d23ecSDavid Marchand 		return;
136499a2dd95SBruce Richardson 
136599a2dd95SBruce Richardson 	if (dev->data->dev_started == 0) {
136699a2dd95SBruce Richardson 		CDEV_LOG_ERR("Device with dev_id=%" PRIu8 " already stopped",
136799a2dd95SBruce Richardson 			dev_id);
136899a2dd95SBruce Richardson 		return;
136999a2dd95SBruce Richardson 	}
137099a2dd95SBruce Richardson 
13712fd66f75SAkhil Goyal 	/* point fast-path functions to dummy ones */
13722fd66f75SAkhil Goyal 	cryptodev_fp_ops_reset(rte_crypto_fp_ops + dev_id);
13732fd66f75SAkhil Goyal 
137499a2dd95SBruce Richardson 	(*dev->dev_ops->dev_stop)(dev);
137599a2dd95SBruce Richardson 	rte_cryptodev_trace_stop(dev_id);
137699a2dd95SBruce Richardson 	dev->data->dev_started = 0;
137799a2dd95SBruce Richardson }
137899a2dd95SBruce Richardson 
137999a2dd95SBruce Richardson int
138099a2dd95SBruce Richardson rte_cryptodev_close(uint8_t dev_id)
138199a2dd95SBruce Richardson {
138299a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
138399a2dd95SBruce Richardson 	int retval;
138499a2dd95SBruce Richardson 
1385e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
138699a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
138799a2dd95SBruce Richardson 		return -1;
138899a2dd95SBruce Richardson 	}
138999a2dd95SBruce Richardson 
139099a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
139199a2dd95SBruce Richardson 
139299a2dd95SBruce Richardson 	/* Device must be stopped before it can be closed */
139399a2dd95SBruce Richardson 	if (dev->data->dev_started == 1) {
139499a2dd95SBruce Richardson 		CDEV_LOG_ERR("Device %u must be stopped before closing",
139599a2dd95SBruce Richardson 				dev_id);
139699a2dd95SBruce Richardson 		return -EBUSY;
139799a2dd95SBruce Richardson 	}
139899a2dd95SBruce Richardson 
139999a2dd95SBruce Richardson 	/* We can't close the device if there are outstanding sessions in use */
140099a2dd95SBruce Richardson 	if (dev->data->session_pool != NULL) {
140199a2dd95SBruce Richardson 		if (!rte_mempool_full(dev->data->session_pool)) {
140299a2dd95SBruce Richardson 			CDEV_LOG_ERR("dev_id=%u close failed, session mempool "
140399a2dd95SBruce Richardson 					"has sessions still in use, free "
140499a2dd95SBruce Richardson 					"all sessions before calling close",
140599a2dd95SBruce Richardson 					(unsigned)dev_id);
140699a2dd95SBruce Richardson 			return -EBUSY;
140799a2dd95SBruce Richardson 		}
140899a2dd95SBruce Richardson 	}
140999a2dd95SBruce Richardson 
14108f1d23ecSDavid Marchand 	if (*dev->dev_ops->dev_close == NULL)
14118f1d23ecSDavid Marchand 		return -ENOTSUP;
141299a2dd95SBruce Richardson 	retval = (*dev->dev_ops->dev_close)(dev);
141399a2dd95SBruce Richardson 	rte_cryptodev_trace_close(dev_id, retval);
141499a2dd95SBruce Richardson 
141599a2dd95SBruce Richardson 	if (retval < 0)
141699a2dd95SBruce Richardson 		return retval;
141799a2dd95SBruce Richardson 
141899a2dd95SBruce Richardson 	return 0;
141999a2dd95SBruce Richardson }
142099a2dd95SBruce Richardson 
142199a2dd95SBruce Richardson int
142299a2dd95SBruce Richardson rte_cryptodev_get_qp_status(uint8_t dev_id, uint16_t queue_pair_id)
142399a2dd95SBruce Richardson {
142499a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
14253ebb587eSAmit Prakash Shukla 	int ret = 0;
142699a2dd95SBruce Richardson 
1427e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
142899a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
14293ebb587eSAmit Prakash Shukla 		ret = -EINVAL;
14303ebb587eSAmit Prakash Shukla 		goto done;
143199a2dd95SBruce Richardson 	}
143299a2dd95SBruce Richardson 
143399a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
143499a2dd95SBruce Richardson 	if (queue_pair_id >= dev->data->nb_queue_pairs) {
143599a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid queue_pair_id=%d", queue_pair_id);
14363ebb587eSAmit Prakash Shukla 		ret = -EINVAL;
14373ebb587eSAmit Prakash Shukla 		goto done;
143899a2dd95SBruce Richardson 	}
143999a2dd95SBruce Richardson 	void **qps = dev->data->queue_pairs;
144099a2dd95SBruce Richardson 
144199a2dd95SBruce Richardson 	if (qps[queue_pair_id])	{
144299a2dd95SBruce Richardson 		CDEV_LOG_DEBUG("qp %d on dev %d is initialised",
144399a2dd95SBruce Richardson 			queue_pair_id, dev_id);
14443ebb587eSAmit Prakash Shukla 		ret = 1;
14453ebb587eSAmit Prakash Shukla 		goto done;
144699a2dd95SBruce Richardson 	}
144799a2dd95SBruce Richardson 
144899a2dd95SBruce Richardson 	CDEV_LOG_DEBUG("qp %d on dev %d is not initialised",
144999a2dd95SBruce Richardson 		queue_pair_id, dev_id);
145099a2dd95SBruce Richardson 
14513ebb587eSAmit Prakash Shukla done:
14523ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_get_qp_status(dev_id, queue_pair_id, ret);
14533ebb587eSAmit Prakash Shukla 
14543ebb587eSAmit Prakash Shukla 	return ret;
145599a2dd95SBruce Richardson }
145699a2dd95SBruce Richardson 
1457bdce2564SAkhil Goyal static uint8_t
1458bdce2564SAkhil Goyal rte_cryptodev_sym_is_valid_session_pool(struct rte_mempool *mp,
1459bdce2564SAkhil Goyal 	uint32_t sess_priv_size)
1460bdce2564SAkhil Goyal {
1461bdce2564SAkhil Goyal 	struct rte_cryptodev_sym_session_pool_private_data *pool_priv;
1462bdce2564SAkhil Goyal 
1463bdce2564SAkhil Goyal 	if (!mp)
1464bdce2564SAkhil Goyal 		return 0;
1465bdce2564SAkhil Goyal 
1466bdce2564SAkhil Goyal 	pool_priv = rte_mempool_get_priv(mp);
1467bdce2564SAkhil Goyal 
1468bdce2564SAkhil Goyal 	if (!pool_priv || mp->private_data_size < sizeof(*pool_priv) ||
1469bdce2564SAkhil Goyal 			pool_priv->sess_data_sz < sess_priv_size)
1470bdce2564SAkhil Goyal 		return 0;
1471bdce2564SAkhil Goyal 
1472bdce2564SAkhil Goyal 	return 1;
1473bdce2564SAkhil Goyal }
1474bdce2564SAkhil Goyal 
147599a2dd95SBruce Richardson int
147699a2dd95SBruce Richardson rte_cryptodev_queue_pair_setup(uint8_t dev_id, uint16_t queue_pair_id,
147799a2dd95SBruce Richardson 		const struct rte_cryptodev_qp_conf *qp_conf, int socket_id)
147899a2dd95SBruce Richardson 
147999a2dd95SBruce Richardson {
148099a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
148199a2dd95SBruce Richardson 
1482e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
148399a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
148499a2dd95SBruce Richardson 		return -EINVAL;
148599a2dd95SBruce Richardson 	}
148699a2dd95SBruce Richardson 
148799a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
148899a2dd95SBruce Richardson 	if (queue_pair_id >= dev->data->nb_queue_pairs) {
148999a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid queue_pair_id=%d", queue_pair_id);
149099a2dd95SBruce Richardson 		return -EINVAL;
149199a2dd95SBruce Richardson 	}
149299a2dd95SBruce Richardson 
149399a2dd95SBruce Richardson 	if (!qp_conf) {
1494a0a17e2aSOlivier Matz 		CDEV_LOG_ERR("qp_conf cannot be NULL");
149599a2dd95SBruce Richardson 		return -EINVAL;
149699a2dd95SBruce Richardson 	}
149799a2dd95SBruce Richardson 
149899a2dd95SBruce Richardson 	if (qp_conf->mp_session) {
149999a2dd95SBruce Richardson 		struct rte_cryptodev_sym_session_pool_private_data *pool_priv;
150099a2dd95SBruce Richardson 
150199a2dd95SBruce Richardson 		pool_priv = rte_mempool_get_priv(qp_conf->mp_session);
150299a2dd95SBruce Richardson 		if (!pool_priv || qp_conf->mp_session->private_data_size <
150399a2dd95SBruce Richardson 				sizeof(*pool_priv)) {
1504a0a17e2aSOlivier Matz 			CDEV_LOG_ERR("Invalid mempool");
150599a2dd95SBruce Richardson 			return -EINVAL;
150699a2dd95SBruce Richardson 		}
150799a2dd95SBruce Richardson 
1508bdce2564SAkhil Goyal 		if (!rte_cryptodev_sym_is_valid_session_pool(qp_conf->mp_session,
1509bdce2564SAkhil Goyal 					rte_cryptodev_sym_get_private_session_size(dev_id))) {
1510a0a17e2aSOlivier Matz 			CDEV_LOG_ERR("Invalid mempool");
151199a2dd95SBruce Richardson 			return -EINVAL;
151299a2dd95SBruce Richardson 		}
151399a2dd95SBruce Richardson 	}
151499a2dd95SBruce Richardson 
151599a2dd95SBruce Richardson 	if (dev->data->dev_started) {
151699a2dd95SBruce Richardson 		CDEV_LOG_ERR(
151799a2dd95SBruce Richardson 		    "device %d must be stopped to allow configuration", dev_id);
151899a2dd95SBruce Richardson 		return -EBUSY;
151999a2dd95SBruce Richardson 	}
152099a2dd95SBruce Richardson 
15218f1d23ecSDavid Marchand 	if (*dev->dev_ops->queue_pair_setup == NULL)
15228f1d23ecSDavid Marchand 		return -ENOTSUP;
152399a2dd95SBruce Richardson 
152499a2dd95SBruce Richardson 	rte_cryptodev_trace_queue_pair_setup(dev_id, queue_pair_id, qp_conf);
152599a2dd95SBruce Richardson 	return (*dev->dev_ops->queue_pair_setup)(dev, queue_pair_id, qp_conf,
152699a2dd95SBruce Richardson 			socket_id);
152799a2dd95SBruce Richardson }
152899a2dd95SBruce Richardson 
152999a2dd95SBruce Richardson struct rte_cryptodev_cb *
153099a2dd95SBruce Richardson rte_cryptodev_add_enq_callback(uint8_t dev_id,
153199a2dd95SBruce Richardson 			       uint16_t qp_id,
153299a2dd95SBruce Richardson 			       rte_cryptodev_callback_fn cb_fn,
153399a2dd95SBruce Richardson 			       void *cb_arg)
153499a2dd95SBruce Richardson {
1535cfa44335SGanapati Kundapura #ifndef RTE_CRYPTO_CALLBACKS
1536cfa44335SGanapati Kundapura 	rte_errno = ENOTSUP;
1537cfa44335SGanapati Kundapura 	return NULL;
1538cfa44335SGanapati Kundapura #endif
153999a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
154099a2dd95SBruce Richardson 	struct rte_cryptodev_cb_rcu *list;
154199a2dd95SBruce Richardson 	struct rte_cryptodev_cb *cb, *tail;
154299a2dd95SBruce Richardson 
154399a2dd95SBruce Richardson 	if (!cb_fn) {
154499a2dd95SBruce Richardson 		CDEV_LOG_ERR("Callback is NULL on dev_id=%d", dev_id);
154599a2dd95SBruce Richardson 		rte_errno = EINVAL;
154699a2dd95SBruce Richardson 		return NULL;
154799a2dd95SBruce Richardson 	}
154899a2dd95SBruce Richardson 
1549e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
155099a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
155199a2dd95SBruce Richardson 		rte_errno = ENODEV;
155299a2dd95SBruce Richardson 		return NULL;
155399a2dd95SBruce Richardson 	}
155499a2dd95SBruce Richardson 
155599a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
155699a2dd95SBruce Richardson 	if (qp_id >= dev->data->nb_queue_pairs) {
155799a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid queue_pair_id=%d", qp_id);
155899a2dd95SBruce Richardson 		rte_errno = ENODEV;
155999a2dd95SBruce Richardson 		return NULL;
156099a2dd95SBruce Richardson 	}
156199a2dd95SBruce Richardson 
156299a2dd95SBruce Richardson 	cb = rte_zmalloc(NULL, sizeof(*cb), 0);
156399a2dd95SBruce Richardson 	if (cb == NULL) {
156499a2dd95SBruce Richardson 		CDEV_LOG_ERR("Failed to allocate memory for callback on "
156599a2dd95SBruce Richardson 			     "dev=%d, queue_pair_id=%d", dev_id, qp_id);
156699a2dd95SBruce Richardson 		rte_errno = ENOMEM;
156799a2dd95SBruce Richardson 		return NULL;
156899a2dd95SBruce Richardson 	}
156999a2dd95SBruce Richardson 
157099a2dd95SBruce Richardson 	rte_spinlock_lock(&rte_cryptodev_callback_lock);
157199a2dd95SBruce Richardson 
157299a2dd95SBruce Richardson 	cb->fn = cb_fn;
157399a2dd95SBruce Richardson 	cb->arg = cb_arg;
157499a2dd95SBruce Richardson 
157599a2dd95SBruce Richardson 	/* Add the callbacks in fifo order. */
157699a2dd95SBruce Richardson 	list = &dev->enq_cbs[qp_id];
157799a2dd95SBruce Richardson 	tail = list->next;
157899a2dd95SBruce Richardson 
157999a2dd95SBruce Richardson 	if (tail) {
158099a2dd95SBruce Richardson 		while (tail->next)
158199a2dd95SBruce Richardson 			tail = tail->next;
158299a2dd95SBruce Richardson 		/* Stores to cb->fn and cb->param should complete before
158399a2dd95SBruce Richardson 		 * cb is visible to data plane.
158499a2dd95SBruce Richardson 		 */
1585ab1932afSTyler Retzlaff 		rte_atomic_store_explicit(&tail->next, cb, rte_memory_order_release);
158699a2dd95SBruce Richardson 	} else {
158799a2dd95SBruce Richardson 		/* Stores to cb->fn and cb->param should complete before
158899a2dd95SBruce Richardson 		 * cb is visible to data plane.
158999a2dd95SBruce Richardson 		 */
1590ab1932afSTyler Retzlaff 		rte_atomic_store_explicit(&list->next, cb, rte_memory_order_release);
159199a2dd95SBruce Richardson 	}
159299a2dd95SBruce Richardson 
159399a2dd95SBruce Richardson 	rte_spinlock_unlock(&rte_cryptodev_callback_lock);
159499a2dd95SBruce Richardson 
15953ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_add_enq_callback(dev_id, qp_id, cb_fn);
159699a2dd95SBruce Richardson 	return cb;
159799a2dd95SBruce Richardson }
159899a2dd95SBruce Richardson 
159999a2dd95SBruce Richardson int
160099a2dd95SBruce Richardson rte_cryptodev_remove_enq_callback(uint8_t dev_id,
160199a2dd95SBruce Richardson 				  uint16_t qp_id,
160299a2dd95SBruce Richardson 				  struct rte_cryptodev_cb *cb)
160399a2dd95SBruce Richardson {
1604cfa44335SGanapati Kundapura #ifndef RTE_CRYPTO_CALLBACKS
1605cfa44335SGanapati Kundapura 	return -ENOTSUP;
1606cfa44335SGanapati Kundapura #endif
160799a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
1608ab1932afSTyler Retzlaff 	RTE_ATOMIC(struct rte_cryptodev_cb *) *prev_cb;
1609ab1932afSTyler Retzlaff 	struct rte_cryptodev_cb *curr_cb;
161099a2dd95SBruce Richardson 	struct rte_cryptodev_cb_rcu *list;
161199a2dd95SBruce Richardson 	int ret;
161299a2dd95SBruce Richardson 
161399a2dd95SBruce Richardson 	ret = -EINVAL;
161499a2dd95SBruce Richardson 
161599a2dd95SBruce Richardson 	if (!cb) {
161699a2dd95SBruce Richardson 		CDEV_LOG_ERR("Callback is NULL");
161799a2dd95SBruce Richardson 		return -EINVAL;
161899a2dd95SBruce Richardson 	}
161999a2dd95SBruce Richardson 
1620e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
162199a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
162299a2dd95SBruce Richardson 		return -ENODEV;
162399a2dd95SBruce Richardson 	}
162499a2dd95SBruce Richardson 
16253ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_remove_enq_callback(dev_id, qp_id, cb->fn);
16263ebb587eSAmit Prakash Shukla 
162799a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
162899a2dd95SBruce Richardson 	if (qp_id >= dev->data->nb_queue_pairs) {
162999a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid queue_pair_id=%d", qp_id);
163099a2dd95SBruce Richardson 		return -ENODEV;
163199a2dd95SBruce Richardson 	}
163299a2dd95SBruce Richardson 
163399a2dd95SBruce Richardson 	rte_spinlock_lock(&rte_cryptodev_callback_lock);
163499a2dd95SBruce Richardson 	if (dev->enq_cbs == NULL) {
163599a2dd95SBruce Richardson 		CDEV_LOG_ERR("Callback not initialized");
163699a2dd95SBruce Richardson 		goto cb_err;
163799a2dd95SBruce Richardson 	}
163899a2dd95SBruce Richardson 
163999a2dd95SBruce Richardson 	list = &dev->enq_cbs[qp_id];
164099a2dd95SBruce Richardson 	if (list == NULL) {
164199a2dd95SBruce Richardson 		CDEV_LOG_ERR("Callback list is NULL");
164299a2dd95SBruce Richardson 		goto cb_err;
164399a2dd95SBruce Richardson 	}
164499a2dd95SBruce Richardson 
164599a2dd95SBruce Richardson 	if (list->qsbr == NULL) {
164699a2dd95SBruce Richardson 		CDEV_LOG_ERR("Rcu qsbr is NULL");
164799a2dd95SBruce Richardson 		goto cb_err;
164899a2dd95SBruce Richardson 	}
164999a2dd95SBruce Richardson 
165099a2dd95SBruce Richardson 	prev_cb = &list->next;
165199a2dd95SBruce Richardson 	for (; *prev_cb != NULL; prev_cb = &curr_cb->next) {
165299a2dd95SBruce Richardson 		curr_cb = *prev_cb;
165399a2dd95SBruce Richardson 		if (curr_cb == cb) {
165499a2dd95SBruce Richardson 			/* Remove the user cb from the callback list. */
1655ab1932afSTyler Retzlaff 			rte_atomic_store_explicit(prev_cb, curr_cb->next,
1656ab1932afSTyler Retzlaff 				rte_memory_order_relaxed);
165799a2dd95SBruce Richardson 			ret = 0;
165899a2dd95SBruce Richardson 			break;
165999a2dd95SBruce Richardson 		}
166099a2dd95SBruce Richardson 	}
166199a2dd95SBruce Richardson 
166299a2dd95SBruce Richardson 	if (!ret) {
166399a2dd95SBruce Richardson 		/* Call sync with invalid thread id as this is part of
166499a2dd95SBruce Richardson 		 * control plane API
166599a2dd95SBruce Richardson 		 */
166699a2dd95SBruce Richardson 		rte_rcu_qsbr_synchronize(list->qsbr, RTE_QSBR_THRID_INVALID);
166799a2dd95SBruce Richardson 		rte_free(cb);
166899a2dd95SBruce Richardson 	}
166999a2dd95SBruce Richardson 
167099a2dd95SBruce Richardson cb_err:
167199a2dd95SBruce Richardson 	rte_spinlock_unlock(&rte_cryptodev_callback_lock);
167299a2dd95SBruce Richardson 	return ret;
167399a2dd95SBruce Richardson }
167499a2dd95SBruce Richardson 
167599a2dd95SBruce Richardson struct rte_cryptodev_cb *
167699a2dd95SBruce Richardson rte_cryptodev_add_deq_callback(uint8_t dev_id,
167799a2dd95SBruce Richardson 			       uint16_t qp_id,
167899a2dd95SBruce Richardson 			       rte_cryptodev_callback_fn cb_fn,
167999a2dd95SBruce Richardson 			       void *cb_arg)
168099a2dd95SBruce Richardson {
1681cfa44335SGanapati Kundapura #ifndef RTE_CRYPTO_CALLBACKS
1682cfa44335SGanapati Kundapura 	rte_errno = ENOTSUP;
1683cfa44335SGanapati Kundapura 	return NULL;
1684cfa44335SGanapati Kundapura #endif
168599a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
168699a2dd95SBruce Richardson 	struct rte_cryptodev_cb_rcu *list;
168799a2dd95SBruce Richardson 	struct rte_cryptodev_cb *cb, *tail;
168899a2dd95SBruce Richardson 
168999a2dd95SBruce Richardson 	if (!cb_fn) {
169099a2dd95SBruce Richardson 		CDEV_LOG_ERR("Callback is NULL on dev_id=%d", dev_id);
169199a2dd95SBruce Richardson 		rte_errno = EINVAL;
169299a2dd95SBruce Richardson 		return NULL;
169399a2dd95SBruce Richardson 	}
169499a2dd95SBruce Richardson 
1695e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
169699a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
169799a2dd95SBruce Richardson 		rte_errno = ENODEV;
169899a2dd95SBruce Richardson 		return NULL;
169999a2dd95SBruce Richardson 	}
170099a2dd95SBruce Richardson 
170199a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
170299a2dd95SBruce Richardson 	if (qp_id >= dev->data->nb_queue_pairs) {
170399a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid queue_pair_id=%d", qp_id);
170499a2dd95SBruce Richardson 		rte_errno = ENODEV;
170599a2dd95SBruce Richardson 		return NULL;
170699a2dd95SBruce Richardson 	}
170799a2dd95SBruce Richardson 
170899a2dd95SBruce Richardson 	cb = rte_zmalloc(NULL, sizeof(*cb), 0);
170999a2dd95SBruce Richardson 	if (cb == NULL) {
171099a2dd95SBruce Richardson 		CDEV_LOG_ERR("Failed to allocate memory for callback on "
171199a2dd95SBruce Richardson 			     "dev=%d, queue_pair_id=%d", dev_id, qp_id);
171299a2dd95SBruce Richardson 		rte_errno = ENOMEM;
171399a2dd95SBruce Richardson 		return NULL;
171499a2dd95SBruce Richardson 	}
171599a2dd95SBruce Richardson 
171699a2dd95SBruce Richardson 	rte_spinlock_lock(&rte_cryptodev_callback_lock);
171799a2dd95SBruce Richardson 
171899a2dd95SBruce Richardson 	cb->fn = cb_fn;
171999a2dd95SBruce Richardson 	cb->arg = cb_arg;
172099a2dd95SBruce Richardson 
172199a2dd95SBruce Richardson 	/* Add the callbacks in fifo order. */
172299a2dd95SBruce Richardson 	list = &dev->deq_cbs[qp_id];
172399a2dd95SBruce Richardson 	tail = list->next;
172499a2dd95SBruce Richardson 
172599a2dd95SBruce Richardson 	if (tail) {
172699a2dd95SBruce Richardson 		while (tail->next)
172799a2dd95SBruce Richardson 			tail = tail->next;
172899a2dd95SBruce Richardson 		/* Stores to cb->fn and cb->param should complete before
172999a2dd95SBruce Richardson 		 * cb is visible to data plane.
173099a2dd95SBruce Richardson 		 */
1731ab1932afSTyler Retzlaff 		rte_atomic_store_explicit(&tail->next, cb, rte_memory_order_release);
173299a2dd95SBruce Richardson 	} else {
173399a2dd95SBruce Richardson 		/* Stores to cb->fn and cb->param should complete before
173499a2dd95SBruce Richardson 		 * cb is visible to data plane.
173599a2dd95SBruce Richardson 		 */
1736ab1932afSTyler Retzlaff 		rte_atomic_store_explicit(&list->next, cb, rte_memory_order_release);
173799a2dd95SBruce Richardson 	}
173899a2dd95SBruce Richardson 
173999a2dd95SBruce Richardson 	rte_spinlock_unlock(&rte_cryptodev_callback_lock);
174099a2dd95SBruce Richardson 
17413ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_add_deq_callback(dev_id, qp_id, cb_fn);
17423ebb587eSAmit Prakash Shukla 
174399a2dd95SBruce Richardson 	return cb;
174499a2dd95SBruce Richardson }
174599a2dd95SBruce Richardson 
174699a2dd95SBruce Richardson int
174799a2dd95SBruce Richardson rte_cryptodev_remove_deq_callback(uint8_t dev_id,
174899a2dd95SBruce Richardson 				  uint16_t qp_id,
174999a2dd95SBruce Richardson 				  struct rte_cryptodev_cb *cb)
175099a2dd95SBruce Richardson {
1751cfa44335SGanapati Kundapura #ifndef RTE_CRYPTO_CALLBACKS
1752cfa44335SGanapati Kundapura 	return -ENOTSUP;
1753cfa44335SGanapati Kundapura #endif
175499a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
1755ab1932afSTyler Retzlaff 	RTE_ATOMIC(struct rte_cryptodev_cb *) *prev_cb;
1756ab1932afSTyler Retzlaff 	struct rte_cryptodev_cb *curr_cb;
175799a2dd95SBruce Richardson 	struct rte_cryptodev_cb_rcu *list;
175899a2dd95SBruce Richardson 	int ret;
175999a2dd95SBruce Richardson 
176099a2dd95SBruce Richardson 	ret = -EINVAL;
176199a2dd95SBruce Richardson 
176299a2dd95SBruce Richardson 	if (!cb) {
176399a2dd95SBruce Richardson 		CDEV_LOG_ERR("Callback is NULL");
176499a2dd95SBruce Richardson 		return -EINVAL;
176599a2dd95SBruce Richardson 	}
176699a2dd95SBruce Richardson 
1767e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
176899a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
176999a2dd95SBruce Richardson 		return -ENODEV;
177099a2dd95SBruce Richardson 	}
177199a2dd95SBruce Richardson 
17723ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_remove_deq_callback(dev_id, qp_id, cb->fn);
17733ebb587eSAmit Prakash Shukla 
177499a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
177599a2dd95SBruce Richardson 	if (qp_id >= dev->data->nb_queue_pairs) {
177699a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid queue_pair_id=%d", qp_id);
177799a2dd95SBruce Richardson 		return -ENODEV;
177899a2dd95SBruce Richardson 	}
177999a2dd95SBruce Richardson 
178099a2dd95SBruce Richardson 	rte_spinlock_lock(&rte_cryptodev_callback_lock);
178199a2dd95SBruce Richardson 	if (dev->enq_cbs == NULL) {
178299a2dd95SBruce Richardson 		CDEV_LOG_ERR("Callback not initialized");
178399a2dd95SBruce Richardson 		goto cb_err;
178499a2dd95SBruce Richardson 	}
178599a2dd95SBruce Richardson 
178699a2dd95SBruce Richardson 	list = &dev->deq_cbs[qp_id];
178799a2dd95SBruce Richardson 	if (list == NULL) {
178899a2dd95SBruce Richardson 		CDEV_LOG_ERR("Callback list is NULL");
178999a2dd95SBruce Richardson 		goto cb_err;
179099a2dd95SBruce Richardson 	}
179199a2dd95SBruce Richardson 
179299a2dd95SBruce Richardson 	if (list->qsbr == NULL) {
179399a2dd95SBruce Richardson 		CDEV_LOG_ERR("Rcu qsbr is NULL");
179499a2dd95SBruce Richardson 		goto cb_err;
179599a2dd95SBruce Richardson 	}
179699a2dd95SBruce Richardson 
179799a2dd95SBruce Richardson 	prev_cb = &list->next;
179899a2dd95SBruce Richardson 	for (; *prev_cb != NULL; prev_cb = &curr_cb->next) {
179999a2dd95SBruce Richardson 		curr_cb = *prev_cb;
180099a2dd95SBruce Richardson 		if (curr_cb == cb) {
180199a2dd95SBruce Richardson 			/* Remove the user cb from the callback list. */
1802ab1932afSTyler Retzlaff 			rte_atomic_store_explicit(prev_cb, curr_cb->next,
1803ab1932afSTyler Retzlaff 				rte_memory_order_relaxed);
180499a2dd95SBruce Richardson 			ret = 0;
180599a2dd95SBruce Richardson 			break;
180699a2dd95SBruce Richardson 		}
180799a2dd95SBruce Richardson 	}
180899a2dd95SBruce Richardson 
180999a2dd95SBruce Richardson 	if (!ret) {
181099a2dd95SBruce Richardson 		/* Call sync with invalid thread id as this is part of
181199a2dd95SBruce Richardson 		 * control plane API
181299a2dd95SBruce Richardson 		 */
181399a2dd95SBruce Richardson 		rte_rcu_qsbr_synchronize(list->qsbr, RTE_QSBR_THRID_INVALID);
181499a2dd95SBruce Richardson 		rte_free(cb);
181599a2dd95SBruce Richardson 	}
181699a2dd95SBruce Richardson 
181799a2dd95SBruce Richardson cb_err:
181899a2dd95SBruce Richardson 	rte_spinlock_unlock(&rte_cryptodev_callback_lock);
181999a2dd95SBruce Richardson 	return ret;
182099a2dd95SBruce Richardson }
182199a2dd95SBruce Richardson 
182299a2dd95SBruce Richardson int
182399a2dd95SBruce Richardson rte_cryptodev_stats_get(uint8_t dev_id, struct rte_cryptodev_stats *stats)
182499a2dd95SBruce Richardson {
182599a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
182699a2dd95SBruce Richardson 
1827e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
182899a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
182999a2dd95SBruce Richardson 		return -ENODEV;
183099a2dd95SBruce Richardson 	}
183199a2dd95SBruce Richardson 
183299a2dd95SBruce Richardson 	if (stats == NULL) {
183399a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid stats ptr");
183499a2dd95SBruce Richardson 		return -EINVAL;
183599a2dd95SBruce Richardson 	}
183699a2dd95SBruce Richardson 
183799a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
183899a2dd95SBruce Richardson 	memset(stats, 0, sizeof(*stats));
183999a2dd95SBruce Richardson 
18408f1d23ecSDavid Marchand 	if (*dev->dev_ops->stats_get == NULL)
18418f1d23ecSDavid Marchand 		return -ENOTSUP;
184299a2dd95SBruce Richardson 	(*dev->dev_ops->stats_get)(dev, stats);
18433ebb587eSAmit Prakash Shukla 
18443ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_stats_get(dev_id, stats);
184599a2dd95SBruce Richardson 	return 0;
184699a2dd95SBruce Richardson }
184799a2dd95SBruce Richardson 
184899a2dd95SBruce Richardson void
184999a2dd95SBruce Richardson rte_cryptodev_stats_reset(uint8_t dev_id)
185099a2dd95SBruce Richardson {
185199a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
185299a2dd95SBruce Richardson 
18533ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_stats_reset(dev_id);
18543ebb587eSAmit Prakash Shukla 
1855e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
185699a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
185799a2dd95SBruce Richardson 		return;
185899a2dd95SBruce Richardson 	}
185999a2dd95SBruce Richardson 
186099a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
186199a2dd95SBruce Richardson 
18628f1d23ecSDavid Marchand 	if (*dev->dev_ops->stats_reset == NULL)
18638f1d23ecSDavid Marchand 		return;
186499a2dd95SBruce Richardson 	(*dev->dev_ops->stats_reset)(dev);
186599a2dd95SBruce Richardson }
186699a2dd95SBruce Richardson 
186799a2dd95SBruce Richardson void
186899a2dd95SBruce Richardson rte_cryptodev_info_get(uint8_t dev_id, struct rte_cryptodev_info *dev_info)
186999a2dd95SBruce Richardson {
187099a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
187199a2dd95SBruce Richardson 
1872e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
187399a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
187499a2dd95SBruce Richardson 		return;
187599a2dd95SBruce Richardson 	}
187699a2dd95SBruce Richardson 
187799a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
187899a2dd95SBruce Richardson 
187999a2dd95SBruce Richardson 	memset(dev_info, 0, sizeof(struct rte_cryptodev_info));
188099a2dd95SBruce Richardson 
18818f1d23ecSDavid Marchand 	if (*dev->dev_ops->dev_infos_get == NULL)
18828f1d23ecSDavid Marchand 		return;
188399a2dd95SBruce Richardson 	(*dev->dev_ops->dev_infos_get)(dev, dev_info);
188499a2dd95SBruce Richardson 
188599a2dd95SBruce Richardson 	dev_info->driver_name = dev->device->driver->name;
188699a2dd95SBruce Richardson 	dev_info->device = dev->device;
18873ebb587eSAmit Prakash Shukla 
18883ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_info_get(dev_id, dev_info->driver_name);
18893ebb587eSAmit Prakash Shukla 
189099a2dd95SBruce Richardson }
189199a2dd95SBruce Richardson 
189299a2dd95SBruce Richardson int
189399a2dd95SBruce Richardson rte_cryptodev_callback_register(uint8_t dev_id,
189499a2dd95SBruce Richardson 			enum rte_cryptodev_event_type event,
189599a2dd95SBruce Richardson 			rte_cryptodev_cb_fn cb_fn, void *cb_arg)
189699a2dd95SBruce Richardson {
189799a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
189899a2dd95SBruce Richardson 	struct rte_cryptodev_callback *user_cb;
189999a2dd95SBruce Richardson 
190099a2dd95SBruce Richardson 	if (!cb_fn)
190199a2dd95SBruce Richardson 		return -EINVAL;
190299a2dd95SBruce Richardson 
1903e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
190499a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
190599a2dd95SBruce Richardson 		return -EINVAL;
190699a2dd95SBruce Richardson 	}
190799a2dd95SBruce Richardson 
190899a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
190999a2dd95SBruce Richardson 	rte_spinlock_lock(&rte_cryptodev_cb_lock);
191099a2dd95SBruce Richardson 
191199a2dd95SBruce Richardson 	TAILQ_FOREACH(user_cb, &(dev->link_intr_cbs), next) {
191299a2dd95SBruce Richardson 		if (user_cb->cb_fn == cb_fn &&
191399a2dd95SBruce Richardson 			user_cb->cb_arg == cb_arg &&
191499a2dd95SBruce Richardson 			user_cb->event == event) {
191599a2dd95SBruce Richardson 			break;
191699a2dd95SBruce Richardson 		}
191799a2dd95SBruce Richardson 	}
191899a2dd95SBruce Richardson 
191999a2dd95SBruce Richardson 	/* create a new callback. */
192099a2dd95SBruce Richardson 	if (user_cb == NULL) {
192199a2dd95SBruce Richardson 		user_cb = rte_zmalloc("INTR_USER_CALLBACK",
192299a2dd95SBruce Richardson 				sizeof(struct rte_cryptodev_callback), 0);
192399a2dd95SBruce Richardson 		if (user_cb != NULL) {
192499a2dd95SBruce Richardson 			user_cb->cb_fn = cb_fn;
192599a2dd95SBruce Richardson 			user_cb->cb_arg = cb_arg;
192699a2dd95SBruce Richardson 			user_cb->event = event;
192799a2dd95SBruce Richardson 			TAILQ_INSERT_TAIL(&(dev->link_intr_cbs), user_cb, next);
192899a2dd95SBruce Richardson 		}
192999a2dd95SBruce Richardson 	}
193099a2dd95SBruce Richardson 
193199a2dd95SBruce Richardson 	rte_spinlock_unlock(&rte_cryptodev_cb_lock);
19323ebb587eSAmit Prakash Shukla 
19333ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_callback_register(dev_id, event, cb_fn);
193499a2dd95SBruce Richardson 	return (user_cb == NULL) ? -ENOMEM : 0;
193599a2dd95SBruce Richardson }
193699a2dd95SBruce Richardson 
193799a2dd95SBruce Richardson int
193899a2dd95SBruce Richardson rte_cryptodev_callback_unregister(uint8_t dev_id,
193999a2dd95SBruce Richardson 			enum rte_cryptodev_event_type event,
194099a2dd95SBruce Richardson 			rte_cryptodev_cb_fn cb_fn, void *cb_arg)
194199a2dd95SBruce Richardson {
194299a2dd95SBruce Richardson 	int ret;
194399a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
194499a2dd95SBruce Richardson 	struct rte_cryptodev_callback *cb, *next;
194599a2dd95SBruce Richardson 
194699a2dd95SBruce Richardson 	if (!cb_fn)
194799a2dd95SBruce Richardson 		return -EINVAL;
194899a2dd95SBruce Richardson 
1949e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
195099a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
195199a2dd95SBruce Richardson 		return -EINVAL;
195299a2dd95SBruce Richardson 	}
195399a2dd95SBruce Richardson 
195499a2dd95SBruce Richardson 	dev = &rte_crypto_devices[dev_id];
195599a2dd95SBruce Richardson 	rte_spinlock_lock(&rte_cryptodev_cb_lock);
195699a2dd95SBruce Richardson 
195799a2dd95SBruce Richardson 	ret = 0;
195899a2dd95SBruce Richardson 	for (cb = TAILQ_FIRST(&dev->link_intr_cbs); cb != NULL; cb = next) {
195999a2dd95SBruce Richardson 
196099a2dd95SBruce Richardson 		next = TAILQ_NEXT(cb, next);
196199a2dd95SBruce Richardson 
196299a2dd95SBruce Richardson 		if (cb->cb_fn != cb_fn || cb->event != event ||
196399a2dd95SBruce Richardson 				(cb->cb_arg != (void *)-1 &&
196499a2dd95SBruce Richardson 				cb->cb_arg != cb_arg))
196599a2dd95SBruce Richardson 			continue;
196699a2dd95SBruce Richardson 
196799a2dd95SBruce Richardson 		/*
196899a2dd95SBruce Richardson 		 * if this callback is not executing right now,
196999a2dd95SBruce Richardson 		 * then remove it.
197099a2dd95SBruce Richardson 		 */
197199a2dd95SBruce Richardson 		if (cb->active == 0) {
197299a2dd95SBruce Richardson 			TAILQ_REMOVE(&(dev->link_intr_cbs), cb, next);
197399a2dd95SBruce Richardson 			rte_free(cb);
197499a2dd95SBruce Richardson 		} else {
197599a2dd95SBruce Richardson 			ret = -EAGAIN;
197699a2dd95SBruce Richardson 		}
197799a2dd95SBruce Richardson 	}
197899a2dd95SBruce Richardson 
197999a2dd95SBruce Richardson 	rte_spinlock_unlock(&rte_cryptodev_cb_lock);
19803ebb587eSAmit Prakash Shukla 
19813ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_callback_unregister(dev_id, event, cb_fn);
198299a2dd95SBruce Richardson 	return ret;
198399a2dd95SBruce Richardson }
198499a2dd95SBruce Richardson 
198599a2dd95SBruce Richardson void
198699a2dd95SBruce Richardson rte_cryptodev_pmd_callback_process(struct rte_cryptodev *dev,
198799a2dd95SBruce Richardson 	enum rte_cryptodev_event_type event)
198899a2dd95SBruce Richardson {
198999a2dd95SBruce Richardson 	struct rte_cryptodev_callback *cb_lst;
199099a2dd95SBruce Richardson 	struct rte_cryptodev_callback dev_cb;
199199a2dd95SBruce Richardson 
199299a2dd95SBruce Richardson 	rte_spinlock_lock(&rte_cryptodev_cb_lock);
199399a2dd95SBruce Richardson 	TAILQ_FOREACH(cb_lst, &(dev->link_intr_cbs), next) {
199499a2dd95SBruce Richardson 		if (cb_lst->cb_fn == NULL || cb_lst->event != event)
199599a2dd95SBruce Richardson 			continue;
199699a2dd95SBruce Richardson 		dev_cb = *cb_lst;
199799a2dd95SBruce Richardson 		cb_lst->active = 1;
199899a2dd95SBruce Richardson 		rte_spinlock_unlock(&rte_cryptodev_cb_lock);
199999a2dd95SBruce Richardson 		dev_cb.cb_fn(dev->data->dev_id, dev_cb.event,
200099a2dd95SBruce Richardson 						dev_cb.cb_arg);
200199a2dd95SBruce Richardson 		rte_spinlock_lock(&rte_cryptodev_cb_lock);
200299a2dd95SBruce Richardson 		cb_lst->active = 0;
200399a2dd95SBruce Richardson 	}
200499a2dd95SBruce Richardson 	rte_spinlock_unlock(&rte_cryptodev_cb_lock);
200599a2dd95SBruce Richardson }
200699a2dd95SBruce Richardson 
2007d43e6a01SSrujana Challa int
2008d43e6a01SSrujana Challa rte_cryptodev_queue_pair_event_error_query(uint8_t dev_id, uint16_t qp_id)
2009d43e6a01SSrujana Challa {
2010d43e6a01SSrujana Challa 	struct rte_cryptodev *dev;
2011d43e6a01SSrujana Challa 
2012d43e6a01SSrujana Challa 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
2013d43e6a01SSrujana Challa 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
2014d43e6a01SSrujana Challa 		return -EINVAL;
2015d43e6a01SSrujana Challa 	}
2016d43e6a01SSrujana Challa 	dev = &rte_crypto_devices[dev_id];
2017d43e6a01SSrujana Challa 
2018d43e6a01SSrujana Challa 	if (qp_id >= dev->data->nb_queue_pairs)
2019d43e6a01SSrujana Challa 		return -EINVAL;
2020d43e6a01SSrujana Challa 	if (*dev->dev_ops->queue_pair_event_error_query == NULL)
2021d43e6a01SSrujana Challa 		return -ENOTSUP;
2022d43e6a01SSrujana Challa 
2023d43e6a01SSrujana Challa 	return dev->dev_ops->queue_pair_event_error_query(dev, qp_id);
2024d43e6a01SSrujana Challa }
2025d43e6a01SSrujana Challa 
202699a2dd95SBruce Richardson struct rte_mempool *
202799a2dd95SBruce Richardson rte_cryptodev_sym_session_pool_create(const char *name, uint32_t nb_elts,
202899a2dd95SBruce Richardson 	uint32_t elt_size, uint32_t cache_size, uint16_t user_data_size,
202999a2dd95SBruce Richardson 	int socket_id)
203099a2dd95SBruce Richardson {
203199a2dd95SBruce Richardson 	struct rte_mempool *mp;
203299a2dd95SBruce Richardson 	struct rte_cryptodev_sym_session_pool_private_data *pool_priv;
203399a2dd95SBruce Richardson 	uint32_t obj_sz;
203499a2dd95SBruce Richardson 
2035bdce2564SAkhil Goyal 	obj_sz = sizeof(struct rte_cryptodev_sym_session) + elt_size + user_data_size;
203699a2dd95SBruce Richardson 
2037bdce2564SAkhil Goyal 	obj_sz = RTE_ALIGN_CEIL(obj_sz, RTE_CACHE_LINE_SIZE);
203899a2dd95SBruce Richardson 	mp = rte_mempool_create(name, nb_elts, obj_sz, cache_size,
2039bdce2564SAkhil Goyal 			(uint32_t)(sizeof(*pool_priv)), NULL, NULL,
2040bdce2564SAkhil Goyal 			NULL, NULL,
204199a2dd95SBruce Richardson 			socket_id, 0);
204299a2dd95SBruce Richardson 	if (mp == NULL) {
2043a0a17e2aSOlivier Matz 		CDEV_LOG_ERR("%s(name=%s) failed, rte_errno=%d",
204499a2dd95SBruce Richardson 			__func__, name, rte_errno);
204599a2dd95SBruce Richardson 		return NULL;
204699a2dd95SBruce Richardson 	}
204799a2dd95SBruce Richardson 
204899a2dd95SBruce Richardson 	pool_priv = rte_mempool_get_priv(mp);
204999a2dd95SBruce Richardson 	if (!pool_priv) {
2050a0a17e2aSOlivier Matz 		CDEV_LOG_ERR("%s(name=%s) failed to get private data",
205199a2dd95SBruce Richardson 			__func__, name);
205299a2dd95SBruce Richardson 		rte_mempool_free(mp);
205399a2dd95SBruce Richardson 		return NULL;
205499a2dd95SBruce Richardson 	}
205599a2dd95SBruce Richardson 
2056bdce2564SAkhil Goyal 	pool_priv->sess_data_sz = elt_size;
205799a2dd95SBruce Richardson 	pool_priv->user_data_sz = user_data_size;
205899a2dd95SBruce Richardson 
205999a2dd95SBruce Richardson 	rte_cryptodev_trace_sym_session_pool_create(name, nb_elts,
206099a2dd95SBruce Richardson 		elt_size, cache_size, user_data_size, mp);
206199a2dd95SBruce Richardson 	return mp;
206299a2dd95SBruce Richardson }
206399a2dd95SBruce Richardson 
20641f1e4b7cSCiara Power struct rte_mempool *
20651f1e4b7cSCiara Power rte_cryptodev_asym_session_pool_create(const char *name, uint32_t nb_elts,
206692d55afeSCiara Power 	uint32_t cache_size, uint16_t user_data_size, int socket_id)
20671f1e4b7cSCiara Power {
20681f1e4b7cSCiara Power 	struct rte_mempool *mp;
20691f1e4b7cSCiara Power 	struct rte_cryptodev_asym_session_pool_private_data *pool_priv;
20701f1e4b7cSCiara Power 	uint32_t obj_sz, obj_sz_aligned;
2071080c84cdSCiara Power 	uint8_t dev_id;
2072080c84cdSCiara Power 	unsigned int priv_sz, max_priv_sz = 0;
20731f1e4b7cSCiara Power 
20741f1e4b7cSCiara Power 	for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++)
20751f1e4b7cSCiara Power 		if (rte_cryptodev_is_valid_dev(dev_id)) {
20761f1e4b7cSCiara Power 			priv_sz = rte_cryptodev_asym_get_private_session_size(dev_id);
20771f1e4b7cSCiara Power 			if (priv_sz > max_priv_sz)
20781f1e4b7cSCiara Power 				max_priv_sz = priv_sz;
20791f1e4b7cSCiara Power 		}
20801f1e4b7cSCiara Power 	if (max_priv_sz == 0) {
2081a0a17e2aSOlivier Matz 		CDEV_LOG_INFO("Could not set max private session size");
20821f1e4b7cSCiara Power 		return NULL;
20831f1e4b7cSCiara Power 	}
20841f1e4b7cSCiara Power 
208592d55afeSCiara Power 	obj_sz = rte_cryptodev_asym_get_header_session_size() + max_priv_sz +
208692d55afeSCiara Power 			user_data_size;
20871f1e4b7cSCiara Power 	obj_sz_aligned =  RTE_ALIGN_CEIL(obj_sz, RTE_CACHE_LINE_SIZE);
20881f1e4b7cSCiara Power 
20891f1e4b7cSCiara Power 	mp = rte_mempool_create(name, nb_elts, obj_sz_aligned, cache_size,
20901f1e4b7cSCiara Power 			(uint32_t)(sizeof(*pool_priv)),
20911f1e4b7cSCiara Power 			NULL, NULL, NULL, NULL,
20921f1e4b7cSCiara Power 			socket_id, 0);
20931f1e4b7cSCiara Power 	if (mp == NULL) {
2094a0a17e2aSOlivier Matz 		CDEV_LOG_ERR("%s(name=%s) failed, rte_errno=%d",
20951f1e4b7cSCiara Power 			__func__, name, rte_errno);
20961f1e4b7cSCiara Power 		return NULL;
20971f1e4b7cSCiara Power 	}
20981f1e4b7cSCiara Power 
20991f1e4b7cSCiara Power 	pool_priv = rte_mempool_get_priv(mp);
21001f1e4b7cSCiara Power 	if (!pool_priv) {
2101a0a17e2aSOlivier Matz 		CDEV_LOG_ERR("%s(name=%s) failed to get private data",
21021f1e4b7cSCiara Power 			__func__, name);
21031f1e4b7cSCiara Power 		rte_mempool_free(mp);
21041f1e4b7cSCiara Power 		return NULL;
21051f1e4b7cSCiara Power 	}
21061f1e4b7cSCiara Power 	pool_priv->max_priv_session_sz = max_priv_sz;
210792d55afeSCiara Power 	pool_priv->user_data_sz = user_data_size;
21081f1e4b7cSCiara Power 
21091f1e4b7cSCiara Power 	rte_cryptodev_trace_asym_session_pool_create(name, nb_elts,
211092d55afeSCiara Power 		user_data_size, cache_size, mp);
21111f1e4b7cSCiara Power 	return mp;
21121f1e4b7cSCiara Power }
21131f1e4b7cSCiara Power 
2114bdce2564SAkhil Goyal void *
2115bdce2564SAkhil Goyal rte_cryptodev_sym_session_create(uint8_t dev_id,
2116bdce2564SAkhil Goyal 		struct rte_crypto_sym_xform *xforms,
2117bdce2564SAkhil Goyal 		struct rte_mempool *mp)
211899a2dd95SBruce Richardson {
2119bdce2564SAkhil Goyal 	struct rte_cryptodev *dev;
212099a2dd95SBruce Richardson 	struct rte_cryptodev_sym_session *sess;
212199a2dd95SBruce Richardson 	struct rte_cryptodev_sym_session_pool_private_data *pool_priv;
2122bdce2564SAkhil Goyal 	uint32_t sess_priv_sz;
2123bdce2564SAkhil Goyal 	int ret;
212499a2dd95SBruce Richardson 
2125bdce2564SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
2126bdce2564SAkhil Goyal 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
2127bdce2564SAkhil Goyal 		rte_errno = EINVAL;
212899a2dd95SBruce Richardson 		return NULL;
212999a2dd95SBruce Richardson 	}
213099a2dd95SBruce Richardson 
2131bdce2564SAkhil Goyal 	if (xforms == NULL) {
2132ae282b06SDavid Marchand 		CDEV_LOG_ERR("Invalid xform");
2133bdce2564SAkhil Goyal 		rte_errno = EINVAL;
2134bdce2564SAkhil Goyal 		return NULL;
2135bdce2564SAkhil Goyal 	}
2136bdce2564SAkhil Goyal 
2137bdce2564SAkhil Goyal 	sess_priv_sz = rte_cryptodev_sym_get_private_session_size(dev_id);
2138bdce2564SAkhil Goyal 	if (!rte_cryptodev_sym_is_valid_session_pool(mp, sess_priv_sz)) {
2139bdce2564SAkhil Goyal 		CDEV_LOG_ERR("Invalid mempool");
2140bdce2564SAkhil Goyal 		rte_errno = EINVAL;
2141bdce2564SAkhil Goyal 		return NULL;
2142bdce2564SAkhil Goyal 	}
2143bdce2564SAkhil Goyal 
2144bdce2564SAkhil Goyal 	dev = rte_cryptodev_pmd_get_dev(dev_id);
214599a2dd95SBruce Richardson 
214699a2dd95SBruce Richardson 	/* Allocate a session structure from the session pool */
214799a2dd95SBruce Richardson 	if (rte_mempool_get(mp, (void **)&sess)) {
214899a2dd95SBruce Richardson 		CDEV_LOG_ERR("couldn't get object from session mempool");
2149bdce2564SAkhil Goyal 		rte_errno = ENOMEM;
215099a2dd95SBruce Richardson 		return NULL;
215199a2dd95SBruce Richardson 	}
215299a2dd95SBruce Richardson 
2153bdce2564SAkhil Goyal 	pool_priv = rte_mempool_get_priv(mp);
2154bdce2564SAkhil Goyal 	sess->driver_id = dev->driver_id;
2155bdce2564SAkhil Goyal 	sess->sess_data_sz = pool_priv->sess_data_sz;
215699a2dd95SBruce Richardson 	sess->user_data_sz = pool_priv->user_data_sz;
2157bdce2564SAkhil Goyal 	sess->driver_priv_data_iova = rte_mempool_virt2iova(sess) +
2158bdce2564SAkhil Goyal 		offsetof(struct rte_cryptodev_sym_session, driver_priv_data);
215999a2dd95SBruce Richardson 
2160bdce2564SAkhil Goyal 	if (dev->dev_ops->sym_session_configure == NULL) {
2161bdce2564SAkhil Goyal 		rte_errno = ENOTSUP;
2162bdce2564SAkhil Goyal 		goto error_exit;
2163bdce2564SAkhil Goyal 	}
2164bdce2564SAkhil Goyal 	memset(sess->driver_priv_data, 0, pool_priv->sess_data_sz + pool_priv->user_data_sz);
216599a2dd95SBruce Richardson 
2166bdce2564SAkhil Goyal 	ret = dev->dev_ops->sym_session_configure(dev, xforms, sess);
2167bdce2564SAkhil Goyal 	if (ret < 0) {
2168bdce2564SAkhil Goyal 		rte_errno = -ret;
2169bdce2564SAkhil Goyal 		goto error_exit;
2170bdce2564SAkhil Goyal 	}
2171bdce2564SAkhil Goyal 	sess->driver_id = dev->driver_id;
2172bdce2564SAkhil Goyal 
2173bdce2564SAkhil Goyal 	rte_cryptodev_trace_sym_session_create(dev_id, sess, xforms, mp);
2174bdce2564SAkhil Goyal 
2175bdce2564SAkhil Goyal 	return (void *)sess;
2176bdce2564SAkhil Goyal error_exit:
2177bdce2564SAkhil Goyal 	rte_mempool_put(mp, (void *)sess);
2178bdce2564SAkhil Goyal 	return NULL;
217999a2dd95SBruce Richardson }
218099a2dd95SBruce Richardson 
2181757f40e2SCiara Power int
21821f1e4b7cSCiara Power rte_cryptodev_asym_session_create(uint8_t dev_id,
2183757f40e2SCiara Power 		struct rte_crypto_asym_xform *xforms, struct rte_mempool *mp,
2184757f40e2SCiara Power 		void **session)
218599a2dd95SBruce Richardson {
218699a2dd95SBruce Richardson 	struct rte_cryptodev_asym_session *sess;
21871f1e4b7cSCiara Power 	uint32_t session_priv_data_sz;
21881f1e4b7cSCiara Power 	struct rte_cryptodev_asym_session_pool_private_data *pool_priv;
21891f1e4b7cSCiara Power 	unsigned int session_header_size =
219099a2dd95SBruce Richardson 			rte_cryptodev_asym_get_header_session_size();
21911f1e4b7cSCiara Power 	struct rte_cryptodev *dev;
21921f1e4b7cSCiara Power 	int ret;
21931f1e4b7cSCiara Power 
21941f1e4b7cSCiara Power 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
21951f1e4b7cSCiara Power 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
2196757f40e2SCiara Power 		return -EINVAL;
21971f1e4b7cSCiara Power 	}
21981f1e4b7cSCiara Power 
21991f1e4b7cSCiara Power 	dev = rte_cryptodev_pmd_get_dev(dev_id);
22001f1e4b7cSCiara Power 
22011f1e4b7cSCiara Power 	if (dev == NULL)
2202757f40e2SCiara Power 		return -EINVAL;
220399a2dd95SBruce Richardson 
220499a2dd95SBruce Richardson 	if (!mp) {
2205a0a17e2aSOlivier Matz 		CDEV_LOG_ERR("invalid mempool");
2206757f40e2SCiara Power 		return -EINVAL;
220799a2dd95SBruce Richardson 	}
220899a2dd95SBruce Richardson 
22091f1e4b7cSCiara Power 	session_priv_data_sz = rte_cryptodev_asym_get_private_session_size(
22101f1e4b7cSCiara Power 			dev_id);
22111f1e4b7cSCiara Power 	pool_priv = rte_mempool_get_priv(mp);
22121f1e4b7cSCiara Power 
22131f1e4b7cSCiara Power 	if (pool_priv->max_priv_session_sz < session_priv_data_sz) {
22141f1e4b7cSCiara Power 		CDEV_LOG_DEBUG(
22151f1e4b7cSCiara Power 			"The private session data size used when creating the mempool is smaller than this device's private session data.");
2216757f40e2SCiara Power 		return -EINVAL;
22171f1e4b7cSCiara Power 	}
22181f1e4b7cSCiara Power 
221999a2dd95SBruce Richardson 	/* Verify if provided mempool can hold elements big enough. */
22201f1e4b7cSCiara Power 	if (mp->elt_size < session_header_size + session_priv_data_sz) {
222199a2dd95SBruce Richardson 		CDEV_LOG_ERR(
222299a2dd95SBruce Richardson 			"mempool elements too small to hold session objects");
2223757f40e2SCiara Power 		return -EINVAL;
222499a2dd95SBruce Richardson 	}
222599a2dd95SBruce Richardson 
222699a2dd95SBruce Richardson 	/* Allocate a session structure from the session pool */
2227757f40e2SCiara Power 	if (rte_mempool_get(mp, session)) {
222899a2dd95SBruce Richardson 		CDEV_LOG_ERR("couldn't get object from session mempool");
2229757f40e2SCiara Power 		return -ENOMEM;
223099a2dd95SBruce Richardson 	}
223199a2dd95SBruce Richardson 
2232757f40e2SCiara Power 	sess = *session;
22331f1e4b7cSCiara Power 	sess->driver_id = dev->driver_id;
223492d55afeSCiara Power 	sess->user_data_sz = pool_priv->user_data_sz;
22351f1e4b7cSCiara Power 	sess->max_priv_data_sz = pool_priv->max_priv_session_sz;
223699a2dd95SBruce Richardson 
22371f1e4b7cSCiara Power 	/* Clear device session pointer.*/
223892d55afeSCiara Power 	memset(sess->sess_private_data, 0, session_priv_data_sz + sess->user_data_sz);
22391f1e4b7cSCiara Power 
22408f1d23ecSDavid Marchand 	if (*dev->dev_ops->asym_session_configure == NULL)
22418f1d23ecSDavid Marchand 		return -ENOTSUP;
22421f1e4b7cSCiara Power 
22431f1e4b7cSCiara Power 	if (sess->sess_private_data[0] == 0) {
22441f1e4b7cSCiara Power 		ret = dev->dev_ops->asym_session_configure(dev, xforms, sess);
22451f1e4b7cSCiara Power 		if (ret < 0) {
22461f1e4b7cSCiara Power 			CDEV_LOG_ERR(
22471f1e4b7cSCiara Power 				"dev_id %d failed to configure session details",
22481f1e4b7cSCiara Power 				dev_id);
2249757f40e2SCiara Power 			return ret;
22501f1e4b7cSCiara Power 		}
22511f1e4b7cSCiara Power 	}
22521f1e4b7cSCiara Power 
2253757f40e2SCiara Power 	rte_cryptodev_trace_asym_session_create(dev_id, xforms, mp, sess);
2254757f40e2SCiara Power 	return 0;
225599a2dd95SBruce Richardson }
225699a2dd95SBruce Richardson 
225799a2dd95SBruce Richardson int
22582a440d6aSAkhil Goyal rte_cryptodev_sym_session_free(uint8_t dev_id, void *_sess)
225999a2dd95SBruce Richardson {
226099a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
2261bdce2564SAkhil Goyal 	struct rte_mempool *sess_mp;
22622a440d6aSAkhil Goyal 	struct rte_cryptodev_sym_session *sess = _sess;
2263bdce2564SAkhil Goyal 	struct rte_cryptodev_sym_session_pool_private_data *pool_priv;
2264bdce2564SAkhil Goyal 
2265bdce2564SAkhil Goyal 	if (sess == NULL)
2266bdce2564SAkhil Goyal 		return -EINVAL;
226799a2dd95SBruce Richardson 
2268e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
226999a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
227099a2dd95SBruce Richardson 		return -EINVAL;
227199a2dd95SBruce Richardson 	}
227299a2dd95SBruce Richardson 
227399a2dd95SBruce Richardson 	dev = rte_cryptodev_pmd_get_dev(dev_id);
227499a2dd95SBruce Richardson 
227599a2dd95SBruce Richardson 	if (dev == NULL || sess == NULL)
227699a2dd95SBruce Richardson 		return -EINVAL;
227799a2dd95SBruce Richardson 
2278bdce2564SAkhil Goyal 	sess_mp = rte_mempool_from_obj(sess);
2279bdce2564SAkhil Goyal 	if (!sess_mp)
2280bdce2564SAkhil Goyal 		return -EINVAL;
2281bdce2564SAkhil Goyal 	pool_priv = rte_mempool_get_priv(sess_mp);
2282bdce2564SAkhil Goyal 
2283bdce2564SAkhil Goyal 	if (sess->driver_id != dev->driver_id) {
2284bdce2564SAkhil Goyal 		CDEV_LOG_ERR("Session created by driver %u but freed by %u",
2285bdce2564SAkhil Goyal 			sess->driver_id, dev->driver_id);
2286bdce2564SAkhil Goyal 		return -EINVAL;
2287bdce2564SAkhil Goyal 	}
228899a2dd95SBruce Richardson 
22898f1d23ecSDavid Marchand 	if (*dev->dev_ops->sym_session_clear == NULL)
22908f1d23ecSDavid Marchand 		return -ENOTSUP;
229199a2dd95SBruce Richardson 
229299a2dd95SBruce Richardson 	dev->dev_ops->sym_session_clear(dev, sess);
229399a2dd95SBruce Richardson 
2294bdce2564SAkhil Goyal 	memset(sess->driver_priv_data, 0, pool_priv->sess_data_sz + pool_priv->user_data_sz);
229599a2dd95SBruce Richardson 
229699a2dd95SBruce Richardson 	/* Return session to mempool */
229799a2dd95SBruce Richardson 	rte_mempool_put(sess_mp, sess);
229899a2dd95SBruce Richardson 
2299bdce2564SAkhil Goyal 	rte_cryptodev_trace_sym_session_free(dev_id, sess);
230099a2dd95SBruce Richardson 	return 0;
230199a2dd95SBruce Richardson }
230299a2dd95SBruce Richardson 
230399a2dd95SBruce Richardson int
2304a29bb248SCiara Power rte_cryptodev_asym_session_free(uint8_t dev_id, void *sess)
230599a2dd95SBruce Richardson {
230699a2dd95SBruce Richardson 	struct rte_mempool *sess_mp;
23071f1e4b7cSCiara Power 	struct rte_cryptodev *dev;
230899a2dd95SBruce Richardson 
23091f1e4b7cSCiara Power 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
23101f1e4b7cSCiara Power 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
23111f1e4b7cSCiara Power 		return -EINVAL;
23121f1e4b7cSCiara Power 	}
23131f1e4b7cSCiara Power 
23141f1e4b7cSCiara Power 	dev = rte_cryptodev_pmd_get_dev(dev_id);
23151f1e4b7cSCiara Power 
23161f1e4b7cSCiara Power 	if (dev == NULL || sess == NULL)
231799a2dd95SBruce Richardson 		return -EINVAL;
231899a2dd95SBruce Richardson 
23198f1d23ecSDavid Marchand 	if (*dev->dev_ops->asym_session_clear == NULL)
23208f1d23ecSDavid Marchand 		return -ENOTSUP;
23211f1e4b7cSCiara Power 
23221f1e4b7cSCiara Power 	dev->dev_ops->asym_session_clear(dev, sess);
232399a2dd95SBruce Richardson 
2324a7ddfa9cSVolodymyr Fialko 	rte_free(((struct rte_cryptodev_asym_session *)sess)->event_mdata);
2325a7ddfa9cSVolodymyr Fialko 
232699a2dd95SBruce Richardson 	/* Return session to mempool */
232799a2dd95SBruce Richardson 	sess_mp = rte_mempool_from_obj(sess);
232899a2dd95SBruce Richardson 	rte_mempool_put(sess_mp, sess);
232999a2dd95SBruce Richardson 
23301f1e4b7cSCiara Power 	rte_cryptodev_trace_asym_session_free(dev_id, sess);
233199a2dd95SBruce Richardson 	return 0;
233299a2dd95SBruce Richardson }
233399a2dd95SBruce Richardson 
233499a2dd95SBruce Richardson unsigned int
233599a2dd95SBruce Richardson rte_cryptodev_asym_get_header_session_size(void)
233699a2dd95SBruce Richardson {
23371f1e4b7cSCiara Power 	return sizeof(struct rte_cryptodev_asym_session);
233899a2dd95SBruce Richardson }
233999a2dd95SBruce Richardson 
234099a2dd95SBruce Richardson unsigned int
234199a2dd95SBruce Richardson rte_cryptodev_sym_get_private_session_size(uint8_t dev_id)
234299a2dd95SBruce Richardson {
234399a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
234499a2dd95SBruce Richardson 	unsigned int priv_sess_size;
234599a2dd95SBruce Richardson 
2346e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id))
234799a2dd95SBruce Richardson 		return 0;
234899a2dd95SBruce Richardson 
234999a2dd95SBruce Richardson 	dev = rte_cryptodev_pmd_get_dev(dev_id);
235099a2dd95SBruce Richardson 
235199a2dd95SBruce Richardson 	if (*dev->dev_ops->sym_session_get_size == NULL)
235299a2dd95SBruce Richardson 		return 0;
235399a2dd95SBruce Richardson 
235499a2dd95SBruce Richardson 	priv_sess_size = (*dev->dev_ops->sym_session_get_size)(dev);
235599a2dd95SBruce Richardson 
23563ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_sym_get_private_session_size(dev_id,
23573ebb587eSAmit Prakash Shukla 		priv_sess_size);
23583ebb587eSAmit Prakash Shukla 
235999a2dd95SBruce Richardson 	return priv_sess_size;
236099a2dd95SBruce Richardson }
236199a2dd95SBruce Richardson 
236299a2dd95SBruce Richardson unsigned int
236399a2dd95SBruce Richardson rte_cryptodev_asym_get_private_session_size(uint8_t dev_id)
236499a2dd95SBruce Richardson {
236599a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
236699a2dd95SBruce Richardson 	unsigned int priv_sess_size;
236799a2dd95SBruce Richardson 
2368e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id))
236999a2dd95SBruce Richardson 		return 0;
237099a2dd95SBruce Richardson 
237199a2dd95SBruce Richardson 	dev = rte_cryptodev_pmd_get_dev(dev_id);
237299a2dd95SBruce Richardson 
237399a2dd95SBruce Richardson 	if (*dev->dev_ops->asym_session_get_size == NULL)
237499a2dd95SBruce Richardson 		return 0;
237599a2dd95SBruce Richardson 
237699a2dd95SBruce Richardson 	priv_sess_size = (*dev->dev_ops->asym_session_get_size)(dev);
237799a2dd95SBruce Richardson 
23783ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_asym_get_private_session_size(dev_id,
23793ebb587eSAmit Prakash Shukla 		priv_sess_size);
23803ebb587eSAmit Prakash Shukla 
238199a2dd95SBruce Richardson 	return priv_sess_size;
238299a2dd95SBruce Richardson }
238399a2dd95SBruce Richardson 
238499a2dd95SBruce Richardson int
23852a440d6aSAkhil Goyal rte_cryptodev_sym_session_set_user_data(void *_sess, void *data,
238699a2dd95SBruce Richardson 		uint16_t size)
238799a2dd95SBruce Richardson {
23882a440d6aSAkhil Goyal 	struct rte_cryptodev_sym_session *sess = _sess;
23892a440d6aSAkhil Goyal 
239099a2dd95SBruce Richardson 	if (sess == NULL)
239199a2dd95SBruce Richardson 		return -EINVAL;
239299a2dd95SBruce Richardson 
239399a2dd95SBruce Richardson 	if (sess->user_data_sz < size)
239499a2dd95SBruce Richardson 		return -ENOMEM;
239599a2dd95SBruce Richardson 
2396bdce2564SAkhil Goyal 	rte_memcpy(sess->driver_priv_data + sess->sess_data_sz, data, size);
23973ebb587eSAmit Prakash Shukla 
23983ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_sym_session_set_user_data(sess, data, size);
23993ebb587eSAmit Prakash Shukla 
240099a2dd95SBruce Richardson 	return 0;
240199a2dd95SBruce Richardson }
240299a2dd95SBruce Richardson 
240399a2dd95SBruce Richardson void *
24042a440d6aSAkhil Goyal rte_cryptodev_sym_session_get_user_data(void *_sess)
240599a2dd95SBruce Richardson {
24062a440d6aSAkhil Goyal 	struct rte_cryptodev_sym_session *sess = _sess;
24073ebb587eSAmit Prakash Shukla 	void *data = NULL;
24083ebb587eSAmit Prakash Shukla 
240999a2dd95SBruce Richardson 	if (sess == NULL || sess->user_data_sz == 0)
241099a2dd95SBruce Richardson 		return NULL;
241199a2dd95SBruce Richardson 
2412bdce2564SAkhil Goyal 	data = (void *)(sess->driver_priv_data + sess->sess_data_sz);
24133ebb587eSAmit Prakash Shukla 
24143ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_sym_session_get_user_data(sess, data);
24153ebb587eSAmit Prakash Shukla 
24163ebb587eSAmit Prakash Shukla 	return data;
241799a2dd95SBruce Richardson }
241899a2dd95SBruce Richardson 
241992d55afeSCiara Power int
242092d55afeSCiara Power rte_cryptodev_asym_session_set_user_data(void *session, void *data, uint16_t size)
242192d55afeSCiara Power {
242292d55afeSCiara Power 	struct rte_cryptodev_asym_session *sess = session;
242392d55afeSCiara Power 	if (sess == NULL)
242492d55afeSCiara Power 		return -EINVAL;
242592d55afeSCiara Power 
242692d55afeSCiara Power 	if (sess->user_data_sz < size)
242792d55afeSCiara Power 		return -ENOMEM;
242892d55afeSCiara Power 
242992d55afeSCiara Power 	rte_memcpy(sess->sess_private_data +
243092d55afeSCiara Power 			sess->max_priv_data_sz,
243192d55afeSCiara Power 			data, size);
24323ebb587eSAmit Prakash Shukla 
24333ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_asym_session_set_user_data(sess, data, size);
24343ebb587eSAmit Prakash Shukla 
243592d55afeSCiara Power 	return 0;
243692d55afeSCiara Power }
243792d55afeSCiara Power 
243892d55afeSCiara Power void *
243992d55afeSCiara Power rte_cryptodev_asym_session_get_user_data(void *session)
244092d55afeSCiara Power {
244192d55afeSCiara Power 	struct rte_cryptodev_asym_session *sess = session;
24423ebb587eSAmit Prakash Shukla 	void *data = NULL;
24433ebb587eSAmit Prakash Shukla 
244492d55afeSCiara Power 	if (sess == NULL || sess->user_data_sz == 0)
244592d55afeSCiara Power 		return NULL;
244692d55afeSCiara Power 
24473ebb587eSAmit Prakash Shukla 	data = (void *)(sess->sess_private_data + sess->max_priv_data_sz);
24483ebb587eSAmit Prakash Shukla 
24493ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_asym_session_get_user_data(sess, data);
24503ebb587eSAmit Prakash Shukla 
24513ebb587eSAmit Prakash Shukla 	return data;
245292d55afeSCiara Power }
245392d55afeSCiara Power 
245499a2dd95SBruce Richardson static inline void
245599a2dd95SBruce Richardson sym_crypto_fill_status(struct rte_crypto_sym_vec *vec, int32_t errnum)
245699a2dd95SBruce Richardson {
245799a2dd95SBruce Richardson 	uint32_t i;
245899a2dd95SBruce Richardson 	for (i = 0; i < vec->num; i++)
245999a2dd95SBruce Richardson 		vec->status[i] = errnum;
246099a2dd95SBruce Richardson }
246199a2dd95SBruce Richardson 
246299a2dd95SBruce Richardson uint32_t
246399a2dd95SBruce Richardson rte_cryptodev_sym_cpu_crypto_process(uint8_t dev_id,
24642a440d6aSAkhil Goyal 	void *_sess, union rte_crypto_sym_ofs ofs,
246599a2dd95SBruce Richardson 	struct rte_crypto_sym_vec *vec)
246699a2dd95SBruce Richardson {
246799a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
24682a440d6aSAkhil Goyal 	struct rte_cryptodev_sym_session *sess = _sess;
246999a2dd95SBruce Richardson 
2470e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id)) {
247199a2dd95SBruce Richardson 		sym_crypto_fill_status(vec, EINVAL);
247299a2dd95SBruce Richardson 		return 0;
247399a2dd95SBruce Richardson 	}
247499a2dd95SBruce Richardson 
247599a2dd95SBruce Richardson 	dev = rte_cryptodev_pmd_get_dev(dev_id);
247699a2dd95SBruce Richardson 
247799a2dd95SBruce Richardson 	if (*dev->dev_ops->sym_cpu_process == NULL ||
247899a2dd95SBruce Richardson 		!(dev->feature_flags & RTE_CRYPTODEV_FF_SYM_CPU_CRYPTO)) {
247999a2dd95SBruce Richardson 		sym_crypto_fill_status(vec, ENOTSUP);
248099a2dd95SBruce Richardson 		return 0;
248199a2dd95SBruce Richardson 	}
248299a2dd95SBruce Richardson 
24833ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_sym_cpu_crypto_process(dev_id, sess);
24843ebb587eSAmit Prakash Shukla 
248599a2dd95SBruce Richardson 	return dev->dev_ops->sym_cpu_process(dev, sess, ofs, vec);
248699a2dd95SBruce Richardson }
248799a2dd95SBruce Richardson 
248899a2dd95SBruce Richardson int
248999a2dd95SBruce Richardson rte_cryptodev_get_raw_dp_ctx_size(uint8_t dev_id)
249099a2dd95SBruce Richardson {
249199a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
249299a2dd95SBruce Richardson 	int32_t size = sizeof(struct rte_crypto_raw_dp_ctx);
249399a2dd95SBruce Richardson 	int32_t priv_size;
249499a2dd95SBruce Richardson 
2495e74abd48SAkhil Goyal 	if (!rte_cryptodev_is_valid_dev(dev_id))
249699a2dd95SBruce Richardson 		return -EINVAL;
249799a2dd95SBruce Richardson 
249899a2dd95SBruce Richardson 	dev = rte_cryptodev_pmd_get_dev(dev_id);
249999a2dd95SBruce Richardson 
250099a2dd95SBruce Richardson 	if (*dev->dev_ops->sym_get_raw_dp_ctx_size == NULL ||
250199a2dd95SBruce Richardson 		!(dev->feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)) {
250299a2dd95SBruce Richardson 		return -ENOTSUP;
250399a2dd95SBruce Richardson 	}
250499a2dd95SBruce Richardson 
250599a2dd95SBruce Richardson 	priv_size = (*dev->dev_ops->sym_get_raw_dp_ctx_size)(dev);
250699a2dd95SBruce Richardson 	if (priv_size < 0)
250799a2dd95SBruce Richardson 		return -ENOTSUP;
250899a2dd95SBruce Richardson 
25093ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_get_raw_dp_ctx_size(dev_id);
25103ebb587eSAmit Prakash Shukla 
251199a2dd95SBruce Richardson 	return RTE_ALIGN_CEIL((size + priv_size), 8);
251299a2dd95SBruce Richardson }
251399a2dd95SBruce Richardson 
251499a2dd95SBruce Richardson int
251599a2dd95SBruce Richardson rte_cryptodev_configure_raw_dp_ctx(uint8_t dev_id, uint16_t qp_id,
251699a2dd95SBruce Richardson 	struct rte_crypto_raw_dp_ctx *ctx,
251799a2dd95SBruce Richardson 	enum rte_crypto_op_sess_type sess_type,
251899a2dd95SBruce Richardson 	union rte_cryptodev_session_ctx session_ctx,
251999a2dd95SBruce Richardson 	uint8_t is_update)
252099a2dd95SBruce Richardson {
252199a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
252299a2dd95SBruce Richardson 
252399a2dd95SBruce Richardson 	if (!rte_cryptodev_get_qp_status(dev_id, qp_id))
252499a2dd95SBruce Richardson 		return -EINVAL;
252599a2dd95SBruce Richardson 
252699a2dd95SBruce Richardson 	dev = rte_cryptodev_pmd_get_dev(dev_id);
252799a2dd95SBruce Richardson 	if (!(dev->feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)
252899a2dd95SBruce Richardson 			|| dev->dev_ops->sym_configure_raw_dp_ctx == NULL)
252999a2dd95SBruce Richardson 		return -ENOTSUP;
253099a2dd95SBruce Richardson 
25313ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_configure_raw_dp_ctx(dev_id, qp_id, sess_type);
25323ebb587eSAmit Prakash Shukla 
253399a2dd95SBruce Richardson 	return (*dev->dev_ops->sym_configure_raw_dp_ctx)(dev, qp_id, ctx,
253499a2dd95SBruce Richardson 			sess_type, session_ctx, is_update);
253599a2dd95SBruce Richardson }
253699a2dd95SBruce Richardson 
2537a7ddfa9cSVolodymyr Fialko int
2538a7ddfa9cSVolodymyr Fialko rte_cryptodev_session_event_mdata_set(uint8_t dev_id, void *sess,
2539a7ddfa9cSVolodymyr Fialko 	enum rte_crypto_op_type op_type,
2540a7ddfa9cSVolodymyr Fialko 	enum rte_crypto_op_sess_type sess_type,
2541a7ddfa9cSVolodymyr Fialko 	void *ev_mdata,
2542a7ddfa9cSVolodymyr Fialko 	uint16_t size)
2543a7ddfa9cSVolodymyr Fialko {
2544a7ddfa9cSVolodymyr Fialko 	struct rte_cryptodev *dev;
2545a7ddfa9cSVolodymyr Fialko 
2546a7ddfa9cSVolodymyr Fialko 	if (sess == NULL || ev_mdata == NULL)
2547a7ddfa9cSVolodymyr Fialko 		return -EINVAL;
2548a7ddfa9cSVolodymyr Fialko 
2549a7ddfa9cSVolodymyr Fialko 	if (!rte_cryptodev_is_valid_dev(dev_id))
2550a7ddfa9cSVolodymyr Fialko 		goto skip_pmd_op;
2551a7ddfa9cSVolodymyr Fialko 
2552a7ddfa9cSVolodymyr Fialko 	dev = rte_cryptodev_pmd_get_dev(dev_id);
2553a7ddfa9cSVolodymyr Fialko 	if (dev->dev_ops->session_ev_mdata_set == NULL)
2554a7ddfa9cSVolodymyr Fialko 		goto skip_pmd_op;
2555a7ddfa9cSVolodymyr Fialko 
25563ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_session_event_mdata_set(dev_id, sess, op_type,
25573ebb587eSAmit Prakash Shukla 		sess_type, ev_mdata, size);
25583ebb587eSAmit Prakash Shukla 
2559a7ddfa9cSVolodymyr Fialko 	return (*dev->dev_ops->session_ev_mdata_set)(dev, sess, op_type,
2560a7ddfa9cSVolodymyr Fialko 			sess_type, ev_mdata);
2561a7ddfa9cSVolodymyr Fialko 
2562a7ddfa9cSVolodymyr Fialko skip_pmd_op:
2563a7ddfa9cSVolodymyr Fialko 	if (op_type == RTE_CRYPTO_OP_TYPE_SYMMETRIC)
2564a7ddfa9cSVolodymyr Fialko 		return rte_cryptodev_sym_session_set_user_data(sess, ev_mdata,
2565a7ddfa9cSVolodymyr Fialko 				size);
2566a7ddfa9cSVolodymyr Fialko 	else if (op_type == RTE_CRYPTO_OP_TYPE_ASYMMETRIC) {
2567a7ddfa9cSVolodymyr Fialko 		struct rte_cryptodev_asym_session *s = sess;
2568a7ddfa9cSVolodymyr Fialko 
2569a7ddfa9cSVolodymyr Fialko 		if (s->event_mdata == NULL) {
2570a7ddfa9cSVolodymyr Fialko 			s->event_mdata = rte_malloc(NULL, size, 0);
2571a7ddfa9cSVolodymyr Fialko 			if (s->event_mdata == NULL)
2572a7ddfa9cSVolodymyr Fialko 				return -ENOMEM;
2573a7ddfa9cSVolodymyr Fialko 		}
2574a7ddfa9cSVolodymyr Fialko 		rte_memcpy(s->event_mdata, ev_mdata, size);
2575a7ddfa9cSVolodymyr Fialko 
2576a7ddfa9cSVolodymyr Fialko 		return 0;
2577a7ddfa9cSVolodymyr Fialko 	} else
2578a7ddfa9cSVolodymyr Fialko 		return -ENOTSUP;
2579a7ddfa9cSVolodymyr Fialko }
2580a7ddfa9cSVolodymyr Fialko 
258199a2dd95SBruce Richardson uint32_t
258299a2dd95SBruce Richardson rte_cryptodev_raw_enqueue_burst(struct rte_crypto_raw_dp_ctx *ctx,
258399a2dd95SBruce Richardson 	struct rte_crypto_sym_vec *vec, union rte_crypto_sym_ofs ofs,
258499a2dd95SBruce Richardson 	void **user_data, int *enqueue_status)
258599a2dd95SBruce Richardson {
258699a2dd95SBruce Richardson 	return (*ctx->enqueue_burst)(ctx->qp_data, ctx->drv_ctx_data, vec,
258799a2dd95SBruce Richardson 			ofs, user_data, enqueue_status);
258899a2dd95SBruce Richardson }
258999a2dd95SBruce Richardson 
259099a2dd95SBruce Richardson int
259199a2dd95SBruce Richardson rte_cryptodev_raw_enqueue_done(struct rte_crypto_raw_dp_ctx *ctx,
259299a2dd95SBruce Richardson 		uint32_t n)
259399a2dd95SBruce Richardson {
259499a2dd95SBruce Richardson 	return (*ctx->enqueue_done)(ctx->qp_data, ctx->drv_ctx_data, n);
259599a2dd95SBruce Richardson }
259699a2dd95SBruce Richardson 
259799a2dd95SBruce Richardson uint32_t
259899a2dd95SBruce Richardson rte_cryptodev_raw_dequeue_burst(struct rte_crypto_raw_dp_ctx *ctx,
259999a2dd95SBruce Richardson 	rte_cryptodev_raw_get_dequeue_count_t get_dequeue_count,
260099a2dd95SBruce Richardson 	uint32_t max_nb_to_dequeue,
260199a2dd95SBruce Richardson 	rte_cryptodev_raw_post_dequeue_t post_dequeue,
260299a2dd95SBruce Richardson 	void **out_user_data, uint8_t is_user_data_array,
260399a2dd95SBruce Richardson 	uint32_t *n_success_jobs, int *status)
260499a2dd95SBruce Richardson {
260599a2dd95SBruce Richardson 	return (*ctx->dequeue_burst)(ctx->qp_data, ctx->drv_ctx_data,
260699a2dd95SBruce Richardson 		get_dequeue_count, max_nb_to_dequeue, post_dequeue,
260799a2dd95SBruce Richardson 		out_user_data, is_user_data_array, n_success_jobs, status);
260899a2dd95SBruce Richardson }
260999a2dd95SBruce Richardson 
261099a2dd95SBruce Richardson int
261199a2dd95SBruce Richardson rte_cryptodev_raw_dequeue_done(struct rte_crypto_raw_dp_ctx *ctx,
261299a2dd95SBruce Richardson 		uint32_t n)
261399a2dd95SBruce Richardson {
261499a2dd95SBruce Richardson 	return (*ctx->dequeue_done)(ctx->qp_data, ctx->drv_ctx_data, n);
261599a2dd95SBruce Richardson }
261699a2dd95SBruce Richardson 
261799a2dd95SBruce Richardson /** Initialise rte_crypto_op mempool element */
261899a2dd95SBruce Richardson static void
261999a2dd95SBruce Richardson rte_crypto_op_init(struct rte_mempool *mempool,
262099a2dd95SBruce Richardson 		void *opaque_arg,
262199a2dd95SBruce Richardson 		void *_op_data,
262299a2dd95SBruce Richardson 		__rte_unused unsigned i)
262399a2dd95SBruce Richardson {
262499a2dd95SBruce Richardson 	struct rte_crypto_op *op = _op_data;
262599a2dd95SBruce Richardson 	enum rte_crypto_op_type type = *(enum rte_crypto_op_type *)opaque_arg;
262699a2dd95SBruce Richardson 
262799a2dd95SBruce Richardson 	memset(_op_data, 0, mempool->elt_size);
262899a2dd95SBruce Richardson 
262999a2dd95SBruce Richardson 	__rte_crypto_op_reset(op, type);
263099a2dd95SBruce Richardson 
263182caa339SAndrew Boyer 	op->phys_addr = rte_mempool_virt2iova(_op_data);
263299a2dd95SBruce Richardson 	op->mempool = mempool;
263399a2dd95SBruce Richardson }
263499a2dd95SBruce Richardson 
263599a2dd95SBruce Richardson 
263699a2dd95SBruce Richardson struct rte_mempool *
263799a2dd95SBruce Richardson rte_crypto_op_pool_create(const char *name, enum rte_crypto_op_type type,
263899a2dd95SBruce Richardson 		unsigned nb_elts, unsigned cache_size, uint16_t priv_size,
263999a2dd95SBruce Richardson 		int socket_id)
264099a2dd95SBruce Richardson {
264199a2dd95SBruce Richardson 	struct rte_crypto_op_pool_private *priv;
264299a2dd95SBruce Richardson 
264399a2dd95SBruce Richardson 	unsigned elt_size = sizeof(struct rte_crypto_op) +
264499a2dd95SBruce Richardson 			priv_size;
264599a2dd95SBruce Richardson 
264699a2dd95SBruce Richardson 	if (type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) {
264799a2dd95SBruce Richardson 		elt_size += sizeof(struct rte_crypto_sym_op);
264899a2dd95SBruce Richardson 	} else if (type == RTE_CRYPTO_OP_TYPE_ASYMMETRIC) {
264999a2dd95SBruce Richardson 		elt_size += sizeof(struct rte_crypto_asym_op);
265099a2dd95SBruce Richardson 	} else if (type == RTE_CRYPTO_OP_TYPE_UNDEFINED) {
265199a2dd95SBruce Richardson 		elt_size += RTE_MAX(sizeof(struct rte_crypto_sym_op),
265299a2dd95SBruce Richardson 		                    sizeof(struct rte_crypto_asym_op));
265399a2dd95SBruce Richardson 	} else {
2654a0a17e2aSOlivier Matz 		CDEV_LOG_ERR("Invalid op_type");
265599a2dd95SBruce Richardson 		return NULL;
265699a2dd95SBruce Richardson 	}
265799a2dd95SBruce Richardson 
265899a2dd95SBruce Richardson 	/* lookup mempool in case already allocated */
265999a2dd95SBruce Richardson 	struct rte_mempool *mp = rte_mempool_lookup(name);
266099a2dd95SBruce Richardson 
266199a2dd95SBruce Richardson 	if (mp != NULL) {
266299a2dd95SBruce Richardson 		priv = (struct rte_crypto_op_pool_private *)
266399a2dd95SBruce Richardson 				rte_mempool_get_priv(mp);
266499a2dd95SBruce Richardson 
266599a2dd95SBruce Richardson 		if (mp->elt_size != elt_size ||
266699a2dd95SBruce Richardson 				mp->cache_size < cache_size ||
266799a2dd95SBruce Richardson 				mp->size < nb_elts ||
266899a2dd95SBruce Richardson 				priv->priv_size <  priv_size) {
266999a2dd95SBruce Richardson 			mp = NULL;
267099a2dd95SBruce Richardson 			CDEV_LOG_ERR("Mempool %s already exists but with "
267199a2dd95SBruce Richardson 					"incompatible parameters", name);
267299a2dd95SBruce Richardson 			return NULL;
267399a2dd95SBruce Richardson 		}
267499a2dd95SBruce Richardson 		return mp;
267599a2dd95SBruce Richardson 	}
267699a2dd95SBruce Richardson 
267799a2dd95SBruce Richardson 	mp = rte_mempool_create(
267899a2dd95SBruce Richardson 			name,
267999a2dd95SBruce Richardson 			nb_elts,
268099a2dd95SBruce Richardson 			elt_size,
268199a2dd95SBruce Richardson 			cache_size,
268299a2dd95SBruce Richardson 			sizeof(struct rte_crypto_op_pool_private),
268399a2dd95SBruce Richardson 			NULL,
268499a2dd95SBruce Richardson 			NULL,
268599a2dd95SBruce Richardson 			rte_crypto_op_init,
268699a2dd95SBruce Richardson 			&type,
268799a2dd95SBruce Richardson 			socket_id,
268899a2dd95SBruce Richardson 			0);
268999a2dd95SBruce Richardson 
269099a2dd95SBruce Richardson 	if (mp == NULL) {
269199a2dd95SBruce Richardson 		CDEV_LOG_ERR("Failed to create mempool %s", name);
269299a2dd95SBruce Richardson 		return NULL;
269399a2dd95SBruce Richardson 	}
269499a2dd95SBruce Richardson 
269599a2dd95SBruce Richardson 	priv = (struct rte_crypto_op_pool_private *)
269699a2dd95SBruce Richardson 			rte_mempool_get_priv(mp);
269799a2dd95SBruce Richardson 
269899a2dd95SBruce Richardson 	priv->priv_size = priv_size;
269999a2dd95SBruce Richardson 	priv->type = type;
270099a2dd95SBruce Richardson 
27013ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_op_pool_create(name, socket_id, type, nb_elts, mp);
270299a2dd95SBruce Richardson 	return mp;
270399a2dd95SBruce Richardson }
270499a2dd95SBruce Richardson 
270599a2dd95SBruce Richardson int
270699a2dd95SBruce Richardson rte_cryptodev_pmd_create_dev_name(char *name, const char *dev_name_prefix)
270799a2dd95SBruce Richardson {
270899a2dd95SBruce Richardson 	struct rte_cryptodev *dev = NULL;
270999a2dd95SBruce Richardson 	uint32_t i = 0;
271099a2dd95SBruce Richardson 
271199a2dd95SBruce Richardson 	if (name == NULL)
271299a2dd95SBruce Richardson 		return -EINVAL;
271399a2dd95SBruce Richardson 
271499a2dd95SBruce Richardson 	for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++) {
271599a2dd95SBruce Richardson 		int ret = snprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN,
271699a2dd95SBruce Richardson 				"%s_%u", dev_name_prefix, i);
271799a2dd95SBruce Richardson 
271899a2dd95SBruce Richardson 		if (ret < 0)
271999a2dd95SBruce Richardson 			return ret;
272099a2dd95SBruce Richardson 
272199a2dd95SBruce Richardson 		dev = rte_cryptodev_pmd_get_named_dev(name);
272299a2dd95SBruce Richardson 		if (!dev)
272399a2dd95SBruce Richardson 			return 0;
272499a2dd95SBruce Richardson 	}
272599a2dd95SBruce Richardson 
272699a2dd95SBruce Richardson 	return -1;
272799a2dd95SBruce Richardson }
272899a2dd95SBruce Richardson 
272999a2dd95SBruce Richardson TAILQ_HEAD(cryptodev_driver_list, cryptodev_driver);
273099a2dd95SBruce Richardson 
273199a2dd95SBruce Richardson static struct cryptodev_driver_list cryptodev_driver_list =
273299a2dd95SBruce Richardson 	TAILQ_HEAD_INITIALIZER(cryptodev_driver_list);
273399a2dd95SBruce Richardson 
273499a2dd95SBruce Richardson int
273599a2dd95SBruce Richardson rte_cryptodev_driver_id_get(const char *name)
273699a2dd95SBruce Richardson {
273799a2dd95SBruce Richardson 	struct cryptodev_driver *driver;
273899a2dd95SBruce Richardson 	const char *driver_name;
27393ebb587eSAmit Prakash Shukla 	int driver_id = -1;
274099a2dd95SBruce Richardson 
274199a2dd95SBruce Richardson 	if (name == NULL) {
2742c07da8e3SDavid Marchand 		CDEV_LOG_DEBUG("name pointer NULL");
274399a2dd95SBruce Richardson 		return -1;
274499a2dd95SBruce Richardson 	}
274599a2dd95SBruce Richardson 
274699a2dd95SBruce Richardson 	TAILQ_FOREACH(driver, &cryptodev_driver_list, next) {
274799a2dd95SBruce Richardson 		driver_name = driver->driver->name;
27483ebb587eSAmit Prakash Shukla 		if (strncmp(driver_name, name, strlen(driver_name) + 1) == 0) {
27493ebb587eSAmit Prakash Shukla 			driver_id = driver->id;
27503ebb587eSAmit Prakash Shukla 			break;
275199a2dd95SBruce Richardson 		}
27523ebb587eSAmit Prakash Shukla 	}
27533ebb587eSAmit Prakash Shukla 
27543ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_driver_id_get(name, driver_id);
27553ebb587eSAmit Prakash Shukla 
27563ebb587eSAmit Prakash Shukla 	return driver_id;
275799a2dd95SBruce Richardson }
275899a2dd95SBruce Richardson 
275999a2dd95SBruce Richardson const char *
276099a2dd95SBruce Richardson rte_cryptodev_name_get(uint8_t dev_id)
276199a2dd95SBruce Richardson {
276299a2dd95SBruce Richardson 	struct rte_cryptodev *dev;
276399a2dd95SBruce Richardson 
276499a2dd95SBruce Richardson 	if (!rte_cryptodev_is_valid_device_data(dev_id)) {
276599a2dd95SBruce Richardson 		CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
276699a2dd95SBruce Richardson 		return NULL;
276799a2dd95SBruce Richardson 	}
276899a2dd95SBruce Richardson 
276999a2dd95SBruce Richardson 	dev = rte_cryptodev_pmd_get_dev(dev_id);
277099a2dd95SBruce Richardson 	if (dev == NULL)
277199a2dd95SBruce Richardson 		return NULL;
277299a2dd95SBruce Richardson 
27733ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_name_get(dev_id, dev->data->name);
27743ebb587eSAmit Prakash Shukla 
277599a2dd95SBruce Richardson 	return dev->data->name;
277699a2dd95SBruce Richardson }
277799a2dd95SBruce Richardson 
277899a2dd95SBruce Richardson const char *
277999a2dd95SBruce Richardson rte_cryptodev_driver_name_get(uint8_t driver_id)
278099a2dd95SBruce Richardson {
278199a2dd95SBruce Richardson 	struct cryptodev_driver *driver;
278299a2dd95SBruce Richardson 
27833ebb587eSAmit Prakash Shukla 	TAILQ_FOREACH(driver, &cryptodev_driver_list, next) {
27843ebb587eSAmit Prakash Shukla 		if (driver->id == driver_id) {
27853ebb587eSAmit Prakash Shukla 			rte_cryptodev_trace_driver_name_get(driver_id,
27863ebb587eSAmit Prakash Shukla 				driver->driver->name);
278799a2dd95SBruce Richardson 			return driver->driver->name;
27883ebb587eSAmit Prakash Shukla 		}
27893ebb587eSAmit Prakash Shukla 	}
279099a2dd95SBruce Richardson 	return NULL;
279199a2dd95SBruce Richardson }
279299a2dd95SBruce Richardson 
279399a2dd95SBruce Richardson uint8_t
279499a2dd95SBruce Richardson rte_cryptodev_allocate_driver(struct cryptodev_driver *crypto_drv,
279599a2dd95SBruce Richardson 		const struct rte_driver *drv)
279699a2dd95SBruce Richardson {
279799a2dd95SBruce Richardson 	crypto_drv->driver = drv;
279899a2dd95SBruce Richardson 	crypto_drv->id = nb_drivers;
279999a2dd95SBruce Richardson 
280099a2dd95SBruce Richardson 	TAILQ_INSERT_TAIL(&cryptodev_driver_list, crypto_drv, next);
280199a2dd95SBruce Richardson 
28023ebb587eSAmit Prakash Shukla 	rte_cryptodev_trace_allocate_driver(drv->name);
28033ebb587eSAmit Prakash Shukla 
280499a2dd95SBruce Richardson 	return nb_drivers++;
280599a2dd95SBruce Richardson }
28062fd66f75SAkhil Goyal 
28072fd66f75SAkhil Goyal RTE_INIT(cryptodev_init_fp_ops)
28082fd66f75SAkhil Goyal {
28092fd66f75SAkhil Goyal 	uint32_t i;
28102fd66f75SAkhil Goyal 
28112fd66f75SAkhil Goyal 	for (i = 0; i != RTE_DIM(rte_crypto_fp_ops); i++)
28122fd66f75SAkhil Goyal 		cryptodev_fp_ops_reset(rte_crypto_fp_ops + i);
28132fd66f75SAkhil Goyal }
2814d3d98f5cSRebecca Troy 
2815d3d98f5cSRebecca Troy static int
2816d3d98f5cSRebecca Troy cryptodev_handle_dev_list(const char *cmd __rte_unused,
2817d3d98f5cSRebecca Troy 		const char *params __rte_unused,
2818d3d98f5cSRebecca Troy 		struct rte_tel_data *d)
2819d3d98f5cSRebecca Troy {
2820d3d98f5cSRebecca Troy 	int dev_id;
2821d3d98f5cSRebecca Troy 
2822d3d98f5cSRebecca Troy 	if (rte_cryptodev_count() < 1)
2823d3d98f5cSRebecca Troy 		return -EINVAL;
2824d3d98f5cSRebecca Troy 
2825d3d98f5cSRebecca Troy 	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
2826d3d98f5cSRebecca Troy 	for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++)
2827d3d98f5cSRebecca Troy 		if (rte_cryptodev_is_valid_dev(dev_id))
2828d3d98f5cSRebecca Troy 			rte_tel_data_add_array_int(d, dev_id);
2829d3d98f5cSRebecca Troy 
2830d3d98f5cSRebecca Troy 	return 0;
2831d3d98f5cSRebecca Troy }
2832d3d98f5cSRebecca Troy 
2833d3d98f5cSRebecca Troy static int
2834d3d98f5cSRebecca Troy cryptodev_handle_dev_info(const char *cmd __rte_unused,
2835d3d98f5cSRebecca Troy 		const char *params, struct rte_tel_data *d)
2836d3d98f5cSRebecca Troy {
2837d3d98f5cSRebecca Troy 	struct rte_cryptodev_info cryptodev_info;
2838d3d98f5cSRebecca Troy 	int dev_id;
2839d3d98f5cSRebecca Troy 	char *end_param;
2840d3d98f5cSRebecca Troy 
2841d3d98f5cSRebecca Troy 	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
2842d3d98f5cSRebecca Troy 		return -EINVAL;
2843d3d98f5cSRebecca Troy 
2844d3d98f5cSRebecca Troy 	dev_id = strtoul(params, &end_param, 0);
2845d3d98f5cSRebecca Troy 	if (*end_param != '\0')
2846d3d98f5cSRebecca Troy 		CDEV_LOG_ERR("Extra parameters passed to command, ignoring");
2847d3d98f5cSRebecca Troy 	if (!rte_cryptodev_is_valid_dev(dev_id))
2848d3d98f5cSRebecca Troy 		return -EINVAL;
2849d3d98f5cSRebecca Troy 
2850d3d98f5cSRebecca Troy 	rte_cryptodev_info_get(dev_id, &cryptodev_info);
2851d3d98f5cSRebecca Troy 
2852d3d98f5cSRebecca Troy 	rte_tel_data_start_dict(d);
2853d3d98f5cSRebecca Troy 	rte_tel_data_add_dict_string(d, "device_name",
2854d3d98f5cSRebecca Troy 		cryptodev_info.device->name);
2855af0785a2SBruce Richardson 	rte_tel_data_add_dict_uint(d, "max_nb_queue_pairs",
2856d3d98f5cSRebecca Troy 		cryptodev_info.max_nb_queue_pairs);
2857d3d98f5cSRebecca Troy 
2858d3d98f5cSRebecca Troy 	return 0;
2859d3d98f5cSRebecca Troy }
2860d3d98f5cSRebecca Troy 
2861af0785a2SBruce Richardson #define ADD_DICT_STAT(s) rte_tel_data_add_dict_uint(d, #s, cryptodev_stats.s)
2862d3d98f5cSRebecca Troy 
2863d3d98f5cSRebecca Troy static int
2864d3d98f5cSRebecca Troy cryptodev_handle_dev_stats(const char *cmd __rte_unused,
2865d3d98f5cSRebecca Troy 		const char *params,
2866d3d98f5cSRebecca Troy 		struct rte_tel_data *d)
2867d3d98f5cSRebecca Troy {
2868d3d98f5cSRebecca Troy 	struct rte_cryptodev_stats cryptodev_stats;
2869d3d98f5cSRebecca Troy 	int dev_id, ret;
2870d3d98f5cSRebecca Troy 	char *end_param;
2871d3d98f5cSRebecca Troy 
2872d3d98f5cSRebecca Troy 	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
2873d3d98f5cSRebecca Troy 		return -EINVAL;
2874d3d98f5cSRebecca Troy 
2875d3d98f5cSRebecca Troy 	dev_id = strtoul(params, &end_param, 0);
2876d3d98f5cSRebecca Troy 	if (*end_param != '\0')
2877d3d98f5cSRebecca Troy 		CDEV_LOG_ERR("Extra parameters passed to command, ignoring");
2878d3d98f5cSRebecca Troy 	if (!rte_cryptodev_is_valid_dev(dev_id))
2879d3d98f5cSRebecca Troy 		return -EINVAL;
2880d3d98f5cSRebecca Troy 
2881d3d98f5cSRebecca Troy 	ret = rte_cryptodev_stats_get(dev_id, &cryptodev_stats);
2882d3d98f5cSRebecca Troy 	if (ret < 0)
2883d3d98f5cSRebecca Troy 		return ret;
2884d3d98f5cSRebecca Troy 
2885d3d98f5cSRebecca Troy 	rte_tel_data_start_dict(d);
2886d3d98f5cSRebecca Troy 	ADD_DICT_STAT(enqueued_count);
2887d3d98f5cSRebecca Troy 	ADD_DICT_STAT(dequeued_count);
2888d3d98f5cSRebecca Troy 	ADD_DICT_STAT(enqueue_err_count);
2889d3d98f5cSRebecca Troy 	ADD_DICT_STAT(dequeue_err_count);
2890d3d98f5cSRebecca Troy 
2891d3d98f5cSRebecca Troy 	return 0;
2892d3d98f5cSRebecca Troy }
2893d3d98f5cSRebecca Troy 
28941c559ee8SGowrishankar Muthukrishnan #define CRYPTO_CAPS_SZ                                             \
28951c559ee8SGowrishankar Muthukrishnan 	(RTE_ALIGN_CEIL(sizeof(struct rte_cryptodev_capabilities), \
28961c559ee8SGowrishankar Muthukrishnan 					sizeof(uint64_t)) /        \
28971c559ee8SGowrishankar Muthukrishnan 	 sizeof(uint64_t))
28981c559ee8SGowrishankar Muthukrishnan 
28991c559ee8SGowrishankar Muthukrishnan static int
29001c559ee8SGowrishankar Muthukrishnan crypto_caps_array(struct rte_tel_data *d,
29011c559ee8SGowrishankar Muthukrishnan 		  const struct rte_cryptodev_capabilities *capabilities)
29021c559ee8SGowrishankar Muthukrishnan {
29031c559ee8SGowrishankar Muthukrishnan 	const struct rte_cryptodev_capabilities *dev_caps;
29041c559ee8SGowrishankar Muthukrishnan 	uint64_t caps_val[CRYPTO_CAPS_SZ];
29051c559ee8SGowrishankar Muthukrishnan 	unsigned int i = 0, j;
29061c559ee8SGowrishankar Muthukrishnan 
29072d2c55e4SBruce Richardson 	rte_tel_data_start_array(d, RTE_TEL_UINT_VAL);
29081c559ee8SGowrishankar Muthukrishnan 
29091c559ee8SGowrishankar Muthukrishnan 	while ((dev_caps = &capabilities[i++])->op !=
29101c559ee8SGowrishankar Muthukrishnan 			RTE_CRYPTO_OP_TYPE_UNDEFINED) {
29111c559ee8SGowrishankar Muthukrishnan 		memset(&caps_val, 0, CRYPTO_CAPS_SZ * sizeof(caps_val[0]));
29121c559ee8SGowrishankar Muthukrishnan 		rte_memcpy(caps_val, dev_caps, sizeof(capabilities[0]));
29131c559ee8SGowrishankar Muthukrishnan 		for (j = 0; j < CRYPTO_CAPS_SZ; j++)
2914af0785a2SBruce Richardson 			rte_tel_data_add_array_uint(d, caps_val[j]);
29151c559ee8SGowrishankar Muthukrishnan 	}
29161c559ee8SGowrishankar Muthukrishnan 
29171c559ee8SGowrishankar Muthukrishnan 	return i;
29181c559ee8SGowrishankar Muthukrishnan }
29191c559ee8SGowrishankar Muthukrishnan 
29201c559ee8SGowrishankar Muthukrishnan static int
29211c559ee8SGowrishankar Muthukrishnan cryptodev_handle_dev_caps(const char *cmd __rte_unused, const char *params,
29221c559ee8SGowrishankar Muthukrishnan 			  struct rte_tel_data *d)
29231c559ee8SGowrishankar Muthukrishnan {
29241c559ee8SGowrishankar Muthukrishnan 	struct rte_cryptodev_info dev_info;
29251c559ee8SGowrishankar Muthukrishnan 	struct rte_tel_data *crypto_caps;
29261c559ee8SGowrishankar Muthukrishnan 	int crypto_caps_n;
29271c559ee8SGowrishankar Muthukrishnan 	char *end_param;
29281c559ee8SGowrishankar Muthukrishnan 	int dev_id;
29291c559ee8SGowrishankar Muthukrishnan 
29301c559ee8SGowrishankar Muthukrishnan 	if (!params || strlen(params) == 0 || !isdigit(*params))
29311c559ee8SGowrishankar Muthukrishnan 		return -EINVAL;
29321c559ee8SGowrishankar Muthukrishnan 
29331c559ee8SGowrishankar Muthukrishnan 	dev_id = strtoul(params, &end_param, 0);
29341c559ee8SGowrishankar Muthukrishnan 	if (*end_param != '\0')
29351c559ee8SGowrishankar Muthukrishnan 		CDEV_LOG_ERR("Extra parameters passed to command, ignoring");
29361c559ee8SGowrishankar Muthukrishnan 	if (!rte_cryptodev_is_valid_dev(dev_id))
29371c559ee8SGowrishankar Muthukrishnan 		return -EINVAL;
29381c559ee8SGowrishankar Muthukrishnan 
29391c559ee8SGowrishankar Muthukrishnan 	rte_tel_data_start_dict(d);
29401c559ee8SGowrishankar Muthukrishnan 	crypto_caps = rte_tel_data_alloc();
29411c559ee8SGowrishankar Muthukrishnan 	if (!crypto_caps)
29421c559ee8SGowrishankar Muthukrishnan 		return -ENOMEM;
29431c559ee8SGowrishankar Muthukrishnan 
29441c559ee8SGowrishankar Muthukrishnan 	rte_cryptodev_info_get(dev_id, &dev_info);
29451c559ee8SGowrishankar Muthukrishnan 	crypto_caps_n = crypto_caps_array(crypto_caps, dev_info.capabilities);
29461c559ee8SGowrishankar Muthukrishnan 	rte_tel_data_add_dict_container(d, "crypto_caps", crypto_caps, 0);
29471c559ee8SGowrishankar Muthukrishnan 	rte_tel_data_add_dict_int(d, "crypto_caps_n", crypto_caps_n);
29481c559ee8SGowrishankar Muthukrishnan 
29491c559ee8SGowrishankar Muthukrishnan 	return 0;
29501c559ee8SGowrishankar Muthukrishnan }
29511c559ee8SGowrishankar Muthukrishnan 
2952d3d98f5cSRebecca Troy RTE_INIT(cryptodev_init_telemetry)
2953d3d98f5cSRebecca Troy {
2954d3d98f5cSRebecca Troy 	rte_telemetry_register_cmd("/cryptodev/info", cryptodev_handle_dev_info,
2955d3d98f5cSRebecca Troy 			"Returns information for a cryptodev. Parameters: int dev_id");
2956d3d98f5cSRebecca Troy 	rte_telemetry_register_cmd("/cryptodev/list",
2957d3d98f5cSRebecca Troy 			cryptodev_handle_dev_list,
2958d3d98f5cSRebecca Troy 			"Returns list of available crypto devices by IDs. No parameters.");
2959d3d98f5cSRebecca Troy 	rte_telemetry_register_cmd("/cryptodev/stats",
2960d3d98f5cSRebecca Troy 			cryptodev_handle_dev_stats,
2961d3d98f5cSRebecca Troy 			"Returns the stats for a cryptodev. Parameters: int dev_id");
29621c559ee8SGowrishankar Muthukrishnan 	rte_telemetry_register_cmd("/cryptodev/caps",
29631c559ee8SGowrishankar Muthukrishnan 			cryptodev_handle_dev_caps,
29641c559ee8SGowrishankar Muthukrishnan 			"Returns the capabilities for a cryptodev. Parameters: int dev_id");
2965d3d98f5cSRebecca Troy }
2966