xref: /dpdk/drivers/common/cnxk/roc_nix_queue.c (revision 62afdd8d493d8f563c053a4afccb3c5acd1acf54)
119a2b549SJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause
219a2b549SJerin Jacob  * Copyright(C) 2021 Marvell.
319a2b549SJerin Jacob  */
419a2b549SJerin Jacob 
5b21f07c9SHarman Kalra #include <math.h>
6b21f07c9SHarman Kalra 
719a2b549SJerin Jacob #include "roc_api.h"
819a2b549SJerin Jacob #include "roc_priv.h"
919a2b549SJerin Jacob 
10cad8686eSSatha Rao /* Default SQB slack per SQ */
11cad8686eSSatha Rao #define ROC_NIX_SQB_SLACK_DFLT 24
12cad8686eSSatha Rao 
1319a2b549SJerin Jacob static inline uint32_t
1419a2b549SJerin Jacob nix_qsize_to_val(enum nix_q_size qsize)
1519a2b549SJerin Jacob {
1619a2b549SJerin Jacob 	return (16UL << (qsize * 2));
1719a2b549SJerin Jacob }
1819a2b549SJerin Jacob 
1919a2b549SJerin Jacob static inline enum nix_q_size
2019a2b549SJerin Jacob nix_qsize_clampup(uint32_t val)
2119a2b549SJerin Jacob {
2219a2b549SJerin Jacob 	int i = nix_q_size_16;
2319a2b549SJerin Jacob 
2419a2b549SJerin Jacob 	for (; i < nix_q_size_max; i++)
2519a2b549SJerin Jacob 		if (val <= nix_qsize_to_val(i))
2619a2b549SJerin Jacob 			break;
2719a2b549SJerin Jacob 
2819a2b549SJerin Jacob 	if (i >= nix_q_size_max)
2919a2b549SJerin Jacob 		i = nix_q_size_max - 1;
3019a2b549SJerin Jacob 
3119a2b549SJerin Jacob 	return i;
3219a2b549SJerin Jacob }
3319a2b549SJerin Jacob 
34e9d33faaSPavan Nikhilesh void
35e9d33faaSPavan Nikhilesh nix_rq_vwqe_flush(struct roc_nix_rq *rq, uint16_t vwqe_interval)
36e9d33faaSPavan Nikhilesh {
37e9d33faaSPavan Nikhilesh 	uint64_t wait_ns;
38e9d33faaSPavan Nikhilesh 
39e9d33faaSPavan Nikhilesh 	if (!roc_model_is_cn10k())
40e9d33faaSPavan Nikhilesh 		return;
41e9d33faaSPavan Nikhilesh 	/* Due to HW errata writes to VWQE_FLUSH might hang, so instead
42e9d33faaSPavan Nikhilesh 	 * wait for max vwqe timeout interval.
43e9d33faaSPavan Nikhilesh 	 */
44e9d33faaSPavan Nikhilesh 	if (rq->vwqe_ena) {
45e9d33faaSPavan Nikhilesh 		wait_ns = rq->vwqe_wait_tmo * (vwqe_interval + 1) * 100;
46e9d33faaSPavan Nikhilesh 		plt_delay_us((wait_ns / 1E3) + 1);
47e9d33faaSPavan Nikhilesh 	}
48e9d33faaSPavan Nikhilesh }
49e9d33faaSPavan Nikhilesh 
5019a2b549SJerin Jacob int
5138b177feSNithin Dabilpuram nix_rq_ena_dis(struct dev *dev, struct roc_nix_rq *rq, bool enable)
5219a2b549SJerin Jacob {
5344a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get(dev->mbox);
5444a9307cSRakesh Kudurumalla 	int rc;
5519a2b549SJerin Jacob 
5619a2b549SJerin Jacob 	/* Pkts will be dropped silently if RQ is disabled */
5719a2b549SJerin Jacob 	if (roc_model_is_cn9k()) {
5819a2b549SJerin Jacob 		struct nix_aq_enq_req *aq;
5919a2b549SJerin Jacob 
6019a2b549SJerin Jacob 		aq = mbox_alloc_msg_nix_aq_enq(mbox);
6144a9307cSRakesh Kudurumalla 		if (!aq) {
6244a9307cSRakesh Kudurumalla 			rc = -ENOSPC;
6344a9307cSRakesh Kudurumalla 			goto exit;
6444a9307cSRakesh Kudurumalla 		}
65da718c19SNithin Dabilpuram 
6619a2b549SJerin Jacob 		aq->qidx = rq->qid;
6719a2b549SJerin Jacob 		aq->ctype = NIX_AQ_CTYPE_RQ;
6819a2b549SJerin Jacob 		aq->op = NIX_AQ_INSTOP_WRITE;
6919a2b549SJerin Jacob 
7019a2b549SJerin Jacob 		aq->rq.ena = enable;
7119a2b549SJerin Jacob 		aq->rq_mask.ena = ~(aq->rq_mask.ena);
724785c406SSatha Rao 	} else if (roc_model_is_cn10k()) {
7319a2b549SJerin Jacob 		struct nix_cn10k_aq_enq_req *aq;
7419a2b549SJerin Jacob 
7519a2b549SJerin Jacob 		aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
7644a9307cSRakesh Kudurumalla 		if (!aq) {
7744a9307cSRakesh Kudurumalla 			rc = -ENOSPC;
7844a9307cSRakesh Kudurumalla 			goto exit;
7944a9307cSRakesh Kudurumalla 		}
80da718c19SNithin Dabilpuram 
8119a2b549SJerin Jacob 		aq->qidx = rq->qid;
8219a2b549SJerin Jacob 		aq->ctype = NIX_AQ_CTYPE_RQ;
8319a2b549SJerin Jacob 		aq->op = NIX_AQ_INSTOP_WRITE;
8419a2b549SJerin Jacob 
8519a2b549SJerin Jacob 		aq->rq.ena = enable;
8619a2b549SJerin Jacob 		aq->rq_mask.ena = ~(aq->rq_mask.ena);
874785c406SSatha Rao 	} else {
884785c406SSatha Rao 		struct nix_cn20k_aq_enq_req *aq;
894785c406SSatha Rao 
904785c406SSatha Rao 		aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox);
914785c406SSatha Rao 		if (!aq) {
924785c406SSatha Rao 			rc = -ENOSPC;
934785c406SSatha Rao 			goto exit;
944785c406SSatha Rao 		}
954785c406SSatha Rao 
964785c406SSatha Rao 		aq->qidx = rq->qid;
974785c406SSatha Rao 		aq->ctype = NIX_AQ_CTYPE_RQ;
984785c406SSatha Rao 		aq->op = NIX_AQ_INSTOP_WRITE;
994785c406SSatha Rao 
1004785c406SSatha Rao 		aq->rq.ena = enable;
1014785c406SSatha Rao 		aq->rq_mask.ena = ~(aq->rq_mask.ena);
10219a2b549SJerin Jacob 	}
10319a2b549SJerin Jacob 
10444a9307cSRakesh Kudurumalla 	rc = mbox_process(mbox);
10544a9307cSRakesh Kudurumalla exit:
10644a9307cSRakesh Kudurumalla 	mbox_put(mbox);
10744a9307cSRakesh Kudurumalla 	return rc;
10838b177feSNithin Dabilpuram }
10938b177feSNithin Dabilpuram 
11038b177feSNithin Dabilpuram int
111f6e0d835SRakesh Kudurumalla roc_nix_sq_ena_dis(struct roc_nix_sq *sq, bool enable)
112f6e0d835SRakesh Kudurumalla {
113f6e0d835SRakesh Kudurumalla 	int rc = 0;
114f6e0d835SRakesh Kudurumalla 
115f6e0d835SRakesh Kudurumalla 	rc = roc_nix_tm_sq_aura_fc(sq, enable);
116f6e0d835SRakesh Kudurumalla 	if (rc)
117f6e0d835SRakesh Kudurumalla 		goto done;
118f6e0d835SRakesh Kudurumalla 
119f6e0d835SRakesh Kudurumalla 	sq->enable = enable;
120f6e0d835SRakesh Kudurumalla done:
121f6e0d835SRakesh Kudurumalla 	return rc;
122f6e0d835SRakesh Kudurumalla }
123f6e0d835SRakesh Kudurumalla 
124f6e0d835SRakesh Kudurumalla int
12538b177feSNithin Dabilpuram roc_nix_rq_ena_dis(struct roc_nix_rq *rq, bool enable)
12638b177feSNithin Dabilpuram {
12738b177feSNithin Dabilpuram 	struct nix *nix = roc_nix_to_nix_priv(rq->roc_nix);
12838b177feSNithin Dabilpuram 	int rc;
12938b177feSNithin Dabilpuram 
13038b177feSNithin Dabilpuram 	rc = nix_rq_ena_dis(&nix->dev, rq, enable);
131e9d33faaSPavan Nikhilesh 	nix_rq_vwqe_flush(rq, nix->vwqe_interval);
1320f3f3ad8SNithin Dabilpuram 	if (rc)
1330f3f3ad8SNithin Dabilpuram 		return rc;
13419a2b549SJerin Jacob 
1350f3f3ad8SNithin Dabilpuram 	/* Check for meta aura if RQ is enabled */
1360f3f3ad8SNithin Dabilpuram 	if (enable && nix->need_meta_aura)
1374fb24a62SRahul Bhansali 		rc = roc_nix_inl_meta_aura_check(rq->roc_nix, rq);
13819a2b549SJerin Jacob 	return rc;
13919a2b549SJerin Jacob }
14019a2b549SJerin Jacob 
14138b177feSNithin Dabilpuram int
142174f2f35SSunil Kumar Kori roc_nix_rq_is_sso_enable(struct roc_nix *roc_nix, uint32_t qid)
143174f2f35SSunil Kumar Kori {
144174f2f35SSunil Kumar Kori 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
145174f2f35SSunil Kumar Kori 	struct dev *dev = &nix->dev;
14644a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get(dev->mbox);
147174f2f35SSunil Kumar Kori 	bool sso_enable;
148174f2f35SSunil Kumar Kori 	int rc;
149174f2f35SSunil Kumar Kori 
150174f2f35SSunil Kumar Kori 	if (roc_model_is_cn9k()) {
151174f2f35SSunil Kumar Kori 		struct nix_aq_enq_rsp *rsp;
152174f2f35SSunil Kumar Kori 		struct nix_aq_enq_req *aq;
153174f2f35SSunil Kumar Kori 
154174f2f35SSunil Kumar Kori 		aq = mbox_alloc_msg_nix_aq_enq(mbox);
15544a9307cSRakesh Kudurumalla 		if (!aq) {
15644a9307cSRakesh Kudurumalla 			rc = -ENOSPC;
15744a9307cSRakesh Kudurumalla 			goto exit;
15844a9307cSRakesh Kudurumalla 		}
159174f2f35SSunil Kumar Kori 
160174f2f35SSunil Kumar Kori 		aq->qidx = qid;
161174f2f35SSunil Kumar Kori 		aq->ctype = NIX_AQ_CTYPE_RQ;
162174f2f35SSunil Kumar Kori 		aq->op = NIX_AQ_INSTOP_READ;
163174f2f35SSunil Kumar Kori 		rc = mbox_process_msg(mbox, (void *)&rsp);
164174f2f35SSunil Kumar Kori 		if (rc)
16544a9307cSRakesh Kudurumalla 			goto exit;
166174f2f35SSunil Kumar Kori 
167174f2f35SSunil Kumar Kori 		sso_enable = rsp->rq.sso_ena;
1684785c406SSatha Rao 	} else if (roc_model_is_cn10k()) {
169174f2f35SSunil Kumar Kori 		struct nix_cn10k_aq_enq_rsp *rsp;
170174f2f35SSunil Kumar Kori 		struct nix_cn10k_aq_enq_req *aq;
171174f2f35SSunil Kumar Kori 
172174f2f35SSunil Kumar Kori 		aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
17344a9307cSRakesh Kudurumalla 		if (!aq) {
17444a9307cSRakesh Kudurumalla 			rc = -ENOSPC;
17544a9307cSRakesh Kudurumalla 			goto exit;
17644a9307cSRakesh Kudurumalla 		}
177174f2f35SSunil Kumar Kori 
178174f2f35SSunil Kumar Kori 		aq->qidx = qid;
179174f2f35SSunil Kumar Kori 		aq->ctype = NIX_AQ_CTYPE_RQ;
180174f2f35SSunil Kumar Kori 		aq->op = NIX_AQ_INSTOP_READ;
181174f2f35SSunil Kumar Kori 
182174f2f35SSunil Kumar Kori 		rc = mbox_process_msg(mbox, (void *)&rsp);
183174f2f35SSunil Kumar Kori 		if (rc)
18444a9307cSRakesh Kudurumalla 			goto exit;
185174f2f35SSunil Kumar Kori 
186174f2f35SSunil Kumar Kori 		sso_enable = rsp->rq.sso_ena;
1874785c406SSatha Rao 	} else {
1884785c406SSatha Rao 		struct nix_cn20k_aq_enq_rsp *rsp;
1894785c406SSatha Rao 		struct nix_cn20k_aq_enq_req *aq;
1904785c406SSatha Rao 
1914785c406SSatha Rao 		aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox);
1924785c406SSatha Rao 		if (!aq) {
1934785c406SSatha Rao 			rc = -ENOSPC;
1944785c406SSatha Rao 			goto exit;
1954785c406SSatha Rao 		}
1964785c406SSatha Rao 
1974785c406SSatha Rao 		aq->qidx = qid;
1984785c406SSatha Rao 		aq->ctype = NIX_AQ_CTYPE_RQ;
1994785c406SSatha Rao 		aq->op = NIX_AQ_INSTOP_READ;
2004785c406SSatha Rao 
2014785c406SSatha Rao 		rc = mbox_process_msg(mbox, (void *)&rsp);
2024785c406SSatha Rao 		if (rc)
2034785c406SSatha Rao 			goto exit;
2044785c406SSatha Rao 
2054785c406SSatha Rao 		sso_enable = rsp->rq.sso_ena;
206174f2f35SSunil Kumar Kori 	}
207174f2f35SSunil Kumar Kori 
20844a9307cSRakesh Kudurumalla 	rc = sso_enable ? true : false;
20944a9307cSRakesh Kudurumalla exit:
21044a9307cSRakesh Kudurumalla 	mbox_put(mbox);
21144a9307cSRakesh Kudurumalla 	return rc;
212174f2f35SSunil Kumar Kori }
213174f2f35SSunil Kumar Kori 
214aaea4c74SNithin Dabilpuram static int
215aaea4c74SNithin Dabilpuram nix_rq_aura_buf_type_update(struct roc_nix_rq *rq, bool set)
216aaea4c74SNithin Dabilpuram {
217aaea4c74SNithin Dabilpuram 	struct roc_nix *roc_nix = rq->roc_nix;
218aaea4c74SNithin Dabilpuram 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
219aaea4c74SNithin Dabilpuram 	bool inl_inb_ena = roc_nix_inl_inb_is_enabled(roc_nix);
220aaea4c74SNithin Dabilpuram 	uint64_t lpb_aura = 0, vwqe_aura = 0, spb_aura = 0;
221aaea4c74SNithin Dabilpuram 	struct mbox *mbox = nix->dev.mbox;
222aaea4c74SNithin Dabilpuram 	uint64_t aura_base;
223aaea4c74SNithin Dabilpuram 	int rc, count;
224aaea4c74SNithin Dabilpuram 
225aaea4c74SNithin Dabilpuram 	count = set ? 1 : -1;
226aaea4c74SNithin Dabilpuram 	/* For buf type set, use info from RQ context */
227aaea4c74SNithin Dabilpuram 	if (set) {
228aaea4c74SNithin Dabilpuram 		lpb_aura = rq->aura_handle;
229aaea4c74SNithin Dabilpuram 		spb_aura = rq->spb_ena ? rq->spb_aura_handle : 0;
230aaea4c74SNithin Dabilpuram 		vwqe_aura = rq->vwqe_ena ? rq->vwqe_aura_handle : 0;
231aaea4c74SNithin Dabilpuram 		goto skip_ctx_read;
232aaea4c74SNithin Dabilpuram 	}
233aaea4c74SNithin Dabilpuram 
234aaea4c74SNithin Dabilpuram 	aura_base = roc_npa_aura_handle_to_base(rq->aura_handle);
235aaea4c74SNithin Dabilpuram 	if (roc_model_is_cn9k()) {
236aaea4c74SNithin Dabilpuram 		struct nix_aq_enq_rsp *rsp;
237aaea4c74SNithin Dabilpuram 		struct nix_aq_enq_req *aq;
238aaea4c74SNithin Dabilpuram 
23944a9307cSRakesh Kudurumalla 		aq = mbox_alloc_msg_nix_aq_enq(mbox_get(mbox));
24044a9307cSRakesh Kudurumalla 		if (!aq) {
24144a9307cSRakesh Kudurumalla 			mbox_put(mbox);
242aaea4c74SNithin Dabilpuram 			return -ENOSPC;
24344a9307cSRakesh Kudurumalla 		}
244aaea4c74SNithin Dabilpuram 
245aaea4c74SNithin Dabilpuram 		aq->qidx = rq->qid;
246aaea4c74SNithin Dabilpuram 		aq->ctype = NIX_AQ_CTYPE_RQ;
247aaea4c74SNithin Dabilpuram 		aq->op = NIX_AQ_INSTOP_READ;
248aaea4c74SNithin Dabilpuram 		rc = mbox_process_msg(mbox, (void *)&rsp);
24944a9307cSRakesh Kudurumalla 		if (rc) {
25044a9307cSRakesh Kudurumalla 			mbox_put(mbox);
251aaea4c74SNithin Dabilpuram 			return rc;
25244a9307cSRakesh Kudurumalla 		}
253aaea4c74SNithin Dabilpuram 
254aaea4c74SNithin Dabilpuram 		/* Get aura handle from aura */
255aaea4c74SNithin Dabilpuram 		lpb_aura = roc_npa_aura_handle_gen(rsp->rq.lpb_aura, aura_base);
256aaea4c74SNithin Dabilpuram 		if (rsp->rq.spb_ena)
257aaea4c74SNithin Dabilpuram 			spb_aura = roc_npa_aura_handle_gen(rsp->rq.spb_aura, aura_base);
25844a9307cSRakesh Kudurumalla 		mbox_put(mbox);
2594785c406SSatha Rao 	} else if (roc_model_is_cn10k()) {
260aaea4c74SNithin Dabilpuram 		struct nix_cn10k_aq_enq_rsp *rsp;
261aaea4c74SNithin Dabilpuram 		struct nix_cn10k_aq_enq_req *aq;
262aaea4c74SNithin Dabilpuram 
26344a9307cSRakesh Kudurumalla 		aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox_get(mbox));
26444a9307cSRakesh Kudurumalla 		if (!aq) {
26544a9307cSRakesh Kudurumalla 			mbox_put(mbox);
266aaea4c74SNithin Dabilpuram 			return -ENOSPC;
26744a9307cSRakesh Kudurumalla 		}
268aaea4c74SNithin Dabilpuram 
269aaea4c74SNithin Dabilpuram 		aq->qidx = rq->qid;
270aaea4c74SNithin Dabilpuram 		aq->ctype = NIX_AQ_CTYPE_RQ;
271aaea4c74SNithin Dabilpuram 		aq->op = NIX_AQ_INSTOP_READ;
272aaea4c74SNithin Dabilpuram 
273aaea4c74SNithin Dabilpuram 		rc = mbox_process_msg(mbox, (void *)&rsp);
27444a9307cSRakesh Kudurumalla 		if (rc) {
27544a9307cSRakesh Kudurumalla 			mbox_put(mbox);
276aaea4c74SNithin Dabilpuram 			return rc;
27744a9307cSRakesh Kudurumalla 		}
278aaea4c74SNithin Dabilpuram 
279aaea4c74SNithin Dabilpuram 		/* Get aura handle from aura */
280aaea4c74SNithin Dabilpuram 		lpb_aura = roc_npa_aura_handle_gen(rsp->rq.lpb_aura, aura_base);
281aaea4c74SNithin Dabilpuram 		if (rsp->rq.spb_ena)
282aaea4c74SNithin Dabilpuram 			spb_aura = roc_npa_aura_handle_gen(rsp->rq.spb_aura, aura_base);
283aaea4c74SNithin Dabilpuram 		if (rsp->rq.vwqe_ena)
284aaea4c74SNithin Dabilpuram 			vwqe_aura = roc_npa_aura_handle_gen(rsp->rq.wqe_aura, aura_base);
28544a9307cSRakesh Kudurumalla 
28644a9307cSRakesh Kudurumalla 		mbox_put(mbox);
2874785c406SSatha Rao 	} else {
2884785c406SSatha Rao 		struct nix_cn20k_aq_enq_rsp *rsp;
2894785c406SSatha Rao 		struct nix_cn20k_aq_enq_req *aq;
2904785c406SSatha Rao 
2914785c406SSatha Rao 		aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox_get(mbox));
2924785c406SSatha Rao 		if (!aq) {
2934785c406SSatha Rao 			mbox_put(mbox);
2944785c406SSatha Rao 			return -ENOSPC;
2954785c406SSatha Rao 		}
2964785c406SSatha Rao 
2974785c406SSatha Rao 		aq->qidx = rq->qid;
2984785c406SSatha Rao 		aq->ctype = NIX_AQ_CTYPE_RQ;
2994785c406SSatha Rao 		aq->op = NIX_AQ_INSTOP_READ;
3004785c406SSatha Rao 
3014785c406SSatha Rao 		rc = mbox_process_msg(mbox, (void *)&rsp);
3024785c406SSatha Rao 		if (rc) {
3034785c406SSatha Rao 			mbox_put(mbox);
3044785c406SSatha Rao 			return rc;
3054785c406SSatha Rao 		}
3064785c406SSatha Rao 
3074785c406SSatha Rao 		/* Get aura handle from aura */
3084785c406SSatha Rao 		lpb_aura = roc_npa_aura_handle_gen(rsp->rq.lpb_aura, aura_base);
3094785c406SSatha Rao 		if (rsp->rq.spb_ena)
3104785c406SSatha Rao 			spb_aura = roc_npa_aura_handle_gen(rsp->rq.spb_aura, aura_base);
3114785c406SSatha Rao 
3124785c406SSatha Rao 		mbox_put(mbox);
313aaea4c74SNithin Dabilpuram 	}
314aaea4c74SNithin Dabilpuram 
315aaea4c74SNithin Dabilpuram skip_ctx_read:
316aaea4c74SNithin Dabilpuram 	/* Update attributes for LPB aura */
317aaea4c74SNithin Dabilpuram 	if (inl_inb_ena)
318aaea4c74SNithin Dabilpuram 		roc_npa_buf_type_update(lpb_aura, ROC_NPA_BUF_TYPE_PACKET_IPSEC, count);
319aaea4c74SNithin Dabilpuram 	else
320aaea4c74SNithin Dabilpuram 		roc_npa_buf_type_update(lpb_aura, ROC_NPA_BUF_TYPE_PACKET, count);
321aaea4c74SNithin Dabilpuram 
322aaea4c74SNithin Dabilpuram 	/* Update attributes for SPB aura */
323aaea4c74SNithin Dabilpuram 	if (spb_aura) {
324aaea4c74SNithin Dabilpuram 		if (inl_inb_ena)
325aaea4c74SNithin Dabilpuram 			roc_npa_buf_type_update(spb_aura, ROC_NPA_BUF_TYPE_PACKET_IPSEC, count);
326aaea4c74SNithin Dabilpuram 		else
327aaea4c74SNithin Dabilpuram 			roc_npa_buf_type_update(spb_aura, ROC_NPA_BUF_TYPE_PACKET, count);
328aaea4c74SNithin Dabilpuram 	}
329aaea4c74SNithin Dabilpuram 
330aaea4c74SNithin Dabilpuram 	/* Update attributes for VWQE aura */
331aaea4c74SNithin Dabilpuram 	if (vwqe_aura) {
332aaea4c74SNithin Dabilpuram 		if (inl_inb_ena)
333aaea4c74SNithin Dabilpuram 			roc_npa_buf_type_update(vwqe_aura, ROC_NPA_BUF_TYPE_VWQE_IPSEC, count);
334aaea4c74SNithin Dabilpuram 		else
335aaea4c74SNithin Dabilpuram 			roc_npa_buf_type_update(vwqe_aura, ROC_NPA_BUF_TYPE_VWQE, count);
336aaea4c74SNithin Dabilpuram 	}
337aaea4c74SNithin Dabilpuram 
338aaea4c74SNithin Dabilpuram 	return 0;
339aaea4c74SNithin Dabilpuram }
340aaea4c74SNithin Dabilpuram 
3415df46167SSunil Kumar Kori static int
3425df46167SSunil Kumar Kori nix_rq_cn9k_cman_cfg(struct dev *dev, struct roc_nix_rq *rq)
3435df46167SSunil Kumar Kori {
34444a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get(dev->mbox);
3455df46167SSunil Kumar Kori 	struct nix_aq_enq_req *aq;
34644a9307cSRakesh Kudurumalla 	int rc;
3475df46167SSunil Kumar Kori 
3485df46167SSunil Kumar Kori 	aq = mbox_alloc_msg_nix_aq_enq(mbox);
34944a9307cSRakesh Kudurumalla 	if (!aq) {
35044a9307cSRakesh Kudurumalla 		rc = -ENOSPC;
35144a9307cSRakesh Kudurumalla 		goto exit;
35244a9307cSRakesh Kudurumalla 	}
3535df46167SSunil Kumar Kori 
3545df46167SSunil Kumar Kori 	aq->qidx = rq->qid;
3555df46167SSunil Kumar Kori 	aq->ctype = NIX_AQ_CTYPE_RQ;
3565df46167SSunil Kumar Kori 	aq->op = NIX_AQ_INSTOP_WRITE;
3575df46167SSunil Kumar Kori 
3585df46167SSunil Kumar Kori 	if (rq->red_pass && (rq->red_pass >= rq->red_drop)) {
3595df46167SSunil Kumar Kori 		aq->rq.lpb_pool_pass = rq->red_pass;
3605df46167SSunil Kumar Kori 		aq->rq.lpb_pool_drop = rq->red_drop;
3615df46167SSunil Kumar Kori 		aq->rq_mask.lpb_pool_pass = ~(aq->rq_mask.lpb_pool_pass);
3625df46167SSunil Kumar Kori 		aq->rq_mask.lpb_pool_drop = ~(aq->rq_mask.lpb_pool_drop);
3635df46167SSunil Kumar Kori 
3645df46167SSunil Kumar Kori 	}
3655df46167SSunil Kumar Kori 
3665df46167SSunil Kumar Kori 	if (rq->spb_red_pass && (rq->spb_red_pass >= rq->spb_red_drop)) {
3675df46167SSunil Kumar Kori 		aq->rq.spb_pool_pass = rq->spb_red_pass;
3685df46167SSunil Kumar Kori 		aq->rq.spb_pool_drop = rq->spb_red_drop;
3695df46167SSunil Kumar Kori 		aq->rq_mask.spb_pool_pass = ~(aq->rq_mask.spb_pool_pass);
3705df46167SSunil Kumar Kori 		aq->rq_mask.spb_pool_drop = ~(aq->rq_mask.spb_pool_drop);
3715df46167SSunil Kumar Kori 
3725df46167SSunil Kumar Kori 	}
3735df46167SSunil Kumar Kori 
3745df46167SSunil Kumar Kori 	if (rq->xqe_red_pass && (rq->xqe_red_pass >= rq->xqe_red_drop)) {
3755df46167SSunil Kumar Kori 		aq->rq.xqe_pass = rq->xqe_red_pass;
3765df46167SSunil Kumar Kori 		aq->rq.xqe_drop = rq->xqe_red_drop;
3775df46167SSunil Kumar Kori 		aq->rq_mask.xqe_drop = ~(aq->rq_mask.xqe_drop);
3785df46167SSunil Kumar Kori 		aq->rq_mask.xqe_pass = ~(aq->rq_mask.xqe_pass);
3795df46167SSunil Kumar Kori 	}
3805df46167SSunil Kumar Kori 
38144a9307cSRakesh Kudurumalla 	rc = mbox_process(mbox);
38244a9307cSRakesh Kudurumalla exit:
38344a9307cSRakesh Kudurumalla 	mbox_put(mbox);
38444a9307cSRakesh Kudurumalla 	return rc;
3855df46167SSunil Kumar Kori }
3865df46167SSunil Kumar Kori 
387*43e42816SSatha Rao static int
388*43e42816SSatha Rao nix_rq_cn10k_cman_cfg(struct dev *dev, struct roc_nix_rq *rq)
389*43e42816SSatha Rao {
390*43e42816SSatha Rao 	struct nix_cn10k_aq_enq_req *aq;
391*43e42816SSatha Rao 	struct mbox *mbox = mbox_get(dev->mbox);
392*43e42816SSatha Rao 	int rc;
393*43e42816SSatha Rao 
394*43e42816SSatha Rao 	aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
395*43e42816SSatha Rao 	if (!aq) {
396*43e42816SSatha Rao 		rc = -ENOSPC;
397*43e42816SSatha Rao 		goto exit;
398*43e42816SSatha Rao 	}
399*43e42816SSatha Rao 
400*43e42816SSatha Rao 	aq->qidx = rq->qid;
401*43e42816SSatha Rao 	aq->ctype = NIX_AQ_CTYPE_RQ;
402*43e42816SSatha Rao 	aq->op = NIX_AQ_INSTOP_WRITE;
403*43e42816SSatha Rao 
404*43e42816SSatha Rao 	if (rq->red_pass && (rq->red_pass >= rq->red_drop)) {
405*43e42816SSatha Rao 		aq->rq.lpb_pool_pass = rq->red_pass;
406*43e42816SSatha Rao 		aq->rq.lpb_pool_drop = rq->red_drop;
407*43e42816SSatha Rao 		aq->rq_mask.lpb_pool_pass = ~(aq->rq_mask.lpb_pool_pass);
408*43e42816SSatha Rao 		aq->rq_mask.lpb_pool_drop = ~(aq->rq_mask.lpb_pool_drop);
409*43e42816SSatha Rao 	}
410*43e42816SSatha Rao 
411*43e42816SSatha Rao 	if (rq->spb_red_pass && (rq->spb_red_pass >= rq->spb_red_drop)) {
412*43e42816SSatha Rao 		aq->rq.spb_pool_pass = rq->spb_red_pass;
413*43e42816SSatha Rao 		aq->rq.spb_pool_drop = rq->spb_red_drop;
414*43e42816SSatha Rao 		aq->rq_mask.spb_pool_pass = ~(aq->rq_mask.spb_pool_pass);
415*43e42816SSatha Rao 		aq->rq_mask.spb_pool_drop = ~(aq->rq_mask.spb_pool_drop);
416*43e42816SSatha Rao 	}
417*43e42816SSatha Rao 
418*43e42816SSatha Rao 	if (rq->xqe_red_pass && (rq->xqe_red_pass >= rq->xqe_red_drop)) {
419*43e42816SSatha Rao 		aq->rq.xqe_pass = rq->xqe_red_pass;
420*43e42816SSatha Rao 		aq->rq.xqe_drop = rq->xqe_red_drop;
421*43e42816SSatha Rao 		aq->rq_mask.xqe_drop = ~(aq->rq_mask.xqe_drop);
422*43e42816SSatha Rao 		aq->rq_mask.xqe_pass = ~(aq->rq_mask.xqe_pass);
423*43e42816SSatha Rao 	}
424*43e42816SSatha Rao 
425*43e42816SSatha Rao 	rc = mbox_process(mbox);
426*43e42816SSatha Rao exit:
427*43e42816SSatha Rao 	mbox_put(mbox);
428*43e42816SSatha Rao 	return rc;
429*43e42816SSatha Rao }
430*43e42816SSatha Rao 
431*43e42816SSatha Rao static int
432*43e42816SSatha Rao nix_rq_cman_cfg(struct dev *dev, struct roc_nix_rq *rq)
433*43e42816SSatha Rao {
434*43e42816SSatha Rao 	struct nix_cn20k_aq_enq_req *aq;
435*43e42816SSatha Rao 	struct mbox *mbox = mbox_get(dev->mbox);
436*43e42816SSatha Rao 	int rc;
437*43e42816SSatha Rao 
438*43e42816SSatha Rao 	aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox);
439*43e42816SSatha Rao 	if (!aq) {
440*43e42816SSatha Rao 		rc = -ENOSPC;
441*43e42816SSatha Rao 		goto exit;
442*43e42816SSatha Rao 	}
443*43e42816SSatha Rao 
444*43e42816SSatha Rao 	aq->qidx = rq->qid;
445*43e42816SSatha Rao 	aq->ctype = NIX_AQ_CTYPE_RQ;
446*43e42816SSatha Rao 	aq->op = NIX_AQ_INSTOP_WRITE;
447*43e42816SSatha Rao 
448*43e42816SSatha Rao 	if (rq->red_pass && (rq->red_pass >= rq->red_drop)) {
449*43e42816SSatha Rao 		aq->rq.lpb_pool_pass = rq->red_pass;
450*43e42816SSatha Rao 		aq->rq.lpb_pool_drop = rq->red_drop;
451*43e42816SSatha Rao 		aq->rq_mask.lpb_pool_pass = ~(aq->rq_mask.lpb_pool_pass);
452*43e42816SSatha Rao 		aq->rq_mask.lpb_pool_drop = ~(aq->rq_mask.lpb_pool_drop);
453*43e42816SSatha Rao 	}
454*43e42816SSatha Rao 
455*43e42816SSatha Rao 	if (rq->spb_red_pass && (rq->spb_red_pass >= rq->spb_red_drop)) {
456*43e42816SSatha Rao 		aq->rq.spb_pool_pass = rq->spb_red_pass;
457*43e42816SSatha Rao 		aq->rq.spb_pool_drop = rq->spb_red_drop;
458*43e42816SSatha Rao 		aq->rq_mask.spb_pool_pass = ~(aq->rq_mask.spb_pool_pass);
459*43e42816SSatha Rao 		aq->rq_mask.spb_pool_drop = ~(aq->rq_mask.spb_pool_drop);
460*43e42816SSatha Rao 	}
461*43e42816SSatha Rao 
462*43e42816SSatha Rao 	if (rq->xqe_red_pass && (rq->xqe_red_pass >= rq->xqe_red_drop)) {
463*43e42816SSatha Rao 		aq->rq.xqe_pass = rq->xqe_red_pass;
464*43e42816SSatha Rao 		aq->rq.xqe_drop = rq->xqe_red_drop;
465*43e42816SSatha Rao 		aq->rq_mask.xqe_drop = ~(aq->rq_mask.xqe_drop);
466*43e42816SSatha Rao 		aq->rq_mask.xqe_pass = ~(aq->rq_mask.xqe_pass);
467*43e42816SSatha Rao 	}
468*43e42816SSatha Rao 
469*43e42816SSatha Rao 	rc = mbox_process(mbox);
470*43e42816SSatha Rao exit:
471*43e42816SSatha Rao 	mbox_put(mbox);
472*43e42816SSatha Rao 	return rc;
473*43e42816SSatha Rao }
474*43e42816SSatha Rao 
475174f2f35SSunil Kumar Kori int
47638b177feSNithin Dabilpuram nix_rq_cn9k_cfg(struct dev *dev, struct roc_nix_rq *rq, uint16_t qints,
47738b177feSNithin Dabilpuram 		bool cfg, bool ena)
47819a2b549SJerin Jacob {
47938b177feSNithin Dabilpuram 	struct mbox *mbox = dev->mbox;
48019a2b549SJerin Jacob 	struct nix_aq_enq_req *aq;
48119a2b549SJerin Jacob 
48219a2b549SJerin Jacob 	aq = mbox_alloc_msg_nix_aq_enq(mbox);
483da718c19SNithin Dabilpuram 	if (!aq)
484da718c19SNithin Dabilpuram 		return -ENOSPC;
485da718c19SNithin Dabilpuram 
48619a2b549SJerin Jacob 	aq->qidx = rq->qid;
48719a2b549SJerin Jacob 	aq->ctype = NIX_AQ_CTYPE_RQ;
48819a2b549SJerin Jacob 	aq->op = cfg ? NIX_AQ_INSTOP_WRITE : NIX_AQ_INSTOP_INIT;
48919a2b549SJerin Jacob 
49019a2b549SJerin Jacob 	if (rq->sso_ena) {
49119a2b549SJerin Jacob 		/* SSO mode */
49219a2b549SJerin Jacob 		aq->rq.sso_ena = 1;
49319a2b549SJerin Jacob 		aq->rq.sso_tt = rq->tt;
49419a2b549SJerin Jacob 		aq->rq.sso_grp = rq->hwgrp;
49519a2b549SJerin Jacob 		aq->rq.ena_wqwd = 1;
49619a2b549SJerin Jacob 		aq->rq.wqe_skip = rq->wqe_skip;
49719a2b549SJerin Jacob 		aq->rq.wqe_caching = 1;
49819a2b549SJerin Jacob 
49919a2b549SJerin Jacob 		aq->rq.good_utag = rq->tag_mask >> 24;
50019a2b549SJerin Jacob 		aq->rq.bad_utag = rq->tag_mask >> 24;
50119a2b549SJerin Jacob 		aq->rq.ltag = rq->tag_mask & BITMASK_ULL(24, 0);
50219a2b549SJerin Jacob 	} else {
50319a2b549SJerin Jacob 		/* CQ mode */
50419a2b549SJerin Jacob 		aq->rq.sso_ena = 0;
50519a2b549SJerin Jacob 		aq->rq.good_utag = rq->tag_mask >> 24;
50619a2b549SJerin Jacob 		aq->rq.bad_utag = rq->tag_mask >> 24;
50719a2b549SJerin Jacob 		aq->rq.ltag = rq->tag_mask & BITMASK_ULL(24, 0);
508b059bbb8SKommula Shiva Shankar 		aq->rq.cq = rq->cqid;
50919a2b549SJerin Jacob 	}
51019a2b549SJerin Jacob 
51119a2b549SJerin Jacob 	if (rq->ipsech_ena)
51219a2b549SJerin Jacob 		aq->rq.ipsech_ena = 1;
51319a2b549SJerin Jacob 
51419a2b549SJerin Jacob 	aq->rq.spb_ena = 0;
51519a2b549SJerin Jacob 	aq->rq.lpb_aura = roc_npa_aura_handle_to_aura(rq->aura_handle);
51619a2b549SJerin Jacob 
51719a2b549SJerin Jacob 	/* Sizes must be aligned to 8 bytes */
51819a2b549SJerin Jacob 	if (rq->first_skip & 0x7 || rq->later_skip & 0x7 || rq->lpb_size & 0x7)
51919a2b549SJerin Jacob 		return -EINVAL;
52019a2b549SJerin Jacob 
52119a2b549SJerin Jacob 	/* Expressed in number of dwords */
52219a2b549SJerin Jacob 	aq->rq.first_skip = rq->first_skip / 8;
52319a2b549SJerin Jacob 	aq->rq.later_skip = rq->later_skip / 8;
52419a2b549SJerin Jacob 	aq->rq.flow_tagw = rq->flow_tag_width; /* 32-bits */
52519a2b549SJerin Jacob 	aq->rq.lpb_sizem1 = rq->lpb_size / 8;
52619a2b549SJerin Jacob 	aq->rq.lpb_sizem1 -= 1; /* Expressed in size minus one */
52719a2b549SJerin Jacob 	aq->rq.ena = ena;
52819a2b549SJerin Jacob 	aq->rq.pb_caching = 0x2; /* First cache aligned block to LLC */
52919a2b549SJerin Jacob 	aq->rq.xqe_imm_size = 0; /* No pkt data copy to CQE */
53019a2b549SJerin Jacob 	aq->rq.rq_int_ena = 0;
53119a2b549SJerin Jacob 	/* Many to one reduction */
53238b177feSNithin Dabilpuram 	aq->rq.qint_idx = rq->qid % qints;
53319a2b549SJerin Jacob 	aq->rq.xqe_drop_ena = 1;
53419a2b549SJerin Jacob 
53595bec117SSatha Rao 	/* If RED enabled, then fill enable for all cases */
53695bec117SSatha Rao 	if (rq->red_pass && (rq->red_pass >= rq->red_drop)) {
537ee48f711SNithin Dabilpuram 		aq->rq.spb_pool_pass = rq->spb_red_pass;
538ee48f711SNithin Dabilpuram 		aq->rq.lpb_pool_pass = rq->red_pass;
53995bec117SSatha Rao 
540ee48f711SNithin Dabilpuram 		aq->rq.spb_pool_drop = rq->spb_red_drop;
541ee48f711SNithin Dabilpuram 		aq->rq.lpb_pool_drop = rq->red_drop;
54295bec117SSatha Rao 	}
54395bec117SSatha Rao 
54419a2b549SJerin Jacob 	if (cfg) {
54519a2b549SJerin Jacob 		if (rq->sso_ena) {
54619a2b549SJerin Jacob 			/* SSO mode */
54719a2b549SJerin Jacob 			aq->rq_mask.sso_ena = ~aq->rq_mask.sso_ena;
54819a2b549SJerin Jacob 			aq->rq_mask.sso_tt = ~aq->rq_mask.sso_tt;
54919a2b549SJerin Jacob 			aq->rq_mask.sso_grp = ~aq->rq_mask.sso_grp;
55019a2b549SJerin Jacob 			aq->rq_mask.ena_wqwd = ~aq->rq_mask.ena_wqwd;
55119a2b549SJerin Jacob 			aq->rq_mask.wqe_skip = ~aq->rq_mask.wqe_skip;
55219a2b549SJerin Jacob 			aq->rq_mask.wqe_caching = ~aq->rq_mask.wqe_caching;
55319a2b549SJerin Jacob 			aq->rq_mask.good_utag = ~aq->rq_mask.good_utag;
55419a2b549SJerin Jacob 			aq->rq_mask.bad_utag = ~aq->rq_mask.bad_utag;
55519a2b549SJerin Jacob 			aq->rq_mask.ltag = ~aq->rq_mask.ltag;
55619a2b549SJerin Jacob 		} else {
55719a2b549SJerin Jacob 			/* CQ mode */
55819a2b549SJerin Jacob 			aq->rq_mask.sso_ena = ~aq->rq_mask.sso_ena;
55919a2b549SJerin Jacob 			aq->rq_mask.good_utag = ~aq->rq_mask.good_utag;
56019a2b549SJerin Jacob 			aq->rq_mask.bad_utag = ~aq->rq_mask.bad_utag;
56119a2b549SJerin Jacob 			aq->rq_mask.ltag = ~aq->rq_mask.ltag;
56219a2b549SJerin Jacob 			aq->rq_mask.cq = ~aq->rq_mask.cq;
56319a2b549SJerin Jacob 		}
56419a2b549SJerin Jacob 
56519a2b549SJerin Jacob 		if (rq->ipsech_ena)
56619a2b549SJerin Jacob 			aq->rq_mask.ipsech_ena = ~aq->rq_mask.ipsech_ena;
56719a2b549SJerin Jacob 
56819a2b549SJerin Jacob 		aq->rq_mask.spb_ena = ~aq->rq_mask.spb_ena;
56919a2b549SJerin Jacob 		aq->rq_mask.lpb_aura = ~aq->rq_mask.lpb_aura;
57019a2b549SJerin Jacob 		aq->rq_mask.first_skip = ~aq->rq_mask.first_skip;
57119a2b549SJerin Jacob 		aq->rq_mask.later_skip = ~aq->rq_mask.later_skip;
57219a2b549SJerin Jacob 		aq->rq_mask.flow_tagw = ~aq->rq_mask.flow_tagw;
57319a2b549SJerin Jacob 		aq->rq_mask.lpb_sizem1 = ~aq->rq_mask.lpb_sizem1;
57419a2b549SJerin Jacob 		aq->rq_mask.ena = ~aq->rq_mask.ena;
57519a2b549SJerin Jacob 		aq->rq_mask.pb_caching = ~aq->rq_mask.pb_caching;
57619a2b549SJerin Jacob 		aq->rq_mask.xqe_imm_size = ~aq->rq_mask.xqe_imm_size;
57719a2b549SJerin Jacob 		aq->rq_mask.rq_int_ena = ~aq->rq_mask.rq_int_ena;
57819a2b549SJerin Jacob 		aq->rq_mask.qint_idx = ~aq->rq_mask.qint_idx;
57919a2b549SJerin Jacob 		aq->rq_mask.xqe_drop_ena = ~aq->rq_mask.xqe_drop_ena;
58095bec117SSatha Rao 
58195bec117SSatha Rao 		if (rq->red_pass && (rq->red_pass >= rq->red_drop)) {
582ee48f711SNithin Dabilpuram 			aq->rq_mask.spb_pool_pass = ~aq->rq_mask.spb_pool_pass;
583ee48f711SNithin Dabilpuram 			aq->rq_mask.lpb_pool_pass = ~aq->rq_mask.lpb_pool_pass;
58495bec117SSatha Rao 
585ee48f711SNithin Dabilpuram 			aq->rq_mask.spb_pool_drop = ~aq->rq_mask.spb_pool_drop;
586ee48f711SNithin Dabilpuram 			aq->rq_mask.lpb_pool_drop = ~aq->rq_mask.lpb_pool_drop;
58795bec117SSatha Rao 		}
58819a2b549SJerin Jacob 	}
58919a2b549SJerin Jacob 
59019a2b549SJerin Jacob 	return 0;
59119a2b549SJerin Jacob }
59219a2b549SJerin Jacob 
59338b177feSNithin Dabilpuram int
5944785c406SSatha Rao nix_rq_cn10k_cfg(struct dev *dev, struct roc_nix_rq *rq, uint16_t qints, bool cfg, bool ena)
59519a2b549SJerin Jacob {
59619a2b549SJerin Jacob 	struct nix_cn10k_aq_enq_req *aq;
59738b177feSNithin Dabilpuram 	struct mbox *mbox = dev->mbox;
59819a2b549SJerin Jacob 
59919a2b549SJerin Jacob 	aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
600da718c19SNithin Dabilpuram 	if (!aq)
601da718c19SNithin Dabilpuram 		return -ENOSPC;
602da718c19SNithin Dabilpuram 
60319a2b549SJerin Jacob 	aq->qidx = rq->qid;
60419a2b549SJerin Jacob 	aq->ctype = NIX_AQ_CTYPE_RQ;
60519a2b549SJerin Jacob 	aq->op = cfg ? NIX_AQ_INSTOP_WRITE : NIX_AQ_INSTOP_INIT;
60619a2b549SJerin Jacob 
60719a2b549SJerin Jacob 	if (rq->sso_ena) {
60819a2b549SJerin Jacob 		/* SSO mode */
60919a2b549SJerin Jacob 		aq->rq.sso_ena = 1;
61019a2b549SJerin Jacob 		aq->rq.sso_tt = rq->tt;
61119a2b549SJerin Jacob 		aq->rq.sso_grp = rq->hwgrp;
61219a2b549SJerin Jacob 		aq->rq.ena_wqwd = 1;
61319a2b549SJerin Jacob 		aq->rq.wqe_skip = rq->wqe_skip;
61419a2b549SJerin Jacob 		aq->rq.wqe_caching = 1;
61519a2b549SJerin Jacob 
61619a2b549SJerin Jacob 		aq->rq.good_utag = rq->tag_mask >> 24;
61719a2b549SJerin Jacob 		aq->rq.bad_utag = rq->tag_mask >> 24;
61819a2b549SJerin Jacob 		aq->rq.ltag = rq->tag_mask & BITMASK_ULL(24, 0);
61919a2b549SJerin Jacob 
62019a2b549SJerin Jacob 		if (rq->vwqe_ena) {
62119a2b549SJerin Jacob 			aq->rq.vwqe_ena = true;
62219a2b549SJerin Jacob 			aq->rq.vwqe_skip = rq->vwqe_first_skip;
62319a2b549SJerin Jacob 			/* Maximal Vector size is (2^(MAX_VSIZE_EXP+2)) */
62419a2b549SJerin Jacob 			aq->rq.max_vsize_exp = rq->vwqe_max_sz_exp - 2;
62519a2b549SJerin Jacob 			aq->rq.vtime_wait = rq->vwqe_wait_tmo;
626aaea4c74SNithin Dabilpuram 			aq->rq.wqe_aura = roc_npa_aura_handle_to_aura(rq->vwqe_aura_handle);
62719a2b549SJerin Jacob 		}
62819a2b549SJerin Jacob 	} else {
62919a2b549SJerin Jacob 		/* CQ mode */
63019a2b549SJerin Jacob 		aq->rq.sso_ena = 0;
63119a2b549SJerin Jacob 		aq->rq.good_utag = rq->tag_mask >> 24;
63219a2b549SJerin Jacob 		aq->rq.bad_utag = rq->tag_mask >> 24;
63319a2b549SJerin Jacob 		aq->rq.ltag = rq->tag_mask & BITMASK_ULL(24, 0);
634b059bbb8SKommula Shiva Shankar 		aq->rq.cq = rq->cqid;
63519a2b549SJerin Jacob 	}
63619a2b549SJerin Jacob 
63738b177feSNithin Dabilpuram 	if (rq->ipsech_ena) {
63819a2b549SJerin Jacob 		aq->rq.ipsech_ena = 1;
63938b177feSNithin Dabilpuram 		aq->rq.ipsecd_drop_en = 1;
6408f80a2e3SNithin Dabilpuram 		aq->rq.ena_wqwd = 1;
6418f80a2e3SNithin Dabilpuram 		aq->rq.wqe_skip = rq->wqe_skip;
6428f80a2e3SNithin Dabilpuram 		aq->rq.wqe_caching = 1;
64338b177feSNithin Dabilpuram 	}
64419a2b549SJerin Jacob 
64519a2b549SJerin Jacob 	aq->rq.lpb_aura = roc_npa_aura_handle_to_aura(rq->aura_handle);
64619a2b549SJerin Jacob 
64719a2b549SJerin Jacob 	/* Sizes must be aligned to 8 bytes */
64819a2b549SJerin Jacob 	if (rq->first_skip & 0x7 || rq->later_skip & 0x7 || rq->lpb_size & 0x7)
64919a2b549SJerin Jacob 		return -EINVAL;
65019a2b549SJerin Jacob 
65119a2b549SJerin Jacob 	/* Expressed in number of dwords */
65219a2b549SJerin Jacob 	aq->rq.first_skip = rq->first_skip / 8;
65319a2b549SJerin Jacob 	aq->rq.later_skip = rq->later_skip / 8;
65419a2b549SJerin Jacob 	aq->rq.flow_tagw = rq->flow_tag_width; /* 32-bits */
65519a2b549SJerin Jacob 	aq->rq.lpb_sizem1 = rq->lpb_size / 8;
65619a2b549SJerin Jacob 	aq->rq.lpb_sizem1 -= 1; /* Expressed in size minus one */
65719a2b549SJerin Jacob 	aq->rq.ena = ena;
65819a2b549SJerin Jacob 
65919a2b549SJerin Jacob 	if (rq->spb_ena) {
66019a2b549SJerin Jacob 		uint32_t spb_sizem1;
66119a2b549SJerin Jacob 
66219a2b549SJerin Jacob 		aq->rq.spb_ena = 1;
66319a2b549SJerin Jacob 		aq->rq.spb_aura =
66419a2b549SJerin Jacob 			roc_npa_aura_handle_to_aura(rq->spb_aura_handle);
66519a2b549SJerin Jacob 
66619a2b549SJerin Jacob 		if (rq->spb_size & 0x7 ||
66719a2b549SJerin Jacob 		    rq->spb_size > NIX_RQ_CN10K_SPB_MAX_SIZE)
66819a2b549SJerin Jacob 			return -EINVAL;
66919a2b549SJerin Jacob 
67019a2b549SJerin Jacob 		spb_sizem1 = rq->spb_size / 8; /* Expressed in no. of dwords */
67119a2b549SJerin Jacob 		spb_sizem1 -= 1;	       /* Expressed in size minus one */
67219a2b549SJerin Jacob 		aq->rq.spb_sizem1 = spb_sizem1 & 0x3F;
67319a2b549SJerin Jacob 		aq->rq.spb_high_sizem1 = (spb_sizem1 >> 6) & 0x7;
67419a2b549SJerin Jacob 	} else {
67519a2b549SJerin Jacob 		aq->rq.spb_ena = 0;
67619a2b549SJerin Jacob 	}
67719a2b549SJerin Jacob 
67819a2b549SJerin Jacob 	aq->rq.pb_caching = 0x2; /* First cache aligned block to LLC */
67919a2b549SJerin Jacob 	aq->rq.xqe_imm_size = 0; /* No pkt data copy to CQE */
68019a2b549SJerin Jacob 	aq->rq.rq_int_ena = 0;
68119a2b549SJerin Jacob 	/* Many to one reduction */
68238b177feSNithin Dabilpuram 	aq->rq.qint_idx = rq->qid % qints;
683c8c967e1SNithin Dabilpuram 	aq->rq.xqe_drop_ena = 0;
684c8c967e1SNithin Dabilpuram 	aq->rq.lpb_drop_ena = rq->lpb_drop_ena;
685c8c967e1SNithin Dabilpuram 	aq->rq.spb_drop_ena = rq->spb_drop_ena;
68619a2b549SJerin Jacob 
68795bec117SSatha Rao 	/* If RED enabled, then fill enable for all cases */
68895bec117SSatha Rao 	if (rq->red_pass && (rq->red_pass >= rq->red_drop)) {
689ee48f711SNithin Dabilpuram 		aq->rq.spb_pool_pass = rq->spb_red_pass;
69095bec117SSatha Rao 		aq->rq.lpb_pool_pass = rq->red_pass;
69195bec117SSatha Rao 		aq->rq.wqe_pool_pass = rq->red_pass;
69295bec117SSatha Rao 		aq->rq.xqe_pass = rq->red_pass;
69395bec117SSatha Rao 
694ee48f711SNithin Dabilpuram 		aq->rq.spb_pool_drop = rq->spb_red_drop;
69595bec117SSatha Rao 		aq->rq.lpb_pool_drop = rq->red_drop;
69695bec117SSatha Rao 		aq->rq.wqe_pool_drop = rq->red_drop;
69795bec117SSatha Rao 		aq->rq.xqe_drop = rq->red_drop;
69895bec117SSatha Rao 	}
69995bec117SSatha Rao 
70019a2b549SJerin Jacob 	if (cfg) {
70119a2b549SJerin Jacob 		if (rq->sso_ena) {
70219a2b549SJerin Jacob 			/* SSO mode */
70319a2b549SJerin Jacob 			aq->rq_mask.sso_ena = ~aq->rq_mask.sso_ena;
70419a2b549SJerin Jacob 			aq->rq_mask.sso_tt = ~aq->rq_mask.sso_tt;
70519a2b549SJerin Jacob 			aq->rq_mask.sso_grp = ~aq->rq_mask.sso_grp;
70619a2b549SJerin Jacob 			aq->rq_mask.ena_wqwd = ~aq->rq_mask.ena_wqwd;
70719a2b549SJerin Jacob 			aq->rq_mask.wqe_skip = ~aq->rq_mask.wqe_skip;
70819a2b549SJerin Jacob 			aq->rq_mask.wqe_caching = ~aq->rq_mask.wqe_caching;
70919a2b549SJerin Jacob 			aq->rq_mask.good_utag = ~aq->rq_mask.good_utag;
71019a2b549SJerin Jacob 			aq->rq_mask.bad_utag = ~aq->rq_mask.bad_utag;
71119a2b549SJerin Jacob 			aq->rq_mask.ltag = ~aq->rq_mask.ltag;
71219a2b549SJerin Jacob 			if (rq->vwqe_ena) {
71319a2b549SJerin Jacob 				aq->rq_mask.vwqe_ena = ~aq->rq_mask.vwqe_ena;
71419a2b549SJerin Jacob 				aq->rq_mask.vwqe_skip = ~aq->rq_mask.vwqe_skip;
71519a2b549SJerin Jacob 				aq->rq_mask.max_vsize_exp =
71619a2b549SJerin Jacob 					~aq->rq_mask.max_vsize_exp;
71719a2b549SJerin Jacob 				aq->rq_mask.vtime_wait =
71819a2b549SJerin Jacob 					~aq->rq_mask.vtime_wait;
71919a2b549SJerin Jacob 				aq->rq_mask.wqe_aura = ~aq->rq_mask.wqe_aura;
72019a2b549SJerin Jacob 			}
72119a2b549SJerin Jacob 		} else {
72219a2b549SJerin Jacob 			/* CQ mode */
72319a2b549SJerin Jacob 			aq->rq_mask.sso_ena = ~aq->rq_mask.sso_ena;
72419a2b549SJerin Jacob 			aq->rq_mask.good_utag = ~aq->rq_mask.good_utag;
72519a2b549SJerin Jacob 			aq->rq_mask.bad_utag = ~aq->rq_mask.bad_utag;
72619a2b549SJerin Jacob 			aq->rq_mask.ltag = ~aq->rq_mask.ltag;
72719a2b549SJerin Jacob 			aq->rq_mask.cq = ~aq->rq_mask.cq;
72819a2b549SJerin Jacob 		}
72919a2b549SJerin Jacob 
73019a2b549SJerin Jacob 		if (rq->ipsech_ena)
73119a2b549SJerin Jacob 			aq->rq_mask.ipsech_ena = ~aq->rq_mask.ipsech_ena;
73219a2b549SJerin Jacob 
73319a2b549SJerin Jacob 		if (rq->spb_ena) {
73419a2b549SJerin Jacob 			aq->rq_mask.spb_aura = ~aq->rq_mask.spb_aura;
73519a2b549SJerin Jacob 			aq->rq_mask.spb_sizem1 = ~aq->rq_mask.spb_sizem1;
73619a2b549SJerin Jacob 			aq->rq_mask.spb_high_sizem1 =
73719a2b549SJerin Jacob 				~aq->rq_mask.spb_high_sizem1;
73819a2b549SJerin Jacob 		}
73919a2b549SJerin Jacob 
74019a2b549SJerin Jacob 		aq->rq_mask.spb_ena = ~aq->rq_mask.spb_ena;
74119a2b549SJerin Jacob 		aq->rq_mask.lpb_aura = ~aq->rq_mask.lpb_aura;
74219a2b549SJerin Jacob 		aq->rq_mask.first_skip = ~aq->rq_mask.first_skip;
74319a2b549SJerin Jacob 		aq->rq_mask.later_skip = ~aq->rq_mask.later_skip;
74419a2b549SJerin Jacob 		aq->rq_mask.flow_tagw = ~aq->rq_mask.flow_tagw;
74519a2b549SJerin Jacob 		aq->rq_mask.lpb_sizem1 = ~aq->rq_mask.lpb_sizem1;
74619a2b549SJerin Jacob 		aq->rq_mask.ena = ~aq->rq_mask.ena;
74719a2b549SJerin Jacob 		aq->rq_mask.pb_caching = ~aq->rq_mask.pb_caching;
74819a2b549SJerin Jacob 		aq->rq_mask.xqe_imm_size = ~aq->rq_mask.xqe_imm_size;
74919a2b549SJerin Jacob 		aq->rq_mask.rq_int_ena = ~aq->rq_mask.rq_int_ena;
75019a2b549SJerin Jacob 		aq->rq_mask.qint_idx = ~aq->rq_mask.qint_idx;
75119a2b549SJerin Jacob 		aq->rq_mask.xqe_drop_ena = ~aq->rq_mask.xqe_drop_ena;
752c8c967e1SNithin Dabilpuram 		aq->rq_mask.lpb_drop_ena = ~aq->rq_mask.lpb_drop_ena;
753c8c967e1SNithin Dabilpuram 		aq->rq_mask.spb_drop_ena = ~aq->rq_mask.spb_drop_ena;
75495bec117SSatha Rao 
75595bec117SSatha Rao 		if (rq->red_pass && (rq->red_pass >= rq->red_drop)) {
75695bec117SSatha Rao 			aq->rq_mask.spb_pool_pass = ~aq->rq_mask.spb_pool_pass;
75795bec117SSatha Rao 			aq->rq_mask.lpb_pool_pass = ~aq->rq_mask.lpb_pool_pass;
75895bec117SSatha Rao 			aq->rq_mask.wqe_pool_pass = ~aq->rq_mask.wqe_pool_pass;
75995bec117SSatha Rao 			aq->rq_mask.xqe_pass = ~aq->rq_mask.xqe_pass;
76095bec117SSatha Rao 
76195bec117SSatha Rao 			aq->rq_mask.spb_pool_drop = ~aq->rq_mask.spb_pool_drop;
76295bec117SSatha Rao 			aq->rq_mask.lpb_pool_drop = ~aq->rq_mask.lpb_pool_drop;
76395bec117SSatha Rao 			aq->rq_mask.wqe_pool_drop = ~aq->rq_mask.wqe_pool_drop;
76495bec117SSatha Rao 			aq->rq_mask.xqe_drop = ~aq->rq_mask.xqe_drop;
76595bec117SSatha Rao 		}
76619a2b549SJerin Jacob 	}
76719a2b549SJerin Jacob 
76819a2b549SJerin Jacob 	return 0;
76919a2b549SJerin Jacob }
77019a2b549SJerin Jacob 
77119a2b549SJerin Jacob int
7724785c406SSatha Rao nix_rq_cfg(struct dev *dev, struct roc_nix_rq *rq, uint16_t qints, bool cfg, bool ena)
7734785c406SSatha Rao {
7744785c406SSatha Rao 	struct nix_cn20k_aq_enq_req *aq;
7754785c406SSatha Rao 	struct mbox *mbox = dev->mbox;
7764785c406SSatha Rao 
7774785c406SSatha Rao 	aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox);
7784785c406SSatha Rao 	if (!aq)
7794785c406SSatha Rao 		return -ENOSPC;
7804785c406SSatha Rao 
7814785c406SSatha Rao 	aq->qidx = rq->qid;
7824785c406SSatha Rao 	aq->ctype = NIX_AQ_CTYPE_RQ;
7834785c406SSatha Rao 	aq->op = cfg ? NIX_AQ_INSTOP_WRITE : NIX_AQ_INSTOP_INIT;
7844785c406SSatha Rao 
7854785c406SSatha Rao 	if (rq->sso_ena) {
7864785c406SSatha Rao 		/* SSO mode */
7874785c406SSatha Rao 		aq->rq.sso_ena = 1;
7884785c406SSatha Rao 		aq->rq.sso_tt = rq->tt;
7894785c406SSatha Rao 		aq->rq.sso_grp = rq->hwgrp;
7904785c406SSatha Rao 		aq->rq.ena_wqwd = 1;
7914785c406SSatha Rao 		aq->rq.wqe_skip = rq->wqe_skip;
7924785c406SSatha Rao 		aq->rq.wqe_caching = 1;
7934785c406SSatha Rao 
7944785c406SSatha Rao 		aq->rq.good_utag = rq->tag_mask >> 24;
7954785c406SSatha Rao 		aq->rq.bad_utag = rq->tag_mask >> 24;
7964785c406SSatha Rao 		aq->rq.ltag = rq->tag_mask & BITMASK_ULL(24, 0);
7974785c406SSatha Rao 	} else {
7984785c406SSatha Rao 		/* CQ mode */
7994785c406SSatha Rao 		aq->rq.sso_ena = 0;
8004785c406SSatha Rao 		aq->rq.good_utag = rq->tag_mask >> 24;
8014785c406SSatha Rao 		aq->rq.bad_utag = rq->tag_mask >> 24;
8024785c406SSatha Rao 		aq->rq.ltag = rq->tag_mask & BITMASK_ULL(24, 0);
8034785c406SSatha Rao 		aq->rq.cq = rq->cqid;
8044785c406SSatha Rao 	}
8054785c406SSatha Rao 
8064785c406SSatha Rao 	if (rq->ipsech_ena) {
8074785c406SSatha Rao 		aq->rq.ipsech_ena = 1;
8084785c406SSatha Rao 		aq->rq.ipsecd_drop_en = 1;
8094785c406SSatha Rao 		aq->rq.ena_wqwd = 1;
8104785c406SSatha Rao 		aq->rq.wqe_skip = rq->wqe_skip;
8114785c406SSatha Rao 		aq->rq.wqe_caching = 1;
8124785c406SSatha Rao 	}
8134785c406SSatha Rao 
8144785c406SSatha Rao 	aq->rq.lpb_aura = roc_npa_aura_handle_to_aura(rq->aura_handle);
8154785c406SSatha Rao 
8164785c406SSatha Rao 	/* Sizes must be aligned to 8 bytes */
8174785c406SSatha Rao 	if (rq->first_skip & 0x7 || rq->later_skip & 0x7 || rq->lpb_size & 0x7)
8184785c406SSatha Rao 		return -EINVAL;
8194785c406SSatha Rao 
8204785c406SSatha Rao 	/* Expressed in number of dwords */
8214785c406SSatha Rao 	aq->rq.first_skip = rq->first_skip / 8;
8224785c406SSatha Rao 	aq->rq.later_skip = rq->later_skip / 8;
8234785c406SSatha Rao 	aq->rq.flow_tagw = rq->flow_tag_width; /* 32-bits */
8244785c406SSatha Rao 	aq->rq.lpb_sizem1 = rq->lpb_size / 8;
8254785c406SSatha Rao 	aq->rq.lpb_sizem1 -= 1; /* Expressed in size minus one */
8264785c406SSatha Rao 	aq->rq.ena = ena;
8274785c406SSatha Rao 
8284785c406SSatha Rao 	if (rq->spb_ena) {
8294785c406SSatha Rao 		uint32_t spb_sizem1;
8304785c406SSatha Rao 
8314785c406SSatha Rao 		aq->rq.spb_ena = 1;
8324785c406SSatha Rao 		aq->rq.spb_aura =
8334785c406SSatha Rao 			roc_npa_aura_handle_to_aura(rq->spb_aura_handle);
8344785c406SSatha Rao 
8354785c406SSatha Rao 		if (rq->spb_size & 0x7 ||
8364785c406SSatha Rao 		    rq->spb_size > NIX_RQ_CN10K_SPB_MAX_SIZE)
8374785c406SSatha Rao 			return -EINVAL;
8384785c406SSatha Rao 
8394785c406SSatha Rao 		spb_sizem1 = rq->spb_size / 8; /* Expressed in no. of dwords */
8404785c406SSatha Rao 		spb_sizem1 -= 1;	       /* Expressed in size minus one */
8414785c406SSatha Rao 		aq->rq.spb_sizem1 = spb_sizem1 & 0x3F;
8424785c406SSatha Rao 		aq->rq.spb_high_sizem1 = (spb_sizem1 >> 6) & 0x7;
8434785c406SSatha Rao 	} else {
8444785c406SSatha Rao 		aq->rq.spb_ena = 0;
8454785c406SSatha Rao 	}
8464785c406SSatha Rao 
8474785c406SSatha Rao 	aq->rq.pb_caching = 0x2; /* First cache aligned block to LLC */
8484785c406SSatha Rao 	aq->rq.xqe_imm_size = 0; /* No pkt data copy to CQE */
8494785c406SSatha Rao 	aq->rq.rq_int_ena = 0;
8504785c406SSatha Rao 	/* Many to one reduction */
8514785c406SSatha Rao 	aq->rq.qint_idx = rq->qid % qints;
8524785c406SSatha Rao 	aq->rq.xqe_drop_ena = 0;
8534785c406SSatha Rao 	aq->rq.lpb_drop_ena = rq->lpb_drop_ena;
8544785c406SSatha Rao 	aq->rq.spb_drop_ena = rq->spb_drop_ena;
8554785c406SSatha Rao 
8564785c406SSatha Rao 	/* If RED enabled, then fill enable for all cases */
8574785c406SSatha Rao 	if (rq->red_pass && (rq->red_pass >= rq->red_drop)) {
8584785c406SSatha Rao 		aq->rq.spb_pool_pass = rq->spb_red_pass;
8594785c406SSatha Rao 		aq->rq.lpb_pool_pass = rq->red_pass;
8604785c406SSatha Rao 		aq->rq.wqe_pool_pass = rq->red_pass;
8614785c406SSatha Rao 		aq->rq.xqe_pass = rq->red_pass;
8624785c406SSatha Rao 
8634785c406SSatha Rao 		aq->rq.spb_pool_drop = rq->spb_red_drop;
8644785c406SSatha Rao 		aq->rq.lpb_pool_drop = rq->red_drop;
8654785c406SSatha Rao 		aq->rq.wqe_pool_drop = rq->red_drop;
8664785c406SSatha Rao 		aq->rq.xqe_drop = rq->red_drop;
8674785c406SSatha Rao 	}
8684785c406SSatha Rao 
8694785c406SSatha Rao 	if (cfg) {
8704785c406SSatha Rao 		if (rq->sso_ena) {
8714785c406SSatha Rao 			/* SSO mode */
8724785c406SSatha Rao 			aq->rq_mask.sso_ena = ~aq->rq_mask.sso_ena;
8734785c406SSatha Rao 			aq->rq_mask.sso_tt = ~aq->rq_mask.sso_tt;
8744785c406SSatha Rao 			aq->rq_mask.sso_grp = ~aq->rq_mask.sso_grp;
8754785c406SSatha Rao 			aq->rq_mask.ena_wqwd = ~aq->rq_mask.ena_wqwd;
8764785c406SSatha Rao 			aq->rq_mask.wqe_skip = ~aq->rq_mask.wqe_skip;
8774785c406SSatha Rao 			aq->rq_mask.wqe_caching = ~aq->rq_mask.wqe_caching;
8784785c406SSatha Rao 			aq->rq_mask.good_utag = ~aq->rq_mask.good_utag;
8794785c406SSatha Rao 			aq->rq_mask.bad_utag = ~aq->rq_mask.bad_utag;
8804785c406SSatha Rao 			aq->rq_mask.ltag = ~aq->rq_mask.ltag;
8814785c406SSatha Rao 		} else {
8824785c406SSatha Rao 			/* CQ mode */
8834785c406SSatha Rao 			aq->rq_mask.sso_ena = ~aq->rq_mask.sso_ena;
8844785c406SSatha Rao 			aq->rq_mask.good_utag = ~aq->rq_mask.good_utag;
8854785c406SSatha Rao 			aq->rq_mask.bad_utag = ~aq->rq_mask.bad_utag;
8864785c406SSatha Rao 			aq->rq_mask.ltag = ~aq->rq_mask.ltag;
8874785c406SSatha Rao 			aq->rq_mask.cq = ~aq->rq_mask.cq;
8884785c406SSatha Rao 		}
8894785c406SSatha Rao 
8904785c406SSatha Rao 		if (rq->ipsech_ena)
8914785c406SSatha Rao 			aq->rq_mask.ipsech_ena = ~aq->rq_mask.ipsech_ena;
8924785c406SSatha Rao 
8934785c406SSatha Rao 		if (rq->spb_ena) {
8944785c406SSatha Rao 			aq->rq_mask.spb_aura = ~aq->rq_mask.spb_aura;
8954785c406SSatha Rao 			aq->rq_mask.spb_sizem1 = ~aq->rq_mask.spb_sizem1;
8964785c406SSatha Rao 			aq->rq_mask.spb_high_sizem1 =
8974785c406SSatha Rao 				~aq->rq_mask.spb_high_sizem1;
8984785c406SSatha Rao 		}
8994785c406SSatha Rao 
9004785c406SSatha Rao 		aq->rq_mask.spb_ena = ~aq->rq_mask.spb_ena;
9014785c406SSatha Rao 		aq->rq_mask.lpb_aura = ~aq->rq_mask.lpb_aura;
9024785c406SSatha Rao 		aq->rq_mask.first_skip = ~aq->rq_mask.first_skip;
9034785c406SSatha Rao 		aq->rq_mask.later_skip = ~aq->rq_mask.later_skip;
9044785c406SSatha Rao 		aq->rq_mask.flow_tagw = ~aq->rq_mask.flow_tagw;
9054785c406SSatha Rao 		aq->rq_mask.lpb_sizem1 = ~aq->rq_mask.lpb_sizem1;
9064785c406SSatha Rao 		aq->rq_mask.ena = ~aq->rq_mask.ena;
9074785c406SSatha Rao 		aq->rq_mask.pb_caching = ~aq->rq_mask.pb_caching;
9084785c406SSatha Rao 		aq->rq_mask.xqe_imm_size = ~aq->rq_mask.xqe_imm_size;
9094785c406SSatha Rao 		aq->rq_mask.rq_int_ena = ~aq->rq_mask.rq_int_ena;
9104785c406SSatha Rao 		aq->rq_mask.qint_idx = ~aq->rq_mask.qint_idx;
9114785c406SSatha Rao 		aq->rq_mask.xqe_drop_ena = ~aq->rq_mask.xqe_drop_ena;
9124785c406SSatha Rao 		aq->rq_mask.lpb_drop_ena = ~aq->rq_mask.lpb_drop_ena;
9134785c406SSatha Rao 		aq->rq_mask.spb_drop_ena = ~aq->rq_mask.spb_drop_ena;
9144785c406SSatha Rao 
9154785c406SSatha Rao 		if (rq->red_pass && (rq->red_pass >= rq->red_drop)) {
9164785c406SSatha Rao 			aq->rq_mask.spb_pool_pass = ~aq->rq_mask.spb_pool_pass;
9174785c406SSatha Rao 			aq->rq_mask.lpb_pool_pass = ~aq->rq_mask.lpb_pool_pass;
9184785c406SSatha Rao 			aq->rq_mask.wqe_pool_pass = ~aq->rq_mask.wqe_pool_pass;
9194785c406SSatha Rao 			aq->rq_mask.xqe_pass = ~aq->rq_mask.xqe_pass;
9204785c406SSatha Rao 
9214785c406SSatha Rao 			aq->rq_mask.spb_pool_drop = ~aq->rq_mask.spb_pool_drop;
9224785c406SSatha Rao 			aq->rq_mask.lpb_pool_drop = ~aq->rq_mask.lpb_pool_drop;
9234785c406SSatha Rao 			aq->rq_mask.wqe_pool_drop = ~aq->rq_mask.wqe_pool_drop;
9244785c406SSatha Rao 			aq->rq_mask.xqe_drop = ~aq->rq_mask.xqe_drop;
9254785c406SSatha Rao 		}
9264785c406SSatha Rao 	}
9274785c406SSatha Rao 
9284785c406SSatha Rao 	return 0;
9294785c406SSatha Rao }
9304785c406SSatha Rao 
9314785c406SSatha Rao int
93219a2b549SJerin Jacob roc_nix_rq_init(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena)
93319a2b549SJerin Jacob {
93419a2b549SJerin Jacob 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
93544a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get((&nix->dev)->mbox);
93619a2b549SJerin Jacob 	bool is_cn9k = roc_model_is_cn9k();
93738b177feSNithin Dabilpuram 	struct dev *dev = &nix->dev;
93819a2b549SJerin Jacob 	int rc;
93919a2b549SJerin Jacob 
94044a9307cSRakesh Kudurumalla 	if (roc_nix == NULL || rq == NULL) {
94144a9307cSRakesh Kudurumalla 		mbox_put(mbox);
94219a2b549SJerin Jacob 		return NIX_ERR_PARAM;
94344a9307cSRakesh Kudurumalla 	}
94419a2b549SJerin Jacob 
94544a9307cSRakesh Kudurumalla 	if (rq->qid >= nix->nb_rx_queues) {
94644a9307cSRakesh Kudurumalla 		mbox_put(mbox);
94719a2b549SJerin Jacob 		return NIX_ERR_QUEUE_INVALID_RANGE;
94844a9307cSRakesh Kudurumalla 	}
94919a2b549SJerin Jacob 
95019a2b549SJerin Jacob 	rq->roc_nix = roc_nix;
95178fb5efeSNithin Dabilpuram 	rq->tc = ROC_NIX_PFC_CLASS_INVALID;
95219a2b549SJerin Jacob 
95319a2b549SJerin Jacob 	if (is_cn9k)
95438b177feSNithin Dabilpuram 		rc = nix_rq_cn9k_cfg(dev, rq, nix->qints, false, ena);
9554785c406SSatha Rao 	else if (roc_model_is_cn10k())
9564785c406SSatha Rao 		rc = nix_rq_cn10k_cfg(dev, rq, nix->qints, false, ena);
95719a2b549SJerin Jacob 	else
95838b177feSNithin Dabilpuram 		rc = nix_rq_cfg(dev, rq, nix->qints, false, ena);
95919a2b549SJerin Jacob 
96044a9307cSRakesh Kudurumalla 	if (rc) {
96144a9307cSRakesh Kudurumalla 		mbox_put(mbox);
96219a2b549SJerin Jacob 		return rc;
96344a9307cSRakesh Kudurumalla 	}
96419a2b549SJerin Jacob 
965af75aac7SGowrishankar Muthukrishnan 	rc = mbox_process(mbox);
96644a9307cSRakesh Kudurumalla 	if (rc) {
96744a9307cSRakesh Kudurumalla 		mbox_put(mbox);
968af75aac7SGowrishankar Muthukrishnan 		return rc;
96944a9307cSRakesh Kudurumalla 	}
97044a9307cSRakesh Kudurumalla 	mbox_put(mbox);
971af75aac7SGowrishankar Muthukrishnan 
972aaea4c74SNithin Dabilpuram 	/* Update aura buf type to indicate its use */
973aaea4c74SNithin Dabilpuram 	nix_rq_aura_buf_type_update(rq, true);
974aaea4c74SNithin Dabilpuram 
9750f3f3ad8SNithin Dabilpuram 	/* Check for meta aura if RQ is enabled */
9760f3f3ad8SNithin Dabilpuram 	if (ena && nix->need_meta_aura) {
9774fb24a62SRahul Bhansali 		rc = roc_nix_inl_meta_aura_check(roc_nix, rq);
9780f3f3ad8SNithin Dabilpuram 		if (rc)
9790f3f3ad8SNithin Dabilpuram 			return rc;
9800f3f3ad8SNithin Dabilpuram 	}
9810f3f3ad8SNithin Dabilpuram 
98278fb5efeSNithin Dabilpuram 	nix->rqs[rq->qid] = rq;
983af75aac7SGowrishankar Muthukrishnan 	return nix_tel_node_add_rq(rq);
98419a2b549SJerin Jacob }
98519a2b549SJerin Jacob 
98619a2b549SJerin Jacob int
98719a2b549SJerin Jacob roc_nix_rq_modify(struct roc_nix *roc_nix, struct roc_nix_rq *rq, bool ena)
98819a2b549SJerin Jacob {
98919a2b549SJerin Jacob 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
99044a9307cSRakesh Kudurumalla 	struct mbox *m_box = (&nix->dev)->mbox;
99119a2b549SJerin Jacob 	bool is_cn9k = roc_model_is_cn9k();
99238b177feSNithin Dabilpuram 	struct dev *dev = &nix->dev;
99344a9307cSRakesh Kudurumalla 	struct mbox *mbox;
99419a2b549SJerin Jacob 	int rc;
99519a2b549SJerin Jacob 
99619a2b549SJerin Jacob 	if (roc_nix == NULL || rq == NULL)
99719a2b549SJerin Jacob 		return NIX_ERR_PARAM;
99819a2b549SJerin Jacob 
99919a2b549SJerin Jacob 	if (rq->qid >= nix->nb_rx_queues)
100019a2b549SJerin Jacob 		return NIX_ERR_QUEUE_INVALID_RANGE;
100119a2b549SJerin Jacob 
1002aaea4c74SNithin Dabilpuram 	/* Clear attributes for existing aura's */
1003aaea4c74SNithin Dabilpuram 	nix_rq_aura_buf_type_update(rq, false);
1004aaea4c74SNithin Dabilpuram 
100519a2b549SJerin Jacob 	rq->roc_nix = roc_nix;
100678fb5efeSNithin Dabilpuram 	rq->tc = ROC_NIX_PFC_CLASS_INVALID;
100719a2b549SJerin Jacob 
100844a9307cSRakesh Kudurumalla 	mbox = mbox_get(m_box);
100919a2b549SJerin Jacob 	if (is_cn9k)
101038b177feSNithin Dabilpuram 		rc = nix_rq_cn9k_cfg(dev, rq, nix->qints, true, ena);
10114785c406SSatha Rao 	else if (roc_model_is_cn10k())
10124785c406SSatha Rao 		rc = nix_rq_cn10k_cfg(dev, rq, nix->qints, true, ena);
101319a2b549SJerin Jacob 	else
101438b177feSNithin Dabilpuram 		rc = nix_rq_cfg(dev, rq, nix->qints, true, ena);
101519a2b549SJerin Jacob 
101644a9307cSRakesh Kudurumalla 	if (rc) {
101744a9307cSRakesh Kudurumalla 		mbox_put(mbox);
101819a2b549SJerin Jacob 		return rc;
101944a9307cSRakesh Kudurumalla 	}
102019a2b549SJerin Jacob 
1021af75aac7SGowrishankar Muthukrishnan 	rc = mbox_process(mbox);
102244a9307cSRakesh Kudurumalla 	if (rc) {
102344a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1024af75aac7SGowrishankar Muthukrishnan 		return rc;
102544a9307cSRakesh Kudurumalla 	}
102644a9307cSRakesh Kudurumalla 	mbox_put(mbox);
1027af75aac7SGowrishankar Muthukrishnan 
1028aaea4c74SNithin Dabilpuram 	/* Update aura attribute to indicate its use */
1029aaea4c74SNithin Dabilpuram 	nix_rq_aura_buf_type_update(rq, true);
1030aaea4c74SNithin Dabilpuram 
10310f3f3ad8SNithin Dabilpuram 	/* Check for meta aura if RQ is enabled */
10320f3f3ad8SNithin Dabilpuram 	if (ena && nix->need_meta_aura) {
10334fb24a62SRahul Bhansali 		rc = roc_nix_inl_meta_aura_check(roc_nix, rq);
10340f3f3ad8SNithin Dabilpuram 		if (rc)
10350f3f3ad8SNithin Dabilpuram 			return rc;
10360f3f3ad8SNithin Dabilpuram 	}
10370f3f3ad8SNithin Dabilpuram 
1038af75aac7SGowrishankar Muthukrishnan 	return nix_tel_node_add_rq(rq);
103919a2b549SJerin Jacob }
104019a2b549SJerin Jacob 
104119a2b549SJerin Jacob int
10425df46167SSunil Kumar Kori roc_nix_rq_cman_config(struct roc_nix *roc_nix, struct roc_nix_rq *rq)
10435df46167SSunil Kumar Kori {
10445df46167SSunil Kumar Kori 	bool is_cn9k = roc_model_is_cn9k();
10455df46167SSunil Kumar Kori 	struct nix *nix;
10465df46167SSunil Kumar Kori 	struct dev *dev;
10475df46167SSunil Kumar Kori 	int rc;
10485df46167SSunil Kumar Kori 
10495df46167SSunil Kumar Kori 	if (roc_nix == NULL || rq == NULL)
10505df46167SSunil Kumar Kori 		return NIX_ERR_PARAM;
10515df46167SSunil Kumar Kori 
10525df46167SSunil Kumar Kori 	nix = roc_nix_to_nix_priv(roc_nix);
10535df46167SSunil Kumar Kori 
10545df46167SSunil Kumar Kori 	if (rq->qid >= nix->nb_rx_queues)
10555df46167SSunil Kumar Kori 		return NIX_ERR_QUEUE_INVALID_RANGE;
10565df46167SSunil Kumar Kori 
10575df46167SSunil Kumar Kori 	dev = &nix->dev;
10585df46167SSunil Kumar Kori 
10595df46167SSunil Kumar Kori 	if (is_cn9k)
10605df46167SSunil Kumar Kori 		rc = nix_rq_cn9k_cman_cfg(dev, rq);
1061*43e42816SSatha Rao 	else if (roc_model_is_cn10k())
1062*43e42816SSatha Rao 		rc = nix_rq_cn10k_cman_cfg(dev, rq);
10635df46167SSunil Kumar Kori 	else
10645df46167SSunil Kumar Kori 		rc = nix_rq_cman_cfg(dev, rq);
10655df46167SSunil Kumar Kori 
10665df46167SSunil Kumar Kori 	return rc;
10675df46167SSunil Kumar Kori }
10685df46167SSunil Kumar Kori 
10695df46167SSunil Kumar Kori int
107019a2b549SJerin Jacob roc_nix_rq_fini(struct roc_nix_rq *rq)
107119a2b549SJerin Jacob {
107278fb5efeSNithin Dabilpuram 	struct nix *nix = roc_nix_to_nix_priv(rq->roc_nix);
1073aaea4c74SNithin Dabilpuram 	int rc;
1074aaea4c74SNithin Dabilpuram 
107519a2b549SJerin Jacob 	/* Disabling RQ is sufficient */
1076aaea4c74SNithin Dabilpuram 	rc = roc_nix_rq_ena_dis(rq, false);
1077aaea4c74SNithin Dabilpuram 	if (rc)
1078aaea4c74SNithin Dabilpuram 		return rc;
1079aaea4c74SNithin Dabilpuram 
1080aaea4c74SNithin Dabilpuram 	/* Update aura attribute to indicate its use for */
1081aaea4c74SNithin Dabilpuram 	nix_rq_aura_buf_type_update(rq, false);
108278fb5efeSNithin Dabilpuram 
108378fb5efeSNithin Dabilpuram 	nix->rqs[rq->qid] = NULL;
1084aaea4c74SNithin Dabilpuram 	return 0;
108519a2b549SJerin Jacob }
108619a2b549SJerin Jacob 
10874785c406SSatha Rao static inline int
10884785c406SSatha Rao roc_nix_cn20k_cq_init(struct roc_nix *roc_nix, struct roc_nix_cq *cq)
10894785c406SSatha Rao {
10904785c406SSatha Rao 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
10914785c406SSatha Rao 	struct mbox *mbox = (&nix->dev)->mbox;
10924785c406SSatha Rao 	volatile struct nix_cn20k_cq_ctx_s *cq_ctx;
10934785c406SSatha Rao 	uint16_t drop_thresh = NIX_CQ_THRESH_LEVEL;
10944785c406SSatha Rao 	uint16_t cpt_lbpid = nix->cpt_lbpid;
10954785c406SSatha Rao 	struct nix_cn20k_aq_enq_req *aq;
10964785c406SSatha Rao 	enum nix_q_size qsize;
10974785c406SSatha Rao 	size_t desc_sz;
10984785c406SSatha Rao 	int rc;
10994785c406SSatha Rao 
11004785c406SSatha Rao 	if (cq == NULL)
11014785c406SSatha Rao 		return NIX_ERR_PARAM;
11024785c406SSatha Rao 
11034785c406SSatha Rao 	qsize = nix_qsize_clampup(cq->nb_desc);
11044785c406SSatha Rao 	cq->nb_desc = nix_qsize_to_val(qsize);
11054785c406SSatha Rao 	cq->qmask = cq->nb_desc - 1;
11064785c406SSatha Rao 	cq->door = nix->base + NIX_LF_CQ_OP_DOOR;
11074785c406SSatha Rao 	cq->status = (int64_t *)(nix->base + NIX_LF_CQ_OP_STATUS);
11084785c406SSatha Rao 	cq->wdata = (uint64_t)cq->qid << 32;
11094785c406SSatha Rao 	cq->roc_nix = roc_nix;
11104785c406SSatha Rao 
11114785c406SSatha Rao 	/* CQE of W16 */
11124785c406SSatha Rao 	desc_sz = cq->nb_desc * NIX_CQ_ENTRY_SZ;
11134785c406SSatha Rao 	cq->desc_base = plt_zmalloc(desc_sz, NIX_CQ_ALIGN);
11144785c406SSatha Rao 	if (cq->desc_base == NULL) {
11154785c406SSatha Rao 		rc = NIX_ERR_NO_MEM;
11164785c406SSatha Rao 		goto fail;
11174785c406SSatha Rao 	}
11184785c406SSatha Rao 
11194785c406SSatha Rao 	aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox_get(mbox));
11204785c406SSatha Rao 	if (!aq) {
11214785c406SSatha Rao 		mbox_put(mbox);
11224785c406SSatha Rao 		return -ENOSPC;
11234785c406SSatha Rao 	}
11244785c406SSatha Rao 
11254785c406SSatha Rao 	aq->qidx = cq->qid;
11264785c406SSatha Rao 	aq->ctype = NIX_AQ_CTYPE_CQ;
11274785c406SSatha Rao 	aq->op = NIX_AQ_INSTOP_INIT;
11284785c406SSatha Rao 	cq_ctx = &aq->cq;
11294785c406SSatha Rao 
11304785c406SSatha Rao 	cq_ctx->ena = 1;
11314785c406SSatha Rao 	cq_ctx->caching = 1;
11324785c406SSatha Rao 	cq_ctx->qsize = qsize;
11334785c406SSatha Rao 	cq_ctx->base = (uint64_t)cq->desc_base;
11344785c406SSatha Rao 	cq_ctx->avg_level = 0xff;
11354785c406SSatha Rao 	cq_ctx->cq_err_int_ena = BIT(NIX_CQERRINT_CQE_FAULT);
11364785c406SSatha Rao 	cq_ctx->cq_err_int_ena |= BIT(NIX_CQERRINT_DOOR_ERR);
11374785c406SSatha Rao 	if (roc_feature_nix_has_late_bp() && roc_nix_inl_inb_is_enabled(roc_nix)) {
11384785c406SSatha Rao 		cq_ctx->cq_err_int_ena |= BIT(NIX_CQERRINT_CPT_DROP);
11394785c406SSatha Rao 		cq_ctx->cpt_drop_err_en = 1;
11404785c406SSatha Rao 		/* Enable Late BP only when non zero CPT BPID */
11414785c406SSatha Rao 		if (cpt_lbpid) {
11424785c406SSatha Rao 			cq_ctx->lbp_ena = 1;
11434785c406SSatha Rao 			cq_ctx->lbpid_low = cpt_lbpid & 0x7;
11444785c406SSatha Rao 			cq_ctx->lbpid_med = (cpt_lbpid >> 3) & 0x7;
11454785c406SSatha Rao 			cq_ctx->lbpid_high = (cpt_lbpid >> 6) & 0x7;
11464785c406SSatha Rao 			cq_ctx->lbp_frac = NIX_CQ_LPB_THRESH_FRAC;
11474785c406SSatha Rao 		}
11484785c406SSatha Rao 		drop_thresh = NIX_CQ_SEC_THRESH_LEVEL;
11494785c406SSatha Rao 	}
11504785c406SSatha Rao 
11514785c406SSatha Rao 	/* Many to one reduction */
11524785c406SSatha Rao 	cq_ctx->qint_idx = cq->qid % nix->qints;
11534785c406SSatha Rao 	/* Map CQ0 [RQ0] to CINT0 and so on till max 64 irqs */
11544785c406SSatha Rao 	cq_ctx->cint_idx = cq->qid;
11554785c406SSatha Rao 
11564785c406SSatha Rao 	if (roc_errata_nix_has_cq_min_size_4k()) {
11574785c406SSatha Rao 		const float rx_cq_skid = NIX_CQ_FULL_ERRATA_SKID;
11584785c406SSatha Rao 		uint16_t min_rx_drop;
11594785c406SSatha Rao 
11604785c406SSatha Rao 		min_rx_drop = ceil(rx_cq_skid / (float)cq->nb_desc);
11614785c406SSatha Rao 		cq_ctx->drop = min_rx_drop;
11624785c406SSatha Rao 		cq_ctx->drop_ena = 1;
11634785c406SSatha Rao 		cq->drop_thresh = min_rx_drop;
11644785c406SSatha Rao 	} else {
11654785c406SSatha Rao 		cq->drop_thresh = drop_thresh;
11664785c406SSatha Rao 		/* Drop processing or red drop cannot be enabled due to
11674785c406SSatha Rao 		 * due to packets coming for second pass from CPT.
11684785c406SSatha Rao 		 */
11694785c406SSatha Rao 		if (!roc_nix_inl_inb_is_enabled(roc_nix)) {
11704785c406SSatha Rao 			cq_ctx->drop = cq->drop_thresh;
11714785c406SSatha Rao 			cq_ctx->drop_ena = 1;
11724785c406SSatha Rao 		}
11734785c406SSatha Rao 	}
11744785c406SSatha Rao 	cq_ctx->bp = cq->drop_thresh;
11754785c406SSatha Rao 
11764785c406SSatha Rao 	if (roc_feature_nix_has_cqe_stash()) {
11774785c406SSatha Rao 		if (cq_ctx->caching) {
11784785c406SSatha Rao 			cq_ctx->stashing = 1;
11794785c406SSatha Rao 			cq_ctx->stash_thresh = cq->stash_thresh;
11804785c406SSatha Rao 		}
11814785c406SSatha Rao 	}
11824785c406SSatha Rao 
11834785c406SSatha Rao 	rc = mbox_process(mbox);
11844785c406SSatha Rao 	mbox_put(mbox);
11854785c406SSatha Rao 	if (rc)
11864785c406SSatha Rao 		goto free_mem;
11874785c406SSatha Rao 
11884785c406SSatha Rao 	return nix_tel_node_add_cq(cq);
11894785c406SSatha Rao 
11904785c406SSatha Rao free_mem:
11914785c406SSatha Rao 	plt_free(cq->desc_base);
11924785c406SSatha Rao fail:
11934785c406SSatha Rao 	return rc;
11944785c406SSatha Rao }
11954785c406SSatha Rao 
119619a2b549SJerin Jacob int
119719a2b549SJerin Jacob roc_nix_cq_init(struct roc_nix *roc_nix, struct roc_nix_cq *cq)
119819a2b549SJerin Jacob {
119919a2b549SJerin Jacob 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
120019a2b549SJerin Jacob 	struct mbox *mbox = (&nix->dev)->mbox;
12014785c406SSatha Rao 	volatile struct nix_cq_ctx_s *cq_ctx = NULL;
12028bc924cfSNithin Dabilpuram 	uint16_t drop_thresh = NIX_CQ_THRESH_LEVEL;
120381164c05SSatha Rao 	uint16_t cpt_lbpid = nix->cpt_lbpid;
120419a2b549SJerin Jacob 	enum nix_q_size qsize;
120519a2b549SJerin Jacob 	size_t desc_sz;
120619a2b549SJerin Jacob 	int rc;
120719a2b549SJerin Jacob 
120819a2b549SJerin Jacob 	if (cq == NULL)
120919a2b549SJerin Jacob 		return NIX_ERR_PARAM;
121019a2b549SJerin Jacob 
12114785c406SSatha Rao 	if (roc_model_is_cn20k())
12124785c406SSatha Rao 		return roc_nix_cn20k_cq_init(roc_nix, cq);
12134785c406SSatha Rao 
121419a2b549SJerin Jacob 	qsize = nix_qsize_clampup(cq->nb_desc);
121519a2b549SJerin Jacob 	cq->nb_desc = nix_qsize_to_val(qsize);
121619a2b549SJerin Jacob 	cq->qmask = cq->nb_desc - 1;
121719a2b549SJerin Jacob 	cq->door = nix->base + NIX_LF_CQ_OP_DOOR;
121819a2b549SJerin Jacob 	cq->status = (int64_t *)(nix->base + NIX_LF_CQ_OP_STATUS);
121919a2b549SJerin Jacob 	cq->wdata = (uint64_t)cq->qid << 32;
122019a2b549SJerin Jacob 	cq->roc_nix = roc_nix;
122119a2b549SJerin Jacob 
122219a2b549SJerin Jacob 	/* CQE of W16 */
122319a2b549SJerin Jacob 	desc_sz = cq->nb_desc * NIX_CQ_ENTRY_SZ;
122419a2b549SJerin Jacob 	cq->desc_base = plt_zmalloc(desc_sz, NIX_CQ_ALIGN);
122519a2b549SJerin Jacob 	if (cq->desc_base == NULL) {
122619a2b549SJerin Jacob 		rc = NIX_ERR_NO_MEM;
122719a2b549SJerin Jacob 		goto fail;
122819a2b549SJerin Jacob 	}
122919a2b549SJerin Jacob 
123019a2b549SJerin Jacob 	if (roc_model_is_cn9k()) {
123119a2b549SJerin Jacob 		struct nix_aq_enq_req *aq;
123219a2b549SJerin Jacob 
123344a9307cSRakesh Kudurumalla 		aq = mbox_alloc_msg_nix_aq_enq(mbox_get(mbox));
123444a9307cSRakesh Kudurumalla 		if (!aq) {
123544a9307cSRakesh Kudurumalla 			mbox_put(mbox);
1236da718c19SNithin Dabilpuram 			return -ENOSPC;
123744a9307cSRakesh Kudurumalla 		}
1238da718c19SNithin Dabilpuram 
123919a2b549SJerin Jacob 		aq->qidx = cq->qid;
124019a2b549SJerin Jacob 		aq->ctype = NIX_AQ_CTYPE_CQ;
124119a2b549SJerin Jacob 		aq->op = NIX_AQ_INSTOP_INIT;
124219a2b549SJerin Jacob 		cq_ctx = &aq->cq;
12434785c406SSatha Rao 	} else if (roc_model_is_cn10k()) {
124419a2b549SJerin Jacob 		struct nix_cn10k_aq_enq_req *aq;
124519a2b549SJerin Jacob 
124644a9307cSRakesh Kudurumalla 		aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox_get(mbox));
124744a9307cSRakesh Kudurumalla 		if (!aq) {
124844a9307cSRakesh Kudurumalla 			mbox_put(mbox);
1249da718c19SNithin Dabilpuram 			return -ENOSPC;
125044a9307cSRakesh Kudurumalla 		}
1251da718c19SNithin Dabilpuram 
125219a2b549SJerin Jacob 		aq->qidx = cq->qid;
125319a2b549SJerin Jacob 		aq->ctype = NIX_AQ_CTYPE_CQ;
125419a2b549SJerin Jacob 		aq->op = NIX_AQ_INSTOP_INIT;
125519a2b549SJerin Jacob 		cq_ctx = &aq->cq;
125619a2b549SJerin Jacob 	}
125719a2b549SJerin Jacob 
125819a2b549SJerin Jacob 	cq_ctx->ena = 1;
125919a2b549SJerin Jacob 	cq_ctx->caching = 1;
126019a2b549SJerin Jacob 	cq_ctx->qsize = qsize;
126119a2b549SJerin Jacob 	cq_ctx->base = (uint64_t)cq->desc_base;
126219a2b549SJerin Jacob 	cq_ctx->avg_level = 0xff;
126319a2b549SJerin Jacob 	cq_ctx->cq_err_int_ena = BIT(NIX_CQERRINT_CQE_FAULT);
126419a2b549SJerin Jacob 	cq_ctx->cq_err_int_ena |= BIT(NIX_CQERRINT_DOOR_ERR);
1265d2f168dfSNithin Dabilpuram 	if (roc_feature_nix_has_late_bp() && roc_nix_inl_inb_is_enabled(roc_nix)) {
12668bc924cfSNithin Dabilpuram 		cq_ctx->cq_err_int_ena |= BIT(NIX_CQERRINT_CPT_DROP);
12678bc924cfSNithin Dabilpuram 		cq_ctx->cpt_drop_err_en = 1;
126881164c05SSatha Rao 		/* Enable Late BP only when non zero CPT BPID */
126981164c05SSatha Rao 		if (cpt_lbpid) {
12708bc924cfSNithin Dabilpuram 			cq_ctx->lbp_ena = 1;
12718bc924cfSNithin Dabilpuram 			cq_ctx->lbpid_low = cpt_lbpid & 0x7;
12728bc924cfSNithin Dabilpuram 			cq_ctx->lbpid_med = (cpt_lbpid >> 3) & 0x7;
12738bc924cfSNithin Dabilpuram 			cq_ctx->lbpid_high = (cpt_lbpid >> 6) & 0x7;
12748bc924cfSNithin Dabilpuram 			cq_ctx->lbp_frac = NIX_CQ_LPB_THRESH_FRAC;
127581164c05SSatha Rao 		}
12768bc924cfSNithin Dabilpuram 		drop_thresh = NIX_CQ_SEC_THRESH_LEVEL;
12778bc924cfSNithin Dabilpuram 	}
127819a2b549SJerin Jacob 
127919a2b549SJerin Jacob 	/* Many to one reduction */
128019a2b549SJerin Jacob 	cq_ctx->qint_idx = cq->qid % nix->qints;
128119a2b549SJerin Jacob 	/* Map CQ0 [RQ0] to CINT0 and so on till max 64 irqs */
128219a2b549SJerin Jacob 	cq_ctx->cint_idx = cq->qid;
128319a2b549SJerin Jacob 
12841f997c06SRahul Bhansali 	if (roc_errata_nix_has_cq_min_size_4k()) {
1285b21f07c9SHarman Kalra 		const float rx_cq_skid = NIX_CQ_FULL_ERRATA_SKID;
1286b21f07c9SHarman Kalra 		uint16_t min_rx_drop;
1287b21f07c9SHarman Kalra 
1288b21f07c9SHarman Kalra 		min_rx_drop = ceil(rx_cq_skid / (float)cq->nb_desc);
1289b21f07c9SHarman Kalra 		cq_ctx->drop = min_rx_drop;
1290b21f07c9SHarman Kalra 		cq_ctx->drop_ena = 1;
1291b21f07c9SHarman Kalra 		cq->drop_thresh = min_rx_drop;
1292b21f07c9SHarman Kalra 	} else {
12938bc924cfSNithin Dabilpuram 		cq->drop_thresh = drop_thresh;
1294b4ea958bSNithin Dabilpuram 		/* Drop processing or red drop cannot be enabled due to
1295b4ea958bSNithin Dabilpuram 		 * due to packets coming for second pass from CPT.
1296b4ea958bSNithin Dabilpuram 		 */
1297b4ea958bSNithin Dabilpuram 		if (!roc_nix_inl_inb_is_enabled(roc_nix)) {
129819a2b549SJerin Jacob 			cq_ctx->drop = cq->drop_thresh;
129919a2b549SJerin Jacob 			cq_ctx->drop_ena = 1;
1300b21f07c9SHarman Kalra 		}
1301b4ea958bSNithin Dabilpuram 	}
1302d2f168dfSNithin Dabilpuram 	cq_ctx->bp = cq->drop_thresh;
130319a2b549SJerin Jacob 
1304e07ca13fSKommula Shiva Shankar 	if (roc_feature_nix_has_cqe_stash()) {
1305e07ca13fSKommula Shiva Shankar 		if (cq_ctx->caching) {
1306e07ca13fSKommula Shiva Shankar 			cq_ctx->stashing = 1;
1307e07ca13fSKommula Shiva Shankar 			cq_ctx->stash_thresh = cq->stash_thresh;
1308e07ca13fSKommula Shiva Shankar 		}
1309e07ca13fSKommula Shiva Shankar 	}
1310e07ca13fSKommula Shiva Shankar 
131119a2b549SJerin Jacob 	rc = mbox_process(mbox);
131244a9307cSRakesh Kudurumalla 	mbox_put(mbox);
131319a2b549SJerin Jacob 	if (rc)
131419a2b549SJerin Jacob 		goto free_mem;
131519a2b549SJerin Jacob 
1316af75aac7SGowrishankar Muthukrishnan 	return nix_tel_node_add_cq(cq);
131719a2b549SJerin Jacob 
131819a2b549SJerin Jacob free_mem:
131919a2b549SJerin Jacob 	plt_free(cq->desc_base);
132019a2b549SJerin Jacob fail:
132119a2b549SJerin Jacob 	return rc;
132219a2b549SJerin Jacob }
132319a2b549SJerin Jacob 
132419a2b549SJerin Jacob int
132519a2b549SJerin Jacob roc_nix_cq_fini(struct roc_nix_cq *cq)
132619a2b549SJerin Jacob {
132719a2b549SJerin Jacob 	struct mbox *mbox;
132819a2b549SJerin Jacob 	struct nix *nix;
132919a2b549SJerin Jacob 	int rc;
133019a2b549SJerin Jacob 
133119a2b549SJerin Jacob 	if (cq == NULL)
133219a2b549SJerin Jacob 		return NIX_ERR_PARAM;
133319a2b549SJerin Jacob 
133419a2b549SJerin Jacob 	nix = roc_nix_to_nix_priv(cq->roc_nix);
133544a9307cSRakesh Kudurumalla 	mbox = mbox_get((&nix->dev)->mbox);
133619a2b549SJerin Jacob 
133719a2b549SJerin Jacob 	/* Disable CQ */
133819a2b549SJerin Jacob 	if (roc_model_is_cn9k()) {
133919a2b549SJerin Jacob 		struct nix_aq_enq_req *aq;
134019a2b549SJerin Jacob 
134119a2b549SJerin Jacob 		aq = mbox_alloc_msg_nix_aq_enq(mbox);
134244a9307cSRakesh Kudurumalla 		if (!aq) {
134344a9307cSRakesh Kudurumalla 			mbox_put(mbox);
1344da718c19SNithin Dabilpuram 			return -ENOSPC;
134544a9307cSRakesh Kudurumalla 		}
1346da718c19SNithin Dabilpuram 
134719a2b549SJerin Jacob 		aq->qidx = cq->qid;
134819a2b549SJerin Jacob 		aq->ctype = NIX_AQ_CTYPE_CQ;
134919a2b549SJerin Jacob 		aq->op = NIX_AQ_INSTOP_WRITE;
135019a2b549SJerin Jacob 		aq->cq.ena = 0;
135119a2b549SJerin Jacob 		aq->cq.bp_ena = 0;
135219a2b549SJerin Jacob 		aq->cq_mask.ena = ~aq->cq_mask.ena;
135319a2b549SJerin Jacob 		aq->cq_mask.bp_ena = ~aq->cq_mask.bp_ena;
13544785c406SSatha Rao 	} else if (roc_model_is_cn10k()) {
135519a2b549SJerin Jacob 		struct nix_cn10k_aq_enq_req *aq;
135619a2b549SJerin Jacob 
135719a2b549SJerin Jacob 		aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
135844a9307cSRakesh Kudurumalla 		if (!aq) {
135944a9307cSRakesh Kudurumalla 			mbox_put(mbox);
1360da718c19SNithin Dabilpuram 			return -ENOSPC;
136144a9307cSRakesh Kudurumalla 		}
1362da718c19SNithin Dabilpuram 
136319a2b549SJerin Jacob 		aq->qidx = cq->qid;
136419a2b549SJerin Jacob 		aq->ctype = NIX_AQ_CTYPE_CQ;
136519a2b549SJerin Jacob 		aq->op = NIX_AQ_INSTOP_WRITE;
136619a2b549SJerin Jacob 		aq->cq.ena = 0;
136719a2b549SJerin Jacob 		aq->cq.bp_ena = 0;
136819a2b549SJerin Jacob 		aq->cq_mask.ena = ~aq->cq_mask.ena;
136919a2b549SJerin Jacob 		aq->cq_mask.bp_ena = ~aq->cq_mask.bp_ena;
1370d2f168dfSNithin Dabilpuram 		if (roc_feature_nix_has_late_bp() && roc_nix_inl_inb_is_enabled(cq->roc_nix)) {
137181164c05SSatha Rao 			aq->cq.lbp_ena = 0;
137281164c05SSatha Rao 			aq->cq_mask.lbp_ena = ~aq->cq_mask.lbp_ena;
137381164c05SSatha Rao 		}
13744785c406SSatha Rao 	} else {
13754785c406SSatha Rao 		struct nix_cn20k_aq_enq_req *aq;
13764785c406SSatha Rao 
13774785c406SSatha Rao 		aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox);
13784785c406SSatha Rao 		if (!aq) {
13794785c406SSatha Rao 			mbox_put(mbox);
13804785c406SSatha Rao 			return -ENOSPC;
13814785c406SSatha Rao 		}
13824785c406SSatha Rao 
13834785c406SSatha Rao 		aq->qidx = cq->qid;
13844785c406SSatha Rao 		aq->ctype = NIX_AQ_CTYPE_CQ;
13854785c406SSatha Rao 		aq->op = NIX_AQ_INSTOP_WRITE;
13864785c406SSatha Rao 		aq->cq.ena = 0;
13874785c406SSatha Rao 		aq->cq.bp_ena = 0;
13884785c406SSatha Rao 		aq->cq_mask.ena = ~aq->cq_mask.ena;
13894785c406SSatha Rao 		aq->cq_mask.bp_ena = ~aq->cq_mask.bp_ena;
13904785c406SSatha Rao 		if (roc_feature_nix_has_late_bp() && roc_nix_inl_inb_is_enabled(cq->roc_nix)) {
13914785c406SSatha Rao 			aq->cq.lbp_ena = 0;
13924785c406SSatha Rao 			aq->cq_mask.lbp_ena = ~aq->cq_mask.lbp_ena;
13934785c406SSatha Rao 		}
139419a2b549SJerin Jacob 	}
139519a2b549SJerin Jacob 
139619a2b549SJerin Jacob 	rc = mbox_process(mbox);
139744a9307cSRakesh Kudurumalla 	if (rc) {
139844a9307cSRakesh Kudurumalla 		mbox_put(mbox);
139919a2b549SJerin Jacob 		return rc;
140044a9307cSRakesh Kudurumalla 	}
140119a2b549SJerin Jacob 
140244a9307cSRakesh Kudurumalla 	mbox_put(mbox);
140319a2b549SJerin Jacob 	plt_free(cq->desc_base);
140419a2b549SJerin Jacob 	return 0;
140519a2b549SJerin Jacob }
1406ae060709SJerin Jacob 
1407ae060709SJerin Jacob static int
1408ae060709SJerin Jacob sqb_pool_populate(struct roc_nix *roc_nix, struct roc_nix_sq *sq)
1409ae060709SJerin Jacob {
1410ae060709SJerin Jacob 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
1411641e1024SSatha Rao 	uint16_t sqes_per_sqb, count, nb_sqb_bufs, thr;
1412ae060709SJerin Jacob 	struct npa_pool_s pool;
1413ae060709SJerin Jacob 	struct npa_aura_s aura;
1414ae060709SJerin Jacob 	uint64_t blk_sz;
1415ae060709SJerin Jacob 	uint64_t iova;
1416ae060709SJerin Jacob 	int rc;
1417ae060709SJerin Jacob 
1418ae060709SJerin Jacob 	blk_sz = nix->sqb_size;
1419ae060709SJerin Jacob 	if (sq->max_sqe_sz == roc_nix_maxsqesz_w16)
1420ae060709SJerin Jacob 		sqes_per_sqb = (blk_sz / 8) / 16;
1421ae060709SJerin Jacob 	else
1422ae060709SJerin Jacob 		sqes_per_sqb = (blk_sz / 8) / 8;
1423ae060709SJerin Jacob 
1424641e1024SSatha Rao 	/* Reserve One SQE in each SQB to hold pointer for next SQB */
1425641e1024SSatha Rao 	sqes_per_sqb -= 1;
1426641e1024SSatha Rao 
14271134d758SPavan Nikhilesh 	sq->nb_desc = PLT_MAX(512U, sq->nb_desc);
1428641e1024SSatha Rao 	nb_sqb_bufs = PLT_DIV_CEIL(sq->nb_desc, sqes_per_sqb);
1429641e1024SSatha Rao 	thr = PLT_DIV_CEIL((nb_sqb_bufs * ROC_NIX_SQB_THRESH), 100);
1430641e1024SSatha Rao 	nb_sqb_bufs += NIX_SQB_PREFETCH;
1431ae060709SJerin Jacob 	/* Clamp up the SQB count */
1432eac95048SSatha Rao 	nb_sqb_bufs = PLT_MAX(NIX_DEF_SQB, nb_sqb_bufs);
1433eac95048SSatha Rao 	nb_sqb_bufs = PLT_MIN(roc_nix->max_sqb_count, (uint16_t)nb_sqb_bufs);
1434ae060709SJerin Jacob 
1435ae060709SJerin Jacob 	sq->nb_sqb_bufs = nb_sqb_bufs;
1436ae060709SJerin Jacob 	sq->sqes_per_sqb_log2 = (uint16_t)plt_log2_u32(sqes_per_sqb);
1437641e1024SSatha Rao 	sq->nb_sqb_bufs_adj = nb_sqb_bufs;
1438ae060709SJerin Jacob 
1439cad8686eSSatha Rao 	if (roc_nix->sqb_slack)
1440cad8686eSSatha Rao 		nb_sqb_bufs += roc_nix->sqb_slack;
1441cad8686eSSatha Rao 	else
1442cad8686eSSatha Rao 		nb_sqb_bufs += PLT_MAX((int)thr, (int)ROC_NIX_SQB_SLACK_DFLT);
1443ae060709SJerin Jacob 	/* Explicitly set nat_align alone as by default pool is with both
1444ae060709SJerin Jacob 	 * nat_align and buf_offset = 1 which we don't want for SQB.
1445ae060709SJerin Jacob 	 */
1446ae060709SJerin Jacob 	memset(&pool, 0, sizeof(struct npa_pool_s));
1447ae060709SJerin Jacob 	pool.nat_align = 1;
1448ae060709SJerin Jacob 
1449ae060709SJerin Jacob 	memset(&aura, 0, sizeof(aura));
1450ae060709SJerin Jacob 	aura.fc_ena = 1;
14511f997c06SRahul Bhansali 	if (roc_model_is_cn9k() || roc_errata_npa_has_no_fc_stype_ststp())
1452dd9525a7SAshwin Sekhar T K 		aura.fc_stype = 0x0; /* STF */
1453dd9525a7SAshwin Sekhar T K 	else
1454dd9525a7SAshwin Sekhar T K 		aura.fc_stype = 0x3; /* STSTP */
1455ae060709SJerin Jacob 	aura.fc_addr = (uint64_t)sq->fc;
1456b714421eSSatha Rao 	aura.fc_hyst_bits = sq->fc_hyst_bits & 0xF;
1457b714421eSSatha Rao 	rc = roc_npa_pool_create(&sq->aura_handle, blk_sz, nb_sqb_bufs, &aura, &pool, 0);
1458ae060709SJerin Jacob 	if (rc)
1459ae060709SJerin Jacob 		goto fail;
1460ae060709SJerin Jacob 
1461aaea4c74SNithin Dabilpuram 	roc_npa_buf_type_update(sq->aura_handle, ROC_NPA_BUF_TYPE_SQB, 1);
14621134d758SPavan Nikhilesh 	sq->sqe_mem = plt_zmalloc(blk_sz * nb_sqb_bufs, blk_sz);
1463ae060709SJerin Jacob 	if (sq->sqe_mem == NULL) {
1464ae060709SJerin Jacob 		rc = NIX_ERR_NO_MEM;
1465ae060709SJerin Jacob 		goto nomem;
1466ae060709SJerin Jacob 	}
1467ae060709SJerin Jacob 
1468ae060709SJerin Jacob 	/* Fill the initial buffers */
1469ae060709SJerin Jacob 	iova = (uint64_t)sq->sqe_mem;
14701134d758SPavan Nikhilesh 	for (count = 0; count < nb_sqb_bufs; count++) {
1471ae060709SJerin Jacob 		roc_npa_aura_op_free(sq->aura_handle, 0, iova);
1472ae060709SJerin Jacob 		iova += blk_sz;
1473ae060709SJerin Jacob 	}
147472a6471aSAshwin Sekhar T K 
14751134d758SPavan Nikhilesh 	if (roc_npa_aura_op_available_wait(sq->aura_handle, nb_sqb_bufs, 0) !=
14761134d758SPavan Nikhilesh 	    nb_sqb_bufs) {
147772a6471aSAshwin Sekhar T K 		plt_err("Failed to free all pointers to the pool");
147872a6471aSAshwin Sekhar T K 		rc = NIX_ERR_NO_MEM;
147972a6471aSAshwin Sekhar T K 		goto npa_fail;
148072a6471aSAshwin Sekhar T K 	}
148172a6471aSAshwin Sekhar T K 
14820bdad505SAshwin Sekhar T K 	roc_npa_pool_op_range_set(sq->aura_handle, (uint64_t)sq->sqe_mem, iova);
14831134d758SPavan Nikhilesh 	roc_npa_aura_limit_modify(sq->aura_handle, nb_sqb_bufs);
14841134d758SPavan Nikhilesh 	sq->aura_sqb_bufs = nb_sqb_bufs;
1485ae060709SJerin Jacob 
1486ae060709SJerin Jacob 	return rc;
148772a6471aSAshwin Sekhar T K npa_fail:
148872a6471aSAshwin Sekhar T K 	plt_free(sq->sqe_mem);
1489ae060709SJerin Jacob nomem:
1490ae060709SJerin Jacob 	roc_npa_pool_destroy(sq->aura_handle);
1491ae060709SJerin Jacob fail:
1492ae060709SJerin Jacob 	return rc;
1493ae060709SJerin Jacob }
1494ae060709SJerin Jacob 
1495da718c19SNithin Dabilpuram static int
1496ae060709SJerin Jacob sq_cn9k_init(struct nix *nix, struct roc_nix_sq *sq, uint32_t rr_quantum,
1497ae060709SJerin Jacob 	     uint16_t smq)
1498ae060709SJerin Jacob {
149928b283faSSubrahmanyam Nilla 	struct roc_nix *roc_nix = nix_priv_to_roc_nix(nix);
1500ae060709SJerin Jacob 	struct mbox *mbox = (&nix->dev)->mbox;
1501ae060709SJerin Jacob 	struct nix_aq_enq_req *aq;
1502ae060709SJerin Jacob 
1503ae060709SJerin Jacob 	aq = mbox_alloc_msg_nix_aq_enq(mbox);
1504da718c19SNithin Dabilpuram 	if (!aq)
1505da718c19SNithin Dabilpuram 		return -ENOSPC;
1506da718c19SNithin Dabilpuram 
1507ae060709SJerin Jacob 	aq->qidx = sq->qid;
1508ae060709SJerin Jacob 	aq->ctype = NIX_AQ_CTYPE_SQ;
1509ae060709SJerin Jacob 	aq->op = NIX_AQ_INSTOP_INIT;
1510ae060709SJerin Jacob 	aq->sq.max_sqe_size = sq->max_sqe_sz;
1511ae060709SJerin Jacob 
1512ae060709SJerin Jacob 	aq->sq.max_sqe_size = sq->max_sqe_sz;
1513ae060709SJerin Jacob 	aq->sq.smq = smq;
1514ae060709SJerin Jacob 	aq->sq.smq_rr_quantum = rr_quantum;
151528b283faSSubrahmanyam Nilla 	if (roc_nix_is_sdp(roc_nix))
151628b283faSSubrahmanyam Nilla 		aq->sq.default_chan =
151728b283faSSubrahmanyam Nilla 			nix->tx_chan_base + (sq->qid % nix->tx_chan_cnt);
151828b283faSSubrahmanyam Nilla 	else
1519ae060709SJerin Jacob 		aq->sq.default_chan = nix->tx_chan_base;
1520ae060709SJerin Jacob 	aq->sq.sqe_stype = NIX_STYPE_STF;
1521ae060709SJerin Jacob 	aq->sq.ena = 1;
15226b7fcb7aSSatha Rao 	aq->sq.sso_ena = !!sq->sso_ena;
152387254db8SKommula Shiva Shankar 	aq->sq.cq_ena = !!sq->cq_ena;
152487254db8SKommula Shiva Shankar 	aq->sq.cq = sq->cqid;
1525ba6855a0SKommula Shiva Shankar 	aq->sq.cq_limit = sq->cq_drop_thresh;
1526ae060709SJerin Jacob 	if (aq->sq.max_sqe_size == NIX_MAXSQESZ_W8)
1527ae060709SJerin Jacob 		aq->sq.sqe_stype = NIX_STYPE_STP;
1528ae060709SJerin Jacob 	aq->sq.sqb_aura = roc_npa_aura_handle_to_aura(sq->aura_handle);
1529ae060709SJerin Jacob 	aq->sq.sq_int_ena = BIT(NIX_SQINT_LMT_ERR);
1530ae060709SJerin Jacob 	aq->sq.sq_int_ena |= BIT(NIX_SQINT_SQB_ALLOC_FAIL);
1531ae060709SJerin Jacob 	aq->sq.sq_int_ena |= BIT(NIX_SQINT_SEND_ERR);
1532ae060709SJerin Jacob 	aq->sq.sq_int_ena |= BIT(NIX_SQINT_MNQ_ERR);
1533ae060709SJerin Jacob 
1534ae060709SJerin Jacob 	/* Many to one reduction */
153570e06693SHarman Kalra 	aq->sq.qint_idx = sq->qid % nix->qints;
153670e06693SHarman Kalra 
1537da718c19SNithin Dabilpuram 	return 0;
1538ae060709SJerin Jacob }
1539ae060709SJerin Jacob 
1540ae060709SJerin Jacob static int
1541ae060709SJerin Jacob sq_cn9k_fini(struct nix *nix, struct roc_nix_sq *sq)
1542ae060709SJerin Jacob {
154344a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get((&nix->dev)->mbox);
1544ae060709SJerin Jacob 	struct nix_aq_enq_rsp *rsp;
1545ae060709SJerin Jacob 	struct nix_aq_enq_req *aq;
1546ae060709SJerin Jacob 	uint16_t sqes_per_sqb;
1547ae060709SJerin Jacob 	void *sqb_buf;
1548ae060709SJerin Jacob 	int rc, count;
1549ae060709SJerin Jacob 
1550ae060709SJerin Jacob 	aq = mbox_alloc_msg_nix_aq_enq(mbox);
155144a9307cSRakesh Kudurumalla 	if (!aq) {
155244a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1553da718c19SNithin Dabilpuram 		return -ENOSPC;
155444a9307cSRakesh Kudurumalla 	}
1555da718c19SNithin Dabilpuram 
1556ae060709SJerin Jacob 	aq->qidx = sq->qid;
1557ae060709SJerin Jacob 	aq->ctype = NIX_AQ_CTYPE_SQ;
1558ae060709SJerin Jacob 	aq->op = NIX_AQ_INSTOP_READ;
1559ae060709SJerin Jacob 	rc = mbox_process_msg(mbox, (void *)&rsp);
156044a9307cSRakesh Kudurumalla 	if (rc) {
156144a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1562ae060709SJerin Jacob 		return rc;
156344a9307cSRakesh Kudurumalla 	}
1564ae060709SJerin Jacob 
1565ae060709SJerin Jacob 	/* Check if sq is already cleaned up */
156644a9307cSRakesh Kudurumalla 	if (!rsp->sq.ena) {
156744a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1568ae060709SJerin Jacob 		return 0;
156944a9307cSRakesh Kudurumalla 	}
1570ae060709SJerin Jacob 
1571ae060709SJerin Jacob 	/* Disable sq */
1572ae060709SJerin Jacob 	aq = mbox_alloc_msg_nix_aq_enq(mbox);
157344a9307cSRakesh Kudurumalla 	if (!aq) {
157444a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1575da718c19SNithin Dabilpuram 		return -ENOSPC;
157644a9307cSRakesh Kudurumalla 	}
1577da718c19SNithin Dabilpuram 
1578ae060709SJerin Jacob 	aq->qidx = sq->qid;
1579ae060709SJerin Jacob 	aq->ctype = NIX_AQ_CTYPE_SQ;
1580ae060709SJerin Jacob 	aq->op = NIX_AQ_INSTOP_WRITE;
1581ae060709SJerin Jacob 	aq->sq_mask.ena = ~aq->sq_mask.ena;
1582ae060709SJerin Jacob 	aq->sq.ena = 0;
1583ae060709SJerin Jacob 	rc = mbox_process(mbox);
158444a9307cSRakesh Kudurumalla 	if (rc) {
158544a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1586ae060709SJerin Jacob 		return rc;
158744a9307cSRakesh Kudurumalla 	}
1588ae060709SJerin Jacob 
1589ae060709SJerin Jacob 	/* Read SQ and free sqb's */
1590ae060709SJerin Jacob 	aq = mbox_alloc_msg_nix_aq_enq(mbox);
159144a9307cSRakesh Kudurumalla 	if (!aq) {
159244a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1593da718c19SNithin Dabilpuram 		return -ENOSPC;
159444a9307cSRakesh Kudurumalla 	}
1595da718c19SNithin Dabilpuram 
1596ae060709SJerin Jacob 	aq->qidx = sq->qid;
1597ae060709SJerin Jacob 	aq->ctype = NIX_AQ_CTYPE_SQ;
1598ae060709SJerin Jacob 	aq->op = NIX_AQ_INSTOP_READ;
1599ae060709SJerin Jacob 	rc = mbox_process_msg(mbox, (void *)&rsp);
160044a9307cSRakesh Kudurumalla 	if (rc) {
160144a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1602ae060709SJerin Jacob 		return rc;
160344a9307cSRakesh Kudurumalla 	}
1604ae060709SJerin Jacob 
1605ae060709SJerin Jacob 	if (aq->sq.smq_pend)
1606ae060709SJerin Jacob 		plt_err("SQ has pending SQE's");
1607ae060709SJerin Jacob 
1608ae060709SJerin Jacob 	count = aq->sq.sqb_count;
1609ae060709SJerin Jacob 	sqes_per_sqb = 1 << sq->sqes_per_sqb_log2;
1610ae060709SJerin Jacob 	/* Free SQB's that are used */
1611ae060709SJerin Jacob 	sqb_buf = (void *)rsp->sq.head_sqb;
1612ae060709SJerin Jacob 	while (count) {
1613ae060709SJerin Jacob 		void *next_sqb;
1614ae060709SJerin Jacob 
1615b7c31b6dSSatha Rao 		next_sqb = *(void **)((uint64_t *)sqb_buf +
1616b7c31b6dSSatha Rao 				      (uint32_t)((sqes_per_sqb - 1) * (0x2 >> sq->max_sqe_sz) * 8));
1617ae060709SJerin Jacob 		roc_npa_aura_op_free(sq->aura_handle, 1, (uint64_t)sqb_buf);
1618ae060709SJerin Jacob 		sqb_buf = next_sqb;
1619ae060709SJerin Jacob 		count--;
1620ae060709SJerin Jacob 	}
1621ae060709SJerin Jacob 
1622ae060709SJerin Jacob 	/* Free next to use sqb */
1623ae060709SJerin Jacob 	if (rsp->sq.next_sqb)
1624ae060709SJerin Jacob 		roc_npa_aura_op_free(sq->aura_handle, 1, rsp->sq.next_sqb);
162544a9307cSRakesh Kudurumalla 	mbox_put(mbox);
1626ae060709SJerin Jacob 	return 0;
1627ae060709SJerin Jacob }
1628ae060709SJerin Jacob 
1629da718c19SNithin Dabilpuram static int
16304785c406SSatha Rao sq_cn10k_init(struct nix *nix, struct roc_nix_sq *sq, uint32_t rr_quantum, uint16_t smq)
1631ae060709SJerin Jacob {
163273b16cedSVeerasenareddy Burru 	struct roc_nix *roc_nix = nix_priv_to_roc_nix(nix);
1633ae060709SJerin Jacob 	struct mbox *mbox = (&nix->dev)->mbox;
1634ae060709SJerin Jacob 	struct nix_cn10k_aq_enq_req *aq;
1635ae060709SJerin Jacob 
1636ae060709SJerin Jacob 	aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
1637da718c19SNithin Dabilpuram 	if (!aq)
1638da718c19SNithin Dabilpuram 		return -ENOSPC;
1639da718c19SNithin Dabilpuram 
1640ae060709SJerin Jacob 	aq->qidx = sq->qid;
1641ae060709SJerin Jacob 	aq->ctype = NIX_AQ_CTYPE_SQ;
1642ae060709SJerin Jacob 	aq->op = NIX_AQ_INSTOP_INIT;
1643ae060709SJerin Jacob 	aq->sq.max_sqe_size = sq->max_sqe_sz;
1644ae060709SJerin Jacob 
1645ae060709SJerin Jacob 	aq->sq.max_sqe_size = sq->max_sqe_sz;
1646ae060709SJerin Jacob 	aq->sq.smq = smq;
1647ae060709SJerin Jacob 	aq->sq.smq_rr_weight = rr_quantum;
164873b16cedSVeerasenareddy Burru 	if (roc_nix_is_sdp(roc_nix))
164973b16cedSVeerasenareddy Burru 		aq->sq.default_chan = nix->tx_chan_base + (sq->qid % nix->tx_chan_cnt);
165073b16cedSVeerasenareddy Burru 	else
1651ae060709SJerin Jacob 		aq->sq.default_chan = nix->tx_chan_base;
1652ae060709SJerin Jacob 	aq->sq.sqe_stype = NIX_STYPE_STF;
1653ae060709SJerin Jacob 	aq->sq.ena = 1;
16546b7fcb7aSSatha Rao 	aq->sq.sso_ena = !!sq->sso_ena;
165587254db8SKommula Shiva Shankar 	aq->sq.cq_ena = !!sq->cq_ena;
165687254db8SKommula Shiva Shankar 	aq->sq.cq = sq->cqid;
1657ba6855a0SKommula Shiva Shankar 	aq->sq.cq_limit = sq->cq_drop_thresh;
1658ae060709SJerin Jacob 	if (aq->sq.max_sqe_size == NIX_MAXSQESZ_W8)
1659ae060709SJerin Jacob 		aq->sq.sqe_stype = NIX_STYPE_STP;
1660ae060709SJerin Jacob 	aq->sq.sqb_aura = roc_npa_aura_handle_to_aura(sq->aura_handle);
1661ae060709SJerin Jacob 	aq->sq.sq_int_ena = BIT(NIX_SQINT_LMT_ERR);
1662ae060709SJerin Jacob 	aq->sq.sq_int_ena |= BIT(NIX_SQINT_SQB_ALLOC_FAIL);
1663ae060709SJerin Jacob 	aq->sq.sq_int_ena |= BIT(NIX_SQINT_SEND_ERR);
1664ae060709SJerin Jacob 	aq->sq.sq_int_ena |= BIT(NIX_SQINT_MNQ_ERR);
1665ae060709SJerin Jacob 
166670e06693SHarman Kalra 	/* Many to one reduction */
166770e06693SHarman Kalra 	aq->sq.qint_idx = sq->qid % nix->qints;
166870e06693SHarman Kalra 	if (roc_errata_nix_assign_incorrect_qint()) {
166989d3557cSHarman Kalra 		/* Assigning QINT 0 to all the SQs, an errata exists where NIXTX can
167089d3557cSHarman Kalra 		 * send incorrect QINT_IDX when reporting queue interrupt (QINT). This
167189d3557cSHarman Kalra 		 * might result in software missing the interrupt.
167289d3557cSHarman Kalra 		 */
167389d3557cSHarman Kalra 		aq->sq.qint_idx = 0;
167470e06693SHarman Kalra 	}
1675da718c19SNithin Dabilpuram 	return 0;
1676ae060709SJerin Jacob }
1677ae060709SJerin Jacob 
1678ae060709SJerin Jacob static int
16794785c406SSatha Rao sq_cn10k_fini(struct nix *nix, struct roc_nix_sq *sq)
1680ae060709SJerin Jacob {
168144a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get((&nix->dev)->mbox);
1682ae060709SJerin Jacob 	struct nix_cn10k_aq_enq_rsp *rsp;
1683ae060709SJerin Jacob 	struct nix_cn10k_aq_enq_req *aq;
1684ae060709SJerin Jacob 	uint16_t sqes_per_sqb;
1685ae060709SJerin Jacob 	void *sqb_buf;
1686ae060709SJerin Jacob 	int rc, count;
1687ae060709SJerin Jacob 
1688ae060709SJerin Jacob 	aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
168944a9307cSRakesh Kudurumalla 	if (!aq) {
169044a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1691da718c19SNithin Dabilpuram 		return -ENOSPC;
169244a9307cSRakesh Kudurumalla 	}
1693da718c19SNithin Dabilpuram 
1694ae060709SJerin Jacob 	aq->qidx = sq->qid;
1695ae060709SJerin Jacob 	aq->ctype = NIX_AQ_CTYPE_SQ;
1696ae060709SJerin Jacob 	aq->op = NIX_AQ_INSTOP_READ;
1697ae060709SJerin Jacob 	rc = mbox_process_msg(mbox, (void *)&rsp);
169844a9307cSRakesh Kudurumalla 	if (rc) {
169944a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1700ae060709SJerin Jacob 		return rc;
170144a9307cSRakesh Kudurumalla 	}
1702ae060709SJerin Jacob 
1703ae060709SJerin Jacob 	/* Check if sq is already cleaned up */
170444a9307cSRakesh Kudurumalla 	if (!rsp->sq.ena) {
170544a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1706ae060709SJerin Jacob 		return 0;
170744a9307cSRakesh Kudurumalla 	}
1708ae060709SJerin Jacob 
1709ae060709SJerin Jacob 	/* Disable sq */
1710ae060709SJerin Jacob 	aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
171144a9307cSRakesh Kudurumalla 	if (!aq) {
171244a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1713da718c19SNithin Dabilpuram 		return -ENOSPC;
171444a9307cSRakesh Kudurumalla 	}
1715da718c19SNithin Dabilpuram 
1716ae060709SJerin Jacob 	aq->qidx = sq->qid;
1717ae060709SJerin Jacob 	aq->ctype = NIX_AQ_CTYPE_SQ;
1718ae060709SJerin Jacob 	aq->op = NIX_AQ_INSTOP_WRITE;
1719ae060709SJerin Jacob 	aq->sq_mask.ena = ~aq->sq_mask.ena;
1720ae060709SJerin Jacob 	aq->sq.ena = 0;
1721ae060709SJerin Jacob 	rc = mbox_process(mbox);
172244a9307cSRakesh Kudurumalla 	if (rc) {
172344a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1724ae060709SJerin Jacob 		return rc;
172544a9307cSRakesh Kudurumalla 	}
1726ae060709SJerin Jacob 
1727ae060709SJerin Jacob 	/* Read SQ and free sqb's */
1728ae060709SJerin Jacob 	aq = mbox_alloc_msg_nix_cn10k_aq_enq(mbox);
172944a9307cSRakesh Kudurumalla 	if (!aq) {
173044a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1731da718c19SNithin Dabilpuram 		return -ENOSPC;
173244a9307cSRakesh Kudurumalla 	}
1733da718c19SNithin Dabilpuram 
1734ae060709SJerin Jacob 	aq->qidx = sq->qid;
1735ae060709SJerin Jacob 	aq->ctype = NIX_AQ_CTYPE_SQ;
1736ae060709SJerin Jacob 	aq->op = NIX_AQ_INSTOP_READ;
1737ae060709SJerin Jacob 	rc = mbox_process_msg(mbox, (void *)&rsp);
173844a9307cSRakesh Kudurumalla 	if (rc) {
173944a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1740ae060709SJerin Jacob 		return rc;
174144a9307cSRakesh Kudurumalla 	}
1742ae060709SJerin Jacob 
1743ae060709SJerin Jacob 	if (aq->sq.smq_pend)
1744ae060709SJerin Jacob 		plt_err("SQ has pending SQE's");
1745ae060709SJerin Jacob 
1746ae060709SJerin Jacob 	count = aq->sq.sqb_count;
1747ae060709SJerin Jacob 	sqes_per_sqb = 1 << sq->sqes_per_sqb_log2;
1748ae060709SJerin Jacob 	/* Free SQB's that are used */
1749ae060709SJerin Jacob 	sqb_buf = (void *)rsp->sq.head_sqb;
1750ae060709SJerin Jacob 	while (count) {
1751ae060709SJerin Jacob 		void *next_sqb;
1752ae060709SJerin Jacob 
1753b7c31b6dSSatha Rao 		next_sqb = *(void **)((uint64_t *)sqb_buf +
1754b7c31b6dSSatha Rao 				      (uint32_t)((sqes_per_sqb - 1) * (0x2 >> sq->max_sqe_sz) * 8));
1755ae060709SJerin Jacob 		roc_npa_aura_op_free(sq->aura_handle, 1, (uint64_t)sqb_buf);
1756ae060709SJerin Jacob 		sqb_buf = next_sqb;
1757ae060709SJerin Jacob 		count--;
1758ae060709SJerin Jacob 	}
1759ae060709SJerin Jacob 
1760ae060709SJerin Jacob 	/* Free next to use sqb */
1761ae060709SJerin Jacob 	if (rsp->sq.next_sqb)
1762ae060709SJerin Jacob 		roc_npa_aura_op_free(sq->aura_handle, 1, rsp->sq.next_sqb);
176344a9307cSRakesh Kudurumalla 	mbox_put(mbox);
1764ae060709SJerin Jacob 	return 0;
1765ae060709SJerin Jacob }
1766ae060709SJerin Jacob 
17674785c406SSatha Rao static int
17684785c406SSatha Rao sq_init(struct nix *nix, struct roc_nix_sq *sq, uint32_t rr_quantum, uint16_t smq)
17694785c406SSatha Rao {
17704785c406SSatha Rao 	struct roc_nix *roc_nix = nix_priv_to_roc_nix(nix);
17714785c406SSatha Rao 	struct mbox *mbox = (&nix->dev)->mbox;
17724785c406SSatha Rao 	struct nix_cn20k_aq_enq_req *aq;
17734785c406SSatha Rao 
17744785c406SSatha Rao 	aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox);
17754785c406SSatha Rao 	if (!aq)
17764785c406SSatha Rao 		return -ENOSPC;
17774785c406SSatha Rao 
17784785c406SSatha Rao 	aq->qidx = sq->qid;
17794785c406SSatha Rao 	aq->ctype = NIX_AQ_CTYPE_SQ;
17804785c406SSatha Rao 	aq->op = NIX_AQ_INSTOP_INIT;
17814785c406SSatha Rao 	aq->sq.max_sqe_size = sq->max_sqe_sz;
17824785c406SSatha Rao 
17834785c406SSatha Rao 	aq->sq.max_sqe_size = sq->max_sqe_sz;
17844785c406SSatha Rao 	aq->sq.smq = smq;
17854785c406SSatha Rao 	aq->sq.smq_rr_weight = rr_quantum;
17864785c406SSatha Rao 	if (roc_nix_is_sdp(roc_nix))
17874785c406SSatha Rao 		aq->sq.default_chan = nix->tx_chan_base + (sq->qid % nix->tx_chan_cnt);
17884785c406SSatha Rao 	else
17894785c406SSatha Rao 		aq->sq.default_chan = nix->tx_chan_base;
17904785c406SSatha Rao 	aq->sq.sqe_stype = NIX_STYPE_STF;
17914785c406SSatha Rao 	aq->sq.ena = 1;
17924785c406SSatha Rao 	aq->sq.sso_ena = !!sq->sso_ena;
17934785c406SSatha Rao 	aq->sq.cq_ena = !!sq->cq_ena;
17944785c406SSatha Rao 	aq->sq.cq = sq->cqid;
17954785c406SSatha Rao 	aq->sq.cq_limit = sq->cq_drop_thresh;
17964785c406SSatha Rao 	if (aq->sq.max_sqe_size == NIX_MAXSQESZ_W8)
17974785c406SSatha Rao 		aq->sq.sqe_stype = NIX_STYPE_STP;
17984785c406SSatha Rao 	aq->sq.sqb_aura = roc_npa_aura_handle_to_aura(sq->aura_handle);
17994785c406SSatha Rao 	aq->sq.sq_int_ena = BIT(NIX_SQINT_LMT_ERR);
18004785c406SSatha Rao 	aq->sq.sq_int_ena |= BIT(NIX_SQINT_SQB_ALLOC_FAIL);
18014785c406SSatha Rao 	aq->sq.sq_int_ena |= BIT(NIX_SQINT_SEND_ERR);
18024785c406SSatha Rao 	aq->sq.sq_int_ena |= BIT(NIX_SQINT_MNQ_ERR);
18034785c406SSatha Rao 
18044785c406SSatha Rao 	/* Many to one reduction */
18054785c406SSatha Rao 	aq->sq.qint_idx = sq->qid % nix->qints;
18064785c406SSatha Rao 	if (roc_errata_nix_assign_incorrect_qint()) {
18074785c406SSatha Rao 		/* Assigning QINT 0 to all the SQs, an errata exists where NIXTX can
18084785c406SSatha Rao 		 * send incorrect QINT_IDX when reporting queue interrupt (QINT). This
18094785c406SSatha Rao 		 * might result in software missing the interrupt.
18104785c406SSatha Rao 		 */
18114785c406SSatha Rao 		aq->sq.qint_idx = 0;
18124785c406SSatha Rao 	}
18134785c406SSatha Rao 	return 0;
18144785c406SSatha Rao }
18154785c406SSatha Rao 
18164785c406SSatha Rao static int
18174785c406SSatha Rao sq_fini(struct nix *nix, struct roc_nix_sq *sq)
18184785c406SSatha Rao {
18194785c406SSatha Rao 	struct mbox *mbox = mbox_get((&nix->dev)->mbox);
18204785c406SSatha Rao 	struct nix_cn20k_aq_enq_rsp *rsp;
18214785c406SSatha Rao 	struct nix_cn20k_aq_enq_req *aq;
18224785c406SSatha Rao 	uint16_t sqes_per_sqb;
18234785c406SSatha Rao 	void *sqb_buf;
18244785c406SSatha Rao 	int rc, count;
18254785c406SSatha Rao 
18264785c406SSatha Rao 	aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox);
18274785c406SSatha Rao 	if (!aq) {
18284785c406SSatha Rao 		mbox_put(mbox);
18294785c406SSatha Rao 		return -ENOSPC;
18304785c406SSatha Rao 	}
18314785c406SSatha Rao 
18324785c406SSatha Rao 	aq->qidx = sq->qid;
18334785c406SSatha Rao 	aq->ctype = NIX_AQ_CTYPE_SQ;
18344785c406SSatha Rao 	aq->op = NIX_AQ_INSTOP_READ;
18354785c406SSatha Rao 	rc = mbox_process_msg(mbox, (void *)&rsp);
18364785c406SSatha Rao 	if (rc) {
18374785c406SSatha Rao 		mbox_put(mbox);
18384785c406SSatha Rao 		return rc;
18394785c406SSatha Rao 	}
18404785c406SSatha Rao 
18414785c406SSatha Rao 	/* Check if sq is already cleaned up */
18424785c406SSatha Rao 	if (!rsp->sq.ena) {
18434785c406SSatha Rao 		mbox_put(mbox);
18444785c406SSatha Rao 		return 0;
18454785c406SSatha Rao 	}
18464785c406SSatha Rao 
18474785c406SSatha Rao 	/* Disable sq */
18484785c406SSatha Rao 	aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox);
18494785c406SSatha Rao 	if (!aq) {
18504785c406SSatha Rao 		mbox_put(mbox);
18514785c406SSatha Rao 		return -ENOSPC;
18524785c406SSatha Rao 	}
18534785c406SSatha Rao 
18544785c406SSatha Rao 	aq->qidx = sq->qid;
18554785c406SSatha Rao 	aq->ctype = NIX_AQ_CTYPE_SQ;
18564785c406SSatha Rao 	aq->op = NIX_AQ_INSTOP_WRITE;
18574785c406SSatha Rao 	aq->sq_mask.ena = ~aq->sq_mask.ena;
18584785c406SSatha Rao 	aq->sq.ena = 0;
18594785c406SSatha Rao 	rc = mbox_process(mbox);
18604785c406SSatha Rao 	if (rc) {
18614785c406SSatha Rao 		mbox_put(mbox);
18624785c406SSatha Rao 		return rc;
18634785c406SSatha Rao 	}
18644785c406SSatha Rao 
18654785c406SSatha Rao 	/* Read SQ and free sqb's */
18664785c406SSatha Rao 	aq = mbox_alloc_msg_nix_cn20k_aq_enq(mbox);
18674785c406SSatha Rao 	if (!aq) {
18684785c406SSatha Rao 		mbox_put(mbox);
18694785c406SSatha Rao 		return -ENOSPC;
18704785c406SSatha Rao 	}
18714785c406SSatha Rao 
18724785c406SSatha Rao 	aq->qidx = sq->qid;
18734785c406SSatha Rao 	aq->ctype = NIX_AQ_CTYPE_SQ;
18744785c406SSatha Rao 	aq->op = NIX_AQ_INSTOP_READ;
18754785c406SSatha Rao 	rc = mbox_process_msg(mbox, (void *)&rsp);
18764785c406SSatha Rao 	if (rc) {
18774785c406SSatha Rao 		mbox_put(mbox);
18784785c406SSatha Rao 		return rc;
18794785c406SSatha Rao 	}
18804785c406SSatha Rao 
18814785c406SSatha Rao 	if (aq->sq.smq_pend)
18824785c406SSatha Rao 		plt_err("SQ has pending SQE's");
18834785c406SSatha Rao 
18844785c406SSatha Rao 	count = aq->sq.sqb_count;
18854785c406SSatha Rao 	sqes_per_sqb = 1 << sq->sqes_per_sqb_log2;
18864785c406SSatha Rao 	/* Free SQB's that are used */
18874785c406SSatha Rao 	sqb_buf = (void *)rsp->sq.head_sqb;
18884785c406SSatha Rao 	while (count) {
18894785c406SSatha Rao 		void *next_sqb;
18904785c406SSatha Rao 
18914785c406SSatha Rao 		next_sqb = *(void **)((uint64_t *)sqb_buf +
18924785c406SSatha Rao 				      (uint32_t)((sqes_per_sqb - 1) * (0x2 >> sq->max_sqe_sz) * 8));
18934785c406SSatha Rao 		roc_npa_aura_op_free(sq->aura_handle, 1, (uint64_t)sqb_buf);
18944785c406SSatha Rao 		sqb_buf = next_sqb;
18954785c406SSatha Rao 		count--;
18964785c406SSatha Rao 	}
18974785c406SSatha Rao 
18984785c406SSatha Rao 	/* Free next to use sqb */
18994785c406SSatha Rao 	if (rsp->sq.next_sqb)
19004785c406SSatha Rao 		roc_npa_aura_op_free(sq->aura_handle, 1, rsp->sq.next_sqb);
19014785c406SSatha Rao 	mbox_put(mbox);
19024785c406SSatha Rao 	return 0;
19034785c406SSatha Rao }
19044785c406SSatha Rao 
1905ae060709SJerin Jacob int
1906ae060709SJerin Jacob roc_nix_sq_init(struct roc_nix *roc_nix, struct roc_nix_sq *sq)
1907ae060709SJerin Jacob {
1908ae060709SJerin Jacob 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
190944a9307cSRakesh Kudurumalla 	struct mbox *m_box = (&nix->dev)->mbox;
1910ae060709SJerin Jacob 	uint16_t qid, smq = UINT16_MAX;
1911ae060709SJerin Jacob 	uint32_t rr_quantum = 0;
191244a9307cSRakesh Kudurumalla 	struct mbox *mbox;
1913ae060709SJerin Jacob 	int rc;
1914ae060709SJerin Jacob 
1915ae060709SJerin Jacob 	if (sq == NULL)
1916ae060709SJerin Jacob 		return NIX_ERR_PARAM;
1917ae060709SJerin Jacob 
1918ae060709SJerin Jacob 	qid = sq->qid;
1919ae060709SJerin Jacob 	if (qid >= nix->nb_tx_queues)
1920ae060709SJerin Jacob 		return NIX_ERR_QUEUE_INVALID_RANGE;
1921ae060709SJerin Jacob 
1922ae060709SJerin Jacob 	sq->roc_nix = roc_nix;
1923a24d9de3SSatha Rao 	sq->tc = ROC_NIX_PFC_CLASS_INVALID;
1924ae060709SJerin Jacob 	/*
1925ae060709SJerin Jacob 	 * Allocate memory for flow control updates from HW.
1926ae060709SJerin Jacob 	 * Alloc one cache line, so that fits all FC_STYPE modes.
1927ae060709SJerin Jacob 	 */
1928ae060709SJerin Jacob 	sq->fc = plt_zmalloc(ROC_ALIGN, ROC_ALIGN);
1929ae060709SJerin Jacob 	if (sq->fc == NULL) {
1930ae060709SJerin Jacob 		rc = NIX_ERR_NO_MEM;
1931ae060709SJerin Jacob 		goto fail;
1932ae060709SJerin Jacob 	}
1933ae060709SJerin Jacob 
1934ae060709SJerin Jacob 	rc = sqb_pool_populate(roc_nix, sq);
1935ae060709SJerin Jacob 	if (rc)
1936ae060709SJerin Jacob 		goto nomem;
1937ae060709SJerin Jacob 
193805d727e8SNithin Dabilpuram 	rc = nix_tm_leaf_data_get(nix, sq->qid, &rr_quantum, &smq);
193905d727e8SNithin Dabilpuram 	if (rc) {
194005d727e8SNithin Dabilpuram 		rc = NIX_ERR_TM_LEAF_NODE_GET;
194105d727e8SNithin Dabilpuram 		goto nomem;
194205d727e8SNithin Dabilpuram 	}
194305d727e8SNithin Dabilpuram 
194444a9307cSRakesh Kudurumalla 	mbox = mbox_get(m_box);
1945ae060709SJerin Jacob 	/* Init SQ context */
1946ae060709SJerin Jacob 	if (roc_model_is_cn9k())
1947da718c19SNithin Dabilpuram 		rc = sq_cn9k_init(nix, sq, rr_quantum, smq);
19484785c406SSatha Rao 	else if (roc_model_is_cn10k())
19494785c406SSatha Rao 		rc = sq_cn10k_init(nix, sq, rr_quantum, smq);
1950ae060709SJerin Jacob 	else
1951da718c19SNithin Dabilpuram 		rc = sq_init(nix, sq, rr_quantum, smq);
1952da718c19SNithin Dabilpuram 
195344a9307cSRakesh Kudurumalla 	if (rc) {
195444a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1955da718c19SNithin Dabilpuram 		goto nomem;
195644a9307cSRakesh Kudurumalla 	}
195744a9307cSRakesh Kudurumalla 
1958ae060709SJerin Jacob 
1959ae060709SJerin Jacob 	rc = mbox_process(mbox);
196044a9307cSRakesh Kudurumalla 	if (rc) {
196144a9307cSRakesh Kudurumalla 		mbox_put(mbox);
1962ae060709SJerin Jacob 		goto nomem;
196344a9307cSRakesh Kudurumalla 	}
196444a9307cSRakesh Kudurumalla 	mbox_put(mbox);
1965ae060709SJerin Jacob 
1966f6e0d835SRakesh Kudurumalla 	sq->enable = true;
1967ae060709SJerin Jacob 	nix->sqs[qid] = sq;
1968ae060709SJerin Jacob 	sq->io_addr = nix->base + NIX_LF_OP_SENDX(0);
1969ae060709SJerin Jacob 	/* Evenly distribute LMT slot for each sq */
1970ae060709SJerin Jacob 	if (roc_model_is_cn9k()) {
1971ae060709SJerin Jacob 		/* Multiple cores/SQ's can use same LMTLINE safely in CN9K */
1972ae060709SJerin Jacob 		sq->lmt_addr = (void *)(nix->lmt_base +
1973ae060709SJerin Jacob 					((qid & RVU_CN9K_LMT_SLOT_MASK) << 12));
1974ae060709SJerin Jacob 	}
1975ae060709SJerin Jacob 
1976af75aac7SGowrishankar Muthukrishnan 	rc = nix_tel_node_add_sq(sq);
1977ae060709SJerin Jacob 	return rc;
1978ae060709SJerin Jacob nomem:
1979ae060709SJerin Jacob 	plt_free(sq->fc);
1980ae060709SJerin Jacob fail:
1981ae060709SJerin Jacob 	return rc;
1982ae060709SJerin Jacob }
1983ae060709SJerin Jacob 
1984ae060709SJerin Jacob int
1985ae060709SJerin Jacob roc_nix_sq_fini(struct roc_nix_sq *sq)
1986ae060709SJerin Jacob {
1987ae060709SJerin Jacob 	struct nix *nix;
1988ae060709SJerin Jacob 	struct mbox *mbox;
1989ae060709SJerin Jacob 	struct ndc_sync_op *ndc_req;
1990ae060709SJerin Jacob 	uint16_t qid;
1991ae060709SJerin Jacob 	int rc = 0;
1992ae060709SJerin Jacob 
1993ae060709SJerin Jacob 	if (sq == NULL)
1994ae060709SJerin Jacob 		return NIX_ERR_PARAM;
1995ae060709SJerin Jacob 
1996ae060709SJerin Jacob 	nix = roc_nix_to_nix_priv(sq->roc_nix);
1997ae060709SJerin Jacob 	mbox = (&nix->dev)->mbox;
1998ae060709SJerin Jacob 
1999ae060709SJerin Jacob 	qid = sq->qid;
2000ae060709SJerin Jacob 
200105d727e8SNithin Dabilpuram 	rc = nix_tm_sq_flush_pre(sq);
200205d727e8SNithin Dabilpuram 
2003ae060709SJerin Jacob 	/* Release SQ context */
2004ae060709SJerin Jacob 	if (roc_model_is_cn9k())
2005ae060709SJerin Jacob 		rc |= sq_cn9k_fini(roc_nix_to_nix_priv(sq->roc_nix), sq);
20064785c406SSatha Rao 	else if (roc_model_is_cn10k())
20074785c406SSatha Rao 		rc |= sq_cn10k_fini(roc_nix_to_nix_priv(sq->roc_nix), sq);
2008ae060709SJerin Jacob 	else
2009ae060709SJerin Jacob 		rc |= sq_fini(roc_nix_to_nix_priv(sq->roc_nix), sq);
2010ae060709SJerin Jacob 
2011ae060709SJerin Jacob 	/* Sync NDC-NIX-TX for LF */
201244a9307cSRakesh Kudurumalla 	ndc_req = mbox_alloc_msg_ndc_sync_op(mbox_get(mbox));
201344a9307cSRakesh Kudurumalla 	if (ndc_req == NULL) {
201444a9307cSRakesh Kudurumalla 		mbox_put(mbox);
2015ae060709SJerin Jacob 		return -ENOSPC;
201644a9307cSRakesh Kudurumalla 	}
2017ae060709SJerin Jacob 	ndc_req->nix_lf_tx_sync = 1;
2018ae060709SJerin Jacob 	if (mbox_process(mbox))
2019ae060709SJerin Jacob 		rc |= NIX_ERR_NDC_SYNC;
202044a9307cSRakesh Kudurumalla 	mbox_put(mbox);
2021ae060709SJerin Jacob 
202205d727e8SNithin Dabilpuram 	rc |= nix_tm_sq_flush_post(sq);
2023780f90e9SNithin Dabilpuram 
2024780f90e9SNithin Dabilpuram 	/* Restore limit to max SQB count that the pool was created
2025780f90e9SNithin Dabilpuram 	 * for aura drain to succeed.
2026780f90e9SNithin Dabilpuram 	 */
2027780f90e9SNithin Dabilpuram 	roc_npa_aura_limit_modify(sq->aura_handle, NIX_MAX_SQB);
2028ae060709SJerin Jacob 	rc |= roc_npa_pool_destroy(sq->aura_handle);
2029ae060709SJerin Jacob 	plt_free(sq->fc);
2030ae060709SJerin Jacob 	plt_free(sq->sqe_mem);
2031ae060709SJerin Jacob 	nix->sqs[qid] = NULL;
2032ae060709SJerin Jacob 
2033ae060709SJerin Jacob 	return rc;
2034ae060709SJerin Jacob }
203509e1df73SRahul Bhansali 
203609e1df73SRahul Bhansali void
203709e1df73SRahul Bhansali roc_nix_cq_head_tail_get(struct roc_nix *roc_nix, uint16_t qid, uint32_t *head,
203809e1df73SRahul Bhansali 			 uint32_t *tail)
203909e1df73SRahul Bhansali {
204009e1df73SRahul Bhansali 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
204109e1df73SRahul Bhansali 	uint64_t reg, val;
204209e1df73SRahul Bhansali 	int64_t *addr;
204309e1df73SRahul Bhansali 
204409e1df73SRahul Bhansali 	if (head == NULL || tail == NULL)
204509e1df73SRahul Bhansali 		return;
204609e1df73SRahul Bhansali 
204709e1df73SRahul Bhansali 	reg = (((uint64_t)qid) << 32);
204809e1df73SRahul Bhansali 	addr = (int64_t *)(nix->base + NIX_LF_CQ_OP_STATUS);
204909e1df73SRahul Bhansali 	val = roc_atomic64_add_nosync(reg, addr);
205009e1df73SRahul Bhansali 	if (val &
205109e1df73SRahul Bhansali 	    (BIT_ULL(NIX_CQ_OP_STAT_OP_ERR) | BIT_ULL(NIX_CQ_OP_STAT_CQ_ERR)))
205209e1df73SRahul Bhansali 		val = 0;
205309e1df73SRahul Bhansali 
205409e1df73SRahul Bhansali 	*tail = (uint32_t)(val & 0xFFFFF);
205509e1df73SRahul Bhansali 	*head = (uint32_t)((val >> 20) & 0xFFFFF);
205609e1df73SRahul Bhansali }
205709e1df73SRahul Bhansali 
205809e1df73SRahul Bhansali void
205909e1df73SRahul Bhansali roc_nix_sq_head_tail_get(struct roc_nix *roc_nix, uint16_t qid, uint32_t *head,
206009e1df73SRahul Bhansali 			 uint32_t *tail)
206109e1df73SRahul Bhansali {
206209e1df73SRahul Bhansali 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
206309e1df73SRahul Bhansali 	struct roc_nix_sq *sq = nix->sqs[qid];
206409e1df73SRahul Bhansali 	uint16_t sqes_per_sqb, sqb_cnt;
206509e1df73SRahul Bhansali 	uint64_t reg, val;
206609e1df73SRahul Bhansali 	int64_t *addr;
206709e1df73SRahul Bhansali 
206809e1df73SRahul Bhansali 	if (head == NULL || tail == NULL)
206909e1df73SRahul Bhansali 		return;
207009e1df73SRahul Bhansali 
207109e1df73SRahul Bhansali 	reg = (((uint64_t)qid) << 32);
207209e1df73SRahul Bhansali 	addr = (int64_t *)(nix->base + NIX_LF_SQ_OP_STATUS);
207309e1df73SRahul Bhansali 	val = roc_atomic64_add_nosync(reg, addr);
207409e1df73SRahul Bhansali 	if (val & BIT_ULL(NIX_CQ_OP_STAT_OP_ERR)) {
207509e1df73SRahul Bhansali 		val = 0;
207609e1df73SRahul Bhansali 		return;
207709e1df73SRahul Bhansali 	}
207809e1df73SRahul Bhansali 
207909e1df73SRahul Bhansali 	*tail = (uint32_t)((val >> 28) & 0x3F);
208009e1df73SRahul Bhansali 	*head = (uint32_t)((val >> 20) & 0x3F);
208109e1df73SRahul Bhansali 	sqb_cnt = (uint16_t)(val & 0xFFFF);
208209e1df73SRahul Bhansali 
208309e1df73SRahul Bhansali 	sqes_per_sqb = 1 << sq->sqes_per_sqb_log2;
208409e1df73SRahul Bhansali 
208509e1df73SRahul Bhansali 	/* Update tail index as per used sqb count */
208609e1df73SRahul Bhansali 	*tail += (sqes_per_sqb * (sqb_cnt - 1));
208709e1df73SRahul Bhansali }
2088b7c31b6dSSatha Rao 
2089b7c31b6dSSatha Rao int
2090b7c31b6dSSatha Rao roc_nix_q_err_cb_register(struct roc_nix *roc_nix, q_err_get_t sq_err_handle)
2091b7c31b6dSSatha Rao {
2092b7c31b6dSSatha Rao 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
2093b7c31b6dSSatha Rao 	struct dev *dev = &nix->dev;
2094b7c31b6dSSatha Rao 
2095b7c31b6dSSatha Rao 	if (sq_err_handle == NULL)
2096b7c31b6dSSatha Rao 		return NIX_ERR_PARAM;
2097b7c31b6dSSatha Rao 
2098b7c31b6dSSatha Rao 	dev->ops->q_err_cb = (q_err_cb_t)sq_err_handle;
2099b7c31b6dSSatha Rao 	return 0;
2100b7c31b6dSSatha Rao }
2101b7c31b6dSSatha Rao 
2102b7c31b6dSSatha Rao void
2103b7c31b6dSSatha Rao roc_nix_q_err_cb_unregister(struct roc_nix *roc_nix)
2104b7c31b6dSSatha Rao {
2105b7c31b6dSSatha Rao 	struct nix *nix = roc_nix_to_nix_priv(roc_nix);
2106b7c31b6dSSatha Rao 	struct dev *dev = &nix->dev;
2107b7c31b6dSSatha Rao 
2108b7c31b6dSSatha Rao 	dev->ops->q_err_cb = NULL;
2109b7c31b6dSSatha Rao }
2110