1fbc8c700SOri Kam /* SPDX-License-Identifier: BSD-3-Clause 2fbc8c700SOri Kam * Copyright 2020 Mellanox Technologies, Ltd 3fbc8c700SOri Kam */ 4fbc8c700SOri Kam 5fbc8c700SOri Kam #include <errno.h> 6fbc8c700SOri Kam 7fbc8c700SOri Kam #include <rte_log.h> 8fbc8c700SOri Kam #include <rte_errno.h> 9fbc8c700SOri Kam #include <rte_malloc.h> 10fbc8c700SOri Kam #include <rte_regexdev.h> 11fbc8c700SOri Kam #include <rte_regexdev_core.h> 12fbc8c700SOri Kam #include <rte_regexdev_driver.h> 13*cda883bbSYuval Avnery #include <rte_dev.h> 14fbc8c700SOri Kam 15fbc8c700SOri Kam #include <mlx5_common.h> 16fbc8c700SOri Kam #include <mlx5_glue.h> 17fbc8c700SOri Kam #include <mlx5_devx_cmds.h> 18fbc8c700SOri Kam #include <mlx5_prm.h> 19fbc8c700SOri Kam #include <mlx5_common_os.h> 20fbc8c700SOri Kam 21fbc8c700SOri Kam #include "mlx5_regex.h" 22fbc8c700SOri Kam #include "mlx5_regex_utils.h" 23fbc8c700SOri Kam #include "mlx5_rxp_csrs.h" 24fbc8c700SOri Kam #include "mlx5_rxp.h" 25fbc8c700SOri Kam 26fbc8c700SOri Kam #define MLX5_REGEX_NUM_WQE_PER_PAGE (4096/64) 27fbc8c700SOri Kam 28fbc8c700SOri Kam /** 29fbc8c700SOri Kam * Returns the number of qp obj to be created. 30fbc8c700SOri Kam * 31fbc8c700SOri Kam * @param nb_desc 32fbc8c700SOri Kam * The number of descriptors for the queue. 33fbc8c700SOri Kam * 34fbc8c700SOri Kam * @return 35fbc8c700SOri Kam * The number of obj to be created. 36fbc8c700SOri Kam */ 37fbc8c700SOri Kam static uint16_t 38fbc8c700SOri Kam regex_ctrl_get_nb_obj(uint16_t nb_desc) 39fbc8c700SOri Kam { 40fbc8c700SOri Kam return ((nb_desc / MLX5_REGEX_NUM_WQE_PER_PAGE) + 41fbc8c700SOri Kam !!(nb_desc % MLX5_REGEX_NUM_WQE_PER_PAGE)); 42fbc8c700SOri Kam } 43fbc8c700SOri Kam 44fbc8c700SOri Kam /** 45fbc8c700SOri Kam * destroy CQ. 46fbc8c700SOri Kam * 47fbc8c700SOri Kam * @param priv 48fbc8c700SOri Kam * Pointer to the priv object. 49fbc8c700SOri Kam * @param cp 50fbc8c700SOri Kam * Pointer to the CQ to be destroyed. 51fbc8c700SOri Kam * 52fbc8c700SOri Kam * @return 53fbc8c700SOri Kam * 0 on success, a negative errno value otherwise and rte_errno is set. 54fbc8c700SOri Kam */ 55fbc8c700SOri Kam static int 56fbc8c700SOri Kam regex_ctrl_destroy_cq(struct mlx5_regex_priv *priv, struct mlx5_regex_cq *cq) 57fbc8c700SOri Kam { 58fbc8c700SOri Kam if (cq->cqe_umem) { 59fbc8c700SOri Kam mlx5_glue->devx_umem_dereg(cq->cqe_umem); 60fbc8c700SOri Kam cq->cqe_umem = NULL; 61fbc8c700SOri Kam } 62fbc8c700SOri Kam if (cq->cqe) { 63fbc8c700SOri Kam rte_free((void *)(uintptr_t)cq->cqe); 64fbc8c700SOri Kam cq->cqe = NULL; 65fbc8c700SOri Kam } 66fbc8c700SOri Kam if (cq->dbr_offset) { 67fbc8c700SOri Kam mlx5_release_dbr(&priv->dbrpgs, cq->dbr_umem, cq->dbr_offset); 68fbc8c700SOri Kam cq->dbr_offset = -1; 69fbc8c700SOri Kam } 70fbc8c700SOri Kam if (cq->obj) { 71fbc8c700SOri Kam mlx5_devx_cmd_destroy(cq->obj); 72fbc8c700SOri Kam cq->obj = NULL; 73fbc8c700SOri Kam } 74fbc8c700SOri Kam return 0; 75fbc8c700SOri Kam } 76fbc8c700SOri Kam 77fbc8c700SOri Kam /** 78fbc8c700SOri Kam * create the CQ object. 79fbc8c700SOri Kam * 80fbc8c700SOri Kam * @param priv 81fbc8c700SOri Kam * Pointer to the priv object. 82fbc8c700SOri Kam * @param cp 83fbc8c700SOri Kam * Pointer to the CQ to be created. 84fbc8c700SOri Kam * 85fbc8c700SOri Kam * @return 86fbc8c700SOri Kam * 0 on success, a negative errno value otherwise and rte_errno is set. 87fbc8c700SOri Kam */ 88fbc8c700SOri Kam static int 89fbc8c700SOri Kam regex_ctrl_create_cq(struct mlx5_regex_priv *priv, struct mlx5_regex_cq *cq) 90fbc8c700SOri Kam { 91fbc8c700SOri Kam struct mlx5_devx_cq_attr attr = { 92fbc8c700SOri Kam .q_umem_valid = 1, 93fbc8c700SOri Kam .db_umem_valid = 1, 94fbc8c700SOri Kam .eqn = priv->eqn, 95fbc8c700SOri Kam }; 96fbc8c700SOri Kam struct mlx5_devx_dbr_page *dbr_page = NULL; 97fbc8c700SOri Kam void *buf = NULL; 98fbc8c700SOri Kam size_t pgsize = sysconf(_SC_PAGESIZE); 99fbc8c700SOri Kam uint32_t cq_size = 1 << cq->log_nb_desc; 100fbc8c700SOri Kam uint32_t i; 101fbc8c700SOri Kam 102fbc8c700SOri Kam cq->dbr_offset = mlx5_get_dbr(priv->ctx, &priv->dbrpgs, &dbr_page); 103fbc8c700SOri Kam if (cq->dbr_offset < 0) { 104fbc8c700SOri Kam DRV_LOG(ERR, "Can't allocate cq door bell record."); 105fbc8c700SOri Kam rte_errno = ENOMEM; 106fbc8c700SOri Kam goto error; 107fbc8c700SOri Kam } 108fbc8c700SOri Kam cq->dbr_umem = mlx5_os_get_umem_id(dbr_page->umem); 10992f2c6a3SOri Kam cq->dbr = (uint32_t *)((uintptr_t)dbr_page->dbrs + 11092f2c6a3SOri Kam (uintptr_t)cq->dbr_offset); 11192f2c6a3SOri Kam 112fbc8c700SOri Kam buf = rte_calloc(NULL, 1, sizeof(struct mlx5_cqe) * cq_size, 4096); 113fbc8c700SOri Kam if (!buf) { 114fbc8c700SOri Kam DRV_LOG(ERR, "Can't allocate cqe buffer."); 115fbc8c700SOri Kam rte_errno = ENOMEM; 116fbc8c700SOri Kam goto error; 117fbc8c700SOri Kam } 118fbc8c700SOri Kam cq->cqe = buf; 119fbc8c700SOri Kam for (i = 0; i < cq_size; i++) 120fbc8c700SOri Kam cq->cqe[i].op_own = 0xff; 121fbc8c700SOri Kam cq->cqe_umem = mlx5_glue->devx_umem_reg(priv->ctx, buf, 122fbc8c700SOri Kam sizeof(struct mlx5_cqe) * 123fbc8c700SOri Kam cq_size, 7); 1240db041e7SYuval Avnery cq->ci = 0; 125fbc8c700SOri Kam if (!cq->cqe_umem) { 126fbc8c700SOri Kam DRV_LOG(ERR, "Can't register cqe mem."); 127fbc8c700SOri Kam rte_errno = ENOMEM; 128fbc8c700SOri Kam goto error; 129fbc8c700SOri Kam } 130fbc8c700SOri Kam attr.db_umem_offset = cq->dbr_offset; 131fbc8c700SOri Kam attr.db_umem_id = cq->dbr_umem; 132fbc8c700SOri Kam attr.q_umem_id = mlx5_os_get_umem_id(cq->cqe_umem); 133fbc8c700SOri Kam attr.log_cq_size = cq->log_nb_desc; 134fbc8c700SOri Kam attr.uar_page_id = priv->uar->page_id; 135fbc8c700SOri Kam attr.log_page_size = rte_log2_u32(pgsize); 136fbc8c700SOri Kam cq->obj = mlx5_devx_cmd_create_cq(priv->ctx, &attr); 137fbc8c700SOri Kam if (!cq->obj) { 138fbc8c700SOri Kam DRV_LOG(ERR, "Can't create cq object."); 139fbc8c700SOri Kam rte_errno = ENOMEM; 140fbc8c700SOri Kam goto error; 141fbc8c700SOri Kam } 142fbc8c700SOri Kam return 0; 143fbc8c700SOri Kam error: 144fbc8c700SOri Kam if (cq->cqe_umem) 145fbc8c700SOri Kam mlx5_glue->devx_umem_dereg(cq->cqe_umem); 146fbc8c700SOri Kam if (buf) 147fbc8c700SOri Kam rte_free(buf); 148fbc8c700SOri Kam if (cq->dbr_offset) 149fbc8c700SOri Kam mlx5_release_dbr(&priv->dbrpgs, cq->dbr_umem, cq->dbr_offset); 150fbc8c700SOri Kam return -rte_errno; 151fbc8c700SOri Kam } 152fbc8c700SOri Kam 15392f2c6a3SOri Kam #ifdef HAVE_IBV_FLOW_DV_SUPPORT 15492f2c6a3SOri Kam static int 15592f2c6a3SOri Kam regex_get_pdn(void *pd, uint32_t *pdn) 15692f2c6a3SOri Kam { 15792f2c6a3SOri Kam struct mlx5dv_obj obj; 15892f2c6a3SOri Kam struct mlx5dv_pd pd_info; 15992f2c6a3SOri Kam int ret = 0; 16092f2c6a3SOri Kam 16192f2c6a3SOri Kam obj.pd.in = pd; 16292f2c6a3SOri Kam obj.pd.out = &pd_info; 16392f2c6a3SOri Kam ret = mlx5_glue->dv_init_obj(&obj, MLX5DV_OBJ_PD); 16492f2c6a3SOri Kam if (ret) { 16592f2c6a3SOri Kam DRV_LOG(DEBUG, "Fail to get PD object info"); 16692f2c6a3SOri Kam return ret; 16792f2c6a3SOri Kam } 16892f2c6a3SOri Kam *pdn = pd_info.pdn; 16992f2c6a3SOri Kam return 0; 17092f2c6a3SOri Kam } 17192f2c6a3SOri Kam #endif 17292f2c6a3SOri Kam 17392f2c6a3SOri Kam /** 17492f2c6a3SOri Kam * create the SQ object. 17592f2c6a3SOri Kam * 17692f2c6a3SOri Kam * @param priv 17792f2c6a3SOri Kam * Pointer to the priv object. 17892f2c6a3SOri Kam * @param qp 17992f2c6a3SOri Kam * Pointer to the QP element 18092f2c6a3SOri Kam * @param q_ind 18192f2c6a3SOri Kam * The index of the queue. 18292f2c6a3SOri Kam * @param log_nb_desc 18392f2c6a3SOri Kam * Log 2 of the number of descriptors to be used. 18492f2c6a3SOri Kam * 18592f2c6a3SOri Kam * @return 18692f2c6a3SOri Kam * 0 on success, a negative errno value otherwise and rte_errno is set. 18792f2c6a3SOri Kam */ 18892f2c6a3SOri Kam static int 18992f2c6a3SOri Kam regex_ctrl_create_sq(struct mlx5_regex_priv *priv, struct mlx5_regex_qp *qp, 19092f2c6a3SOri Kam uint16_t q_ind, uint16_t log_nb_desc) 19192f2c6a3SOri Kam { 19292f2c6a3SOri Kam #ifdef HAVE_IBV_FLOW_DV_SUPPORT 19392f2c6a3SOri Kam struct mlx5_devx_create_sq_attr attr = { 0 }; 19492f2c6a3SOri Kam struct mlx5_devx_modify_sq_attr modify_attr = { 0 }; 19592f2c6a3SOri Kam struct mlx5_devx_wq_attr *wq_attr = &attr.wq_attr; 19692f2c6a3SOri Kam struct mlx5_devx_dbr_page *dbr_page = NULL; 19792f2c6a3SOri Kam struct mlx5_regex_sq *sq = &qp->sqs[q_ind]; 19892f2c6a3SOri Kam void *buf = NULL; 19992f2c6a3SOri Kam uint32_t sq_size; 20092f2c6a3SOri Kam uint32_t pd_num = 0; 20192f2c6a3SOri Kam int ret; 20292f2c6a3SOri Kam 20392f2c6a3SOri Kam sq->log_nb_desc = log_nb_desc; 20492f2c6a3SOri Kam sq_size = 1 << sq->log_nb_desc; 20592f2c6a3SOri Kam sq->dbr_offset = mlx5_get_dbr(priv->ctx, &priv->dbrpgs, &dbr_page); 20692f2c6a3SOri Kam if (sq->dbr_offset < 0) { 20792f2c6a3SOri Kam DRV_LOG(ERR, "Can't allocate sq door bell record."); 20892f2c6a3SOri Kam rte_errno = ENOMEM; 20992f2c6a3SOri Kam goto error; 21092f2c6a3SOri Kam } 21192f2c6a3SOri Kam sq->dbr_umem = mlx5_os_get_umem_id(dbr_page->umem); 21292f2c6a3SOri Kam sq->dbr = (uint32_t *)((uintptr_t)dbr_page->dbrs + 21392f2c6a3SOri Kam (uintptr_t)sq->dbr_offset); 21492f2c6a3SOri Kam 21592f2c6a3SOri Kam buf = rte_calloc(NULL, 1, 64 * sq_size, 4096); 21692f2c6a3SOri Kam if (!buf) { 21792f2c6a3SOri Kam DRV_LOG(ERR, "Can't allocate wqe buffer."); 21892f2c6a3SOri Kam rte_errno = ENOMEM; 21992f2c6a3SOri Kam goto error; 22092f2c6a3SOri Kam } 22192f2c6a3SOri Kam sq->wqe = buf; 22292f2c6a3SOri Kam sq->wqe_umem = mlx5_glue->devx_umem_reg(priv->ctx, buf, 64 * sq_size, 22392f2c6a3SOri Kam 7); 2244d4e245aSYuval Avnery sq->ci = 0; 2254d4e245aSYuval Avnery sq->pi = 0; 22692f2c6a3SOri Kam if (!sq->wqe_umem) { 22792f2c6a3SOri Kam DRV_LOG(ERR, "Can't register wqe mem."); 22892f2c6a3SOri Kam rte_errno = ENOMEM; 22992f2c6a3SOri Kam goto error; 23092f2c6a3SOri Kam } 23192f2c6a3SOri Kam attr.state = MLX5_SQC_STATE_RST; 23292f2c6a3SOri Kam attr.tis_lst_sz = 0; 23392f2c6a3SOri Kam attr.tis_num = 0; 23492f2c6a3SOri Kam attr.user_index = q_ind; 23592f2c6a3SOri Kam attr.cqn = qp->cq.obj->id; 23692f2c6a3SOri Kam wq_attr->uar_page = priv->uar->page_id; 23792f2c6a3SOri Kam regex_get_pdn(priv->pd, &pd_num); 23892f2c6a3SOri Kam wq_attr->pd = pd_num; 23992f2c6a3SOri Kam wq_attr->wq_type = MLX5_WQ_TYPE_CYCLIC; 24092f2c6a3SOri Kam wq_attr->dbr_umem_id = sq->dbr_umem; 24192f2c6a3SOri Kam wq_attr->dbr_addr = sq->dbr_offset; 24292f2c6a3SOri Kam wq_attr->dbr_umem_valid = 1; 24392f2c6a3SOri Kam wq_attr->wq_umem_id = mlx5_os_get_umem_id(sq->wqe_umem); 24492f2c6a3SOri Kam wq_attr->wq_umem_offset = 0; 24592f2c6a3SOri Kam wq_attr->wq_umem_valid = 1; 24692f2c6a3SOri Kam wq_attr->log_wq_stride = 6; 24792f2c6a3SOri Kam wq_attr->log_wq_sz = sq->log_nb_desc; 24892f2c6a3SOri Kam sq->obj = mlx5_devx_cmd_create_sq(priv->ctx, &attr); 24992f2c6a3SOri Kam if (!sq->obj) { 25092f2c6a3SOri Kam DRV_LOG(ERR, "Can't create sq object."); 25192f2c6a3SOri Kam rte_errno = ENOMEM; 25292f2c6a3SOri Kam goto error; 25392f2c6a3SOri Kam } 25492f2c6a3SOri Kam modify_attr.state = MLX5_SQC_STATE_RDY; 25592f2c6a3SOri Kam ret = mlx5_devx_cmd_modify_sq(sq->obj, &modify_attr); 25692f2c6a3SOri Kam if (ret) { 25792f2c6a3SOri Kam DRV_LOG(ERR, "Can't change sq state to ready."); 25892f2c6a3SOri Kam rte_errno = ENOMEM; 25992f2c6a3SOri Kam goto error; 26092f2c6a3SOri Kam } 26192f2c6a3SOri Kam 26292f2c6a3SOri Kam return 0; 26392f2c6a3SOri Kam error: 26492f2c6a3SOri Kam if (sq->wqe_umem) 26592f2c6a3SOri Kam mlx5_glue->devx_umem_dereg(sq->wqe_umem); 26692f2c6a3SOri Kam if (buf) 26792f2c6a3SOri Kam rte_free(buf); 26892f2c6a3SOri Kam if (sq->dbr_offset) 26992f2c6a3SOri Kam mlx5_release_dbr(&priv->dbrpgs, sq->dbr_umem, sq->dbr_offset); 27092f2c6a3SOri Kam return -rte_errno; 27192f2c6a3SOri Kam #else 27292f2c6a3SOri Kam (void)priv; 27392f2c6a3SOri Kam (void)qp; 27492f2c6a3SOri Kam (void)q_ind; 27592f2c6a3SOri Kam (void)log_nb_desc; 27692f2c6a3SOri Kam DRV_LOG(ERR, "Cannot get pdn - no DV support."); 27792f2c6a3SOri Kam return -ENOTSUP; 27892f2c6a3SOri Kam #endif 27992f2c6a3SOri Kam } 28092f2c6a3SOri Kam 28192f2c6a3SOri Kam /** 28292f2c6a3SOri Kam * Destroy the SQ object. 28392f2c6a3SOri Kam * 28492f2c6a3SOri Kam * @param priv 28592f2c6a3SOri Kam * Pointer to the priv object. 28692f2c6a3SOri Kam * @param qp 28792f2c6a3SOri Kam * Pointer to the QP element 28892f2c6a3SOri Kam * @param q_ind 28992f2c6a3SOri Kam * The index of the queue. 29092f2c6a3SOri Kam * 29192f2c6a3SOri Kam * @return 29292f2c6a3SOri Kam * 0 on success, a negative errno value otherwise and rte_errno is set. 29392f2c6a3SOri Kam */ 29492f2c6a3SOri Kam static int 29592f2c6a3SOri Kam regex_ctrl_destroy_sq(struct mlx5_regex_priv *priv, struct mlx5_regex_qp *qp, 29692f2c6a3SOri Kam uint16_t q_ind) 29792f2c6a3SOri Kam { 29892f2c6a3SOri Kam struct mlx5_regex_sq *sq = &qp->sqs[q_ind]; 29992f2c6a3SOri Kam 30092f2c6a3SOri Kam if (sq->wqe_umem) { 30192f2c6a3SOri Kam mlx5_glue->devx_umem_dereg(sq->wqe_umem); 30292f2c6a3SOri Kam sq->wqe_umem = NULL; 30392f2c6a3SOri Kam } 30492f2c6a3SOri Kam if (sq->wqe) { 30592f2c6a3SOri Kam rte_free((void *)(uintptr_t)sq->wqe); 30692f2c6a3SOri Kam sq->wqe = NULL; 30792f2c6a3SOri Kam } 30892f2c6a3SOri Kam if (sq->dbr_offset) { 30992f2c6a3SOri Kam mlx5_release_dbr(&priv->dbrpgs, sq->dbr_umem, sq->dbr_offset); 31092f2c6a3SOri Kam sq->dbr_offset = -1; 31192f2c6a3SOri Kam } 31292f2c6a3SOri Kam if (sq->obj) { 31392f2c6a3SOri Kam mlx5_devx_cmd_destroy(sq->obj); 31492f2c6a3SOri Kam sq->obj = NULL; 31592f2c6a3SOri Kam } 31692f2c6a3SOri Kam return 0; 31792f2c6a3SOri Kam } 31892f2c6a3SOri Kam 319fbc8c700SOri Kam /** 320fbc8c700SOri Kam * Setup the qp. 321fbc8c700SOri Kam * 322fbc8c700SOri Kam * @param dev 323fbc8c700SOri Kam * Pointer to RegEx dev structure. 324fbc8c700SOri Kam * @param qp_ind 325fbc8c700SOri Kam * The queue index to setup. 326fbc8c700SOri Kam * @param cfg 327fbc8c700SOri Kam * The queue requested configuration. 328fbc8c700SOri Kam * 329fbc8c700SOri Kam * @return 330fbc8c700SOri Kam * 0 on success, a negative errno value otherwise and rte_errno is set. 331fbc8c700SOri Kam */ 332fbc8c700SOri Kam int 333fbc8c700SOri Kam mlx5_regex_qp_setup(struct rte_regexdev *dev, uint16_t qp_ind, 334fbc8c700SOri Kam const struct rte_regexdev_qp_conf *cfg) 335fbc8c700SOri Kam { 336fbc8c700SOri Kam struct mlx5_regex_priv *priv = dev->data->dev_private; 337fbc8c700SOri Kam struct mlx5_regex_qp *qp; 33892f2c6a3SOri Kam int i; 339fbc8c700SOri Kam int ret; 34092f2c6a3SOri Kam uint16_t log_desc; 341fbc8c700SOri Kam 342fbc8c700SOri Kam qp = &priv->qps[qp_ind]; 343fbc8c700SOri Kam qp->flags = cfg->qp_conf_flags; 344fbc8c700SOri Kam qp->cq.log_nb_desc = rte_log2_u32(cfg->nb_desc); 345fbc8c700SOri Kam qp->nb_desc = 1 << qp->cq.log_nb_desc; 346fbc8c700SOri Kam if (qp->flags & RTE_REGEX_QUEUE_PAIR_CFG_OOS_F) 347fbc8c700SOri Kam qp->nb_obj = regex_ctrl_get_nb_obj(qp->nb_desc); 348fbc8c700SOri Kam else 349fbc8c700SOri Kam qp->nb_obj = 1; 350fbc8c700SOri Kam qp->sqs = rte_malloc(NULL, 351fbc8c700SOri Kam qp->nb_obj * sizeof(struct mlx5_regex_sq), 64); 352fbc8c700SOri Kam if (!qp->sqs) { 353fbc8c700SOri Kam DRV_LOG(ERR, "Can't allocate sq array memory."); 354fbc8c700SOri Kam rte_errno = ENOMEM; 355fbc8c700SOri Kam return -rte_errno; 356fbc8c700SOri Kam } 35792f2c6a3SOri Kam log_desc = rte_log2_u32(qp->nb_desc / qp->nb_obj); 358fbc8c700SOri Kam ret = regex_ctrl_create_cq(priv, &qp->cq); 359fbc8c700SOri Kam if (ret) { 360fbc8c700SOri Kam DRV_LOG(ERR, "Can't create cq."); 36154fa1f6aSYuval Avnery goto err_cq; 362fbc8c700SOri Kam } 36392f2c6a3SOri Kam for (i = 0; i < qp->nb_obj; i++) { 36492f2c6a3SOri Kam ret = regex_ctrl_create_sq(priv, qp, i, log_desc); 36592f2c6a3SOri Kam if (ret) { 36692f2c6a3SOri Kam DRV_LOG(ERR, "Can't create sq."); 36754fa1f6aSYuval Avnery goto err_sq; 36892f2c6a3SOri Kam } 36992f2c6a3SOri Kam } 3705f41b66dSYuval Avnery 371*cda883bbSYuval Avnery ret = mlx5_mr_btree_init(&qp->mr_ctrl.cache_bh, MLX5_MR_BTREE_CACHE_N, 372*cda883bbSYuval Avnery rte_socket_id()); 373*cda883bbSYuval Avnery if (ret) { 374*cda883bbSYuval Avnery DRV_LOG(ERR, "Error setting up mr btree"); 375*cda883bbSYuval Avnery goto err_btree; 376*cda883bbSYuval Avnery } 377*cda883bbSYuval Avnery 37854fa1f6aSYuval Avnery ret = mlx5_regexdev_setup_fastpath(priv, qp_ind); 37954fa1f6aSYuval Avnery if (ret) { 380*cda883bbSYuval Avnery DRV_LOG(ERR, "Error setting up fastpath"); 38154fa1f6aSYuval Avnery goto err_fp; 38254fa1f6aSYuval Avnery } 383fbc8c700SOri Kam return 0; 384fbc8c700SOri Kam 38554fa1f6aSYuval Avnery err_fp: 386*cda883bbSYuval Avnery mlx5_mr_btree_free(&qp->mr_ctrl.cache_bh); 387*cda883bbSYuval Avnery err_btree: 38892f2c6a3SOri Kam for (i = 0; i < qp->nb_obj; i++) 389*cda883bbSYuval Avnery regex_ctrl_destroy_sq(priv, qp, i); 39054fa1f6aSYuval Avnery err_sq: 39154fa1f6aSYuval Avnery regex_ctrl_destroy_cq(priv, &qp->cq); 39254fa1f6aSYuval Avnery err_cq: 39354fa1f6aSYuval Avnery rte_free(qp->sqs); 39454fa1f6aSYuval Avnery return ret; 395fbc8c700SOri Kam } 396