Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(c) 2018 Cavium, Inc 3 : : */ 4 : : 5 : : #include "otx_zip.h" 6 : : 7 : : uint64_t 8 : 0 : zip_reg_read64(uint8_t *hw_addr, uint64_t offset) 9 : : { 10 : : uint8_t *base = hw_addr; 11 : 0 : return *(volatile uint64_t *)(base + offset); 12 : : } 13 : : 14 : : void 15 : 0 : zip_reg_write64(uint8_t *hw_addr, uint64_t offset, uint64_t val) 16 : : { 17 : : uint8_t *base = hw_addr; 18 : 0 : *(uint64_t *)(base + offset) = val; 19 : 0 : } 20 : : 21 : : static void 22 : : zip_q_enable(struct zipvf_qp *qp) 23 : : { 24 : : zip_vqx_ena_t que_ena; 25 : : 26 : : /*ZIP VFx command queue init*/ 27 : : que_ena.u = 0ull; 28 : : que_ena.s.ena = 1; 29 : : 30 : 0 : zip_reg_write64(qp->vf->vbar0, ZIP_VQ_ENA, que_ena.u); 31 : : rte_wmb(); 32 : : } 33 : : 34 : : /* initialize given qp on zip device */ 35 : : int 36 : 0 : zipvf_q_init(struct zipvf_qp *qp) 37 : : { 38 : : zip_vqx_sbuf_addr_t que_sbuf_addr; 39 : : 40 : : uint64_t size; 41 : : void *cmdq_addr; 42 : : uint64_t iova; 43 : : struct zipvf_cmdq *cmdq = &qp->cmdq; 44 : 0 : struct zip_vf *vf = qp->vf; 45 : : 46 : : /* allocate and setup instruction queue */ 47 : : size = ZIP_MAX_CMDQ_SIZE; 48 : : size = ZIP_ALIGN_ROUNDUP(size, ZIP_CMDQ_ALIGN); 49 : : 50 : 0 : cmdq_addr = rte_zmalloc(qp->name, size, ZIP_CMDQ_ALIGN); 51 [ # # ]: 0 : if (cmdq_addr == NULL) 52 : : return -1; 53 : : 54 : 0 : cmdq->sw_head = (uint64_t *)cmdq_addr; 55 : 0 : cmdq->va = (uint8_t *)cmdq_addr; 56 : 0 : iova = rte_mem_virt2iova(cmdq_addr); 57 : : 58 : 0 : cmdq->iova = iova; 59 : : 60 : 0 : que_sbuf_addr.u = 0ull; 61 [ # # ]: 0 : if (vf->pdev->id.device_id == PCI_DEVICE_ID_OCTEONTX2_ZIPVF) 62 : 0 : que_sbuf_addr.s9x.ptr = (cmdq->iova >> 7); 63 : : else 64 : 0 : que_sbuf_addr.s.ptr = (cmdq->iova >> 7); 65 : : 66 : 0 : zip_reg_write64(vf->vbar0, ZIP_VQ_SBUF_ADDR, que_sbuf_addr.u); 67 : : 68 : : zip_q_enable(qp); 69 : : 70 : 0 : memset(cmdq->va, 0, ZIP_MAX_CMDQ_SIZE); 71 : : rte_spinlock_init(&cmdq->qlock); 72 : : 73 : 0 : return 0; 74 : : } 75 : : 76 : : int 77 : 0 : zipvf_q_term(struct zipvf_qp *qp) 78 : : { 79 : : struct zipvf_cmdq *cmdq = &qp->cmdq; 80 : : zip_vqx_ena_t que_ena; 81 : 0 : struct zip_vf *vf = qp->vf; 82 : : 83 [ # # ]: 0 : if (cmdq->va != NULL) { 84 : 0 : rte_free(cmdq->va); 85 : : } 86 : : 87 : : /*Disabling the ZIP queue*/ 88 : : que_ena.u = 0ull; 89 : 0 : zip_reg_write64(vf->vbar0, ZIP_VQ_ENA, que_ena.u); 90 : : 91 : 0 : return 0; 92 : : } 93 : : 94 : : void 95 : 0 : zipvf_push_command(struct zipvf_qp *qp, union zip_inst_s *cmd) 96 : : { 97 : : zip_quex_doorbell_t dbell; 98 : : union zip_nptr_s ncp; 99 : : uint64_t *ncb_ptr; 100 : : struct zipvf_cmdq *cmdq = &qp->cmdq; 101 : 0 : void *reg_base = qp->vf->vbar0; 102 : : 103 : : /*Held queue lock*/ 104 : 0 : rte_spinlock_lock(&(cmdq->qlock)); 105 : : 106 : : /* Check space availability in zip cmd queue */ 107 [ # # ]: 0 : if ((((cmdq->sw_head - (uint64_t *)cmdq->va) * sizeof(uint64_t *)) + 108 : : ZIP_CMD_SIZE) == (ZIP_MAX_CMDQ_SIZE - ZIP_MAX_NCBP_SIZE)) { 109 : : /*Last buffer of the command queue*/ 110 : : memcpy((uint8_t *)cmdq->sw_head, 111 : : (uint8_t *)cmd, 112 : : sizeof(union zip_inst_s)); 113 : : /* move pointer to next loc in unit of 64-bit word */ 114 : 0 : cmdq->sw_head += ZIP_CMD_SIZE_WORDS; 115 : : 116 : : /* now, point the "Next-Chunk Buffer Ptr" to sw_head */ 117 : : ncb_ptr = cmdq->sw_head; 118 : : /* Pointing head again to cmdqueue base*/ 119 : 0 : cmdq->sw_head = (uint64_t *)cmdq->va; 120 : : 121 : : ncp.u = 0ull; 122 : 0 : ncp.s.addr = cmdq->iova; 123 : 0 : *ncb_ptr = ncp.u; 124 : : } else { 125 : : /*Enough buffers available in the command queue*/ 126 : : memcpy((uint8_t *)cmdq->sw_head, 127 : : (uint8_t *)cmd, 128 : : sizeof(union zip_inst_s)); 129 : 0 : cmdq->sw_head += ZIP_CMD_SIZE_WORDS; 130 : : } 131 : : 132 : : rte_wmb(); 133 : : 134 : : /* Ringing ZIP VF doorbell */ 135 : : dbell.u = 0ull; 136 : : dbell.s.dbell_cnt = 1; 137 : 0 : zip_reg_write64(reg_base, ZIP_VQ_DOORBELL, dbell.u); 138 : : 139 : : rte_spinlock_unlock(&(cmdq->qlock)); 140 : 0 : } 141 : : 142 : : int 143 : 0 : zipvf_create(struct rte_compressdev *compressdev) 144 : : { 145 : 0 : struct rte_pci_device *pdev = RTE_DEV_TO_PCI(compressdev->device); 146 : : struct zip_vf *zipvf = NULL; 147 : 0 : char *dev_name = compressdev->data->name; 148 : : void *vbar0; 149 : : uint64_t reg; 150 : : 151 [ # # ]: 0 : if (pdev->mem_resource[0].phys_addr == 0ULL) 152 : : return -EIO; 153 : : 154 : 0 : vbar0 = pdev->mem_resource[0].addr; 155 [ # # ]: 0 : if (!vbar0) { 156 : 0 : ZIP_PMD_ERR("Failed to map BAR0 of %s", dev_name); 157 : 0 : return -ENODEV; 158 : : } 159 : : 160 : 0 : zipvf = (struct zip_vf *)(compressdev->data->dev_private); 161 : : 162 [ # # ]: 0 : if (!zipvf) 163 : : return -ENOMEM; 164 : : 165 : 0 : zipvf->vbar0 = vbar0; 166 : 0 : reg = zip_reg_read64(zipvf->vbar0, ZIP_VF_PF_MBOXX(0)); 167 : : /* Storing domain in local to ZIP VF */ 168 : 0 : zipvf->dom_sdom = reg; 169 : 0 : zipvf->pdev = pdev; 170 : 0 : zipvf->max_nb_queue_pairs = ZIP_MAX_VF_QUEUE; 171 : 0 : return 0; 172 : : } 173 : : 174 : : int 175 : 0 : zipvf_destroy(struct rte_compressdev *compressdev) 176 : : { 177 : 0 : struct zip_vf *vf = (struct zip_vf *)(compressdev->data->dev_private); 178 : : 179 : : /* Rewriting the domain_id in ZIP_VF_MBOX for app rerun */ 180 : 0 : zip_reg_write64(vf->vbar0, ZIP_VF_PF_MBOXX(0), vf->dom_sdom); 181 : : 182 : 0 : return 0; 183 : : }