xref: /dpdk/drivers/crypto/octeontx/otx_cryptodev_ops.c (revision 0906b99f3451e4b367c7e8024dee3ee297a0698c)
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>
8*0906b99fSMurthy NSSR #include <rte_cryptodev_pmd.h>
90dc1cffaSAnkur Dwivedi #include <rte_malloc.h>
100dc1cffaSAnkur Dwivedi 
110dc1cffaSAnkur Dwivedi #include "cpt_pmd_logs.h"
12273487f7SAnoob Joseph #include "cpt_pmd_ops_helper.h"
13bfe2ae49SAnoob Joseph 
14bfe2ae49SAnoob Joseph #include "otx_cryptodev.h"
15*0906b99fSMurthy NSSR #include "otx_cryptodev_capabilities.h"
160dc1cffaSAnkur Dwivedi #include "otx_cryptodev_hw_access.h"
17bfe2ae49SAnoob Joseph #include "otx_cryptodev_ops.h"
18bfe2ae49SAnoob Joseph 
19273487f7SAnoob Joseph static int otx_cryptodev_probe_count;
20273487f7SAnoob Joseph static rte_spinlock_t otx_probe_count_lock = RTE_SPINLOCK_INITIALIZER;
21273487f7SAnoob Joseph 
22273487f7SAnoob Joseph static struct rte_mempool *otx_cpt_meta_pool;
23273487f7SAnoob Joseph static int otx_cpt_op_mlen;
24273487f7SAnoob Joseph static int otx_cpt_op_sb_mlen;
25273487f7SAnoob Joseph 
26273487f7SAnoob Joseph /*
27273487f7SAnoob Joseph  * Initializes global variables used by fast-path code
28273487f7SAnoob Joseph  *
29273487f7SAnoob Joseph  * @return
30273487f7SAnoob Joseph  *   - 0 on success, errcode on error
31273487f7SAnoob Joseph  */
32273487f7SAnoob Joseph static int
33273487f7SAnoob Joseph init_global_resources(void)
34273487f7SAnoob Joseph {
35273487f7SAnoob Joseph 	/* Get meta len for scatter gather mode */
36273487f7SAnoob Joseph 	otx_cpt_op_mlen = cpt_pmd_ops_helper_get_mlen_sg_mode();
37273487f7SAnoob Joseph 
38273487f7SAnoob Joseph 	/* Extra 4B saved for future considerations */
39273487f7SAnoob Joseph 	otx_cpt_op_mlen += 4 * sizeof(uint64_t);
40273487f7SAnoob Joseph 
41273487f7SAnoob Joseph 	otx_cpt_meta_pool = rte_mempool_create("cpt_metabuf-pool", 4096 * 16,
42273487f7SAnoob Joseph 					       otx_cpt_op_mlen, 512, 0,
43273487f7SAnoob Joseph 					       NULL, NULL, NULL, NULL,
44273487f7SAnoob Joseph 					       SOCKET_ID_ANY, 0);
45273487f7SAnoob Joseph 	if (!otx_cpt_meta_pool) {
46273487f7SAnoob Joseph 		CPT_LOG_ERR("cpt metabuf pool not created");
47273487f7SAnoob Joseph 		return -ENOMEM;
48273487f7SAnoob Joseph 	}
49273487f7SAnoob Joseph 
50273487f7SAnoob Joseph 	/* Get meta len for direct mode */
51273487f7SAnoob Joseph 	otx_cpt_op_sb_mlen = cpt_pmd_ops_helper_get_mlen_direct_mode();
52273487f7SAnoob Joseph 
53273487f7SAnoob Joseph 	/* Extra 4B saved for future considerations */
54273487f7SAnoob Joseph 	otx_cpt_op_sb_mlen += 4 * sizeof(uint64_t);
55273487f7SAnoob Joseph 
56273487f7SAnoob Joseph 	return 0;
57273487f7SAnoob Joseph }
58273487f7SAnoob Joseph 
59273487f7SAnoob Joseph void
60273487f7SAnoob Joseph cleanup_global_resources(void)
61273487f7SAnoob Joseph {
62273487f7SAnoob Joseph 	/* Take lock */
63273487f7SAnoob Joseph 	rte_spinlock_lock(&otx_probe_count_lock);
64273487f7SAnoob Joseph 
65273487f7SAnoob Joseph 	/* Decrement the cryptodev count */
66273487f7SAnoob Joseph 	otx_cryptodev_probe_count--;
67273487f7SAnoob Joseph 
68273487f7SAnoob Joseph 	/* Free buffers */
69273487f7SAnoob Joseph 	if (otx_cpt_meta_pool && otx_cryptodev_probe_count == 0)
70273487f7SAnoob Joseph 		rte_mempool_free(otx_cpt_meta_pool);
71273487f7SAnoob Joseph 
72273487f7SAnoob Joseph 	/* Free lock */
73273487f7SAnoob Joseph 	rte_spinlock_unlock(&otx_probe_count_lock);
74273487f7SAnoob Joseph }
75273487f7SAnoob Joseph 
760dc1cffaSAnkur Dwivedi /* Alarm routines */
770dc1cffaSAnkur Dwivedi 
780dc1cffaSAnkur Dwivedi static void
790dc1cffaSAnkur Dwivedi otx_cpt_alarm_cb(void *arg)
800dc1cffaSAnkur Dwivedi {
810dc1cffaSAnkur Dwivedi 	struct cpt_vf *cptvf = arg;
820dc1cffaSAnkur Dwivedi 	otx_cpt_poll_misc(cptvf);
830dc1cffaSAnkur Dwivedi 	rte_eal_alarm_set(CPT_INTR_POLL_INTERVAL_MS * 1000,
840dc1cffaSAnkur Dwivedi 			  otx_cpt_alarm_cb, cptvf);
850dc1cffaSAnkur Dwivedi }
860dc1cffaSAnkur Dwivedi 
870dc1cffaSAnkur Dwivedi static int
880dc1cffaSAnkur Dwivedi otx_cpt_periodic_alarm_start(void *arg)
890dc1cffaSAnkur Dwivedi {
900dc1cffaSAnkur Dwivedi 	return rte_eal_alarm_set(CPT_INTR_POLL_INTERVAL_MS * 1000,
910dc1cffaSAnkur Dwivedi 				 otx_cpt_alarm_cb, arg);
920dc1cffaSAnkur Dwivedi }
930dc1cffaSAnkur Dwivedi 
94273487f7SAnoob Joseph static int
95273487f7SAnoob Joseph otx_cpt_periodic_alarm_stop(void *arg)
96273487f7SAnoob Joseph {
97273487f7SAnoob Joseph 	return rte_eal_alarm_cancel(otx_cpt_alarm_cb, arg);
98273487f7SAnoob Joseph }
99273487f7SAnoob Joseph 
100*0906b99fSMurthy NSSR /* PMD ops */
101*0906b99fSMurthy NSSR 
102*0906b99fSMurthy NSSR static int
103*0906b99fSMurthy NSSR otx_cpt_dev_config(struct rte_cryptodev *dev __rte_unused,
104*0906b99fSMurthy NSSR 		   struct rte_cryptodev_config *config __rte_unused)
105*0906b99fSMurthy NSSR {
106*0906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
107*0906b99fSMurthy NSSR 	return 0;
108*0906b99fSMurthy NSSR }
109*0906b99fSMurthy NSSR 
110*0906b99fSMurthy NSSR static int
111*0906b99fSMurthy NSSR otx_cpt_dev_start(struct rte_cryptodev *c_dev)
112*0906b99fSMurthy NSSR {
113*0906b99fSMurthy NSSR 	void *cptvf = c_dev->data->dev_private;
114*0906b99fSMurthy NSSR 
115*0906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
116*0906b99fSMurthy NSSR 
117*0906b99fSMurthy NSSR 	return otx_cpt_start_device(cptvf);
118*0906b99fSMurthy NSSR }
119*0906b99fSMurthy NSSR 
120*0906b99fSMurthy NSSR static void
121*0906b99fSMurthy NSSR otx_cpt_dev_stop(struct rte_cryptodev *c_dev)
122*0906b99fSMurthy NSSR {
123*0906b99fSMurthy NSSR 	void *cptvf = c_dev->data->dev_private;
124*0906b99fSMurthy NSSR 
125*0906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
126*0906b99fSMurthy NSSR 
127*0906b99fSMurthy NSSR 	otx_cpt_stop_device(cptvf);
128*0906b99fSMurthy NSSR }
129*0906b99fSMurthy NSSR 
130*0906b99fSMurthy NSSR static int
131*0906b99fSMurthy NSSR otx_cpt_dev_close(struct rte_cryptodev *c_dev)
132*0906b99fSMurthy NSSR {
133*0906b99fSMurthy NSSR 	void *cptvf = c_dev->data->dev_private;
134*0906b99fSMurthy NSSR 
135*0906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
136*0906b99fSMurthy NSSR 
137*0906b99fSMurthy NSSR 	otx_cpt_periodic_alarm_stop(cptvf);
138*0906b99fSMurthy NSSR 	otx_cpt_deinit_device(cptvf);
139*0906b99fSMurthy NSSR 
140*0906b99fSMurthy NSSR 	return 0;
141*0906b99fSMurthy NSSR }
142*0906b99fSMurthy NSSR 
143*0906b99fSMurthy NSSR static void
144*0906b99fSMurthy NSSR otx_cpt_dev_info_get(struct rte_cryptodev *dev, struct rte_cryptodev_info *info)
145*0906b99fSMurthy NSSR {
146*0906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
147*0906b99fSMurthy NSSR 	if (info != NULL) {
148*0906b99fSMurthy NSSR 		info->max_nb_queue_pairs = CPT_NUM_QS_PER_VF;
149*0906b99fSMurthy NSSR 		info->feature_flags = dev->feature_flags;
150*0906b99fSMurthy NSSR 		info->capabilities = otx_get_capabilities();
151*0906b99fSMurthy NSSR 		info->sym.max_nb_sessions = 0;
152*0906b99fSMurthy NSSR 		info->driver_id = otx_cryptodev_driver_id;
153*0906b99fSMurthy NSSR 		info->min_mbuf_headroom_req = OTX_CPT_MIN_HEADROOM_REQ;
154*0906b99fSMurthy NSSR 		info->min_mbuf_tailroom_req = OTX_CPT_MIN_TAILROOM_REQ;
155*0906b99fSMurthy NSSR 	}
156*0906b99fSMurthy NSSR }
157*0906b99fSMurthy NSSR 
158*0906b99fSMurthy NSSR static void
159*0906b99fSMurthy NSSR otx_cpt_stats_get(struct rte_cryptodev *dev __rte_unused,
160*0906b99fSMurthy NSSR 		  struct rte_cryptodev_stats *stats __rte_unused)
161*0906b99fSMurthy NSSR {
162*0906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
163*0906b99fSMurthy NSSR }
164*0906b99fSMurthy NSSR 
165*0906b99fSMurthy NSSR static void
166*0906b99fSMurthy NSSR otx_cpt_stats_reset(struct rte_cryptodev *dev __rte_unused)
167*0906b99fSMurthy NSSR {
168*0906b99fSMurthy NSSR 	CPT_PMD_INIT_FUNC_TRACE();
169*0906b99fSMurthy NSSR }
170*0906b99fSMurthy NSSR 
171*0906b99fSMurthy NSSR static struct rte_cryptodev_ops cptvf_ops = {
172*0906b99fSMurthy NSSR 	/* Device related operations */
173*0906b99fSMurthy NSSR 	.dev_configure = otx_cpt_dev_config,
174*0906b99fSMurthy NSSR 	.dev_start = otx_cpt_dev_start,
175*0906b99fSMurthy NSSR 	.dev_stop = otx_cpt_dev_stop,
176*0906b99fSMurthy NSSR 	.dev_close = otx_cpt_dev_close,
177*0906b99fSMurthy NSSR 	.dev_infos_get = otx_cpt_dev_info_get,
178*0906b99fSMurthy NSSR 
179*0906b99fSMurthy NSSR 	.stats_get = otx_cpt_stats_get,
180*0906b99fSMurthy NSSR 	.stats_reset = otx_cpt_stats_reset,
181*0906b99fSMurthy NSSR 	.queue_pair_setup = NULL,
182*0906b99fSMurthy NSSR 	.queue_pair_release = NULL,
183*0906b99fSMurthy NSSR 	.queue_pair_count = NULL,
184*0906b99fSMurthy NSSR 
185*0906b99fSMurthy NSSR 	/* Crypto related operations */
186*0906b99fSMurthy NSSR 	.sym_session_get_size = NULL,
187*0906b99fSMurthy NSSR 	.sym_session_configure = NULL,
188*0906b99fSMurthy NSSR 	.sym_session_clear = NULL
189*0906b99fSMurthy NSSR };
190*0906b99fSMurthy NSSR 
191273487f7SAnoob Joseph static void
192273487f7SAnoob Joseph otx_cpt_common_vars_init(struct cpt_vf *cptvf)
193273487f7SAnoob Joseph {
194273487f7SAnoob Joseph 	cptvf->meta_info.cptvf_meta_pool = otx_cpt_meta_pool;
195273487f7SAnoob Joseph 	cptvf->meta_info.cptvf_op_mlen = otx_cpt_op_mlen;
196273487f7SAnoob Joseph 	cptvf->meta_info.cptvf_op_sb_mlen = otx_cpt_op_sb_mlen;
197273487f7SAnoob Joseph }
198273487f7SAnoob Joseph 
199bfe2ae49SAnoob Joseph int
200bfe2ae49SAnoob Joseph otx_cpt_dev_create(struct rte_cryptodev *c_dev)
201bfe2ae49SAnoob Joseph {
2020dc1cffaSAnkur Dwivedi 	struct rte_pci_device *pdev = RTE_DEV_TO_PCI(c_dev->device);
2030dc1cffaSAnkur Dwivedi 	struct cpt_vf *cptvf = NULL;
2040dc1cffaSAnkur Dwivedi 	void *reg_base;
2050dc1cffaSAnkur Dwivedi 	char dev_name[32];
2060dc1cffaSAnkur Dwivedi 	int ret;
2070dc1cffaSAnkur Dwivedi 
2080dc1cffaSAnkur Dwivedi 	if (pdev->mem_resource[0].phys_addr == 0ULL)
2090dc1cffaSAnkur Dwivedi 		return -EIO;
2100dc1cffaSAnkur Dwivedi 
2110dc1cffaSAnkur Dwivedi 	/* for secondary processes, we don't initialise any further as primary
2120dc1cffaSAnkur Dwivedi 	 * has already done this work.
2130dc1cffaSAnkur Dwivedi 	 */
2140dc1cffaSAnkur Dwivedi 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
215bfe2ae49SAnoob Joseph 		return 0;
2160dc1cffaSAnkur Dwivedi 
2170dc1cffaSAnkur Dwivedi 	cptvf = rte_zmalloc_socket("otx_cryptodev_private_mem",
2180dc1cffaSAnkur Dwivedi 			sizeof(struct cpt_vf), RTE_CACHE_LINE_SIZE,
2190dc1cffaSAnkur Dwivedi 			rte_socket_id());
2200dc1cffaSAnkur Dwivedi 
2210dc1cffaSAnkur Dwivedi 	if (cptvf == NULL) {
2220dc1cffaSAnkur Dwivedi 		CPT_LOG_ERR("Cannot allocate memory for device private data");
2230dc1cffaSAnkur Dwivedi 		return -ENOMEM;
2240dc1cffaSAnkur Dwivedi 	}
2250dc1cffaSAnkur Dwivedi 
2260dc1cffaSAnkur Dwivedi 	snprintf(dev_name, 32, "%02x:%02x.%x",
2270dc1cffaSAnkur Dwivedi 			pdev->addr.bus, pdev->addr.devid, pdev->addr.function);
2280dc1cffaSAnkur Dwivedi 
2290dc1cffaSAnkur Dwivedi 	reg_base = pdev->mem_resource[0].addr;
2300dc1cffaSAnkur Dwivedi 	if (!reg_base) {
2310dc1cffaSAnkur Dwivedi 		CPT_LOG_ERR("Failed to map BAR0 of %s", dev_name);
2320dc1cffaSAnkur Dwivedi 		ret = -ENODEV;
2330dc1cffaSAnkur Dwivedi 		goto fail;
2340dc1cffaSAnkur Dwivedi 	}
2350dc1cffaSAnkur Dwivedi 
2360dc1cffaSAnkur Dwivedi 	ret = otx_cpt_hw_init(cptvf, pdev, reg_base, dev_name);
2370dc1cffaSAnkur Dwivedi 	if (ret) {
2380dc1cffaSAnkur Dwivedi 		CPT_LOG_ERR("Failed to init cptvf %s", dev_name);
2390dc1cffaSAnkur Dwivedi 		ret = -EIO;
2400dc1cffaSAnkur Dwivedi 		goto fail;
2410dc1cffaSAnkur Dwivedi 	}
2420dc1cffaSAnkur Dwivedi 
2430dc1cffaSAnkur Dwivedi 	/* Start off timer for mailbox interrupts */
2440dc1cffaSAnkur Dwivedi 	otx_cpt_periodic_alarm_start(cptvf);
2450dc1cffaSAnkur Dwivedi 
246273487f7SAnoob Joseph 	rte_spinlock_lock(&otx_probe_count_lock);
247273487f7SAnoob Joseph 	if (!otx_cryptodev_probe_count) {
248273487f7SAnoob Joseph 		ret = init_global_resources();
249273487f7SAnoob Joseph 		if (ret) {
250273487f7SAnoob Joseph 			rte_spinlock_unlock(&otx_probe_count_lock);
251273487f7SAnoob Joseph 			goto init_fail;
252273487f7SAnoob Joseph 		}
253273487f7SAnoob Joseph 	}
254273487f7SAnoob Joseph 	otx_cryptodev_probe_count++;
255273487f7SAnoob Joseph 	rte_spinlock_unlock(&otx_probe_count_lock);
256273487f7SAnoob Joseph 
257273487f7SAnoob Joseph 	/* Initialize data path variables used by common code */
258273487f7SAnoob Joseph 	otx_cpt_common_vars_init(cptvf);
259273487f7SAnoob Joseph 
260*0906b99fSMurthy NSSR 	c_dev->dev_ops = &cptvf_ops;
2610dc1cffaSAnkur Dwivedi 
2620dc1cffaSAnkur Dwivedi 	c_dev->enqueue_burst = NULL;
2630dc1cffaSAnkur Dwivedi 	c_dev->dequeue_burst = NULL;
2640dc1cffaSAnkur Dwivedi 
2650dc1cffaSAnkur Dwivedi 	c_dev->feature_flags = RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO |
2660dc1cffaSAnkur Dwivedi 			RTE_CRYPTODEV_FF_HW_ACCELERATED |
2670dc1cffaSAnkur Dwivedi 			RTE_CRYPTODEV_FF_SYM_OPERATION_CHAINING |
2680dc1cffaSAnkur Dwivedi 			RTE_CRYPTODEV_FF_IN_PLACE_SGL |
2690dc1cffaSAnkur Dwivedi 			RTE_CRYPTODEV_FF_OOP_SGL_IN_LB_OUT |
2700dc1cffaSAnkur Dwivedi 			RTE_CRYPTODEV_FF_OOP_SGL_IN_SGL_OUT;
2710dc1cffaSAnkur Dwivedi 
2720dc1cffaSAnkur Dwivedi 	/* Save dev private data */
2730dc1cffaSAnkur Dwivedi 	c_dev->data->dev_private = cptvf;
2740dc1cffaSAnkur Dwivedi 
2750dc1cffaSAnkur Dwivedi 	return 0;
2760dc1cffaSAnkur Dwivedi 
277273487f7SAnoob Joseph init_fail:
278273487f7SAnoob Joseph 	otx_cpt_periodic_alarm_stop(cptvf);
279273487f7SAnoob Joseph 	otx_cpt_deinit_device(cptvf);
280273487f7SAnoob Joseph 
2810dc1cffaSAnkur Dwivedi fail:
2820dc1cffaSAnkur Dwivedi 	if (cptvf) {
2830dc1cffaSAnkur Dwivedi 		/* Free private data allocated */
2840dc1cffaSAnkur Dwivedi 		rte_free(cptvf);
2850dc1cffaSAnkur Dwivedi 	}
2860dc1cffaSAnkur Dwivedi 
2870dc1cffaSAnkur Dwivedi 	return ret;
288bfe2ae49SAnoob Joseph }
289