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