xref: /dpdk/drivers/net/octeon_ep/otx_ep_vf.c (revision 304ba46be396d2ec5ddf1d6b02793015785cd823)
1423c8a29SSathesh Edara /* SPDX-License-Identifier: BSD-3-Clause
2423c8a29SSathesh Edara  * Copyright(C) 2021 Marvell.
3423c8a29SSathesh Edara  */
4423c8a29SSathesh Edara 
5423c8a29SSathesh Edara #include <rte_common.h>
6423c8a29SSathesh Edara #include <rte_cycles.h>
7423c8a29SSathesh Edara #include <rte_io.h>
8423c8a29SSathesh Edara #include <ethdev_driver.h>
9423c8a29SSathesh Edara #include <ethdev_pci.h>
10423c8a29SSathesh Edara 
11423c8a29SSathesh Edara #include "otx_ep_common.h"
12423c8a29SSathesh Edara #include "otx_ep_vf.h"
13423c8a29SSathesh Edara 
14423c8a29SSathesh Edara 
15dfa2f825SSathesh Edara static int
16423c8a29SSathesh Edara otx_ep_setup_global_iq_reg(struct otx_ep_device *otx_ep, int q_no)
17423c8a29SSathesh Edara {
18423c8a29SSathesh Edara 	volatile uint64_t reg_val = 0ull;
19dfa2f825SSathesh Edara 	int loop = OTX_EP_BUSY_LOOP_COUNT;
20423c8a29SSathesh Edara 
21423c8a29SSathesh Edara 	/* Select ES, RO, NS, RDSIZE,DPTR Format#0 for IQs
22423c8a29SSathesh Edara 	 * IS_64B is by default enabled.
23423c8a29SSathesh Edara 	 */
24423c8a29SSathesh Edara 	reg_val = rte_read64(otx_ep->hw_addr + OTX_EP_R_IN_CONTROL(q_no));
25423c8a29SSathesh Edara 
26423c8a29SSathesh Edara 	reg_val |= OTX_EP_R_IN_CTL_RDSIZE;
27423c8a29SSathesh Edara 	reg_val |= OTX_EP_R_IN_CTL_IS_64B;
28423c8a29SSathesh Edara 	reg_val |= OTX_EP_R_IN_CTL_ESR;
29423c8a29SSathesh Edara 
30423c8a29SSathesh Edara 	otx_ep_write64(reg_val, otx_ep->hw_addr, OTX_EP_R_IN_CONTROL(q_no));
31423c8a29SSathesh Edara 	reg_val = rte_read64(otx_ep->hw_addr + OTX_EP_R_IN_CONTROL(q_no));
32423c8a29SSathesh Edara 
33423c8a29SSathesh Edara 	if (!(reg_val & OTX_EP_R_IN_CTL_IDLE)) {
34423c8a29SSathesh Edara 		do {
35423c8a29SSathesh Edara 			reg_val = rte_read64(otx_ep->hw_addr +
36423c8a29SSathesh Edara 					      OTX_EP_R_IN_CONTROL(q_no));
37dfa2f825SSathesh Edara 		} while (!(reg_val & OTX_EP_R_IN_CTL_IDLE) && loop--);
38dfa2f825SSathesh Edara 		if (loop < 0)
39dfa2f825SSathesh Edara 			return -EIO;
40423c8a29SSathesh Edara 	}
41dfa2f825SSathesh Edara 	return 0;
42423c8a29SSathesh Edara }
43423c8a29SSathesh Edara 
44423c8a29SSathesh Edara static void
45423c8a29SSathesh Edara otx_ep_setup_global_oq_reg(struct otx_ep_device *otx_ep, int q_no)
46423c8a29SSathesh Edara {
47423c8a29SSathesh Edara 	volatile uint64_t reg_val = 0ull;
48423c8a29SSathesh Edara 
49423c8a29SSathesh Edara 	reg_val = rte_read64(otx_ep->hw_addr + OTX_EP_R_OUT_CONTROL(q_no));
50423c8a29SSathesh Edara 
51423c8a29SSathesh Edara 	reg_val &= ~(OTX_EP_R_OUT_CTL_IMODE);
52423c8a29SSathesh Edara 	reg_val &= ~(OTX_EP_R_OUT_CTL_ROR_P);
53423c8a29SSathesh Edara 	reg_val &= ~(OTX_EP_R_OUT_CTL_NSR_P);
54423c8a29SSathesh Edara 	reg_val &= ~(OTX_EP_R_OUT_CTL_ROR_I);
55423c8a29SSathesh Edara 	reg_val &= ~(OTX_EP_R_OUT_CTL_NSR_I);
56423c8a29SSathesh Edara 	reg_val &= ~(OTX_EP_R_OUT_CTL_ES_I);
57423c8a29SSathesh Edara 	reg_val &= ~(OTX_EP_R_OUT_CTL_ROR_D);
58423c8a29SSathesh Edara 	reg_val &= ~(OTX_EP_R_OUT_CTL_NSR_D);
59423c8a29SSathesh Edara 	reg_val &= ~(OTX_EP_R_OUT_CTL_ES_D);
60423c8a29SSathesh Edara 
61423c8a29SSathesh Edara 	/* INFO/DATA ptr swap is required  */
62423c8a29SSathesh Edara 	reg_val |= (OTX_EP_R_OUT_CTL_ES_P);
63423c8a29SSathesh Edara 
64423c8a29SSathesh Edara 	otx_ep_write64(reg_val, otx_ep->hw_addr, OTX_EP_R_OUT_CONTROL(q_no));
65423c8a29SSathesh Edara }
66423c8a29SSathesh Edara 
67dfa2f825SSathesh Edara static int
68423c8a29SSathesh Edara otx_ep_setup_global_input_regs(struct otx_ep_device *otx_ep)
69423c8a29SSathesh Edara {
70423c8a29SSathesh Edara 	uint64_t q_no = 0ull;
71dfa2f825SSathesh Edara 	int ret = 0;
72423c8a29SSathesh Edara 
73dfa2f825SSathesh Edara 	for (q_no = 0; q_no < (otx_ep->sriov_info.rings_per_vf); q_no++) {
74dfa2f825SSathesh Edara 		ret = otx_ep_setup_global_iq_reg(otx_ep, q_no);
75dfa2f825SSathesh Edara 		if (ret)
76dfa2f825SSathesh Edara 			return ret;
77dfa2f825SSathesh Edara 	}
78dfa2f825SSathesh Edara 	return 0;
79423c8a29SSathesh Edara }
80423c8a29SSathesh Edara 
81423c8a29SSathesh Edara static void
82423c8a29SSathesh Edara otx_ep_setup_global_output_regs(struct otx_ep_device *otx_ep)
83423c8a29SSathesh Edara {
84423c8a29SSathesh Edara 	uint32_t q_no;
85423c8a29SSathesh Edara 
86423c8a29SSathesh Edara 	for (q_no = 0; q_no < (otx_ep->sriov_info.rings_per_vf); q_no++)
87423c8a29SSathesh Edara 		otx_ep_setup_global_oq_reg(otx_ep, q_no);
88423c8a29SSathesh Edara }
89423c8a29SSathesh Edara 
90dfa2f825SSathesh Edara static int
91423c8a29SSathesh Edara otx_ep_setup_device_regs(struct otx_ep_device *otx_ep)
92423c8a29SSathesh Edara {
93dfa2f825SSathesh Edara 	int ret;
94dfa2f825SSathesh Edara 
95dfa2f825SSathesh Edara 	ret = otx_ep_setup_global_input_regs(otx_ep);
96dfa2f825SSathesh Edara 	if (ret)
97dfa2f825SSathesh Edara 		return ret;
98423c8a29SSathesh Edara 	otx_ep_setup_global_output_regs(otx_ep);
99dfa2f825SSathesh Edara 	return 0;
100423c8a29SSathesh Edara }
101423c8a29SSathesh Edara 
102dfa2f825SSathesh Edara static int
103423c8a29SSathesh Edara otx_ep_setup_iq_regs(struct otx_ep_device *otx_ep, uint32_t iq_no)
104423c8a29SSathesh Edara {
105423c8a29SSathesh Edara 	struct otx_ep_instr_queue *iq = otx_ep->instr_queue[iq_no];
106423c8a29SSathesh Edara 	volatile uint64_t reg_val = 0ull;
107dfa2f825SSathesh Edara 	int loop = OTX_EP_BUSY_LOOP_COUNT;
108423c8a29SSathesh Edara 
109423c8a29SSathesh Edara 	reg_val = rte_read64(otx_ep->hw_addr + OTX_EP_R_IN_CONTROL(iq_no));
110423c8a29SSathesh Edara 
111423c8a29SSathesh Edara 	/* Wait till IDLE to set to 1, not supposed to configure BADDR
112423c8a29SSathesh Edara 	 * as long as IDLE is 0
113423c8a29SSathesh Edara 	 */
114423c8a29SSathesh Edara 	if (!(reg_val & OTX_EP_R_IN_CTL_IDLE)) {
115423c8a29SSathesh Edara 		do {
116423c8a29SSathesh Edara 			reg_val = rte_read64(otx_ep->hw_addr +
117423c8a29SSathesh Edara 					      OTX_EP_R_IN_CONTROL(iq_no));
118dfa2f825SSathesh Edara 		} while (!(reg_val & OTX_EP_R_IN_CTL_IDLE) && loop--);
119dfa2f825SSathesh Edara 		if (loop < 0)
120dfa2f825SSathesh Edara 			return -EIO;
121423c8a29SSathesh Edara 	}
122423c8a29SSathesh Edara 
123e9405625SShijith Thotton 	/* Configure input queue instruction size. */
124e9405625SShijith Thotton 	if (iq->desc_size == OTX_EP_32BYTE_INSTR)
125e9405625SShijith Thotton 		reg_val &= ~(OTX_EP_R_IN_CTL_IS_64B);
126e9405625SShijith Thotton 	else
127e9405625SShijith Thotton 		reg_val |= OTX_EP_R_IN_CTL_IS_64B;
128e9405625SShijith Thotton 	oct_ep_write64(reg_val, otx_ep->hw_addr + OTX_EP_R_IN_CONTROL(iq_no));
129e9405625SShijith Thotton 	iq->desc_size = otx_ep->conf->iq.instr_type;
130e9405625SShijith Thotton 
131423c8a29SSathesh Edara 	/* Write the start of the input queue's ring and its size  */
132423c8a29SSathesh Edara 	otx_ep_write64(iq->base_addr_dma, otx_ep->hw_addr,
133423c8a29SSathesh Edara 		       OTX_EP_R_IN_INSTR_BADDR(iq_no));
134423c8a29SSathesh Edara 	otx_ep_write64(iq->nb_desc, otx_ep->hw_addr,
135423c8a29SSathesh Edara 		       OTX_EP_R_IN_INSTR_RSIZE(iq_no));
136423c8a29SSathesh Edara 
137423c8a29SSathesh Edara 	/* Remember the doorbell & instruction count register addr
138423c8a29SSathesh Edara 	 * for this queue
139423c8a29SSathesh Edara 	 */
140423c8a29SSathesh Edara 	iq->doorbell_reg = (uint8_t *)otx_ep->hw_addr +
141423c8a29SSathesh Edara 			   OTX_EP_R_IN_INSTR_DBELL(iq_no);
142423c8a29SSathesh Edara 	iq->inst_cnt_reg = (uint8_t *)otx_ep->hw_addr +
143423c8a29SSathesh Edara 			   OTX_EP_R_IN_CNTS(iq_no);
144423c8a29SSathesh Edara 
145f665790aSDavid Marchand 	otx_ep_dbg("InstQ[%d]:dbell reg @ 0x%p inst_cnt_reg @ 0x%p",
146423c8a29SSathesh Edara 		     iq_no, iq->doorbell_reg, iq->inst_cnt_reg);
147423c8a29SSathesh Edara 
148dfa2f825SSathesh Edara 	loop = OTX_EP_BUSY_LOOP_COUNT;
149423c8a29SSathesh Edara 	do {
150423c8a29SSathesh Edara 		reg_val = rte_read32(iq->inst_cnt_reg);
151423c8a29SSathesh Edara 		rte_write32(reg_val, iq->inst_cnt_reg);
152dfa2f825SSathesh Edara 	} while ((reg_val != 0) && loop--);
153dfa2f825SSathesh Edara 	if (loop < 0)
154dfa2f825SSathesh Edara 		return -EIO;
155423c8a29SSathesh Edara 
156423c8a29SSathesh Edara 	/* IN INTR_THRESHOLD is set to max(FFFFFFFF) which disable the IN INTR
157423c8a29SSathesh Edara 	 * to raise
158423c8a29SSathesh Edara 	 */
159423c8a29SSathesh Edara 	/* reg_val = rte_read64(otx_ep->hw_addr +
160423c8a29SSathesh Edara 	 * OTX_EP_R_IN_INT_LEVELS(iq_no));
161423c8a29SSathesh Edara 	 */
162423c8a29SSathesh Edara 	otx_ep_write64(OTX_EP_CLEAR_IN_INT_LVLS, otx_ep->hw_addr,
163423c8a29SSathesh Edara 		       OTX_EP_R_IN_INT_LEVELS(iq_no));
164dfa2f825SSathesh Edara 	return 0;
165423c8a29SSathesh Edara }
166423c8a29SSathesh Edara 
167dfa2f825SSathesh Edara static int
168423c8a29SSathesh Edara otx_ep_setup_oq_regs(struct otx_ep_device *otx_ep, uint32_t oq_no)
169423c8a29SSathesh Edara {
170423c8a29SSathesh Edara 	volatile uint64_t reg_val = 0ull;
171423c8a29SSathesh Edara 	uint64_t oq_ctl = 0ull;
172dfa2f825SSathesh Edara 	int loop = OTX_EP_BUSY_LOOP_COUNT;
173423c8a29SSathesh Edara 
174423c8a29SSathesh Edara 	struct otx_ep_droq *droq = otx_ep->droq[oq_no];
175423c8a29SSathesh Edara 
176423c8a29SSathesh Edara 	/* Wait on IDLE to set to 1, supposed to configure BADDR
177423c8a29SSathesh Edara 	 * as log as IDLE is 0
178423c8a29SSathesh Edara 	 */
179423c8a29SSathesh Edara 	otx_ep_write64(0ULL, otx_ep->hw_addr, OTX_EP_R_OUT_ENABLE(oq_no));
180423c8a29SSathesh Edara 
181423c8a29SSathesh Edara 	reg_val = rte_read64(otx_ep->hw_addr + OTX_EP_R_OUT_CONTROL(oq_no));
182423c8a29SSathesh Edara 
183dfa2f825SSathesh Edara 	while (!(reg_val & OTX_EP_R_OUT_CTL_IDLE) && loop--) {
184423c8a29SSathesh Edara 		reg_val = rte_read64(otx_ep->hw_addr +
185423c8a29SSathesh Edara 				      OTX_EP_R_OUT_CONTROL(oq_no));
186423c8a29SSathesh Edara 	}
187dfa2f825SSathesh Edara 	if (loop < 0)
188dfa2f825SSathesh Edara 		return -EIO;
189423c8a29SSathesh Edara 
190423c8a29SSathesh Edara 	otx_ep_write64(droq->desc_ring_dma, otx_ep->hw_addr,
191423c8a29SSathesh Edara 		       OTX_EP_R_OUT_SLIST_BADDR(oq_no));
192423c8a29SSathesh Edara 	otx_ep_write64(droq->nb_desc, otx_ep->hw_addr,
193423c8a29SSathesh Edara 		       OTX_EP_R_OUT_SLIST_RSIZE(oq_no));
194423c8a29SSathesh Edara 
195423c8a29SSathesh Edara 	oq_ctl = rte_read64(otx_ep->hw_addr + OTX_EP_R_OUT_CONTROL(oq_no));
196423c8a29SSathesh Edara 
197423c8a29SSathesh Edara 	/* Clear the ISIZE and BSIZE (22-0) */
198423c8a29SSathesh Edara 	oq_ctl &= ~(OTX_EP_CLEAR_ISIZE_BSIZE);
199423c8a29SSathesh Edara 
200423c8a29SSathesh Edara 	/* Populate the BSIZE (15-0) */
201423c8a29SSathesh Edara 	oq_ctl |= (droq->buffer_size & OTX_EP_DROQ_BUFSZ_MASK);
202423c8a29SSathesh Edara 
203423c8a29SSathesh Edara 	otx_ep_write64(oq_ctl, otx_ep->hw_addr, OTX_EP_R_OUT_CONTROL(oq_no));
204423c8a29SSathesh Edara 
205423c8a29SSathesh Edara 	/* Mapped address of the pkt_sent and pkts_credit regs */
206423c8a29SSathesh Edara 	droq->pkts_sent_reg = (uint8_t *)otx_ep->hw_addr +
207423c8a29SSathesh Edara 			      OTX_EP_R_OUT_CNTS(oq_no);
208423c8a29SSathesh Edara 	droq->pkts_credit_reg = (uint8_t *)otx_ep->hw_addr +
209423c8a29SSathesh Edara 				OTX_EP_R_OUT_SLIST_DBELL(oq_no);
210423c8a29SSathesh Edara 
211423c8a29SSathesh Edara 	otx_ep_write64(OTX_EP_CLEAR_OUT_INT_LVLS, otx_ep->hw_addr,
212423c8a29SSathesh Edara 		       OTX_EP_R_OUT_INT_LEVELS(oq_no));
213423c8a29SSathesh Edara 
214423c8a29SSathesh Edara 	/* Clear the OQ doorbell  */
215dfa2f825SSathesh Edara 	loop = OTX_EP_BUSY_LOOP_COUNT;
216423c8a29SSathesh Edara 	rte_write32(OTX_EP_CLEAR_SLIST_DBELL, droq->pkts_credit_reg);
217dfa2f825SSathesh Edara 	while ((rte_read32(droq->pkts_credit_reg) != 0ull) && loop--) {
218423c8a29SSathesh Edara 		rte_write32(OTX_EP_CLEAR_SLIST_DBELL, droq->pkts_credit_reg);
219423c8a29SSathesh Edara 		rte_delay_ms(1);
220423c8a29SSathesh Edara 	}
221dfa2f825SSathesh Edara 	if (loop < 0)
222dfa2f825SSathesh Edara 		return -EIO;
223f665790aSDavid Marchand 	otx_ep_dbg("OTX_EP_R[%d]_credit:%x", oq_no,
224423c8a29SSathesh Edara 		     rte_read32(droq->pkts_credit_reg));
225423c8a29SSathesh Edara 
226423c8a29SSathesh Edara 	/* Clear the OQ_OUT_CNTS doorbell  */
227423c8a29SSathesh Edara 	reg_val = rte_read32(droq->pkts_sent_reg);
228423c8a29SSathesh Edara 	rte_write32((uint32_t)reg_val, droq->pkts_sent_reg);
229423c8a29SSathesh Edara 
230f665790aSDavid Marchand 	otx_ep_dbg("OTX_EP_R[%d]_sent: %x", oq_no,
231423c8a29SSathesh Edara 		     rte_read32(droq->pkts_sent_reg));
232423c8a29SSathesh Edara 
233dfa2f825SSathesh Edara 	loop = OTX_EP_BUSY_LOOP_COUNT;
234dfa2f825SSathesh Edara 	while (((rte_read32(droq->pkts_sent_reg)) != 0ull) && loop--) {
235423c8a29SSathesh Edara 		reg_val = rte_read32(droq->pkts_sent_reg);
236423c8a29SSathesh Edara 		rte_write32((uint32_t)reg_val, droq->pkts_sent_reg);
237423c8a29SSathesh Edara 		rte_delay_ms(1);
238423c8a29SSathesh Edara 	}
239dfa2f825SSathesh Edara 	if (loop < 0)
240dfa2f825SSathesh Edara 		return -EIO;
241dfa2f825SSathesh Edara 	return 0;
242423c8a29SSathesh Edara }
243423c8a29SSathesh Edara 
244423c8a29SSathesh Edara static int
245423c8a29SSathesh Edara otx_ep_enable_iq(struct otx_ep_device *otx_ep, uint32_t q_no)
246423c8a29SSathesh Edara {
247dfa2f825SSathesh Edara 	volatile uint64_t reg_val = 0ull;
248dfa2f825SSathesh Edara 	int loop = OTX_EP_BUSY_LOOP_COUNT;
249423c8a29SSathesh Edara 
250423c8a29SSathesh Edara 	/* Resetting doorbells during IQ enabling also to handle abrupt
251423c8a29SSathesh Edara 	 * guest reboot. IQ reset does not clear the doorbells.
252423c8a29SSathesh Edara 	 */
253423c8a29SSathesh Edara 	otx_ep_write64(0xFFFFFFFF, otx_ep->hw_addr,
254423c8a29SSathesh Edara 		       OTX_EP_R_IN_INSTR_DBELL(q_no));
255423c8a29SSathesh Edara 
256423c8a29SSathesh Edara 	while (((rte_read64(otx_ep->hw_addr +
257423c8a29SSathesh Edara 		 OTX_EP_R_IN_INSTR_DBELL(q_no))) != 0ull) && loop--) {
258423c8a29SSathesh Edara 		rte_delay_ms(1);
259423c8a29SSathesh Edara 	}
260423c8a29SSathesh Edara 
261dfa2f825SSathesh Edara 	if (loop < 0) {
262f665790aSDavid Marchand 		otx_ep_err("dbell reset failed");
263423c8a29SSathesh Edara 		return -EIO;
264423c8a29SSathesh Edara 	}
265423c8a29SSathesh Edara 
266423c8a29SSathesh Edara 
267423c8a29SSathesh Edara 	reg_val = rte_read64(otx_ep->hw_addr + OTX_EP_R_IN_ENABLE(q_no));
268423c8a29SSathesh Edara 	reg_val |= 0x1ull;
269423c8a29SSathesh Edara 
270423c8a29SSathesh Edara 	otx_ep_write64(reg_val, otx_ep->hw_addr, OTX_EP_R_IN_ENABLE(q_no));
271423c8a29SSathesh Edara 
272f665790aSDavid Marchand 	otx_ep_info("IQ[%d] enable done", q_no);
273423c8a29SSathesh Edara 
274423c8a29SSathesh Edara 	return 0;
275423c8a29SSathesh Edara }
276423c8a29SSathesh Edara 
277423c8a29SSathesh Edara static int
278423c8a29SSathesh Edara otx_ep_enable_oq(struct otx_ep_device *otx_ep, uint32_t q_no)
279423c8a29SSathesh Edara {
280dfa2f825SSathesh Edara 	volatile uint64_t reg_val = 0ull;
281dfa2f825SSathesh Edara 	int loop = OTX_EP_BUSY_LOOP_COUNT;
282423c8a29SSathesh Edara 
283423c8a29SSathesh Edara 	/* Resetting doorbells during IQ enabling also to handle abrupt
284423c8a29SSathesh Edara 	 * guest reboot. IQ reset does not clear the doorbells.
285423c8a29SSathesh Edara 	 */
286423c8a29SSathesh Edara 	otx_ep_write64(0xFFFFFFFF, otx_ep->hw_addr,
287423c8a29SSathesh Edara 		       OTX_EP_R_OUT_SLIST_DBELL(q_no));
288423c8a29SSathesh Edara 	while (((rte_read64(otx_ep->hw_addr +
289423c8a29SSathesh Edara 		 OTX_EP_R_OUT_SLIST_DBELL(q_no))) != 0ull) && loop--) {
290423c8a29SSathesh Edara 		rte_delay_ms(1);
291423c8a29SSathesh Edara 	}
292dfa2f825SSathesh Edara 	if (loop < 0) {
293f665790aSDavid Marchand 		otx_ep_err("dbell reset failed");
294423c8a29SSathesh Edara 		return -EIO;
295423c8a29SSathesh Edara 	}
296423c8a29SSathesh Edara 
297423c8a29SSathesh Edara 
298423c8a29SSathesh Edara 	reg_val = rte_read64(otx_ep->hw_addr + OTX_EP_R_OUT_ENABLE(q_no));
299423c8a29SSathesh Edara 	reg_val |= 0x1ull;
300423c8a29SSathesh Edara 	otx_ep_write64(reg_val, otx_ep->hw_addr, OTX_EP_R_OUT_ENABLE(q_no));
301423c8a29SSathesh Edara 
302f665790aSDavid Marchand 	otx_ep_info("OQ[%d] enable done", q_no);
303423c8a29SSathesh Edara 
304423c8a29SSathesh Edara 	return 0;
305423c8a29SSathesh Edara }
306423c8a29SSathesh Edara 
307423c8a29SSathesh Edara static int
308423c8a29SSathesh Edara otx_ep_enable_io_queues(struct otx_ep_device *otx_ep)
309423c8a29SSathesh Edara {
310423c8a29SSathesh Edara 	uint32_t q_no = 0;
311423c8a29SSathesh Edara 	int ret;
312423c8a29SSathesh Edara 
313423c8a29SSathesh Edara 	for (q_no = 0; q_no < otx_ep->nb_tx_queues; q_no++) {
314423c8a29SSathesh Edara 		ret = otx_ep_enable_iq(otx_ep, q_no);
315423c8a29SSathesh Edara 		if (ret)
316423c8a29SSathesh Edara 			return ret;
317423c8a29SSathesh Edara 	}
318423c8a29SSathesh Edara 
319423c8a29SSathesh Edara 	for (q_no = 0; q_no < otx_ep->nb_rx_queues; q_no++) {
320423c8a29SSathesh Edara 		ret = otx_ep_enable_oq(otx_ep, q_no);
321423c8a29SSathesh Edara 		if (ret)
322423c8a29SSathesh Edara 			return ret;
323423c8a29SSathesh Edara 	}
324423c8a29SSathesh Edara 
325423c8a29SSathesh Edara 	return 0;
326423c8a29SSathesh Edara }
327423c8a29SSathesh Edara 
328423c8a29SSathesh Edara static void
329423c8a29SSathesh Edara otx_ep_disable_iq(struct otx_ep_device *otx_ep, uint32_t q_no)
330423c8a29SSathesh Edara {
331423c8a29SSathesh Edara 	uint64_t reg_val = 0ull;
332423c8a29SSathesh Edara 
333423c8a29SSathesh Edara 	/* Reset the doorbell register for this Input Queue. */
334423c8a29SSathesh Edara 	reg_val = rte_read64(otx_ep->hw_addr + OTX_EP_R_IN_ENABLE(q_no));
335423c8a29SSathesh Edara 	reg_val &= ~0x1ull;
336423c8a29SSathesh Edara 
337423c8a29SSathesh Edara 	otx_ep_write64(reg_val, otx_ep->hw_addr, OTX_EP_R_IN_ENABLE(q_no));
338423c8a29SSathesh Edara }
339423c8a29SSathesh Edara 
340423c8a29SSathesh Edara static void
341423c8a29SSathesh Edara otx_ep_disable_oq(struct otx_ep_device *otx_ep, uint32_t q_no)
342423c8a29SSathesh Edara {
343423c8a29SSathesh Edara 	uint64_t reg_val = 0ull;
344423c8a29SSathesh Edara 
345423c8a29SSathesh Edara 	reg_val = rte_read64(otx_ep->hw_addr + OTX_EP_R_OUT_ENABLE(q_no));
346423c8a29SSathesh Edara 	reg_val &= ~0x1ull;
347423c8a29SSathesh Edara 
348423c8a29SSathesh Edara 	otx_ep_write64(reg_val, otx_ep->hw_addr, OTX_EP_R_OUT_ENABLE(q_no));
349423c8a29SSathesh Edara }
350423c8a29SSathesh Edara 
351423c8a29SSathesh Edara static void
352423c8a29SSathesh Edara otx_ep_disable_io_queues(struct otx_ep_device *otx_ep)
353423c8a29SSathesh Edara {
354423c8a29SSathesh Edara 	uint32_t q_no = 0;
355423c8a29SSathesh Edara 
356423c8a29SSathesh Edara 	for (q_no = 0; q_no < otx_ep->sriov_info.rings_per_vf; q_no++) {
357423c8a29SSathesh Edara 		otx_ep_disable_iq(otx_ep, q_no);
358423c8a29SSathesh Edara 		otx_ep_disable_oq(otx_ep, q_no);
359423c8a29SSathesh Edara 	}
360423c8a29SSathesh Edara }
361423c8a29SSathesh Edara 
362423c8a29SSathesh Edara /* OTX_EP default configuration */
363423c8a29SSathesh Edara static const struct otx_ep_config default_otx_ep_conf = {
364423c8a29SSathesh Edara 	/* IQ attributes */
365423c8a29SSathesh Edara 	.iq                        = {
366423c8a29SSathesh Edara 		.max_iqs           = OTX_EP_CFG_IO_QUEUES,
367423c8a29SSathesh Edara 		.instr_type        = OTX_EP_64BYTE_INSTR,
368423c8a29SSathesh Edara 		.pending_list_size = (OTX_EP_MAX_IQ_DESCRIPTORS *
369423c8a29SSathesh Edara 				      OTX_EP_CFG_IO_QUEUES),
370423c8a29SSathesh Edara 	},
371423c8a29SSathesh Edara 
372423c8a29SSathesh Edara 	/* OQ attributes */
373423c8a29SSathesh Edara 	.oq                        = {
374423c8a29SSathesh Edara 		.max_oqs           = OTX_EP_CFG_IO_QUEUES,
375423c8a29SSathesh Edara 		.info_ptr          = OTX_EP_OQ_INFOPTR_MODE,
376423c8a29SSathesh Edara 		.refill_threshold  = OTX_EP_OQ_REFIL_THRESHOLD,
377423c8a29SSathesh Edara 	},
378423c8a29SSathesh Edara 
379423c8a29SSathesh Edara 	.num_iqdef_descs           = OTX_EP_MAX_IQ_DESCRIPTORS,
380423c8a29SSathesh Edara 	.num_oqdef_descs           = OTX_EP_MAX_OQ_DESCRIPTORS,
381423c8a29SSathesh Edara 	.oqdef_buf_size            = OTX_EP_OQ_BUF_SIZE,
382423c8a29SSathesh Edara 
383423c8a29SSathesh Edara };
384423c8a29SSathesh Edara 
385423c8a29SSathesh Edara 
386423c8a29SSathesh Edara static const struct otx_ep_config*
387423c8a29SSathesh Edara otx_ep_get_defconf(struct otx_ep_device *otx_ep_dev __rte_unused)
388423c8a29SSathesh Edara {
389423c8a29SSathesh Edara 	const struct otx_ep_config *default_conf = NULL;
390423c8a29SSathesh Edara 
391423c8a29SSathesh Edara 	default_conf = &default_otx_ep_conf;
392423c8a29SSathesh Edara 
393423c8a29SSathesh Edara 	return default_conf;
394423c8a29SSathesh Edara }
395423c8a29SSathesh Edara 
396423c8a29SSathesh Edara int
397423c8a29SSathesh Edara otx_ep_vf_setup_device(struct otx_ep_device *otx_ep)
398423c8a29SSathesh Edara {
399423c8a29SSathesh Edara 	uint64_t reg_val = 0ull;
400423c8a29SSathesh Edara 
401423c8a29SSathesh Edara 	/* If application doesn't provide its conf, use driver default conf */
402423c8a29SSathesh Edara 	if (otx_ep->conf == NULL) {
403423c8a29SSathesh Edara 		otx_ep->conf = otx_ep_get_defconf(otx_ep);
404423c8a29SSathesh Edara 		if (otx_ep->conf == NULL) {
405f665790aSDavid Marchand 			otx_ep_err("OTX_EP VF default config not found");
406423c8a29SSathesh Edara 			return -ENOENT;
407423c8a29SSathesh Edara 		}
408f665790aSDavid Marchand 		otx_ep_info("Default config is used");
409423c8a29SSathesh Edara 	}
410423c8a29SSathesh Edara 
411423c8a29SSathesh Edara 	/* Get IOQs (RPVF] count */
412423c8a29SSathesh Edara 	reg_val = rte_read64(otx_ep->hw_addr + OTX_EP_R_IN_CONTROL(0));
413*304ba46bSVamsi Attunuru 	if (reg_val == UINT64_MAX)
414*304ba46bSVamsi Attunuru 		return -ENODEV;
415423c8a29SSathesh Edara 
416423c8a29SSathesh Edara 	otx_ep->sriov_info.rings_per_vf = ((reg_val >> OTX_EP_R_IN_CTL_RPVF_POS)
417423c8a29SSathesh Edara 					  & OTX_EP_R_IN_CTL_RPVF_MASK);
418423c8a29SSathesh Edara 
419f665790aSDavid Marchand 	otx_ep_info("OTX_EP RPVF: %d", otx_ep->sriov_info.rings_per_vf);
420423c8a29SSathesh Edara 
421423c8a29SSathesh Edara 	otx_ep->fn_list.setup_iq_regs       = otx_ep_setup_iq_regs;
422423c8a29SSathesh Edara 	otx_ep->fn_list.setup_oq_regs       = otx_ep_setup_oq_regs;
423423c8a29SSathesh Edara 
424423c8a29SSathesh Edara 	otx_ep->fn_list.setup_device_regs   = otx_ep_setup_device_regs;
425423c8a29SSathesh Edara 
426423c8a29SSathesh Edara 	otx_ep->fn_list.enable_io_queues    = otx_ep_enable_io_queues;
427423c8a29SSathesh Edara 	otx_ep->fn_list.disable_io_queues   = otx_ep_disable_io_queues;
428423c8a29SSathesh Edara 
429423c8a29SSathesh Edara 	otx_ep->fn_list.enable_iq           = otx_ep_enable_iq;
430423c8a29SSathesh Edara 	otx_ep->fn_list.disable_iq          = otx_ep_disable_iq;
431423c8a29SSathesh Edara 
432423c8a29SSathesh Edara 	otx_ep->fn_list.enable_oq           = otx_ep_enable_oq;
433423c8a29SSathesh Edara 	otx_ep->fn_list.disable_oq          = otx_ep_disable_oq;
434423c8a29SSathesh Edara 
435423c8a29SSathesh Edara 
436423c8a29SSathesh Edara 	return 0;
437423c8a29SSathesh Edara }
438