1751dca90SVikas Gupta /* SPDX-License-Identifier: BSD-3-Clause 2751dca90SVikas Gupta * Copyright(c) 2020 Broadcom 3751dca90SVikas Gupta * All rights reserved. 4751dca90SVikas Gupta */ 5751dca90SVikas Gupta 6751dca90SVikas Gupta #include <rte_common.h> 71acb7f54SDavid Marchand #include <dev_driver.h> 8751dca90SVikas Gupta #include <rte_errno.h> 9751dca90SVikas Gupta #include <rte_malloc.h> 10af668035SAkhil Goyal #include <cryptodev_pmd.h> 11751dca90SVikas Gupta 12751dca90SVikas Gupta #include "bcmfs_device.h" 13751dca90SVikas Gupta #include "bcmfs_logs.h" 14751dca90SVikas Gupta #include "bcmfs_qp.h" 15751dca90SVikas Gupta #include "bcmfs_sym_pmd.h" 16751dca90SVikas Gupta #include "bcmfs_sym_req.h" 174ed19f0dSVikas Gupta #include "bcmfs_sym_session.h" 184ed19f0dSVikas Gupta #include "bcmfs_sym_capabilities.h" 19751dca90SVikas Gupta 20751dca90SVikas Gupta uint8_t cryptodev_bcmfs_driver_id; 21751dca90SVikas Gupta 22751dca90SVikas Gupta static int bcmfs_sym_qp_release(struct rte_cryptodev *dev, 23751dca90SVikas Gupta uint16_t queue_pair_id); 24751dca90SVikas Gupta 25751dca90SVikas Gupta static int 26751dca90SVikas Gupta bcmfs_sym_dev_config(__rte_unused struct rte_cryptodev *dev, 27751dca90SVikas Gupta __rte_unused struct rte_cryptodev_config *config) 28751dca90SVikas Gupta { 29751dca90SVikas Gupta return 0; 30751dca90SVikas Gupta } 31751dca90SVikas Gupta 32751dca90SVikas Gupta static int 33751dca90SVikas Gupta bcmfs_sym_dev_start(__rte_unused struct rte_cryptodev *dev) 34751dca90SVikas Gupta { 35751dca90SVikas Gupta return 0; 36751dca90SVikas Gupta } 37751dca90SVikas Gupta 38751dca90SVikas Gupta static void 39751dca90SVikas Gupta bcmfs_sym_dev_stop(__rte_unused struct rte_cryptodev *dev) 40751dca90SVikas Gupta { 41751dca90SVikas Gupta } 42751dca90SVikas Gupta 43751dca90SVikas Gupta static int 44751dca90SVikas Gupta bcmfs_sym_dev_close(struct rte_cryptodev *dev) 45751dca90SVikas Gupta { 46751dca90SVikas Gupta int i, ret; 47751dca90SVikas Gupta 48751dca90SVikas Gupta for (i = 0; i < dev->data->nb_queue_pairs; i++) { 49751dca90SVikas Gupta ret = bcmfs_sym_qp_release(dev, i); 50751dca90SVikas Gupta if (ret < 0) 51751dca90SVikas Gupta return ret; 52751dca90SVikas Gupta } 53751dca90SVikas Gupta 54751dca90SVikas Gupta return 0; 55751dca90SVikas Gupta } 56751dca90SVikas Gupta 57751dca90SVikas Gupta static void 58751dca90SVikas Gupta bcmfs_sym_dev_info_get(struct rte_cryptodev *dev, 59751dca90SVikas Gupta struct rte_cryptodev_info *dev_info) 60751dca90SVikas Gupta { 61751dca90SVikas Gupta struct bcmfs_sym_dev_private *internals = dev->data->dev_private; 62751dca90SVikas Gupta struct bcmfs_device *fsdev = internals->fsdev; 63751dca90SVikas Gupta 64751dca90SVikas Gupta if (dev_info != NULL) { 65751dca90SVikas Gupta dev_info->driver_id = cryptodev_bcmfs_driver_id; 66751dca90SVikas Gupta dev_info->feature_flags = dev->feature_flags; 67751dca90SVikas Gupta dev_info->max_nb_queue_pairs = fsdev->max_hw_qps; 68751dca90SVikas Gupta /* No limit of number of sessions */ 69751dca90SVikas Gupta dev_info->sym.max_nb_sessions = 0; 704ed19f0dSVikas Gupta dev_info->capabilities = bcmfs_sym_get_capabilities(); 71751dca90SVikas Gupta } 72751dca90SVikas Gupta } 73751dca90SVikas Gupta 74751dca90SVikas Gupta static void 75751dca90SVikas Gupta bcmfs_sym_stats_get(struct rte_cryptodev *dev, 76751dca90SVikas Gupta struct rte_cryptodev_stats *stats) 77751dca90SVikas Gupta { 78751dca90SVikas Gupta struct bcmfs_qp_stats bcmfs_stats = {0}; 79751dca90SVikas Gupta struct bcmfs_sym_dev_private *bcmfs_priv; 80751dca90SVikas Gupta struct bcmfs_device *fsdev; 81751dca90SVikas Gupta 82751dca90SVikas Gupta if (stats == NULL || dev == NULL) { 83751dca90SVikas Gupta BCMFS_LOG(ERR, "invalid ptr: stats %p, dev %p", stats, dev); 84751dca90SVikas Gupta return; 85751dca90SVikas Gupta } 86751dca90SVikas Gupta bcmfs_priv = dev->data->dev_private; 87751dca90SVikas Gupta fsdev = bcmfs_priv->fsdev; 88751dca90SVikas Gupta 89751dca90SVikas Gupta bcmfs_qp_stats_get(fsdev->qps_in_use, fsdev->max_hw_qps, &bcmfs_stats); 90751dca90SVikas Gupta 91751dca90SVikas Gupta stats->enqueued_count = bcmfs_stats.enqueued_count; 92751dca90SVikas Gupta stats->dequeued_count = bcmfs_stats.dequeued_count; 93751dca90SVikas Gupta stats->enqueue_err_count = bcmfs_stats.enqueue_err_count; 94751dca90SVikas Gupta stats->dequeue_err_count = bcmfs_stats.dequeue_err_count; 95751dca90SVikas Gupta } 96751dca90SVikas Gupta 97751dca90SVikas Gupta static void 98751dca90SVikas Gupta bcmfs_sym_stats_reset(struct rte_cryptodev *dev) 99751dca90SVikas Gupta { 100751dca90SVikas Gupta struct bcmfs_sym_dev_private *bcmfs_priv; 101751dca90SVikas Gupta struct bcmfs_device *fsdev; 102751dca90SVikas Gupta 103751dca90SVikas Gupta if (dev == NULL) { 104751dca90SVikas Gupta BCMFS_LOG(ERR, "invalid cryptodev ptr %p", dev); 105751dca90SVikas Gupta return; 106751dca90SVikas Gupta } 107751dca90SVikas Gupta bcmfs_priv = dev->data->dev_private; 108751dca90SVikas Gupta fsdev = bcmfs_priv->fsdev; 109751dca90SVikas Gupta 110751dca90SVikas Gupta bcmfs_qp_stats_reset(fsdev->qps_in_use, fsdev->max_hw_qps); 111751dca90SVikas Gupta } 112751dca90SVikas Gupta 113751dca90SVikas Gupta static int 114751dca90SVikas Gupta bcmfs_sym_qp_release(struct rte_cryptodev *dev, uint16_t queue_pair_id) 115751dca90SVikas Gupta { 116751dca90SVikas Gupta struct bcmfs_sym_dev_private *bcmfs_private = dev->data->dev_private; 117751dca90SVikas Gupta struct bcmfs_qp *qp = (struct bcmfs_qp *) 118751dca90SVikas Gupta (dev->data->queue_pairs[queue_pair_id]); 119751dca90SVikas Gupta 120751dca90SVikas Gupta BCMFS_LOG(DEBUG, "Release sym qp %u on device %d", 121751dca90SVikas Gupta queue_pair_id, dev->data->dev_id); 122751dca90SVikas Gupta 123751dca90SVikas Gupta rte_mempool_free(qp->sr_mp); 124751dca90SVikas Gupta 125751dca90SVikas Gupta bcmfs_private->fsdev->qps_in_use[queue_pair_id] = NULL; 126751dca90SVikas Gupta 127751dca90SVikas Gupta return bcmfs_qp_release((struct bcmfs_qp **) 128751dca90SVikas Gupta &dev->data->queue_pairs[queue_pair_id]); 129751dca90SVikas Gupta } 130751dca90SVikas Gupta 131751dca90SVikas Gupta static void 132751dca90SVikas Gupta spu_req_init(struct bcmfs_sym_request *sr, rte_iova_t iova __rte_unused) 133751dca90SVikas Gupta { 134751dca90SVikas Gupta memset(sr, 0, sizeof(*sr)); 135cd5db556SVikas Gupta sr->fptr = iova + offsetof(struct bcmfs_sym_request, fmd); 136cd5db556SVikas Gupta sr->optr = iova + offsetof(struct bcmfs_sym_request, omd); 137492a19a0SVikas Gupta sr->dptr = iova + offsetof(struct bcmfs_sym_request, digest); 138492a19a0SVikas Gupta sr->rptr = iova + offsetof(struct bcmfs_sym_request, resp); 139751dca90SVikas Gupta } 140751dca90SVikas Gupta 141751dca90SVikas Gupta static void 142751dca90SVikas Gupta req_pool_obj_init(__rte_unused struct rte_mempool *mp, 143751dca90SVikas Gupta __rte_unused void *opaque, void *obj, 144751dca90SVikas Gupta __rte_unused unsigned int obj_idx) 145751dca90SVikas Gupta { 146751dca90SVikas Gupta spu_req_init(obj, rte_mempool_virt2iova(obj)); 147751dca90SVikas Gupta } 148751dca90SVikas Gupta 149751dca90SVikas Gupta static struct rte_mempool * 150751dca90SVikas Gupta bcmfs_sym_req_pool_create(struct rte_cryptodev *cdev __rte_unused, 151751dca90SVikas Gupta uint32_t nobjs, uint16_t qp_id, 152751dca90SVikas Gupta int socket_id) 153751dca90SVikas Gupta { 154751dca90SVikas Gupta char softreq_pool_name[RTE_RING_NAMESIZE]; 155751dca90SVikas Gupta struct rte_mempool *mp; 156751dca90SVikas Gupta 157751dca90SVikas Gupta snprintf(softreq_pool_name, RTE_RING_NAMESIZE, "%s_%d", 158751dca90SVikas Gupta "bcm_sym", qp_id); 159751dca90SVikas Gupta 160751dca90SVikas Gupta mp = rte_mempool_create(softreq_pool_name, 161751dca90SVikas Gupta RTE_ALIGN_MUL_CEIL(nobjs, 64), 162751dca90SVikas Gupta sizeof(struct bcmfs_sym_request), 163751dca90SVikas Gupta 64, 0, NULL, NULL, req_pool_obj_init, NULL, 164751dca90SVikas Gupta socket_id, 0); 165751dca90SVikas Gupta if (mp == NULL) 166751dca90SVikas Gupta BCMFS_LOG(ERR, "Failed to create req pool, qid %d, err %d", 167751dca90SVikas Gupta qp_id, rte_errno); 168751dca90SVikas Gupta 169751dca90SVikas Gupta return mp; 170751dca90SVikas Gupta } 171751dca90SVikas Gupta 172751dca90SVikas Gupta static int 173751dca90SVikas Gupta bcmfs_sym_qp_setup(struct rte_cryptodev *cdev, uint16_t qp_id, 174751dca90SVikas Gupta const struct rte_cryptodev_qp_conf *qp_conf, 175751dca90SVikas Gupta int socket_id) 176751dca90SVikas Gupta { 177751dca90SVikas Gupta int ret = 0; 178751dca90SVikas Gupta struct bcmfs_qp *qp = NULL; 179751dca90SVikas Gupta struct bcmfs_qp_config bcmfs_qp_conf; 180751dca90SVikas Gupta 181751dca90SVikas Gupta struct bcmfs_qp **qp_addr = 182751dca90SVikas Gupta (struct bcmfs_qp **)&cdev->data->queue_pairs[qp_id]; 183751dca90SVikas Gupta struct bcmfs_sym_dev_private *bcmfs_private = cdev->data->dev_private; 184751dca90SVikas Gupta struct bcmfs_device *fsdev = bcmfs_private->fsdev; 185751dca90SVikas Gupta 186751dca90SVikas Gupta 187751dca90SVikas Gupta /* If qp is already in use free ring memory and qp metadata. */ 188751dca90SVikas Gupta if (*qp_addr != NULL) { 189751dca90SVikas Gupta ret = bcmfs_sym_qp_release(cdev, qp_id); 190751dca90SVikas Gupta if (ret < 0) 191751dca90SVikas Gupta return ret; 192751dca90SVikas Gupta } 193751dca90SVikas Gupta 194751dca90SVikas Gupta if (qp_id >= fsdev->max_hw_qps) { 195751dca90SVikas Gupta BCMFS_LOG(ERR, "qp_id %u invalid for this device", qp_id); 196751dca90SVikas Gupta return -EINVAL; 197751dca90SVikas Gupta } 198751dca90SVikas Gupta 199751dca90SVikas Gupta bcmfs_qp_conf.nb_descriptors = qp_conf->nb_descriptors; 200751dca90SVikas Gupta bcmfs_qp_conf.socket_id = socket_id; 201751dca90SVikas Gupta bcmfs_qp_conf.max_descs_req = BCMFS_CRYPTO_MAX_HW_DESCS_PER_REQ; 202751dca90SVikas Gupta bcmfs_qp_conf.iobase = BCMFS_QP_IOBASE_XLATE(fsdev->mmap_addr, qp_id); 203751dca90SVikas Gupta bcmfs_qp_conf.ops = fsdev->sym_hw_qp_ops; 204751dca90SVikas Gupta 205751dca90SVikas Gupta ret = bcmfs_qp_setup(qp_addr, qp_id, &bcmfs_qp_conf); 206751dca90SVikas Gupta if (ret != 0) 207751dca90SVikas Gupta return ret; 208751dca90SVikas Gupta 209751dca90SVikas Gupta qp = (struct bcmfs_qp *)*qp_addr; 210751dca90SVikas Gupta 211751dca90SVikas Gupta qp->sr_mp = bcmfs_sym_req_pool_create(cdev, qp_conf->nb_descriptors, 212751dca90SVikas Gupta qp_id, socket_id); 213751dca90SVikas Gupta if (qp->sr_mp == NULL) 214751dca90SVikas Gupta return -ENOMEM; 215751dca90SVikas Gupta 216751dca90SVikas Gupta /* store a link to the qp in the bcmfs_device */ 217751dca90SVikas Gupta bcmfs_private->fsdev->qps_in_use[qp_id] = *qp_addr; 218751dca90SVikas Gupta 219751dca90SVikas Gupta cdev->data->queue_pairs[qp_id] = qp; 220*f665790aSDavid Marchand BCMFS_LOG(NOTICE, "queue %d setup done", qp_id); 221751dca90SVikas Gupta 222751dca90SVikas Gupta return 0; 223751dca90SVikas Gupta } 224751dca90SVikas Gupta 225751dca90SVikas Gupta static struct rte_cryptodev_ops crypto_bcmfs_ops = { 226751dca90SVikas Gupta /* Device related operations */ 227751dca90SVikas Gupta .dev_configure = bcmfs_sym_dev_config, 228751dca90SVikas Gupta .dev_start = bcmfs_sym_dev_start, 229751dca90SVikas Gupta .dev_stop = bcmfs_sym_dev_stop, 230751dca90SVikas Gupta .dev_close = bcmfs_sym_dev_close, 231751dca90SVikas Gupta .dev_infos_get = bcmfs_sym_dev_info_get, 232751dca90SVikas Gupta /* Stats Collection */ 233751dca90SVikas Gupta .stats_get = bcmfs_sym_stats_get, 234751dca90SVikas Gupta .stats_reset = bcmfs_sym_stats_reset, 235751dca90SVikas Gupta /* Queue-Pair management */ 236751dca90SVikas Gupta .queue_pair_setup = bcmfs_sym_qp_setup, 237751dca90SVikas Gupta .queue_pair_release = bcmfs_sym_qp_release, 2384ed19f0dSVikas Gupta /* Crypto session related operations */ 2394ed19f0dSVikas Gupta .sym_session_get_size = bcmfs_sym_session_get_private_size, 2404ed19f0dSVikas Gupta .sym_session_configure = bcmfs_sym_session_configure, 2414ed19f0dSVikas Gupta .sym_session_clear = bcmfs_sym_session_clear 242751dca90SVikas Gupta }; 243751dca90SVikas Gupta 244751dca90SVikas Gupta /** Enqueue burst */ 245751dca90SVikas Gupta static uint16_t 246751dca90SVikas Gupta bcmfs_sym_pmd_enqueue_op_burst(void *queue_pair, 247751dca90SVikas Gupta struct rte_crypto_op **ops, 248751dca90SVikas Gupta uint16_t nb_ops) 249751dca90SVikas Gupta { 250751dca90SVikas Gupta int i, j; 251492a19a0SVikas Gupta int retval; 252751dca90SVikas Gupta uint16_t enq = 0; 253751dca90SVikas Gupta struct bcmfs_sym_request *sreq; 2544ed19f0dSVikas Gupta struct bcmfs_sym_session *sess; 255751dca90SVikas Gupta struct bcmfs_qp *qp = (struct bcmfs_qp *)queue_pair; 256751dca90SVikas Gupta 257751dca90SVikas Gupta if (nb_ops == 0) 258751dca90SVikas Gupta return 0; 259751dca90SVikas Gupta 260751dca90SVikas Gupta if (nb_ops > BCMFS_MAX_REQS_BUFF) 261751dca90SVikas Gupta nb_ops = BCMFS_MAX_REQS_BUFF; 262751dca90SVikas Gupta 263751dca90SVikas Gupta /* We do not process more than available space */ 264751dca90SVikas Gupta if (nb_ops > (qp->nb_descriptors - qp->nb_pending_requests)) 265751dca90SVikas Gupta nb_ops = qp->nb_descriptors - qp->nb_pending_requests; 266751dca90SVikas Gupta 267751dca90SVikas Gupta for (i = 0; i < nb_ops; i++) { 2684ed19f0dSVikas Gupta sess = bcmfs_sym_get_session(ops[i]); 2694ed19f0dSVikas Gupta if (unlikely(sess == NULL)) 2704ed19f0dSVikas Gupta goto enqueue_err; 2714ed19f0dSVikas Gupta 272751dca90SVikas Gupta if (rte_mempool_get(qp->sr_mp, (void **)&sreq)) 273751dca90SVikas Gupta goto enqueue_err; 274751dca90SVikas Gupta 275751dca90SVikas Gupta /* save rte_crypto_op */ 276751dca90SVikas Gupta sreq->op = ops[i]; 277751dca90SVikas Gupta 278751dca90SVikas Gupta /* save context */ 279751dca90SVikas Gupta qp->infl_msgs[i] = &sreq->msgs; 280751dca90SVikas Gupta qp->infl_msgs[i]->ctx = (void *)sreq; 281492a19a0SVikas Gupta 282492a19a0SVikas Gupta /* pre process the request crypto h/w acceleration */ 283492a19a0SVikas Gupta retval = bcmfs_process_sym_crypto_op(ops[i], sess, sreq); 284492a19a0SVikas Gupta if (unlikely(retval < 0)) 285492a19a0SVikas Gupta goto enqueue_err; 286751dca90SVikas Gupta } 287751dca90SVikas Gupta /* Send burst request to hw QP */ 288751dca90SVikas Gupta enq = bcmfs_enqueue_op_burst(qp, (void **)qp->infl_msgs, i); 289751dca90SVikas Gupta 290751dca90SVikas Gupta for (j = enq; j < i; j++) 291751dca90SVikas Gupta rte_mempool_put(qp->sr_mp, qp->infl_msgs[j]->ctx); 292751dca90SVikas Gupta 293751dca90SVikas Gupta return enq; 294751dca90SVikas Gupta 295751dca90SVikas Gupta enqueue_err: 296751dca90SVikas Gupta for (j = 0; j < i; j++) 297751dca90SVikas Gupta rte_mempool_put(qp->sr_mp, qp->infl_msgs[j]->ctx); 298751dca90SVikas Gupta 299751dca90SVikas Gupta return enq; 300751dca90SVikas Gupta } 301751dca90SVikas Gupta 302492a19a0SVikas Gupta static void bcmfs_sym_set_request_status(struct rte_crypto_op *op, 303492a19a0SVikas Gupta struct bcmfs_sym_request *out) 304492a19a0SVikas Gupta { 305492a19a0SVikas Gupta if (*out->resp == BCMFS_SYM_RESPONSE_SUCCESS) 306492a19a0SVikas Gupta op->status = RTE_CRYPTO_OP_STATUS_SUCCESS; 307492a19a0SVikas Gupta else if (*out->resp == BCMFS_SYM_RESPONSE_HASH_TAG_ERROR) 308492a19a0SVikas Gupta op->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED; 309492a19a0SVikas Gupta else 310492a19a0SVikas Gupta op->status = RTE_CRYPTO_OP_STATUS_ERROR; 311492a19a0SVikas Gupta } 312492a19a0SVikas Gupta 313751dca90SVikas Gupta static uint16_t 314751dca90SVikas Gupta bcmfs_sym_pmd_dequeue_op_burst(void *queue_pair, 315751dca90SVikas Gupta struct rte_crypto_op **ops, 316751dca90SVikas Gupta uint16_t nb_ops) 317751dca90SVikas Gupta { 318751dca90SVikas Gupta int i; 319751dca90SVikas Gupta uint16_t deq = 0; 320751dca90SVikas Gupta unsigned int pkts = 0; 321751dca90SVikas Gupta struct bcmfs_sym_request *sreq; 322751dca90SVikas Gupta struct bcmfs_qp *qp = queue_pair; 323751dca90SVikas Gupta 324751dca90SVikas Gupta if (nb_ops > BCMFS_MAX_REQS_BUFF) 325751dca90SVikas Gupta nb_ops = BCMFS_MAX_REQS_BUFF; 326751dca90SVikas Gupta 327751dca90SVikas Gupta deq = bcmfs_dequeue_op_burst(qp, (void **)qp->infl_msgs, nb_ops); 328751dca90SVikas Gupta /* get rte_crypto_ops */ 329751dca90SVikas Gupta for (i = 0; i < deq; i++) { 330751dca90SVikas Gupta sreq = (struct bcmfs_sym_request *)qp->infl_msgs[i]->ctx; 331751dca90SVikas Gupta 332492a19a0SVikas Gupta /* set the status based on the response from the crypto h/w */ 333492a19a0SVikas Gupta bcmfs_sym_set_request_status(sreq->op, sreq); 334492a19a0SVikas Gupta 335751dca90SVikas Gupta ops[pkts++] = sreq->op; 336751dca90SVikas Gupta 337751dca90SVikas Gupta rte_mempool_put(qp->sr_mp, sreq); 338751dca90SVikas Gupta } 339751dca90SVikas Gupta 340751dca90SVikas Gupta return pkts; 341751dca90SVikas Gupta } 342751dca90SVikas Gupta 343751dca90SVikas Gupta /* 344751dca90SVikas Gupta * An rte_driver is needed in the registration of both the 345751dca90SVikas Gupta * device and the driver with cryptodev. 346751dca90SVikas Gupta */ 347751dca90SVikas Gupta static const char bcmfs_sym_drv_name[] = RTE_STR(CRYPTODEV_NAME_BCMFS_SYM_PMD); 348751dca90SVikas Gupta static const struct rte_driver cryptodev_bcmfs_sym_driver = { 349751dca90SVikas Gupta .name = bcmfs_sym_drv_name, 350751dca90SVikas Gupta .alias = bcmfs_sym_drv_name 351751dca90SVikas Gupta }; 352751dca90SVikas Gupta 353751dca90SVikas Gupta int 354751dca90SVikas Gupta bcmfs_sym_dev_create(struct bcmfs_device *fsdev) 355751dca90SVikas Gupta { 356751dca90SVikas Gupta struct rte_cryptodev_pmd_init_params init_params = { 357751dca90SVikas Gupta .name = "", 358751dca90SVikas Gupta .socket_id = rte_socket_id(), 359751dca90SVikas Gupta .private_data_size = sizeof(struct bcmfs_sym_dev_private) 360751dca90SVikas Gupta }; 361751dca90SVikas Gupta char name[RTE_CRYPTODEV_NAME_MAX_LEN]; 362751dca90SVikas Gupta struct rte_cryptodev *cryptodev; 363751dca90SVikas Gupta struct bcmfs_sym_dev_private *internals; 364751dca90SVikas Gupta 365751dca90SVikas Gupta snprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN, "%s_%s", 366751dca90SVikas Gupta fsdev->name, "sym"); 367751dca90SVikas Gupta 368751dca90SVikas Gupta /* Populate subset device to use in cryptodev device creation */ 369751dca90SVikas Gupta fsdev->sym_rte_dev.driver = &cryptodev_bcmfs_sym_driver; 370751dca90SVikas Gupta fsdev->sym_rte_dev.numa_node = 0; 371751dca90SVikas Gupta fsdev->sym_rte_dev.devargs = NULL; 372751dca90SVikas Gupta 373751dca90SVikas Gupta cryptodev = rte_cryptodev_pmd_create(name, 374751dca90SVikas Gupta &fsdev->sym_rte_dev, 375751dca90SVikas Gupta &init_params); 376751dca90SVikas Gupta if (cryptodev == NULL) 377751dca90SVikas Gupta return -ENODEV; 378751dca90SVikas Gupta 379751dca90SVikas Gupta fsdev->sym_rte_dev.name = cryptodev->data->name; 380751dca90SVikas Gupta cryptodev->driver_id = cryptodev_bcmfs_driver_id; 381751dca90SVikas Gupta cryptodev->dev_ops = &crypto_bcmfs_ops; 382751dca90SVikas Gupta 383751dca90SVikas Gupta cryptodev->enqueue_burst = bcmfs_sym_pmd_enqueue_op_burst; 384751dca90SVikas Gupta cryptodev->dequeue_burst = bcmfs_sym_pmd_dequeue_op_burst; 385751dca90SVikas Gupta 386751dca90SVikas Gupta cryptodev->feature_flags = RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO | 387751dca90SVikas Gupta RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING | 388751dca90SVikas Gupta RTE_CRYPTODEV_FF_OOP_LB_IN_LB_OUT; 389751dca90SVikas Gupta 390751dca90SVikas Gupta internals = cryptodev->data->dev_private; 391751dca90SVikas Gupta internals->fsdev = fsdev; 392751dca90SVikas Gupta fsdev->sym_dev = internals; 393751dca90SVikas Gupta 394751dca90SVikas Gupta internals->sym_dev_id = cryptodev->data->dev_id; 3954ed19f0dSVikas Gupta internals->fsdev_capabilities = bcmfs_sym_get_capabilities(); 396751dca90SVikas Gupta 397d54c72ecSAkhil Goyal rte_cryptodev_pmd_probing_finish(cryptodev); 398d54c72ecSAkhil Goyal 399751dca90SVikas Gupta BCMFS_LOG(DEBUG, "Created bcmfs-sym device %s as cryptodev instance %d", 400751dca90SVikas Gupta cryptodev->data->name, internals->sym_dev_id); 401751dca90SVikas Gupta return 0; 402751dca90SVikas Gupta } 403751dca90SVikas Gupta 404751dca90SVikas Gupta int 405751dca90SVikas Gupta bcmfs_sym_dev_destroy(struct bcmfs_device *fsdev) 406751dca90SVikas Gupta { 407751dca90SVikas Gupta struct rte_cryptodev *cryptodev; 408751dca90SVikas Gupta 409751dca90SVikas Gupta if (fsdev == NULL) 410751dca90SVikas Gupta return -ENODEV; 411751dca90SVikas Gupta if (fsdev->sym_dev == NULL) 412751dca90SVikas Gupta return 0; 413751dca90SVikas Gupta 414751dca90SVikas Gupta /* free crypto device */ 415751dca90SVikas Gupta cryptodev = rte_cryptodev_pmd_get_dev(fsdev->sym_dev->sym_dev_id); 416751dca90SVikas Gupta rte_cryptodev_pmd_destroy(cryptodev); 417751dca90SVikas Gupta fsdev->sym_rte_dev.name = NULL; 418751dca90SVikas Gupta fsdev->sym_dev = NULL; 419751dca90SVikas Gupta 420751dca90SVikas Gupta return 0; 421751dca90SVikas Gupta } 422751dca90SVikas Gupta 423751dca90SVikas Gupta static struct cryptodev_driver bcmfs_crypto_drv; 424751dca90SVikas Gupta RTE_PMD_REGISTER_CRYPTO_DRIVER(bcmfs_crypto_drv, 425751dca90SVikas Gupta cryptodev_bcmfs_sym_driver, 426751dca90SVikas Gupta cryptodev_bcmfs_driver_id); 427