1d826133aSSathesh Edara /* SPDX-License-Identifier: BSD-3-Clause 2d826133aSSathesh Edara * Copyright(C) 2022 Marvell. 3d826133aSSathesh Edara */ 4d826133aSSathesh Edara 5d360d7bfSSathesh Edara #include <inttypes.h> 69b9c09a7SDavid Marchand #include <errno.h> 79b9c09a7SDavid Marchand 8d826133aSSathesh Edara #include <rte_common.h> 9d826133aSSathesh Edara #include <rte_cycles.h> 10d360d7bfSSathesh Edara #include <rte_memzone.h> 11c836a7baSSathesh Edara #include "otx_ep_common.h" 12d826133aSSathesh Edara #include "cnxk_ep_vf.h" 13d826133aSSathesh Edara 14d826133aSSathesh Edara static void 15d826133aSSathesh Edara cnxk_ep_vf_setup_global_iq_reg(struct otx_ep_device *otx_ep, int q_no) 16d826133aSSathesh Edara { 17d826133aSSathesh Edara volatile uint64_t reg_val = 0ull; 18d826133aSSathesh Edara 19d826133aSSathesh Edara /* Select ES, RO, NS, RDSIZE,DPTR Format#0 for IQs 20d826133aSSathesh Edara * IS_64B is by default enabled. 21d826133aSSathesh Edara */ 22d826133aSSathesh Edara reg_val = oct_ep_read64(otx_ep->hw_addr + CNXK_EP_R_IN_CONTROL(q_no)); 23d826133aSSathesh Edara 24d826133aSSathesh Edara reg_val |= CNXK_EP_R_IN_CTL_RDSIZE; 25d826133aSSathesh Edara reg_val |= CNXK_EP_R_IN_CTL_IS_64B; 26d826133aSSathesh Edara reg_val |= CNXK_EP_R_IN_CTL_ESR; 27d826133aSSathesh Edara 28d826133aSSathesh Edara oct_ep_write64(reg_val, otx_ep->hw_addr + CNXK_EP_R_IN_CONTROL(q_no)); 29d826133aSSathesh Edara } 30d826133aSSathesh Edara 31d826133aSSathesh Edara static void 32d826133aSSathesh Edara cnxk_ep_vf_setup_global_oq_reg(struct otx_ep_device *otx_ep, int q_no) 33d826133aSSathesh Edara { 34d826133aSSathesh Edara volatile uint64_t reg_val = 0ull; 35d826133aSSathesh Edara 36d826133aSSathesh Edara reg_val = oct_ep_read64(otx_ep->hw_addr + CNXK_EP_R_OUT_CONTROL(q_no)); 37d826133aSSathesh Edara 38d826133aSSathesh Edara reg_val &= ~(CNXK_EP_R_OUT_CTL_IMODE); 39d826133aSSathesh Edara reg_val &= ~(CNXK_EP_R_OUT_CTL_ROR_P); 40d826133aSSathesh Edara reg_val &= ~(CNXK_EP_R_OUT_CTL_NSR_P); 41d826133aSSathesh Edara reg_val &= ~(CNXK_EP_R_OUT_CTL_ROR_I); 42d826133aSSathesh Edara reg_val &= ~(CNXK_EP_R_OUT_CTL_NSR_I); 43d826133aSSathesh Edara reg_val &= ~(CNXK_EP_R_OUT_CTL_ROR_D); 44d826133aSSathesh Edara reg_val &= ~(CNXK_EP_R_OUT_CTL_NSR_D); 45d826133aSSathesh Edara reg_val &= ~(CNXK_EP_R_OUT_CTL_ES_I | CNXK_EP_R_OUT_CTL_ES_D); 46d826133aSSathesh Edara 47d826133aSSathesh Edara /* INFO/DATA ptr swap is required */ 48d826133aSSathesh Edara reg_val |= (CNXK_EP_R_OUT_CTL_ES_P); 49d826133aSSathesh Edara oct_ep_write64(reg_val, otx_ep->hw_addr + CNXK_EP_R_OUT_CONTROL(q_no)); 50d826133aSSathesh Edara } 51d826133aSSathesh Edara 52dfa2f825SSathesh Edara static int 53d826133aSSathesh Edara cnxk_ep_vf_setup_global_input_regs(struct otx_ep_device *otx_ep) 54d826133aSSathesh Edara { 55d826133aSSathesh Edara uint64_t q_no = 0ull; 56d826133aSSathesh Edara 57d826133aSSathesh Edara for (q_no = 0; q_no < (otx_ep->sriov_info.rings_per_vf); q_no++) 58d826133aSSathesh Edara cnxk_ep_vf_setup_global_iq_reg(otx_ep, q_no); 59dfa2f825SSathesh Edara return 0; 60d826133aSSathesh Edara } 61d826133aSSathesh Edara 62dfa2f825SSathesh Edara static int 63d826133aSSathesh Edara cnxk_ep_vf_setup_global_output_regs(struct otx_ep_device *otx_ep) 64d826133aSSathesh Edara { 65d826133aSSathesh Edara uint32_t q_no; 66d826133aSSathesh Edara 67d826133aSSathesh Edara for (q_no = 0; q_no < (otx_ep->sriov_info.rings_per_vf); q_no++) 68d826133aSSathesh Edara cnxk_ep_vf_setup_global_oq_reg(otx_ep, q_no); 69dfa2f825SSathesh Edara return 0; 70d826133aSSathesh Edara } 71d826133aSSathesh Edara 72dfa2f825SSathesh Edara static int 73d826133aSSathesh Edara cnxk_ep_vf_setup_device_regs(struct otx_ep_device *otx_ep) 74d826133aSSathesh Edara { 75dfa2f825SSathesh Edara int ret; 76dfa2f825SSathesh Edara 77dfa2f825SSathesh Edara ret = cnxk_ep_vf_setup_global_input_regs(otx_ep); 78dfa2f825SSathesh Edara if (ret) 79dfa2f825SSathesh Edara return ret; 80dfa2f825SSathesh Edara ret = cnxk_ep_vf_setup_global_output_regs(otx_ep); 81dfa2f825SSathesh Edara return ret; 82d826133aSSathesh Edara } 83d826133aSSathesh Edara 84dfa2f825SSathesh Edara static int 85d826133aSSathesh Edara cnxk_ep_vf_setup_iq_regs(struct otx_ep_device *otx_ep, uint32_t iq_no) 86d826133aSSathesh Edara { 87d826133aSSathesh Edara struct otx_ep_instr_queue *iq = otx_ep->instr_queue[iq_no]; 88dfa2f825SSathesh Edara int loop = OTX_EP_BUSY_LOOP_COUNT; 89d826133aSSathesh Edara volatile uint64_t reg_val = 0ull; 90d360d7bfSSathesh Edara uint64_t ism_addr; 91d826133aSSathesh Edara 92d826133aSSathesh Edara reg_val = oct_ep_read64(otx_ep->hw_addr + CNXK_EP_R_IN_CONTROL(iq_no)); 93d826133aSSathesh Edara 94d826133aSSathesh Edara /* Wait till IDLE to set to 1, not supposed to configure BADDR 95d826133aSSathesh Edara * as long as IDLE is 0 96d826133aSSathesh Edara */ 97d826133aSSathesh Edara if (!(reg_val & CNXK_EP_R_IN_CTL_IDLE)) { 98d826133aSSathesh Edara do { 99d826133aSSathesh Edara reg_val = oct_ep_read64(otx_ep->hw_addr + CNXK_EP_R_IN_CONTROL(iq_no)); 100d826133aSSathesh Edara rte_delay_ms(1); 101d826133aSSathesh Edara } while ((!(reg_val & CNXK_EP_R_IN_CTL_IDLE)) && loop--); 102d826133aSSathesh Edara } 103d826133aSSathesh Edara 104dfa2f825SSathesh Edara if (loop < 0) { 105f665790aSDavid Marchand otx_ep_err("IDLE bit is not set"); 106dfa2f825SSathesh Edara return -EIO; 107d826133aSSathesh Edara } 108d826133aSSathesh Edara 109e9405625SShijith Thotton /* Configure input queue instruction size. */ 110e9405625SShijith Thotton if (otx_ep->conf->iq.instr_type == OTX_EP_32BYTE_INSTR) 111e9405625SShijith Thotton reg_val &= ~(CNXK_EP_R_IN_CTL_IS_64B); 112e9405625SShijith Thotton else 113e9405625SShijith Thotton reg_val |= CNXK_EP_R_IN_CTL_IS_64B; 114e9405625SShijith Thotton oct_ep_write64(reg_val, otx_ep->hw_addr + CNXK_EP_R_IN_CONTROL(iq_no)); 115e9405625SShijith Thotton iq->desc_size = otx_ep->conf->iq.instr_type; 116e9405625SShijith Thotton 117d826133aSSathesh Edara /* Write the start of the input queue's ring and its size */ 118d826133aSSathesh Edara oct_ep_write64(iq->base_addr_dma, otx_ep->hw_addr + CNXK_EP_R_IN_INSTR_BADDR(iq_no)); 119d826133aSSathesh Edara oct_ep_write64(iq->nb_desc, otx_ep->hw_addr + CNXK_EP_R_IN_INSTR_RSIZE(iq_no)); 120d826133aSSathesh Edara 121d826133aSSathesh Edara /* Remember the doorbell & instruction count register addr 122d826133aSSathesh Edara * for this queue 123d826133aSSathesh Edara */ 124d826133aSSathesh Edara iq->doorbell_reg = (uint8_t *)otx_ep->hw_addr + CNXK_EP_R_IN_INSTR_DBELL(iq_no); 125d826133aSSathesh Edara iq->inst_cnt_reg = (uint8_t *)otx_ep->hw_addr + CNXK_EP_R_IN_CNTS(iq_no); 126d826133aSSathesh Edara 127d826133aSSathesh Edara otx_ep_dbg("InstQ[%d]:dbell reg @ 0x%p instcnt_reg @ 0x%p", 128d826133aSSathesh Edara iq_no, iq->doorbell_reg, iq->inst_cnt_reg); 129d826133aSSathesh Edara loop = OTX_EP_BUSY_LOOP_COUNT; 130d826133aSSathesh Edara do { 131d826133aSSathesh Edara reg_val = rte_read32(iq->inst_cnt_reg); 132d826133aSSathesh Edara rte_write32(reg_val, iq->inst_cnt_reg); 133d826133aSSathesh Edara rte_delay_ms(1); 134d826133aSSathesh Edara } while (reg_val != 0 && loop--); 135d826133aSSathesh Edara 136dfa2f825SSathesh Edara if (loop < 0) { 137f665790aSDavid Marchand otx_ep_err("INST CNT REGISTER is not zero"); 138dfa2f825SSathesh Edara return -EIO; 139d826133aSSathesh Edara } 140d826133aSSathesh Edara 141d826133aSSathesh Edara /* IN INTR_THRESHOLD is set to max(FFFFFFFF) which disable the IN INTR 142d826133aSSathesh Edara * to raise 143d826133aSSathesh Edara */ 144d826133aSSathesh Edara oct_ep_write64(OTX_EP_CLEAR_SDP_IN_INT_LVLS, 145d826133aSSathesh Edara otx_ep->hw_addr + CNXK_EP_R_IN_INT_LEVELS(iq_no)); 146d360d7bfSSathesh Edara /* Set up IQ ISM registers and structures */ 147d360d7bfSSathesh Edara ism_addr = (otx_ep->ism_buffer_mz->iova | CNXK_EP_ISM_EN 148d360d7bfSSathesh Edara | CNXK_EP_ISM_MSIX_DIS) 149d360d7bfSSathesh Edara + CNXK_EP_IQ_ISM_OFFSET(iq_no); 150d360d7bfSSathesh Edara rte_write64(ism_addr, (uint8_t *)otx_ep->hw_addr + 151d360d7bfSSathesh Edara CNXK_EP_R_IN_CNTS_ISM(iq_no)); 152d360d7bfSSathesh Edara iq->inst_cnt_ism = 153e12a0166STyler Retzlaff (uint32_t __rte_atomic *)((uint8_t *)otx_ep->ism_buffer_mz->addr 154d360d7bfSSathesh Edara + CNXK_EP_IQ_ISM_OFFSET(iq_no)); 155d360d7bfSSathesh Edara otx_ep_err("SDP_R[%d] INST Q ISM virt: %p, dma: 0x%" PRIX64, iq_no, 156e12a0166STyler Retzlaff (void *)(uintptr_t)iq->inst_cnt_ism, ism_addr); 157d360d7bfSSathesh Edara *iq->inst_cnt_ism = 0; 158831cf744SVamsi Attunuru iq->inst_cnt_prev = 0; 15935dee56cSVamsi Attunuru iq->partial_ih = ((uint64_t)otx_ep->pkind) << 36; 16035dee56cSVamsi Attunuru 161dfa2f825SSathesh Edara return 0; 162d826133aSSathesh Edara } 163d826133aSSathesh Edara 164dfa2f825SSathesh Edara static int 165d826133aSSathesh Edara cnxk_ep_vf_setup_oq_regs(struct otx_ep_device *otx_ep, uint32_t oq_no) 166d826133aSSathesh Edara { 167d826133aSSathesh Edara volatile uint64_t reg_val = 0ull; 168d826133aSSathesh Edara uint64_t oq_ctl = 0ull; 169dfa2f825SSathesh Edara int loop = OTX_EP_BUSY_LOOP_COUNT; 170d826133aSSathesh Edara struct otx_ep_droq *droq = otx_ep->droq[oq_no]; 171d360d7bfSSathesh Edara uint64_t ism_addr; 172d826133aSSathesh Edara 173d826133aSSathesh Edara /* Wait on IDLE to set to 1, supposed to configure BADDR 174d826133aSSathesh Edara * as long as IDLE is 0 175d826133aSSathesh Edara */ 176d826133aSSathesh Edara reg_val = oct_ep_read64(otx_ep->hw_addr + CNXK_EP_R_OUT_CONTROL(oq_no)); 177d826133aSSathesh Edara 178d826133aSSathesh Edara while ((!(reg_val & CNXK_EP_R_OUT_CTL_IDLE)) && loop--) { 179d826133aSSathesh Edara reg_val = oct_ep_read64(otx_ep->hw_addr + CNXK_EP_R_OUT_CONTROL(oq_no)); 180d826133aSSathesh Edara rte_delay_ms(1); 181d826133aSSathesh Edara } 182d826133aSSathesh Edara 183dfa2f825SSathesh Edara if (loop < 0) { 184f665790aSDavid Marchand otx_ep_err("OUT CNT REGISTER value is zero"); 185dfa2f825SSathesh Edara return -EIO; 186d826133aSSathesh Edara } 187d826133aSSathesh Edara 188d826133aSSathesh Edara oct_ep_write64(droq->desc_ring_dma, otx_ep->hw_addr + CNXK_EP_R_OUT_SLIST_BADDR(oq_no)); 189d826133aSSathesh Edara oct_ep_write64(droq->nb_desc, otx_ep->hw_addr + CNXK_EP_R_OUT_SLIST_RSIZE(oq_no)); 190d826133aSSathesh Edara 191d826133aSSathesh Edara oq_ctl = oct_ep_read64(otx_ep->hw_addr + CNXK_EP_R_OUT_CONTROL(oq_no)); 192d826133aSSathesh Edara 193d826133aSSathesh Edara /* Clear the ISIZE and BSIZE (22-0) */ 194d826133aSSathesh Edara oq_ctl &= ~(OTX_EP_CLEAR_ISIZE_BSIZE); 195d826133aSSathesh Edara 196d826133aSSathesh Edara /* Populate the BSIZE (15-0) */ 197d826133aSSathesh Edara oq_ctl |= (droq->buffer_size & OTX_EP_DROQ_BUFSZ_MASK); 198d826133aSSathesh Edara 199d826133aSSathesh Edara oct_ep_write64(oq_ctl, otx_ep->hw_addr + CNXK_EP_R_OUT_CONTROL(oq_no)); 200d826133aSSathesh Edara 201d826133aSSathesh Edara /* Mapped address of the pkt_sent and pkts_credit regs */ 202d826133aSSathesh Edara droq->pkts_sent_reg = (uint8_t *)otx_ep->hw_addr + CNXK_EP_R_OUT_CNTS(oq_no); 203d826133aSSathesh Edara droq->pkts_credit_reg = (uint8_t *)otx_ep->hw_addr + CNXK_EP_R_OUT_SLIST_DBELL(oq_no); 204d826133aSSathesh Edara 205d826133aSSathesh Edara rte_write64(OTX_EP_CLEAR_OUT_INT_LVLS, otx_ep->hw_addr + CNXK_EP_R_OUT_INT_LEVELS(oq_no)); 206d826133aSSathesh Edara 207d826133aSSathesh Edara /* Clear PKT_CNT register */ 208d826133aSSathesh Edara rte_write64(OTX_EP_CLEAR_SDP_OUT_PKT_CNT, (uint8_t *)otx_ep->hw_addr + 209d826133aSSathesh Edara CNXK_EP_R_OUT_PKT_CNT(oq_no)); 210d826133aSSathesh Edara 211d826133aSSathesh Edara /* Clear the OQ doorbell */ 212d826133aSSathesh Edara rte_write32(OTX_EP_CLEAR_SLIST_DBELL, droq->pkts_credit_reg); 213d826133aSSathesh Edara loop = OTX_EP_BUSY_LOOP_COUNT; 214d826133aSSathesh Edara while ((rte_read32(droq->pkts_credit_reg) != 0ull) && loop--) { 215d826133aSSathesh Edara rte_write32(OTX_EP_CLEAR_SLIST_DBELL, droq->pkts_credit_reg); 216d826133aSSathesh Edara rte_delay_ms(1); 217d826133aSSathesh Edara } 218d826133aSSathesh Edara 219dfa2f825SSathesh Edara if (loop < 0) { 220f665790aSDavid Marchand otx_ep_err("Packets credit register value is not cleared"); 221dfa2f825SSathesh Edara return -EIO; 222d826133aSSathesh Edara } 223d826133aSSathesh Edara 224d826133aSSathesh Edara otx_ep_dbg("SDP_R[%d]_credit:%x", oq_no, rte_read32(droq->pkts_credit_reg)); 225d826133aSSathesh Edara 226d826133aSSathesh Edara /* Clear the OQ_OUT_CNTS doorbell */ 227d826133aSSathesh Edara reg_val = rte_read32(droq->pkts_sent_reg); 228d826133aSSathesh Edara rte_write32((uint32_t)reg_val, droq->pkts_sent_reg); 229d826133aSSathesh Edara 230d826133aSSathesh Edara otx_ep_dbg("SDP_R[%d]_sent: %x", oq_no, rte_read32(droq->pkts_sent_reg)); 231d360d7bfSSathesh Edara /* Set up ISM registers and structures */ 232d360d7bfSSathesh Edara ism_addr = (otx_ep->ism_buffer_mz->iova | CNXK_EP_ISM_EN 233d360d7bfSSathesh Edara | CNXK_EP_ISM_MSIX_DIS) 234d360d7bfSSathesh Edara + CNXK_EP_OQ_ISM_OFFSET(oq_no); 235d360d7bfSSathesh Edara rte_write64(ism_addr, (uint8_t *)otx_ep->hw_addr + 236d360d7bfSSathesh Edara CNXK_EP_R_OUT_CNTS_ISM(oq_no)); 237d360d7bfSSathesh Edara droq->pkts_sent_ism = 238e12a0166STyler Retzlaff (uint32_t __rte_atomic *)((uint8_t *)otx_ep->ism_buffer_mz->addr 239d360d7bfSSathesh Edara + CNXK_EP_OQ_ISM_OFFSET(oq_no)); 240d360d7bfSSathesh Edara otx_ep_err("SDP_R[%d] OQ ISM virt: %p dma: 0x%" PRIX64, 241e12a0166STyler Retzlaff oq_no, (void *)(uintptr_t)droq->pkts_sent_ism, ism_addr); 242d360d7bfSSathesh Edara *droq->pkts_sent_ism = 0; 243831cf744SVamsi Attunuru droq->pkts_sent_prev = 0; 244d826133aSSathesh Edara 245d360d7bfSSathesh Edara loop = OTX_EP_BUSY_LOOP_COUNT; 246d360d7bfSSathesh Edara while (((rte_read32(droq->pkts_sent_reg)) != 0ull) && loop--) { 247d826133aSSathesh Edara reg_val = rte_read32(droq->pkts_sent_reg); 248d826133aSSathesh Edara rte_write32((uint32_t)reg_val, droq->pkts_sent_reg); 249d826133aSSathesh Edara rte_delay_ms(1); 250d826133aSSathesh Edara } 251d826133aSSathesh Edara 252dfa2f825SSathesh Edara if (loop < 0) { 253f665790aSDavid Marchand otx_ep_err("Packets sent register value is not cleared"); 254dfa2f825SSathesh Edara return -EIO; 255d826133aSSathesh Edara } 256d826133aSSathesh Edara 257d826133aSSathesh Edara otx_ep_dbg("SDP_R[%d]_sent: %x", oq_no, rte_read32(droq->pkts_sent_reg)); 2584a3a2a1dSSathesh Edara 2594a3a2a1dSSathesh Edara /* Set Watermark for backpressure */ 2604a3a2a1dSSathesh Edara oct_ep_write64(OTX_EP_OQ_WMARK_MIN, 2614a3a2a1dSSathesh Edara otx_ep->hw_addr + CNXK_EP_R_OUT_WMARK(oq_no)); 2624a3a2a1dSSathesh Edara 263dfa2f825SSathesh Edara return 0; 264d826133aSSathesh Edara } 265d826133aSSathesh Edara 266d826133aSSathesh Edara static int 267d826133aSSathesh Edara cnxk_ep_vf_enable_iq(struct otx_ep_device *otx_ep, uint32_t q_no) 268d826133aSSathesh Edara { 269dfa2f825SSathesh Edara int loop = OTX_EP_BUSY_LOOP_COUNT; 270d826133aSSathesh Edara uint64_t reg_val = 0ull; 271d826133aSSathesh Edara 272d826133aSSathesh Edara /* Resetting doorbells during IQ enabling also to handle abrupt 273d826133aSSathesh Edara * guest reboot. IQ reset does not clear the doorbells. 274d826133aSSathesh Edara */ 275d826133aSSathesh Edara oct_ep_write64(0xFFFFFFFF, otx_ep->hw_addr + CNXK_EP_R_IN_INSTR_DBELL(q_no)); 276d826133aSSathesh Edara 277d826133aSSathesh Edara while (((oct_ep_read64(otx_ep->hw_addr + 278d826133aSSathesh Edara CNXK_EP_R_IN_INSTR_DBELL(q_no))) != 0ull) && loop--) { 279d826133aSSathesh Edara rte_delay_ms(1); 280d826133aSSathesh Edara } 281d826133aSSathesh Edara 282dfa2f825SSathesh Edara if (loop < 0) { 283f665790aSDavid Marchand otx_ep_err("INSTR DBELL not coming back to 0"); 284d826133aSSathesh Edara return -EIO; 285d826133aSSathesh Edara } 286d826133aSSathesh Edara 287d826133aSSathesh Edara reg_val = oct_ep_read64(otx_ep->hw_addr + CNXK_EP_R_IN_ENABLE(q_no)); 288d826133aSSathesh Edara reg_val |= 0x1ull; 289d826133aSSathesh Edara 290d826133aSSathesh Edara oct_ep_write64(reg_val, otx_ep->hw_addr + CNXK_EP_R_IN_ENABLE(q_no)); 291d826133aSSathesh Edara 292d826133aSSathesh Edara otx_ep_info("IQ[%d] enable done", q_no); 293d826133aSSathesh Edara 294d826133aSSathesh Edara return 0; 295d826133aSSathesh Edara } 296d826133aSSathesh Edara 297d826133aSSathesh Edara static int 298d826133aSSathesh Edara cnxk_ep_vf_enable_oq(struct otx_ep_device *otx_ep, uint32_t q_no) 299d826133aSSathesh Edara { 300d826133aSSathesh Edara uint64_t reg_val = 0ull; 301d826133aSSathesh Edara 302d826133aSSathesh Edara reg_val = oct_ep_read64(otx_ep->hw_addr + CNXK_EP_R_OUT_ENABLE(q_no)); 303d826133aSSathesh Edara reg_val |= 0x1ull; 304d826133aSSathesh Edara oct_ep_write64(reg_val, otx_ep->hw_addr + CNXK_EP_R_OUT_ENABLE(q_no)); 305d826133aSSathesh Edara 306d826133aSSathesh Edara otx_ep_info("OQ[%d] enable done", q_no); 307d826133aSSathesh Edara 308d826133aSSathesh Edara return 0; 309d826133aSSathesh Edara } 310d826133aSSathesh Edara 311d826133aSSathesh Edara static int 312d826133aSSathesh Edara cnxk_ep_vf_enable_io_queues(struct otx_ep_device *otx_ep) 313d826133aSSathesh Edara { 314d826133aSSathesh Edara uint32_t q_no = 0; 315d826133aSSathesh Edara int ret; 316d826133aSSathesh Edara 317d826133aSSathesh Edara for (q_no = 0; q_no < otx_ep->nb_tx_queues; q_no++) { 318d826133aSSathesh Edara ret = cnxk_ep_vf_enable_iq(otx_ep, q_no); 319d826133aSSathesh Edara if (ret) 320d826133aSSathesh Edara return ret; 321d826133aSSathesh Edara } 322d826133aSSathesh Edara 323d826133aSSathesh Edara for (q_no = 0; q_no < otx_ep->nb_rx_queues; q_no++) 324d826133aSSathesh Edara cnxk_ep_vf_enable_oq(otx_ep, q_no); 325d826133aSSathesh Edara 326d826133aSSathesh Edara return 0; 327d826133aSSathesh Edara } 328d826133aSSathesh Edara 329d826133aSSathesh Edara static void 330d826133aSSathesh Edara cnxk_ep_vf_disable_iq(struct otx_ep_device *otx_ep, uint32_t q_no) 331d826133aSSathesh Edara { 332d826133aSSathesh Edara uint64_t reg_val = 0ull; 333d826133aSSathesh Edara 334d826133aSSathesh Edara /* Reset the doorbell register for this Input Queue. */ 335d826133aSSathesh Edara reg_val = oct_ep_read64(otx_ep->hw_addr + CNXK_EP_R_IN_ENABLE(q_no)); 336d826133aSSathesh Edara reg_val &= ~0x1ull; 337d826133aSSathesh Edara 338d826133aSSathesh Edara oct_ep_write64(reg_val, otx_ep->hw_addr + CNXK_EP_R_IN_ENABLE(q_no)); 339d826133aSSathesh Edara } 340d826133aSSathesh Edara 341d826133aSSathesh Edara static void 342d826133aSSathesh Edara cnxk_ep_vf_disable_oq(struct otx_ep_device *otx_ep, uint32_t q_no) 343d826133aSSathesh Edara { 344d826133aSSathesh Edara volatile uint64_t reg_val = 0ull; 345d826133aSSathesh Edara 346d826133aSSathesh Edara reg_val = oct_ep_read64(otx_ep->hw_addr + CNXK_EP_R_OUT_ENABLE(q_no)); 347d826133aSSathesh Edara reg_val &= ~0x1ull; 348d826133aSSathesh Edara 349d826133aSSathesh Edara oct_ep_write64(reg_val, otx_ep->hw_addr + CNXK_EP_R_OUT_ENABLE(q_no)); 350d826133aSSathesh Edara } 351d826133aSSathesh Edara 352d826133aSSathesh Edara static void 353d826133aSSathesh Edara cnxk_ep_vf_disable_io_queues(struct otx_ep_device *otx_ep) 354d826133aSSathesh Edara { 355d826133aSSathesh Edara uint32_t q_no = 0; 356d826133aSSathesh Edara 357d826133aSSathesh Edara for (q_no = 0; q_no < otx_ep->sriov_info.rings_per_vf; q_no++) { 358d826133aSSathesh Edara cnxk_ep_vf_disable_iq(otx_ep, q_no); 359d826133aSSathesh Edara cnxk_ep_vf_disable_oq(otx_ep, q_no); 360d826133aSSathesh Edara } 361d826133aSSathesh Edara } 362d826133aSSathesh Edara 363d826133aSSathesh Edara static const struct otx_ep_config default_cnxk_ep_conf = { 364d826133aSSathesh Edara /* IQ attributes */ 365d826133aSSathesh Edara .iq = { 366d826133aSSathesh Edara .max_iqs = OTX_EP_CFG_IO_QUEUES, 367e9405625SShijith Thotton .instr_type = OTX_EP_32BYTE_INSTR, 368d826133aSSathesh Edara .pending_list_size = (OTX_EP_MAX_IQ_DESCRIPTORS * 369d826133aSSathesh Edara OTX_EP_CFG_IO_QUEUES), 370d826133aSSathesh Edara }, 371d826133aSSathesh Edara 372d826133aSSathesh Edara /* OQ attributes */ 373d826133aSSathesh Edara .oq = { 374d826133aSSathesh Edara .max_oqs = OTX_EP_CFG_IO_QUEUES, 375d826133aSSathesh Edara .info_ptr = OTX_EP_OQ_INFOPTR_MODE, 376d826133aSSathesh Edara .refill_threshold = OTX_EP_OQ_REFIL_THRESHOLD, 377d826133aSSathesh Edara }, 378d826133aSSathesh Edara 379d826133aSSathesh Edara .num_iqdef_descs = OTX_EP_MAX_IQ_DESCRIPTORS, 380d826133aSSathesh Edara .num_oqdef_descs = OTX_EP_MAX_OQ_DESCRIPTORS, 381d826133aSSathesh Edara .oqdef_buf_size = OTX_EP_OQ_BUF_SIZE, 382d826133aSSathesh Edara }; 383d826133aSSathesh Edara 384d826133aSSathesh Edara static const struct otx_ep_config* 385d826133aSSathesh Edara cnxk_ep_get_defconf(struct otx_ep_device *otx_ep_dev __rte_unused) 386d826133aSSathesh Edara { 387d826133aSSathesh Edara const struct otx_ep_config *default_conf = NULL; 388d826133aSSathesh Edara 389d826133aSSathesh Edara default_conf = &default_cnxk_ep_conf; 390d826133aSSathesh Edara 391d826133aSSathesh Edara return default_conf; 392d826133aSSathesh Edara } 393d826133aSSathesh Edara 394d826133aSSathesh Edara int 395d826133aSSathesh Edara cnxk_ep_vf_setup_device(struct otx_ep_device *otx_ep) 396d826133aSSathesh Edara { 397d826133aSSathesh Edara uint64_t reg_val = 0ull; 398d826133aSSathesh Edara 399d826133aSSathesh Edara /* If application does not provide its conf, use driver default conf */ 400d826133aSSathesh Edara if (otx_ep->conf == NULL) { 401d826133aSSathesh Edara otx_ep->conf = cnxk_ep_get_defconf(otx_ep); 402d826133aSSathesh Edara if (otx_ep->conf == NULL) { 403d826133aSSathesh Edara otx_ep_err("SDP VF default config not found"); 404d826133aSSathesh Edara return -ENOENT; 405d826133aSSathesh Edara } 406d826133aSSathesh Edara otx_ep_info("Default config is used"); 407d826133aSSathesh Edara } 408d826133aSSathesh Edara 409d826133aSSathesh Edara /* Get IOQs (RPVF] count */ 410d826133aSSathesh Edara reg_val = oct_ep_read64(otx_ep->hw_addr + CNXK_EP_R_IN_CONTROL(0)); 411*304ba46bSVamsi Attunuru if (reg_val == UINT64_MAX) 412*304ba46bSVamsi Attunuru return -ENODEV; 413d826133aSSathesh Edara 414d826133aSSathesh Edara otx_ep->sriov_info.rings_per_vf = 415d826133aSSathesh Edara ((reg_val >> CNXK_EP_R_IN_CTL_RPVF_POS) & CNXK_EP_R_IN_CTL_RPVF_MASK); 416d826133aSSathesh Edara 417d826133aSSathesh Edara otx_ep_info("SDP RPVF: %d", otx_ep->sriov_info.rings_per_vf); 418d826133aSSathesh Edara 419d826133aSSathesh Edara otx_ep->fn_list.setup_iq_regs = cnxk_ep_vf_setup_iq_regs; 420d826133aSSathesh Edara otx_ep->fn_list.setup_oq_regs = cnxk_ep_vf_setup_oq_regs; 421d826133aSSathesh Edara 422d826133aSSathesh Edara otx_ep->fn_list.setup_device_regs = cnxk_ep_vf_setup_device_regs; 423d826133aSSathesh Edara 424d826133aSSathesh Edara otx_ep->fn_list.enable_io_queues = cnxk_ep_vf_enable_io_queues; 425d826133aSSathesh Edara otx_ep->fn_list.disable_io_queues = cnxk_ep_vf_disable_io_queues; 426d826133aSSathesh Edara 427d826133aSSathesh Edara otx_ep->fn_list.enable_iq = cnxk_ep_vf_enable_iq; 428d826133aSSathesh Edara otx_ep->fn_list.disable_iq = cnxk_ep_vf_disable_iq; 429d826133aSSathesh Edara 430d826133aSSathesh Edara otx_ep->fn_list.enable_oq = cnxk_ep_vf_enable_oq; 431d826133aSSathesh Edara otx_ep->fn_list.disable_oq = cnxk_ep_vf_disable_oq; 432d826133aSSathesh Edara 433d826133aSSathesh Edara return 0; 434d826133aSSathesh Edara } 435