114b24e2bSVaishali Kulkarni /*
214b24e2bSVaishali Kulkarni * CDDL HEADER START
314b24e2bSVaishali Kulkarni *
414b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the
514b24e2bSVaishali Kulkarni * Common Development and Distribution License, v.1,  (the "License").
614b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License.
714b24e2bSVaishali Kulkarni *
814b24e2bSVaishali Kulkarni * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
914b24e2bSVaishali Kulkarni * or http://opensource.org/licenses/CDDL-1.0.
1014b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions
1114b24e2bSVaishali Kulkarni * and limitations under the License.
1214b24e2bSVaishali Kulkarni *
1314b24e2bSVaishali Kulkarni * When distributing Covered Code, include this CDDL HEADER in each
1414b24e2bSVaishali Kulkarni * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1514b24e2bSVaishali Kulkarni * If applicable, add the following below this CDDL HEADER, with the
1614b24e2bSVaishali Kulkarni * fields enclosed by brackets "[]" replaced with your own identifying
1714b24e2bSVaishali Kulkarni * information: Portions Copyright [yyyy] [name of copyright owner]
1814b24e2bSVaishali Kulkarni *
1914b24e2bSVaishali Kulkarni * CDDL HEADER END
2014b24e2bSVaishali Kulkarni */
2114b24e2bSVaishali Kulkarni 
2214b24e2bSVaishali Kulkarni /*
2314b24e2bSVaishali Kulkarni * Copyright 2014-2017 Cavium, Inc.
2414b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the Common Development
2514b24e2bSVaishali Kulkarni * and Distribution License, v.1,  (the "License").
2614b24e2bSVaishali Kulkarni 
2714b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License.
2814b24e2bSVaishali Kulkarni 
2914b24e2bSVaishali Kulkarni * You can obtain a copy of the License at available
3014b24e2bSVaishali Kulkarni * at http://opensource.org/licenses/CDDL-1.0
3114b24e2bSVaishali Kulkarni 
3214b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions and
3314b24e2bSVaishali Kulkarni * limitations under the License.
3414b24e2bSVaishali Kulkarni */
3514b24e2bSVaishali Kulkarni 
3614b24e2bSVaishali Kulkarni #include "bcm_osal.h"
3714b24e2bSVaishali Kulkarni #include "reg_addr.h"
3814b24e2bSVaishali Kulkarni #include "common_hsi.h"
3914b24e2bSVaishali Kulkarni #include "ecore_hsi_common.h"
4014b24e2bSVaishali Kulkarni #include "ecore_hsi_eth.h"
4114b24e2bSVaishali Kulkarni #include "tcp_common.h"
4214b24e2bSVaishali Kulkarni #include "ecore_hsi_iscsi.h"
4314b24e2bSVaishali Kulkarni #include "ecore_hsi_fcoe.h"
4414b24e2bSVaishali Kulkarni #include "ecore_hsi_roce.h"
4514b24e2bSVaishali Kulkarni #include "ecore_hsi_iwarp.h"
4614b24e2bSVaishali Kulkarni #include "ecore_rt_defs.h"
4714b24e2bSVaishali Kulkarni #include "ecore_status.h"
4814b24e2bSVaishali Kulkarni #include "ecore.h"
4914b24e2bSVaishali Kulkarni #include "ecore_init_ops.h"
5014b24e2bSVaishali Kulkarni #include "ecore_init_fw_funcs.h"
5114b24e2bSVaishali Kulkarni #include "ecore_cxt.h"
5214b24e2bSVaishali Kulkarni #include "ecore_hw.h"
5314b24e2bSVaishali Kulkarni #include "ecore_dev_api.h"
5414b24e2bSVaishali Kulkarni #include "ecore_sriov.h"
5514b24e2bSVaishali Kulkarni #include "ecore_roce.h"
5614b24e2bSVaishali Kulkarni #include "ecore_mcp.h"
5714b24e2bSVaishali Kulkarni 
5814b24e2bSVaishali Kulkarni /* Max number of connection types in HW (DQ/CDU etc.) */
5914b24e2bSVaishali Kulkarni #define MAX_CONN_TYPES		PROTOCOLID_COMMON
6014b24e2bSVaishali Kulkarni #define NUM_TASK_TYPES		2
6114b24e2bSVaishali Kulkarni #define NUM_TASK_PF_SEGMENTS	4
6214b24e2bSVaishali Kulkarni #define NUM_TASK_VF_SEGMENTS	1
6314b24e2bSVaishali Kulkarni 
6414b24e2bSVaishali Kulkarni /* Doorbell-Queue constants */
6514b24e2bSVaishali Kulkarni #define DQ_RANGE_SHIFT	4
6614b24e2bSVaishali Kulkarni #define DQ_RANGE_ALIGN	(1 << DQ_RANGE_SHIFT)
6714b24e2bSVaishali Kulkarni 
6814b24e2bSVaishali Kulkarni /* Searcher constants */
6914b24e2bSVaishali Kulkarni #define SRC_MIN_NUM_ELEMS 256
7014b24e2bSVaishali Kulkarni 
7114b24e2bSVaishali Kulkarni /* Timers constants */
7214b24e2bSVaishali Kulkarni #define TM_SHIFT	7
7314b24e2bSVaishali Kulkarni #define TM_ALIGN	(1 << TM_SHIFT)
7414b24e2bSVaishali Kulkarni #define TM_ELEM_SIZE	4
7514b24e2bSVaishali Kulkarni 
7614b24e2bSVaishali Kulkarni /* ILT constants */
7714b24e2bSVaishali Kulkarni /* If for some reason, HW P size is modified to be less than 32K,
7814b24e2bSVaishali Kulkarni  * special handling needs to be made for CDU initialization
7914b24e2bSVaishali Kulkarni  */
8014b24e2bSVaishali Kulkarni #ifdef CONFIG_ECORE_ROCE
8114b24e2bSVaishali Kulkarni /* For RoCE we configure to 64K to cover for RoCE max tasks 256K purpose. Can be
8214b24e2bSVaishali Kulkarni  * optimized with resource management scheme
8314b24e2bSVaishali Kulkarni  */
8414b24e2bSVaishali Kulkarni #define ILT_DEFAULT_HW_P_SIZE	4
8514b24e2bSVaishali Kulkarni #else
8614b24e2bSVaishali Kulkarni #define ILT_DEFAULT_HW_P_SIZE	3
8714b24e2bSVaishali Kulkarni #endif
8814b24e2bSVaishali Kulkarni 
8914b24e2bSVaishali Kulkarni #define ILT_PAGE_IN_BYTES(hw_p_size)	(1U << ((hw_p_size) + 12))
9014b24e2bSVaishali Kulkarni #define ILT_CFG_REG(cli, reg)		PSWRQ2_REG_##cli##_##reg##_RT_OFFSET
9114b24e2bSVaishali Kulkarni 
9214b24e2bSVaishali Kulkarni /* ILT entry structure */
9314b24e2bSVaishali Kulkarni #define ILT_ENTRY_PHY_ADDR_MASK		0x000FFFFFFFFFFFULL
9414b24e2bSVaishali Kulkarni #define ILT_ENTRY_PHY_ADDR_SHIFT	0
9514b24e2bSVaishali Kulkarni #define ILT_ENTRY_VALID_MASK		0x1ULL
9614b24e2bSVaishali Kulkarni #define ILT_ENTRY_VALID_SHIFT		52
9714b24e2bSVaishali Kulkarni #define ILT_ENTRY_IN_REGS		2
9814b24e2bSVaishali Kulkarni #define ILT_REG_SIZE_IN_BYTES		4
9914b24e2bSVaishali Kulkarni 
10014b24e2bSVaishali Kulkarni /* connection context union */
10114b24e2bSVaishali Kulkarni union conn_context {
10214b24e2bSVaishali Kulkarni 	struct core_conn_context  core_ctx;
10314b24e2bSVaishali Kulkarni 	struct eth_conn_context	  eth_ctx;
10414b24e2bSVaishali Kulkarni 	struct iscsi_conn_context iscsi_ctx;
10514b24e2bSVaishali Kulkarni 	struct fcoe_conn_context  fcoe_ctx;
10614b24e2bSVaishali Kulkarni 	struct roce_conn_context  roce_ctx;
10714b24e2bSVaishali Kulkarni };
10814b24e2bSVaishali Kulkarni 
10914b24e2bSVaishali Kulkarni /* TYPE-0 task context - iSCSI, FCOE */
11014b24e2bSVaishali Kulkarni union type0_task_context {
11114b24e2bSVaishali Kulkarni 	struct iscsi_task_context iscsi_ctx;
11214b24e2bSVaishali Kulkarni 	struct fcoe_task_context  fcoe_ctx;
11314b24e2bSVaishali Kulkarni };
11414b24e2bSVaishali Kulkarni 
11514b24e2bSVaishali Kulkarni /* TYPE-1 task context - ROCE */
11614b24e2bSVaishali Kulkarni union type1_task_context {
11714b24e2bSVaishali Kulkarni 	struct rdma_task_context roce_ctx;
11814b24e2bSVaishali Kulkarni };
11914b24e2bSVaishali Kulkarni 
12014b24e2bSVaishali Kulkarni struct src_ent {
12114b24e2bSVaishali Kulkarni 	u8  opaque[56];
12214b24e2bSVaishali Kulkarni 	u64 next;
12314b24e2bSVaishali Kulkarni };
12414b24e2bSVaishali Kulkarni 
12514b24e2bSVaishali Kulkarni #define CDUT_SEG_ALIGNMET 3 /* in 4k chunks */
12614b24e2bSVaishali Kulkarni #define CDUT_SEG_ALIGNMET_IN_BYTES (1 << (CDUT_SEG_ALIGNMET + 12))
12714b24e2bSVaishali Kulkarni 
12814b24e2bSVaishali Kulkarni #define CONN_CXT_SIZE(p_hwfn) \
12914b24e2bSVaishali Kulkarni 	ALIGNED_TYPE_SIZE(union conn_context, p_hwfn)
13014b24e2bSVaishali Kulkarni 
13114b24e2bSVaishali Kulkarni #define SRQ_CXT_SIZE (sizeof(struct rdma_srq_context))
13214b24e2bSVaishali Kulkarni 
13314b24e2bSVaishali Kulkarni #define TYPE0_TASK_CXT_SIZE(p_hwfn) \
13414b24e2bSVaishali Kulkarni 	ALIGNED_TYPE_SIZE(union type0_task_context, p_hwfn)
13514b24e2bSVaishali Kulkarni 
13614b24e2bSVaishali Kulkarni /* Alignment is inherent to the type1_task_context structure */
13714b24e2bSVaishali Kulkarni #define TYPE1_TASK_CXT_SIZE(p_hwfn) sizeof(union type1_task_context)
13814b24e2bSVaishali Kulkarni 
13914b24e2bSVaishali Kulkarni /* PF per protocl configuration object */
14014b24e2bSVaishali Kulkarni #define TASK_SEGMENTS   (NUM_TASK_PF_SEGMENTS + NUM_TASK_VF_SEGMENTS)
14114b24e2bSVaishali Kulkarni #define TASK_SEGMENT_VF (NUM_TASK_PF_SEGMENTS)
14214b24e2bSVaishali Kulkarni 
14314b24e2bSVaishali Kulkarni struct ecore_tid_seg {
14414b24e2bSVaishali Kulkarni 	u32	count;
14514b24e2bSVaishali Kulkarni 	u8	type;
14614b24e2bSVaishali Kulkarni 	bool	has_fl_mem;
14714b24e2bSVaishali Kulkarni };
14814b24e2bSVaishali Kulkarni 
14914b24e2bSVaishali Kulkarni struct ecore_conn_type_cfg {
15014b24e2bSVaishali Kulkarni 	u32			cid_count;
15114b24e2bSVaishali Kulkarni 	u32			cids_per_vf;
15214b24e2bSVaishali Kulkarni 	struct ecore_tid_seg	tid_seg[TASK_SEGMENTS];
15314b24e2bSVaishali Kulkarni };
15414b24e2bSVaishali Kulkarni 
15514b24e2bSVaishali Kulkarni /* ILT Client configuration,
15614b24e2bSVaishali Kulkarni  * Per connection type (protocol) resources (cids, tis, vf cids etc.)
15714b24e2bSVaishali Kulkarni  * 1 - for connection context (CDUC) and for each task context we need two
15814b24e2bSVaishali Kulkarni  * values, for regular task context and for force load memory
15914b24e2bSVaishali Kulkarni  */
16014b24e2bSVaishali Kulkarni #define ILT_CLI_PF_BLOCKS	(1 + NUM_TASK_PF_SEGMENTS * 2)
16114b24e2bSVaishali Kulkarni #define ILT_CLI_VF_BLOCKS	(1 + NUM_TASK_VF_SEGMENTS * 2)
16214b24e2bSVaishali Kulkarni #define CDUC_BLK		(0)
16314b24e2bSVaishali Kulkarni #define SRQ_BLK			(0)
16414b24e2bSVaishali Kulkarni #define CDUT_SEG_BLK(n)		(1 + (u8)(n))
16514b24e2bSVaishali Kulkarni #define CDUT_FL_SEG_BLK(n, X)	(1 + (n) + NUM_TASK_##X##_SEGMENTS)
16614b24e2bSVaishali Kulkarni 
16714b24e2bSVaishali Kulkarni enum ilt_clients {
16814b24e2bSVaishali Kulkarni 	ILT_CLI_CDUC,
16914b24e2bSVaishali Kulkarni 	ILT_CLI_CDUT,
17014b24e2bSVaishali Kulkarni 	ILT_CLI_QM,
17114b24e2bSVaishali Kulkarni 	ILT_CLI_TM,
17214b24e2bSVaishali Kulkarni 	ILT_CLI_SRC,
17314b24e2bSVaishali Kulkarni 	ILT_CLI_TSDM,
17414b24e2bSVaishali Kulkarni 	ILT_CLI_MAX
17514b24e2bSVaishali Kulkarni };
17614b24e2bSVaishali Kulkarni 
17714b24e2bSVaishali Kulkarni struct ilt_cfg_pair {
17814b24e2bSVaishali Kulkarni 	u32 reg;
17914b24e2bSVaishali Kulkarni 	u32 val;
18014b24e2bSVaishali Kulkarni };
18114b24e2bSVaishali Kulkarni 
18214b24e2bSVaishali Kulkarni struct ecore_ilt_cli_blk {
18314b24e2bSVaishali Kulkarni 	u32 total_size; /* 0 means not active */
18414b24e2bSVaishali Kulkarni 	u32 real_size_in_page;
18514b24e2bSVaishali Kulkarni 	u32 start_line;
18614b24e2bSVaishali Kulkarni 	u32 dynamic_line_cnt;
18714b24e2bSVaishali Kulkarni };
18814b24e2bSVaishali Kulkarni 
18914b24e2bSVaishali Kulkarni struct ecore_ilt_client_cfg {
19014b24e2bSVaishali Kulkarni 	bool				active;
19114b24e2bSVaishali Kulkarni 
19214b24e2bSVaishali Kulkarni 	/* ILT boundaries */
19314b24e2bSVaishali Kulkarni 	struct ilt_cfg_pair		first;
19414b24e2bSVaishali Kulkarni 	struct ilt_cfg_pair		last;
19514b24e2bSVaishali Kulkarni 	struct ilt_cfg_pair		p_size;
19614b24e2bSVaishali Kulkarni 
19714b24e2bSVaishali Kulkarni 	/* ILT client blocks for PF */
19814b24e2bSVaishali Kulkarni 	struct ecore_ilt_cli_blk	pf_blks[ILT_CLI_PF_BLOCKS];
19914b24e2bSVaishali Kulkarni 	u32				pf_total_lines;
20014b24e2bSVaishali Kulkarni 
20114b24e2bSVaishali Kulkarni 	/* ILT client blocks for VFs */
20214b24e2bSVaishali Kulkarni 	struct ecore_ilt_cli_blk	vf_blks[ILT_CLI_VF_BLOCKS];
20314b24e2bSVaishali Kulkarni 	u32				vf_total_lines;
20414b24e2bSVaishali Kulkarni };
20514b24e2bSVaishali Kulkarni 
20614b24e2bSVaishali Kulkarni /* Per Path -
20714b24e2bSVaishali Kulkarni  *      ILT shadow table
20814b24e2bSVaishali Kulkarni  *      Protocol acquired CID lists
20914b24e2bSVaishali Kulkarni  *      PF start line in ILT
21014b24e2bSVaishali Kulkarni  */
21114b24e2bSVaishali Kulkarni struct ecore_dma_mem {
21214b24e2bSVaishali Kulkarni 	dma_addr_t	p_phys;
21314b24e2bSVaishali Kulkarni 	void		*p_virt;
21414b24e2bSVaishali Kulkarni 	osal_size_t	size;
21514b24e2bSVaishali Kulkarni };
21614b24e2bSVaishali Kulkarni 
21714b24e2bSVaishali Kulkarni #define MAP_WORD_SIZE		sizeof(unsigned long)
21814b24e2bSVaishali Kulkarni #define BITS_PER_MAP_WORD	(MAP_WORD_SIZE * 8)
21914b24e2bSVaishali Kulkarni 
22014b24e2bSVaishali Kulkarni struct ecore_cid_acquired_map {
22114b24e2bSVaishali Kulkarni 	u32		start_cid;
22214b24e2bSVaishali Kulkarni 	u32		max_count;
22314b24e2bSVaishali Kulkarni 	unsigned long	*cid_map;
22414b24e2bSVaishali Kulkarni };
22514b24e2bSVaishali Kulkarni 
22614b24e2bSVaishali Kulkarni struct ecore_cxt_mngr {
22714b24e2bSVaishali Kulkarni 	/* Per protocl configuration */
22814b24e2bSVaishali Kulkarni 	struct ecore_conn_type_cfg	conn_cfg[MAX_CONN_TYPES];
22914b24e2bSVaishali Kulkarni 
23014b24e2bSVaishali Kulkarni 	/* computed ILT structure */
23114b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg	clients[ILT_CLI_MAX];
23214b24e2bSVaishali Kulkarni 
23314b24e2bSVaishali Kulkarni 	/* Task type sizes */
23414b24e2bSVaishali Kulkarni 	u32				task_type_size[NUM_TASK_TYPES];
23514b24e2bSVaishali Kulkarni 
23614b24e2bSVaishali Kulkarni 	/* total number of VFs for this hwfn -
23714b24e2bSVaishali Kulkarni 	 * ALL VFs are symmetric in terms of HW resources
23814b24e2bSVaishali Kulkarni 	 */
23914b24e2bSVaishali Kulkarni 	u32				vf_count;
24014b24e2bSVaishali Kulkarni 
24114b24e2bSVaishali Kulkarni 	/* Acquired CIDs */
24214b24e2bSVaishali Kulkarni 	struct ecore_cid_acquired_map acquired[MAX_CONN_TYPES];
24314b24e2bSVaishali Kulkarni 	/* TBD - do we want this allocated to reserve space? */
24414b24e2bSVaishali Kulkarni 	struct ecore_cid_acquired_map acquired_vf[MAX_CONN_TYPES][COMMON_MAX_NUM_VFS];
24514b24e2bSVaishali Kulkarni 
24614b24e2bSVaishali Kulkarni 	/* ILT shadow table */
24714b24e2bSVaishali Kulkarni 	struct ecore_dma_mem		*ilt_shadow;
24814b24e2bSVaishali Kulkarni 	u32				pf_start_line;
24914b24e2bSVaishali Kulkarni 
25014b24e2bSVaishali Kulkarni 	/* Mutex for a dynamic ILT allocation */
25114b24e2bSVaishali Kulkarni 	osal_mutex_t			mutex;
25214b24e2bSVaishali Kulkarni 
25314b24e2bSVaishali Kulkarni 	/* SRC T2 */
25414b24e2bSVaishali Kulkarni 	struct ecore_dma_mem		*t2;
25514b24e2bSVaishali Kulkarni 	u32				t2_num_pages;
25614b24e2bSVaishali Kulkarni 	u64				first_free;
25714b24e2bSVaishali Kulkarni 	u64				last_free;
25814b24e2bSVaishali Kulkarni 
25914b24e2bSVaishali Kulkarni 	/* The infrastructure originally was very generic and context/task
26014b24e2bSVaishali Kulkarni 	 * oriented - per connection-type we would set how many of those
26114b24e2bSVaishali Kulkarni 	 * are needed, and later when determining how much memory we're
26214b24e2bSVaishali Kulkarni 	 * needing for a given block we'd iterate over all the relevant
26314b24e2bSVaishali Kulkarni 	 * connection-types.
26414b24e2bSVaishali Kulkarni 	 * But since then we've had some additional resources, some of which
26514b24e2bSVaishali Kulkarni 	 * require memory which is indepent of the general context/task
26614b24e2bSVaishali Kulkarni 	 * scheme. We add those here explicitly per-feature.
26714b24e2bSVaishali Kulkarni 	 */
26814b24e2bSVaishali Kulkarni 
26914b24e2bSVaishali Kulkarni 	/* total number of SRQ's for this hwfn */
27014b24e2bSVaishali Kulkarni 	u32				srq_count;
27114b24e2bSVaishali Kulkarni 
27214b24e2bSVaishali Kulkarni 	/* Maximal number of L2 steering filters */
27314b24e2bSVaishali Kulkarni 	u32				arfs_count;
27414b24e2bSVaishali Kulkarni 
27514b24e2bSVaishali Kulkarni 	/* TODO - VF arfs filters ? */
27614b24e2bSVaishali Kulkarni };
27714b24e2bSVaishali Kulkarni 
27814b24e2bSVaishali Kulkarni /* check if resources/configuration is required according to protocol type */
src_proto(struct ecore_hwfn * p_hwfn,enum protocol_type type)27914b24e2bSVaishali Kulkarni static bool src_proto(struct ecore_hwfn *p_hwfn,
28014b24e2bSVaishali Kulkarni 		      enum protocol_type type)
28114b24e2bSVaishali Kulkarni {
28214b24e2bSVaishali Kulkarni 	return	type == PROTOCOLID_ISCSI	||
28314b24e2bSVaishali Kulkarni 		type == PROTOCOLID_FCOE		||
28414b24e2bSVaishali Kulkarni 		type == PROTOCOLID_TOE		||
28514b24e2bSVaishali Kulkarni 		type == PROTOCOLID_IWARP;
28614b24e2bSVaishali Kulkarni }
28714b24e2bSVaishali Kulkarni 
tm_cid_proto(enum protocol_type type)28814b24e2bSVaishali Kulkarni static bool tm_cid_proto(enum protocol_type type)
28914b24e2bSVaishali Kulkarni {
29014b24e2bSVaishali Kulkarni 	return type == PROTOCOLID_ISCSI ||
29114b24e2bSVaishali Kulkarni 	       type == PROTOCOLID_FCOE  ||
29214b24e2bSVaishali Kulkarni 	       type == PROTOCOLID_ROCE  ||
29314b24e2bSVaishali Kulkarni 	       type == PROTOCOLID_IWARP;
29414b24e2bSVaishali Kulkarni }
29514b24e2bSVaishali Kulkarni 
tm_tid_proto(enum protocol_type type)29614b24e2bSVaishali Kulkarni static bool tm_tid_proto(enum protocol_type type)
29714b24e2bSVaishali Kulkarni {
29814b24e2bSVaishali Kulkarni 	return type == PROTOCOLID_FCOE;
29914b24e2bSVaishali Kulkarni }
30014b24e2bSVaishali Kulkarni 
30114b24e2bSVaishali Kulkarni /* counts the iids for the CDU/CDUC ILT client configuration */
30214b24e2bSVaishali Kulkarni struct ecore_cdu_iids {
30314b24e2bSVaishali Kulkarni 	u32 pf_cids;
30414b24e2bSVaishali Kulkarni 	u32 per_vf_cids;
30514b24e2bSVaishali Kulkarni };
30614b24e2bSVaishali Kulkarni 
ecore_cxt_cdu_iids(struct ecore_cxt_mngr * p_mngr,struct ecore_cdu_iids * iids)30714b24e2bSVaishali Kulkarni static void ecore_cxt_cdu_iids(struct ecore_cxt_mngr   *p_mngr,
30814b24e2bSVaishali Kulkarni 			       struct ecore_cdu_iids	*iids)
30914b24e2bSVaishali Kulkarni {
31014b24e2bSVaishali Kulkarni 	u32 type;
31114b24e2bSVaishali Kulkarni 
31214b24e2bSVaishali Kulkarni 	for (type = 0; type < MAX_CONN_TYPES; type++) {
31314b24e2bSVaishali Kulkarni 		iids->pf_cids += p_mngr->conn_cfg[type].cid_count;
31414b24e2bSVaishali Kulkarni 		iids->per_vf_cids += p_mngr->conn_cfg[type].cids_per_vf;
31514b24e2bSVaishali Kulkarni 	}
31614b24e2bSVaishali Kulkarni }
31714b24e2bSVaishali Kulkarni 
31814b24e2bSVaishali Kulkarni /* counts the iids for the Searcher block configuration */
31914b24e2bSVaishali Kulkarni struct ecore_src_iids {
32014b24e2bSVaishali Kulkarni 	u32			pf_cids;
32114b24e2bSVaishali Kulkarni 	u32			per_vf_cids;
32214b24e2bSVaishali Kulkarni };
32314b24e2bSVaishali Kulkarni 
ecore_cxt_src_iids(struct ecore_hwfn * p_hwfn,struct ecore_cxt_mngr * p_mngr,struct ecore_src_iids * iids)32414b24e2bSVaishali Kulkarni static void ecore_cxt_src_iids(struct ecore_hwfn *p_hwfn,
32514b24e2bSVaishali Kulkarni 			       struct ecore_cxt_mngr *p_mngr,
32614b24e2bSVaishali Kulkarni 			       struct ecore_src_iids *iids)
32714b24e2bSVaishali Kulkarni {
32814b24e2bSVaishali Kulkarni 	u32 i;
32914b24e2bSVaishali Kulkarni 
33014b24e2bSVaishali Kulkarni 	for (i = 0; i < MAX_CONN_TYPES; i++) {
33114b24e2bSVaishali Kulkarni 		if (!src_proto(p_hwfn, i))
33214b24e2bSVaishali Kulkarni 			continue;
33314b24e2bSVaishali Kulkarni 
33414b24e2bSVaishali Kulkarni 		iids->pf_cids += p_mngr->conn_cfg[i].cid_count;
33514b24e2bSVaishali Kulkarni 		iids->per_vf_cids += p_mngr->conn_cfg[i].cids_per_vf;
33614b24e2bSVaishali Kulkarni 	}
33714b24e2bSVaishali Kulkarni 
33814b24e2bSVaishali Kulkarni 	/* Add L2 filtering filters in addition */
33914b24e2bSVaishali Kulkarni 	iids->pf_cids += p_mngr->arfs_count;
34014b24e2bSVaishali Kulkarni }
34114b24e2bSVaishali Kulkarni 
34214b24e2bSVaishali Kulkarni /* counts the iids for the Timers block configuration */
34314b24e2bSVaishali Kulkarni struct ecore_tm_iids {
34414b24e2bSVaishali Kulkarni 	u32 pf_cids;
34514b24e2bSVaishali Kulkarni 	u32 pf_tids[NUM_TASK_PF_SEGMENTS]; /* per segment */
34614b24e2bSVaishali Kulkarni 	u32 pf_tids_total;
34714b24e2bSVaishali Kulkarni 	u32 per_vf_cids;
34814b24e2bSVaishali Kulkarni 	u32 per_vf_tids;
34914b24e2bSVaishali Kulkarni };
35014b24e2bSVaishali Kulkarni 
ecore_cxt_tm_iids(struct ecore_hwfn * p_hwfn,struct ecore_cxt_mngr * p_mngr,struct ecore_tm_iids * iids)35114b24e2bSVaishali Kulkarni static void ecore_cxt_tm_iids(struct ecore_hwfn *p_hwfn,
35214b24e2bSVaishali Kulkarni 			      struct ecore_cxt_mngr *p_mngr,
35314b24e2bSVaishali Kulkarni 			      struct ecore_tm_iids *iids)
35414b24e2bSVaishali Kulkarni {
35514b24e2bSVaishali Kulkarni 	bool tm_vf_required = false;
35614b24e2bSVaishali Kulkarni 	bool tm_required = false;
35714b24e2bSVaishali Kulkarni 	int i, j;
35814b24e2bSVaishali Kulkarni 
35914b24e2bSVaishali Kulkarni 	/* Timers is a special case -> we don't count how many cids require
36014b24e2bSVaishali Kulkarni 	 * timers but what's the max cid that will be used by the timer block.
36114b24e2bSVaishali Kulkarni 	 * therefore we traverse in reverse order, and once we hit a protocol
36214b24e2bSVaishali Kulkarni 	 * that requires the timers memory, we'll sum all the protocols up
36314b24e2bSVaishali Kulkarni 	 * to that one.
36414b24e2bSVaishali Kulkarni 	 */
36514b24e2bSVaishali Kulkarni 	for (i = MAX_CONN_TYPES - 1; i >= 0; i--) {
36614b24e2bSVaishali Kulkarni 		struct ecore_conn_type_cfg *p_cfg = &p_mngr->conn_cfg[i];
36714b24e2bSVaishali Kulkarni 
36814b24e2bSVaishali Kulkarni 		if (tm_cid_proto(i) || tm_required) {
36914b24e2bSVaishali Kulkarni 			if (p_cfg->cid_count)
37014b24e2bSVaishali Kulkarni 				tm_required = true;
37114b24e2bSVaishali Kulkarni 
37214b24e2bSVaishali Kulkarni 			iids->pf_cids += p_cfg->cid_count;
37314b24e2bSVaishali Kulkarni 		}
37414b24e2bSVaishali Kulkarni 
37514b24e2bSVaishali Kulkarni 		if (tm_cid_proto(i) || tm_vf_required) {
37614b24e2bSVaishali Kulkarni 			if (p_cfg->cids_per_vf)
37714b24e2bSVaishali Kulkarni 				tm_vf_required = true;
37814b24e2bSVaishali Kulkarni 
37914b24e2bSVaishali Kulkarni 			iids->per_vf_cids += p_cfg->cids_per_vf;
38014b24e2bSVaishali Kulkarni 		}
38114b24e2bSVaishali Kulkarni 
38214b24e2bSVaishali Kulkarni 		if (tm_tid_proto(i)) {
38314b24e2bSVaishali Kulkarni 			struct ecore_tid_seg *segs = p_cfg->tid_seg;
38414b24e2bSVaishali Kulkarni 
38514b24e2bSVaishali Kulkarni 			/* for each segment there is at most one
38614b24e2bSVaishali Kulkarni 			 * protocol for which count is not 0.
38714b24e2bSVaishali Kulkarni 			 */
38814b24e2bSVaishali Kulkarni 			for (j = 0; j < NUM_TASK_PF_SEGMENTS; j++)
38914b24e2bSVaishali Kulkarni 				iids->pf_tids[j] += segs[j].count;
39014b24e2bSVaishali Kulkarni 
39114b24e2bSVaishali Kulkarni 			/* The last array elelment is for the VFs. As for PF
39214b24e2bSVaishali Kulkarni 			 * segments there can be only one protocol for
39314b24e2bSVaishali Kulkarni 			 * which this value is not 0.
39414b24e2bSVaishali Kulkarni 			 */
39514b24e2bSVaishali Kulkarni 			iids->per_vf_tids += segs[NUM_TASK_PF_SEGMENTS].count;
39614b24e2bSVaishali Kulkarni 		}
39714b24e2bSVaishali Kulkarni 	}
39814b24e2bSVaishali Kulkarni 
39914b24e2bSVaishali Kulkarni 	iids->pf_cids = ROUNDUP(iids->pf_cids, TM_ALIGN);
40014b24e2bSVaishali Kulkarni 	iids->per_vf_cids = ROUNDUP(iids->per_vf_cids, TM_ALIGN);
40114b24e2bSVaishali Kulkarni 	iids->per_vf_tids = ROUNDUP(iids->per_vf_tids, TM_ALIGN);
40214b24e2bSVaishali Kulkarni 
40314b24e2bSVaishali Kulkarni 	for (iids->pf_tids_total = 0, j = 0; j < NUM_TASK_PF_SEGMENTS; j++) {
40414b24e2bSVaishali Kulkarni 		iids->pf_tids[j] = ROUNDUP(iids->pf_tids[j], TM_ALIGN);
40514b24e2bSVaishali Kulkarni 		iids->pf_tids_total += iids->pf_tids[j];
40614b24e2bSVaishali Kulkarni 	}
40714b24e2bSVaishali Kulkarni }
40814b24e2bSVaishali Kulkarni 
ecore_cxt_qm_iids(struct ecore_hwfn * p_hwfn,struct ecore_qm_iids * iids)40914b24e2bSVaishali Kulkarni static void ecore_cxt_qm_iids(struct ecore_hwfn *p_hwfn,
41014b24e2bSVaishali Kulkarni 			      struct ecore_qm_iids *iids)
41114b24e2bSVaishali Kulkarni {
41214b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
41314b24e2bSVaishali Kulkarni 	struct ecore_tid_seg *segs;
41414b24e2bSVaishali Kulkarni 	u32 vf_cids = 0, type, j;
41514b24e2bSVaishali Kulkarni 	u32 vf_tids = 0;
41614b24e2bSVaishali Kulkarni 
41714b24e2bSVaishali Kulkarni 	for (type = 0; type < MAX_CONN_TYPES; type++) {
41814b24e2bSVaishali Kulkarni 		iids->cids += p_mngr->conn_cfg[type].cid_count;
41914b24e2bSVaishali Kulkarni 		vf_cids += p_mngr->conn_cfg[type].cids_per_vf;
42014b24e2bSVaishali Kulkarni 
42114b24e2bSVaishali Kulkarni 		segs = p_mngr->conn_cfg[type].tid_seg;
42214b24e2bSVaishali Kulkarni 		/* for each segment there is at most one
42314b24e2bSVaishali Kulkarni 		 * protocol for which count is not 0.
42414b24e2bSVaishali Kulkarni 		 */
42514b24e2bSVaishali Kulkarni 		for (j = 0; j < NUM_TASK_PF_SEGMENTS; j++)
42614b24e2bSVaishali Kulkarni 			iids->tids += segs[j].count;
42714b24e2bSVaishali Kulkarni 
42814b24e2bSVaishali Kulkarni 		/* The last array elelment is for the VFs. As for PF
42914b24e2bSVaishali Kulkarni 		 * segments there can be only one protocol for
43014b24e2bSVaishali Kulkarni 		 * which this value is not 0.
43114b24e2bSVaishali Kulkarni 		 */
43214b24e2bSVaishali Kulkarni 		vf_tids += segs[NUM_TASK_PF_SEGMENTS].count;
43314b24e2bSVaishali Kulkarni 	}
43414b24e2bSVaishali Kulkarni 
43514b24e2bSVaishali Kulkarni 	iids->vf_cids += vf_cids * p_mngr->vf_count;
43614b24e2bSVaishali Kulkarni 	iids->tids += vf_tids * p_mngr->vf_count;
43714b24e2bSVaishali Kulkarni 
43814b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
43914b24e2bSVaishali Kulkarni 		   "iids: CIDS %08x vf_cids %08x tids %08x vf_tids %08x\n",
44014b24e2bSVaishali Kulkarni 		   iids->cids, iids->vf_cids, iids->tids, vf_tids);
44114b24e2bSVaishali Kulkarni }
44214b24e2bSVaishali Kulkarni 
ecore_cxt_tid_seg_info(struct ecore_hwfn * p_hwfn,u32 seg)44314b24e2bSVaishali Kulkarni static struct ecore_tid_seg *ecore_cxt_tid_seg_info(struct ecore_hwfn   *p_hwfn,
44414b24e2bSVaishali Kulkarni 						    u32			seg)
44514b24e2bSVaishali Kulkarni {
44614b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_cfg = p_hwfn->p_cxt_mngr;
44714b24e2bSVaishali Kulkarni 	u32 i;
44814b24e2bSVaishali Kulkarni 
44914b24e2bSVaishali Kulkarni 	/* Find the protocol with tid count > 0 for this segment.
45014b24e2bSVaishali Kulkarni 	   Note: there can only be one and this is already validated.
45114b24e2bSVaishali Kulkarni 	 */
45214b24e2bSVaishali Kulkarni 	for (i = 0; i < MAX_CONN_TYPES; i++) {
45314b24e2bSVaishali Kulkarni 		if (p_cfg->conn_cfg[i].tid_seg[seg].count)
45414b24e2bSVaishali Kulkarni 			return &p_cfg->conn_cfg[i].tid_seg[seg];
45514b24e2bSVaishali Kulkarni 	}
45614b24e2bSVaishali Kulkarni 	return OSAL_NULL;
45714b24e2bSVaishali Kulkarni }
45814b24e2bSVaishali Kulkarni 
45914b24e2bSVaishali Kulkarni /* 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)46014b24e2bSVaishali Kulkarni static void ecore_cxt_set_proto_cid_count(struct ecore_hwfn *p_hwfn,
46114b24e2bSVaishali Kulkarni 					  enum protocol_type type,
46214b24e2bSVaishali Kulkarni 					  u32 cid_count, u32 vf_cid_cnt)
46314b24e2bSVaishali Kulkarni {
46414b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mgr = p_hwfn->p_cxt_mngr;
46514b24e2bSVaishali Kulkarni 	struct ecore_conn_type_cfg *p_conn = &p_mgr->conn_cfg[type];
46614b24e2bSVaishali Kulkarni 
46714b24e2bSVaishali Kulkarni 	p_conn->cid_count = ROUNDUP(cid_count, DQ_RANGE_ALIGN);
46814b24e2bSVaishali Kulkarni 	p_conn->cids_per_vf = ROUNDUP(vf_cid_cnt, DQ_RANGE_ALIGN);
46914b24e2bSVaishali Kulkarni 
47014b24e2bSVaishali Kulkarni 	if (type == PROTOCOLID_ROCE) {
47114b24e2bSVaishali Kulkarni 		u32 page_sz = p_mgr->clients[ILT_CLI_CDUC].p_size.val;
47214b24e2bSVaishali Kulkarni 		u32 cxt_size = CONN_CXT_SIZE(p_hwfn);
47314b24e2bSVaishali Kulkarni 		u32 elems_per_page = ILT_PAGE_IN_BYTES(page_sz) / cxt_size;
47414b24e2bSVaishali Kulkarni 		u32 align = elems_per_page * DQ_RANGE_ALIGN;
47514b24e2bSVaishali Kulkarni 
47614b24e2bSVaishali Kulkarni 		p_conn->cid_count = ROUNDUP(p_conn->cid_count, align);
47714b24e2bSVaishali Kulkarni 	}
47814b24e2bSVaishali Kulkarni }
47914b24e2bSVaishali Kulkarni 
ecore_cxt_get_proto_cid_count(struct ecore_hwfn * p_hwfn,enum protocol_type type,u32 * vf_cid)48014b24e2bSVaishali Kulkarni u32 ecore_cxt_get_proto_cid_count(struct ecore_hwfn	*p_hwfn,
48114b24e2bSVaishali Kulkarni 				  enum protocol_type	type,
48214b24e2bSVaishali Kulkarni 				  u32			*vf_cid)
48314b24e2bSVaishali Kulkarni {
48414b24e2bSVaishali Kulkarni 	if (vf_cid)
48514b24e2bSVaishali Kulkarni 		*vf_cid = p_hwfn->p_cxt_mngr->conn_cfg[type].cids_per_vf;
48614b24e2bSVaishali Kulkarni 
48714b24e2bSVaishali Kulkarni 	return p_hwfn->p_cxt_mngr->conn_cfg[type].cid_count;
48814b24e2bSVaishali Kulkarni }
48914b24e2bSVaishali Kulkarni 
ecore_cxt_get_proto_cid_start(struct ecore_hwfn * p_hwfn,enum protocol_type type)49014b24e2bSVaishali Kulkarni u32 ecore_cxt_get_proto_cid_start(struct ecore_hwfn	*p_hwfn,
49114b24e2bSVaishali Kulkarni 				  enum protocol_type	type)
49214b24e2bSVaishali Kulkarni {
49314b24e2bSVaishali Kulkarni 	return p_hwfn->p_cxt_mngr->acquired[type].start_cid;
49414b24e2bSVaishali Kulkarni }
49514b24e2bSVaishali Kulkarni 
ecore_cxt_get_proto_tid_count(struct ecore_hwfn * p_hwfn,enum protocol_type type)49614b24e2bSVaishali Kulkarni u32 ecore_cxt_get_proto_tid_count(struct ecore_hwfn *p_hwfn,
49714b24e2bSVaishali Kulkarni 				  enum protocol_type type)
49814b24e2bSVaishali Kulkarni {
49914b24e2bSVaishali Kulkarni 	u32 cnt = 0;
50014b24e2bSVaishali Kulkarni 	int i;
50114b24e2bSVaishali Kulkarni 
50214b24e2bSVaishali Kulkarni 	for (i = 0; i < TASK_SEGMENTS; i++)
50314b24e2bSVaishali Kulkarni 		cnt += p_hwfn->p_cxt_mngr->conn_cfg[type].tid_seg[i].count;
50414b24e2bSVaishali Kulkarni 
50514b24e2bSVaishali Kulkarni 	return cnt;
50614b24e2bSVaishali Kulkarni }
50714b24e2bSVaishali Kulkarni 
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)50814b24e2bSVaishali Kulkarni static void ecore_cxt_set_proto_tid_count(struct ecore_hwfn *p_hwfn,
50914b24e2bSVaishali Kulkarni 					  enum protocol_type proto,
51014b24e2bSVaishali Kulkarni 					  u8 seg,
51114b24e2bSVaishali Kulkarni 					  u8 seg_type,
51214b24e2bSVaishali Kulkarni 					  u32 count,
51314b24e2bSVaishali Kulkarni 					  bool has_fl)
51414b24e2bSVaishali Kulkarni {
51514b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
51614b24e2bSVaishali Kulkarni 	struct ecore_tid_seg *p_seg = &p_mngr->conn_cfg[proto].tid_seg[seg];
51714b24e2bSVaishali Kulkarni 
51814b24e2bSVaishali Kulkarni 	p_seg->count = count;
51914b24e2bSVaishali Kulkarni 	p_seg->has_fl_mem = has_fl;
52014b24e2bSVaishali Kulkarni 	p_seg->type = seg_type;
52114b24e2bSVaishali Kulkarni }
52214b24e2bSVaishali Kulkarni 
52314b24e2bSVaishali Kulkarni /* the *p_line parameter must be either 0 for the first invocation or the
52414b24e2bSVaishali Kulkarni    value returned in the previous invocation.
52514b24e2bSVaishali Kulkarni  */
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)52614b24e2bSVaishali Kulkarni static void ecore_ilt_cli_blk_fill(struct ecore_ilt_client_cfg	*p_cli,
52714b24e2bSVaishali Kulkarni 				   struct ecore_ilt_cli_blk	*p_blk,
52814b24e2bSVaishali Kulkarni 				   u32				start_line,
52914b24e2bSVaishali Kulkarni 				   u32				total_size,
53014b24e2bSVaishali Kulkarni 				   u32				elem_size)
53114b24e2bSVaishali Kulkarni {
53214b24e2bSVaishali Kulkarni 	u32 ilt_size = ILT_PAGE_IN_BYTES(p_cli->p_size.val);
53314b24e2bSVaishali Kulkarni 
53414b24e2bSVaishali Kulkarni 	/* verify that it's called once for each block */
53514b24e2bSVaishali Kulkarni 	if (p_blk->total_size)
53614b24e2bSVaishali Kulkarni 		return;
53714b24e2bSVaishali Kulkarni 
53814b24e2bSVaishali Kulkarni 	p_blk->total_size = total_size;
53914b24e2bSVaishali Kulkarni 	p_blk->real_size_in_page = 0;
54014b24e2bSVaishali Kulkarni 	if (elem_size)
54114b24e2bSVaishali Kulkarni 		p_blk->real_size_in_page = (ilt_size / elem_size) * elem_size;
54214b24e2bSVaishali Kulkarni 	p_blk->start_line = start_line;
54314b24e2bSVaishali Kulkarni }
54414b24e2bSVaishali Kulkarni 
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)54514b24e2bSVaishali Kulkarni static void ecore_ilt_cli_adv_line(struct ecore_hwfn		*p_hwfn,
54614b24e2bSVaishali Kulkarni 				    struct ecore_ilt_client_cfg	*p_cli,
54714b24e2bSVaishali Kulkarni 				    struct ecore_ilt_cli_blk	*p_blk,
54814b24e2bSVaishali Kulkarni 				    u32				*p_line,
54914b24e2bSVaishali Kulkarni 				    enum ilt_clients		client_id)
55014b24e2bSVaishali Kulkarni {
55114b24e2bSVaishali Kulkarni 	if (!p_blk->total_size)
55214b24e2bSVaishali Kulkarni 		return;
55314b24e2bSVaishali Kulkarni 
55414b24e2bSVaishali Kulkarni 	if (!p_cli->active)
55514b24e2bSVaishali Kulkarni 		p_cli->first.val = *p_line;
55614b24e2bSVaishali Kulkarni 
55714b24e2bSVaishali Kulkarni 	p_cli->active = true;
55814b24e2bSVaishali Kulkarni 	*p_line += DIV_ROUND_UP(p_blk->total_size, p_blk->real_size_in_page);
55914b24e2bSVaishali Kulkarni 	p_cli->last.val = *p_line-1;
56014b24e2bSVaishali Kulkarni 
56114b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
56214b24e2bSVaishali Kulkarni 		   "ILT[Client %d] - Lines: [%08x - %08x]. Block - Size %08x [Real %08x] Start line %d\n",
56314b24e2bSVaishali Kulkarni 		   client_id, p_cli->first.val, p_cli->last.val,
56414b24e2bSVaishali Kulkarni 		   p_blk->total_size, p_blk->real_size_in_page,
56514b24e2bSVaishali Kulkarni 		   p_blk->start_line);
56614b24e2bSVaishali Kulkarni }
56714b24e2bSVaishali Kulkarni 
ecore_ilt_get_dynamic_line_cnt(struct ecore_hwfn * p_hwfn,enum ilt_clients ilt_client)56814b24e2bSVaishali Kulkarni static u32 ecore_ilt_get_dynamic_line_cnt(struct ecore_hwfn *p_hwfn,
56914b24e2bSVaishali Kulkarni 					  enum ilt_clients ilt_client)
57014b24e2bSVaishali Kulkarni {
57114b24e2bSVaishali Kulkarni 	u32 cid_count = p_hwfn->p_cxt_mngr->conn_cfg[PROTOCOLID_ROCE].cid_count;
57214b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *p_cli;
57314b24e2bSVaishali Kulkarni 	u32 lines_to_skip = 0;
57414b24e2bSVaishali Kulkarni 	u32 cxts_per_p;
57514b24e2bSVaishali Kulkarni 
57614b24e2bSVaishali Kulkarni 	/* TBD MK: ILT code should be simplified once PROTO enum is changed */
57714b24e2bSVaishali Kulkarni 
57814b24e2bSVaishali Kulkarni 	if (ilt_client == ILT_CLI_CDUC) {
57914b24e2bSVaishali Kulkarni 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC];
58014b24e2bSVaishali Kulkarni 
58114b24e2bSVaishali Kulkarni 		cxts_per_p = ILT_PAGE_IN_BYTES(p_cli->p_size.val) /
58214b24e2bSVaishali Kulkarni 			     (u32)CONN_CXT_SIZE(p_hwfn);
58314b24e2bSVaishali Kulkarni 
58414b24e2bSVaishali Kulkarni 		lines_to_skip = cid_count / cxts_per_p;
58514b24e2bSVaishali Kulkarni 	}
58614b24e2bSVaishali Kulkarni 
58714b24e2bSVaishali Kulkarni 	return lines_to_skip;
58814b24e2bSVaishali Kulkarni }
58914b24e2bSVaishali Kulkarni 
59014b24e2bSVaishali Kulkarni static struct ecore_ilt_client_cfg *
ecore_cxt_set_cli(struct ecore_ilt_client_cfg * p_cli)59114b24e2bSVaishali Kulkarni ecore_cxt_set_cli(struct ecore_ilt_client_cfg *p_cli)
59214b24e2bSVaishali Kulkarni {
59314b24e2bSVaishali Kulkarni 	p_cli->active = false;
59414b24e2bSVaishali Kulkarni 	p_cli->first.val = 0;
59514b24e2bSVaishali Kulkarni 	p_cli->last.val = 0;
59614b24e2bSVaishali Kulkarni 	return p_cli;
59714b24e2bSVaishali Kulkarni }
59814b24e2bSVaishali Kulkarni 
59914b24e2bSVaishali Kulkarni static struct ecore_ilt_cli_blk *
ecore_cxt_set_blk(struct ecore_ilt_cli_blk * p_blk)60014b24e2bSVaishali Kulkarni ecore_cxt_set_blk(struct ecore_ilt_cli_blk *p_blk)
60114b24e2bSVaishali Kulkarni {
60214b24e2bSVaishali Kulkarni 	p_blk->total_size = 0;
60314b24e2bSVaishali Kulkarni 	return p_blk;
60414b24e2bSVaishali Kulkarni }
60514b24e2bSVaishali Kulkarni 
ecore_cxt_cfg_ilt_compute(struct ecore_hwfn * p_hwfn,u32 * line_count)60614b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_cxt_cfg_ilt_compute(struct ecore_hwfn *p_hwfn,
60714b24e2bSVaishali Kulkarni 					       u32 *line_count)
60814b24e2bSVaishali Kulkarni {
60914b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
61014b24e2bSVaishali Kulkarni 	u32 curr_line, total, i, task_size, line;
61114b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *p_cli;
61214b24e2bSVaishali Kulkarni 	struct ecore_ilt_cli_blk *p_blk;
61314b24e2bSVaishali Kulkarni 	struct ecore_cdu_iids cdu_iids;
61414b24e2bSVaishali Kulkarni 	struct ecore_src_iids src_iids;
61514b24e2bSVaishali Kulkarni 	struct ecore_qm_iids qm_iids;
61614b24e2bSVaishali Kulkarni 	struct ecore_tm_iids tm_iids;
61714b24e2bSVaishali Kulkarni 	struct ecore_tid_seg *p_seg;
61814b24e2bSVaishali Kulkarni 
61914b24e2bSVaishali Kulkarni 	OSAL_MEM_ZERO(&qm_iids, sizeof(qm_iids));
62014b24e2bSVaishali Kulkarni 	OSAL_MEM_ZERO(&cdu_iids, sizeof(cdu_iids));
62114b24e2bSVaishali Kulkarni 	OSAL_MEM_ZERO(&src_iids, sizeof(src_iids));
62214b24e2bSVaishali Kulkarni 	OSAL_MEM_ZERO(&tm_iids, sizeof(tm_iids));
62314b24e2bSVaishali Kulkarni 
62414b24e2bSVaishali Kulkarni 	p_mngr->pf_start_line = RESC_START(p_hwfn, ECORE_ILT);
62514b24e2bSVaishali Kulkarni 
62614b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
62714b24e2bSVaishali Kulkarni 		   "hwfn [%d] - Set context manager starting line to be 0x%08x\n",
62814b24e2bSVaishali Kulkarni 		   p_hwfn->my_id, p_hwfn->p_cxt_mngr->pf_start_line);
62914b24e2bSVaishali Kulkarni 
63014b24e2bSVaishali Kulkarni 	/* CDUC */
63114b24e2bSVaishali Kulkarni 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_CDUC]);
63214b24e2bSVaishali Kulkarni 
63314b24e2bSVaishali Kulkarni 	curr_line = p_mngr->pf_start_line;
63414b24e2bSVaishali Kulkarni 
63514b24e2bSVaishali Kulkarni 	/* CDUC PF */
63614b24e2bSVaishali Kulkarni 	p_cli->pf_total_lines = 0;
63714b24e2bSVaishali Kulkarni 
63814b24e2bSVaishali Kulkarni 	/* get the counters for the CDUC,CDUC and QM clients  */
63914b24e2bSVaishali Kulkarni 	ecore_cxt_cdu_iids(p_mngr, &cdu_iids);
64014b24e2bSVaishali Kulkarni 
64114b24e2bSVaishali Kulkarni 	p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[CDUC_BLK]);
64214b24e2bSVaishali Kulkarni 
64314b24e2bSVaishali Kulkarni 	total = cdu_iids.pf_cids * CONN_CXT_SIZE(p_hwfn);
64414b24e2bSVaishali Kulkarni 
64514b24e2bSVaishali Kulkarni 	ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
64614b24e2bSVaishali Kulkarni 			       total, CONN_CXT_SIZE(p_hwfn));
64714b24e2bSVaishali Kulkarni 
64814b24e2bSVaishali Kulkarni 	ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line, ILT_CLI_CDUC);
64914b24e2bSVaishali Kulkarni 	p_cli->pf_total_lines = curr_line - p_blk->start_line;
65014b24e2bSVaishali Kulkarni 
65114b24e2bSVaishali Kulkarni 	p_blk->dynamic_line_cnt = ecore_ilt_get_dynamic_line_cnt(p_hwfn,
65214b24e2bSVaishali Kulkarni 								 ILT_CLI_CDUC);
65314b24e2bSVaishali Kulkarni 
65414b24e2bSVaishali Kulkarni 	/* CDUC VF */
65514b24e2bSVaishali Kulkarni 	p_blk = ecore_cxt_set_blk(&p_cli->vf_blks[CDUC_BLK]);
65614b24e2bSVaishali Kulkarni 	total = cdu_iids.per_vf_cids * CONN_CXT_SIZE(p_hwfn);
65714b24e2bSVaishali Kulkarni 
65814b24e2bSVaishali Kulkarni 	ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
65914b24e2bSVaishali Kulkarni 			       total, CONN_CXT_SIZE(p_hwfn));
66014b24e2bSVaishali Kulkarni 
66114b24e2bSVaishali Kulkarni 	ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line, ILT_CLI_CDUC);
66214b24e2bSVaishali Kulkarni 	p_cli->vf_total_lines = curr_line - p_blk->start_line;
66314b24e2bSVaishali Kulkarni 
66414b24e2bSVaishali Kulkarni 	for (i = 1; i < p_mngr->vf_count; i++)
66514b24e2bSVaishali Kulkarni 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
66614b24e2bSVaishali Kulkarni 				       ILT_CLI_CDUC);
66714b24e2bSVaishali Kulkarni 
66814b24e2bSVaishali Kulkarni 	/* CDUT PF */
66914b24e2bSVaishali Kulkarni 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_CDUT]);
67014b24e2bSVaishali Kulkarni 	p_cli->first.val = curr_line;
67114b24e2bSVaishali Kulkarni 
67214b24e2bSVaishali Kulkarni 	/* first the 'working' task memory */
67314b24e2bSVaishali Kulkarni 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
67414b24e2bSVaishali Kulkarni 		p_seg = ecore_cxt_tid_seg_info(p_hwfn, i);
67514b24e2bSVaishali Kulkarni 		if (!p_seg || p_seg->count == 0)
67614b24e2bSVaishali Kulkarni 			continue;
67714b24e2bSVaishali Kulkarni 
67814b24e2bSVaishali Kulkarni 		p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[CDUT_SEG_BLK(i)]);
67914b24e2bSVaishali Kulkarni 		total = p_seg->count * p_mngr->task_type_size[p_seg->type];
68014b24e2bSVaishali Kulkarni 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line, total,
68114b24e2bSVaishali Kulkarni 				       p_mngr->task_type_size[p_seg->type]);
68214b24e2bSVaishali Kulkarni 
68314b24e2bSVaishali Kulkarni 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
68414b24e2bSVaishali Kulkarni 				       ILT_CLI_CDUT);
68514b24e2bSVaishali Kulkarni 	}
68614b24e2bSVaishali Kulkarni 
68714b24e2bSVaishali Kulkarni 	/* next the 'init' task memory (forced load memory) */
68814b24e2bSVaishali Kulkarni 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
68914b24e2bSVaishali Kulkarni 		p_seg = ecore_cxt_tid_seg_info(p_hwfn, i);
69014b24e2bSVaishali Kulkarni 		if (!p_seg || p_seg->count == 0)
69114b24e2bSVaishali Kulkarni 			continue;
69214b24e2bSVaishali Kulkarni 
69314b24e2bSVaishali Kulkarni 		p_blk = ecore_cxt_set_blk(
69414b24e2bSVaishali Kulkarni 				&p_cli->pf_blks[CDUT_FL_SEG_BLK(i, PF)]);
69514b24e2bSVaishali Kulkarni 
69614b24e2bSVaishali Kulkarni 		if (!p_seg->has_fl_mem) {
69714b24e2bSVaishali Kulkarni 			/* The segment is active (total size pf 'working'
69814b24e2bSVaishali Kulkarni 			 * memory is > 0) but has no FL (forced-load, Init)
69914b24e2bSVaishali Kulkarni 			 * memory. Thus:
70014b24e2bSVaishali Kulkarni 			 *
70114b24e2bSVaishali Kulkarni 			 * 1.   The total-size in the corrsponding FL block of
70214b24e2bSVaishali Kulkarni 			 *      the ILT client is set to 0 - No ILT line are
70314b24e2bSVaishali Kulkarni 			 *      provisioned and no ILT memory allocated.
70414b24e2bSVaishali Kulkarni 			 *
70514b24e2bSVaishali Kulkarni 			 * 2.   The start-line of said block is set to the
70614b24e2bSVaishali Kulkarni 			 *      start line of the matching working memory
70714b24e2bSVaishali Kulkarni 			 *      block in the ILT client. This is later used to
70814b24e2bSVaishali Kulkarni 			 *      configure the CDU segment offset registers and
70914b24e2bSVaishali Kulkarni 			 *      results in an FL command for TIDs of this
71014b24e2bSVaishali Kulkarni 			 *      segement behaves as regular load commands
71114b24e2bSVaishali Kulkarni 			 *      (loading TIDs from the working memory).
71214b24e2bSVaishali Kulkarni 			 */
71314b24e2bSVaishali Kulkarni 			line = p_cli->pf_blks[CDUT_SEG_BLK(i)].start_line;
71414b24e2bSVaishali Kulkarni 
71514b24e2bSVaishali Kulkarni 			ecore_ilt_cli_blk_fill(p_cli, p_blk, line, 0, 0);
71614b24e2bSVaishali Kulkarni 			continue;
71714b24e2bSVaishali Kulkarni 		}
71814b24e2bSVaishali Kulkarni 		total = p_seg->count * p_mngr->task_type_size[p_seg->type];
71914b24e2bSVaishali Kulkarni 
72014b24e2bSVaishali Kulkarni 		ecore_ilt_cli_blk_fill(p_cli, p_blk,
72114b24e2bSVaishali Kulkarni 				       curr_line, total,
72214b24e2bSVaishali Kulkarni 				       p_mngr->task_type_size[p_seg->type]);
72314b24e2bSVaishali Kulkarni 
72414b24e2bSVaishali Kulkarni 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
72514b24e2bSVaishali Kulkarni 				       ILT_CLI_CDUT);
72614b24e2bSVaishali Kulkarni 	}
72714b24e2bSVaishali Kulkarni 	p_cli->pf_total_lines = curr_line - p_cli->pf_blks[0].start_line;
72814b24e2bSVaishali Kulkarni 
72914b24e2bSVaishali Kulkarni 	/* CDUT VF */
73014b24e2bSVaishali Kulkarni 	p_seg = ecore_cxt_tid_seg_info(p_hwfn, TASK_SEGMENT_VF);
73114b24e2bSVaishali Kulkarni 	if (p_seg && p_seg->count) {
73214b24e2bSVaishali Kulkarni 		/* Stricly speaking we need to iterate over all VF
73314b24e2bSVaishali Kulkarni 		 * task segment types, but a VF has only 1 segment
73414b24e2bSVaishali Kulkarni 		 */
73514b24e2bSVaishali Kulkarni 
73614b24e2bSVaishali Kulkarni 		/* 'working' memory */
73714b24e2bSVaishali Kulkarni 		total = p_seg->count * p_mngr->task_type_size[p_seg->type];
73814b24e2bSVaishali Kulkarni 
73914b24e2bSVaishali Kulkarni 		p_blk = ecore_cxt_set_blk(&p_cli->vf_blks[CDUT_SEG_BLK(0)]);
74014b24e2bSVaishali Kulkarni 		ecore_ilt_cli_blk_fill(p_cli, p_blk,
74114b24e2bSVaishali Kulkarni 				       curr_line, total,
74214b24e2bSVaishali Kulkarni 				       p_mngr->task_type_size[p_seg->type]);
74314b24e2bSVaishali Kulkarni 
74414b24e2bSVaishali Kulkarni 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
74514b24e2bSVaishali Kulkarni 				       ILT_CLI_CDUT);
74614b24e2bSVaishali Kulkarni 
74714b24e2bSVaishali Kulkarni 		/* 'init' memory */
74814b24e2bSVaishali Kulkarni 		p_blk = ecore_cxt_set_blk(
74914b24e2bSVaishali Kulkarni 				&p_cli->vf_blks[CDUT_FL_SEG_BLK(0, VF)]);
75014b24e2bSVaishali Kulkarni 		if (!p_seg->has_fl_mem) {
75114b24e2bSVaishali Kulkarni 			/* see comment above */
75214b24e2bSVaishali Kulkarni 			line = p_cli->vf_blks[CDUT_SEG_BLK(0)].start_line;
75314b24e2bSVaishali Kulkarni 			ecore_ilt_cli_blk_fill(p_cli, p_blk, line, 0, 0);
75414b24e2bSVaishali Kulkarni 		} else {
75514b24e2bSVaishali Kulkarni 			task_size = p_mngr->task_type_size[p_seg->type];
75614b24e2bSVaishali Kulkarni 			ecore_ilt_cli_blk_fill(p_cli, p_blk,
75714b24e2bSVaishali Kulkarni 					       curr_line, total,
75814b24e2bSVaishali Kulkarni 					       task_size);
75914b24e2bSVaishali Kulkarni 			ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
76014b24e2bSVaishali Kulkarni 					       ILT_CLI_CDUT);
76114b24e2bSVaishali Kulkarni 		}
76214b24e2bSVaishali Kulkarni 		p_cli->vf_total_lines = curr_line -
76314b24e2bSVaishali Kulkarni 					p_cli->vf_blks[0].start_line;
76414b24e2bSVaishali Kulkarni 
76514b24e2bSVaishali Kulkarni 		/* Now for the rest of the VFs */
76614b24e2bSVaishali Kulkarni 		for (i = 1; i < p_mngr->vf_count; i++) {
76714b24e2bSVaishali Kulkarni 			/* don't set p_blk i.e. don't clear total_size */
76814b24e2bSVaishali Kulkarni 			p_blk = &p_cli->vf_blks[CDUT_SEG_BLK(0)];
76914b24e2bSVaishali Kulkarni 			ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
77014b24e2bSVaishali Kulkarni 					       ILT_CLI_CDUT);
77114b24e2bSVaishali Kulkarni 
77214b24e2bSVaishali Kulkarni 			/* don't set p_blk i.e. don't clear total_size */
77314b24e2bSVaishali Kulkarni 			p_blk = &p_cli->vf_blks[CDUT_FL_SEG_BLK(0, VF)];
77414b24e2bSVaishali Kulkarni 			ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
77514b24e2bSVaishali Kulkarni 					       ILT_CLI_CDUT);
77614b24e2bSVaishali Kulkarni 		}
77714b24e2bSVaishali Kulkarni 	}
77814b24e2bSVaishali Kulkarni 
77914b24e2bSVaishali Kulkarni 	/* QM */
78014b24e2bSVaishali Kulkarni 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_QM]);
78114b24e2bSVaishali Kulkarni 	p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[0]);
78214b24e2bSVaishali Kulkarni 
78314b24e2bSVaishali Kulkarni 	ecore_cxt_qm_iids(p_hwfn, &qm_iids);
78414b24e2bSVaishali Kulkarni 	total = ecore_qm_pf_mem_size(p_hwfn->rel_pf_id, qm_iids.cids,
78514b24e2bSVaishali Kulkarni 				     qm_iids.vf_cids, qm_iids.tids,
78614b24e2bSVaishali Kulkarni 				     p_hwfn->qm_info.num_pqs,
78714b24e2bSVaishali Kulkarni 				     p_hwfn->qm_info.num_vf_pqs);
78814b24e2bSVaishali Kulkarni 
78914b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
79014b24e2bSVaishali Kulkarni 		   "QM ILT Info, (cids=%d, vf_cids=%d, tids=%d, num_pqs=%d, num_vf_pqs=%d, memory_size=%d)\n",
79114b24e2bSVaishali Kulkarni 		   qm_iids.cids, qm_iids.vf_cids, qm_iids.tids,
79214b24e2bSVaishali Kulkarni 		   p_hwfn->qm_info.num_pqs, p_hwfn->qm_info.num_vf_pqs, total);
79314b24e2bSVaishali Kulkarni 
79414b24e2bSVaishali Kulkarni 	ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line, total * 0x1000,
79514b24e2bSVaishali Kulkarni 			       QM_PQ_ELEMENT_SIZE);
79614b24e2bSVaishali Kulkarni 
79714b24e2bSVaishali Kulkarni 	ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line, ILT_CLI_QM);
79814b24e2bSVaishali Kulkarni 	p_cli->pf_total_lines = curr_line - p_blk->start_line;
79914b24e2bSVaishali Kulkarni 
80014b24e2bSVaishali Kulkarni 	/* SRC */
80114b24e2bSVaishali Kulkarni 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_SRC]);
80214b24e2bSVaishali Kulkarni 	ecore_cxt_src_iids(p_hwfn, p_mngr, &src_iids);
80314b24e2bSVaishali Kulkarni 
80414b24e2bSVaishali Kulkarni 	/* Both the PF and VFs searcher connections are stored in the per PF
80514b24e2bSVaishali Kulkarni 	 * database. Thus sum the PF searcher cids and all the VFs searcher
80614b24e2bSVaishali Kulkarni 	 * cids.
80714b24e2bSVaishali Kulkarni 	 */
80814b24e2bSVaishali Kulkarni 	total = src_iids.pf_cids + src_iids.per_vf_cids * p_mngr->vf_count;
80914b24e2bSVaishali Kulkarni 	if (total) {
81014b24e2bSVaishali Kulkarni 		u32 local_max = OSAL_MAX_T(u32, total,
81114b24e2bSVaishali Kulkarni 					   SRC_MIN_NUM_ELEMS);
81214b24e2bSVaishali Kulkarni 
81314b24e2bSVaishali Kulkarni 		total = OSAL_ROUNDUP_POW_OF_TWO(local_max);
81414b24e2bSVaishali Kulkarni 
81514b24e2bSVaishali Kulkarni 		p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[0]);
81614b24e2bSVaishali Kulkarni 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
81714b24e2bSVaishali Kulkarni 				       total * sizeof(struct src_ent),
81814b24e2bSVaishali Kulkarni 				       sizeof(struct src_ent));
81914b24e2bSVaishali Kulkarni 
82014b24e2bSVaishali Kulkarni 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
82114b24e2bSVaishali Kulkarni 				       ILT_CLI_SRC);
82214b24e2bSVaishali Kulkarni 		p_cli->pf_total_lines = curr_line - p_blk->start_line;
82314b24e2bSVaishali Kulkarni 	}
82414b24e2bSVaishali Kulkarni 
82514b24e2bSVaishali Kulkarni 	/* TM PF */
82614b24e2bSVaishali Kulkarni 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_TM]);
82714b24e2bSVaishali Kulkarni 	ecore_cxt_tm_iids(p_hwfn, p_mngr, &tm_iids);
82814b24e2bSVaishali Kulkarni 	total = tm_iids.pf_cids + tm_iids.pf_tids_total;
82914b24e2bSVaishali Kulkarni 	if (total) {
83014b24e2bSVaishali Kulkarni 		p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[0]);
83114b24e2bSVaishali Kulkarni 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
83214b24e2bSVaishali Kulkarni 				       total * TM_ELEM_SIZE,
83314b24e2bSVaishali Kulkarni 				       TM_ELEM_SIZE);
83414b24e2bSVaishali Kulkarni 
83514b24e2bSVaishali Kulkarni 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
83614b24e2bSVaishali Kulkarni 				       ILT_CLI_TM);
83714b24e2bSVaishali Kulkarni 		p_cli->pf_total_lines = curr_line - p_blk->start_line;
83814b24e2bSVaishali Kulkarni 	}
83914b24e2bSVaishali Kulkarni 
84014b24e2bSVaishali Kulkarni 	/* TM VF */
84114b24e2bSVaishali Kulkarni 	total = tm_iids.per_vf_cids + tm_iids.per_vf_tids;
84214b24e2bSVaishali Kulkarni 	if (total) {
84314b24e2bSVaishali Kulkarni 		p_blk = ecore_cxt_set_blk(&p_cli->vf_blks[0]);
84414b24e2bSVaishali Kulkarni 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
84514b24e2bSVaishali Kulkarni 				       total * TM_ELEM_SIZE,
84614b24e2bSVaishali Kulkarni 				       TM_ELEM_SIZE);
84714b24e2bSVaishali Kulkarni 
84814b24e2bSVaishali Kulkarni 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
84914b24e2bSVaishali Kulkarni 				       ILT_CLI_TM);
85014b24e2bSVaishali Kulkarni 
85114b24e2bSVaishali Kulkarni 		p_cli->vf_total_lines = curr_line - p_blk->start_line;
85214b24e2bSVaishali Kulkarni 		for (i = 1; i < p_mngr->vf_count; i++) {
85314b24e2bSVaishali Kulkarni 			ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
85414b24e2bSVaishali Kulkarni 					       ILT_CLI_TM);
85514b24e2bSVaishali Kulkarni 		}
85614b24e2bSVaishali Kulkarni 	}
85714b24e2bSVaishali Kulkarni 
85814b24e2bSVaishali Kulkarni 	/* TSDM (SRQ CONTEXT) */
85914b24e2bSVaishali Kulkarni 	total = ecore_cxt_get_srq_count(p_hwfn);
86014b24e2bSVaishali Kulkarni 
86114b24e2bSVaishali Kulkarni 	if (total) {
86214b24e2bSVaishali Kulkarni 		p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_TSDM]);
86314b24e2bSVaishali Kulkarni 		p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[SRQ_BLK]);
86414b24e2bSVaishali Kulkarni 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
86514b24e2bSVaishali Kulkarni 				       total * SRQ_CXT_SIZE, SRQ_CXT_SIZE);
86614b24e2bSVaishali Kulkarni 
86714b24e2bSVaishali Kulkarni 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
86814b24e2bSVaishali Kulkarni 				       ILT_CLI_TSDM);
86914b24e2bSVaishali Kulkarni 		p_cli->pf_total_lines = curr_line - p_blk->start_line;
87014b24e2bSVaishali Kulkarni 	}
87114b24e2bSVaishali Kulkarni 
87214b24e2bSVaishali Kulkarni 	*line_count = curr_line - p_hwfn->p_cxt_mngr->pf_start_line;
87314b24e2bSVaishali Kulkarni 
87414b24e2bSVaishali Kulkarni 	if (curr_line - p_hwfn->p_cxt_mngr->pf_start_line >
87514b24e2bSVaishali Kulkarni 	    RESC_NUM(p_hwfn, ECORE_ILT)) {
87614b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
87714b24e2bSVaishali Kulkarni 	}
87814b24e2bSVaishali Kulkarni 
87914b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
88014b24e2bSVaishali Kulkarni }
88114b24e2bSVaishali Kulkarni 
ecore_cxt_cfg_ilt_compute_excess(struct ecore_hwfn * p_hwfn,u32 used_lines)88214b24e2bSVaishali Kulkarni u32 ecore_cxt_cfg_ilt_compute_excess(struct ecore_hwfn *p_hwfn, u32 used_lines)
88314b24e2bSVaishali Kulkarni {
88414b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *p_cli;
88514b24e2bSVaishali Kulkarni 	u32 excess_lines, available_lines;
88614b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr;
88714b24e2bSVaishali Kulkarni 	u32 ilt_page_size, elem_size;
88814b24e2bSVaishali Kulkarni 	struct ecore_tid_seg *p_seg;
88914b24e2bSVaishali Kulkarni 	int i;
89014b24e2bSVaishali Kulkarni 
89114b24e2bSVaishali Kulkarni 	available_lines = RESC_NUM(p_hwfn, ECORE_ILT);
89214b24e2bSVaishali Kulkarni 	excess_lines = used_lines - available_lines;
89314b24e2bSVaishali Kulkarni 
89414b24e2bSVaishali Kulkarni 	if (!excess_lines)
89514b24e2bSVaishali Kulkarni 		return 0;
89614b24e2bSVaishali Kulkarni 
89714b24e2bSVaishali Kulkarni 	if (!ECORE_IS_RDMA_PERSONALITY(p_hwfn))
89814b24e2bSVaishali Kulkarni 		return 0;
89914b24e2bSVaishali Kulkarni 
90014b24e2bSVaishali Kulkarni 	p_mngr = p_hwfn->p_cxt_mngr;
90114b24e2bSVaishali Kulkarni 	p_cli = &p_mngr->clients[ILT_CLI_CDUT];
90214b24e2bSVaishali Kulkarni 	ilt_page_size = ILT_PAGE_IN_BYTES(p_cli->p_size.val);
90314b24e2bSVaishali Kulkarni 
90414b24e2bSVaishali Kulkarni 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
90514b24e2bSVaishali Kulkarni 		p_seg = ecore_cxt_tid_seg_info(p_hwfn, i);
90614b24e2bSVaishali Kulkarni 		if (!p_seg || p_seg->count == 0)
90714b24e2bSVaishali Kulkarni 			continue;
90814b24e2bSVaishali Kulkarni 
90914b24e2bSVaishali Kulkarni 		elem_size = p_mngr->task_type_size[p_seg->type];
91014b24e2bSVaishali Kulkarni 		if (!elem_size)
91114b24e2bSVaishali Kulkarni 			continue;
91214b24e2bSVaishali Kulkarni 
91314b24e2bSVaishali Kulkarni 		return (ilt_page_size / elem_size) * excess_lines;
91414b24e2bSVaishali Kulkarni 	}
91514b24e2bSVaishali Kulkarni 
91614b24e2bSVaishali Kulkarni 	DP_ERR(p_hwfn, "failed computing excess ILT lines\n");
91714b24e2bSVaishali Kulkarni 	return 0;
91814b24e2bSVaishali Kulkarni }
91914b24e2bSVaishali Kulkarni 
ecore_cxt_src_t2_free(struct ecore_hwfn * p_hwfn)92014b24e2bSVaishali Kulkarni static void ecore_cxt_src_t2_free(struct ecore_hwfn *p_hwfn)
92114b24e2bSVaishali Kulkarni {
92214b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
92314b24e2bSVaishali Kulkarni 	u32 i;
92414b24e2bSVaishali Kulkarni 
92514b24e2bSVaishali Kulkarni 	if (!p_mngr->t2)
92614b24e2bSVaishali Kulkarni 		return;
92714b24e2bSVaishali Kulkarni 
92814b24e2bSVaishali Kulkarni 	for (i = 0; i < p_mngr->t2_num_pages; i++)
92914b24e2bSVaishali Kulkarni 		if (p_mngr->t2[i].p_virt)
93014b24e2bSVaishali Kulkarni 			OSAL_DMA_FREE_COHERENT(p_hwfn->p_dev,
93114b24e2bSVaishali Kulkarni 					       p_mngr->t2[i].p_virt,
93214b24e2bSVaishali Kulkarni 					       p_mngr->t2[i].p_phys,
93314b24e2bSVaishali Kulkarni 					       p_mngr->t2[i].size);
93414b24e2bSVaishali Kulkarni 
93514b24e2bSVaishali Kulkarni 	OSAL_FREE(p_hwfn->p_dev, p_mngr->t2);
93614b24e2bSVaishali Kulkarni 	p_mngr->t2 = OSAL_NULL;
93714b24e2bSVaishali Kulkarni }
93814b24e2bSVaishali Kulkarni 
ecore_cxt_src_t2_alloc(struct ecore_hwfn * p_hwfn)93914b24e2bSVaishali Kulkarni static enum _ecore_status_t ecore_cxt_src_t2_alloc(struct ecore_hwfn *p_hwfn)
94014b24e2bSVaishali Kulkarni {
94114b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr  = p_hwfn->p_cxt_mngr;
94214b24e2bSVaishali Kulkarni 	u32 conn_num, total_size, ent_per_page, psz, i;
94314b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *p_src;
94414b24e2bSVaishali Kulkarni 	struct ecore_src_iids src_iids;
94514b24e2bSVaishali Kulkarni 	struct ecore_dma_mem *p_t2;
94614b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
94714b24e2bSVaishali Kulkarni 
94814b24e2bSVaishali Kulkarni 	OSAL_MEM_ZERO(&src_iids, sizeof(src_iids));
94914b24e2bSVaishali Kulkarni 
95014b24e2bSVaishali Kulkarni 	/* if the SRC ILT client is inactive - there are no connection
95114b24e2bSVaishali Kulkarni 	 * requiring the searcer, leave.
95214b24e2bSVaishali Kulkarni 	 */
95314b24e2bSVaishali Kulkarni 	p_src = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_SRC];
95414b24e2bSVaishali Kulkarni 	if (!p_src->active)
95514b24e2bSVaishali Kulkarni 		return ECORE_SUCCESS;
95614b24e2bSVaishali Kulkarni 
95714b24e2bSVaishali Kulkarni 	ecore_cxt_src_iids(p_hwfn, p_mngr, &src_iids);
95814b24e2bSVaishali Kulkarni 	conn_num = src_iids.pf_cids + src_iids.per_vf_cids * p_mngr->vf_count;
95914b24e2bSVaishali Kulkarni 	total_size = conn_num * sizeof(struct src_ent);
96014b24e2bSVaishali Kulkarni 
96114b24e2bSVaishali Kulkarni 	/* use the same page size as the SRC ILT client */
96214b24e2bSVaishali Kulkarni 	psz = ILT_PAGE_IN_BYTES(p_src->p_size.val);
96314b24e2bSVaishali Kulkarni 	p_mngr->t2_num_pages = DIV_ROUND_UP(total_size, psz);
96414b24e2bSVaishali Kulkarni 
96514b24e2bSVaishali Kulkarni 	/* allocate t2 */
96614b24e2bSVaishali Kulkarni 	p_mngr->t2 = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL,
96714b24e2bSVaishali Kulkarni 				 p_mngr->t2_num_pages *
96814b24e2bSVaishali Kulkarni 				 sizeof(struct ecore_dma_mem));
96914b24e2bSVaishali Kulkarni 	if (!p_mngr->t2) {
97014b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Failed to allocate t2 table\n");
97114b24e2bSVaishali Kulkarni 		rc = ECORE_NOMEM;
97214b24e2bSVaishali Kulkarni 		goto t2_fail;
97314b24e2bSVaishali Kulkarni 	}
97414b24e2bSVaishali Kulkarni 
97514b24e2bSVaishali Kulkarni 	/* allocate t2 pages */
97614b24e2bSVaishali Kulkarni 	for (i = 0; i < p_mngr->t2_num_pages; i++) {
97714b24e2bSVaishali Kulkarni 		u32 size = OSAL_MIN_T(u32, total_size, psz);
97814b24e2bSVaishali Kulkarni 		void **p_virt = &p_mngr->t2[i].p_virt;
97914b24e2bSVaishali Kulkarni 
98014b24e2bSVaishali Kulkarni 		*p_virt = OSAL_DMA_ALLOC_COHERENT(p_hwfn->p_dev,
98114b24e2bSVaishali Kulkarni 						  &p_mngr->t2[i].p_phys,
98214b24e2bSVaishali Kulkarni 						  size);
98314b24e2bSVaishali Kulkarni 		if (!p_mngr->t2[i].p_virt) {
98414b24e2bSVaishali Kulkarni 			rc = ECORE_NOMEM;
98514b24e2bSVaishali Kulkarni 			goto t2_fail;
98614b24e2bSVaishali Kulkarni 		}
98714b24e2bSVaishali Kulkarni 		OSAL_MEM_ZERO(*p_virt, size);
98814b24e2bSVaishali Kulkarni 		p_mngr->t2[i].size = size;
98914b24e2bSVaishali Kulkarni 		total_size -= size;
99014b24e2bSVaishali Kulkarni 	}
99114b24e2bSVaishali Kulkarni 
99214b24e2bSVaishali Kulkarni 	/* Set the t2 pointers */
99314b24e2bSVaishali Kulkarni 
99414b24e2bSVaishali Kulkarni 	/* entries per page - must be a power of two */
99514b24e2bSVaishali Kulkarni 	ent_per_page = psz / sizeof(struct src_ent);
99614b24e2bSVaishali Kulkarni 
99714b24e2bSVaishali Kulkarni 	p_mngr->first_free = (u64)p_mngr->t2[0].p_phys;
99814b24e2bSVaishali Kulkarni 
99914b24e2bSVaishali Kulkarni 	p_t2 = &p_mngr->t2[(conn_num - 1) / ent_per_page];
100014b24e2bSVaishali Kulkarni 	p_mngr->last_free = (u64)p_t2->p_phys +
100114b24e2bSVaishali Kulkarni 				 ((conn_num - 1) & (ent_per_page - 1)) *
100214b24e2bSVaishali Kulkarni 				 sizeof(struct src_ent);
100314b24e2bSVaishali Kulkarni 
100414b24e2bSVaishali Kulkarni 	for (i = 0; i < p_mngr->t2_num_pages; i++) {
100514b24e2bSVaishali Kulkarni 		u32 ent_num = OSAL_MIN_T(u32, ent_per_page, conn_num);
100614b24e2bSVaishali Kulkarni 		struct src_ent *entries = p_mngr->t2[i].p_virt;
100714b24e2bSVaishali Kulkarni 		u64 p_ent_phys = (u64)p_mngr->t2[i].p_phys, val;
100814b24e2bSVaishali Kulkarni 		u32 j;
100914b24e2bSVaishali Kulkarni 
101014b24e2bSVaishali Kulkarni 		for (j = 0; j < ent_num - 1; j++) {
101114b24e2bSVaishali Kulkarni 			val = p_ent_phys +
101214b24e2bSVaishali Kulkarni 			      (j + 1) * sizeof(struct src_ent);
101314b24e2bSVaishali Kulkarni 			entries[j].next = OSAL_CPU_TO_BE64(val);
101414b24e2bSVaishali Kulkarni 		}
101514b24e2bSVaishali Kulkarni 
101614b24e2bSVaishali Kulkarni 		if (i < p_mngr->t2_num_pages - 1)
101714b24e2bSVaishali Kulkarni 			val = (u64)p_mngr->t2[i + 1].p_phys;
101814b24e2bSVaishali Kulkarni 		else
101914b24e2bSVaishali Kulkarni 			val = 0;
102014b24e2bSVaishali Kulkarni 		entries[j].next = OSAL_CPU_TO_BE64(val);
102114b24e2bSVaishali Kulkarni 
102214b24e2bSVaishali Kulkarni 		conn_num -= ent_num;
102314b24e2bSVaishali Kulkarni 	}
102414b24e2bSVaishali Kulkarni 
102514b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
102614b24e2bSVaishali Kulkarni 
102714b24e2bSVaishali Kulkarni t2_fail:
102814b24e2bSVaishali Kulkarni 	ecore_cxt_src_t2_free(p_hwfn);
102914b24e2bSVaishali Kulkarni 	return rc;
103014b24e2bSVaishali Kulkarni }
103114b24e2bSVaishali Kulkarni 
103214b24e2bSVaishali Kulkarni #define for_each_ilt_valid_client(pos, clients)	\
103314b24e2bSVaishali Kulkarni 	for (pos = 0; pos < ILT_CLI_MAX; pos++)	\
103414b24e2bSVaishali Kulkarni 		if (!clients[pos].active) {	\
103514b24e2bSVaishali Kulkarni 			continue;		\
103614b24e2bSVaishali Kulkarni 		} else				\
103714b24e2bSVaishali Kulkarni 
103814b24e2bSVaishali Kulkarni 
103914b24e2bSVaishali Kulkarni /* Total number of ILT lines used by this PF */
ecore_cxt_ilt_shadow_size(struct ecore_ilt_client_cfg * ilt_clients)104014b24e2bSVaishali Kulkarni static u32 ecore_cxt_ilt_shadow_size(struct ecore_ilt_client_cfg *ilt_clients)
104114b24e2bSVaishali Kulkarni {
104214b24e2bSVaishali Kulkarni 	u32 size = 0;
104314b24e2bSVaishali Kulkarni 	u32 i;
104414b24e2bSVaishali Kulkarni 
104514b24e2bSVaishali Kulkarni 	for_each_ilt_valid_client(i, ilt_clients)
104614b24e2bSVaishali Kulkarni 		size += (ilt_clients[i].last.val -
104714b24e2bSVaishali Kulkarni 			 ilt_clients[i].first.val + 1);
104814b24e2bSVaishali Kulkarni 
104914b24e2bSVaishali Kulkarni 	return size;
105014b24e2bSVaishali Kulkarni }
105114b24e2bSVaishali Kulkarni 
ecore_ilt_shadow_free(struct ecore_hwfn * p_hwfn)105214b24e2bSVaishali Kulkarni static void ecore_ilt_shadow_free(struct ecore_hwfn *p_hwfn)
105314b24e2bSVaishali Kulkarni {
105414b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *p_cli = p_hwfn->p_cxt_mngr->clients;
105514b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
105614b24e2bSVaishali Kulkarni 	u32 ilt_size, i;
105714b24e2bSVaishali Kulkarni 
105814b24e2bSVaishali Kulkarni 	ilt_size = ecore_cxt_ilt_shadow_size(p_cli);
105914b24e2bSVaishali Kulkarni 
106014b24e2bSVaishali Kulkarni 	for (i = 0; p_mngr->ilt_shadow && i < ilt_size; i++) {
106114b24e2bSVaishali Kulkarni 		struct ecore_dma_mem *p_dma = &p_mngr->ilt_shadow[i];
106214b24e2bSVaishali Kulkarni 
106314b24e2bSVaishali Kulkarni 		if (p_dma->p_virt)
106414b24e2bSVaishali Kulkarni 			OSAL_DMA_FREE_COHERENT(p_hwfn->p_dev,
106514b24e2bSVaishali Kulkarni 					       p_dma->p_virt,
106614b24e2bSVaishali Kulkarni 					       p_dma->p_phys,
106714b24e2bSVaishali Kulkarni 					       p_dma->size);
106814b24e2bSVaishali Kulkarni 		p_dma->p_virt = OSAL_NULL;
106914b24e2bSVaishali Kulkarni 	}
107014b24e2bSVaishali Kulkarni 	OSAL_FREE(p_hwfn->p_dev, p_mngr->ilt_shadow);
107114b24e2bSVaishali Kulkarni }
107214b24e2bSVaishali Kulkarni 
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)107314b24e2bSVaishali Kulkarni static enum _ecore_status_t ecore_ilt_blk_alloc(struct ecore_hwfn *p_hwfn,
107414b24e2bSVaishali Kulkarni 						struct ecore_ilt_cli_blk *p_blk,
107514b24e2bSVaishali Kulkarni 						enum ilt_clients ilt_client,
107614b24e2bSVaishali Kulkarni 						u32 start_line_offset)
107714b24e2bSVaishali Kulkarni {
107814b24e2bSVaishali Kulkarni 	struct ecore_dma_mem *ilt_shadow = p_hwfn->p_cxt_mngr->ilt_shadow;
107914b24e2bSVaishali Kulkarni 	u32 lines, line, sz_left, lines_to_skip = 0;
108014b24e2bSVaishali Kulkarni 
108114b24e2bSVaishali Kulkarni 	/* Special handling for RoCE that supports dynamic allocation */
108214b24e2bSVaishali Kulkarni 	if (ECORE_IS_RDMA_PERSONALITY(p_hwfn) &&
108314b24e2bSVaishali Kulkarni 	    ((ilt_client == ILT_CLI_CDUT) || ilt_client == ILT_CLI_TSDM))
108414b24e2bSVaishali Kulkarni 		return ECORE_SUCCESS;
108514b24e2bSVaishali Kulkarni 
108614b24e2bSVaishali Kulkarni 	lines_to_skip = p_blk->dynamic_line_cnt;
108714b24e2bSVaishali Kulkarni 
108814b24e2bSVaishali Kulkarni 	if (!p_blk->total_size)
108914b24e2bSVaishali Kulkarni 		return ECORE_SUCCESS;
109014b24e2bSVaishali Kulkarni 
109114b24e2bSVaishali Kulkarni 	sz_left = p_blk->total_size;
109214b24e2bSVaishali Kulkarni 	lines = DIV_ROUND_UP(sz_left, p_blk->real_size_in_page) -
109314b24e2bSVaishali Kulkarni 		lines_to_skip;
109414b24e2bSVaishali Kulkarni 	line = p_blk->start_line + start_line_offset -
109514b24e2bSVaishali Kulkarni 	       p_hwfn->p_cxt_mngr->pf_start_line + lines_to_skip;
109614b24e2bSVaishali Kulkarni 
109714b24e2bSVaishali Kulkarni 	for (; lines; lines--) {
109814b24e2bSVaishali Kulkarni 		dma_addr_t p_phys;
109914b24e2bSVaishali Kulkarni 		void *p_virt;
110014b24e2bSVaishali Kulkarni 		u32 size;
110114b24e2bSVaishali Kulkarni 
110214b24e2bSVaishali Kulkarni 		size = OSAL_MIN_T(u32, sz_left, p_blk->real_size_in_page);
110314b24e2bSVaishali Kulkarni 		p_virt = OSAL_DMA_ALLOC_COHERENT(p_hwfn->p_dev,
110414b24e2bSVaishali Kulkarni 						 &p_phys, size);
110514b24e2bSVaishali Kulkarni 		if (!p_virt)
110614b24e2bSVaishali Kulkarni 			return ECORE_NOMEM;
110714b24e2bSVaishali Kulkarni 		OSAL_MEM_ZERO(p_virt, size);
110814b24e2bSVaishali Kulkarni 
110914b24e2bSVaishali Kulkarni 		ilt_shadow[line].p_phys = p_phys;
111014b24e2bSVaishali Kulkarni 		ilt_shadow[line].p_virt = p_virt;
111114b24e2bSVaishali Kulkarni 		ilt_shadow[line].size = size;
111214b24e2bSVaishali Kulkarni 
111314b24e2bSVaishali Kulkarni 		DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
111414b24e2bSVaishali Kulkarni 			   "ILT shadow: Line [%d] Physical 0x%llx Virtual %p Size %d\n",
111514b24e2bSVaishali Kulkarni 			   line, (u64)p_phys, p_virt, size);
111614b24e2bSVaishali Kulkarni 
111714b24e2bSVaishali Kulkarni 		sz_left -= size;
111814b24e2bSVaishali Kulkarni 		line++;
111914b24e2bSVaishali Kulkarni 	}
112014b24e2bSVaishali Kulkarni 
112114b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
112214b24e2bSVaishali Kulkarni }
112314b24e2bSVaishali Kulkarni 
ecore_ilt_shadow_alloc(struct ecore_hwfn * p_hwfn)112414b24e2bSVaishali Kulkarni static enum _ecore_status_t ecore_ilt_shadow_alloc(struct ecore_hwfn *p_hwfn)
112514b24e2bSVaishali Kulkarni {
112614b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr  = p_hwfn->p_cxt_mngr;
112714b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *clients = p_mngr->clients;
112814b24e2bSVaishali Kulkarni 	struct ecore_ilt_cli_blk *p_blk;
112914b24e2bSVaishali Kulkarni 	u32 size, i, j, k;
113014b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
113114b24e2bSVaishali Kulkarni 
113214b24e2bSVaishali Kulkarni 	size = ecore_cxt_ilt_shadow_size(clients);
113314b24e2bSVaishali Kulkarni 	p_mngr->ilt_shadow = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL,
113414b24e2bSVaishali Kulkarni 					 size * sizeof(struct ecore_dma_mem));
113514b24e2bSVaishali Kulkarni 
113614b24e2bSVaishali Kulkarni 	if (!p_mngr->ilt_shadow) {
113714b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Failed to allocate ilt shadow table\n");
113814b24e2bSVaishali Kulkarni 		rc = ECORE_NOMEM;
113914b24e2bSVaishali Kulkarni 		goto ilt_shadow_fail;
114014b24e2bSVaishali Kulkarni 	}
114114b24e2bSVaishali Kulkarni 
114214b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
114314b24e2bSVaishali Kulkarni 		   "Allocated 0x%x bytes for ilt shadow\n",
114414b24e2bSVaishali Kulkarni 		   (u32)(size * sizeof(struct ecore_dma_mem)));
114514b24e2bSVaishali Kulkarni 
114614b24e2bSVaishali Kulkarni 	for_each_ilt_valid_client(i, clients) {
114714b24e2bSVaishali Kulkarni 		for (j = 0; j < ILT_CLI_PF_BLOCKS; j++) {
114814b24e2bSVaishali Kulkarni 			p_blk = &clients[i].pf_blks[j];
114914b24e2bSVaishali Kulkarni 			rc = ecore_ilt_blk_alloc(p_hwfn, p_blk, i, 0);
115014b24e2bSVaishali Kulkarni 			if (rc != ECORE_SUCCESS)
115114b24e2bSVaishali Kulkarni 				goto ilt_shadow_fail;
115214b24e2bSVaishali Kulkarni 		}
115314b24e2bSVaishali Kulkarni 		for (k = 0; k < p_mngr->vf_count; k++) {
115414b24e2bSVaishali Kulkarni 			for (j = 0; j < ILT_CLI_VF_BLOCKS; j++) {
115514b24e2bSVaishali Kulkarni 				u32 lines = clients[i].vf_total_lines * k;
115614b24e2bSVaishali Kulkarni 
115714b24e2bSVaishali Kulkarni 				p_blk = &clients[i].vf_blks[j];
115814b24e2bSVaishali Kulkarni 				rc = ecore_ilt_blk_alloc(p_hwfn, p_blk,
115914b24e2bSVaishali Kulkarni 							 i, lines);
116014b24e2bSVaishali Kulkarni 				if (rc != ECORE_SUCCESS)
116114b24e2bSVaishali Kulkarni 					goto ilt_shadow_fail;
116214b24e2bSVaishali Kulkarni 			}
116314b24e2bSVaishali Kulkarni 		}
116414b24e2bSVaishali Kulkarni 	}
116514b24e2bSVaishali Kulkarni 
116614b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
116714b24e2bSVaishali Kulkarni 
116814b24e2bSVaishali Kulkarni ilt_shadow_fail:
116914b24e2bSVaishali Kulkarni 	ecore_ilt_shadow_free(p_hwfn);
117014b24e2bSVaishali Kulkarni 	return rc;
117114b24e2bSVaishali Kulkarni }
117214b24e2bSVaishali Kulkarni 
ecore_cid_map_free(struct ecore_hwfn * p_hwfn)117314b24e2bSVaishali Kulkarni static void ecore_cid_map_free(struct ecore_hwfn *p_hwfn)
117414b24e2bSVaishali Kulkarni {
117514b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
117614b24e2bSVaishali Kulkarni 	u32 type, vf;
117714b24e2bSVaishali Kulkarni 
117814b24e2bSVaishali Kulkarni 	for (type = 0; type < MAX_CONN_TYPES; type++) {
117914b24e2bSVaishali Kulkarni 		OSAL_FREE(p_hwfn->p_dev, p_mngr->acquired[type].cid_map);
118014b24e2bSVaishali Kulkarni 		p_mngr->acquired[type].max_count = 0;
118114b24e2bSVaishali Kulkarni 		p_mngr->acquired[type].start_cid = 0;
118214b24e2bSVaishali Kulkarni 
118314b24e2bSVaishali Kulkarni 		for (vf = 0; vf < COMMON_MAX_NUM_VFS; vf++) {
118414b24e2bSVaishali Kulkarni 			OSAL_FREE(p_hwfn->p_dev,
118514b24e2bSVaishali Kulkarni 				  p_mngr->acquired_vf[type][vf].cid_map);
118614b24e2bSVaishali Kulkarni 			p_mngr->acquired_vf[type][vf].max_count = 0;
118714b24e2bSVaishali Kulkarni 			p_mngr->acquired_vf[type][vf].start_cid = 0;
118814b24e2bSVaishali Kulkarni 		}
118914b24e2bSVaishali Kulkarni 	}
119014b24e2bSVaishali Kulkarni }
119114b24e2bSVaishali Kulkarni 
119214b24e2bSVaishali Kulkarni 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)119314b24e2bSVaishali Kulkarni ecore_cid_map_alloc_single(struct ecore_hwfn *p_hwfn, u32 type,
119414b24e2bSVaishali Kulkarni 			   u32 cid_start, u32 cid_count,
119514b24e2bSVaishali Kulkarni 			   struct ecore_cid_acquired_map *p_map)
119614b24e2bSVaishali Kulkarni {
119714b24e2bSVaishali Kulkarni 	u32 size;
119814b24e2bSVaishali Kulkarni 
119914b24e2bSVaishali Kulkarni 	if (!cid_count)
120014b24e2bSVaishali Kulkarni 		return ECORE_SUCCESS;
120114b24e2bSVaishali Kulkarni 
120214b24e2bSVaishali Kulkarni 	size = MAP_WORD_SIZE * DIV_ROUND_UP(cid_count, BITS_PER_MAP_WORD);
120314b24e2bSVaishali Kulkarni 	p_map->cid_map = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL, size);
120414b24e2bSVaishali Kulkarni 	if (p_map->cid_map == OSAL_NULL)
120514b24e2bSVaishali Kulkarni 		return ECORE_NOMEM;
120614b24e2bSVaishali Kulkarni 
120714b24e2bSVaishali Kulkarni 	p_map->max_count = cid_count;
120814b24e2bSVaishali Kulkarni 	p_map->start_cid = cid_start;
120914b24e2bSVaishali Kulkarni 
121014b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_CXT,
121114b24e2bSVaishali Kulkarni 		   "Type %08x start: %08x count %08x\n",
121214b24e2bSVaishali Kulkarni 		   type, p_map->start_cid, p_map->max_count);
121314b24e2bSVaishali Kulkarni 
121414b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
121514b24e2bSVaishali Kulkarni }
121614b24e2bSVaishali Kulkarni 
ecore_cid_map_alloc(struct ecore_hwfn * p_hwfn)121714b24e2bSVaishali Kulkarni static enum _ecore_status_t ecore_cid_map_alloc(struct ecore_hwfn *p_hwfn)
121814b24e2bSVaishali Kulkarni {
121914b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
122014b24e2bSVaishali Kulkarni 	u32 start_cid = 0, vf_start_cid = 0;
122114b24e2bSVaishali Kulkarni 	u32 type, vf;
122214b24e2bSVaishali Kulkarni 
122314b24e2bSVaishali Kulkarni 	for (type = 0; type < MAX_CONN_TYPES; type++) {
122414b24e2bSVaishali Kulkarni 		struct ecore_conn_type_cfg *p_cfg = &p_mngr->conn_cfg[type];
122514b24e2bSVaishali Kulkarni 		struct ecore_cid_acquired_map *p_map;
122614b24e2bSVaishali Kulkarni 
122714b24e2bSVaishali Kulkarni 		/* Handle PF maps */
122814b24e2bSVaishali Kulkarni 		p_map = &p_mngr->acquired[type];
122914b24e2bSVaishali Kulkarni 		if (ecore_cid_map_alloc_single(p_hwfn, type, start_cid,
123014b24e2bSVaishali Kulkarni 					       p_cfg->cid_count, p_map))
123114b24e2bSVaishali Kulkarni 			goto cid_map_fail;
123214b24e2bSVaishali Kulkarni 
123314b24e2bSVaishali Kulkarni 		/* Handle VF maps */
123414b24e2bSVaishali Kulkarni 		for (vf = 0; vf < COMMON_MAX_NUM_VFS; vf++) {
123514b24e2bSVaishali Kulkarni 			p_map = &p_mngr->acquired_vf[type][vf];
123614b24e2bSVaishali Kulkarni 			if (ecore_cid_map_alloc_single(p_hwfn, type,
123714b24e2bSVaishali Kulkarni 						       vf_start_cid,
123814b24e2bSVaishali Kulkarni 						       p_cfg->cids_per_vf,
123914b24e2bSVaishali Kulkarni 						       p_map))
124014b24e2bSVaishali Kulkarni 				goto cid_map_fail;
124114b24e2bSVaishali Kulkarni 		}
124214b24e2bSVaishali Kulkarni 
124314b24e2bSVaishali Kulkarni 		start_cid += p_cfg->cid_count;
124414b24e2bSVaishali Kulkarni 		vf_start_cid += p_cfg->cids_per_vf;
124514b24e2bSVaishali Kulkarni 	}
124614b24e2bSVaishali Kulkarni 
124714b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
124814b24e2bSVaishali Kulkarni 
124914b24e2bSVaishali Kulkarni cid_map_fail:
125014b24e2bSVaishali Kulkarni 	ecore_cid_map_free(p_hwfn);
125114b24e2bSVaishali Kulkarni 	return ECORE_NOMEM;
125214b24e2bSVaishali Kulkarni }
125314b24e2bSVaishali Kulkarni 
ecore_cxt_mngr_alloc(struct ecore_hwfn * p_hwfn)125414b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_cxt_mngr_alloc(struct ecore_hwfn *p_hwfn)
125514b24e2bSVaishali Kulkarni {
125614b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *clients;
125714b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr;
125814b24e2bSVaishali Kulkarni 	u32 i;
125914b24e2bSVaishali Kulkarni 
126014b24e2bSVaishali Kulkarni 	p_mngr = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL, sizeof(*p_mngr));
126114b24e2bSVaishali Kulkarni 	if (!p_mngr) {
126214b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Failed to allocate `struct ecore_cxt_mngr'\n");
126314b24e2bSVaishali Kulkarni 		return ECORE_NOMEM;
126414b24e2bSVaishali Kulkarni 	}
126514b24e2bSVaishali Kulkarni 
126614b24e2bSVaishali Kulkarni 	/* Initialize ILT client registers */
126714b24e2bSVaishali Kulkarni 	clients = p_mngr->clients;
126814b24e2bSVaishali Kulkarni 	clients[ILT_CLI_CDUC].first.reg = ILT_CFG_REG(CDUC, FIRST_ILT);
126914b24e2bSVaishali Kulkarni 	clients[ILT_CLI_CDUC].last.reg  = ILT_CFG_REG(CDUC, LAST_ILT);
127014b24e2bSVaishali Kulkarni 	clients[ILT_CLI_CDUC].p_size.reg = ILT_CFG_REG(CDUC, P_SIZE);
127114b24e2bSVaishali Kulkarni 
127214b24e2bSVaishali Kulkarni 	clients[ILT_CLI_QM].first.reg   = ILT_CFG_REG(QM, FIRST_ILT);
127314b24e2bSVaishali Kulkarni 	clients[ILT_CLI_QM].last.reg    = ILT_CFG_REG(QM, LAST_ILT);
127414b24e2bSVaishali Kulkarni 	clients[ILT_CLI_QM].p_size.reg  = ILT_CFG_REG(QM, P_SIZE);
127514b24e2bSVaishali Kulkarni 
127614b24e2bSVaishali Kulkarni 	clients[ILT_CLI_TM].first.reg   = ILT_CFG_REG(TM, FIRST_ILT);
127714b24e2bSVaishali Kulkarni 	clients[ILT_CLI_TM].last.reg    = ILT_CFG_REG(TM, LAST_ILT);
127814b24e2bSVaishali Kulkarni 	clients[ILT_CLI_TM].p_size.reg  = ILT_CFG_REG(TM, P_SIZE);
127914b24e2bSVaishali Kulkarni 
128014b24e2bSVaishali Kulkarni 	clients[ILT_CLI_SRC].first.reg  = ILT_CFG_REG(SRC, FIRST_ILT);
128114b24e2bSVaishali Kulkarni 	clients[ILT_CLI_SRC].last.reg   = ILT_CFG_REG(SRC, LAST_ILT);
128214b24e2bSVaishali Kulkarni 	clients[ILT_CLI_SRC].p_size.reg = ILT_CFG_REG(SRC, P_SIZE);
128314b24e2bSVaishali Kulkarni 
128414b24e2bSVaishali Kulkarni 	clients[ILT_CLI_CDUT].first.reg = ILT_CFG_REG(CDUT, FIRST_ILT);
128514b24e2bSVaishali Kulkarni 	clients[ILT_CLI_CDUT].last.reg  = ILT_CFG_REG(CDUT, LAST_ILT);
128614b24e2bSVaishali Kulkarni 	clients[ILT_CLI_CDUT].p_size.reg = ILT_CFG_REG(CDUT, P_SIZE);
128714b24e2bSVaishali Kulkarni 
128814b24e2bSVaishali Kulkarni 	clients[ILT_CLI_TSDM].first.reg = ILT_CFG_REG(TSDM, FIRST_ILT);
128914b24e2bSVaishali Kulkarni 	clients[ILT_CLI_TSDM].last.reg  = ILT_CFG_REG(TSDM, LAST_ILT);
129014b24e2bSVaishali Kulkarni 	clients[ILT_CLI_TSDM].p_size.reg = ILT_CFG_REG(TSDM, P_SIZE);
129114b24e2bSVaishali Kulkarni 
129214b24e2bSVaishali Kulkarni 	/* default ILT page size for all clients is 32K */
129314b24e2bSVaishali Kulkarni 	for (i = 0; i < ILT_CLI_MAX; i++)
129414b24e2bSVaishali Kulkarni 		p_mngr->clients[i].p_size.val = ILT_DEFAULT_HW_P_SIZE;
129514b24e2bSVaishali Kulkarni 
129614b24e2bSVaishali Kulkarni 	/* Initialize task sizes */
129714b24e2bSVaishali Kulkarni 	p_mngr->task_type_size[0] = TYPE0_TASK_CXT_SIZE(p_hwfn);
129814b24e2bSVaishali Kulkarni 	p_mngr->task_type_size[1] = TYPE1_TASK_CXT_SIZE(p_hwfn);
129914b24e2bSVaishali Kulkarni 
130014b24e2bSVaishali Kulkarni 	if (p_hwfn->p_dev->p_iov_info)
130114b24e2bSVaishali Kulkarni 		p_mngr->vf_count = p_hwfn->p_dev->p_iov_info->total_vfs;
130214b24e2bSVaishali Kulkarni 
130314b24e2bSVaishali Kulkarni 	/* Initialize the dynamic ILT allocation mutex */
130414b24e2bSVaishali Kulkarni 	OSAL_MUTEX_ALLOC(p_hwfn, &p_mngr->mutex);
130514b24e2bSVaishali Kulkarni 	OSAL_MUTEX_INIT(&p_mngr->mutex);
130614b24e2bSVaishali Kulkarni 
130714b24e2bSVaishali Kulkarni 	/* Set the cxt mangr pointer priori to further allocations */
130814b24e2bSVaishali Kulkarni 	p_hwfn->p_cxt_mngr = p_mngr;
130914b24e2bSVaishali Kulkarni 
131014b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
131114b24e2bSVaishali Kulkarni }
131214b24e2bSVaishali Kulkarni 
ecore_cxt_tables_alloc(struct ecore_hwfn * p_hwfn)131314b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_cxt_tables_alloc(struct ecore_hwfn *p_hwfn)
131414b24e2bSVaishali Kulkarni {
131514b24e2bSVaishali Kulkarni 	enum _ecore_status_t    rc;
131614b24e2bSVaishali Kulkarni 
131714b24e2bSVaishali Kulkarni 	/* Allocate the ILT shadow table */
131814b24e2bSVaishali Kulkarni 	rc = ecore_ilt_shadow_alloc(p_hwfn);
131914b24e2bSVaishali Kulkarni 	if (rc) {
132014b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Failed to allocate ilt memory\n");
132114b24e2bSVaishali Kulkarni 		goto tables_alloc_fail;
132214b24e2bSVaishali Kulkarni 	}
132314b24e2bSVaishali Kulkarni 
132414b24e2bSVaishali Kulkarni 	/* Allocate the T2  table */
132514b24e2bSVaishali Kulkarni 	rc = ecore_cxt_src_t2_alloc(p_hwfn);
132614b24e2bSVaishali Kulkarni 	if (rc) {
132714b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Failed to allocate T2 memory\n");
132814b24e2bSVaishali Kulkarni 		goto tables_alloc_fail;
132914b24e2bSVaishali Kulkarni 	}
133014b24e2bSVaishali Kulkarni 
133114b24e2bSVaishali Kulkarni 	/* Allocate and initalize the acquired cids bitmaps */
133214b24e2bSVaishali Kulkarni 	rc = ecore_cid_map_alloc(p_hwfn);
133314b24e2bSVaishali Kulkarni 	if (rc) {
133414b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Failed to allocate cid maps\n");
133514b24e2bSVaishali Kulkarni 		goto tables_alloc_fail;
133614b24e2bSVaishali Kulkarni 	}
133714b24e2bSVaishali Kulkarni 
133814b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
133914b24e2bSVaishali Kulkarni 
134014b24e2bSVaishali Kulkarni tables_alloc_fail:
134114b24e2bSVaishali Kulkarni 	ecore_cxt_mngr_free(p_hwfn);
134214b24e2bSVaishali Kulkarni 	return rc;
134314b24e2bSVaishali Kulkarni }
ecore_cxt_mngr_free(struct ecore_hwfn * p_hwfn)134414b24e2bSVaishali Kulkarni void ecore_cxt_mngr_free(struct ecore_hwfn *p_hwfn)
134514b24e2bSVaishali Kulkarni {
134614b24e2bSVaishali Kulkarni 	if (!p_hwfn->p_cxt_mngr)
134714b24e2bSVaishali Kulkarni 		return;
134814b24e2bSVaishali Kulkarni 
134914b24e2bSVaishali Kulkarni 	ecore_cid_map_free(p_hwfn);
135014b24e2bSVaishali Kulkarni 	ecore_cxt_src_t2_free(p_hwfn);
135114b24e2bSVaishali Kulkarni 	ecore_ilt_shadow_free(p_hwfn);
135214b24e2bSVaishali Kulkarni 	OSAL_MUTEX_DEALLOC(&p_hwfn->p_cxt_mngr->mutex);
135314b24e2bSVaishali Kulkarni 	OSAL_FREE(p_hwfn->p_dev, p_hwfn->p_cxt_mngr);
135414b24e2bSVaishali Kulkarni 
135514b24e2bSVaishali Kulkarni 	p_hwfn->p_cxt_mngr = OSAL_NULL;
135614b24e2bSVaishali Kulkarni }
135714b24e2bSVaishali Kulkarni 
ecore_cxt_mngr_setup(struct ecore_hwfn * p_hwfn)135814b24e2bSVaishali Kulkarni void ecore_cxt_mngr_setup(struct ecore_hwfn *p_hwfn)
135914b24e2bSVaishali Kulkarni {
136014b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
136114b24e2bSVaishali Kulkarni 	struct ecore_cid_acquired_map *p_map;
136214b24e2bSVaishali Kulkarni 	struct ecore_conn_type_cfg *p_cfg;
136314b24e2bSVaishali Kulkarni 	int type;
136414b24e2bSVaishali Kulkarni 	u32 len;
136514b24e2bSVaishali Kulkarni 
136614b24e2bSVaishali Kulkarni 	/* Reset acquired cids */
136714b24e2bSVaishali Kulkarni 	for (type = 0; type < MAX_CONN_TYPES; type++) {
136814b24e2bSVaishali Kulkarni 		u32 vf;
136914b24e2bSVaishali Kulkarni 
137014b24e2bSVaishali Kulkarni 		p_cfg = &p_mngr->conn_cfg[type];
137114b24e2bSVaishali Kulkarni 		if (p_cfg->cid_count) {
137214b24e2bSVaishali Kulkarni 			p_map = &p_mngr->acquired[type];
137314b24e2bSVaishali Kulkarni 			len = DIV_ROUND_UP(p_map->max_count,
137414b24e2bSVaishali Kulkarni 					   BITS_PER_MAP_WORD) *
137514b24e2bSVaishali Kulkarni 			      MAP_WORD_SIZE;
137614b24e2bSVaishali Kulkarni 			OSAL_MEM_ZERO(p_map->cid_map, len);
137714b24e2bSVaishali Kulkarni 		}
137814b24e2bSVaishali Kulkarni 
137914b24e2bSVaishali Kulkarni 		if (!p_cfg->cids_per_vf)
138014b24e2bSVaishali Kulkarni 			continue;
138114b24e2bSVaishali Kulkarni 
138214b24e2bSVaishali Kulkarni 		for (vf = 0; vf < COMMON_MAX_NUM_VFS; vf++) {
138314b24e2bSVaishali Kulkarni 			p_map = &p_mngr->acquired_vf[type][vf];
138414b24e2bSVaishali Kulkarni 			len = DIV_ROUND_UP(p_map->max_count,
138514b24e2bSVaishali Kulkarni 					   BITS_PER_MAP_WORD) *
138614b24e2bSVaishali Kulkarni 			      MAP_WORD_SIZE;
138714b24e2bSVaishali Kulkarni 			OSAL_MEM_ZERO(p_map->cid_map, len);
138814b24e2bSVaishali Kulkarni 		}
138914b24e2bSVaishali Kulkarni 	}
139014b24e2bSVaishali Kulkarni }
139114b24e2bSVaishali Kulkarni 
139214b24e2bSVaishali Kulkarni /* HW initialization helper (per Block, per phase) */
139314b24e2bSVaishali Kulkarni 
139414b24e2bSVaishali Kulkarni /* CDU Common */
139514b24e2bSVaishali Kulkarni #define CDUC_CXT_SIZE_SHIFT						\
139614b24e2bSVaishali Kulkarni 	CDU_REG_CID_ADDR_PARAMS_CONTEXT_SIZE_SHIFT
139714b24e2bSVaishali Kulkarni 
139814b24e2bSVaishali Kulkarni #define CDUC_CXT_SIZE_MASK						\
139914b24e2bSVaishali Kulkarni 	(CDU_REG_CID_ADDR_PARAMS_CONTEXT_SIZE >> CDUC_CXT_SIZE_SHIFT)
140014b24e2bSVaishali Kulkarni 
140114b24e2bSVaishali Kulkarni #define CDUC_BLOCK_WASTE_SHIFT						\
140214b24e2bSVaishali Kulkarni 	CDU_REG_CID_ADDR_PARAMS_BLOCK_WASTE_SHIFT
140314b24e2bSVaishali Kulkarni 
140414b24e2bSVaishali Kulkarni #define CDUC_BLOCK_WASTE_MASK						\
140514b24e2bSVaishali Kulkarni 	(CDU_REG_CID_ADDR_PARAMS_BLOCK_WASTE >> CDUC_BLOCK_WASTE_SHIFT)
140614b24e2bSVaishali Kulkarni 
140714b24e2bSVaishali Kulkarni #define CDUC_NCIB_SHIFT							\
140814b24e2bSVaishali Kulkarni 	CDU_REG_CID_ADDR_PARAMS_NCIB_SHIFT
140914b24e2bSVaishali Kulkarni 
141014b24e2bSVaishali Kulkarni #define CDUC_NCIB_MASK							\
141114b24e2bSVaishali Kulkarni 	(CDU_REG_CID_ADDR_PARAMS_NCIB >> CDUC_NCIB_SHIFT)
141214b24e2bSVaishali Kulkarni 
141314b24e2bSVaishali Kulkarni #define CDUT_TYPE0_CXT_SIZE_SHIFT					\
141414b24e2bSVaishali Kulkarni 	CDU_REG_SEGMENT0_PARAMS_T0_TID_SIZE_SHIFT
141514b24e2bSVaishali Kulkarni 
141614b24e2bSVaishali Kulkarni #define CDUT_TYPE0_CXT_SIZE_MASK					\
141714b24e2bSVaishali Kulkarni 	(CDU_REG_SEGMENT0_PARAMS_T0_TID_SIZE >>				\
141814b24e2bSVaishali Kulkarni 	CDUT_TYPE0_CXT_SIZE_SHIFT)
141914b24e2bSVaishali Kulkarni 
142014b24e2bSVaishali Kulkarni #define CDUT_TYPE0_BLOCK_WASTE_SHIFT					\
142114b24e2bSVaishali Kulkarni 	CDU_REG_SEGMENT0_PARAMS_T0_TID_BLOCK_WASTE_SHIFT
142214b24e2bSVaishali Kulkarni 
142314b24e2bSVaishali Kulkarni #define CDUT_TYPE0_BLOCK_WASTE_MASK					\
142414b24e2bSVaishali Kulkarni 	(CDU_REG_SEGMENT0_PARAMS_T0_TID_BLOCK_WASTE >>			\
142514b24e2bSVaishali Kulkarni 	CDUT_TYPE0_BLOCK_WASTE_SHIFT)
142614b24e2bSVaishali Kulkarni 
142714b24e2bSVaishali Kulkarni #define CDUT_TYPE0_NCIB_SHIFT						\
142814b24e2bSVaishali Kulkarni 	CDU_REG_SEGMENT0_PARAMS_T0_NUM_TIDS_IN_BLOCK_SHIFT
142914b24e2bSVaishali Kulkarni 
143014b24e2bSVaishali Kulkarni #define CDUT_TYPE0_NCIB_MASK						\
143114b24e2bSVaishali Kulkarni 	(CDU_REG_SEGMENT0_PARAMS_T0_NUM_TIDS_IN_BLOCK >>		\
143214b24e2bSVaishali Kulkarni 	CDUT_TYPE0_NCIB_SHIFT)
143314b24e2bSVaishali Kulkarni 
143414b24e2bSVaishali Kulkarni #define CDUT_TYPE1_CXT_SIZE_SHIFT					\
143514b24e2bSVaishali Kulkarni 	CDU_REG_SEGMENT1_PARAMS_T1_TID_SIZE_SHIFT
143614b24e2bSVaishali Kulkarni 
143714b24e2bSVaishali Kulkarni #define CDUT_TYPE1_CXT_SIZE_MASK					\
143814b24e2bSVaishali Kulkarni 	(CDU_REG_SEGMENT1_PARAMS_T1_TID_SIZE >>				\
143914b24e2bSVaishali Kulkarni 	CDUT_TYPE1_CXT_SIZE_SHIFT)
144014b24e2bSVaishali Kulkarni 
144114b24e2bSVaishali Kulkarni #define CDUT_TYPE1_BLOCK_WASTE_SHIFT					\
144214b24e2bSVaishali Kulkarni 	CDU_REG_SEGMENT1_PARAMS_T1_TID_BLOCK_WASTE_SHIFT
144314b24e2bSVaishali Kulkarni 
144414b24e2bSVaishali Kulkarni #define CDUT_TYPE1_BLOCK_WASTE_MASK					\
144514b24e2bSVaishali Kulkarni 	(CDU_REG_SEGMENT1_PARAMS_T1_TID_BLOCK_WASTE >>			\
144614b24e2bSVaishali Kulkarni 	CDUT_TYPE1_BLOCK_WASTE_SHIFT)
144714b24e2bSVaishali Kulkarni 
144814b24e2bSVaishali Kulkarni #define CDUT_TYPE1_NCIB_SHIFT						\
144914b24e2bSVaishali Kulkarni 	CDU_REG_SEGMENT1_PARAMS_T1_NUM_TIDS_IN_BLOCK_SHIFT
145014b24e2bSVaishali Kulkarni 
145114b24e2bSVaishali Kulkarni #define CDUT_TYPE1_NCIB_MASK						\
145214b24e2bSVaishali Kulkarni 	(CDU_REG_SEGMENT1_PARAMS_T1_NUM_TIDS_IN_BLOCK >>		\
145314b24e2bSVaishali Kulkarni 	CDUT_TYPE1_NCIB_SHIFT)
145414b24e2bSVaishali Kulkarni 
ecore_cdu_init_common(struct ecore_hwfn * p_hwfn)145514b24e2bSVaishali Kulkarni static void ecore_cdu_init_common(struct ecore_hwfn *p_hwfn)
145614b24e2bSVaishali Kulkarni {
145714b24e2bSVaishali Kulkarni 	u32 page_sz, elems_per_page, block_waste,  cxt_size, cdu_params = 0;
145814b24e2bSVaishali Kulkarni 
145914b24e2bSVaishali Kulkarni 	/* CDUC - connection configuration */
146014b24e2bSVaishali Kulkarni 	page_sz = p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC].p_size.val;
146114b24e2bSVaishali Kulkarni 	cxt_size = CONN_CXT_SIZE(p_hwfn);
146214b24e2bSVaishali Kulkarni 	elems_per_page = ILT_PAGE_IN_BYTES(page_sz) / cxt_size;
146314b24e2bSVaishali Kulkarni 	block_waste = ILT_PAGE_IN_BYTES(page_sz) - elems_per_page * cxt_size;
146414b24e2bSVaishali Kulkarni 
146514b24e2bSVaishali Kulkarni 	SET_FIELD(cdu_params, CDUC_CXT_SIZE, cxt_size);
146614b24e2bSVaishali Kulkarni 	SET_FIELD(cdu_params, CDUC_BLOCK_WASTE, block_waste);
146714b24e2bSVaishali Kulkarni 	SET_FIELD(cdu_params, CDUC_NCIB, elems_per_page);
146814b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, CDU_REG_CID_ADDR_PARAMS_RT_OFFSET, cdu_params);
146914b24e2bSVaishali Kulkarni 
147014b24e2bSVaishali Kulkarni 	/* CDUT - type-0 tasks configuration */
147114b24e2bSVaishali Kulkarni 	page_sz = p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT].p_size.val;
147214b24e2bSVaishali Kulkarni 	cxt_size = p_hwfn->p_cxt_mngr->task_type_size[0];
147314b24e2bSVaishali Kulkarni 	elems_per_page = ILT_PAGE_IN_BYTES(page_sz) / cxt_size;
147414b24e2bSVaishali Kulkarni 	block_waste = ILT_PAGE_IN_BYTES(page_sz) - elems_per_page * cxt_size;
147514b24e2bSVaishali Kulkarni 
147614b24e2bSVaishali Kulkarni 	/* cxt size and block-waste are multipes of 8 */
147714b24e2bSVaishali Kulkarni 	cdu_params = 0;
147814b24e2bSVaishali Kulkarni 	SET_FIELD(cdu_params, CDUT_TYPE0_CXT_SIZE, (cxt_size >> 3));
147914b24e2bSVaishali Kulkarni 	SET_FIELD(cdu_params, CDUT_TYPE0_BLOCK_WASTE, (block_waste >> 3));
148014b24e2bSVaishali Kulkarni 	SET_FIELD(cdu_params, CDUT_TYPE0_NCIB, elems_per_page);
148114b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, CDU_REG_SEGMENT0_PARAMS_RT_OFFSET, cdu_params);
148214b24e2bSVaishali Kulkarni 
148314b24e2bSVaishali Kulkarni 	/* CDUT - type-1 tasks configuration */
148414b24e2bSVaishali Kulkarni 	cxt_size = p_hwfn->p_cxt_mngr->task_type_size[1];
148514b24e2bSVaishali Kulkarni 	elems_per_page = ILT_PAGE_IN_BYTES(page_sz) / cxt_size;
148614b24e2bSVaishali Kulkarni 	block_waste = ILT_PAGE_IN_BYTES(page_sz) - elems_per_page * cxt_size;
148714b24e2bSVaishali Kulkarni 
148814b24e2bSVaishali Kulkarni 	/* cxt size and block-waste are multipes of 8 */
148914b24e2bSVaishali Kulkarni 	cdu_params = 0;
149014b24e2bSVaishali Kulkarni 	SET_FIELD(cdu_params, CDUT_TYPE1_CXT_SIZE, (cxt_size >> 3));
149114b24e2bSVaishali Kulkarni 	SET_FIELD(cdu_params, CDUT_TYPE1_BLOCK_WASTE, (block_waste >> 3));
149214b24e2bSVaishali Kulkarni 	SET_FIELD(cdu_params, CDUT_TYPE1_NCIB, elems_per_page);
149314b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, CDU_REG_SEGMENT1_PARAMS_RT_OFFSET, cdu_params);
149414b24e2bSVaishali Kulkarni }
149514b24e2bSVaishali Kulkarni 
149614b24e2bSVaishali Kulkarni /* CDU PF */
149714b24e2bSVaishali Kulkarni #define CDU_SEG_REG_TYPE_SHIFT		CDU_SEG_TYPE_OFFSET_REG_TYPE_SHIFT
149814b24e2bSVaishali Kulkarni #define CDU_SEG_REG_TYPE_MASK		0x1
149914b24e2bSVaishali Kulkarni #define CDU_SEG_REG_OFFSET_SHIFT	0
150014b24e2bSVaishali Kulkarni #define CDU_SEG_REG_OFFSET_MASK		CDU_SEG_TYPE_OFFSET_REG_OFFSET_MASK
150114b24e2bSVaishali Kulkarni 
ecore_cdu_init_pf(struct ecore_hwfn * p_hwfn)150214b24e2bSVaishali Kulkarni static void ecore_cdu_init_pf(struct ecore_hwfn *p_hwfn)
150314b24e2bSVaishali Kulkarni {
150414b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *p_cli;
150514b24e2bSVaishali Kulkarni 	struct ecore_tid_seg *p_seg;
150614b24e2bSVaishali Kulkarni 	u32 cdu_seg_params, offset;
150714b24e2bSVaishali Kulkarni 	int i;
150814b24e2bSVaishali Kulkarni 
150914b24e2bSVaishali Kulkarni 	static const u32 rt_type_offset_arr[] = {
151014b24e2bSVaishali Kulkarni 		CDU_REG_PF_SEG0_TYPE_OFFSET_RT_OFFSET,
151114b24e2bSVaishali Kulkarni 		CDU_REG_PF_SEG1_TYPE_OFFSET_RT_OFFSET,
151214b24e2bSVaishali Kulkarni 		CDU_REG_PF_SEG2_TYPE_OFFSET_RT_OFFSET,
151314b24e2bSVaishali Kulkarni 		CDU_REG_PF_SEG3_TYPE_OFFSET_RT_OFFSET
151414b24e2bSVaishali Kulkarni 	};
151514b24e2bSVaishali Kulkarni 
151614b24e2bSVaishali Kulkarni 	static const u32 rt_type_offset_fl_arr[] = {
151714b24e2bSVaishali Kulkarni 		CDU_REG_PF_FL_SEG0_TYPE_OFFSET_RT_OFFSET,
151814b24e2bSVaishali Kulkarni 		CDU_REG_PF_FL_SEG1_TYPE_OFFSET_RT_OFFSET,
151914b24e2bSVaishali Kulkarni 		CDU_REG_PF_FL_SEG2_TYPE_OFFSET_RT_OFFSET,
152014b24e2bSVaishali Kulkarni 		CDU_REG_PF_FL_SEG3_TYPE_OFFSET_RT_OFFSET
152114b24e2bSVaishali Kulkarni 	};
152214b24e2bSVaishali Kulkarni 
152314b24e2bSVaishali Kulkarni 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
152414b24e2bSVaishali Kulkarni 
152514b24e2bSVaishali Kulkarni 	/* There are initializations only for CDUT during pf Phase */
152614b24e2bSVaishali Kulkarni 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
152714b24e2bSVaishali Kulkarni 		/* Segment 0*/
152814b24e2bSVaishali Kulkarni 		p_seg = ecore_cxt_tid_seg_info(p_hwfn, i);
152914b24e2bSVaishali Kulkarni 		if (!p_seg)
153014b24e2bSVaishali Kulkarni 			continue;
153114b24e2bSVaishali Kulkarni 
153214b24e2bSVaishali Kulkarni 		/* Note: start_line is already adjusted for the CDU
153314b24e2bSVaishali Kulkarni 		 * segment register granularity, so we just need to
153414b24e2bSVaishali Kulkarni 		 * divide. Adjustment is implicit as we assume ILT
153514b24e2bSVaishali Kulkarni 		 * Page size is larger than 32K!
153614b24e2bSVaishali Kulkarni 		 */
153714b24e2bSVaishali Kulkarni 		offset = (ILT_PAGE_IN_BYTES(p_cli->p_size.val) *
153814b24e2bSVaishali Kulkarni 			 (p_cli->pf_blks[CDUT_SEG_BLK(i)].start_line -
153914b24e2bSVaishali Kulkarni 			  p_cli->first.val)) / CDUT_SEG_ALIGNMET_IN_BYTES;
154014b24e2bSVaishali Kulkarni 
154114b24e2bSVaishali Kulkarni 		cdu_seg_params = 0;
154214b24e2bSVaishali Kulkarni 		SET_FIELD(cdu_seg_params, CDU_SEG_REG_TYPE, p_seg->type);
154314b24e2bSVaishali Kulkarni 		SET_FIELD(cdu_seg_params, CDU_SEG_REG_OFFSET, offset);
154414b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn, rt_type_offset_arr[i],
154514b24e2bSVaishali Kulkarni 			     cdu_seg_params);
154614b24e2bSVaishali Kulkarni 
154714b24e2bSVaishali Kulkarni 		offset = (ILT_PAGE_IN_BYTES(p_cli->p_size.val) *
154814b24e2bSVaishali Kulkarni 			 (p_cli->pf_blks[CDUT_FL_SEG_BLK(i, PF)].start_line -
154914b24e2bSVaishali Kulkarni 			  p_cli->first.val)) / CDUT_SEG_ALIGNMET_IN_BYTES;
155014b24e2bSVaishali Kulkarni 
155114b24e2bSVaishali Kulkarni 		cdu_seg_params = 0;
155214b24e2bSVaishali Kulkarni 		SET_FIELD(cdu_seg_params, CDU_SEG_REG_TYPE, p_seg->type);
155314b24e2bSVaishali Kulkarni 		SET_FIELD(cdu_seg_params, CDU_SEG_REG_OFFSET, offset);
155414b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn, rt_type_offset_fl_arr[i],
155514b24e2bSVaishali Kulkarni 			     cdu_seg_params);
155614b24e2bSVaishali Kulkarni 
155714b24e2bSVaishali Kulkarni 	}
155814b24e2bSVaishali Kulkarni }
155914b24e2bSVaishali Kulkarni 
ecore_qm_init_pf(struct ecore_hwfn * p_hwfn)156014b24e2bSVaishali Kulkarni void ecore_qm_init_pf(struct ecore_hwfn *p_hwfn)
156114b24e2bSVaishali Kulkarni {
156214b24e2bSVaishali Kulkarni 	struct ecore_qm_info *qm_info = &p_hwfn->qm_info;
156314b24e2bSVaishali Kulkarni 	struct ecore_qm_iids iids;
156414b24e2bSVaishali Kulkarni 
156514b24e2bSVaishali Kulkarni 	OSAL_MEM_ZERO(&iids, sizeof(iids));
156614b24e2bSVaishali Kulkarni 	ecore_cxt_qm_iids(p_hwfn, &iids);
156714b24e2bSVaishali Kulkarni 
156814b24e2bSVaishali Kulkarni 	ecore_qm_pf_rt_init(p_hwfn, p_hwfn->p_main_ptt, p_hwfn->port_id,
156914b24e2bSVaishali Kulkarni 			    p_hwfn->rel_pf_id, qm_info->max_phys_tcs_per_port,
157014b24e2bSVaishali Kulkarni 			    p_hwfn->first_on_engine,
157114b24e2bSVaishali Kulkarni 			    iids.cids, iids.vf_cids, iids.tids,
157214b24e2bSVaishali Kulkarni 			    qm_info->start_pq,
157314b24e2bSVaishali Kulkarni 			    qm_info->num_pqs - qm_info->num_vf_pqs,
157414b24e2bSVaishali Kulkarni 			    qm_info->num_vf_pqs,
157514b24e2bSVaishali Kulkarni 			    qm_info->start_vport,
157614b24e2bSVaishali Kulkarni 			    qm_info->num_vports, qm_info->pf_wfq, qm_info->pf_rl,
157714b24e2bSVaishali Kulkarni 			    p_hwfn->qm_info.qm_pq_params,
157814b24e2bSVaishali Kulkarni 			    p_hwfn->qm_info.qm_vport_params);
157914b24e2bSVaishali Kulkarni }
158014b24e2bSVaishali Kulkarni 
158114b24e2bSVaishali Kulkarni /* CM PF */
ecore_cm_init_pf(struct ecore_hwfn * p_hwfn)158214b24e2bSVaishali Kulkarni void ecore_cm_init_pf(struct ecore_hwfn *p_hwfn)
158314b24e2bSVaishali Kulkarni {
158414b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, XCM_REG_CON_PHY_Q3_RT_OFFSET, ecore_get_cm_pq_idx(p_hwfn, PQ_FLAGS_LB));
158514b24e2bSVaishali Kulkarni }
158614b24e2bSVaishali Kulkarni 
158714b24e2bSVaishali Kulkarni /* DQ PF */
ecore_dq_init_pf(struct ecore_hwfn * p_hwfn)158814b24e2bSVaishali Kulkarni static void ecore_dq_init_pf(struct ecore_hwfn *p_hwfn)
158914b24e2bSVaishali Kulkarni {
159014b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
159114b24e2bSVaishali Kulkarni 	u32 dq_pf_max_cid = 0, dq_vf_max_cid = 0;
159214b24e2bSVaishali Kulkarni 
159314b24e2bSVaishali Kulkarni 	dq_pf_max_cid += (p_mngr->conn_cfg[0].cid_count >> DQ_RANGE_SHIFT);
159414b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_0_RT_OFFSET, dq_pf_max_cid);
159514b24e2bSVaishali Kulkarni 
159614b24e2bSVaishali Kulkarni 	dq_vf_max_cid += (p_mngr->conn_cfg[0].cids_per_vf >> DQ_RANGE_SHIFT);
159714b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_0_RT_OFFSET, dq_vf_max_cid);
159814b24e2bSVaishali Kulkarni 
159914b24e2bSVaishali Kulkarni 	dq_pf_max_cid += (p_mngr->conn_cfg[1].cid_count >> DQ_RANGE_SHIFT);
160014b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_1_RT_OFFSET, dq_pf_max_cid);
160114b24e2bSVaishali Kulkarni 
160214b24e2bSVaishali Kulkarni 	dq_vf_max_cid += (p_mngr->conn_cfg[1].cids_per_vf >> DQ_RANGE_SHIFT);
160314b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_1_RT_OFFSET, dq_vf_max_cid);
160414b24e2bSVaishali Kulkarni 
160514b24e2bSVaishali Kulkarni 	dq_pf_max_cid += (p_mngr->conn_cfg[2].cid_count >> DQ_RANGE_SHIFT);
160614b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_2_RT_OFFSET, dq_pf_max_cid);
160714b24e2bSVaishali Kulkarni 
160814b24e2bSVaishali Kulkarni 	dq_vf_max_cid += (p_mngr->conn_cfg[2].cids_per_vf >> DQ_RANGE_SHIFT);
160914b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_2_RT_OFFSET, dq_vf_max_cid);
161014b24e2bSVaishali Kulkarni 
161114b24e2bSVaishali Kulkarni 	dq_pf_max_cid += (p_mngr->conn_cfg[3].cid_count >> DQ_RANGE_SHIFT);
161214b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_3_RT_OFFSET, dq_pf_max_cid);
161314b24e2bSVaishali Kulkarni 
161414b24e2bSVaishali Kulkarni 	dq_vf_max_cid += (p_mngr->conn_cfg[3].cids_per_vf >> DQ_RANGE_SHIFT);
161514b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_3_RT_OFFSET, dq_vf_max_cid);
161614b24e2bSVaishali Kulkarni 
161714b24e2bSVaishali Kulkarni 	dq_pf_max_cid += (p_mngr->conn_cfg[4].cid_count >> DQ_RANGE_SHIFT);
161814b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_4_RT_OFFSET, dq_pf_max_cid);
161914b24e2bSVaishali Kulkarni 
162014b24e2bSVaishali Kulkarni 	dq_vf_max_cid += (p_mngr->conn_cfg[4].cids_per_vf >> DQ_RANGE_SHIFT);
162114b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_4_RT_OFFSET, dq_vf_max_cid);
162214b24e2bSVaishali Kulkarni 
162314b24e2bSVaishali Kulkarni 	dq_pf_max_cid += (p_mngr->conn_cfg[5].cid_count >> DQ_RANGE_SHIFT);
162414b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_5_RT_OFFSET, dq_pf_max_cid);
162514b24e2bSVaishali Kulkarni 
162614b24e2bSVaishali Kulkarni 	dq_vf_max_cid += (p_mngr->conn_cfg[5].cids_per_vf >> DQ_RANGE_SHIFT);
162714b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_5_RT_OFFSET, dq_vf_max_cid);
162814b24e2bSVaishali Kulkarni 
162914b24e2bSVaishali Kulkarni 	/* Connection types 6 & 7 are not in use, yet they must be configured
163014b24e2bSVaishali Kulkarni 	 * as the highest possible connection. Not configuring them means the
163114b24e2bSVaishali Kulkarni 	 * defaults will be  used, and with a large number of cids a bug may
163214b24e2bSVaishali Kulkarni 	 * occur, if the defaults will be smaller than dq_pf_max_cid /
163314b24e2bSVaishali Kulkarni 	 * dq_vf_max_cid.
163414b24e2bSVaishali Kulkarni 	 */
163514b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_6_RT_OFFSET, dq_pf_max_cid);
163614b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_6_RT_OFFSET, dq_vf_max_cid);
163714b24e2bSVaishali Kulkarni 
163814b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_7_RT_OFFSET, dq_pf_max_cid);
163914b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_7_RT_OFFSET, dq_vf_max_cid);
164014b24e2bSVaishali Kulkarni }
164114b24e2bSVaishali Kulkarni 
ecore_ilt_bounds_init(struct ecore_hwfn * p_hwfn)164214b24e2bSVaishali Kulkarni static void ecore_ilt_bounds_init(struct ecore_hwfn *p_hwfn)
164314b24e2bSVaishali Kulkarni {
164414b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *ilt_clients;
164514b24e2bSVaishali Kulkarni 	int i;
164614b24e2bSVaishali Kulkarni 
164714b24e2bSVaishali Kulkarni 	ilt_clients = p_hwfn->p_cxt_mngr->clients;
164814b24e2bSVaishali Kulkarni 	for_each_ilt_valid_client(i, ilt_clients) {
164914b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
165014b24e2bSVaishali Kulkarni 			     ilt_clients[i].first.reg,
165114b24e2bSVaishali Kulkarni 			     ilt_clients[i].first.val);
165214b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
165314b24e2bSVaishali Kulkarni 			     ilt_clients[i].last.reg,
165414b24e2bSVaishali Kulkarni 			     ilt_clients[i].last.val);
165514b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
165614b24e2bSVaishali Kulkarni 			     ilt_clients[i].p_size.reg,
165714b24e2bSVaishali Kulkarni 			     ilt_clients[i].p_size.val);
165814b24e2bSVaishali Kulkarni 	}
165914b24e2bSVaishali Kulkarni }
166014b24e2bSVaishali Kulkarni 
ecore_ilt_vf_bounds_init(struct ecore_hwfn * p_hwfn)166114b24e2bSVaishali Kulkarni static void ecore_ilt_vf_bounds_init(struct ecore_hwfn *p_hwfn)
166214b24e2bSVaishali Kulkarni {
166314b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *p_cli;
166414b24e2bSVaishali Kulkarni 	u32 blk_factor;
166514b24e2bSVaishali Kulkarni 
166614b24e2bSVaishali Kulkarni 	/* For simplicty  we set the 'block' to be an ILT page */
166714b24e2bSVaishali Kulkarni 	if (p_hwfn->p_dev->p_iov_info) {
166814b24e2bSVaishali Kulkarni 		struct ecore_hw_sriov_info *p_iov = p_hwfn->p_dev->p_iov_info;
166914b24e2bSVaishali Kulkarni 
167014b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
167114b24e2bSVaishali Kulkarni 			     PSWRQ2_REG_VF_BASE_RT_OFFSET,
167214b24e2bSVaishali Kulkarni 			     p_iov->first_vf_in_pf);
167314b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
167414b24e2bSVaishali Kulkarni 			     PSWRQ2_REG_VF_LAST_ILT_RT_OFFSET,
167514b24e2bSVaishali Kulkarni 			     p_iov->first_vf_in_pf + p_iov->total_vfs);
167614b24e2bSVaishali Kulkarni 	}
167714b24e2bSVaishali Kulkarni 
167814b24e2bSVaishali Kulkarni 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC];
167914b24e2bSVaishali Kulkarni 	blk_factor = OSAL_LOG2(ILT_PAGE_IN_BYTES(p_cli->p_size.val) >> 10);
168014b24e2bSVaishali Kulkarni 	if (p_cli->active) {
168114b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
168214b24e2bSVaishali Kulkarni 			     PSWRQ2_REG_CDUC_BLOCKS_FACTOR_RT_OFFSET,
168314b24e2bSVaishali Kulkarni 			     blk_factor);
168414b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
168514b24e2bSVaishali Kulkarni 			     PSWRQ2_REG_CDUC_NUMBER_OF_PF_BLOCKS_RT_OFFSET,
168614b24e2bSVaishali Kulkarni 			     p_cli->pf_total_lines);
168714b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
168814b24e2bSVaishali Kulkarni 			     PSWRQ2_REG_CDUC_VF_BLOCKS_RT_OFFSET,
168914b24e2bSVaishali Kulkarni 			     p_cli->vf_total_lines);
169014b24e2bSVaishali Kulkarni 	}
169114b24e2bSVaishali Kulkarni 
169214b24e2bSVaishali Kulkarni 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
169314b24e2bSVaishali Kulkarni 	blk_factor = OSAL_LOG2(ILT_PAGE_IN_BYTES(p_cli->p_size.val) >> 10);
169414b24e2bSVaishali Kulkarni 	if (p_cli->active) {
169514b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
169614b24e2bSVaishali Kulkarni 			     PSWRQ2_REG_CDUT_BLOCKS_FACTOR_RT_OFFSET,
169714b24e2bSVaishali Kulkarni 			     blk_factor);
169814b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
169914b24e2bSVaishali Kulkarni 			     PSWRQ2_REG_CDUT_NUMBER_OF_PF_BLOCKS_RT_OFFSET,
170014b24e2bSVaishali Kulkarni 			     p_cli->pf_total_lines);
170114b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
170214b24e2bSVaishali Kulkarni 			     PSWRQ2_REG_CDUT_VF_BLOCKS_RT_OFFSET,
170314b24e2bSVaishali Kulkarni 			     p_cli->vf_total_lines);
170414b24e2bSVaishali Kulkarni 	}
170514b24e2bSVaishali Kulkarni 
170614b24e2bSVaishali Kulkarni 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_TM];
170714b24e2bSVaishali Kulkarni 	blk_factor = OSAL_LOG2(ILT_PAGE_IN_BYTES(p_cli->p_size.val) >> 10);
170814b24e2bSVaishali Kulkarni 	if (p_cli->active) {
170914b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
171014b24e2bSVaishali Kulkarni 			     PSWRQ2_REG_TM_BLOCKS_FACTOR_RT_OFFSET,
171114b24e2bSVaishali Kulkarni 			     blk_factor);
171214b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
171314b24e2bSVaishali Kulkarni 			     PSWRQ2_REG_TM_NUMBER_OF_PF_BLOCKS_RT_OFFSET,
171414b24e2bSVaishali Kulkarni 			     p_cli->pf_total_lines);
171514b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn,
171614b24e2bSVaishali Kulkarni 			     PSWRQ2_REG_TM_VF_BLOCKS_RT_OFFSET,
171714b24e2bSVaishali Kulkarni 			     p_cli->vf_total_lines);
171814b24e2bSVaishali Kulkarni 	}
171914b24e2bSVaishali Kulkarni }
172014b24e2bSVaishali Kulkarni 
172114b24e2bSVaishali Kulkarni /* ILT (PSWRQ2) PF */
ecore_ilt_init_pf(struct ecore_hwfn * p_hwfn)172214b24e2bSVaishali Kulkarni static void ecore_ilt_init_pf(struct ecore_hwfn *p_hwfn)
172314b24e2bSVaishali Kulkarni {
172414b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *clients;
172514b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr;
172614b24e2bSVaishali Kulkarni 	struct ecore_dma_mem *p_shdw;
172714b24e2bSVaishali Kulkarni 	u32 line, rt_offst, i;
172814b24e2bSVaishali Kulkarni 
172914b24e2bSVaishali Kulkarni 	ecore_ilt_bounds_init(p_hwfn);
173014b24e2bSVaishali Kulkarni 	ecore_ilt_vf_bounds_init(p_hwfn);
173114b24e2bSVaishali Kulkarni 
173214b24e2bSVaishali Kulkarni 	p_mngr  = p_hwfn->p_cxt_mngr;
173314b24e2bSVaishali Kulkarni 	p_shdw  = p_mngr->ilt_shadow;
173414b24e2bSVaishali Kulkarni 	clients = p_hwfn->p_cxt_mngr->clients;
173514b24e2bSVaishali Kulkarni 
173614b24e2bSVaishali Kulkarni 	for_each_ilt_valid_client(i, clients) {
173714b24e2bSVaishali Kulkarni 		/* Client's 1st val and RT array are absolute, ILT shadows'
173814b24e2bSVaishali Kulkarni 		 * lines are relative.
173914b24e2bSVaishali Kulkarni 		 */
174014b24e2bSVaishali Kulkarni 		line = clients[i].first.val - p_mngr->pf_start_line;
174114b24e2bSVaishali Kulkarni 		rt_offst = PSWRQ2_REG_ILT_MEMORY_RT_OFFSET +
174214b24e2bSVaishali Kulkarni 			   clients[i].first.val * ILT_ENTRY_IN_REGS;
174314b24e2bSVaishali Kulkarni 
174414b24e2bSVaishali Kulkarni 		for (; line <= clients[i].last.val - p_mngr->pf_start_line;
174514b24e2bSVaishali Kulkarni 		     line++, rt_offst += ILT_ENTRY_IN_REGS) {
174614b24e2bSVaishali Kulkarni 			u64 ilt_hw_entry = 0;
174714b24e2bSVaishali Kulkarni 
174814b24e2bSVaishali Kulkarni 			/** p_virt could be OSAL_NULL incase of dynamic
174914b24e2bSVaishali Kulkarni 			 *  allocation
175014b24e2bSVaishali Kulkarni 			 */
175114b24e2bSVaishali Kulkarni 			if (p_shdw[line].p_virt != OSAL_NULL) {
175214b24e2bSVaishali Kulkarni 				SET_FIELD(ilt_hw_entry, ILT_ENTRY_VALID, 1ULL);
175314b24e2bSVaishali Kulkarni 				SET_FIELD(ilt_hw_entry, ILT_ENTRY_PHY_ADDR,
175414b24e2bSVaishali Kulkarni 					  (p_shdw[line].p_phys >> 12));
175514b24e2bSVaishali Kulkarni 
175614b24e2bSVaishali Kulkarni 				DP_VERBOSE(
175714b24e2bSVaishali Kulkarni 					p_hwfn, ECORE_MSG_ILT,
175814b24e2bSVaishali Kulkarni 					"Setting RT[0x%08x] from ILT[0x%08x] [Client is %d] to Physical addr: 0x%llx\n",
175914b24e2bSVaishali Kulkarni 					rt_offst, line, i,
176014b24e2bSVaishali Kulkarni 					(u64)(p_shdw[line].p_phys >> 12));
176114b24e2bSVaishali Kulkarni 			}
176214b24e2bSVaishali Kulkarni 
176314b24e2bSVaishali Kulkarni 			STORE_RT_REG_AGG(p_hwfn, rt_offst, ilt_hw_entry);
176414b24e2bSVaishali Kulkarni 		}
176514b24e2bSVaishali Kulkarni 	}
176614b24e2bSVaishali Kulkarni }
176714b24e2bSVaishali Kulkarni 
176814b24e2bSVaishali Kulkarni /* SRC (Searcher) PF */
ecore_src_init_pf(struct ecore_hwfn * p_hwfn)176914b24e2bSVaishali Kulkarni static void ecore_src_init_pf(struct ecore_hwfn *p_hwfn)
177014b24e2bSVaishali Kulkarni {
177114b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
177214b24e2bSVaishali Kulkarni 	u32 rounded_conn_num, conn_num, conn_max;
177314b24e2bSVaishali Kulkarni 	struct ecore_src_iids src_iids;
177414b24e2bSVaishali Kulkarni 
177514b24e2bSVaishali Kulkarni 	OSAL_MEM_ZERO(&src_iids, sizeof(src_iids));
177614b24e2bSVaishali Kulkarni 	ecore_cxt_src_iids(p_hwfn, p_mngr, &src_iids);
177714b24e2bSVaishali Kulkarni 	conn_num = src_iids.pf_cids + src_iids.per_vf_cids * p_mngr->vf_count;
177814b24e2bSVaishali Kulkarni 	if (!conn_num)
177914b24e2bSVaishali Kulkarni 		return;
178014b24e2bSVaishali Kulkarni 
178114b24e2bSVaishali Kulkarni 	conn_max = OSAL_MAX_T(u32, conn_num, SRC_MIN_NUM_ELEMS);
178214b24e2bSVaishali Kulkarni 	rounded_conn_num = OSAL_ROUNDUP_POW_OF_TWO(conn_max);
178314b24e2bSVaishali Kulkarni 
178414b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, SRC_REG_COUNTFREE_RT_OFFSET, conn_num);
178514b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, SRC_REG_NUMBER_HASH_BITS_RT_OFFSET,
178614b24e2bSVaishali Kulkarni 		     OSAL_LOG2(rounded_conn_num));
178714b24e2bSVaishali Kulkarni 
178814b24e2bSVaishali Kulkarni 	STORE_RT_REG_AGG(p_hwfn, SRC_REG_FIRSTFREE_RT_OFFSET,
178914b24e2bSVaishali Kulkarni 			 p_hwfn->p_cxt_mngr->first_free);
179014b24e2bSVaishali Kulkarni 	STORE_RT_REG_AGG(p_hwfn, SRC_REG_LASTFREE_RT_OFFSET,
179114b24e2bSVaishali Kulkarni 			 p_hwfn->p_cxt_mngr->last_free);
179214b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
179314b24e2bSVaishali Kulkarni 		   "Configured SEARCHER for 0x%08x connections\n",
179414b24e2bSVaishali Kulkarni 		   conn_num);
179514b24e2bSVaishali Kulkarni }
179614b24e2bSVaishali Kulkarni 
179714b24e2bSVaishali Kulkarni /* Timers PF */
179814b24e2bSVaishali Kulkarni #define TM_CFG_NUM_IDS_SHIFT		0
179914b24e2bSVaishali Kulkarni #define TM_CFG_NUM_IDS_MASK		0xFFFFULL
180014b24e2bSVaishali Kulkarni #define TM_CFG_PRE_SCAN_OFFSET_SHIFT	16
180114b24e2bSVaishali Kulkarni #define TM_CFG_PRE_SCAN_OFFSET_MASK	0x1FFULL
180214b24e2bSVaishali Kulkarni #define TM_CFG_PARENT_PF_SHIFT		25
180314b24e2bSVaishali Kulkarni #define TM_CFG_PARENT_PF_MASK		0x7ULL
180414b24e2bSVaishali Kulkarni 
180514b24e2bSVaishali Kulkarni #define TM_CFG_CID_PRE_SCAN_ROWS_SHIFT	30
180614b24e2bSVaishali Kulkarni #define TM_CFG_CID_PRE_SCAN_ROWS_MASK	0x1FFULL
180714b24e2bSVaishali Kulkarni 
180814b24e2bSVaishali Kulkarni #define TM_CFG_TID_OFFSET_SHIFT		30
180914b24e2bSVaishali Kulkarni #define TM_CFG_TID_OFFSET_MASK		0x7FFFFULL
181014b24e2bSVaishali Kulkarni #define TM_CFG_TID_PRE_SCAN_ROWS_SHIFT	49
181114b24e2bSVaishali Kulkarni #define TM_CFG_TID_PRE_SCAN_ROWS_MASK	0x1FFULL
181214b24e2bSVaishali Kulkarni 
ecore_tm_init_pf(struct ecore_hwfn * p_hwfn)181314b24e2bSVaishali Kulkarni static void ecore_tm_init_pf(struct ecore_hwfn *p_hwfn)
181414b24e2bSVaishali Kulkarni {
181514b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
181614b24e2bSVaishali Kulkarni 	u32 active_seg_mask = 0, tm_offset, rt_reg;
181714b24e2bSVaishali Kulkarni 	struct ecore_tm_iids tm_iids;
181814b24e2bSVaishali Kulkarni 	u64 cfg_word;
181914b24e2bSVaishali Kulkarni 	u8 i;
182014b24e2bSVaishali Kulkarni 
182114b24e2bSVaishali Kulkarni 	OSAL_MEM_ZERO(&tm_iids, sizeof(tm_iids));
182214b24e2bSVaishali Kulkarni 	ecore_cxt_tm_iids(p_hwfn, p_mngr, &tm_iids);
182314b24e2bSVaishali Kulkarni 
182414b24e2bSVaishali Kulkarni 	/* @@@TBD No pre-scan for now */
182514b24e2bSVaishali Kulkarni 
182614b24e2bSVaishali Kulkarni 	/* Note: We assume consecutive VFs for a PF */
182714b24e2bSVaishali Kulkarni 	for (i = 0; i < p_mngr->vf_count; i++) {
182814b24e2bSVaishali Kulkarni 		cfg_word = 0;
182914b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_NUM_IDS, tm_iids.per_vf_cids);
183014b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_PRE_SCAN_OFFSET, 0);
183114b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_PARENT_PF, p_hwfn->rel_pf_id);
183214b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_CID_PRE_SCAN_ROWS, 0); /* scan all */
183314b24e2bSVaishali Kulkarni 
183414b24e2bSVaishali Kulkarni 		rt_reg = TM_REG_CONFIG_CONN_MEM_RT_OFFSET +
183514b24e2bSVaishali Kulkarni 			 (sizeof(cfg_word) / sizeof(u32)) *
183614b24e2bSVaishali Kulkarni 			 (p_hwfn->p_dev->p_iov_info->first_vf_in_pf + i);
183714b24e2bSVaishali Kulkarni 		STORE_RT_REG_AGG(p_hwfn, rt_reg, cfg_word);
183814b24e2bSVaishali Kulkarni 	}
183914b24e2bSVaishali Kulkarni 
184014b24e2bSVaishali Kulkarni 	cfg_word = 0;
184114b24e2bSVaishali Kulkarni 	SET_FIELD(cfg_word, TM_CFG_NUM_IDS, tm_iids.pf_cids);
184214b24e2bSVaishali Kulkarni 	SET_FIELD(cfg_word, TM_CFG_PRE_SCAN_OFFSET, 0);
184314b24e2bSVaishali Kulkarni 	SET_FIELD(cfg_word, TM_CFG_PARENT_PF, 0);	  /* n/a for PF */
184414b24e2bSVaishali Kulkarni 	SET_FIELD(cfg_word, TM_CFG_CID_PRE_SCAN_ROWS, 0); /* scan all   */
184514b24e2bSVaishali Kulkarni 
184614b24e2bSVaishali Kulkarni 	rt_reg = TM_REG_CONFIG_CONN_MEM_RT_OFFSET +
184714b24e2bSVaishali Kulkarni 		 (sizeof(cfg_word) / sizeof(u32)) *
184814b24e2bSVaishali Kulkarni 		 (NUM_OF_VFS(p_hwfn->p_dev) + p_hwfn->rel_pf_id);
184914b24e2bSVaishali Kulkarni 	STORE_RT_REG_AGG(p_hwfn, rt_reg, cfg_word);
185014b24e2bSVaishali Kulkarni 
185114b24e2bSVaishali Kulkarni 	/* enale scan */
185214b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, TM_REG_PF_ENABLE_CONN_RT_OFFSET,
185314b24e2bSVaishali Kulkarni 		     tm_iids.pf_cids  ? 0x1 : 0x0);
185414b24e2bSVaishali Kulkarni 
185514b24e2bSVaishali Kulkarni 	/* @@@TBD how to enable the scan for the VFs */
185614b24e2bSVaishali Kulkarni 
185714b24e2bSVaishali Kulkarni 	tm_offset = tm_iids.per_vf_cids;
185814b24e2bSVaishali Kulkarni 
185914b24e2bSVaishali Kulkarni 	/* Note: We assume consecutive VFs for a PF */
186014b24e2bSVaishali Kulkarni 	for (i = 0; i < p_mngr->vf_count; i++) {
186114b24e2bSVaishali Kulkarni 		cfg_word = 0;
186214b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_NUM_IDS, tm_iids.per_vf_tids);
186314b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_PRE_SCAN_OFFSET, 0);
186414b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_PARENT_PF, p_hwfn->rel_pf_id);
186514b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_TID_OFFSET, tm_offset);
186614b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_TID_PRE_SCAN_ROWS, (u64)0);
186714b24e2bSVaishali Kulkarni 
186814b24e2bSVaishali Kulkarni 		rt_reg = TM_REG_CONFIG_TASK_MEM_RT_OFFSET +
186914b24e2bSVaishali Kulkarni 			 (sizeof(cfg_word) / sizeof(u32)) *
187014b24e2bSVaishali Kulkarni 			 (p_hwfn->p_dev->p_iov_info->first_vf_in_pf + i);
187114b24e2bSVaishali Kulkarni 
187214b24e2bSVaishali Kulkarni 		STORE_RT_REG_AGG(p_hwfn, rt_reg, cfg_word);
187314b24e2bSVaishali Kulkarni 	}
187414b24e2bSVaishali Kulkarni 
187514b24e2bSVaishali Kulkarni 	tm_offset = tm_iids.pf_cids;
187614b24e2bSVaishali Kulkarni 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
187714b24e2bSVaishali Kulkarni 		cfg_word = 0;
187814b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_NUM_IDS, tm_iids.pf_tids[i]);
187914b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_PRE_SCAN_OFFSET, 0);
188014b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_PARENT_PF, 0);
188114b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_TID_OFFSET, tm_offset);
188214b24e2bSVaishali Kulkarni 		SET_FIELD(cfg_word, TM_CFG_TID_PRE_SCAN_ROWS, (u64)0);
188314b24e2bSVaishali Kulkarni 
188414b24e2bSVaishali Kulkarni 		rt_reg = TM_REG_CONFIG_TASK_MEM_RT_OFFSET +
188514b24e2bSVaishali Kulkarni 			 (sizeof(cfg_word) / sizeof(u32)) *
188614b24e2bSVaishali Kulkarni 			 (NUM_OF_VFS(p_hwfn->p_dev) +
188714b24e2bSVaishali Kulkarni 			 p_hwfn->rel_pf_id * NUM_TASK_PF_SEGMENTS + i);
188814b24e2bSVaishali Kulkarni 
188914b24e2bSVaishali Kulkarni 		STORE_RT_REG_AGG(p_hwfn, rt_reg, cfg_word);
189014b24e2bSVaishali Kulkarni 		active_seg_mask |= (tm_iids.pf_tids[i] ? (1 << i) : 0);
189114b24e2bSVaishali Kulkarni 
189214b24e2bSVaishali Kulkarni 		tm_offset += tm_iids.pf_tids[i];
189314b24e2bSVaishali Kulkarni 	}
189414b24e2bSVaishali Kulkarni 
189514b24e2bSVaishali Kulkarni 	if (ECORE_IS_RDMA_PERSONALITY(p_hwfn))
189614b24e2bSVaishali Kulkarni 		active_seg_mask = 0;
189714b24e2bSVaishali Kulkarni 
189814b24e2bSVaishali Kulkarni 	STORE_RT_REG(p_hwfn, TM_REG_PF_ENABLE_TASK_RT_OFFSET, active_seg_mask);
189914b24e2bSVaishali Kulkarni 
190014b24e2bSVaishali Kulkarni 	/* @@@TBD how to enable the scan for the VFs */
190114b24e2bSVaishali Kulkarni }
190214b24e2bSVaishali Kulkarni 
ecore_prs_init_common(struct ecore_hwfn * p_hwfn)190314b24e2bSVaishali Kulkarni static void ecore_prs_init_common(struct ecore_hwfn *p_hwfn)
190414b24e2bSVaishali Kulkarni {
190514b24e2bSVaishali Kulkarni 	if ((p_hwfn->hw_info.personality == ECORE_PCI_FCOE) &&
190614b24e2bSVaishali Kulkarni 	    p_hwfn->pf_params.fcoe_pf_params.is_target)
190714b24e2bSVaishali Kulkarni 		STORE_RT_REG(p_hwfn, PRS_REG_SEARCH_RESP_INITIATOR_TYPE_RT_OFFSET, 0);
190814b24e2bSVaishali Kulkarni }
190914b24e2bSVaishali Kulkarni 
ecore_prs_init_pf(struct ecore_hwfn * p_hwfn)191014b24e2bSVaishali Kulkarni static void ecore_prs_init_pf(struct ecore_hwfn *p_hwfn)
191114b24e2bSVaishali Kulkarni {
191214b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
191314b24e2bSVaishali Kulkarni 	struct ecore_conn_type_cfg *p_fcoe = &p_mngr->conn_cfg[PROTOCOLID_FCOE];
191414b24e2bSVaishali Kulkarni 	struct ecore_tid_seg *p_tid;
191514b24e2bSVaishali Kulkarni 
191614b24e2bSVaishali Kulkarni 	/* If FCoE is active set the MAX OX_ID (tid) in the Parser */
191714b24e2bSVaishali Kulkarni 	if (!p_fcoe->cid_count)
191814b24e2bSVaishali Kulkarni 		return;
191914b24e2bSVaishali Kulkarni 
192014b24e2bSVaishali Kulkarni 	p_tid = &p_fcoe->tid_seg[ECORE_CXT_FCOE_TID_SEG];
192114b24e2bSVaishali Kulkarni 	if (p_hwfn->pf_params.fcoe_pf_params.is_target) {
192214b24e2bSVaishali Kulkarni 		STORE_RT_REG_AGG(p_hwfn,
192314b24e2bSVaishali Kulkarni 				 PRS_REG_TASK_ID_MAX_TARGET_PF_RT_OFFSET,
192414b24e2bSVaishali Kulkarni 				 p_tid->count);
192514b24e2bSVaishali Kulkarni 	} else {
192614b24e2bSVaishali Kulkarni 		STORE_RT_REG_AGG(p_hwfn,
192714b24e2bSVaishali Kulkarni 				PRS_REG_TASK_ID_MAX_INITIATOR_PF_RT_OFFSET,
192814b24e2bSVaishali Kulkarni 				p_tid->count);
192914b24e2bSVaishali Kulkarni 	}
193014b24e2bSVaishali Kulkarni }
193114b24e2bSVaishali Kulkarni 
ecore_cxt_hw_init_common(struct ecore_hwfn * p_hwfn)193214b24e2bSVaishali Kulkarni void ecore_cxt_hw_init_common(struct ecore_hwfn *p_hwfn)
193314b24e2bSVaishali Kulkarni {
193414b24e2bSVaishali Kulkarni 	/* CDU configuration */
193514b24e2bSVaishali Kulkarni 	ecore_cdu_init_common(p_hwfn);
193614b24e2bSVaishali Kulkarni 	ecore_prs_init_common(p_hwfn);
193714b24e2bSVaishali Kulkarni }
193814b24e2bSVaishali Kulkarni 
ecore_cxt_hw_init_pf(struct ecore_hwfn * p_hwfn)193914b24e2bSVaishali Kulkarni void ecore_cxt_hw_init_pf(struct ecore_hwfn *p_hwfn)
194014b24e2bSVaishali Kulkarni {
194114b24e2bSVaishali Kulkarni 	ecore_qm_init_pf(p_hwfn);
194214b24e2bSVaishali Kulkarni 	ecore_cm_init_pf(p_hwfn);
194314b24e2bSVaishali Kulkarni 	ecore_dq_init_pf(p_hwfn);
194414b24e2bSVaishali Kulkarni 	ecore_cdu_init_pf(p_hwfn);
194514b24e2bSVaishali Kulkarni 	ecore_ilt_init_pf(p_hwfn);
194614b24e2bSVaishali Kulkarni 	ecore_src_init_pf(p_hwfn);
194714b24e2bSVaishali Kulkarni 	ecore_tm_init_pf(p_hwfn);
194814b24e2bSVaishali Kulkarni 	ecore_prs_init_pf(p_hwfn);
194914b24e2bSVaishali Kulkarni }
195014b24e2bSVaishali Kulkarni 
_ecore_cxt_acquire_cid(struct ecore_hwfn * p_hwfn,enum protocol_type type,u32 * p_cid,u8 vfid)195114b24e2bSVaishali Kulkarni enum _ecore_status_t _ecore_cxt_acquire_cid(struct ecore_hwfn *p_hwfn,
195214b24e2bSVaishali Kulkarni 					    enum protocol_type type,
195314b24e2bSVaishali Kulkarni 					    u32 *p_cid, u8 vfid)
195414b24e2bSVaishali Kulkarni {
195514b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
195614b24e2bSVaishali Kulkarni 	struct ecore_cid_acquired_map *p_map;
195714b24e2bSVaishali Kulkarni 	u32 rel_cid;
195814b24e2bSVaishali Kulkarni 
195914b24e2bSVaishali Kulkarni 	if (type >= MAX_CONN_TYPES) {
196014b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Invalid protocol type %d", type);
196114b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
196214b24e2bSVaishali Kulkarni 	}
196314b24e2bSVaishali Kulkarni 
196414b24e2bSVaishali Kulkarni 	if (vfid >= COMMON_MAX_NUM_VFS && vfid != ECORE_CXT_PF_CID) {
196514b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "VF [%02x] is out of range\n", vfid);
196614b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
196714b24e2bSVaishali Kulkarni 	}
196814b24e2bSVaishali Kulkarni 
196914b24e2bSVaishali Kulkarni 	/* Determine the right map to take this CID from */
197014b24e2bSVaishali Kulkarni 	if (vfid == ECORE_CXT_PF_CID)
197114b24e2bSVaishali Kulkarni 		p_map = &p_mngr->acquired[type];
197214b24e2bSVaishali Kulkarni 	else
197314b24e2bSVaishali Kulkarni 		p_map = &p_mngr->acquired_vf[type][vfid];
197414b24e2bSVaishali Kulkarni 
197514b24e2bSVaishali Kulkarni 	if (p_map->cid_map == OSAL_NULL) {
197614b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Invalid protocol type %d", type);
197714b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
197814b24e2bSVaishali Kulkarni 	}
197914b24e2bSVaishali Kulkarni 
198014b24e2bSVaishali Kulkarni 	rel_cid = OSAL_FIND_FIRST_ZERO_BIT(p_map->cid_map,
198114b24e2bSVaishali Kulkarni 					   p_map->max_count);
198214b24e2bSVaishali Kulkarni 
198314b24e2bSVaishali Kulkarni 	if (rel_cid >= p_map->max_count) {
198414b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, false, "no CID available for protocol %d\n",
198514b24e2bSVaishali Kulkarni 			  type);
198614b24e2bSVaishali Kulkarni 		return ECORE_NORESOURCES;
198714b24e2bSVaishali Kulkarni 	}
198814b24e2bSVaishali Kulkarni 
198914b24e2bSVaishali Kulkarni 	OSAL_SET_BIT(rel_cid, p_map->cid_map);
199014b24e2bSVaishali Kulkarni 
199114b24e2bSVaishali Kulkarni 	*p_cid = rel_cid + p_map->start_cid;
199214b24e2bSVaishali Kulkarni 
199314b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_CXT,
199414b24e2bSVaishali Kulkarni 		   "Acquired cid 0x%08x [rel. %08x] vfid %02x type %d\n",
199514b24e2bSVaishali Kulkarni 		   *p_cid, rel_cid, vfid, type);
199614b24e2bSVaishali Kulkarni 
199714b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
199814b24e2bSVaishali Kulkarni }
199914b24e2bSVaishali Kulkarni 
ecore_cxt_acquire_cid(struct ecore_hwfn * p_hwfn,enum protocol_type type,u32 * p_cid)200014b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_cxt_acquire_cid(struct ecore_hwfn *p_hwfn,
200114b24e2bSVaishali Kulkarni 					   enum protocol_type type,
200214b24e2bSVaishali Kulkarni 					   u32 *p_cid)
200314b24e2bSVaishali Kulkarni {
200414b24e2bSVaishali Kulkarni 	return _ecore_cxt_acquire_cid(p_hwfn, type, p_cid, ECORE_CXT_PF_CID);
200514b24e2bSVaishali Kulkarni }
200614b24e2bSVaishali Kulkarni 
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)200714b24e2bSVaishali Kulkarni static bool ecore_cxt_test_cid_acquired(struct ecore_hwfn *p_hwfn,
200814b24e2bSVaishali Kulkarni 					u32 cid, u8 vfid,
200914b24e2bSVaishali Kulkarni 					enum protocol_type *p_type,
201014b24e2bSVaishali Kulkarni 					struct ecore_cid_acquired_map **pp_map)
201114b24e2bSVaishali Kulkarni {
201214b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
201314b24e2bSVaishali Kulkarni 	u32 rel_cid;
201414b24e2bSVaishali Kulkarni 
201514b24e2bSVaishali Kulkarni 	/* Iterate over protocols and find matching cid range */
201614b24e2bSVaishali Kulkarni 	for (*p_type = 0; *p_type < MAX_CONN_TYPES; (*p_type)++) {
201714b24e2bSVaishali Kulkarni 		if (vfid == ECORE_CXT_PF_CID)
201814b24e2bSVaishali Kulkarni 			*pp_map = &p_mngr->acquired[*p_type];
201914b24e2bSVaishali Kulkarni 		else
202014b24e2bSVaishali Kulkarni 			*pp_map = &p_mngr->acquired_vf[*p_type][vfid];
202114b24e2bSVaishali Kulkarni 
202214b24e2bSVaishali Kulkarni 		if (!((*pp_map)->cid_map))
202314b24e2bSVaishali Kulkarni 			continue;
202414b24e2bSVaishali Kulkarni 		if (cid >= (*pp_map)->start_cid &&
202514b24e2bSVaishali Kulkarni 		    cid < (*pp_map)->start_cid + (*pp_map)->max_count) {
202614b24e2bSVaishali Kulkarni 			break;
202714b24e2bSVaishali Kulkarni 		}
202814b24e2bSVaishali Kulkarni 	}
202914b24e2bSVaishali Kulkarni 
203014b24e2bSVaishali Kulkarni 	if (*p_type == MAX_CONN_TYPES) {
203114b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Invalid CID %d vfid %02x", cid, vfid);
203214b24e2bSVaishali Kulkarni 		goto fail;
203314b24e2bSVaishali Kulkarni 	}
203414b24e2bSVaishali Kulkarni 
203514b24e2bSVaishali Kulkarni 	rel_cid = cid - (*pp_map)->start_cid;
203614b24e2bSVaishali Kulkarni 	if (!OSAL_TEST_BIT(rel_cid, (*pp_map)->cid_map)) {
203714b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true,
203814b24e2bSVaishali Kulkarni 			  "CID %d [vifd %02x] not acquired", cid, vfid);
203914b24e2bSVaishali Kulkarni 		goto fail;
204014b24e2bSVaishali Kulkarni 	}
204114b24e2bSVaishali Kulkarni 
204214b24e2bSVaishali Kulkarni 	return true;
204314b24e2bSVaishali Kulkarni fail:
204414b24e2bSVaishali Kulkarni 	*p_type = MAX_CONN_TYPES;
204514b24e2bSVaishali Kulkarni 	*pp_map = OSAL_NULL;
204614b24e2bSVaishali Kulkarni 	return false;
204714b24e2bSVaishali Kulkarni }
204814b24e2bSVaishali Kulkarni 
_ecore_cxt_release_cid(struct ecore_hwfn * p_hwfn,u32 cid,u8 vfid)204914b24e2bSVaishali Kulkarni void _ecore_cxt_release_cid(struct ecore_hwfn *p_hwfn, u32 cid, u8 vfid)
205014b24e2bSVaishali Kulkarni {
205114b24e2bSVaishali Kulkarni 	struct ecore_cid_acquired_map *p_map = OSAL_NULL;
205214b24e2bSVaishali Kulkarni 	enum protocol_type type;
205314b24e2bSVaishali Kulkarni 	bool b_acquired;
205414b24e2bSVaishali Kulkarni 	u32 rel_cid;
205514b24e2bSVaishali Kulkarni 
205614b24e2bSVaishali Kulkarni 	if (vfid != ECORE_CXT_PF_CID && vfid > COMMON_MAX_NUM_VFS) {
205714b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true,
205814b24e2bSVaishali Kulkarni 			  "Trying to return incorrect CID belonging to VF %02x\n",
205914b24e2bSVaishali Kulkarni 			  vfid);
206014b24e2bSVaishali Kulkarni 		return;
206114b24e2bSVaishali Kulkarni 	}
206214b24e2bSVaishali Kulkarni 
206314b24e2bSVaishali Kulkarni 	/* Test acquired and find matching per-protocol map */
206414b24e2bSVaishali Kulkarni 	b_acquired = ecore_cxt_test_cid_acquired(p_hwfn, cid, vfid,
206514b24e2bSVaishali Kulkarni 						 &type, &p_map);
206614b24e2bSVaishali Kulkarni 
206714b24e2bSVaishali Kulkarni 	if (!b_acquired)
206814b24e2bSVaishali Kulkarni 		return;
206914b24e2bSVaishali Kulkarni 
207014b24e2bSVaishali Kulkarni 	rel_cid = cid - p_map->start_cid;
207114b24e2bSVaishali Kulkarni 	OSAL_CLEAR_BIT(rel_cid, p_map->cid_map);
207214b24e2bSVaishali Kulkarni 
207314b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_CXT,
207414b24e2bSVaishali Kulkarni 		   "Released CID 0x%08x [rel. %08x] vfid %02x type %d\n",
207514b24e2bSVaishali Kulkarni 		   cid, rel_cid, vfid, type);
207614b24e2bSVaishali Kulkarni }
207714b24e2bSVaishali Kulkarni 
ecore_cxt_release_cid(struct ecore_hwfn * p_hwfn,u32 cid)207814b24e2bSVaishali Kulkarni void ecore_cxt_release_cid(struct ecore_hwfn *p_hwfn, u32 cid)
207914b24e2bSVaishali Kulkarni {
208014b24e2bSVaishali Kulkarni 	_ecore_cxt_release_cid(p_hwfn, cid, ECORE_CXT_PF_CID);
208114b24e2bSVaishali Kulkarni }
208214b24e2bSVaishali Kulkarni 
ecore_cxt_get_cid_info(struct ecore_hwfn * p_hwfn,struct ecore_cxt_info * p_info)208314b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_cxt_get_cid_info(struct ecore_hwfn *p_hwfn,
208414b24e2bSVaishali Kulkarni 					    struct ecore_cxt_info *p_info)
208514b24e2bSVaishali Kulkarni {
208614b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
208714b24e2bSVaishali Kulkarni 	struct ecore_cid_acquired_map *p_map = OSAL_NULL;
208814b24e2bSVaishali Kulkarni 	u32 conn_cxt_size, hw_p_size, cxts_per_p, line;
208914b24e2bSVaishali Kulkarni 	enum protocol_type type;
209014b24e2bSVaishali Kulkarni 	bool b_acquired;
209114b24e2bSVaishali Kulkarni 
209214b24e2bSVaishali Kulkarni 	/* Test acquired and find matching per-protocol map */
209314b24e2bSVaishali Kulkarni 	b_acquired = ecore_cxt_test_cid_acquired(p_hwfn, p_info->iid,
209414b24e2bSVaishali Kulkarni 						 ECORE_CXT_PF_CID,
209514b24e2bSVaishali Kulkarni 						 &type, &p_map);
209614b24e2bSVaishali Kulkarni 
209714b24e2bSVaishali Kulkarni 	if (!b_acquired)
209814b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
209914b24e2bSVaishali Kulkarni 
210014b24e2bSVaishali Kulkarni 	/* set the protocl type */
210114b24e2bSVaishali Kulkarni 	p_info->type = type;
210214b24e2bSVaishali Kulkarni 
210314b24e2bSVaishali Kulkarni 	/* compute context virtual pointer */
210414b24e2bSVaishali Kulkarni 	hw_p_size = p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC].p_size.val;
210514b24e2bSVaishali Kulkarni 
210614b24e2bSVaishali Kulkarni 	conn_cxt_size = CONN_CXT_SIZE(p_hwfn);
210714b24e2bSVaishali Kulkarni 	cxts_per_p = ILT_PAGE_IN_BYTES(hw_p_size) / conn_cxt_size;
210814b24e2bSVaishali Kulkarni 	line = p_info->iid / cxts_per_p;
210914b24e2bSVaishali Kulkarni 
211014b24e2bSVaishali Kulkarni 	/* Make sure context is allocated (dynamic allocation) */
211114b24e2bSVaishali Kulkarni 	if (!p_mngr->ilt_shadow[line].p_virt)
211214b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
211314b24e2bSVaishali Kulkarni 
211414b24e2bSVaishali Kulkarni 	p_info->p_cxt = (u8 *)p_mngr->ilt_shadow[line].p_virt +
211514b24e2bSVaishali Kulkarni 			      p_info->iid % cxts_per_p * conn_cxt_size;
211614b24e2bSVaishali Kulkarni 
211714b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, (ECORE_MSG_ILT | ECORE_MSG_CXT),
211814b24e2bSVaishali Kulkarni 		   "Accessing ILT shadow[%d]: CXT pointer is at %p (for iid %d)\n",
211914b24e2bSVaishali Kulkarni 		   (p_info->iid / cxts_per_p), p_info->p_cxt, p_info->iid);
212014b24e2bSVaishali Kulkarni 
212114b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
212214b24e2bSVaishali Kulkarni }
212314b24e2bSVaishali Kulkarni 
ecore_cxt_set_srq_count(struct ecore_hwfn * p_hwfn,u32 num_srqs)212414b24e2bSVaishali Kulkarni static void ecore_cxt_set_srq_count(struct ecore_hwfn *p_hwfn, u32 num_srqs)
212514b24e2bSVaishali Kulkarni {
212614b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mgr = p_hwfn->p_cxt_mngr;
212714b24e2bSVaishali Kulkarni 
212814b24e2bSVaishali Kulkarni 	p_mgr->srq_count = num_srqs;
212914b24e2bSVaishali Kulkarni }
213014b24e2bSVaishali Kulkarni 
ecore_cxt_get_srq_count(struct ecore_hwfn * p_hwfn)213114b24e2bSVaishali Kulkarni u32 ecore_cxt_get_srq_count(struct ecore_hwfn *p_hwfn)
213214b24e2bSVaishali Kulkarni {
213314b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mgr = p_hwfn->p_cxt_mngr;
213414b24e2bSVaishali Kulkarni 
213514b24e2bSVaishali Kulkarni 	return p_mgr->srq_count;
213614b24e2bSVaishali Kulkarni }
213714b24e2bSVaishali Kulkarni 
ecore_rdma_set_pf_params(struct ecore_hwfn * p_hwfn,struct ecore_rdma_pf_params * p_params,u32 num_tasks)213814b24e2bSVaishali Kulkarni static void ecore_rdma_set_pf_params(struct ecore_hwfn *p_hwfn,
213914b24e2bSVaishali Kulkarni 				     struct ecore_rdma_pf_params *p_params,
214014b24e2bSVaishali Kulkarni 				     u32 num_tasks)
214114b24e2bSVaishali Kulkarni {
214214b24e2bSVaishali Kulkarni 	u32 num_cons, num_qps, num_srqs;
214314b24e2bSVaishali Kulkarni 	enum protocol_type proto;
214414b24e2bSVaishali Kulkarni 
214514b24e2bSVaishali Kulkarni 	/* Override personality with rdma flavor */
214614b24e2bSVaishali Kulkarni 	num_srqs = OSAL_MIN_T(u32, ECORE_RDMA_MAX_SRQS, p_params->num_srqs);
214714b24e2bSVaishali Kulkarni 
214814b24e2bSVaishali Kulkarni 	/* The only case RDMA personality can be overriden is if NVRAM is
214914b24e2bSVaishali Kulkarni 	 * configured with ETH_RDMA or if no rdma protocol was requested
215014b24e2bSVaishali Kulkarni 	 */
215114b24e2bSVaishali Kulkarni 	switch (p_params->rdma_protocol) {
215214b24e2bSVaishali Kulkarni 	case ECORE_RDMA_PROTOCOL_DEFAULT:
215314b24e2bSVaishali Kulkarni 		if (p_hwfn->mcp_info->func_info.protocol ==
215414b24e2bSVaishali Kulkarni 		    ECORE_PCI_ETH_RDMA) {
215514b24e2bSVaishali Kulkarni 			DP_NOTICE(p_hwfn, false,
215614b24e2bSVaishali Kulkarni 				  "Current day drivers don't support RoCE & iWARP. Default to RoCE-only\n");
215714b24e2bSVaishali Kulkarni 			p_hwfn->hw_info.personality = ECORE_PCI_ETH_ROCE;
215814b24e2bSVaishali Kulkarni 		}
215914b24e2bSVaishali Kulkarni 		break;
216014b24e2bSVaishali Kulkarni 	case ECORE_RDMA_PROTOCOL_NONE:
216114b24e2bSVaishali Kulkarni 		p_hwfn->hw_info.personality = ECORE_PCI_ETH;
216214b24e2bSVaishali Kulkarni 		return; /* intentional... nothing left to do... */
216314b24e2bSVaishali Kulkarni 	case ECORE_RDMA_PROTOCOL_ROCE:
216414b24e2bSVaishali Kulkarni 		if (p_hwfn->mcp_info->func_info.protocol == ECORE_PCI_ETH_RDMA)
216514b24e2bSVaishali Kulkarni 			p_hwfn->hw_info.personality = ECORE_PCI_ETH_ROCE;
216614b24e2bSVaishali Kulkarni 		break;
216714b24e2bSVaishali Kulkarni 	case ECORE_RDMA_PROTOCOL_IWARP:
216814b24e2bSVaishali Kulkarni 		if (p_hwfn->mcp_info->func_info.protocol == ECORE_PCI_ETH_RDMA)
216914b24e2bSVaishali Kulkarni 			p_hwfn->hw_info.personality = ECORE_PCI_ETH_IWARP;
217014b24e2bSVaishali Kulkarni 		break;
217114b24e2bSVaishali Kulkarni 	}
217214b24e2bSVaishali Kulkarni 
217314b24e2bSVaishali Kulkarni 	switch (p_hwfn->hw_info.personality) {
217414b24e2bSVaishali Kulkarni 	case ECORE_PCI_ETH_IWARP:
217514b24e2bSVaishali Kulkarni 		/* Each QP requires one connection */
217614b24e2bSVaishali Kulkarni 		num_cons = OSAL_MIN_T(u32, IWARP_MAX_QPS, p_params->num_qps);
217714b24e2bSVaishali Kulkarni #ifdef CONFIG_ECORE_IWARP /* required for the define */
217814b24e2bSVaishali Kulkarni 		/* additional connections required for passive tcp handling */
217914b24e2bSVaishali Kulkarni 		num_cons += ECORE_IWARP_PREALLOC_CNT;
218014b24e2bSVaishali Kulkarni #endif
218114b24e2bSVaishali Kulkarni 		proto = PROTOCOLID_IWARP;
218214b24e2bSVaishali Kulkarni 		p_params->roce_edpm_mode = false;
218314b24e2bSVaishali Kulkarni 		break;
218414b24e2bSVaishali Kulkarni 	case ECORE_PCI_ETH_ROCE:
218514b24e2bSVaishali Kulkarni 		num_qps = OSAL_MIN_T(u32, ROCE_MAX_QPS, p_params->num_qps);
218614b24e2bSVaishali Kulkarni 		num_cons = num_qps * 2; /* each QP requires two connections */
218714b24e2bSVaishali Kulkarni 		proto = PROTOCOLID_ROCE;
218814b24e2bSVaishali Kulkarni 		break;
218914b24e2bSVaishali Kulkarni 	default:
219014b24e2bSVaishali Kulkarni 		return;
219114b24e2bSVaishali Kulkarni 	}
219214b24e2bSVaishali Kulkarni 
219314b24e2bSVaishali Kulkarni 	if (num_cons && num_tasks) {
219414b24e2bSVaishali Kulkarni 		ecore_cxt_set_proto_cid_count(p_hwfn, proto,
219514b24e2bSVaishali Kulkarni 					      num_cons, 0);
219614b24e2bSVaishali Kulkarni 
219714b24e2bSVaishali Kulkarni 		/* Deliberatly passing ROCE for tasks id. This is because
219814b24e2bSVaishali Kulkarni 		 * iWARP / RoCE share the task id.
219914b24e2bSVaishali Kulkarni 		 */
220014b24e2bSVaishali Kulkarni 		ecore_cxt_set_proto_tid_count(p_hwfn, PROTOCOLID_ROCE,
220114b24e2bSVaishali Kulkarni 					      ECORE_CXT_ROCE_TID_SEG,
220214b24e2bSVaishali Kulkarni 					      1, /* RoCE segment type */
220314b24e2bSVaishali Kulkarni 					      num_tasks,
220414b24e2bSVaishali Kulkarni 					      false); /* !force load */
220514b24e2bSVaishali Kulkarni 		ecore_cxt_set_srq_count(p_hwfn, num_srqs);
220614b24e2bSVaishali Kulkarni 
220714b24e2bSVaishali Kulkarni 	} else {
220814b24e2bSVaishali Kulkarni 		DP_INFO(p_hwfn->p_dev,
220914b24e2bSVaishali Kulkarni 			"RDMA personality used without setting params!\n");
221014b24e2bSVaishali Kulkarni 	}
221114b24e2bSVaishali Kulkarni }
221214b24e2bSVaishali Kulkarni 
ecore_cxt_set_pf_params(struct ecore_hwfn * p_hwfn,u32 rdma_tasks)221314b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_cxt_set_pf_params(struct ecore_hwfn *p_hwfn,
221414b24e2bSVaishali Kulkarni 					     u32 rdma_tasks)
221514b24e2bSVaishali Kulkarni {
221614b24e2bSVaishali Kulkarni 	/* Set the number of required CORE connections */
221714b24e2bSVaishali Kulkarni 	u32 core_cids = 1; /* SPQ */
221814b24e2bSVaishali Kulkarni 
221914b24e2bSVaishali Kulkarni 	if (p_hwfn->using_ll2)
222014b24e2bSVaishali Kulkarni 		core_cids += 4; /* @@@TBD Use the proper #define */
222114b24e2bSVaishali Kulkarni 
222214b24e2bSVaishali Kulkarni 	ecore_cxt_set_proto_cid_count(p_hwfn, PROTOCOLID_CORE, core_cids, 0);
222314b24e2bSVaishali Kulkarni 
222414b24e2bSVaishali Kulkarni 	switch (p_hwfn->hw_info.personality) {
222514b24e2bSVaishali Kulkarni 	case ECORE_PCI_ETH_RDMA:
222614b24e2bSVaishali Kulkarni 	case ECORE_PCI_ETH_IWARP:
222714b24e2bSVaishali Kulkarni 	case ECORE_PCI_ETH_ROCE:
222814b24e2bSVaishali Kulkarni 		ecore_rdma_set_pf_params(p_hwfn,
222914b24e2bSVaishali Kulkarni 					 &p_hwfn->pf_params.rdma_pf_params,
223014b24e2bSVaishali Kulkarni 					 rdma_tasks);
223114b24e2bSVaishali Kulkarni 
223214b24e2bSVaishali Kulkarni 		/* no need for break since RoCE coexist with Ethernet */
2233*0d7de619SToomas Soome 		/* FALLTHROUGH */
223414b24e2bSVaishali Kulkarni 	case ECORE_PCI_ETH:
223514b24e2bSVaishali Kulkarni 	{
223614b24e2bSVaishali Kulkarni 		struct ecore_eth_pf_params *p_params =
223714b24e2bSVaishali Kulkarni 					&p_hwfn->pf_params.eth_pf_params;
223814b24e2bSVaishali Kulkarni 
223914b24e2bSVaishali Kulkarni 		if (!p_params->num_vf_cons)
224014b24e2bSVaishali Kulkarni 			p_params->num_vf_cons = ETH_PF_PARAMS_VF_CONS_DEFAULT;
224114b24e2bSVaishali Kulkarni 		ecore_cxt_set_proto_cid_count(p_hwfn, PROTOCOLID_ETH,
224214b24e2bSVaishali Kulkarni 					      p_params->num_cons,
224314b24e2bSVaishali Kulkarni 					      p_params->num_vf_cons);
224414b24e2bSVaishali Kulkarni 		p_hwfn->p_cxt_mngr->arfs_count = p_params->num_arfs_filters;
224514b24e2bSVaishali Kulkarni 
224614b24e2bSVaishali Kulkarni 		break;
224714b24e2bSVaishali Kulkarni 	}
224814b24e2bSVaishali Kulkarni 	case ECORE_PCI_FCOE:
224914b24e2bSVaishali Kulkarni 	{
225014b24e2bSVaishali Kulkarni 		struct ecore_fcoe_pf_params *p_params;
225114b24e2bSVaishali Kulkarni 
225214b24e2bSVaishali Kulkarni 		p_params = &p_hwfn->pf_params.fcoe_pf_params;
225314b24e2bSVaishali Kulkarni 
225414b24e2bSVaishali Kulkarni 		if (p_params->num_cons && p_params->num_tasks) {
225514b24e2bSVaishali Kulkarni 			ecore_cxt_set_proto_cid_count(p_hwfn, PROTOCOLID_FCOE,
225614b24e2bSVaishali Kulkarni 						      p_params->num_cons, 0);
225714b24e2bSVaishali Kulkarni 
225814b24e2bSVaishali Kulkarni 			ecore_cxt_set_proto_tid_count(p_hwfn, PROTOCOLID_FCOE,
225914b24e2bSVaishali Kulkarni 						      ECORE_CXT_FCOE_TID_SEG,
226014b24e2bSVaishali Kulkarni 						      0, /* segment type */
226114b24e2bSVaishali Kulkarni 						      p_params->num_tasks,
226214b24e2bSVaishali Kulkarni 						      true);
226314b24e2bSVaishali Kulkarni 		} else {
226414b24e2bSVaishali Kulkarni 			DP_INFO(p_hwfn->p_dev,
226514b24e2bSVaishali Kulkarni 				"Fcoe personality used without setting params!\n");
226614b24e2bSVaishali Kulkarni 		}
226714b24e2bSVaishali Kulkarni 		break;
226814b24e2bSVaishali Kulkarni 	}
226914b24e2bSVaishali Kulkarni 	case ECORE_PCI_ISCSI:
227014b24e2bSVaishali Kulkarni 	{
227114b24e2bSVaishali Kulkarni 		struct ecore_iscsi_pf_params *p_params;
227214b24e2bSVaishali Kulkarni 
227314b24e2bSVaishali Kulkarni 		p_params = &p_hwfn->pf_params.iscsi_pf_params;
227414b24e2bSVaishali Kulkarni 
227514b24e2bSVaishali Kulkarni 		if (p_params->num_cons && p_params->num_tasks) {
227614b24e2bSVaishali Kulkarni 			ecore_cxt_set_proto_cid_count(p_hwfn, PROTOCOLID_ISCSI,
227714b24e2bSVaishali Kulkarni 						      p_params->num_cons, 0);
227814b24e2bSVaishali Kulkarni 
227914b24e2bSVaishali Kulkarni 			ecore_cxt_set_proto_tid_count(p_hwfn, PROTOCOLID_ISCSI,
228014b24e2bSVaishali Kulkarni 						      ECORE_CXT_ISCSI_TID_SEG,
228114b24e2bSVaishali Kulkarni 						      0, /* segment type */
228214b24e2bSVaishali Kulkarni 						      p_params->num_tasks,
228314b24e2bSVaishali Kulkarni 						      true);
228414b24e2bSVaishali Kulkarni 		} else {
228514b24e2bSVaishali Kulkarni 			DP_INFO(p_hwfn->p_dev,
228614b24e2bSVaishali Kulkarni 				"Iscsi personality used without setting params!\n");
228714b24e2bSVaishali Kulkarni 		}
228814b24e2bSVaishali Kulkarni 		break;
228914b24e2bSVaishali Kulkarni 	}
229014b24e2bSVaishali Kulkarni 	default:
229114b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
229214b24e2bSVaishali Kulkarni 	}
229314b24e2bSVaishali Kulkarni 
229414b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
229514b24e2bSVaishali Kulkarni }
229614b24e2bSVaishali Kulkarni 
ecore_cxt_get_tid_mem_info(struct ecore_hwfn * p_hwfn,struct ecore_tid_mem * p_info)229714b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_cxt_get_tid_mem_info(struct ecore_hwfn *p_hwfn,
229814b24e2bSVaishali Kulkarni 						struct ecore_tid_mem *p_info)
229914b24e2bSVaishali Kulkarni {
230014b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
230114b24e2bSVaishali Kulkarni 	u32 proto, seg, total_lines, i, shadow_line;
230214b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *p_cli;
230314b24e2bSVaishali Kulkarni 	struct ecore_ilt_cli_blk *p_fl_seg;
230414b24e2bSVaishali Kulkarni 	struct ecore_tid_seg *p_seg_info;
230514b24e2bSVaishali Kulkarni 
230614b24e2bSVaishali Kulkarni 	/* Verify the personality */
230714b24e2bSVaishali Kulkarni 	switch (p_hwfn->hw_info.personality) {
230814b24e2bSVaishali Kulkarni 	case ECORE_PCI_FCOE:
230914b24e2bSVaishali Kulkarni 		proto = PROTOCOLID_FCOE;
231014b24e2bSVaishali Kulkarni 		seg = ECORE_CXT_FCOE_TID_SEG;
231114b24e2bSVaishali Kulkarni 		break;
231214b24e2bSVaishali Kulkarni 	case ECORE_PCI_ISCSI:
231314b24e2bSVaishali Kulkarni 		proto = PROTOCOLID_ISCSI;
231414b24e2bSVaishali Kulkarni 		seg = ECORE_CXT_ISCSI_TID_SEG;
231514b24e2bSVaishali Kulkarni 		break;
231614b24e2bSVaishali Kulkarni 	default:
231714b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
231814b24e2bSVaishali Kulkarni 	}
231914b24e2bSVaishali Kulkarni 
232014b24e2bSVaishali Kulkarni 	p_cli = &p_mngr->clients[ILT_CLI_CDUT];
232114b24e2bSVaishali Kulkarni 	if (!p_cli->active) {
232214b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
232314b24e2bSVaishali Kulkarni 	}
232414b24e2bSVaishali Kulkarni 
232514b24e2bSVaishali Kulkarni 	p_seg_info = &p_mngr->conn_cfg[proto].tid_seg[seg];
232614b24e2bSVaishali Kulkarni 	if (!p_seg_info->has_fl_mem)
232714b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
232814b24e2bSVaishali Kulkarni 
232914b24e2bSVaishali Kulkarni 	p_fl_seg = &p_cli->pf_blks[CDUT_FL_SEG_BLK(seg, PF)];
233014b24e2bSVaishali Kulkarni 	total_lines = DIV_ROUND_UP(p_fl_seg->total_size,
233114b24e2bSVaishali Kulkarni 				   p_fl_seg->real_size_in_page);
233214b24e2bSVaishali Kulkarni 
233314b24e2bSVaishali Kulkarni 	for (i = 0; i < total_lines; i++) {
233414b24e2bSVaishali Kulkarni 		shadow_line = i + p_fl_seg->start_line -
233514b24e2bSVaishali Kulkarni 			      p_hwfn->p_cxt_mngr->pf_start_line;
233614b24e2bSVaishali Kulkarni 		p_info->blocks[i] = p_mngr->ilt_shadow[shadow_line].p_virt;
233714b24e2bSVaishali Kulkarni 	}
233814b24e2bSVaishali Kulkarni 	p_info->waste = ILT_PAGE_IN_BYTES(p_cli->p_size.val) -
233914b24e2bSVaishali Kulkarni 			p_fl_seg->real_size_in_page;
234014b24e2bSVaishali Kulkarni 	p_info->tid_size = p_mngr->task_type_size[p_seg_info->type];
234114b24e2bSVaishali Kulkarni 	p_info->num_tids_per_block = p_fl_seg->real_size_in_page /
234214b24e2bSVaishali Kulkarni 				     p_info->tid_size;
234314b24e2bSVaishali Kulkarni 
234414b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
234514b24e2bSVaishali Kulkarni }
234614b24e2bSVaishali Kulkarni 
234714b24e2bSVaishali Kulkarni /* This function is very RoCE oriented, if another protocol in the future
234814b24e2bSVaishali Kulkarni  * will want this feature we'll need to modify the function to be more generic
234914b24e2bSVaishali Kulkarni  */
235014b24e2bSVaishali Kulkarni enum _ecore_status_t
ecore_cxt_dynamic_ilt_alloc(struct ecore_hwfn * p_hwfn,enum ecore_cxt_elem_type elem_type,u32 iid)235114b24e2bSVaishali Kulkarni ecore_cxt_dynamic_ilt_alloc(struct ecore_hwfn *p_hwfn,
235214b24e2bSVaishali Kulkarni 			    enum ecore_cxt_elem_type elem_type,
235314b24e2bSVaishali Kulkarni 			    u32 iid)
235414b24e2bSVaishali Kulkarni {
235514b24e2bSVaishali Kulkarni 	u32 reg_offset, shadow_line, elem_size, hw_p_size, elems_per_p, line;
235614b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *p_cli;
235714b24e2bSVaishali Kulkarni 	struct ecore_ilt_cli_blk *p_blk;
235814b24e2bSVaishali Kulkarni 	struct ecore_ptt *p_ptt;
235914b24e2bSVaishali Kulkarni 	dma_addr_t p_phys;
236014b24e2bSVaishali Kulkarni 	u64 ilt_hw_entry;
236114b24e2bSVaishali Kulkarni 	void *p_virt;
236214b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_SUCCESS;
236314b24e2bSVaishali Kulkarni 
236414b24e2bSVaishali Kulkarni 	switch (elem_type) {
236514b24e2bSVaishali Kulkarni 	case ECORE_ELEM_CXT:
236614b24e2bSVaishali Kulkarni 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC];
236714b24e2bSVaishali Kulkarni 		elem_size = CONN_CXT_SIZE(p_hwfn);
236814b24e2bSVaishali Kulkarni 		p_blk = &p_cli->pf_blks[CDUC_BLK];
236914b24e2bSVaishali Kulkarni 		break;
237014b24e2bSVaishali Kulkarni 	case ECORE_ELEM_SRQ:
237114b24e2bSVaishali Kulkarni 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_TSDM];
237214b24e2bSVaishali Kulkarni 		elem_size = SRQ_CXT_SIZE;
237314b24e2bSVaishali Kulkarni 		p_blk = &p_cli->pf_blks[SRQ_BLK];
237414b24e2bSVaishali Kulkarni 		break;
237514b24e2bSVaishali Kulkarni 	case ECORE_ELEM_TASK:
237614b24e2bSVaishali Kulkarni 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
237714b24e2bSVaishali Kulkarni 		elem_size = TYPE1_TASK_CXT_SIZE(p_hwfn);
237814b24e2bSVaishali Kulkarni 		p_blk = &p_cli->pf_blks[CDUT_SEG_BLK(ECORE_CXT_ROCE_TID_SEG)];
237914b24e2bSVaishali Kulkarni 		break;
238014b24e2bSVaishali Kulkarni 	default:
238114b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, false,
238214b24e2bSVaishali Kulkarni 			  "ECORE_INVALID elem type = %d", elem_type);
238314b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
238414b24e2bSVaishali Kulkarni 	}
238514b24e2bSVaishali Kulkarni 
238614b24e2bSVaishali Kulkarni 	/* Calculate line in ilt */
238714b24e2bSVaishali Kulkarni 	hw_p_size = p_cli->p_size.val;
238814b24e2bSVaishali Kulkarni 	elems_per_p = ILT_PAGE_IN_BYTES(hw_p_size) / elem_size;
238914b24e2bSVaishali Kulkarni 	line = p_blk->start_line + (iid / elems_per_p);
239014b24e2bSVaishali Kulkarni 	shadow_line = line - p_hwfn->p_cxt_mngr->pf_start_line;
239114b24e2bSVaishali Kulkarni 
239214b24e2bSVaishali Kulkarni 	/* If line is already allocated, do nothing, otherwise allocate it and
239314b24e2bSVaishali Kulkarni 	 * write it to the PSWRQ2 registers.
239414b24e2bSVaishali Kulkarni 	 * This section can be run in parallel from different contexts and thus
239514b24e2bSVaishali Kulkarni 	 * a mutex protection is needed.
239614b24e2bSVaishali Kulkarni 	 */
239714b24e2bSVaishali Kulkarni 
239814b24e2bSVaishali Kulkarni 	OSAL_MUTEX_ACQUIRE(&p_hwfn->p_cxt_mngr->mutex);
239914b24e2bSVaishali Kulkarni 
240014b24e2bSVaishali Kulkarni 	if (p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].p_virt)
240114b24e2bSVaishali Kulkarni 		goto out0;
240214b24e2bSVaishali Kulkarni 
240314b24e2bSVaishali Kulkarni 	p_ptt = ecore_ptt_acquire(p_hwfn);
240414b24e2bSVaishali Kulkarni 	if (!p_ptt) {
240514b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, false,
240614b24e2bSVaishali Kulkarni 			  "ECORE_TIME_OUT on ptt acquire - dynamic allocation");
240714b24e2bSVaishali Kulkarni 		rc = ECORE_TIMEOUT;
240814b24e2bSVaishali Kulkarni 		goto out0;
240914b24e2bSVaishali Kulkarni 	}
241014b24e2bSVaishali Kulkarni 
241114b24e2bSVaishali Kulkarni 	p_virt = OSAL_DMA_ALLOC_COHERENT(p_hwfn->p_dev,
241214b24e2bSVaishali Kulkarni 					 &p_phys,
241314b24e2bSVaishali Kulkarni 					 p_blk->real_size_in_page);
241414b24e2bSVaishali Kulkarni 	if (!p_virt) {
241514b24e2bSVaishali Kulkarni 		rc = ECORE_NOMEM;
241614b24e2bSVaishali Kulkarni 		goto out1;
241714b24e2bSVaishali Kulkarni 	}
241814b24e2bSVaishali Kulkarni 	OSAL_MEM_ZERO(p_virt, p_blk->real_size_in_page);
241914b24e2bSVaishali Kulkarni 
242014b24e2bSVaishali Kulkarni 	/* configuration of refTagMask to 0xF is required for RoCE DIF MR only,
242114b24e2bSVaishali Kulkarni 	 * to compensate for a HW bug, but it is configured even if DIF is not
242214b24e2bSVaishali Kulkarni 	 * enabled. This is harmless and allows us to avoid a dedicated API. We
242314b24e2bSVaishali Kulkarni 	 * configure the field for all of the contexts on the newly allocated
242414b24e2bSVaishali Kulkarni 	 * page.
242514b24e2bSVaishali Kulkarni 	 */
242614b24e2bSVaishali Kulkarni 	if (elem_type == ECORE_ELEM_TASK) {
242714b24e2bSVaishali Kulkarni 		u32 elem_i;
242814b24e2bSVaishali Kulkarni 		u8 *elem_start = (u8 *)p_virt;
242914b24e2bSVaishali Kulkarni 		union type1_task_context *elem;
243014b24e2bSVaishali Kulkarni 
243114b24e2bSVaishali Kulkarni 		for (elem_i = 0; elem_i < elems_per_p; elem_i++) {
243214b24e2bSVaishali Kulkarni 			elem = (union type1_task_context *)elem_start;
243314b24e2bSVaishali Kulkarni 			SET_FIELD(elem->roce_ctx.tdif_context.flags1,
243414b24e2bSVaishali Kulkarni 				  TDIF_TASK_CONTEXT_REFTAGMASK , 0xf);
243514b24e2bSVaishali Kulkarni 			elem_start += TYPE1_TASK_CXT_SIZE(p_hwfn);
243614b24e2bSVaishali Kulkarni 		}
243714b24e2bSVaishali Kulkarni 	}
243814b24e2bSVaishali Kulkarni 
243914b24e2bSVaishali Kulkarni 	p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].p_virt = p_virt;
244014b24e2bSVaishali Kulkarni 	p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].p_phys = p_phys;
244114b24e2bSVaishali Kulkarni 	p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].size =
244214b24e2bSVaishali Kulkarni 		p_blk->real_size_in_page;
244314b24e2bSVaishali Kulkarni 
244414b24e2bSVaishali Kulkarni 	/* compute absolute offset */
244514b24e2bSVaishali Kulkarni 	reg_offset = PSWRQ2_REG_ILT_MEMORY +
244614b24e2bSVaishali Kulkarni 		     (line * ILT_REG_SIZE_IN_BYTES * ILT_ENTRY_IN_REGS);
244714b24e2bSVaishali Kulkarni 
244814b24e2bSVaishali Kulkarni 	ilt_hw_entry = 0;
244914b24e2bSVaishali Kulkarni 	SET_FIELD(ilt_hw_entry, ILT_ENTRY_VALID, 1ULL);
245014b24e2bSVaishali Kulkarni 	SET_FIELD(ilt_hw_entry,
245114b24e2bSVaishali Kulkarni 		  ILT_ENTRY_PHY_ADDR,
245214b24e2bSVaishali Kulkarni 		  (p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].p_phys >> 12));
245314b24e2bSVaishali Kulkarni 
245414b24e2bSVaishali Kulkarni 	/* Write via DMAE since the PSWRQ2_REG_ILT_MEMORY line is a wide-bus */
245514b24e2bSVaishali Kulkarni 	ecore_dmae_host2grc(p_hwfn, p_ptt, (u64)(osal_uintptr_t)&ilt_hw_entry,
245614b24e2bSVaishali Kulkarni 			    reg_offset, sizeof(ilt_hw_entry) / sizeof(u32),
245714b24e2bSVaishali Kulkarni 			    0 /* no flags */);
245814b24e2bSVaishali Kulkarni 
245914b24e2bSVaishali Kulkarni 	if (elem_type == ECORE_ELEM_CXT) {
246014b24e2bSVaishali Kulkarni 		u32 last_cid_allocated = (1 + (iid / elems_per_p)) *
246114b24e2bSVaishali Kulkarni 					 elems_per_p;
246214b24e2bSVaishali Kulkarni 
246314b24e2bSVaishali Kulkarni 		/* Update the relevant register in the parser */
246414b24e2bSVaishali Kulkarni 		ecore_wr(p_hwfn, p_ptt, PRS_REG_ROCE_DEST_QP_MAX_PF,
246514b24e2bSVaishali Kulkarni 			 last_cid_allocated - 1);
246614b24e2bSVaishali Kulkarni 
246714b24e2bSVaishali Kulkarni 		/* RoCE w/a -> we don't write to the prs search reg until first
246814b24e2bSVaishali Kulkarni 		 * cid is allocated. This is because the prs checks
246914b24e2bSVaishali Kulkarni 		 * last_cid-1 >=0 making 0 a valid value... this will cause
247014b24e2bSVaishali Kulkarni 		 * the a context load to occur on a RoCE packet received with
247114b24e2bSVaishali Kulkarni 		 * cid=0 even before context was initialized, can happen with a
247214b24e2bSVaishali Kulkarni 		 * stray packet from switch or a packet with crc-error
247314b24e2bSVaishali Kulkarni 		 */
247414b24e2bSVaishali Kulkarni 
247514b24e2bSVaishali Kulkarni 		if (!p_hwfn->b_rdma_enabled_in_prs) {
247614b24e2bSVaishali Kulkarni 			/* Enable Rdma search */
247714b24e2bSVaishali Kulkarni 			ecore_wr(p_hwfn, p_ptt, p_hwfn->rdma_prs_search_reg, 1);
247814b24e2bSVaishali Kulkarni 			p_hwfn->b_rdma_enabled_in_prs = true;
247914b24e2bSVaishali Kulkarni 		}
248014b24e2bSVaishali Kulkarni 	}
248114b24e2bSVaishali Kulkarni 
248214b24e2bSVaishali Kulkarni out1:
248314b24e2bSVaishali Kulkarni 	ecore_ptt_release(p_hwfn, p_ptt);
248414b24e2bSVaishali Kulkarni out0:
248514b24e2bSVaishali Kulkarni 	OSAL_MUTEX_RELEASE(&p_hwfn->p_cxt_mngr->mutex);
248614b24e2bSVaishali Kulkarni 
248714b24e2bSVaishali Kulkarni 	return rc;
248814b24e2bSVaishali Kulkarni }
248914b24e2bSVaishali Kulkarni 
249014b24e2bSVaishali Kulkarni /* This function is very RoCE oriented, if another protocol in the future
249114b24e2bSVaishali Kulkarni  * will want this feature we'll need to modify the function to be more generic
249214b24e2bSVaishali Kulkarni  */
249314b24e2bSVaishali Kulkarni 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)249414b24e2bSVaishali Kulkarni ecore_cxt_free_ilt_range(struct ecore_hwfn *p_hwfn,
249514b24e2bSVaishali Kulkarni 			 enum ecore_cxt_elem_type elem_type,
249614b24e2bSVaishali Kulkarni 			 u32 start_iid, u32 count)
249714b24e2bSVaishali Kulkarni {
249814b24e2bSVaishali Kulkarni 	u32 start_line, end_line, shadow_start_line, shadow_end_line;
249914b24e2bSVaishali Kulkarni 	u32 reg_offset, elem_size, hw_p_size, elems_per_p;
250014b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg *p_cli;
250114b24e2bSVaishali Kulkarni 	struct ecore_ilt_cli_blk *p_blk;
250214b24e2bSVaishali Kulkarni 	u32 end_iid = start_iid + count;
250314b24e2bSVaishali Kulkarni 	struct ecore_ptt *p_ptt;
250414b24e2bSVaishali Kulkarni 	u64 ilt_hw_entry = 0;
250514b24e2bSVaishali Kulkarni 	u32 i;
250614b24e2bSVaishali Kulkarni 
250714b24e2bSVaishali Kulkarni 	switch (elem_type) {
250814b24e2bSVaishali Kulkarni 	case ECORE_ELEM_CXT:
250914b24e2bSVaishali Kulkarni 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC];
251014b24e2bSVaishali Kulkarni 		elem_size = CONN_CXT_SIZE(p_hwfn);
251114b24e2bSVaishali Kulkarni 		p_blk = &p_cli->pf_blks[CDUC_BLK];
251214b24e2bSVaishali Kulkarni 		break;
251314b24e2bSVaishali Kulkarni 	case ECORE_ELEM_SRQ:
251414b24e2bSVaishali Kulkarni 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_TSDM];
251514b24e2bSVaishali Kulkarni 		elem_size = SRQ_CXT_SIZE;
251614b24e2bSVaishali Kulkarni 		p_blk = &p_cli->pf_blks[SRQ_BLK];
251714b24e2bSVaishali Kulkarni 		break;
251814b24e2bSVaishali Kulkarni 	case ECORE_ELEM_TASK:
251914b24e2bSVaishali Kulkarni 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
252014b24e2bSVaishali Kulkarni 		elem_size = TYPE1_TASK_CXT_SIZE(p_hwfn);
252114b24e2bSVaishali Kulkarni 		p_blk = &p_cli->pf_blks[CDUT_SEG_BLK(ECORE_CXT_ROCE_TID_SEG)];
252214b24e2bSVaishali Kulkarni 		break;
252314b24e2bSVaishali Kulkarni 	default:
252414b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, false,
252514b24e2bSVaishali Kulkarni 			  "ECORE_INVALID elem type = %d", elem_type);
252614b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
252714b24e2bSVaishali Kulkarni 	}
252814b24e2bSVaishali Kulkarni 
252914b24e2bSVaishali Kulkarni 	/* Calculate line in ilt */
253014b24e2bSVaishali Kulkarni 	hw_p_size = p_cli->p_size.val;
253114b24e2bSVaishali Kulkarni 	elems_per_p = ILT_PAGE_IN_BYTES(hw_p_size) / elem_size;
253214b24e2bSVaishali Kulkarni 	start_line = p_blk->start_line + (start_iid / elems_per_p);
253314b24e2bSVaishali Kulkarni 	end_line = p_blk->start_line + (end_iid / elems_per_p);
253414b24e2bSVaishali Kulkarni 	if (((end_iid + 1) / elems_per_p) != (end_iid / elems_per_p))
253514b24e2bSVaishali Kulkarni 		end_line--;
253614b24e2bSVaishali Kulkarni 
253714b24e2bSVaishali Kulkarni 	shadow_start_line = start_line - p_hwfn->p_cxt_mngr->pf_start_line;
253814b24e2bSVaishali Kulkarni 	shadow_end_line = end_line - p_hwfn->p_cxt_mngr->pf_start_line;
253914b24e2bSVaishali Kulkarni 
254014b24e2bSVaishali Kulkarni 	p_ptt = ecore_ptt_acquire(p_hwfn);
254114b24e2bSVaishali Kulkarni 	if (!p_ptt) {
254214b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, false, "ECORE_TIME_OUT on ptt acquire - dynamic allocation");
254314b24e2bSVaishali Kulkarni 		return ECORE_TIMEOUT;
254414b24e2bSVaishali Kulkarni 	}
254514b24e2bSVaishali Kulkarni 
254614b24e2bSVaishali Kulkarni 	for (i = shadow_start_line; i < shadow_end_line; i++) {
254714b24e2bSVaishali Kulkarni 		if (!p_hwfn->p_cxt_mngr->ilt_shadow[i].p_virt)
254814b24e2bSVaishali Kulkarni 			continue;
254914b24e2bSVaishali Kulkarni 
255014b24e2bSVaishali Kulkarni 		OSAL_DMA_FREE_COHERENT(p_hwfn->p_dev,
255114b24e2bSVaishali Kulkarni 				       p_hwfn->p_cxt_mngr->ilt_shadow[i].p_virt,
255214b24e2bSVaishali Kulkarni 				       p_hwfn->p_cxt_mngr->ilt_shadow[i].p_phys,
255314b24e2bSVaishali Kulkarni 				       p_hwfn->p_cxt_mngr->ilt_shadow[i].size);
255414b24e2bSVaishali Kulkarni 
255514b24e2bSVaishali Kulkarni 		p_hwfn->p_cxt_mngr->ilt_shadow[i].p_virt = OSAL_NULL;
255614b24e2bSVaishali Kulkarni 		p_hwfn->p_cxt_mngr->ilt_shadow[i].p_phys = 0;
255714b24e2bSVaishali Kulkarni 		p_hwfn->p_cxt_mngr->ilt_shadow[i].size = 0;
255814b24e2bSVaishali Kulkarni 
255914b24e2bSVaishali Kulkarni 		/* compute absolute offset */
256014b24e2bSVaishali Kulkarni 		reg_offset = PSWRQ2_REG_ILT_MEMORY +
256114b24e2bSVaishali Kulkarni 			     ((start_line++) * ILT_REG_SIZE_IN_BYTES *
256214b24e2bSVaishali Kulkarni 			      ILT_ENTRY_IN_REGS);
256314b24e2bSVaishali Kulkarni 
256414b24e2bSVaishali Kulkarni 		/* Write via DMAE since the PSWRQ2_REG_ILT_MEMORY line is a
256514b24e2bSVaishali Kulkarni 		 * wide-bus.
256614b24e2bSVaishali Kulkarni 		 */
256714b24e2bSVaishali Kulkarni 		ecore_dmae_host2grc(p_hwfn, p_ptt,
256814b24e2bSVaishali Kulkarni 				    (u64)(osal_uintptr_t)&ilt_hw_entry,
256914b24e2bSVaishali Kulkarni 				    reg_offset,
257014b24e2bSVaishali Kulkarni 				    sizeof(ilt_hw_entry) / sizeof(u32),
257114b24e2bSVaishali Kulkarni 				    0 /* no flags */);
257214b24e2bSVaishali Kulkarni 	}
257314b24e2bSVaishali Kulkarni 
257414b24e2bSVaishali Kulkarni 	ecore_ptt_release(p_hwfn, p_ptt);
257514b24e2bSVaishali Kulkarni 
257614b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
257714b24e2bSVaishali Kulkarni }
257814b24e2bSVaishali Kulkarni 
ecore_cxt_get_task_ctx(struct ecore_hwfn * p_hwfn,u32 tid,u8 ctx_type,void ** pp_task_ctx)257914b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_cxt_get_task_ctx(struct ecore_hwfn *p_hwfn,
258014b24e2bSVaishali Kulkarni 					    u32 tid,
258114b24e2bSVaishali Kulkarni 					    u8 ctx_type,
258214b24e2bSVaishali Kulkarni 					    void **pp_task_ctx)
258314b24e2bSVaishali Kulkarni {
258414b24e2bSVaishali Kulkarni 	struct ecore_cxt_mngr		*p_mngr = p_hwfn->p_cxt_mngr;
258514b24e2bSVaishali Kulkarni 	struct ecore_ilt_client_cfg     *p_cli;
258614b24e2bSVaishali Kulkarni 	struct ecore_ilt_cli_blk	*p_seg;
258714b24e2bSVaishali Kulkarni 	struct ecore_tid_seg		*p_seg_info;
258814b24e2bSVaishali Kulkarni 	u32				proto, seg;
258914b24e2bSVaishali Kulkarni 	u32				total_lines;
259014b24e2bSVaishali Kulkarni 	u32				tid_size, ilt_idx;
259114b24e2bSVaishali Kulkarni 	u32				num_tids_per_block;
259214b24e2bSVaishali Kulkarni 
259314b24e2bSVaishali Kulkarni 	/* Verify the personality */
259414b24e2bSVaishali Kulkarni 	switch (p_hwfn->hw_info.personality) {
259514b24e2bSVaishali Kulkarni 	case ECORE_PCI_FCOE:
259614b24e2bSVaishali Kulkarni 		proto = PROTOCOLID_FCOE;
259714b24e2bSVaishali Kulkarni 		seg = ECORE_CXT_FCOE_TID_SEG;
259814b24e2bSVaishali Kulkarni 		break;
259914b24e2bSVaishali Kulkarni 	case ECORE_PCI_ISCSI:
260014b24e2bSVaishali Kulkarni 		proto = PROTOCOLID_ISCSI;
260114b24e2bSVaishali Kulkarni 		seg = ECORE_CXT_ISCSI_TID_SEG;
260214b24e2bSVaishali Kulkarni 		break;
260314b24e2bSVaishali Kulkarni 	default:
260414b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
260514b24e2bSVaishali Kulkarni 	}
260614b24e2bSVaishali Kulkarni 
260714b24e2bSVaishali Kulkarni 	p_cli = &p_mngr->clients[ILT_CLI_CDUT];
260814b24e2bSVaishali Kulkarni 	if (!p_cli->active) {
260914b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
261014b24e2bSVaishali Kulkarni 	}
261114b24e2bSVaishali Kulkarni 
261214b24e2bSVaishali Kulkarni 	p_seg_info = &p_mngr->conn_cfg[proto].tid_seg[seg];
261314b24e2bSVaishali Kulkarni 
261414b24e2bSVaishali Kulkarni 	if (ctx_type == ECORE_CTX_WORKING_MEM) {
261514b24e2bSVaishali Kulkarni 		p_seg = &p_cli->pf_blks[CDUT_SEG_BLK(seg)];
261614b24e2bSVaishali Kulkarni 	} else if (ctx_type == ECORE_CTX_FL_MEM) {
261714b24e2bSVaishali Kulkarni 		if (!p_seg_info->has_fl_mem) {
261814b24e2bSVaishali Kulkarni 			return ECORE_INVAL;
261914b24e2bSVaishali Kulkarni 		}
262014b24e2bSVaishali Kulkarni 		p_seg = &p_cli->pf_blks[CDUT_FL_SEG_BLK(seg, PF)];
262114b24e2bSVaishali Kulkarni 	} else {
262214b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
262314b24e2bSVaishali Kulkarni 	}
262414b24e2bSVaishali Kulkarni 	total_lines = DIV_ROUND_UP(p_seg->total_size,
262514b24e2bSVaishali Kulkarni 				   p_seg->real_size_in_page);
262614b24e2bSVaishali Kulkarni 	tid_size = p_mngr->task_type_size[p_seg_info->type];
262714b24e2bSVaishali Kulkarni 	num_tids_per_block = p_seg->real_size_in_page / tid_size;
262814b24e2bSVaishali Kulkarni 
262914b24e2bSVaishali Kulkarni 	if (total_lines < tid/num_tids_per_block)
263014b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
263114b24e2bSVaishali Kulkarni 
263214b24e2bSVaishali Kulkarni 	ilt_idx = tid / num_tids_per_block + p_seg->start_line -
263314b24e2bSVaishali Kulkarni 		  p_mngr->pf_start_line;
263414b24e2bSVaishali Kulkarni 	*pp_task_ctx = (u8 *)p_mngr->ilt_shadow[ilt_idx].p_virt +
263514b24e2bSVaishali Kulkarni 			     (tid % num_tids_per_block) * tid_size;
263614b24e2bSVaishali Kulkarni 
263714b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
263814b24e2bSVaishali Kulkarni }
2639