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