Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(c) 2015-2020 Intel Corporation
3 : : */
4 : :
5 : : #include <sys/queue.h>
6 : : #include <ctype.h>
7 : : #include <stdio.h>
8 : : #include <stdlib.h>
9 : : #include <string.h>
10 : : #include <errno.h>
11 : : #include <stdint.h>
12 : : #include <inttypes.h>
13 : :
14 : : #include <eal_export.h>
15 : : #include <rte_log.h>
16 : : #include <rte_debug.h>
17 : : #include <dev_driver.h>
18 : : #include <rte_memory.h>
19 : : #include <rte_memcpy.h>
20 : : #include <rte_memzone.h>
21 : : #include <rte_eal.h>
22 : : #include <rte_common.h>
23 : : #include <rte_mempool.h>
24 : : #include <rte_malloc.h>
25 : : #include <rte_errno.h>
26 : : #include <rte_spinlock.h>
27 : : #include <rte_string_fns.h>
28 : : #include <rte_telemetry.h>
29 : :
30 : : #include "rte_crypto.h"
31 : : #include "rte_cryptodev.h"
32 : : #include "cryptodev_pmd.h"
33 : : #include "cryptodev_trace.h"
34 : :
35 : : static uint8_t nb_drivers;
36 : :
37 : : static struct rte_cryptodev rte_crypto_devices[RTE_CRYPTO_MAX_DEVS];
38 : :
39 : : RTE_EXPORT_INTERNAL_SYMBOL(rte_cryptodevs)
40 : : struct rte_cryptodev *rte_cryptodevs = rte_crypto_devices;
41 : :
42 : : static struct rte_cryptodev_global cryptodev_globals = {
43 : : .devs = rte_crypto_devices,
44 : : .data = { NULL },
45 : : .nb_devs = 0
46 : : };
47 : :
48 : : /* Public fastpath APIs. */
49 : : RTE_EXPORT_SYMBOL(rte_crypto_fp_ops)
50 : : struct rte_crypto_fp_ops rte_crypto_fp_ops[RTE_CRYPTO_MAX_DEVS];
51 : :
52 : : /* spinlock for crypto device callbacks */
53 : : static rte_spinlock_t rte_cryptodev_cb_lock = RTE_SPINLOCK_INITIALIZER;
54 : :
55 : : RTE_EXPORT_SYMBOL(rte_cryptodev_logtype)
56 [ - + ]: 276 : RTE_LOG_REGISTER_DEFAULT(rte_cryptodev_logtype, INFO);
57 : :
58 : : /**
59 : : * The user application callback description.
60 : : *
61 : : * It contains callback address to be registered by user application,
62 : : * the pointer to the parameters for callback, and the event type.
63 : : */
64 : : struct rte_cryptodev_callback {
65 : : TAILQ_ENTRY(rte_cryptodev_callback) next; /**< Callbacks list */
66 : : rte_cryptodev_cb_fn cb_fn; /**< Callback address */
67 : : void *cb_arg; /**< Parameter for callback */
68 : : enum rte_cryptodev_event_type event; /**< Interrupt event type */
69 : : uint32_t active; /**< Callback is executing */
70 : : };
71 : :
72 : : /**
73 : : * The crypto cipher algorithm strings identifiers.
74 : : * Not to be used in application directly.
75 : : * Application can use rte_cryptodev_get_cipher_algo_string().
76 : : */
77 : : static const char *
78 : : crypto_cipher_algorithm_strings[] = {
79 : : [RTE_CRYPTO_CIPHER_3DES_CBC] = "3des-cbc",
80 : : [RTE_CRYPTO_CIPHER_3DES_ECB] = "3des-ecb",
81 : : [RTE_CRYPTO_CIPHER_3DES_CTR] = "3des-ctr",
82 : :
83 : : [RTE_CRYPTO_CIPHER_AES_CBC] = "aes-cbc",
84 : : [RTE_CRYPTO_CIPHER_AES_CTR] = "aes-ctr",
85 : : [RTE_CRYPTO_CIPHER_AES_DOCSISBPI] = "aes-docsisbpi",
86 : : [RTE_CRYPTO_CIPHER_AES_ECB] = "aes-ecb",
87 : : [RTE_CRYPTO_CIPHER_AES_F8] = "aes-f8",
88 : : [RTE_CRYPTO_CIPHER_AES_XTS] = "aes-xts",
89 : :
90 : : [RTE_CRYPTO_CIPHER_ARC4] = "arc4",
91 : :
92 : : [RTE_CRYPTO_CIPHER_DES_CBC] = "des-cbc",
93 : : [RTE_CRYPTO_CIPHER_DES_DOCSISBPI] = "des-docsisbpi",
94 : :
95 : : [RTE_CRYPTO_CIPHER_NULL] = "null",
96 : :
97 : : [RTE_CRYPTO_CIPHER_KASUMI_F8] = "kasumi-f8",
98 : : [RTE_CRYPTO_CIPHER_SNOW3G_UEA2] = "snow3g-uea2",
99 : : [RTE_CRYPTO_CIPHER_ZUC_EEA3] = "zuc-eea3",
100 : : [RTE_CRYPTO_CIPHER_SM4_ECB] = "sm4-ecb",
101 : : [RTE_CRYPTO_CIPHER_SM4_CBC] = "sm4-cbc",
102 : : [RTE_CRYPTO_CIPHER_SM4_CTR] = "sm4-ctr",
103 : : [RTE_CRYPTO_CIPHER_SM4_CFB] = "sm4-cfb",
104 : : [RTE_CRYPTO_CIPHER_SM4_OFB] = "sm4-ofb",
105 : : [RTE_CRYPTO_CIPHER_SM4_XTS] = "sm4-xts",
106 : : [RTE_CRYPTO_CIPHER_SNOW5G_NEA4] = "snow5g-nea4",
107 : : [RTE_CRYPTO_CIPHER_AES_NEA5] = "aes-nea5",
108 : : [RTE_CRYPTO_CIPHER_ZUC_NEA6] = "zuc-nea6",
109 : : };
110 : :
111 : : /**
112 : : * The crypto cipher operation strings identifiers.
113 : : * It could be used in application command line.
114 : : */
115 : : RTE_EXPORT_SYMBOL(rte_crypto_cipher_operation_strings)
116 : : const char *
117 : : rte_crypto_cipher_operation_strings[] = {
118 : : [RTE_CRYPTO_CIPHER_OP_ENCRYPT] = "encrypt",
119 : : [RTE_CRYPTO_CIPHER_OP_DECRYPT] = "decrypt"
120 : : };
121 : :
122 : : /**
123 : : * The crypto auth algorithm strings identifiers.
124 : : * Not to be used in application directly.
125 : : * Application can use rte_cryptodev_get_auth_algo_string().
126 : : */
127 : : static const char *
128 : : crypto_auth_algorithm_strings[] = {
129 : : [RTE_CRYPTO_AUTH_AES_CBC_MAC] = "aes-cbc-mac",
130 : : [RTE_CRYPTO_AUTH_AES_CMAC] = "aes-cmac",
131 : : [RTE_CRYPTO_AUTH_AES_GMAC] = "aes-gmac",
132 : : [RTE_CRYPTO_AUTH_AES_XCBC_MAC] = "aes-xcbc-mac",
133 : :
134 : : [RTE_CRYPTO_AUTH_MD5] = "md5",
135 : : [RTE_CRYPTO_AUTH_MD5_HMAC] = "md5-hmac",
136 : :
137 : : [RTE_CRYPTO_AUTH_NULL] = "null",
138 : :
139 : : [RTE_CRYPTO_AUTH_SHA1] = "sha1",
140 : : [RTE_CRYPTO_AUTH_SHA1_HMAC] = "sha1-hmac",
141 : :
142 : : [RTE_CRYPTO_AUTH_SHA224] = "sha2-224",
143 : : [RTE_CRYPTO_AUTH_SHA224_HMAC] = "sha2-224-hmac",
144 : : [RTE_CRYPTO_AUTH_SHA256] = "sha2-256",
145 : : [RTE_CRYPTO_AUTH_SHA256_HMAC] = "sha2-256-hmac",
146 : : [RTE_CRYPTO_AUTH_SHA384] = "sha2-384",
147 : : [RTE_CRYPTO_AUTH_SHA384_HMAC] = "sha2-384-hmac",
148 : : [RTE_CRYPTO_AUTH_SHA512] = "sha2-512",
149 : : [RTE_CRYPTO_AUTH_SHA512_HMAC] = "sha2-512-hmac",
150 : :
151 : : [RTE_CRYPTO_AUTH_SHA3_224] = "sha3-224",
152 : : [RTE_CRYPTO_AUTH_SHA3_224_HMAC] = "sha3-224-hmac",
153 : : [RTE_CRYPTO_AUTH_SHA3_256] = "sha3-256",
154 : : [RTE_CRYPTO_AUTH_SHA3_256_HMAC] = "sha3-256-hmac",
155 : : [RTE_CRYPTO_AUTH_SHA3_384] = "sha3-384",
156 : : [RTE_CRYPTO_AUTH_SHA3_384_HMAC] = "sha3-384-hmac",
157 : : [RTE_CRYPTO_AUTH_SHA3_512] = "sha3-512",
158 : : [RTE_CRYPTO_AUTH_SHA3_512_HMAC] = "sha3-512-hmac",
159 : :
160 : : [RTE_CRYPTO_AUTH_KASUMI_F9] = "kasumi-f9",
161 : : [RTE_CRYPTO_AUTH_SNOW3G_UIA2] = "snow3g-uia2",
162 : : [RTE_CRYPTO_AUTH_ZUC_EIA3] = "zuc-eia3",
163 : : [RTE_CRYPTO_AUTH_SM3] = "sm3",
164 : : [RTE_CRYPTO_AUTH_SM3_HMAC] = "sm3-hmac",
165 : :
166 : : [RTE_CRYPTO_AUTH_SHAKE_128] = "shake-128",
167 : : [RTE_CRYPTO_AUTH_SHAKE_256] = "shake-256",
168 : :
169 : : [RTE_CRYPTO_AUTH_SNOW5G_NIA4] = "snow5g-nia4",
170 : : [RTE_CRYPTO_AUTH_AES_NIA5] = "aes-nia5",
171 : : [RTE_CRYPTO_AUTH_ZUC_NIA6] = "zuc-nia6",
172 : : };
173 : :
174 : : /**
175 : : * The crypto AEAD algorithm strings identifiers.
176 : : * Not to be used in application directly.
177 : : * Application can use rte_cryptodev_get_aead_algo_string().
178 : : */
179 : : static const char *
180 : : crypto_aead_algorithm_strings[] = {
181 : : [RTE_CRYPTO_AEAD_AES_CCM] = "aes-ccm",
182 : : [RTE_CRYPTO_AEAD_AES_GCM] = "aes-gcm",
183 : : [RTE_CRYPTO_AEAD_CHACHA20_POLY1305] = "chacha20-poly1305",
184 : : [RTE_CRYPTO_AEAD_SM4_GCM] = "sm4-gcm",
185 : :
186 : : [RTE_CRYPTO_AEAD_SNOW5G_NCA4] = "snow5g-nca4",
187 : : [RTE_CRYPTO_AEAD_AES_NCA5] = "aes-nca5",
188 : : [RTE_CRYPTO_AEAD_ZUC_NCA6] = "zuc-nca6",
189 : : };
190 : :
191 : :
192 : : /**
193 : : * The crypto AEAD operation strings identifiers.
194 : : * It could be used in application command line.
195 : : */
196 : : RTE_EXPORT_SYMBOL(rte_crypto_aead_operation_strings)
197 : : const char *
198 : : rte_crypto_aead_operation_strings[] = {
199 : : [RTE_CRYPTO_AEAD_OP_ENCRYPT] = "encrypt",
200 : : [RTE_CRYPTO_AEAD_OP_DECRYPT] = "decrypt"
201 : : };
202 : :
203 : : /**
204 : : * Asymmetric crypto transform operation strings identifiers.
205 : : * Not to be used in application directly.
206 : : * Application can use rte_cryptodev_asym_get_xform_string().
207 : : */
208 : : static const char *
209 : : crypto_asym_xform_strings[] = {
210 : : [RTE_CRYPTO_ASYM_XFORM_NONE] = "none",
211 : : [RTE_CRYPTO_ASYM_XFORM_RSA] = "rsa",
212 : : [RTE_CRYPTO_ASYM_XFORM_MODEX] = "modexp",
213 : : [RTE_CRYPTO_ASYM_XFORM_MODINV] = "modinv",
214 : : [RTE_CRYPTO_ASYM_XFORM_DH] = "dh",
215 : : [RTE_CRYPTO_ASYM_XFORM_DSA] = "dsa",
216 : : [RTE_CRYPTO_ASYM_XFORM_ECDSA] = "ecdsa",
217 : : [RTE_CRYPTO_ASYM_XFORM_ECPM] = "ecpm",
218 : : [RTE_CRYPTO_ASYM_XFORM_SM2] = "sm2",
219 : : };
220 : :
221 : : /**
222 : : * Asymmetric crypto operation strings identifiers.
223 : : */
224 : : RTE_EXPORT_SYMBOL(rte_crypto_asym_op_strings)
225 : : const char *rte_crypto_asym_op_strings[] = {
226 : : [RTE_CRYPTO_ASYM_OP_ENCRYPT] = "encrypt",
227 : : [RTE_CRYPTO_ASYM_OP_DECRYPT] = "decrypt",
228 : : [RTE_CRYPTO_ASYM_OP_SIGN] = "sign",
229 : : [RTE_CRYPTO_ASYM_OP_VERIFY] = "verify"
230 : : };
231 : :
232 : : /**
233 : : * Asymmetric crypto key exchange operation strings identifiers.
234 : : */
235 : : RTE_EXPORT_SYMBOL(rte_crypto_asym_ke_strings)
236 : : const char *rte_crypto_asym_ke_strings[] = {
237 : : [RTE_CRYPTO_ASYM_KE_PRIV_KEY_GENERATE] = "priv_key_generate",
238 : : [RTE_CRYPTO_ASYM_KE_PUB_KEY_GENERATE] = "pub_key_generate",
239 : : [RTE_CRYPTO_ASYM_KE_SHARED_SECRET_COMPUTE] = "sharedsecret_compute",
240 : : [RTE_CRYPTO_ASYM_KE_PUB_KEY_VERIFY] = "pub_ec_key_verify"
241 : : };
242 : :
243 : : /**
244 : : * Public key size used in PQC ML-KEM based crypto ops.
245 : : */
246 : : RTE_EXPORT_SYMBOL(rte_crypto_ml_kem_pubkey_size)
247 : : const uint16_t rte_crypto_ml_kem_pubkey_size[] = {
248 : : [RTE_CRYPTO_ML_KEM_512] = 800,
249 : : [RTE_CRYPTO_ML_KEM_768] = 1184,
250 : : [RTE_CRYPTO_ML_KEM_1024] = 1568,
251 : : };
252 : :
253 : : /**
254 : : * Private key size used in PQC ML-KEM based crypto ops.
255 : : */
256 : : RTE_EXPORT_SYMBOL(rte_crypto_ml_kem_privkey_size)
257 : : const uint16_t rte_crypto_ml_kem_privkey_size[] = {
258 : : [RTE_CRYPTO_ML_KEM_512] = 1632,
259 : : [RTE_CRYPTO_ML_KEM_768] = 2400,
260 : : [RTE_CRYPTO_ML_KEM_1024] = 3168,
261 : : };
262 : :
263 : : /**
264 : : * Cipher size used in PQC ML-KEM based crypto ops.
265 : : */
266 : : RTE_EXPORT_SYMBOL(rte_crypto_ml_kem_cipher_size)
267 : : const uint16_t rte_crypto_ml_kem_cipher_size[] = {
268 : : [RTE_CRYPTO_ML_KEM_512] = 768,
269 : : [RTE_CRYPTO_ML_KEM_768] = 1088,
270 : : [RTE_CRYPTO_ML_KEM_1024] = 1568,
271 : : };
272 : :
273 : : /**
274 : : * Public key size used in PQC ML-DSA based crypto ops.
275 : : */
276 : : RTE_EXPORT_SYMBOL(rte_crypto_ml_dsa_pubkey_size)
277 : : const uint16_t rte_crypto_ml_dsa_pubkey_size[] = {
278 : : [RTE_CRYPTO_ML_DSA_44] = 1312,
279 : : [RTE_CRYPTO_ML_DSA_65] = 1952,
280 : : [RTE_CRYPTO_ML_DSA_87] = 2592,
281 : : };
282 : :
283 : : /**
284 : : * Private key size used in PQC ML-DSA based crypto ops.
285 : : */
286 : : RTE_EXPORT_SYMBOL(rte_crypto_ml_dsa_privkey_size)
287 : : const uint16_t rte_crypto_ml_dsa_privkey_size[] = {
288 : : [RTE_CRYPTO_ML_DSA_44] = 2560,
289 : : [RTE_CRYPTO_ML_DSA_65] = 4032,
290 : : [RTE_CRYPTO_ML_DSA_87] = 4896,
291 : : };
292 : :
293 : : /**
294 : : * Sign size used in PQC ML-KEM based crypto ops.
295 : : */
296 : : RTE_EXPORT_SYMBOL(rte_crypto_ml_dsa_sign_size)
297 : : const uint16_t rte_crypto_ml_dsa_sign_size[] = {
298 : : [RTE_CRYPTO_ML_DSA_44] = 2420,
299 : : [RTE_CRYPTO_ML_DSA_65] = 3309,
300 : : [RTE_CRYPTO_ML_DSA_87] = 4627,
301 : : };
302 : :
303 : : struct rte_cryptodev_sym_session_pool_private_data {
304 : : uint16_t sess_data_sz;
305 : : /**< driver session data size */
306 : : uint16_t user_data_sz;
307 : : /**< session user data will be placed after sess_data */
308 : : };
309 : :
310 : : /**
311 : : * The private data structure stored in the asym session mempool private data.
312 : : */
313 : : struct rte_cryptodev_asym_session_pool_private_data {
314 : : uint16_t max_priv_session_sz;
315 : : /**< Size of private session data used when creating mempool */
316 : : uint16_t user_data_sz;
317 : : /**< Session user data will be placed after sess_private_data */
318 : : };
319 : :
320 : : RTE_EXPORT_SYMBOL(rte_cryptodev_get_cipher_algo_enum)
321 : : int
322 : 0 : rte_cryptodev_get_cipher_algo_enum(enum rte_crypto_cipher_algorithm *algo_enum,
323 : : const char *algo_string)
324 : : {
325 : : unsigned int i;
326 : : int ret = -1; /* Invalid string */
327 : :
328 [ # # ]: 0 : for (i = 1; i < RTE_DIM(crypto_cipher_algorithm_strings); i++) {
329 [ # # ]: 0 : if (strcmp(algo_string, crypto_cipher_algorithm_strings[i]) == 0) {
330 : 0 : *algo_enum = (enum rte_crypto_cipher_algorithm) i;
331 : : ret = 0;
332 : 0 : break;
333 : : }
334 : : }
335 : :
336 [ # # ]: 0 : rte_cryptodev_trace_get_cipher_algo_enum(algo_string, *algo_enum, ret);
337 : :
338 : 0 : return ret;
339 : : }
340 : :
341 : : RTE_EXPORT_SYMBOL(rte_cryptodev_get_auth_algo_enum)
342 : : int
343 : 0 : rte_cryptodev_get_auth_algo_enum(enum rte_crypto_auth_algorithm *algo_enum,
344 : : const char *algo_string)
345 : : {
346 : : unsigned int i;
347 : : int ret = -1; /* Invalid string */
348 : :
349 [ # # ]: 0 : for (i = 1; i < RTE_DIM(crypto_auth_algorithm_strings); i++) {
350 [ # # ]: 0 : if (strcmp(algo_string, crypto_auth_algorithm_strings[i]) == 0) {
351 : 0 : *algo_enum = (enum rte_crypto_auth_algorithm) i;
352 : : ret = 0;
353 : 0 : break;
354 : : }
355 : : }
356 : :
357 [ # # ]: 0 : rte_cryptodev_trace_get_auth_algo_enum(algo_string, *algo_enum, ret);
358 : :
359 : 0 : return ret;
360 : : }
361 : :
362 : : RTE_EXPORT_SYMBOL(rte_cryptodev_get_aead_algo_enum)
363 : : int
364 : 0 : rte_cryptodev_get_aead_algo_enum(enum rte_crypto_aead_algorithm *algo_enum,
365 : : const char *algo_string)
366 : : {
367 : : unsigned int i;
368 : : int ret = -1; /* Invalid string */
369 : :
370 [ # # ]: 0 : for (i = 1; i < RTE_DIM(crypto_aead_algorithm_strings); i++) {
371 [ # # ]: 0 : if (strcmp(algo_string, crypto_aead_algorithm_strings[i]) == 0) {
372 : 0 : *algo_enum = (enum rte_crypto_aead_algorithm) i;
373 : : ret = 0;
374 : 0 : break;
375 : : }
376 : : }
377 : :
378 [ # # ]: 0 : rte_cryptodev_trace_get_aead_algo_enum(algo_string, *algo_enum, ret);
379 : :
380 : 0 : return ret;
381 : : }
382 : :
383 : : RTE_EXPORT_SYMBOL(rte_cryptodev_asym_get_xform_enum)
384 : : int
385 : 2 : rte_cryptodev_asym_get_xform_enum(enum rte_crypto_asym_xform_type *xform_enum,
386 : : const char *xform_string)
387 : : {
388 : : unsigned int i;
389 : : int ret = -1; /* Invalid string */
390 : :
391 [ + - ]: 11 : for (i = 1; i < RTE_DIM(crypto_asym_xform_strings); i++) {
392 [ + + ]: 11 : if (strcmp(xform_string,
393 : : crypto_asym_xform_strings[i]) == 0) {
394 : 2 : *xform_enum = (enum rte_crypto_asym_xform_type) i;
395 : : ret = 0;
396 : 2 : break;
397 : : }
398 : : }
399 : :
400 [ - + ]: 2 : rte_cryptodev_trace_asym_get_xform_enum(xform_string, *xform_enum, ret);
401 : :
402 : 2 : return ret;
403 : : }
404 : :
405 : : RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_cryptodev_get_cipher_algo_string, 23.03)
406 : : const char *
407 : 0 : rte_cryptodev_get_cipher_algo_string(enum rte_crypto_cipher_algorithm algo_enum)
408 : : {
409 : : const char *alg_str = NULL;
410 : :
411 [ # # ]: 0 : if ((unsigned int)algo_enum < RTE_DIM(crypto_cipher_algorithm_strings))
412 : 0 : alg_str = crypto_cipher_algorithm_strings[algo_enum];
413 : :
414 : 0 : rte_cryptodev_trace_get_cipher_algo_string(algo_enum, alg_str);
415 : :
416 : 0 : return alg_str;
417 : : }
418 : :
419 : : RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_cryptodev_get_auth_algo_string, 23.03)
420 : : const char *
421 : 0 : rte_cryptodev_get_auth_algo_string(enum rte_crypto_auth_algorithm algo_enum)
422 : : {
423 : : const char *alg_str = NULL;
424 : :
425 [ # # ]: 0 : if ((unsigned int)algo_enum < RTE_DIM(crypto_auth_algorithm_strings))
426 : 0 : alg_str = crypto_auth_algorithm_strings[algo_enum];
427 : :
428 : 0 : rte_cryptodev_trace_get_auth_algo_string(algo_enum, alg_str);
429 : :
430 : 0 : return alg_str;
431 : : }
432 : :
433 : : RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_cryptodev_get_aead_algo_string, 23.03)
434 : : const char *
435 : 0 : rte_cryptodev_get_aead_algo_string(enum rte_crypto_aead_algorithm algo_enum)
436 : : {
437 : : const char *alg_str = NULL;
438 : :
439 [ # # ]: 0 : if ((unsigned int)algo_enum < RTE_DIM(crypto_aead_algorithm_strings))
440 : 0 : alg_str = crypto_aead_algorithm_strings[algo_enum];
441 : :
442 : 0 : rte_cryptodev_trace_get_aead_algo_string(algo_enum, alg_str);
443 : :
444 : 0 : return alg_str;
445 : : }
446 : :
447 : : RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_cryptodev_asym_get_xform_string, 23.03)
448 : : const char *
449 : 8 : rte_cryptodev_asym_get_xform_string(enum rte_crypto_asym_xform_type xform_enum)
450 : : {
451 : : const char *xform_str = NULL;
452 : :
453 [ + + ]: 8 : if ((unsigned int)xform_enum < RTE_DIM(crypto_asym_xform_strings))
454 : 7 : xform_str = crypto_asym_xform_strings[xform_enum];
455 : :
456 : 8 : rte_cryptodev_trace_asym_get_xform_string(xform_enum, xform_str);
457 : :
458 : 8 : return xform_str;
459 : : }
460 : :
461 : : /**
462 : : * The crypto auth operation strings identifiers.
463 : : * It could be used in application command line.
464 : : */
465 : : RTE_EXPORT_SYMBOL(rte_crypto_auth_operation_strings)
466 : : const char *
467 : : rte_crypto_auth_operation_strings[] = {
468 : : [RTE_CRYPTO_AUTH_OP_VERIFY] = "verify",
469 : : [RTE_CRYPTO_AUTH_OP_GENERATE] = "generate"
470 : : };
471 : :
472 : : RTE_EXPORT_SYMBOL(rte_cryptodev_sym_capability_get)
473 : : const struct rte_cryptodev_symmetric_capability *
474 : 546 : rte_cryptodev_sym_capability_get(uint8_t dev_id,
475 : : const struct rte_cryptodev_sym_capability_idx *idx)
476 : : {
477 : : const struct rte_cryptodev_capabilities *capability;
478 : : const struct rte_cryptodev_symmetric_capability *sym_capability = NULL;
479 : : struct rte_cryptodev_info dev_info;
480 : : int i = 0;
481 : :
482 : 546 : rte_cryptodev_info_get(dev_id, &dev_info);
483 : :
484 [ + + ]: 14481 : while ((capability = &dev_info.capabilities[i++])->op !=
485 : : RTE_CRYPTO_OP_TYPE_UNDEFINED) {
486 [ + + ]: 14336 : if (capability->op != RTE_CRYPTO_OP_TYPE_SYMMETRIC)
487 : 1160 : continue;
488 : :
489 [ + + ]: 13176 : if (capability->sym.xform_type != idx->type)
490 : 9220 : continue;
491 : :
492 [ + + ]: 3956 : if (idx->type == RTE_CRYPTO_SYM_XFORM_AUTH &&
493 [ + + ]: 2703 : capability->sym.auth.algo == idx->algo.auth) {
494 : 148 : sym_capability = &capability->sym;
495 : 148 : break;
496 : : }
497 : :
498 [ + + ]: 3808 : if (idx->type == RTE_CRYPTO_SYM_XFORM_CIPHER &&
499 [ + + ]: 1114 : capability->sym.cipher.algo == idx->algo.cipher) {
500 : 157 : sym_capability = &capability->sym;
501 : 157 : break;
502 : : }
503 : :
504 [ + + ]: 3651 : if (idx->type == RTE_CRYPTO_SYM_XFORM_AEAD &&
505 [ + + ]: 139 : capability->sym.aead.algo == idx->algo.aead) {
506 : 96 : sym_capability = &capability->sym;
507 : 96 : break;
508 : : }
509 : : }
510 : :
511 : 1092 : rte_cryptodev_trace_sym_capability_get(dev_id, dev_info.driver_name,
512 [ - + ]: 546 : dev_info.driver_id, idx->type, sym_capability);
513 : :
514 : 546 : return sym_capability;
515 : : }
516 : :
517 : : static int
518 : : param_range_check(uint16_t size, const struct rte_crypto_param_range *range)
519 : : {
520 : : unsigned int next_size;
521 : :
522 : : /* Check lower/upper bounds */
523 [ + - + - : 593 : if (size < range->min)
+ + + - +
- + + ]
524 : : return -1;
525 : :
526 [ + - + - : 896 : if (size > range->max)
+ - + - +
- + - + -
+ - + - ]
527 : : return -1;
528 : :
529 : : /* If range is actually only one value, size is correct */
530 [ + - + + : 896 : if (range->increment == 0)
+ - + - +
+ + + - +
+ + - + ]
531 : : return 0;
532 : :
533 : : /* Check if value is one of the supported sizes */
534 [ + - + - : 267442 : for (next_size = range->min; next_size <= range->max;
+ - + - +
- + - - -
+ - - - ]
535 : 266903 : next_size += range->increment)
536 [ + + + + : 267442 : if (size == next_size)
+ + + + +
+ + + - -
+ + - - ]
537 : : return 0;
538 : :
539 : : return -1;
540 : : }
541 : :
542 : : RTE_EXPORT_SYMBOL(rte_cryptodev_asym_capability_get)
543 : : const struct rte_cryptodev_asymmetric_xform_capability *
544 : 44 : rte_cryptodev_asym_capability_get(uint8_t dev_id,
545 : : const struct rte_cryptodev_asym_capability_idx *idx)
546 : : {
547 : : const struct rte_cryptodev_capabilities *capability;
548 : : const struct rte_cryptodev_asymmetric_xform_capability *asym_cap = NULL;
549 : : struct rte_cryptodev_info dev_info;
550 : : unsigned int i = 0;
551 : :
552 : : memset(&dev_info, 0, sizeof(struct rte_cryptodev_info));
553 : 44 : rte_cryptodev_info_get(dev_id, &dev_info);
554 : :
555 [ + + ]: 1644 : while ((capability = &dev_info.capabilities[i++])->op !=
556 : : RTE_CRYPTO_OP_TYPE_UNDEFINED) {
557 [ + + ]: 1639 : if (capability->op != RTE_CRYPTO_OP_TYPE_ASYMMETRIC)
558 : 1452 : continue;
559 : :
560 [ + + ]: 187 : if (capability->asym.xform_capa.xform_type == idx->type) {
561 : 39 : asym_cap = &capability->asym.xform_capa;
562 : 39 : break;
563 : : }
564 : : }
565 : :
566 : 88 : rte_cryptodev_trace_asym_capability_get(dev_info.driver_name,
567 [ - + ]: 44 : dev_info.driver_id, idx->type, asym_cap);
568 : :
569 : 44 : return asym_cap;
570 : : };
571 : :
572 : : RTE_EXPORT_SYMBOL(rte_cryptodev_sym_capability_check_cipher)
573 : : int
574 [ + - ]: 114 : rte_cryptodev_sym_capability_check_cipher(
575 : : const struct rte_cryptodev_symmetric_capability *capability,
576 : : uint16_t key_size, uint16_t iv_size)
577 : : {
578 : : int ret = 0; /* success */
579 : :
580 [ - + ]: 100 : if (param_range_check(key_size, &capability->cipher.key_size) != 0) {
581 : : ret = -1;
582 : 0 : goto done;
583 : : }
584 : :
585 [ # # ]: 0 : if (param_range_check(iv_size, &capability->cipher.iv_size) != 0)
586 : : ret = -1;
587 : :
588 [ - + ]: 114 : done:
589 : 114 : rte_cryptodev_trace_sym_capability_check_cipher(capability, key_size,
590 : : iv_size, ret);
591 : :
592 : 114 : return ret;
593 : : }
594 : :
595 : : RTE_EXPORT_SYMBOL(rte_cryptodev_sym_capability_check_auth)
596 : : int
597 [ + - ]: 103 : rte_cryptodev_sym_capability_check_auth(
598 : : const struct rte_cryptodev_symmetric_capability *capability,
599 : : uint16_t key_size, uint16_t digest_size, uint16_t iv_size)
600 : : {
601 : : int ret = 0; /* success */
602 : :
603 [ - + ]: 71 : if (param_range_check(key_size, &capability->auth.key_size) != 0) {
604 : : ret = -1;
605 : 0 : goto done;
606 : : }
607 : :
608 [ - + ]: 77 : if (param_range_check(digest_size,
609 : : &capability->auth.digest_size) != 0) {
610 : : ret = -1;
611 : 0 : goto done;
612 : : }
613 : :
614 [ # # ]: 0 : if (param_range_check(iv_size, &capability->auth.iv_size) != 0)
615 : : ret = -1;
616 : :
617 [ - + ]: 103 : done:
618 : 103 : rte_cryptodev_trace_sym_capability_check_auth(capability, key_size,
619 : : digest_size, iv_size, ret);
620 : :
621 : 103 : return ret;
622 : : }
623 : :
624 : : RTE_EXPORT_SYMBOL(rte_cryptodev_sym_capability_check_aead)
625 : : int
626 [ + - ]: 91 : rte_cryptodev_sym_capability_check_aead(
627 : : const struct rte_cryptodev_symmetric_capability *capability,
628 : : uint16_t key_size, uint16_t digest_size, uint16_t aad_size,
629 : : uint16_t iv_size)
630 : : {
631 : : int ret = 0; /* success */
632 : :
633 [ - + ]: 91 : if (param_range_check(key_size, &capability->aead.key_size) != 0) {
634 : : ret = -1;
635 : 0 : goto done;
636 : : }
637 : :
638 [ - + ]: 20 : if (param_range_check(digest_size,
639 : : &capability->aead.digest_size) != 0) {
640 : : ret = -1;
641 : 0 : goto done;
642 : : }
643 : :
644 [ - + ]: 91 : if (param_range_check(aad_size, &capability->aead.aad_size) != 0) {
645 : : ret = -1;
646 : 0 : goto done;
647 : : }
648 : :
649 [ + - ]: 89 : if (param_range_check(iv_size, &capability->aead.iv_size) != 0)
650 : : ret = -1;
651 : :
652 [ - + ]: 91 : done:
653 : 91 : rte_cryptodev_trace_sym_capability_check_aead(capability, key_size,
654 : : digest_size, aad_size, iv_size, ret);
655 : :
656 : 91 : return ret;
657 : : }
658 : :
659 : : RTE_EXPORT_SYMBOL(rte_cryptodev_asym_xform_capability_check_optype)
660 : : int
661 : 32 : rte_cryptodev_asym_xform_capability_check_optype(
662 : : const struct rte_cryptodev_asymmetric_xform_capability *capability,
663 : : enum rte_crypto_asym_op_type op_type)
664 : : {
665 : : int ret = 0;
666 : :
667 [ + + ]: 32 : if (capability->op_types & (1 << op_type))
668 : : ret = 1;
669 : :
670 : 32 : rte_cryptodev_trace_asym_xform_capability_check_optype(
671 : : capability->op_types, op_type, ret);
672 : :
673 : 32 : return ret;
674 : : }
675 : :
676 : : RTE_EXPORT_SYMBOL(rte_cryptodev_asym_xform_capability_check_modlen)
677 : : int
678 : 13 : rte_cryptodev_asym_xform_capability_check_modlen(
679 : : const struct rte_cryptodev_asymmetric_xform_capability *capability,
680 : : uint16_t modlen)
681 : : {
682 : : int ret = 0; /* success */
683 : :
684 : : /* no need to check for limits, if min or max = 0 */
685 [ - + ]: 13 : if (capability->modlen.min != 0) {
686 [ # # ]: 0 : if (modlen < capability->modlen.min) {
687 : : ret = -1;
688 : 0 : goto done;
689 : : }
690 : : }
691 : :
692 [ - + ]: 13 : if (capability->modlen.max != 0) {
693 [ # # ]: 0 : if (modlen > capability->modlen.max) {
694 : : ret = -1;
695 : 0 : goto done;
696 : : }
697 : : }
698 : :
699 : : /* in any case, check if given modlen is module increment */
700 [ - + ]: 13 : if (capability->modlen.increment != 0) {
701 [ + - ]: 13 : if (modlen % (capability->modlen.increment))
702 : : ret = -1;
703 : : }
704 : :
705 [ - + ]: 13 : done:
706 : 13 : rte_cryptodev_trace_asym_xform_capability_check_modlen(capability,
707 : : modlen, ret);
708 : :
709 : 13 : return ret;
710 : : }
711 : :
712 : : RTE_EXPORT_SYMBOL(rte_cryptodev_asym_xform_capability_check_hash)
713 : : bool
714 : 0 : rte_cryptodev_asym_xform_capability_check_hash(
715 : : const struct rte_cryptodev_asymmetric_xform_capability *capability,
716 : : enum rte_crypto_auth_algorithm hash)
717 : : {
718 : : bool ret = false;
719 : :
720 [ # # ]: 0 : if (capability->hash_algos & RTE_BIT64(hash))
721 : : ret = true;
722 : :
723 [ # # ]: 0 : rte_cryptodev_trace_asym_xform_capability_check_hash(
724 : : capability->hash_algos, hash, ret);
725 : :
726 : 0 : return ret;
727 : : }
728 : :
729 : : RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_cryptodev_asym_xform_capability_check_opcap, 24.11)
730 : : int
731 : 12 : rte_cryptodev_asym_xform_capability_check_opcap(
732 : : const struct rte_cryptodev_asymmetric_xform_capability *capability,
733 : : enum rte_crypto_asym_op_type op_type, uint8_t cap)
734 : : {
735 : : int ret = 0;
736 : :
737 [ + - ]: 12 : if (!(capability->op_types & (1 << op_type)))
738 : : return ret;
739 : :
740 [ + + ]: 12 : if (capability->op_capa[op_type] & (1 << cap))
741 : : ret = 1;
742 : :
743 : : return ret;
744 : : }
745 : :
746 : : /* spinlock for crypto device enq callbacks */
747 : : static rte_spinlock_t rte_cryptodev_callback_lock = RTE_SPINLOCK_INITIALIZER;
748 : :
749 : : static void
750 : 480 : cryptodev_cb_cleanup(struct rte_cryptodev *dev)
751 : : {
752 : : struct rte_cryptodev_cb_rcu *list;
753 : : struct rte_cryptodev_cb *cb, *next;
754 : : uint16_t qp_id;
755 : :
756 [ + + - + ]: 480 : if (dev->enq_cbs == NULL && dev->deq_cbs == NULL)
757 : : return;
758 : :
759 [ + + ]: 4261 : for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
760 : 3786 : list = &dev->enq_cbs[qp_id];
761 : 3786 : cb = list->next;
762 [ - + ]: 3786 : while (cb != NULL) {
763 : 0 : next = cb->next;
764 : 0 : rte_free(cb);
765 : : cb = next;
766 : : }
767 : :
768 : 3786 : rte_free(list->qsbr);
769 : : }
770 : :
771 [ + + ]: 4261 : for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
772 : 3786 : list = &dev->deq_cbs[qp_id];
773 : 3786 : cb = list->next;
774 [ - + ]: 3786 : while (cb != NULL) {
775 : 0 : next = cb->next;
776 : 0 : rte_free(cb);
777 : : cb = next;
778 : : }
779 : :
780 : 3786 : rte_free(list->qsbr);
781 : : }
782 : :
783 : 475 : rte_free(dev->enq_cbs);
784 : 475 : dev->enq_cbs = NULL;
785 : 475 : rte_free(dev->deq_cbs);
786 : 475 : dev->deq_cbs = NULL;
787 : : }
788 : :
789 : : static int
790 : 477 : cryptodev_cb_init(struct rte_cryptodev *dev)
791 : : {
792 : : struct rte_cryptodev_cb_rcu *list;
793 : : struct rte_rcu_qsbr *qsbr;
794 : : uint16_t qp_id;
795 : : size_t size;
796 : :
797 : : /* Max thread set to 1, as one DP thread accessing a queue-pair */
798 : : const uint32_t max_threads = 1;
799 : :
800 : 954 : dev->enq_cbs = rte_zmalloc(NULL,
801 : : sizeof(struct rte_cryptodev_cb_rcu) *
802 : 477 : dev->data->nb_queue_pairs, 0);
803 [ - + ]: 477 : if (dev->enq_cbs == NULL) {
804 : 0 : CDEV_LOG_ERR("Failed to allocate memory for enq callbacks");
805 : 0 : return -ENOMEM;
806 : : }
807 : :
808 : 954 : dev->deq_cbs = rte_zmalloc(NULL,
809 : : sizeof(struct rte_cryptodev_cb_rcu) *
810 : 477 : dev->data->nb_queue_pairs, 0);
811 [ - + ]: 477 : if (dev->deq_cbs == NULL) {
812 : 0 : CDEV_LOG_ERR("Failed to allocate memory for deq callbacks");
813 : 0 : rte_free(dev->enq_cbs);
814 : 0 : return -ENOMEM;
815 : : }
816 : :
817 : : /* Create RCU QSBR variable */
818 : 477 : size = rte_rcu_qsbr_get_memsize(max_threads);
819 : :
820 [ + + ]: 4279 : for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
821 : 3802 : list = &dev->enq_cbs[qp_id];
822 : 3802 : qsbr = rte_zmalloc(NULL, size, RTE_CACHE_LINE_SIZE);
823 [ - + ]: 3802 : if (qsbr == NULL) {
824 : 0 : CDEV_LOG_ERR("Failed to allocate memory for RCU on "
825 : : "queue_pair_id=%d", qp_id);
826 : 0 : goto cb_init_err;
827 : : }
828 : :
829 [ - + ]: 3802 : if (rte_rcu_qsbr_init(qsbr, max_threads)) {
830 : 0 : CDEV_LOG_ERR("Failed to initialize for RCU on "
831 : : "queue_pair_id=%d", qp_id);
832 : 0 : goto cb_init_err;
833 : : }
834 : :
835 : 3802 : list->qsbr = qsbr;
836 : : }
837 : :
838 [ + + ]: 4279 : for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
839 : 3802 : list = &dev->deq_cbs[qp_id];
840 : 3802 : qsbr = rte_zmalloc(NULL, size, RTE_CACHE_LINE_SIZE);
841 [ - + ]: 3802 : if (qsbr == NULL) {
842 : 0 : CDEV_LOG_ERR("Failed to allocate memory for RCU on "
843 : : "queue_pair_id=%d", qp_id);
844 : 0 : goto cb_init_err;
845 : : }
846 : :
847 [ - + ]: 3802 : if (rte_rcu_qsbr_init(qsbr, max_threads)) {
848 : 0 : CDEV_LOG_ERR("Failed to initialize for RCU on "
849 : : "queue_pair_id=%d", qp_id);
850 : 0 : goto cb_init_err;
851 : : }
852 : :
853 : 3802 : list->qsbr = qsbr;
854 : : }
855 : :
856 : : return 0;
857 : :
858 : 0 : cb_init_err:
859 : 0 : cryptodev_cb_cleanup(dev);
860 : 0 : return -ENOMEM;
861 : : }
862 : :
863 : : RTE_EXPORT_SYMBOL(rte_cryptodev_get_feature_name)
864 : : const char *
865 [ # # ]: 0 : rte_cryptodev_get_feature_name(uint64_t flag)
866 : : {
867 : 0 : rte_cryptodev_trace_get_feature_name(flag);
868 : :
869 [ # # # # : 0 : switch (flag) {
# # # # #
# # # # #
# # # # #
# # # # #
# # # ]
870 : : case RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO:
871 : : return "SYMMETRIC_CRYPTO";
872 : 0 : case RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO:
873 : 0 : return "ASYMMETRIC_CRYPTO";
874 : 0 : case RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING:
875 : 0 : return "SYM_OPERATION_CHAINING";
876 : 0 : case RTE_CRYPTODEV_FF_CPU_SSE:
877 : 0 : return "CPU_SSE";
878 : 0 : case RTE_CRYPTODEV_FF_CPU_AVX:
879 : 0 : return "CPU_AVX";
880 : 0 : case RTE_CRYPTODEV_FF_CPU_AVX2:
881 : 0 : return "CPU_AVX2";
882 : 0 : case RTE_CRYPTODEV_FF_CPU_AVX512:
883 : 0 : return "CPU_AVX512";
884 : 0 : case RTE_CRYPTODEV_FF_CPU_AESNI:
885 : 0 : return "CPU_AESNI";
886 : 0 : case RTE_CRYPTODEV_FF_HW_ACCELERATED:
887 : 0 : return "HW_ACCELERATED";
888 : 0 : case RTE_CRYPTODEV_FF_IN_PLACE_SGL:
889 : 0 : return "IN_PLACE_SGL";
890 : 0 : case RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT:
891 : 0 : return "OOP_SGL_IN_SGL_OUT";
892 : 0 : case RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT:
893 : 0 : return "OOP_SGL_IN_LB_OUT";
894 : 0 : case RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT:
895 : 0 : return "OOP_LB_IN_SGL_OUT";
896 : 0 : case RTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT:
897 : 0 : return "OOP_LB_IN_LB_OUT";
898 : 0 : case RTE_CRYPTODEV_FF_CPU_NEON:
899 : 0 : return "CPU_NEON";
900 : 0 : case RTE_CRYPTODEV_FF_CPU_ARM_CE:
901 : 0 : return "CPU_ARM_CE";
902 : 0 : case RTE_CRYPTODEV_FF_SECURITY:
903 : 0 : return "SECURITY_PROTOCOL";
904 : 0 : case RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_EXP:
905 : 0 : return "RSA_PRIV_OP_KEY_EXP";
906 : 0 : case RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT:
907 : 0 : return "RSA_PRIV_OP_KEY_QT";
908 : 0 : case RTE_CRYPTODEV_FF_DIGEST_ENCRYPTED:
909 : 0 : return "DIGEST_ENCRYPTED";
910 : 0 : case RTE_CRYPTODEV_FF_SYM_CPU_CRYPTO:
911 : 0 : return "SYM_CPU_CRYPTO";
912 : 0 : case RTE_CRYPTODEV_FF_ASYM_SESSIONLESS:
913 : 0 : return "ASYM_SESSIONLESS";
914 : 0 : case RTE_CRYPTODEV_FF_SYM_SESSIONLESS:
915 : 0 : return "SYM_SESSIONLESS";
916 : 0 : case RTE_CRYPTODEV_FF_NON_BYTE_ALIGNED_DATA:
917 : 0 : return "NON_BYTE_ALIGNED_DATA";
918 : 0 : case RTE_CRYPTODEV_FF_CIPHER_MULTIPLE_DATA_UNITS:
919 : 0 : return "CIPHER_MULTIPLE_DATA_UNITS";
920 : 0 : case RTE_CRYPTODEV_FF_CIPHER_WRAPPED_KEY:
921 : 0 : return "CIPHER_WRAPPED_KEY";
922 : 0 : default:
923 : 0 : return NULL;
924 : : }
925 : : }
926 : :
927 : : RTE_EXPORT_INTERNAL_SYMBOL(rte_cryptodev_pmd_get_dev)
928 : : struct rte_cryptodev *
929 : 23214 : rte_cryptodev_pmd_get_dev(uint8_t dev_id)
930 : : {
931 : 23214 : return &cryptodev_globals.devs[dev_id];
932 : : }
933 : :
934 : : RTE_EXPORT_INTERNAL_SYMBOL(rte_cryptodev_pmd_get_named_dev)
935 : : struct rte_cryptodev *
936 : 6 : rte_cryptodev_pmd_get_named_dev(const char *name)
937 : : {
938 : : struct rte_cryptodev *dev;
939 : : unsigned int i;
940 : :
941 [ + - ]: 6 : if (name == NULL)
942 : : return NULL;
943 : :
944 [ + + ]: 198 : for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++) {
945 : 195 : dev = &cryptodev_globals.devs[i];
946 : :
947 [ + + ]: 195 : if ((dev->attached == RTE_CRYPTODEV_ATTACHED) &&
948 [ + - ]: 3 : (strcmp(dev->data->name, name) == 0))
949 : 3 : return dev;
950 : : }
951 : :
952 : : return NULL;
953 : : }
954 : :
955 : : static inline uint8_t
956 : : rte_cryptodev_is_valid_device_data(uint8_t dev_id)
957 : : {
958 : 30858 : if (dev_id >= RTE_CRYPTO_MAX_DEVS ||
959 [ - - - - : 15396 : rte_crypto_devices[dev_id].data == NULL)
+ + ]
960 : : return 0;
961 : :
962 : : return 1;
963 : : }
964 : :
965 : : RTE_EXPORT_SYMBOL(rte_cryptodev_is_valid_dev)
966 : : unsigned int
967 : 15398 : rte_cryptodev_is_valid_dev(uint8_t dev_id)
968 : : {
969 : : struct rte_cryptodev *dev = NULL;
970 : : unsigned int ret = 1;
971 : :
972 [ + + ]: 15398 : if (!rte_cryptodev_is_valid_device_data(dev_id)) {
973 : : ret = 0;
974 : 445 : goto done;
975 : : }
976 : :
977 : 14953 : dev = rte_cryptodev_pmd_get_dev(dev_id);
978 [ + - ]: 14953 : if (dev->attached != RTE_CRYPTODEV_ATTACHED)
979 : : ret = 0;
980 : :
981 [ - + ]: 15398 : done:
982 : 15398 : rte_cryptodev_trace_is_valid_dev(dev_id, ret);
983 : :
984 : 15398 : return ret;
985 : : }
986 : :
987 : : RTE_EXPORT_SYMBOL(rte_cryptodev_get_dev_id)
988 : : int
989 : 0 : rte_cryptodev_get_dev_id(const char *name)
990 : : {
991 : : unsigned i;
992 : : int ret = -1;
993 : :
994 [ # # ]: 0 : if (name == NULL)
995 : : return -1;
996 : :
997 [ # # ]: 0 : for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++) {
998 [ # # ]: 0 : if (!rte_cryptodev_is_valid_device_data(i))
999 : 0 : continue;
1000 [ # # ]: 0 : if ((strcmp(cryptodev_globals.devs[i].data->name, name)
1001 : 0 : == 0) &&
1002 [ # # ]: 0 : (cryptodev_globals.devs[i].attached ==
1003 : : RTE_CRYPTODEV_ATTACHED)) {
1004 : 0 : ret = (int)i;
1005 : 0 : break;
1006 : : }
1007 : : }
1008 : :
1009 : 0 : rte_cryptodev_trace_get_dev_id(name, ret);
1010 : :
1011 : 0 : return ret;
1012 : : }
1013 : :
1014 : : RTE_EXPORT_SYMBOL(rte_cryptodev_count)
1015 : : uint8_t
1016 : 11 : rte_cryptodev_count(void)
1017 : : {
1018 [ - + ]: 11 : rte_cryptodev_trace_count(cryptodev_globals.nb_devs);
1019 : :
1020 : 11 : return cryptodev_globals.nb_devs;
1021 : : }
1022 : :
1023 : : RTE_EXPORT_SYMBOL(rte_cryptodev_device_count_by_driver)
1024 : : uint8_t
1025 : 2 : rte_cryptodev_device_count_by_driver(uint8_t driver_id)
1026 : : {
1027 : : uint8_t i, dev_count = 0;
1028 : :
1029 [ + + ]: 130 : for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++)
1030 [ + + ]: 128 : if (cryptodev_globals.devs[i].driver_id == driver_id &&
1031 [ + - ]: 2 : cryptodev_globals.devs[i].attached ==
1032 : : RTE_CRYPTODEV_ATTACHED)
1033 : 2 : dev_count++;
1034 : :
1035 : 2 : rte_cryptodev_trace_device_count_by_driver(driver_id, dev_count);
1036 : :
1037 : 2 : return dev_count;
1038 : : }
1039 : :
1040 : : RTE_EXPORT_SYMBOL(rte_cryptodev_devices_get)
1041 : : uint8_t
1042 : 1 : rte_cryptodev_devices_get(const char *driver_name, uint8_t *devices,
1043 : : uint8_t nb_devices)
1044 : : {
1045 : : uint8_t i, count = 0;
1046 : 1 : struct rte_cryptodev *devs = cryptodev_globals.devs;
1047 : :
1048 [ + + ]: 65 : for (i = 0; i < RTE_CRYPTO_MAX_DEVS && count < nb_devices; i++) {
1049 [ + + ]: 64 : if (!rte_cryptodev_is_valid_device_data(i))
1050 : 63 : continue;
1051 : :
1052 [ + - ]: 1 : if (devs[i].attached == RTE_CRYPTODEV_ATTACHED) {
1053 : : int cmp;
1054 : :
1055 : 1 : cmp = strncmp(devs[i].device->driver->name,
1056 : : driver_name,
1057 : 1 : strlen(driver_name) + 1);
1058 : :
1059 [ + - ]: 1 : if (cmp == 0)
1060 : 1 : devices[count++] = devs[i].data->dev_id;
1061 : : }
1062 : : }
1063 : :
1064 : 1 : rte_cryptodev_trace_devices_get(driver_name, count);
1065 : :
1066 : 1 : return count;
1067 : : }
1068 : :
1069 : : RTE_EXPORT_SYMBOL(rte_cryptodev_get_sec_ctx)
1070 : : void *
1071 : 5 : rte_cryptodev_get_sec_ctx(uint8_t dev_id)
1072 : : {
1073 : : void *sec_ctx = NULL;
1074 : :
1075 [ + - ]: 5 : if (dev_id < RTE_CRYPTO_MAX_DEVS &&
1076 [ - + ]: 5 : (rte_crypto_devices[dev_id].feature_flags &
1077 : : RTE_CRYPTODEV_FF_SECURITY))
1078 : 0 : sec_ctx = rte_crypto_devices[dev_id].security_ctx;
1079 : :
1080 : 5 : rte_cryptodev_trace_get_sec_ctx(dev_id, sec_ctx);
1081 : :
1082 : 5 : return sec_ctx;
1083 : : }
1084 : :
1085 : : RTE_EXPORT_SYMBOL(rte_cryptodev_socket_id)
1086 : : int
1087 : 3787 : rte_cryptodev_socket_id(uint8_t dev_id)
1088 : : {
1089 : : struct rte_cryptodev *dev;
1090 : :
1091 [ + - ]: 3787 : if (!rte_cryptodev_is_valid_dev(dev_id))
1092 : : return -1;
1093 : :
1094 : 3787 : dev = rte_cryptodev_pmd_get_dev(dev_id);
1095 : :
1096 : 7574 : rte_cryptodev_trace_socket_id(dev_id, dev->data->name,
1097 [ - + ]: 3787 : dev->data->socket_id);
1098 : 3787 : return dev->data->socket_id;
1099 : : }
1100 : :
1101 : : static inline int
1102 : 3 : rte_cryptodev_data_alloc(uint8_t dev_id, struct rte_cryptodev_data **data,
1103 : : int socket_id)
1104 : : {
1105 : : char mz_name[RTE_MEMZONE_NAMESIZE];
1106 : : const struct rte_memzone *mz;
1107 : : int n;
1108 : :
1109 : : /* generate memzone name */
1110 [ + - ]: 3 : n = snprintf(mz_name, sizeof(mz_name), "rte_cryptodev_data_%u", dev_id);
1111 [ + - ]: 3 : if (n >= (int)sizeof(mz_name))
1112 : : return -EINVAL;
1113 : :
1114 [ + - ]: 3 : if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
1115 : 3 : mz = rte_memzone_reserve(mz_name,
1116 : : sizeof(struct rte_cryptodev_data),
1117 : : socket_id, 0);
1118 : 3 : CDEV_LOG_DEBUG("PRIMARY:reserved memzone for %s (%p)",
1119 : : mz_name, mz);
1120 : : } else {
1121 : 0 : mz = rte_memzone_lookup(mz_name);
1122 : 0 : CDEV_LOG_DEBUG("SECONDARY:looked up memzone for %s (%p)",
1123 : : mz_name, mz);
1124 : : }
1125 : :
1126 [ + - ]: 3 : if (mz == NULL)
1127 : : return -ENOMEM;
1128 : :
1129 : 3 : *data = mz->addr;
1130 [ + - ]: 3 : if (rte_eal_process_type() == RTE_PROC_PRIMARY)
1131 : 3 : memset(*data, 0, sizeof(struct rte_cryptodev_data));
1132 : :
1133 : : return 0;
1134 : : }
1135 : :
1136 : : static inline int
1137 : 3 : rte_cryptodev_data_free(uint8_t dev_id, struct rte_cryptodev_data **data)
1138 : : {
1139 : : char mz_name[RTE_MEMZONE_NAMESIZE];
1140 : : const struct rte_memzone *mz;
1141 : : int n;
1142 : :
1143 : : /* generate memzone name */
1144 [ + - ]: 3 : n = snprintf(mz_name, sizeof(mz_name), "rte_cryptodev_data_%u", dev_id);
1145 [ + - ]: 3 : if (n >= (int)sizeof(mz_name))
1146 : : return -EINVAL;
1147 : :
1148 : 3 : mz = rte_memzone_lookup(mz_name);
1149 [ + - ]: 3 : if (mz == NULL)
1150 : : return -ENOMEM;
1151 : :
1152 : : RTE_ASSERT(*data == mz->addr);
1153 : 3 : *data = NULL;
1154 : :
1155 [ + - ]: 3 : if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
1156 : 3 : CDEV_LOG_DEBUG("PRIMARY:free memzone of %s (%p)",
1157 : : mz_name, mz);
1158 : 3 : return rte_memzone_free(mz);
1159 : : } else {
1160 : 0 : CDEV_LOG_DEBUG("SECONDARY:don't free memzone of %s (%p)",
1161 : : mz_name, mz);
1162 : : }
1163 : :
1164 : 0 : return 0;
1165 : : }
1166 : :
1167 : : static uint8_t
1168 : : rte_cryptodev_find_free_device_index(void)
1169 : : {
1170 : : uint8_t dev_id;
1171 : :
1172 [ + - ]: 3 : for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++) {
1173 [ - + ]: 3 : if (rte_crypto_devices[dev_id].attached ==
1174 : : RTE_CRYPTODEV_DETACHED)
1175 : : return dev_id;
1176 : : }
1177 : : return RTE_CRYPTO_MAX_DEVS;
1178 : : }
1179 : :
1180 : : static uint8_t
1181 : 0 : rte_cryptodev_find_device_by_name(const char *name)
1182 : : {
1183 : : char mz_name[RTE_MEMZONE_NAMESIZE];
1184 : : const struct rte_memzone *mz;
1185 : : struct rte_cryptodev_data *data;
1186 : : uint8_t dev_id;
1187 : :
1188 [ # # ]: 0 : for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++) {
1189 : 0 : snprintf(mz_name, sizeof(mz_name), "rte_cryptodev_data_%u", dev_id);
1190 : 0 : mz = rte_memzone_lookup(mz_name);
1191 [ # # ]: 0 : if (mz == NULL)
1192 : 0 : continue;
1193 : :
1194 : 0 : data = mz->addr;
1195 [ # # ]: 0 : if (strncmp(data->name, name, RTE_CRYPTODEV_NAME_MAX_LEN) == 0)
1196 : 0 : return dev_id;
1197 : : }
1198 : : return RTE_CRYPTO_MAX_DEVS;
1199 : : }
1200 : :
1201 : : RTE_EXPORT_INTERNAL_SYMBOL(rte_cryptodev_pmd_allocate)
1202 : : struct rte_cryptodev *
1203 : 3 : rte_cryptodev_pmd_allocate(const char *name, int socket_id)
1204 : : {
1205 : : struct rte_cryptodev *cryptodev;
1206 : : uint8_t dev_id;
1207 : :
1208 [ - + ]: 3 : if (rte_cryptodev_pmd_get_named_dev(name) != NULL) {
1209 : 0 : CDEV_LOG_ERR("Crypto device with name %s already "
1210 : : "allocated!", name);
1211 : 0 : return NULL;
1212 : : }
1213 : :
1214 [ - + ]: 3 : if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
1215 : 0 : dev_id = rte_cryptodev_find_device_by_name(name);
1216 [ # # ]: 0 : if (dev_id == RTE_CRYPTO_MAX_DEVS) {
1217 : 0 : CDEV_LOG_ERR("Device %s does not exist in primary process", name);
1218 : 0 : return NULL;
1219 : : }
1220 : : } else {
1221 : : dev_id = rte_cryptodev_find_free_device_index();
1222 [ - + ]: 3 : if (dev_id == RTE_CRYPTO_MAX_DEVS) {
1223 : 0 : CDEV_LOG_ERR("Reached maximum number of crypto devices");
1224 : 0 : return NULL;
1225 : : }
1226 : : }
1227 : :
1228 : 3 : cryptodev = rte_cryptodev_pmd_get_dev(dev_id);
1229 : :
1230 [ + - ]: 3 : if (cryptodev->data == NULL) {
1231 : 3 : struct rte_cryptodev_data **cryptodev_data =
1232 : : &cryptodev_globals.data[dev_id];
1233 : :
1234 : 3 : int retval = rte_cryptodev_data_alloc(dev_id, cryptodev_data,
1235 : : socket_id);
1236 : :
1237 [ + - + - ]: 3 : if (retval < 0 || *cryptodev_data == NULL)
1238 : : return NULL;
1239 : :
1240 : 3 : cryptodev->data = *cryptodev_data;
1241 : :
1242 [ + - ]: 3 : if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
1243 : 3 : strlcpy(cryptodev->data->name, name,
1244 : : RTE_CRYPTODEV_NAME_MAX_LEN);
1245 : :
1246 : 3 : cryptodev->data->dev_id = dev_id;
1247 : 3 : cryptodev->data->socket_id = socket_id;
1248 : 3 : cryptodev->data->dev_started = 0;
1249 : 3 : CDEV_LOG_DEBUG("PRIMARY:init data");
1250 : : }
1251 : :
1252 : 3 : CDEV_LOG_DEBUG("Data for %s: dev_id %d, socket %d, started %d",
1253 : : cryptodev->data->name,
1254 : : cryptodev->data->dev_id,
1255 : : cryptodev->data->socket_id,
1256 : : cryptodev->data->dev_started);
1257 : :
1258 : : /* init user callbacks */
1259 : 3 : TAILQ_INIT(&(cryptodev->link_intr_cbs));
1260 : :
1261 : 3 : cryptodev->attached = RTE_CRYPTODEV_ATTACHED;
1262 : :
1263 : 3 : cryptodev_globals.nb_devs++;
1264 : : }
1265 : :
1266 : : return cryptodev;
1267 : : }
1268 : :
1269 : : RTE_EXPORT_INTERNAL_SYMBOL(rte_cryptodev_pmd_release_device)
1270 : : int
1271 : 3 : rte_cryptodev_pmd_release_device(struct rte_cryptodev *cryptodev)
1272 : : {
1273 : : int ret;
1274 : : uint8_t dev_id;
1275 : :
1276 [ + - ]: 3 : if (cryptodev == NULL)
1277 : : return -EINVAL;
1278 : :
1279 : 3 : dev_id = cryptodev->data->dev_id;
1280 : :
1281 : 3 : cryptodev_fp_ops_reset(rte_crypto_fp_ops + dev_id);
1282 : :
1283 : : /* Close device only if device operations have been set */
1284 [ + - + - ]: 3 : if (cryptodev->dev_ops && (rte_eal_process_type() == RTE_PROC_PRIMARY)) {
1285 : 3 : ret = rte_cryptodev_close(dev_id);
1286 [ + - ]: 3 : if (ret < 0)
1287 : : return ret;
1288 : : }
1289 : :
1290 : 3 : ret = rte_cryptodev_data_free(dev_id, &cryptodev_globals.data[dev_id]);
1291 [ + - ]: 3 : if (ret < 0)
1292 : : return ret;
1293 : :
1294 : 3 : cryptodev->attached = RTE_CRYPTODEV_DETACHED;
1295 : 3 : cryptodev_globals.nb_devs--;
1296 : 3 : return 0;
1297 : : }
1298 : :
1299 : : RTE_EXPORT_SYMBOL(rte_cryptodev_queue_pair_count)
1300 : : uint16_t
1301 : 0 : rte_cryptodev_queue_pair_count(uint8_t dev_id)
1302 : : {
1303 : : struct rte_cryptodev *dev;
1304 : :
1305 [ # # ]: 0 : if (!rte_cryptodev_is_valid_device_data(dev_id)) {
1306 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
1307 : 0 : return 0;
1308 : : }
1309 : :
1310 : 0 : dev = &rte_crypto_devices[dev_id];
1311 : 0 : rte_cryptodev_trace_queue_pair_count(dev, dev->data->name,
1312 : 0 : dev->data->socket_id, dev->data->dev_id,
1313 [ # # ]: 0 : dev->data->nb_queue_pairs);
1314 : :
1315 : 0 : return dev->data->nb_queue_pairs;
1316 : : }
1317 : :
1318 : : static int
1319 : 480 : rte_cryptodev_queue_pairs_config(struct rte_cryptodev *dev, uint16_t nb_qpairs,
1320 : : int socket_id)
1321 : : {
1322 : : struct rte_cryptodev_info dev_info;
1323 : : void **qp;
1324 : : unsigned i;
1325 : :
1326 [ + + ]: 480 : if ((dev == NULL) || (nb_qpairs < 1)) {
1327 : 1 : CDEV_LOG_ERR("invalid param: dev %p, nb_queues %u",
1328 : : dev, nb_qpairs);
1329 : 1 : return -EINVAL;
1330 : : }
1331 : :
1332 : 479 : CDEV_LOG_DEBUG("Setup %d queues pairs on device %u",
1333 : : nb_qpairs, dev->data->dev_id);
1334 : :
1335 : : memset(&dev_info, 0, sizeof(struct rte_cryptodev_info));
1336 : :
1337 [ + - ]: 479 : if (dev->dev_ops->dev_infos_get == NULL)
1338 : : return -ENOTSUP;
1339 : 479 : dev->dev_ops->dev_infos_get(dev, &dev_info);
1340 : :
1341 [ + + ]: 479 : if (nb_qpairs > (dev_info.max_nb_queue_pairs)) {
1342 : 2 : CDEV_LOG_ERR("Invalid num queue_pairs (%u) for dev %u",
1343 : : nb_qpairs, dev->data->dev_id);
1344 : 2 : return -EINVAL;
1345 : : }
1346 : :
1347 [ + + ]: 477 : if (dev->data->queue_pairs == NULL) { /* first time configuration */
1348 : 4 : dev->data->queue_pairs = rte_zmalloc_socket(
1349 : : "cryptodev->queue_pairs",
1350 : : sizeof(dev->data->queue_pairs[0]) *
1351 : 2 : dev_info.max_nb_queue_pairs,
1352 : : RTE_CACHE_LINE_SIZE, socket_id);
1353 : :
1354 [ - + ]: 2 : if (dev->data->queue_pairs == NULL) {
1355 : 0 : dev->data->nb_queue_pairs = 0;
1356 : 0 : CDEV_LOG_ERR("failed to get memory for qp meta data, "
1357 : : "nb_queues %u",
1358 : : nb_qpairs);
1359 : 0 : return -(ENOMEM);
1360 : : }
1361 : : } else { /* re-configure */
1362 : : int ret;
1363 : 475 : uint16_t old_nb_queues = dev->data->nb_queue_pairs;
1364 : :
1365 : : qp = dev->data->queue_pairs;
1366 : :
1367 [ + - ]: 475 : if (dev->dev_ops->queue_pair_release == NULL)
1368 : : return -ENOTSUP;
1369 : :
1370 [ + + ]: 489 : for (i = nb_qpairs; i < old_nb_queues; i++) {
1371 : 14 : ret = dev->dev_ops->queue_pair_release(dev, i);
1372 [ - + ]: 14 : if (ret < 0)
1373 : 0 : return ret;
1374 : 14 : qp[i] = NULL;
1375 : : }
1376 : :
1377 : : }
1378 : 477 : dev->data->nb_queue_pairs = nb_qpairs;
1379 : 477 : return 0;
1380 : : }
1381 : :
1382 : : RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_cryptodev_queue_pair_reset, 24.11)
1383 : : int
1384 : 1 : rte_cryptodev_queue_pair_reset(uint8_t dev_id, uint16_t queue_pair_id,
1385 : : const struct rte_cryptodev_qp_conf *qp_conf, int socket_id)
1386 : : {
1387 : : struct rte_cryptodev *dev;
1388 : :
1389 [ - + ]: 1 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
1390 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
1391 : 0 : return -EINVAL;
1392 : : }
1393 : :
1394 : 1 : dev = &rte_crypto_devices[dev_id];
1395 [ - + ]: 1 : if (queue_pair_id >= dev->data->nb_queue_pairs) {
1396 : 0 : CDEV_LOG_ERR("Invalid queue_pair_id=%d", queue_pair_id);
1397 : 0 : return -EINVAL;
1398 : : }
1399 : :
1400 [ - + ]: 1 : if (dev->dev_ops->queue_pair_reset == NULL)
1401 : : return -ENOTSUP;
1402 : :
1403 [ # # ]: 0 : rte_cryptodev_trace_queue_pair_reset(dev_id, queue_pair_id, qp_conf, socket_id);
1404 : 0 : return dev->dev_ops->queue_pair_reset(dev, queue_pair_id, qp_conf, socket_id);
1405 : : }
1406 : :
1407 : : RTE_EXPORT_SYMBOL(rte_cryptodev_configure)
1408 : : int
1409 : 482 : rte_cryptodev_configure(uint8_t dev_id, struct rte_cryptodev_config *config)
1410 : : {
1411 : : struct rte_cryptodev *dev;
1412 : : int diag;
1413 : :
1414 [ + + ]: 482 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
1415 : 2 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
1416 : 2 : return -EINVAL;
1417 : : }
1418 : :
1419 : 480 : dev = &rte_crypto_devices[dev_id];
1420 : :
1421 [ - + ]: 480 : if (dev->data->dev_started) {
1422 : 0 : CDEV_LOG_ERR(
1423 : : "device %d must be stopped to allow configuration", dev_id);
1424 : 0 : return -EBUSY;
1425 : : }
1426 : :
1427 [ + - ]: 480 : if (dev->dev_ops->dev_configure == NULL)
1428 : : return -ENOTSUP;
1429 : :
1430 : : rte_spinlock_lock(&rte_cryptodev_callback_lock);
1431 : 480 : cryptodev_cb_cleanup(dev);
1432 : : rte_spinlock_unlock(&rte_cryptodev_callback_lock);
1433 : :
1434 : : /* Setup new number of queue pairs and reconfigure device. */
1435 : 480 : diag = rte_cryptodev_queue_pairs_config(dev, config->nb_queue_pairs,
1436 : : config->socket_id);
1437 [ + + ]: 480 : if (diag != 0) {
1438 : 3 : CDEV_LOG_ERR("dev%d rte_crypto_dev_queue_pairs_config = %d",
1439 : : dev_id, diag);
1440 : 3 : return diag;
1441 : : }
1442 : :
1443 : : rte_spinlock_lock(&rte_cryptodev_callback_lock);
1444 : 477 : diag = cryptodev_cb_init(dev);
1445 : : rte_spinlock_unlock(&rte_cryptodev_callback_lock);
1446 [ - + ]: 477 : if (diag) {
1447 : 0 : CDEV_LOG_ERR("Callback init failed for dev_id=%d", dev_id);
1448 : 0 : return diag;
1449 : : }
1450 : :
1451 : 477 : rte_cryptodev_trace_configure(dev_id, config);
1452 : 477 : return dev->dev_ops->dev_configure(dev, config);
1453 : : }
1454 : :
1455 : : RTE_EXPORT_SYMBOL(rte_cryptodev_start)
1456 : : int
1457 : 467 : rte_cryptodev_start(uint8_t dev_id)
1458 : : {
1459 : : struct rte_cryptodev *dev;
1460 : : int diag;
1461 : :
1462 : 467 : CDEV_LOG_DEBUG("Start dev_id=%" PRIu8, dev_id);
1463 : :
1464 [ - + ]: 467 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
1465 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
1466 : 0 : return -EINVAL;
1467 : : }
1468 : :
1469 : 467 : dev = &rte_crypto_devices[dev_id];
1470 : :
1471 [ + - ]: 467 : if (dev->dev_ops->dev_start == NULL)
1472 : : return -ENOTSUP;
1473 : :
1474 [ - + ]: 467 : if (dev->data->dev_started != 0) {
1475 : 0 : CDEV_LOG_ERR("Device with dev_id=%" PRIu8 " already started",
1476 : : dev_id);
1477 : 0 : return 0;
1478 : : }
1479 : :
1480 : 467 : diag = dev->dev_ops->dev_start(dev);
1481 : : /* expose selection of PMD fast-path functions */
1482 : 467 : cryptodev_fp_ops_set(rte_crypto_fp_ops + dev_id, dev);
1483 : :
1484 : 467 : rte_cryptodev_trace_start(dev_id, diag);
1485 [ + - ]: 467 : if (diag == 0)
1486 : 467 : dev->data->dev_started = 1;
1487 : : else
1488 : : return diag;
1489 : :
1490 : 467 : return 0;
1491 : : }
1492 : :
1493 : : RTE_EXPORT_SYMBOL(rte_cryptodev_stop)
1494 : : void
1495 : 470 : rte_cryptodev_stop(uint8_t dev_id)
1496 : : {
1497 : : struct rte_cryptodev *dev;
1498 : :
1499 [ - + ]: 470 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
1500 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
1501 : 0 : return;
1502 : : }
1503 : :
1504 : 470 : dev = &rte_crypto_devices[dev_id];
1505 : :
1506 [ + - ]: 470 : if (dev->dev_ops->dev_stop == NULL)
1507 : : return;
1508 : :
1509 [ + + ]: 470 : if (dev->data->dev_started == 0) {
1510 : 3 : CDEV_LOG_ERR("Device with dev_id=%" PRIu8 " already stopped",
1511 : : dev_id);
1512 : 3 : return;
1513 : : }
1514 : :
1515 : : /* point fast-path functions to dummy ones */
1516 : 467 : cryptodev_fp_ops_reset(rte_crypto_fp_ops + dev_id);
1517 : :
1518 : 467 : dev->dev_ops->dev_stop(dev);
1519 : 467 : rte_cryptodev_trace_stop(dev_id);
1520 : 467 : dev->data->dev_started = 0;
1521 : : }
1522 : :
1523 : : RTE_EXPORT_SYMBOL(rte_cryptodev_close)
1524 : : int
1525 : 4 : rte_cryptodev_close(uint8_t dev_id)
1526 : : {
1527 : : struct rte_cryptodev *dev;
1528 : : int retval;
1529 : :
1530 [ - + ]: 4 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
1531 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
1532 : 0 : return -1;
1533 : : }
1534 : :
1535 : 4 : dev = &rte_crypto_devices[dev_id];
1536 : :
1537 : : /* Device must be stopped before it can be closed */
1538 [ - + ]: 4 : if (dev->data->dev_started == 1) {
1539 : 0 : CDEV_LOG_ERR("Device %u must be stopped before closing",
1540 : : dev_id);
1541 : 0 : return -EBUSY;
1542 : : }
1543 : :
1544 : : /* We can't close the device if there are outstanding sessions in use */
1545 [ - + ]: 4 : if (dev->data->session_pool != NULL) {
1546 [ # # ]: 0 : if (!rte_mempool_full(dev->data->session_pool)) {
1547 : 0 : CDEV_LOG_ERR("dev_id=%u close failed, session mempool "
1548 : : "has sessions still in use, free "
1549 : : "all sessions before calling close",
1550 : : (unsigned)dev_id);
1551 : 0 : return -EBUSY;
1552 : : }
1553 : : }
1554 : :
1555 [ + - ]: 4 : if (dev->dev_ops->dev_close == NULL)
1556 : : return -ENOTSUP;
1557 : 4 : retval = dev->dev_ops->dev_close(dev);
1558 : 4 : rte_cryptodev_trace_close(dev_id, retval);
1559 : :
1560 : : if (retval < 0)
1561 : : return retval;
1562 : :
1563 : : return 0;
1564 : : }
1565 : :
1566 : : RTE_EXPORT_SYMBOL(rte_cryptodev_get_qp_status)
1567 : : int
1568 : 0 : rte_cryptodev_get_qp_status(uint8_t dev_id, uint16_t queue_pair_id)
1569 : : {
1570 : : struct rte_cryptodev *dev;
1571 : : int ret = 0;
1572 : :
1573 [ # # ]: 0 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
1574 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
1575 : : ret = -EINVAL;
1576 : 0 : goto done;
1577 : : }
1578 : :
1579 : : dev = &rte_crypto_devices[dev_id];
1580 [ # # ]: 0 : if (queue_pair_id >= dev->data->nb_queue_pairs) {
1581 : 0 : CDEV_LOG_ERR("Invalid queue_pair_id=%d", queue_pair_id);
1582 : : ret = -EINVAL;
1583 : 0 : goto done;
1584 : : }
1585 : 0 : void **qps = dev->data->queue_pairs;
1586 : :
1587 [ # # ]: 0 : if (qps[queue_pair_id]) {
1588 : 0 : CDEV_LOG_DEBUG("qp %d on dev %d is initialised",
1589 : : queue_pair_id, dev_id);
1590 : : ret = 1;
1591 : 0 : goto done;
1592 : : }
1593 : :
1594 : 0 : CDEV_LOG_DEBUG("qp %d on dev %d is not initialised",
1595 : : queue_pair_id, dev_id);
1596 : :
1597 [ # # ]: 0 : done:
1598 : 0 : rte_cryptodev_trace_get_qp_status(dev_id, queue_pair_id, ret);
1599 : :
1600 : 0 : return ret;
1601 : : }
1602 : :
1603 : : static uint8_t
1604 : : rte_cryptodev_sym_is_valid_session_pool(struct rte_mempool *mp,
1605 : : uint32_t sess_priv_size)
1606 : : {
1607 : : struct rte_cryptodev_sym_session_pool_private_data *pool_priv;
1608 : :
1609 [ + - ]: 266 : if (!mp)
1610 : : return 0;
1611 : :
1612 : : pool_priv = rte_mempool_get_priv(mp);
1613 : :
1614 [ + - + - ]: 3787 : if (!pool_priv || mp->private_data_size < sizeof(*pool_priv) ||
1615 [ + - - + ]: 3787 : pool_priv->sess_data_sz < sess_priv_size)
1616 : : return 0;
1617 : :
1618 : : return 1;
1619 : : }
1620 : :
1621 : : RTE_EXPORT_SYMBOL(rte_cryptodev_queue_pair_setup)
1622 : : int
1623 : 3787 : rte_cryptodev_queue_pair_setup(uint8_t dev_id, uint16_t queue_pair_id,
1624 : : const struct rte_cryptodev_qp_conf *qp_conf, int socket_id)
1625 : :
1626 : : {
1627 : : struct rte_cryptodev *dev;
1628 : :
1629 [ - + ]: 3787 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
1630 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
1631 : 0 : return -EINVAL;
1632 : : }
1633 : :
1634 : 3787 : dev = &rte_crypto_devices[dev_id];
1635 [ + + ]: 3787 : if (queue_pair_id >= dev->data->nb_queue_pairs) {
1636 : 2 : CDEV_LOG_ERR("Invalid queue_pair_id=%d", queue_pair_id);
1637 : 2 : return -EINVAL;
1638 : : }
1639 : :
1640 [ - + ]: 3785 : if (!qp_conf) {
1641 : 0 : CDEV_LOG_ERR("qp_conf cannot be NULL");
1642 : 0 : return -EINVAL;
1643 : : }
1644 : :
1645 [ + + ]: 3785 : if (qp_conf->mp_session) {
1646 : : struct rte_cryptodev_sym_session_pool_private_data *pool_priv;
1647 : :
1648 : : pool_priv = rte_mempool_get_priv(qp_conf->mp_session);
1649 [ - + ]: 3521 : if (!pool_priv || qp_conf->mp_session->private_data_size <
1650 : : sizeof(*pool_priv)) {
1651 : 0 : CDEV_LOG_ERR("Invalid mempool");
1652 : 0 : return -EINVAL;
1653 : : }
1654 : :
1655 [ + - ]: 3521 : if (!rte_cryptodev_sym_is_valid_session_pool(qp_conf->mp_session,
1656 : : rte_cryptodev_sym_get_private_session_size(dev_id))) {
1657 : 0 : CDEV_LOG_ERR("Invalid mempool");
1658 : 0 : return -EINVAL;
1659 : : }
1660 : : }
1661 : :
1662 [ - + ]: 3785 : if (dev->data->dev_started) {
1663 : 0 : CDEV_LOG_ERR(
1664 : : "device %d must be stopped to allow configuration", dev_id);
1665 : 0 : return -EBUSY;
1666 : : }
1667 : :
1668 [ + - ]: 3785 : if (dev->dev_ops->queue_pair_setup == NULL)
1669 : : return -ENOTSUP;
1670 : :
1671 [ - + ]: 3785 : rte_cryptodev_trace_queue_pair_setup(dev_id, queue_pair_id, qp_conf);
1672 : 3785 : return dev->dev_ops->queue_pair_setup(dev, queue_pair_id, qp_conf, socket_id);
1673 : : }
1674 : :
1675 : : RTE_EXPORT_SYMBOL(rte_cryptodev_add_enq_callback)
1676 : : struct rte_cryptodev_cb *
1677 : 0 : rte_cryptodev_add_enq_callback(uint8_t dev_id,
1678 : : uint16_t qp_id,
1679 : : rte_cryptodev_callback_fn cb_fn,
1680 : : void *cb_arg)
1681 : : {
1682 : : #ifndef RTE_CRYPTO_CALLBACKS
1683 : : rte_errno = ENOTSUP;
1684 : : return NULL;
1685 : : #endif
1686 : : struct rte_cryptodev *dev;
1687 : : struct rte_cryptodev_cb_rcu *list;
1688 : : struct rte_cryptodev_cb *cb, *tail;
1689 : :
1690 [ # # ]: 0 : if (!cb_fn) {
1691 : 0 : CDEV_LOG_ERR("Callback is NULL on dev_id=%d", dev_id);
1692 : 0 : rte_errno = EINVAL;
1693 : 0 : return NULL;
1694 : : }
1695 : :
1696 [ # # ]: 0 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
1697 : 0 : CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
1698 : 0 : rte_errno = ENODEV;
1699 : 0 : return NULL;
1700 : : }
1701 : :
1702 : : dev = &rte_crypto_devices[dev_id];
1703 [ # # ]: 0 : if (qp_id >= dev->data->nb_queue_pairs) {
1704 : 0 : CDEV_LOG_ERR("Invalid queue_pair_id=%d", qp_id);
1705 : 0 : rte_errno = ENODEV;
1706 : 0 : return NULL;
1707 : : }
1708 : :
1709 : 0 : cb = rte_zmalloc(NULL, sizeof(*cb), 0);
1710 [ # # ]: 0 : if (cb == NULL) {
1711 : 0 : CDEV_LOG_ERR("Failed to allocate memory for callback on "
1712 : : "dev=%d, queue_pair_id=%d", dev_id, qp_id);
1713 : 0 : rte_errno = ENOMEM;
1714 : 0 : return NULL;
1715 : : }
1716 : :
1717 : : rte_spinlock_lock(&rte_cryptodev_callback_lock);
1718 : :
1719 : 0 : cb->fn = cb_fn;
1720 : 0 : cb->arg = cb_arg;
1721 : :
1722 : : /* Add the callbacks in fifo order. */
1723 : 0 : list = &dev->enq_cbs[qp_id];
1724 : 0 : tail = list->next;
1725 : :
1726 [ # # ]: 0 : if (tail) {
1727 [ # # ]: 0 : while (tail->next)
1728 : : tail = tail->next;
1729 : : /* Stores to cb->fn and cb->param should complete before
1730 : : * cb is visible to data plane.
1731 : : */
1732 : 0 : rte_atomic_store_explicit(&tail->next, cb, rte_memory_order_release);
1733 : : } else {
1734 : : /* Stores to cb->fn and cb->param should complete before
1735 : : * cb is visible to data plane.
1736 : : */
1737 : 0 : rte_atomic_store_explicit(&list->next, cb, rte_memory_order_release);
1738 : : }
1739 : :
1740 : : rte_spinlock_unlock(&rte_cryptodev_callback_lock);
1741 : :
1742 : 0 : rte_cryptodev_trace_add_enq_callback(dev_id, qp_id, cb_fn);
1743 : 0 : return cb;
1744 : : }
1745 : :
1746 : : RTE_EXPORT_SYMBOL(rte_cryptodev_remove_enq_callback)
1747 : : int
1748 : 0 : rte_cryptodev_remove_enq_callback(uint8_t dev_id,
1749 : : uint16_t qp_id,
1750 : : struct rte_cryptodev_cb *cb)
1751 : : {
1752 : : #ifndef RTE_CRYPTO_CALLBACKS
1753 : : return -ENOTSUP;
1754 : : #endif
1755 : : struct rte_cryptodev *dev;
1756 : : RTE_ATOMIC(struct rte_cryptodev_cb *) *prev_cb;
1757 : : struct rte_cryptodev_cb *curr_cb;
1758 : : struct rte_cryptodev_cb_rcu *list;
1759 : : int ret;
1760 : :
1761 : : ret = -EINVAL;
1762 : :
1763 [ # # ]: 0 : if (!cb) {
1764 : 0 : CDEV_LOG_ERR("Callback is NULL");
1765 : 0 : return -EINVAL;
1766 : : }
1767 : :
1768 [ # # ]: 0 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
1769 : 0 : CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
1770 : 0 : return -ENODEV;
1771 : : }
1772 : :
1773 [ # # ]: 0 : rte_cryptodev_trace_remove_enq_callback(dev_id, qp_id, cb->fn);
1774 : :
1775 : : dev = &rte_crypto_devices[dev_id];
1776 [ # # ]: 0 : if (qp_id >= dev->data->nb_queue_pairs) {
1777 : 0 : CDEV_LOG_ERR("Invalid queue_pair_id=%d", qp_id);
1778 : 0 : return -ENODEV;
1779 : : }
1780 : :
1781 : : rte_spinlock_lock(&rte_cryptodev_callback_lock);
1782 [ # # ]: 0 : if (dev->enq_cbs == NULL) {
1783 : 0 : CDEV_LOG_ERR("Callback not initialized");
1784 : 0 : goto cb_err;
1785 : : }
1786 : :
1787 : 0 : list = &dev->enq_cbs[qp_id];
1788 : : if (list == NULL) {
1789 : : CDEV_LOG_ERR("Callback list is NULL");
1790 : : goto cb_err;
1791 : : }
1792 : :
1793 [ # # ]: 0 : if (list->qsbr == NULL) {
1794 : 0 : CDEV_LOG_ERR("Rcu qsbr is NULL");
1795 : 0 : goto cb_err;
1796 : : }
1797 : :
1798 : 0 : prev_cb = &list->next;
1799 [ # # ]: 0 : for (; *prev_cb != NULL; prev_cb = &curr_cb->next) {
1800 : : curr_cb = *prev_cb;
1801 [ # # ]: 0 : if (curr_cb == cb) {
1802 : : /* Remove the user cb from the callback list. */
1803 : 0 : rte_atomic_store_explicit(prev_cb, curr_cb->next,
1804 : : rte_memory_order_relaxed);
1805 : : ret = 0;
1806 : : break;
1807 : : }
1808 : : }
1809 : :
1810 : : if (!ret) {
1811 : : /* Call sync with invalid thread id as this is part of
1812 : : * control plane API
1813 : : */
1814 : 0 : rte_rcu_qsbr_synchronize(list->qsbr, RTE_QSBR_THRID_INVALID);
1815 : 0 : rte_free(cb);
1816 : : }
1817 : :
1818 : 0 : cb_err:
1819 : : rte_spinlock_unlock(&rte_cryptodev_callback_lock);
1820 : 0 : return ret;
1821 : : }
1822 : :
1823 : : RTE_EXPORT_SYMBOL(rte_cryptodev_add_deq_callback)
1824 : : struct rte_cryptodev_cb *
1825 : 0 : rte_cryptodev_add_deq_callback(uint8_t dev_id,
1826 : : uint16_t qp_id,
1827 : : rte_cryptodev_callback_fn cb_fn,
1828 : : void *cb_arg)
1829 : : {
1830 : : #ifndef RTE_CRYPTO_CALLBACKS
1831 : : rte_errno = ENOTSUP;
1832 : : return NULL;
1833 : : #endif
1834 : : struct rte_cryptodev *dev;
1835 : : struct rte_cryptodev_cb_rcu *list;
1836 : : struct rte_cryptodev_cb *cb, *tail;
1837 : :
1838 [ # # ]: 0 : if (!cb_fn) {
1839 : 0 : CDEV_LOG_ERR("Callback is NULL on dev_id=%d", dev_id);
1840 : 0 : rte_errno = EINVAL;
1841 : 0 : return NULL;
1842 : : }
1843 : :
1844 [ # # ]: 0 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
1845 : 0 : CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
1846 : 0 : rte_errno = ENODEV;
1847 : 0 : return NULL;
1848 : : }
1849 : :
1850 : : dev = &rte_crypto_devices[dev_id];
1851 [ # # ]: 0 : if (qp_id >= dev->data->nb_queue_pairs) {
1852 : 0 : CDEV_LOG_ERR("Invalid queue_pair_id=%d", qp_id);
1853 : 0 : rte_errno = ENODEV;
1854 : 0 : return NULL;
1855 : : }
1856 : :
1857 : 0 : cb = rte_zmalloc(NULL, sizeof(*cb), 0);
1858 [ # # ]: 0 : if (cb == NULL) {
1859 : 0 : CDEV_LOG_ERR("Failed to allocate memory for callback on "
1860 : : "dev=%d, queue_pair_id=%d", dev_id, qp_id);
1861 : 0 : rte_errno = ENOMEM;
1862 : 0 : return NULL;
1863 : : }
1864 : :
1865 : : rte_spinlock_lock(&rte_cryptodev_callback_lock);
1866 : :
1867 : 0 : cb->fn = cb_fn;
1868 : 0 : cb->arg = cb_arg;
1869 : :
1870 : : /* Add the callbacks in fifo order. */
1871 : 0 : list = &dev->deq_cbs[qp_id];
1872 : 0 : tail = list->next;
1873 : :
1874 [ # # ]: 0 : if (tail) {
1875 [ # # ]: 0 : while (tail->next)
1876 : : tail = tail->next;
1877 : : /* Stores to cb->fn and cb->param should complete before
1878 : : * cb is visible to data plane.
1879 : : */
1880 : 0 : rte_atomic_store_explicit(&tail->next, cb, rte_memory_order_release);
1881 : : } else {
1882 : : /* Stores to cb->fn and cb->param should complete before
1883 : : * cb is visible to data plane.
1884 : : */
1885 : 0 : rte_atomic_store_explicit(&list->next, cb, rte_memory_order_release);
1886 : : }
1887 : :
1888 : : rte_spinlock_unlock(&rte_cryptodev_callback_lock);
1889 : :
1890 : 0 : rte_cryptodev_trace_add_deq_callback(dev_id, qp_id, cb_fn);
1891 : :
1892 : 0 : return cb;
1893 : : }
1894 : :
1895 : : RTE_EXPORT_SYMBOL(rte_cryptodev_remove_deq_callback)
1896 : : int
1897 : 0 : rte_cryptodev_remove_deq_callback(uint8_t dev_id,
1898 : : uint16_t qp_id,
1899 : : struct rte_cryptodev_cb *cb)
1900 : : {
1901 : : #ifndef RTE_CRYPTO_CALLBACKS
1902 : : return -ENOTSUP;
1903 : : #endif
1904 : : struct rte_cryptodev *dev;
1905 : : RTE_ATOMIC(struct rte_cryptodev_cb *) *prev_cb;
1906 : : struct rte_cryptodev_cb *curr_cb;
1907 : : struct rte_cryptodev_cb_rcu *list;
1908 : : int ret;
1909 : :
1910 : : ret = -EINVAL;
1911 : :
1912 [ # # ]: 0 : if (!cb) {
1913 : 0 : CDEV_LOG_ERR("Callback is NULL");
1914 : 0 : return -EINVAL;
1915 : : }
1916 : :
1917 [ # # ]: 0 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
1918 : 0 : CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
1919 : 0 : return -ENODEV;
1920 : : }
1921 : :
1922 [ # # ]: 0 : rte_cryptodev_trace_remove_deq_callback(dev_id, qp_id, cb->fn);
1923 : :
1924 : : dev = &rte_crypto_devices[dev_id];
1925 [ # # ]: 0 : if (qp_id >= dev->data->nb_queue_pairs) {
1926 : 0 : CDEV_LOG_ERR("Invalid queue_pair_id=%d", qp_id);
1927 : 0 : return -ENODEV;
1928 : : }
1929 : :
1930 : : rte_spinlock_lock(&rte_cryptodev_callback_lock);
1931 [ # # ]: 0 : if (dev->enq_cbs == NULL) {
1932 : 0 : CDEV_LOG_ERR("Callback not initialized");
1933 : 0 : goto cb_err;
1934 : : }
1935 : :
1936 : 0 : list = &dev->deq_cbs[qp_id];
1937 [ # # ]: 0 : if (list == NULL) {
1938 : 0 : CDEV_LOG_ERR("Callback list is NULL");
1939 : 0 : goto cb_err;
1940 : : }
1941 : :
1942 [ # # ]: 0 : if (list->qsbr == NULL) {
1943 : 0 : CDEV_LOG_ERR("Rcu qsbr is NULL");
1944 : 0 : goto cb_err;
1945 : : }
1946 : :
1947 : 0 : prev_cb = &list->next;
1948 [ # # ]: 0 : for (; *prev_cb != NULL; prev_cb = &curr_cb->next) {
1949 : : curr_cb = *prev_cb;
1950 [ # # ]: 0 : if (curr_cb == cb) {
1951 : : /* Remove the user cb from the callback list. */
1952 : 0 : rte_atomic_store_explicit(prev_cb, curr_cb->next,
1953 : : rte_memory_order_relaxed);
1954 : : ret = 0;
1955 : : break;
1956 : : }
1957 : : }
1958 : :
1959 : : if (!ret) {
1960 : : /* Call sync with invalid thread id as this is part of
1961 : : * control plane API
1962 : : */
1963 : 0 : rte_rcu_qsbr_synchronize(list->qsbr, RTE_QSBR_THRID_INVALID);
1964 : 0 : rte_free(cb);
1965 : : }
1966 : :
1967 : 0 : cb_err:
1968 : : rte_spinlock_unlock(&rte_cryptodev_callback_lock);
1969 : 0 : return ret;
1970 : : }
1971 : :
1972 : : RTE_EXPORT_SYMBOL(rte_cryptodev_stats_get)
1973 : : int
1974 : 7 : rte_cryptodev_stats_get(uint8_t dev_id, struct rte_cryptodev_stats *stats)
1975 : : {
1976 : : struct rte_cryptodev *dev;
1977 : :
1978 [ + + ]: 7 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
1979 : 1 : CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
1980 : 1 : return -ENODEV;
1981 : : }
1982 : :
1983 [ + + ]: 6 : if (stats == NULL) {
1984 : 1 : CDEV_LOG_ERR("Invalid stats ptr");
1985 : 1 : return -EINVAL;
1986 : : }
1987 : :
1988 [ + - ]: 5 : dev = &rte_crypto_devices[dev_id];
1989 : : memset(stats, 0, sizeof(*stats));
1990 : :
1991 [ + - ]: 5 : if (dev->dev_ops->stats_get == NULL)
1992 : : return -ENOTSUP;
1993 : 5 : dev->dev_ops->stats_get(dev, stats);
1994 : :
1995 : 5 : rte_cryptodev_trace_stats_get(dev_id, stats);
1996 : 5 : return 0;
1997 : : }
1998 : :
1999 : : RTE_EXPORT_SYMBOL(rte_cryptodev_stats_reset)
2000 : : void
2001 : 437 : rte_cryptodev_stats_reset(uint8_t dev_id)
2002 : : {
2003 : : struct rte_cryptodev *dev;
2004 : :
2005 [ - + ]: 437 : rte_cryptodev_trace_stats_reset(dev_id);
2006 : :
2007 [ + + ]: 437 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
2008 : 1 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
2009 : 1 : return;
2010 : : }
2011 : :
2012 : 436 : dev = &rte_crypto_devices[dev_id];
2013 : :
2014 [ + - ]: 436 : if (dev->dev_ops->stats_reset == NULL)
2015 : : return;
2016 : 436 : dev->dev_ops->stats_reset(dev);
2017 : : }
2018 : :
2019 : : RTE_EXPORT_SYMBOL(rte_cryptodev_info_get)
2020 : : void
2021 : 1033 : rte_cryptodev_info_get(uint8_t dev_id, struct rte_cryptodev_info *dev_info)
2022 : : {
2023 : : struct rte_cryptodev *dev;
2024 : :
2025 [ - + ]: 1033 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
2026 : 0 : CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
2027 : 0 : return;
2028 : : }
2029 : :
2030 [ + - ]: 1033 : dev = &rte_crypto_devices[dev_id];
2031 : :
2032 : : memset(dev_info, 0, sizeof(struct rte_cryptodev_info));
2033 : :
2034 [ + - ]: 1033 : if (dev->dev_ops->dev_infos_get == NULL)
2035 : : return;
2036 : 1033 : dev->dev_ops->dev_infos_get(dev, dev_info);
2037 : :
2038 : 1033 : dev_info->driver_name = dev->device->driver->name;
2039 [ - + ]: 1033 : dev_info->device = dev->device;
2040 : :
2041 : 1033 : rte_cryptodev_trace_info_get(dev_id, dev_info->driver_name);
2042 : :
2043 : : }
2044 : :
2045 : : RTE_EXPORT_SYMBOL(rte_cryptodev_callback_register)
2046 : : int
2047 : 0 : rte_cryptodev_callback_register(uint8_t dev_id,
2048 : : enum rte_cryptodev_event_type event,
2049 : : rte_cryptodev_cb_fn cb_fn, void *cb_arg)
2050 : : {
2051 : : struct rte_cryptodev *dev;
2052 : : struct rte_cryptodev_callback *user_cb;
2053 : :
2054 [ # # ]: 0 : if (!cb_fn)
2055 : : return -EINVAL;
2056 : :
2057 [ # # ]: 0 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
2058 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
2059 : 0 : return -EINVAL;
2060 : : }
2061 : :
2062 : : dev = &rte_crypto_devices[dev_id];
2063 : : rte_spinlock_lock(&rte_cryptodev_cb_lock);
2064 : :
2065 [ # # ]: 0 : TAILQ_FOREACH(user_cb, &(dev->link_intr_cbs), next) {
2066 [ # # ]: 0 : if (user_cb->cb_fn == cb_fn &&
2067 [ # # ]: 0 : user_cb->cb_arg == cb_arg &&
2068 [ # # ]: 0 : user_cb->event == event) {
2069 : : break;
2070 : : }
2071 : : }
2072 : :
2073 : : /* create a new callback. */
2074 [ # # ]: 0 : if (user_cb == NULL) {
2075 : 0 : user_cb = rte_zmalloc("INTR_USER_CALLBACK",
2076 : : sizeof(struct rte_cryptodev_callback), 0);
2077 [ # # ]: 0 : if (user_cb != NULL) {
2078 : 0 : user_cb->cb_fn = cb_fn;
2079 : 0 : user_cb->cb_arg = cb_arg;
2080 : 0 : user_cb->event = event;
2081 : 0 : TAILQ_INSERT_TAIL(&(dev->link_intr_cbs), user_cb, next);
2082 : : }
2083 : : }
2084 : :
2085 : : rte_spinlock_unlock(&rte_cryptodev_cb_lock);
2086 : :
2087 : 0 : rte_cryptodev_trace_callback_register(dev_id, event, cb_fn);
2088 [ # # ]: 0 : return (user_cb == NULL) ? -ENOMEM : 0;
2089 : : }
2090 : :
2091 : : RTE_EXPORT_SYMBOL(rte_cryptodev_callback_unregister)
2092 : : int
2093 : 0 : rte_cryptodev_callback_unregister(uint8_t dev_id,
2094 : : enum rte_cryptodev_event_type event,
2095 : : rte_cryptodev_cb_fn cb_fn, void *cb_arg)
2096 : : {
2097 : : int ret;
2098 : : struct rte_cryptodev *dev;
2099 : : struct rte_cryptodev_callback *cb, *next;
2100 : :
2101 [ # # ]: 0 : if (!cb_fn)
2102 : : return -EINVAL;
2103 : :
2104 [ # # ]: 0 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
2105 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
2106 : 0 : return -EINVAL;
2107 : : }
2108 : :
2109 : : dev = &rte_crypto_devices[dev_id];
2110 : : rte_spinlock_lock(&rte_cryptodev_cb_lock);
2111 : :
2112 : : ret = 0;
2113 [ # # ]: 0 : for (cb = TAILQ_FIRST(&dev->link_intr_cbs); cb != NULL; cb = next) {
2114 : :
2115 : 0 : next = TAILQ_NEXT(cb, next);
2116 : :
2117 [ # # # # ]: 0 : if (cb->cb_fn != cb_fn || cb->event != event ||
2118 [ # # # # ]: 0 : (cb->cb_arg != (void *)-1 &&
2119 : : cb->cb_arg != cb_arg))
2120 : 0 : continue;
2121 : :
2122 : : /*
2123 : : * if this callback is not executing right now,
2124 : : * then remove it.
2125 : : */
2126 [ # # ]: 0 : if (cb->active == 0) {
2127 [ # # ]: 0 : TAILQ_REMOVE(&(dev->link_intr_cbs), cb, next);
2128 : 0 : rte_free(cb);
2129 : : } else {
2130 : : ret = -EAGAIN;
2131 : : }
2132 : : }
2133 : :
2134 : : rte_spinlock_unlock(&rte_cryptodev_cb_lock);
2135 : :
2136 : 0 : rte_cryptodev_trace_callback_unregister(dev_id, event, cb_fn);
2137 : 0 : return ret;
2138 : : }
2139 : :
2140 : : RTE_EXPORT_INTERNAL_SYMBOL(rte_cryptodev_pmd_callback_process)
2141 : : void
2142 : 0 : rte_cryptodev_pmd_callback_process(struct rte_cryptodev *dev,
2143 : : enum rte_cryptodev_event_type event)
2144 : : {
2145 : : struct rte_cryptodev_callback *cb_lst;
2146 : : struct rte_cryptodev_callback dev_cb;
2147 : :
2148 : : rte_spinlock_lock(&rte_cryptodev_cb_lock);
2149 [ # # ]: 0 : TAILQ_FOREACH(cb_lst, &(dev->link_intr_cbs), next) {
2150 [ # # # # ]: 0 : if (cb_lst->cb_fn == NULL || cb_lst->event != event)
2151 : 0 : continue;
2152 : 0 : dev_cb = *cb_lst;
2153 : 0 : cb_lst->active = 1;
2154 : : rte_spinlock_unlock(&rte_cryptodev_cb_lock);
2155 : 0 : dev_cb.cb_fn(dev->data->dev_id, dev_cb.event,
2156 : : dev_cb.cb_arg);
2157 : : rte_spinlock_lock(&rte_cryptodev_cb_lock);
2158 : 0 : cb_lst->active = 0;
2159 : : }
2160 : : rte_spinlock_unlock(&rte_cryptodev_cb_lock);
2161 : 0 : }
2162 : :
2163 : : RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_cryptodev_queue_pair_event_error_query, 23.03)
2164 : : int
2165 : 0 : rte_cryptodev_queue_pair_event_error_query(uint8_t dev_id, uint16_t qp_id)
2166 : : {
2167 : : struct rte_cryptodev *dev;
2168 : :
2169 [ # # ]: 0 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
2170 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
2171 : 0 : return -EINVAL;
2172 : : }
2173 : 0 : dev = &rte_crypto_devices[dev_id];
2174 : :
2175 [ # # ]: 0 : if (qp_id >= dev->data->nb_queue_pairs)
2176 : : return -EINVAL;
2177 [ # # ]: 0 : if (dev->dev_ops->queue_pair_event_error_query == NULL)
2178 : : return -ENOTSUP;
2179 : :
2180 : 0 : return dev->dev_ops->queue_pair_event_error_query(dev, qp_id);
2181 : : }
2182 : :
2183 : : RTE_EXPORT_SYMBOL(rte_cryptodev_sym_session_pool_create)
2184 : : struct rte_mempool *
2185 : 1 : rte_cryptodev_sym_session_pool_create(const char *name, uint32_t nb_elts,
2186 : : uint32_t elt_size, uint32_t cache_size, uint16_t user_data_size,
2187 : : int socket_id)
2188 : : {
2189 : : struct rte_mempool *mp;
2190 : : struct rte_cryptodev_sym_session_pool_private_data *pool_priv;
2191 : : uint32_t obj_sz;
2192 : :
2193 : 1 : obj_sz = sizeof(struct rte_cryptodev_sym_session) + elt_size + user_data_size;
2194 : :
2195 : 1 : obj_sz = RTE_ALIGN_CEIL(obj_sz, RTE_CACHE_LINE_SIZE);
2196 : 1 : mp = rte_mempool_create(name, nb_elts, obj_sz, cache_size,
2197 : : (uint32_t)(sizeof(*pool_priv)), NULL, NULL,
2198 : : NULL, NULL,
2199 : : socket_id, 0);
2200 [ - + ]: 1 : if (mp == NULL) {
2201 : 0 : CDEV_LOG_ERR("%s(name=%s) failed, rte_errno=%d",
2202 : : __func__, name, rte_errno);
2203 : 0 : return NULL;
2204 : : }
2205 : :
2206 : : pool_priv = rte_mempool_get_priv(mp);
2207 : : if (!pool_priv) {
2208 : : CDEV_LOG_ERR("%s(name=%s) failed to get private data",
2209 : : __func__, name);
2210 : : rte_mempool_free(mp);
2211 : : return NULL;
2212 : : }
2213 : :
2214 : 1 : pool_priv->sess_data_sz = elt_size;
2215 [ - + ]: 1 : pool_priv->user_data_sz = user_data_size;
2216 : :
2217 : 1 : rte_cryptodev_trace_sym_session_pool_create(name, nb_elts,
2218 : : elt_size, cache_size, user_data_size, mp);
2219 : 1 : return mp;
2220 : : }
2221 : :
2222 : : RTE_EXPORT_SYMBOL(rte_cryptodev_asym_session_pool_create)
2223 : : struct rte_mempool *
2224 : 1 : rte_cryptodev_asym_session_pool_create(const char *name, uint32_t nb_elts,
2225 : : uint32_t cache_size, uint16_t user_data_size, int socket_id)
2226 : : {
2227 : : struct rte_mempool *mp;
2228 : : struct rte_cryptodev_asym_session_pool_private_data *pool_priv;
2229 : : uint32_t obj_sz, obj_sz_aligned;
2230 : : uint8_t dev_id;
2231 : : unsigned int priv_sz, max_priv_sz = 0;
2232 : :
2233 [ + + ]: 65 : for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++)
2234 [ + + ]: 64 : if (rte_cryptodev_is_valid_dev(dev_id)) {
2235 : 1 : priv_sz = rte_cryptodev_asym_get_private_session_size(dev_id);
2236 : : if (priv_sz > max_priv_sz)
2237 : : max_priv_sz = priv_sz;
2238 : : }
2239 [ - + ]: 1 : if (max_priv_sz == 0) {
2240 : 0 : CDEV_LOG_INFO("Could not set max private session size");
2241 : 0 : return NULL;
2242 : : }
2243 : :
2244 : 1 : obj_sz = rte_cryptodev_asym_get_header_session_size() + max_priv_sz +
2245 : : user_data_size;
2246 : 1 : obj_sz_aligned = RTE_ALIGN_CEIL(obj_sz, RTE_CACHE_LINE_SIZE);
2247 : :
2248 : 1 : mp = rte_mempool_create(name, nb_elts, obj_sz_aligned, cache_size,
2249 : : (uint32_t)(sizeof(*pool_priv)),
2250 : : NULL, NULL, NULL, NULL,
2251 : : socket_id, 0);
2252 [ - + ]: 1 : if (mp == NULL) {
2253 : 0 : CDEV_LOG_ERR("%s(name=%s) failed, rte_errno=%d",
2254 : : __func__, name, rte_errno);
2255 : 0 : return NULL;
2256 : : }
2257 : :
2258 : : pool_priv = rte_mempool_get_priv(mp);
2259 : : if (!pool_priv) {
2260 : : CDEV_LOG_ERR("%s(name=%s) failed to get private data",
2261 : : __func__, name);
2262 : : rte_mempool_free(mp);
2263 : : return NULL;
2264 : : }
2265 : 1 : pool_priv->max_priv_session_sz = max_priv_sz;
2266 [ - + ]: 1 : pool_priv->user_data_sz = user_data_size;
2267 : :
2268 : 1 : rte_cryptodev_trace_asym_session_pool_create(name, nb_elts,
2269 : : user_data_size, cache_size, mp);
2270 : 1 : return mp;
2271 : : }
2272 : :
2273 : : RTE_EXPORT_SYMBOL(rte_cryptodev_sym_session_create)
2274 : : void *
2275 : 266 : rte_cryptodev_sym_session_create(uint8_t dev_id,
2276 : : struct rte_crypto_sym_xform *xforms,
2277 : : struct rte_mempool *mp)
2278 : : {
2279 : : struct rte_cryptodev *dev;
2280 : : struct rte_cryptodev_sym_session *sess;
2281 : : struct rte_cryptodev_sym_session_pool_private_data *pool_priv;
2282 : : uint32_t sess_priv_sz;
2283 : : int ret;
2284 : :
2285 [ - + ]: 266 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
2286 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
2287 : 0 : rte_errno = EINVAL;
2288 : 0 : return NULL;
2289 : : }
2290 : :
2291 [ - + ]: 266 : if (xforms == NULL) {
2292 : 0 : CDEV_LOG_ERR("Invalid xform");
2293 : 0 : rte_errno = EINVAL;
2294 : 0 : return NULL;
2295 : : }
2296 : :
2297 : 266 : sess_priv_sz = rte_cryptodev_sym_get_private_session_size(dev_id);
2298 : : if (!rte_cryptodev_sym_is_valid_session_pool(mp, sess_priv_sz)) {
2299 : 0 : CDEV_LOG_ERR("Invalid mempool");
2300 : 0 : rte_errno = EINVAL;
2301 : 0 : return NULL;
2302 : : }
2303 : :
2304 : 266 : dev = rte_cryptodev_pmd_get_dev(dev_id);
2305 : :
2306 : : /* Allocate a session structure from the session pool */
2307 [ # # ]: 0 : if (rte_mempool_get(mp, (void **)&sess)) {
2308 : 0 : CDEV_LOG_ERR("couldn't get object from session mempool");
2309 : 0 : rte_errno = ENOMEM;
2310 : 0 : return NULL;
2311 : : }
2312 : :
2313 : : pool_priv = rte_mempool_get_priv(mp);
2314 : 266 : sess->driver_id = dev->driver_id;
2315 : 266 : sess->sess_data_sz = pool_priv->sess_data_sz;
2316 [ - + ]: 266 : sess->user_data_sz = pool_priv->user_data_sz;
2317 : 266 : sess->driver_priv_data_iova = rte_mempool_virt2iova(sess) +
2318 : : offsetof(struct rte_cryptodev_sym_session, driver_priv_data);
2319 : :
2320 [ - + ]: 266 : if (dev->dev_ops->sym_session_configure == NULL) {
2321 : 0 : rte_errno = ENOTSUP;
2322 : 0 : goto error_exit;
2323 : : }
2324 : 266 : memset(sess->driver_priv_data, 0, pool_priv->sess_data_sz + pool_priv->user_data_sz);
2325 : :
2326 : 266 : ret = dev->dev_ops->sym_session_configure(dev, xforms, sess);
2327 [ - + ]: 266 : if (ret < 0) {
2328 : 0 : rte_errno = -ret;
2329 : 0 : goto error_exit;
2330 : : }
2331 [ - + ]: 266 : sess->driver_id = dev->driver_id;
2332 : :
2333 : 266 : rte_cryptodev_trace_sym_session_create(dev_id, sess, xforms, mp);
2334 : :
2335 : 266 : return (void *)sess;
2336 : 0 : error_exit:
2337 [ # # ]: 0 : rte_mempool_put(mp, (void *)sess);
2338 : 0 : return NULL;
2339 : : }
2340 : :
2341 : : RTE_EXPORT_SYMBOL(rte_cryptodev_asym_session_create)
2342 : : int
2343 : 50 : rte_cryptodev_asym_session_create(uint8_t dev_id,
2344 : : struct rte_crypto_asym_xform *xforms, struct rte_mempool *mp,
2345 : : void **session)
2346 : : {
2347 : : struct rte_cryptodev_asym_session *sess;
2348 : : uint32_t session_priv_data_sz;
2349 : : struct rte_cryptodev_asym_session_pool_private_data *pool_priv;
2350 : : unsigned int session_header_size =
2351 : 50 : rte_cryptodev_asym_get_header_session_size();
2352 : : struct rte_cryptodev *dev;
2353 : : int ret;
2354 : :
2355 [ - + ]: 50 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
2356 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
2357 : 0 : return -EINVAL;
2358 : : }
2359 : :
2360 : 50 : dev = rte_cryptodev_pmd_get_dev(dev_id);
2361 : :
2362 [ + - ]: 50 : if (dev == NULL)
2363 : : return -EINVAL;
2364 : :
2365 [ - + ]: 50 : if (!mp) {
2366 : 0 : CDEV_LOG_ERR("invalid mempool");
2367 : 0 : return -EINVAL;
2368 : : }
2369 : :
2370 : 50 : session_priv_data_sz = rte_cryptodev_asym_get_private_session_size(
2371 : : dev_id);
2372 : : pool_priv = rte_mempool_get_priv(mp);
2373 : :
2374 [ - + ]: 50 : if (pool_priv->max_priv_session_sz < session_priv_data_sz) {
2375 : 0 : CDEV_LOG_DEBUG(
2376 : : "The private session data size used when creating the mempool is smaller than this device's private session data.");
2377 : 0 : return -EINVAL;
2378 : : }
2379 : :
2380 : : /* Verify if provided mempool can hold elements big enough. */
2381 [ - + ]: 50 : if (mp->elt_size < session_header_size + session_priv_data_sz) {
2382 : 0 : CDEV_LOG_ERR(
2383 : : "mempool elements too small to hold session objects");
2384 : 0 : return -EINVAL;
2385 : : }
2386 : :
2387 : : /* Allocate a session structure from the session pool */
2388 [ # # ]: 0 : if (rte_mempool_get(mp, session)) {
2389 : 0 : CDEV_LOG_ERR("couldn't get object from session mempool");
2390 : 0 : return -ENOMEM;
2391 : : }
2392 : :
2393 : 50 : sess = *session;
2394 : 50 : sess->driver_id = dev->driver_id;
2395 : 50 : sess->user_data_sz = pool_priv->user_data_sz;
2396 : 50 : sess->max_priv_data_sz = pool_priv->max_priv_session_sz;
2397 : :
2398 : : /* Clear device session pointer.*/
2399 [ + - ]: 50 : memset(sess->sess_private_data, 0, session_priv_data_sz + sess->user_data_sz);
2400 : :
2401 [ + - ]: 50 : if (dev->dev_ops->asym_session_configure == NULL)
2402 : : return -ENOTSUP;
2403 : :
2404 [ + - ]: 50 : if (sess->sess_private_data[0] == 0) {
2405 : 50 : ret = dev->dev_ops->asym_session_configure(dev, xforms, sess);
2406 [ + + ]: 50 : if (ret < 0) {
2407 : 18 : CDEV_LOG_ERR(
2408 : : "dev_id %d failed to configure session details",
2409 : : dev_id);
2410 : 18 : return ret;
2411 : : }
2412 : : }
2413 : :
2414 : 32 : rte_cryptodev_trace_asym_session_create(dev_id, xforms, mp, sess);
2415 : 32 : return 0;
2416 : : }
2417 : :
2418 : : RTE_EXPORT_SYMBOL(rte_cryptodev_sym_session_free)
2419 : : int
2420 : 266 : rte_cryptodev_sym_session_free(uint8_t dev_id, void *_sess)
2421 : : {
2422 : : struct rte_cryptodev *dev;
2423 : : struct rte_mempool *sess_mp;
2424 : : struct rte_cryptodev_sym_session *sess = _sess;
2425 : : struct rte_cryptodev_sym_session_pool_private_data *pool_priv;
2426 : :
2427 [ + - ]: 266 : if (sess == NULL)
2428 : : return -EINVAL;
2429 : :
2430 [ - + ]: 266 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
2431 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
2432 : 0 : return -EINVAL;
2433 : : }
2434 : :
2435 : 266 : dev = rte_cryptodev_pmd_get_dev(dev_id);
2436 : :
2437 [ + - ]: 266 : if (dev == NULL || sess == NULL)
2438 : : return -EINVAL;
2439 : :
2440 : : sess_mp = rte_mempool_from_obj(sess);
2441 [ + - ]: 266 : if (!sess_mp)
2442 : : return -EINVAL;
2443 : : pool_priv = rte_mempool_get_priv(sess_mp);
2444 : :
2445 [ - + ]: 266 : if (sess->driver_id != dev->driver_id) {
2446 : 0 : CDEV_LOG_ERR("Session created by driver %u but freed by %u",
2447 : : sess->driver_id, dev->driver_id);
2448 : 0 : return -EINVAL;
2449 : : }
2450 : :
2451 [ + - ]: 266 : if (dev->dev_ops->sym_session_clear == NULL)
2452 : : return -ENOTSUP;
2453 : :
2454 : 266 : dev->dev_ops->sym_session_clear(dev, sess);
2455 : :
2456 [ - + ]: 266 : memset(sess->driver_priv_data, 0, pool_priv->sess_data_sz + pool_priv->user_data_sz);
2457 : :
2458 : : /* Return session to mempool */
2459 [ - + ]: 266 : rte_mempool_put(sess_mp, sess);
2460 : :
2461 : 266 : rte_cryptodev_trace_sym_session_free(dev_id, sess);
2462 : 266 : return 0;
2463 : : }
2464 : :
2465 : : RTE_EXPORT_SYMBOL(rte_cryptodev_asym_session_free)
2466 : : int
2467 : 50 : rte_cryptodev_asym_session_free(uint8_t dev_id, void *sess)
2468 : : {
2469 : : struct rte_mempool *sess_mp;
2470 : : struct rte_cryptodev *dev;
2471 : :
2472 [ - + ]: 50 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
2473 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
2474 : 0 : return -EINVAL;
2475 : : }
2476 : :
2477 : 50 : dev = rte_cryptodev_pmd_get_dev(dev_id);
2478 : :
2479 [ + - ]: 50 : if (dev == NULL || sess == NULL)
2480 : : return -EINVAL;
2481 : :
2482 [ + - ]: 50 : if (dev->dev_ops->asym_session_clear == NULL)
2483 : : return -ENOTSUP;
2484 : :
2485 : 50 : dev->dev_ops->asym_session_clear(dev, sess);
2486 : :
2487 : 50 : rte_free(((struct rte_cryptodev_asym_session *)sess)->event_mdata);
2488 : :
2489 : : /* Return session to mempool */
2490 : : sess_mp = rte_mempool_from_obj(sess);
2491 [ - + ]: 50 : rte_mempool_put(sess_mp, sess);
2492 : :
2493 : 50 : rte_cryptodev_trace_asym_session_free(dev_id, sess);
2494 : 50 : return 0;
2495 : : }
2496 : :
2497 : : RTE_EXPORT_SYMBOL(rte_cryptodev_asym_get_header_session_size)
2498 : : unsigned int
2499 : 51 : rte_cryptodev_asym_get_header_session_size(void)
2500 : : {
2501 : 51 : return sizeof(struct rte_cryptodev_asym_session);
2502 : : }
2503 : :
2504 : : RTE_EXPORT_SYMBOL(rte_cryptodev_sym_get_private_session_size)
2505 : : unsigned int
2506 : 3788 : rte_cryptodev_sym_get_private_session_size(uint8_t dev_id)
2507 : : {
2508 : : struct rte_cryptodev *dev;
2509 : : unsigned int priv_sess_size;
2510 : :
2511 [ + - ]: 3788 : if (!rte_cryptodev_is_valid_dev(dev_id))
2512 : : return 0;
2513 : :
2514 : 3788 : dev = rte_cryptodev_pmd_get_dev(dev_id);
2515 : :
2516 [ + - ]: 3788 : if (dev->dev_ops->sym_session_get_size == NULL)
2517 : : return 0;
2518 : :
2519 : 3788 : priv_sess_size = dev->dev_ops->sym_session_get_size(dev);
2520 : :
2521 : 3788 : rte_cryptodev_trace_sym_get_private_session_size(dev_id,
2522 : : priv_sess_size);
2523 : :
2524 : 3788 : return priv_sess_size;
2525 : : }
2526 : :
2527 : : RTE_EXPORT_SYMBOL(rte_cryptodev_asym_get_private_session_size)
2528 : : unsigned int
2529 : 51 : rte_cryptodev_asym_get_private_session_size(uint8_t dev_id)
2530 : : {
2531 : : struct rte_cryptodev *dev;
2532 : : unsigned int priv_sess_size;
2533 : :
2534 [ + - ]: 51 : if (!rte_cryptodev_is_valid_dev(dev_id))
2535 : : return 0;
2536 : :
2537 : 51 : dev = rte_cryptodev_pmd_get_dev(dev_id);
2538 : :
2539 [ + - ]: 51 : if (dev->dev_ops->asym_session_get_size == NULL)
2540 : : return 0;
2541 : :
2542 : 51 : priv_sess_size = dev->dev_ops->asym_session_get_size(dev);
2543 : :
2544 : 51 : rte_cryptodev_trace_asym_get_private_session_size(dev_id,
2545 : : priv_sess_size);
2546 : :
2547 : 51 : return priv_sess_size;
2548 : : }
2549 : :
2550 : : RTE_EXPORT_SYMBOL(rte_cryptodev_sym_session_set_user_data)
2551 : : int
2552 : 0 : rte_cryptodev_sym_session_set_user_data(void *_sess, void *data,
2553 : : uint16_t size)
2554 : : {
2555 : : struct rte_cryptodev_sym_session *sess = _sess;
2556 : :
2557 [ # # ]: 0 : if (sess == NULL)
2558 : : return -EINVAL;
2559 : :
2560 [ # # ]: 0 : if (sess->user_data_sz < size)
2561 : : return -ENOMEM;
2562 : :
2563 [ # # ]: 0 : rte_memcpy(sess->driver_priv_data + sess->sess_data_sz, data, size);
2564 : :
2565 : 0 : rte_cryptodev_trace_sym_session_set_user_data(sess, data, size);
2566 : :
2567 : 0 : return 0;
2568 : : }
2569 : :
2570 : : RTE_EXPORT_SYMBOL(rte_cryptodev_sym_session_get_user_data)
2571 : : void *
2572 : 0 : rte_cryptodev_sym_session_get_user_data(void *_sess)
2573 : : {
2574 : : struct rte_cryptodev_sym_session *sess = _sess;
2575 : : void *data = NULL;
2576 : :
2577 [ # # # # ]: 0 : if (sess == NULL || sess->user_data_sz == 0)
2578 : : return NULL;
2579 : :
2580 [ # # ]: 0 : data = (void *)(sess->driver_priv_data + sess->sess_data_sz);
2581 : :
2582 : 0 : rte_cryptodev_trace_sym_session_get_user_data(sess, data);
2583 : :
2584 : 0 : return data;
2585 : : }
2586 : :
2587 : : RTE_EXPORT_SYMBOL(rte_cryptodev_asym_session_set_user_data)
2588 : : int
2589 : 0 : rte_cryptodev_asym_session_set_user_data(void *session, void *data, uint16_t size)
2590 : : {
2591 : : struct rte_cryptodev_asym_session *sess = session;
2592 [ # # ]: 0 : if (sess == NULL)
2593 : : return -EINVAL;
2594 : :
2595 [ # # ]: 0 : if (sess->user_data_sz < size)
2596 : : return -ENOMEM;
2597 : :
2598 : 0 : rte_memcpy(sess->sess_private_data +
2599 [ # # ]: 0 : sess->max_priv_data_sz,
2600 : : data, size);
2601 : :
2602 : 0 : rte_cryptodev_trace_asym_session_set_user_data(sess, data, size);
2603 : :
2604 : 0 : return 0;
2605 : : }
2606 : :
2607 : : RTE_EXPORT_SYMBOL(rte_cryptodev_asym_session_get_user_data)
2608 : : void *
2609 : 0 : rte_cryptodev_asym_session_get_user_data(void *session)
2610 : : {
2611 : : struct rte_cryptodev_asym_session *sess = session;
2612 : : void *data = NULL;
2613 : :
2614 [ # # # # ]: 0 : if (sess == NULL || sess->user_data_sz == 0)
2615 : : return NULL;
2616 : :
2617 [ # # ]: 0 : data = (void *)(sess->sess_private_data + sess->max_priv_data_sz);
2618 : :
2619 : 0 : rte_cryptodev_trace_asym_session_get_user_data(sess, data);
2620 : :
2621 : 0 : return data;
2622 : : }
2623 : :
2624 : : static inline void
2625 : : sym_crypto_fill_status(struct rte_crypto_sym_vec *vec, int32_t errnum)
2626 : : {
2627 : : uint32_t i;
2628 [ # # # # ]: 0 : for (i = 0; i < vec->num; i++)
2629 : 0 : vec->status[i] = errnum;
2630 : : }
2631 : :
2632 : : RTE_EXPORT_SYMBOL(rte_cryptodev_sym_cpu_crypto_process)
2633 : : uint32_t
2634 : 0 : rte_cryptodev_sym_cpu_crypto_process(uint8_t dev_id,
2635 : : void *_sess, union rte_crypto_sym_ofs ofs,
2636 : : struct rte_crypto_sym_vec *vec)
2637 : : {
2638 : : struct rte_cryptodev *dev;
2639 : : struct rte_cryptodev_sym_session *sess = _sess;
2640 : :
2641 [ # # ]: 0 : if (!rte_cryptodev_is_valid_dev(dev_id)) {
2642 : : sym_crypto_fill_status(vec, EINVAL);
2643 : : return 0;
2644 : : }
2645 : :
2646 : 0 : dev = rte_cryptodev_pmd_get_dev(dev_id);
2647 : :
2648 [ # # ]: 0 : if (dev->dev_ops->sym_cpu_process == NULL ||
2649 [ # # ]: 0 : !(dev->feature_flags & RTE_CRYPTODEV_FF_SYM_CPU_CRYPTO)) {
2650 : : sym_crypto_fill_status(vec, ENOTSUP);
2651 : : return 0;
2652 : : }
2653 : :
2654 : 0 : rte_cryptodev_trace_sym_cpu_crypto_process(dev_id, sess);
2655 : :
2656 : 0 : return dev->dev_ops->sym_cpu_process(dev, sess, ofs, vec);
2657 : : }
2658 : :
2659 : : RTE_EXPORT_SYMBOL(rte_cryptodev_get_raw_dp_ctx_size)
2660 : : int
2661 : 0 : rte_cryptodev_get_raw_dp_ctx_size(uint8_t dev_id)
2662 : : {
2663 : : struct rte_cryptodev *dev;
2664 : : int32_t size = sizeof(struct rte_crypto_raw_dp_ctx);
2665 : : int32_t priv_size;
2666 : :
2667 [ # # ]: 0 : if (!rte_cryptodev_is_valid_dev(dev_id))
2668 : : return -EINVAL;
2669 : :
2670 : 0 : dev = rte_cryptodev_pmd_get_dev(dev_id);
2671 : :
2672 [ # # ]: 0 : if (dev->dev_ops->sym_get_raw_dp_ctx_size == NULL ||
2673 [ # # ]: 0 : !(dev->feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)) {
2674 : : return -ENOTSUP;
2675 : : }
2676 : :
2677 : 0 : priv_size = dev->dev_ops->sym_get_raw_dp_ctx_size(dev);
2678 [ # # ]: 0 : if (priv_size < 0)
2679 : : return -ENOTSUP;
2680 : :
2681 : 0 : rte_cryptodev_trace_get_raw_dp_ctx_size(dev_id);
2682 : :
2683 : 0 : return RTE_ALIGN_CEIL((size + priv_size), 8);
2684 : : }
2685 : :
2686 : : RTE_EXPORT_SYMBOL(rte_cryptodev_configure_raw_dp_ctx)
2687 : : int
2688 : 0 : rte_cryptodev_configure_raw_dp_ctx(uint8_t dev_id, uint16_t qp_id,
2689 : : struct rte_crypto_raw_dp_ctx *ctx,
2690 : : enum rte_crypto_op_sess_type sess_type,
2691 : : union rte_cryptodev_session_ctx session_ctx,
2692 : : uint8_t is_update)
2693 : : {
2694 : : struct rte_cryptodev *dev;
2695 : :
2696 [ # # ]: 0 : if (!rte_cryptodev_get_qp_status(dev_id, qp_id))
2697 : : return -EINVAL;
2698 : :
2699 : 0 : dev = rte_cryptodev_pmd_get_dev(dev_id);
2700 [ # # ]: 0 : if (!(dev->feature_flags & RTE_CRYPTODEV_FF_SYM_RAW_DP)
2701 [ # # ]: 0 : || dev->dev_ops->sym_configure_raw_dp_ctx == NULL)
2702 : : return -ENOTSUP;
2703 : :
2704 [ # # ]: 0 : rte_cryptodev_trace_configure_raw_dp_ctx(dev_id, qp_id, sess_type);
2705 : :
2706 : 0 : return dev->dev_ops->sym_configure_raw_dp_ctx(dev, qp_id, ctx,
2707 : : sess_type, session_ctx, is_update);
2708 : : }
2709 : :
2710 : : RTE_EXPORT_SYMBOL(rte_cryptodev_session_event_mdata_set)
2711 : : int
2712 : 0 : rte_cryptodev_session_event_mdata_set(uint8_t dev_id, void *sess,
2713 : : enum rte_crypto_op_type op_type,
2714 : : enum rte_crypto_op_sess_type sess_type,
2715 : : void *ev_mdata,
2716 : : uint16_t size)
2717 : : {
2718 : : struct rte_cryptodev *dev;
2719 : :
2720 [ # # ]: 0 : if (sess == NULL || ev_mdata == NULL)
2721 : : return -EINVAL;
2722 : :
2723 [ # # ]: 0 : if (!rte_cryptodev_is_valid_dev(dev_id))
2724 : 0 : goto skip_pmd_op;
2725 : :
2726 : 0 : dev = rte_cryptodev_pmd_get_dev(dev_id);
2727 [ # # ]: 0 : if (dev->dev_ops->session_ev_mdata_set == NULL)
2728 : 0 : goto skip_pmd_op;
2729 : :
2730 [ # # ]: 0 : rte_cryptodev_trace_session_event_mdata_set(dev_id, sess, op_type,
2731 : : sess_type, ev_mdata, size);
2732 : :
2733 : 0 : return dev->dev_ops->session_ev_mdata_set(dev, sess, op_type, sess_type, ev_mdata);
2734 : :
2735 : 0 : skip_pmd_op:
2736 [ # # ]: 0 : if (op_type == RTE_CRYPTO_OP_TYPE_SYMMETRIC)
2737 : 0 : return rte_cryptodev_sym_session_set_user_data(sess, ev_mdata,
2738 : : size);
2739 [ # # ]: 0 : else if (op_type == RTE_CRYPTO_OP_TYPE_ASYMMETRIC) {
2740 : : struct rte_cryptodev_asym_session *s = sess;
2741 : :
2742 [ # # ]: 0 : if (s->event_mdata == NULL) {
2743 : 0 : s->event_mdata = rte_malloc(NULL, size, 0);
2744 [ # # ]: 0 : if (s->event_mdata == NULL)
2745 : : return -ENOMEM;
2746 : : }
2747 [ # # ]: 0 : rte_memcpy(s->event_mdata, ev_mdata, size);
2748 : :
2749 : 0 : return 0;
2750 : : } else
2751 : : return -ENOTSUP;
2752 : : }
2753 : :
2754 : : RTE_EXPORT_SYMBOL(rte_cryptodev_raw_enqueue_burst)
2755 : : uint32_t
2756 : 0 : rte_cryptodev_raw_enqueue_burst(struct rte_crypto_raw_dp_ctx *ctx,
2757 : : struct rte_crypto_sym_vec *vec, union rte_crypto_sym_ofs ofs,
2758 : : void **user_data, int *enqueue_status)
2759 : : {
2760 : 0 : return ctx->enqueue_burst(ctx->qp_data, ctx->drv_ctx_data, vec,
2761 : : ofs, user_data, enqueue_status);
2762 : : }
2763 : :
2764 : : RTE_EXPORT_SYMBOL(rte_cryptodev_raw_enqueue_done)
2765 : : int
2766 : 0 : rte_cryptodev_raw_enqueue_done(struct rte_crypto_raw_dp_ctx *ctx,
2767 : : uint32_t n)
2768 : : {
2769 : 0 : return ctx->enqueue_done(ctx->qp_data, ctx->drv_ctx_data, n);
2770 : : }
2771 : :
2772 : : RTE_EXPORT_SYMBOL(rte_cryptodev_raw_dequeue_burst)
2773 : : uint32_t
2774 : 0 : rte_cryptodev_raw_dequeue_burst(struct rte_crypto_raw_dp_ctx *ctx,
2775 : : rte_cryptodev_raw_get_dequeue_count_t get_dequeue_count,
2776 : : uint32_t max_nb_to_dequeue,
2777 : : rte_cryptodev_raw_post_dequeue_t post_dequeue,
2778 : : void **out_user_data, uint8_t is_user_data_array,
2779 : : uint32_t *n_success_jobs, int *status)
2780 : : {
2781 : 0 : return ctx->dequeue_burst(ctx->qp_data, ctx->drv_ctx_data,
2782 : : get_dequeue_count, max_nb_to_dequeue, post_dequeue,
2783 : : out_user_data, is_user_data_array, n_success_jobs, status);
2784 : : }
2785 : :
2786 : : RTE_EXPORT_SYMBOL(rte_cryptodev_raw_dequeue_done)
2787 : : int
2788 : 0 : rte_cryptodev_raw_dequeue_done(struct rte_crypto_raw_dp_ctx *ctx,
2789 : : uint32_t n)
2790 : : {
2791 : 0 : return ctx->dequeue_done(ctx->qp_data, ctx->drv_ctx_data, n);
2792 : : }
2793 : :
2794 : : /** Initialise rte_crypto_op mempool element */
2795 : : static void
2796 : 8201 : rte_crypto_op_init(struct rte_mempool *mempool,
2797 : : void *opaque_arg,
2798 : : void *_op_data,
2799 : : __rte_unused unsigned i)
2800 : : {
2801 : : struct rte_crypto_op *op = _op_data;
2802 : 8201 : enum rte_crypto_op_type type = *(enum rte_crypto_op_type *)opaque_arg;
2803 : :
2804 : 8201 : memset(_op_data, 0, mempool->elt_size);
2805 : :
2806 : 8201 : __rte_crypto_op_reset(op, type);
2807 : :
2808 : 8201 : op->phys_addr = rte_mempool_virt2iova(_op_data);
2809 : 8201 : op->mempool = mempool;
2810 : 8201 : }
2811 : :
2812 : :
2813 : : RTE_EXPORT_SYMBOL(rte_crypto_op_pool_create)
2814 : : struct rte_mempool *
2815 : 2 : rte_crypto_op_pool_create(const char *name, enum rte_crypto_op_type type,
2816 : : unsigned nb_elts, unsigned cache_size, uint16_t priv_size,
2817 : : int socket_id)
2818 : : {
2819 : : struct rte_crypto_op_pool_private *priv;
2820 : :
2821 : 2 : unsigned elt_size = sizeof(struct rte_crypto_op) +
2822 : : priv_size;
2823 : :
2824 [ + + ]: 2 : if (type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) {
2825 : 1 : elt_size += sizeof(struct rte_crypto_sym_op);
2826 [ + - ]: 1 : } else if (type == RTE_CRYPTO_OP_TYPE_ASYMMETRIC) {
2827 : 1 : elt_size += sizeof(struct rte_crypto_asym_op);
2828 [ # # ]: 0 : } else if (type == RTE_CRYPTO_OP_TYPE_UNDEFINED) {
2829 : 0 : elt_size += RTE_MAX(sizeof(struct rte_crypto_sym_op),
2830 : : sizeof(struct rte_crypto_asym_op));
2831 : : } else {
2832 : 0 : CDEV_LOG_ERR("Invalid op_type");
2833 : 0 : return NULL;
2834 : : }
2835 : :
2836 : : /* lookup mempool in case already allocated */
2837 : 2 : struct rte_mempool *mp = rte_mempool_lookup(name);
2838 : :
2839 [ - + ]: 2 : if (mp != NULL) {
2840 : : priv = (struct rte_crypto_op_pool_private *)
2841 : : rte_mempool_get_priv(mp);
2842 : :
2843 [ # # # # ]: 0 : if (mp->elt_size != elt_size ||
2844 : 0 : mp->cache_size < cache_size ||
2845 [ # # ]: 0 : mp->size < nb_elts ||
2846 [ # # ]: 0 : priv->priv_size < priv_size) {
2847 : : mp = NULL;
2848 : 0 : CDEV_LOG_ERR("Mempool %s already exists but with "
2849 : : "incompatible parameters", name);
2850 : 0 : return NULL;
2851 : : }
2852 : : return mp;
2853 : : }
2854 : :
2855 : 2 : mp = rte_mempool_create(
2856 : : name,
2857 : : nb_elts,
2858 : : elt_size,
2859 : : cache_size,
2860 : : sizeof(struct rte_crypto_op_pool_private),
2861 : : NULL,
2862 : : NULL,
2863 : : rte_crypto_op_init,
2864 : : &type,
2865 : : socket_id,
2866 : : 0);
2867 : :
2868 [ - + ]: 2 : if (mp == NULL) {
2869 : 0 : CDEV_LOG_ERR("Failed to create mempool %s", name);
2870 : 0 : return NULL;
2871 : : }
2872 : :
2873 : : priv = (struct rte_crypto_op_pool_private *)
2874 : : rte_mempool_get_priv(mp);
2875 : :
2876 : 2 : priv->priv_size = priv_size;
2877 : 2 : priv->type = type;
2878 : :
2879 [ - + ]: 2 : rte_cryptodev_trace_op_pool_create(name, socket_id, type, nb_elts, mp);
2880 : 2 : return mp;
2881 : : }
2882 : :
2883 : : RTE_EXPORT_INTERNAL_SYMBOL(rte_cryptodev_pmd_create_dev_name)
2884 : : int
2885 : 0 : rte_cryptodev_pmd_create_dev_name(char *name, const char *dev_name_prefix)
2886 : : {
2887 : : struct rte_cryptodev *dev = NULL;
2888 : : uint32_t i = 0;
2889 : :
2890 [ # # ]: 0 : if (name == NULL)
2891 : : return -EINVAL;
2892 : :
2893 [ # # ]: 0 : for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++) {
2894 : : int ret = snprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN,
2895 : : "%s_%u", dev_name_prefix, i);
2896 : :
2897 [ # # ]: 0 : if (ret < 0)
2898 : 0 : return ret;
2899 : :
2900 : 0 : dev = rte_cryptodev_pmd_get_named_dev(name);
2901 [ # # ]: 0 : if (!dev)
2902 : : return 0;
2903 : : }
2904 : :
2905 : : return -1;
2906 : : }
2907 : :
2908 : : TAILQ_HEAD(cryptodev_driver_list, cryptodev_driver);
2909 : :
2910 : : static struct cryptodev_driver_list cryptodev_driver_list =
2911 : : TAILQ_HEAD_INITIALIZER(cryptodev_driver_list);
2912 : :
2913 : : RTE_EXPORT_SYMBOL(rte_cryptodev_driver_id_get)
2914 : : int
2915 : 7 : rte_cryptodev_driver_id_get(const char *name)
2916 : : {
2917 : : struct cryptodev_driver *driver;
2918 : : const char *driver_name;
2919 : : int driver_id = -1;
2920 : :
2921 [ - + ]: 7 : if (name == NULL) {
2922 : 0 : CDEV_LOG_DEBUG("name pointer NULL");
2923 : 0 : return -1;
2924 : : }
2925 : :
2926 [ + + ]: 127 : TAILQ_FOREACH(driver, &cryptodev_driver_list, next) {
2927 : 125 : driver_name = driver->driver->name;
2928 [ + + ]: 125 : if (strncmp(driver_name, name, strlen(driver_name) + 1) == 0) {
2929 : 5 : driver_id = driver->id;
2930 : 5 : break;
2931 : : }
2932 : : }
2933 : :
2934 : 7 : rte_cryptodev_trace_driver_id_get(name, driver_id);
2935 : :
2936 : 7 : return driver_id;
2937 : : }
2938 : :
2939 : : RTE_EXPORT_SYMBOL(rte_cryptodev_name_get)
2940 : : const char *
2941 : 0 : rte_cryptodev_name_get(uint8_t dev_id)
2942 : : {
2943 : : struct rte_cryptodev *dev;
2944 : :
2945 [ # # ]: 0 : if (!rte_cryptodev_is_valid_device_data(dev_id)) {
2946 : 0 : CDEV_LOG_ERR("Invalid dev_id=%" PRIu8, dev_id);
2947 : 0 : return NULL;
2948 : : }
2949 : :
2950 : 0 : dev = rte_cryptodev_pmd_get_dev(dev_id);
2951 [ # # ]: 0 : if (dev == NULL)
2952 : : return NULL;
2953 : :
2954 [ # # ]: 0 : rte_cryptodev_trace_name_get(dev_id, dev->data->name);
2955 : :
2956 : 0 : return dev->data->name;
2957 : : }
2958 : :
2959 : : RTE_EXPORT_SYMBOL(rte_cryptodev_driver_name_get)
2960 : : const char *
2961 : 1 : rte_cryptodev_driver_name_get(uint8_t driver_id)
2962 : : {
2963 : : struct cryptodev_driver *driver;
2964 : :
2965 [ + - ]: 17 : TAILQ_FOREACH(driver, &cryptodev_driver_list, next) {
2966 [ + + ]: 17 : if (driver->id == driver_id) {
2967 : 1 : rte_cryptodev_trace_driver_name_get(driver_id,
2968 [ - + ]: 1 : driver->driver->name);
2969 : 1 : return driver->driver->name;
2970 : : }
2971 : : }
2972 : : return NULL;
2973 : : }
2974 : :
2975 : : RTE_EXPORT_INTERNAL_SYMBOL(rte_cryptodev_allocate_driver)
2976 : : uint8_t
2977 : 5520 : rte_cryptodev_allocate_driver(struct cryptodev_driver *crypto_drv,
2978 : : const struct rte_driver *drv)
2979 : : {
2980 : 5520 : crypto_drv->driver = drv;
2981 : 5520 : crypto_drv->id = nb_drivers;
2982 : :
2983 : 5520 : TAILQ_INSERT_TAIL(&cryptodev_driver_list, crypto_drv, next);
2984 : :
2985 [ - + ]: 5520 : rte_cryptodev_trace_allocate_driver(drv->name);
2986 : :
2987 : 5520 : return nb_drivers++;
2988 : : }
2989 : :
2990 : 276 : RTE_INIT(cryptodev_init_fp_ops)
2991 : : {
2992 : : uint32_t i;
2993 : :
2994 [ + + ]: 17940 : for (i = 0; i != RTE_DIM(rte_crypto_fp_ops); i++)
2995 : 17664 : cryptodev_fp_ops_reset(rte_crypto_fp_ops + i);
2996 : 276 : }
2997 : :
2998 : : static int
2999 : 3 : cryptodev_handle_dev_list(const char *cmd __rte_unused,
3000 : : const char *params __rte_unused,
3001 : : struct rte_tel_data *d)
3002 : : {
3003 : : int dev_id;
3004 : :
3005 [ + - ]: 3 : if (rte_cryptodev_count() < 1)
3006 : : return -EINVAL;
3007 : :
3008 : 3 : rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
3009 [ + + ]: 195 : for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++)
3010 [ + + ]: 192 : if (rte_cryptodev_is_valid_dev(dev_id))
3011 : 3 : rte_tel_data_add_array_int(d, dev_id);
3012 : :
3013 : : return 0;
3014 : : }
3015 : :
3016 : : static int
3017 : 3 : cryptodev_handle_dev_info(const char *cmd __rte_unused,
3018 : : const char *params, struct rte_tel_data *d)
3019 : : {
3020 : : struct rte_cryptodev_info cryptodev_info;
3021 : : int dev_id;
3022 : : char *end_param;
3023 : :
3024 [ + + + - : 3 : if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+ + ]
3025 : : return -EINVAL;
3026 : :
3027 : 1 : dev_id = strtoul(params, &end_param, 0);
3028 [ - + ]: 1 : if (*end_param != '\0')
3029 : 0 : CDEV_LOG_ERR("Extra parameters passed to command, ignoring");
3030 [ + - ]: 1 : if (!rte_cryptodev_is_valid_dev(dev_id))
3031 : : return -EINVAL;
3032 : :
3033 : 1 : rte_cryptodev_info_get(dev_id, &cryptodev_info);
3034 : :
3035 : 1 : rte_tel_data_start_dict(d);
3036 : 1 : rte_tel_data_add_dict_string(d, "device_name",
3037 : 1 : cryptodev_info.device->name);
3038 : 1 : rte_tel_data_add_dict_uint(d, "max_nb_queue_pairs",
3039 : 1 : cryptodev_info.max_nb_queue_pairs);
3040 : :
3041 : 1 : return 0;
3042 : : }
3043 : :
3044 : : #define ADD_DICT_STAT(s) rte_tel_data_add_dict_uint(d, #s, cryptodev_stats.s)
3045 : :
3046 : : static int
3047 : 3 : cryptodev_handle_dev_stats(const char *cmd __rte_unused,
3048 : : const char *params,
3049 : : struct rte_tel_data *d)
3050 : : {
3051 : : struct rte_cryptodev_stats cryptodev_stats;
3052 : : int dev_id, ret;
3053 : : char *end_param;
3054 : :
3055 [ + + + - : 3 : if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+ + ]
3056 : : return -EINVAL;
3057 : :
3058 : 1 : dev_id = strtoul(params, &end_param, 0);
3059 [ - + ]: 1 : if (*end_param != '\0')
3060 : 0 : CDEV_LOG_ERR("Extra parameters passed to command, ignoring");
3061 [ + - ]: 1 : if (!rte_cryptodev_is_valid_dev(dev_id))
3062 : : return -EINVAL;
3063 : :
3064 : 1 : ret = rte_cryptodev_stats_get(dev_id, &cryptodev_stats);
3065 [ + - ]: 1 : if (ret < 0)
3066 : : return ret;
3067 : :
3068 : 1 : rte_tel_data_start_dict(d);
3069 : 1 : ADD_DICT_STAT(enqueued_count);
3070 : 1 : ADD_DICT_STAT(dequeued_count);
3071 : 1 : ADD_DICT_STAT(enqueue_err_count);
3072 : 1 : ADD_DICT_STAT(dequeue_err_count);
3073 : :
3074 : 1 : return 0;
3075 : : }
3076 : :
3077 : : #define CRYPTO_CAPS_SZ \
3078 : : (RTE_ALIGN_CEIL(sizeof(struct rte_cryptodev_capabilities), \
3079 : : sizeof(uint64_t)) / \
3080 : : sizeof(uint64_t))
3081 : :
3082 : : static int
3083 : 1 : crypto_caps_array(struct rte_tel_data *d,
3084 : : const struct rte_cryptodev_capabilities *capabilities)
3085 : : {
3086 : : const struct rte_cryptodev_capabilities *dev_caps;
3087 : : uint64_t caps_val[CRYPTO_CAPS_SZ];
3088 : : unsigned int i = 0, j;
3089 : :
3090 : 1 : rte_tel_data_start_array(d, RTE_TEL_UINT_VAL);
3091 : :
3092 [ + + ]: 3 : while ((dev_caps = &capabilities[i++])->op !=
3093 : : RTE_CRYPTO_OP_TYPE_UNDEFINED) {
3094 : : memset(&caps_val, 0, CRYPTO_CAPS_SZ * sizeof(caps_val[0]));
3095 : : rte_memcpy(caps_val, dev_caps, sizeof(capabilities[0]));
3096 [ + + ]: 14 : for (j = 0; j < CRYPTO_CAPS_SZ; j++)
3097 : 12 : rte_tel_data_add_array_uint(d, caps_val[j]);
3098 : : }
3099 : :
3100 : 1 : return i;
3101 : : }
3102 : :
3103 : : static int
3104 : 3 : cryptodev_handle_dev_caps(const char *cmd __rte_unused, const char *params,
3105 : : struct rte_tel_data *d)
3106 : : {
3107 : : struct rte_cryptodev_info dev_info;
3108 : : struct rte_tel_data *crypto_caps;
3109 : : int crypto_caps_n;
3110 : : char *end_param;
3111 : : int dev_id;
3112 : :
3113 [ + + + - : 3 : if (!params || strlen(params) == 0 || !isdigit(*params))
+ + ]
3114 : : return -EINVAL;
3115 : :
3116 : 1 : dev_id = strtoul(params, &end_param, 0);
3117 [ - + ]: 1 : if (*end_param != '\0')
3118 : 0 : CDEV_LOG_ERR("Extra parameters passed to command, ignoring");
3119 [ + - ]: 1 : if (!rte_cryptodev_is_valid_dev(dev_id))
3120 : : return -EINVAL;
3121 : :
3122 : 1 : rte_tel_data_start_dict(d);
3123 : 1 : crypto_caps = rte_tel_data_alloc();
3124 [ + - ]: 1 : if (!crypto_caps)
3125 : : return -ENOMEM;
3126 : :
3127 : 1 : rte_cryptodev_info_get(dev_id, &dev_info);
3128 : 1 : crypto_caps_n = crypto_caps_array(crypto_caps, dev_info.capabilities);
3129 : 1 : rte_tel_data_add_dict_container(d, "crypto_caps", crypto_caps, 0);
3130 : 1 : rte_tel_data_add_dict_int(d, "crypto_caps_n", crypto_caps_n);
3131 : :
3132 : 1 : return 0;
3133 : : }
3134 : :
3135 : 276 : RTE_INIT(cryptodev_init_telemetry)
3136 : : {
3137 : 276 : rte_telemetry_register_cmd("/cryptodev/info", cryptodev_handle_dev_info,
3138 : : "Returns information for a cryptodev. Parameters: int dev_id");
3139 : 276 : rte_telemetry_register_cmd("/cryptodev/list",
3140 : : cryptodev_handle_dev_list,
3141 : : "Returns list of available crypto devices by IDs. No parameters.");
3142 : 276 : rte_telemetry_register_cmd("/cryptodev/stats",
3143 : : cryptodev_handle_dev_stats,
3144 : : "Returns the stats for a cryptodev. Parameters: int dev_id");
3145 : 276 : rte_telemetry_register_cmd("/cryptodev/caps",
3146 : : cryptodev_handle_dev_caps,
3147 : : "Returns the capabilities for a cryptodev. Parameters: int dev_id");
3148 : 276 : }
|