xref: /dpdk/drivers/crypto/octeontx/otx_cryptodev_ops.c (revision 33bcaae5f85ad805ee287bee42013e61a1cff6fa)
1bfe2ae49SAnoob Joseph /* SPDX-License-Identifier: BSD-3-Clause
2bfe2ae49SAnoob Joseph  * Copyright(c) 2018 Cavium, Inc
3bfe2ae49SAnoob Joseph  */
4bfe2ae49SAnoob Joseph 
50dc1cffaSAnkur Dwivedi #include <rte_alarm.h>
60dc1cffaSAnkur Dwivedi #include <rte_bus_pci.h>
7bfe2ae49SAnoob Joseph #include <rte_cryptodev.h>
80906b99fSMurthy NSSR #include <rte_cryptodev_pmd.h>
9ec54bc9dSAnoob Joseph #include <rte_errno.h>
100dc1cffaSAnkur Dwivedi #include <rte_malloc.h>
11ec54bc9dSAnoob Joseph #include <rte_mempool.h>
120dc1cffaSAnkur Dwivedi 
13bfe2ae49SAnoob Joseph #include "otx_cryptodev.h"
140906b99fSMurthy NSSR #include "otx_cryptodev_capabilities.h"
150dc1cffaSAnkur Dwivedi #include "otx_cryptodev_hw_access.h"
1613d711f3SKanaka Durga Kotamarthy #include "otx_cryptodev_mbox.h"
17bfe2ae49SAnoob Joseph #include "otx_cryptodev_ops.h"
18bfe2ae49SAnoob Joseph 
1998c7b9c9SAnoob Joseph #include "cpt_pmd_logs.h"
2098c7b9c9SAnoob Joseph #include "cpt_ucode.h"
21*33bcaae5SKanaka Durga Kotamarthy #include "cpt_ucode_asym.h"
2298c7b9c9SAnoob Joseph 
230961348fSMurthy NSSR /* Forward declarations */
240961348fSMurthy NSSR 
250961348fSMurthy NSSR static int
260961348fSMurthy NSSR otx_cpt_que_pair_release(struct rte_cryptodev *dev, uint16_t que_pair_id);
270961348fSMurthy NSSR 
280dc1cffaSAnkur Dwivedi /* Alarm routines */
290dc1cffaSAnkur Dwivedi 
300dc1cffaSAnkur Dwivedi static void
310dc1cffaSAnkur Dwivedi otx_cpt_alarm_cb(void *arg)
320dc1cffaSAnkur Dwivedi {
330dc1cffaSAnkur Dwivedi 	struct cpt_vf *cptvf = arg;
340dc1cffaSAnkur Dwivedi 	otx_cpt_poll_misc(cptvf);
350dc1cffaSAnkur Dwivedi 	rte_eal_alarm_set(CPT_INTR_POLL_INTERVAL_MS * 1000,
360dc1cffaSAnkur Dwivedi 			  otx_cpt_alarm_cb, cptvf);
370dc1cffaSAnkur Dwivedi }
380dc1cffaSAnkur Dwivedi 
390dc1cffaSAnkur Dwivedi static int
400dc1cffaSAnkur Dwivedi otx_cpt_periodic_alarm_start(void *arg)
410dc1cffaSAnkur Dwivedi {
420dc1cffaSAnkur Dwivedi 	return rte_eal_alarm_set(CPT_INTR_POLL_INTERVAL_MS * 1000,
430dc1cffaSAnkur Dwivedi 				 otx_cpt_alarm_cb, arg);
440dc1cffaSAnkur Dwivedi }
450dc1cffaSAnkur Dwivedi 
46273487f7SAnoob Joseph static int
47273487f7SAnoob Joseph otx_cpt_periodic_alarm_stop(void *arg)
48273487f7SAnoob Joseph {
49273487f7SAnoob Joseph 	return rte_eal_alarm_cancel(otx_cpt_alarm_cb, arg);
50273487f7SAnoob Joseph }
51273487f7SAnoob Joseph 
520906b99fSMurthy NSSR /* PMD ops */
530906b99fSMurthy NSSR 
540906b99fSMurthy NSSR static int
550906b99fSMurthy NSSR otx_cpt_dev_config(struct rte_cryptodev *dev __rte_unused,
560906b99fSMurthy NSSR 		   struct rte_cryptodev_config *config __rte_unused)
570906b99fSMurthy NSSR {
580906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
590906b99fSMurthy NSSR 	return 0;
600906b99fSMurthy NSSR }
610906b99fSMurthy NSSR 
620906b99fSMurthy NSSR static int
630906b99fSMurthy NSSR otx_cpt_dev_start(struct rte_cryptodev *c_dev)
640906b99fSMurthy NSSR {
650906b99fSMurthy NSSR 	void *cptvf = c_dev->data->dev_private;
660906b99fSMurthy NSSR 
670906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
680906b99fSMurthy NSSR 
690906b99fSMurthy NSSR 	return otx_cpt_start_device(cptvf);
700906b99fSMurthy NSSR }
710906b99fSMurthy NSSR 
720906b99fSMurthy NSSR static void
730906b99fSMurthy NSSR otx_cpt_dev_stop(struct rte_cryptodev *c_dev)
740906b99fSMurthy NSSR {
750906b99fSMurthy NSSR 	void *cptvf = c_dev->data->dev_private;
760906b99fSMurthy NSSR 
770906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
780906b99fSMurthy NSSR 
790906b99fSMurthy NSSR 	otx_cpt_stop_device(cptvf);
800906b99fSMurthy NSSR }
810906b99fSMurthy NSSR 
820906b99fSMurthy NSSR static int
830906b99fSMurthy NSSR otx_cpt_dev_close(struct rte_cryptodev *c_dev)
840906b99fSMurthy NSSR {
850906b99fSMurthy NSSR 	void *cptvf = c_dev->data->dev_private;
860961348fSMurthy NSSR 	int i, ret;
870906b99fSMurthy NSSR 
880906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
890906b99fSMurthy NSSR 
900961348fSMurthy NSSR 	for (i = 0; i < c_dev->data->nb_queue_pairs; i++) {
910961348fSMurthy NSSR 		ret = otx_cpt_que_pair_release(c_dev, i);
920961348fSMurthy NSSR 		if (ret)
930961348fSMurthy NSSR 			return ret;
940961348fSMurthy NSSR 	}
950961348fSMurthy NSSR 
960906b99fSMurthy NSSR 	otx_cpt_periodic_alarm_stop(cptvf);
970906b99fSMurthy NSSR 	otx_cpt_deinit_device(cptvf);
980906b99fSMurthy NSSR 
990906b99fSMurthy NSSR 	return 0;
1000906b99fSMurthy NSSR }
1010906b99fSMurthy NSSR 
1020906b99fSMurthy NSSR static void
1030906b99fSMurthy NSSR otx_cpt_dev_info_get(struct rte_cryptodev *dev, struct rte_cryptodev_info *info)
1040906b99fSMurthy NSSR {
1050906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
1060906b99fSMurthy NSSR 	if (info != NULL) {
1070906b99fSMurthy NSSR 		info->max_nb_queue_pairs = CPT_NUM_QS_PER_VF;
1080906b99fSMurthy NSSR 		info->feature_flags = dev->feature_flags;
109*33bcaae5SKanaka Durga Kotamarthy 		info->capabilities = otx_get_capabilities(info->feature_flags);
1100906b99fSMurthy NSSR 		info->sym.max_nb_sessions = 0;
1110906b99fSMurthy NSSR 		info->driver_id = otx_cryptodev_driver_id;
1120906b99fSMurthy NSSR 		info->min_mbuf_headroom_req = OTX_CPT_MIN_HEADROOM_REQ;
1130906b99fSMurthy NSSR 		info->min_mbuf_tailroom_req = OTX_CPT_MIN_TAILROOM_REQ;
1140906b99fSMurthy NSSR 	}
1150906b99fSMurthy NSSR }
1160906b99fSMurthy NSSR 
1170906b99fSMurthy NSSR static void
1180906b99fSMurthy NSSR otx_cpt_stats_get(struct rte_cryptodev *dev __rte_unused,
1190906b99fSMurthy NSSR 		  struct rte_cryptodev_stats *stats __rte_unused)
1200906b99fSMurthy NSSR {
1210906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
1220906b99fSMurthy NSSR }
1230906b99fSMurthy NSSR 
1240906b99fSMurthy NSSR static void
1250906b99fSMurthy NSSR otx_cpt_stats_reset(struct rte_cryptodev *dev __rte_unused)
1260906b99fSMurthy NSSR {
1270906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
1280906b99fSMurthy NSSR }
1290906b99fSMurthy NSSR 
1300961348fSMurthy NSSR static int
1310961348fSMurthy NSSR otx_cpt_que_pair_setup(struct rte_cryptodev *dev,
1320961348fSMurthy NSSR 		       uint16_t que_pair_id,
1330961348fSMurthy NSSR 		       const struct rte_cryptodev_qp_conf *qp_conf,
134725d2a7fSFan Zhang 		       int socket_id __rte_unused)
1350961348fSMurthy NSSR {
1360961348fSMurthy NSSR 	struct cpt_instance *instance = NULL;
1370961348fSMurthy NSSR 	struct rte_pci_device *pci_dev;
1380961348fSMurthy NSSR 	int ret = -1;
1390961348fSMurthy NSSR 
1400961348fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
1410961348fSMurthy NSSR 
1420961348fSMurthy NSSR 	if (dev->data->queue_pairs[que_pair_id] != NULL) {
1430961348fSMurthy NSSR 		ret = otx_cpt_que_pair_release(dev, que_pair_id);
1440961348fSMurthy NSSR 		if (ret)
1450961348fSMurthy NSSR 			return ret;
1460961348fSMurthy NSSR 	}
1470961348fSMurthy NSSR 
1480961348fSMurthy NSSR 	if (qp_conf->nb_descriptors > DEFAULT_CMD_QLEN) {
1490961348fSMurthy NSSR 		CPT_LOG_INFO("Number of descriptors too big %d, using default "
1500961348fSMurthy NSSR 			     "queue length of %d", qp_conf->nb_descriptors,
1510961348fSMurthy NSSR 			     DEFAULT_CMD_QLEN);
1520961348fSMurthy NSSR 	}
1530961348fSMurthy NSSR 
1540961348fSMurthy NSSR 	pci_dev = RTE_DEV_TO_PCI(dev->device);
1550961348fSMurthy NSSR 
1560961348fSMurthy NSSR 	if (pci_dev->mem_resource[0].addr == NULL) {
1570961348fSMurthy NSSR 		CPT_LOG_ERR("PCI mem address null");
1580961348fSMurthy NSSR 		return -EIO;
1590961348fSMurthy NSSR 	}
1600961348fSMurthy NSSR 
161ec54bc9dSAnoob Joseph 	ret = otx_cpt_get_resource(dev, 0, &instance, que_pair_id);
162accf8ca7SAnoob Joseph 	if (ret != 0 || instance == NULL) {
1630961348fSMurthy NSSR 		CPT_LOG_ERR("Error getting instance handle from device %s : "
1640961348fSMurthy NSSR 			    "ret = %d", dev->data->name, ret);
1650961348fSMurthy NSSR 		return ret;
1660961348fSMurthy NSSR 	}
1670961348fSMurthy NSSR 
1680961348fSMurthy NSSR 	instance->queue_id = que_pair_id;
169f194f198SAnoob Joseph 	instance->sess_mp = qp_conf->mp_session;
170f194f198SAnoob Joseph 	instance->sess_mp_priv = qp_conf->mp_session_private;
1710961348fSMurthy NSSR 	dev->data->queue_pairs[que_pair_id] = instance;
1720961348fSMurthy NSSR 
1730961348fSMurthy NSSR 	return 0;
1740961348fSMurthy NSSR }
1750961348fSMurthy NSSR 
1760961348fSMurthy NSSR static int
1770961348fSMurthy NSSR otx_cpt_que_pair_release(struct rte_cryptodev *dev, uint16_t que_pair_id)
1780961348fSMurthy NSSR {
1790961348fSMurthy NSSR 	struct cpt_instance *instance = dev->data->queue_pairs[que_pair_id];
1800961348fSMurthy NSSR 	int ret;
1810961348fSMurthy NSSR 
1820961348fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
1830961348fSMurthy NSSR 
1840961348fSMurthy NSSR 	ret = otx_cpt_put_resource(instance);
1850961348fSMurthy NSSR 	if (ret != 0) {
1860961348fSMurthy NSSR 		CPT_LOG_ERR("Error putting instance handle of device %s : "
1870961348fSMurthy NSSR 			    "ret = %d", dev->data->name, ret);
1880961348fSMurthy NSSR 		return ret;
1890961348fSMurthy NSSR 	}
1900961348fSMurthy NSSR 
1910961348fSMurthy NSSR 	dev->data->queue_pairs[que_pair_id] = NULL;
1920961348fSMurthy NSSR 
1930961348fSMurthy NSSR 	return 0;
1940961348fSMurthy NSSR }
1950961348fSMurthy NSSR 
19643d01767SNithin Dabilpuram static unsigned int
19743d01767SNithin Dabilpuram otx_cpt_get_session_size(struct rte_cryptodev *dev __rte_unused)
19843d01767SNithin Dabilpuram {
19943d01767SNithin Dabilpuram 	return cpt_get_session_size();
20043d01767SNithin Dabilpuram }
20143d01767SNithin Dabilpuram 
20243d01767SNithin Dabilpuram static void
20343d01767SNithin Dabilpuram otx_cpt_session_init(void *sym_sess, uint8_t driver_id)
20443d01767SNithin Dabilpuram {
20543d01767SNithin Dabilpuram 	struct rte_cryptodev_sym_session *sess = sym_sess;
20643d01767SNithin Dabilpuram 	struct cpt_sess_misc *cpt_sess =
20743d01767SNithin Dabilpuram 	 (struct cpt_sess_misc *) get_sym_session_private_data(sess, driver_id);
20843d01767SNithin Dabilpuram 
20943d01767SNithin Dabilpuram 	CPT_PMD_INIT_FUNC_TRACE();
21043d01767SNithin Dabilpuram 	cpt_sess->ctx_dma_addr = rte_mempool_virt2iova(cpt_sess) +
21143d01767SNithin Dabilpuram 			sizeof(struct cpt_sess_misc);
21243d01767SNithin Dabilpuram }
21343d01767SNithin Dabilpuram 
21443d01767SNithin Dabilpuram static int
21543d01767SNithin Dabilpuram otx_cpt_session_cfg(struct rte_cryptodev *dev,
21643d01767SNithin Dabilpuram 		    struct rte_crypto_sym_xform *xform,
21743d01767SNithin Dabilpuram 		    struct rte_cryptodev_sym_session *sess,
21843d01767SNithin Dabilpuram 		    struct rte_mempool *mempool)
21943d01767SNithin Dabilpuram {
22043d01767SNithin Dabilpuram 	struct rte_crypto_sym_xform *chain;
22143d01767SNithin Dabilpuram 	void *sess_private_data = NULL;
22243d01767SNithin Dabilpuram 
22343d01767SNithin Dabilpuram 	CPT_PMD_INIT_FUNC_TRACE();
22443d01767SNithin Dabilpuram 
22543d01767SNithin Dabilpuram 	if (cpt_is_algo_supported(xform))
22643d01767SNithin Dabilpuram 		goto err;
22743d01767SNithin Dabilpuram 
22843d01767SNithin Dabilpuram 	if (unlikely(sess == NULL)) {
22943d01767SNithin Dabilpuram 		CPT_LOG_ERR("invalid session struct");
23043d01767SNithin Dabilpuram 		return -EINVAL;
23143d01767SNithin Dabilpuram 	}
23243d01767SNithin Dabilpuram 
23343d01767SNithin Dabilpuram 	if (rte_mempool_get(mempool, &sess_private_data)) {
23443d01767SNithin Dabilpuram 		CPT_LOG_ERR("Could not allocate sess_private_data");
23543d01767SNithin Dabilpuram 		return -ENOMEM;
23643d01767SNithin Dabilpuram 	}
23743d01767SNithin Dabilpuram 
23843d01767SNithin Dabilpuram 	chain = xform;
23943d01767SNithin Dabilpuram 	while (chain) {
24043d01767SNithin Dabilpuram 		switch (chain->type) {
2416cc54096SNithin Dabilpuram 		case RTE_CRYPTO_SYM_XFORM_AEAD:
2426cc54096SNithin Dabilpuram 			if (fill_sess_aead(chain, sess_private_data))
2436cc54096SNithin Dabilpuram 				goto err;
2446cc54096SNithin Dabilpuram 			break;
2456cc54096SNithin Dabilpuram 		case RTE_CRYPTO_SYM_XFORM_CIPHER:
2466cc54096SNithin Dabilpuram 			if (fill_sess_cipher(chain, sess_private_data))
2476cc54096SNithin Dabilpuram 				goto err;
2486cc54096SNithin Dabilpuram 			break;
2496cc54096SNithin Dabilpuram 		case RTE_CRYPTO_SYM_XFORM_AUTH:
2506cc54096SNithin Dabilpuram 			if (chain->auth.algo == RTE_CRYPTO_AUTH_AES_GMAC) {
2516cc54096SNithin Dabilpuram 				if (fill_sess_gmac(chain, sess_private_data))
2526cc54096SNithin Dabilpuram 					goto err;
2536cc54096SNithin Dabilpuram 			} else {
2546cc54096SNithin Dabilpuram 				if (fill_sess_auth(chain, sess_private_data))
2556cc54096SNithin Dabilpuram 					goto err;
2566cc54096SNithin Dabilpuram 			}
2576cc54096SNithin Dabilpuram 			break;
25843d01767SNithin Dabilpuram 		default:
25943d01767SNithin Dabilpuram 			CPT_LOG_ERR("Invalid crypto xform type");
26043d01767SNithin Dabilpuram 			break;
26143d01767SNithin Dabilpuram 		}
26243d01767SNithin Dabilpuram 		chain = chain->next;
26343d01767SNithin Dabilpuram 	}
26443d01767SNithin Dabilpuram 	set_sym_session_private_data(sess, dev->driver_id, sess_private_data);
26543d01767SNithin Dabilpuram 	otx_cpt_session_init(sess, dev->driver_id);
26643d01767SNithin Dabilpuram 	return 0;
26743d01767SNithin Dabilpuram 
26843d01767SNithin Dabilpuram err:
26943d01767SNithin Dabilpuram 	if (sess_private_data)
27043d01767SNithin Dabilpuram 		rte_mempool_put(mempool, sess_private_data);
27143d01767SNithin Dabilpuram 	return -EPERM;
27243d01767SNithin Dabilpuram }
27343d01767SNithin Dabilpuram 
27443d01767SNithin Dabilpuram static void
27543d01767SNithin Dabilpuram otx_cpt_session_clear(struct rte_cryptodev *dev,
27643d01767SNithin Dabilpuram 		  struct rte_cryptodev_sym_session *sess)
27743d01767SNithin Dabilpuram {
27843d01767SNithin Dabilpuram 	void *sess_priv = get_sym_session_private_data(sess, dev->driver_id);
27943d01767SNithin Dabilpuram 
28043d01767SNithin Dabilpuram 	CPT_PMD_INIT_FUNC_TRACE();
28143d01767SNithin Dabilpuram 	if (sess_priv) {
28243d01767SNithin Dabilpuram 		memset(sess_priv, 0, otx_cpt_get_session_size(dev));
28343d01767SNithin Dabilpuram 		struct rte_mempool *sess_mp = rte_mempool_from_obj(sess_priv);
28443d01767SNithin Dabilpuram 		set_sym_session_private_data(sess, dev->driver_id, NULL);
28543d01767SNithin Dabilpuram 		rte_mempool_put(sess_mp, sess_priv);
28643d01767SNithin Dabilpuram 	}
28743d01767SNithin Dabilpuram }
28843d01767SNithin Dabilpuram 
289*33bcaae5SKanaka Durga Kotamarthy static unsigned int
290*33bcaae5SKanaka Durga Kotamarthy otx_cpt_asym_session_size_get(struct rte_cryptodev *dev __rte_unused)
291*33bcaae5SKanaka Durga Kotamarthy {
292*33bcaae5SKanaka Durga Kotamarthy 	return sizeof(struct cpt_asym_sess_misc);
293*33bcaae5SKanaka Durga Kotamarthy }
294*33bcaae5SKanaka Durga Kotamarthy 
295*33bcaae5SKanaka Durga Kotamarthy static int
296*33bcaae5SKanaka Durga Kotamarthy otx_cpt_asym_session_cfg(struct rte_cryptodev *dev,
297*33bcaae5SKanaka Durga Kotamarthy 			 struct rte_crypto_asym_xform *xform __rte_unused,
298*33bcaae5SKanaka Durga Kotamarthy 			 struct rte_cryptodev_asym_session *sess,
299*33bcaae5SKanaka Durga Kotamarthy 			 struct rte_mempool *pool)
300*33bcaae5SKanaka Durga Kotamarthy {
301*33bcaae5SKanaka Durga Kotamarthy 	struct cpt_asym_sess_misc *priv;
302*33bcaae5SKanaka Durga Kotamarthy 	int ret;
303*33bcaae5SKanaka Durga Kotamarthy 
304*33bcaae5SKanaka Durga Kotamarthy 	CPT_PMD_INIT_FUNC_TRACE();
305*33bcaae5SKanaka Durga Kotamarthy 
306*33bcaae5SKanaka Durga Kotamarthy 	if (rte_mempool_get(pool, (void **)&priv)) {
307*33bcaae5SKanaka Durga Kotamarthy 		CPT_LOG_ERR("Could not allocate session private data");
308*33bcaae5SKanaka Durga Kotamarthy 		return -ENOMEM;
309*33bcaae5SKanaka Durga Kotamarthy 	}
310*33bcaae5SKanaka Durga Kotamarthy 
311*33bcaae5SKanaka Durga Kotamarthy 	memset(priv, 0, sizeof(struct cpt_asym_sess_misc));
312*33bcaae5SKanaka Durga Kotamarthy 
313*33bcaae5SKanaka Durga Kotamarthy 	ret = cpt_fill_asym_session_parameters(priv, xform);
314*33bcaae5SKanaka Durga Kotamarthy 	if (ret) {
315*33bcaae5SKanaka Durga Kotamarthy 		CPT_LOG_ERR("Could not configure session parameters");
316*33bcaae5SKanaka Durga Kotamarthy 
317*33bcaae5SKanaka Durga Kotamarthy 		/* Return session to mempool */
318*33bcaae5SKanaka Durga Kotamarthy 		rte_mempool_put(pool, priv);
319*33bcaae5SKanaka Durga Kotamarthy 		return ret;
320*33bcaae5SKanaka Durga Kotamarthy 	}
321*33bcaae5SKanaka Durga Kotamarthy 
322*33bcaae5SKanaka Durga Kotamarthy 	set_asym_session_private_data(sess, dev->driver_id, priv);
323*33bcaae5SKanaka Durga Kotamarthy 	return 0;
324*33bcaae5SKanaka Durga Kotamarthy }
325*33bcaae5SKanaka Durga Kotamarthy 
326*33bcaae5SKanaka Durga Kotamarthy static void
327*33bcaae5SKanaka Durga Kotamarthy otx_cpt_asym_session_clear(struct rte_cryptodev *dev,
328*33bcaae5SKanaka Durga Kotamarthy 			   struct rte_cryptodev_asym_session *sess)
329*33bcaae5SKanaka Durga Kotamarthy {
330*33bcaae5SKanaka Durga Kotamarthy 	struct cpt_asym_sess_misc *priv;
331*33bcaae5SKanaka Durga Kotamarthy 	struct rte_mempool *sess_mp;
332*33bcaae5SKanaka Durga Kotamarthy 
333*33bcaae5SKanaka Durga Kotamarthy 	CPT_PMD_INIT_FUNC_TRACE();
334*33bcaae5SKanaka Durga Kotamarthy 
335*33bcaae5SKanaka Durga Kotamarthy 	priv = get_asym_session_private_data(sess, dev->driver_id);
336*33bcaae5SKanaka Durga Kotamarthy 
337*33bcaae5SKanaka Durga Kotamarthy 	if (priv == NULL)
338*33bcaae5SKanaka Durga Kotamarthy 		return;
339*33bcaae5SKanaka Durga Kotamarthy 
340*33bcaae5SKanaka Durga Kotamarthy 	/* Free resources allocated during session configure */
341*33bcaae5SKanaka Durga Kotamarthy 	cpt_free_asym_session_parameters(priv);
342*33bcaae5SKanaka Durga Kotamarthy 	memset(priv, 0, otx_cpt_asym_session_size_get(dev));
343*33bcaae5SKanaka Durga Kotamarthy 	sess_mp = rte_mempool_from_obj(priv);
344*33bcaae5SKanaka Durga Kotamarthy 	set_asym_session_private_data(sess, dev->driver_id, NULL);
345*33bcaae5SKanaka Durga Kotamarthy 	rte_mempool_put(sess_mp, priv);
346*33bcaae5SKanaka Durga Kotamarthy }
347*33bcaae5SKanaka Durga Kotamarthy 
348f194f198SAnoob Joseph static __rte_always_inline int32_t __hot
349f194f198SAnoob Joseph otx_cpt_request_enqueue(struct cpt_instance *instance,
350f194f198SAnoob Joseph 			struct pending_queue *pqueue,
351f194f198SAnoob Joseph 			void *req)
352f194f198SAnoob Joseph {
353f194f198SAnoob Joseph 	struct cpt_request_info *user_req = (struct cpt_request_info *)req;
354f194f198SAnoob Joseph 
355f194f198SAnoob Joseph 	if (unlikely(pqueue->pending_count >= DEFAULT_CMD_QLEN))
356f194f198SAnoob Joseph 		return -EAGAIN;
357f194f198SAnoob Joseph 
358f194f198SAnoob Joseph 	fill_cpt_inst(instance, req);
359f194f198SAnoob Joseph 
360f194f198SAnoob Joseph 	CPT_LOG_DP_DEBUG("req: %p op: %p ", req, user_req->op);
361f194f198SAnoob Joseph 
362f194f198SAnoob Joseph 	/* Fill time_out cycles */
363f194f198SAnoob Joseph 	user_req->time_out = rte_get_timer_cycles() +
364f194f198SAnoob Joseph 			DEFAULT_COMMAND_TIMEOUT * rte_get_timer_hz();
365f194f198SAnoob Joseph 	user_req->extra_time = 0;
366f194f198SAnoob Joseph 
367f194f198SAnoob Joseph 	/* Default mode of software queue */
368f194f198SAnoob Joseph 	mark_cpt_inst(instance);
369f194f198SAnoob Joseph 
370f194f198SAnoob Joseph 	pqueue->rid_queue[pqueue->enq_tail].rid = (uintptr_t)user_req;
371f194f198SAnoob Joseph 
372f194f198SAnoob Joseph 	/* We will use soft queue length here to limit requests */
373f194f198SAnoob Joseph 	MOD_INC(pqueue->enq_tail, DEFAULT_CMD_QLEN);
374f194f198SAnoob Joseph 	pqueue->pending_count += 1;
375f194f198SAnoob Joseph 
376f194f198SAnoob Joseph 	CPT_LOG_DP_DEBUG("Submitted NB cmd with request: %p "
377f194f198SAnoob Joseph 			 "op: %p", user_req, user_req->op);
378f194f198SAnoob Joseph 	return 0;
379f194f198SAnoob Joseph }
380f194f198SAnoob Joseph 
381f194f198SAnoob Joseph static __rte_always_inline int __hot
382f194f198SAnoob Joseph otx_cpt_enq_single_sym(struct cpt_instance *instance,
383f194f198SAnoob Joseph 		       struct rte_crypto_op *op,
384f194f198SAnoob Joseph 		       struct pending_queue *pqueue)
385f194f198SAnoob Joseph {
386f194f198SAnoob Joseph 	struct cpt_sess_misc *sess;
387f194f198SAnoob Joseph 	struct rte_crypto_sym_op *sym_op = op->sym;
388f194f198SAnoob Joseph 	void *prep_req, *mdata = NULL;
389f194f198SAnoob Joseph 	int ret = 0;
390f194f198SAnoob Joseph 	uint64_t cpt_op;
391f194f198SAnoob Joseph 
392f194f198SAnoob Joseph 	sess = (struct cpt_sess_misc *)
393f194f198SAnoob Joseph 			get_sym_session_private_data(sym_op->session,
394f194f198SAnoob Joseph 						     otx_cryptodev_driver_id);
395f194f198SAnoob Joseph 
396f194f198SAnoob Joseph 	cpt_op = sess->cpt_op;
397f194f198SAnoob Joseph 
398f194f198SAnoob Joseph 	if (likely(cpt_op & CPT_OP_CIPHER_MASK))
399ec54bc9dSAnoob Joseph 		ret = fill_fc_params(op, sess, &instance->meta_info, &mdata,
400f194f198SAnoob Joseph 				     &prep_req);
401f194f198SAnoob Joseph 	else
402ec54bc9dSAnoob Joseph 		ret = fill_digest_params(op, sess, &instance->meta_info,
403f194f198SAnoob Joseph 					 &mdata, &prep_req);
404f194f198SAnoob Joseph 
405f194f198SAnoob Joseph 	if (unlikely(ret)) {
406f194f198SAnoob Joseph 		CPT_LOG_DP_ERR("prep cryto req : op %p, cpt_op 0x%x "
407f194f198SAnoob Joseph 			       "ret 0x%x", op, (unsigned int)cpt_op, ret);
408f194f198SAnoob Joseph 		return ret;
409f194f198SAnoob Joseph 	}
410f194f198SAnoob Joseph 
411f194f198SAnoob Joseph 	/* Enqueue prepared instruction to h/w */
412f194f198SAnoob Joseph 	ret = otx_cpt_request_enqueue(instance, pqueue, prep_req);
413f194f198SAnoob Joseph 
414f194f198SAnoob Joseph 	if (unlikely(ret)) {
415f194f198SAnoob Joseph 		/* Buffer allocated for request preparation need to be freed */
416ec54bc9dSAnoob Joseph 		free_op_meta(mdata, instance->meta_info.pool);
417f194f198SAnoob Joseph 		return ret;
418f194f198SAnoob Joseph 	}
419f194f198SAnoob Joseph 
420f194f198SAnoob Joseph 	return 0;
421f194f198SAnoob Joseph }
422f194f198SAnoob Joseph 
423f194f198SAnoob Joseph static __rte_always_inline int __hot
424f194f198SAnoob Joseph otx_cpt_enq_single_sym_sessless(struct cpt_instance *instance,
425f194f198SAnoob Joseph 				struct rte_crypto_op *op,
426f194f198SAnoob Joseph 				struct pending_queue *pqueue)
427f194f198SAnoob Joseph {
428f194f198SAnoob Joseph 	struct cpt_sess_misc *sess;
429f194f198SAnoob Joseph 	struct rte_crypto_sym_op *sym_op = op->sym;
430f194f198SAnoob Joseph 	int ret;
431f194f198SAnoob Joseph 	void *sess_t = NULL;
432f194f198SAnoob Joseph 	void *sess_private_data_t = NULL;
433f194f198SAnoob Joseph 
434f194f198SAnoob Joseph 	/* Create tmp session */
435f194f198SAnoob Joseph 
436f194f198SAnoob Joseph 	if (rte_mempool_get(instance->sess_mp, (void **)&sess_t)) {
437f194f198SAnoob Joseph 		ret = -ENOMEM;
438f194f198SAnoob Joseph 		goto exit;
439f194f198SAnoob Joseph 	}
440f194f198SAnoob Joseph 
441f194f198SAnoob Joseph 	if (rte_mempool_get(instance->sess_mp_priv,
442f194f198SAnoob Joseph 			(void **)&sess_private_data_t)) {
443f194f198SAnoob Joseph 		ret = -ENOMEM;
444f194f198SAnoob Joseph 		goto free_sess;
445f194f198SAnoob Joseph 	}
446f194f198SAnoob Joseph 
447f194f198SAnoob Joseph 	sess = (struct cpt_sess_misc *)sess_private_data_t;
448f194f198SAnoob Joseph 
449f194f198SAnoob Joseph 	sess->ctx_dma_addr = rte_mempool_virt2iova(sess) +
450f194f198SAnoob Joseph 			sizeof(struct cpt_sess_misc);
451f194f198SAnoob Joseph 
452f194f198SAnoob Joseph 	ret = instance_session_cfg(sym_op->xform, (void *)sess);
453f194f198SAnoob Joseph 	if (unlikely(ret)) {
454f194f198SAnoob Joseph 		ret = -EINVAL;
455f194f198SAnoob Joseph 		goto free_sess_priv;
456f194f198SAnoob Joseph 	}
457f194f198SAnoob Joseph 
458f194f198SAnoob Joseph 	/* Save tmp session in op */
459f194f198SAnoob Joseph 
460f194f198SAnoob Joseph 	sym_op->session = (struct rte_cryptodev_sym_session *)sess_t;
461f194f198SAnoob Joseph 	set_sym_session_private_data(sym_op->session, otx_cryptodev_driver_id,
462f194f198SAnoob Joseph 				     sess_private_data_t);
463f194f198SAnoob Joseph 
464f194f198SAnoob Joseph 	/* Enqueue op with the tmp session set */
465f194f198SAnoob Joseph 	ret = otx_cpt_enq_single_sym(instance, op, pqueue);
466f194f198SAnoob Joseph 
467f194f198SAnoob Joseph 	if (unlikely(ret))
468f194f198SAnoob Joseph 		goto free_sess_priv;
469f194f198SAnoob Joseph 
470f194f198SAnoob Joseph 	return 0;
471f194f198SAnoob Joseph 
472f194f198SAnoob Joseph free_sess_priv:
473f194f198SAnoob Joseph 	rte_mempool_put(instance->sess_mp_priv, sess_private_data_t);
474f194f198SAnoob Joseph free_sess:
475f194f198SAnoob Joseph 	rte_mempool_put(instance->sess_mp, sess_t);
476f194f198SAnoob Joseph exit:
477f194f198SAnoob Joseph 	return ret;
478f194f198SAnoob Joseph }
479f194f198SAnoob Joseph 
480f194f198SAnoob Joseph static __rte_always_inline int __hot
481f194f198SAnoob Joseph otx_cpt_enq_single(struct cpt_instance *inst,
482f194f198SAnoob Joseph 		   struct rte_crypto_op *op,
483f194f198SAnoob Joseph 		   struct pending_queue *pqueue)
484f194f198SAnoob Joseph {
485f194f198SAnoob Joseph 	/* Check for the type */
486f194f198SAnoob Joseph 
487f194f198SAnoob Joseph 	if (op->sess_type == RTE_CRYPTO_OP_WITH_SESSION)
488f194f198SAnoob Joseph 		return otx_cpt_enq_single_sym(inst, op, pqueue);
489f194f198SAnoob Joseph 	else if (unlikely(op->sess_type == RTE_CRYPTO_OP_SESSIONLESS))
490f194f198SAnoob Joseph 		return otx_cpt_enq_single_sym_sessless(inst, op, pqueue);
491f194f198SAnoob Joseph 
492f194f198SAnoob Joseph 	/* Should not reach here */
493f194f198SAnoob Joseph 	return -EINVAL;
494f194f198SAnoob Joseph }
495f194f198SAnoob Joseph 
496ac4d88afSTejasree Kondoj static uint16_t
497ac4d88afSTejasree Kondoj otx_cpt_pkt_enqueue(void *qptr, struct rte_crypto_op **ops, uint16_t nb_ops)
498ac4d88afSTejasree Kondoj {
499ac4d88afSTejasree Kondoj 	struct cpt_instance *instance = (struct cpt_instance *)qptr;
500f194f198SAnoob Joseph 	uint16_t count;
501ac4d88afSTejasree Kondoj 	int ret;
502ac4d88afSTejasree Kondoj 	struct cpt_vf *cptvf = (struct cpt_vf *)instance;
503ac4d88afSTejasree Kondoj 	struct pending_queue *pqueue = &cptvf->pqueue;
504ac4d88afSTejasree Kondoj 
505ac4d88afSTejasree Kondoj 	count = DEFAULT_CMD_QLEN - pqueue->pending_count;
506ac4d88afSTejasree Kondoj 	if (nb_ops > count)
507ac4d88afSTejasree Kondoj 		nb_ops = count;
508ac4d88afSTejasree Kondoj 
509ac4d88afSTejasree Kondoj 	count = 0;
510ac4d88afSTejasree Kondoj 	while (likely(count < nb_ops)) {
511f194f198SAnoob Joseph 
512f194f198SAnoob Joseph 		/* Enqueue single op */
513f194f198SAnoob Joseph 		ret = otx_cpt_enq_single(instance, ops[count], pqueue);
514f194f198SAnoob Joseph 
515ac4d88afSTejasree Kondoj 		if (unlikely(ret))
516ac4d88afSTejasree Kondoj 			break;
517ac4d88afSTejasree Kondoj 		count++;
518ac4d88afSTejasree Kondoj 	}
519ac4d88afSTejasree Kondoj 	otx_cpt_ring_dbell(instance, count);
520ac4d88afSTejasree Kondoj 	return count;
521ac4d88afSTejasree Kondoj }
522ac4d88afSTejasree Kondoj 
523f194f198SAnoob Joseph static __rte_always_inline void
524f194f198SAnoob Joseph otx_cpt_dequeue_post_process(struct rte_crypto_op *cop, uintptr_t *rsp)
525f194f198SAnoob Joseph {
526f194f198SAnoob Joseph 	/* H/w has returned success */
527f194f198SAnoob Joseph 	cop->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
528f194f198SAnoob Joseph 
529f194f198SAnoob Joseph 	/* Perform further post processing */
530f194f198SAnoob Joseph 
531f194f198SAnoob Joseph 	if (cop->type == RTE_CRYPTO_OP_TYPE_SYMMETRIC) {
532f194f198SAnoob Joseph 		/* Check if auth verify need to be completed */
533f194f198SAnoob Joseph 		if (unlikely(rsp[2]))
534f194f198SAnoob Joseph 			compl_auth_verify(cop, (uint8_t *)rsp[2], rsp[3]);
535f194f198SAnoob Joseph 		return;
536f194f198SAnoob Joseph 	}
537f194f198SAnoob Joseph }
538f194f198SAnoob Joseph 
53989f1a8d6STejasree Kondoj static uint16_t
54089f1a8d6STejasree Kondoj otx_cpt_pkt_dequeue(void *qptr, struct rte_crypto_op **ops, uint16_t nb_ops)
54189f1a8d6STejasree Kondoj {
54289f1a8d6STejasree Kondoj 	struct cpt_instance *instance = (struct cpt_instance *)qptr;
543f194f198SAnoob Joseph 	struct cpt_request_info *user_req;
54489f1a8d6STejasree Kondoj 	struct cpt_vf *cptvf = (struct cpt_vf *)instance;
545f194f198SAnoob Joseph 	struct rid *rid_e;
546f194f198SAnoob Joseph 	uint8_t cc[nb_ops];
547f194f198SAnoob Joseph 	int i, count, pcount;
548f194f198SAnoob Joseph 	uint8_t ret;
549f194f198SAnoob Joseph 	int nb_completed;
55089f1a8d6STejasree Kondoj 	struct pending_queue *pqueue = &cptvf->pqueue;
55189f1a8d6STejasree Kondoj 	struct rte_crypto_op *cop;
55289f1a8d6STejasree Kondoj 	void *metabuf;
55389f1a8d6STejasree Kondoj 	uintptr_t *rsp;
554f194f198SAnoob Joseph 
555f194f198SAnoob Joseph 	pcount = pqueue->pending_count;
556f194f198SAnoob Joseph 	count = (nb_ops > pcount) ? pcount : nb_ops;
557f194f198SAnoob Joseph 
558f194f198SAnoob Joseph 	for (i = 0; i < count; i++) {
559f194f198SAnoob Joseph 		rid_e = &pqueue->rid_queue[pqueue->deq_head];
560f194f198SAnoob Joseph 		user_req = (struct cpt_request_info *)(rid_e->rid);
561f194f198SAnoob Joseph 
562f194f198SAnoob Joseph 		if (likely((i+1) < count))
563f194f198SAnoob Joseph 			rte_prefetch_non_temporal((void *)rid_e[1].rid);
564f194f198SAnoob Joseph 
565f194f198SAnoob Joseph 		ret = check_nb_command_id(user_req, instance);
566f194f198SAnoob Joseph 
567f194f198SAnoob Joseph 		if (unlikely(ret == ERR_REQ_PENDING)) {
568f194f198SAnoob Joseph 			/* Stop checking for completions */
569f194f198SAnoob Joseph 			break;
570f194f198SAnoob Joseph 		}
571f194f198SAnoob Joseph 
572f194f198SAnoob Joseph 		/* Return completion code and op handle */
573f194f198SAnoob Joseph 		cc[i] = ret;
574f194f198SAnoob Joseph 		ops[i] = user_req->op;
575f194f198SAnoob Joseph 
576f194f198SAnoob Joseph 		CPT_LOG_DP_DEBUG("Request %p Op %p completed with code %d",
577f194f198SAnoob Joseph 				 user_req, user_req->op, ret);
578f194f198SAnoob Joseph 
579f194f198SAnoob Joseph 		MOD_INC(pqueue->deq_head, DEFAULT_CMD_QLEN);
580f194f198SAnoob Joseph 		pqueue->pending_count -= 1;
581f194f198SAnoob Joseph 	}
582f194f198SAnoob Joseph 
583f194f198SAnoob Joseph 	nb_completed = i;
584f194f198SAnoob Joseph 
585f194f198SAnoob Joseph 	for (i = 0; i < nb_completed; i++) {
58689f1a8d6STejasree Kondoj 
58789f1a8d6STejasree Kondoj 		rsp = (void *)ops[i];
588f194f198SAnoob Joseph 
58989f1a8d6STejasree Kondoj 		if (likely((i + 1) < nb_completed))
59089f1a8d6STejasree Kondoj 			rte_prefetch0(ops[i+1]);
591f194f198SAnoob Joseph 
59289f1a8d6STejasree Kondoj 		metabuf = (void *)rsp[0];
59389f1a8d6STejasree Kondoj 		cop = (void *)rsp[1];
59489f1a8d6STejasree Kondoj 
59589f1a8d6STejasree Kondoj 		ops[i] = cop;
59689f1a8d6STejasree Kondoj 
597f194f198SAnoob Joseph 		/* Check completion code */
598f194f198SAnoob Joseph 
599f194f198SAnoob Joseph 		if (likely(cc[i] == 0)) {
600f194f198SAnoob Joseph 			/* H/w success pkt. Post process */
601f194f198SAnoob Joseph 			otx_cpt_dequeue_post_process(cop, rsp);
602f194f198SAnoob Joseph 		} else if (cc[i] == ERR_GC_ICV_MISCOMPARE) {
60389f1a8d6STejasree Kondoj 			/* auth data mismatch */
60489f1a8d6STejasree Kondoj 			cop->status = RTE_CRYPTO_OP_STATUS_AUTH_FAILED;
60589f1a8d6STejasree Kondoj 		} else {
606f194f198SAnoob Joseph 			/* Error */
60789f1a8d6STejasree Kondoj 			cop->status = RTE_CRYPTO_OP_STATUS_ERROR;
60889f1a8d6STejasree Kondoj 		}
609f194f198SAnoob Joseph 
610f194f198SAnoob Joseph 		if (unlikely(cop->sess_type == RTE_CRYPTO_OP_SESSIONLESS)) {
611f194f198SAnoob Joseph 			void *sess_private_data_t =
612f194f198SAnoob Joseph 				get_sym_session_private_data(cop->sym->session,
613f194f198SAnoob Joseph 						otx_cryptodev_driver_id);
614f194f198SAnoob Joseph 			memset(sess_private_data_t, 0,
615f194f198SAnoob Joseph 					cpt_get_session_size());
616f194f198SAnoob Joseph 			memset(cop->sym->session, 0,
617f194f198SAnoob Joseph 			rte_cryptodev_sym_get_existing_header_session_size(
618f194f198SAnoob Joseph 					cop->sym->session));
619f194f198SAnoob Joseph 			rte_mempool_put(instance->sess_mp_priv,
620f194f198SAnoob Joseph 					sess_private_data_t);
621f194f198SAnoob Joseph 			rte_mempool_put(instance->sess_mp, cop->sym->session);
622f194f198SAnoob Joseph 			cop->sym->session = NULL;
62389f1a8d6STejasree Kondoj 		}
624ec54bc9dSAnoob Joseph 		free_op_meta(metabuf, instance->meta_info.pool);
625f194f198SAnoob Joseph 	}
626f194f198SAnoob Joseph 
62789f1a8d6STejasree Kondoj 	return nb_completed;
62889f1a8d6STejasree Kondoj }
62989f1a8d6STejasree Kondoj 
6300906b99fSMurthy NSSR static struct rte_cryptodev_ops cptvf_ops = {
6310906b99fSMurthy NSSR 	/* Device related operations */
6320906b99fSMurthy NSSR 	.dev_configure = otx_cpt_dev_config,
6330906b99fSMurthy NSSR 	.dev_start = otx_cpt_dev_start,
6340906b99fSMurthy NSSR 	.dev_stop = otx_cpt_dev_stop,
6350906b99fSMurthy NSSR 	.dev_close = otx_cpt_dev_close,
6360906b99fSMurthy NSSR 	.dev_infos_get = otx_cpt_dev_info_get,
6370906b99fSMurthy NSSR 
6380906b99fSMurthy NSSR 	.stats_get = otx_cpt_stats_get,
6390906b99fSMurthy NSSR 	.stats_reset = otx_cpt_stats_reset,
6400961348fSMurthy NSSR 	.queue_pair_setup = otx_cpt_que_pair_setup,
6410961348fSMurthy NSSR 	.queue_pair_release = otx_cpt_que_pair_release,
6420906b99fSMurthy NSSR 	.queue_pair_count = NULL,
6430906b99fSMurthy NSSR 
6440906b99fSMurthy NSSR 	/* Crypto related operations */
64543d01767SNithin Dabilpuram 	.sym_session_get_size = otx_cpt_get_session_size,
64643d01767SNithin Dabilpuram 	.sym_session_configure = otx_cpt_session_cfg,
647*33bcaae5SKanaka Durga Kotamarthy 	.sym_session_clear = otx_cpt_session_clear,
648*33bcaae5SKanaka Durga Kotamarthy 
649*33bcaae5SKanaka Durga Kotamarthy 	.asym_session_get_size = otx_cpt_asym_session_size_get,
650*33bcaae5SKanaka Durga Kotamarthy 	.asym_session_configure = otx_cpt_asym_session_cfg,
651*33bcaae5SKanaka Durga Kotamarthy 	.asym_session_clear = otx_cpt_asym_session_clear,
6520906b99fSMurthy NSSR };
6530906b99fSMurthy NSSR 
654bfe2ae49SAnoob Joseph int
655bfe2ae49SAnoob Joseph otx_cpt_dev_create(struct rte_cryptodev *c_dev)
656bfe2ae49SAnoob Joseph {
6570dc1cffaSAnkur Dwivedi 	struct rte_pci_device *pdev = RTE_DEV_TO_PCI(c_dev->device);
6580dc1cffaSAnkur Dwivedi 	struct cpt_vf *cptvf = NULL;
6590dc1cffaSAnkur Dwivedi 	void *reg_base;
6600dc1cffaSAnkur Dwivedi 	char dev_name[32];
6610dc1cffaSAnkur Dwivedi 	int ret;
6620dc1cffaSAnkur Dwivedi 
6630dc1cffaSAnkur Dwivedi 	if (pdev->mem_resource[0].phys_addr == 0ULL)
6640dc1cffaSAnkur Dwivedi 		return -EIO;
6650dc1cffaSAnkur Dwivedi 
6660dc1cffaSAnkur Dwivedi 	/* for secondary processes, we don't initialise any further as primary
6670dc1cffaSAnkur Dwivedi 	 * has already done this work.
6680dc1cffaSAnkur Dwivedi 	 */
6690dc1cffaSAnkur Dwivedi 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
670bfe2ae49SAnoob Joseph 		return 0;
6710dc1cffaSAnkur Dwivedi 
6720dc1cffaSAnkur Dwivedi 	cptvf = rte_zmalloc_socket("otx_cryptodev_private_mem",
6730dc1cffaSAnkur Dwivedi 			sizeof(struct cpt_vf), RTE_CACHE_LINE_SIZE,
6740dc1cffaSAnkur Dwivedi 			rte_socket_id());
6750dc1cffaSAnkur Dwivedi 
6760dc1cffaSAnkur Dwivedi 	if (cptvf == NULL) {
6770dc1cffaSAnkur Dwivedi 		CPT_LOG_ERR("Cannot allocate memory for device private data");
6780dc1cffaSAnkur Dwivedi 		return -ENOMEM;
6790dc1cffaSAnkur Dwivedi 	}
6800dc1cffaSAnkur Dwivedi 
6810dc1cffaSAnkur Dwivedi 	snprintf(dev_name, 32, "%02x:%02x.%x",
6820dc1cffaSAnkur Dwivedi 			pdev->addr.bus, pdev->addr.devid, pdev->addr.function);
6830dc1cffaSAnkur Dwivedi 
6840dc1cffaSAnkur Dwivedi 	reg_base = pdev->mem_resource[0].addr;
6850dc1cffaSAnkur Dwivedi 	if (!reg_base) {
6860dc1cffaSAnkur Dwivedi 		CPT_LOG_ERR("Failed to map BAR0 of %s", dev_name);
6870dc1cffaSAnkur Dwivedi 		ret = -ENODEV;
6880dc1cffaSAnkur Dwivedi 		goto fail;
6890dc1cffaSAnkur Dwivedi 	}
6900dc1cffaSAnkur Dwivedi 
6910dc1cffaSAnkur Dwivedi 	ret = otx_cpt_hw_init(cptvf, pdev, reg_base, dev_name);
6920dc1cffaSAnkur Dwivedi 	if (ret) {
6930dc1cffaSAnkur Dwivedi 		CPT_LOG_ERR("Failed to init cptvf %s", dev_name);
6940dc1cffaSAnkur Dwivedi 		ret = -EIO;
6950dc1cffaSAnkur Dwivedi 		goto fail;
6960dc1cffaSAnkur Dwivedi 	}
6970dc1cffaSAnkur Dwivedi 
69813d711f3SKanaka Durga Kotamarthy 	switch (cptvf->vftype) {
69913d711f3SKanaka Durga Kotamarthy 	case OTX_CPT_VF_TYPE_AE:
70013d711f3SKanaka Durga Kotamarthy 		/* Set asymmetric cpt feature flags */
70113d711f3SKanaka Durga Kotamarthy 		c_dev->feature_flags = RTE_CRYPTODEV_FF_ASYMMETRIC_CRYPTO |
702*33bcaae5SKanaka Durga Kotamarthy 				RTE_CRYPTODEV_FF_HW_ACCELERATED |
703*33bcaae5SKanaka Durga Kotamarthy 				RTE_CRYPTODEV_FF_RSA_PRIV_OP_KEY_QT;
70413d711f3SKanaka Durga Kotamarthy 		break;
70513d711f3SKanaka Durga Kotamarthy 	case OTX_CPT_VF_TYPE_SE:
70613d711f3SKanaka Durga Kotamarthy 		/* Set symmetric cpt feature flags */
70713d711f3SKanaka Durga Kotamarthy 		c_dev->feature_flags = RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO |
70813d711f3SKanaka Durga Kotamarthy 				RTE_CRYPTODEV_FF_HW_ACCELERATED |
70913d711f3SKanaka Durga Kotamarthy 				RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING |
71013d711f3SKanaka Durga Kotamarthy 				RTE_CRYPTODEV_FF_IN_PLACE_SGL |
71113d711f3SKanaka Durga Kotamarthy 				RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT |
71213d711f3SKanaka Durga Kotamarthy 				RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT;
71313d711f3SKanaka Durga Kotamarthy 		break;
71413d711f3SKanaka Durga Kotamarthy 	default:
71513d711f3SKanaka Durga Kotamarthy 		/* Feature not supported. Abort */
71613d711f3SKanaka Durga Kotamarthy 		CPT_LOG_ERR("VF type not supported by %s", dev_name);
71713d711f3SKanaka Durga Kotamarthy 		ret = -EIO;
71813d711f3SKanaka Durga Kotamarthy 		goto deinit_dev;
71913d711f3SKanaka Durga Kotamarthy 	}
72013d711f3SKanaka Durga Kotamarthy 
7210dc1cffaSAnkur Dwivedi 	/* Start off timer for mailbox interrupts */
7220dc1cffaSAnkur Dwivedi 	otx_cpt_periodic_alarm_start(cptvf);
7230dc1cffaSAnkur Dwivedi 
7240906b99fSMurthy NSSR 	c_dev->dev_ops = &cptvf_ops;
7250dc1cffaSAnkur Dwivedi 
726ac4d88afSTejasree Kondoj 	c_dev->enqueue_burst = otx_cpt_pkt_enqueue;
72789f1a8d6STejasree Kondoj 	c_dev->dequeue_burst = otx_cpt_pkt_dequeue;
7280dc1cffaSAnkur Dwivedi 
7290dc1cffaSAnkur Dwivedi 	/* Save dev private data */
7300dc1cffaSAnkur Dwivedi 	c_dev->data->dev_private = cptvf;
7310dc1cffaSAnkur Dwivedi 
7320dc1cffaSAnkur Dwivedi 	return 0;
7330dc1cffaSAnkur Dwivedi 
73413d711f3SKanaka Durga Kotamarthy deinit_dev:
73513d711f3SKanaka Durga Kotamarthy 	otx_cpt_deinit_device(cptvf);
73613d711f3SKanaka Durga Kotamarthy 
7370dc1cffaSAnkur Dwivedi fail:
7380dc1cffaSAnkur Dwivedi 	if (cptvf) {
7390dc1cffaSAnkur Dwivedi 		/* Free private data allocated */
7400dc1cffaSAnkur Dwivedi 		rte_free(cptvf);
7410dc1cffaSAnkur Dwivedi 	}
7420dc1cffaSAnkur Dwivedi 
7430dc1cffaSAnkur Dwivedi 	return ret;
744bfe2ae49SAnoob Joseph }
745