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 204d6194dbSFerruh Yigit extern 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 33*a80ea5c0SMahipal Challa #define PCI_DEVICE_ID_OCTEONTX2_ZIPVF 0xA083 3443e610bbSSunila Sahu 357be78d02SJosh Soref /* maximum number of zip vf devices */ 3643e610bbSSunila Sahu #define ZIP_MAX_VFS 8 3743e610bbSSunila Sahu 3843e610bbSSunila Sahu /* max size of one chunk */ 3943e610bbSSunila Sahu #define ZIP_MAX_CHUNK_SIZE 8192 4043e610bbSSunila Sahu 4143e610bbSSunila Sahu /* each instruction is fixed 128 bytes */ 4243e610bbSSunila Sahu #define ZIP_CMD_SIZE 128 4343e610bbSSunila Sahu 4443e610bbSSunila Sahu #define ZIP_CMD_SIZE_WORDS (ZIP_CMD_SIZE >> 3) /* 16 64_bit words */ 4543e610bbSSunila Sahu 4643e610bbSSunila Sahu /* size of next chunk buffer pointer */ 4743e610bbSSunila Sahu #define ZIP_MAX_NCBP_SIZE 8 4843e610bbSSunila Sahu 4943e610bbSSunila Sahu /* size of instruction queue in units of instruction size */ 5043e610bbSSunila Sahu #define ZIP_MAX_NUM_CMDS ((ZIP_MAX_CHUNK_SIZE - ZIP_MAX_NCBP_SIZE) / \ 5143e610bbSSunila Sahu ZIP_CMD_SIZE) /* 63 */ 5243e610bbSSunila Sahu 5343e610bbSSunila Sahu /* size of instruct queue in bytes */ 5443e610bbSSunila Sahu #define ZIP_MAX_CMDQ_SIZE ((ZIP_MAX_NUM_CMDS * ZIP_CMD_SIZE) + \ 5543e610bbSSunila Sahu ZIP_MAX_NCBP_SIZE)/* ~8072ull */ 5643e610bbSSunila Sahu 5743e610bbSSunila Sahu #define ZIP_BUF_SIZE 256 5843e610bbSSunila Sahu 5943e610bbSSunila Sahu #define ZIP_SGPTR_ALIGN 16 6043e610bbSSunila Sahu #define ZIP_CMDQ_ALIGN 128 6143e610bbSSunila Sahu #define MAX_SG_LEN ((ZIP_BUF_SIZE - ZIP_SGPTR_ALIGN) / sizeof(void *)) 6243e610bbSSunila Sahu 6343e610bbSSunila Sahu /**< ZIP PMD specified queue pairs */ 6443e610bbSSunila Sahu #define ZIP_MAX_VF_QUEUE 1 6543e610bbSSunila Sahu 6643e610bbSSunila Sahu #define ZIP_ALIGN_ROUNDUP(x, _align) \ 6743e610bbSSunila Sahu ((_align) * (((x) + (_align) - 1) / (_align))) 6843e610bbSSunila Sahu 6943e610bbSSunila Sahu /**< ZIP PMD device name */ 7043e610bbSSunila Sahu #define COMPRESSDEV_NAME_ZIP_PMD compress_octeonx 7143e610bbSSunila Sahu 7243e610bbSSunila Sahu #define ZIP_PMD_LOG(level, fmt, args...) \ 7343e610bbSSunila Sahu rte_log(RTE_LOG_ ## level, \ 7443e610bbSSunila Sahu octtx_zip_logtype_driver, "%s(): "fmt "\n", \ 7543e610bbSSunila Sahu __func__, ##args) 7643e610bbSSunila Sahu 7743e610bbSSunila Sahu #define ZIP_PMD_INFO(fmt, args...) \ 7843e610bbSSunila Sahu ZIP_PMD_LOG(INFO, fmt, ## args) 7943e610bbSSunila Sahu #define ZIP_PMD_ERR(fmt, args...) \ 8043e610bbSSunila Sahu ZIP_PMD_LOG(ERR, fmt, ## args) 81c378f084SAshish Gupta 82c378f084SAshish Gupta /* resources required to process stream */ 8397573583SFerruh Yigit enum NUM_BUFS_PER_STREAM { 84c378f084SAshish Gupta RES_BUF = 0, 85c378f084SAshish Gupta CMD_BUF, 86c378f084SAshish Gupta HASH_CTX_BUF, 87c378f084SAshish Gupta DECOMP_CTX_BUF, 88c378f084SAshish Gupta IN_DATA_BUF, 89c378f084SAshish Gupta OUT_DATA_BUF, 90c378f084SAshish Gupta HISTORY_DATA_BUF, 91c378f084SAshish Gupta MAX_BUFS_PER_STREAM 9297573583SFerruh Yigit }; 93c378f084SAshish Gupta 94b43ebc65SAshish Gupta struct zip_stream; 95c378f084SAshish Gupta struct zipvf_qp; 96c378f084SAshish Gupta 97b43ebc65SAshish Gupta /* Algorithm handler function prototype */ 98b43ebc65SAshish Gupta typedef int (*comp_func_t)(struct rte_comp_op *op, 99b43ebc65SAshish Gupta struct zipvf_qp *qp, struct zip_stream *zstrm); 100b43ebc65SAshish Gupta 101b43ebc65SAshish Gupta /** 102b43ebc65SAshish Gupta * ZIP private stream structure 103b43ebc65SAshish Gupta */ 104b43ebc65SAshish Gupta struct zip_stream { 105b43ebc65SAshish Gupta union zip_inst_s *inst; 106b43ebc65SAshish Gupta /* zip instruction pointer */ 107b43ebc65SAshish Gupta comp_func_t func; 108b43ebc65SAshish Gupta /* function to process comp operation */ 109b43ebc65SAshish Gupta void *bufs[MAX_BUFS_PER_STREAM]; 11097573583SFerruh Yigit } __rte_cache_aligned; 111b43ebc65SAshish Gupta 112c378f084SAshish Gupta 113c378f084SAshish Gupta /** 114c378f084SAshish Gupta * ZIP instruction Queue 115c378f084SAshish Gupta */ 116c378f084SAshish Gupta struct zipvf_cmdq { 117c378f084SAshish Gupta rte_spinlock_t qlock; 118c378f084SAshish Gupta /* queue lock */ 119c378f084SAshish Gupta uint64_t *sw_head; 120c378f084SAshish Gupta /* pointer to start of 8-byte word length queue-head */ 121c378f084SAshish Gupta uint8_t *va; 122c378f084SAshish Gupta /* pointer to instruction queue virtual address */ 123c378f084SAshish Gupta rte_iova_t iova; 124c378f084SAshish Gupta /* iova addr of cmdq head*/ 125c378f084SAshish Gupta }; 126c378f084SAshish Gupta 127c378f084SAshish Gupta /** 128c378f084SAshish Gupta * ZIP device queue structure 129c378f084SAshish Gupta */ 130c378f084SAshish Gupta struct zipvf_qp { 131c378f084SAshish Gupta struct zipvf_cmdq cmdq; 132c378f084SAshish Gupta /* Hardware instruction queue structure */ 133c378f084SAshish Gupta struct rte_ring *processed_pkts; 134c378f084SAshish Gupta /* Ring for placing processed packets */ 135c378f084SAshish Gupta struct rte_compressdev_stats qp_stats; 136c378f084SAshish Gupta /* Queue pair statistics */ 137c378f084SAshish Gupta uint16_t id; 138c378f084SAshish Gupta /* Queue Pair Identifier */ 139c378f084SAshish Gupta const char *name; 140c378f084SAshish Gupta /* Unique Queue Pair Name */ 141c378f084SAshish Gupta struct zip_vf *vf; 142c378f084SAshish Gupta /* pointer to device, queue belongs to */ 143c378f084SAshish Gupta } __rte_cache_aligned; 14443e610bbSSunila Sahu 14543e610bbSSunila Sahu /** 14643e610bbSSunila Sahu * ZIP VF device structure. 14743e610bbSSunila Sahu */ 14843e610bbSSunila Sahu struct zip_vf { 14943e610bbSSunila Sahu int vfid; 15043e610bbSSunila Sahu /* vf index */ 15143e610bbSSunila Sahu struct rte_pci_device *pdev; 15243e610bbSSunila Sahu /* pci device */ 15343e610bbSSunila Sahu void *vbar0; 15443e610bbSSunila Sahu /* CSR base address for underlying BAR0 VF.*/ 15543e610bbSSunila Sahu uint64_t dom_sdom; 15643e610bbSSunila Sahu /* Storing mbox domain and subdomain id for app rerun*/ 15743e610bbSSunila Sahu uint32_t max_nb_queue_pairs; 15843e610bbSSunila Sahu /* pointer to device qps */ 15943e610bbSSunila Sahu struct rte_mempool *zip_mp; 16043e610bbSSunila Sahu /* pointer to pools */ 16143e610bbSSunila Sahu } __rte_cache_aligned; 16243e610bbSSunila Sahu 16352048f8fSAshish Gupta 16452048f8fSAshish Gupta static inline void 16552048f8fSAshish Gupta zipvf_prepare_in_buf(struct zip_stream *zstrm, struct rte_comp_op *op) 16652048f8fSAshish Gupta { 16752048f8fSAshish Gupta uint32_t offset, inlen; 16852048f8fSAshish Gupta struct rte_mbuf *m_src; 16952048f8fSAshish Gupta union zip_inst_s *inst = zstrm->inst; 17052048f8fSAshish Gupta 17152048f8fSAshish Gupta inlen = op->src.length; 17252048f8fSAshish Gupta offset = op->src.offset; 17352048f8fSAshish Gupta m_src = op->m_src; 17452048f8fSAshish Gupta 17552048f8fSAshish Gupta /* Prepare direct input data pointer */ 17652048f8fSAshish Gupta inst->s.dg = 0; 17752048f8fSAshish Gupta inst->s.inp_ptr_addr.s.addr = 17852048f8fSAshish Gupta rte_pktmbuf_iova_offset(m_src, offset); 17952048f8fSAshish Gupta inst->s.inp_ptr_ctl.s.length = inlen; 18052048f8fSAshish Gupta } 18152048f8fSAshish Gupta 18252048f8fSAshish Gupta static inline void 18352048f8fSAshish Gupta zipvf_prepare_out_buf(struct zip_stream *zstrm, struct rte_comp_op *op) 18452048f8fSAshish Gupta { 18552048f8fSAshish Gupta uint32_t offset; 18652048f8fSAshish Gupta struct rte_mbuf *m_dst; 18752048f8fSAshish Gupta union zip_inst_s *inst = zstrm->inst; 18852048f8fSAshish Gupta 18952048f8fSAshish Gupta offset = op->dst.offset; 19052048f8fSAshish Gupta m_dst = op->m_dst; 19152048f8fSAshish Gupta 19252048f8fSAshish Gupta /* Prepare direct input data pointer */ 19352048f8fSAshish Gupta inst->s.ds = 0; 19452048f8fSAshish Gupta inst->s.out_ptr_addr.s.addr = 19552048f8fSAshish Gupta rte_pktmbuf_iova_offset(m_dst, offset); 19652048f8fSAshish Gupta inst->s.totaloutputlength = rte_pktmbuf_pkt_len(m_dst) - 19752048f8fSAshish Gupta op->dst.offset; 19852048f8fSAshish Gupta inst->s.out_ptr_ctl.s.length = inst->s.totaloutputlength; 19952048f8fSAshish Gupta } 20052048f8fSAshish Gupta 20152048f8fSAshish Gupta static inline void 20252048f8fSAshish Gupta zipvf_prepare_cmd_stateless(struct rte_comp_op *op, struct zip_stream *zstrm) 20352048f8fSAshish Gupta { 20452048f8fSAshish Gupta union zip_inst_s *inst = zstrm->inst; 20552048f8fSAshish Gupta 20652048f8fSAshish Gupta /* set flush flag to always 1*/ 20752048f8fSAshish Gupta inst->s.ef = 1; 20852048f8fSAshish Gupta 20952048f8fSAshish Gupta if (inst->s.op == ZIP_OP_E_DECOMP) 21052048f8fSAshish Gupta inst->s.sf = 1; 21152048f8fSAshish Gupta else 21252048f8fSAshish Gupta inst->s.sf = 0; 21352048f8fSAshish Gupta 21452048f8fSAshish Gupta /* Set input checksum */ 21552048f8fSAshish Gupta inst->s.adlercrc32 = op->input_chksum; 21652048f8fSAshish Gupta 21752048f8fSAshish Gupta /* Prepare gather buffers */ 21852048f8fSAshish Gupta zipvf_prepare_in_buf(zstrm, op); 21952048f8fSAshish Gupta zipvf_prepare_out_buf(zstrm, op); 22052048f8fSAshish Gupta } 22152048f8fSAshish Gupta 22252048f8fSAshish Gupta #ifdef ZIP_DBG 22352048f8fSAshish Gupta static inline void 22452048f8fSAshish Gupta zip_dump_instruction(void *inst) 22552048f8fSAshish Gupta { 22652048f8fSAshish Gupta union zip_inst_s *cmd83 = (union zip_inst_s *)inst; 22752048f8fSAshish Gupta printf("####### START ########\n"); 22852048f8fSAshish Gupta printf("doneint:%d totaloutputlength:%d\n", cmd83->s.doneint, 22952048f8fSAshish Gupta cmd83->s.totaloutputlength); 23052048f8fSAshish Gupta printf("exnum:%d iv:%d exbits:%d hmif:%d halg:%d\n", cmd83->s.exn, 23152048f8fSAshish Gupta cmd83->s.iv, cmd83->s.exbits, cmd83->s.hmif, cmd83->s.halg); 23252048f8fSAshish Gupta printf("flush:%d speed:%d cc:%d\n", cmd83->s.sf, 23352048f8fSAshish Gupta cmd83->s.ss, cmd83->s.cc); 23452048f8fSAshish Gupta printf("eof:%d bof:%d op:%d dscatter:%d dgather:%d hgather:%d\n", 23552048f8fSAshish Gupta cmd83->s.ef, cmd83->s.bf, cmd83->s.op, cmd83->s.ds, 23652048f8fSAshish Gupta cmd83->s.dg, cmd83->s.hg); 23752048f8fSAshish Gupta printf("historylength:%d adler32:%d\n", cmd83->s.historylength, 23852048f8fSAshish Gupta cmd83->s.adlercrc32); 23952048f8fSAshish Gupta printf("ctx_ptr.addr:0x%"PRIx64"\n", cmd83->s.ctx_ptr_addr.s.addr); 24052048f8fSAshish Gupta printf("ctx_ptr.len:%d\n", cmd83->s.ctx_ptr_ctl.s.length); 24152048f8fSAshish Gupta printf("history_ptr.addr:0x%"PRIx64"\n", cmd83->s.his_ptr_addr.s.addr); 24252048f8fSAshish Gupta printf("history_ptr.len:%d\n", cmd83->s.his_ptr_ctl.s.length); 24352048f8fSAshish Gupta printf("inp_ptr.addr:0x%"PRIx64"\n", cmd83->s.inp_ptr_addr.s.addr); 24452048f8fSAshish Gupta printf("inp_ptr.len:%d\n", cmd83->s.inp_ptr_ctl.s.length); 24552048f8fSAshish Gupta printf("out_ptr.addr:0x%"PRIx64"\n", cmd83->s.out_ptr_addr.s.addr); 24652048f8fSAshish Gupta printf("out_ptr.len:%d\n", cmd83->s.out_ptr_ctl.s.length); 24752048f8fSAshish Gupta printf("result_ptr.len:%d\n", cmd83->s.res_ptr_ctl.s.length); 24852048f8fSAshish Gupta printf("####### END ########\n"); 24952048f8fSAshish Gupta } 25052048f8fSAshish Gupta #endif 25152048f8fSAshish Gupta 25243e610bbSSunila Sahu int 25343e610bbSSunila Sahu zipvf_create(struct rte_compressdev *compressdev); 25443e610bbSSunila Sahu 25543e610bbSSunila Sahu int 25643e610bbSSunila Sahu zipvf_destroy(struct rte_compressdev *compressdev); 25743e610bbSSunila Sahu 258c378f084SAshish Gupta int 259c378f084SAshish Gupta zipvf_q_init(struct zipvf_qp *qp); 260c378f084SAshish Gupta 261c378f084SAshish Gupta int 262c378f084SAshish Gupta zipvf_q_term(struct zipvf_qp *qp); 263c378f084SAshish Gupta 26452048f8fSAshish Gupta void 265b43ebc65SAshish Gupta zipvf_push_command(struct zipvf_qp *qp, union zip_inst_s *zcmd); 266c378f084SAshish Gupta 26752048f8fSAshish Gupta int 26852048f8fSAshish Gupta zip_process_op(struct rte_comp_op *op, 26952048f8fSAshish Gupta struct zipvf_qp *qp, 27052048f8fSAshish Gupta struct zip_stream *zstrm); 27152048f8fSAshish Gupta 27243e610bbSSunila Sahu uint64_t 27343e610bbSSunila Sahu zip_reg_read64(uint8_t *hw_addr, uint64_t offset); 27443e610bbSSunila Sahu 27543e610bbSSunila Sahu void 27643e610bbSSunila Sahu zip_reg_write64(uint8_t *hw_addr, uint64_t offset, uint64_t val); 27743e610bbSSunila Sahu 27843e610bbSSunila Sahu #endif /* _RTE_ZIP_VF_H_ */ 279