xref: /dpdk/drivers/common/cnxk/roc_npa.c (revision 59c15941bf34887cf75e6286524efa2a5691bfdc)
1124ff1a4SAshwin Sekhar T K /* SPDX-License-Identifier: BSD-3-Clause
2124ff1a4SAshwin Sekhar T K  * Copyright(C) 2021 Marvell.
3124ff1a4SAshwin Sekhar T K  */
4124ff1a4SAshwin Sekhar T K 
5124ff1a4SAshwin Sekhar T K #include "roc_api.h"
6124ff1a4SAshwin Sekhar T K #include "roc_priv.h"
7124ff1a4SAshwin Sekhar T K 
880e1239eSVolodymyr Fialko static roc_npa_lf_init_cb_t lf_init_cb;
980e1239eSVolodymyr Fialko 
1080e1239eSVolodymyr Fialko int
1180e1239eSVolodymyr Fialko roc_npa_lf_init_cb_register(roc_npa_lf_init_cb_t cb)
1280e1239eSVolodymyr Fialko {
1380e1239eSVolodymyr Fialko 	if (lf_init_cb != NULL)
1480e1239eSVolodymyr Fialko 		return -EEXIST;
1580e1239eSVolodymyr Fialko 
1680e1239eSVolodymyr Fialko 	lf_init_cb = cb;
1780e1239eSVolodymyr Fialko 	return 0;
1880e1239eSVolodymyr Fialko }
1980e1239eSVolodymyr Fialko 
20*59c15941SAkhil Goyal uint16_t
21*59c15941SAkhil Goyal roc_npa_pf_func_get(void)
22*59c15941SAkhil Goyal {
23*59c15941SAkhil Goyal 	return idev_npa_pffunc_get();
24*59c15941SAkhil Goyal }
25*59c15941SAkhil Goyal 
26f765f561SAshwin Sekhar T K void
270bdad505SAshwin Sekhar T K roc_npa_pool_op_range_set(uint64_t aura_handle, uint64_t start_iova,
28f765f561SAshwin Sekhar T K 			  uint64_t end_iova)
29f765f561SAshwin Sekhar T K {
30f765f561SAshwin Sekhar T K 	const uint64_t start = roc_npa_aura_handle_to_base(aura_handle) +
31f765f561SAshwin Sekhar T K 			       NPA_LF_POOL_OP_PTR_START0;
32f765f561SAshwin Sekhar T K 	const uint64_t end = roc_npa_aura_handle_to_base(aura_handle) +
33f765f561SAshwin Sekhar T K 			     NPA_LF_POOL_OP_PTR_END0;
34f765f561SAshwin Sekhar T K 	uint64_t reg = roc_npa_aura_handle_to_aura(aura_handle);
35f765f561SAshwin Sekhar T K 	struct npa_lf *lf = idev_npa_obj_get();
36f765f561SAshwin Sekhar T K 	struct npa_aura_lim *lim;
37f765f561SAshwin Sekhar T K 
38f765f561SAshwin Sekhar T K 	PLT_ASSERT(lf);
39f765f561SAshwin Sekhar T K 	lim = lf->aura_lim;
40f765f561SAshwin Sekhar T K 
410bdad505SAshwin Sekhar T K 	/* Change the range bookkeeping in software as well as in hardware */
42f765f561SAshwin Sekhar T K 	lim[reg].ptr_start = PLT_MIN(lim[reg].ptr_start, start_iova);
43f765f561SAshwin Sekhar T K 	lim[reg].ptr_end = PLT_MAX(lim[reg].ptr_end, end_iova);
44f765f561SAshwin Sekhar T K 
45f765f561SAshwin Sekhar T K 	roc_store_pair(lim[reg].ptr_start, reg, start);
46f765f561SAshwin Sekhar T K 	roc_store_pair(lim[reg].ptr_end, reg, end);
47f765f561SAshwin Sekhar T K }
48f765f561SAshwin Sekhar T K 
490bdad505SAshwin Sekhar T K void
500bdad505SAshwin Sekhar T K roc_npa_aura_op_range_set(uint64_t aura_handle, uint64_t start_iova,
510bdad505SAshwin Sekhar T K 			  uint64_t end_iova)
520bdad505SAshwin Sekhar T K {
530bdad505SAshwin Sekhar T K 	uint64_t reg = roc_npa_aura_handle_to_aura(aura_handle);
540bdad505SAshwin Sekhar T K 	struct npa_lf *lf = idev_npa_obj_get();
550bdad505SAshwin Sekhar T K 	struct npa_aura_lim *lim;
560bdad505SAshwin Sekhar T K 
570bdad505SAshwin Sekhar T K 	PLT_ASSERT(lf);
580bdad505SAshwin Sekhar T K 	lim = lf->aura_lim;
590bdad505SAshwin Sekhar T K 
600bdad505SAshwin Sekhar T K 	/* Change only the bookkeeping in software */
610bdad505SAshwin Sekhar T K 	lim[reg].ptr_start = PLT_MIN(lim[reg].ptr_start, start_iova);
620bdad505SAshwin Sekhar T K 	lim[reg].ptr_end = PLT_MAX(lim[reg].ptr_end, end_iova);
630bdad505SAshwin Sekhar T K }
640bdad505SAshwin Sekhar T K 
650bdad505SAshwin Sekhar T K void
660bdad505SAshwin Sekhar T K roc_npa_aura_op_range_get(uint64_t aura_handle, uint64_t *start_iova,
670bdad505SAshwin Sekhar T K 			  uint64_t *end_iova)
680bdad505SAshwin Sekhar T K {
690bdad505SAshwin Sekhar T K 	uint64_t aura_id = roc_npa_aura_handle_to_aura(aura_handle);
700bdad505SAshwin Sekhar T K 	struct npa_aura_lim *lim;
710bdad505SAshwin Sekhar T K 	struct npa_lf *lf;
720bdad505SAshwin Sekhar T K 
730bdad505SAshwin Sekhar T K 	lf = idev_npa_obj_get();
740bdad505SAshwin Sekhar T K 	PLT_ASSERT(lf);
750bdad505SAshwin Sekhar T K 
760bdad505SAshwin Sekhar T K 	lim = lf->aura_lim;
770bdad505SAshwin Sekhar T K 	*start_iova = lim[aura_id].ptr_start;
780bdad505SAshwin Sekhar T K 	*end_iova = lim[aura_id].ptr_end;
790bdad505SAshwin Sekhar T K }
800bdad505SAshwin Sekhar T K 
81f765f561SAshwin Sekhar T K static int
8244a9307cSRakesh Kudurumalla npa_aura_pool_init(struct mbox *m_box, uint32_t aura_id, struct npa_aura_s *aura,
83f765f561SAshwin Sekhar T K 		   struct npa_pool_s *pool)
84f765f561SAshwin Sekhar T K {
85143a419eSAshwin Sekhar T K 	struct npa_cn20k_aq_enq_req *aura_init_req_cn20k, *pool_init_req_cn20k;
86f765f561SAshwin Sekhar T K 	struct npa_aq_enq_req *aura_init_req, *pool_init_req;
87f765f561SAshwin Sekhar T K 	struct npa_aq_enq_rsp *aura_init_rsp, *pool_init_rsp;
8844a9307cSRakesh Kudurumalla 	struct mbox_dev *mdev = &m_box->dev[0];
89f765f561SAshwin Sekhar T K 	int rc = -ENOSPC, off;
9044a9307cSRakesh Kudurumalla 	struct mbox *mbox;
91f765f561SAshwin Sekhar T K 
9244a9307cSRakesh Kudurumalla 	mbox = mbox_get(m_box);
93143a419eSAshwin Sekhar T K 	if (roc_model_is_cn20k()) {
94143a419eSAshwin Sekhar T K 		aura_init_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox);
95143a419eSAshwin Sekhar T K 		aura_init_req = (struct npa_aq_enq_req *)aura_init_req_cn20k;
96143a419eSAshwin Sekhar T K 	} else {
97f765f561SAshwin Sekhar T K 		aura_init_req = mbox_alloc_msg_npa_aq_enq(mbox);
98143a419eSAshwin Sekhar T K 	}
99f765f561SAshwin Sekhar T K 	if (aura_init_req == NULL)
10044a9307cSRakesh Kudurumalla 		goto exit;
101f765f561SAshwin Sekhar T K 	aura_init_req->aura_id = aura_id;
102f765f561SAshwin Sekhar T K 	aura_init_req->ctype = NPA_AQ_CTYPE_AURA;
103f765f561SAshwin Sekhar T K 	aura_init_req->op = NPA_AQ_INSTOP_INIT;
104f765f561SAshwin Sekhar T K 	mbox_memcpy(&aura_init_req->aura, aura, sizeof(*aura));
105f765f561SAshwin Sekhar T K 
106143a419eSAshwin Sekhar T K 	if (roc_model_is_cn20k()) {
107143a419eSAshwin Sekhar T K 		pool_init_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox);
108143a419eSAshwin Sekhar T K 		pool_init_req = (struct npa_aq_enq_req *)pool_init_req_cn20k;
109143a419eSAshwin Sekhar T K 	} else {
110143a419eSAshwin Sekhar T K 		pool_init_req = mbox_alloc_msg_npa_aq_enq(mbox);
111143a419eSAshwin Sekhar T K 	}
112f765f561SAshwin Sekhar T K 	pool_init_req = mbox_alloc_msg_npa_aq_enq(mbox);
113f765f561SAshwin Sekhar T K 	if (pool_init_req == NULL)
11444a9307cSRakesh Kudurumalla 		goto exit;
115f765f561SAshwin Sekhar T K 	pool_init_req->aura_id = aura_id;
116f765f561SAshwin Sekhar T K 	pool_init_req->ctype = NPA_AQ_CTYPE_POOL;
117f765f561SAshwin Sekhar T K 	pool_init_req->op = NPA_AQ_INSTOP_INIT;
118f765f561SAshwin Sekhar T K 	mbox_memcpy(&pool_init_req->pool, pool, sizeof(*pool));
119f765f561SAshwin Sekhar T K 
120f765f561SAshwin Sekhar T K 	rc = mbox_process(mbox);
121f765f561SAshwin Sekhar T K 	if (rc < 0)
12244a9307cSRakesh Kudurumalla 		goto exit;
123f765f561SAshwin Sekhar T K 
124f765f561SAshwin Sekhar T K 	off = mbox->rx_start +
125f765f561SAshwin Sekhar T K 	      PLT_ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN);
126f765f561SAshwin Sekhar T K 	aura_init_rsp = (struct npa_aq_enq_rsp *)((uintptr_t)mdev->mbase + off);
127f765f561SAshwin Sekhar T K 	off = mbox->rx_start + aura_init_rsp->hdr.next_msgoff;
128f765f561SAshwin Sekhar T K 	pool_init_rsp = (struct npa_aq_enq_rsp *)((uintptr_t)mdev->mbase + off);
129f765f561SAshwin Sekhar T K 
130f765f561SAshwin Sekhar T K 	if (aura_init_rsp->hdr.rc == 0 && pool_init_rsp->hdr.rc == 0)
13144a9307cSRakesh Kudurumalla 		rc = 0;
132f765f561SAshwin Sekhar T K 	else
13344a9307cSRakesh Kudurumalla 		rc = NPA_ERR_AURA_POOL_INIT;
13444a9307cSRakesh Kudurumalla exit:
13544a9307cSRakesh Kudurumalla 	mbox_put(mbox);
13644a9307cSRakesh Kudurumalla 	return rc;
137f765f561SAshwin Sekhar T K }
138f765f561SAshwin Sekhar T K 
139f765f561SAshwin Sekhar T K static int
140ea4d70ccSAshwin Sekhar T K npa_aura_init(struct mbox *m_box, uint32_t aura_id, struct npa_aura_s *aura)
141ea4d70ccSAshwin Sekhar T K {
142143a419eSAshwin Sekhar T K 	struct npa_cn20k_aq_enq_req *aura_init_req_cn20k;
143ea4d70ccSAshwin Sekhar T K 	struct npa_aq_enq_req *aura_init_req;
144ea4d70ccSAshwin Sekhar T K 	struct npa_aq_enq_rsp *aura_init_rsp;
145ea4d70ccSAshwin Sekhar T K 	struct mbox *mbox;
146ea4d70ccSAshwin Sekhar T K 	int rc = -ENOSPC;
147ea4d70ccSAshwin Sekhar T K 
148ea4d70ccSAshwin Sekhar T K 	mbox = mbox_get(m_box);
149143a419eSAshwin Sekhar T K 	if (roc_model_is_cn20k()) {
150143a419eSAshwin Sekhar T K 		aura_init_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox);
151143a419eSAshwin Sekhar T K 		aura_init_req = (struct npa_aq_enq_req *)aura_init_req_cn20k;
152143a419eSAshwin Sekhar T K 	} else {
153ea4d70ccSAshwin Sekhar T K 		aura_init_req = mbox_alloc_msg_npa_aq_enq(mbox);
154143a419eSAshwin Sekhar T K 	}
155ea4d70ccSAshwin Sekhar T K 	if (aura_init_req == NULL)
156ea4d70ccSAshwin Sekhar T K 		goto exit;
157ea4d70ccSAshwin Sekhar T K 	aura_init_req->aura_id = aura_id;
158ea4d70ccSAshwin Sekhar T K 	aura_init_req->ctype = NPA_AQ_CTYPE_AURA;
159ea4d70ccSAshwin Sekhar T K 	aura_init_req->op = NPA_AQ_INSTOP_INIT;
160ea4d70ccSAshwin Sekhar T K 	mbox_memcpy(&aura_init_req->aura, aura, sizeof(*aura));
161ea4d70ccSAshwin Sekhar T K 
162ea4d70ccSAshwin Sekhar T K 	rc = mbox_process_msg(mbox, (void **)&aura_init_rsp);
163ea4d70ccSAshwin Sekhar T K 	if (rc < 0)
164ea4d70ccSAshwin Sekhar T K 		goto exit;
165ea4d70ccSAshwin Sekhar T K 
166ea4d70ccSAshwin Sekhar T K 	if (aura_init_rsp->hdr.rc == 0)
167ea4d70ccSAshwin Sekhar T K 		rc = 0;
168ea4d70ccSAshwin Sekhar T K 	else
169ea4d70ccSAshwin Sekhar T K 		rc = NPA_ERR_AURA_POOL_INIT;
170ea4d70ccSAshwin Sekhar T K exit:
171ea4d70ccSAshwin Sekhar T K 	mbox_put(mbox);
172ea4d70ccSAshwin Sekhar T K 	return rc;
173ea4d70ccSAshwin Sekhar T K }
174ea4d70ccSAshwin Sekhar T K 
175ea4d70ccSAshwin Sekhar T K static int
17644a9307cSRakesh Kudurumalla npa_aura_pool_fini(struct mbox *m_box, uint32_t aura_id, uint64_t aura_handle)
177f765f561SAshwin Sekhar T K {
178143a419eSAshwin Sekhar T K 	struct npa_cn20k_aq_enq_req *aura_req_cn20k, *pool_req_cn20k;
179f765f561SAshwin Sekhar T K 	struct npa_aq_enq_req *aura_req, *pool_req;
180f765f561SAshwin Sekhar T K 	struct npa_aq_enq_rsp *aura_rsp, *pool_rsp;
18144a9307cSRakesh Kudurumalla 	struct mbox_dev *mdev = &m_box->dev[0];
182f765f561SAshwin Sekhar T K 	struct ndc_sync_op *ndc_req;
183f765f561SAshwin Sekhar T K 	int rc = -ENOSPC, off;
18444a9307cSRakesh Kudurumalla 	struct mbox *mbox;
185f765f561SAshwin Sekhar T K 	uint64_t ptr;
186f765f561SAshwin Sekhar T K 
187f765f561SAshwin Sekhar T K 	/* Procedure for disabling an aura/pool */
188f765f561SAshwin Sekhar T K 	plt_delay_us(10);
189f765f561SAshwin Sekhar T K 
190f765f561SAshwin Sekhar T K 	/* Clear all the pointers from the aura */
191f765f561SAshwin Sekhar T K 	do {
192f765f561SAshwin Sekhar T K 		ptr = roc_npa_aura_op_alloc(aura_handle, 0);
193f765f561SAshwin Sekhar T K 	} while (ptr);
194f765f561SAshwin Sekhar T K 
19544a9307cSRakesh Kudurumalla 	mbox = mbox_get(m_box);
196143a419eSAshwin Sekhar T K 	if (roc_model_is_cn20k()) {
197143a419eSAshwin Sekhar T K 		pool_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox);
198143a419eSAshwin Sekhar T K 		pool_req = (struct npa_aq_enq_req *)pool_req_cn20k;
199143a419eSAshwin Sekhar T K 	} else {
200f765f561SAshwin Sekhar T K 		pool_req = mbox_alloc_msg_npa_aq_enq(mbox);
201143a419eSAshwin Sekhar T K 	}
202f765f561SAshwin Sekhar T K 	if (pool_req == NULL)
20344a9307cSRakesh Kudurumalla 		goto exit;
204f765f561SAshwin Sekhar T K 	pool_req->aura_id = aura_id;
205f765f561SAshwin Sekhar T K 	pool_req->ctype = NPA_AQ_CTYPE_POOL;
206f765f561SAshwin Sekhar T K 	pool_req->op = NPA_AQ_INSTOP_WRITE;
207f765f561SAshwin Sekhar T K 	pool_req->pool.ena = 0;
208f765f561SAshwin Sekhar T K 	pool_req->pool_mask.ena = ~pool_req->pool_mask.ena;
209f765f561SAshwin Sekhar T K 
210143a419eSAshwin Sekhar T K 	if (roc_model_is_cn20k()) {
211143a419eSAshwin Sekhar T K 		aura_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox);
212143a419eSAshwin Sekhar T K 		aura_req = (struct npa_aq_enq_req *)aura_req_cn20k;
213143a419eSAshwin Sekhar T K 	} else {
214f765f561SAshwin Sekhar T K 		aura_req = mbox_alloc_msg_npa_aq_enq(mbox);
215143a419eSAshwin Sekhar T K 	}
216f765f561SAshwin Sekhar T K 	if (aura_req == NULL)
21744a9307cSRakesh Kudurumalla 		goto exit;
218f765f561SAshwin Sekhar T K 	aura_req->aura_id = aura_id;
219f765f561SAshwin Sekhar T K 	aura_req->ctype = NPA_AQ_CTYPE_AURA;
220f765f561SAshwin Sekhar T K 	aura_req->op = NPA_AQ_INSTOP_WRITE;
221f765f561SAshwin Sekhar T K 	aura_req->aura.ena = 0;
222f765f561SAshwin Sekhar T K 	aura_req->aura_mask.ena = ~aura_req->aura_mask.ena;
223143a419eSAshwin Sekhar T K 	if (roc_model_is_cn20k()) {
224143a419eSAshwin Sekhar T K 		__io struct npa_cn20k_aura_s *aura_cn20k, *aura_mask_cn20k;
225143a419eSAshwin Sekhar T K 
226143a419eSAshwin Sekhar T K 		/* The bit positions/width of bp_ena has changed in cn20k */
227143a419eSAshwin Sekhar T K 		aura_cn20k = (__io struct npa_cn20k_aura_s *)&aura_req->aura;
228143a419eSAshwin Sekhar T K 		aura_cn20k->bp_ena = 0;
229143a419eSAshwin Sekhar T K 		aura_mask_cn20k = (__io struct npa_cn20k_aura_s *)&aura_req->aura_mask;
230143a419eSAshwin Sekhar T K 		aura_mask_cn20k->bp_ena = ~aura_mask_cn20k->bp_ena;
231143a419eSAshwin Sekhar T K 	} else {
232b1c7a08bSAshwin Sekhar T K 		aura_req->aura.bp_ena = 0;
233b1c7a08bSAshwin Sekhar T K 		aura_req->aura_mask.bp_ena = ~aura_req->aura_mask.bp_ena;
234143a419eSAshwin Sekhar T K 	}
235f765f561SAshwin Sekhar T K 
236f765f561SAshwin Sekhar T K 	rc = mbox_process(mbox);
237f765f561SAshwin Sekhar T K 	if (rc < 0)
23844a9307cSRakesh Kudurumalla 		goto exit;
239f765f561SAshwin Sekhar T K 
240f765f561SAshwin Sekhar T K 	off = mbox->rx_start +
241f765f561SAshwin Sekhar T K 	      PLT_ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN);
242f765f561SAshwin Sekhar T K 	pool_rsp = (struct npa_aq_enq_rsp *)((uintptr_t)mdev->mbase + off);
243f765f561SAshwin Sekhar T K 
244f765f561SAshwin Sekhar T K 	off = mbox->rx_start + pool_rsp->hdr.next_msgoff;
245f765f561SAshwin Sekhar T K 	aura_rsp = (struct npa_aq_enq_rsp *)((uintptr_t)mdev->mbase + off);
246f765f561SAshwin Sekhar T K 
24702e5aaacSThierry Herbelot 	if (aura_rsp->hdr.rc != 0 || pool_rsp->hdr.rc != 0) {
24802e5aaacSThierry Herbelot 		rc = NPA_ERR_AURA_POOL_FINI;
24902e5aaacSThierry Herbelot 		goto exit;
25002e5aaacSThierry Herbelot 	}
251f765f561SAshwin Sekhar T K 
252143a419eSAshwin Sekhar T K 	if (roc_model_is_cn20k()) {
253143a419eSAshwin Sekhar T K 		/* In cn20k, NPA does not use NDC */
254143a419eSAshwin Sekhar T K 		rc = 0;
255143a419eSAshwin Sekhar T K 		goto exit;
256143a419eSAshwin Sekhar T K 	}
257143a419eSAshwin Sekhar T K 
258f765f561SAshwin Sekhar T K 	/* Sync NDC-NPA for LF */
259f765f561SAshwin Sekhar T K 	ndc_req = mbox_alloc_msg_ndc_sync_op(mbox);
26044a9307cSRakesh Kudurumalla 	if (ndc_req == NULL) {
26144a9307cSRakesh Kudurumalla 		rc = -ENOSPC;
26244a9307cSRakesh Kudurumalla 		goto exit;
26344a9307cSRakesh Kudurumalla 	}
264f765f561SAshwin Sekhar T K 	ndc_req->npa_lf_sync = 1;
265f765f561SAshwin Sekhar T K 	rc = mbox_process(mbox);
266f765f561SAshwin Sekhar T K 	if (rc) {
267f765f561SAshwin Sekhar T K 		plt_err("Error on NDC-NPA LF sync, rc %d", rc);
26844a9307cSRakesh Kudurumalla 		rc = NPA_ERR_AURA_POOL_FINI;
26944a9307cSRakesh Kudurumalla 		goto exit;
270f765f561SAshwin Sekhar T K 	}
27144a9307cSRakesh Kudurumalla 	rc = 0;
27244a9307cSRakesh Kudurumalla exit:
27344a9307cSRakesh Kudurumalla 	mbox_put(mbox);
27444a9307cSRakesh Kudurumalla 	return rc;
275f765f561SAshwin Sekhar T K }
276f765f561SAshwin Sekhar T K 
277ea4d70ccSAshwin Sekhar T K static int
278ea4d70ccSAshwin Sekhar T K npa_aura_fini(struct mbox *m_box, uint32_t aura_id)
279ea4d70ccSAshwin Sekhar T K {
280143a419eSAshwin Sekhar T K 	struct npa_cn20k_aq_enq_req *aura_req_cn20k;
281ea4d70ccSAshwin Sekhar T K 	struct npa_aq_enq_req *aura_req;
282ea4d70ccSAshwin Sekhar T K 	struct npa_aq_enq_rsp *aura_rsp;
283ea4d70ccSAshwin Sekhar T K 	struct ndc_sync_op *ndc_req;
284ea4d70ccSAshwin Sekhar T K 	struct mbox *mbox;
285ea4d70ccSAshwin Sekhar T K 	int rc = -ENOSPC;
286ea4d70ccSAshwin Sekhar T K 
287ea4d70ccSAshwin Sekhar T K 	/* Procedure for disabling an aura/pool */
288ea4d70ccSAshwin Sekhar T K 	plt_delay_us(10);
289ea4d70ccSAshwin Sekhar T K 
290ea4d70ccSAshwin Sekhar T K 	mbox = mbox_get(m_box);
291143a419eSAshwin Sekhar T K 	if (roc_model_is_cn20k()) {
292143a419eSAshwin Sekhar T K 		aura_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox);
293143a419eSAshwin Sekhar T K 		aura_req = (struct npa_aq_enq_req *)aura_req_cn20k;
294143a419eSAshwin Sekhar T K 	} else {
295ea4d70ccSAshwin Sekhar T K 		aura_req = mbox_alloc_msg_npa_aq_enq(mbox);
296143a419eSAshwin Sekhar T K 	}
297ea4d70ccSAshwin Sekhar T K 	if (aura_req == NULL)
298ea4d70ccSAshwin Sekhar T K 		goto exit;
299ea4d70ccSAshwin Sekhar T K 	aura_req->aura_id = aura_id;
300ea4d70ccSAshwin Sekhar T K 	aura_req->ctype = NPA_AQ_CTYPE_AURA;
301ea4d70ccSAshwin Sekhar T K 	aura_req->op = NPA_AQ_INSTOP_WRITE;
302ea4d70ccSAshwin Sekhar T K 	aura_req->aura.ena = 0;
303ea4d70ccSAshwin Sekhar T K 	aura_req->aura_mask.ena = ~aura_req->aura_mask.ena;
304ea4d70ccSAshwin Sekhar T K 
305ea4d70ccSAshwin Sekhar T K 	rc = mbox_process_msg(mbox, (void **)&aura_rsp);
306ea4d70ccSAshwin Sekhar T K 	if (rc < 0)
307ea4d70ccSAshwin Sekhar T K 		goto exit;
308ea4d70ccSAshwin Sekhar T K 
30902e5aaacSThierry Herbelot 	if (aura_rsp->hdr.rc != 0) {
31002e5aaacSThierry Herbelot 		rc = NPA_ERR_AURA_POOL_FINI;
31102e5aaacSThierry Herbelot 		goto exit;
31202e5aaacSThierry Herbelot 	}
313ea4d70ccSAshwin Sekhar T K 
314143a419eSAshwin Sekhar T K 	if (roc_model_is_cn20k()) {
315143a419eSAshwin Sekhar T K 		/* In cn20k, NPA does not use NDC */
316143a419eSAshwin Sekhar T K 		rc = 0;
317143a419eSAshwin Sekhar T K 		goto exit;
318143a419eSAshwin Sekhar T K 	}
319143a419eSAshwin Sekhar T K 
320ea4d70ccSAshwin Sekhar T K 	/* Sync NDC-NPA for LF */
321ea4d70ccSAshwin Sekhar T K 	ndc_req = mbox_alloc_msg_ndc_sync_op(mbox);
322ea4d70ccSAshwin Sekhar T K 	if (ndc_req == NULL) {
323ea4d70ccSAshwin Sekhar T K 		rc = -ENOSPC;
324ea4d70ccSAshwin Sekhar T K 		goto exit;
325ea4d70ccSAshwin Sekhar T K 	}
326ea4d70ccSAshwin Sekhar T K 	ndc_req->npa_lf_sync = 1;
327ea4d70ccSAshwin Sekhar T K 	rc = mbox_process(mbox);
328ea4d70ccSAshwin Sekhar T K 	if (rc) {
329ea4d70ccSAshwin Sekhar T K 		plt_err("Error on NDC-NPA LF sync, rc %d", rc);
330ea4d70ccSAshwin Sekhar T K 		rc = NPA_ERR_AURA_POOL_FINI;
331ea4d70ccSAshwin Sekhar T K 		goto exit;
332ea4d70ccSAshwin Sekhar T K 	}
333ea4d70ccSAshwin Sekhar T K 	rc = 0;
334ea4d70ccSAshwin Sekhar T K exit:
335ea4d70ccSAshwin Sekhar T K 	mbox_put(mbox);
336ea4d70ccSAshwin Sekhar T K 	return rc;
337ea4d70ccSAshwin Sekhar T K }
338ea4d70ccSAshwin Sekhar T K 
3391d9f8a48SAshwin Sekhar T K int
3401d9f8a48SAshwin Sekhar T K roc_npa_pool_op_pc_reset(uint64_t aura_handle)
3411d9f8a48SAshwin Sekhar T K {
3421d9f8a48SAshwin Sekhar T K 	struct npa_lf *lf = idev_npa_obj_get();
3431d9f8a48SAshwin Sekhar T K 	struct npa_aq_enq_req *pool_req;
3441d9f8a48SAshwin Sekhar T K 	struct npa_aq_enq_rsp *pool_rsp;
3451d9f8a48SAshwin Sekhar T K 	struct ndc_sync_op *ndc_req;
3461d9f8a48SAshwin Sekhar T K 	struct mbox_dev *mdev;
3471d9f8a48SAshwin Sekhar T K 	int rc = -ENOSPC, off;
3481d9f8a48SAshwin Sekhar T K 	struct mbox *mbox;
3491d9f8a48SAshwin Sekhar T K 
3501d9f8a48SAshwin Sekhar T K 	if (lf == NULL)
3511d9f8a48SAshwin Sekhar T K 		return NPA_ERR_PARAM;
3521d9f8a48SAshwin Sekhar T K 
35344a9307cSRakesh Kudurumalla 	mbox = mbox_get(lf->mbox);
3541d9f8a48SAshwin Sekhar T K 	mdev = &mbox->dev[0];
3551d9f8a48SAshwin Sekhar T K 	plt_npa_dbg("lf=%p aura_handle=0x%" PRIx64, lf, aura_handle);
3561d9f8a48SAshwin Sekhar T K 
3571d9f8a48SAshwin Sekhar T K 	pool_req = mbox_alloc_msg_npa_aq_enq(mbox);
3581d9f8a48SAshwin Sekhar T K 	if (pool_req == NULL)
35944a9307cSRakesh Kudurumalla 		goto exit;
3601d9f8a48SAshwin Sekhar T K 	pool_req->aura_id = roc_npa_aura_handle_to_aura(aura_handle);
3611d9f8a48SAshwin Sekhar T K 	pool_req->ctype = NPA_AQ_CTYPE_POOL;
3621d9f8a48SAshwin Sekhar T K 	pool_req->op = NPA_AQ_INSTOP_WRITE;
3631d9f8a48SAshwin Sekhar T K 	pool_req->pool.op_pc = 0;
3641d9f8a48SAshwin Sekhar T K 	pool_req->pool_mask.op_pc = ~pool_req->pool_mask.op_pc;
3651d9f8a48SAshwin Sekhar T K 
3661d9f8a48SAshwin Sekhar T K 	rc = mbox_process(mbox);
3671d9f8a48SAshwin Sekhar T K 	if (rc < 0)
36844a9307cSRakesh Kudurumalla 		goto exit;
3691d9f8a48SAshwin Sekhar T K 
3701d9f8a48SAshwin Sekhar T K 	off = mbox->rx_start +
3711d9f8a48SAshwin Sekhar T K 	      PLT_ALIGN(sizeof(struct mbox_hdr), MBOX_MSG_ALIGN);
3721d9f8a48SAshwin Sekhar T K 	pool_rsp = (struct npa_aq_enq_rsp *)((uintptr_t)mdev->mbase + off);
3731d9f8a48SAshwin Sekhar T K 
37444a9307cSRakesh Kudurumalla 	if (pool_rsp->hdr.rc != 0) {
37544a9307cSRakesh Kudurumalla 		rc = NPA_ERR_AURA_POOL_FINI;
37644a9307cSRakesh Kudurumalla 		goto exit;
37744a9307cSRakesh Kudurumalla 	}
3781d9f8a48SAshwin Sekhar T K 
3791d9f8a48SAshwin Sekhar T K 	/* Sync NDC-NPA for LF */
3801d9f8a48SAshwin Sekhar T K 	ndc_req = mbox_alloc_msg_ndc_sync_op(mbox);
38144a9307cSRakesh Kudurumalla 	if (ndc_req == NULL) {
38244a9307cSRakesh Kudurumalla 		rc = -ENOSPC;
38344a9307cSRakesh Kudurumalla 		goto exit;
38444a9307cSRakesh Kudurumalla 	}
3851d9f8a48SAshwin Sekhar T K 	ndc_req->npa_lf_sync = 1;
3861d9f8a48SAshwin Sekhar T K 	rc = mbox_process(mbox);
3871d9f8a48SAshwin Sekhar T K 	if (rc) {
3881d9f8a48SAshwin Sekhar T K 		plt_err("Error on NDC-NPA LF sync, rc %d", rc);
38944a9307cSRakesh Kudurumalla 		rc = NPA_ERR_AURA_POOL_FINI;
39044a9307cSRakesh Kudurumalla 		goto exit;
3911d9f8a48SAshwin Sekhar T K 	}
39244a9307cSRakesh Kudurumalla 	rc = 0;
39344a9307cSRakesh Kudurumalla exit:
39444a9307cSRakesh Kudurumalla 	mbox_put(mbox);
39544a9307cSRakesh Kudurumalla 	return rc;
3961d9f8a48SAshwin Sekhar T K }
397c8c967e1SNithin Dabilpuram 
398c8c967e1SNithin Dabilpuram int
399c8c967e1SNithin Dabilpuram roc_npa_aura_drop_set(uint64_t aura_handle, uint64_t limit, bool ena)
400c8c967e1SNithin Dabilpuram {
401143a419eSAshwin Sekhar T K 	struct npa_cn20k_aq_enq_req *aura_req_cn20k;
402c8c967e1SNithin Dabilpuram 	struct npa_aq_enq_req *aura_req;
403c8c967e1SNithin Dabilpuram 	struct npa_lf *lf;
40444a9307cSRakesh Kudurumalla 	struct mbox *mbox;
405c8c967e1SNithin Dabilpuram 	int rc;
406c8c967e1SNithin Dabilpuram 
407c8c967e1SNithin Dabilpuram 	lf = idev_npa_obj_get();
408c8c967e1SNithin Dabilpuram 	if (lf == NULL)
409c8c967e1SNithin Dabilpuram 		return NPA_ERR_DEVICE_NOT_BOUNDED;
41044a9307cSRakesh Kudurumalla 	mbox = mbox_get(lf->mbox);
411143a419eSAshwin Sekhar T K 	if (roc_model_is_cn20k()) {
412143a419eSAshwin Sekhar T K 		aura_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox);
413143a419eSAshwin Sekhar T K 		aura_req = (struct npa_aq_enq_req *)aura_req_cn20k;
414143a419eSAshwin Sekhar T K 	} else {
41544a9307cSRakesh Kudurumalla 		aura_req = mbox_alloc_msg_npa_aq_enq(mbox);
416143a419eSAshwin Sekhar T K 	}
41744a9307cSRakesh Kudurumalla 	if (aura_req == NULL) {
41844a9307cSRakesh Kudurumalla 		rc = -ENOMEM;
41944a9307cSRakesh Kudurumalla 		goto exit;
42044a9307cSRakesh Kudurumalla 	}
421c8c967e1SNithin Dabilpuram 	aura_req->aura_id = roc_npa_aura_handle_to_aura(aura_handle);
422c8c967e1SNithin Dabilpuram 	aura_req->ctype = NPA_AQ_CTYPE_AURA;
423c8c967e1SNithin Dabilpuram 	aura_req->op = NPA_AQ_INSTOP_WRITE;
424c8c967e1SNithin Dabilpuram 
425c8c967e1SNithin Dabilpuram 	aura_req->aura.aura_drop_ena = ena;
426c8c967e1SNithin Dabilpuram 	aura_req->aura.aura_drop = limit;
427c8c967e1SNithin Dabilpuram 	aura_req->aura_mask.aura_drop_ena =
428c8c967e1SNithin Dabilpuram 		~(aura_req->aura_mask.aura_drop_ena);
429c8c967e1SNithin Dabilpuram 	aura_req->aura_mask.aura_drop = ~(aura_req->aura_mask.aura_drop);
43044a9307cSRakesh Kudurumalla 	rc = mbox_process(mbox);
431c8c967e1SNithin Dabilpuram 
43244a9307cSRakesh Kudurumalla exit:
43344a9307cSRakesh Kudurumalla 	mbox_put(mbox);
434c8c967e1SNithin Dabilpuram 	return rc;
435c8c967e1SNithin Dabilpuram }
436c8c967e1SNithin Dabilpuram 
437f765f561SAshwin Sekhar T K static inline char *
438f765f561SAshwin Sekhar T K npa_stack_memzone_name(struct npa_lf *lf, int pool_id, char *name)
439f765f561SAshwin Sekhar T K {
440f765f561SAshwin Sekhar T K 	snprintf(name, PLT_MEMZONE_NAMESIZE, "roc_npa_stack_%x_%d", lf->pf_func,
441f765f561SAshwin Sekhar T K 		 pool_id);
442f765f561SAshwin Sekhar T K 	return name;
443f765f561SAshwin Sekhar T K }
444f765f561SAshwin Sekhar T K 
445f765f561SAshwin Sekhar T K static inline const struct plt_memzone *
446f765f561SAshwin Sekhar T K npa_stack_dma_alloc(struct npa_lf *lf, char *name, int pool_id, size_t size)
447f765f561SAshwin Sekhar T K {
448f765f561SAshwin Sekhar T K 	const char *mz_name = npa_stack_memzone_name(lf, pool_id, name);
449e587e0d5SAshwin Sekhar T K 	size = PLT_ALIGN_CEIL(size, ROC_ALIGN);
450f765f561SAshwin Sekhar T K 
45114a4e284SAshwin Sekhar T K 	return plt_memzone_reserve_aligned(mz_name, size, 0, ROC_ALIGN);
452f765f561SAshwin Sekhar T K }
453f765f561SAshwin Sekhar T K 
454f765f561SAshwin Sekhar T K static inline int
455f765f561SAshwin Sekhar T K npa_stack_dma_free(struct npa_lf *lf, char *name, int pool_id)
456f765f561SAshwin Sekhar T K {
457f765f561SAshwin Sekhar T K 	const struct plt_memzone *mz;
458f765f561SAshwin Sekhar T K 
459f765f561SAshwin Sekhar T K 	mz = plt_memzone_lookup(npa_stack_memzone_name(lf, pool_id, name));
460f765f561SAshwin Sekhar T K 	if (mz == NULL)
461f765f561SAshwin Sekhar T K 		return NPA_ERR_PARAM;
462f765f561SAshwin Sekhar T K 
463f765f561SAshwin Sekhar T K 	return plt_memzone_free(mz);
464f765f561SAshwin Sekhar T K }
465f765f561SAshwin Sekhar T K 
466f765f561SAshwin Sekhar T K static inline int
467f765f561SAshwin Sekhar T K bitmap_ctzll(uint64_t slab)
468f765f561SAshwin Sekhar T K {
469f765f561SAshwin Sekhar T K 	if (slab == 0)
470f765f561SAshwin Sekhar T K 		return 0;
471f765f561SAshwin Sekhar T K 
472354bf671SJerin Jacob 	return plt_ctz64(slab);
473f765f561SAshwin Sekhar T K }
474f765f561SAshwin Sekhar T K 
475f765f561SAshwin Sekhar T K static int
4768e5a4adbSNithin Dabilpuram find_free_aura(struct npa_lf *lf, uint32_t flags)
4778e5a4adbSNithin Dabilpuram {
4788e5a4adbSNithin Dabilpuram 	struct plt_bitmap *bmp = lf->npa_bmp;
4798e5a4adbSNithin Dabilpuram 	uint64_t aura0_state = 0;
4808e5a4adbSNithin Dabilpuram 	uint64_t slab;
4818e5a4adbSNithin Dabilpuram 	uint32_t pos;
4828e5a4adbSNithin Dabilpuram 	int idx = -1;
4838e5a4adbSNithin Dabilpuram 	int rc;
4848e5a4adbSNithin Dabilpuram 
4858e5a4adbSNithin Dabilpuram 	if (flags & ROC_NPA_ZERO_AURA_F) {
4868e5a4adbSNithin Dabilpuram 		/* Only look for zero aura */
4878e5a4adbSNithin Dabilpuram 		if (plt_bitmap_get(bmp, 0))
4888e5a4adbSNithin Dabilpuram 			return 0;
4898e5a4adbSNithin Dabilpuram 		plt_err("Zero aura already in use");
4908e5a4adbSNithin Dabilpuram 		return -1;
4918e5a4adbSNithin Dabilpuram 	}
4928e5a4adbSNithin Dabilpuram 
4938e5a4adbSNithin Dabilpuram 	if (lf->zero_aura_rsvd) {
4948e5a4adbSNithin Dabilpuram 		/* Save and clear zero aura bit if needed */
4958e5a4adbSNithin Dabilpuram 		aura0_state = plt_bitmap_get(bmp, 0);
4968e5a4adbSNithin Dabilpuram 		if (aura0_state)
4978e5a4adbSNithin Dabilpuram 			plt_bitmap_clear(bmp, 0);
4988e5a4adbSNithin Dabilpuram 	}
4998e5a4adbSNithin Dabilpuram 
5008e5a4adbSNithin Dabilpuram 	pos = 0;
5018e5a4adbSNithin Dabilpuram 	slab = 0;
5028e5a4adbSNithin Dabilpuram 	/* Scan from the beginning */
5038e5a4adbSNithin Dabilpuram 	plt_bitmap_scan_init(bmp);
5048e5a4adbSNithin Dabilpuram 	/* Scan bitmap to get the free pool */
5058e5a4adbSNithin Dabilpuram 	rc = plt_bitmap_scan(bmp, &pos, &slab);
5068e5a4adbSNithin Dabilpuram 	/* Empty bitmap */
5078e5a4adbSNithin Dabilpuram 	if (rc == 0) {
5088e5a4adbSNithin Dabilpuram 		plt_err("Aura's exhausted");
5098e5a4adbSNithin Dabilpuram 		goto empty;
5108e5a4adbSNithin Dabilpuram 	}
5118e5a4adbSNithin Dabilpuram 
5128e5a4adbSNithin Dabilpuram 	idx = pos + bitmap_ctzll(slab);
5138e5a4adbSNithin Dabilpuram empty:
5148e5a4adbSNithin Dabilpuram 	if (lf->zero_aura_rsvd && aura0_state)
5158e5a4adbSNithin Dabilpuram 		plt_bitmap_set(bmp, 0);
5168e5a4adbSNithin Dabilpuram 
5178e5a4adbSNithin Dabilpuram 	return idx;
5188e5a4adbSNithin Dabilpuram }
5198e5a4adbSNithin Dabilpuram 
5208e5a4adbSNithin Dabilpuram static int
521f765f561SAshwin Sekhar T K npa_aura_pool_pair_alloc(struct npa_lf *lf, const uint32_t block_size,
522f765f561SAshwin Sekhar T K 			 const uint32_t block_count, struct npa_aura_s *aura,
5238e5a4adbSNithin Dabilpuram 			 struct npa_pool_s *pool, uint64_t *aura_handle,
5248e5a4adbSNithin Dabilpuram 			 uint32_t flags)
525f765f561SAshwin Sekhar T K {
526f765f561SAshwin Sekhar T K 	int rc, aura_id, pool_id, stack_size, alloc_size;
527f765f561SAshwin Sekhar T K 	char name[PLT_MEMZONE_NAMESIZE];
528f765f561SAshwin Sekhar T K 	const struct plt_memzone *mz;
529f765f561SAshwin Sekhar T K 
530f765f561SAshwin Sekhar T K 	/* Sanity check */
531f765f561SAshwin Sekhar T K 	if (!lf || !block_size || !block_count || !pool || !aura ||
532f765f561SAshwin Sekhar T K 	    !aura_handle)
533f765f561SAshwin Sekhar T K 		return NPA_ERR_PARAM;
534f765f561SAshwin Sekhar T K 
535f765f561SAshwin Sekhar T K 	/* Block size should be cache line aligned and in range of 128B-128KB */
536f765f561SAshwin Sekhar T K 	if (block_size % ROC_ALIGN || block_size < 128 ||
53750d08d39SJerin Jacob 	    block_size > ROC_NPA_MAX_BLOCK_SZ)
538f765f561SAshwin Sekhar T K 		return NPA_ERR_INVALID_BLOCK_SZ;
539f765f561SAshwin Sekhar T K 
540f765f561SAshwin Sekhar T K 	/* Get aura_id from resource bitmap */
54144a9307cSRakesh Kudurumalla 	roc_npa_dev_lock();
5428e5a4adbSNithin Dabilpuram 	aura_id = find_free_aura(lf, flags);
54344a9307cSRakesh Kudurumalla 	if (aura_id < 0) {
54444a9307cSRakesh Kudurumalla 		roc_npa_dev_unlock();
5458e5a4adbSNithin Dabilpuram 		return NPA_ERR_AURA_ID_ALLOC;
54644a9307cSRakesh Kudurumalla 	}
5478e5a4adbSNithin Dabilpuram 
548f765f561SAshwin Sekhar T K 	/* Mark pool as reserved */
549f765f561SAshwin Sekhar T K 	plt_bitmap_clear(lf->npa_bmp, aura_id);
55044a9307cSRakesh Kudurumalla 	roc_npa_dev_unlock();
551f765f561SAshwin Sekhar T K 
552f765f561SAshwin Sekhar T K 	/* Configuration based on each aura has separate pool(aura-pool pair) */
553f765f561SAshwin Sekhar T K 	pool_id = aura_id;
554f765f561SAshwin Sekhar T K 	rc = (aura_id < 0 || pool_id >= (int)lf->nr_pools ||
555f765f561SAshwin Sekhar T K 	      aura_id >= (int)BIT_ULL(6 + lf->aura_sz)) ?
556f765f561SAshwin Sekhar T K 			   NPA_ERR_AURA_ID_ALLOC :
557f765f561SAshwin Sekhar T K 			   0;
558f765f561SAshwin Sekhar T K 	if (rc)
559f765f561SAshwin Sekhar T K 		goto exit;
560f765f561SAshwin Sekhar T K 
561f765f561SAshwin Sekhar T K 	/* Allocate stack memory */
562f765f561SAshwin Sekhar T K 	stack_size = (block_count + lf->stack_pg_ptrs - 1) / lf->stack_pg_ptrs;
563f765f561SAshwin Sekhar T K 	alloc_size = stack_size * lf->stack_pg_bytes;
564f765f561SAshwin Sekhar T K 
565f765f561SAshwin Sekhar T K 	mz = npa_stack_dma_alloc(lf, name, pool_id, alloc_size);
566f765f561SAshwin Sekhar T K 	if (mz == NULL) {
567f765f561SAshwin Sekhar T K 		rc = NPA_ERR_ALLOC;
568f765f561SAshwin Sekhar T K 		goto aura_res_put;
569f765f561SAshwin Sekhar T K 	}
570f765f561SAshwin Sekhar T K 
571f765f561SAshwin Sekhar T K 	/* Update aura fields */
572f765f561SAshwin Sekhar T K 	aura->pool_addr = pool_id; /* AF will translate to associated poolctx */
573f765f561SAshwin Sekhar T K 	aura->ena = 1;
57495bec117SSatha Rao 	aura->shift = plt_log2_u32(block_count);
57595bec117SSatha Rao 	aura->shift = aura->shift < 8 ? 0 : aura->shift - 8;
576f765f561SAshwin Sekhar T K 	aura->limit = block_count;
577f765f561SAshwin Sekhar T K 	aura->pool_caching = 1;
578f765f561SAshwin Sekhar T K 	aura->err_int_ena = BIT(NPA_AURA_ERR_INT_AURA_ADD_OVER);
579f765f561SAshwin Sekhar T K 	aura->err_int_ena |= BIT(NPA_AURA_ERR_INT_AURA_ADD_UNDER);
580f765f561SAshwin Sekhar T K 	aura->err_int_ena |= BIT(NPA_AURA_ERR_INT_AURA_FREE_UNDER);
581f765f561SAshwin Sekhar T K 	aura->err_int_ena |= BIT(NPA_AURA_ERR_INT_POOL_DIS);
582c8c967e1SNithin Dabilpuram 	aura->avg_con = 0;
583f765f561SAshwin Sekhar T K 	/* Many to one reduction */
584f765f561SAshwin Sekhar T K 	aura->err_qint_idx = aura_id % lf->qints;
585f765f561SAshwin Sekhar T K 
586f765f561SAshwin Sekhar T K 	/* Update pool fields */
587f765f561SAshwin Sekhar T K 	pool->stack_base = mz->iova;
588f765f561SAshwin Sekhar T K 	pool->ena = 1;
58995377ce2SKommula Shiva Shankar 	/* In opaque mode buffer size must be 0 */
59095377ce2SKommula Shiva Shankar 	if (!pool->nat_align)
59195377ce2SKommula Shiva Shankar 		pool->buf_size = 0;
59295377ce2SKommula Shiva Shankar 	else
593f765f561SAshwin Sekhar T K 		pool->buf_size = block_size / ROC_ALIGN;
594f765f561SAshwin Sekhar T K 	pool->stack_max_pages = stack_size;
59595bec117SSatha Rao 	pool->shift = plt_log2_u32(block_count);
59695bec117SSatha Rao 	pool->shift = pool->shift < 8 ? 0 : pool->shift - 8;
597f765f561SAshwin Sekhar T K 	pool->ptr_start = 0;
598f765f561SAshwin Sekhar T K 	pool->ptr_end = ~0;
599f765f561SAshwin Sekhar T K 	pool->stack_caching = 1;
600f765f561SAshwin Sekhar T K 	pool->err_int_ena = BIT(NPA_POOL_ERR_INT_OVFLS);
601f765f561SAshwin Sekhar T K 	pool->err_int_ena |= BIT(NPA_POOL_ERR_INT_RANGE);
602f765f561SAshwin Sekhar T K 	pool->err_int_ena |= BIT(NPA_POOL_ERR_INT_PERR);
603c8c967e1SNithin Dabilpuram 	pool->avg_con = 0;
604f765f561SAshwin Sekhar T K 
605f765f561SAshwin Sekhar T K 	/* Many to one reduction */
606f765f561SAshwin Sekhar T K 	pool->err_qint_idx = pool_id % lf->qints;
607f765f561SAshwin Sekhar T K 
608f765f561SAshwin Sekhar T K 	/* Issue AURA_INIT and POOL_INIT op */
609f765f561SAshwin Sekhar T K 	rc = npa_aura_pool_init(lf->mbox, aura_id, aura, pool);
610f765f561SAshwin Sekhar T K 	if (rc)
611f765f561SAshwin Sekhar T K 		goto stack_mem_free;
612f765f561SAshwin Sekhar T K 
6135c9ccdd7SRakesh Kudurumalla 	lf->aura_attr[aura_id].shift = aura->shift;
6145c9ccdd7SRakesh Kudurumalla 	lf->aura_attr[aura_id].limit = aura->limit;
615f765f561SAshwin Sekhar T K 	*aura_handle = roc_npa_aura_handle_gen(aura_id, lf->base);
616f765f561SAshwin Sekhar T K 	/* Update aura count */
617f765f561SAshwin Sekhar T K 	roc_npa_aura_op_cnt_set(*aura_handle, 0, block_count);
618f765f561SAshwin Sekhar T K 	/* Read it back to make sure aura count is updated */
619f765f561SAshwin Sekhar T K 	roc_npa_aura_op_cnt_get(*aura_handle);
620f765f561SAshwin Sekhar T K 
621f765f561SAshwin Sekhar T K 	return 0;
622f765f561SAshwin Sekhar T K 
623f765f561SAshwin Sekhar T K stack_mem_free:
624f765f561SAshwin Sekhar T K 	plt_memzone_free(mz);
625f765f561SAshwin Sekhar T K aura_res_put:
62644a9307cSRakesh Kudurumalla 	roc_npa_dev_lock();
627f765f561SAshwin Sekhar T K 	plt_bitmap_set(lf->npa_bmp, aura_id);
62844a9307cSRakesh Kudurumalla 	roc_npa_dev_unlock();
629f765f561SAshwin Sekhar T K exit:
630f765f561SAshwin Sekhar T K 	return rc;
631f765f561SAshwin Sekhar T K }
632f765f561SAshwin Sekhar T K 
633f765f561SAshwin Sekhar T K int
634f765f561SAshwin Sekhar T K roc_npa_pool_create(uint64_t *aura_handle, uint32_t block_size,
635f765f561SAshwin Sekhar T K 		    uint32_t block_count, struct npa_aura_s *aura,
6368e5a4adbSNithin Dabilpuram 		    struct npa_pool_s *pool, uint32_t flags)
637f765f561SAshwin Sekhar T K {
638f765f561SAshwin Sekhar T K 	struct npa_aura_s defaura;
639f765f561SAshwin Sekhar T K 	struct npa_pool_s defpool;
640f765f561SAshwin Sekhar T K 	struct idev_cfg *idev;
641f765f561SAshwin Sekhar T K 	struct npa_lf *lf;
642f765f561SAshwin Sekhar T K 	int rc;
643f765f561SAshwin Sekhar T K 
644f765f561SAshwin Sekhar T K 	lf = idev_npa_obj_get();
645f765f561SAshwin Sekhar T K 	if (lf == NULL) {
646f765f561SAshwin Sekhar T K 		rc = NPA_ERR_DEVICE_NOT_BOUNDED;
647f765f561SAshwin Sekhar T K 		goto error;
648f765f561SAshwin Sekhar T K 	}
649f765f561SAshwin Sekhar T K 
650f765f561SAshwin Sekhar T K 	idev = idev_get_cfg();
651f765f561SAshwin Sekhar T K 	if (idev == NULL) {
652f765f561SAshwin Sekhar T K 		rc = NPA_ERR_ALLOC;
653f765f561SAshwin Sekhar T K 		goto error;
654f765f561SAshwin Sekhar T K 	}
655f765f561SAshwin Sekhar T K 
6568e5a4adbSNithin Dabilpuram 	if (flags & ROC_NPA_ZERO_AURA_F && !lf->zero_aura_rsvd) {
6578e5a4adbSNithin Dabilpuram 		rc = NPA_ERR_ALLOC;
6588e5a4adbSNithin Dabilpuram 		goto error;
6598e5a4adbSNithin Dabilpuram 	}
6608e5a4adbSNithin Dabilpuram 
661f765f561SAshwin Sekhar T K 	if (aura == NULL) {
662f765f561SAshwin Sekhar T K 		memset(&defaura, 0, sizeof(struct npa_aura_s));
663f765f561SAshwin Sekhar T K 		aura = &defaura;
664f765f561SAshwin Sekhar T K 	}
665f765f561SAshwin Sekhar T K 	if (pool == NULL) {
666f765f561SAshwin Sekhar T K 		memset(&defpool, 0, sizeof(struct npa_pool_s));
667f765f561SAshwin Sekhar T K 		defpool.nat_align = 1;
668f765f561SAshwin Sekhar T K 		defpool.buf_offset = 1;
669f765f561SAshwin Sekhar T K 		pool = &defpool;
670f765f561SAshwin Sekhar T K 	}
671f765f561SAshwin Sekhar T K 
672f765f561SAshwin Sekhar T K 	rc = npa_aura_pool_pair_alloc(lf, block_size, block_count, aura, pool,
6738e5a4adbSNithin Dabilpuram 				      aura_handle, flags);
674f765f561SAshwin Sekhar T K 	if (rc) {
675f765f561SAshwin Sekhar T K 		plt_err("Failed to alloc pool or aura rc=%d", rc);
676f765f561SAshwin Sekhar T K 		goto error;
677f765f561SAshwin Sekhar T K 	}
678f765f561SAshwin Sekhar T K 
679f765f561SAshwin Sekhar T K 	plt_npa_dbg("lf=%p block_sz=%d block_count=%d aura_handle=0x%" PRIx64,
680f765f561SAshwin Sekhar T K 		    lf, block_size, block_count, *aura_handle);
681f765f561SAshwin Sekhar T K 
682f765f561SAshwin Sekhar T K 	/* Just hold the reference of the object */
683f765f561SAshwin Sekhar T K 	__atomic_fetch_add(&idev->npa_refcnt, 1, __ATOMIC_SEQ_CST);
684f765f561SAshwin Sekhar T K error:
685f765f561SAshwin Sekhar T K 	return rc;
686f765f561SAshwin Sekhar T K }
687f765f561SAshwin Sekhar T K 
688ea4d70ccSAshwin Sekhar T K static int
689ea4d70ccSAshwin Sekhar T K npa_aura_alloc(struct npa_lf *lf, const uint32_t block_count, int pool_id,
690ea4d70ccSAshwin Sekhar T K 	       struct npa_aura_s *aura, uint64_t *aura_handle, uint32_t flags)
691ea4d70ccSAshwin Sekhar T K {
692ea4d70ccSAshwin Sekhar T K 	int rc, aura_id;
693ea4d70ccSAshwin Sekhar T K 
694ea4d70ccSAshwin Sekhar T K 	/* Sanity check */
695ea4d70ccSAshwin Sekhar T K 	if (!lf || !aura || !aura_handle)
696ea4d70ccSAshwin Sekhar T K 		return NPA_ERR_PARAM;
697ea4d70ccSAshwin Sekhar T K 
698ea4d70ccSAshwin Sekhar T K 	roc_npa_dev_lock();
699ea4d70ccSAshwin Sekhar T K 	/* Get aura_id from resource bitmap */
700ea4d70ccSAshwin Sekhar T K 	aura_id = find_free_aura(lf, flags);
701ea4d70ccSAshwin Sekhar T K 	if (aura_id < 0) {
702ea4d70ccSAshwin Sekhar T K 		roc_npa_dev_unlock();
703ea4d70ccSAshwin Sekhar T K 		return NPA_ERR_AURA_ID_ALLOC;
704ea4d70ccSAshwin Sekhar T K 	}
705ea4d70ccSAshwin Sekhar T K 
706ea4d70ccSAshwin Sekhar T K 	/* Mark aura as reserved */
707ea4d70ccSAshwin Sekhar T K 	plt_bitmap_clear(lf->npa_bmp, aura_id);
708ea4d70ccSAshwin Sekhar T K 
709ea4d70ccSAshwin Sekhar T K 	roc_npa_dev_unlock();
710ea4d70ccSAshwin Sekhar T K 	rc = (aura_id < 0 || pool_id >= (int)lf->nr_pools ||
711ea4d70ccSAshwin Sekhar T K 	      aura_id >= (int)BIT_ULL(6 + lf->aura_sz)) ?
712ea4d70ccSAshwin Sekhar T K 			NPA_ERR_AURA_ID_ALLOC :
713ea4d70ccSAshwin Sekhar T K 			0;
714ea4d70ccSAshwin Sekhar T K 	if (rc)
715ea4d70ccSAshwin Sekhar T K 		goto exit;
716ea4d70ccSAshwin Sekhar T K 
717ea4d70ccSAshwin Sekhar T K 	/* Update aura fields */
718ea4d70ccSAshwin Sekhar T K 	aura->pool_addr = pool_id; /* AF will translate to associated poolctx */
719ea4d70ccSAshwin Sekhar T K 	aura->ena = 1;
720ea4d70ccSAshwin Sekhar T K 	aura->shift = plt_log2_u32(block_count);
721ea4d70ccSAshwin Sekhar T K 	aura->shift = aura->shift < 8 ? 0 : aura->shift - 8;
722ea4d70ccSAshwin Sekhar T K 	aura->limit = block_count;
723ea4d70ccSAshwin Sekhar T K 	aura->pool_caching = 1;
724ea4d70ccSAshwin Sekhar T K 	aura->err_int_ena = BIT(NPA_AURA_ERR_INT_AURA_ADD_OVER);
725ea4d70ccSAshwin Sekhar T K 	aura->err_int_ena |= BIT(NPA_AURA_ERR_INT_AURA_ADD_UNDER);
726ea4d70ccSAshwin Sekhar T K 	aura->err_int_ena |= BIT(NPA_AURA_ERR_INT_AURA_FREE_UNDER);
727ea4d70ccSAshwin Sekhar T K 	aura->err_int_ena |= BIT(NPA_AURA_ERR_INT_POOL_DIS);
728ea4d70ccSAshwin Sekhar T K 	aura->avg_con = 0;
729ea4d70ccSAshwin Sekhar T K 	/* Many to one reduction */
730ea4d70ccSAshwin Sekhar T K 	aura->err_qint_idx = aura_id % lf->qints;
731ea4d70ccSAshwin Sekhar T K 
732ea4d70ccSAshwin Sekhar T K 	/* Issue AURA_INIT and POOL_INIT op */
733ea4d70ccSAshwin Sekhar T K 	rc = npa_aura_init(lf->mbox, aura_id, aura);
734ea4d70ccSAshwin Sekhar T K 	if (rc)
735ea4d70ccSAshwin Sekhar T K 		return rc;
736ea4d70ccSAshwin Sekhar T K 
7375c9ccdd7SRakesh Kudurumalla 	lf->aura_attr[aura_id].shift = aura->shift;
7385c9ccdd7SRakesh Kudurumalla 	lf->aura_attr[aura_id].limit = aura->limit;
739ea4d70ccSAshwin Sekhar T K 	*aura_handle = roc_npa_aura_handle_gen(aura_id, lf->base);
740ea4d70ccSAshwin Sekhar T K 
741ea4d70ccSAshwin Sekhar T K 	return 0;
742ea4d70ccSAshwin Sekhar T K 
743ea4d70ccSAshwin Sekhar T K exit:
744ea4d70ccSAshwin Sekhar T K 	return rc;
745ea4d70ccSAshwin Sekhar T K }
746ea4d70ccSAshwin Sekhar T K 
747ea4d70ccSAshwin Sekhar T K int
748ea4d70ccSAshwin Sekhar T K roc_npa_aura_create(uint64_t *aura_handle, uint32_t block_count,
749ea4d70ccSAshwin Sekhar T K 		    struct npa_aura_s *aura, int pool_id, uint32_t flags)
750ea4d70ccSAshwin Sekhar T K {
751ea4d70ccSAshwin Sekhar T K 	struct npa_aura_s defaura;
752ea4d70ccSAshwin Sekhar T K 	struct idev_cfg *idev;
753ea4d70ccSAshwin Sekhar T K 	struct npa_lf *lf;
754ea4d70ccSAshwin Sekhar T K 	int rc;
755ea4d70ccSAshwin Sekhar T K 
756ea4d70ccSAshwin Sekhar T K 	lf = idev_npa_obj_get();
757ea4d70ccSAshwin Sekhar T K 	if (lf == NULL) {
758ea4d70ccSAshwin Sekhar T K 		rc = NPA_ERR_DEVICE_NOT_BOUNDED;
759ea4d70ccSAshwin Sekhar T K 		goto error;
760ea4d70ccSAshwin Sekhar T K 	}
761ea4d70ccSAshwin Sekhar T K 
762ea4d70ccSAshwin Sekhar T K 	idev = idev_get_cfg();
763ea4d70ccSAshwin Sekhar T K 	if (idev == NULL) {
764ea4d70ccSAshwin Sekhar T K 		rc = NPA_ERR_ALLOC;
765ea4d70ccSAshwin Sekhar T K 		goto error;
766ea4d70ccSAshwin Sekhar T K 	}
767ea4d70ccSAshwin Sekhar T K 
768ea4d70ccSAshwin Sekhar T K 	if (flags & ROC_NPA_ZERO_AURA_F && !lf->zero_aura_rsvd) {
769ea4d70ccSAshwin Sekhar T K 		rc = NPA_ERR_ALLOC;
770ea4d70ccSAshwin Sekhar T K 		goto error;
771ea4d70ccSAshwin Sekhar T K 	}
772ea4d70ccSAshwin Sekhar T K 
773ea4d70ccSAshwin Sekhar T K 	if (aura == NULL) {
774ea4d70ccSAshwin Sekhar T K 		memset(&defaura, 0, sizeof(struct npa_aura_s));
775ea4d70ccSAshwin Sekhar T K 		aura = &defaura;
776ea4d70ccSAshwin Sekhar T K 	}
777ea4d70ccSAshwin Sekhar T K 
778ea4d70ccSAshwin Sekhar T K 	rc = npa_aura_alloc(lf, block_count, pool_id, aura, aura_handle, flags);
779ea4d70ccSAshwin Sekhar T K 	if (rc) {
780ea4d70ccSAshwin Sekhar T K 		plt_err("Failed to alloc aura rc=%d", rc);
781ea4d70ccSAshwin Sekhar T K 		goto error;
782ea4d70ccSAshwin Sekhar T K 	}
783ea4d70ccSAshwin Sekhar T K 
784ea4d70ccSAshwin Sekhar T K 	plt_npa_dbg("lf=%p aura_handle=0x%" PRIx64, lf, *aura_handle);
785ea4d70ccSAshwin Sekhar T K 
786ea4d70ccSAshwin Sekhar T K 	/* Just hold the reference of the object */
787ea4d70ccSAshwin Sekhar T K 	__atomic_fetch_add(&idev->npa_refcnt, 1, __ATOMIC_SEQ_CST);
788ea4d70ccSAshwin Sekhar T K error:
789ea4d70ccSAshwin Sekhar T K 	return rc;
790ea4d70ccSAshwin Sekhar T K }
791ea4d70ccSAshwin Sekhar T K 
792f765f561SAshwin Sekhar T K int
793f765f561SAshwin Sekhar T K roc_npa_aura_limit_modify(uint64_t aura_handle, uint16_t aura_limit)
794f765f561SAshwin Sekhar T K {
795143a419eSAshwin Sekhar T K 	struct npa_cn20k_aq_enq_req *aura_req_cn20k;
796f765f561SAshwin Sekhar T K 	struct npa_aq_enq_req *aura_req;
797f765f561SAshwin Sekhar T K 	struct npa_lf *lf;
79844a9307cSRakesh Kudurumalla 	struct mbox *mbox;
799f765f561SAshwin Sekhar T K 	int rc;
800f765f561SAshwin Sekhar T K 
801f765f561SAshwin Sekhar T K 	lf = idev_npa_obj_get();
802f765f561SAshwin Sekhar T K 	if (lf == NULL)
803f765f561SAshwin Sekhar T K 		return NPA_ERR_DEVICE_NOT_BOUNDED;
804f765f561SAshwin Sekhar T K 
80544a9307cSRakesh Kudurumalla 	mbox = mbox_get(lf->mbox);
806143a419eSAshwin Sekhar T K 	if (roc_model_is_cn20k()) {
807143a419eSAshwin Sekhar T K 		aura_req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox);
808143a419eSAshwin Sekhar T K 		aura_req = (struct npa_aq_enq_req *)aura_req_cn20k;
809143a419eSAshwin Sekhar T K 	} else {
81044a9307cSRakesh Kudurumalla 		aura_req = mbox_alloc_msg_npa_aq_enq(mbox);
811143a419eSAshwin Sekhar T K 	}
81244a9307cSRakesh Kudurumalla 	if (aura_req == NULL) {
81344a9307cSRakesh Kudurumalla 		rc = -ENOMEM;
81444a9307cSRakesh Kudurumalla 		goto exit;
81544a9307cSRakesh Kudurumalla 	}
816f765f561SAshwin Sekhar T K 	aura_req->aura_id = roc_npa_aura_handle_to_aura(aura_handle);
817f765f561SAshwin Sekhar T K 	aura_req->ctype = NPA_AQ_CTYPE_AURA;
818f765f561SAshwin Sekhar T K 	aura_req->op = NPA_AQ_INSTOP_WRITE;
819f765f561SAshwin Sekhar T K 
820f765f561SAshwin Sekhar T K 	aura_req->aura.limit = aura_limit;
821f765f561SAshwin Sekhar T K 	aura_req->aura_mask.limit = ~(aura_req->aura_mask.limit);
82244a9307cSRakesh Kudurumalla 	rc = mbox_process(mbox);
8235c9ccdd7SRakesh Kudurumalla 	if (rc)
8245c9ccdd7SRakesh Kudurumalla 		goto exit;
8255c9ccdd7SRakesh Kudurumalla 	lf->aura_attr[aura_req->aura_id].limit = aura_req->aura.limit;
82644a9307cSRakesh Kudurumalla exit:
82744a9307cSRakesh Kudurumalla 	mbox_put(mbox);
828f765f561SAshwin Sekhar T K 	return rc;
829f765f561SAshwin Sekhar T K }
830f765f561SAshwin Sekhar T K 
831f765f561SAshwin Sekhar T K static int
832f765f561SAshwin Sekhar T K npa_aura_pool_pair_free(struct npa_lf *lf, uint64_t aura_handle)
833f765f561SAshwin Sekhar T K {
834f765f561SAshwin Sekhar T K 	char name[PLT_MEMZONE_NAMESIZE];
835f765f561SAshwin Sekhar T K 	int aura_id, pool_id, rc;
836f765f561SAshwin Sekhar T K 
837f765f561SAshwin Sekhar T K 	if (!lf || !aura_handle)
838f765f561SAshwin Sekhar T K 		return NPA_ERR_PARAM;
839f765f561SAshwin Sekhar T K 
840f765f561SAshwin Sekhar T K 	aura_id = roc_npa_aura_handle_to_aura(aura_handle);
841f765f561SAshwin Sekhar T K 	pool_id = aura_id;
842f765f561SAshwin Sekhar T K 	rc = npa_aura_pool_fini(lf->mbox, aura_id, aura_handle);
843f765f561SAshwin Sekhar T K 	rc |= npa_stack_dma_free(lf, name, pool_id);
844de00cc35SNithin Dabilpuram 	memset(&lf->aura_attr[aura_id], 0, sizeof(struct npa_aura_attr));
845f765f561SAshwin Sekhar T K 
84644a9307cSRakesh Kudurumalla 	roc_npa_dev_lock();
847f765f561SAshwin Sekhar T K 	plt_bitmap_set(lf->npa_bmp, aura_id);
84844a9307cSRakesh Kudurumalla 	roc_npa_dev_unlock();
849f765f561SAshwin Sekhar T K 
850f765f561SAshwin Sekhar T K 	return rc;
851f765f561SAshwin Sekhar T K }
852f765f561SAshwin Sekhar T K 
853f765f561SAshwin Sekhar T K int
854f765f561SAshwin Sekhar T K roc_npa_pool_destroy(uint64_t aura_handle)
855f765f561SAshwin Sekhar T K {
856f765f561SAshwin Sekhar T K 	struct npa_lf *lf = idev_npa_obj_get();
857f765f561SAshwin Sekhar T K 	int rc = 0;
858f765f561SAshwin Sekhar T K 
859f765f561SAshwin Sekhar T K 	plt_npa_dbg("lf=%p aura_handle=0x%" PRIx64, lf, aura_handle);
860f765f561SAshwin Sekhar T K 	rc = npa_aura_pool_pair_free(lf, aura_handle);
861f765f561SAshwin Sekhar T K 	if (rc)
862f765f561SAshwin Sekhar T K 		plt_err("Failed to destroy pool or aura rc=%d", rc);
863f765f561SAshwin Sekhar T K 
864f765f561SAshwin Sekhar T K 	/* Release the reference of npa */
865f765f561SAshwin Sekhar T K 	rc |= npa_lf_fini();
866f765f561SAshwin Sekhar T K 	return rc;
867f765f561SAshwin Sekhar T K }
868f765f561SAshwin Sekhar T K 
869ea4d70ccSAshwin Sekhar T K static int
870ea4d70ccSAshwin Sekhar T K npa_aura_free(struct npa_lf *lf, uint64_t aura_handle)
871ea4d70ccSAshwin Sekhar T K {
872ea4d70ccSAshwin Sekhar T K 	int aura_id, rc;
873ea4d70ccSAshwin Sekhar T K 
874ea4d70ccSAshwin Sekhar T K 	if (!lf || !aura_handle)
875ea4d70ccSAshwin Sekhar T K 		return NPA_ERR_PARAM;
876ea4d70ccSAshwin Sekhar T K 
877ea4d70ccSAshwin Sekhar T K 	aura_id = roc_npa_aura_handle_to_aura(aura_handle);
878ea4d70ccSAshwin Sekhar T K 	rc = npa_aura_fini(lf->mbox, aura_id);
879ea4d70ccSAshwin Sekhar T K 
880ea4d70ccSAshwin Sekhar T K 	if (rc)
881ea4d70ccSAshwin Sekhar T K 		return rc;
882ea4d70ccSAshwin Sekhar T K 
883ea4d70ccSAshwin Sekhar T K 	memset(&lf->aura_attr[aura_id], 0, sizeof(struct npa_aura_attr));
884ea4d70ccSAshwin Sekhar T K 
885ea4d70ccSAshwin Sekhar T K 	roc_npa_dev_lock();
886ea4d70ccSAshwin Sekhar T K 	plt_bitmap_set(lf->npa_bmp, aura_id);
887ea4d70ccSAshwin Sekhar T K 	roc_npa_dev_unlock();
888ea4d70ccSAshwin Sekhar T K 
889ea4d70ccSAshwin Sekhar T K 	return rc;
890ea4d70ccSAshwin Sekhar T K }
891ea4d70ccSAshwin Sekhar T K 
892ea4d70ccSAshwin Sekhar T K int
893ea4d70ccSAshwin Sekhar T K roc_npa_aura_destroy(uint64_t aura_handle)
894ea4d70ccSAshwin Sekhar T K {
895ea4d70ccSAshwin Sekhar T K 	struct npa_lf *lf = idev_npa_obj_get();
896ea4d70ccSAshwin Sekhar T K 	int rc = 0;
897ea4d70ccSAshwin Sekhar T K 
898ea4d70ccSAshwin Sekhar T K 	plt_npa_dbg("lf=%p aura_handle=0x%" PRIx64, lf, aura_handle);
899ea4d70ccSAshwin Sekhar T K 	rc = npa_aura_free(lf, aura_handle);
900ea4d70ccSAshwin Sekhar T K 	if (rc)
901ea4d70ccSAshwin Sekhar T K 		plt_err("Failed to destroy aura rc=%d", rc);
902ea4d70ccSAshwin Sekhar T K 
903ea4d70ccSAshwin Sekhar T K 	/* Release the reference of npa */
904ea4d70ccSAshwin Sekhar T K 	rc |= npa_lf_fini();
905ea4d70ccSAshwin Sekhar T K 	return rc;
906ea4d70ccSAshwin Sekhar T K }
907ea4d70ccSAshwin Sekhar T K 
908f765f561SAshwin Sekhar T K int
909f765f561SAshwin Sekhar T K roc_npa_pool_range_update_check(uint64_t aura_handle)
910f765f561SAshwin Sekhar T K {
911f765f561SAshwin Sekhar T K 	uint64_t aura_id = roc_npa_aura_handle_to_aura(aura_handle);
912143a419eSAshwin Sekhar T K 	struct npa_cn20k_aq_enq_req *req_cn20k;
913f765f561SAshwin Sekhar T K 	__io struct npa_pool_s *pool;
914f765f561SAshwin Sekhar T K 	struct npa_aq_enq_req *req;
915f765f561SAshwin Sekhar T K 	struct npa_aq_enq_rsp *rsp;
916143a419eSAshwin Sekhar T K 	struct npa_aura_lim *lim;
91744a9307cSRakesh Kudurumalla 	struct mbox *mbox;
918143a419eSAshwin Sekhar T K 	struct npa_lf *lf;
919f765f561SAshwin Sekhar T K 	int rc;
920f765f561SAshwin Sekhar T K 
921f765f561SAshwin Sekhar T K 	lf = idev_npa_obj_get();
922f765f561SAshwin Sekhar T K 	if (lf == NULL)
923f765f561SAshwin Sekhar T K 		return NPA_ERR_PARAM;
924f765f561SAshwin Sekhar T K 
925f765f561SAshwin Sekhar T K 	lim = lf->aura_lim;
926f765f561SAshwin Sekhar T K 
92744a9307cSRakesh Kudurumalla 	mbox = mbox_get(lf->mbox);
928143a419eSAshwin Sekhar T K 	if (roc_model_is_cn20k()) {
929143a419eSAshwin Sekhar T K 		req_cn20k = mbox_alloc_msg_npa_cn20k_aq_enq(mbox);
930143a419eSAshwin Sekhar T K 		req = (struct npa_aq_enq_req *)req_cn20k;
931143a419eSAshwin Sekhar T K 	} else {
93244a9307cSRakesh Kudurumalla 		req = mbox_alloc_msg_npa_aq_enq(mbox);
933143a419eSAshwin Sekhar T K 	}
93444a9307cSRakesh Kudurumalla 	if (req == NULL) {
93544a9307cSRakesh Kudurumalla 		rc = -ENOSPC;
93644a9307cSRakesh Kudurumalla 		goto exit;
93744a9307cSRakesh Kudurumalla 	}
938f765f561SAshwin Sekhar T K 
939f765f561SAshwin Sekhar T K 	req->aura_id = aura_id;
940f765f561SAshwin Sekhar T K 	req->ctype = NPA_AQ_CTYPE_POOL;
941f765f561SAshwin Sekhar T K 	req->op = NPA_AQ_INSTOP_READ;
942f765f561SAshwin Sekhar T K 
94344a9307cSRakesh Kudurumalla 	rc = mbox_process_msg(mbox, (void *)&rsp);
944f765f561SAshwin Sekhar T K 	if (rc) {
945f765f561SAshwin Sekhar T K 		plt_err("Failed to get pool(0x%" PRIx64 ") context", aura_id);
94644a9307cSRakesh Kudurumalla 		goto exit;
947f765f561SAshwin Sekhar T K 	}
948f765f561SAshwin Sekhar T K 
949f765f561SAshwin Sekhar T K 	pool = &rsp->pool;
950f765f561SAshwin Sekhar T K 	if (lim[aura_id].ptr_start != pool->ptr_start ||
951f765f561SAshwin Sekhar T K 	    lim[aura_id].ptr_end != pool->ptr_end) {
952f765f561SAshwin Sekhar T K 		plt_err("Range update failed on pool(0x%" PRIx64 ")", aura_id);
95344a9307cSRakesh Kudurumalla 		rc = NPA_ERR_PARAM;
95444a9307cSRakesh Kudurumalla 		goto exit;
955f765f561SAshwin Sekhar T K 	}
956f765f561SAshwin Sekhar T K 
95744a9307cSRakesh Kudurumalla 	rc = 0;
95844a9307cSRakesh Kudurumalla exit:
95944a9307cSRakesh Kudurumalla 	mbox_put(mbox);
96044a9307cSRakesh Kudurumalla 	return rc;
961f765f561SAshwin Sekhar T K }
962f765f561SAshwin Sekhar T K 
9638e5a4adbSNithin Dabilpuram uint64_t
9648e5a4adbSNithin Dabilpuram roc_npa_zero_aura_handle(void)
9658e5a4adbSNithin Dabilpuram {
9668e5a4adbSNithin Dabilpuram 	struct idev_cfg *idev;
9678e5a4adbSNithin Dabilpuram 	struct npa_lf *lf;
9688e5a4adbSNithin Dabilpuram 
9698e5a4adbSNithin Dabilpuram 	lf = idev_npa_obj_get();
9708e5a4adbSNithin Dabilpuram 	if (lf == NULL)
9718e5a4adbSNithin Dabilpuram 		return NPA_ERR_DEVICE_NOT_BOUNDED;
9728e5a4adbSNithin Dabilpuram 
9738e5a4adbSNithin Dabilpuram 	idev = idev_get_cfg();
9748e5a4adbSNithin Dabilpuram 	if (idev == NULL)
9758e5a4adbSNithin Dabilpuram 		return NPA_ERR_ALLOC;
9768e5a4adbSNithin Dabilpuram 
9778e5a4adbSNithin Dabilpuram 	/* Return aura handle only if reserved */
9788e5a4adbSNithin Dabilpuram 	if (lf->zero_aura_rsvd)
9798e5a4adbSNithin Dabilpuram 		return roc_npa_aura_handle_gen(0, lf->base);
9808e5a4adbSNithin Dabilpuram 	return 0;
9818e5a4adbSNithin Dabilpuram }
9828e5a4adbSNithin Dabilpuram 
983ec7c2f5aSShijith Thotton int
984ec7c2f5aSShijith Thotton roc_npa_aura_bp_configure(uint64_t aura_handle, uint16_t bpid, uint8_t bp_intf, uint8_t bp_thresh,
985ec7c2f5aSShijith Thotton 			  bool enable)
986ec7c2f5aSShijith Thotton {
987143a419eSAshwin Sekhar T K 	/* TODO: Add support for CN20K */
988ec7c2f5aSShijith Thotton 	uint32_t aura_id = roc_npa_aura_handle_to_aura(aura_handle);
989ec7c2f5aSShijith Thotton 	struct npa_lf *lf = idev_npa_obj_get();
990ec7c2f5aSShijith Thotton 	struct npa_aq_enq_req *req;
991ec7c2f5aSShijith Thotton 	struct mbox *mbox;
992ec7c2f5aSShijith Thotton 	int rc = 0;
993ec7c2f5aSShijith Thotton 
994747cd5e9SNithin Dabilpuram 	plt_npa_dbg("Setting BPID %u BP_INTF 0x%x BP_THRESH %u enable %u on aura %" PRIx64,
995747cd5e9SNithin Dabilpuram 		    bpid, bp_intf, bp_thresh, enable, aura_handle);
996747cd5e9SNithin Dabilpuram 
997ec7c2f5aSShijith Thotton 	if (lf == NULL)
998ec7c2f5aSShijith Thotton 		return NPA_ERR_PARAM;
999ec7c2f5aSShijith Thotton 
1000ec7c2f5aSShijith Thotton 	mbox = mbox_get(lf->mbox);
1001ec7c2f5aSShijith Thotton 	req = mbox_alloc_msg_npa_aq_enq(mbox);
1002ec7c2f5aSShijith Thotton 	if (req == NULL) {
1003ec7c2f5aSShijith Thotton 		rc = -ENOMEM;
1004ec7c2f5aSShijith Thotton 		goto fail;
1005ec7c2f5aSShijith Thotton 	}
1006ec7c2f5aSShijith Thotton 
1007ec7c2f5aSShijith Thotton 	req->aura_id = aura_id;
1008ec7c2f5aSShijith Thotton 	req->ctype = NPA_AQ_CTYPE_AURA;
1009ec7c2f5aSShijith Thotton 	req->op = NPA_AQ_INSTOP_WRITE;
1010ec7c2f5aSShijith Thotton 
1011ec7c2f5aSShijith Thotton 	if (enable) {
1012ec7c2f5aSShijith Thotton 		if (bp_intf & 0x1) {
1013ec7c2f5aSShijith Thotton 			req->aura.nix0_bpid = bpid;
1014ec7c2f5aSShijith Thotton 			req->aura_mask.nix0_bpid = ~(req->aura_mask.nix0_bpid);
1015ec7c2f5aSShijith Thotton 		} else {
1016ec7c2f5aSShijith Thotton 			req->aura.nix1_bpid = bpid;
1017ec7c2f5aSShijith Thotton 			req->aura_mask.nix1_bpid = ~(req->aura_mask.nix1_bpid);
1018ec7c2f5aSShijith Thotton 		}
1019ec7c2f5aSShijith Thotton 		req->aura.bp = bp_thresh;
1020ec7c2f5aSShijith Thotton 		req->aura_mask.bp = ~(req->aura_mask.bp);
1021ec7c2f5aSShijith Thotton 	} else {
1022ec7c2f5aSShijith Thotton 		req->aura.bp = 0;
1023ec7c2f5aSShijith Thotton 		req->aura_mask.bp = ~(req->aura_mask.bp);
1024ec7c2f5aSShijith Thotton 	}
1025ec7c2f5aSShijith Thotton 
1026ec7c2f5aSShijith Thotton 	req->aura.bp_ena = bp_intf;
1027ec7c2f5aSShijith Thotton 	req->aura_mask.bp_ena = ~(req->aura_mask.bp_ena);
1028ec7c2f5aSShijith Thotton 
10295c9ccdd7SRakesh Kudurumalla 	rc = mbox_process(mbox);
10305c9ccdd7SRakesh Kudurumalla 	if (rc)
10315c9ccdd7SRakesh Kudurumalla 		goto fail;
10325c9ccdd7SRakesh Kudurumalla 
10335c9ccdd7SRakesh Kudurumalla 	lf->aura_attr[aura_id].nix0_bpid = req->aura.nix0_bpid;
10345c9ccdd7SRakesh Kudurumalla 	lf->aura_attr[aura_id].nix1_bpid = req->aura.nix1_bpid;
10355c9ccdd7SRakesh Kudurumalla 	lf->aura_attr[aura_id].bp_ena = req->aura.bp_ena;
10365c9ccdd7SRakesh Kudurumalla 	lf->aura_attr[aura_id].bp = req->aura.bp;
1037ec7c2f5aSShijith Thotton fail:
1038ec7c2f5aSShijith Thotton 	mbox_put(mbox);
1039ec7c2f5aSShijith Thotton 	return rc;
1040ec7c2f5aSShijith Thotton }
1041ec7c2f5aSShijith Thotton 
1042124ff1a4SAshwin Sekhar T K static inline int
104344a9307cSRakesh Kudurumalla npa_attach(struct mbox *m_box)
1044124ff1a4SAshwin Sekhar T K {
104544a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get(m_box);
1046124ff1a4SAshwin Sekhar T K 	struct rsrc_attach_req *req;
104744a9307cSRakesh Kudurumalla 	int rc;
1048124ff1a4SAshwin Sekhar T K 
1049124ff1a4SAshwin Sekhar T K 	req = mbox_alloc_msg_attach_resources(mbox);
105044a9307cSRakesh Kudurumalla 	if (req == NULL) {
105144a9307cSRakesh Kudurumalla 		rc = -ENOSPC;
105244a9307cSRakesh Kudurumalla 		goto exit;
105344a9307cSRakesh Kudurumalla 	}
1054124ff1a4SAshwin Sekhar T K 	req->modify = true;
1055124ff1a4SAshwin Sekhar T K 	req->npalf = true;
1056124ff1a4SAshwin Sekhar T K 
105744a9307cSRakesh Kudurumalla 	rc = mbox_process(mbox);
105844a9307cSRakesh Kudurumalla exit:
105944a9307cSRakesh Kudurumalla 	mbox_put(mbox);
106044a9307cSRakesh Kudurumalla 	return rc;
1061124ff1a4SAshwin Sekhar T K }
1062124ff1a4SAshwin Sekhar T K 
1063124ff1a4SAshwin Sekhar T K static inline int
106444a9307cSRakesh Kudurumalla npa_detach(struct mbox *m_box)
1065124ff1a4SAshwin Sekhar T K {
106644a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get(m_box);
1067124ff1a4SAshwin Sekhar T K 	struct rsrc_detach_req *req;
106844a9307cSRakesh Kudurumalla 	int rc;
1069124ff1a4SAshwin Sekhar T K 
1070124ff1a4SAshwin Sekhar T K 	req = mbox_alloc_msg_detach_resources(mbox);
107144a9307cSRakesh Kudurumalla 	if (req == NULL) {
107244a9307cSRakesh Kudurumalla 		rc = -ENOSPC;
107344a9307cSRakesh Kudurumalla 		goto exit;
107444a9307cSRakesh Kudurumalla 	}
1075124ff1a4SAshwin Sekhar T K 	req->partial = true;
1076124ff1a4SAshwin Sekhar T K 	req->npalf = true;
1077124ff1a4SAshwin Sekhar T K 
107844a9307cSRakesh Kudurumalla 	rc = mbox_process(mbox);
107944a9307cSRakesh Kudurumalla exit:
108044a9307cSRakesh Kudurumalla 	mbox_put(mbox);
108144a9307cSRakesh Kudurumalla 	return rc;
1082124ff1a4SAshwin Sekhar T K }
1083124ff1a4SAshwin Sekhar T K 
1084124ff1a4SAshwin Sekhar T K static inline int
108544a9307cSRakesh Kudurumalla npa_get_msix_offset(struct mbox *m_box, uint16_t *npa_msixoff)
1086124ff1a4SAshwin Sekhar T K {
108744a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get(m_box);
1088124ff1a4SAshwin Sekhar T K 	struct msix_offset_rsp *msix_rsp;
1089124ff1a4SAshwin Sekhar T K 	int rc;
1090124ff1a4SAshwin Sekhar T K 
109144a9307cSRakesh Kudurumalla 	/* Initialize msixoff */
109244a9307cSRakesh Kudurumalla 	*npa_msixoff = 0;
1093124ff1a4SAshwin Sekhar T K 	/* Get NPA MSIX vector offsets */
1094124ff1a4SAshwin Sekhar T K 	mbox_alloc_msg_msix_offset(mbox);
1095124ff1a4SAshwin Sekhar T K 	rc = mbox_process_msg(mbox, (void *)&msix_rsp);
1096124ff1a4SAshwin Sekhar T K 	if (rc == 0)
1097124ff1a4SAshwin Sekhar T K 		*npa_msixoff = msix_rsp->npa_msixoff;
1098124ff1a4SAshwin Sekhar T K 
109944a9307cSRakesh Kudurumalla 	mbox_put(mbox);
1100124ff1a4SAshwin Sekhar T K 	return rc;
1101124ff1a4SAshwin Sekhar T K }
1102124ff1a4SAshwin Sekhar T K 
1103124ff1a4SAshwin Sekhar T K static inline int
1104124ff1a4SAshwin Sekhar T K npa_lf_alloc(struct npa_lf *lf)
1105124ff1a4SAshwin Sekhar T K {
110644a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get(lf->mbox);
1107124ff1a4SAshwin Sekhar T K 	struct npa_lf_alloc_req *req;
1108124ff1a4SAshwin Sekhar T K 	struct npa_lf_alloc_rsp *rsp;
1109124ff1a4SAshwin Sekhar T K 	int rc;
1110124ff1a4SAshwin Sekhar T K 
1111124ff1a4SAshwin Sekhar T K 	req = mbox_alloc_msg_npa_lf_alloc(mbox);
111244a9307cSRakesh Kudurumalla 	if (req == NULL) {
111344a9307cSRakesh Kudurumalla 		rc =  -ENOSPC;
111444a9307cSRakesh Kudurumalla 		goto exit;
111544a9307cSRakesh Kudurumalla 	}
1116124ff1a4SAshwin Sekhar T K 	req->aura_sz = lf->aura_sz;
1117124ff1a4SAshwin Sekhar T K 	req->nr_pools = lf->nr_pools;
1118124ff1a4SAshwin Sekhar T K 
1119124ff1a4SAshwin Sekhar T K 	rc = mbox_process_msg(mbox, (void *)&rsp);
112044a9307cSRakesh Kudurumalla 	if (rc) {
112144a9307cSRakesh Kudurumalla 		rc = NPA_ERR_ALLOC;
112244a9307cSRakesh Kudurumalla 		goto exit;
112344a9307cSRakesh Kudurumalla 	}
1124124ff1a4SAshwin Sekhar T K 
1125124ff1a4SAshwin Sekhar T K 	lf->stack_pg_ptrs = rsp->stack_pg_ptrs;
1126124ff1a4SAshwin Sekhar T K 	lf->stack_pg_bytes = rsp->stack_pg_bytes;
1127124ff1a4SAshwin Sekhar T K 	lf->qints = rsp->qints;
1128124ff1a4SAshwin Sekhar T K 
112944a9307cSRakesh Kudurumalla 	rc = 0;
113044a9307cSRakesh Kudurumalla exit:
113144a9307cSRakesh Kudurumalla 	mbox_put(mbox);
113244a9307cSRakesh Kudurumalla 	return rc;
1133124ff1a4SAshwin Sekhar T K }
1134124ff1a4SAshwin Sekhar T K 
1135124ff1a4SAshwin Sekhar T K static int
113644a9307cSRakesh Kudurumalla npa_lf_free(struct mbox *mail_box)
1137124ff1a4SAshwin Sekhar T K {
113844a9307cSRakesh Kudurumalla 	struct mbox *mbox = mbox_get(mail_box);
113944a9307cSRakesh Kudurumalla 	int rc;
114044a9307cSRakesh Kudurumalla 
1141124ff1a4SAshwin Sekhar T K 	mbox_alloc_msg_npa_lf_free(mbox);
114244a9307cSRakesh Kudurumalla 	rc = mbox_process(mbox);
114344a9307cSRakesh Kudurumalla 	mbox_put(mbox);
114444a9307cSRakesh Kudurumalla 	return rc;
1145124ff1a4SAshwin Sekhar T K }
1146124ff1a4SAshwin Sekhar T K 
1147124ff1a4SAshwin Sekhar T K static inline uint32_t
1148124ff1a4SAshwin Sekhar T K aura_size_to_u32(uint8_t val)
1149124ff1a4SAshwin Sekhar T K {
1150124ff1a4SAshwin Sekhar T K 	if (val == NPA_AURA_SZ_0)
1151124ff1a4SAshwin Sekhar T K 		return 128;
1152124ff1a4SAshwin Sekhar T K 	if (val >= NPA_AURA_SZ_MAX)
1153124ff1a4SAshwin Sekhar T K 		return BIT_ULL(20);
1154124ff1a4SAshwin Sekhar T K 
1155124ff1a4SAshwin Sekhar T K 	return 1 << (val + 6);
1156124ff1a4SAshwin Sekhar T K }
1157124ff1a4SAshwin Sekhar T K 
1158124ff1a4SAshwin Sekhar T K static inline void
1159124ff1a4SAshwin Sekhar T K pool_count_aura_sz_get(uint32_t *nr_pools, uint8_t *aura_sz)
1160124ff1a4SAshwin Sekhar T K {
1161124ff1a4SAshwin Sekhar T K 	uint32_t val;
1162124ff1a4SAshwin Sekhar T K 
1163124ff1a4SAshwin Sekhar T K 	val = roc_idev_npa_maxpools_get();
1164124ff1a4SAshwin Sekhar T K 	if (val < aura_size_to_u32(NPA_AURA_SZ_128))
1165124ff1a4SAshwin Sekhar T K 		val = 128;
1166124ff1a4SAshwin Sekhar T K 	if (val > aura_size_to_u32(NPA_AURA_SZ_1M))
1167124ff1a4SAshwin Sekhar T K 		val = BIT_ULL(20);
1168124ff1a4SAshwin Sekhar T K 
1169124ff1a4SAshwin Sekhar T K 	roc_idev_npa_maxpools_set(val);
1170124ff1a4SAshwin Sekhar T K 	*nr_pools = val;
1171124ff1a4SAshwin Sekhar T K 	*aura_sz = plt_log2_u32(val) - 6;
1172124ff1a4SAshwin Sekhar T K }
1173124ff1a4SAshwin Sekhar T K 
1174124ff1a4SAshwin Sekhar T K static int
1175124ff1a4SAshwin Sekhar T K npa_dev_init(struct npa_lf *lf, uintptr_t base, struct mbox *mbox)
1176124ff1a4SAshwin Sekhar T K {
1177124ff1a4SAshwin Sekhar T K 	uint32_t i, bmp_sz, nr_pools;
1178124ff1a4SAshwin Sekhar T K 	uint8_t aura_sz;
1179124ff1a4SAshwin Sekhar T K 	int rc;
1180124ff1a4SAshwin Sekhar T K 
1181124ff1a4SAshwin Sekhar T K 	/* Sanity checks */
1182124ff1a4SAshwin Sekhar T K 	if (!lf || !base || !mbox)
1183124ff1a4SAshwin Sekhar T K 		return NPA_ERR_PARAM;
1184124ff1a4SAshwin Sekhar T K 
1185124ff1a4SAshwin Sekhar T K 	if (base & ROC_AURA_ID_MASK)
1186124ff1a4SAshwin Sekhar T K 		return NPA_ERR_BASE_INVALID;
1187124ff1a4SAshwin Sekhar T K 
1188124ff1a4SAshwin Sekhar T K 	pool_count_aura_sz_get(&nr_pools, &aura_sz);
1189124ff1a4SAshwin Sekhar T K 	if (aura_sz == NPA_AURA_SZ_0 || aura_sz >= NPA_AURA_SZ_MAX)
1190124ff1a4SAshwin Sekhar T K 		return NPA_ERR_PARAM;
1191124ff1a4SAshwin Sekhar T K 
1192124ff1a4SAshwin Sekhar T K 	memset(lf, 0x0, sizeof(*lf));
1193124ff1a4SAshwin Sekhar T K 	lf->base = base;
1194124ff1a4SAshwin Sekhar T K 	lf->aura_sz = aura_sz;
1195124ff1a4SAshwin Sekhar T K 	lf->nr_pools = nr_pools;
1196124ff1a4SAshwin Sekhar T K 	lf->mbox = mbox;
1197124ff1a4SAshwin Sekhar T K 
1198124ff1a4SAshwin Sekhar T K 	rc = npa_lf_alloc(lf);
1199124ff1a4SAshwin Sekhar T K 	if (rc)
1200124ff1a4SAshwin Sekhar T K 		goto exit;
1201124ff1a4SAshwin Sekhar T K 
1202124ff1a4SAshwin Sekhar T K 	bmp_sz = plt_bitmap_get_memory_footprint(nr_pools);
1203124ff1a4SAshwin Sekhar T K 
1204124ff1a4SAshwin Sekhar T K 	/* Allocate memory for bitmap */
1205124ff1a4SAshwin Sekhar T K 	lf->npa_bmp_mem = plt_zmalloc(bmp_sz, ROC_ALIGN);
1206124ff1a4SAshwin Sekhar T K 	if (lf->npa_bmp_mem == NULL) {
1207124ff1a4SAshwin Sekhar T K 		rc = NPA_ERR_ALLOC;
1208124ff1a4SAshwin Sekhar T K 		goto lf_free;
1209124ff1a4SAshwin Sekhar T K 	}
1210124ff1a4SAshwin Sekhar T K 
1211124ff1a4SAshwin Sekhar T K 	/* Initialize pool resource bitmap array */
1212124ff1a4SAshwin Sekhar T K 	lf->npa_bmp = plt_bitmap_init(nr_pools, lf->npa_bmp_mem, bmp_sz);
1213124ff1a4SAshwin Sekhar T K 	if (lf->npa_bmp == NULL) {
1214124ff1a4SAshwin Sekhar T K 		rc = NPA_ERR_PARAM;
1215124ff1a4SAshwin Sekhar T K 		goto bmap_mem_free;
1216124ff1a4SAshwin Sekhar T K 	}
1217124ff1a4SAshwin Sekhar T K 
1218124ff1a4SAshwin Sekhar T K 	/* Mark all pools available */
1219124ff1a4SAshwin Sekhar T K 	for (i = 0; i < nr_pools; i++)
1220124ff1a4SAshwin Sekhar T K 		plt_bitmap_set(lf->npa_bmp, i);
1221124ff1a4SAshwin Sekhar T K 
12228e5a4adbSNithin Dabilpuram 	/* Reserve zero aura for all models other than CN9K */
12238e5a4adbSNithin Dabilpuram 	if (!roc_model_is_cn9k())
12248e5a4adbSNithin Dabilpuram 		lf->zero_aura_rsvd = true;
12258e5a4adbSNithin Dabilpuram 
1226124ff1a4SAshwin Sekhar T K 	/* Allocate memory for qint context */
1227124ff1a4SAshwin Sekhar T K 	lf->npa_qint_mem = plt_zmalloc(sizeof(struct npa_qint) * nr_pools, 0);
1228124ff1a4SAshwin Sekhar T K 	if (lf->npa_qint_mem == NULL) {
1229124ff1a4SAshwin Sekhar T K 		rc = NPA_ERR_ALLOC;
1230124ff1a4SAshwin Sekhar T K 		goto bmap_free;
1231124ff1a4SAshwin Sekhar T K 	}
1232124ff1a4SAshwin Sekhar T K 
1233124ff1a4SAshwin Sekhar T K 	/* Allocate memory for nap_aura_lim memory */
1234124ff1a4SAshwin Sekhar T K 	lf->aura_lim = plt_zmalloc(sizeof(struct npa_aura_lim) * nr_pools, 0);
1235124ff1a4SAshwin Sekhar T K 	if (lf->aura_lim == NULL) {
1236124ff1a4SAshwin Sekhar T K 		rc = NPA_ERR_ALLOC;
1237124ff1a4SAshwin Sekhar T K 		goto qint_free;
1238124ff1a4SAshwin Sekhar T K 	}
1239124ff1a4SAshwin Sekhar T K 
1240de00cc35SNithin Dabilpuram 	/* Allocate per-aura attribute */
1241de00cc35SNithin Dabilpuram 	lf->aura_attr = plt_zmalloc(sizeof(struct npa_aura_attr) * nr_pools, 0);
1242de00cc35SNithin Dabilpuram 	if (lf->aura_attr == NULL) {
1243de00cc35SNithin Dabilpuram 		rc = NPA_ERR_PARAM;
1244de00cc35SNithin Dabilpuram 		goto lim_free;
1245de00cc35SNithin Dabilpuram 	}
1246de00cc35SNithin Dabilpuram 
1247124ff1a4SAshwin Sekhar T K 	/* Init aura start & end limits */
1248124ff1a4SAshwin Sekhar T K 	for (i = 0; i < nr_pools; i++) {
1249124ff1a4SAshwin Sekhar T K 		lf->aura_lim[i].ptr_start = UINT64_MAX;
1250124ff1a4SAshwin Sekhar T K 		lf->aura_lim[i].ptr_end = 0x0ull;
1251124ff1a4SAshwin Sekhar T K 	}
1252124ff1a4SAshwin Sekhar T K 
1253124ff1a4SAshwin Sekhar T K 	return 0;
1254124ff1a4SAshwin Sekhar T K 
1255de00cc35SNithin Dabilpuram lim_free:
1256de00cc35SNithin Dabilpuram 	plt_free(lf->aura_lim);
1257124ff1a4SAshwin Sekhar T K qint_free:
1258124ff1a4SAshwin Sekhar T K 	plt_free(lf->npa_qint_mem);
1259124ff1a4SAshwin Sekhar T K bmap_free:
1260124ff1a4SAshwin Sekhar T K 	plt_bitmap_free(lf->npa_bmp);
1261124ff1a4SAshwin Sekhar T K bmap_mem_free:
1262124ff1a4SAshwin Sekhar T K 	plt_free(lf->npa_bmp_mem);
1263124ff1a4SAshwin Sekhar T K lf_free:
1264124ff1a4SAshwin Sekhar T K 	npa_lf_free(lf->mbox);
1265124ff1a4SAshwin Sekhar T K exit:
1266124ff1a4SAshwin Sekhar T K 	return rc;
1267124ff1a4SAshwin Sekhar T K }
1268124ff1a4SAshwin Sekhar T K 
1269124ff1a4SAshwin Sekhar T K static int
1270124ff1a4SAshwin Sekhar T K npa_dev_fini(struct npa_lf *lf)
1271124ff1a4SAshwin Sekhar T K {
1272124ff1a4SAshwin Sekhar T K 	if (!lf)
1273124ff1a4SAshwin Sekhar T K 		return NPA_ERR_PARAM;
1274124ff1a4SAshwin Sekhar T K 
1275124ff1a4SAshwin Sekhar T K 	plt_free(lf->aura_lim);
1276124ff1a4SAshwin Sekhar T K 	plt_free(lf->npa_qint_mem);
1277124ff1a4SAshwin Sekhar T K 	plt_bitmap_free(lf->npa_bmp);
1278124ff1a4SAshwin Sekhar T K 	plt_free(lf->npa_bmp_mem);
1279de00cc35SNithin Dabilpuram 	plt_free(lf->aura_attr);
1280124ff1a4SAshwin Sekhar T K 
1281124ff1a4SAshwin Sekhar T K 	return npa_lf_free(lf->mbox);
1282124ff1a4SAshwin Sekhar T K }
1283124ff1a4SAshwin Sekhar T K 
1284124ff1a4SAshwin Sekhar T K int
1285124ff1a4SAshwin Sekhar T K npa_lf_init(struct dev *dev, struct plt_pci_device *pci_dev)
1286124ff1a4SAshwin Sekhar T K {
1287fdbec406SAnoob Joseph 	uint16_t npa_msixoff = 0;
1288124ff1a4SAshwin Sekhar T K 	struct idev_cfg *idev;
1289124ff1a4SAshwin Sekhar T K 	struct npa_lf *lf;
1290124ff1a4SAshwin Sekhar T K 	int rc;
1291124ff1a4SAshwin Sekhar T K 
1292124ff1a4SAshwin Sekhar T K 	idev = idev_get_cfg();
1293124ff1a4SAshwin Sekhar T K 	if (idev == NULL)
1294124ff1a4SAshwin Sekhar T K 		return NPA_ERR_ALLOC;
1295124ff1a4SAshwin Sekhar T K 
1296124ff1a4SAshwin Sekhar T K 	/* Not the first PCI device */
1297124ff1a4SAshwin Sekhar T K 	if (__atomic_fetch_add(&idev->npa_refcnt, 1, __ATOMIC_SEQ_CST) != 0)
1298124ff1a4SAshwin Sekhar T K 		return 0;
1299124ff1a4SAshwin Sekhar T K 
130080e1239eSVolodymyr Fialko 	if (lf_init_cb) {
130180e1239eSVolodymyr Fialko 		rc = (*lf_init_cb)(pci_dev);
130280e1239eSVolodymyr Fialko 		if (rc)
130380e1239eSVolodymyr Fialko 			goto fail;
130480e1239eSVolodymyr Fialko 	}
130580e1239eSVolodymyr Fialko 
1306124ff1a4SAshwin Sekhar T K 	rc = npa_attach(dev->mbox);
1307124ff1a4SAshwin Sekhar T K 	if (rc)
1308124ff1a4SAshwin Sekhar T K 		goto fail;
1309124ff1a4SAshwin Sekhar T K 
1310124ff1a4SAshwin Sekhar T K 	rc = npa_get_msix_offset(dev->mbox, &npa_msixoff);
1311124ff1a4SAshwin Sekhar T K 	if (rc)
1312124ff1a4SAshwin Sekhar T K 		goto npa_detach;
1313124ff1a4SAshwin Sekhar T K 
1314124ff1a4SAshwin Sekhar T K 	lf = &dev->npa;
1315124ff1a4SAshwin Sekhar T K 	rc = npa_dev_init(lf, dev->bar2 + (RVU_BLOCK_ADDR_NPA << 20),
1316124ff1a4SAshwin Sekhar T K 			  dev->mbox);
1317124ff1a4SAshwin Sekhar T K 	if (rc)
1318124ff1a4SAshwin Sekhar T K 		goto npa_detach;
1319124ff1a4SAshwin Sekhar T K 
1320124ff1a4SAshwin Sekhar T K 	lf->pf_func = dev->pf_func;
1321124ff1a4SAshwin Sekhar T K 	lf->npa_msixoff = npa_msixoff;
1322d61138d4SHarman Kalra 	lf->intr_handle = pci_dev->intr_handle;
1323124ff1a4SAshwin Sekhar T K 	lf->pci_dev = pci_dev;
1324124ff1a4SAshwin Sekhar T K 
1325124ff1a4SAshwin Sekhar T K 	idev->npa_pf_func = dev->pf_func;
1326124ff1a4SAshwin Sekhar T K 	idev->npa = lf;
1327124ff1a4SAshwin Sekhar T K 	plt_wmb();
1328124ff1a4SAshwin Sekhar T K 
1329e67f633eSAshwin Sekhar T K 	rc = npa_register_irqs(lf);
1330e67f633eSAshwin Sekhar T K 	if (rc)
1331e67f633eSAshwin Sekhar T K 		goto npa_fini;
1332e67f633eSAshwin Sekhar T K 
1333124ff1a4SAshwin Sekhar T K 	plt_npa_dbg("npa=%p max_pools=%d pf_func=0x%x msix=0x%x", lf,
1334124ff1a4SAshwin Sekhar T K 		    roc_idev_npa_maxpools_get(), lf->pf_func, npa_msixoff);
1335124ff1a4SAshwin Sekhar T K 
1336124ff1a4SAshwin Sekhar T K 	return 0;
1337124ff1a4SAshwin Sekhar T K 
1338e67f633eSAshwin Sekhar T K npa_fini:
1339e67f633eSAshwin Sekhar T K 	npa_dev_fini(idev->npa);
1340124ff1a4SAshwin Sekhar T K npa_detach:
1341124ff1a4SAshwin Sekhar T K 	npa_detach(dev->mbox);
1342124ff1a4SAshwin Sekhar T K fail:
1343124ff1a4SAshwin Sekhar T K 	__atomic_fetch_sub(&idev->npa_refcnt, 1, __ATOMIC_SEQ_CST);
1344124ff1a4SAshwin Sekhar T K 	return rc;
1345124ff1a4SAshwin Sekhar T K }
1346124ff1a4SAshwin Sekhar T K 
1347124ff1a4SAshwin Sekhar T K int
1348124ff1a4SAshwin Sekhar T K npa_lf_fini(void)
1349124ff1a4SAshwin Sekhar T K {
1350124ff1a4SAshwin Sekhar T K 	struct idev_cfg *idev;
1351124ff1a4SAshwin Sekhar T K 	int rc = 0;
1352124ff1a4SAshwin Sekhar T K 
1353124ff1a4SAshwin Sekhar T K 	idev = idev_get_cfg();
1354124ff1a4SAshwin Sekhar T K 	if (idev == NULL)
1355124ff1a4SAshwin Sekhar T K 		return NPA_ERR_ALLOC;
1356124ff1a4SAshwin Sekhar T K 
1357124ff1a4SAshwin Sekhar T K 	/* Not the last PCI device */
1358ed090599STyler Retzlaff 	if (__atomic_fetch_sub(&idev->npa_refcnt, 1, __ATOMIC_SEQ_CST) - 1 != 0)
1359124ff1a4SAshwin Sekhar T K 		return 0;
1360124ff1a4SAshwin Sekhar T K 
1361e67f633eSAshwin Sekhar T K 	npa_unregister_irqs(idev->npa);
1362124ff1a4SAshwin Sekhar T K 	rc |= npa_dev_fini(idev->npa);
1363124ff1a4SAshwin Sekhar T K 	rc |= npa_detach(idev->npa->mbox);
1364124ff1a4SAshwin Sekhar T K 	idev_set_defaults(idev);
1365124ff1a4SAshwin Sekhar T K 
1366124ff1a4SAshwin Sekhar T K 	return rc;
1367124ff1a4SAshwin Sekhar T K }
1368124ff1a4SAshwin Sekhar T K 
1369124ff1a4SAshwin Sekhar T K int
1370124ff1a4SAshwin Sekhar T K roc_npa_dev_init(struct roc_npa *roc_npa)
1371124ff1a4SAshwin Sekhar T K {
1372124ff1a4SAshwin Sekhar T K 	struct plt_pci_device *pci_dev;
1373124ff1a4SAshwin Sekhar T K 	struct npa *npa;
1374124ff1a4SAshwin Sekhar T K 	struct dev *dev;
1375124ff1a4SAshwin Sekhar T K 	int rc;
1376124ff1a4SAshwin Sekhar T K 
1377124ff1a4SAshwin Sekhar T K 	if (roc_npa == NULL || roc_npa->pci_dev == NULL)
1378124ff1a4SAshwin Sekhar T K 		return NPA_ERR_PARAM;
1379124ff1a4SAshwin Sekhar T K 
1380124ff1a4SAshwin Sekhar T K 	PLT_STATIC_ASSERT(sizeof(struct npa) <= ROC_NPA_MEM_SZ);
1381124ff1a4SAshwin Sekhar T K 	npa = roc_npa_to_npa_priv(roc_npa);
1382124ff1a4SAshwin Sekhar T K 	memset(npa, 0, sizeof(*npa));
1383124ff1a4SAshwin Sekhar T K 	pci_dev = roc_npa->pci_dev;
1384124ff1a4SAshwin Sekhar T K 	dev = &npa->dev;
1385124ff1a4SAshwin Sekhar T K 
1386124ff1a4SAshwin Sekhar T K 	/* Initialize device  */
1387124ff1a4SAshwin Sekhar T K 	rc = dev_init(dev, pci_dev);
1388124ff1a4SAshwin Sekhar T K 	if (rc) {
1389124ff1a4SAshwin Sekhar T K 		plt_err("Failed to init roc device");
1390124ff1a4SAshwin Sekhar T K 		goto fail;
1391124ff1a4SAshwin Sekhar T K 	}
1392124ff1a4SAshwin Sekhar T K 
1393124ff1a4SAshwin Sekhar T K 	npa->pci_dev = pci_dev;
1394124ff1a4SAshwin Sekhar T K 	dev->drv_inited = true;
1395124ff1a4SAshwin Sekhar T K fail:
1396124ff1a4SAshwin Sekhar T K 	return rc;
1397124ff1a4SAshwin Sekhar T K }
1398124ff1a4SAshwin Sekhar T K 
1399124ff1a4SAshwin Sekhar T K int
1400124ff1a4SAshwin Sekhar T K roc_npa_dev_fini(struct roc_npa *roc_npa)
1401124ff1a4SAshwin Sekhar T K {
1402124ff1a4SAshwin Sekhar T K 	struct npa *npa = roc_npa_to_npa_priv(roc_npa);
1403124ff1a4SAshwin Sekhar T K 
1404124ff1a4SAshwin Sekhar T K 	if (npa == NULL)
1405124ff1a4SAshwin Sekhar T K 		return NPA_ERR_PARAM;
1406124ff1a4SAshwin Sekhar T K 
1407124ff1a4SAshwin Sekhar T K 	npa->dev.drv_inited = false;
1408124ff1a4SAshwin Sekhar T K 	return dev_fini(&npa->dev, npa->pci_dev);
1409124ff1a4SAshwin Sekhar T K }
141044a9307cSRakesh Kudurumalla 
141144a9307cSRakesh Kudurumalla void
141244a9307cSRakesh Kudurumalla roc_npa_dev_lock(void)
141344a9307cSRakesh Kudurumalla {
141444a9307cSRakesh Kudurumalla 	struct idev_cfg *idev = idev_get_cfg();
141544a9307cSRakesh Kudurumalla 
141644a9307cSRakesh Kudurumalla 	if (idev != NULL)
141744a9307cSRakesh Kudurumalla 		plt_spinlock_lock(&idev->npa_dev_lock);
141844a9307cSRakesh Kudurumalla }
141944a9307cSRakesh Kudurumalla 
142044a9307cSRakesh Kudurumalla void
142144a9307cSRakesh Kudurumalla roc_npa_dev_unlock(void)
142244a9307cSRakesh Kudurumalla {
142344a9307cSRakesh Kudurumalla 	struct idev_cfg *idev = idev_get_cfg();
142444a9307cSRakesh Kudurumalla 
142544a9307cSRakesh Kudurumalla 	if (idev != NULL)
142644a9307cSRakesh Kudurumalla 		plt_spinlock_unlock(&idev->npa_dev_lock);
142744a9307cSRakesh Kudurumalla }
1428