xref: /dpdk/drivers/compress/octeontx/otx_zip.h (revision 52048f8f89aff15b90d6dbf81ec665e5fc53d24d)
143e610bbSSunila Sahu /* SPDX-License-Identifier: BSD-3-Clause
243e610bbSSunila Sahu  * Copyright(c) 2018 Cavium, Inc
343e610bbSSunila Sahu  */
443e610bbSSunila Sahu 
543e610bbSSunila Sahu #ifndef _RTE_OCTEONTX_ZIP_VF_H_
643e610bbSSunila Sahu #define _RTE_OCTEONTX_ZIP_VF_H_
743e610bbSSunila Sahu 
843e610bbSSunila Sahu #include <unistd.h>
943e610bbSSunila Sahu 
1043e610bbSSunila Sahu #include <rte_bus_pci.h>
1143e610bbSSunila Sahu #include <rte_comp.h>
1243e610bbSSunila Sahu #include <rte_compressdev.h>
1343e610bbSSunila Sahu #include <rte_compressdev_pmd.h>
1443e610bbSSunila Sahu #include <rte_malloc.h>
1543e610bbSSunila Sahu #include <rte_memory.h>
1643e610bbSSunila Sahu #include <rte_spinlock.h>
1743e610bbSSunila Sahu 
1843e610bbSSunila Sahu #include <zip_regs.h>
1943e610bbSSunila Sahu 
2043e610bbSSunila Sahu int octtx_zip_logtype_driver;
2143e610bbSSunila Sahu 
2243e610bbSSunila Sahu /* ZIP VF Control/Status registers (CSRs): */
2343e610bbSSunila Sahu /* VF_BAR0: */
2443e610bbSSunila Sahu #define ZIP_VQ_ENA              (0x10)
2543e610bbSSunila Sahu #define ZIP_VQ_SBUF_ADDR        (0x20)
2643e610bbSSunila Sahu #define ZIP_VF_PF_MBOXX(x)      (0x400 | (x)<<3)
2743e610bbSSunila Sahu #define ZIP_VQ_DOORBELL         (0x1000)
2843e610bbSSunila Sahu 
2943e610bbSSunila Sahu /**< Vendor ID */
3043e610bbSSunila Sahu #define PCI_VENDOR_ID_CAVIUM	0x177D
3143e610bbSSunila Sahu /**< PCI device id of ZIP VF */
3243e610bbSSunila Sahu #define PCI_DEVICE_ID_OCTEONTX_ZIPVF	0xA037
3343e610bbSSunila Sahu 
3443e610bbSSunila Sahu /* maxmum number of zip vf devices */
3543e610bbSSunila Sahu #define ZIP_MAX_VFS 8
3643e610bbSSunila Sahu 
3743e610bbSSunila Sahu /* max size of one chunk */
3843e610bbSSunila Sahu #define ZIP_MAX_CHUNK_SIZE	8192
3943e610bbSSunila Sahu 
4043e610bbSSunila Sahu /* each instruction is fixed 128 bytes */
4143e610bbSSunila Sahu #define ZIP_CMD_SIZE		128
4243e610bbSSunila Sahu 
4343e610bbSSunila Sahu #define ZIP_CMD_SIZE_WORDS	(ZIP_CMD_SIZE >> 3) /* 16 64_bit words */
4443e610bbSSunila Sahu 
4543e610bbSSunila Sahu /* size of next chunk buffer pointer */
4643e610bbSSunila Sahu #define ZIP_MAX_NCBP_SIZE	8
4743e610bbSSunila Sahu 
4843e610bbSSunila Sahu /* size of instruction queue in units of instruction size */
4943e610bbSSunila Sahu #define ZIP_MAX_NUM_CMDS	((ZIP_MAX_CHUNK_SIZE - ZIP_MAX_NCBP_SIZE) / \
5043e610bbSSunila Sahu 				ZIP_CMD_SIZE) /* 63 */
5143e610bbSSunila Sahu 
5243e610bbSSunila Sahu /* size of instruct queue in bytes */
5343e610bbSSunila Sahu #define ZIP_MAX_CMDQ_SIZE	((ZIP_MAX_NUM_CMDS * ZIP_CMD_SIZE) + \
5443e610bbSSunila Sahu 				ZIP_MAX_NCBP_SIZE)/* ~8072ull */
5543e610bbSSunila Sahu 
5643e610bbSSunila Sahu #define ZIP_BUF_SIZE	256
5743e610bbSSunila Sahu 
5843e610bbSSunila Sahu #define ZIP_SGPTR_ALIGN	16
5943e610bbSSunila Sahu #define ZIP_CMDQ_ALIGN	128
6043e610bbSSunila Sahu #define MAX_SG_LEN	((ZIP_BUF_SIZE - ZIP_SGPTR_ALIGN) / sizeof(void *))
6143e610bbSSunila Sahu 
6243e610bbSSunila Sahu /**< ZIP PMD specified queue pairs */
6343e610bbSSunila Sahu #define ZIP_MAX_VF_QUEUE	1
6443e610bbSSunila Sahu 
6543e610bbSSunila Sahu #define ZIP_ALIGN_ROUNDUP(x, _align) \
6643e610bbSSunila Sahu 	((_align) * (((x) + (_align) - 1) / (_align)))
6743e610bbSSunila Sahu 
6843e610bbSSunila Sahu /**< ZIP PMD device name */
6943e610bbSSunila Sahu #define COMPRESSDEV_NAME_ZIP_PMD	compress_octeonx
7043e610bbSSunila Sahu 
7143e610bbSSunila Sahu #define ZIP_PMD_LOG(level, fmt, args...) \
7243e610bbSSunila Sahu 	rte_log(RTE_LOG_ ## level, \
7343e610bbSSunila Sahu 	octtx_zip_logtype_driver, "%s(): "fmt "\n", \
7443e610bbSSunila Sahu 	__func__, ##args)
7543e610bbSSunila Sahu 
7643e610bbSSunila Sahu #define ZIP_PMD_INFO(fmt, args...) \
7743e610bbSSunila Sahu 	ZIP_PMD_LOG(INFO, fmt, ## args)
7843e610bbSSunila Sahu #define ZIP_PMD_ERR(fmt, args...) \
7943e610bbSSunila Sahu 	ZIP_PMD_LOG(ERR, fmt, ## args)
80c378f084SAshish Gupta 
81c378f084SAshish Gupta /* resources required to process stream */
82c378f084SAshish Gupta enum {
83c378f084SAshish Gupta 	RES_BUF = 0,
84c378f084SAshish Gupta 	CMD_BUF,
85c378f084SAshish Gupta 	HASH_CTX_BUF,
86c378f084SAshish Gupta 	DECOMP_CTX_BUF,
87c378f084SAshish Gupta 	IN_DATA_BUF,
88c378f084SAshish Gupta 	OUT_DATA_BUF,
89c378f084SAshish Gupta 	HISTORY_DATA_BUF,
90c378f084SAshish Gupta 	MAX_BUFS_PER_STREAM
91c378f084SAshish Gupta } NUM_BUFS_PER_STREAM;
92c378f084SAshish Gupta 
93b43ebc65SAshish Gupta struct zip_stream;
94c378f084SAshish Gupta struct zipvf_qp;
95c378f084SAshish Gupta 
96b43ebc65SAshish Gupta /* Algorithm handler function prototype */
97b43ebc65SAshish Gupta typedef int (*comp_func_t)(struct rte_comp_op *op,
98b43ebc65SAshish Gupta 			   struct zipvf_qp *qp, struct zip_stream *zstrm);
99b43ebc65SAshish Gupta 
100b43ebc65SAshish Gupta /**
101b43ebc65SAshish Gupta  * ZIP private stream structure
102b43ebc65SAshish Gupta  */
103b43ebc65SAshish Gupta struct zip_stream {
104b43ebc65SAshish Gupta 	union zip_inst_s *inst;
105b43ebc65SAshish Gupta 	/* zip instruction pointer */
106b43ebc65SAshish Gupta 	comp_func_t func;
107b43ebc65SAshish Gupta 	/* function to process comp operation */
108b43ebc65SAshish Gupta 	void *bufs[MAX_BUFS_PER_STREAM];
109b43ebc65SAshish Gupta } _rte_cache_aligned;
110b43ebc65SAshish Gupta 
111c378f084SAshish Gupta 
112c378f084SAshish Gupta /**
113c378f084SAshish Gupta  * ZIP instruction Queue
114c378f084SAshish Gupta  */
115c378f084SAshish Gupta struct zipvf_cmdq {
116c378f084SAshish Gupta 	rte_spinlock_t qlock;
117c378f084SAshish Gupta 	/* queue lock */
118c378f084SAshish Gupta 	uint64_t *sw_head;
119c378f084SAshish Gupta 	/* pointer to start of 8-byte word length queue-head */
120c378f084SAshish Gupta 	uint8_t *va;
121c378f084SAshish Gupta 	/* pointer to instruction queue virtual address */
122c378f084SAshish Gupta 	rte_iova_t iova;
123c378f084SAshish Gupta 	/* iova addr of cmdq head*/
124c378f084SAshish Gupta };
125c378f084SAshish Gupta 
126c378f084SAshish Gupta /**
127c378f084SAshish Gupta  * ZIP device queue structure
128c378f084SAshish Gupta  */
129c378f084SAshish Gupta struct zipvf_qp {
130c378f084SAshish Gupta 	struct zipvf_cmdq cmdq;
131c378f084SAshish Gupta 	/* Hardware instruction queue structure */
132c378f084SAshish Gupta 	struct rte_ring *processed_pkts;
133c378f084SAshish Gupta 	/* Ring for placing processed packets */
134c378f084SAshish Gupta 	struct rte_compressdev_stats qp_stats;
135c378f084SAshish Gupta 	/* Queue pair statistics */
136c378f084SAshish Gupta 	uint16_t id;
137c378f084SAshish Gupta 	/* Queue Pair Identifier */
138c378f084SAshish Gupta 	const char *name;
139c378f084SAshish Gupta 	/* Unique Queue Pair Name */
140c378f084SAshish Gupta 	struct zip_vf *vf;
141c378f084SAshish Gupta 	/* pointer to device, queue belongs to */
142c378f084SAshish Gupta } __rte_cache_aligned;
14343e610bbSSunila Sahu 
14443e610bbSSunila Sahu /**
14543e610bbSSunila Sahu  * ZIP VF device structure.
14643e610bbSSunila Sahu  */
14743e610bbSSunila Sahu struct zip_vf {
14843e610bbSSunila Sahu 	int vfid;
14943e610bbSSunila Sahu 	/* vf index */
15043e610bbSSunila Sahu 	struct rte_pci_device *pdev;
15143e610bbSSunila Sahu 	/* pci device */
15243e610bbSSunila Sahu 	void *vbar0;
15343e610bbSSunila Sahu 	/* CSR base address for underlying BAR0 VF.*/
15443e610bbSSunila Sahu 	uint64_t dom_sdom;
15543e610bbSSunila Sahu 	/* Storing mbox domain and subdomain id for app rerun*/
15643e610bbSSunila Sahu 	uint32_t  max_nb_queue_pairs;
15743e610bbSSunila Sahu 	/* pointer to device qps */
15843e610bbSSunila Sahu 	struct rte_mempool *zip_mp;
15943e610bbSSunila Sahu 	/* pointer to pools */
16043e610bbSSunila Sahu } __rte_cache_aligned;
16143e610bbSSunila Sahu 
162*52048f8fSAshish Gupta 
163*52048f8fSAshish Gupta static inline void
164*52048f8fSAshish Gupta zipvf_prepare_in_buf(struct zip_stream *zstrm, struct rte_comp_op *op)
165*52048f8fSAshish Gupta {
166*52048f8fSAshish Gupta 	uint32_t offset, inlen;
167*52048f8fSAshish Gupta 	struct rte_mbuf *m_src;
168*52048f8fSAshish Gupta 	union zip_inst_s *inst = zstrm->inst;
169*52048f8fSAshish Gupta 
170*52048f8fSAshish Gupta 	inlen = op->src.length;
171*52048f8fSAshish Gupta 	offset = op->src.offset;
172*52048f8fSAshish Gupta 	m_src = op->m_src;
173*52048f8fSAshish Gupta 
174*52048f8fSAshish Gupta 	/* Prepare direct input data pointer */
175*52048f8fSAshish Gupta 	inst->s.dg = 0;
176*52048f8fSAshish Gupta 	inst->s.inp_ptr_addr.s.addr =
177*52048f8fSAshish Gupta 			rte_pktmbuf_iova_offset(m_src, offset);
178*52048f8fSAshish Gupta 	inst->s.inp_ptr_ctl.s.length = inlen;
179*52048f8fSAshish Gupta }
180*52048f8fSAshish Gupta 
181*52048f8fSAshish Gupta static inline void
182*52048f8fSAshish Gupta zipvf_prepare_out_buf(struct zip_stream *zstrm, struct rte_comp_op *op)
183*52048f8fSAshish Gupta {
184*52048f8fSAshish Gupta 	uint32_t offset;
185*52048f8fSAshish Gupta 	struct rte_mbuf *m_dst;
186*52048f8fSAshish Gupta 	union zip_inst_s *inst = zstrm->inst;
187*52048f8fSAshish Gupta 
188*52048f8fSAshish Gupta 	offset = op->dst.offset;
189*52048f8fSAshish Gupta 	m_dst = op->m_dst;
190*52048f8fSAshish Gupta 
191*52048f8fSAshish Gupta 	/* Prepare direct input data pointer */
192*52048f8fSAshish Gupta 	inst->s.ds = 0;
193*52048f8fSAshish Gupta 	inst->s.out_ptr_addr.s.addr =
194*52048f8fSAshish Gupta 			rte_pktmbuf_iova_offset(m_dst, offset);
195*52048f8fSAshish Gupta 	inst->s.totaloutputlength = rte_pktmbuf_pkt_len(m_dst) -
196*52048f8fSAshish Gupta 			op->dst.offset;
197*52048f8fSAshish Gupta 	inst->s.out_ptr_ctl.s.length = inst->s.totaloutputlength;
198*52048f8fSAshish Gupta }
199*52048f8fSAshish Gupta 
200*52048f8fSAshish Gupta static inline void
201*52048f8fSAshish Gupta zipvf_prepare_cmd_stateless(struct rte_comp_op *op, struct zip_stream *zstrm)
202*52048f8fSAshish Gupta {
203*52048f8fSAshish Gupta 	union zip_inst_s *inst = zstrm->inst;
204*52048f8fSAshish Gupta 
205*52048f8fSAshish Gupta 	/* set flush flag to always 1*/
206*52048f8fSAshish Gupta 	inst->s.ef = 1;
207*52048f8fSAshish Gupta 
208*52048f8fSAshish Gupta 	if (inst->s.op == ZIP_OP_E_DECOMP)
209*52048f8fSAshish Gupta 		inst->s.sf = 1;
210*52048f8fSAshish Gupta 	else
211*52048f8fSAshish Gupta 		inst->s.sf = 0;
212*52048f8fSAshish Gupta 
213*52048f8fSAshish Gupta 	/* Set input checksum */
214*52048f8fSAshish Gupta 	inst->s.adlercrc32 = op->input_chksum;
215*52048f8fSAshish Gupta 
216*52048f8fSAshish Gupta 	/* Prepare gather buffers */
217*52048f8fSAshish Gupta 	zipvf_prepare_in_buf(zstrm, op);
218*52048f8fSAshish Gupta 	zipvf_prepare_out_buf(zstrm, op);
219*52048f8fSAshish Gupta }
220*52048f8fSAshish Gupta 
221*52048f8fSAshish Gupta #ifdef ZIP_DBG
222*52048f8fSAshish Gupta static inline void
223*52048f8fSAshish Gupta zip_dump_instruction(void *inst)
224*52048f8fSAshish Gupta {
225*52048f8fSAshish Gupta 	union zip_inst_s *cmd83 = (union zip_inst_s *)inst;
226*52048f8fSAshish Gupta 	printf("####### START ########\n");
227*52048f8fSAshish Gupta 	printf("doneint:%d totaloutputlength:%d\n", cmd83->s.doneint,
228*52048f8fSAshish Gupta 		cmd83->s.totaloutputlength);
229*52048f8fSAshish Gupta 	printf("exnum:%d iv:%d exbits:%d hmif:%d halg:%d\n", cmd83->s.exn,
230*52048f8fSAshish Gupta 		cmd83->s.iv, cmd83->s.exbits, cmd83->s.hmif, cmd83->s.halg);
231*52048f8fSAshish Gupta 	printf("flush:%d speed:%d cc:%d\n", cmd83->s.sf,
232*52048f8fSAshish Gupta 		cmd83->s.ss, cmd83->s.cc);
233*52048f8fSAshish Gupta 	printf("eof:%d bof:%d op:%d dscatter:%d dgather:%d hgather:%d\n",
234*52048f8fSAshish Gupta 		cmd83->s.ef, cmd83->s.bf, cmd83->s.op, cmd83->s.ds,
235*52048f8fSAshish Gupta 		cmd83->s.dg, cmd83->s.hg);
236*52048f8fSAshish Gupta 	printf("historylength:%d adler32:%d\n", cmd83->s.historylength,
237*52048f8fSAshish Gupta 		cmd83->s.adlercrc32);
238*52048f8fSAshish Gupta 	printf("ctx_ptr.addr:0x%"PRIx64"\n", cmd83->s.ctx_ptr_addr.s.addr);
239*52048f8fSAshish Gupta 	printf("ctx_ptr.len:%d\n", cmd83->s.ctx_ptr_ctl.s.length);
240*52048f8fSAshish Gupta 	printf("history_ptr.addr:0x%"PRIx64"\n", cmd83->s.his_ptr_addr.s.addr);
241*52048f8fSAshish Gupta 	printf("history_ptr.len:%d\n", cmd83->s.his_ptr_ctl.s.length);
242*52048f8fSAshish Gupta 	printf("inp_ptr.addr:0x%"PRIx64"\n", cmd83->s.inp_ptr_addr.s.addr);
243*52048f8fSAshish Gupta 	printf("inp_ptr.len:%d\n", cmd83->s.inp_ptr_ctl.s.length);
244*52048f8fSAshish Gupta 	printf("out_ptr.addr:0x%"PRIx64"\n", cmd83->s.out_ptr_addr.s.addr);
245*52048f8fSAshish Gupta 	printf("out_ptr.len:%d\n", cmd83->s.out_ptr_ctl.s.length);
246*52048f8fSAshish Gupta 	printf("result_ptr.len:%d\n", cmd83->s.res_ptr_ctl.s.length);
247*52048f8fSAshish Gupta 	printf("####### END ########\n");
248*52048f8fSAshish Gupta }
249*52048f8fSAshish Gupta #endif
250*52048f8fSAshish Gupta 
25143e610bbSSunila Sahu int
25243e610bbSSunila Sahu zipvf_create(struct rte_compressdev *compressdev);
25343e610bbSSunila Sahu 
25443e610bbSSunila Sahu int
25543e610bbSSunila Sahu zipvf_destroy(struct rte_compressdev *compressdev);
25643e610bbSSunila Sahu 
257c378f084SAshish Gupta int
258c378f084SAshish Gupta zipvf_q_init(struct zipvf_qp *qp);
259c378f084SAshish Gupta 
260c378f084SAshish Gupta int
261c378f084SAshish Gupta zipvf_q_term(struct zipvf_qp *qp);
262c378f084SAshish Gupta 
263*52048f8fSAshish Gupta void
264b43ebc65SAshish Gupta zipvf_push_command(struct zipvf_qp *qp, union zip_inst_s *zcmd);
265c378f084SAshish Gupta 
266*52048f8fSAshish Gupta int
267*52048f8fSAshish Gupta zip_process_op(struct rte_comp_op *op,
268*52048f8fSAshish Gupta 				struct zipvf_qp *qp,
269*52048f8fSAshish Gupta 				struct zip_stream *zstrm);
270*52048f8fSAshish Gupta 
27143e610bbSSunila Sahu uint64_t
27243e610bbSSunila Sahu zip_reg_read64(uint8_t *hw_addr, uint64_t offset);
27343e610bbSSunila Sahu 
27443e610bbSSunila Sahu void
27543e610bbSSunila Sahu zip_reg_write64(uint8_t *hw_addr, uint64_t offset, uint64_t val);
27643e610bbSSunila Sahu 
27743e610bbSSunila Sahu #endif /* _RTE_ZIP_VF_H_ */
278