1024a8abbSNagadheeraj Rottela /* SPDX-License-Identifier: BSD-3-Clause 2024a8abbSNagadheeraj Rottela * Copyright(C) 2019 Marvell International Ltd. 3024a8abbSNagadheeraj Rottela */ 4024a8abbSNagadheeraj Rottela 5024a8abbSNagadheeraj Rottela #include <rte_common.h> 6024a8abbSNagadheeraj Rottela #include <rte_cycles.h> 7024a8abbSNagadheeraj Rottela #include <rte_memory.h> 8024a8abbSNagadheeraj Rottela #include <rte_byteorder.h> 9024a8abbSNagadheeraj Rottela 10024a8abbSNagadheeraj Rottela #include "nitrox_hal.h" 11024a8abbSNagadheeraj Rottela #include "nitrox_csr.h" 12751ea2c0SNagadheeraj Rottela #include "nitrox_logs.h" 13024a8abbSNagadheeraj Rottela 14024a8abbSNagadheeraj Rottela #define MAX_VF_QUEUES 8 15024a8abbSNagadheeraj Rottela #define MAX_PF_QUEUES 64 16024a8abbSNagadheeraj Rottela #define NITROX_TIMER_THOLD 0x3FFFFF 17024a8abbSNagadheeraj Rottela #define NITROX_COUNT_THOLD 0xFFFFFFFF 18024a8abbSNagadheeraj Rottela 19024a8abbSNagadheeraj Rottela void 20024a8abbSNagadheeraj Rottela nps_pkt_input_ring_disable(uint8_t *bar_addr, uint16_t ring) 21024a8abbSNagadheeraj Rottela { 22024a8abbSNagadheeraj Rottela union nps_pkt_in_instr_ctl pkt_in_instr_ctl; 23024a8abbSNagadheeraj Rottela uint64_t reg_addr; 24024a8abbSNagadheeraj Rottela int max_retries = 5; 25024a8abbSNagadheeraj Rottela 26024a8abbSNagadheeraj Rottela reg_addr = NPS_PKT_IN_INSTR_CTLX(ring); 27024a8abbSNagadheeraj Rottela pkt_in_instr_ctl.u64 = nitrox_read_csr(bar_addr, reg_addr); 28024a8abbSNagadheeraj Rottela pkt_in_instr_ctl.s.enb = 0; 29024a8abbSNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, pkt_in_instr_ctl.u64); 30024a8abbSNagadheeraj Rottela rte_delay_us_block(100); 31024a8abbSNagadheeraj Rottela 32024a8abbSNagadheeraj Rottela /* wait for enable bit to be cleared */ 33024a8abbSNagadheeraj Rottela pkt_in_instr_ctl.u64 = nitrox_read_csr(bar_addr, reg_addr); 34024a8abbSNagadheeraj Rottela while (pkt_in_instr_ctl.s.enb && max_retries--) { 35024a8abbSNagadheeraj Rottela rte_delay_ms(10); 36024a8abbSNagadheeraj Rottela pkt_in_instr_ctl.u64 = nitrox_read_csr(bar_addr, reg_addr); 37024a8abbSNagadheeraj Rottela } 38024a8abbSNagadheeraj Rottela } 39024a8abbSNagadheeraj Rottela 40024a8abbSNagadheeraj Rottela void 41024a8abbSNagadheeraj Rottela nps_pkt_solicited_port_disable(uint8_t *bar_addr, uint16_t port) 42024a8abbSNagadheeraj Rottela { 43024a8abbSNagadheeraj Rottela union nps_pkt_slc_ctl pkt_slc_ctl; 44024a8abbSNagadheeraj Rottela uint64_t reg_addr; 45024a8abbSNagadheeraj Rottela int max_retries = 5; 46024a8abbSNagadheeraj Rottela 47024a8abbSNagadheeraj Rottela /* clear enable bit */ 48024a8abbSNagadheeraj Rottela reg_addr = NPS_PKT_SLC_CTLX(port); 49024a8abbSNagadheeraj Rottela pkt_slc_ctl.u64 = nitrox_read_csr(bar_addr, reg_addr); 50024a8abbSNagadheeraj Rottela pkt_slc_ctl.s.enb = 0; 51024a8abbSNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, pkt_slc_ctl.u64); 52024a8abbSNagadheeraj Rottela rte_delay_us_block(100); 53024a8abbSNagadheeraj Rottela 54024a8abbSNagadheeraj Rottela pkt_slc_ctl.u64 = nitrox_read_csr(bar_addr, reg_addr); 55024a8abbSNagadheeraj Rottela while (pkt_slc_ctl.s.enb && max_retries--) { 56024a8abbSNagadheeraj Rottela rte_delay_ms(10); 57024a8abbSNagadheeraj Rottela pkt_slc_ctl.u64 = nitrox_read_csr(bar_addr, reg_addr); 58024a8abbSNagadheeraj Rottela } 59024a8abbSNagadheeraj Rottela } 60024a8abbSNagadheeraj Rottela 61024a8abbSNagadheeraj Rottela void 62024a8abbSNagadheeraj Rottela setup_nps_pkt_input_ring(uint8_t *bar_addr, uint16_t ring, uint32_t rsize, 63024a8abbSNagadheeraj Rottela phys_addr_t raddr) 64024a8abbSNagadheeraj Rottela { 65024a8abbSNagadheeraj Rottela union nps_pkt_in_instr_ctl pkt_in_instr_ctl; 66024a8abbSNagadheeraj Rottela union nps_pkt_in_instr_rsize pkt_in_instr_rsize; 67024a8abbSNagadheeraj Rottela union nps_pkt_in_instr_baoff_dbell pkt_in_instr_baoff_dbell; 68024a8abbSNagadheeraj Rottela union nps_pkt_in_done_cnts pkt_in_done_cnts; 69024a8abbSNagadheeraj Rottela uint64_t base_addr, reg_addr; 70024a8abbSNagadheeraj Rottela int max_retries = 5; 71024a8abbSNagadheeraj Rottela 72024a8abbSNagadheeraj Rottela nps_pkt_input_ring_disable(bar_addr, ring); 73024a8abbSNagadheeraj Rottela 74024a8abbSNagadheeraj Rottela /* write base address */ 75024a8abbSNagadheeraj Rottela reg_addr = NPS_PKT_IN_INSTR_BADDRX(ring); 76024a8abbSNagadheeraj Rottela base_addr = raddr; 77024a8abbSNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, base_addr); 78024a8abbSNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 79024a8abbSNagadheeraj Rottela 80024a8abbSNagadheeraj Rottela /* write ring size */ 81024a8abbSNagadheeraj Rottela reg_addr = NPS_PKT_IN_INSTR_RSIZEX(ring); 82024a8abbSNagadheeraj Rottela pkt_in_instr_rsize.u64 = 0; 83024a8abbSNagadheeraj Rottela pkt_in_instr_rsize.s.rsize = rsize; 84024a8abbSNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, pkt_in_instr_rsize.u64); 85024a8abbSNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 86024a8abbSNagadheeraj Rottela 87024a8abbSNagadheeraj Rottela /* clear door bell */ 88024a8abbSNagadheeraj Rottela reg_addr = NPS_PKT_IN_INSTR_BAOFF_DBELLX(ring); 89024a8abbSNagadheeraj Rottela pkt_in_instr_baoff_dbell.u64 = 0; 90024a8abbSNagadheeraj Rottela pkt_in_instr_baoff_dbell.s.dbell = 0xFFFFFFFF; 91024a8abbSNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, pkt_in_instr_baoff_dbell.u64); 92024a8abbSNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 93024a8abbSNagadheeraj Rottela 94024a8abbSNagadheeraj Rottela /* clear done count */ 95024a8abbSNagadheeraj Rottela reg_addr = NPS_PKT_IN_DONE_CNTSX(ring); 96024a8abbSNagadheeraj Rottela pkt_in_done_cnts.u64 = nitrox_read_csr(bar_addr, reg_addr); 97024a8abbSNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, pkt_in_done_cnts.u64); 98024a8abbSNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 99024a8abbSNagadheeraj Rottela 100024a8abbSNagadheeraj Rottela /* Setup PKT IN RING Interrupt Threshold */ 101024a8abbSNagadheeraj Rottela reg_addr = NPS_PKT_IN_INT_LEVELSX(ring); 102024a8abbSNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, 0xFFFFFFFF); 103024a8abbSNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 104024a8abbSNagadheeraj Rottela 105024a8abbSNagadheeraj Rottela /* enable ring */ 106024a8abbSNagadheeraj Rottela reg_addr = NPS_PKT_IN_INSTR_CTLX(ring); 107024a8abbSNagadheeraj Rottela pkt_in_instr_ctl.u64 = 0; 108024a8abbSNagadheeraj Rottela pkt_in_instr_ctl.u64 = nitrox_read_csr(bar_addr, reg_addr); 109024a8abbSNagadheeraj Rottela pkt_in_instr_ctl.s.is64b = 1; 110024a8abbSNagadheeraj Rottela pkt_in_instr_ctl.s.enb = 1; 111024a8abbSNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, pkt_in_instr_ctl.u64); 112024a8abbSNagadheeraj Rottela rte_delay_us_block(100); 113024a8abbSNagadheeraj Rottela 114024a8abbSNagadheeraj Rottela pkt_in_instr_ctl.u64 = 0; 115024a8abbSNagadheeraj Rottela pkt_in_instr_ctl.u64 = nitrox_read_csr(bar_addr, reg_addr); 116024a8abbSNagadheeraj Rottela /* wait for ring to be enabled */ 117024a8abbSNagadheeraj Rottela while (!pkt_in_instr_ctl.s.enb && max_retries--) { 118024a8abbSNagadheeraj Rottela rte_delay_ms(10); 119024a8abbSNagadheeraj Rottela pkt_in_instr_ctl.u64 = nitrox_read_csr(bar_addr, reg_addr); 120024a8abbSNagadheeraj Rottela } 121024a8abbSNagadheeraj Rottela } 122024a8abbSNagadheeraj Rottela 123024a8abbSNagadheeraj Rottela void 124024a8abbSNagadheeraj Rottela setup_nps_pkt_solicit_output_port(uint8_t *bar_addr, uint16_t port) 125024a8abbSNagadheeraj Rottela { 126024a8abbSNagadheeraj Rottela union nps_pkt_slc_ctl pkt_slc_ctl; 127024a8abbSNagadheeraj Rottela union nps_pkt_slc_cnts pkt_slc_cnts; 128024a8abbSNagadheeraj Rottela union nps_pkt_slc_int_levels pkt_slc_int_levels; 129024a8abbSNagadheeraj Rottela uint64_t reg_addr; 130024a8abbSNagadheeraj Rottela int max_retries = 5; 131024a8abbSNagadheeraj Rottela 132024a8abbSNagadheeraj Rottela nps_pkt_solicited_port_disable(bar_addr, port); 133024a8abbSNagadheeraj Rottela 134024a8abbSNagadheeraj Rottela /* clear pkt counts */ 135024a8abbSNagadheeraj Rottela reg_addr = NPS_PKT_SLC_CNTSX(port); 136024a8abbSNagadheeraj Rottela pkt_slc_cnts.u64 = nitrox_read_csr(bar_addr, reg_addr); 137024a8abbSNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, pkt_slc_cnts.u64); 138024a8abbSNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 139024a8abbSNagadheeraj Rottela 140024a8abbSNagadheeraj Rottela /* slc interrupt levels */ 141024a8abbSNagadheeraj Rottela reg_addr = NPS_PKT_SLC_INT_LEVELSX(port); 142024a8abbSNagadheeraj Rottela pkt_slc_int_levels.u64 = 0; 143024a8abbSNagadheeraj Rottela pkt_slc_int_levels.s.bmode = 0; 144024a8abbSNagadheeraj Rottela pkt_slc_int_levels.s.timet = NITROX_TIMER_THOLD; 145024a8abbSNagadheeraj Rottela 146024a8abbSNagadheeraj Rottela if (NITROX_COUNT_THOLD > 0) 147024a8abbSNagadheeraj Rottela pkt_slc_int_levels.s.cnt = NITROX_COUNT_THOLD - 1; 148024a8abbSNagadheeraj Rottela 149024a8abbSNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, pkt_slc_int_levels.u64); 150024a8abbSNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 151024a8abbSNagadheeraj Rottela 152024a8abbSNagadheeraj Rottela /* enable ring */ 153024a8abbSNagadheeraj Rottela reg_addr = NPS_PKT_SLC_CTLX(port); 154024a8abbSNagadheeraj Rottela pkt_slc_ctl.u64 = nitrox_read_csr(bar_addr, reg_addr); 155024a8abbSNagadheeraj Rottela pkt_slc_ctl.s.rh = 1; 156024a8abbSNagadheeraj Rottela pkt_slc_ctl.s.z = 1; 157024a8abbSNagadheeraj Rottela pkt_slc_ctl.s.enb = 1; 158024a8abbSNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, pkt_slc_ctl.u64); 159024a8abbSNagadheeraj Rottela rte_delay_us_block(100); 160024a8abbSNagadheeraj Rottela 161024a8abbSNagadheeraj Rottela pkt_slc_ctl.u64 = nitrox_read_csr(bar_addr, reg_addr); 162024a8abbSNagadheeraj Rottela while (!pkt_slc_ctl.s.enb && max_retries--) { 163024a8abbSNagadheeraj Rottela rte_delay_ms(10); 164024a8abbSNagadheeraj Rottela pkt_slc_ctl.u64 = nitrox_read_csr(bar_addr, reg_addr); 165024a8abbSNagadheeraj Rottela } 166024a8abbSNagadheeraj Rottela } 167024a8abbSNagadheeraj Rottela 168024a8abbSNagadheeraj Rottela int 169751ea2c0SNagadheeraj Rottela zqmq_input_ring_disable(uint8_t *bar_addr, uint16_t ring) 170751ea2c0SNagadheeraj Rottela { 171751ea2c0SNagadheeraj Rottela union zqmq_activity_stat zqmq_activity_stat; 172751ea2c0SNagadheeraj Rottela union zqmq_en zqmq_en; 173751ea2c0SNagadheeraj Rottela union zqmq_cmp_cnt zqmq_cmp_cnt; 174751ea2c0SNagadheeraj Rottela uint64_t reg_addr; 175751ea2c0SNagadheeraj Rottela int max_retries = 5; 176751ea2c0SNagadheeraj Rottela 177751ea2c0SNagadheeraj Rottela /* clear queue enable */ 178751ea2c0SNagadheeraj Rottela reg_addr = ZQMQ_ENX(ring); 179751ea2c0SNagadheeraj Rottela zqmq_en.u64 = nitrox_read_csr(bar_addr, reg_addr); 180751ea2c0SNagadheeraj Rottela zqmq_en.s.queue_enable = 0; 181751ea2c0SNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, zqmq_en.u64); 182751ea2c0SNagadheeraj Rottela rte_delay_us_block(100); 183751ea2c0SNagadheeraj Rottela 184751ea2c0SNagadheeraj Rottela /* wait for queue active to clear */ 185751ea2c0SNagadheeraj Rottela reg_addr = ZQMQ_ACTIVITY_STATX(ring); 186751ea2c0SNagadheeraj Rottela zqmq_activity_stat.u64 = nitrox_read_csr(bar_addr, reg_addr); 187751ea2c0SNagadheeraj Rottela while (zqmq_activity_stat.s.queue_active && max_retries--) { 188751ea2c0SNagadheeraj Rottela rte_delay_ms(10); 189751ea2c0SNagadheeraj Rottela zqmq_activity_stat.u64 = nitrox_read_csr(bar_addr, reg_addr); 190751ea2c0SNagadheeraj Rottela } 191751ea2c0SNagadheeraj Rottela 192751ea2c0SNagadheeraj Rottela if (zqmq_activity_stat.s.queue_active) { 193*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Failed to disable zqmq ring %d", ring); 194751ea2c0SNagadheeraj Rottela return -EBUSY; 195751ea2c0SNagadheeraj Rottela } 196751ea2c0SNagadheeraj Rottela 197751ea2c0SNagadheeraj Rottela /* clear commands completed count */ 198751ea2c0SNagadheeraj Rottela reg_addr = ZQMQ_CMP_CNTX(ring); 199751ea2c0SNagadheeraj Rottela zqmq_cmp_cnt.u64 = nitrox_read_csr(bar_addr, reg_addr); 200751ea2c0SNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, zqmq_cmp_cnt.u64); 201751ea2c0SNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 202751ea2c0SNagadheeraj Rottela return 0; 203751ea2c0SNagadheeraj Rottela } 204751ea2c0SNagadheeraj Rottela 205751ea2c0SNagadheeraj Rottela int 206751ea2c0SNagadheeraj Rottela setup_zqmq_input_ring(uint8_t *bar_addr, uint16_t ring, uint32_t rsize, 207751ea2c0SNagadheeraj Rottela phys_addr_t raddr) 208751ea2c0SNagadheeraj Rottela { 209751ea2c0SNagadheeraj Rottela union zqmq_drbl zqmq_drbl; 210751ea2c0SNagadheeraj Rottela union zqmq_qsz zqmq_qsz; 211751ea2c0SNagadheeraj Rottela union zqmq_en zqmq_en; 212751ea2c0SNagadheeraj Rottela union zqmq_cmp_thr zqmq_cmp_thr; 213751ea2c0SNagadheeraj Rottela union zqmq_timer_ld zqmq_timer_ld; 214751ea2c0SNagadheeraj Rottela uint64_t reg_addr = 0; 215751ea2c0SNagadheeraj Rottela int max_retries = 5; 216751ea2c0SNagadheeraj Rottela int err = 0; 217751ea2c0SNagadheeraj Rottela 218751ea2c0SNagadheeraj Rottela err = zqmq_input_ring_disable(bar_addr, ring); 219751ea2c0SNagadheeraj Rottela if (err) 220751ea2c0SNagadheeraj Rottela return err; 221751ea2c0SNagadheeraj Rottela 222751ea2c0SNagadheeraj Rottela /* clear doorbell count */ 223751ea2c0SNagadheeraj Rottela reg_addr = ZQMQ_DRBLX(ring); 224751ea2c0SNagadheeraj Rottela zqmq_drbl.u64 = 0; 225751ea2c0SNagadheeraj Rottela zqmq_drbl.s.dbell_count = 0xFFFFFFFF; 226751ea2c0SNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, zqmq_drbl.u64); 227751ea2c0SNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 228751ea2c0SNagadheeraj Rottela 229751ea2c0SNagadheeraj Rottela reg_addr = ZQMQ_NXT_CMDX(ring); 230751ea2c0SNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, 0); 231751ea2c0SNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 232751ea2c0SNagadheeraj Rottela 233751ea2c0SNagadheeraj Rottela /* write queue length */ 234751ea2c0SNagadheeraj Rottela reg_addr = ZQMQ_QSZX(ring); 235751ea2c0SNagadheeraj Rottela zqmq_qsz.u64 = 0; 236751ea2c0SNagadheeraj Rottela zqmq_qsz.s.host_queue_size = rsize; 237751ea2c0SNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, zqmq_qsz.u64); 238751ea2c0SNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 239751ea2c0SNagadheeraj Rottela 240751ea2c0SNagadheeraj Rottela /* write queue base address */ 241751ea2c0SNagadheeraj Rottela reg_addr = ZQMQ_BADRX(ring); 242751ea2c0SNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, raddr); 243751ea2c0SNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 244751ea2c0SNagadheeraj Rottela 245751ea2c0SNagadheeraj Rottela /* write commands completed threshold */ 246751ea2c0SNagadheeraj Rottela reg_addr = ZQMQ_CMP_THRX(ring); 247751ea2c0SNagadheeraj Rottela zqmq_cmp_thr.u64 = 0; 248751ea2c0SNagadheeraj Rottela zqmq_cmp_thr.s.commands_completed_threshold = 0; 249751ea2c0SNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, zqmq_cmp_thr.u64); 250751ea2c0SNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 251751ea2c0SNagadheeraj Rottela 252751ea2c0SNagadheeraj Rottela /* write timer load value */ 253751ea2c0SNagadheeraj Rottela reg_addr = ZQMQ_TIMER_LDX(ring); 254751ea2c0SNagadheeraj Rottela zqmq_timer_ld.u64 = 0; 255751ea2c0SNagadheeraj Rottela zqmq_timer_ld.s.timer_load_value = 0; 256751ea2c0SNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, zqmq_timer_ld.u64); 257751ea2c0SNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 258751ea2c0SNagadheeraj Rottela 259751ea2c0SNagadheeraj Rottela reg_addr = ZQMQ_ENX(ring); 260751ea2c0SNagadheeraj Rottela zqmq_en.u64 = nitrox_read_csr(bar_addr, reg_addr); 261751ea2c0SNagadheeraj Rottela zqmq_en.s.queue_enable = 1; 262751ea2c0SNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, zqmq_en.u64); 263751ea2c0SNagadheeraj Rottela rte_delay_us_block(100); 264751ea2c0SNagadheeraj Rottela 265751ea2c0SNagadheeraj Rottela /* enable queue */ 266751ea2c0SNagadheeraj Rottela zqmq_en.u64 = 0; 267751ea2c0SNagadheeraj Rottela zqmq_en.u64 = nitrox_read_csr(bar_addr, reg_addr); 268751ea2c0SNagadheeraj Rottela while (!zqmq_en.s.queue_enable && max_retries--) { 269751ea2c0SNagadheeraj Rottela rte_delay_ms(10); 270751ea2c0SNagadheeraj Rottela zqmq_en.u64 = nitrox_read_csr(bar_addr, reg_addr); 271751ea2c0SNagadheeraj Rottela } 272751ea2c0SNagadheeraj Rottela 273751ea2c0SNagadheeraj Rottela if (!zqmq_en.s.queue_enable) { 274*e99981afSDavid Marchand NITROX_LOG_LINE(ERR, "Failed to enable zqmq ring %d", ring); 275751ea2c0SNagadheeraj Rottela err = -EFAULT; 276751ea2c0SNagadheeraj Rottela } else { 277751ea2c0SNagadheeraj Rottela err = 0; 278751ea2c0SNagadheeraj Rottela } 279751ea2c0SNagadheeraj Rottela 280751ea2c0SNagadheeraj Rottela return err; 281751ea2c0SNagadheeraj Rottela } 282751ea2c0SNagadheeraj Rottela 283751ea2c0SNagadheeraj Rottela int 284024a8abbSNagadheeraj Rottela vf_get_vf_config_mode(uint8_t *bar_addr) 285024a8abbSNagadheeraj Rottela { 286024a8abbSNagadheeraj Rottela union aqmq_qsz aqmq_qsz; 287024a8abbSNagadheeraj Rottela uint64_t reg_addr; 288024a8abbSNagadheeraj Rottela int q, vf_mode; 289024a8abbSNagadheeraj Rottela 290024a8abbSNagadheeraj Rottela aqmq_qsz.u64 = 0; 291024a8abbSNagadheeraj Rottela aqmq_qsz.s.host_queue_size = 0xDEADBEEF; 292024a8abbSNagadheeraj Rottela reg_addr = AQMQ_QSZX(0); 293024a8abbSNagadheeraj Rottela nitrox_write_csr(bar_addr, reg_addr, aqmq_qsz.u64); 294024a8abbSNagadheeraj Rottela rte_delay_us_block(CSR_DELAY); 295024a8abbSNagadheeraj Rottela 296024a8abbSNagadheeraj Rottela aqmq_qsz.u64 = 0; 297024a8abbSNagadheeraj Rottela for (q = 1; q < MAX_VF_QUEUES; q++) { 298024a8abbSNagadheeraj Rottela reg_addr = AQMQ_QSZX(q); 299024a8abbSNagadheeraj Rottela aqmq_qsz.u64 = nitrox_read_csr(bar_addr, reg_addr); 300024a8abbSNagadheeraj Rottela if (aqmq_qsz.s.host_queue_size == 0xDEADBEEF) 301024a8abbSNagadheeraj Rottela break; 302024a8abbSNagadheeraj Rottela } 303024a8abbSNagadheeraj Rottela 304024a8abbSNagadheeraj Rottela switch (q) { 305024a8abbSNagadheeraj Rottela case 1: 306024a8abbSNagadheeraj Rottela vf_mode = NITROX_MODE_VF128; 307024a8abbSNagadheeraj Rottela break; 308024a8abbSNagadheeraj Rottela case 2: 309024a8abbSNagadheeraj Rottela vf_mode = NITROX_MODE_VF64; 310024a8abbSNagadheeraj Rottela break; 311024a8abbSNagadheeraj Rottela case 4: 312024a8abbSNagadheeraj Rottela vf_mode = NITROX_MODE_VF32; 313024a8abbSNagadheeraj Rottela break; 314024a8abbSNagadheeraj Rottela case 8: 315024a8abbSNagadheeraj Rottela vf_mode = NITROX_MODE_VF16; 316024a8abbSNagadheeraj Rottela break; 317024a8abbSNagadheeraj Rottela default: 318024a8abbSNagadheeraj Rottela vf_mode = 0; 319024a8abbSNagadheeraj Rottela break; 320024a8abbSNagadheeraj Rottela } 321024a8abbSNagadheeraj Rottela 322024a8abbSNagadheeraj Rottela return vf_mode; 323024a8abbSNagadheeraj Rottela } 324024a8abbSNagadheeraj Rottela 325024a8abbSNagadheeraj Rottela int 326024a8abbSNagadheeraj Rottela vf_config_mode_to_nr_queues(enum nitrox_vf_mode vf_mode) 327024a8abbSNagadheeraj Rottela { 328024a8abbSNagadheeraj Rottela int nr_queues; 329024a8abbSNagadheeraj Rottela 330024a8abbSNagadheeraj Rottela switch (vf_mode) { 331024a8abbSNagadheeraj Rottela case NITROX_MODE_PF: 332024a8abbSNagadheeraj Rottela nr_queues = MAX_PF_QUEUES; 333024a8abbSNagadheeraj Rottela break; 334024a8abbSNagadheeraj Rottela case NITROX_MODE_VF16: 335024a8abbSNagadheeraj Rottela nr_queues = 8; 336024a8abbSNagadheeraj Rottela break; 337024a8abbSNagadheeraj Rottela case NITROX_MODE_VF32: 338024a8abbSNagadheeraj Rottela nr_queues = 4; 339024a8abbSNagadheeraj Rottela break; 340024a8abbSNagadheeraj Rottela case NITROX_MODE_VF64: 341024a8abbSNagadheeraj Rottela nr_queues = 2; 342024a8abbSNagadheeraj Rottela break; 343024a8abbSNagadheeraj Rottela case NITROX_MODE_VF128: 344024a8abbSNagadheeraj Rottela nr_queues = 1; 345024a8abbSNagadheeraj Rottela break; 346024a8abbSNagadheeraj Rottela default: 347024a8abbSNagadheeraj Rottela nr_queues = 0; 348024a8abbSNagadheeraj Rottela break; 349024a8abbSNagadheeraj Rottela } 350024a8abbSNagadheeraj Rottela 351024a8abbSNagadheeraj Rottela return nr_queues; 352024a8abbSNagadheeraj Rottela } 353