xref: /dpdk/drivers/crypto/octeontx/otx_cryptodev_hw_access.c (revision 7be78d027918dbc846e502780faf94d5acdf5f75)
10dc1cffaSAnkur Dwivedi /* SPDX-License-Identifier: BSD-3-Clause
20dc1cffaSAnkur Dwivedi  * Copyright(c) 2018 Cavium, Inc
30dc1cffaSAnkur Dwivedi  */
40961348fSMurthy NSSR #include <assert.h>
50dc1cffaSAnkur Dwivedi #include <string.h>
60906b99fSMurthy NSSR #include <unistd.h>
70dc1cffaSAnkur Dwivedi 
884eb02f7SAnkur Dwivedi #include <rte_branch_prediction.h>
90dc1cffaSAnkur Dwivedi #include <rte_common.h>
1092cb1309SAkhil Goyal #include <cryptodev_pmd.h>
110961348fSMurthy NSSR #include <rte_errno.h>
12ec54bc9dSAnoob Joseph #include <rte_mempool.h>
130961348fSMurthy NSSR #include <rte_memzone.h>
14acbaf3ceSAnoob Joseph #include <rte_string_fns.h>
150dc1cffaSAnkur Dwivedi 
160dc1cffaSAnkur Dwivedi #include "otx_cryptodev_hw_access.h"
17ae500541SMurthy NSSR #include "otx_cryptodev_mbox.h"
180dc1cffaSAnkur Dwivedi 
190dc1cffaSAnkur Dwivedi #include "cpt_pmd_logs.h"
20ec54bc9dSAnoob Joseph #include "cpt_pmd_ops_helper.h"
2184eb02f7SAnkur Dwivedi #include "cpt_hw_types.h"
2284eb02f7SAnkur Dwivedi 
23ec54bc9dSAnoob Joseph #define METABUF_POOL_CACHE_SIZE	512
24ec54bc9dSAnoob Joseph 
2584eb02f7SAnkur Dwivedi /*
2684eb02f7SAnkur Dwivedi  * VF HAL functions
2784eb02f7SAnkur Dwivedi  * Access its own BAR0/4 registers by passing VF number as 0.
2884eb02f7SAnkur Dwivedi  * OS/PCI maps them accordingly.
2984eb02f7SAnkur Dwivedi  */
300dc1cffaSAnkur Dwivedi 
310dc1cffaSAnkur Dwivedi static int
otx_cpt_vf_init(struct cpt_vf * cptvf)320dc1cffaSAnkur Dwivedi otx_cpt_vf_init(struct cpt_vf *cptvf)
330dc1cffaSAnkur Dwivedi {
340dc1cffaSAnkur Dwivedi 	int ret = 0;
350dc1cffaSAnkur Dwivedi 
36ae500541SMurthy NSSR 	/* Check ready with PF */
37ae500541SMurthy NSSR 	/* Gets chip ID / device Id from PF if ready */
38ae500541SMurthy NSSR 	ret = otx_cpt_check_pf_ready(cptvf);
39ae500541SMurthy NSSR 	if (ret) {
40ae500541SMurthy NSSR 		CPT_LOG_ERR("%s: PF not responding to READY msg",
41ae500541SMurthy NSSR 				cptvf->dev_name);
42ae500541SMurthy NSSR 		ret = -EBUSY;
43ae500541SMurthy NSSR 		goto exit;
44ae500541SMurthy NSSR 	}
45ae500541SMurthy NSSR 
460dc1cffaSAnkur Dwivedi 	CPT_LOG_DP_DEBUG("%s: %s done", cptvf->dev_name, __func__);
470dc1cffaSAnkur Dwivedi 
48ae500541SMurthy NSSR exit:
490dc1cffaSAnkur Dwivedi 	return ret;
500dc1cffaSAnkur Dwivedi }
510dc1cffaSAnkur Dwivedi 
5284eb02f7SAnkur Dwivedi /*
5384eb02f7SAnkur Dwivedi  * Read Interrupt status of the VF
5484eb02f7SAnkur Dwivedi  *
5584eb02f7SAnkur Dwivedi  * @param   cptvf	cptvf structure
5684eb02f7SAnkur Dwivedi  */
5784eb02f7SAnkur Dwivedi static uint64_t
otx_cpt_read_vf_misc_intr_status(struct cpt_vf * cptvf)5884eb02f7SAnkur Dwivedi otx_cpt_read_vf_misc_intr_status(struct cpt_vf *cptvf)
5984eb02f7SAnkur Dwivedi {
6084eb02f7SAnkur Dwivedi 	return CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf), CPTX_VQX_MISC_INT(0, 0));
6184eb02f7SAnkur Dwivedi }
6284eb02f7SAnkur Dwivedi 
6384eb02f7SAnkur Dwivedi /*
6484eb02f7SAnkur Dwivedi  * Clear mailbox interrupt of the VF
6584eb02f7SAnkur Dwivedi  *
6684eb02f7SAnkur Dwivedi  * @param   cptvf	cptvf structure
6784eb02f7SAnkur Dwivedi  */
6884eb02f7SAnkur Dwivedi static void
otx_cpt_clear_mbox_intr(struct cpt_vf * cptvf)6984eb02f7SAnkur Dwivedi otx_cpt_clear_mbox_intr(struct cpt_vf *cptvf)
7084eb02f7SAnkur Dwivedi {
7184eb02f7SAnkur Dwivedi 	cptx_vqx_misc_int_t vqx_misc_int;
7284eb02f7SAnkur Dwivedi 
7384eb02f7SAnkur Dwivedi 	vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf),
7484eb02f7SAnkur Dwivedi 				      CPTX_VQX_MISC_INT(0, 0));
7584eb02f7SAnkur Dwivedi 	/* W1C for the VF */
7684eb02f7SAnkur Dwivedi 	vqx_misc_int.s.mbox = 1;
7784eb02f7SAnkur Dwivedi 	CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
7884eb02f7SAnkur Dwivedi 		      CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u);
7984eb02f7SAnkur Dwivedi }
8084eb02f7SAnkur Dwivedi 
8184eb02f7SAnkur Dwivedi /*
8284eb02f7SAnkur Dwivedi  * Clear instruction NCB read error interrupt of the VF
8384eb02f7SAnkur Dwivedi  *
8484eb02f7SAnkur Dwivedi  * @param   cptvf	cptvf structure
8584eb02f7SAnkur Dwivedi  */
8684eb02f7SAnkur Dwivedi static void
otx_cpt_clear_irde_intr(struct cpt_vf * cptvf)8784eb02f7SAnkur Dwivedi otx_cpt_clear_irde_intr(struct cpt_vf *cptvf)
8884eb02f7SAnkur Dwivedi {
8984eb02f7SAnkur Dwivedi 	cptx_vqx_misc_int_t vqx_misc_int;
9084eb02f7SAnkur Dwivedi 
9184eb02f7SAnkur Dwivedi 	vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf),
9284eb02f7SAnkur Dwivedi 				      CPTX_VQX_MISC_INT(0, 0));
9384eb02f7SAnkur Dwivedi 	/* W1C for the VF */
9484eb02f7SAnkur Dwivedi 	vqx_misc_int.s.irde = 1;
9584eb02f7SAnkur Dwivedi 	CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
9684eb02f7SAnkur Dwivedi 		      CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u);
9784eb02f7SAnkur Dwivedi }
9884eb02f7SAnkur Dwivedi 
9984eb02f7SAnkur Dwivedi /*
10084eb02f7SAnkur Dwivedi  * Clear NCB result write response error interrupt of the VF
10184eb02f7SAnkur Dwivedi  *
10284eb02f7SAnkur Dwivedi  * @param   cptvf	cptvf structure
10384eb02f7SAnkur Dwivedi  */
10484eb02f7SAnkur Dwivedi static void
otx_cpt_clear_nwrp_intr(struct cpt_vf * cptvf)10584eb02f7SAnkur Dwivedi otx_cpt_clear_nwrp_intr(struct cpt_vf *cptvf)
10684eb02f7SAnkur Dwivedi {
10784eb02f7SAnkur Dwivedi 	cptx_vqx_misc_int_t vqx_misc_int;
10884eb02f7SAnkur Dwivedi 
10984eb02f7SAnkur Dwivedi 	vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf),
11084eb02f7SAnkur Dwivedi 				      CPTX_VQX_MISC_INT(0, 0));
11184eb02f7SAnkur Dwivedi 	/* W1C for the VF */
11284eb02f7SAnkur Dwivedi 	vqx_misc_int.s.nwrp = 1;
11384eb02f7SAnkur Dwivedi 	CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
11484eb02f7SAnkur Dwivedi 		      CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u);
11584eb02f7SAnkur Dwivedi }
11684eb02f7SAnkur Dwivedi 
11784eb02f7SAnkur Dwivedi /*
11884eb02f7SAnkur Dwivedi  * Clear swerr interrupt of the VF
11984eb02f7SAnkur Dwivedi  *
12084eb02f7SAnkur Dwivedi  * @param   cptvf	cptvf structure
12184eb02f7SAnkur Dwivedi  */
12284eb02f7SAnkur Dwivedi static void
otx_cpt_clear_swerr_intr(struct cpt_vf * cptvf)12384eb02f7SAnkur Dwivedi otx_cpt_clear_swerr_intr(struct cpt_vf *cptvf)
12484eb02f7SAnkur Dwivedi {
12584eb02f7SAnkur Dwivedi 	cptx_vqx_misc_int_t vqx_misc_int;
12684eb02f7SAnkur Dwivedi 
12784eb02f7SAnkur Dwivedi 	vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf),
12884eb02f7SAnkur Dwivedi 				      CPTX_VQX_MISC_INT(0, 0));
12984eb02f7SAnkur Dwivedi 	/* W1C for the VF */
13084eb02f7SAnkur Dwivedi 	vqx_misc_int.s.swerr = 1;
13184eb02f7SAnkur Dwivedi 	CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
13284eb02f7SAnkur Dwivedi 		      CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u);
13384eb02f7SAnkur Dwivedi }
13484eb02f7SAnkur Dwivedi 
13584eb02f7SAnkur Dwivedi /*
13684eb02f7SAnkur Dwivedi  * Clear hwerr interrupt of the VF
13784eb02f7SAnkur Dwivedi  *
13884eb02f7SAnkur Dwivedi  * @param   cptvf	cptvf structure
13984eb02f7SAnkur Dwivedi  */
14084eb02f7SAnkur Dwivedi static void
otx_cpt_clear_hwerr_intr(struct cpt_vf * cptvf)14184eb02f7SAnkur Dwivedi otx_cpt_clear_hwerr_intr(struct cpt_vf *cptvf)
14284eb02f7SAnkur Dwivedi {
14384eb02f7SAnkur Dwivedi 	cptx_vqx_misc_int_t vqx_misc_int;
14484eb02f7SAnkur Dwivedi 
14584eb02f7SAnkur Dwivedi 	vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf),
14684eb02f7SAnkur Dwivedi 				      CPTX_VQX_MISC_INT(0, 0));
14784eb02f7SAnkur Dwivedi 	/* W1C for the VF */
14884eb02f7SAnkur Dwivedi 	vqx_misc_int.s.hwerr = 1;
14984eb02f7SAnkur Dwivedi 	CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
15084eb02f7SAnkur Dwivedi 		      CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u);
15184eb02f7SAnkur Dwivedi }
15284eb02f7SAnkur Dwivedi 
15384eb02f7SAnkur Dwivedi /*
15484eb02f7SAnkur Dwivedi  * Clear translation fault interrupt of the VF
15584eb02f7SAnkur Dwivedi  *
15684eb02f7SAnkur Dwivedi  * @param   cptvf	cptvf structure
15784eb02f7SAnkur Dwivedi  */
15884eb02f7SAnkur Dwivedi static void
otx_cpt_clear_fault_intr(struct cpt_vf * cptvf)15984eb02f7SAnkur Dwivedi otx_cpt_clear_fault_intr(struct cpt_vf *cptvf)
16084eb02f7SAnkur Dwivedi {
16184eb02f7SAnkur Dwivedi 	cptx_vqx_misc_int_t vqx_misc_int;
16284eb02f7SAnkur Dwivedi 
16384eb02f7SAnkur Dwivedi 	vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf),
16484eb02f7SAnkur Dwivedi 				CPTX_VQX_MISC_INT(0, 0));
16584eb02f7SAnkur Dwivedi 	/* W1C for the VF */
16684eb02f7SAnkur Dwivedi 	vqx_misc_int.s.fault = 1;
16784eb02f7SAnkur Dwivedi 	CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
16884eb02f7SAnkur Dwivedi 		CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u);
16984eb02f7SAnkur Dwivedi }
17084eb02f7SAnkur Dwivedi 
17184eb02f7SAnkur Dwivedi /*
17284eb02f7SAnkur Dwivedi  * Clear doorbell overflow interrupt of the VF
17384eb02f7SAnkur Dwivedi  *
17484eb02f7SAnkur Dwivedi  * @param   cptvf	cptvf structure
17584eb02f7SAnkur Dwivedi  */
17684eb02f7SAnkur Dwivedi static void
otx_cpt_clear_dovf_intr(struct cpt_vf * cptvf)17784eb02f7SAnkur Dwivedi otx_cpt_clear_dovf_intr(struct cpt_vf *cptvf)
17884eb02f7SAnkur Dwivedi {
17984eb02f7SAnkur Dwivedi 	cptx_vqx_misc_int_t vqx_misc_int;
18084eb02f7SAnkur Dwivedi 
18184eb02f7SAnkur Dwivedi 	vqx_misc_int.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf),
18284eb02f7SAnkur Dwivedi 				      CPTX_VQX_MISC_INT(0, 0));
18384eb02f7SAnkur Dwivedi 	/* W1C for the VF */
18484eb02f7SAnkur Dwivedi 	vqx_misc_int.s.dovf = 1;
18584eb02f7SAnkur Dwivedi 	CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
18684eb02f7SAnkur Dwivedi 		      CPTX_VQX_MISC_INT(0, 0), vqx_misc_int.u);
18784eb02f7SAnkur Dwivedi }
18884eb02f7SAnkur Dwivedi 
1890961348fSMurthy NSSR /* Write to VQX_CTL register
1900961348fSMurthy NSSR  */
1910961348fSMurthy NSSR static void
otx_cpt_write_vq_ctl(struct cpt_vf * cptvf,bool val)1920961348fSMurthy NSSR otx_cpt_write_vq_ctl(struct cpt_vf *cptvf, bool val)
1930961348fSMurthy NSSR {
1940961348fSMurthy NSSR 	cptx_vqx_ctl_t vqx_ctl;
1950961348fSMurthy NSSR 
1960961348fSMurthy NSSR 	vqx_ctl.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf),
1970961348fSMurthy NSSR 				 CPTX_VQX_CTL(0, 0));
1980961348fSMurthy NSSR 	vqx_ctl.s.ena = val;
1990961348fSMurthy NSSR 	CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
2000961348fSMurthy NSSR 		      CPTX_VQX_CTL(0, 0), vqx_ctl.u);
2010961348fSMurthy NSSR }
2020961348fSMurthy NSSR 
2030961348fSMurthy NSSR /* Write to VQX_INPROG register
2040961348fSMurthy NSSR  */
2050961348fSMurthy NSSR static void
otx_cpt_write_vq_inprog(struct cpt_vf * cptvf,uint8_t val)2060961348fSMurthy NSSR otx_cpt_write_vq_inprog(struct cpt_vf *cptvf, uint8_t val)
2070961348fSMurthy NSSR {
2080961348fSMurthy NSSR 	cptx_vqx_inprog_t vqx_inprg;
2090961348fSMurthy NSSR 
2100961348fSMurthy NSSR 	vqx_inprg.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf),
2110961348fSMurthy NSSR 				   CPTX_VQX_INPROG(0, 0));
2120961348fSMurthy NSSR 	vqx_inprg.s.inflight = val;
2130961348fSMurthy NSSR 	CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
2140961348fSMurthy NSSR 		      CPTX_VQX_INPROG(0, 0), vqx_inprg.u);
2150961348fSMurthy NSSR }
2160961348fSMurthy NSSR 
2170961348fSMurthy NSSR /* Write to VQX_DONE_WAIT NUMWAIT register
2180961348fSMurthy NSSR  */
2190961348fSMurthy NSSR static void
otx_cpt_write_vq_done_numwait(struct cpt_vf * cptvf,uint32_t val)2200961348fSMurthy NSSR otx_cpt_write_vq_done_numwait(struct cpt_vf *cptvf, uint32_t val)
2210961348fSMurthy NSSR {
2220961348fSMurthy NSSR 	cptx_vqx_done_wait_t vqx_dwait;
2230961348fSMurthy NSSR 
2240961348fSMurthy NSSR 	vqx_dwait.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf),
2250961348fSMurthy NSSR 				   CPTX_VQX_DONE_WAIT(0, 0));
2260961348fSMurthy NSSR 	vqx_dwait.s.num_wait = val;
2270961348fSMurthy NSSR 	CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
2280961348fSMurthy NSSR 		      CPTX_VQX_DONE_WAIT(0, 0), vqx_dwait.u);
2290961348fSMurthy NSSR }
2300961348fSMurthy NSSR 
2310961348fSMurthy NSSR /* Write to VQX_DONE_WAIT NUM_WAIT register
2320961348fSMurthy NSSR  */
2330961348fSMurthy NSSR static void
otx_cpt_write_vq_done_timewait(struct cpt_vf * cptvf,uint16_t val)2340961348fSMurthy NSSR otx_cpt_write_vq_done_timewait(struct cpt_vf *cptvf, uint16_t val)
2350961348fSMurthy NSSR {
2360961348fSMurthy NSSR 	cptx_vqx_done_wait_t vqx_dwait;
2370961348fSMurthy NSSR 
2380961348fSMurthy NSSR 	vqx_dwait.u = CPT_READ_CSR(CPT_CSR_REG_BASE(cptvf),
2390961348fSMurthy NSSR 				   CPTX_VQX_DONE_WAIT(0, 0));
2400961348fSMurthy NSSR 	vqx_dwait.s.time_wait = val;
2410961348fSMurthy NSSR 	CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
2420961348fSMurthy NSSR 		      CPTX_VQX_DONE_WAIT(0, 0), vqx_dwait.u);
2430961348fSMurthy NSSR }
2440961348fSMurthy NSSR 
2450961348fSMurthy NSSR /* Write to VQX_SADDR register
2460961348fSMurthy NSSR  */
2470961348fSMurthy NSSR static void
otx_cpt_write_vq_saddr(struct cpt_vf * cptvf,uint64_t val)2480961348fSMurthy NSSR otx_cpt_write_vq_saddr(struct cpt_vf *cptvf, uint64_t val)
2490961348fSMurthy NSSR {
2500961348fSMurthy NSSR 	cptx_vqx_saddr_t vqx_saddr;
2510961348fSMurthy NSSR 
2520961348fSMurthy NSSR 	vqx_saddr.u = val;
2530961348fSMurthy NSSR 	CPT_WRITE_CSR(CPT_CSR_REG_BASE(cptvf),
2540961348fSMurthy NSSR 		      CPTX_VQX_SADDR(0, 0), vqx_saddr.u);
2550961348fSMurthy NSSR }
2560961348fSMurthy NSSR 
2570961348fSMurthy NSSR static void
otx_cpt_vfvq_init(struct cpt_vf * cptvf)2580961348fSMurthy NSSR otx_cpt_vfvq_init(struct cpt_vf *cptvf)
2590961348fSMurthy NSSR {
2600961348fSMurthy NSSR 	uint64_t base_addr = 0;
2610961348fSMurthy NSSR 
2620961348fSMurthy NSSR 	/* Disable the VQ */
2630961348fSMurthy NSSR 	otx_cpt_write_vq_ctl(cptvf, 0);
2640961348fSMurthy NSSR 
2650961348fSMurthy NSSR 	/* Reset the doorbell */
2660961348fSMurthy NSSR 	otx_cpt_write_vq_doorbell(cptvf, 0);
2670961348fSMurthy NSSR 	/* Clear inflight */
2680961348fSMurthy NSSR 	otx_cpt_write_vq_inprog(cptvf, 0);
2690961348fSMurthy NSSR 
2700961348fSMurthy NSSR 	/* Write VQ SADDR */
2710961348fSMurthy NSSR 	base_addr = (uint64_t)(cptvf->cqueue.chead[0].dma_addr);
2720961348fSMurthy NSSR 	otx_cpt_write_vq_saddr(cptvf, base_addr);
2730961348fSMurthy NSSR 
2740961348fSMurthy NSSR 	/* Configure timerhold / coalescence */
2750961348fSMurthy NSSR 	otx_cpt_write_vq_done_timewait(cptvf, CPT_TIMER_THOLD);
2760961348fSMurthy NSSR 	otx_cpt_write_vq_done_numwait(cptvf, CPT_COUNT_THOLD);
2770961348fSMurthy NSSR 
2780961348fSMurthy NSSR 	/* Enable the VQ */
2790961348fSMurthy NSSR 	otx_cpt_write_vq_ctl(cptvf, 1);
2800961348fSMurthy NSSR }
2810961348fSMurthy NSSR 
2820961348fSMurthy NSSR static int
cpt_vq_init(struct cpt_vf * cptvf,uint8_t group)2830961348fSMurthy NSSR cpt_vq_init(struct cpt_vf *cptvf, uint8_t group)
2840961348fSMurthy NSSR {
2850961348fSMurthy NSSR 	int err;
2860961348fSMurthy NSSR 
2870961348fSMurthy NSSR 	/* Convey VQ LEN to PF */
2880961348fSMurthy NSSR 	err = otx_cpt_send_vq_size_msg(cptvf);
2890961348fSMurthy NSSR 	if (err) {
2900961348fSMurthy NSSR 		CPT_LOG_ERR("%s: PF not responding to QLEN msg",
2910961348fSMurthy NSSR 			    cptvf->dev_name);
2920961348fSMurthy NSSR 		err = -EBUSY;
2930961348fSMurthy NSSR 		goto cleanup;
2940961348fSMurthy NSSR 	}
2950961348fSMurthy NSSR 
2960961348fSMurthy NSSR 	/* CPT VF device initialization */
2970961348fSMurthy NSSR 	otx_cpt_vfvq_init(cptvf);
2980961348fSMurthy NSSR 
299*7be78d02SJosh Soref 	/* Send msg to PF to assign current Q to required group */
3000961348fSMurthy NSSR 	cptvf->vfgrp = group;
3010961348fSMurthy NSSR 	err = otx_cpt_send_vf_grp_msg(cptvf, group);
3020961348fSMurthy NSSR 	if (err) {
3030961348fSMurthy NSSR 		CPT_LOG_ERR("%s: PF not responding to VF_GRP msg",
3040961348fSMurthy NSSR 			    cptvf->dev_name);
3050961348fSMurthy NSSR 		err = -EBUSY;
3060961348fSMurthy NSSR 		goto cleanup;
3070961348fSMurthy NSSR 	}
3080961348fSMurthy NSSR 
3090961348fSMurthy NSSR 	CPT_LOG_DP_DEBUG("%s: %s done", cptvf->dev_name, __func__);
3100961348fSMurthy NSSR 	return 0;
3110961348fSMurthy NSSR 
3120961348fSMurthy NSSR cleanup:
3130961348fSMurthy NSSR 	return err;
3140961348fSMurthy NSSR }
3150961348fSMurthy NSSR 
3160dc1cffaSAnkur Dwivedi void
otx_cpt_poll_misc(struct cpt_vf * cptvf)3170dc1cffaSAnkur Dwivedi otx_cpt_poll_misc(struct cpt_vf *cptvf)
3180dc1cffaSAnkur Dwivedi {
31984eb02f7SAnkur Dwivedi 	uint64_t intr;
32084eb02f7SAnkur Dwivedi 
32184eb02f7SAnkur Dwivedi 	intr = otx_cpt_read_vf_misc_intr_status(cptvf);
32284eb02f7SAnkur Dwivedi 
32384eb02f7SAnkur Dwivedi 	if (!intr)
32484eb02f7SAnkur Dwivedi 		return;
32584eb02f7SAnkur Dwivedi 
32684eb02f7SAnkur Dwivedi 	/* Check for MISC interrupt types */
32784eb02f7SAnkur Dwivedi 	if (likely(intr & CPT_VF_INTR_MBOX_MASK)) {
32884eb02f7SAnkur Dwivedi 		CPT_LOG_DP_DEBUG("%s: Mailbox interrupt 0x%lx on CPT VF %d",
32984eb02f7SAnkur Dwivedi 			cptvf->dev_name, (unsigned int long)intr, cptvf->vfid);
330ae500541SMurthy NSSR 		otx_cpt_handle_mbox_intr(cptvf);
33184eb02f7SAnkur Dwivedi 		otx_cpt_clear_mbox_intr(cptvf);
33284eb02f7SAnkur Dwivedi 	} else if (unlikely(intr & CPT_VF_INTR_IRDE_MASK)) {
33384eb02f7SAnkur Dwivedi 		otx_cpt_clear_irde_intr(cptvf);
33484eb02f7SAnkur Dwivedi 		CPT_LOG_DP_DEBUG("%s: Instruction NCB read error interrupt "
33584eb02f7SAnkur Dwivedi 				"0x%lx on CPT VF %d", cptvf->dev_name,
33684eb02f7SAnkur Dwivedi 				(unsigned int long)intr, cptvf->vfid);
33784eb02f7SAnkur Dwivedi 	} else if (unlikely(intr & CPT_VF_INTR_NWRP_MASK)) {
33884eb02f7SAnkur Dwivedi 		otx_cpt_clear_nwrp_intr(cptvf);
33984eb02f7SAnkur Dwivedi 		CPT_LOG_DP_DEBUG("%s: NCB response write error interrupt 0x%lx"
34084eb02f7SAnkur Dwivedi 				" on CPT VF %d", cptvf->dev_name,
34184eb02f7SAnkur Dwivedi 				(unsigned int long)intr, cptvf->vfid);
34284eb02f7SAnkur Dwivedi 	} else if (unlikely(intr & CPT_VF_INTR_SWERR_MASK)) {
34384eb02f7SAnkur Dwivedi 		otx_cpt_clear_swerr_intr(cptvf);
34484eb02f7SAnkur Dwivedi 		CPT_LOG_DP_DEBUG("%s: Software error interrupt 0x%lx on CPT VF "
34584eb02f7SAnkur Dwivedi 				"%d", cptvf->dev_name, (unsigned int long)intr,
34684eb02f7SAnkur Dwivedi 				cptvf->vfid);
34784eb02f7SAnkur Dwivedi 	} else if (unlikely(intr & CPT_VF_INTR_HWERR_MASK)) {
34884eb02f7SAnkur Dwivedi 		otx_cpt_clear_hwerr_intr(cptvf);
34984eb02f7SAnkur Dwivedi 		CPT_LOG_DP_DEBUG("%s: Hardware error interrupt 0x%lx on CPT VF "
35084eb02f7SAnkur Dwivedi 				"%d", cptvf->dev_name, (unsigned int long)intr,
35184eb02f7SAnkur Dwivedi 				cptvf->vfid);
35284eb02f7SAnkur Dwivedi 	} else if (unlikely(intr & CPT_VF_INTR_FAULT_MASK)) {
35384eb02f7SAnkur Dwivedi 		otx_cpt_clear_fault_intr(cptvf);
35484eb02f7SAnkur Dwivedi 		CPT_LOG_DP_DEBUG("%s: Translation fault interrupt 0x%lx on CPT VF "
35584eb02f7SAnkur Dwivedi 				"%d", cptvf->dev_name, (unsigned int long)intr,
35684eb02f7SAnkur Dwivedi 				cptvf->vfid);
35784eb02f7SAnkur Dwivedi 	} else if (unlikely(intr & CPT_VF_INTR_DOVF_MASK)) {
35884eb02f7SAnkur Dwivedi 		otx_cpt_clear_dovf_intr(cptvf);
35984eb02f7SAnkur Dwivedi 		CPT_LOG_DP_DEBUG("%s: Doorbell overflow interrupt 0x%lx on CPT VF "
36084eb02f7SAnkur Dwivedi 				"%d", cptvf->dev_name, (unsigned int long)intr,
36184eb02f7SAnkur Dwivedi 				cptvf->vfid);
36284eb02f7SAnkur Dwivedi 	} else
36384eb02f7SAnkur Dwivedi 		CPT_LOG_DP_ERR("%s: Unhandled interrupt 0x%lx in CPT VF %d",
36484eb02f7SAnkur Dwivedi 				cptvf->dev_name, (unsigned int long)intr,
36584eb02f7SAnkur Dwivedi 				cptvf->vfid);
3660dc1cffaSAnkur Dwivedi }
3670dc1cffaSAnkur Dwivedi 
3680dc1cffaSAnkur Dwivedi int
otx_cpt_hw_init(struct cpt_vf * cptvf,void * pdev,void * reg_base,char * name)3690dc1cffaSAnkur Dwivedi otx_cpt_hw_init(struct cpt_vf *cptvf, void *pdev, void *reg_base, char *name)
3700dc1cffaSAnkur Dwivedi {
3710dc1cffaSAnkur Dwivedi 	memset(cptvf, 0, sizeof(struct cpt_vf));
3720dc1cffaSAnkur Dwivedi 
3730dc1cffaSAnkur Dwivedi 	/* Bar0 base address */
3740dc1cffaSAnkur Dwivedi 	cptvf->reg_base = reg_base;
375acbaf3ceSAnoob Joseph 
376acbaf3ceSAnoob Joseph 	/* Save device name */
377acbaf3ceSAnoob Joseph 	strlcpy(cptvf->dev_name, name, (sizeof(cptvf->dev_name)));
3780dc1cffaSAnkur Dwivedi 
3790dc1cffaSAnkur Dwivedi 	cptvf->pdev = pdev;
3800dc1cffaSAnkur Dwivedi 
3810dc1cffaSAnkur Dwivedi 	/* To clear if there are any pending mbox msgs */
3820dc1cffaSAnkur Dwivedi 	otx_cpt_poll_misc(cptvf);
3830dc1cffaSAnkur Dwivedi 
3840dc1cffaSAnkur Dwivedi 	if (otx_cpt_vf_init(cptvf)) {
3850dc1cffaSAnkur Dwivedi 		CPT_LOG_ERR("Failed to initialize CPT VF device");
3860dc1cffaSAnkur Dwivedi 		return -1;
3870dc1cffaSAnkur Dwivedi 	}
3880dc1cffaSAnkur Dwivedi 
38913d711f3SKanaka Durga Kotamarthy 	/* Gets device type */
39013d711f3SKanaka Durga Kotamarthy 	if (otx_cpt_get_dev_type(cptvf)) {
39113d711f3SKanaka Durga Kotamarthy 		CPT_LOG_ERR("Failed to get device type");
39213d711f3SKanaka Durga Kotamarthy 		return -1;
39313d711f3SKanaka Durga Kotamarthy 	}
39413d711f3SKanaka Durga Kotamarthy 
3950dc1cffaSAnkur Dwivedi 	return 0;
3960dc1cffaSAnkur Dwivedi }
397273487f7SAnoob Joseph 
398273487f7SAnoob Joseph int
otx_cpt_deinit_device(void * dev)399273487f7SAnoob Joseph otx_cpt_deinit_device(void *dev)
400273487f7SAnoob Joseph {
401273487f7SAnoob Joseph 	struct cpt_vf *cptvf = (struct cpt_vf *)dev;
402273487f7SAnoob Joseph 
403273487f7SAnoob Joseph 	/* Do misc work one last time */
404273487f7SAnoob Joseph 	otx_cpt_poll_misc(cptvf);
405273487f7SAnoob Joseph 
406273487f7SAnoob Joseph 	return 0;
407273487f7SAnoob Joseph }
4080906b99fSMurthy NSSR 
409ec54bc9dSAnoob Joseph static int
otx_cpt_metabuf_mempool_create(const struct rte_cryptodev * dev,struct cpt_instance * instance,uint8_t qp_id,unsigned int nb_elements)410ec54bc9dSAnoob Joseph otx_cpt_metabuf_mempool_create(const struct rte_cryptodev *dev,
411ec54bc9dSAnoob Joseph 			       struct cpt_instance *instance, uint8_t qp_id,
41226f556b3SAnoob Joseph 			       unsigned int nb_elements)
413ec54bc9dSAnoob Joseph {
414ec54bc9dSAnoob Joseph 	char mempool_name[RTE_MEMPOOL_NAMESIZE];
415ec54bc9dSAnoob Joseph 	struct cpt_qp_meta_info *meta_info;
416ec54bc9dSAnoob Joseph 	struct rte_mempool *pool;
417fadc1ea1SKanaka Durga Kotamarthy 	int max_mlen = 0;
418fadc1ea1SKanaka Durga Kotamarthy 	int sg_mlen = 0;
419fadc1ea1SKanaka Durga Kotamarthy 	int lb_mlen = 0;
42026f556b3SAnoob Joseph 	int mb_pool_sz;
421fadc1ea1SKanaka Durga Kotamarthy 	int ret;
422fadc1ea1SKanaka Durga Kotamarthy 
423fadc1ea1SKanaka Durga Kotamarthy 	/*
424fadc1ea1SKanaka Durga Kotamarthy 	 * Calculate metabuf length required. The 'crypto_octeontx' device
425fadc1ea1SKanaka Durga Kotamarthy 	 * would be either SYMMETRIC or ASYMMETRIC.
426fadc1ea1SKanaka Durga Kotamarthy 	 */
427fadc1ea1SKanaka Durga Kotamarthy 
428fadc1ea1SKanaka Durga Kotamarthy 	if (dev->feature_flags & RTE_CRYPTODEV_FF_SYMMETRIC_CRYPTO) {
429ec54bc9dSAnoob Joseph 
430ec54bc9dSAnoob Joseph 		/* Get meta len for scatter gather mode */
431ec54bc9dSAnoob Joseph 		sg_mlen = cpt_pmd_ops_helper_get_mlen_sg_mode();
432ec54bc9dSAnoob Joseph 
433ec54bc9dSAnoob Joseph 		/* Extra 32B saved for future considerations */
434ec54bc9dSAnoob Joseph 		sg_mlen += 4 * sizeof(uint64_t);
435ec54bc9dSAnoob Joseph 
436ec54bc9dSAnoob Joseph 		/* Get meta len for linear buffer (direct) mode */
437ec54bc9dSAnoob Joseph 		lb_mlen = cpt_pmd_ops_helper_get_mlen_direct_mode();
438ec54bc9dSAnoob Joseph 
439ec54bc9dSAnoob Joseph 		/* Extra 32B saved for future considerations */
440ec54bc9dSAnoob Joseph 		lb_mlen += 4 * sizeof(uint64_t);
441ec54bc9dSAnoob Joseph 
442ec54bc9dSAnoob Joseph 		/* Check max requirement for meta buffer */
443ec54bc9dSAnoob Joseph 		max_mlen = RTE_MAX(lb_mlen, sg_mlen);
444fadc1ea1SKanaka Durga Kotamarthy 	} else {
445fadc1ea1SKanaka Durga Kotamarthy 
446fadc1ea1SKanaka Durga Kotamarthy 		/* Asymmetric device */
447fadc1ea1SKanaka Durga Kotamarthy 
448fadc1ea1SKanaka Durga Kotamarthy 		/* Get meta len for asymmetric operations */
449fadc1ea1SKanaka Durga Kotamarthy 		max_mlen = cpt_pmd_ops_helper_asym_get_mlen();
450fadc1ea1SKanaka Durga Kotamarthy 	}
451ec54bc9dSAnoob Joseph 
452ec54bc9dSAnoob Joseph 	/* Allocate mempool */
453ec54bc9dSAnoob Joseph 
454ec54bc9dSAnoob Joseph 	snprintf(mempool_name, RTE_MEMPOOL_NAMESIZE, "otx_cpt_mb_%u:%u",
455ec54bc9dSAnoob Joseph 		 dev->data->dev_id, qp_id);
456ec54bc9dSAnoob Joseph 
45726f556b3SAnoob Joseph 	mb_pool_sz = RTE_MAX(nb_elements, (METABUF_POOL_CACHE_SIZE * rte_lcore_count()));
45826f556b3SAnoob Joseph 
45926f556b3SAnoob Joseph 	pool = rte_mempool_create_empty(mempool_name, mb_pool_sz, max_mlen,
460ec54bc9dSAnoob Joseph 					METABUF_POOL_CACHE_SIZE, 0,
461ec54bc9dSAnoob Joseph 					rte_socket_id(), 0);
462ec54bc9dSAnoob Joseph 
463ec54bc9dSAnoob Joseph 	if (pool == NULL) {
464ec54bc9dSAnoob Joseph 		CPT_LOG_ERR("Could not create mempool for metabuf");
465ec54bc9dSAnoob Joseph 		return rte_errno;
466ec54bc9dSAnoob Joseph 	}
467ec54bc9dSAnoob Joseph 
468ec54bc9dSAnoob Joseph 	ret = rte_mempool_set_ops_byname(pool, RTE_MBUF_DEFAULT_MEMPOOL_OPS,
469ec54bc9dSAnoob Joseph 					 NULL);
470ec54bc9dSAnoob Joseph 	if (ret) {
471ec54bc9dSAnoob Joseph 		CPT_LOG_ERR("Could not set mempool ops");
472ec54bc9dSAnoob Joseph 		goto mempool_free;
473ec54bc9dSAnoob Joseph 	}
474ec54bc9dSAnoob Joseph 
475ec54bc9dSAnoob Joseph 	ret = rte_mempool_populate_default(pool);
476ec54bc9dSAnoob Joseph 	if (ret <= 0) {
477ec54bc9dSAnoob Joseph 		CPT_LOG_ERR("Could not populate metabuf pool");
478ec54bc9dSAnoob Joseph 		goto mempool_free;
479ec54bc9dSAnoob Joseph 	}
480ec54bc9dSAnoob Joseph 
481ec54bc9dSAnoob Joseph 	meta_info = &instance->meta_info;
482ec54bc9dSAnoob Joseph 
483ec54bc9dSAnoob Joseph 	meta_info->pool = pool;
484ec54bc9dSAnoob Joseph 	meta_info->lb_mlen = lb_mlen;
485ec54bc9dSAnoob Joseph 	meta_info->sg_mlen = sg_mlen;
486ec54bc9dSAnoob Joseph 
487ec54bc9dSAnoob Joseph 	return 0;
488ec54bc9dSAnoob Joseph 
489ec54bc9dSAnoob Joseph mempool_free:
490ec54bc9dSAnoob Joseph 	rte_mempool_free(pool);
491ec54bc9dSAnoob Joseph 	return ret;
492ec54bc9dSAnoob Joseph }
493ec54bc9dSAnoob Joseph 
494ec54bc9dSAnoob Joseph static void
otx_cpt_metabuf_mempool_destroy(struct cpt_instance * instance)495ec54bc9dSAnoob Joseph otx_cpt_metabuf_mempool_destroy(struct cpt_instance *instance)
496ec54bc9dSAnoob Joseph {
497ec54bc9dSAnoob Joseph 	struct cpt_qp_meta_info *meta_info = &instance->meta_info;
498ec54bc9dSAnoob Joseph 
499ec54bc9dSAnoob Joseph 	rte_mempool_free(meta_info->pool);
500ec54bc9dSAnoob Joseph 
501ec54bc9dSAnoob Joseph 	meta_info->pool = NULL;
502ec54bc9dSAnoob Joseph 	meta_info->lb_mlen = 0;
503ec54bc9dSAnoob Joseph 	meta_info->sg_mlen = 0;
504ec54bc9dSAnoob Joseph }
505ec54bc9dSAnoob Joseph 
5060906b99fSMurthy NSSR int
otx_cpt_get_resource(const struct rte_cryptodev * dev,uint8_t group,struct cpt_instance ** instance,uint16_t qp_id)507ec54bc9dSAnoob Joseph otx_cpt_get_resource(const struct rte_cryptodev *dev, uint8_t group,
508ec54bc9dSAnoob Joseph 		     struct cpt_instance **instance, uint16_t qp_id)
5090961348fSMurthy NSSR {
5100961348fSMurthy NSSR 	int ret = -ENOENT, len, qlen, i;
5110961348fSMurthy NSSR 	int chunk_len, chunks, chunk_size;
512ec54bc9dSAnoob Joseph 	struct cpt_vf *cptvf = dev->data->dev_private;
5130961348fSMurthy NSSR 	struct cpt_instance *cpt_instance;
5140961348fSMurthy NSSR 	struct command_chunk *chunk_head = NULL, *chunk_prev = NULL;
5150961348fSMurthy NSSR 	struct command_chunk *chunk = NULL;
5160961348fSMurthy NSSR 	uint8_t *mem;
5170961348fSMurthy NSSR 	const struct rte_memzone *rz;
5180961348fSMurthy NSSR 	uint64_t dma_addr = 0, alloc_len, used_len;
5190961348fSMurthy NSSR 	uint64_t *next_ptr;
5200961348fSMurthy NSSR 	uint64_t pg_sz = sysconf(_SC_PAGESIZE);
5210961348fSMurthy NSSR 
5220961348fSMurthy NSSR 	CPT_LOG_DP_DEBUG("Initializing cpt resource %s", cptvf->dev_name);
5230961348fSMurthy NSSR 
5240961348fSMurthy NSSR 	cpt_instance = &cptvf->instance;
5250961348fSMurthy NSSR 
5260961348fSMurthy NSSR 	memset(&cptvf->cqueue, 0, sizeof(cptvf->cqueue));
5270961348fSMurthy NSSR 	memset(&cptvf->pqueue, 0, sizeof(cptvf->pqueue));
5280961348fSMurthy NSSR 
5290961348fSMurthy NSSR 	/* Chunks are of fixed size buffers */
530c9902a15SDavid George 
531c9902a15SDavid George 	qlen = DEFAULT_CMD_QLEN;
5320961348fSMurthy NSSR 	chunks = DEFAULT_CMD_QCHUNKS;
5330961348fSMurthy NSSR 	chunk_len = DEFAULT_CMD_QCHUNK_SIZE;
5340961348fSMurthy NSSR 	/* Chunk size includes 8 bytes of next chunk ptr */
5350961348fSMurthy NSSR 	chunk_size = chunk_len * CPT_INST_SIZE + CPT_NEXT_CHUNK_PTR_SIZE;
5360961348fSMurthy NSSR 
5370961348fSMurthy NSSR 	/* For command chunk structures */
5380961348fSMurthy NSSR 	len = chunks * RTE_ALIGN(sizeof(struct command_chunk), 8);
5390961348fSMurthy NSSR 
5400961348fSMurthy NSSR 	/* For pending queue */
541c9902a15SDavid George 	len += qlen * RTE_ALIGN(sizeof(cptvf->pqueue.rid_queue[0]), 8);
5420961348fSMurthy NSSR 
5430961348fSMurthy NSSR 	/* So that instruction queues start as pg size aligned */
5440961348fSMurthy NSSR 	len = RTE_ALIGN(len, pg_sz);
5450961348fSMurthy NSSR 
5460961348fSMurthy NSSR 	/* For Instruction queues */
5470961348fSMurthy NSSR 	len += chunks * RTE_ALIGN(chunk_size, 128);
5480961348fSMurthy NSSR 
5490961348fSMurthy NSSR 	/* Wastage after instruction queues */
5500961348fSMurthy NSSR 	len = RTE_ALIGN(len, pg_sz);
5510961348fSMurthy NSSR 
5520961348fSMurthy NSSR 	rz = rte_memzone_reserve_aligned(cptvf->dev_name, len, cptvf->node,
5530961348fSMurthy NSSR 					 RTE_MEMZONE_SIZE_HINT_ONLY |
5540961348fSMurthy NSSR 					 RTE_MEMZONE_256MB,
5550961348fSMurthy NSSR 					 RTE_CACHE_LINE_SIZE);
5560961348fSMurthy NSSR 	if (!rz) {
5570961348fSMurthy NSSR 		ret = rte_errno;
558ec54bc9dSAnoob Joseph 		goto exit;
5590961348fSMurthy NSSR 	}
5600961348fSMurthy NSSR 
5610961348fSMurthy NSSR 	mem = rz->addr;
56272f82c43SThomas Monjalon 	dma_addr = rz->iova;
5630961348fSMurthy NSSR 	alloc_len = len;
5640961348fSMurthy NSSR 
5650961348fSMurthy NSSR 	memset(mem, 0, len);
5660961348fSMurthy NSSR 
5670961348fSMurthy NSSR 	cpt_instance->rsvd = (uintptr_t)rz;
5680961348fSMurthy NSSR 
569ec54bc9dSAnoob Joseph 	ret = otx_cpt_metabuf_mempool_create(dev, cpt_instance, qp_id, qlen);
570ec54bc9dSAnoob Joseph 	if (ret) {
571ec54bc9dSAnoob Joseph 		CPT_LOG_ERR("Could not create mempool for metabuf");
572ec54bc9dSAnoob Joseph 		goto memzone_free;
573ec54bc9dSAnoob Joseph 	}
574ec54bc9dSAnoob Joseph 
5750961348fSMurthy NSSR 	/* Pending queue setup */
576c9902a15SDavid George 	cptvf->pqueue.rid_queue = (void **)mem;
5770961348fSMurthy NSSR 
578c9902a15SDavid George 	mem +=  qlen * RTE_ALIGN(sizeof(cptvf->pqueue.rid_queue[0]), 8);
579c9902a15SDavid George 	len -=  qlen * RTE_ALIGN(sizeof(cptvf->pqueue.rid_queue[0]), 8);
580c9902a15SDavid George 	dma_addr += qlen * RTE_ALIGN(sizeof(cptvf->pqueue.rid_queue[0]), 8);
5810961348fSMurthy NSSR 
5820961348fSMurthy NSSR 	/* Alignment wastage */
5830961348fSMurthy NSSR 	used_len = alloc_len - len;
5840961348fSMurthy NSSR 	mem += RTE_ALIGN(used_len, pg_sz) - used_len;
5850961348fSMurthy NSSR 	len -= RTE_ALIGN(used_len, pg_sz) - used_len;
5860961348fSMurthy NSSR 	dma_addr += RTE_ALIGN(used_len, pg_sz) - used_len;
5870961348fSMurthy NSSR 
5880961348fSMurthy NSSR 	/* Init instruction queues */
5890961348fSMurthy NSSR 	chunk_head = &cptvf->cqueue.chead[0];
5900961348fSMurthy NSSR 	i = qlen;
5910961348fSMurthy NSSR 
5920961348fSMurthy NSSR 	chunk_prev = NULL;
5930961348fSMurthy NSSR 	for (i = 0; i < DEFAULT_CMD_QCHUNKS; i++) {
5940961348fSMurthy NSSR 		int csize;
5950961348fSMurthy NSSR 
5960961348fSMurthy NSSR 		chunk = &cptvf->cqueue.chead[i];
5970961348fSMurthy NSSR 		chunk->head = mem;
5980961348fSMurthy NSSR 		chunk->dma_addr = dma_addr;
5990961348fSMurthy NSSR 
6000961348fSMurthy NSSR 		csize = RTE_ALIGN(chunk_size, 128);
6010961348fSMurthy NSSR 		mem += csize;
6020961348fSMurthy NSSR 		dma_addr += csize;
6030961348fSMurthy NSSR 		len -= csize;
6040961348fSMurthy NSSR 
6050961348fSMurthy NSSR 		if (chunk_prev) {
6060961348fSMurthy NSSR 			next_ptr = (uint64_t *)(chunk_prev->head +
6070961348fSMurthy NSSR 						chunk_size - 8);
6080961348fSMurthy NSSR 			*next_ptr = (uint64_t)chunk->dma_addr;
6090961348fSMurthy NSSR 		}
6100961348fSMurthy NSSR 		chunk_prev = chunk;
6110961348fSMurthy NSSR 	}
6120961348fSMurthy NSSR 	/* Circular loop */
6130961348fSMurthy NSSR 	next_ptr = (uint64_t *)(chunk_prev->head + chunk_size - 8);
6140961348fSMurthy NSSR 	*next_ptr = (uint64_t)chunk_head->dma_addr;
6150961348fSMurthy NSSR 
6160961348fSMurthy NSSR 	assert(!len);
6170961348fSMurthy NSSR 
6180961348fSMurthy NSSR 	/* This is used for CPT(0)_PF_Q(0..15)_CTL.size config */
6190961348fSMurthy NSSR 	cptvf->qsize = chunk_size / 8;
6200961348fSMurthy NSSR 	cptvf->cqueue.qhead = chunk_head->head;
6210961348fSMurthy NSSR 	cptvf->cqueue.idx = 0;
6220961348fSMurthy NSSR 	cptvf->cqueue.cchunk = 0;
6230961348fSMurthy NSSR 
6240961348fSMurthy NSSR 	if (cpt_vq_init(cptvf, group)) {
6250961348fSMurthy NSSR 		CPT_LOG_ERR("Failed to initialize CPT VQ of device %s",
6260961348fSMurthy NSSR 			    cptvf->dev_name);
6270961348fSMurthy NSSR 		ret = -EBUSY;
628ec54bc9dSAnoob Joseph 		goto mempool_destroy;
6290961348fSMurthy NSSR 	}
6300961348fSMurthy NSSR 
6310961348fSMurthy NSSR 	*instance = cpt_instance;
6320961348fSMurthy NSSR 
6330961348fSMurthy NSSR 	CPT_LOG_DP_DEBUG("Crypto device (%s) initialized", cptvf->dev_name);
6340961348fSMurthy NSSR 
6350961348fSMurthy NSSR 	return 0;
636ec54bc9dSAnoob Joseph 
637ec54bc9dSAnoob Joseph mempool_destroy:
638ec54bc9dSAnoob Joseph 	otx_cpt_metabuf_mempool_destroy(cpt_instance);
639ec54bc9dSAnoob Joseph memzone_free:
6400961348fSMurthy NSSR 	rte_memzone_free(rz);
641ec54bc9dSAnoob Joseph exit:
6420961348fSMurthy NSSR 	*instance = NULL;
6430961348fSMurthy NSSR 	return ret;
6440961348fSMurthy NSSR }
6450961348fSMurthy NSSR 
6460961348fSMurthy NSSR int
otx_cpt_put_resource(struct cpt_instance * instance)6470961348fSMurthy NSSR otx_cpt_put_resource(struct cpt_instance *instance)
6480961348fSMurthy NSSR {
6490961348fSMurthy NSSR 	struct cpt_vf *cptvf = (struct cpt_vf *)instance;
6500961348fSMurthy NSSR 	struct rte_memzone *rz;
6510961348fSMurthy NSSR 
6520961348fSMurthy NSSR 	if (!cptvf) {
6530961348fSMurthy NSSR 		CPT_LOG_ERR("Invalid CPTVF handle");
6540961348fSMurthy NSSR 		return -EINVAL;
6550961348fSMurthy NSSR 	}
6560961348fSMurthy NSSR 
6570961348fSMurthy NSSR 	CPT_LOG_DP_DEBUG("Releasing cpt device %s", cptvf->dev_name);
6580961348fSMurthy NSSR 
659ec54bc9dSAnoob Joseph 	otx_cpt_metabuf_mempool_destroy(instance);
660ec54bc9dSAnoob Joseph 
6610961348fSMurthy NSSR 	rz = (struct rte_memzone *)instance->rsvd;
6620961348fSMurthy NSSR 	rte_memzone_free(rz);
6630961348fSMurthy NSSR 	return 0;
6640961348fSMurthy NSSR }
6650961348fSMurthy NSSR 
6660961348fSMurthy NSSR int
otx_cpt_start_device(void * dev)6670906b99fSMurthy NSSR otx_cpt_start_device(void *dev)
6680906b99fSMurthy NSSR {
6690906b99fSMurthy NSSR 	int rc;
6700906b99fSMurthy NSSR 	struct cpt_vf *cptvf = (struct cpt_vf *)dev;
6710906b99fSMurthy NSSR 
6720906b99fSMurthy NSSR 	rc = otx_cpt_send_vf_up(cptvf);
6730906b99fSMurthy NSSR 	if (rc) {
6740906b99fSMurthy NSSR 		CPT_LOG_ERR("Failed to mark CPT VF device %s UP, rc = %d",
6750906b99fSMurthy NSSR 			    cptvf->dev_name, rc);
6760906b99fSMurthy NSSR 		return -EFAULT;
6770906b99fSMurthy NSSR 	}
6780906b99fSMurthy NSSR 
6790906b99fSMurthy NSSR 	return 0;
6800906b99fSMurthy NSSR }
6810906b99fSMurthy NSSR 
6820906b99fSMurthy NSSR void
otx_cpt_stop_device(void * dev)6830906b99fSMurthy NSSR otx_cpt_stop_device(void *dev)
6840906b99fSMurthy NSSR {
6850906b99fSMurthy NSSR 	int rc;
6860906b99fSMurthy NSSR 	uint32_t pending, retries = 5;
6870906b99fSMurthy NSSR 	struct cpt_vf *cptvf = (struct cpt_vf *)dev;
6880906b99fSMurthy NSSR 
6890906b99fSMurthy NSSR 	/* Wait for pending entries to complete */
6900906b99fSMurthy NSSR 	pending = otx_cpt_read_vq_doorbell(cptvf);
6910906b99fSMurthy NSSR 	while (pending) {
6920906b99fSMurthy NSSR 		CPT_LOG_DP_DEBUG("%s: Waiting for pending %u cmds to complete",
6930906b99fSMurthy NSSR 				 cptvf->dev_name, pending);
6940906b99fSMurthy NSSR 		sleep(1);
6950906b99fSMurthy NSSR 		pending = otx_cpt_read_vq_doorbell(cptvf);
6960906b99fSMurthy NSSR 		retries--;
6970906b99fSMurthy NSSR 		if (!retries)
6980906b99fSMurthy NSSR 			break;
6990906b99fSMurthy NSSR 	}
7000906b99fSMurthy NSSR 
7010906b99fSMurthy NSSR 	if (!retries && pending) {
7020906b99fSMurthy NSSR 		CPT_LOG_ERR("%s: Timeout waiting for commands(%u)",
7030906b99fSMurthy NSSR 			    cptvf->dev_name, pending);
7040906b99fSMurthy NSSR 		return;
7050906b99fSMurthy NSSR 	}
7060906b99fSMurthy NSSR 
7070906b99fSMurthy NSSR 	rc = otx_cpt_send_vf_down(cptvf);
7080906b99fSMurthy NSSR 	if (rc) {
7090906b99fSMurthy NSSR 		CPT_LOG_ERR("Failed to bring down vf %s, rc %d",
7100906b99fSMurthy NSSR 			    cptvf->dev_name, rc);
7110906b99fSMurthy NSSR 		return;
7120906b99fSMurthy NSSR 	}
7130906b99fSMurthy NSSR }
714