LCOV - code coverage report
Current view: top level - drivers/crypto/mlx5 - mlx5_crypto.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 8 228 3.5 %
Date: 2026-08-01 17:54:00 Functions: 3 18 16.7 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 2 114 1.8 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright (c) 2021 NVIDIA Corporation & Affiliates
       3                 :            :  */
       4                 :            : 
       5                 :            : #include <rte_malloc.h>
       6                 :            : #include <rte_mempool.h>
       7                 :            : #include <rte_eal_paging.h>
       8                 :            : #include <rte_errno.h>
       9                 :            : #include <rte_log.h>
      10                 :            : #include <bus_pci_driver.h>
      11                 :            : #include <rte_memory.h>
      12                 :            : 
      13                 :            : #include <mlx5_glue.h>
      14                 :            : #include <mlx5_common.h>
      15                 :            : #include <mlx5_devx_cmds.h>
      16                 :            : #include <mlx5_common_os.h>
      17                 :            : 
      18                 :            : #include "mlx5_crypto_utils.h"
      19                 :            : #include "mlx5_crypto.h"
      20                 :            : 
      21                 :            : #define MLX5_CRYPTO_DRIVER_NAME crypto_mlx5
      22                 :            : #define MLX5_CRYPTO_MAX_QPS 128
      23                 :            : 
      24                 :            : #define MLX5_CRYPTO_FEATURE_FLAGS(wrapped_mode) \
      25                 :            :         (RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO | RTE_CRYPTODEV_FF_HW_ACCELERATED | \
      26                 :            :          RTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT | \
      27                 :            :          (wrapped_mode ? RTE_CRYPTODEV_FF_CIPHER_WRAPPED_KEY : 0) | \
      28                 :            :          RTE_CRYPTODEV_FF_CIPHER_MULTIPLE_DATA_UNITS)
      29                 :            : 
      30                 :            : TAILQ_HEAD(mlx5_crypto_privs, mlx5_crypto_priv) mlx5_crypto_priv_list =
      31                 :            :                                 TAILQ_HEAD_INITIALIZER(mlx5_crypto_priv_list);
      32                 :            : static pthread_mutex_t priv_list_lock;
      33                 :            : 
      34                 :            : int mlx5_crypto_logtype;
      35                 :            : 
      36                 :            : uint8_t mlx5_crypto_driver_id;
      37                 :            : 
      38                 :            : static const char mlx5_crypto_drv_name[] = RTE_STR(MLX5_CRYPTO_DRIVER_NAME);
      39                 :            : 
      40                 :            : static const struct rte_driver mlx5_drv = {
      41                 :            :         .name = mlx5_crypto_drv_name,
      42                 :            :         .alias = mlx5_crypto_drv_name
      43                 :            : };
      44                 :            : 
      45                 :            : static struct cryptodev_driver mlx5_cryptodev_driver;
      46                 :            : 
      47                 :            : static void
      48                 :          0 : mlx5_crypto_dev_infos_get(struct rte_cryptodev *dev,
      49                 :            :                           struct rte_cryptodev_info *dev_info)
      50                 :            : {
      51                 :          0 :         struct mlx5_crypto_priv *priv = dev->data->dev_private;
      52                 :            : 
      53                 :            :         RTE_SET_USED(dev);
      54         [ #  # ]:          0 :         if (dev_info != NULL) {
      55                 :          0 :                 dev_info->driver_id = mlx5_crypto_driver_id;
      56                 :          0 :                 dev_info->feature_flags =
      57         [ #  # ]:          0 :                         MLX5_CRYPTO_FEATURE_FLAGS(priv->is_wrapped_mode);
      58         [ #  # ]:          0 :                 if (!mlx5_crypto_is_ipsec_opt(priv))
      59                 :          0 :                         dev_info->feature_flags |=
      60                 :            :                                 RTE_CRYPTODEV_FF_IN_PLACE_SGL |
      61                 :            :                                 RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT |
      62                 :            :                                 RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT |
      63                 :            :                                 RTE_CRYPTODEV_FF_OOP_LB_IN_SGL_OUT;
      64                 :            : 
      65                 :          0 :                 dev_info->capabilities = priv->caps;
      66                 :          0 :                 dev_info->max_nb_queue_pairs = MLX5_CRYPTO_MAX_QPS;
      67         [ #  # ]:          0 :                 if (priv->caps->sym.xform_type == RTE_CRYPTO_SYM_XFORM_AEAD) {
      68                 :          0 :                         dev_info->min_mbuf_headroom_req = MLX5_CRYPTO_GCM_MAX_AAD;
      69                 :          0 :                         dev_info->min_mbuf_tailroom_req = MLX5_CRYPTO_GCM_MAX_DIGEST;
      70                 :            :                 } else {
      71                 :          0 :                         dev_info->min_mbuf_headroom_req = 0;
      72                 :          0 :                         dev_info->min_mbuf_tailroom_req = 0;
      73                 :            :                 }
      74                 :          0 :                 dev_info->sym.max_nb_sessions = 0;
      75                 :            :                 /*
      76                 :            :                  * If 0, the device does not have any limitation in number of
      77                 :            :                  * sessions that can be used.
      78                 :            :                  */
      79                 :            :         }
      80                 :          0 : }
      81                 :            : 
      82                 :            : void
      83                 :          0 : mlx5_crypto_indirect_mkeys_release(struct mlx5_crypto_qp *qp,
      84                 :            :                                    uint16_t n)
      85                 :            : {
      86                 :            :         uint32_t i;
      87                 :            : 
      88         [ #  # ]:          0 :         for (i = 0; i < n; i++)
      89         [ #  # ]:          0 :                 if (qp->mkey[i])
      90                 :          0 :                         claim_zero(mlx5_devx_cmd_destroy(qp->mkey[i]));
      91                 :          0 : }
      92                 :            : 
      93                 :            : int
      94                 :          0 : mlx5_crypto_indirect_mkeys_prepare(struct mlx5_crypto_priv *priv,
      95                 :            :                                    struct mlx5_crypto_qp *qp,
      96                 :            :                                    struct mlx5_devx_mkey_attr *attr,
      97                 :            :                                    mlx5_crypto_mkey_update_t update_cb)
      98                 :            : {
      99                 :            :         uint32_t i;
     100                 :          0 :         struct mlx5_hca_attr *hca_attr = &priv->cdev->config.hca_attr;
     101                 :            : 
     102                 :            :         /* If only relaxed order is allowed. */
     103         [ #  # ]:          0 :         if (hca_attr->mkc_order_write_after_write_ro_only)
     104                 :          0 :                 mlx5_devx_mkey_attr_set_ordering(attr, hca_attr);
     105         [ #  # ]:          0 :         for (i = 0; i < qp->entries_n; i++) {
     106                 :          0 :                 attr->klm_array = update_cb(priv, qp, i);
     107                 :          0 :                 qp->mkey[i] = mlx5_devx_cmd_mkey_create(priv->cdev->ctx, attr);
     108         [ #  # ]:          0 :                 if (!qp->mkey[i])
     109                 :          0 :                         goto error;
     110                 :            :         }
     111                 :            :         return 0;
     112                 :            : error:
     113                 :          0 :         DRV_LOG(ERR, "Failed to allocate indirect mkey.");
     114                 :          0 :         mlx5_crypto_indirect_mkeys_release(qp, i);
     115                 :          0 :         return -1;
     116                 :            : }
     117                 :            : 
     118                 :            : static int
     119                 :          0 : mlx5_crypto_dev_configure(struct rte_cryptodev *dev,
     120                 :            :                           struct rte_cryptodev_config *config)
     121                 :            : {
     122                 :          0 :         struct mlx5_crypto_priv *priv = dev->data->dev_private;
     123                 :            : 
     124         [ #  # ]:          0 :         if (config == NULL) {
     125                 :          0 :                 DRV_LOG(ERR, "Invalid crypto dev configure parameters.");
     126                 :          0 :                 return -EINVAL;
     127                 :            :         }
     128         [ #  # ]:          0 :         if ((config->ff_disable & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) != 0) {
     129                 :          0 :                 DRV_LOG(ERR,
     130                 :            :                         "Disabled symmetric crypto feature is not supported.");
     131                 :          0 :                 return -ENOTSUP;
     132                 :            :         }
     133         [ #  # ]:          0 :         if (mlx5_crypto_dek_setup(priv) != 0) {
     134                 :          0 :                 DRV_LOG(ERR, "Dek hash list creation has failed.");
     135                 :          0 :                 return -ENOMEM;
     136                 :            :         }
     137                 :          0 :         priv->dev_config = *config;
     138                 :          0 :         DRV_LOG(DEBUG, "Device %u was configured.", dev->driver_id);
     139                 :          0 :         return 0;
     140                 :            : }
     141                 :            : 
     142                 :            : static void
     143                 :          0 : mlx5_crypto_dev_stop(struct rte_cryptodev *dev)
     144                 :            : {
     145                 :            :         RTE_SET_USED(dev);
     146                 :          0 : }
     147                 :            : 
     148                 :            : static int
     149                 :          0 : mlx5_crypto_dev_start(struct rte_cryptodev *dev)
     150                 :            : {
     151                 :          0 :         struct mlx5_crypto_priv *priv = dev->data->dev_private;
     152                 :            : 
     153                 :          0 :         return mlx5_dev_mempool_subscribe(priv->cdev);
     154                 :            : }
     155                 :            : 
     156                 :            : static int
     157                 :          0 : mlx5_crypto_dev_close(struct rte_cryptodev *dev)
     158                 :            : {
     159                 :          0 :         struct mlx5_crypto_priv *priv = dev->data->dev_private;
     160                 :            : 
     161                 :          0 :         mlx5_crypto_dek_unset(priv);
     162                 :          0 :         DRV_LOG(DEBUG, "Device %u was closed.", dev->driver_id);
     163                 :          0 :         return 0;
     164                 :            : }
     165                 :            : 
     166                 :            : static unsigned int
     167                 :          0 : mlx5_crypto_sym_session_get_size(struct rte_cryptodev *dev __rte_unused)
     168                 :            : {
     169                 :          0 :         return sizeof(struct mlx5_crypto_session);
     170                 :            : }
     171                 :            : 
     172                 :            : static void
     173                 :          0 : mlx5_crypto_sym_session_clear(struct rte_cryptodev *dev,
     174                 :            :                               struct rte_cryptodev_sym_session *sess)
     175                 :            : {
     176                 :          0 :         struct mlx5_crypto_priv *priv = dev->data->dev_private;
     177                 :          0 :         struct mlx5_crypto_session *spriv = CRYPTODEV_GET_SYM_SESS_PRIV(sess);
     178                 :            : 
     179                 :            :         if (unlikely(spriv == NULL)) {
     180                 :            :                 DRV_LOG(ERR, "Failed to get session %p private data.", spriv);
     181                 :            :                 return;
     182                 :            :         }
     183                 :          0 :         mlx5_crypto_dek_destroy(priv, spriv->dek);
     184                 :          0 :         DRV_LOG(DEBUG, "Session %p was cleared.", spriv);
     185                 :            : }
     186                 :            : 
     187                 :            : static void
     188                 :          0 : mlx5_crypto_stats_get(struct rte_cryptodev *dev,
     189                 :            :                       struct rte_cryptodev_stats *stats)
     190                 :            : {
     191                 :            :         int qp_id;
     192                 :            : 
     193         [ #  # ]:          0 :         for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
     194                 :          0 :                 struct mlx5_crypto_qp *qp = dev->data->queue_pairs[qp_id];
     195                 :            : 
     196                 :          0 :                 stats->enqueued_count += qp->stats.enqueued_count;
     197                 :          0 :                 stats->dequeued_count += qp->stats.dequeued_count;
     198                 :          0 :                 stats->enqueue_err_count += qp->stats.enqueue_err_count;
     199                 :          0 :                 stats->dequeue_err_count += qp->stats.dequeue_err_count;
     200                 :            :         }
     201                 :          0 : }
     202                 :            : 
     203                 :            : static void
     204                 :          0 : mlx5_crypto_stats_reset(struct rte_cryptodev *dev)
     205                 :            : {
     206                 :            :         int qp_id;
     207                 :            : 
     208         [ #  # ]:          0 :         for (qp_id = 0; qp_id < dev->data->nb_queue_pairs; qp_id++) {
     209                 :          0 :                 struct mlx5_crypto_qp *qp = dev->data->queue_pairs[qp_id];
     210                 :            : 
     211                 :          0 :                 memset(&qp->stats, 0, sizeof(qp->stats));
     212                 :            :         }
     213                 :          0 : }
     214                 :            : 
     215                 :            : static struct rte_cryptodev_ops mlx5_crypto_ops = {
     216                 :            :         .dev_configure                  = mlx5_crypto_dev_configure,
     217                 :            :         .dev_start                      = mlx5_crypto_dev_start,
     218                 :            :         .dev_stop                       = mlx5_crypto_dev_stop,
     219                 :            :         .dev_close                      = mlx5_crypto_dev_close,
     220                 :            :         .dev_infos_get                  = mlx5_crypto_dev_infos_get,
     221                 :            :         .stats_get                      = mlx5_crypto_stats_get,
     222                 :            :         .stats_reset                    = mlx5_crypto_stats_reset,
     223                 :            :         .sym_session_get_size           = mlx5_crypto_sym_session_get_size,
     224                 :            :         .sym_session_clear              = mlx5_crypto_sym_session_clear,
     225                 :            :         .sym_get_raw_dp_ctx_size        = NULL,
     226                 :            :         .sym_configure_raw_dp_ctx       = NULL,
     227                 :            : };
     228                 :            : 
     229                 :            : static int
     230                 :          0 : mlx5_crypto_args_check_handler(const char *key, const char *val, void *opaque)
     231                 :            : {
     232                 :            :         struct mlx5_crypto_devarg_params *devarg_prms = opaque;
     233                 :            :         struct mlx5_devx_crypto_login_attr *attr = &devarg_prms->login_attr;
     234                 :            :         unsigned long tmp;
     235                 :            :         FILE *file;
     236                 :            :         int ret;
     237                 :            :         int i;
     238                 :            : 
     239         [ #  # ]:          0 :         if (strcmp(key, "wcs_file") == 0) {
     240                 :          0 :                 file = fopen(val, "rb");
     241         [ #  # ]:          0 :                 if (file == NULL) {
     242                 :          0 :                         rte_errno = ENOTSUP;
     243                 :          0 :                         return -rte_errno;
     244                 :            :                 }
     245         [ #  # ]:          0 :                 for (i = 0 ; i < MLX5_CRYPTO_CREDENTIAL_SIZE ; i++) {
     246                 :          0 :                         ret = fscanf(file, "%02hhX", &attr->credential[i]);
     247         [ #  # ]:          0 :                         if (ret <= 0) {
     248                 :          0 :                                 fclose(file);
     249                 :          0 :                                 DRV_LOG(ERR,
     250                 :            :                                         "Failed to read credential from file.");
     251                 :          0 :                                 rte_errno = EINVAL;
     252                 :          0 :                                 return -rte_errno;
     253                 :            :                         }
     254                 :            :                 }
     255                 :          0 :                 fclose(file);
     256                 :          0 :                 devarg_prms->login_devarg = true;
     257                 :          0 :                 return 0;
     258         [ #  # ]:          0 :         } else if (strcmp(key, "crypto_mode") == 0) {
     259         [ #  # ]:          0 :                 if (strcmp(val, "full_capable") == 0) {
     260                 :          0 :                         devarg_prms->crypto_mode = MLX5_CRYPTO_FULL_CAPABLE;
     261         [ #  # ]:          0 :                 } else if (strcmp(val, "ipsec_opt") == 0) {
     262                 :          0 :                         devarg_prms->crypto_mode = MLX5_CRYPTO_IPSEC_OPT;
     263                 :            :                 } else {
     264                 :          0 :                         DRV_LOG(ERR, "Invalid crypto mode: %s", val);
     265                 :          0 :                         rte_errno = EINVAL;
     266                 :          0 :                         return -rte_errno;
     267                 :            :                 }
     268                 :            :         }
     269                 :          0 :         errno = 0;
     270                 :          0 :         tmp = strtoul(val, NULL, 0);
     271         [ #  # ]:          0 :         if (errno) {
     272                 :          0 :                 DRV_LOG(WARNING, "%s: \"%s\" is an invalid integer.", key, val);
     273                 :          0 :                 return -errno;
     274                 :            :         }
     275         [ #  # ]:          0 :         if (strcmp(key, "max_segs_num") == 0) {
     276         [ #  # ]:          0 :                 if (!tmp) {
     277                 :          0 :                         DRV_LOG(ERR, "max_segs_num must be greater than 0.");
     278                 :          0 :                         rte_errno = EINVAL;
     279                 :          0 :                         return -rte_errno;
     280                 :            :                 }
     281                 :          0 :                 devarg_prms->max_segs_num = (uint32_t)tmp;
     282         [ #  # ]:          0 :         } else if (strcmp(key, "import_kek_id") == 0) {
     283                 :          0 :                 attr->session_import_kek_ptr = (uint32_t)tmp;
     284         [ #  # ]:          0 :         } else if (strcmp(key, "credential_id") == 0) {
     285                 :          0 :                 attr->credential_pointer = (uint32_t)tmp;
     286         [ #  # ]:          0 :         } else if (strcmp(key, "keytag") == 0) {
     287                 :          0 :                 devarg_prms->keytag = tmp;
     288         [ #  # ]:          0 :         } else if (strcmp(key, "algo") == 0) {
     289         [ #  # ]:          0 :                 if (tmp == 1) {
     290                 :          0 :                         devarg_prms->is_aes_gcm = 1;
     291         [ #  # ]:          0 :                 } else if (tmp > 1) {
     292                 :          0 :                         DRV_LOG(ERR, "Invalid algo.");
     293                 :          0 :                         rte_errno = EINVAL;
     294                 :          0 :                         return -rte_errno;
     295                 :            :                 }
     296                 :            :         }
     297                 :            :         return 0;
     298                 :            : }
     299                 :            : 
     300                 :            : static int
     301                 :          0 : mlx5_crypto_parse_devargs(struct mlx5_kvargs_ctrl *mkvlist,
     302                 :            :                           struct mlx5_crypto_devarg_params *devarg_prms,
     303                 :            :                           bool wrapped_mode)
     304                 :            : {
     305                 :            :         struct mlx5_devx_crypto_login_attr *attr = &devarg_prms->login_attr;
     306                 :          0 :         const char **params = (const char *[]){
     307                 :            :                 "credential_id",
     308                 :            :                 "import_kek_id",
     309                 :            :                 "keytag",
     310                 :            :                 "max_segs_num",
     311                 :            :                 "wcs_file",
     312                 :            :                 "algo",
     313                 :            :                 "crypto_mode",
     314                 :            :                 NULL,
     315                 :            :         };
     316                 :            : 
     317                 :            :         /* Default values. */
     318                 :          0 :         attr->credential_pointer = 0;
     319                 :          0 :         attr->session_import_kek_ptr = 0;
     320                 :          0 :         devarg_prms->keytag = 0;
     321                 :          0 :         devarg_prms->max_segs_num = 8;
     322         [ #  # ]:          0 :         if (mkvlist == NULL) {
     323         [ #  # ]:          0 :                 if (!wrapped_mode)
     324                 :            :                         return 0;
     325                 :          0 :                 DRV_LOG(ERR,
     326                 :            :                         "No login devargs in order to enable crypto operations in the device.");
     327                 :          0 :                 rte_errno = EINVAL;
     328                 :          0 :                 return -1;
     329                 :            :         }
     330         [ #  # ]:          0 :         if (mlx5_kvargs_process(mkvlist, params, mlx5_crypto_args_check_handler,
     331                 :            :                                 devarg_prms) != 0) {
     332                 :          0 :                 DRV_LOG(ERR, "Devargs handler function Failed.");
     333                 :          0 :                 rte_errno = EINVAL;
     334                 :          0 :                 return -1;
     335                 :            :         }
     336   [ #  #  #  # ]:          0 :         if (devarg_prms->login_devarg == false && wrapped_mode) {
     337                 :          0 :                 DRV_LOG(ERR,
     338                 :            :                         "No login credential devarg in order to enable crypto operations in the device while in wrapped import method.");
     339                 :          0 :                 rte_errno = EINVAL;
     340                 :          0 :                 return -1;
     341                 :            :         }
     342                 :            :         return 0;
     343                 :            : }
     344                 :            : 
     345                 :            : static int
     346                 :          0 : mlx5_crypto_dev_probe(struct mlx5_common_device *cdev,
     347                 :            :                       struct mlx5_kvargs_ctrl *mkvlist)
     348                 :            : {
     349                 :            :         struct rte_cryptodev *crypto_dev;
     350                 :            :         struct mlx5_devx_obj *login;
     351                 :            :         struct mlx5_crypto_priv *priv;
     352                 :          0 :         struct mlx5_crypto_devarg_params devarg_prms = { 0 };
     353                 :          0 :         struct rte_cryptodev_pmd_init_params init_params = {
     354                 :            :                 .name = "",
     355                 :            :                 .private_data_size = sizeof(struct mlx5_crypto_priv),
     356                 :          0 :                 .socket_id = cdev->dev->numa_node,
     357                 :            :                 .max_nb_queue_pairs =
     358                 :            :                                 RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS,
     359                 :            :         };
     360         [ #  # ]:          0 :         const char *ibdev_name = mlx5_os_get_ctx_device_name(cdev->ctx);
     361                 :            :         int ret;
     362                 :            :         bool wrapped_mode;
     363                 :            : 
     364         [ #  # ]:          0 :         if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
     365                 :          0 :                 DRV_LOG(ERR, "Non-primary process type is not supported.");
     366                 :          0 :                 rte_errno = ENOTSUP;
     367                 :          0 :                 return -rte_errno;
     368                 :            :         }
     369         [ #  # ]:          0 :         if (!cdev->config.hca_attr.crypto ||
     370         [ #  # ]:          0 :            (!cdev->config.hca_attr.aes_xts &&
     371         [ #  # ]:          0 :             !cdev->config.hca_attr.crypto_mmo.crypto_mmo_qp)) {
     372                 :          0 :                 DRV_LOG(ERR, "Not enough capabilities to support crypto "
     373                 :            :                         "operations, maybe old FW/OFED version?");
     374                 :          0 :                 rte_errno = ENOTSUP;
     375                 :          0 :                 return -ENOTSUP;
     376                 :            :         }
     377                 :          0 :         wrapped_mode = !!cdev->config.hca_attr.crypto_wrapped_import_method;
     378                 :          0 :         ret = mlx5_crypto_parse_devargs(mkvlist, &devarg_prms, wrapped_mode);
     379         [ #  # ]:          0 :         if (ret) {
     380                 :          0 :                 DRV_LOG(ERR, "Failed to parse devargs.");
     381                 :          0 :                 return -rte_errno;
     382                 :            :         }
     383                 :          0 :         crypto_dev = rte_cryptodev_pmd_create(ibdev_name, cdev->dev,
     384                 :            :                                               &init_params);
     385         [ #  # ]:          0 :         if (crypto_dev == NULL) {
     386                 :          0 :                 DRV_LOG(ERR, "Failed to create device \"%s\".", ibdev_name);
     387                 :          0 :                 return -ENODEV;
     388                 :            :         }
     389                 :          0 :         DRV_LOG(INFO,
     390                 :            :                 "Crypto device %s was created successfully.", ibdev_name);
     391                 :          0 :         crypto_dev->dev_ops = &mlx5_crypto_ops;
     392         [ #  # ]:          0 :         crypto_dev->feature_flags = MLX5_CRYPTO_FEATURE_FLAGS(wrapped_mode);
     393                 :          0 :         crypto_dev->driver_id = mlx5_crypto_driver_id;
     394                 :          0 :         priv = crypto_dev->data->dev_private;
     395                 :          0 :         priv->cdev = cdev;
     396                 :          0 :         priv->crypto_dev = crypto_dev;
     397                 :          0 :         priv->is_wrapped_mode = wrapped_mode;
     398                 :          0 :         priv->max_segs_num = devarg_prms.max_segs_num;
     399                 :          0 :         priv->crypto_mode = devarg_prms.crypto_mode;
     400                 :            :         /* Init and override AES-GCM configuration. */
     401         [ #  # ]:          0 :         if (devarg_prms.is_aes_gcm) {
     402                 :          0 :                 ret = mlx5_crypto_gcm_init(priv);
     403         [ #  # ]:          0 :                 if (ret) {
     404                 :          0 :                         rte_cryptodev_pmd_destroy(priv->crypto_dev);
     405                 :          0 :                         DRV_LOG(ERR, "Failed to init AES-GCM crypto.");
     406                 :          0 :                         return -ENOTSUP;
     407                 :            :                 }
     408                 :            :         } else {
     409                 :          0 :                 ret = mlx5_crypto_xts_init(priv);
     410         [ #  # ]:          0 :                 if (ret) {
     411                 :          0 :                         rte_cryptodev_pmd_destroy(priv->crypto_dev);
     412                 :          0 :                         DRV_LOG(ERR, "Failed to init AES-XTS crypto.");
     413                 :          0 :                         return -ENOTSUP;
     414                 :            :                 }
     415                 :            :         }
     416         [ #  # ]:          0 :         if (mlx5_devx_uar_prepare(cdev, &priv->uar) != 0) {
     417                 :          0 :                 rte_cryptodev_pmd_destroy(priv->crypto_dev);
     418                 :          0 :                 return -1;
     419                 :            :         }
     420         [ #  # ]:          0 :         if (wrapped_mode) {
     421                 :          0 :                 login = mlx5_devx_cmd_create_crypto_login_obj(cdev->ctx,
     422                 :            :                                                       &devarg_prms.login_attr);
     423         [ #  # ]:          0 :                 if (login == NULL) {
     424                 :          0 :                         DRV_LOG(ERR, "Failed to configure login.");
     425                 :          0 :                         mlx5_devx_uar_release(&priv->uar);
     426                 :          0 :                         rte_cryptodev_pmd_destroy(priv->crypto_dev);
     427                 :          0 :                         return -rte_errno;
     428                 :            :                 }
     429                 :          0 :                 priv->login_obj = login;
     430                 :            :         }
     431         [ #  # ]:          0 :         priv->keytag = rte_cpu_to_be_64(devarg_prms.keytag);
     432                 :          0 :         DRV_LOG(INFO, "Max number of segments: %u.",
     433                 :            :                 (unsigned int)RTE_MIN(
     434                 :            :                         MLX5_CRYPTO_KLM_SEGS_NUM(priv->umr_wqe_size),
     435                 :            :                         (uint16_t)(priv->max_rdmar_ds - 2)));
     436                 :          0 :         pthread_mutex_lock(&priv_list_lock);
     437                 :          0 :         TAILQ_INSERT_TAIL(&mlx5_crypto_priv_list, priv, next);
     438                 :          0 :         pthread_mutex_unlock(&priv_list_lock);
     439                 :            : 
     440                 :          0 :         rte_cryptodev_pmd_probing_finish(crypto_dev);
     441                 :            : 
     442                 :          0 :         return 0;
     443                 :            : }
     444                 :            : 
     445                 :            : static int
     446                 :          0 : mlx5_crypto_dev_remove(struct mlx5_common_device *cdev)
     447                 :            : {
     448                 :            :         struct mlx5_crypto_priv *priv = NULL;
     449                 :            : 
     450                 :          0 :         pthread_mutex_lock(&priv_list_lock);
     451         [ #  # ]:          0 :         TAILQ_FOREACH(priv, &mlx5_crypto_priv_list, next)
     452         [ #  # ]:          0 :                 if (priv->crypto_dev->device == cdev->dev)
     453                 :            :                         break;
     454         [ #  # ]:          0 :         if (priv)
     455         [ #  # ]:          0 :                 TAILQ_REMOVE(&mlx5_crypto_priv_list, priv, next);
     456                 :          0 :         pthread_mutex_unlock(&priv_list_lock);
     457         [ #  # ]:          0 :         if (priv) {
     458                 :          0 :                 claim_zero(mlx5_devx_cmd_destroy(priv->login_obj));
     459                 :          0 :                 mlx5_devx_uar_release(&priv->uar);
     460                 :          0 :                 rte_cryptodev_pmd_destroy(priv->crypto_dev);
     461                 :            :         }
     462                 :          0 :         return 0;
     463                 :            : }
     464                 :            : 
     465                 :            : static const struct rte_pci_id mlx5_crypto_pci_id_map[] = {
     466                 :            :                 {
     467                 :            :                         RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
     468                 :            :                                         PCI_DEVICE_ID_MELLANOX_CONNECTX6)
     469                 :            :                 },
     470                 :            :                 {
     471                 :            :                         RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
     472                 :            :                                         PCI_DEVICE_ID_MELLANOX_CONNECTX6DX)
     473                 :            :                 },
     474                 :            :                 {
     475                 :            :                         RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
     476                 :            :                                         PCI_DEVICE_ID_MELLANOX_BLUEFIELD2)
     477                 :            :                 },
     478                 :            :                 {
     479                 :            :                         RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
     480                 :            :                                         PCI_DEVICE_ID_MELLANOX_CONNECTX7)
     481                 :            :                 },
     482                 :            :                 {
     483                 :            :                         RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
     484                 :            :                                         PCI_DEVICE_ID_MELLANOX_BLUEFIELD3)
     485                 :            :                 },
     486                 :            :                 {
     487                 :            :                         RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
     488                 :            :                                         PCI_DEVICE_ID_MELLANOX_CONNECTXVF)
     489                 :            :                 },
     490                 :            :                 {
     491                 :            :                         RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
     492                 :            :                                         PCI_DEVICE_ID_MELLANOX_CONNECTX8)
     493                 :            :                 },
     494                 :            :                 {
     495                 :            :                         RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
     496                 :            :                                         PCI_DEVICE_ID_MELLANOX_CONNECTX9)
     497                 :            :                 },
     498                 :            :                 {
     499                 :            :                         RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
     500                 :            :                                         PCI_DEVICE_ID_MELLANOX_BLUEFIELD4)
     501                 :            :                 },
     502                 :            :                 {
     503                 :            :                         RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
     504                 :            :                                         PCI_DEVICE_ID_MELLANOX_CONNECTX10)
     505                 :            :                 },
     506                 :            :                 {
     507                 :            :                         RTE_PCI_DEVICE(PCI_VENDOR_ID_MELLANOX,
     508                 :            :                                         PCI_DEVICE_ID_MELLANOX_CONNECTX10C2C)
     509                 :            :                 },
     510                 :            :                 {
     511                 :            :                         .vendor_id = 0
     512                 :            :                 }
     513                 :            : };
     514                 :            : 
     515                 :            : static struct mlx5_class_driver mlx5_crypto_driver = {
     516                 :            :         .drv_class = MLX5_CLASS_CRYPTO,
     517                 :            :         .name = RTE_STR(MLX5_CRYPTO_DRIVER_NAME),
     518                 :            :         .id_table = mlx5_crypto_pci_id_map,
     519                 :            :         .probe = mlx5_crypto_dev_probe,
     520                 :            :         .remove = mlx5_crypto_dev_remove,
     521                 :            : };
     522                 :            : 
     523                 :        303 : RTE_INIT(rte_mlx5_crypto_init)
     524                 :            : {
     525                 :        303 :         pthread_mutex_init(&priv_list_lock, NULL);
     526                 :        303 :         mlx5_common_init();
     527         [ +  - ]:        303 :         if (mlx5_glue != NULL)
     528                 :        303 :                 mlx5_class_driver_register(&mlx5_crypto_driver);
     529                 :        303 : }
     530                 :            : 
     531                 :        303 : RTE_PMD_REGISTER_CRYPTO_DRIVER(mlx5_cryptodev_driver, mlx5_drv,
     532                 :            :                                mlx5_crypto_driver_id);
     533                 :            : 
     534         [ -  + ]:        303 : RTE_LOG_REGISTER_DEFAULT(mlx5_crypto_logtype, NOTICE)
     535                 :            : RTE_PMD_EXPORT_NAME(MLX5_CRYPTO_DRIVER_NAME);
     536                 :            : RTE_PMD_REGISTER_PCI_TABLE(MLX5_CRYPTO_DRIVER_NAME, mlx5_crypto_pci_id_map);
     537                 :            : RTE_PMD_REGISTER_KMOD_DEP(MLX5_CRYPTO_DRIVER_NAME, "* ib_uverbs & mlx5_core & mlx5_ib");

Generated by: LCOV version 1.14