xref: /dpdk/drivers/crypto/bcmfs/bcmfs_sym_pmd.c (revision f665790a5dbad7b645ff46f31d65e977324e7bfc)
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