xref: /dpdk/drivers/net/qede/base/ecore_cxt.c (revision 2352f348c997a34549c71c99029fb3d214aad39a)
13126df22SRasesh Mody /* SPDX-License-Identifier: BSD-3-Clause
29adde217SRasesh Mody  * Copyright (c) 2016 - 2018 Cavium Inc.
3ec94dbc5SRasesh Mody  * All rights reserved.
49adde217SRasesh Mody  * www.cavium.com
5ec94dbc5SRasesh Mody  */
6ec94dbc5SRasesh Mody 
7ec94dbc5SRasesh Mody #include "bcm_osal.h"
8ec94dbc5SRasesh Mody #include "reg_addr.h"
9eb8e81adSRasesh Mody #include "common_hsi.h"
10ec94dbc5SRasesh Mody #include "ecore_hsi_common.h"
11ec94dbc5SRasesh Mody #include "ecore_hsi_eth.h"
12ec94dbc5SRasesh Mody #include "ecore_rt_defs.h"
13ec94dbc5SRasesh Mody #include "ecore_status.h"
14ec94dbc5SRasesh Mody #include "ecore.h"
15ec94dbc5SRasesh Mody #include "ecore_init_ops.h"
16ec94dbc5SRasesh Mody #include "ecore_init_fw_funcs.h"
17ec94dbc5SRasesh Mody #include "ecore_cxt.h"
18ec94dbc5SRasesh Mody #include "ecore_hw.h"
19ec94dbc5SRasesh Mody #include "ecore_dev_api.h"
2022d07d93SRasesh Mody #include "ecore_sriov.h"
21615438cbSRasesh Mody #include "ecore_mcp.h"
22ec94dbc5SRasesh Mody 
23ec94dbc5SRasesh Mody /* Doorbell-Queue constants */
24ec94dbc5SRasesh Mody #define DQ_RANGE_SHIFT	4
25ec94dbc5SRasesh Mody #define DQ_RANGE_ALIGN	(1 << DQ_RANGE_SHIFT)
26ec94dbc5SRasesh Mody 
27ec94dbc5SRasesh Mody /* Searcher constants */
28ec94dbc5SRasesh Mody #define SRC_MIN_NUM_ELEMS 256
29ec94dbc5SRasesh Mody 
303b307c55SRasesh Mody /* GFS constants */
313b307c55SRasesh Mody #define RGFS_MIN_NUM_ELEMS	256
323b307c55SRasesh Mody #define TGFS_MIN_NUM_ELEMS	256
333b307c55SRasesh Mody 
34ec94dbc5SRasesh Mody /* Timers constants */
35ec94dbc5SRasesh Mody #define TM_SHIFT	7
36ec94dbc5SRasesh Mody #define TM_ALIGN	(1 << TM_SHIFT)
37ec94dbc5SRasesh Mody #define TM_ELEM_SIZE	4
38ec94dbc5SRasesh Mody 
39ec94dbc5SRasesh Mody /* ILT constants */
402b68b841SRasesh Mody #define ILT_DEFAULT_HW_P_SIZE	4
41ec94dbc5SRasesh Mody 
42ec94dbc5SRasesh Mody #define ILT_PAGE_IN_BYTES(hw_p_size)	(1U << ((hw_p_size) + 12))
43ec94dbc5SRasesh Mody #define ILT_CFG_REG(cli, reg)		PSWRQ2_REG_##cli##_##reg##_RT_OFFSET
44ec94dbc5SRasesh Mody 
45ec94dbc5SRasesh Mody /* ILT entry structure */
46ec94dbc5SRasesh Mody #define ILT_ENTRY_PHY_ADDR_MASK		0x000FFFFFFFFFFFULL
47ec94dbc5SRasesh Mody #define ILT_ENTRY_PHY_ADDR_SHIFT	0
48ec94dbc5SRasesh Mody #define ILT_ENTRY_VALID_MASK		0x1ULL
49ec94dbc5SRasesh Mody #define ILT_ENTRY_VALID_SHIFT		52
50ec94dbc5SRasesh Mody #define ILT_ENTRY_IN_REGS		2
51ec94dbc5SRasesh Mody #define ILT_REG_SIZE_IN_BYTES		4
52ec94dbc5SRasesh Mody 
53ec94dbc5SRasesh Mody /* connection context union */
54ec94dbc5SRasesh Mody union conn_context {
5552fa735cSRasesh Mody 	struct core_conn_context core_ctx;
5652fa735cSRasesh Mody 	struct eth_conn_context eth_ctx;
57ec94dbc5SRasesh Mody };
58ec94dbc5SRasesh Mody 
5922d07d93SRasesh Mody /* TYPE-0 task context - iSCSI, FCOE */
6022d07d93SRasesh Mody union type0_task_context {
6122d07d93SRasesh Mody };
6222d07d93SRasesh Mody 
6322d07d93SRasesh Mody /* TYPE-1 task context - ROCE */
6422d07d93SRasesh Mody union type1_task_context {
655b5f9675SRasesh Mody 	struct regpair reserved; /* @DPDK */
6622d07d93SRasesh Mody };
6722d07d93SRasesh Mody 
68ec94dbc5SRasesh Mody struct src_ent {
69ec94dbc5SRasesh Mody 	u8 opaque[56];
70ec94dbc5SRasesh Mody 	u64 next;
71ec94dbc5SRasesh Mody };
72ec94dbc5SRasesh Mody 
73ec94dbc5SRasesh Mody #define CDUT_SEG_ALIGNMET 3	/* in 4k chunks */
74ec94dbc5SRasesh Mody #define CDUT_SEG_ALIGNMET_IN_BYTES (1 << (CDUT_SEG_ALIGNMET + 12))
75ec94dbc5SRasesh Mody 
76ec94dbc5SRasesh Mody #define CONN_CXT_SIZE(p_hwfn) \
77ec94dbc5SRasesh Mody 	ALIGNED_TYPE_SIZE(union conn_context, p_hwfn)
78ec94dbc5SRasesh Mody 
7922d07d93SRasesh Mody #define SRQ_CXT_SIZE (sizeof(struct regpair) * 8) /* @DPDK */
8022d07d93SRasesh Mody 
8122d07d93SRasesh Mody #define TYPE0_TASK_CXT_SIZE(p_hwfn) \
8222d07d93SRasesh Mody 	ALIGNED_TYPE_SIZE(union type0_task_context, p_hwfn)
8322d07d93SRasesh Mody 
8422d07d93SRasesh Mody /* Alignment is inherent to the type1_task_context structure */
8522d07d93SRasesh Mody #define TYPE1_TASK_CXT_SIZE(p_hwfn) sizeof(union type1_task_context)
8622d07d93SRasesh Mody 
tm_cid_proto(enum protocol_type type)87ec94dbc5SRasesh Mody static OSAL_INLINE bool tm_cid_proto(enum protocol_type type)
88ec94dbc5SRasesh Mody {
89ec94dbc5SRasesh Mody 	return type == PROTOCOLID_TOE;
90ec94dbc5SRasesh Mody }
91ec94dbc5SRasesh Mody 
tm_tid_proto(enum protocol_type type)9222d07d93SRasesh Mody static bool tm_tid_proto(enum protocol_type type)
9322d07d93SRasesh Mody {
9422d07d93SRasesh Mody 	return type == PROTOCOLID_FCOE;
9522d07d93SRasesh Mody }
9622d07d93SRasesh Mody 
97ec94dbc5SRasesh Mody /* counts the iids for the CDU/CDUC ILT client configuration */
98ec94dbc5SRasesh Mody struct ecore_cdu_iids {
99ec94dbc5SRasesh Mody 	u32 pf_cids;
100ec94dbc5SRasesh Mody 	u32 per_vf_cids;
101ec94dbc5SRasesh Mody };
102ec94dbc5SRasesh Mody 
ecore_cxt_cdu_iids(struct ecore_cxt_mngr * p_mngr,struct ecore_cdu_iids * iids)103ec94dbc5SRasesh Mody static void ecore_cxt_cdu_iids(struct ecore_cxt_mngr *p_mngr,
104ec94dbc5SRasesh Mody 			       struct ecore_cdu_iids *iids)
105ec94dbc5SRasesh Mody {
106ec94dbc5SRasesh Mody 	u32 type;
107ec94dbc5SRasesh Mody 
108ec94dbc5SRasesh Mody 	for (type = 0; type < MAX_CONN_TYPES; type++) {
109ec94dbc5SRasesh Mody 		iids->pf_cids += p_mngr->conn_cfg[type].cid_count;
110ec94dbc5SRasesh Mody 		iids->per_vf_cids += p_mngr->conn_cfg[type].cids_per_vf;
111ec94dbc5SRasesh Mody 	}
112ec94dbc5SRasesh Mody }
113ec94dbc5SRasesh Mody 
114ec94dbc5SRasesh Mody /* counts the iids for the Searcher block configuration */
115ec94dbc5SRasesh Mody struct ecore_src_iids {
116ec94dbc5SRasesh Mody 	u32 pf_cids;
117ec94dbc5SRasesh Mody 	u32 per_vf_cids;
118ec94dbc5SRasesh Mody };
119ec94dbc5SRasesh Mody 
ecore_cxt_src_iids(struct ecore_cxt_mngr * p_mngr,struct ecore_src_iids * iids)120eafbc6fcSRasesh Mody static void ecore_cxt_src_iids(struct ecore_cxt_mngr *p_mngr,
121ec94dbc5SRasesh Mody 			       struct ecore_src_iids *iids)
122ec94dbc5SRasesh Mody {
123ec94dbc5SRasesh Mody 	u32 i;
124ec94dbc5SRasesh Mody 
125ec94dbc5SRasesh Mody 	for (i = 0; i < MAX_CONN_TYPES; i++) {
126ec94dbc5SRasesh Mody 		iids->pf_cids += p_mngr->conn_cfg[i].cid_count;
127ec94dbc5SRasesh Mody 		iids->per_vf_cids += p_mngr->conn_cfg[i].cids_per_vf;
128ec94dbc5SRasesh Mody 	}
12953437002SHarish Patil 
13053437002SHarish Patil 	/* Add L2 filtering filters in addition */
13153437002SHarish Patil 	iids->pf_cids += p_mngr->arfs_count;
132ec94dbc5SRasesh Mody }
133ec94dbc5SRasesh Mody 
134ec94dbc5SRasesh Mody /* counts the iids for the Timers block configuration */
135ec94dbc5SRasesh Mody struct ecore_tm_iids {
136ec94dbc5SRasesh Mody 	u32 pf_cids;
137ec94dbc5SRasesh Mody 	u32 pf_tids[NUM_TASK_PF_SEGMENTS];	/* per segment */
138ec94dbc5SRasesh Mody 	u32 pf_tids_total;
139ec94dbc5SRasesh Mody 	u32 per_vf_cids;
140ec94dbc5SRasesh Mody 	u32 per_vf_tids;
141ec94dbc5SRasesh Mody };
142ec94dbc5SRasesh Mody 
ecore_cxt_tm_iids(struct ecore_hwfn * p_hwfn,struct ecore_cxt_mngr * p_mngr,struct ecore_tm_iids * iids)1433b307c55SRasesh Mody static void ecore_cxt_tm_iids(struct ecore_hwfn *p_hwfn,
1443b307c55SRasesh Mody 			      struct ecore_cxt_mngr *p_mngr,
145ec94dbc5SRasesh Mody 			      struct ecore_tm_iids *iids)
146ec94dbc5SRasesh Mody {
1473b307c55SRasesh Mody 	struct ecore_conn_type_cfg *p_cfg;
14856d1a16aSRasesh Mody 	bool tm_vf_required = false;
14956d1a16aSRasesh Mody 	bool tm_required = false;
150ec94dbc5SRasesh Mody 	u32 i, j;
151ec94dbc5SRasesh Mody 
152ec94dbc5SRasesh Mody 	for (i = 0; i < MAX_CONN_TYPES; i++) {
1533b307c55SRasesh Mody 		p_cfg = &p_mngr->conn_cfg[i];
154ec94dbc5SRasesh Mody 
15556d1a16aSRasesh Mody 		if (tm_cid_proto(i) || tm_required) {
15656d1a16aSRasesh Mody 			if (p_cfg->cid_count)
15756d1a16aSRasesh Mody 				tm_required = true;
15856d1a16aSRasesh Mody 
159ec94dbc5SRasesh Mody 			iids->pf_cids += p_cfg->cid_count;
16056d1a16aSRasesh Mody 		}
16156d1a16aSRasesh Mody 
16256d1a16aSRasesh Mody 		if (tm_cid_proto(i) || tm_vf_required) {
16356d1a16aSRasesh Mody 			if (p_cfg->cids_per_vf)
16456d1a16aSRasesh Mody 				tm_vf_required = true;
16556d1a16aSRasesh Mody 
166ec94dbc5SRasesh Mody 		}
16722d07d93SRasesh Mody 
16822d07d93SRasesh Mody 		if (tm_tid_proto(i)) {
16922d07d93SRasesh Mody 			struct ecore_tid_seg *segs = p_cfg->tid_seg;
17022d07d93SRasesh Mody 
17122d07d93SRasesh Mody 			/* for each segment there is at most one
17222d07d93SRasesh Mody 			 * protocol for which count is not 0.
17322d07d93SRasesh Mody 			 */
17422d07d93SRasesh Mody 			for (j = 0; j < NUM_TASK_PF_SEGMENTS; j++)
17522d07d93SRasesh Mody 				iids->pf_tids[j] += segs[j].count;
17622d07d93SRasesh Mody 
17722d07d93SRasesh Mody 			/* The last array elelment is for the VFs. As for PF
17822d07d93SRasesh Mody 			 * segments there can be only one protocol for
17922d07d93SRasesh Mody 			 * which this value is not 0.
18022d07d93SRasesh Mody 			 */
18122d07d93SRasesh Mody 			iids->per_vf_tids += segs[NUM_TASK_PF_SEGMENTS].count;
18222d07d93SRasesh Mody 		}
183ec94dbc5SRasesh Mody 	}
184ec94dbc5SRasesh Mody 
185ec94dbc5SRasesh Mody 	iids->pf_cids = ROUNDUP(iids->pf_cids, TM_ALIGN);
186ec94dbc5SRasesh Mody 	iids->per_vf_cids = ROUNDUP(iids->per_vf_cids, TM_ALIGN);
187ec94dbc5SRasesh Mody 	iids->per_vf_tids = ROUNDUP(iids->per_vf_tids, TM_ALIGN);
188ec94dbc5SRasesh Mody 
189ec94dbc5SRasesh Mody 	for (iids->pf_tids_total = 0, j = 0; j < NUM_TASK_PF_SEGMENTS; j++) {
190ec94dbc5SRasesh Mody 		iids->pf_tids[j] = ROUNDUP(iids->pf_tids[j], TM_ALIGN);
191ec94dbc5SRasesh Mody 		iids->pf_tids_total += iids->pf_tids[j];
192ec94dbc5SRasesh Mody 	}
193ec94dbc5SRasesh Mody }
194ec94dbc5SRasesh Mody 
ecore_cxt_qm_iids(struct ecore_hwfn * p_hwfn,struct ecore_qm_iids * iids)1957a5dfdc1SRasesh Mody static void ecore_cxt_qm_iids(struct ecore_hwfn *p_hwfn,
1967a5dfdc1SRasesh Mody 			      struct ecore_qm_iids *iids)
197ec94dbc5SRasesh Mody {
198ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
199ec94dbc5SRasesh Mody 	struct ecore_tid_seg *segs;
200ec94dbc5SRasesh Mody 	u32 vf_cids = 0, type, j;
201ec94dbc5SRasesh Mody 	u32 vf_tids = 0;
202ec94dbc5SRasesh Mody 
203ec94dbc5SRasesh Mody 	for (type = 0; type < MAX_CONN_TYPES; type++) {
204ec94dbc5SRasesh Mody 		iids->cids += p_mngr->conn_cfg[type].cid_count;
205ec94dbc5SRasesh Mody 		vf_cids += p_mngr->conn_cfg[type].cids_per_vf;
206ec94dbc5SRasesh Mody 
207ec94dbc5SRasesh Mody 		segs = p_mngr->conn_cfg[type].tid_seg;
208ec94dbc5SRasesh Mody 		/* for each segment there is at most one
209ec94dbc5SRasesh Mody 		 * protocol for which count is not 0.
210ec94dbc5SRasesh Mody 		 */
211ec94dbc5SRasesh Mody 		for (j = 0; j < NUM_TASK_PF_SEGMENTS; j++)
212ec94dbc5SRasesh Mody 			iids->tids += segs[j].count;
213ec94dbc5SRasesh Mody 
214ec94dbc5SRasesh Mody 		/* The last array elelment is for the VFs. As for PF
215ec94dbc5SRasesh Mody 		 * segments there can be only one protocol for
216ec94dbc5SRasesh Mody 		 * which this value is not 0.
217ec94dbc5SRasesh Mody 		 */
218ec94dbc5SRasesh Mody 		vf_tids += segs[NUM_TASK_PF_SEGMENTS].count;
219ec94dbc5SRasesh Mody 	}
220ec94dbc5SRasesh Mody 
221ec94dbc5SRasesh Mody 	iids->vf_cids += vf_cids * p_mngr->vf_count;
222ec94dbc5SRasesh Mody 	iids->tids += vf_tids * p_mngr->vf_count;
223ec94dbc5SRasesh Mody 
224ec94dbc5SRasesh Mody 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
225ec94dbc5SRasesh Mody 		   "iids: CIDS %08x vf_cids %08x tids %08x vf_tids %08x\n",
226ec94dbc5SRasesh Mody 		   iids->cids, iids->vf_cids, iids->tids, vf_tids);
227ec94dbc5SRasesh Mody }
228ec94dbc5SRasesh Mody 
ecore_cxt_tid_seg_info(struct ecore_hwfn * p_hwfn,u32 seg)229ec94dbc5SRasesh Mody static struct ecore_tid_seg *ecore_cxt_tid_seg_info(struct ecore_hwfn *p_hwfn,
230ec94dbc5SRasesh Mody 						    u32 seg)
231ec94dbc5SRasesh Mody {
232ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_cfg = p_hwfn->p_cxt_mngr;
233ec94dbc5SRasesh Mody 	u32 i;
234ec94dbc5SRasesh Mody 
235ec94dbc5SRasesh Mody 	/* Find the protocol with tid count > 0 for this segment.
236ec94dbc5SRasesh Mody 	 * Note: there can only be one and this is already validated.
237ec94dbc5SRasesh Mody 	 */
238ec94dbc5SRasesh Mody 	for (i = 0; i < MAX_CONN_TYPES; i++) {
239ec94dbc5SRasesh Mody 		if (p_cfg->conn_cfg[i].tid_seg[seg].count)
240ec94dbc5SRasesh Mody 			return &p_cfg->conn_cfg[i].tid_seg[seg];
241ec94dbc5SRasesh Mody 	}
242ec94dbc5SRasesh Mody 	return OSAL_NULL;
243ec94dbc5SRasesh Mody }
244ec94dbc5SRasesh Mody 
ecore_cxt_set_srq_count(struct ecore_hwfn * p_hwfn,u32 num_srqs)245eafbc6fcSRasesh Mody static void ecore_cxt_set_srq_count(struct ecore_hwfn *p_hwfn, u32 num_srqs)
246eafbc6fcSRasesh Mody {
247eafbc6fcSRasesh Mody 	struct ecore_cxt_mngr *p_mgr = p_hwfn->p_cxt_mngr;
248eafbc6fcSRasesh Mody 
249eafbc6fcSRasesh Mody 	p_mgr->srq_count = num_srqs;
250eafbc6fcSRasesh Mody }
251eafbc6fcSRasesh Mody 
ecore_cxt_get_srq_count(struct ecore_hwfn * p_hwfn)252eafbc6fcSRasesh Mody u32 ecore_cxt_get_srq_count(struct ecore_hwfn *p_hwfn)
253eafbc6fcSRasesh Mody {
254eafbc6fcSRasesh Mody 	struct ecore_cxt_mngr *p_mgr = p_hwfn->p_cxt_mngr;
255eafbc6fcSRasesh Mody 
256eafbc6fcSRasesh Mody 	return p_mgr->srq_count;
257eafbc6fcSRasesh Mody }
258eafbc6fcSRasesh Mody 
259ec94dbc5SRasesh Mody /* set the iids (cid/tid) count per protocol */
ecore_cxt_set_proto_cid_count(struct ecore_hwfn * p_hwfn,enum protocol_type type,u32 cid_count,u32 vf_cid_cnt)26022d07d93SRasesh Mody static void ecore_cxt_set_proto_cid_count(struct ecore_hwfn *p_hwfn,
261ec94dbc5SRasesh Mody 				   enum protocol_type type,
262ec94dbc5SRasesh Mody 				   u32 cid_count, u32 vf_cid_cnt)
263ec94dbc5SRasesh Mody {
264ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mgr = p_hwfn->p_cxt_mngr;
265ec94dbc5SRasesh Mody 	struct ecore_conn_type_cfg *p_conn = &p_mgr->conn_cfg[type];
266ec94dbc5SRasesh Mody 
267ec94dbc5SRasesh Mody 	p_conn->cid_count = ROUNDUP(cid_count, DQ_RANGE_ALIGN);
268ec94dbc5SRasesh Mody 	p_conn->cids_per_vf = ROUNDUP(vf_cid_cnt, DQ_RANGE_ALIGN);
269ec94dbc5SRasesh Mody }
270ec94dbc5SRasesh Mody 
ecore_cxt_get_proto_cid_count(struct ecore_hwfn * p_hwfn,enum protocol_type type,u32 * vf_cid)271ec94dbc5SRasesh Mody u32 ecore_cxt_get_proto_cid_count(struct ecore_hwfn *p_hwfn,
272ec94dbc5SRasesh Mody 				  enum protocol_type type, u32 *vf_cid)
273ec94dbc5SRasesh Mody {
274ec94dbc5SRasesh Mody 	if (vf_cid)
275ec94dbc5SRasesh Mody 		*vf_cid = p_hwfn->p_cxt_mngr->conn_cfg[type].cids_per_vf;
276ec94dbc5SRasesh Mody 
277ec94dbc5SRasesh Mody 	return p_hwfn->p_cxt_mngr->conn_cfg[type].cid_count;
278ec94dbc5SRasesh Mody }
279ec94dbc5SRasesh Mody 
ecore_cxt_get_proto_cid_start(struct ecore_hwfn * p_hwfn,enum protocol_type type)280ec94dbc5SRasesh Mody u32 ecore_cxt_get_proto_cid_start(struct ecore_hwfn *p_hwfn,
281ec94dbc5SRasesh Mody 				  enum protocol_type type)
282ec94dbc5SRasesh Mody {
283ec94dbc5SRasesh Mody 	return p_hwfn->p_cxt_mngr->acquired[type].start_cid;
284ec94dbc5SRasesh Mody }
285ec94dbc5SRasesh Mody 
ecore_cxt_get_proto_tid_count(struct ecore_hwfn * p_hwfn,enum protocol_type type)28622d07d93SRasesh Mody u32 ecore_cxt_get_proto_tid_count(struct ecore_hwfn *p_hwfn,
287ec94dbc5SRasesh Mody 					 enum protocol_type type)
288ec94dbc5SRasesh Mody {
289ec94dbc5SRasesh Mody 	u32 cnt = 0;
290ec94dbc5SRasesh Mody 	int i;
291ec94dbc5SRasesh Mody 
292ec94dbc5SRasesh Mody 	for (i = 0; i < TASK_SEGMENTS; i++)
293ec94dbc5SRasesh Mody 		cnt += p_hwfn->p_cxt_mngr->conn_cfg[type].tid_seg[i].count;
294ec94dbc5SRasesh Mody 
295ec94dbc5SRasesh Mody 	return cnt;
296ec94dbc5SRasesh Mody }
297ec94dbc5SRasesh Mody 
298ec94dbc5SRasesh Mody static OSAL_INLINE void
ecore_cxt_set_proto_tid_count(struct ecore_hwfn * p_hwfn,enum protocol_type proto,u8 seg,u8 seg_type,u32 count,bool has_fl)299ec94dbc5SRasesh Mody ecore_cxt_set_proto_tid_count(struct ecore_hwfn *p_hwfn,
300ec94dbc5SRasesh Mody 			      enum protocol_type proto,
301ec94dbc5SRasesh Mody 			      u8 seg, u8 seg_type, u32 count, bool has_fl)
302ec94dbc5SRasesh Mody {
303ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
304ec94dbc5SRasesh Mody 	struct ecore_tid_seg *p_seg = &p_mngr->conn_cfg[proto].tid_seg[seg];
305ec94dbc5SRasesh Mody 
306ec94dbc5SRasesh Mody 	p_seg->count = count;
307ec94dbc5SRasesh Mody 	p_seg->has_fl_mem = has_fl;
308ec94dbc5SRasesh Mody 	p_seg->type = seg_type;
309ec94dbc5SRasesh Mody }
310ec94dbc5SRasesh Mody 
311ec94dbc5SRasesh Mody /* the *p_line parameter must be either 0 for the first invocation or the
312ec94dbc5SRasesh Mody  * value returned in the previous invocation.
313ec94dbc5SRasesh Mody  */
ecore_ilt_cli_blk_fill(struct ecore_ilt_client_cfg * p_cli,struct ecore_ilt_cli_blk * p_blk,u32 start_line,u32 total_size,u32 elem_size)314ec94dbc5SRasesh Mody static void ecore_ilt_cli_blk_fill(struct ecore_ilt_client_cfg *p_cli,
315ec94dbc5SRasesh Mody 				   struct ecore_ilt_cli_blk *p_blk,
316ec94dbc5SRasesh Mody 				   u32 start_line,
317ec94dbc5SRasesh Mody 				   u32 total_size, u32 elem_size)
318ec94dbc5SRasesh Mody {
319ec94dbc5SRasesh Mody 	u32 ilt_size = ILT_PAGE_IN_BYTES(p_cli->p_size.val);
320ec94dbc5SRasesh Mody 
3219455b556SRasesh Mody 	/* verify that it's called once for each block */
322ec94dbc5SRasesh Mody 	if (p_blk->total_size)
323ec94dbc5SRasesh Mody 		return;
324ec94dbc5SRasesh Mody 
325ec94dbc5SRasesh Mody 	p_blk->total_size = total_size;
326ec94dbc5SRasesh Mody 	p_blk->real_size_in_page = 0;
327ec94dbc5SRasesh Mody 	if (elem_size)
328ec94dbc5SRasesh Mody 		p_blk->real_size_in_page = (ilt_size / elem_size) * elem_size;
329ec94dbc5SRasesh Mody 	p_blk->start_line = start_line;
330ec94dbc5SRasesh Mody }
331ec94dbc5SRasesh Mody 
ecore_ilt_cli_adv_line(struct ecore_hwfn * p_hwfn,struct ecore_ilt_client_cfg * p_cli,struct ecore_ilt_cli_blk * p_blk,u32 * p_line,enum ilt_clients client_id)332ec94dbc5SRasesh Mody static void ecore_ilt_cli_adv_line(struct ecore_hwfn *p_hwfn,
333ec94dbc5SRasesh Mody 				   struct ecore_ilt_client_cfg *p_cli,
334ec94dbc5SRasesh Mody 				   struct ecore_ilt_cli_blk *p_blk,
335ec94dbc5SRasesh Mody 				   u32 *p_line, enum ilt_clients client_id)
336ec94dbc5SRasesh Mody {
337ec94dbc5SRasesh Mody 	if (!p_blk->total_size)
338ec94dbc5SRasesh Mody 		return;
339ec94dbc5SRasesh Mody 
340ec94dbc5SRasesh Mody 	if (!p_cli->active)
341ec94dbc5SRasesh Mody 		p_cli->first.val = *p_line;
342ec94dbc5SRasesh Mody 
343ec94dbc5SRasesh Mody 	p_cli->active = true;
344ec94dbc5SRasesh Mody 	*p_line += DIV_ROUND_UP(p_blk->total_size, p_blk->real_size_in_page);
345ec94dbc5SRasesh Mody 	p_cli->last.val = *p_line - 1;
346ec94dbc5SRasesh Mody 
347ec94dbc5SRasesh Mody 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
3489455b556SRasesh Mody 		   "ILT[Client %d] - Lines: [%08x - %08x]. Block - Size %08x"
3499455b556SRasesh Mody 		   " [Real %08x] Start line %d\n",
350ec94dbc5SRasesh Mody 		   client_id, p_cli->first.val, p_cli->last.val,
351ec94dbc5SRasesh Mody 		   p_blk->total_size, p_blk->real_size_in_page,
352ec94dbc5SRasesh Mody 		   p_blk->start_line);
353ec94dbc5SRasesh Mody }
354ec94dbc5SRasesh Mody 
ecore_ilt_get_dynamic_line_range(struct ecore_hwfn * p_hwfn,enum ilt_clients ilt_client,u32 * dynamic_line_offset,u32 * dynamic_line_cnt)3553b307c55SRasesh Mody static void ecore_ilt_get_dynamic_line_range(struct ecore_hwfn *p_hwfn,
3563b307c55SRasesh Mody 					     enum ilt_clients ilt_client,
3573b307c55SRasesh Mody 					     u32 *dynamic_line_offset,
3583b307c55SRasesh Mody 					     u32 *dynamic_line_cnt)
359ec94dbc5SRasesh Mody {
360ec94dbc5SRasesh Mody 	struct ecore_ilt_client_cfg *p_cli;
3613b307c55SRasesh Mody 	struct ecore_conn_type_cfg *p_cfg;
362ec94dbc5SRasesh Mody 	u32 cxts_per_p;
363ec94dbc5SRasesh Mody 
364ec94dbc5SRasesh Mody 	/* TBD MK: ILT code should be simplified once PROTO enum is changed */
365ec94dbc5SRasesh Mody 
3663b307c55SRasesh Mody 	*dynamic_line_offset = 0;
3673b307c55SRasesh Mody 	*dynamic_line_cnt = 0;
3683b307c55SRasesh Mody 
369ec94dbc5SRasesh Mody 	if (ilt_client == ILT_CLI_CDUC) {
370ec94dbc5SRasesh Mody 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC];
3713b307c55SRasesh Mody 		p_cfg = &p_hwfn->p_cxt_mngr->conn_cfg[PROTOCOLID_ROCE];
372ec94dbc5SRasesh Mody 
373ec94dbc5SRasesh Mody 		cxts_per_p = ILT_PAGE_IN_BYTES(p_cli->p_size.val) /
374ec94dbc5SRasesh Mody 		    (u32)CONN_CXT_SIZE(p_hwfn);
375ec94dbc5SRasesh Mody 
3763b307c55SRasesh Mody 		*dynamic_line_cnt = p_cfg->cid_count / cxts_per_p;
3773b307c55SRasesh Mody 	}
378ec94dbc5SRasesh Mody }
379ec94dbc5SRasesh Mody 
3803b307c55SRasesh Mody static struct ecore_ilt_client_cfg *
ecore_cxt_set_cli(struct ecore_ilt_client_cfg * p_cli)3813b307c55SRasesh Mody ecore_cxt_set_cli(struct ecore_ilt_client_cfg *p_cli)
3823b307c55SRasesh Mody {
3833b307c55SRasesh Mody 	p_cli->active = false;
3843b307c55SRasesh Mody 	p_cli->first.val = 0;
3853b307c55SRasesh Mody 	p_cli->last.val = 0;
3863b307c55SRasesh Mody 	return p_cli;
3873b307c55SRasesh Mody }
3883b307c55SRasesh Mody 
3893b307c55SRasesh Mody static struct ecore_ilt_cli_blk *
ecore_cxt_set_blk(struct ecore_ilt_cli_blk * p_blk)3903b307c55SRasesh Mody ecore_cxt_set_blk(struct ecore_ilt_cli_blk *p_blk)
3913b307c55SRasesh Mody {
3923b307c55SRasesh Mody 	p_blk->total_size = 0;
3933b307c55SRasesh Mody 	return p_blk;
3943b307c55SRasesh Mody 	}
3953b307c55SRasesh Mody 
3963b307c55SRasesh Mody static u32
ecore_cxt_src_elements(struct ecore_cxt_mngr * p_mngr)3973b307c55SRasesh Mody ecore_cxt_src_elements(struct ecore_cxt_mngr *p_mngr)
3983b307c55SRasesh Mody {
3993b307c55SRasesh Mody 	struct ecore_src_iids src_iids;
4003b307c55SRasesh Mody 	u32 elem_num = 0;
4013b307c55SRasesh Mody 
4023b307c55SRasesh Mody 	OSAL_MEM_ZERO(&src_iids, sizeof(src_iids));
4033b307c55SRasesh Mody 	ecore_cxt_src_iids(p_mngr, &src_iids);
4043b307c55SRasesh Mody 
4053b307c55SRasesh Mody 	/* Both the PF and VFs searcher connections are stored in the per PF
4063b307c55SRasesh Mody 	 * database. Thus sum the PF searcher cids and all the VFs searcher
4073b307c55SRasesh Mody 	 * cids.
4083b307c55SRasesh Mody 	 */
4093b307c55SRasesh Mody 	elem_num = src_iids.pf_cids +
4103b307c55SRasesh Mody 		   src_iids.per_vf_cids * p_mngr->vf_count;
4113b307c55SRasesh Mody 	if (elem_num == 0)
4123b307c55SRasesh Mody 		return elem_num;
4133b307c55SRasesh Mody 
4143b307c55SRasesh Mody 	elem_num = OSAL_MAX_T(u32, elem_num, SRC_MIN_NUM_ELEMS);
4153b307c55SRasesh Mody 	elem_num = OSAL_ROUNDUP_POW_OF_TWO(elem_num);
4163b307c55SRasesh Mody 
4173b307c55SRasesh Mody 	return elem_num;
418ec94dbc5SRasesh Mody }
419ec94dbc5SRasesh Mody 
ecore_cxt_cfg_ilt_compute(struct ecore_hwfn * p_hwfn)420ec94dbc5SRasesh Mody enum _ecore_status_t ecore_cxt_cfg_ilt_compute(struct ecore_hwfn *p_hwfn)
421ec94dbc5SRasesh Mody {
4223b307c55SRasesh Mody 	u32 curr_line, total, i, task_size, line, total_size, elem_size;
423ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
424ec94dbc5SRasesh Mody 	struct ecore_ilt_client_cfg *p_cli;
425ec94dbc5SRasesh Mody 	struct ecore_ilt_cli_blk *p_blk;
426ec94dbc5SRasesh Mody 	struct ecore_cdu_iids cdu_iids;
427ec94dbc5SRasesh Mody 	struct ecore_qm_iids qm_iids;
428ec94dbc5SRasesh Mody 	struct ecore_tm_iids tm_iids;
429ec94dbc5SRasesh Mody 	struct ecore_tid_seg *p_seg;
430ec94dbc5SRasesh Mody 
431ec94dbc5SRasesh Mody 	OSAL_MEM_ZERO(&qm_iids, sizeof(qm_iids));
432ec94dbc5SRasesh Mody 	OSAL_MEM_ZERO(&cdu_iids, sizeof(cdu_iids));
433ec94dbc5SRasesh Mody 	OSAL_MEM_ZERO(&tm_iids, sizeof(tm_iids));
434ec94dbc5SRasesh Mody 
435ec94dbc5SRasesh Mody 	p_mngr->pf_start_line = RESC_START(p_hwfn, ECORE_ILT);
436ec94dbc5SRasesh Mody 
437ec94dbc5SRasesh Mody 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
4389455b556SRasesh Mody 		   "hwfn [%d] - Set context mngr starting line to be 0x%08x\n",
439ec94dbc5SRasesh Mody 		   p_hwfn->my_id, p_hwfn->p_cxt_mngr->pf_start_line);
440ec94dbc5SRasesh Mody 
441ec94dbc5SRasesh Mody 	/* CDUC */
4423b307c55SRasesh Mody 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_CDUC]);
443ec94dbc5SRasesh Mody 
444ec94dbc5SRasesh Mody 	curr_line = p_mngr->pf_start_line;
445ec94dbc5SRasesh Mody 
446ec94dbc5SRasesh Mody 	/* CDUC PF */
447ec94dbc5SRasesh Mody 	p_cli->pf_total_lines = 0;
448ec94dbc5SRasesh Mody 
449ec94dbc5SRasesh Mody 	/* get the counters for the CDUC,CDUC and QM clients  */
450ec94dbc5SRasesh Mody 	ecore_cxt_cdu_iids(p_mngr, &cdu_iids);
451ec94dbc5SRasesh Mody 
4523b307c55SRasesh Mody 	p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[CDUC_BLK]);
453ec94dbc5SRasesh Mody 
454ec94dbc5SRasesh Mody 	total = cdu_iids.pf_cids * CONN_CXT_SIZE(p_hwfn);
455ec94dbc5SRasesh Mody 
456ec94dbc5SRasesh Mody 	ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
457ec94dbc5SRasesh Mody 			       total, CONN_CXT_SIZE(p_hwfn));
458ec94dbc5SRasesh Mody 
459ec94dbc5SRasesh Mody 	ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line, ILT_CLI_CDUC);
460ec94dbc5SRasesh Mody 	p_cli->pf_total_lines = curr_line - p_blk->start_line;
461ec94dbc5SRasesh Mody 
4623b307c55SRasesh Mody 	ecore_ilt_get_dynamic_line_range(p_hwfn, ILT_CLI_CDUC,
4633b307c55SRasesh Mody 					 &p_blk->dynamic_line_offset,
4643b307c55SRasesh Mody 					 &p_blk->dynamic_line_cnt);
465ec94dbc5SRasesh Mody 
466ec94dbc5SRasesh Mody 	/* CDUC VF */
4673b307c55SRasesh Mody 	p_blk = ecore_cxt_set_blk(&p_cli->vf_blks[CDUC_BLK]);
468ec94dbc5SRasesh Mody 	total = cdu_iids.per_vf_cids * CONN_CXT_SIZE(p_hwfn);
469ec94dbc5SRasesh Mody 
470ec94dbc5SRasesh Mody 	ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
471ec94dbc5SRasesh Mody 			       total, CONN_CXT_SIZE(p_hwfn));
472ec94dbc5SRasesh Mody 
473ec94dbc5SRasesh Mody 	ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line, ILT_CLI_CDUC);
474ec94dbc5SRasesh Mody 	p_cli->vf_total_lines = curr_line - p_blk->start_line;
475ec94dbc5SRasesh Mody 
476ec94dbc5SRasesh Mody 	for (i = 1; i < p_mngr->vf_count; i++)
477ec94dbc5SRasesh Mody 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
478ec94dbc5SRasesh Mody 				       ILT_CLI_CDUC);
479ec94dbc5SRasesh Mody 
480ec94dbc5SRasesh Mody 	/* CDUT PF */
4813b307c55SRasesh Mody 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_CDUT]);
482ec94dbc5SRasesh Mody 	p_cli->first.val = curr_line;
483ec94dbc5SRasesh Mody 
484ec94dbc5SRasesh Mody 	/* first the 'working' task memory */
485ec94dbc5SRasesh Mody 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
486ec94dbc5SRasesh Mody 		p_seg = ecore_cxt_tid_seg_info(p_hwfn, i);
487ec94dbc5SRasesh Mody 		if (!p_seg || p_seg->count == 0)
488ec94dbc5SRasesh Mody 			continue;
489ec94dbc5SRasesh Mody 
4903b307c55SRasesh Mody 		p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[CDUT_SEG_BLK(i)]);
491ec94dbc5SRasesh Mody 		total = p_seg->count * p_mngr->task_type_size[p_seg->type];
492ec94dbc5SRasesh Mody 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line, total,
493ec94dbc5SRasesh Mody 				       p_mngr->task_type_size[p_seg->type]);
494ec94dbc5SRasesh Mody 
495ec94dbc5SRasesh Mody 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
496ec94dbc5SRasesh Mody 				       ILT_CLI_CDUT);
497ec94dbc5SRasesh Mody 	}
498ec94dbc5SRasesh Mody 
499ec94dbc5SRasesh Mody 	/* next the 'init' task memory (forced load memory) */
500ec94dbc5SRasesh Mody 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
501ec94dbc5SRasesh Mody 		p_seg = ecore_cxt_tid_seg_info(p_hwfn, i);
502ec94dbc5SRasesh Mody 		if (!p_seg || p_seg->count == 0)
503ec94dbc5SRasesh Mody 			continue;
504ec94dbc5SRasesh Mody 
5053b307c55SRasesh Mody 		p_blk =
5063b307c55SRasesh Mody 		     ecore_cxt_set_blk(&p_cli->pf_blks[CDUT_FL_SEG_BLK(i, PF)]);
507ec94dbc5SRasesh Mody 
508ec94dbc5SRasesh Mody 		if (!p_seg->has_fl_mem) {
509ec94dbc5SRasesh Mody 			/* The segment is active (total size pf 'working'
510ec94dbc5SRasesh Mody 			 * memory is > 0) but has no FL (forced-load, Init)
511ec94dbc5SRasesh Mody 			 * memory. Thus:
512ec94dbc5SRasesh Mody 			 *
513ec94dbc5SRasesh Mody 			 * 1.   The total-size in the corrsponding FL block of
514ec94dbc5SRasesh Mody 			 *      the ILT client is set to 0 - No ILT line are
515ec94dbc5SRasesh Mody 			 *      provisioned and no ILT memory allocated.
516ec94dbc5SRasesh Mody 			 *
517ec94dbc5SRasesh Mody 			 * 2.   The start-line of said block is set to the
518ec94dbc5SRasesh Mody 			 *      start line of the matching working memory
519ec94dbc5SRasesh Mody 			 *      block in the ILT client. This is later used to
520ec94dbc5SRasesh Mody 			 *      configure the CDU segment offset registers and
521ec94dbc5SRasesh Mody 			 *      results in an FL command for TIDs of this
522ec94dbc5SRasesh Mody 			 *      segment behaves as regular load commands
523ec94dbc5SRasesh Mody 			 *      (loading TIDs from the working memory).
524ec94dbc5SRasesh Mody 			 */
525ec94dbc5SRasesh Mody 			line = p_cli->pf_blks[CDUT_SEG_BLK(i)].start_line;
526ec94dbc5SRasesh Mody 
527ec94dbc5SRasesh Mody 			ecore_ilt_cli_blk_fill(p_cli, p_blk, line, 0, 0);
528ec94dbc5SRasesh Mody 			continue;
529ec94dbc5SRasesh Mody 		}
530ec94dbc5SRasesh Mody 		total = p_seg->count * p_mngr->task_type_size[p_seg->type];
531ec94dbc5SRasesh Mody 
532ec94dbc5SRasesh Mody 		ecore_ilt_cli_blk_fill(p_cli, p_blk,
533ec94dbc5SRasesh Mody 				       curr_line, total,
534ec94dbc5SRasesh Mody 				       p_mngr->task_type_size[p_seg->type]);
535ec94dbc5SRasesh Mody 
536ec94dbc5SRasesh Mody 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
537ec94dbc5SRasesh Mody 				       ILT_CLI_CDUT);
538ec94dbc5SRasesh Mody 	}
5393b307c55SRasesh Mody 	p_cli->pf_total_lines = curr_line - p_cli->first.val;
540ec94dbc5SRasesh Mody 
541ec94dbc5SRasesh Mody 	/* CDUT VF */
542ec94dbc5SRasesh Mody 	p_seg = ecore_cxt_tid_seg_info(p_hwfn, TASK_SEGMENT_VF);
543ec94dbc5SRasesh Mody 	if (p_seg && p_seg->count) {
544ec94dbc5SRasesh Mody 		/* Stricly speaking we need to iterate over all VF
545ec94dbc5SRasesh Mody 		 * task segment types, but a VF has only 1 segment
546ec94dbc5SRasesh Mody 		 */
547ec94dbc5SRasesh Mody 
548ec94dbc5SRasesh Mody 		/* 'working' memory */
549ec94dbc5SRasesh Mody 		total = p_seg->count * p_mngr->task_type_size[p_seg->type];
550ec94dbc5SRasesh Mody 
5513b307c55SRasesh Mody 		p_blk = ecore_cxt_set_blk(&p_cli->vf_blks[CDUT_SEG_BLK(0)]);
552ec94dbc5SRasesh Mody 		ecore_ilt_cli_blk_fill(p_cli, p_blk,
553ec94dbc5SRasesh Mody 				       curr_line, total,
554ec94dbc5SRasesh Mody 				       p_mngr->task_type_size[p_seg->type]);
555ec94dbc5SRasesh Mody 
556ec94dbc5SRasesh Mody 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
557ec94dbc5SRasesh Mody 				       ILT_CLI_CDUT);
558ec94dbc5SRasesh Mody 
559ec94dbc5SRasesh Mody 		/* 'init' memory */
5603b307c55SRasesh Mody 		p_blk =
5613b307c55SRasesh Mody 		     ecore_cxt_set_blk(&p_cli->vf_blks[CDUT_FL_SEG_BLK(0, VF)]);
562ec94dbc5SRasesh Mody 		if (!p_seg->has_fl_mem) {
563ec94dbc5SRasesh Mody 			/* see comment above */
564ec94dbc5SRasesh Mody 			line = p_cli->vf_blks[CDUT_SEG_BLK(0)].start_line;
565ec94dbc5SRasesh Mody 			ecore_ilt_cli_blk_fill(p_cli, p_blk, line, 0, 0);
566ec94dbc5SRasesh Mody 		} else {
567ec94dbc5SRasesh Mody 			task_size = p_mngr->task_type_size[p_seg->type];
568ec94dbc5SRasesh Mody 			ecore_ilt_cli_blk_fill(p_cli, p_blk,
569ec94dbc5SRasesh Mody 					       curr_line, total, task_size);
570ec94dbc5SRasesh Mody 			ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
571ec94dbc5SRasesh Mody 					       ILT_CLI_CDUT);
572ec94dbc5SRasesh Mody 		}
5733b307c55SRasesh Mody 		p_cli->vf_total_lines = curr_line - (p_cli->first.val +
5743b307c55SRasesh Mody 						     p_cli->pf_total_lines);
575ec94dbc5SRasesh Mody 
576ec94dbc5SRasesh Mody 		/* Now for the rest of the VFs */
577ec94dbc5SRasesh Mody 		for (i = 1; i < p_mngr->vf_count; i++) {
5783b307c55SRasesh Mody 			/* don't set p_blk i.e. don't clear total_size */
579ec94dbc5SRasesh Mody 			p_blk = &p_cli->vf_blks[CDUT_SEG_BLK(0)];
580ec94dbc5SRasesh Mody 			ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
581ec94dbc5SRasesh Mody 					       ILT_CLI_CDUT);
582ec94dbc5SRasesh Mody 
5833b307c55SRasesh Mody 			/* don't set p_blk i.e. don't clear total_size */
584ec94dbc5SRasesh Mody 			p_blk = &p_cli->vf_blks[CDUT_FL_SEG_BLK(0, VF)];
585ec94dbc5SRasesh Mody 			ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
586ec94dbc5SRasesh Mody 					       ILT_CLI_CDUT);
587ec94dbc5SRasesh Mody 		}
588ec94dbc5SRasesh Mody 	}
589ec94dbc5SRasesh Mody 
590ec94dbc5SRasesh Mody 	/* QM */
5913b307c55SRasesh Mody 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_QM]);
5923b307c55SRasesh Mody 	p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[0]);
593ec94dbc5SRasesh Mody 
5943b307c55SRasesh Mody 	/* At this stage, after the first QM configuration, the PF PQs amount
5953b307c55SRasesh Mody 	 * is the highest possible. Save this value at qm_info->ilt_pf_pqs to
5963b307c55SRasesh Mody 	 * detect overflows in the future.
5973b307c55SRasesh Mody 	 * Even though VF PQs amount can be larger than VF count, use vf_count
5983b307c55SRasesh Mody 	 * because each VF requires only the full amount of CIDs.
5993b307c55SRasesh Mody 	 */
600ec94dbc5SRasesh Mody 	ecore_cxt_qm_iids(p_hwfn, &qm_iids);
6013b307c55SRasesh Mody 	total = ecore_qm_pf_mem_size(p_hwfn, qm_iids.cids,
602ec94dbc5SRasesh Mody 				     qm_iids.vf_cids, qm_iids.tids,
6033b307c55SRasesh Mody 				     p_hwfn->qm_info.num_pqs + OFLD_GRP_SIZE,
604ec94dbc5SRasesh Mody 				     p_hwfn->qm_info.num_vf_pqs);
605ec94dbc5SRasesh Mody 
606ec94dbc5SRasesh Mody 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
607ec94dbc5SRasesh Mody 		   "QM ILT Info, (cids=%d, vf_cids=%d, tids=%d, num_pqs=%d,"
608ec94dbc5SRasesh Mody 		   " num_vf_pqs=%d, memory_size=%d)\n",
609ec94dbc5SRasesh Mody 		   qm_iids.cids, qm_iids.vf_cids, qm_iids.tids,
610ec94dbc5SRasesh Mody 		   p_hwfn->qm_info.num_pqs, p_hwfn->qm_info.num_vf_pqs, total);
611ec94dbc5SRasesh Mody 
612ec94dbc5SRasesh Mody 	ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line, total * 0x1000,
613ec94dbc5SRasesh Mody 			       QM_PQ_ELEMENT_SIZE);
614ec94dbc5SRasesh Mody 
615ec94dbc5SRasesh Mody 	ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line, ILT_CLI_QM);
616ec94dbc5SRasesh Mody 	p_cli->pf_total_lines = curr_line - p_blk->start_line;
617ec94dbc5SRasesh Mody 
618ec94dbc5SRasesh Mody 	/* TM PF */
6193b307c55SRasesh Mody 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_TM]);
6203b307c55SRasesh Mody 	ecore_cxt_tm_iids(p_hwfn, p_mngr, &tm_iids);
621ec94dbc5SRasesh Mody 	total = tm_iids.pf_cids + tm_iids.pf_tids_total;
622ec94dbc5SRasesh Mody 	if (total) {
6233b307c55SRasesh Mody 		p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[0]);
624ec94dbc5SRasesh Mody 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
6253b307c55SRasesh Mody 				       total * TM_ELEM_SIZE,
6263b307c55SRasesh Mody 				       TM_ELEM_SIZE);
627ec94dbc5SRasesh Mody 
628ec94dbc5SRasesh Mody 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
629ec94dbc5SRasesh Mody 				       ILT_CLI_TM);
630ec94dbc5SRasesh Mody 		p_cli->pf_total_lines = curr_line - p_blk->start_line;
631ec94dbc5SRasesh Mody 	}
632ec94dbc5SRasesh Mody 
633ec94dbc5SRasesh Mody 	/* TM VF */
634ec94dbc5SRasesh Mody 	total = tm_iids.per_vf_cids + tm_iids.per_vf_tids;
635ec94dbc5SRasesh Mody 	if (total) {
6363b307c55SRasesh Mody 		p_blk = ecore_cxt_set_blk(&p_cli->vf_blks[0]);
637ec94dbc5SRasesh Mody 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
638ec94dbc5SRasesh Mody 				       total * TM_ELEM_SIZE, TM_ELEM_SIZE);
639ec94dbc5SRasesh Mody 
640ec94dbc5SRasesh Mody 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
641ec94dbc5SRasesh Mody 				       ILT_CLI_TM);
642ec94dbc5SRasesh Mody 
64356d1a16aSRasesh Mody 		p_cli->vf_total_lines = curr_line - p_blk->start_line;
644ec94dbc5SRasesh Mody 		for (i = 1; i < p_mngr->vf_count; i++) {
645ec94dbc5SRasesh Mody 			ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
646ec94dbc5SRasesh Mody 					       ILT_CLI_TM);
647ec94dbc5SRasesh Mody 		}
64822d07d93SRasesh Mody 	}
64922d07d93SRasesh Mody 
6503b307c55SRasesh Mody 	/* SRC */
6513b307c55SRasesh Mody 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_SRC]);
6523b307c55SRasesh Mody 	total = ecore_cxt_src_elements(p_mngr);
6533b307c55SRasesh Mody 
6543b307c55SRasesh Mody 	if (total) {
6553b307c55SRasesh Mody 		total_size = total * sizeof(struct src_ent);
6563b307c55SRasesh Mody 		elem_size = sizeof(struct src_ent);
6573b307c55SRasesh Mody 
6583b307c55SRasesh Mody 		p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[0]);
6593b307c55SRasesh Mody 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
6603b307c55SRasesh Mody 				       total_size, elem_size);
6613b307c55SRasesh Mody 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
6623b307c55SRasesh Mody 				       ILT_CLI_SRC);
6633b307c55SRasesh Mody 		p_cli->pf_total_lines = curr_line - p_blk->start_line;
6643b307c55SRasesh Mody 	}
6653b307c55SRasesh Mody 
66622d07d93SRasesh Mody 	/* TSDM (SRQ CONTEXT) */
66722d07d93SRasesh Mody 	total = ecore_cxt_get_srq_count(p_hwfn);
66822d07d93SRasesh Mody 
66922d07d93SRasesh Mody 	if (total) {
6703b307c55SRasesh Mody 		p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_TSDM]);
6713b307c55SRasesh Mody 		p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[SRQ_BLK]);
67222d07d93SRasesh Mody 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
67322d07d93SRasesh Mody 				       total * SRQ_CXT_SIZE, SRQ_CXT_SIZE);
67422d07d93SRasesh Mody 
67522d07d93SRasesh Mody 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
67622d07d93SRasesh Mody 				       ILT_CLI_TSDM);
67722d07d93SRasesh Mody 		p_cli->pf_total_lines = curr_line - p_blk->start_line;
678ec94dbc5SRasesh Mody 	}
679ec94dbc5SRasesh Mody 
680ec94dbc5SRasesh Mody 	if (curr_line - p_hwfn->p_cxt_mngr->pf_start_line >
681ec94dbc5SRasesh Mody 	    RESC_NUM(p_hwfn, ECORE_ILT)) {
682ec94dbc5SRasesh Mody 		DP_ERR(p_hwfn, "too many ilt lines...#lines=%d\n",
683ec94dbc5SRasesh Mody 		       curr_line - p_hwfn->p_cxt_mngr->pf_start_line);
684ec94dbc5SRasesh Mody 		return ECORE_INVAL;
685ec94dbc5SRasesh Mody 	}
686ec94dbc5SRasesh Mody 
687ec94dbc5SRasesh Mody 	return ECORE_SUCCESS;
688ec94dbc5SRasesh Mody }
689ec94dbc5SRasesh Mody 
ecore_cxt_src_t2_free(struct ecore_hwfn * p_hwfn)690ec94dbc5SRasesh Mody static void ecore_cxt_src_t2_free(struct ecore_hwfn *p_hwfn)
691ec94dbc5SRasesh Mody {
6923b307c55SRasesh Mody 	struct ecore_src_t2 *p_t2 = &p_hwfn->p_cxt_mngr->src_t2;
693ec94dbc5SRasesh Mody 	u32 i;
694ec94dbc5SRasesh Mody 
6953b307c55SRasesh Mody 	if (!p_t2 || !p_t2->dma_mem)
696ec94dbc5SRasesh Mody 		return;
697ec94dbc5SRasesh Mody 
6983b307c55SRasesh Mody 	for (i = 0; i < p_t2->num_pages; i++)
6993b307c55SRasesh Mody 		if (p_t2->dma_mem[i].virt_addr)
700ec94dbc5SRasesh Mody 			OSAL_DMA_FREE_COHERENT(p_hwfn->p_dev,
7013b307c55SRasesh Mody 					       p_t2->dma_mem[i].virt_addr,
7023b307c55SRasesh Mody 					       p_t2->dma_mem[i].phys_addr,
7033b307c55SRasesh Mody 					       p_t2->dma_mem[i].size);
704ec94dbc5SRasesh Mody 
7053b307c55SRasesh Mody 	OSAL_FREE(p_hwfn->p_dev, p_t2->dma_mem);
7063b307c55SRasesh Mody 	p_t2->dma_mem = OSAL_NULL;
7073b307c55SRasesh Mody }
7083b307c55SRasesh Mody 
7093b307c55SRasesh Mody static enum _ecore_status_t
ecore_cxt_t2_alloc_pages(struct ecore_hwfn * p_hwfn,struct ecore_src_t2 * p_t2,u32 total_size,u32 page_size)7103b307c55SRasesh Mody ecore_cxt_t2_alloc_pages(struct ecore_hwfn *p_hwfn,
7113b307c55SRasesh Mody 			 struct ecore_src_t2 *p_t2,
7123b307c55SRasesh Mody 			 u32 total_size, u32 page_size)
7133b307c55SRasesh Mody {
7143b307c55SRasesh Mody 	void **p_virt;
7153b307c55SRasesh Mody 	u32 size, i;
7163b307c55SRasesh Mody 
7173b307c55SRasesh Mody 	if (!p_t2 || !p_t2->dma_mem)
7183b307c55SRasesh Mody 		return ECORE_INVAL;
7193b307c55SRasesh Mody 
7203b307c55SRasesh Mody 	for (i = 0; i < p_t2->num_pages; i++) {
7213b307c55SRasesh Mody 		size = OSAL_MIN_T(u32, total_size, page_size);
7223b307c55SRasesh Mody 		p_virt = &p_t2->dma_mem[i].virt_addr;
7233b307c55SRasesh Mody 
7243b307c55SRasesh Mody 		*p_virt = OSAL_DMA_ALLOC_COHERENT(p_hwfn->p_dev,
7253b307c55SRasesh Mody 						  &p_t2->dma_mem[i].phys_addr,
7263b307c55SRasesh Mody 						  size);
7273b307c55SRasesh Mody 		if (!p_t2->dma_mem[i].virt_addr)
7283b307c55SRasesh Mody 			return ECORE_NOMEM;
7293b307c55SRasesh Mody 
7303b307c55SRasesh Mody 		OSAL_MEM_ZERO(*p_virt, size);
7313b307c55SRasesh Mody 		p_t2->dma_mem[i].size = size;
7323b307c55SRasesh Mody 		total_size -= size;
7333b307c55SRasesh Mody 	}
7343b307c55SRasesh Mody 
7353b307c55SRasesh Mody 	return ECORE_SUCCESS;
736ec94dbc5SRasesh Mody }
737ec94dbc5SRasesh Mody 
ecore_cxt_src_t2_alloc(struct ecore_hwfn * p_hwfn)738ec94dbc5SRasesh Mody static enum _ecore_status_t ecore_cxt_src_t2_alloc(struct ecore_hwfn *p_hwfn)
739ec94dbc5SRasesh Mody {
740ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
741ec94dbc5SRasesh Mody 	u32 conn_num, total_size, ent_per_page, psz, i;
7423b307c55SRasesh Mody 	struct phys_mem_desc *p_t2_last_page;
743ec94dbc5SRasesh Mody 	struct ecore_ilt_client_cfg *p_src;
744ec94dbc5SRasesh Mody 	struct ecore_src_iids src_iids;
7453b307c55SRasesh Mody 	struct ecore_src_t2 *p_t2;
746ec94dbc5SRasesh Mody 	enum _ecore_status_t rc;
747ec94dbc5SRasesh Mody 
748ec94dbc5SRasesh Mody 	OSAL_MEM_ZERO(&src_iids, sizeof(src_iids));
749ec94dbc5SRasesh Mody 
750ec94dbc5SRasesh Mody 	/* if the SRC ILT client is inactive - there are no connection
751ec94dbc5SRasesh Mody 	 * requiring the searcer, leave.
752ec94dbc5SRasesh Mody 	 */
753ec94dbc5SRasesh Mody 	p_src = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_SRC];
754ec94dbc5SRasesh Mody 	if (!p_src->active)
755ec94dbc5SRasesh Mody 		return ECORE_SUCCESS;
756ec94dbc5SRasesh Mody 
757eafbc6fcSRasesh Mody 	ecore_cxt_src_iids(p_mngr, &src_iids);
758ec94dbc5SRasesh Mody 	conn_num = src_iids.pf_cids + src_iids.per_vf_cids * p_mngr->vf_count;
759ec94dbc5SRasesh Mody 	total_size = conn_num * sizeof(struct src_ent);
760ec94dbc5SRasesh Mody 
761ec94dbc5SRasesh Mody 	/* use the same page size as the SRC ILT client */
762ec94dbc5SRasesh Mody 	psz = ILT_PAGE_IN_BYTES(p_src->p_size.val);
7633b307c55SRasesh Mody 	p_t2 = &p_mngr->src_t2;
7643b307c55SRasesh Mody 	p_t2->num_pages = DIV_ROUND_UP(total_size, psz);
765ec94dbc5SRasesh Mody 
766ec94dbc5SRasesh Mody 	/* allocate t2 */
7673b307c55SRasesh Mody 	p_t2->dma_mem = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL,
7683b307c55SRasesh Mody 				    p_t2->num_pages *
7693b307c55SRasesh Mody 				    sizeof(struct phys_mem_desc));
7703b307c55SRasesh Mody 	if (!p_t2->dma_mem) {
77198abf84eSRasesh Mody 		DP_NOTICE(p_hwfn, false, "Failed to allocate t2 table\n");
772ec94dbc5SRasesh Mody 		rc = ECORE_NOMEM;
773ec94dbc5SRasesh Mody 		goto t2_fail;
774ec94dbc5SRasesh Mody 	}
775ec94dbc5SRasesh Mody 
7763b307c55SRasesh Mody 	rc = ecore_cxt_t2_alloc_pages(p_hwfn, p_t2, total_size, psz);
7773b307c55SRasesh Mody 	if (rc)
778ec94dbc5SRasesh Mody 		goto t2_fail;
779ec94dbc5SRasesh Mody 
780ec94dbc5SRasesh Mody 	/* Set the t2 pointers */
781ec94dbc5SRasesh Mody 
782ec94dbc5SRasesh Mody 	/* entries per page - must be a power of two */
783ec94dbc5SRasesh Mody 	ent_per_page = psz / sizeof(struct src_ent);
784ec94dbc5SRasesh Mody 
7853b307c55SRasesh Mody 	p_t2->first_free = (u64)p_t2->dma_mem[0].phys_addr;
786ec94dbc5SRasesh Mody 
7873b307c55SRasesh Mody 	p_t2_last_page = &p_t2->dma_mem[(conn_num - 1) / ent_per_page];
7883b307c55SRasesh Mody 	p_t2->last_free = (u64)p_t2_last_page->phys_addr +
7893b307c55SRasesh Mody 			  ((conn_num - 1) & (ent_per_page - 1)) *
7903b307c55SRasesh Mody 			  sizeof(struct src_ent);
791ec94dbc5SRasesh Mody 
7923b307c55SRasesh Mody 	for (i = 0; i < p_t2->num_pages; i++) {
793ec94dbc5SRasesh Mody 		u32 ent_num = OSAL_MIN_T(u32, ent_per_page, conn_num);
7943b307c55SRasesh Mody 		struct src_ent *entries = p_t2->dma_mem[i].virt_addr;
7953b307c55SRasesh Mody 		u64 p_ent_phys = (u64)p_t2->dma_mem[i].phys_addr, val;
796ec94dbc5SRasesh Mody 		u32 j;
797ec94dbc5SRasesh Mody 
798ec94dbc5SRasesh Mody 		for (j = 0; j < ent_num - 1; j++) {
799ec94dbc5SRasesh Mody 			val = p_ent_phys + (j + 1) * sizeof(struct src_ent);
800ec94dbc5SRasesh Mody 			entries[j].next = OSAL_CPU_TO_BE64(val);
801ec94dbc5SRasesh Mody 		}
802ec94dbc5SRasesh Mody 
8033b307c55SRasesh Mody 		if (i < p_t2->num_pages - 1)
8043b307c55SRasesh Mody 			val = (u64)p_t2->dma_mem[i + 1].phys_addr;
805ec94dbc5SRasesh Mody 		else
806ec94dbc5SRasesh Mody 			val = 0;
807ec94dbc5SRasesh Mody 		entries[j].next = OSAL_CPU_TO_BE64(val);
808ec94dbc5SRasesh Mody 
80922d07d93SRasesh Mody 		conn_num -= ent_num;
810ec94dbc5SRasesh Mody 	}
811ec94dbc5SRasesh Mody 
812ec94dbc5SRasesh Mody 	return ECORE_SUCCESS;
813ec94dbc5SRasesh Mody 
814ec94dbc5SRasesh Mody t2_fail:
815ec94dbc5SRasesh Mody 	ecore_cxt_src_t2_free(p_hwfn);
816ec94dbc5SRasesh Mody 	return rc;
817ec94dbc5SRasesh Mody }
818ec94dbc5SRasesh Mody 
8199455b556SRasesh Mody #define for_each_ilt_valid_client(pos, clients)		\
820519438f7SRasesh Mody 	for (pos = 0; pos < MAX_ILT_CLIENTS; pos++)		\
8219455b556SRasesh Mody 		if (!clients[pos].active) {		\
8229455b556SRasesh Mody 			continue;			\
8239455b556SRasesh Mody 		} else					\
8249455b556SRasesh Mody 
8259455b556SRasesh Mody 
826ec94dbc5SRasesh Mody /* Total number of ILT lines used by this PF */
ecore_cxt_ilt_shadow_size(struct ecore_ilt_client_cfg * ilt_clients)827ec94dbc5SRasesh Mody static u32 ecore_cxt_ilt_shadow_size(struct ecore_ilt_client_cfg *ilt_clients)
828ec94dbc5SRasesh Mody {
829ec94dbc5SRasesh Mody 	u32 size = 0;
830ec94dbc5SRasesh Mody 	u32 i;
831ec94dbc5SRasesh Mody 
8329455b556SRasesh Mody 	for_each_ilt_valid_client(i, ilt_clients)
833ec94dbc5SRasesh Mody 		size += (ilt_clients[i].last.val -
834ec94dbc5SRasesh Mody 			 ilt_clients[i].first.val + 1);
835ec94dbc5SRasesh Mody 
836ec94dbc5SRasesh Mody 	return size;
837ec94dbc5SRasesh Mody }
838ec94dbc5SRasesh Mody 
ecore_ilt_shadow_free(struct ecore_hwfn * p_hwfn)839ec94dbc5SRasesh Mody static void ecore_ilt_shadow_free(struct ecore_hwfn *p_hwfn)
840ec94dbc5SRasesh Mody {
841ec94dbc5SRasesh Mody 	struct ecore_ilt_client_cfg *p_cli = p_hwfn->p_cxt_mngr->clients;
842ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
843ec94dbc5SRasesh Mody 	u32 ilt_size, i;
844ec94dbc5SRasesh Mody 
84598abf84eSRasesh Mody 	if (p_mngr->ilt_shadow == OSAL_NULL)
84698abf84eSRasesh Mody 		return;
84798abf84eSRasesh Mody 
848ec94dbc5SRasesh Mody 	ilt_size = ecore_cxt_ilt_shadow_size(p_cli);
849ec94dbc5SRasesh Mody 
850ec94dbc5SRasesh Mody 	for (i = 0; p_mngr->ilt_shadow && i < ilt_size; i++) {
8513b307c55SRasesh Mody 		struct phys_mem_desc *p_dma = &p_mngr->ilt_shadow[i];
852ec94dbc5SRasesh Mody 
8533b307c55SRasesh Mody 		if (p_dma->virt_addr)
854ec94dbc5SRasesh Mody 			OSAL_DMA_FREE_COHERENT(p_hwfn->p_dev,
855ec94dbc5SRasesh Mody 					       p_dma->p_virt,
8563b307c55SRasesh Mody 					       p_dma->phys_addr, p_dma->size);
8573b307c55SRasesh Mody 		p_dma->virt_addr = OSAL_NULL;
858ec94dbc5SRasesh Mody 	}
859ec94dbc5SRasesh Mody 	OSAL_FREE(p_hwfn->p_dev, p_mngr->ilt_shadow);
86098abf84eSRasesh Mody 	p_mngr->ilt_shadow = OSAL_NULL;
861ec94dbc5SRasesh Mody }
862ec94dbc5SRasesh Mody 
863ec94dbc5SRasesh Mody static enum _ecore_status_t
ecore_ilt_blk_alloc(struct ecore_hwfn * p_hwfn,struct ecore_ilt_cli_blk * p_blk,enum ilt_clients ilt_client,u32 start_line_offset)864ec94dbc5SRasesh Mody ecore_ilt_blk_alloc(struct ecore_hwfn *p_hwfn,
865ec94dbc5SRasesh Mody 		    struct ecore_ilt_cli_blk *p_blk,
866ec94dbc5SRasesh Mody 		    enum ilt_clients ilt_client, u32 start_line_offset)
867ec94dbc5SRasesh Mody {
8683b307c55SRasesh Mody 	struct phys_mem_desc *ilt_shadow = p_hwfn->p_cxt_mngr->ilt_shadow;
8693b307c55SRasesh Mody 	u32 lines, line, sz_left, lines_to_skip, first_skipped_line;
870ec94dbc5SRasesh Mody 
871ec94dbc5SRasesh Mody 	/* Special handling for RoCE that supports dynamic allocation */
87222d07d93SRasesh Mody 	if (ilt_client == ILT_CLI_CDUT || ilt_client == ILT_CLI_TSDM)
873ec94dbc5SRasesh Mody 		return ECORE_SUCCESS;
874ec94dbc5SRasesh Mody 
875ec94dbc5SRasesh Mody 	if (!p_blk->total_size)
876ec94dbc5SRasesh Mody 		return ECORE_SUCCESS;
877ec94dbc5SRasesh Mody 
878ec94dbc5SRasesh Mody 	sz_left = p_blk->total_size;
8793b307c55SRasesh Mody 	lines_to_skip = p_blk->dynamic_line_cnt;
880ec94dbc5SRasesh Mody 	lines = DIV_ROUND_UP(sz_left, p_blk->real_size_in_page) - lines_to_skip;
881ec94dbc5SRasesh Mody 	line = p_blk->start_line + start_line_offset -
8823b307c55SRasesh Mody 	       p_hwfn->p_cxt_mngr->pf_start_line;
8833b307c55SRasesh Mody 	first_skipped_line = line + p_blk->dynamic_line_offset;
884ec94dbc5SRasesh Mody 
8853b307c55SRasesh Mody 	while (lines) {
886ec94dbc5SRasesh Mody 		dma_addr_t p_phys;
887ec94dbc5SRasesh Mody 		void *p_virt;
888ec94dbc5SRasesh Mody 		u32 size;
889ec94dbc5SRasesh Mody 
8903b307c55SRasesh Mody 		if (lines_to_skip && (line == first_skipped_line)) {
8913b307c55SRasesh Mody 			line += lines_to_skip;
8923b307c55SRasesh Mody 			continue;
8933b307c55SRasesh Mody 		}
8943b307c55SRasesh Mody 
895ec94dbc5SRasesh Mody 		size = OSAL_MIN_T(u32, sz_left, p_blk->real_size_in_page);
896ec94dbc5SRasesh Mody 
897ec94dbc5SRasesh Mody /* @DPDK */
898ec94dbc5SRasesh Mody #define ILT_BLOCK_ALIGN_SIZE 0x1000
899ec94dbc5SRasesh Mody 		p_virt = OSAL_DMA_ALLOC_COHERENT_ALIGNED(p_hwfn->p_dev,
900ec94dbc5SRasesh Mody 							 &p_phys, size,
901ec94dbc5SRasesh Mody 							 ILT_BLOCK_ALIGN_SIZE);
902ec94dbc5SRasesh Mody 		if (!p_virt)
903ec94dbc5SRasesh Mody 			return ECORE_NOMEM;
904ec94dbc5SRasesh Mody 		OSAL_MEM_ZERO(p_virt, size);
905ec94dbc5SRasesh Mody 
9063b307c55SRasesh Mody 		ilt_shadow[line].phys_addr = p_phys;
9073b307c55SRasesh Mody 		ilt_shadow[line].virt_addr = p_virt;
908ec94dbc5SRasesh Mody 		ilt_shadow[line].size = size;
909ec94dbc5SRasesh Mody 
910ec94dbc5SRasesh Mody 		DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
9119455b556SRasesh Mody 			   "ILT shadow: Line [%d] Physical 0x%lx"
912ec94dbc5SRasesh Mody 			   " Virtual %p Size %d\n",
9139455b556SRasesh Mody 			   line, (unsigned long)p_phys, p_virt, size);
914ec94dbc5SRasesh Mody 
915ec94dbc5SRasesh Mody 		sz_left -= size;
916ec94dbc5SRasesh Mody 		line++;
9173b307c55SRasesh Mody 		lines--;
918ec94dbc5SRasesh Mody 	}
919ec94dbc5SRasesh Mody 
920ec94dbc5SRasesh Mody 	return ECORE_SUCCESS;
921ec94dbc5SRasesh Mody }
922ec94dbc5SRasesh Mody 
ecore_ilt_shadow_alloc(struct ecore_hwfn * p_hwfn)923ec94dbc5SRasesh Mody static enum _ecore_status_t ecore_ilt_shadow_alloc(struct ecore_hwfn *p_hwfn)
924ec94dbc5SRasesh Mody {
925ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
926ec94dbc5SRasesh Mody 	struct ecore_ilt_client_cfg *clients = p_mngr->clients;
927ec94dbc5SRasesh Mody 	struct ecore_ilt_cli_blk *p_blk;
928ec94dbc5SRasesh Mody 	u32 size, i, j, k;
9299455b556SRasesh Mody 	enum _ecore_status_t rc;
930ec94dbc5SRasesh Mody 
931ec94dbc5SRasesh Mody 	size = ecore_cxt_ilt_shadow_size(clients);
932ec94dbc5SRasesh Mody 	p_mngr->ilt_shadow = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL,
9333b307c55SRasesh Mody 					 size * sizeof(struct phys_mem_desc));
934ec94dbc5SRasesh Mody 
935ec94dbc5SRasesh Mody 	if (!p_mngr->ilt_shadow) {
93698abf84eSRasesh Mody 		DP_NOTICE(p_hwfn, false, "Failed to allocate ilt shadow table\n");
937ec94dbc5SRasesh Mody 		rc = ECORE_NOMEM;
938ec94dbc5SRasesh Mody 		goto ilt_shadow_fail;
939ec94dbc5SRasesh Mody 	}
940ec94dbc5SRasesh Mody 
941ec94dbc5SRasesh Mody 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
942ec94dbc5SRasesh Mody 		   "Allocated 0x%x bytes for ilt shadow\n",
9433b307c55SRasesh Mody 		   (u32)(size * sizeof(struct phys_mem_desc)));
944ec94dbc5SRasesh Mody 
9459455b556SRasesh Mody 	for_each_ilt_valid_client(i, clients) {
946ec94dbc5SRasesh Mody 		for (j = 0; j < ILT_CLI_PF_BLOCKS; j++) {
947ec94dbc5SRasesh Mody 			p_blk = &clients[i].pf_blks[j];
948ec94dbc5SRasesh Mody 			rc = ecore_ilt_blk_alloc(p_hwfn, p_blk, i, 0);
949ec94dbc5SRasesh Mody 			if (rc != ECORE_SUCCESS)
950ec94dbc5SRasesh Mody 				goto ilt_shadow_fail;
951ec94dbc5SRasesh Mody 		}
952ec94dbc5SRasesh Mody 		for (k = 0; k < p_mngr->vf_count; k++) {
953ec94dbc5SRasesh Mody 			for (j = 0; j < ILT_CLI_VF_BLOCKS; j++) {
954ec94dbc5SRasesh Mody 				u32 lines = clients[i].vf_total_lines * k;
955ec94dbc5SRasesh Mody 
956ec94dbc5SRasesh Mody 				p_blk = &clients[i].vf_blks[j];
957ec94dbc5SRasesh Mody 				rc = ecore_ilt_blk_alloc(p_hwfn, p_blk,
958ec94dbc5SRasesh Mody 							 i, lines);
959ec94dbc5SRasesh Mody 				if (rc != ECORE_SUCCESS)
960ec94dbc5SRasesh Mody 					goto ilt_shadow_fail;
961ec94dbc5SRasesh Mody 			}
962ec94dbc5SRasesh Mody 		}
963ec94dbc5SRasesh Mody 	}
964ec94dbc5SRasesh Mody 
965ec94dbc5SRasesh Mody 	return ECORE_SUCCESS;
966ec94dbc5SRasesh Mody 
967ec94dbc5SRasesh Mody ilt_shadow_fail:
968ec94dbc5SRasesh Mody 	ecore_ilt_shadow_free(p_hwfn);
969ec94dbc5SRasesh Mody 	return rc;
970ec94dbc5SRasesh Mody }
971ec94dbc5SRasesh Mody 
ecore_cid_map_free(struct ecore_hwfn * p_hwfn)972ec94dbc5SRasesh Mody static void ecore_cid_map_free(struct ecore_hwfn *p_hwfn)
973ec94dbc5SRasesh Mody {
9747ed1cd53SRasesh Mody 	u32 type, vf, max_num_vfs = NUM_OF_VFS(p_hwfn->p_dev);
975ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
976ec94dbc5SRasesh Mody 
977ec94dbc5SRasesh Mody 	for (type = 0; type < MAX_CONN_TYPES; type++) {
978ec94dbc5SRasesh Mody 		OSAL_FREE(p_hwfn->p_dev, p_mngr->acquired[type].cid_map);
97998abf84eSRasesh Mody 		p_mngr->acquired[type].cid_map = OSAL_NULL;
980ec94dbc5SRasesh Mody 		p_mngr->acquired[type].max_count = 0;
981ec94dbc5SRasesh Mody 		p_mngr->acquired[type].start_cid = 0;
982eb8e81adSRasesh Mody 
9837ed1cd53SRasesh Mody 		for (vf = 0; vf < max_num_vfs; vf++) {
984eb8e81adSRasesh Mody 			OSAL_FREE(p_hwfn->p_dev,
985eb8e81adSRasesh Mody 				  p_mngr->acquired_vf[type][vf].cid_map);
98698abf84eSRasesh Mody 			p_mngr->acquired_vf[type][vf].cid_map = OSAL_NULL;
987eb8e81adSRasesh Mody 			p_mngr->acquired_vf[type][vf].max_count = 0;
988eb8e81adSRasesh Mody 			p_mngr->acquired_vf[type][vf].start_cid = 0;
989ec94dbc5SRasesh Mody 		}
990ec94dbc5SRasesh Mody 	}
991eb8e81adSRasesh Mody }
992eb8e81adSRasesh Mody 
993eb8e81adSRasesh Mody static enum _ecore_status_t
__ecore_cid_map_alloc_single(struct ecore_hwfn * p_hwfn,u32 type,u32 cid_start,u32 cid_count,struct ecore_cid_acquired_map * p_map)9943b307c55SRasesh Mody __ecore_cid_map_alloc_single(struct ecore_hwfn *p_hwfn, u32 type,
995eb8e81adSRasesh Mody 			   u32 cid_start, u32 cid_count,
996eb8e81adSRasesh Mody 			   struct ecore_cid_acquired_map *p_map)
997eb8e81adSRasesh Mody {
998eb8e81adSRasesh Mody 	u32 size;
999eb8e81adSRasesh Mody 
1000eb8e81adSRasesh Mody 	if (!cid_count)
1001eb8e81adSRasesh Mody 		return ECORE_SUCCESS;
1002eb8e81adSRasesh Mody 
1003eb8e81adSRasesh Mody 	size = MAP_WORD_SIZE * DIV_ROUND_UP(cid_count, BITS_PER_MAP_WORD);
1004eb8e81adSRasesh Mody 	p_map->cid_map = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL, size);
1005eb8e81adSRasesh Mody 	if (p_map->cid_map == OSAL_NULL)
1006eb8e81adSRasesh Mody 		return ECORE_NOMEM;
1007eb8e81adSRasesh Mody 
1008eb8e81adSRasesh Mody 	p_map->max_count = cid_count;
1009eb8e81adSRasesh Mody 	p_map->start_cid = cid_start;
1010eb8e81adSRasesh Mody 
1011eb8e81adSRasesh Mody 	DP_VERBOSE(p_hwfn, ECORE_MSG_CXT,
1012eb8e81adSRasesh Mody 		   "Type %08x start: %08x count %08x\n",
1013eb8e81adSRasesh Mody 		   type, p_map->start_cid, p_map->max_count);
1014eb8e81adSRasesh Mody 
1015eb8e81adSRasesh Mody 	return ECORE_SUCCESS;
1016eb8e81adSRasesh Mody }
1017ec94dbc5SRasesh Mody 
10183b307c55SRasesh Mody static enum _ecore_status_t
ecore_cid_map_alloc_single(struct ecore_hwfn * p_hwfn,u32 type,u32 start_cid,u32 vf_start_cid)10193b307c55SRasesh Mody ecore_cid_map_alloc_single(struct ecore_hwfn *p_hwfn, u32 type, u32 start_cid,
10203b307c55SRasesh Mody 			   u32 vf_start_cid)
1021ec94dbc5SRasesh Mody {
1022ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
10233b307c55SRasesh Mody 	u32 vf, max_num_vfs = NUM_OF_VFS(p_hwfn->p_dev);
1024eb8e81adSRasesh Mody 	struct ecore_cid_acquired_map *p_map;
10253b307c55SRasesh Mody 	struct ecore_conn_type_cfg *p_cfg;
10263b307c55SRasesh Mody 	enum _ecore_status_t rc;
10273b307c55SRasesh Mody 
10283b307c55SRasesh Mody 	p_cfg = &p_mngr->conn_cfg[type];
1029ec94dbc5SRasesh Mody 
1030eb8e81adSRasesh Mody 		/* Handle PF maps */
1031eb8e81adSRasesh Mody 		p_map = &p_mngr->acquired[type];
10323b307c55SRasesh Mody 	rc = __ecore_cid_map_alloc_single(p_hwfn, type, start_cid,
10333b307c55SRasesh Mody 					  p_cfg->cid_count, p_map);
10343b307c55SRasesh Mody 	if (rc != ECORE_SUCCESS)
10353b307c55SRasesh Mody 		return rc;
1036ec94dbc5SRasesh Mody 
1037eb8e81adSRasesh Mody 	/* Handle VF maps */
10387ed1cd53SRasesh Mody 	for (vf = 0; vf < max_num_vfs; vf++) {
1039eb8e81adSRasesh Mody 		p_map = &p_mngr->acquired_vf[type][vf];
10403b307c55SRasesh Mody 		rc = __ecore_cid_map_alloc_single(p_hwfn, type, vf_start_cid,
10413b307c55SRasesh Mody 						  p_cfg->cids_per_vf, p_map);
10423b307c55SRasesh Mody 		if (rc != ECORE_SUCCESS)
10433b307c55SRasesh Mody 			return rc;
1044eb8e81adSRasesh Mody 	}
1045ec94dbc5SRasesh Mody 
10463b307c55SRasesh Mody 	return ECORE_SUCCESS;
10473b307c55SRasesh Mody }
10483b307c55SRasesh Mody 
ecore_cid_map_alloc(struct ecore_hwfn * p_hwfn)10493b307c55SRasesh Mody static enum _ecore_status_t ecore_cid_map_alloc(struct ecore_hwfn *p_hwfn)
10503b307c55SRasesh Mody {
10513b307c55SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
10523b307c55SRasesh Mody 	u32 start_cid = 0, vf_start_cid = 0;
10533b307c55SRasesh Mody 	u32 type;
10543b307c55SRasesh Mody 	enum _ecore_status_t rc;
10553b307c55SRasesh Mody 
10563b307c55SRasesh Mody 	for (type = 0; type < MAX_CONN_TYPES; type++) {
10573b307c55SRasesh Mody 		rc = ecore_cid_map_alloc_single(p_hwfn, type, start_cid,
10583b307c55SRasesh Mody 						vf_start_cid);
10593b307c55SRasesh Mody 		if (rc != ECORE_SUCCESS)
10603b307c55SRasesh Mody 			goto cid_map_fail;
10613b307c55SRasesh Mody 
10623b307c55SRasesh Mody 		start_cid += p_mngr->conn_cfg[type].cid_count;
10633b307c55SRasesh Mody 		vf_start_cid += p_mngr->conn_cfg[type].cids_per_vf;
1064ec94dbc5SRasesh Mody 	}
1065ec94dbc5SRasesh Mody 
1066ec94dbc5SRasesh Mody 	return ECORE_SUCCESS;
1067ec94dbc5SRasesh Mody 
1068ec94dbc5SRasesh Mody cid_map_fail:
1069ec94dbc5SRasesh Mody 	ecore_cid_map_free(p_hwfn);
10703b307c55SRasesh Mody 	return rc;
1071ec94dbc5SRasesh Mody }
1072ec94dbc5SRasesh Mody 
ecore_cxt_mngr_alloc(struct ecore_hwfn * p_hwfn)1073ec94dbc5SRasesh Mody enum _ecore_status_t ecore_cxt_mngr_alloc(struct ecore_hwfn *p_hwfn)
1074ec94dbc5SRasesh Mody {
10753b307c55SRasesh Mody 	struct ecore_cid_acquired_map *acquired_vf;
107622d07d93SRasesh Mody 	struct ecore_ilt_client_cfg *clients;
1077ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr;
10783b307c55SRasesh Mody 	u32 i, max_num_vfs;
1079ec94dbc5SRasesh Mody 
1080ec94dbc5SRasesh Mody 	p_mngr = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL, sizeof(*p_mngr));
1081ec94dbc5SRasesh Mody 	if (!p_mngr) {
108298abf84eSRasesh Mody 		DP_NOTICE(p_hwfn, false, "Failed to allocate `struct ecore_cxt_mngr'\n");
1083ec94dbc5SRasesh Mody 		return ECORE_NOMEM;
1084ec94dbc5SRasesh Mody 	}
1085ec94dbc5SRasesh Mody 
1086ec94dbc5SRasesh Mody 	/* Initialize ILT client registers */
108722d07d93SRasesh Mody 	clients = p_mngr->clients;
108822d07d93SRasesh Mody 	clients[ILT_CLI_CDUC].first.reg = ILT_CFG_REG(CDUC, FIRST_ILT);
108922d07d93SRasesh Mody 	clients[ILT_CLI_CDUC].last.reg  = ILT_CFG_REG(CDUC, LAST_ILT);
109022d07d93SRasesh Mody 	clients[ILT_CLI_CDUC].p_size.reg = ILT_CFG_REG(CDUC, P_SIZE);
1091ec94dbc5SRasesh Mody 
109222d07d93SRasesh Mody 	clients[ILT_CLI_QM].first.reg   = ILT_CFG_REG(QM, FIRST_ILT);
109322d07d93SRasesh Mody 	clients[ILT_CLI_QM].last.reg    = ILT_CFG_REG(QM, LAST_ILT);
109422d07d93SRasesh Mody 	clients[ILT_CLI_QM].p_size.reg  = ILT_CFG_REG(QM, P_SIZE);
1095ec94dbc5SRasesh Mody 
109622d07d93SRasesh Mody 	clients[ILT_CLI_TM].first.reg   = ILT_CFG_REG(TM, FIRST_ILT);
109722d07d93SRasesh Mody 	clients[ILT_CLI_TM].last.reg    = ILT_CFG_REG(TM, LAST_ILT);
109822d07d93SRasesh Mody 	clients[ILT_CLI_TM].p_size.reg  = ILT_CFG_REG(TM, P_SIZE);
1099ec94dbc5SRasesh Mody 
110022d07d93SRasesh Mody 	clients[ILT_CLI_SRC].first.reg  = ILT_CFG_REG(SRC, FIRST_ILT);
110122d07d93SRasesh Mody 	clients[ILT_CLI_SRC].last.reg   = ILT_CFG_REG(SRC, LAST_ILT);
110222d07d93SRasesh Mody 	clients[ILT_CLI_SRC].p_size.reg = ILT_CFG_REG(SRC, P_SIZE);
1103ec94dbc5SRasesh Mody 
110422d07d93SRasesh Mody 	clients[ILT_CLI_CDUT].first.reg = ILT_CFG_REG(CDUT, FIRST_ILT);
110522d07d93SRasesh Mody 	clients[ILT_CLI_CDUT].last.reg  = ILT_CFG_REG(CDUT, LAST_ILT);
110622d07d93SRasesh Mody 	clients[ILT_CLI_CDUT].p_size.reg = ILT_CFG_REG(CDUT, P_SIZE);
110722d07d93SRasesh Mody 
110822d07d93SRasesh Mody 	clients[ILT_CLI_TSDM].first.reg = ILT_CFG_REG(TSDM, FIRST_ILT);
110922d07d93SRasesh Mody 	clients[ILT_CLI_TSDM].last.reg  = ILT_CFG_REG(TSDM, LAST_ILT);
111022d07d93SRasesh Mody 	clients[ILT_CLI_TSDM].p_size.reg = ILT_CFG_REG(TSDM, P_SIZE);
1111ec94dbc5SRasesh Mody 
11122b68b841SRasesh Mody 	/* default ILT page size for all clients is 64K */
1113519438f7SRasesh Mody 	for (i = 0; i < MAX_ILT_CLIENTS; i++)
1114ec94dbc5SRasesh Mody 		p_mngr->clients[i].p_size.val = ILT_DEFAULT_HW_P_SIZE;
1115ec94dbc5SRasesh Mody 
111622d07d93SRasesh Mody 	/* due to removal of ISCSI/FCoE files union type0_task_context
111722d07d93SRasesh Mody 	 * task_type_size will be 0. So hardcoded for now.
111822d07d93SRasesh Mody 	 */
1119ec94dbc5SRasesh Mody 	p_mngr->task_type_size[0] = 512; /* @DPDK */
1120ec94dbc5SRasesh Mody 	p_mngr->task_type_size[1] = 128; /* @DPDK */
1121ec94dbc5SRasesh Mody 
112222d07d93SRasesh Mody 	if (p_hwfn->p_dev->p_iov_info)
112322d07d93SRasesh Mody 		p_mngr->vf_count = p_hwfn->p_dev->p_iov_info->total_vfs;
112422d07d93SRasesh Mody 
112522d07d93SRasesh Mody 	/* Initialize the dynamic ILT allocation mutex */
112622c99696SRasesh Mody #ifdef CONFIG_ECORE_LOCK_ALLOC
11274eae6b01SRasesh Mody 	if (OSAL_MUTEX_ALLOC(p_hwfn, &p_mngr->mutex)) {
11284eae6b01SRasesh Mody 		DP_NOTICE(p_hwfn, false, "Failed to alloc p_mngr->mutex\n");
11294eae6b01SRasesh Mody 		return ECORE_NOMEM;
11304eae6b01SRasesh Mody 	}
113122c99696SRasesh Mody #endif
113222d07d93SRasesh Mody 	OSAL_MUTEX_INIT(&p_mngr->mutex);
113322d07d93SRasesh Mody 
11343b307c55SRasesh Mody 	/* Set the cxt mangr pointer prior to further allocations */
11353b307c55SRasesh Mody 	p_hwfn->p_cxt_mngr = p_mngr;
11363b307c55SRasesh Mody 
11373b307c55SRasesh Mody 	max_num_vfs = NUM_OF_VFS(p_hwfn->p_dev);
11383b307c55SRasesh Mody 	for (i = 0; i < MAX_CONN_TYPES; i++) {
11393b307c55SRasesh Mody 		acquired_vf = OSAL_CALLOC(p_hwfn->p_dev, GFP_KERNEL,
11403b307c55SRasesh Mody 					  max_num_vfs, sizeof(*acquired_vf));
11413b307c55SRasesh Mody 		if (!acquired_vf) {
11423b307c55SRasesh Mody 			DP_NOTICE(p_hwfn, false,
11433b307c55SRasesh Mody 				  "Failed to allocate an array of `struct ecore_cid_acquired_map'\n");
11443b307c55SRasesh Mody 			return ECORE_NOMEM;
11453b307c55SRasesh Mody 		}
11463b307c55SRasesh Mody 
11473b307c55SRasesh Mody 		p_mngr->acquired_vf[i] = acquired_vf;
11483b307c55SRasesh Mody 	}
11493b307c55SRasesh Mody 
1150ec94dbc5SRasesh Mody 	return ECORE_SUCCESS;
1151ec94dbc5SRasesh Mody }
1152ec94dbc5SRasesh Mody 
ecore_cxt_tables_alloc(struct ecore_hwfn * p_hwfn)1153ec94dbc5SRasesh Mody enum _ecore_status_t ecore_cxt_tables_alloc(struct ecore_hwfn *p_hwfn)
1154ec94dbc5SRasesh Mody {
1155ec94dbc5SRasesh Mody 	enum _ecore_status_t rc;
1156ec94dbc5SRasesh Mody 
1157ec94dbc5SRasesh Mody 	/* Allocate the ILT shadow table */
1158ec94dbc5SRasesh Mody 	rc = ecore_ilt_shadow_alloc(p_hwfn);
1159ec94dbc5SRasesh Mody 	if (rc) {
116098abf84eSRasesh Mody 		DP_NOTICE(p_hwfn, false, "Failed to allocate ilt memory\n");
1161ec94dbc5SRasesh Mody 		goto tables_alloc_fail;
1162ec94dbc5SRasesh Mody 	}
1163ec94dbc5SRasesh Mody 
1164ec94dbc5SRasesh Mody 	/* Allocate the T2  table */
1165ec94dbc5SRasesh Mody 	rc = ecore_cxt_src_t2_alloc(p_hwfn);
1166ec94dbc5SRasesh Mody 	if (rc) {
116798abf84eSRasesh Mody 		DP_NOTICE(p_hwfn, false, "Failed to allocate T2 memory\n");
1168ec94dbc5SRasesh Mody 		goto tables_alloc_fail;
1169ec94dbc5SRasesh Mody 	}
1170ec94dbc5SRasesh Mody 
1171ec94dbc5SRasesh Mody 	/* Allocate and initialize the acquired cids bitmaps */
1172ec94dbc5SRasesh Mody 	rc = ecore_cid_map_alloc(p_hwfn);
1173ec94dbc5SRasesh Mody 	if (rc) {
117498abf84eSRasesh Mody 		DP_NOTICE(p_hwfn, false, "Failed to allocate cid maps\n");
1175ec94dbc5SRasesh Mody 		goto tables_alloc_fail;
1176ec94dbc5SRasesh Mody 	}
1177ec94dbc5SRasesh Mody 
1178ec94dbc5SRasesh Mody 	return ECORE_SUCCESS;
1179ec94dbc5SRasesh Mody 
1180ec94dbc5SRasesh Mody tables_alloc_fail:
1181ec94dbc5SRasesh Mody 	ecore_cxt_mngr_free(p_hwfn);
1182ec94dbc5SRasesh Mody 	return rc;
1183ec94dbc5SRasesh Mody }
1184ec94dbc5SRasesh Mody 
ecore_cxt_mngr_free(struct ecore_hwfn * p_hwfn)1185ec94dbc5SRasesh Mody void ecore_cxt_mngr_free(struct ecore_hwfn *p_hwfn)
1186ec94dbc5SRasesh Mody {
11873b307c55SRasesh Mody 	u32 i;
11883b307c55SRasesh Mody 
1189ec94dbc5SRasesh Mody 	if (!p_hwfn->p_cxt_mngr)
1190ec94dbc5SRasesh Mody 		return;
1191ec94dbc5SRasesh Mody 
1192ec94dbc5SRasesh Mody 	ecore_cid_map_free(p_hwfn);
1193ec94dbc5SRasesh Mody 	ecore_cxt_src_t2_free(p_hwfn);
1194ec94dbc5SRasesh Mody 	ecore_ilt_shadow_free(p_hwfn);
119522c99696SRasesh Mody #ifdef CONFIG_ECORE_LOCK_ALLOC
1196c3c5eaa0SRasesh Mody 	OSAL_MUTEX_DEALLOC(&p_hwfn->p_cxt_mngr->mutex);
119722c99696SRasesh Mody #endif
11983b307c55SRasesh Mody 	for (i = 0; i < MAX_CONN_TYPES; i++)
11993b307c55SRasesh Mody 		OSAL_FREE(p_hwfn->p_dev, p_hwfn->p_cxt_mngr->acquired_vf[i]);
1200ec94dbc5SRasesh Mody 	OSAL_FREE(p_hwfn->p_dev, p_hwfn->p_cxt_mngr);
12013b307c55SRasesh Mody 
12023b307c55SRasesh Mody 	p_hwfn->p_cxt_mngr = OSAL_NULL;
1203ec94dbc5SRasesh Mody }
1204ec94dbc5SRasesh Mody 
ecore_cxt_mngr_setup(struct ecore_hwfn * p_hwfn)1205ec94dbc5SRasesh Mody void ecore_cxt_mngr_setup(struct ecore_hwfn *p_hwfn)
1206ec94dbc5SRasesh Mody {
1207ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
12087ed1cd53SRasesh Mody 	u32 len, max_num_vfs = NUM_OF_VFS(p_hwfn->p_dev);
1209eb8e81adSRasesh Mody 	struct ecore_cid_acquired_map *p_map;
1210eb8e81adSRasesh Mody 	struct ecore_conn_type_cfg *p_cfg;
1211ec94dbc5SRasesh Mody 	int type;
1212ec94dbc5SRasesh Mody 
1213ec94dbc5SRasesh Mody 	/* Reset acquired cids */
1214ec94dbc5SRasesh Mody 	for (type = 0; type < MAX_CONN_TYPES; type++) {
1215eb8e81adSRasesh Mody 		u32 vf;
1216ec94dbc5SRasesh Mody 
1217eb8e81adSRasesh Mody 		p_cfg = &p_mngr->conn_cfg[type];
1218eb8e81adSRasesh Mody 		if (p_cfg->cid_count) {
1219eb8e81adSRasesh Mody 			p_map = &p_mngr->acquired[type];
1220eb8e81adSRasesh Mody 			len = DIV_ROUND_UP(p_map->max_count,
1221eb8e81adSRasesh Mody 					   BITS_PER_MAP_WORD) *
1222eb8e81adSRasesh Mody 			      MAP_WORD_SIZE;
1223eb8e81adSRasesh Mody 			OSAL_MEM_ZERO(p_map->cid_map, len);
1224eb8e81adSRasesh Mody 		}
1225eb8e81adSRasesh Mody 
1226eb8e81adSRasesh Mody 		if (!p_cfg->cids_per_vf)
1227ec94dbc5SRasesh Mody 			continue;
1228ec94dbc5SRasesh Mody 
12297ed1cd53SRasesh Mody 		for (vf = 0; vf < max_num_vfs; vf++) {
1230eb8e81adSRasesh Mody 			p_map = &p_mngr->acquired_vf[type][vf];
1231eb8e81adSRasesh Mody 			len = DIV_ROUND_UP(p_map->max_count,
1232eb8e81adSRasesh Mody 					   BITS_PER_MAP_WORD) *
1233eb8e81adSRasesh Mody 			      MAP_WORD_SIZE;
1234eb8e81adSRasesh Mody 			OSAL_MEM_ZERO(p_map->cid_map, len);
1235eb8e81adSRasesh Mody 		}
1236ec94dbc5SRasesh Mody 	}
1237ec94dbc5SRasesh Mody }
1238ec94dbc5SRasesh Mody 
1239ec94dbc5SRasesh Mody /* HW initialization helper (per Block, per phase) */
1240ec94dbc5SRasesh Mody 
1241ec94dbc5SRasesh Mody /* CDU Common */
1242ec94dbc5SRasesh Mody #define CDUC_CXT_SIZE_SHIFT						\
1243ec94dbc5SRasesh Mody 	CDU_REG_CID_ADDR_PARAMS_CONTEXT_SIZE_SHIFT
1244ec94dbc5SRasesh Mody 
1245ec94dbc5SRasesh Mody #define CDUC_CXT_SIZE_MASK						\
1246ec94dbc5SRasesh Mody 	(CDU_REG_CID_ADDR_PARAMS_CONTEXT_SIZE >> CDUC_CXT_SIZE_SHIFT)
1247ec94dbc5SRasesh Mody 
1248ec94dbc5SRasesh Mody #define CDUC_BLOCK_WASTE_SHIFT						\
1249ec94dbc5SRasesh Mody 	CDU_REG_CID_ADDR_PARAMS_BLOCK_WASTE_SHIFT
1250ec94dbc5SRasesh Mody 
1251ec94dbc5SRasesh Mody #define CDUC_BLOCK_WASTE_MASK						\
1252ec94dbc5SRasesh Mody 	(CDU_REG_CID_ADDR_PARAMS_BLOCK_WASTE >> CDUC_BLOCK_WASTE_SHIFT)
1253ec94dbc5SRasesh Mody 
1254ec94dbc5SRasesh Mody #define CDUC_NCIB_SHIFT							\
1255ec94dbc5SRasesh Mody 	CDU_REG_CID_ADDR_PARAMS_NCIB_SHIFT
1256ec94dbc5SRasesh Mody 
1257ec94dbc5SRasesh Mody #define CDUC_NCIB_MASK							\
1258ec94dbc5SRasesh Mody 	(CDU_REG_CID_ADDR_PARAMS_NCIB >> CDUC_NCIB_SHIFT)
1259ec94dbc5SRasesh Mody 
1260ec94dbc5SRasesh Mody #define CDUT_TYPE0_CXT_SIZE_SHIFT					\
1261ec94dbc5SRasesh Mody 	CDU_REG_SEGMENT0_PARAMS_T0_TID_SIZE_SHIFT
1262ec94dbc5SRasesh Mody 
1263ec94dbc5SRasesh Mody #define CDUT_TYPE0_CXT_SIZE_MASK					\
1264ec94dbc5SRasesh Mody 	(CDU_REG_SEGMENT0_PARAMS_T0_TID_SIZE >>				\
1265ec94dbc5SRasesh Mody 	CDUT_TYPE0_CXT_SIZE_SHIFT)
1266ec94dbc5SRasesh Mody 
1267ec94dbc5SRasesh Mody #define CDUT_TYPE0_BLOCK_WASTE_SHIFT					\
1268ec94dbc5SRasesh Mody 	CDU_REG_SEGMENT0_PARAMS_T0_TID_BLOCK_WASTE_SHIFT
1269ec94dbc5SRasesh Mody 
1270ec94dbc5SRasesh Mody #define CDUT_TYPE0_BLOCK_WASTE_MASK					\
1271ec94dbc5SRasesh Mody 	(CDU_REG_SEGMENT0_PARAMS_T0_TID_BLOCK_WASTE >>			\
1272ec94dbc5SRasesh Mody 	CDUT_TYPE0_BLOCK_WASTE_SHIFT)
1273ec94dbc5SRasesh Mody 
1274ec94dbc5SRasesh Mody #define CDUT_TYPE0_NCIB_SHIFT						\
1275ec94dbc5SRasesh Mody 	CDU_REG_SEGMENT0_PARAMS_T0_NUM_TIDS_IN_BLOCK_SHIFT
1276ec94dbc5SRasesh Mody 
1277ec94dbc5SRasesh Mody #define CDUT_TYPE0_NCIB_MASK						\
1278ec94dbc5SRasesh Mody 	(CDU_REG_SEGMENT0_PARAMS_T0_NUM_TIDS_IN_BLOCK >>		\
1279ec94dbc5SRasesh Mody 	CDUT_TYPE0_NCIB_SHIFT)
1280ec94dbc5SRasesh Mody 
1281ec94dbc5SRasesh Mody #define CDUT_TYPE1_CXT_SIZE_SHIFT					\
1282ec94dbc5SRasesh Mody 	CDU_REG_SEGMENT1_PARAMS_T1_TID_SIZE_SHIFT
1283ec94dbc5SRasesh Mody 
1284ec94dbc5SRasesh Mody #define CDUT_TYPE1_CXT_SIZE_MASK					\
1285ec94dbc5SRasesh Mody 	(CDU_REG_SEGMENT1_PARAMS_T1_TID_SIZE >>				\
1286ec94dbc5SRasesh Mody 	CDUT_TYPE1_CXT_SIZE_SHIFT)
1287ec94dbc5SRasesh Mody 
1288ec94dbc5SRasesh Mody #define CDUT_TYPE1_BLOCK_WASTE_SHIFT					\
1289ec94dbc5SRasesh Mody 	CDU_REG_SEGMENT1_PARAMS_T1_TID_BLOCK_WASTE_SHIFT
1290ec94dbc5SRasesh Mody 
1291ec94dbc5SRasesh Mody #define CDUT_TYPE1_BLOCK_WASTE_MASK					\
1292ec94dbc5SRasesh Mody 	(CDU_REG_SEGMENT1_PARAMS_T1_TID_BLOCK_WASTE >>			\
1293ec94dbc5SRasesh Mody 	CDUT_TYPE1_BLOCK_WASTE_SHIFT)
1294ec94dbc5SRasesh Mody 
1295ec94dbc5SRasesh Mody #define CDUT_TYPE1_NCIB_SHIFT						\
1296ec94dbc5SRasesh Mody 	CDU_REG_SEGMENT1_PARAMS_T1_NUM_TIDS_IN_BLOCK_SHIFT
1297ec94dbc5SRasesh Mody 
1298ec94dbc5SRasesh Mody #define CDUT_TYPE1_NCIB_MASK						\
1299ec94dbc5SRasesh Mody 	(CDU_REG_SEGMENT1_PARAMS_T1_NUM_TIDS_IN_BLOCK >>		\
1300ec94dbc5SRasesh Mody 	CDUT_TYPE1_NCIB_SHIFT)
1301ec94dbc5SRasesh Mody 
ecore_cdu_init_common(struct ecore_hwfn * p_hwfn)1302ec94dbc5SRasesh Mody static void ecore_cdu_init_common(struct ecore_hwfn *p_hwfn)
1303ec94dbc5SRasesh Mody {
1304ec94dbc5SRasesh Mody 	u32 page_sz, elems_per_page, block_waste, cxt_size, cdu_params = 0;
1305ec94dbc5SRasesh Mody 
1306ec94dbc5SRasesh Mody 	/* CDUC - connection configuration */
1307ec94dbc5SRasesh Mody 	page_sz = p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC].p_size.val;
1308ec94dbc5SRasesh Mody 	cxt_size = CONN_CXT_SIZE(p_hwfn);
1309ec94dbc5SRasesh Mody 	elems_per_page = ILT_PAGE_IN_BYTES(page_sz) / cxt_size;
1310ec94dbc5SRasesh Mody 	block_waste = ILT_PAGE_IN_BYTES(page_sz) - elems_per_page * cxt_size;
1311ec94dbc5SRasesh Mody 
1312ec94dbc5SRasesh Mody 	SET_FIELD(cdu_params, CDUC_CXT_SIZE, cxt_size);
1313ec94dbc5SRasesh Mody 	SET_FIELD(cdu_params, CDUC_BLOCK_WASTE, block_waste);
1314ec94dbc5SRasesh Mody 	SET_FIELD(cdu_params, CDUC_NCIB, elems_per_page);
1315ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, CDU_REG_CID_ADDR_PARAMS_RT_OFFSET, cdu_params);
1316ec94dbc5SRasesh Mody 
1317ec94dbc5SRasesh Mody 	/* CDUT - type-0 tasks configuration */
1318ec94dbc5SRasesh Mody 	page_sz = p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT].p_size.val;
1319ec94dbc5SRasesh Mody 	cxt_size = p_hwfn->p_cxt_mngr->task_type_size[0];
1320ec94dbc5SRasesh Mody 	elems_per_page = ILT_PAGE_IN_BYTES(page_sz) / cxt_size;
1321ec94dbc5SRasesh Mody 	block_waste = ILT_PAGE_IN_BYTES(page_sz) - elems_per_page * cxt_size;
1322ec94dbc5SRasesh Mody 
1323ec94dbc5SRasesh Mody 	/* cxt size and block-waste are multipes of 8 */
1324ec94dbc5SRasesh Mody 	cdu_params = 0;
1325ec94dbc5SRasesh Mody 	SET_FIELD(cdu_params, CDUT_TYPE0_CXT_SIZE, (cxt_size >> 3));
1326ec94dbc5SRasesh Mody 	SET_FIELD(cdu_params, CDUT_TYPE0_BLOCK_WASTE, (block_waste >> 3));
1327ec94dbc5SRasesh Mody 	SET_FIELD(cdu_params, CDUT_TYPE0_NCIB, elems_per_page);
1328ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, CDU_REG_SEGMENT0_PARAMS_RT_OFFSET, cdu_params);
1329ec94dbc5SRasesh Mody 
1330ec94dbc5SRasesh Mody 	/* CDUT - type-1 tasks configuration */
1331ec94dbc5SRasesh Mody 	cxt_size = p_hwfn->p_cxt_mngr->task_type_size[1];
1332ec94dbc5SRasesh Mody 	elems_per_page = ILT_PAGE_IN_BYTES(page_sz) / cxt_size;
1333ec94dbc5SRasesh Mody 	block_waste = ILT_PAGE_IN_BYTES(page_sz) - elems_per_page * cxt_size;
1334ec94dbc5SRasesh Mody 
1335ec94dbc5SRasesh Mody 	/* cxt size and block-waste are multipes of 8 */
1336ec94dbc5SRasesh Mody 	cdu_params = 0;
1337ec94dbc5SRasesh Mody 	SET_FIELD(cdu_params, CDUT_TYPE1_CXT_SIZE, (cxt_size >> 3));
1338ec94dbc5SRasesh Mody 	SET_FIELD(cdu_params, CDUT_TYPE1_BLOCK_WASTE, (block_waste >> 3));
1339ec94dbc5SRasesh Mody 	SET_FIELD(cdu_params, CDUT_TYPE1_NCIB, elems_per_page);
1340ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, CDU_REG_SEGMENT1_PARAMS_RT_OFFSET, cdu_params);
1341ec94dbc5SRasesh Mody }
1342ec94dbc5SRasesh Mody 
1343ec94dbc5SRasesh Mody /* CDU PF */
1344ec94dbc5SRasesh Mody #define CDU_SEG_REG_TYPE_SHIFT		CDU_SEG_TYPE_OFFSET_REG_TYPE_SHIFT
1345ec94dbc5SRasesh Mody #define CDU_SEG_REG_TYPE_MASK		0x1
1346ec94dbc5SRasesh Mody #define CDU_SEG_REG_OFFSET_SHIFT	0
1347ec94dbc5SRasesh Mody #define CDU_SEG_REG_OFFSET_MASK		CDU_SEG_TYPE_OFFSET_REG_OFFSET_MASK
1348ec94dbc5SRasesh Mody 
ecore_cdu_init_pf(struct ecore_hwfn * p_hwfn)1349ec94dbc5SRasesh Mody static void ecore_cdu_init_pf(struct ecore_hwfn *p_hwfn)
1350ec94dbc5SRasesh Mody {
1351ec94dbc5SRasesh Mody 	struct ecore_ilt_client_cfg *p_cli;
1352ec94dbc5SRasesh Mody 	struct ecore_tid_seg *p_seg;
1353ec94dbc5SRasesh Mody 	u32 cdu_seg_params, offset;
1354ec94dbc5SRasesh Mody 	int i;
1355ec94dbc5SRasesh Mody 
1356ec94dbc5SRasesh Mody 	static const u32 rt_type_offset_arr[] = {
1357ec94dbc5SRasesh Mody 		CDU_REG_PF_SEG0_TYPE_OFFSET_RT_OFFSET,
1358ec94dbc5SRasesh Mody 		CDU_REG_PF_SEG1_TYPE_OFFSET_RT_OFFSET,
1359ec94dbc5SRasesh Mody 		CDU_REG_PF_SEG2_TYPE_OFFSET_RT_OFFSET,
1360ec94dbc5SRasesh Mody 		CDU_REG_PF_SEG3_TYPE_OFFSET_RT_OFFSET
1361ec94dbc5SRasesh Mody 	};
1362ec94dbc5SRasesh Mody 
1363ec94dbc5SRasesh Mody 	static const u32 rt_type_offset_fl_arr[] = {
1364ec94dbc5SRasesh Mody 		CDU_REG_PF_FL_SEG0_TYPE_OFFSET_RT_OFFSET,
1365ec94dbc5SRasesh Mody 		CDU_REG_PF_FL_SEG1_TYPE_OFFSET_RT_OFFSET,
1366ec94dbc5SRasesh Mody 		CDU_REG_PF_FL_SEG2_TYPE_OFFSET_RT_OFFSET,
1367ec94dbc5SRasesh Mody 		CDU_REG_PF_FL_SEG3_TYPE_OFFSET_RT_OFFSET
1368ec94dbc5SRasesh Mody 	};
1369ec94dbc5SRasesh Mody 
1370ec94dbc5SRasesh Mody 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
1371ec94dbc5SRasesh Mody 
1372ec94dbc5SRasesh Mody 	/* There are initializations only for CDUT during pf Phase */
1373ec94dbc5SRasesh Mody 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
1374ec94dbc5SRasesh Mody 		/* Segment 0 */
1375ec94dbc5SRasesh Mody 		p_seg = ecore_cxt_tid_seg_info(p_hwfn, i);
1376ec94dbc5SRasesh Mody 		if (!p_seg)
1377ec94dbc5SRasesh Mody 			continue;
1378ec94dbc5SRasesh Mody 
1379ec94dbc5SRasesh Mody 		/* Note: start_line is already adjusted for the CDU
1380ec94dbc5SRasesh Mody 		 * segment register granularity, so we just need to
1381ec94dbc5SRasesh Mody 		 * divide. Adjustment is implicit as we assume ILT
1382ec94dbc5SRasesh Mody 		 * Page size is larger than 32K!
1383ec94dbc5SRasesh Mody 		 */
1384ec94dbc5SRasesh Mody 		offset = (ILT_PAGE_IN_BYTES(p_cli->p_size.val) *
1385ec94dbc5SRasesh Mody 			  (p_cli->pf_blks[CDUT_SEG_BLK(i)].start_line -
1386ec94dbc5SRasesh Mody 			   p_cli->first.val)) / CDUT_SEG_ALIGNMET_IN_BYTES;
1387ec94dbc5SRasesh Mody 
1388ec94dbc5SRasesh Mody 		cdu_seg_params = 0;
1389ec94dbc5SRasesh Mody 		SET_FIELD(cdu_seg_params, CDU_SEG_REG_TYPE, p_seg->type);
1390ec94dbc5SRasesh Mody 		SET_FIELD(cdu_seg_params, CDU_SEG_REG_OFFSET, offset);
1391ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn, rt_type_offset_arr[i], cdu_seg_params);
1392ec94dbc5SRasesh Mody 
1393ec94dbc5SRasesh Mody 		offset = (ILT_PAGE_IN_BYTES(p_cli->p_size.val) *
1394ec94dbc5SRasesh Mody 			  (p_cli->pf_blks[CDUT_FL_SEG_BLK(i, PF)].start_line -
1395ec94dbc5SRasesh Mody 			   p_cli->first.val)) / CDUT_SEG_ALIGNMET_IN_BYTES;
1396ec94dbc5SRasesh Mody 
1397ec94dbc5SRasesh Mody 		cdu_seg_params = 0;
1398ec94dbc5SRasesh Mody 		SET_FIELD(cdu_seg_params, CDU_SEG_REG_TYPE, p_seg->type);
1399ec94dbc5SRasesh Mody 		SET_FIELD(cdu_seg_params, CDU_SEG_REG_OFFSET, offset);
1400ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn, rt_type_offset_fl_arr[i], cdu_seg_params);
1401ec94dbc5SRasesh Mody 	}
1402ec94dbc5SRasesh Mody }
1403ec94dbc5SRasesh Mody 
ecore_qm_init_pf(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,bool is_pf_loading)1404c2817ba4SRasesh Mody void ecore_qm_init_pf(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
1405c2817ba4SRasesh Mody 		      bool is_pf_loading)
1406ec94dbc5SRasesh Mody {
1407ec94dbc5SRasesh Mody 	struct ecore_qm_info *qm_info = &p_hwfn->qm_info;
1408ec94dbc5SRasesh Mody 	struct ecore_qm_iids iids;
1409ec94dbc5SRasesh Mody 
1410ec94dbc5SRasesh Mody 	OSAL_MEM_ZERO(&iids, sizeof(iids));
1411ec94dbc5SRasesh Mody 	ecore_cxt_qm_iids(p_hwfn, &iids);
1412c2817ba4SRasesh Mody 	ecore_qm_pf_rt_init(p_hwfn, p_ptt, p_hwfn->rel_pf_id,
1413c2817ba4SRasesh Mody 			    qm_info->max_phys_tcs_per_port,
1414c2817ba4SRasesh Mody 			    is_pf_loading,
1415ec94dbc5SRasesh Mody 			    iids.cids, iids.vf_cids, iids.tids,
1416ec94dbc5SRasesh Mody 			    qm_info->start_pq,
1417ec94dbc5SRasesh Mody 			    qm_info->num_pqs - qm_info->num_vf_pqs,
1418ec94dbc5SRasesh Mody 			    qm_info->num_vf_pqs,
1419ec94dbc5SRasesh Mody 			    qm_info->start_vport,
1420ec94dbc5SRasesh Mody 			    qm_info->num_vports, qm_info->pf_wfq,
14213b307c55SRasesh Mody 			    qm_info->pf_rl,
142240cf1e75SRasesh Mody 			    p_hwfn->qm_info.qm_pq_params,
1423ec94dbc5SRasesh Mody 			    p_hwfn->qm_info.qm_vport_params);
1424ec94dbc5SRasesh Mody }
1425ec94dbc5SRasesh Mody 
1426ec94dbc5SRasesh Mody /* CM PF */
ecore_cm_init_pf(struct ecore_hwfn * p_hwfn)1427eafbc6fcSRasesh Mody static void ecore_cm_init_pf(struct ecore_hwfn *p_hwfn)
1428ec94dbc5SRasesh Mody {
14295ef41193SRasesh Mody 	STORE_RT_REG(p_hwfn, XCM_REG_CON_PHY_Q3_RT_OFFSET,
14305ef41193SRasesh Mody 		     ecore_get_cm_pq_idx(p_hwfn, PQ_FLAGS_LB));
1431ec94dbc5SRasesh Mody }
1432ec94dbc5SRasesh Mody 
1433ec94dbc5SRasesh Mody /* DQ PF */
ecore_dq_init_pf(struct ecore_hwfn * p_hwfn)1434ec94dbc5SRasesh Mody static void ecore_dq_init_pf(struct ecore_hwfn *p_hwfn)
1435ec94dbc5SRasesh Mody {
1436ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
1437ec94dbc5SRasesh Mody 	u32 dq_pf_max_cid = 0, dq_vf_max_cid = 0;
1438ec94dbc5SRasesh Mody 
1439ec94dbc5SRasesh Mody 	dq_pf_max_cid += (p_mngr->conn_cfg[0].cid_count >> DQ_RANGE_SHIFT);
1440ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_0_RT_OFFSET, dq_pf_max_cid);
1441ec94dbc5SRasesh Mody 
1442ec94dbc5SRasesh Mody 	dq_vf_max_cid += (p_mngr->conn_cfg[0].cids_per_vf >> DQ_RANGE_SHIFT);
1443ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_0_RT_OFFSET, dq_vf_max_cid);
1444ec94dbc5SRasesh Mody 
1445ec94dbc5SRasesh Mody 	dq_pf_max_cid += (p_mngr->conn_cfg[1].cid_count >> DQ_RANGE_SHIFT);
1446ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_1_RT_OFFSET, dq_pf_max_cid);
1447ec94dbc5SRasesh Mody 
1448ec94dbc5SRasesh Mody 	dq_vf_max_cid += (p_mngr->conn_cfg[1].cids_per_vf >> DQ_RANGE_SHIFT);
1449ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_1_RT_OFFSET, dq_vf_max_cid);
1450ec94dbc5SRasesh Mody 
1451ec94dbc5SRasesh Mody 	dq_pf_max_cid += (p_mngr->conn_cfg[2].cid_count >> DQ_RANGE_SHIFT);
1452ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_2_RT_OFFSET, dq_pf_max_cid);
1453ec94dbc5SRasesh Mody 
1454ec94dbc5SRasesh Mody 	dq_vf_max_cid += (p_mngr->conn_cfg[2].cids_per_vf >> DQ_RANGE_SHIFT);
1455ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_2_RT_OFFSET, dq_vf_max_cid);
1456ec94dbc5SRasesh Mody 
1457ec94dbc5SRasesh Mody 	dq_pf_max_cid += (p_mngr->conn_cfg[3].cid_count >> DQ_RANGE_SHIFT);
1458ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_3_RT_OFFSET, dq_pf_max_cid);
1459ec94dbc5SRasesh Mody 
1460ec94dbc5SRasesh Mody 	dq_vf_max_cid += (p_mngr->conn_cfg[3].cids_per_vf >> DQ_RANGE_SHIFT);
1461ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_3_RT_OFFSET, dq_vf_max_cid);
1462ec94dbc5SRasesh Mody 
1463ec94dbc5SRasesh Mody 	dq_pf_max_cid += (p_mngr->conn_cfg[4].cid_count >> DQ_RANGE_SHIFT);
1464ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_4_RT_OFFSET, dq_pf_max_cid);
1465ec94dbc5SRasesh Mody 
1466ec94dbc5SRasesh Mody 	dq_vf_max_cid += (p_mngr->conn_cfg[4].cids_per_vf >> DQ_RANGE_SHIFT);
1467ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_4_RT_OFFSET, dq_vf_max_cid);
1468ec94dbc5SRasesh Mody 
1469ec94dbc5SRasesh Mody 	dq_pf_max_cid += (p_mngr->conn_cfg[5].cid_count >> DQ_RANGE_SHIFT);
1470ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_5_RT_OFFSET, dq_pf_max_cid);
1471ec94dbc5SRasesh Mody 
1472ec94dbc5SRasesh Mody 	dq_vf_max_cid += (p_mngr->conn_cfg[5].cids_per_vf >> DQ_RANGE_SHIFT);
1473ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_5_RT_OFFSET, dq_vf_max_cid);
1474ec94dbc5SRasesh Mody 
1475ec94dbc5SRasesh Mody 	/* Connection types 6 & 7 are not in use, yet they must be configured
1476ec94dbc5SRasesh Mody 	 * as the highest possible connection. Not configuring them means the
1477ec94dbc5SRasesh Mody 	 * defaults will be  used, and with a large number of cids a bug may
1478ec94dbc5SRasesh Mody 	 * occur, if the defaults will be smaller than dq_pf_max_cid /
1479ec94dbc5SRasesh Mody 	 * dq_vf_max_cid.
1480ec94dbc5SRasesh Mody 	 */
1481ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_6_RT_OFFSET, dq_pf_max_cid);
1482ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_6_RT_OFFSET, dq_vf_max_cid);
1483ec94dbc5SRasesh Mody 
1484ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_7_RT_OFFSET, dq_pf_max_cid);
1485ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_7_RT_OFFSET, dq_vf_max_cid);
1486ec94dbc5SRasesh Mody }
1487ec94dbc5SRasesh Mody 
ecore_ilt_bounds_init(struct ecore_hwfn * p_hwfn)1488ec94dbc5SRasesh Mody static void ecore_ilt_bounds_init(struct ecore_hwfn *p_hwfn)
1489ec94dbc5SRasesh Mody {
1490ec94dbc5SRasesh Mody 	struct ecore_ilt_client_cfg *ilt_clients;
1491ec94dbc5SRasesh Mody 	int i;
1492ec94dbc5SRasesh Mody 
1493ec94dbc5SRasesh Mody 	ilt_clients = p_hwfn->p_cxt_mngr->clients;
14949455b556SRasesh Mody 	for_each_ilt_valid_client(i, ilt_clients) {
1495ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1496ec94dbc5SRasesh Mody 			     ilt_clients[i].first.reg,
1497ec94dbc5SRasesh Mody 			     ilt_clients[i].first.val);
1498ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1499ec94dbc5SRasesh Mody 			     ilt_clients[i].last.reg, ilt_clients[i].last.val);
1500ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1501ec94dbc5SRasesh Mody 			     ilt_clients[i].p_size.reg,
1502ec94dbc5SRasesh Mody 			     ilt_clients[i].p_size.val);
1503ec94dbc5SRasesh Mody 	}
1504ec94dbc5SRasesh Mody }
1505ec94dbc5SRasesh Mody 
ecore_ilt_vf_bounds_init(struct ecore_hwfn * p_hwfn)1506ec94dbc5SRasesh Mody static void ecore_ilt_vf_bounds_init(struct ecore_hwfn *p_hwfn)
1507ec94dbc5SRasesh Mody {
1508ec94dbc5SRasesh Mody 	struct ecore_ilt_client_cfg *p_cli;
1509ec94dbc5SRasesh Mody 	u32 blk_factor;
1510ec94dbc5SRasesh Mody 
1511ec94dbc5SRasesh Mody 	/* For simplicty  we set the 'block' to be an ILT page */
151222d07d93SRasesh Mody 	if (p_hwfn->p_dev->p_iov_info) {
151322d07d93SRasesh Mody 		struct ecore_hw_sriov_info *p_iov = p_hwfn->p_dev->p_iov_info;
151422d07d93SRasesh Mody 
1515ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1516ec94dbc5SRasesh Mody 			     PSWRQ2_REG_VF_BASE_RT_OFFSET,
151722d07d93SRasesh Mody 			     p_iov->first_vf_in_pf);
1518ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1519ec94dbc5SRasesh Mody 			     PSWRQ2_REG_VF_LAST_ILT_RT_OFFSET,
152022d07d93SRasesh Mody 			     p_iov->first_vf_in_pf + p_iov->total_vfs);
152122d07d93SRasesh Mody 	}
1522ec94dbc5SRasesh Mody 
1523ec94dbc5SRasesh Mody 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC];
1524ec94dbc5SRasesh Mody 	blk_factor = OSAL_LOG2(ILT_PAGE_IN_BYTES(p_cli->p_size.val) >> 10);
1525ec94dbc5SRasesh Mody 	if (p_cli->active) {
1526ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1527ec94dbc5SRasesh Mody 			     PSWRQ2_REG_CDUC_BLOCKS_FACTOR_RT_OFFSET,
1528ec94dbc5SRasesh Mody 			     blk_factor);
1529ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1530ec94dbc5SRasesh Mody 			     PSWRQ2_REG_CDUC_NUMBER_OF_PF_BLOCKS_RT_OFFSET,
1531ec94dbc5SRasesh Mody 			     p_cli->pf_total_lines);
1532ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1533ec94dbc5SRasesh Mody 			     PSWRQ2_REG_CDUC_VF_BLOCKS_RT_OFFSET,
1534ec94dbc5SRasesh Mody 			     p_cli->vf_total_lines);
1535ec94dbc5SRasesh Mody 	}
1536ec94dbc5SRasesh Mody 
1537ec94dbc5SRasesh Mody 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
1538ec94dbc5SRasesh Mody 	blk_factor = OSAL_LOG2(ILT_PAGE_IN_BYTES(p_cli->p_size.val) >> 10);
1539ec94dbc5SRasesh Mody 	if (p_cli->active) {
1540ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1541ec94dbc5SRasesh Mody 			     PSWRQ2_REG_CDUT_BLOCKS_FACTOR_RT_OFFSET,
1542ec94dbc5SRasesh Mody 			     blk_factor);
1543ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1544ec94dbc5SRasesh Mody 			     PSWRQ2_REG_CDUT_NUMBER_OF_PF_BLOCKS_RT_OFFSET,
1545ec94dbc5SRasesh Mody 			     p_cli->pf_total_lines);
1546ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1547ec94dbc5SRasesh Mody 			     PSWRQ2_REG_CDUT_VF_BLOCKS_RT_OFFSET,
1548ec94dbc5SRasesh Mody 			     p_cli->vf_total_lines);
1549ec94dbc5SRasesh Mody 	}
1550ec94dbc5SRasesh Mody 
1551ec94dbc5SRasesh Mody 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_TM];
1552ec94dbc5SRasesh Mody 	blk_factor = OSAL_LOG2(ILT_PAGE_IN_BYTES(p_cli->p_size.val) >> 10);
1553ec94dbc5SRasesh Mody 	if (p_cli->active) {
1554ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1555ec94dbc5SRasesh Mody 			     PSWRQ2_REG_TM_BLOCKS_FACTOR_RT_OFFSET, blk_factor);
1556ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1557ec94dbc5SRasesh Mody 			     PSWRQ2_REG_TM_NUMBER_OF_PF_BLOCKS_RT_OFFSET,
1558ec94dbc5SRasesh Mody 			     p_cli->pf_total_lines);
1559ec94dbc5SRasesh Mody 		STORE_RT_REG(p_hwfn,
1560ec94dbc5SRasesh Mody 			     PSWRQ2_REG_TM_VF_BLOCKS_RT_OFFSET,
1561ec94dbc5SRasesh Mody 			     p_cli->vf_total_lines);
1562ec94dbc5SRasesh Mody 	}
1563ec94dbc5SRasesh Mody }
1564ec94dbc5SRasesh Mody 
1565ec94dbc5SRasesh Mody /* ILT (PSWRQ2) PF */
ecore_ilt_init_pf(struct ecore_hwfn * p_hwfn)1566ec94dbc5SRasesh Mody static void ecore_ilt_init_pf(struct ecore_hwfn *p_hwfn)
1567ec94dbc5SRasesh Mody {
1568ec94dbc5SRasesh Mody 	struct ecore_ilt_client_cfg *clients;
1569ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr;
15703b307c55SRasesh Mody 	struct phys_mem_desc *p_shdw;
1571ec94dbc5SRasesh Mody 	u32 line, rt_offst, i;
1572ec94dbc5SRasesh Mody 
1573ec94dbc5SRasesh Mody 	ecore_ilt_bounds_init(p_hwfn);
1574ec94dbc5SRasesh Mody 	ecore_ilt_vf_bounds_init(p_hwfn);
1575ec94dbc5SRasesh Mody 
1576ec94dbc5SRasesh Mody 	p_mngr = p_hwfn->p_cxt_mngr;
1577ec94dbc5SRasesh Mody 	p_shdw = p_mngr->ilt_shadow;
1578ec94dbc5SRasesh Mody 	clients = p_hwfn->p_cxt_mngr->clients;
1579ec94dbc5SRasesh Mody 
15809455b556SRasesh Mody 	for_each_ilt_valid_client(i, clients) {
1581ec94dbc5SRasesh Mody 		/* Client's 1st val and RT array are absolute, ILT shadows'
1582ec94dbc5SRasesh Mody 		 * lines are relative.
1583ec94dbc5SRasesh Mody 		 */
1584ec94dbc5SRasesh Mody 		line = clients[i].first.val - p_mngr->pf_start_line;
1585ec94dbc5SRasesh Mody 		rt_offst = PSWRQ2_REG_ILT_MEMORY_RT_OFFSET +
1586ec94dbc5SRasesh Mody 		    clients[i].first.val * ILT_ENTRY_IN_REGS;
1587ec94dbc5SRasesh Mody 
1588ec94dbc5SRasesh Mody 		for (; line <= clients[i].last.val - p_mngr->pf_start_line;
1589ec94dbc5SRasesh Mody 		     line++, rt_offst += ILT_ENTRY_IN_REGS) {
1590ec94dbc5SRasesh Mody 			u64 ilt_hw_entry = 0;
1591ec94dbc5SRasesh Mody 
1592ec94dbc5SRasesh Mody 			/** p_virt could be OSAL_NULL incase of dynamic
1593ec94dbc5SRasesh Mody 			 *  allocation
1594ec94dbc5SRasesh Mody 			 */
15953b307c55SRasesh Mody 			if (p_shdw[line].virt_addr != OSAL_NULL) {
1596ec94dbc5SRasesh Mody 				SET_FIELD(ilt_hw_entry, ILT_ENTRY_VALID, 1ULL);
1597ec94dbc5SRasesh Mody 				SET_FIELD(ilt_hw_entry, ILT_ENTRY_PHY_ADDR,
15983b307c55SRasesh Mody 					  (p_shdw[line].phys_addr >> 12));
1599ec94dbc5SRasesh Mody 
1600ec94dbc5SRasesh Mody 				DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
1601ec94dbc5SRasesh Mody 					"Setting RT[0x%08x] from"
1602ec94dbc5SRasesh Mody 					" ILT[0x%08x] [Client is %d] to"
16039455b556SRasesh Mody 					" Physical addr: 0x%lx\n",
1604ec94dbc5SRasesh Mody 					rt_offst, line, i,
16059455b556SRasesh Mody 					(unsigned long)(p_shdw[line].
16063b307c55SRasesh Mody 							phys_addr >> 12));
1607ec94dbc5SRasesh Mody 			}
1608ec94dbc5SRasesh Mody 
1609ec94dbc5SRasesh Mody 			STORE_RT_REG_AGG(p_hwfn, rt_offst, ilt_hw_entry);
1610ec94dbc5SRasesh Mody 		}
1611ec94dbc5SRasesh Mody 	}
1612ec94dbc5SRasesh Mody }
1613ec94dbc5SRasesh Mody 
1614ec94dbc5SRasesh Mody /* SRC (Searcher) PF */
ecore_src_init_pf(struct ecore_hwfn * p_hwfn)1615ec94dbc5SRasesh Mody static void ecore_src_init_pf(struct ecore_hwfn *p_hwfn)
1616ec94dbc5SRasesh Mody {
1617ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
1618ec94dbc5SRasesh Mody 	u32 rounded_conn_num, conn_num, conn_max;
1619ec94dbc5SRasesh Mody 	struct ecore_src_iids src_iids;
1620ec94dbc5SRasesh Mody 
1621ec94dbc5SRasesh Mody 	OSAL_MEM_ZERO(&src_iids, sizeof(src_iids));
1622eafbc6fcSRasesh Mody 	ecore_cxt_src_iids(p_mngr, &src_iids);
1623ec94dbc5SRasesh Mody 	conn_num = src_iids.pf_cids + src_iids.per_vf_cids * p_mngr->vf_count;
1624ec94dbc5SRasesh Mody 	if (!conn_num)
1625ec94dbc5SRasesh Mody 		return;
1626ec94dbc5SRasesh Mody 
1627ec94dbc5SRasesh Mody 	conn_max = OSAL_MAX_T(u32, conn_num, SRC_MIN_NUM_ELEMS);
1628ec94dbc5SRasesh Mody 	rounded_conn_num = OSAL_ROUNDUP_POW_OF_TWO(conn_max);
1629ec94dbc5SRasesh Mody 
1630ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, SRC_REG_COUNTFREE_RT_OFFSET, conn_num);
1631ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, SRC_REG_NUMBER_HASH_BITS_RT_OFFSET,
1632ec94dbc5SRasesh Mody 		     OSAL_LOG2(rounded_conn_num));
1633ec94dbc5SRasesh Mody 
1634ec94dbc5SRasesh Mody 	STORE_RT_REG_AGG(p_hwfn, SRC_REG_FIRSTFREE_RT_OFFSET,
16353b307c55SRasesh Mody 			 p_hwfn->p_cxt_mngr->src_t2.first_free);
1636ec94dbc5SRasesh Mody 	STORE_RT_REG_AGG(p_hwfn, SRC_REG_LASTFREE_RT_OFFSET,
16373b307c55SRasesh Mody 			 p_hwfn->p_cxt_mngr->src_t2.last_free);
163853437002SHarish Patil 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
163953437002SHarish Patil 		   "Configured SEARCHER for 0x%08x connections\n",
164053437002SHarish Patil 		   conn_num);
1641ec94dbc5SRasesh Mody }
1642ec94dbc5SRasesh Mody 
1643ec94dbc5SRasesh Mody /* Timers PF */
1644ec94dbc5SRasesh Mody #define TM_CFG_NUM_IDS_SHIFT		0
1645ec94dbc5SRasesh Mody #define TM_CFG_NUM_IDS_MASK		0xFFFFULL
1646ec94dbc5SRasesh Mody #define TM_CFG_PRE_SCAN_OFFSET_SHIFT	16
1647ec94dbc5SRasesh Mody #define TM_CFG_PRE_SCAN_OFFSET_MASK	0x1FFULL
1648ec94dbc5SRasesh Mody #define TM_CFG_PARENT_PF_SHIFT		25
1649ec94dbc5SRasesh Mody #define TM_CFG_PARENT_PF_MASK		0x7ULL
1650ec94dbc5SRasesh Mody 
1651ec94dbc5SRasesh Mody #define TM_CFG_CID_PRE_SCAN_ROWS_SHIFT	30
1652ec94dbc5SRasesh Mody #define TM_CFG_CID_PRE_SCAN_ROWS_MASK	0x1FFULL
1653ec94dbc5SRasesh Mody 
1654ec94dbc5SRasesh Mody #define TM_CFG_TID_OFFSET_SHIFT		30
1655ec94dbc5SRasesh Mody #define TM_CFG_TID_OFFSET_MASK		0x7FFFFULL
1656ec94dbc5SRasesh Mody #define TM_CFG_TID_PRE_SCAN_ROWS_SHIFT	49
1657ec94dbc5SRasesh Mody #define TM_CFG_TID_PRE_SCAN_ROWS_MASK	0x1FFULL
1658ec94dbc5SRasesh Mody 
ecore_tm_init_pf(struct ecore_hwfn * p_hwfn)1659ec94dbc5SRasesh Mody static void ecore_tm_init_pf(struct ecore_hwfn *p_hwfn)
1660ec94dbc5SRasesh Mody {
1661ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
1662ec94dbc5SRasesh Mody 	u32 active_seg_mask = 0, tm_offset, rt_reg;
1663ec94dbc5SRasesh Mody 	struct ecore_tm_iids tm_iids;
1664ec94dbc5SRasesh Mody 	u64 cfg_word;
1665ec94dbc5SRasesh Mody 	u8 i;
1666ec94dbc5SRasesh Mody 
1667ec94dbc5SRasesh Mody 	OSAL_MEM_ZERO(&tm_iids, sizeof(tm_iids));
16683b307c55SRasesh Mody 	ecore_cxt_tm_iids(p_hwfn, p_mngr, &tm_iids);
1669ec94dbc5SRasesh Mody 
1670ec94dbc5SRasesh Mody 	/* @@@TBD No pre-scan for now */
1671ec94dbc5SRasesh Mody 
1672ec94dbc5SRasesh Mody 		cfg_word = 0;
1673ec94dbc5SRasesh Mody 		SET_FIELD(cfg_word, TM_CFG_NUM_IDS, tm_iids.per_vf_cids);
1674ec94dbc5SRasesh Mody 		SET_FIELD(cfg_word, TM_CFG_PARENT_PF, p_hwfn->rel_pf_id);
16753b307c55SRasesh Mody 	SET_FIELD(cfg_word, TM_CFG_PRE_SCAN_OFFSET, 0);
167622d07d93SRasesh Mody 		SET_FIELD(cfg_word, TM_CFG_CID_PRE_SCAN_ROWS, 0); /* scan all */
1677ec94dbc5SRasesh Mody 
16783b307c55SRasesh Mody 	/* Note: We assume consecutive VFs for a PF */
16793b307c55SRasesh Mody 	for (i = 0; i < p_mngr->vf_count; i++) {
1680ec94dbc5SRasesh Mody 		rt_reg = TM_REG_CONFIG_CONN_MEM_RT_OFFSET +
1681ec94dbc5SRasesh Mody 		    (sizeof(cfg_word) / sizeof(u32)) *
168222d07d93SRasesh Mody 		    (p_hwfn->p_dev->p_iov_info->first_vf_in_pf + i);
1683ec94dbc5SRasesh Mody 		STORE_RT_REG_AGG(p_hwfn, rt_reg, cfg_word);
1684ec94dbc5SRasesh Mody 	}
1685ec94dbc5SRasesh Mody 
1686ec94dbc5SRasesh Mody 	cfg_word = 0;
1687ec94dbc5SRasesh Mody 	SET_FIELD(cfg_word, TM_CFG_NUM_IDS, tm_iids.pf_cids);
1688ec94dbc5SRasesh Mody 	SET_FIELD(cfg_word, TM_CFG_PRE_SCAN_OFFSET, 0);
1689ec94dbc5SRasesh Mody 	SET_FIELD(cfg_word, TM_CFG_PARENT_PF, 0);	/* n/a for PF */
16909455b556SRasesh Mody 	SET_FIELD(cfg_word, TM_CFG_CID_PRE_SCAN_ROWS, 0); /* scan all   */
1691ec94dbc5SRasesh Mody 
1692ec94dbc5SRasesh Mody 	rt_reg = TM_REG_CONFIG_CONN_MEM_RT_OFFSET +
1693ec94dbc5SRasesh Mody 	    (sizeof(cfg_word) / sizeof(u32)) *
1694ec94dbc5SRasesh Mody 	    (NUM_OF_VFS(p_hwfn->p_dev) + p_hwfn->rel_pf_id);
1695ec94dbc5SRasesh Mody 	STORE_RT_REG_AGG(p_hwfn, rt_reg, cfg_word);
1696ec94dbc5SRasesh Mody 
16973b307c55SRasesh Mody 	/* enable scan */
1698ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, TM_REG_PF_ENABLE_CONN_RT_OFFSET,
1699ec94dbc5SRasesh Mody 		     tm_iids.pf_cids ? 0x1 : 0x0);
1700ec94dbc5SRasesh Mody 
1701ec94dbc5SRasesh Mody 	/* @@@TBD how to enable the scan for the VFs */
1702ec94dbc5SRasesh Mody 
1703ec94dbc5SRasesh Mody 	tm_offset = tm_iids.per_vf_cids;
1704ec94dbc5SRasesh Mody 
1705ec94dbc5SRasesh Mody 	/* Note: We assume consecutive VFs for a PF */
1706ec94dbc5SRasesh Mody 	for (i = 0; i < p_mngr->vf_count; i++) {
1707ec94dbc5SRasesh Mody 		cfg_word = 0;
1708ec94dbc5SRasesh Mody 		SET_FIELD(cfg_word, TM_CFG_NUM_IDS, tm_iids.per_vf_tids);
1709ec94dbc5SRasesh Mody 		SET_FIELD(cfg_word, TM_CFG_PRE_SCAN_OFFSET, 0);
1710ec94dbc5SRasesh Mody 		SET_FIELD(cfg_word, TM_CFG_PARENT_PF, p_hwfn->rel_pf_id);
1711ec94dbc5SRasesh Mody 		SET_FIELD(cfg_word, TM_CFG_TID_OFFSET, tm_offset);
1712ec94dbc5SRasesh Mody 		SET_FIELD(cfg_word, TM_CFG_TID_PRE_SCAN_ROWS, (u64)0);
1713ec94dbc5SRasesh Mody 
1714ec94dbc5SRasesh Mody 		rt_reg = TM_REG_CONFIG_TASK_MEM_RT_OFFSET +
1715ec94dbc5SRasesh Mody 		    (sizeof(cfg_word) / sizeof(u32)) *
171622d07d93SRasesh Mody 		    (p_hwfn->p_dev->p_iov_info->first_vf_in_pf + i);
1717ec94dbc5SRasesh Mody 
1718ec94dbc5SRasesh Mody 		STORE_RT_REG_AGG(p_hwfn, rt_reg, cfg_word);
1719ec94dbc5SRasesh Mody 	}
1720ec94dbc5SRasesh Mody 
1721ec94dbc5SRasesh Mody 	tm_offset = tm_iids.pf_cids;
1722ec94dbc5SRasesh Mody 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
1723ec94dbc5SRasesh Mody 		cfg_word = 0;
1724ec94dbc5SRasesh Mody 		SET_FIELD(cfg_word, TM_CFG_NUM_IDS, tm_iids.pf_tids[i]);
1725ec94dbc5SRasesh Mody 		SET_FIELD(cfg_word, TM_CFG_PRE_SCAN_OFFSET, 0);
1726ec94dbc5SRasesh Mody 		SET_FIELD(cfg_word, TM_CFG_PARENT_PF, 0);
1727ec94dbc5SRasesh Mody 		SET_FIELD(cfg_word, TM_CFG_TID_OFFSET, tm_offset);
1728ec94dbc5SRasesh Mody 		SET_FIELD(cfg_word, TM_CFG_TID_PRE_SCAN_ROWS, (u64)0);
1729ec94dbc5SRasesh Mody 
1730ec94dbc5SRasesh Mody 		rt_reg = TM_REG_CONFIG_TASK_MEM_RT_OFFSET +
1731ec94dbc5SRasesh Mody 		    (sizeof(cfg_word) / sizeof(u32)) *
1732ec94dbc5SRasesh Mody 		    (NUM_OF_VFS(p_hwfn->p_dev) +
1733ec94dbc5SRasesh Mody 		     p_hwfn->rel_pf_id * NUM_TASK_PF_SEGMENTS + i);
1734ec94dbc5SRasesh Mody 
1735ec94dbc5SRasesh Mody 		STORE_RT_REG_AGG(p_hwfn, rt_reg, cfg_word);
1736ec94dbc5SRasesh Mody 		active_seg_mask |= (tm_iids.pf_tids[i] ? (1 << i) : 0);
1737ec94dbc5SRasesh Mody 
1738ec94dbc5SRasesh Mody 		tm_offset += tm_iids.pf_tids[i];
1739ec94dbc5SRasesh Mody 	}
1740ec94dbc5SRasesh Mody 
1741ec94dbc5SRasesh Mody 	STORE_RT_REG(p_hwfn, TM_REG_PF_ENABLE_TASK_RT_OFFSET, active_seg_mask);
1742ec94dbc5SRasesh Mody 
1743ec94dbc5SRasesh Mody 	/* @@@TBD how to enable the scan for the VFs */
1744ec94dbc5SRasesh Mody }
1745ec94dbc5SRasesh Mody 
ecore_prs_init_pf(struct ecore_hwfn * p_hwfn)174622d07d93SRasesh Mody static void ecore_prs_init_pf(struct ecore_hwfn *p_hwfn)
1747ec94dbc5SRasesh Mody {
174822d07d93SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
1749eafbc6fcSRasesh Mody 	struct ecore_conn_type_cfg *p_fcoe;
175022d07d93SRasesh Mody 	struct ecore_tid_seg *p_tid;
175122d07d93SRasesh Mody 
1752eafbc6fcSRasesh Mody 	p_fcoe = &p_mngr->conn_cfg[PROTOCOLID_FCOE];
1753eafbc6fcSRasesh Mody 
175422d07d93SRasesh Mody 	/* If FCoE is active set the MAX OX_ID (tid) in the Parser */
175522d07d93SRasesh Mody 	if (!p_fcoe->cid_count)
175622d07d93SRasesh Mody 		return;
175722d07d93SRasesh Mody 
175822d07d93SRasesh Mody 	p_tid = &p_fcoe->tid_seg[ECORE_CXT_FCOE_TID_SEG];
175922d07d93SRasesh Mody 	STORE_RT_REG_AGG(p_hwfn,
176022d07d93SRasesh Mody 			PRS_REG_TASK_ID_MAX_INITIATOR_PF_RT_OFFSET,
176122d07d93SRasesh Mody 			p_tid->count);
1762ec94dbc5SRasesh Mody }
1763ec94dbc5SRasesh Mody 
ecore_cxt_hw_init_common(struct ecore_hwfn * p_hwfn)1764ec94dbc5SRasesh Mody void ecore_cxt_hw_init_common(struct ecore_hwfn *p_hwfn)
1765ec94dbc5SRasesh Mody {
1766ec94dbc5SRasesh Mody 	/* CDU configuration */
1767ec94dbc5SRasesh Mody 	ecore_cdu_init_common(p_hwfn);
1768ec94dbc5SRasesh Mody }
1769ec94dbc5SRasesh Mody 
ecore_cxt_hw_init_pf(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)1770739a5b2fSRasesh Mody void ecore_cxt_hw_init_pf(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt)
1771ec94dbc5SRasesh Mody {
1772c2817ba4SRasesh Mody 	ecore_qm_init_pf(p_hwfn, p_ptt, true);
1773ec94dbc5SRasesh Mody 	ecore_cm_init_pf(p_hwfn);
1774ec94dbc5SRasesh Mody 	ecore_dq_init_pf(p_hwfn);
1775ec94dbc5SRasesh Mody 	ecore_cdu_init_pf(p_hwfn);
1776ec94dbc5SRasesh Mody 	ecore_ilt_init_pf(p_hwfn);
1777ec94dbc5SRasesh Mody 	ecore_src_init_pf(p_hwfn);
1778ec94dbc5SRasesh Mody 	ecore_tm_init_pf(p_hwfn);
177922d07d93SRasesh Mody 	ecore_prs_init_pf(p_hwfn);
1780ec94dbc5SRasesh Mody }
1781ec94dbc5SRasesh Mody 
_ecore_cxt_acquire_cid(struct ecore_hwfn * p_hwfn,enum protocol_type type,u32 * p_cid,u8 vfid)1782eb8e81adSRasesh Mody enum _ecore_status_t _ecore_cxt_acquire_cid(struct ecore_hwfn *p_hwfn,
1783eb8e81adSRasesh Mody 					    enum protocol_type type,
1784eb8e81adSRasesh Mody 					    u32 *p_cid, u8 vfid)
1785ec94dbc5SRasesh Mody {
17867ed1cd53SRasesh Mody 	u32 rel_cid, max_num_vfs = NUM_OF_VFS(p_hwfn->p_dev);
1787ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
1788eb8e81adSRasesh Mody 	struct ecore_cid_acquired_map *p_map;
1789ec94dbc5SRasesh Mody 
1790eb8e81adSRasesh Mody 	if (type >= MAX_CONN_TYPES) {
1791ec94dbc5SRasesh Mody 		DP_NOTICE(p_hwfn, true, "Invalid protocol type %d", type);
1792ec94dbc5SRasesh Mody 		return ECORE_INVAL;
1793ec94dbc5SRasesh Mody 	}
1794ec94dbc5SRasesh Mody 
17957ed1cd53SRasesh Mody 	if (vfid >= max_num_vfs && vfid != ECORE_CXT_PF_CID) {
1796eb8e81adSRasesh Mody 		DP_NOTICE(p_hwfn, true, "VF [%02x] is out of range\n", vfid);
1797eb8e81adSRasesh Mody 		return ECORE_INVAL;
1798eb8e81adSRasesh Mody 	}
1799ec94dbc5SRasesh Mody 
1800eb8e81adSRasesh Mody 	/* Determine the right map to take this CID from */
1801eb8e81adSRasesh Mody 	if (vfid == ECORE_CXT_PF_CID)
1802eb8e81adSRasesh Mody 		p_map = &p_mngr->acquired[type];
1803eb8e81adSRasesh Mody 	else
1804eb8e81adSRasesh Mody 		p_map = &p_mngr->acquired_vf[type][vfid];
1805eb8e81adSRasesh Mody 
1806eb8e81adSRasesh Mody 	if (p_map->cid_map == OSAL_NULL) {
1807eb8e81adSRasesh Mody 		DP_NOTICE(p_hwfn, true, "Invalid protocol type %d", type);
1808eb8e81adSRasesh Mody 		return ECORE_INVAL;
1809eb8e81adSRasesh Mody 	}
1810eb8e81adSRasesh Mody 
1811eb8e81adSRasesh Mody 	rel_cid = OSAL_FIND_FIRST_ZERO_BIT(p_map->cid_map,
1812eb8e81adSRasesh Mody 					   p_map->max_count);
1813eb8e81adSRasesh Mody 
1814eb8e81adSRasesh Mody 	if (rel_cid >= p_map->max_count) {
18159455b556SRasesh Mody 		DP_NOTICE(p_hwfn, false, "no CID available for protocol %d\n",
1816ec94dbc5SRasesh Mody 			  type);
1817ec94dbc5SRasesh Mody 		return ECORE_NORESOURCES;
1818ec94dbc5SRasesh Mody 	}
1819ec94dbc5SRasesh Mody 
1820eb8e81adSRasesh Mody 	OSAL_SET_BIT(rel_cid, p_map->cid_map);
1821ec94dbc5SRasesh Mody 
1822eb8e81adSRasesh Mody 	*p_cid = rel_cid + p_map->start_cid;
1823eb8e81adSRasesh Mody 
1824eb8e81adSRasesh Mody 	DP_VERBOSE(p_hwfn, ECORE_MSG_CXT,
1825eb8e81adSRasesh Mody 		   "Acquired cid 0x%08x [rel. %08x] vfid %02x type %d\n",
1826eb8e81adSRasesh Mody 		   *p_cid, rel_cid, vfid, type);
1827ec94dbc5SRasesh Mody 
1828ec94dbc5SRasesh Mody 	return ECORE_SUCCESS;
1829ec94dbc5SRasesh Mody }
1830ec94dbc5SRasesh Mody 
ecore_cxt_acquire_cid(struct ecore_hwfn * p_hwfn,enum protocol_type type,u32 * p_cid)1831eb8e81adSRasesh Mody enum _ecore_status_t ecore_cxt_acquire_cid(struct ecore_hwfn *p_hwfn,
1832eb8e81adSRasesh Mody 					   enum protocol_type type,
1833eb8e81adSRasesh Mody 					   u32 *p_cid)
1834eb8e81adSRasesh Mody {
1835eb8e81adSRasesh Mody 	return _ecore_cxt_acquire_cid(p_hwfn, type, p_cid, ECORE_CXT_PF_CID);
1836eb8e81adSRasesh Mody }
1837eb8e81adSRasesh Mody 
ecore_cxt_test_cid_acquired(struct ecore_hwfn * p_hwfn,u32 cid,u8 vfid,enum protocol_type * p_type,struct ecore_cid_acquired_map ** pp_map)1838ec94dbc5SRasesh Mody static bool ecore_cxt_test_cid_acquired(struct ecore_hwfn *p_hwfn,
1839eb8e81adSRasesh Mody 					u32 cid, u8 vfid,
1840eb8e81adSRasesh Mody 					enum protocol_type *p_type,
1841eb8e81adSRasesh Mody 					struct ecore_cid_acquired_map **pp_map)
1842ec94dbc5SRasesh Mody {
1843ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
1844ec94dbc5SRasesh Mody 	u32 rel_cid;
1845ec94dbc5SRasesh Mody 
1846ec94dbc5SRasesh Mody 	/* Iterate over protocols and find matching cid range */
1847eb8e81adSRasesh Mody 	for (*p_type = 0; *p_type < MAX_CONN_TYPES; (*p_type)++) {
1848eb8e81adSRasesh Mody 		if (vfid == ECORE_CXT_PF_CID)
1849eb8e81adSRasesh Mody 			*pp_map = &p_mngr->acquired[*p_type];
1850eb8e81adSRasesh Mody 		else
1851eb8e81adSRasesh Mody 			*pp_map = &p_mngr->acquired_vf[*p_type][vfid];
1852ec94dbc5SRasesh Mody 
1853eb8e81adSRasesh Mody 		if (!((*pp_map)->cid_map))
1854ec94dbc5SRasesh Mody 			continue;
1855eb8e81adSRasesh Mody 		if (cid >= (*pp_map)->start_cid &&
1856eb8e81adSRasesh Mody 		    cid < (*pp_map)->start_cid + (*pp_map)->max_count) {
1857ec94dbc5SRasesh Mody 			break;
1858ec94dbc5SRasesh Mody 		}
1859ec94dbc5SRasesh Mody 	}
1860eb8e81adSRasesh Mody 	if (*p_type == MAX_CONN_TYPES) {
1861eb8e81adSRasesh Mody 		DP_NOTICE(p_hwfn, true, "Invalid CID %d vfid %02x", cid, vfid);
1862eb8e81adSRasesh Mody 		goto fail;
1863eb8e81adSRasesh Mody 	}
1864ec94dbc5SRasesh Mody 
1865eb8e81adSRasesh Mody 	rel_cid = cid - (*pp_map)->start_cid;
18665018f1fcSJoyce Kong 	if (!OSAL_GET_BIT(rel_cid, (*pp_map)->cid_map)) {
1867eb8e81adSRasesh Mody 		DP_NOTICE(p_hwfn, true,
1868eb8e81adSRasesh Mody 			  "CID %d [vifd %02x] not acquired", cid, vfid);
1869eb8e81adSRasesh Mody 		goto fail;
1870ec94dbc5SRasesh Mody 	}
1871eb8e81adSRasesh Mody 
1872ec94dbc5SRasesh Mody 	return true;
1873eb8e81adSRasesh Mody fail:
1874eb8e81adSRasesh Mody 	*p_type = MAX_CONN_TYPES;
1875eb8e81adSRasesh Mody 	*pp_map = OSAL_NULL;
1876eb8e81adSRasesh Mody 	return false;
1877ec94dbc5SRasesh Mody }
1878ec94dbc5SRasesh Mody 
_ecore_cxt_release_cid(struct ecore_hwfn * p_hwfn,u32 cid,u8 vfid)1879eb8e81adSRasesh Mody void _ecore_cxt_release_cid(struct ecore_hwfn *p_hwfn, u32 cid, u8 vfid)
1880ec94dbc5SRasesh Mody {
18817ed1cd53SRasesh Mody 	u32 rel_cid, max_num_vfs = NUM_OF_VFS(p_hwfn->p_dev);
1882eb8e81adSRasesh Mody 	struct ecore_cid_acquired_map *p_map = OSAL_NULL;
1883ec94dbc5SRasesh Mody 	enum protocol_type type;
1884ec94dbc5SRasesh Mody 	bool b_acquired;
1885ec94dbc5SRasesh Mody 
18867ed1cd53SRasesh Mody 	if (vfid != ECORE_CXT_PF_CID && vfid > max_num_vfs) {
1887eb8e81adSRasesh Mody 		DP_NOTICE(p_hwfn, true,
1888eb8e81adSRasesh Mody 			  "Trying to return incorrect CID belonging to VF %02x\n",
1889eb8e81adSRasesh Mody 			  vfid);
1890eb8e81adSRasesh Mody 		return;
1891eb8e81adSRasesh Mody 	}
1892eb8e81adSRasesh Mody 
1893ec94dbc5SRasesh Mody 	/* Test acquired and find matching per-protocol map */
1894eb8e81adSRasesh Mody 	b_acquired = ecore_cxt_test_cid_acquired(p_hwfn, cid, vfid,
1895eb8e81adSRasesh Mody 						 &type, &p_map);
1896ec94dbc5SRasesh Mody 
1897ec94dbc5SRasesh Mody 	if (!b_acquired)
1898ec94dbc5SRasesh Mody 		return;
1899ec94dbc5SRasesh Mody 
1900eb8e81adSRasesh Mody 	rel_cid = cid - p_map->start_cid;
1901eb8e81adSRasesh Mody 	OSAL_CLEAR_BIT(rel_cid, p_map->cid_map);
1902eb8e81adSRasesh Mody 
1903eb8e81adSRasesh Mody 	DP_VERBOSE(p_hwfn, ECORE_MSG_CXT,
1904eb8e81adSRasesh Mody 		   "Released CID 0x%08x [rel. %08x] vfid %02x type %d\n",
1905eb8e81adSRasesh Mody 		   cid, rel_cid, vfid, type);
1906eb8e81adSRasesh Mody }
1907eb8e81adSRasesh Mody 
ecore_cxt_release_cid(struct ecore_hwfn * p_hwfn,u32 cid)1908eb8e81adSRasesh Mody void ecore_cxt_release_cid(struct ecore_hwfn *p_hwfn, u32 cid)
1909eb8e81adSRasesh Mody {
1910eb8e81adSRasesh Mody 	_ecore_cxt_release_cid(p_hwfn, cid, ECORE_CXT_PF_CID);
1911ec94dbc5SRasesh Mody }
1912ec94dbc5SRasesh Mody 
ecore_cxt_get_cid_info(struct ecore_hwfn * p_hwfn,struct ecore_cxt_info * p_info)1913ec94dbc5SRasesh Mody enum _ecore_status_t ecore_cxt_get_cid_info(struct ecore_hwfn *p_hwfn,
1914ec94dbc5SRasesh Mody 					    struct ecore_cxt_info *p_info)
1915ec94dbc5SRasesh Mody {
1916ec94dbc5SRasesh Mody 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
1917eb8e81adSRasesh Mody 	struct ecore_cid_acquired_map *p_map = OSAL_NULL;
1918ec94dbc5SRasesh Mody 	u32 conn_cxt_size, hw_p_size, cxts_per_p, line;
1919ec94dbc5SRasesh Mody 	enum protocol_type type;
1920ec94dbc5SRasesh Mody 	bool b_acquired;
1921ec94dbc5SRasesh Mody 
1922ec94dbc5SRasesh Mody 	/* Test acquired and find matching per-protocol map */
1923eb8e81adSRasesh Mody 	b_acquired = ecore_cxt_test_cid_acquired(p_hwfn, p_info->iid,
1924eb8e81adSRasesh Mody 						 ECORE_CXT_PF_CID,
1925eb8e81adSRasesh Mody 						 &type, &p_map);
1926ec94dbc5SRasesh Mody 
1927ec94dbc5SRasesh Mody 	if (!b_acquired)
1928ec94dbc5SRasesh Mody 		return ECORE_INVAL;
1929ec94dbc5SRasesh Mody 
1930ec94dbc5SRasesh Mody 	/* set the protocl type */
1931ec94dbc5SRasesh Mody 	p_info->type = type;
1932ec94dbc5SRasesh Mody 
1933ec94dbc5SRasesh Mody 	/* compute context virtual pointer */
1934ec94dbc5SRasesh Mody 	hw_p_size = p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC].p_size.val;
1935ec94dbc5SRasesh Mody 
1936ec94dbc5SRasesh Mody 	conn_cxt_size = CONN_CXT_SIZE(p_hwfn);
1937ec94dbc5SRasesh Mody 	cxts_per_p = ILT_PAGE_IN_BYTES(hw_p_size) / conn_cxt_size;
1938ec94dbc5SRasesh Mody 	line = p_info->iid / cxts_per_p;
1939ec94dbc5SRasesh Mody 
1940ec94dbc5SRasesh Mody 	/* Make sure context is allocated (dynamic allocation) */
19413b307c55SRasesh Mody 	if (!p_mngr->ilt_shadow[line].virt_addr)
1942ec94dbc5SRasesh Mody 		return ECORE_INVAL;
1943ec94dbc5SRasesh Mody 
19443b307c55SRasesh Mody 	p_info->p_cxt = (u8 *)p_mngr->ilt_shadow[line].virt_addr +
1945ec94dbc5SRasesh Mody 	    p_info->iid % cxts_per_p * conn_cxt_size;
1946ec94dbc5SRasesh Mody 
1947ec94dbc5SRasesh Mody 	DP_VERBOSE(p_hwfn, (ECORE_MSG_ILT | ECORE_MSG_CXT),
1948ec94dbc5SRasesh Mody 		"Accessing ILT shadow[%d]: CXT pointer is at %p (for iid %d)\n",
1949ec94dbc5SRasesh Mody 		(p_info->iid / cxts_per_p), p_info->p_cxt, p_info->iid);
1950ec94dbc5SRasesh Mody 
1951ec94dbc5SRasesh Mody 	return ECORE_SUCCESS;
1952ec94dbc5SRasesh Mody }
1953ec94dbc5SRasesh Mody 
ecore_cxt_set_pf_params(struct ecore_hwfn * p_hwfn)1954ec94dbc5SRasesh Mody enum _ecore_status_t ecore_cxt_set_pf_params(struct ecore_hwfn *p_hwfn)
1955ec94dbc5SRasesh Mody {
1956ec94dbc5SRasesh Mody 	/* Set the number of required CORE connections */
1957ec94dbc5SRasesh Mody 	u32 core_cids = 1;	/* SPQ */
1958ec94dbc5SRasesh Mody 
1959ec94dbc5SRasesh Mody 	ecore_cxt_set_proto_cid_count(p_hwfn, PROTOCOLID_CORE, core_cids, 0);
1960ec94dbc5SRasesh Mody 
1961ec94dbc5SRasesh Mody 	switch (p_hwfn->hw_info.personality) {
1962ec94dbc5SRasesh Mody 	case ECORE_PCI_ETH:
1963ec94dbc5SRasesh Mody 		{
1964a2dc43f3SRasesh Mody 		u32 count = 0;
1965a2dc43f3SRasesh Mody 
1966ec94dbc5SRasesh Mody 		struct ecore_eth_pf_params *p_params =
1967ec94dbc5SRasesh Mody 			    &p_hwfn->pf_params.eth_pf_params;
1968ec94dbc5SRasesh Mody 
1969a90c566fSRasesh Mody 		if (!p_params->num_vf_cons)
1970a90c566fSRasesh Mody 			p_params->num_vf_cons = ETH_PF_PARAMS_VF_CONS_DEFAULT;
197153437002SHarish Patil 		ecore_cxt_set_proto_cid_count(p_hwfn, PROTOCOLID_ETH,
1972a90c566fSRasesh Mody 					      p_params->num_cons,
1973a90c566fSRasesh Mody 					      p_params->num_vf_cons);
1974a2dc43f3SRasesh Mody 
1975a2dc43f3SRasesh Mody 		count = p_params->num_arfs_filters;
1976a2dc43f3SRasesh Mody 
19775018f1fcSJoyce Kong 		if (!OSAL_GET_BIT(ECORE_MF_DISABLE_ARFS,
1978a2dc43f3SRasesh Mody 				   &p_hwfn->p_dev->mf_bits))
1979a2dc43f3SRasesh Mody 			p_hwfn->p_cxt_mngr->arfs_count = count;
1980a2dc43f3SRasesh Mody 
1981ec94dbc5SRasesh Mody 		break;
1982ec94dbc5SRasesh Mody 		}
1983ec94dbc5SRasesh Mody 	default:
1984ec94dbc5SRasesh Mody 		return ECORE_INVAL;
1985ec94dbc5SRasesh Mody 	}
1986ec94dbc5SRasesh Mody 
1987ec94dbc5SRasesh Mody 	return ECORE_SUCCESS;
1988ec94dbc5SRasesh Mody }
1989ec94dbc5SRasesh Mody 
1990ec94dbc5SRasesh Mody /* This function is very RoCE oriented, if another protocol in the future
1991ec94dbc5SRasesh Mody  * will want this feature we'll need to modify the function to be more generic
1992ec94dbc5SRasesh Mody  */
199322d07d93SRasesh Mody enum _ecore_status_t
ecore_cxt_dynamic_ilt_alloc(struct ecore_hwfn * p_hwfn,enum ecore_cxt_elem_type elem_type,u32 iid)199422d07d93SRasesh Mody ecore_cxt_dynamic_ilt_alloc(struct ecore_hwfn *p_hwfn,
199522d07d93SRasesh Mody 			    enum ecore_cxt_elem_type elem_type,
199622d07d93SRasesh Mody 			    u32 iid)
199722d07d93SRasesh Mody {
199822d07d93SRasesh Mody 	u32 reg_offset, shadow_line, elem_size, hw_p_size, elems_per_p, line;
199922d07d93SRasesh Mody 	struct ecore_ilt_client_cfg *p_cli;
200022d07d93SRasesh Mody 	struct ecore_ilt_cli_blk *p_blk;
200122d07d93SRasesh Mody 	struct ecore_ptt *p_ptt;
200222d07d93SRasesh Mody 	dma_addr_t p_phys;
200322d07d93SRasesh Mody 	u64 ilt_hw_entry;
200422d07d93SRasesh Mody 	void *p_virt;
200522d07d93SRasesh Mody 	enum _ecore_status_t rc = ECORE_SUCCESS;
200622d07d93SRasesh Mody 
200722d07d93SRasesh Mody 	switch (elem_type) {
200822d07d93SRasesh Mody 	case ECORE_ELEM_CXT:
200922d07d93SRasesh Mody 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC];
201022d07d93SRasesh Mody 		elem_size = CONN_CXT_SIZE(p_hwfn);
201122d07d93SRasesh Mody 		p_blk = &p_cli->pf_blks[CDUC_BLK];
201222d07d93SRasesh Mody 		break;
201322d07d93SRasesh Mody 	case ECORE_ELEM_SRQ:
201422d07d93SRasesh Mody 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_TSDM];
201522d07d93SRasesh Mody 		elem_size = SRQ_CXT_SIZE;
201622d07d93SRasesh Mody 		p_blk = &p_cli->pf_blks[SRQ_BLK];
201722d07d93SRasesh Mody 		break;
201822d07d93SRasesh Mody 	case ECORE_ELEM_TASK:
201922d07d93SRasesh Mody 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
202022d07d93SRasesh Mody 		elem_size = TYPE1_TASK_CXT_SIZE(p_hwfn);
202122d07d93SRasesh Mody 		p_blk = &p_cli->pf_blks[CDUT_SEG_BLK(ECORE_CXT_ROCE_TID_SEG)];
202222d07d93SRasesh Mody 		break;
202322d07d93SRasesh Mody 	default:
202422d07d93SRasesh Mody 		DP_NOTICE(p_hwfn, false,
202522d07d93SRasesh Mody 			  "ECORE_INVALID elem type = %d", elem_type);
202622d07d93SRasesh Mody 		return ECORE_INVAL;
202722d07d93SRasesh Mody 	}
202822d07d93SRasesh Mody 
202922d07d93SRasesh Mody 	/* Calculate line in ilt */
203022d07d93SRasesh Mody 	hw_p_size = p_cli->p_size.val;
203122d07d93SRasesh Mody 	elems_per_p = ILT_PAGE_IN_BYTES(hw_p_size) / elem_size;
203222d07d93SRasesh Mody 	line = p_blk->start_line + (iid / elems_per_p);
203322d07d93SRasesh Mody 	shadow_line = line - p_hwfn->p_cxt_mngr->pf_start_line;
203422d07d93SRasesh Mody 
203522d07d93SRasesh Mody 	/* If line is already allocated, do nothing, otherwise allocate it and
203622d07d93SRasesh Mody 	 * write it to the PSWRQ2 registers.
203722d07d93SRasesh Mody 	 * This section can be run in parallel from different contexts and thus
203822d07d93SRasesh Mody 	 * a mutex protection is needed.
203922d07d93SRasesh Mody 	 */
204022d07d93SRasesh Mody 
204122d07d93SRasesh Mody 	OSAL_MUTEX_ACQUIRE(&p_hwfn->p_cxt_mngr->mutex);
204222d07d93SRasesh Mody 
20433b307c55SRasesh Mody 	if (p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].virt_addr)
204422d07d93SRasesh Mody 		goto out0;
204522d07d93SRasesh Mody 
204622d07d93SRasesh Mody 	p_ptt = ecore_ptt_acquire(p_hwfn);
204722d07d93SRasesh Mody 	if (!p_ptt) {
204822d07d93SRasesh Mody 		DP_NOTICE(p_hwfn, false,
204922d07d93SRasesh Mody 			  "ECORE_TIME_OUT on ptt acquire - dynamic allocation");
205022d07d93SRasesh Mody 		rc = ECORE_TIMEOUT;
205122d07d93SRasesh Mody 		goto out0;
205222d07d93SRasesh Mody 	}
205322d07d93SRasesh Mody 
205422d07d93SRasesh Mody 	p_virt = OSAL_DMA_ALLOC_COHERENT(p_hwfn->p_dev,
205522d07d93SRasesh Mody 					 &p_phys,
205622d07d93SRasesh Mody 					 p_blk->real_size_in_page);
205722d07d93SRasesh Mody 	if (!p_virt) {
205822d07d93SRasesh Mody 		rc = ECORE_NOMEM;
205922d07d93SRasesh Mody 		goto out1;
206022d07d93SRasesh Mody 	}
206122d07d93SRasesh Mody 	OSAL_MEM_ZERO(p_virt, p_blk->real_size_in_page);
206222d07d93SRasesh Mody 
20633b307c55SRasesh Mody 	p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].virt_addr = p_virt;
20643b307c55SRasesh Mody 	p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].phys_addr = p_phys;
206522d07d93SRasesh Mody 	p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].size =
206622d07d93SRasesh Mody 		p_blk->real_size_in_page;
206722d07d93SRasesh Mody 
206822d07d93SRasesh Mody 	/* compute absolute offset */
206922d07d93SRasesh Mody 	reg_offset = PSWRQ2_REG_ILT_MEMORY +
207022d07d93SRasesh Mody 		     (line * ILT_REG_SIZE_IN_BYTES * ILT_ENTRY_IN_REGS);
207122d07d93SRasesh Mody 
207222d07d93SRasesh Mody 	ilt_hw_entry = 0;
207322d07d93SRasesh Mody 	SET_FIELD(ilt_hw_entry, ILT_ENTRY_VALID, 1ULL);
207422d07d93SRasesh Mody 	SET_FIELD(ilt_hw_entry,
207522d07d93SRasesh Mody 		  ILT_ENTRY_PHY_ADDR,
20763b307c55SRasesh Mody 		 (p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].phys_addr >> 12));
207722d07d93SRasesh Mody 
207822d07d93SRasesh Mody /* Write via DMAE since the PSWRQ2_REG_ILT_MEMORY line is a wide-bus */
207922d07d93SRasesh Mody 
208022d07d93SRasesh Mody 	ecore_dmae_host2grc(p_hwfn, p_ptt, (u64)(osal_uintptr_t)&ilt_hw_entry,
208122d07d93SRasesh Mody 			    reg_offset, sizeof(ilt_hw_entry) / sizeof(u32),
20823eed444aSRasesh Mody 			    OSAL_NULL /* default parameters */);
208322d07d93SRasesh Mody 
208422d07d93SRasesh Mody out1:
208522d07d93SRasesh Mody 	ecore_ptt_release(p_hwfn, p_ptt);
208622d07d93SRasesh Mody out0:
208722d07d93SRasesh Mody 	OSAL_MUTEX_RELEASE(&p_hwfn->p_cxt_mngr->mutex);
208822d07d93SRasesh Mody 
208922d07d93SRasesh Mody 	return rc;
209022d07d93SRasesh Mody }
209122d07d93SRasesh Mody 
209222d07d93SRasesh Mody /* This function is very RoCE oriented, if another protocol in the future
209322d07d93SRasesh Mody  * will want this feature we'll need to modify the function to be more generic
209422d07d93SRasesh Mody  */
2095ec94dbc5SRasesh Mody static enum _ecore_status_t
ecore_cxt_free_ilt_range(struct ecore_hwfn * p_hwfn,enum ecore_cxt_elem_type elem_type,u32 start_iid,u32 count)2096ec94dbc5SRasesh Mody ecore_cxt_free_ilt_range(struct ecore_hwfn *p_hwfn,
2097ec94dbc5SRasesh Mody 			 enum ecore_cxt_elem_type elem_type,
2098ec94dbc5SRasesh Mody 			 u32 start_iid, u32 count)
2099ec94dbc5SRasesh Mody {
2100ec94dbc5SRasesh Mody 	u32 start_line, end_line, shadow_start_line, shadow_end_line;
210122d07d93SRasesh Mody 	u32 reg_offset, elem_size, hw_p_size, elems_per_p;
2102ec94dbc5SRasesh Mody 	struct ecore_ilt_client_cfg *p_cli;
2103ec94dbc5SRasesh Mody 	struct ecore_ilt_cli_blk *p_blk;
2104ec94dbc5SRasesh Mody 	u32 end_iid = start_iid + count;
2105ec94dbc5SRasesh Mody 	struct ecore_ptt *p_ptt;
2106ec94dbc5SRasesh Mody 	u64 ilt_hw_entry = 0;
2107ec94dbc5SRasesh Mody 	u32 i;
2108ec94dbc5SRasesh Mody 
210922d07d93SRasesh Mody 	switch (elem_type) {
211022d07d93SRasesh Mody 	case ECORE_ELEM_CXT:
2111ec94dbc5SRasesh Mody 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC];
2112ec94dbc5SRasesh Mody 		elem_size = CONN_CXT_SIZE(p_hwfn);
2113ec94dbc5SRasesh Mody 		p_blk = &p_cli->pf_blks[CDUC_BLK];
211422d07d93SRasesh Mody 		break;
211522d07d93SRasesh Mody 	case ECORE_ELEM_SRQ:
211622d07d93SRasesh Mody 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_TSDM];
211722d07d93SRasesh Mody 		elem_size = SRQ_CXT_SIZE;
211822d07d93SRasesh Mody 		p_blk = &p_cli->pf_blks[SRQ_BLK];
211922d07d93SRasesh Mody 		break;
212022d07d93SRasesh Mody 	case ECORE_ELEM_TASK:
212122d07d93SRasesh Mody 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
212222d07d93SRasesh Mody 		elem_size = TYPE1_TASK_CXT_SIZE(p_hwfn);
212322d07d93SRasesh Mody 		p_blk = &p_cli->pf_blks[CDUT_SEG_BLK(ECORE_CXT_ROCE_TID_SEG)];
212422d07d93SRasesh Mody 		break;
212522d07d93SRasesh Mody 	default:
212622d07d93SRasesh Mody 		DP_NOTICE(p_hwfn, false,
212722d07d93SRasesh Mody 			  "ECORE_INVALID elem type = %d", elem_type);
212822d07d93SRasesh Mody 		return ECORE_INVAL;
2129ec94dbc5SRasesh Mody 	}
2130ec94dbc5SRasesh Mody 
2131ec94dbc5SRasesh Mody 	/* Calculate line in ilt */
2132ec94dbc5SRasesh Mody 	hw_p_size = p_cli->p_size.val;
2133ec94dbc5SRasesh Mody 	elems_per_p = ILT_PAGE_IN_BYTES(hw_p_size) / elem_size;
2134ec94dbc5SRasesh Mody 	start_line = p_blk->start_line + (start_iid / elems_per_p);
2135ec94dbc5SRasesh Mody 	end_line = p_blk->start_line + (end_iid / elems_per_p);
2136ec94dbc5SRasesh Mody 	if (((end_iid + 1) / elems_per_p) != (end_iid / elems_per_p))
2137ec94dbc5SRasesh Mody 		end_line--;
2138ec94dbc5SRasesh Mody 
2139ec94dbc5SRasesh Mody 	shadow_start_line = start_line - p_hwfn->p_cxt_mngr->pf_start_line;
2140ec94dbc5SRasesh Mody 	shadow_end_line = end_line - p_hwfn->p_cxt_mngr->pf_start_line;
2141ec94dbc5SRasesh Mody 
2142ec94dbc5SRasesh Mody 	p_ptt = ecore_ptt_acquire(p_hwfn);
2143ec94dbc5SRasesh Mody 	if (!p_ptt) {
2144ec94dbc5SRasesh Mody 		DP_NOTICE(p_hwfn, false,
2145ec94dbc5SRasesh Mody 			  "ECORE_TIME_OUT on ptt acquire - dynamic allocation");
2146ec94dbc5SRasesh Mody 		return ECORE_TIMEOUT;
2147ec94dbc5SRasesh Mody 	}
2148ec94dbc5SRasesh Mody 
2149ec94dbc5SRasesh Mody 	for (i = shadow_start_line; i < shadow_end_line; i++) {
21503b307c55SRasesh Mody 		if (!p_hwfn->p_cxt_mngr->ilt_shadow[i].virt_addr)
2151ec94dbc5SRasesh Mody 			continue;
2152ec94dbc5SRasesh Mody 
2153ec94dbc5SRasesh Mody 		OSAL_DMA_FREE_COHERENT(p_hwfn->p_dev,
21543b307c55SRasesh Mody 				    p_hwfn->p_cxt_mngr->ilt_shadow[i].virt_addr,
21553b307c55SRasesh Mody 				    p_hwfn->p_cxt_mngr->ilt_shadow[i].phys_addr,
2156ec94dbc5SRasesh Mody 				    p_hwfn->p_cxt_mngr->ilt_shadow[i].size);
2157ec94dbc5SRasesh Mody 
21583b307c55SRasesh Mody 		p_hwfn->p_cxt_mngr->ilt_shadow[i].virt_addr = OSAL_NULL;
21593b307c55SRasesh Mody 		p_hwfn->p_cxt_mngr->ilt_shadow[i].phys_addr = 0;
2160ec94dbc5SRasesh Mody 		p_hwfn->p_cxt_mngr->ilt_shadow[i].size = 0;
2161ec94dbc5SRasesh Mody 
2162ec94dbc5SRasesh Mody 		/* compute absolute offset */
2163ec94dbc5SRasesh Mody 		reg_offset = PSWRQ2_REG_ILT_MEMORY +
2164ec94dbc5SRasesh Mody 		    ((start_line++) * ILT_REG_SIZE_IN_BYTES *
2165ec94dbc5SRasesh Mody 		     ILT_ENTRY_IN_REGS);
2166ec94dbc5SRasesh Mody 
216722d07d93SRasesh Mody 		/* Write via DMAE since the PSWRQ2_REG_ILT_MEMORY line is a
216822d07d93SRasesh Mody 		 * wide-bus.
216922d07d93SRasesh Mody 		 */
217022d07d93SRasesh Mody 		ecore_dmae_host2grc(p_hwfn, p_ptt,
217122d07d93SRasesh Mody 				    (u64)(osal_uintptr_t)&ilt_hw_entry,
217222d07d93SRasesh Mody 				    reg_offset,
217322d07d93SRasesh Mody 				    sizeof(ilt_hw_entry) / sizeof(u32),
21743eed444aSRasesh Mody 				    OSAL_NULL /* default parameters */);
2175ec94dbc5SRasesh Mody 	}
2176ec94dbc5SRasesh Mody 
2177ec94dbc5SRasesh Mody 	ecore_ptt_release(p_hwfn, p_ptt);
2178ec94dbc5SRasesh Mody 
2179ec94dbc5SRasesh Mody 	return ECORE_SUCCESS;
2180ec94dbc5SRasesh Mody }
2181519438f7SRasesh Mody 
ecore_blk_calculate_pages(struct ecore_ilt_cli_blk * p_blk)2182519438f7SRasesh Mody static u16 ecore_blk_calculate_pages(struct ecore_ilt_cli_blk *p_blk)
2183519438f7SRasesh Mody {
2184519438f7SRasesh Mody 	if (p_blk->real_size_in_page == 0)
2185519438f7SRasesh Mody 		return 0;
2186519438f7SRasesh Mody 
2187519438f7SRasesh Mody 	return DIV_ROUND_UP(p_blk->total_size, p_blk->real_size_in_page);
2188519438f7SRasesh Mody }
2189*2352f348SRasesh Mody 
ecore_get_cdut_num_pf_init_pages(struct ecore_hwfn * p_hwfn)2190*2352f348SRasesh Mody u16 ecore_get_cdut_num_pf_init_pages(struct ecore_hwfn *p_hwfn)
2191*2352f348SRasesh Mody {
2192*2352f348SRasesh Mody 	struct ecore_ilt_client_cfg *p_cli;
2193*2352f348SRasesh Mody 	struct ecore_ilt_cli_blk *p_blk;
2194*2352f348SRasesh Mody 	u16 i, pages = 0;
2195*2352f348SRasesh Mody 
2196*2352f348SRasesh Mody 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
2197*2352f348SRasesh Mody 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
2198*2352f348SRasesh Mody 		p_blk = &p_cli->pf_blks[CDUT_FL_SEG_BLK(i, PF)];
2199*2352f348SRasesh Mody 		pages += ecore_blk_calculate_pages(p_blk);
2200*2352f348SRasesh Mody 	}
2201*2352f348SRasesh Mody 
2202*2352f348SRasesh Mody 	return pages;
2203*2352f348SRasesh Mody }
2204*2352f348SRasesh Mody 
ecore_get_cdut_num_vf_init_pages(struct ecore_hwfn * p_hwfn)2205*2352f348SRasesh Mody u16 ecore_get_cdut_num_vf_init_pages(struct ecore_hwfn *p_hwfn)
2206*2352f348SRasesh Mody {
2207*2352f348SRasesh Mody 	struct ecore_ilt_client_cfg *p_cli;
2208*2352f348SRasesh Mody 	struct ecore_ilt_cli_blk *p_blk;
2209*2352f348SRasesh Mody 	u16 i, pages = 0;
2210*2352f348SRasesh Mody 
2211*2352f348SRasesh Mody 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
2212*2352f348SRasesh Mody 	for (i = 0; i < NUM_TASK_VF_SEGMENTS; i++) {
2213*2352f348SRasesh Mody 		p_blk = &p_cli->vf_blks[CDUT_FL_SEG_BLK(i, VF)];
2214*2352f348SRasesh Mody 		pages += ecore_blk_calculate_pages(p_blk);
2215*2352f348SRasesh Mody 	}
2216*2352f348SRasesh Mody 
2217*2352f348SRasesh Mody 	return pages;
2218*2352f348SRasesh Mody }
2219*2352f348SRasesh Mody 
ecore_get_cdut_num_pf_work_pages(struct ecore_hwfn * p_hwfn)2220*2352f348SRasesh Mody u16 ecore_get_cdut_num_pf_work_pages(struct ecore_hwfn *p_hwfn)
2221*2352f348SRasesh Mody {
2222*2352f348SRasesh Mody 	struct ecore_ilt_client_cfg *p_cli;
2223*2352f348SRasesh Mody 	struct ecore_ilt_cli_blk *p_blk;
2224*2352f348SRasesh Mody 	u16 i, pages = 0;
2225*2352f348SRasesh Mody 
2226*2352f348SRasesh Mody 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
2227*2352f348SRasesh Mody 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
2228*2352f348SRasesh Mody 		p_blk = &p_cli->pf_blks[CDUT_SEG_BLK(i)];
2229*2352f348SRasesh Mody 		pages += ecore_blk_calculate_pages(p_blk);
2230*2352f348SRasesh Mody 	}
2231*2352f348SRasesh Mody 
2232*2352f348SRasesh Mody 	return pages;
2233*2352f348SRasesh Mody }
2234*2352f348SRasesh Mody 
ecore_get_cdut_num_vf_work_pages(struct ecore_hwfn * p_hwfn)2235*2352f348SRasesh Mody u16 ecore_get_cdut_num_vf_work_pages(struct ecore_hwfn *p_hwfn)
2236*2352f348SRasesh Mody {
2237*2352f348SRasesh Mody 	struct ecore_ilt_client_cfg *p_cli;
2238*2352f348SRasesh Mody 	struct ecore_ilt_cli_blk *p_blk;
2239*2352f348SRasesh Mody 	u16 pages = 0, i;
2240*2352f348SRasesh Mody 
2241*2352f348SRasesh Mody 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
2242*2352f348SRasesh Mody 	for (i = 0; i < NUM_TASK_VF_SEGMENTS; i++) {
2243*2352f348SRasesh Mody 		p_blk = &p_cli->vf_blks[CDUT_SEG_BLK(i)];
2244*2352f348SRasesh Mody 		pages += ecore_blk_calculate_pages(p_blk);
2245*2352f348SRasesh Mody 	}
2246*2352f348SRasesh Mody 
2247*2352f348SRasesh Mody 	return pages;
2248*2352f348SRasesh Mody }
2249