xref: /dpdk/drivers/common/nitrox/nitrox_hal.c (revision e99981af34632ecce3bac82d05db97b08308f9b5)
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