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