xref: /freebsd/sys/dev/qlnx/qlnxe/ecore_cxt.c (revision 685dc743)
111e25f0dSDavid C Somayajulu /*
211e25f0dSDavid C Somayajulu  * Copyright (c) 2017-2018 Cavium, Inc.
311e25f0dSDavid C Somayajulu  * All rights reserved.
411e25f0dSDavid C Somayajulu  *
511e25f0dSDavid C Somayajulu  *  Redistribution and use in source and binary forms, with or without
611e25f0dSDavid C Somayajulu  *  modification, are permitted provided that the following conditions
711e25f0dSDavid C Somayajulu  *  are met:
811e25f0dSDavid C Somayajulu  *
911e25f0dSDavid C Somayajulu  *  1. Redistributions of source code must retain the above copyright
1011e25f0dSDavid C Somayajulu  *     notice, this list of conditions and the following disclaimer.
1111e25f0dSDavid C Somayajulu  *  2. Redistributions in binary form must reproduce the above copyright
1211e25f0dSDavid C Somayajulu  *     notice, this list of conditions and the following disclaimer in the
1311e25f0dSDavid C Somayajulu  *     documentation and/or other materials provided with the distribution.
1411e25f0dSDavid C Somayajulu  *
1511e25f0dSDavid C Somayajulu  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1611e25f0dSDavid C Somayajulu  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1711e25f0dSDavid C Somayajulu  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1811e25f0dSDavid C Somayajulu  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
1911e25f0dSDavid C Somayajulu  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2011e25f0dSDavid C Somayajulu  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2111e25f0dSDavid C Somayajulu  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2211e25f0dSDavid C Somayajulu  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2311e25f0dSDavid C Somayajulu  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2411e25f0dSDavid C Somayajulu  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2511e25f0dSDavid C Somayajulu  *  POSSIBILITY OF SUCH DAMAGE.
2611e25f0dSDavid C Somayajulu  */
2711e25f0dSDavid C Somayajulu 
2811e25f0dSDavid C Somayajulu /*
2911e25f0dSDavid C Somayajulu  * File : ecore_cxt.c
3011e25f0dSDavid C Somayajulu  */
3111e25f0dSDavid C Somayajulu #include <sys/cdefs.h>
3211e25f0dSDavid C Somayajulu #include "bcm_osal.h"
3311e25f0dSDavid C Somayajulu #include "reg_addr.h"
3411e25f0dSDavid C Somayajulu #include "common_hsi.h"
3511e25f0dSDavid C Somayajulu #include "ecore_hsi_common.h"
3611e25f0dSDavid C Somayajulu #include "ecore_hsi_eth.h"
3711e25f0dSDavid C Somayajulu #include "tcp_common.h"
3811e25f0dSDavid C Somayajulu #include "ecore_hsi_iscsi.h"
3911e25f0dSDavid C Somayajulu #include "ecore_hsi_fcoe.h"
4011e25f0dSDavid C Somayajulu #include "ecore_hsi_roce.h"
4111e25f0dSDavid C Somayajulu #include "ecore_hsi_iwarp.h"
4211e25f0dSDavid C Somayajulu #include "ecore_rt_defs.h"
4311e25f0dSDavid C Somayajulu #include "ecore_status.h"
4411e25f0dSDavid C Somayajulu #include "ecore.h"
4511e25f0dSDavid C Somayajulu #include "ecore_init_ops.h"
4611e25f0dSDavid C Somayajulu #include "ecore_init_fw_funcs.h"
4711e25f0dSDavid C Somayajulu #include "ecore_cxt.h"
4811e25f0dSDavid C Somayajulu #include "ecore_hw.h"
4911e25f0dSDavid C Somayajulu #include "ecore_dev_api.h"
5011e25f0dSDavid C Somayajulu #include "ecore_sriov.h"
51217ec208SDavid C Somayajulu #include "ecore_rdma.h"
5211e25f0dSDavid C Somayajulu #include "ecore_mcp.h"
5311e25f0dSDavid C Somayajulu 
5411e25f0dSDavid C Somayajulu /* Max number of connection types in HW (DQ/CDU etc.) */
5511e25f0dSDavid C Somayajulu #define MAX_CONN_TYPES		PROTOCOLID_COMMON
5611e25f0dSDavid C Somayajulu #define NUM_TASK_TYPES		2
5711e25f0dSDavid C Somayajulu #define NUM_TASK_PF_SEGMENTS	4
5811e25f0dSDavid C Somayajulu #define NUM_TASK_VF_SEGMENTS	1
5911e25f0dSDavid C Somayajulu 
6011e25f0dSDavid C Somayajulu /* Doorbell-Queue constants */
6111e25f0dSDavid C Somayajulu #define DQ_RANGE_SHIFT	4
6211e25f0dSDavid C Somayajulu #define DQ_RANGE_ALIGN	(1 << DQ_RANGE_SHIFT)
6311e25f0dSDavid C Somayajulu 
6411e25f0dSDavid C Somayajulu /* Searcher constants */
6511e25f0dSDavid C Somayajulu #define SRC_MIN_NUM_ELEMS 256
6611e25f0dSDavid C Somayajulu 
6711e25f0dSDavid C Somayajulu /* Timers constants */
6811e25f0dSDavid C Somayajulu #define TM_SHIFT	7
6911e25f0dSDavid C Somayajulu #define TM_ALIGN	(1 << TM_SHIFT)
7011e25f0dSDavid C Somayajulu #define TM_ELEM_SIZE	4
7111e25f0dSDavid C Somayajulu 
7211e25f0dSDavid C Somayajulu /* ILT constants */
7311e25f0dSDavid C Somayajulu #define ILT_PAGE_IN_BYTES(hw_p_size)	(1U << ((hw_p_size) + 12))
7411e25f0dSDavid C Somayajulu #define ILT_CFG_REG(cli, reg)		PSWRQ2_REG_##cli##_##reg##_RT_OFFSET
7511e25f0dSDavid C Somayajulu 
7611e25f0dSDavid C Somayajulu /* ILT entry structure */
7711e25f0dSDavid C Somayajulu #define ILT_ENTRY_PHY_ADDR_MASK		0x000FFFFFFFFFFFULL
7811e25f0dSDavid C Somayajulu #define ILT_ENTRY_PHY_ADDR_SHIFT	0
7911e25f0dSDavid C Somayajulu #define ILT_ENTRY_VALID_MASK		0x1ULL
8011e25f0dSDavid C Somayajulu #define ILT_ENTRY_VALID_SHIFT		52
8111e25f0dSDavid C Somayajulu #define ILT_ENTRY_IN_REGS		2
8211e25f0dSDavid C Somayajulu #define ILT_REG_SIZE_IN_BYTES		4
8311e25f0dSDavid C Somayajulu 
8411e25f0dSDavid C Somayajulu /* connection context union */
8511e25f0dSDavid C Somayajulu union conn_context {
869efd0ba7SDavid C Somayajulu 	struct e4_core_conn_context  core_ctx;
879efd0ba7SDavid C Somayajulu 	struct e4_eth_conn_context	  eth_ctx;
889efd0ba7SDavid C Somayajulu 	struct e4_iscsi_conn_context iscsi_ctx;
899efd0ba7SDavid C Somayajulu 	struct e4_fcoe_conn_context  fcoe_ctx;
909efd0ba7SDavid C Somayajulu 	struct e4_roce_conn_context  roce_ctx;
9111e25f0dSDavid C Somayajulu };
9211e25f0dSDavid C Somayajulu 
9311e25f0dSDavid C Somayajulu /* TYPE-0 task context - iSCSI, FCOE */
9411e25f0dSDavid C Somayajulu union type0_task_context {
959efd0ba7SDavid C Somayajulu 	struct e4_iscsi_task_context iscsi_ctx;
969efd0ba7SDavid C Somayajulu 	struct e4_fcoe_task_context  fcoe_ctx;
9711e25f0dSDavid C Somayajulu };
9811e25f0dSDavid C Somayajulu 
9911e25f0dSDavid C Somayajulu /* TYPE-1 task context - ROCE */
10011e25f0dSDavid C Somayajulu union type1_task_context {
1019efd0ba7SDavid C Somayajulu 	struct e4_rdma_task_context roce_ctx;
10211e25f0dSDavid C Somayajulu };
10311e25f0dSDavid C Somayajulu 
10411e25f0dSDavid C Somayajulu struct src_ent {
10511e25f0dSDavid C Somayajulu 	u8  opaque[56];
10611e25f0dSDavid C Somayajulu 	u64 next;
10711e25f0dSDavid C Somayajulu };
10811e25f0dSDavid C Somayajulu 
10911e25f0dSDavid C Somayajulu #define CDUT_SEG_ALIGNMET 3 /* in 4k chunks */
11011e25f0dSDavid C Somayajulu #define CDUT_SEG_ALIGNMET_IN_BYTES (1 << (CDUT_SEG_ALIGNMET + 12))
11111e25f0dSDavid C Somayajulu 
11211e25f0dSDavid C Somayajulu #define CONN_CXT_SIZE(p_hwfn) \
11311e25f0dSDavid C Somayajulu 	ALIGNED_TYPE_SIZE(union conn_context, p_hwfn)
11411e25f0dSDavid C Somayajulu 
11511e25f0dSDavid C Somayajulu #define SRQ_CXT_SIZE (sizeof(struct rdma_srq_context))
116217ec208SDavid C Somayajulu #define XRC_SRQ_CXT_SIZE (sizeof(struct rdma_xrc_srq_context))
11711e25f0dSDavid C Somayajulu 
11811e25f0dSDavid C Somayajulu #define TYPE0_TASK_CXT_SIZE(p_hwfn) \
11911e25f0dSDavid C Somayajulu 	ALIGNED_TYPE_SIZE(union type0_task_context, p_hwfn)
12011e25f0dSDavid C Somayajulu 
12111e25f0dSDavid C Somayajulu /* Alignment is inherent to the type1_task_context structure */
12211e25f0dSDavid C Somayajulu #define TYPE1_TASK_CXT_SIZE(p_hwfn) sizeof(union type1_task_context)
12311e25f0dSDavid C Somayajulu 
12411e25f0dSDavid C Somayajulu /* PF per protocl configuration object */
12511e25f0dSDavid C Somayajulu #define TASK_SEGMENTS   (NUM_TASK_PF_SEGMENTS + NUM_TASK_VF_SEGMENTS)
12611e25f0dSDavid C Somayajulu #define TASK_SEGMENT_VF (NUM_TASK_PF_SEGMENTS)
12711e25f0dSDavid C Somayajulu 
12811e25f0dSDavid C Somayajulu struct ecore_tid_seg {
12911e25f0dSDavid C Somayajulu 	u32	count;
13011e25f0dSDavid C Somayajulu 	u8	type;
13111e25f0dSDavid C Somayajulu 	bool	has_fl_mem;
13211e25f0dSDavid C Somayajulu };
13311e25f0dSDavid C Somayajulu 
13411e25f0dSDavid C Somayajulu struct ecore_conn_type_cfg {
13511e25f0dSDavid C Somayajulu 	u32			cid_count;
13611e25f0dSDavid C Somayajulu 	u32			cids_per_vf;
13711e25f0dSDavid C Somayajulu 	struct ecore_tid_seg	tid_seg[TASK_SEGMENTS];
13811e25f0dSDavid C Somayajulu };
13911e25f0dSDavid C Somayajulu 
14011e25f0dSDavid C Somayajulu /* ILT Client configuration,
14111e25f0dSDavid C Somayajulu  * Per connection type (protocol) resources (cids, tis, vf cids etc.)
14211e25f0dSDavid C Somayajulu  * 1 - for connection context (CDUC) and for each task context we need two
14311e25f0dSDavid C Somayajulu  * values, for regular task context and for force load memory
14411e25f0dSDavid C Somayajulu  */
14511e25f0dSDavid C Somayajulu #define ILT_CLI_PF_BLOCKS	(1 + NUM_TASK_PF_SEGMENTS * 2)
14611e25f0dSDavid C Somayajulu #define ILT_CLI_VF_BLOCKS	(1 + NUM_TASK_VF_SEGMENTS * 2)
14711e25f0dSDavid C Somayajulu #define CDUC_BLK		(0)
14811e25f0dSDavid C Somayajulu #define SRQ_BLK			(0)
14911e25f0dSDavid C Somayajulu #define CDUT_SEG_BLK(n)		(1 + (u8)(n))
15011e25f0dSDavid C Somayajulu #define CDUT_FL_SEG_BLK(n, X)	(1 + (n) + NUM_TASK_##X##_SEGMENTS)
15111e25f0dSDavid C Somayajulu 
15211e25f0dSDavid C Somayajulu struct ilt_cfg_pair {
15311e25f0dSDavid C Somayajulu 	u32 reg;
15411e25f0dSDavid C Somayajulu 	u32 val;
15511e25f0dSDavid C Somayajulu };
15611e25f0dSDavid C Somayajulu 
15711e25f0dSDavid C Somayajulu struct ecore_ilt_cli_blk {
15811e25f0dSDavid C Somayajulu 	u32 total_size; /* 0 means not active */
15911e25f0dSDavid C Somayajulu 	u32 real_size_in_page;
16011e25f0dSDavid C Somayajulu 	u32 start_line;
16111e25f0dSDavid C Somayajulu 	u32 dynamic_line_cnt;
16211e25f0dSDavid C Somayajulu };
16311e25f0dSDavid C Somayajulu 
16411e25f0dSDavid C Somayajulu struct ecore_ilt_client_cfg {
16511e25f0dSDavid C Somayajulu 	bool				active;
16611e25f0dSDavid C Somayajulu 
16711e25f0dSDavid C Somayajulu 	/* ILT boundaries */
16811e25f0dSDavid C Somayajulu 	struct ilt_cfg_pair		first;
16911e25f0dSDavid C Somayajulu 	struct ilt_cfg_pair		last;
17011e25f0dSDavid C Somayajulu 	struct ilt_cfg_pair		p_size;
17111e25f0dSDavid C Somayajulu 
17211e25f0dSDavid C Somayajulu 	/* ILT client blocks for PF */
17311e25f0dSDavid C Somayajulu 	struct ecore_ilt_cli_blk	pf_blks[ILT_CLI_PF_BLOCKS];
17411e25f0dSDavid C Somayajulu 	u32				pf_total_lines;
17511e25f0dSDavid C Somayajulu 
17611e25f0dSDavid C Somayajulu 	/* ILT client blocks for VFs */
17711e25f0dSDavid C Somayajulu 	struct ecore_ilt_cli_blk	vf_blks[ILT_CLI_VF_BLOCKS];
17811e25f0dSDavid C Somayajulu 	u32				vf_total_lines;
17911e25f0dSDavid C Somayajulu };
18011e25f0dSDavid C Somayajulu 
18111e25f0dSDavid C Somayajulu /* Per Path -
18211e25f0dSDavid C Somayajulu  *      ILT shadow table
18311e25f0dSDavid C Somayajulu  *      Protocol acquired CID lists
18411e25f0dSDavid C Somayajulu  *      PF start line in ILT
18511e25f0dSDavid C Somayajulu  */
18611e25f0dSDavid C Somayajulu struct ecore_dma_mem {
18711e25f0dSDavid C Somayajulu 	dma_addr_t	p_phys;
18811e25f0dSDavid C Somayajulu 	void		*p_virt;
18911e25f0dSDavid C Somayajulu 	osal_size_t	size;
19011e25f0dSDavid C Somayajulu };
19111e25f0dSDavid C Somayajulu 
19211e25f0dSDavid C Somayajulu #define MAP_WORD_SIZE		sizeof(unsigned long)
19311e25f0dSDavid C Somayajulu #define BITS_PER_MAP_WORD	(MAP_WORD_SIZE * 8)
19411e25f0dSDavid C Somayajulu 
19511e25f0dSDavid C Somayajulu struct ecore_cid_acquired_map {
19611e25f0dSDavid C Somayajulu 	u32		start_cid;
19711e25f0dSDavid C Somayajulu 	u32		max_count;
19811e25f0dSDavid C Somayajulu 	unsigned long	*cid_map;
19911e25f0dSDavid C Somayajulu };
20011e25f0dSDavid C Somayajulu 
20111e25f0dSDavid C Somayajulu struct ecore_cxt_mngr {
20211e25f0dSDavid C Somayajulu 	/* Per protocl configuration */
20311e25f0dSDavid C Somayajulu 	struct ecore_conn_type_cfg	conn_cfg[MAX_CONN_TYPES];
20411e25f0dSDavid C Somayajulu 
20511e25f0dSDavid C Somayajulu 	/* computed ILT structure */
20611e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg	clients[ILT_CLI_MAX];
20711e25f0dSDavid C Somayajulu 
20811e25f0dSDavid C Somayajulu 	/* Task type sizes */
20911e25f0dSDavid C Somayajulu 	u32				task_type_size[NUM_TASK_TYPES];
21011e25f0dSDavid C Somayajulu 
21111e25f0dSDavid C Somayajulu 	/* total number of VFs for this hwfn -
21211e25f0dSDavid C Somayajulu 	 * ALL VFs are symmetric in terms of HW resources
21311e25f0dSDavid C Somayajulu 	 */
21411e25f0dSDavid C Somayajulu 	u32				vf_count;
21511e25f0dSDavid C Somayajulu 
21611e25f0dSDavid C Somayajulu 	/* Acquired CIDs */
21711e25f0dSDavid C Somayajulu 	struct ecore_cid_acquired_map acquired[MAX_CONN_TYPES];
21811e25f0dSDavid C Somayajulu 	/* TBD - do we want this allocated to reserve space? */
21911e25f0dSDavid C Somayajulu 	struct ecore_cid_acquired_map acquired_vf[MAX_CONN_TYPES][COMMON_MAX_NUM_VFS];
22011e25f0dSDavid C Somayajulu 
22111e25f0dSDavid C Somayajulu 	/* ILT shadow table */
22211e25f0dSDavid C Somayajulu 	struct ecore_dma_mem		*ilt_shadow;
22311e25f0dSDavid C Somayajulu 	u32				pf_start_line;
22411e25f0dSDavid C Somayajulu 
22511e25f0dSDavid C Somayajulu 	/* Mutex for a dynamic ILT allocation */
22611e25f0dSDavid C Somayajulu 	osal_mutex_t			mutex;
22711e25f0dSDavid C Somayajulu 
22811e25f0dSDavid C Somayajulu 	/* SRC T2 */
22911e25f0dSDavid C Somayajulu 	struct ecore_dma_mem		*t2;
23011e25f0dSDavid C Somayajulu 	u32				t2_num_pages;
23111e25f0dSDavid C Somayajulu 	u64				first_free;
23211e25f0dSDavid C Somayajulu 	u64				last_free;
23311e25f0dSDavid C Somayajulu 
23411e25f0dSDavid C Somayajulu 	/* The infrastructure originally was very generic and context/task
23511e25f0dSDavid C Somayajulu 	 * oriented - per connection-type we would set how many of those
23611e25f0dSDavid C Somayajulu 	 * are needed, and later when determining how much memory we're
23711e25f0dSDavid C Somayajulu 	 * needing for a given block we'd iterate over all the relevant
23811e25f0dSDavid C Somayajulu 	 * connection-types.
23911e25f0dSDavid C Somayajulu 	 * But since then we've had some additional resources, some of which
240a87f167cSGordon Bergling 	 * require memory which is independent of the general context/task
24111e25f0dSDavid C Somayajulu 	 * scheme. We add those here explicitly per-feature.
24211e25f0dSDavid C Somayajulu 	 */
24311e25f0dSDavid C Somayajulu 
24411e25f0dSDavid C Somayajulu 	/* total number of SRQ's for this hwfn */
24511e25f0dSDavid C Somayajulu 	u32				srq_count;
246217ec208SDavid C Somayajulu 	u32				xrc_srq_count;
24711e25f0dSDavid C Somayajulu 
24811e25f0dSDavid C Somayajulu 	/* Maximal number of L2 steering filters */
24911e25f0dSDavid C Somayajulu 	u32				arfs_count;
25011e25f0dSDavid C Somayajulu 
25111e25f0dSDavid C Somayajulu 	/* TODO - VF arfs filters ? */
25211e25f0dSDavid C Somayajulu };
25311e25f0dSDavid C Somayajulu 
25411e25f0dSDavid C Somayajulu /* check if resources/configuration is required according to protocol type */
src_proto(enum protocol_type type)2559efd0ba7SDavid C Somayajulu static bool src_proto(enum protocol_type type)
25611e25f0dSDavid C Somayajulu {
25711e25f0dSDavid C Somayajulu 	return	type == PROTOCOLID_ISCSI	||
25811e25f0dSDavid C Somayajulu 		type == PROTOCOLID_FCOE		||
25911e25f0dSDavid C Somayajulu 		type == PROTOCOLID_IWARP;
26011e25f0dSDavid C Somayajulu }
26111e25f0dSDavid C Somayajulu 
tm_cid_proto(enum protocol_type type)26211e25f0dSDavid C Somayajulu static bool tm_cid_proto(enum protocol_type type)
26311e25f0dSDavid C Somayajulu {
26411e25f0dSDavid C Somayajulu 	return type == PROTOCOLID_ISCSI ||
26511e25f0dSDavid C Somayajulu 	       type == PROTOCOLID_FCOE  ||
26611e25f0dSDavid C Somayajulu 	       type == PROTOCOLID_ROCE  ||
26711e25f0dSDavid C Somayajulu 	       type == PROTOCOLID_IWARP;
26811e25f0dSDavid C Somayajulu }
26911e25f0dSDavid C Somayajulu 
tm_tid_proto(enum protocol_type type)27011e25f0dSDavid C Somayajulu static bool tm_tid_proto(enum protocol_type type)
27111e25f0dSDavid C Somayajulu {
27211e25f0dSDavid C Somayajulu 	return type == PROTOCOLID_FCOE;
27311e25f0dSDavid C Somayajulu }
27411e25f0dSDavid C Somayajulu 
27511e25f0dSDavid C Somayajulu /* counts the iids for the CDU/CDUC ILT client configuration */
27611e25f0dSDavid C Somayajulu struct ecore_cdu_iids {
27711e25f0dSDavid C Somayajulu 	u32 pf_cids;
27811e25f0dSDavid C Somayajulu 	u32 per_vf_cids;
27911e25f0dSDavid C Somayajulu };
28011e25f0dSDavid C Somayajulu 
ecore_cxt_cdu_iids(struct ecore_cxt_mngr * p_mngr,struct ecore_cdu_iids * iids)28111e25f0dSDavid C Somayajulu static void ecore_cxt_cdu_iids(struct ecore_cxt_mngr   *p_mngr,
28211e25f0dSDavid C Somayajulu 			       struct ecore_cdu_iids	*iids)
28311e25f0dSDavid C Somayajulu {
28411e25f0dSDavid C Somayajulu 	u32 type;
28511e25f0dSDavid C Somayajulu 
28611e25f0dSDavid C Somayajulu 	for (type = 0; type < MAX_CONN_TYPES; type++) {
28711e25f0dSDavid C Somayajulu 		iids->pf_cids += p_mngr->conn_cfg[type].cid_count;
28811e25f0dSDavid C Somayajulu 		iids->per_vf_cids += p_mngr->conn_cfg[type].cids_per_vf;
28911e25f0dSDavid C Somayajulu 	}
29011e25f0dSDavid C Somayajulu }
29111e25f0dSDavid C Somayajulu 
29211e25f0dSDavid C Somayajulu /* counts the iids for the Searcher block configuration */
29311e25f0dSDavid C Somayajulu struct ecore_src_iids {
29411e25f0dSDavid C Somayajulu 	u32			pf_cids;
29511e25f0dSDavid C Somayajulu 	u32			per_vf_cids;
29611e25f0dSDavid C Somayajulu };
29711e25f0dSDavid C Somayajulu 
ecore_cxt_src_iids(struct ecore_cxt_mngr * p_mngr,struct ecore_src_iids * iids)2989efd0ba7SDavid C Somayajulu static void ecore_cxt_src_iids(struct ecore_cxt_mngr *p_mngr,
29911e25f0dSDavid C Somayajulu 			       struct ecore_src_iids *iids)
30011e25f0dSDavid C Somayajulu {
30111e25f0dSDavid C Somayajulu 	u32 i;
30211e25f0dSDavid C Somayajulu 
30311e25f0dSDavid C Somayajulu 	for (i = 0; i < MAX_CONN_TYPES; i++) {
3049efd0ba7SDavid C Somayajulu 		if (!src_proto(i))
30511e25f0dSDavid C Somayajulu 			continue;
30611e25f0dSDavid C Somayajulu 
30711e25f0dSDavid C Somayajulu 		iids->pf_cids += p_mngr->conn_cfg[i].cid_count;
30811e25f0dSDavid C Somayajulu 		iids->per_vf_cids += p_mngr->conn_cfg[i].cids_per_vf;
30911e25f0dSDavid C Somayajulu 	}
31011e25f0dSDavid C Somayajulu 
31111e25f0dSDavid C Somayajulu 	/* Add L2 filtering filters in addition */
31211e25f0dSDavid C Somayajulu 	iids->pf_cids += p_mngr->arfs_count;
31311e25f0dSDavid C Somayajulu }
31411e25f0dSDavid C Somayajulu 
31511e25f0dSDavid C Somayajulu /* counts the iids for the Timers block configuration */
31611e25f0dSDavid C Somayajulu struct ecore_tm_iids {
31711e25f0dSDavid C Somayajulu 	u32 pf_cids;
31811e25f0dSDavid C Somayajulu 	u32 pf_tids[NUM_TASK_PF_SEGMENTS]; /* per segment */
31911e25f0dSDavid C Somayajulu 	u32 pf_tids_total;
32011e25f0dSDavid C Somayajulu 	u32 per_vf_cids;
32111e25f0dSDavid C Somayajulu 	u32 per_vf_tids;
32211e25f0dSDavid C Somayajulu };
32311e25f0dSDavid C Somayajulu 
ecore_cxt_tm_iids(struct ecore_cxt_mngr * p_mngr,struct ecore_tm_iids * iids)3249efd0ba7SDavid C Somayajulu static void ecore_cxt_tm_iids(struct ecore_cxt_mngr *p_mngr,
32511e25f0dSDavid C Somayajulu 			      struct ecore_tm_iids *iids)
32611e25f0dSDavid C Somayajulu {
32711e25f0dSDavid C Somayajulu 	bool tm_vf_required = false;
32811e25f0dSDavid C Somayajulu 	bool tm_required = false;
32911e25f0dSDavid C Somayajulu 	int i, j;
33011e25f0dSDavid C Somayajulu 
33111e25f0dSDavid C Somayajulu 	/* Timers is a special case -> we don't count how many cids require
33211e25f0dSDavid C Somayajulu 	 * timers but what's the max cid that will be used by the timer block.
33311e25f0dSDavid C Somayajulu 	 * therefore we traverse in reverse order, and once we hit a protocol
33411e25f0dSDavid C Somayajulu 	 * that requires the timers memory, we'll sum all the protocols up
33511e25f0dSDavid C Somayajulu 	 * to that one.
33611e25f0dSDavid C Somayajulu 	 */
33711e25f0dSDavid C Somayajulu 	for (i = MAX_CONN_TYPES - 1; i >= 0; i--) {
33811e25f0dSDavid C Somayajulu 		struct ecore_conn_type_cfg *p_cfg = &p_mngr->conn_cfg[i];
33911e25f0dSDavid C Somayajulu 
34011e25f0dSDavid C Somayajulu 		if (tm_cid_proto(i) || tm_required) {
34111e25f0dSDavid C Somayajulu 			if (p_cfg->cid_count)
34211e25f0dSDavid C Somayajulu 				tm_required = true;
34311e25f0dSDavid C Somayajulu 
34411e25f0dSDavid C Somayajulu 			iids->pf_cids += p_cfg->cid_count;
34511e25f0dSDavid C Somayajulu 		}
34611e25f0dSDavid C Somayajulu 
34711e25f0dSDavid C Somayajulu 		if (tm_cid_proto(i) || tm_vf_required) {
34811e25f0dSDavid C Somayajulu 			if (p_cfg->cids_per_vf)
34911e25f0dSDavid C Somayajulu 				tm_vf_required = true;
35011e25f0dSDavid C Somayajulu 
35111e25f0dSDavid C Somayajulu 			iids->per_vf_cids += p_cfg->cids_per_vf;
35211e25f0dSDavid C Somayajulu 		}
35311e25f0dSDavid C Somayajulu 
35411e25f0dSDavid C Somayajulu 		if (tm_tid_proto(i)) {
35511e25f0dSDavid C Somayajulu 			struct ecore_tid_seg *segs = p_cfg->tid_seg;
35611e25f0dSDavid C Somayajulu 
35711e25f0dSDavid C Somayajulu 			/* for each segment there is at most one
35811e25f0dSDavid C Somayajulu 			 * protocol for which count is not 0.
35911e25f0dSDavid C Somayajulu 			 */
36011e25f0dSDavid C Somayajulu 			for (j = 0; j < NUM_TASK_PF_SEGMENTS; j++)
36111e25f0dSDavid C Somayajulu 				iids->pf_tids[j] += segs[j].count;
36211e25f0dSDavid C Somayajulu 
36311e25f0dSDavid C Somayajulu 			/* The last array elelment is for the VFs. As for PF
36411e25f0dSDavid C Somayajulu 			 * segments there can be only one protocol for
36511e25f0dSDavid C Somayajulu 			 * which this value is not 0.
36611e25f0dSDavid C Somayajulu 			 */
36711e25f0dSDavid C Somayajulu 			iids->per_vf_tids += segs[NUM_TASK_PF_SEGMENTS].count;
36811e25f0dSDavid C Somayajulu 		}
36911e25f0dSDavid C Somayajulu 	}
37011e25f0dSDavid C Somayajulu 
37111e25f0dSDavid C Somayajulu 	iids->pf_cids = ROUNDUP(iids->pf_cids, TM_ALIGN);
37211e25f0dSDavid C Somayajulu 	iids->per_vf_cids = ROUNDUP(iids->per_vf_cids, TM_ALIGN);
37311e25f0dSDavid C Somayajulu 	iids->per_vf_tids = ROUNDUP(iids->per_vf_tids, TM_ALIGN);
37411e25f0dSDavid C Somayajulu 
37511e25f0dSDavid C Somayajulu 	for (iids->pf_tids_total = 0, j = 0; j < NUM_TASK_PF_SEGMENTS; j++) {
37611e25f0dSDavid C Somayajulu 		iids->pf_tids[j] = ROUNDUP(iids->pf_tids[j], TM_ALIGN);
37711e25f0dSDavid C Somayajulu 		iids->pf_tids_total += iids->pf_tids[j];
37811e25f0dSDavid C Somayajulu 	}
37911e25f0dSDavid C Somayajulu }
38011e25f0dSDavid C Somayajulu 
ecore_cxt_qm_iids(struct ecore_hwfn * p_hwfn,struct ecore_qm_iids * iids)38111e25f0dSDavid C Somayajulu static void ecore_cxt_qm_iids(struct ecore_hwfn *p_hwfn,
38211e25f0dSDavid C Somayajulu 			      struct ecore_qm_iids *iids)
38311e25f0dSDavid C Somayajulu {
38411e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
38511e25f0dSDavid C Somayajulu 	struct ecore_tid_seg *segs;
38611e25f0dSDavid C Somayajulu 	u32 vf_cids = 0, type, j;
38711e25f0dSDavid C Somayajulu 	u32 vf_tids = 0;
38811e25f0dSDavid C Somayajulu 
38911e25f0dSDavid C Somayajulu 	for (type = 0; type < MAX_CONN_TYPES; type++) {
39011e25f0dSDavid C Somayajulu 		iids->cids += p_mngr->conn_cfg[type].cid_count;
39111e25f0dSDavid C Somayajulu 		vf_cids += p_mngr->conn_cfg[type].cids_per_vf;
39211e25f0dSDavid C Somayajulu 
39311e25f0dSDavid C Somayajulu 		segs = p_mngr->conn_cfg[type].tid_seg;
39411e25f0dSDavid C Somayajulu 		/* for each segment there is at most one
39511e25f0dSDavid C Somayajulu 		 * protocol for which count is not 0.
39611e25f0dSDavid C Somayajulu 		 */
39711e25f0dSDavid C Somayajulu 		for (j = 0; j < NUM_TASK_PF_SEGMENTS; j++)
39811e25f0dSDavid C Somayajulu 			iids->tids += segs[j].count;
39911e25f0dSDavid C Somayajulu 
40011e25f0dSDavid C Somayajulu 		/* The last array elelment is for the VFs. As for PF
40111e25f0dSDavid C Somayajulu 		 * segments there can be only one protocol for
40211e25f0dSDavid C Somayajulu 		 * which this value is not 0.
40311e25f0dSDavid C Somayajulu 		 */
40411e25f0dSDavid C Somayajulu 		vf_tids += segs[NUM_TASK_PF_SEGMENTS].count;
40511e25f0dSDavid C Somayajulu 	}
40611e25f0dSDavid C Somayajulu 
40711e25f0dSDavid C Somayajulu 	iids->vf_cids += vf_cids * p_mngr->vf_count;
40811e25f0dSDavid C Somayajulu 	iids->tids += vf_tids * p_mngr->vf_count;
40911e25f0dSDavid C Somayajulu 
41011e25f0dSDavid C Somayajulu 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
41111e25f0dSDavid C Somayajulu 		   "iids: CIDS %08x vf_cids %08x tids %08x vf_tids %08x\n",
41211e25f0dSDavid C Somayajulu 		   iids->cids, iids->vf_cids, iids->tids, vf_tids);
41311e25f0dSDavid C Somayajulu }
41411e25f0dSDavid C Somayajulu 
ecore_cxt_tid_seg_info(struct ecore_hwfn * p_hwfn,u32 seg)41511e25f0dSDavid C Somayajulu static struct ecore_tid_seg *ecore_cxt_tid_seg_info(struct ecore_hwfn   *p_hwfn,
41611e25f0dSDavid C Somayajulu 						    u32			seg)
41711e25f0dSDavid C Somayajulu {
41811e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_cfg = p_hwfn->p_cxt_mngr;
41911e25f0dSDavid C Somayajulu 	u32 i;
42011e25f0dSDavid C Somayajulu 
42111e25f0dSDavid C Somayajulu 	/* Find the protocol with tid count > 0 for this segment.
42211e25f0dSDavid C Somayajulu 	   Note: there can only be one and this is already validated.
42311e25f0dSDavid C Somayajulu 	 */
42411e25f0dSDavid C Somayajulu 	for (i = 0; i < MAX_CONN_TYPES; i++) {
42511e25f0dSDavid C Somayajulu 		if (p_cfg->conn_cfg[i].tid_seg[seg].count)
42611e25f0dSDavid C Somayajulu 			return &p_cfg->conn_cfg[i].tid_seg[seg];
42711e25f0dSDavid C Somayajulu 	}
42811e25f0dSDavid C Somayajulu 	return OSAL_NULL;
42911e25f0dSDavid C Somayajulu }
43011e25f0dSDavid C Somayajulu 
ecore_cxt_set_srq_count(struct ecore_hwfn * p_hwfn,u32 num_srqs,u32 num_xrc_srqs)431217ec208SDavid C Somayajulu static void ecore_cxt_set_srq_count(struct ecore_hwfn *p_hwfn,
432217ec208SDavid C Somayajulu 				    u32 num_srqs, u32 num_xrc_srqs)
4339efd0ba7SDavid C Somayajulu {
4349efd0ba7SDavid C Somayajulu 	struct ecore_cxt_mngr *p_mgr = p_hwfn->p_cxt_mngr;
4359efd0ba7SDavid C Somayajulu 
4369efd0ba7SDavid C Somayajulu 	p_mgr->srq_count = num_srqs;
437217ec208SDavid C Somayajulu 	p_mgr->xrc_srq_count = num_xrc_srqs;
4389efd0ba7SDavid C Somayajulu }
4399efd0ba7SDavid C Somayajulu 
ecore_cxt_get_srq_count(struct ecore_hwfn * p_hwfn)4409efd0ba7SDavid C Somayajulu u32 ecore_cxt_get_srq_count(struct ecore_hwfn *p_hwfn)
4419efd0ba7SDavid C Somayajulu {
442217ec208SDavid C Somayajulu 	return p_hwfn->p_cxt_mngr->srq_count;
443217ec208SDavid C Somayajulu }
4449efd0ba7SDavid C Somayajulu 
ecore_cxt_get_xrc_srq_count(struct ecore_hwfn * p_hwfn)445217ec208SDavid C Somayajulu u32 ecore_cxt_get_xrc_srq_count(struct ecore_hwfn *p_hwfn)
446217ec208SDavid C Somayajulu {
447217ec208SDavid C Somayajulu 	return p_hwfn->p_cxt_mngr->xrc_srq_count;
448217ec208SDavid C Somayajulu }
449217ec208SDavid C Somayajulu 
ecore_cxt_get_ilt_page_size(struct ecore_hwfn * p_hwfn,enum ilt_clients ilt_client)450217ec208SDavid C Somayajulu u32 ecore_cxt_get_ilt_page_size(struct ecore_hwfn *p_hwfn,
451217ec208SDavid C Somayajulu 				enum ilt_clients ilt_client)
452217ec208SDavid C Somayajulu {
453217ec208SDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
454217ec208SDavid C Somayajulu 	struct ecore_ilt_client_cfg *p_cli = &p_mngr->clients[ilt_client];
455217ec208SDavid C Somayajulu 
456217ec208SDavid C Somayajulu 	return ILT_PAGE_IN_BYTES(p_cli->p_size.val);
457217ec208SDavid C Somayajulu }
458217ec208SDavid C Somayajulu 
ecore_cxt_srqs_per_page(struct ecore_hwfn * p_hwfn)459217ec208SDavid C Somayajulu static u32 ecore_cxt_srqs_per_page(struct ecore_hwfn *p_hwfn)
460217ec208SDavid C Somayajulu {
461217ec208SDavid C Somayajulu 	u32 page_size;
462217ec208SDavid C Somayajulu 
463217ec208SDavid C Somayajulu 	page_size = ecore_cxt_get_ilt_page_size(p_hwfn, ILT_CLI_TSDM);
464217ec208SDavid C Somayajulu 	return page_size / SRQ_CXT_SIZE;
465217ec208SDavid C Somayajulu }
466217ec208SDavid C Somayajulu 
ecore_cxt_get_total_srq_count(struct ecore_hwfn * p_hwfn)467217ec208SDavid C Somayajulu u32 ecore_cxt_get_total_srq_count(struct ecore_hwfn *p_hwfn)
468217ec208SDavid C Somayajulu {
469217ec208SDavid C Somayajulu 	struct ecore_cxt_mngr *p_mgr = p_hwfn->p_cxt_mngr;
470217ec208SDavid C Somayajulu 	u32 total_srqs;
471217ec208SDavid C Somayajulu 
472217ec208SDavid C Somayajulu 	total_srqs = p_mgr->srq_count;
473217ec208SDavid C Somayajulu 
474217ec208SDavid C Somayajulu 	/* XRC SRQs use the first and only the first SRQ ILT page. So if XRC
475217ec208SDavid C Somayajulu 	 * SRQs are requested we need to allocate an extra SRQ ILT page for
476217ec208SDavid C Somayajulu 	 * them. For that We increase the number of regular SRQs to cause the
477217ec208SDavid C Somayajulu 	 * allocation of that extra page.
478217ec208SDavid C Somayajulu 	 */
479217ec208SDavid C Somayajulu 	if (p_mgr->xrc_srq_count)
480217ec208SDavid C Somayajulu 		total_srqs += ecore_cxt_srqs_per_page(p_hwfn);
481217ec208SDavid C Somayajulu 
482217ec208SDavid C Somayajulu 	return total_srqs;
4839efd0ba7SDavid C Somayajulu }
4849efd0ba7SDavid C Somayajulu 
48511e25f0dSDavid C Somayajulu /* 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)48611e25f0dSDavid C Somayajulu static void ecore_cxt_set_proto_cid_count(struct ecore_hwfn *p_hwfn,
48711e25f0dSDavid C Somayajulu 					  enum protocol_type type,
48811e25f0dSDavid C Somayajulu 					  u32 cid_count, u32 vf_cid_cnt)
48911e25f0dSDavid C Somayajulu {
49011e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mgr = p_hwfn->p_cxt_mngr;
49111e25f0dSDavid C Somayajulu 	struct ecore_conn_type_cfg *p_conn = &p_mgr->conn_cfg[type];
49211e25f0dSDavid C Somayajulu 
49311e25f0dSDavid C Somayajulu 	p_conn->cid_count = ROUNDUP(cid_count, DQ_RANGE_ALIGN);
49411e25f0dSDavid C Somayajulu 	p_conn->cids_per_vf = ROUNDUP(vf_cid_cnt, DQ_RANGE_ALIGN);
49511e25f0dSDavid C Somayajulu 
49611e25f0dSDavid C Somayajulu 	if (type == PROTOCOLID_ROCE) {
49711e25f0dSDavid C Somayajulu 		u32 page_sz = p_mgr->clients[ILT_CLI_CDUC].p_size.val;
49811e25f0dSDavid C Somayajulu 		u32 cxt_size = CONN_CXT_SIZE(p_hwfn);
49911e25f0dSDavid C Somayajulu 		u32 elems_per_page = ILT_PAGE_IN_BYTES(page_sz) / cxt_size;
50011e25f0dSDavid C Somayajulu 		u32 align = elems_per_page * DQ_RANGE_ALIGN;
50111e25f0dSDavid C Somayajulu 
50211e25f0dSDavid C Somayajulu 		p_conn->cid_count = ROUNDUP(p_conn->cid_count, align);
50311e25f0dSDavid C Somayajulu 	}
50411e25f0dSDavid C Somayajulu }
50511e25f0dSDavid C Somayajulu 
ecore_cxt_get_proto_cid_count(struct ecore_hwfn * p_hwfn,enum protocol_type type,u32 * vf_cid)50611e25f0dSDavid C Somayajulu u32 ecore_cxt_get_proto_cid_count(struct ecore_hwfn	*p_hwfn,
50711e25f0dSDavid C Somayajulu 				  enum protocol_type	type,
50811e25f0dSDavid C Somayajulu 				  u32			*vf_cid)
50911e25f0dSDavid C Somayajulu {
51011e25f0dSDavid C Somayajulu 	if (vf_cid)
51111e25f0dSDavid C Somayajulu 		*vf_cid = p_hwfn->p_cxt_mngr->conn_cfg[type].cids_per_vf;
51211e25f0dSDavid C Somayajulu 
51311e25f0dSDavid C Somayajulu 	return p_hwfn->p_cxt_mngr->conn_cfg[type].cid_count;
51411e25f0dSDavid C Somayajulu }
51511e25f0dSDavid C Somayajulu 
ecore_cxt_get_proto_cid_start(struct ecore_hwfn * p_hwfn,enum protocol_type type)51611e25f0dSDavid C Somayajulu u32 ecore_cxt_get_proto_cid_start(struct ecore_hwfn	*p_hwfn,
51711e25f0dSDavid C Somayajulu 				  enum protocol_type	type)
51811e25f0dSDavid C Somayajulu {
51911e25f0dSDavid C Somayajulu 	return p_hwfn->p_cxt_mngr->acquired[type].start_cid;
52011e25f0dSDavid C Somayajulu }
52111e25f0dSDavid C Somayajulu 
ecore_cxt_get_proto_tid_count(struct ecore_hwfn * p_hwfn,enum protocol_type type)52211e25f0dSDavid C Somayajulu u32 ecore_cxt_get_proto_tid_count(struct ecore_hwfn *p_hwfn,
52311e25f0dSDavid C Somayajulu 				  enum protocol_type type)
52411e25f0dSDavid C Somayajulu {
52511e25f0dSDavid C Somayajulu 	u32 cnt = 0;
52611e25f0dSDavid C Somayajulu 	int i;
52711e25f0dSDavid C Somayajulu 
52811e25f0dSDavid C Somayajulu 	for (i = 0; i < TASK_SEGMENTS; i++)
52911e25f0dSDavid C Somayajulu 		cnt += p_hwfn->p_cxt_mngr->conn_cfg[type].tid_seg[i].count;
53011e25f0dSDavid C Somayajulu 
53111e25f0dSDavid C Somayajulu 	return cnt;
53211e25f0dSDavid C Somayajulu }
53311e25f0dSDavid C Somayajulu 
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)53411e25f0dSDavid C Somayajulu static void ecore_cxt_set_proto_tid_count(struct ecore_hwfn *p_hwfn,
53511e25f0dSDavid C Somayajulu 					  enum protocol_type proto,
53611e25f0dSDavid C Somayajulu 					  u8 seg,
53711e25f0dSDavid C Somayajulu 					  u8 seg_type,
53811e25f0dSDavid C Somayajulu 					  u32 count,
53911e25f0dSDavid C Somayajulu 					  bool has_fl)
54011e25f0dSDavid C Somayajulu {
54111e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
54211e25f0dSDavid C Somayajulu 	struct ecore_tid_seg *p_seg = &p_mngr->conn_cfg[proto].tid_seg[seg];
54311e25f0dSDavid C Somayajulu 
54411e25f0dSDavid C Somayajulu 	p_seg->count = count;
54511e25f0dSDavid C Somayajulu 	p_seg->has_fl_mem = has_fl;
54611e25f0dSDavid C Somayajulu 	p_seg->type = seg_type;
54711e25f0dSDavid C Somayajulu }
54811e25f0dSDavid C Somayajulu 
54911e25f0dSDavid C Somayajulu /* the *p_line parameter must be either 0 for the first invocation or the
55011e25f0dSDavid C Somayajulu    value returned in the previous invocation.
55111e25f0dSDavid C Somayajulu  */
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)55211e25f0dSDavid C Somayajulu static void ecore_ilt_cli_blk_fill(struct ecore_ilt_client_cfg	*p_cli,
55311e25f0dSDavid C Somayajulu 				   struct ecore_ilt_cli_blk	*p_blk,
55411e25f0dSDavid C Somayajulu 				   u32				start_line,
55511e25f0dSDavid C Somayajulu 				   u32				total_size,
55611e25f0dSDavid C Somayajulu 				   u32				elem_size)
55711e25f0dSDavid C Somayajulu {
55811e25f0dSDavid C Somayajulu 	u32 ilt_size = ILT_PAGE_IN_BYTES(p_cli->p_size.val);
55911e25f0dSDavid C Somayajulu 
56011e25f0dSDavid C Somayajulu 	/* verify that it's called once for each block */
56111e25f0dSDavid C Somayajulu 	if (p_blk->total_size)
56211e25f0dSDavid C Somayajulu 		return;
56311e25f0dSDavid C Somayajulu 
56411e25f0dSDavid C Somayajulu 	p_blk->total_size = total_size;
56511e25f0dSDavid C Somayajulu 	p_blk->real_size_in_page = 0;
56611e25f0dSDavid C Somayajulu 	if (elem_size)
56711e25f0dSDavid C Somayajulu 		p_blk->real_size_in_page = (ilt_size / elem_size) * elem_size;
56811e25f0dSDavid C Somayajulu 	p_blk->start_line = start_line;
56911e25f0dSDavid C Somayajulu }
57011e25f0dSDavid C Somayajulu 
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)57111e25f0dSDavid C Somayajulu static void ecore_ilt_cli_adv_line(struct ecore_hwfn		*p_hwfn,
57211e25f0dSDavid C Somayajulu 				    struct ecore_ilt_client_cfg	*p_cli,
57311e25f0dSDavid C Somayajulu 				    struct ecore_ilt_cli_blk	*p_blk,
57411e25f0dSDavid C Somayajulu 				    u32				*p_line,
57511e25f0dSDavid C Somayajulu 				    enum ilt_clients		client_id)
57611e25f0dSDavid C Somayajulu {
57711e25f0dSDavid C Somayajulu 	if (!p_blk->total_size)
57811e25f0dSDavid C Somayajulu 		return;
57911e25f0dSDavid C Somayajulu 
58011e25f0dSDavid C Somayajulu 	if (!p_cli->active)
58111e25f0dSDavid C Somayajulu 		p_cli->first.val = *p_line;
58211e25f0dSDavid C Somayajulu 
58311e25f0dSDavid C Somayajulu 	p_cli->active = true;
58411e25f0dSDavid C Somayajulu 	*p_line += DIV_ROUND_UP(p_blk->total_size, p_blk->real_size_in_page);
58511e25f0dSDavid C Somayajulu 	p_cli->last.val = *p_line-1;
58611e25f0dSDavid C Somayajulu 
58711e25f0dSDavid C Somayajulu 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
58811e25f0dSDavid C Somayajulu 		   "ILT[Client %d] - Lines: [%08x - %08x]. Block - Size %08x [Real %08x] Start line %d\n",
58911e25f0dSDavid C Somayajulu 		   client_id, p_cli->first.val, p_cli->last.val,
59011e25f0dSDavid C Somayajulu 		   p_blk->total_size, p_blk->real_size_in_page,
59111e25f0dSDavid C Somayajulu 		   p_blk->start_line);
59211e25f0dSDavid C Somayajulu }
59311e25f0dSDavid C Somayajulu 
ecore_ilt_get_dynamic_line_cnt(struct ecore_hwfn * p_hwfn,enum ilt_clients ilt_client)59411e25f0dSDavid C Somayajulu static u32 ecore_ilt_get_dynamic_line_cnt(struct ecore_hwfn *p_hwfn,
59511e25f0dSDavid C Somayajulu 					  enum ilt_clients ilt_client)
59611e25f0dSDavid C Somayajulu {
59711e25f0dSDavid C Somayajulu 	u32 cid_count = p_hwfn->p_cxt_mngr->conn_cfg[PROTOCOLID_ROCE].cid_count;
59811e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *p_cli;
59911e25f0dSDavid C Somayajulu 	u32 lines_to_skip = 0;
60011e25f0dSDavid C Somayajulu 	u32 cxts_per_p;
60111e25f0dSDavid C Somayajulu 
60211e25f0dSDavid C Somayajulu 	/* TBD MK: ILT code should be simplified once PROTO enum is changed */
60311e25f0dSDavid C Somayajulu 
60411e25f0dSDavid C Somayajulu 	if (ilt_client == ILT_CLI_CDUC) {
60511e25f0dSDavid C Somayajulu 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC];
60611e25f0dSDavid C Somayajulu 
60711e25f0dSDavid C Somayajulu 		cxts_per_p = ILT_PAGE_IN_BYTES(p_cli->p_size.val) /
60811e25f0dSDavid C Somayajulu 			     (u32)CONN_CXT_SIZE(p_hwfn);
60911e25f0dSDavid C Somayajulu 
61011e25f0dSDavid C Somayajulu 		lines_to_skip = cid_count / cxts_per_p;
61111e25f0dSDavid C Somayajulu 	}
61211e25f0dSDavid C Somayajulu 
61311e25f0dSDavid C Somayajulu 	return lines_to_skip;
61411e25f0dSDavid C Somayajulu }
61511e25f0dSDavid C Somayajulu 
61611e25f0dSDavid C Somayajulu static struct ecore_ilt_client_cfg *
ecore_cxt_set_cli(struct ecore_ilt_client_cfg * p_cli)61711e25f0dSDavid C Somayajulu ecore_cxt_set_cli(struct ecore_ilt_client_cfg *p_cli)
61811e25f0dSDavid C Somayajulu {
61911e25f0dSDavid C Somayajulu 	p_cli->active = false;
62011e25f0dSDavid C Somayajulu 	p_cli->first.val = 0;
62111e25f0dSDavid C Somayajulu 	p_cli->last.val = 0;
62211e25f0dSDavid C Somayajulu 	return p_cli;
62311e25f0dSDavid C Somayajulu }
62411e25f0dSDavid C Somayajulu 
62511e25f0dSDavid C Somayajulu static struct ecore_ilt_cli_blk *
ecore_cxt_set_blk(struct ecore_ilt_cli_blk * p_blk)62611e25f0dSDavid C Somayajulu ecore_cxt_set_blk(struct ecore_ilt_cli_blk *p_blk)
62711e25f0dSDavid C Somayajulu {
62811e25f0dSDavid C Somayajulu 	p_blk->total_size = 0;
62911e25f0dSDavid C Somayajulu 	return p_blk;
63011e25f0dSDavid C Somayajulu }
63111e25f0dSDavid C Somayajulu 
ecore_cxt_cfg_ilt_compute(struct ecore_hwfn * p_hwfn,u32 * line_count)63211e25f0dSDavid C Somayajulu enum _ecore_status_t ecore_cxt_cfg_ilt_compute(struct ecore_hwfn *p_hwfn,
63311e25f0dSDavid C Somayajulu 					       u32 *line_count)
63411e25f0dSDavid C Somayajulu {
63511e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
63611e25f0dSDavid C Somayajulu 	u32 curr_line, total, i, task_size, line;
63711e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *p_cli;
63811e25f0dSDavid C Somayajulu 	struct ecore_ilt_cli_blk *p_blk;
63911e25f0dSDavid C Somayajulu 	struct ecore_cdu_iids cdu_iids;
64011e25f0dSDavid C Somayajulu 	struct ecore_src_iids src_iids;
64111e25f0dSDavid C Somayajulu 	struct ecore_qm_iids qm_iids;
64211e25f0dSDavid C Somayajulu 	struct ecore_tm_iids tm_iids;
64311e25f0dSDavid C Somayajulu 	struct ecore_tid_seg *p_seg;
64411e25f0dSDavid C Somayajulu 
64511e25f0dSDavid C Somayajulu 	OSAL_MEM_ZERO(&qm_iids, sizeof(qm_iids));
64611e25f0dSDavid C Somayajulu 	OSAL_MEM_ZERO(&cdu_iids, sizeof(cdu_iids));
64711e25f0dSDavid C Somayajulu 	OSAL_MEM_ZERO(&src_iids, sizeof(src_iids));
64811e25f0dSDavid C Somayajulu 	OSAL_MEM_ZERO(&tm_iids, sizeof(tm_iids));
64911e25f0dSDavid C Somayajulu 
65011e25f0dSDavid C Somayajulu 	p_mngr->pf_start_line = RESC_START(p_hwfn, ECORE_ILT);
65111e25f0dSDavid C Somayajulu 
65211e25f0dSDavid C Somayajulu 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
65311e25f0dSDavid C Somayajulu 		   "hwfn [%d] - Set context manager starting line to be 0x%08x\n",
65411e25f0dSDavid C Somayajulu 		   p_hwfn->my_id, p_hwfn->p_cxt_mngr->pf_start_line);
65511e25f0dSDavid C Somayajulu 
65611e25f0dSDavid C Somayajulu 	/* CDUC */
65711e25f0dSDavid C Somayajulu 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_CDUC]);
65811e25f0dSDavid C Somayajulu 
65911e25f0dSDavid C Somayajulu 	curr_line = p_mngr->pf_start_line;
66011e25f0dSDavid C Somayajulu 
66111e25f0dSDavid C Somayajulu 	/* CDUC PF */
66211e25f0dSDavid C Somayajulu 	p_cli->pf_total_lines = 0;
66311e25f0dSDavid C Somayajulu 
66411e25f0dSDavid C Somayajulu 	/* get the counters for the CDUC,CDUC and QM clients  */
66511e25f0dSDavid C Somayajulu 	ecore_cxt_cdu_iids(p_mngr, &cdu_iids);
66611e25f0dSDavid C Somayajulu 
66711e25f0dSDavid C Somayajulu 	p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[CDUC_BLK]);
66811e25f0dSDavid C Somayajulu 
66911e25f0dSDavid C Somayajulu 	total = cdu_iids.pf_cids * CONN_CXT_SIZE(p_hwfn);
67011e25f0dSDavid C Somayajulu 
67111e25f0dSDavid C Somayajulu 	ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
67211e25f0dSDavid C Somayajulu 			       total, CONN_CXT_SIZE(p_hwfn));
67311e25f0dSDavid C Somayajulu 
67411e25f0dSDavid C Somayajulu 	ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line, ILT_CLI_CDUC);
67511e25f0dSDavid C Somayajulu 	p_cli->pf_total_lines = curr_line - p_blk->start_line;
67611e25f0dSDavid C Somayajulu 
67711e25f0dSDavid C Somayajulu 	p_blk->dynamic_line_cnt = ecore_ilt_get_dynamic_line_cnt(p_hwfn,
67811e25f0dSDavid C Somayajulu 								 ILT_CLI_CDUC);
67911e25f0dSDavid C Somayajulu 
68011e25f0dSDavid C Somayajulu 	/* CDUC VF */
68111e25f0dSDavid C Somayajulu 	p_blk = ecore_cxt_set_blk(&p_cli->vf_blks[CDUC_BLK]);
68211e25f0dSDavid C Somayajulu 	total = cdu_iids.per_vf_cids * CONN_CXT_SIZE(p_hwfn);
68311e25f0dSDavid C Somayajulu 
68411e25f0dSDavid C Somayajulu 	ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
68511e25f0dSDavid C Somayajulu 			       total, CONN_CXT_SIZE(p_hwfn));
68611e25f0dSDavid C Somayajulu 
68711e25f0dSDavid C Somayajulu 	ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line, ILT_CLI_CDUC);
68811e25f0dSDavid C Somayajulu 	p_cli->vf_total_lines = curr_line - p_blk->start_line;
68911e25f0dSDavid C Somayajulu 
69011e25f0dSDavid C Somayajulu 	for (i = 1; i < p_mngr->vf_count; i++)
69111e25f0dSDavid C Somayajulu 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
69211e25f0dSDavid C Somayajulu 				       ILT_CLI_CDUC);
69311e25f0dSDavid C Somayajulu 
69411e25f0dSDavid C Somayajulu 	/* CDUT PF */
69511e25f0dSDavid C Somayajulu 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_CDUT]);
69611e25f0dSDavid C Somayajulu 	p_cli->first.val = curr_line;
69711e25f0dSDavid C Somayajulu 
69811e25f0dSDavid C Somayajulu 	/* first the 'working' task memory */
69911e25f0dSDavid C Somayajulu 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
70011e25f0dSDavid C Somayajulu 		p_seg = ecore_cxt_tid_seg_info(p_hwfn, i);
70111e25f0dSDavid C Somayajulu 		if (!p_seg || p_seg->count == 0)
70211e25f0dSDavid C Somayajulu 			continue;
70311e25f0dSDavid C Somayajulu 
70411e25f0dSDavid C Somayajulu 		p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[CDUT_SEG_BLK(i)]);
70511e25f0dSDavid C Somayajulu 		total = p_seg->count * p_mngr->task_type_size[p_seg->type];
70611e25f0dSDavid C Somayajulu 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line, total,
70711e25f0dSDavid C Somayajulu 				       p_mngr->task_type_size[p_seg->type]);
70811e25f0dSDavid C Somayajulu 
70911e25f0dSDavid C Somayajulu 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
71011e25f0dSDavid C Somayajulu 				       ILT_CLI_CDUT);
71111e25f0dSDavid C Somayajulu 	}
71211e25f0dSDavid C Somayajulu 
71311e25f0dSDavid C Somayajulu 	/* next the 'init' task memory (forced load memory) */
71411e25f0dSDavid C Somayajulu 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
71511e25f0dSDavid C Somayajulu 		p_seg = ecore_cxt_tid_seg_info(p_hwfn, i);
71611e25f0dSDavid C Somayajulu 		if (!p_seg || p_seg->count == 0)
71711e25f0dSDavid C Somayajulu 			continue;
71811e25f0dSDavid C Somayajulu 
71911e25f0dSDavid C Somayajulu 		p_blk = ecore_cxt_set_blk(
72011e25f0dSDavid C Somayajulu 				&p_cli->pf_blks[CDUT_FL_SEG_BLK(i, PF)]);
72111e25f0dSDavid C Somayajulu 
72211e25f0dSDavid C Somayajulu 		if (!p_seg->has_fl_mem) {
72311e25f0dSDavid C Somayajulu 			/* The segment is active (total size pf 'working'
72411e25f0dSDavid C Somayajulu 			 * memory is > 0) but has no FL (forced-load, Init)
72511e25f0dSDavid C Somayajulu 			 * memory. Thus:
72611e25f0dSDavid C Somayajulu 			 *
72711e25f0dSDavid C Somayajulu 			 * 1.   The total-size in the corrsponding FL block of
72811e25f0dSDavid C Somayajulu 			 *      the ILT client is set to 0 - No ILT line are
72911e25f0dSDavid C Somayajulu 			 *      provisioned and no ILT memory allocated.
73011e25f0dSDavid C Somayajulu 			 *
73111e25f0dSDavid C Somayajulu 			 * 2.   The start-line of said block is set to the
73211e25f0dSDavid C Somayajulu 			 *      start line of the matching working memory
73311e25f0dSDavid C Somayajulu 			 *      block in the ILT client. This is later used to
73411e25f0dSDavid C Somayajulu 			 *      configure the CDU segment offset registers and
73511e25f0dSDavid C Somayajulu 			 *      results in an FL command for TIDs of this
73611e25f0dSDavid C Somayajulu 			 *      segement behaves as regular load commands
73711e25f0dSDavid C Somayajulu 			 *      (loading TIDs from the working memory).
73811e25f0dSDavid C Somayajulu 			 */
73911e25f0dSDavid C Somayajulu 			line = p_cli->pf_blks[CDUT_SEG_BLK(i)].start_line;
74011e25f0dSDavid C Somayajulu 
74111e25f0dSDavid C Somayajulu 			ecore_ilt_cli_blk_fill(p_cli, p_blk, line, 0, 0);
74211e25f0dSDavid C Somayajulu 			continue;
74311e25f0dSDavid C Somayajulu 		}
74411e25f0dSDavid C Somayajulu 		total = p_seg->count * p_mngr->task_type_size[p_seg->type];
74511e25f0dSDavid C Somayajulu 
74611e25f0dSDavid C Somayajulu 		ecore_ilt_cli_blk_fill(p_cli, p_blk,
74711e25f0dSDavid C Somayajulu 				       curr_line, total,
74811e25f0dSDavid C Somayajulu 				       p_mngr->task_type_size[p_seg->type]);
74911e25f0dSDavid C Somayajulu 
75011e25f0dSDavid C Somayajulu 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
75111e25f0dSDavid C Somayajulu 				       ILT_CLI_CDUT);
75211e25f0dSDavid C Somayajulu 	}
75311e25f0dSDavid C Somayajulu 	p_cli->pf_total_lines = curr_line - p_cli->pf_blks[0].start_line;
75411e25f0dSDavid C Somayajulu 
75511e25f0dSDavid C Somayajulu 	/* CDUT VF */
75611e25f0dSDavid C Somayajulu 	p_seg = ecore_cxt_tid_seg_info(p_hwfn, TASK_SEGMENT_VF);
75711e25f0dSDavid C Somayajulu 	if (p_seg && p_seg->count) {
75811e25f0dSDavid C Somayajulu 		/* Stricly speaking we need to iterate over all VF
75911e25f0dSDavid C Somayajulu 		 * task segment types, but a VF has only 1 segment
76011e25f0dSDavid C Somayajulu 		 */
76111e25f0dSDavid C Somayajulu 
76211e25f0dSDavid C Somayajulu 		/* 'working' memory */
76311e25f0dSDavid C Somayajulu 		total = p_seg->count * p_mngr->task_type_size[p_seg->type];
76411e25f0dSDavid C Somayajulu 
76511e25f0dSDavid C Somayajulu 		p_blk = ecore_cxt_set_blk(&p_cli->vf_blks[CDUT_SEG_BLK(0)]);
76611e25f0dSDavid C Somayajulu 		ecore_ilt_cli_blk_fill(p_cli, p_blk,
76711e25f0dSDavid C Somayajulu 				       curr_line, total,
76811e25f0dSDavid C Somayajulu 				       p_mngr->task_type_size[p_seg->type]);
76911e25f0dSDavid C Somayajulu 
77011e25f0dSDavid C Somayajulu 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
77111e25f0dSDavid C Somayajulu 				       ILT_CLI_CDUT);
77211e25f0dSDavid C Somayajulu 
77311e25f0dSDavid C Somayajulu 		/* 'init' memory */
77411e25f0dSDavid C Somayajulu 		p_blk = ecore_cxt_set_blk(
77511e25f0dSDavid C Somayajulu 				&p_cli->vf_blks[CDUT_FL_SEG_BLK(0, VF)]);
77611e25f0dSDavid C Somayajulu 		if (!p_seg->has_fl_mem) {
77711e25f0dSDavid C Somayajulu 			/* see comment above */
77811e25f0dSDavid C Somayajulu 			line = p_cli->vf_blks[CDUT_SEG_BLK(0)].start_line;
77911e25f0dSDavid C Somayajulu 			ecore_ilt_cli_blk_fill(p_cli, p_blk, line, 0, 0);
78011e25f0dSDavid C Somayajulu 		} else {
78111e25f0dSDavid C Somayajulu 			task_size = p_mngr->task_type_size[p_seg->type];
78211e25f0dSDavid C Somayajulu 			ecore_ilt_cli_blk_fill(p_cli, p_blk,
78311e25f0dSDavid C Somayajulu 					       curr_line, total,
78411e25f0dSDavid C Somayajulu 					       task_size);
78511e25f0dSDavid C Somayajulu 			ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
78611e25f0dSDavid C Somayajulu 					       ILT_CLI_CDUT);
78711e25f0dSDavid C Somayajulu 		}
78811e25f0dSDavid C Somayajulu 		p_cli->vf_total_lines = curr_line -
78911e25f0dSDavid C Somayajulu 					p_cli->vf_blks[0].start_line;
79011e25f0dSDavid C Somayajulu 
79111e25f0dSDavid C Somayajulu 		/* Now for the rest of the VFs */
79211e25f0dSDavid C Somayajulu 		for (i = 1; i < p_mngr->vf_count; i++) {
79311e25f0dSDavid C Somayajulu 			/* don't set p_blk i.e. don't clear total_size */
79411e25f0dSDavid C Somayajulu 			p_blk = &p_cli->vf_blks[CDUT_SEG_BLK(0)];
79511e25f0dSDavid C Somayajulu 			ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
79611e25f0dSDavid C Somayajulu 					       ILT_CLI_CDUT);
79711e25f0dSDavid C Somayajulu 
79811e25f0dSDavid C Somayajulu 			/* don't set p_blk i.e. don't clear total_size */
79911e25f0dSDavid C Somayajulu 			p_blk = &p_cli->vf_blks[CDUT_FL_SEG_BLK(0, VF)];
80011e25f0dSDavid C Somayajulu 			ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
80111e25f0dSDavid C Somayajulu 					       ILT_CLI_CDUT);
80211e25f0dSDavid C Somayajulu 		}
80311e25f0dSDavid C Somayajulu 	}
80411e25f0dSDavid C Somayajulu 
80511e25f0dSDavid C Somayajulu 	/* QM */
80611e25f0dSDavid C Somayajulu 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_QM]);
80711e25f0dSDavid C Somayajulu 	p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[0]);
80811e25f0dSDavid C Somayajulu 
80911e25f0dSDavid C Somayajulu 	ecore_cxt_qm_iids(p_hwfn, &qm_iids);
8109efd0ba7SDavid C Somayajulu 	total = ecore_qm_pf_mem_size(qm_iids.cids,
81111e25f0dSDavid C Somayajulu 				     qm_iids.vf_cids, qm_iids.tids,
81211e25f0dSDavid C Somayajulu 				     p_hwfn->qm_info.num_pqs,
81311e25f0dSDavid C Somayajulu 				     p_hwfn->qm_info.num_vf_pqs);
81411e25f0dSDavid C Somayajulu 
81511e25f0dSDavid C Somayajulu 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
81611e25f0dSDavid C Somayajulu 		   "QM ILT Info, (cids=%d, vf_cids=%d, tids=%d, num_pqs=%d, num_vf_pqs=%d, memory_size=%d)\n",
81711e25f0dSDavid C Somayajulu 		   qm_iids.cids, qm_iids.vf_cids, qm_iids.tids,
81811e25f0dSDavid C Somayajulu 		   p_hwfn->qm_info.num_pqs, p_hwfn->qm_info.num_vf_pqs, total);
81911e25f0dSDavid C Somayajulu 
82011e25f0dSDavid C Somayajulu 	ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line, total * 0x1000,
82111e25f0dSDavid C Somayajulu 			       QM_PQ_ELEMENT_SIZE);
82211e25f0dSDavid C Somayajulu 
82311e25f0dSDavid C Somayajulu 	ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line, ILT_CLI_QM);
82411e25f0dSDavid C Somayajulu 	p_cli->pf_total_lines = curr_line - p_blk->start_line;
82511e25f0dSDavid C Somayajulu 
82611e25f0dSDavid C Somayajulu 	/* SRC */
82711e25f0dSDavid C Somayajulu 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_SRC]);
8289efd0ba7SDavid C Somayajulu 	ecore_cxt_src_iids(p_mngr, &src_iids);
82911e25f0dSDavid C Somayajulu 
83011e25f0dSDavid C Somayajulu 	/* Both the PF and VFs searcher connections are stored in the per PF
83111e25f0dSDavid C Somayajulu 	 * database. Thus sum the PF searcher cids and all the VFs searcher
83211e25f0dSDavid C Somayajulu 	 * cids.
83311e25f0dSDavid C Somayajulu 	 */
83411e25f0dSDavid C Somayajulu 	total = src_iids.pf_cids + src_iids.per_vf_cids * p_mngr->vf_count;
83511e25f0dSDavid C Somayajulu 	if (total) {
83611e25f0dSDavid C Somayajulu 		u32 local_max = OSAL_MAX_T(u32, total,
83711e25f0dSDavid C Somayajulu 					   SRC_MIN_NUM_ELEMS);
83811e25f0dSDavid C Somayajulu 
83911e25f0dSDavid C Somayajulu 		total = OSAL_ROUNDUP_POW_OF_TWO(local_max);
84011e25f0dSDavid C Somayajulu 
84111e25f0dSDavid C Somayajulu 		p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[0]);
84211e25f0dSDavid C Somayajulu 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
84311e25f0dSDavid C Somayajulu 				       total * sizeof(struct src_ent),
84411e25f0dSDavid C Somayajulu 				       sizeof(struct src_ent));
84511e25f0dSDavid C Somayajulu 
84611e25f0dSDavid C Somayajulu 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
84711e25f0dSDavid C Somayajulu 				       ILT_CLI_SRC);
84811e25f0dSDavid C Somayajulu 		p_cli->pf_total_lines = curr_line - p_blk->start_line;
84911e25f0dSDavid C Somayajulu 	}
85011e25f0dSDavid C Somayajulu 
85111e25f0dSDavid C Somayajulu 	/* TM PF */
85211e25f0dSDavid C Somayajulu 	p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_TM]);
8539efd0ba7SDavid C Somayajulu 	ecore_cxt_tm_iids(p_mngr, &tm_iids);
85411e25f0dSDavid C Somayajulu 	total = tm_iids.pf_cids + tm_iids.pf_tids_total;
85511e25f0dSDavid C Somayajulu 	if (total) {
85611e25f0dSDavid C Somayajulu 		p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[0]);
85711e25f0dSDavid C Somayajulu 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
85811e25f0dSDavid C Somayajulu 				       total * TM_ELEM_SIZE,
85911e25f0dSDavid C Somayajulu 				       TM_ELEM_SIZE);
86011e25f0dSDavid C Somayajulu 
86111e25f0dSDavid C Somayajulu 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
86211e25f0dSDavid C Somayajulu 				       ILT_CLI_TM);
86311e25f0dSDavid C Somayajulu 		p_cli->pf_total_lines = curr_line - p_blk->start_line;
86411e25f0dSDavid C Somayajulu 	}
86511e25f0dSDavid C Somayajulu 
86611e25f0dSDavid C Somayajulu 	/* TM VF */
86711e25f0dSDavid C Somayajulu 	total = tm_iids.per_vf_cids + tm_iids.per_vf_tids;
86811e25f0dSDavid C Somayajulu 	if (total) {
86911e25f0dSDavid C Somayajulu 		p_blk = ecore_cxt_set_blk(&p_cli->vf_blks[0]);
87011e25f0dSDavid C Somayajulu 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
87111e25f0dSDavid C Somayajulu 				       total * TM_ELEM_SIZE,
87211e25f0dSDavid C Somayajulu 				       TM_ELEM_SIZE);
87311e25f0dSDavid C Somayajulu 
87411e25f0dSDavid C Somayajulu 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
87511e25f0dSDavid C Somayajulu 				       ILT_CLI_TM);
87611e25f0dSDavid C Somayajulu 
87711e25f0dSDavid C Somayajulu 		p_cli->vf_total_lines = curr_line - p_blk->start_line;
87811e25f0dSDavid C Somayajulu 		for (i = 1; i < p_mngr->vf_count; i++) {
87911e25f0dSDavid C Somayajulu 			ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
88011e25f0dSDavid C Somayajulu 					       ILT_CLI_TM);
88111e25f0dSDavid C Somayajulu 		}
88211e25f0dSDavid C Somayajulu 	}
88311e25f0dSDavid C Somayajulu 
88411e25f0dSDavid C Somayajulu 	/* TSDM (SRQ CONTEXT) */
885217ec208SDavid C Somayajulu 	total = ecore_cxt_get_total_srq_count(p_hwfn);
88611e25f0dSDavid C Somayajulu 	if (total) {
88711e25f0dSDavid C Somayajulu 		p_cli = ecore_cxt_set_cli(&p_mngr->clients[ILT_CLI_TSDM]);
88811e25f0dSDavid C Somayajulu 		p_blk = ecore_cxt_set_blk(&p_cli->pf_blks[SRQ_BLK]);
88911e25f0dSDavid C Somayajulu 		ecore_ilt_cli_blk_fill(p_cli, p_blk, curr_line,
89011e25f0dSDavid C Somayajulu 				       total * SRQ_CXT_SIZE, SRQ_CXT_SIZE);
89111e25f0dSDavid C Somayajulu 
89211e25f0dSDavid C Somayajulu 		ecore_ilt_cli_adv_line(p_hwfn, p_cli, p_blk, &curr_line,
89311e25f0dSDavid C Somayajulu 				       ILT_CLI_TSDM);
89411e25f0dSDavid C Somayajulu 		p_cli->pf_total_lines = curr_line - p_blk->start_line;
89511e25f0dSDavid C Somayajulu 	}
89611e25f0dSDavid C Somayajulu 
89711e25f0dSDavid C Somayajulu 	*line_count = curr_line - p_hwfn->p_cxt_mngr->pf_start_line;
89811e25f0dSDavid C Somayajulu 
89911e25f0dSDavid C Somayajulu 	if (curr_line - p_hwfn->p_cxt_mngr->pf_start_line >
90011e25f0dSDavid C Somayajulu 	    RESC_NUM(p_hwfn, ECORE_ILT)) {
90111e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
90211e25f0dSDavid C Somayajulu 	}
90311e25f0dSDavid C Somayajulu 
90411e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
90511e25f0dSDavid C Somayajulu }
90611e25f0dSDavid C Somayajulu 
ecore_cxt_cfg_ilt_compute_excess(struct ecore_hwfn * p_hwfn,u32 used_lines)90711e25f0dSDavid C Somayajulu u32 ecore_cxt_cfg_ilt_compute_excess(struct ecore_hwfn *p_hwfn, u32 used_lines)
90811e25f0dSDavid C Somayajulu {
90911e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *p_cli;
91011e25f0dSDavid C Somayajulu 	u32 excess_lines, available_lines;
91111e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr;
91211e25f0dSDavid C Somayajulu 	u32 ilt_page_size, elem_size;
91311e25f0dSDavid C Somayajulu 	struct ecore_tid_seg *p_seg;
91411e25f0dSDavid C Somayajulu 	int i;
91511e25f0dSDavid C Somayajulu 
91611e25f0dSDavid C Somayajulu 	available_lines = RESC_NUM(p_hwfn, ECORE_ILT);
91711e25f0dSDavid C Somayajulu 	excess_lines = used_lines - available_lines;
91811e25f0dSDavid C Somayajulu 
91911e25f0dSDavid C Somayajulu 	if (!excess_lines)
92011e25f0dSDavid C Somayajulu 		return 0;
92111e25f0dSDavid C Somayajulu 
92211e25f0dSDavid C Somayajulu 	if (!ECORE_IS_RDMA_PERSONALITY(p_hwfn))
92311e25f0dSDavid C Somayajulu 		return 0;
92411e25f0dSDavid C Somayajulu 
92511e25f0dSDavid C Somayajulu 	p_mngr = p_hwfn->p_cxt_mngr;
92611e25f0dSDavid C Somayajulu 	p_cli = &p_mngr->clients[ILT_CLI_CDUT];
92711e25f0dSDavid C Somayajulu 	ilt_page_size = ILT_PAGE_IN_BYTES(p_cli->p_size.val);
92811e25f0dSDavid C Somayajulu 
92911e25f0dSDavid C Somayajulu 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
93011e25f0dSDavid C Somayajulu 		p_seg = ecore_cxt_tid_seg_info(p_hwfn, i);
93111e25f0dSDavid C Somayajulu 		if (!p_seg || p_seg->count == 0)
93211e25f0dSDavid C Somayajulu 			continue;
93311e25f0dSDavid C Somayajulu 
93411e25f0dSDavid C Somayajulu 		elem_size = p_mngr->task_type_size[p_seg->type];
93511e25f0dSDavid C Somayajulu 		if (!elem_size)
93611e25f0dSDavid C Somayajulu 			continue;
93711e25f0dSDavid C Somayajulu 
93811e25f0dSDavid C Somayajulu 		return (ilt_page_size / elem_size) * excess_lines;
93911e25f0dSDavid C Somayajulu 	}
94011e25f0dSDavid C Somayajulu 
94111e25f0dSDavid C Somayajulu 	DP_ERR(p_hwfn, "failed computing excess ILT lines\n");
94211e25f0dSDavid C Somayajulu 	return 0;
94311e25f0dSDavid C Somayajulu }
94411e25f0dSDavid C Somayajulu 
ecore_cxt_src_t2_free(struct ecore_hwfn * p_hwfn)94511e25f0dSDavid C Somayajulu static void ecore_cxt_src_t2_free(struct ecore_hwfn *p_hwfn)
94611e25f0dSDavid C Somayajulu {
94711e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
94811e25f0dSDavid C Somayajulu 	u32 i;
94911e25f0dSDavid C Somayajulu 
95011e25f0dSDavid C Somayajulu 	if (!p_mngr->t2)
95111e25f0dSDavid C Somayajulu 		return;
95211e25f0dSDavid C Somayajulu 
95311e25f0dSDavid C Somayajulu 	for (i = 0; i < p_mngr->t2_num_pages; i++)
95411e25f0dSDavid C Somayajulu 		if (p_mngr->t2[i].p_virt)
95511e25f0dSDavid C Somayajulu 			OSAL_DMA_FREE_COHERENT(p_hwfn->p_dev,
95611e25f0dSDavid C Somayajulu 					       p_mngr->t2[i].p_virt,
95711e25f0dSDavid C Somayajulu 					       p_mngr->t2[i].p_phys,
95811e25f0dSDavid C Somayajulu 					       p_mngr->t2[i].size);
95911e25f0dSDavid C Somayajulu 
96011e25f0dSDavid C Somayajulu 	OSAL_FREE(p_hwfn->p_dev, p_mngr->t2);
96111e25f0dSDavid C Somayajulu 	p_mngr->t2 = OSAL_NULL;
96211e25f0dSDavid C Somayajulu }
96311e25f0dSDavid C Somayajulu 
ecore_cxt_src_t2_alloc(struct ecore_hwfn * p_hwfn)96411e25f0dSDavid C Somayajulu static enum _ecore_status_t ecore_cxt_src_t2_alloc(struct ecore_hwfn *p_hwfn)
96511e25f0dSDavid C Somayajulu {
96611e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr  = p_hwfn->p_cxt_mngr;
96711e25f0dSDavid C Somayajulu 	u32 conn_num, total_size, ent_per_page, psz, i;
96811e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *p_src;
96911e25f0dSDavid C Somayajulu 	struct ecore_src_iids src_iids;
97011e25f0dSDavid C Somayajulu 	struct ecore_dma_mem *p_t2;
97111e25f0dSDavid C Somayajulu 	enum _ecore_status_t rc;
97211e25f0dSDavid C Somayajulu 
97311e25f0dSDavid C Somayajulu 	OSAL_MEM_ZERO(&src_iids, sizeof(src_iids));
97411e25f0dSDavid C Somayajulu 
97511e25f0dSDavid C Somayajulu 	/* if the SRC ILT client is inactive - there are no connection
97611e25f0dSDavid C Somayajulu 	 * requiring the searcer, leave.
97711e25f0dSDavid C Somayajulu 	 */
97811e25f0dSDavid C Somayajulu 	p_src = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_SRC];
97911e25f0dSDavid C Somayajulu 	if (!p_src->active)
98011e25f0dSDavid C Somayajulu 		return ECORE_SUCCESS;
98111e25f0dSDavid C Somayajulu 
9829efd0ba7SDavid C Somayajulu 	ecore_cxt_src_iids(p_mngr, &src_iids);
98311e25f0dSDavid C Somayajulu 	conn_num = src_iids.pf_cids + src_iids.per_vf_cids * p_mngr->vf_count;
98411e25f0dSDavid C Somayajulu 	total_size = conn_num * sizeof(struct src_ent);
98511e25f0dSDavid C Somayajulu 
98611e25f0dSDavid C Somayajulu 	/* use the same page size as the SRC ILT client */
98711e25f0dSDavid C Somayajulu 	psz = ILT_PAGE_IN_BYTES(p_src->p_size.val);
98811e25f0dSDavid C Somayajulu 	p_mngr->t2_num_pages = DIV_ROUND_UP(total_size, psz);
98911e25f0dSDavid C Somayajulu 
99011e25f0dSDavid C Somayajulu 	/* allocate t2 */
99111e25f0dSDavid C Somayajulu 	p_mngr->t2 = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL,
99211e25f0dSDavid C Somayajulu 				 p_mngr->t2_num_pages *
99311e25f0dSDavid C Somayajulu 				 sizeof(struct ecore_dma_mem));
99411e25f0dSDavid C Somayajulu 	if (!p_mngr->t2) {
995217ec208SDavid C Somayajulu 		DP_NOTICE(p_hwfn, false, "Failed to allocate t2 table\n");
99611e25f0dSDavid C Somayajulu 		rc = ECORE_NOMEM;
99711e25f0dSDavid C Somayajulu 		goto t2_fail;
99811e25f0dSDavid C Somayajulu 	}
99911e25f0dSDavid C Somayajulu 
100011e25f0dSDavid C Somayajulu 	/* allocate t2 pages */
100111e25f0dSDavid C Somayajulu 	for (i = 0; i < p_mngr->t2_num_pages; i++) {
100211e25f0dSDavid C Somayajulu 		u32 size = OSAL_MIN_T(u32, total_size, psz);
100311e25f0dSDavid C Somayajulu 		void **p_virt = &p_mngr->t2[i].p_virt;
100411e25f0dSDavid C Somayajulu 
100511e25f0dSDavid C Somayajulu 		*p_virt = OSAL_DMA_ALLOC_COHERENT(p_hwfn->p_dev,
100611e25f0dSDavid C Somayajulu 						  &p_mngr->t2[i].p_phys,
100711e25f0dSDavid C Somayajulu 						  size);
100811e25f0dSDavid C Somayajulu 		if (!p_mngr->t2[i].p_virt) {
100911e25f0dSDavid C Somayajulu 			rc = ECORE_NOMEM;
101011e25f0dSDavid C Somayajulu 			goto t2_fail;
101111e25f0dSDavid C Somayajulu 		}
101211e25f0dSDavid C Somayajulu 		OSAL_MEM_ZERO(*p_virt, size);
101311e25f0dSDavid C Somayajulu 		p_mngr->t2[i].size = size;
101411e25f0dSDavid C Somayajulu 		total_size -= size;
101511e25f0dSDavid C Somayajulu 	}
101611e25f0dSDavid C Somayajulu 
101711e25f0dSDavid C Somayajulu 	/* Set the t2 pointers */
101811e25f0dSDavid C Somayajulu 
101911e25f0dSDavid C Somayajulu 	/* entries per page - must be a power of two */
102011e25f0dSDavid C Somayajulu 	ent_per_page = psz / sizeof(struct src_ent);
102111e25f0dSDavid C Somayajulu 
102211e25f0dSDavid C Somayajulu 	p_mngr->first_free = (u64)p_mngr->t2[0].p_phys;
102311e25f0dSDavid C Somayajulu 
102411e25f0dSDavid C Somayajulu 	p_t2 = &p_mngr->t2[(conn_num - 1) / ent_per_page];
102511e25f0dSDavid C Somayajulu 	p_mngr->last_free = (u64)p_t2->p_phys +
102611e25f0dSDavid C Somayajulu 				 ((conn_num - 1) & (ent_per_page - 1)) *
102711e25f0dSDavid C Somayajulu 				 sizeof(struct src_ent);
102811e25f0dSDavid C Somayajulu 
102911e25f0dSDavid C Somayajulu 	for (i = 0; i < p_mngr->t2_num_pages; i++) {
103011e25f0dSDavid C Somayajulu 		u32 ent_num = OSAL_MIN_T(u32, ent_per_page, conn_num);
103111e25f0dSDavid C Somayajulu 		struct src_ent *entries = p_mngr->t2[i].p_virt;
103211e25f0dSDavid C Somayajulu 		u64 p_ent_phys = (u64)p_mngr->t2[i].p_phys, val;
103311e25f0dSDavid C Somayajulu 		u32 j;
103411e25f0dSDavid C Somayajulu 
103511e25f0dSDavid C Somayajulu 		for (j = 0; j < ent_num - 1; j++) {
103611e25f0dSDavid C Somayajulu 			val = p_ent_phys +
103711e25f0dSDavid C Somayajulu 			      (j + 1) * sizeof(struct src_ent);
103811e25f0dSDavid C Somayajulu 			entries[j].next = OSAL_CPU_TO_BE64(val);
103911e25f0dSDavid C Somayajulu 		}
104011e25f0dSDavid C Somayajulu 
104111e25f0dSDavid C Somayajulu 		if (i < p_mngr->t2_num_pages - 1)
104211e25f0dSDavid C Somayajulu 			val = (u64)p_mngr->t2[i + 1].p_phys;
104311e25f0dSDavid C Somayajulu 		else
104411e25f0dSDavid C Somayajulu 			val = 0;
104511e25f0dSDavid C Somayajulu 		entries[j].next = OSAL_CPU_TO_BE64(val);
104611e25f0dSDavid C Somayajulu 
104711e25f0dSDavid C Somayajulu 		conn_num -= ent_num;
104811e25f0dSDavid C Somayajulu 	}
104911e25f0dSDavid C Somayajulu 
105011e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
105111e25f0dSDavid C Somayajulu 
105211e25f0dSDavid C Somayajulu t2_fail:
105311e25f0dSDavid C Somayajulu 	ecore_cxt_src_t2_free(p_hwfn);
105411e25f0dSDavid C Somayajulu 	return rc;
105511e25f0dSDavid C Somayajulu }
105611e25f0dSDavid C Somayajulu 
105711e25f0dSDavid C Somayajulu #define for_each_ilt_valid_client(pos, clients)	\
105811e25f0dSDavid C Somayajulu 	for (pos = 0; pos < ILT_CLI_MAX; pos++)	\
105911e25f0dSDavid C Somayajulu 		if (!clients[pos].active) {	\
106011e25f0dSDavid C Somayajulu 			continue;		\
106111e25f0dSDavid C Somayajulu 		} else				\
106211e25f0dSDavid C Somayajulu 
106311e25f0dSDavid C Somayajulu /* Total number of ILT lines used by this PF */
ecore_cxt_ilt_shadow_size(struct ecore_ilt_client_cfg * ilt_clients)106411e25f0dSDavid C Somayajulu static u32 ecore_cxt_ilt_shadow_size(struct ecore_ilt_client_cfg *ilt_clients)
106511e25f0dSDavid C Somayajulu {
106611e25f0dSDavid C Somayajulu 	u32 size = 0;
106711e25f0dSDavid C Somayajulu 	u32 i;
106811e25f0dSDavid C Somayajulu 
106911e25f0dSDavid C Somayajulu 	for_each_ilt_valid_client(i, ilt_clients)
107011e25f0dSDavid C Somayajulu 		size += (ilt_clients[i].last.val -
107111e25f0dSDavid C Somayajulu 			 ilt_clients[i].first.val + 1);
107211e25f0dSDavid C Somayajulu 
107311e25f0dSDavid C Somayajulu 	return size;
107411e25f0dSDavid C Somayajulu }
107511e25f0dSDavid C Somayajulu 
ecore_ilt_shadow_free(struct ecore_hwfn * p_hwfn)107611e25f0dSDavid C Somayajulu static void ecore_ilt_shadow_free(struct ecore_hwfn *p_hwfn)
107711e25f0dSDavid C Somayajulu {
107811e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *p_cli = p_hwfn->p_cxt_mngr->clients;
107911e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
108011e25f0dSDavid C Somayajulu 	u32 ilt_size, i;
108111e25f0dSDavid C Somayajulu 
1082217ec208SDavid C Somayajulu 	if (p_mngr->ilt_shadow == OSAL_NULL)
1083217ec208SDavid C Somayajulu 		return;
1084217ec208SDavid C Somayajulu 
108511e25f0dSDavid C Somayajulu 	ilt_size = ecore_cxt_ilt_shadow_size(p_cli);
108611e25f0dSDavid C Somayajulu 
108711e25f0dSDavid C Somayajulu 	for (i = 0; p_mngr->ilt_shadow && i < ilt_size; i++) {
108811e25f0dSDavid C Somayajulu 		struct ecore_dma_mem *p_dma = &p_mngr->ilt_shadow[i];
108911e25f0dSDavid C Somayajulu 
109011e25f0dSDavid C Somayajulu 		if (p_dma->p_virt)
109111e25f0dSDavid C Somayajulu 			OSAL_DMA_FREE_COHERENT(p_hwfn->p_dev,
109211e25f0dSDavid C Somayajulu 					       p_dma->p_virt,
109311e25f0dSDavid C Somayajulu 					       p_dma->p_phys,
109411e25f0dSDavid C Somayajulu 					       p_dma->size);
109511e25f0dSDavid C Somayajulu 		p_dma->p_virt = OSAL_NULL;
109611e25f0dSDavid C Somayajulu 	}
109711e25f0dSDavid C Somayajulu 	OSAL_FREE(p_hwfn->p_dev, p_mngr->ilt_shadow);
1098217ec208SDavid C Somayajulu 	p_mngr->ilt_shadow = OSAL_NULL;
109911e25f0dSDavid C Somayajulu }
110011e25f0dSDavid C Somayajulu 
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)110111e25f0dSDavid C Somayajulu static enum _ecore_status_t ecore_ilt_blk_alloc(struct ecore_hwfn *p_hwfn,
110211e25f0dSDavid C Somayajulu 						struct ecore_ilt_cli_blk *p_blk,
110311e25f0dSDavid C Somayajulu 						enum ilt_clients ilt_client,
110411e25f0dSDavid C Somayajulu 						u32 start_line_offset)
110511e25f0dSDavid C Somayajulu {
110611e25f0dSDavid C Somayajulu 	struct ecore_dma_mem *ilt_shadow = p_hwfn->p_cxt_mngr->ilt_shadow;
110711e25f0dSDavid C Somayajulu 	u32 lines, line, sz_left, lines_to_skip = 0;
110811e25f0dSDavid C Somayajulu 
110911e25f0dSDavid C Somayajulu 	/* Special handling for RoCE that supports dynamic allocation */
111011e25f0dSDavid C Somayajulu 	if (ECORE_IS_RDMA_PERSONALITY(p_hwfn) &&
111111e25f0dSDavid C Somayajulu 	    ((ilt_client == ILT_CLI_CDUT) || ilt_client == ILT_CLI_TSDM))
111211e25f0dSDavid C Somayajulu 		return ECORE_SUCCESS;
111311e25f0dSDavid C Somayajulu 
111411e25f0dSDavid C Somayajulu 	lines_to_skip = p_blk->dynamic_line_cnt;
111511e25f0dSDavid C Somayajulu 
111611e25f0dSDavid C Somayajulu 	if (!p_blk->total_size)
111711e25f0dSDavid C Somayajulu 		return ECORE_SUCCESS;
111811e25f0dSDavid C Somayajulu 
111911e25f0dSDavid C Somayajulu 	sz_left = p_blk->total_size;
112011e25f0dSDavid C Somayajulu 	lines = DIV_ROUND_UP(sz_left, p_blk->real_size_in_page) -
112111e25f0dSDavid C Somayajulu 		lines_to_skip;
112211e25f0dSDavid C Somayajulu 	line = p_blk->start_line + start_line_offset -
112311e25f0dSDavid C Somayajulu 	       p_hwfn->p_cxt_mngr->pf_start_line + lines_to_skip;
112411e25f0dSDavid C Somayajulu 
112511e25f0dSDavid C Somayajulu 	for (; lines; lines--) {
112611e25f0dSDavid C Somayajulu 		dma_addr_t p_phys;
112711e25f0dSDavid C Somayajulu 		void *p_virt;
112811e25f0dSDavid C Somayajulu 		u32 size;
112911e25f0dSDavid C Somayajulu 
113011e25f0dSDavid C Somayajulu 		size = OSAL_MIN_T(u32, sz_left, p_blk->real_size_in_page);
113111e25f0dSDavid C Somayajulu 		p_virt = OSAL_DMA_ALLOC_COHERENT(p_hwfn->p_dev,
113211e25f0dSDavid C Somayajulu 						 &p_phys, size);
113311e25f0dSDavid C Somayajulu 		if (!p_virt)
113411e25f0dSDavid C Somayajulu 			return ECORE_NOMEM;
113511e25f0dSDavid C Somayajulu 		OSAL_MEM_ZERO(p_virt, size);
113611e25f0dSDavid C Somayajulu 
113711e25f0dSDavid C Somayajulu 		ilt_shadow[line].p_phys = p_phys;
113811e25f0dSDavid C Somayajulu 		ilt_shadow[line].p_virt = p_virt;
113911e25f0dSDavid C Somayajulu 		ilt_shadow[line].size = size;
114011e25f0dSDavid C Somayajulu 
114111e25f0dSDavid C Somayajulu 		DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
114211e25f0dSDavid C Somayajulu 			   "ILT shadow: Line [%d] Physical 0x%llx Virtual %p Size %d\n",
114311e25f0dSDavid C Somayajulu 			   line, (unsigned long long)p_phys, p_virt, size);
114411e25f0dSDavid C Somayajulu 
114511e25f0dSDavid C Somayajulu 		sz_left -= size;
114611e25f0dSDavid C Somayajulu 		line++;
114711e25f0dSDavid C Somayajulu 	}
114811e25f0dSDavid C Somayajulu 
114911e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
115011e25f0dSDavid C Somayajulu }
115111e25f0dSDavid C Somayajulu 
ecore_ilt_shadow_alloc(struct ecore_hwfn * p_hwfn)115211e25f0dSDavid C Somayajulu static enum _ecore_status_t ecore_ilt_shadow_alloc(struct ecore_hwfn *p_hwfn)
115311e25f0dSDavid C Somayajulu {
115411e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr  = p_hwfn->p_cxt_mngr;
115511e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *clients = p_mngr->clients;
115611e25f0dSDavid C Somayajulu 	struct ecore_ilt_cli_blk *p_blk;
115711e25f0dSDavid C Somayajulu 	u32 size, i, j, k;
115811e25f0dSDavid C Somayajulu 	enum _ecore_status_t rc;
115911e25f0dSDavid C Somayajulu 
116011e25f0dSDavid C Somayajulu 	size = ecore_cxt_ilt_shadow_size(clients);
116111e25f0dSDavid C Somayajulu 	p_mngr->ilt_shadow = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL,
116211e25f0dSDavid C Somayajulu 					 size * sizeof(struct ecore_dma_mem));
116311e25f0dSDavid C Somayajulu 
1164217ec208SDavid C Somayajulu 	if (p_mngr->ilt_shadow == OSAL_NULL) {
1165217ec208SDavid C Somayajulu 		DP_NOTICE(p_hwfn, false, "Failed to allocate ilt shadow table\n");
116611e25f0dSDavid C Somayajulu 		rc = ECORE_NOMEM;
116711e25f0dSDavid C Somayajulu 		goto ilt_shadow_fail;
116811e25f0dSDavid C Somayajulu 	}
116911e25f0dSDavid C Somayajulu 
117011e25f0dSDavid C Somayajulu 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
117111e25f0dSDavid C Somayajulu 		   "Allocated 0x%x bytes for ilt shadow\n",
117211e25f0dSDavid C Somayajulu 		   (u32)(size * sizeof(struct ecore_dma_mem)));
117311e25f0dSDavid C Somayajulu 
117411e25f0dSDavid C Somayajulu 	for_each_ilt_valid_client(i, clients) {
117511e25f0dSDavid C Somayajulu 		for (j = 0; j < ILT_CLI_PF_BLOCKS; j++) {
117611e25f0dSDavid C Somayajulu 			p_blk = &clients[i].pf_blks[j];
117711e25f0dSDavid C Somayajulu 			rc = ecore_ilt_blk_alloc(p_hwfn, p_blk, i, 0);
117811e25f0dSDavid C Somayajulu 			if (rc != ECORE_SUCCESS)
117911e25f0dSDavid C Somayajulu 				goto ilt_shadow_fail;
118011e25f0dSDavid C Somayajulu 		}
118111e25f0dSDavid C Somayajulu 		for (k = 0; k < p_mngr->vf_count; k++) {
118211e25f0dSDavid C Somayajulu 			for (j = 0; j < ILT_CLI_VF_BLOCKS; j++) {
118311e25f0dSDavid C Somayajulu 				u32 lines = clients[i].vf_total_lines * k;
118411e25f0dSDavid C Somayajulu 
118511e25f0dSDavid C Somayajulu 				p_blk = &clients[i].vf_blks[j];
118611e25f0dSDavid C Somayajulu 				rc = ecore_ilt_blk_alloc(p_hwfn, p_blk,
118711e25f0dSDavid C Somayajulu 							 i, lines);
118811e25f0dSDavid C Somayajulu 				if (rc != ECORE_SUCCESS)
118911e25f0dSDavid C Somayajulu 					goto ilt_shadow_fail;
119011e25f0dSDavid C Somayajulu 			}
119111e25f0dSDavid C Somayajulu 		}
119211e25f0dSDavid C Somayajulu 	}
119311e25f0dSDavid C Somayajulu 
119411e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
119511e25f0dSDavid C Somayajulu 
119611e25f0dSDavid C Somayajulu ilt_shadow_fail:
119711e25f0dSDavid C Somayajulu 	ecore_ilt_shadow_free(p_hwfn);
119811e25f0dSDavid C Somayajulu 	return rc;
119911e25f0dSDavid C Somayajulu }
120011e25f0dSDavid C Somayajulu 
ecore_cid_map_free(struct ecore_hwfn * p_hwfn)120111e25f0dSDavid C Somayajulu static void ecore_cid_map_free(struct ecore_hwfn *p_hwfn)
120211e25f0dSDavid C Somayajulu {
120311e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
120411e25f0dSDavid C Somayajulu 	u32 type, vf;
120511e25f0dSDavid C Somayajulu 
120611e25f0dSDavid C Somayajulu 	for (type = 0; type < MAX_CONN_TYPES; type++) {
120711e25f0dSDavid C Somayajulu 		OSAL_FREE(p_hwfn->p_dev, p_mngr->acquired[type].cid_map);
1208217ec208SDavid C Somayajulu 		p_mngr->acquired[type].cid_map = OSAL_NULL;
120911e25f0dSDavid C Somayajulu 		p_mngr->acquired[type].max_count = 0;
121011e25f0dSDavid C Somayajulu 		p_mngr->acquired[type].start_cid = 0;
121111e25f0dSDavid C Somayajulu 
121211e25f0dSDavid C Somayajulu 		for (vf = 0; vf < COMMON_MAX_NUM_VFS; vf++) {
121311e25f0dSDavid C Somayajulu 			OSAL_FREE(p_hwfn->p_dev,
121411e25f0dSDavid C Somayajulu 				  p_mngr->acquired_vf[type][vf].cid_map);
1215217ec208SDavid C Somayajulu 			p_mngr->acquired_vf[type][vf].cid_map = OSAL_NULL;
121611e25f0dSDavid C Somayajulu 			p_mngr->acquired_vf[type][vf].max_count = 0;
121711e25f0dSDavid C Somayajulu 			p_mngr->acquired_vf[type][vf].start_cid = 0;
121811e25f0dSDavid C Somayajulu 		}
121911e25f0dSDavid C Somayajulu 	}
122011e25f0dSDavid C Somayajulu }
122111e25f0dSDavid C Somayajulu 
122211e25f0dSDavid C Somayajulu 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)122311e25f0dSDavid C Somayajulu ecore_cid_map_alloc_single(struct ecore_hwfn *p_hwfn, u32 type,
122411e25f0dSDavid C Somayajulu 			   u32 cid_start, u32 cid_count,
122511e25f0dSDavid C Somayajulu 			   struct ecore_cid_acquired_map *p_map)
122611e25f0dSDavid C Somayajulu {
122711e25f0dSDavid C Somayajulu 	u32 size;
122811e25f0dSDavid C Somayajulu 
122911e25f0dSDavid C Somayajulu 	if (!cid_count)
123011e25f0dSDavid C Somayajulu 		return ECORE_SUCCESS;
123111e25f0dSDavid C Somayajulu 
123211e25f0dSDavid C Somayajulu 	size = MAP_WORD_SIZE * DIV_ROUND_UP(cid_count, BITS_PER_MAP_WORD);
123311e25f0dSDavid C Somayajulu 	p_map->cid_map = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL, size);
123411e25f0dSDavid C Somayajulu 	if (p_map->cid_map == OSAL_NULL)
123511e25f0dSDavid C Somayajulu 		return ECORE_NOMEM;
123611e25f0dSDavid C Somayajulu 
123711e25f0dSDavid C Somayajulu 	p_map->max_count = cid_count;
123811e25f0dSDavid C Somayajulu 	p_map->start_cid = cid_start;
123911e25f0dSDavid C Somayajulu 
124011e25f0dSDavid C Somayajulu 	DP_VERBOSE(p_hwfn, ECORE_MSG_CXT,
124111e25f0dSDavid C Somayajulu 		   "Type %08x start: %08x count %08x\n",
124211e25f0dSDavid C Somayajulu 		   type, p_map->start_cid, p_map->max_count);
124311e25f0dSDavid C Somayajulu 
124411e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
124511e25f0dSDavid C Somayajulu }
124611e25f0dSDavid C Somayajulu 
ecore_cid_map_alloc(struct ecore_hwfn * p_hwfn)124711e25f0dSDavid C Somayajulu static enum _ecore_status_t ecore_cid_map_alloc(struct ecore_hwfn *p_hwfn)
124811e25f0dSDavid C Somayajulu {
124911e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
125011e25f0dSDavid C Somayajulu 	u32 start_cid = 0, vf_start_cid = 0;
125111e25f0dSDavid C Somayajulu 	u32 type, vf;
125211e25f0dSDavid C Somayajulu 
125311e25f0dSDavid C Somayajulu 	for (type = 0; type < MAX_CONN_TYPES; type++) {
125411e25f0dSDavid C Somayajulu 		struct ecore_conn_type_cfg *p_cfg = &p_mngr->conn_cfg[type];
125511e25f0dSDavid C Somayajulu 		struct ecore_cid_acquired_map *p_map;
125611e25f0dSDavid C Somayajulu 
125711e25f0dSDavid C Somayajulu 		/* Handle PF maps */
125811e25f0dSDavid C Somayajulu 		p_map = &p_mngr->acquired[type];
125911e25f0dSDavid C Somayajulu 		if (ecore_cid_map_alloc_single(p_hwfn, type, start_cid,
126011e25f0dSDavid C Somayajulu 					       p_cfg->cid_count, p_map))
126111e25f0dSDavid C Somayajulu 			goto cid_map_fail;
126211e25f0dSDavid C Somayajulu 
126311e25f0dSDavid C Somayajulu 		/* Handle VF maps */
126411e25f0dSDavid C Somayajulu 		for (vf = 0; vf < COMMON_MAX_NUM_VFS; vf++) {
126511e25f0dSDavid C Somayajulu 			p_map = &p_mngr->acquired_vf[type][vf];
126611e25f0dSDavid C Somayajulu 			if (ecore_cid_map_alloc_single(p_hwfn, type,
126711e25f0dSDavid C Somayajulu 						       vf_start_cid,
126811e25f0dSDavid C Somayajulu 						       p_cfg->cids_per_vf,
126911e25f0dSDavid C Somayajulu 						       p_map))
127011e25f0dSDavid C Somayajulu 				goto cid_map_fail;
127111e25f0dSDavid C Somayajulu 		}
127211e25f0dSDavid C Somayajulu 
127311e25f0dSDavid C Somayajulu 		start_cid += p_cfg->cid_count;
127411e25f0dSDavid C Somayajulu 		vf_start_cid += p_cfg->cids_per_vf;
127511e25f0dSDavid C Somayajulu 	}
127611e25f0dSDavid C Somayajulu 
127711e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
127811e25f0dSDavid C Somayajulu 
127911e25f0dSDavid C Somayajulu cid_map_fail:
128011e25f0dSDavid C Somayajulu 	ecore_cid_map_free(p_hwfn);
128111e25f0dSDavid C Somayajulu 	return ECORE_NOMEM;
128211e25f0dSDavid C Somayajulu }
128311e25f0dSDavid C Somayajulu 
ecore_cxt_mngr_alloc(struct ecore_hwfn * p_hwfn)128411e25f0dSDavid C Somayajulu enum _ecore_status_t ecore_cxt_mngr_alloc(struct ecore_hwfn *p_hwfn)
128511e25f0dSDavid C Somayajulu {
128611e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *clients;
128711e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr;
128811e25f0dSDavid C Somayajulu 	u32 i;
128911e25f0dSDavid C Somayajulu 
129011e25f0dSDavid C Somayajulu 	p_mngr = OSAL_ZALLOC(p_hwfn->p_dev, GFP_KERNEL, sizeof(*p_mngr));
129111e25f0dSDavid C Somayajulu 	if (!p_mngr) {
1292217ec208SDavid C Somayajulu 		DP_NOTICE(p_hwfn, false, "Failed to allocate `struct ecore_cxt_mngr'\n");
129311e25f0dSDavid C Somayajulu 		return ECORE_NOMEM;
129411e25f0dSDavid C Somayajulu 	}
129511e25f0dSDavid C Somayajulu 
129611e25f0dSDavid C Somayajulu 	/* Initialize ILT client registers */
129711e25f0dSDavid C Somayajulu 	clients = p_mngr->clients;
129811e25f0dSDavid C Somayajulu 	clients[ILT_CLI_CDUC].first.reg = ILT_CFG_REG(CDUC, FIRST_ILT);
129911e25f0dSDavid C Somayajulu 	clients[ILT_CLI_CDUC].last.reg  = ILT_CFG_REG(CDUC, LAST_ILT);
130011e25f0dSDavid C Somayajulu 	clients[ILT_CLI_CDUC].p_size.reg = ILT_CFG_REG(CDUC, P_SIZE);
130111e25f0dSDavid C Somayajulu 
130211e25f0dSDavid C Somayajulu 	clients[ILT_CLI_QM].first.reg   = ILT_CFG_REG(QM, FIRST_ILT);
130311e25f0dSDavid C Somayajulu 	clients[ILT_CLI_QM].last.reg    = ILT_CFG_REG(QM, LAST_ILT);
130411e25f0dSDavid C Somayajulu 	clients[ILT_CLI_QM].p_size.reg  = ILT_CFG_REG(QM, P_SIZE);
130511e25f0dSDavid C Somayajulu 
130611e25f0dSDavid C Somayajulu 	clients[ILT_CLI_TM].first.reg   = ILT_CFG_REG(TM, FIRST_ILT);
130711e25f0dSDavid C Somayajulu 	clients[ILT_CLI_TM].last.reg    = ILT_CFG_REG(TM, LAST_ILT);
130811e25f0dSDavid C Somayajulu 	clients[ILT_CLI_TM].p_size.reg  = ILT_CFG_REG(TM, P_SIZE);
130911e25f0dSDavid C Somayajulu 
131011e25f0dSDavid C Somayajulu 	clients[ILT_CLI_SRC].first.reg  = ILT_CFG_REG(SRC, FIRST_ILT);
131111e25f0dSDavid C Somayajulu 	clients[ILT_CLI_SRC].last.reg   = ILT_CFG_REG(SRC, LAST_ILT);
131211e25f0dSDavid C Somayajulu 	clients[ILT_CLI_SRC].p_size.reg = ILT_CFG_REG(SRC, P_SIZE);
131311e25f0dSDavid C Somayajulu 
131411e25f0dSDavid C Somayajulu 	clients[ILT_CLI_CDUT].first.reg = ILT_CFG_REG(CDUT, FIRST_ILT);
131511e25f0dSDavid C Somayajulu 	clients[ILT_CLI_CDUT].last.reg  = ILT_CFG_REG(CDUT, LAST_ILT);
131611e25f0dSDavid C Somayajulu 	clients[ILT_CLI_CDUT].p_size.reg = ILT_CFG_REG(CDUT, P_SIZE);
131711e25f0dSDavid C Somayajulu 
131811e25f0dSDavid C Somayajulu 	clients[ILT_CLI_TSDM].first.reg = ILT_CFG_REG(TSDM, FIRST_ILT);
131911e25f0dSDavid C Somayajulu 	clients[ILT_CLI_TSDM].last.reg  = ILT_CFG_REG(TSDM, LAST_ILT);
132011e25f0dSDavid C Somayajulu 	clients[ILT_CLI_TSDM].p_size.reg = ILT_CFG_REG(TSDM, P_SIZE);
132111e25f0dSDavid C Somayajulu 
13229efd0ba7SDavid C Somayajulu 	/* default ILT page size for all clients is 64K */
132311e25f0dSDavid C Somayajulu 	for (i = 0; i < ILT_CLI_MAX; i++)
1324217ec208SDavid C Somayajulu 		p_mngr->clients[i].p_size.val = p_hwfn->p_dev->ilt_page_size;
132511e25f0dSDavid C Somayajulu 
132611e25f0dSDavid C Somayajulu 	/* Initialize task sizes */
132711e25f0dSDavid C Somayajulu 	p_mngr->task_type_size[0] = TYPE0_TASK_CXT_SIZE(p_hwfn);
132811e25f0dSDavid C Somayajulu 	p_mngr->task_type_size[1] = TYPE1_TASK_CXT_SIZE(p_hwfn);
132911e25f0dSDavid C Somayajulu 
133011e25f0dSDavid C Somayajulu 	if (p_hwfn->p_dev->p_iov_info)
133111e25f0dSDavid C Somayajulu 		p_mngr->vf_count = p_hwfn->p_dev->p_iov_info->total_vfs;
133211e25f0dSDavid C Somayajulu 
133311e25f0dSDavid C Somayajulu 	/* Initialize the dynamic ILT allocation mutex */
13349efd0ba7SDavid C Somayajulu #ifdef CONFIG_ECORE_LOCK_ALLOC
133511e25f0dSDavid C Somayajulu 	OSAL_MUTEX_ALLOC(p_hwfn, &p_mngr->mutex);
13369efd0ba7SDavid C Somayajulu #endif
133711e25f0dSDavid C Somayajulu 	OSAL_MUTEX_INIT(&p_mngr->mutex);
133811e25f0dSDavid C Somayajulu 
133911e25f0dSDavid C Somayajulu 	/* Set the cxt mangr pointer priori to further allocations */
134011e25f0dSDavid C Somayajulu 	p_hwfn->p_cxt_mngr = p_mngr;
134111e25f0dSDavid C Somayajulu 
134211e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
134311e25f0dSDavid C Somayajulu }
134411e25f0dSDavid C Somayajulu 
ecore_cxt_tables_alloc(struct ecore_hwfn * p_hwfn)134511e25f0dSDavid C Somayajulu enum _ecore_status_t ecore_cxt_tables_alloc(struct ecore_hwfn *p_hwfn)
134611e25f0dSDavid C Somayajulu {
134711e25f0dSDavid C Somayajulu 	enum _ecore_status_t    rc;
134811e25f0dSDavid C Somayajulu 
134911e25f0dSDavid C Somayajulu 	/* Allocate the ILT shadow table */
135011e25f0dSDavid C Somayajulu 	rc = ecore_ilt_shadow_alloc(p_hwfn);
135111e25f0dSDavid C Somayajulu 	if (rc) {
1352217ec208SDavid C Somayajulu 		DP_NOTICE(p_hwfn, false, "Failed to allocate ilt memory\n");
135311e25f0dSDavid C Somayajulu 		goto tables_alloc_fail;
135411e25f0dSDavid C Somayajulu 	}
135511e25f0dSDavid C Somayajulu 
135611e25f0dSDavid C Somayajulu 	/* Allocate the T2  table */
135711e25f0dSDavid C Somayajulu 	rc = ecore_cxt_src_t2_alloc(p_hwfn);
135811e25f0dSDavid C Somayajulu 	if (rc) {
1359217ec208SDavid C Somayajulu 		DP_NOTICE(p_hwfn, false, "Failed to allocate T2 memory\n");
136011e25f0dSDavid C Somayajulu 		goto tables_alloc_fail;
136111e25f0dSDavid C Somayajulu 	}
136211e25f0dSDavid C Somayajulu 
136311e25f0dSDavid C Somayajulu 	/* Allocate and initialize the acquired cids bitmaps */
136411e25f0dSDavid C Somayajulu 	rc = ecore_cid_map_alloc(p_hwfn);
136511e25f0dSDavid C Somayajulu 	if (rc) {
1366217ec208SDavid C Somayajulu 		DP_NOTICE(p_hwfn, false, "Failed to allocate cid maps\n");
136711e25f0dSDavid C Somayajulu 		goto tables_alloc_fail;
136811e25f0dSDavid C Somayajulu 	}
136911e25f0dSDavid C Somayajulu 
137011e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
137111e25f0dSDavid C Somayajulu 
137211e25f0dSDavid C Somayajulu tables_alloc_fail:
137311e25f0dSDavid C Somayajulu 	ecore_cxt_mngr_free(p_hwfn);
137411e25f0dSDavid C Somayajulu 	return rc;
137511e25f0dSDavid C Somayajulu }
ecore_cxt_mngr_free(struct ecore_hwfn * p_hwfn)137611e25f0dSDavid C Somayajulu void ecore_cxt_mngr_free(struct ecore_hwfn *p_hwfn)
137711e25f0dSDavid C Somayajulu {
137811e25f0dSDavid C Somayajulu 	if (!p_hwfn->p_cxt_mngr)
137911e25f0dSDavid C Somayajulu 		return;
138011e25f0dSDavid C Somayajulu 
138111e25f0dSDavid C Somayajulu 	ecore_cid_map_free(p_hwfn);
138211e25f0dSDavid C Somayajulu 	ecore_cxt_src_t2_free(p_hwfn);
138311e25f0dSDavid C Somayajulu 	ecore_ilt_shadow_free(p_hwfn);
13849efd0ba7SDavid C Somayajulu #ifdef CONFIG_ECORE_LOCK_ALLOC
138511e25f0dSDavid C Somayajulu 	OSAL_MUTEX_DEALLOC(&p_hwfn->p_cxt_mngr->mutex);
13869efd0ba7SDavid C Somayajulu #endif
138711e25f0dSDavid C Somayajulu 	OSAL_FREE(p_hwfn->p_dev, p_hwfn->p_cxt_mngr);
138811e25f0dSDavid C Somayajulu 
138911e25f0dSDavid C Somayajulu 	p_hwfn->p_cxt_mngr = OSAL_NULL;
139011e25f0dSDavid C Somayajulu }
139111e25f0dSDavid C Somayajulu 
ecore_cxt_mngr_setup(struct ecore_hwfn * p_hwfn)139211e25f0dSDavid C Somayajulu void ecore_cxt_mngr_setup(struct ecore_hwfn *p_hwfn)
139311e25f0dSDavid C Somayajulu {
139411e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
139511e25f0dSDavid C Somayajulu 	struct ecore_cid_acquired_map *p_map;
139611e25f0dSDavid C Somayajulu 	struct ecore_conn_type_cfg *p_cfg;
139711e25f0dSDavid C Somayajulu 	int type;
139811e25f0dSDavid C Somayajulu 	u32 len;
139911e25f0dSDavid C Somayajulu 
140011e25f0dSDavid C Somayajulu 	/* Reset acquired cids */
140111e25f0dSDavid C Somayajulu 	for (type = 0; type < MAX_CONN_TYPES; type++) {
140211e25f0dSDavid C Somayajulu 		u32 vf;
140311e25f0dSDavid C Somayajulu 
140411e25f0dSDavid C Somayajulu 		p_cfg = &p_mngr->conn_cfg[type];
140511e25f0dSDavid C Somayajulu 		if (p_cfg->cid_count) {
140611e25f0dSDavid C Somayajulu 			p_map = &p_mngr->acquired[type];
140711e25f0dSDavid C Somayajulu 			len = DIV_ROUND_UP(p_map->max_count,
140811e25f0dSDavid C Somayajulu 					   BITS_PER_MAP_WORD) *
140911e25f0dSDavid C Somayajulu 			      MAP_WORD_SIZE;
141011e25f0dSDavid C Somayajulu 			OSAL_MEM_ZERO(p_map->cid_map, len);
141111e25f0dSDavid C Somayajulu 		}
141211e25f0dSDavid C Somayajulu 
141311e25f0dSDavid C Somayajulu 		if (!p_cfg->cids_per_vf)
141411e25f0dSDavid C Somayajulu 			continue;
141511e25f0dSDavid C Somayajulu 
141611e25f0dSDavid C Somayajulu 		for (vf = 0; vf < COMMON_MAX_NUM_VFS; vf++) {
141711e25f0dSDavid C Somayajulu 			p_map = &p_mngr->acquired_vf[type][vf];
141811e25f0dSDavid C Somayajulu 			len = DIV_ROUND_UP(p_map->max_count,
141911e25f0dSDavid C Somayajulu 					   BITS_PER_MAP_WORD) *
142011e25f0dSDavid C Somayajulu 			      MAP_WORD_SIZE;
142111e25f0dSDavid C Somayajulu 			OSAL_MEM_ZERO(p_map->cid_map, len);
142211e25f0dSDavid C Somayajulu 		}
142311e25f0dSDavid C Somayajulu 	}
142411e25f0dSDavid C Somayajulu }
142511e25f0dSDavid C Somayajulu 
142611e25f0dSDavid C Somayajulu /* HW initialization helper (per Block, per phase) */
142711e25f0dSDavid C Somayajulu 
142811e25f0dSDavid C Somayajulu /* CDU Common */
142911e25f0dSDavid C Somayajulu #define CDUC_CXT_SIZE_SHIFT						\
143011e25f0dSDavid C Somayajulu 	CDU_REG_CID_ADDR_PARAMS_CONTEXT_SIZE_SHIFT
143111e25f0dSDavid C Somayajulu 
143211e25f0dSDavid C Somayajulu #define CDUC_CXT_SIZE_MASK						\
143311e25f0dSDavid C Somayajulu 	(CDU_REG_CID_ADDR_PARAMS_CONTEXT_SIZE >> CDUC_CXT_SIZE_SHIFT)
143411e25f0dSDavid C Somayajulu 
143511e25f0dSDavid C Somayajulu #define CDUC_BLOCK_WASTE_SHIFT						\
143611e25f0dSDavid C Somayajulu 	CDU_REG_CID_ADDR_PARAMS_BLOCK_WASTE_SHIFT
143711e25f0dSDavid C Somayajulu 
143811e25f0dSDavid C Somayajulu #define CDUC_BLOCK_WASTE_MASK						\
143911e25f0dSDavid C Somayajulu 	(CDU_REG_CID_ADDR_PARAMS_BLOCK_WASTE >> CDUC_BLOCK_WASTE_SHIFT)
144011e25f0dSDavid C Somayajulu 
144111e25f0dSDavid C Somayajulu #define CDUC_NCIB_SHIFT							\
144211e25f0dSDavid C Somayajulu 	CDU_REG_CID_ADDR_PARAMS_NCIB_SHIFT
144311e25f0dSDavid C Somayajulu 
144411e25f0dSDavid C Somayajulu #define CDUC_NCIB_MASK							\
144511e25f0dSDavid C Somayajulu 	(CDU_REG_CID_ADDR_PARAMS_NCIB >> CDUC_NCIB_SHIFT)
144611e25f0dSDavid C Somayajulu 
144711e25f0dSDavid C Somayajulu #define CDUT_TYPE0_CXT_SIZE_SHIFT					\
144811e25f0dSDavid C Somayajulu 	CDU_REG_SEGMENT0_PARAMS_T0_TID_SIZE_SHIFT
144911e25f0dSDavid C Somayajulu 
145011e25f0dSDavid C Somayajulu #define CDUT_TYPE0_CXT_SIZE_MASK					\
145111e25f0dSDavid C Somayajulu 	(CDU_REG_SEGMENT0_PARAMS_T0_TID_SIZE >>				\
145211e25f0dSDavid C Somayajulu 	CDUT_TYPE0_CXT_SIZE_SHIFT)
145311e25f0dSDavid C Somayajulu 
145411e25f0dSDavid C Somayajulu #define CDUT_TYPE0_BLOCK_WASTE_SHIFT					\
145511e25f0dSDavid C Somayajulu 	CDU_REG_SEGMENT0_PARAMS_T0_TID_BLOCK_WASTE_SHIFT
145611e25f0dSDavid C Somayajulu 
145711e25f0dSDavid C Somayajulu #define CDUT_TYPE0_BLOCK_WASTE_MASK					\
145811e25f0dSDavid C Somayajulu 	(CDU_REG_SEGMENT0_PARAMS_T0_TID_BLOCK_WASTE >>			\
145911e25f0dSDavid C Somayajulu 	CDUT_TYPE0_BLOCK_WASTE_SHIFT)
146011e25f0dSDavid C Somayajulu 
146111e25f0dSDavid C Somayajulu #define CDUT_TYPE0_NCIB_SHIFT						\
146211e25f0dSDavid C Somayajulu 	CDU_REG_SEGMENT0_PARAMS_T0_NUM_TIDS_IN_BLOCK_SHIFT
146311e25f0dSDavid C Somayajulu 
146411e25f0dSDavid C Somayajulu #define CDUT_TYPE0_NCIB_MASK						\
146511e25f0dSDavid C Somayajulu 	(CDU_REG_SEGMENT0_PARAMS_T0_NUM_TIDS_IN_BLOCK >>		\
146611e25f0dSDavid C Somayajulu 	CDUT_TYPE0_NCIB_SHIFT)
146711e25f0dSDavid C Somayajulu 
146811e25f0dSDavid C Somayajulu #define CDUT_TYPE1_CXT_SIZE_SHIFT					\
146911e25f0dSDavid C Somayajulu 	CDU_REG_SEGMENT1_PARAMS_T1_TID_SIZE_SHIFT
147011e25f0dSDavid C Somayajulu 
147111e25f0dSDavid C Somayajulu #define CDUT_TYPE1_CXT_SIZE_MASK					\
147211e25f0dSDavid C Somayajulu 	(CDU_REG_SEGMENT1_PARAMS_T1_TID_SIZE >>				\
147311e25f0dSDavid C Somayajulu 	CDUT_TYPE1_CXT_SIZE_SHIFT)
147411e25f0dSDavid C Somayajulu 
147511e25f0dSDavid C Somayajulu #define CDUT_TYPE1_BLOCK_WASTE_SHIFT					\
147611e25f0dSDavid C Somayajulu 	CDU_REG_SEGMENT1_PARAMS_T1_TID_BLOCK_WASTE_SHIFT
147711e25f0dSDavid C Somayajulu 
147811e25f0dSDavid C Somayajulu #define CDUT_TYPE1_BLOCK_WASTE_MASK					\
147911e25f0dSDavid C Somayajulu 	(CDU_REG_SEGMENT1_PARAMS_T1_TID_BLOCK_WASTE >>			\
148011e25f0dSDavid C Somayajulu 	CDUT_TYPE1_BLOCK_WASTE_SHIFT)
148111e25f0dSDavid C Somayajulu 
148211e25f0dSDavid C Somayajulu #define CDUT_TYPE1_NCIB_SHIFT						\
148311e25f0dSDavid C Somayajulu 	CDU_REG_SEGMENT1_PARAMS_T1_NUM_TIDS_IN_BLOCK_SHIFT
148411e25f0dSDavid C Somayajulu 
148511e25f0dSDavid C Somayajulu #define CDUT_TYPE1_NCIB_MASK						\
148611e25f0dSDavid C Somayajulu 	(CDU_REG_SEGMENT1_PARAMS_T1_NUM_TIDS_IN_BLOCK >>		\
148711e25f0dSDavid C Somayajulu 	CDUT_TYPE1_NCIB_SHIFT)
148811e25f0dSDavid C Somayajulu 
ecore_cdu_init_common(struct ecore_hwfn * p_hwfn)148911e25f0dSDavid C Somayajulu static void ecore_cdu_init_common(struct ecore_hwfn *p_hwfn)
149011e25f0dSDavid C Somayajulu {
149111e25f0dSDavid C Somayajulu 	u32 page_sz, elems_per_page, block_waste,  cxt_size, cdu_params = 0;
149211e25f0dSDavid C Somayajulu 
149311e25f0dSDavid C Somayajulu 	/* CDUC - connection configuration */
149411e25f0dSDavid C Somayajulu 	page_sz = p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC].p_size.val;
149511e25f0dSDavid C Somayajulu 	cxt_size = CONN_CXT_SIZE(p_hwfn);
149611e25f0dSDavid C Somayajulu 	elems_per_page = ILT_PAGE_IN_BYTES(page_sz) / cxt_size;
149711e25f0dSDavid C Somayajulu 	block_waste = ILT_PAGE_IN_BYTES(page_sz) - elems_per_page * cxt_size;
149811e25f0dSDavid C Somayajulu 
149911e25f0dSDavid C Somayajulu 	SET_FIELD(cdu_params, CDUC_CXT_SIZE, cxt_size);
150011e25f0dSDavid C Somayajulu 	SET_FIELD(cdu_params, CDUC_BLOCK_WASTE, block_waste);
150111e25f0dSDavid C Somayajulu 	SET_FIELD(cdu_params, (u32)CDUC_NCIB, elems_per_page);
150211e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, CDU_REG_CID_ADDR_PARAMS_RT_OFFSET, cdu_params);
150311e25f0dSDavid C Somayajulu 
150411e25f0dSDavid C Somayajulu 	/* CDUT - type-0 tasks configuration */
150511e25f0dSDavid C Somayajulu 	page_sz = p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT].p_size.val;
150611e25f0dSDavid C Somayajulu 	cxt_size = p_hwfn->p_cxt_mngr->task_type_size[0];
150711e25f0dSDavid C Somayajulu 	elems_per_page = ILT_PAGE_IN_BYTES(page_sz) / cxt_size;
150811e25f0dSDavid C Somayajulu 	block_waste = ILT_PAGE_IN_BYTES(page_sz) - elems_per_page * cxt_size;
150911e25f0dSDavid C Somayajulu 
151011e25f0dSDavid C Somayajulu 	/* cxt size and block-waste are multipes of 8 */
151111e25f0dSDavid C Somayajulu 	cdu_params = 0;
151211e25f0dSDavid C Somayajulu 	SET_FIELD(cdu_params, (u32)CDUT_TYPE0_CXT_SIZE, (cxt_size >> 3));
151311e25f0dSDavid C Somayajulu 	SET_FIELD(cdu_params, CDUT_TYPE0_BLOCK_WASTE, (block_waste >> 3));
151411e25f0dSDavid C Somayajulu 	SET_FIELD(cdu_params, CDUT_TYPE0_NCIB, elems_per_page);
151511e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, CDU_REG_SEGMENT0_PARAMS_RT_OFFSET, cdu_params);
151611e25f0dSDavid C Somayajulu 
151711e25f0dSDavid C Somayajulu 	/* CDUT - type-1 tasks configuration */
151811e25f0dSDavid C Somayajulu 	cxt_size = p_hwfn->p_cxt_mngr->task_type_size[1];
151911e25f0dSDavid C Somayajulu 	elems_per_page = ILT_PAGE_IN_BYTES(page_sz) / cxt_size;
152011e25f0dSDavid C Somayajulu 	block_waste = ILT_PAGE_IN_BYTES(page_sz) - elems_per_page * cxt_size;
152111e25f0dSDavid C Somayajulu 
152211e25f0dSDavid C Somayajulu 	/* cxt size and block-waste are multipes of 8 */
152311e25f0dSDavid C Somayajulu 	cdu_params = 0;
152411e25f0dSDavid C Somayajulu 	SET_FIELD(cdu_params, (u32)CDUT_TYPE1_CXT_SIZE, (cxt_size >> 3));
152511e25f0dSDavid C Somayajulu 	SET_FIELD(cdu_params, CDUT_TYPE1_BLOCK_WASTE, (block_waste >> 3));
152611e25f0dSDavid C Somayajulu 	SET_FIELD(cdu_params, CDUT_TYPE1_NCIB, elems_per_page);
152711e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, CDU_REG_SEGMENT1_PARAMS_RT_OFFSET, cdu_params);
152811e25f0dSDavid C Somayajulu }
152911e25f0dSDavid C Somayajulu 
153011e25f0dSDavid C Somayajulu /* CDU PF */
153111e25f0dSDavid C Somayajulu #define CDU_SEG_REG_TYPE_SHIFT		CDU_SEG_TYPE_OFFSET_REG_TYPE_SHIFT
153211e25f0dSDavid C Somayajulu #define CDU_SEG_REG_TYPE_MASK		0x1
153311e25f0dSDavid C Somayajulu #define CDU_SEG_REG_OFFSET_SHIFT	0
153411e25f0dSDavid C Somayajulu #define CDU_SEG_REG_OFFSET_MASK		CDU_SEG_TYPE_OFFSET_REG_OFFSET_MASK
153511e25f0dSDavid C Somayajulu 
ecore_cdu_init_pf(struct ecore_hwfn * p_hwfn)153611e25f0dSDavid C Somayajulu static void ecore_cdu_init_pf(struct ecore_hwfn *p_hwfn)
153711e25f0dSDavid C Somayajulu {
153811e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *p_cli;
153911e25f0dSDavid C Somayajulu 	struct ecore_tid_seg *p_seg;
154011e25f0dSDavid C Somayajulu 	u32 cdu_seg_params, offset;
154111e25f0dSDavid C Somayajulu 	int i;
154211e25f0dSDavid C Somayajulu 
154311e25f0dSDavid C Somayajulu 	static const u32 rt_type_offset_arr[] = {
154411e25f0dSDavid C Somayajulu 		CDU_REG_PF_SEG0_TYPE_OFFSET_RT_OFFSET,
154511e25f0dSDavid C Somayajulu 		CDU_REG_PF_SEG1_TYPE_OFFSET_RT_OFFSET,
154611e25f0dSDavid C Somayajulu 		CDU_REG_PF_SEG2_TYPE_OFFSET_RT_OFFSET,
154711e25f0dSDavid C Somayajulu 		CDU_REG_PF_SEG3_TYPE_OFFSET_RT_OFFSET
154811e25f0dSDavid C Somayajulu 	};
154911e25f0dSDavid C Somayajulu 
155011e25f0dSDavid C Somayajulu 	static const u32 rt_type_offset_fl_arr[] = {
155111e25f0dSDavid C Somayajulu 		CDU_REG_PF_FL_SEG0_TYPE_OFFSET_RT_OFFSET,
155211e25f0dSDavid C Somayajulu 		CDU_REG_PF_FL_SEG1_TYPE_OFFSET_RT_OFFSET,
155311e25f0dSDavid C Somayajulu 		CDU_REG_PF_FL_SEG2_TYPE_OFFSET_RT_OFFSET,
155411e25f0dSDavid C Somayajulu 		CDU_REG_PF_FL_SEG3_TYPE_OFFSET_RT_OFFSET
155511e25f0dSDavid C Somayajulu 	};
155611e25f0dSDavid C Somayajulu 
155711e25f0dSDavid C Somayajulu 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
155811e25f0dSDavid C Somayajulu 
155911e25f0dSDavid C Somayajulu 	/* There are initializations only for CDUT during pf Phase */
156011e25f0dSDavid C Somayajulu 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
156111e25f0dSDavid C Somayajulu 		/* Segment 0*/
156211e25f0dSDavid C Somayajulu 		p_seg = ecore_cxt_tid_seg_info(p_hwfn, i);
156311e25f0dSDavid C Somayajulu 		if (!p_seg)
156411e25f0dSDavid C Somayajulu 			continue;
156511e25f0dSDavid C Somayajulu 
156611e25f0dSDavid C Somayajulu 		/* Note: start_line is already adjusted for the CDU
156711e25f0dSDavid C Somayajulu 		 * segment register granularity, so we just need to
156811e25f0dSDavid C Somayajulu 		 * divide. Adjustment is implicit as we assume ILT
156911e25f0dSDavid C Somayajulu 		 * Page size is larger than 32K!
157011e25f0dSDavid C Somayajulu 		 */
157111e25f0dSDavid C Somayajulu 		offset = (ILT_PAGE_IN_BYTES(p_cli->p_size.val) *
157211e25f0dSDavid C Somayajulu 			 (p_cli->pf_blks[CDUT_SEG_BLK(i)].start_line -
157311e25f0dSDavid C Somayajulu 			  p_cli->first.val)) / CDUT_SEG_ALIGNMET_IN_BYTES;
157411e25f0dSDavid C Somayajulu 
157511e25f0dSDavid C Somayajulu 		cdu_seg_params = 0;
157611e25f0dSDavid C Somayajulu 		SET_FIELD(cdu_seg_params, CDU_SEG_REG_TYPE, p_seg->type);
157711e25f0dSDavid C Somayajulu 		SET_FIELD(cdu_seg_params, CDU_SEG_REG_OFFSET, offset);
157811e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn, rt_type_offset_arr[i],
157911e25f0dSDavid C Somayajulu 			     cdu_seg_params);
158011e25f0dSDavid C Somayajulu 
158111e25f0dSDavid C Somayajulu 		offset = (ILT_PAGE_IN_BYTES(p_cli->p_size.val) *
158211e25f0dSDavid C Somayajulu 			 (p_cli->pf_blks[CDUT_FL_SEG_BLK(i, PF)].start_line -
158311e25f0dSDavid C Somayajulu 			  p_cli->first.val)) / CDUT_SEG_ALIGNMET_IN_BYTES;
158411e25f0dSDavid C Somayajulu 
158511e25f0dSDavid C Somayajulu 		cdu_seg_params = 0;
158611e25f0dSDavid C Somayajulu 		SET_FIELD(cdu_seg_params, CDU_SEG_REG_TYPE, p_seg->type);
158711e25f0dSDavid C Somayajulu 		SET_FIELD(cdu_seg_params, CDU_SEG_REG_OFFSET, offset);
158811e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn, rt_type_offset_fl_arr[i],
158911e25f0dSDavid C Somayajulu 			     cdu_seg_params);
159011e25f0dSDavid C Somayajulu 	}
159111e25f0dSDavid C Somayajulu }
159211e25f0dSDavid C Somayajulu 
ecore_qm_init_pf(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,bool is_pf_loading)1593217ec208SDavid C Somayajulu void ecore_qm_init_pf(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
1594217ec208SDavid C Somayajulu 		      bool is_pf_loading)
159511e25f0dSDavid C Somayajulu {
159611e25f0dSDavid C Somayajulu 	struct ecore_qm_info *qm_info = &p_hwfn->qm_info;
1597217ec208SDavid C Somayajulu 	struct ecore_mcp_link_state *p_link;
159811e25f0dSDavid C Somayajulu 	struct ecore_qm_iids iids;
159911e25f0dSDavid C Somayajulu 
160011e25f0dSDavid C Somayajulu 	OSAL_MEM_ZERO(&iids, sizeof(iids));
160111e25f0dSDavid C Somayajulu 	ecore_cxt_qm_iids(p_hwfn, &iids);
160211e25f0dSDavid C Somayajulu 
1603217ec208SDavid C Somayajulu 	p_link = &ECORE_LEADING_HWFN(p_hwfn->p_dev)->mcp_info->link_output;
1604217ec208SDavid C Somayajulu 
16059efd0ba7SDavid C Somayajulu 	ecore_qm_pf_rt_init(p_hwfn, p_ptt, p_hwfn->port_id,
160611e25f0dSDavid C Somayajulu 			    p_hwfn->rel_pf_id, qm_info->max_phys_tcs_per_port,
1607217ec208SDavid C Somayajulu 			    is_pf_loading,
160811e25f0dSDavid C Somayajulu 			    iids.cids, iids.vf_cids, iids.tids,
160911e25f0dSDavid C Somayajulu 			    qm_info->start_pq,
161011e25f0dSDavid C Somayajulu 			    qm_info->num_pqs - qm_info->num_vf_pqs,
161111e25f0dSDavid C Somayajulu 			    qm_info->num_vf_pqs,
161211e25f0dSDavid C Somayajulu 			    qm_info->start_vport,
1613217ec208SDavid C Somayajulu 			    qm_info->num_vports, qm_info->pf_wfq,
1614217ec208SDavid C Somayajulu 			    qm_info->pf_rl, p_link->speed,
161511e25f0dSDavid C Somayajulu 			    p_hwfn->qm_info.qm_pq_params,
161611e25f0dSDavid C Somayajulu 			    p_hwfn->qm_info.qm_vport_params);
161711e25f0dSDavid C Somayajulu }
161811e25f0dSDavid C Somayajulu 
161911e25f0dSDavid C Somayajulu /* CM PF */
ecore_cm_init_pf(struct ecore_hwfn * p_hwfn)162011e25f0dSDavid C Somayajulu static void ecore_cm_init_pf(struct ecore_hwfn *p_hwfn)
162111e25f0dSDavid C Somayajulu {
162211e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, XCM_REG_CON_PHY_Q3_RT_OFFSET, ecore_get_cm_pq_idx(p_hwfn, PQ_FLAGS_LB));
162311e25f0dSDavid C Somayajulu }
162411e25f0dSDavid C Somayajulu 
162511e25f0dSDavid C Somayajulu /* DQ PF */
ecore_dq_init_pf(struct ecore_hwfn * p_hwfn)162611e25f0dSDavid C Somayajulu static void ecore_dq_init_pf(struct ecore_hwfn *p_hwfn)
162711e25f0dSDavid C Somayajulu {
162811e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
162911e25f0dSDavid C Somayajulu 	u32 dq_pf_max_cid = 0, dq_vf_max_cid = 0;
163011e25f0dSDavid C Somayajulu 
163111e25f0dSDavid C Somayajulu 	dq_pf_max_cid += (p_mngr->conn_cfg[0].cid_count >> DQ_RANGE_SHIFT);
163211e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_0_RT_OFFSET, dq_pf_max_cid);
163311e25f0dSDavid C Somayajulu 
163411e25f0dSDavid C Somayajulu 	dq_vf_max_cid += (p_mngr->conn_cfg[0].cids_per_vf >> DQ_RANGE_SHIFT);
163511e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_0_RT_OFFSET, dq_vf_max_cid);
163611e25f0dSDavid C Somayajulu 
163711e25f0dSDavid C Somayajulu 	dq_pf_max_cid += (p_mngr->conn_cfg[1].cid_count >> DQ_RANGE_SHIFT);
163811e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_1_RT_OFFSET, dq_pf_max_cid);
163911e25f0dSDavid C Somayajulu 
164011e25f0dSDavid C Somayajulu 	dq_vf_max_cid += (p_mngr->conn_cfg[1].cids_per_vf >> DQ_RANGE_SHIFT);
164111e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_1_RT_OFFSET, dq_vf_max_cid);
164211e25f0dSDavid C Somayajulu 
164311e25f0dSDavid C Somayajulu 	dq_pf_max_cid += (p_mngr->conn_cfg[2].cid_count >> DQ_RANGE_SHIFT);
164411e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_2_RT_OFFSET, dq_pf_max_cid);
164511e25f0dSDavid C Somayajulu 
164611e25f0dSDavid C Somayajulu 	dq_vf_max_cid += (p_mngr->conn_cfg[2].cids_per_vf >> DQ_RANGE_SHIFT);
164711e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_2_RT_OFFSET, dq_vf_max_cid);
164811e25f0dSDavid C Somayajulu 
164911e25f0dSDavid C Somayajulu 	dq_pf_max_cid += (p_mngr->conn_cfg[3].cid_count >> DQ_RANGE_SHIFT);
165011e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_3_RT_OFFSET, dq_pf_max_cid);
165111e25f0dSDavid C Somayajulu 
165211e25f0dSDavid C Somayajulu 	dq_vf_max_cid += (p_mngr->conn_cfg[3].cids_per_vf >> DQ_RANGE_SHIFT);
165311e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_3_RT_OFFSET, dq_vf_max_cid);
165411e25f0dSDavid C Somayajulu 
165511e25f0dSDavid C Somayajulu 	dq_pf_max_cid += (p_mngr->conn_cfg[4].cid_count >> DQ_RANGE_SHIFT);
165611e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_4_RT_OFFSET, dq_pf_max_cid);
165711e25f0dSDavid C Somayajulu 
165811e25f0dSDavid C Somayajulu 	dq_vf_max_cid += (p_mngr->conn_cfg[4].cids_per_vf >> DQ_RANGE_SHIFT);
165911e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_4_RT_OFFSET, dq_vf_max_cid);
166011e25f0dSDavid C Somayajulu 
166111e25f0dSDavid C Somayajulu 	dq_pf_max_cid += (p_mngr->conn_cfg[5].cid_count >> DQ_RANGE_SHIFT);
166211e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_5_RT_OFFSET, dq_pf_max_cid);
166311e25f0dSDavid C Somayajulu 
166411e25f0dSDavid C Somayajulu 	dq_vf_max_cid += (p_mngr->conn_cfg[5].cids_per_vf >> DQ_RANGE_SHIFT);
166511e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_5_RT_OFFSET, dq_vf_max_cid);
166611e25f0dSDavid C Somayajulu 
166711e25f0dSDavid C Somayajulu 	/* Connection types 6 & 7 are not in use, yet they must be configured
166811e25f0dSDavid C Somayajulu 	 * as the highest possible connection. Not configuring them means the
166911e25f0dSDavid C Somayajulu 	 * defaults will be  used, and with a large number of cids a bug may
167011e25f0dSDavid C Somayajulu 	 * occur, if the defaults will be smaller than dq_pf_max_cid /
167111e25f0dSDavid C Somayajulu 	 * dq_vf_max_cid.
167211e25f0dSDavid C Somayajulu 	 */
167311e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_6_RT_OFFSET, dq_pf_max_cid);
167411e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_6_RT_OFFSET, dq_vf_max_cid);
167511e25f0dSDavid C Somayajulu 
167611e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_PF_MAX_ICID_7_RT_OFFSET, dq_pf_max_cid);
167711e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, DORQ_REG_VF_MAX_ICID_7_RT_OFFSET, dq_vf_max_cid);
167811e25f0dSDavid C Somayajulu }
167911e25f0dSDavid C Somayajulu 
ecore_ilt_bounds_init(struct ecore_hwfn * p_hwfn)168011e25f0dSDavid C Somayajulu static void ecore_ilt_bounds_init(struct ecore_hwfn *p_hwfn)
168111e25f0dSDavid C Somayajulu {
168211e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *ilt_clients;
168311e25f0dSDavid C Somayajulu 	int i;
168411e25f0dSDavid C Somayajulu 
168511e25f0dSDavid C Somayajulu 	ilt_clients = p_hwfn->p_cxt_mngr->clients;
168611e25f0dSDavid C Somayajulu 	for_each_ilt_valid_client(i, ilt_clients) {
168711e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
168811e25f0dSDavid C Somayajulu 			     ilt_clients[i].first.reg,
168911e25f0dSDavid C Somayajulu 			     ilt_clients[i].first.val);
169011e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
169111e25f0dSDavid C Somayajulu 			     ilt_clients[i].last.reg,
169211e25f0dSDavid C Somayajulu 			     ilt_clients[i].last.val);
169311e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
169411e25f0dSDavid C Somayajulu 			     ilt_clients[i].p_size.reg,
169511e25f0dSDavid C Somayajulu 			     ilt_clients[i].p_size.val);
169611e25f0dSDavid C Somayajulu 	}
169711e25f0dSDavid C Somayajulu }
169811e25f0dSDavid C Somayajulu 
ecore_ilt_vf_bounds_init(struct ecore_hwfn * p_hwfn)169911e25f0dSDavid C Somayajulu static void ecore_ilt_vf_bounds_init(struct ecore_hwfn *p_hwfn)
170011e25f0dSDavid C Somayajulu {
170111e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *p_cli;
170211e25f0dSDavid C Somayajulu 	u32 blk_factor;
170311e25f0dSDavid C Somayajulu 
170411e25f0dSDavid C Somayajulu 	/* For simplicty  we set the 'block' to be an ILT page */
170511e25f0dSDavid C Somayajulu 	if (p_hwfn->p_dev->p_iov_info) {
170611e25f0dSDavid C Somayajulu 		struct ecore_hw_sriov_info *p_iov = p_hwfn->p_dev->p_iov_info;
170711e25f0dSDavid C Somayajulu 
170811e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
170911e25f0dSDavid C Somayajulu 			     PSWRQ2_REG_VF_BASE_RT_OFFSET,
171011e25f0dSDavid C Somayajulu 			     p_iov->first_vf_in_pf);
171111e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
171211e25f0dSDavid C Somayajulu 			     PSWRQ2_REG_VF_LAST_ILT_RT_OFFSET,
171311e25f0dSDavid C Somayajulu 			     p_iov->first_vf_in_pf + p_iov->total_vfs);
171411e25f0dSDavid C Somayajulu 	}
171511e25f0dSDavid C Somayajulu 
171611e25f0dSDavid C Somayajulu 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC];
171711e25f0dSDavid C Somayajulu 	blk_factor = OSAL_LOG2(ILT_PAGE_IN_BYTES(p_cli->p_size.val) >> 10);
171811e25f0dSDavid C Somayajulu 	if (p_cli->active) {
171911e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
172011e25f0dSDavid C Somayajulu 			     PSWRQ2_REG_CDUC_BLOCKS_FACTOR_RT_OFFSET,
172111e25f0dSDavid C Somayajulu 			     blk_factor);
172211e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
172311e25f0dSDavid C Somayajulu 			     PSWRQ2_REG_CDUC_NUMBER_OF_PF_BLOCKS_RT_OFFSET,
172411e25f0dSDavid C Somayajulu 			     p_cli->pf_total_lines);
172511e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
172611e25f0dSDavid C Somayajulu 			     PSWRQ2_REG_CDUC_VF_BLOCKS_RT_OFFSET,
172711e25f0dSDavid C Somayajulu 			     p_cli->vf_total_lines);
172811e25f0dSDavid C Somayajulu 	}
172911e25f0dSDavid C Somayajulu 
173011e25f0dSDavid C Somayajulu 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
173111e25f0dSDavid C Somayajulu 	blk_factor = OSAL_LOG2(ILT_PAGE_IN_BYTES(p_cli->p_size.val) >> 10);
173211e25f0dSDavid C Somayajulu 	if (p_cli->active) {
173311e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
173411e25f0dSDavid C Somayajulu 			     PSWRQ2_REG_CDUT_BLOCKS_FACTOR_RT_OFFSET,
173511e25f0dSDavid C Somayajulu 			     blk_factor);
173611e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
173711e25f0dSDavid C Somayajulu 			     PSWRQ2_REG_CDUT_NUMBER_OF_PF_BLOCKS_RT_OFFSET,
173811e25f0dSDavid C Somayajulu 			     p_cli->pf_total_lines);
173911e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
174011e25f0dSDavid C Somayajulu 			     PSWRQ2_REG_CDUT_VF_BLOCKS_RT_OFFSET,
174111e25f0dSDavid C Somayajulu 			     p_cli->vf_total_lines);
174211e25f0dSDavid C Somayajulu 	}
174311e25f0dSDavid C Somayajulu 
174411e25f0dSDavid C Somayajulu 	p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_TM];
174511e25f0dSDavid C Somayajulu 	blk_factor = OSAL_LOG2(ILT_PAGE_IN_BYTES(p_cli->p_size.val) >> 10);
174611e25f0dSDavid C Somayajulu 	if (p_cli->active) {
174711e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
174811e25f0dSDavid C Somayajulu 			     PSWRQ2_REG_TM_BLOCKS_FACTOR_RT_OFFSET,
174911e25f0dSDavid C Somayajulu 			     blk_factor);
175011e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
175111e25f0dSDavid C Somayajulu 			     PSWRQ2_REG_TM_NUMBER_OF_PF_BLOCKS_RT_OFFSET,
175211e25f0dSDavid C Somayajulu 			     p_cli->pf_total_lines);
175311e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn,
175411e25f0dSDavid C Somayajulu 			     PSWRQ2_REG_TM_VF_BLOCKS_RT_OFFSET,
175511e25f0dSDavid C Somayajulu 			     p_cli->vf_total_lines);
175611e25f0dSDavid C Somayajulu 	}
175711e25f0dSDavid C Somayajulu }
175811e25f0dSDavid C Somayajulu 
175911e25f0dSDavid C Somayajulu /* ILT (PSWRQ2) PF */
ecore_ilt_init_pf(struct ecore_hwfn * p_hwfn)176011e25f0dSDavid C Somayajulu static void ecore_ilt_init_pf(struct ecore_hwfn *p_hwfn)
176111e25f0dSDavid C Somayajulu {
176211e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *clients;
176311e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr;
176411e25f0dSDavid C Somayajulu 	struct ecore_dma_mem *p_shdw;
176511e25f0dSDavid C Somayajulu 	u32 line, rt_offst, i;
176611e25f0dSDavid C Somayajulu 
176711e25f0dSDavid C Somayajulu 	ecore_ilt_bounds_init(p_hwfn);
176811e25f0dSDavid C Somayajulu 	ecore_ilt_vf_bounds_init(p_hwfn);
176911e25f0dSDavid C Somayajulu 
177011e25f0dSDavid C Somayajulu 	p_mngr  = p_hwfn->p_cxt_mngr;
177111e25f0dSDavid C Somayajulu 	p_shdw  = p_mngr->ilt_shadow;
177211e25f0dSDavid C Somayajulu 	clients = p_hwfn->p_cxt_mngr->clients;
177311e25f0dSDavid C Somayajulu 
177411e25f0dSDavid C Somayajulu 	for_each_ilt_valid_client(i, clients) {
177511e25f0dSDavid C Somayajulu 		/* Client's 1st val and RT array are absolute, ILT shadows'
177611e25f0dSDavid C Somayajulu 		 * lines are relative.
177711e25f0dSDavid C Somayajulu 		 */
177811e25f0dSDavid C Somayajulu 		line = clients[i].first.val - p_mngr->pf_start_line;
177911e25f0dSDavid C Somayajulu 		rt_offst = PSWRQ2_REG_ILT_MEMORY_RT_OFFSET +
178011e25f0dSDavid C Somayajulu 			   clients[i].first.val * ILT_ENTRY_IN_REGS;
178111e25f0dSDavid C Somayajulu 
178211e25f0dSDavid C Somayajulu 		for (; line <= clients[i].last.val - p_mngr->pf_start_line;
178311e25f0dSDavid C Somayajulu 		     line++, rt_offst += ILT_ENTRY_IN_REGS) {
178411e25f0dSDavid C Somayajulu 			u64 ilt_hw_entry = 0;
178511e25f0dSDavid C Somayajulu 
178611e25f0dSDavid C Somayajulu 			/** p_virt could be OSAL_NULL incase of dynamic
178711e25f0dSDavid C Somayajulu 			 *  allocation
178811e25f0dSDavid C Somayajulu 			 */
178911e25f0dSDavid C Somayajulu 			if (p_shdw[line].p_virt != OSAL_NULL) {
179011e25f0dSDavid C Somayajulu 				SET_FIELD(ilt_hw_entry, ILT_ENTRY_VALID, 1ULL);
179111e25f0dSDavid C Somayajulu 				SET_FIELD(ilt_hw_entry, ILT_ENTRY_PHY_ADDR,
17929efd0ba7SDavid C Somayajulu 					  (unsigned long long)(p_shdw[line].p_phys >> 12));
179311e25f0dSDavid C Somayajulu 
179411e25f0dSDavid C Somayajulu 				DP_VERBOSE(
179511e25f0dSDavid C Somayajulu 					p_hwfn, ECORE_MSG_ILT,
179611e25f0dSDavid C Somayajulu 					"Setting RT[0x%08x] from ILT[0x%08x] [Client is %d] to Physical addr: 0x%llx\n",
179711e25f0dSDavid C Somayajulu 					rt_offst, line, i,
179811e25f0dSDavid C Somayajulu 					(unsigned long long)(p_shdw[line].p_phys >> 12));
179911e25f0dSDavid C Somayajulu 			}
180011e25f0dSDavid C Somayajulu 
180111e25f0dSDavid C Somayajulu 			STORE_RT_REG_AGG(p_hwfn, rt_offst, ilt_hw_entry);
180211e25f0dSDavid C Somayajulu 		}
180311e25f0dSDavid C Somayajulu 	}
180411e25f0dSDavid C Somayajulu }
180511e25f0dSDavid C Somayajulu 
180611e25f0dSDavid C Somayajulu /* SRC (Searcher) PF */
ecore_src_init_pf(struct ecore_hwfn * p_hwfn)180711e25f0dSDavid C Somayajulu static void ecore_src_init_pf(struct ecore_hwfn *p_hwfn)
180811e25f0dSDavid C Somayajulu {
180911e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
181011e25f0dSDavid C Somayajulu 	u32 rounded_conn_num, conn_num, conn_max;
181111e25f0dSDavid C Somayajulu 	struct ecore_src_iids src_iids;
181211e25f0dSDavid C Somayajulu 
181311e25f0dSDavid C Somayajulu 	OSAL_MEM_ZERO(&src_iids, sizeof(src_iids));
18149efd0ba7SDavid C Somayajulu 	ecore_cxt_src_iids(p_mngr, &src_iids);
181511e25f0dSDavid C Somayajulu 	conn_num = src_iids.pf_cids + src_iids.per_vf_cids * p_mngr->vf_count;
181611e25f0dSDavid C Somayajulu 	if (!conn_num)
181711e25f0dSDavid C Somayajulu 		return;
181811e25f0dSDavid C Somayajulu 
181911e25f0dSDavid C Somayajulu 	conn_max = OSAL_MAX_T(u32, conn_num, SRC_MIN_NUM_ELEMS);
182011e25f0dSDavid C Somayajulu 	rounded_conn_num = OSAL_ROUNDUP_POW_OF_TWO(conn_max);
182111e25f0dSDavid C Somayajulu 
182211e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, SRC_REG_COUNTFREE_RT_OFFSET, conn_num);
182311e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, SRC_REG_NUMBER_HASH_BITS_RT_OFFSET,
182411e25f0dSDavid C Somayajulu 		     OSAL_LOG2(rounded_conn_num));
182511e25f0dSDavid C Somayajulu 
182611e25f0dSDavid C Somayajulu 	STORE_RT_REG_AGG(p_hwfn, SRC_REG_FIRSTFREE_RT_OFFSET,
182711e25f0dSDavid C Somayajulu 			 p_hwfn->p_cxt_mngr->first_free);
182811e25f0dSDavid C Somayajulu 	STORE_RT_REG_AGG(p_hwfn, SRC_REG_LASTFREE_RT_OFFSET,
182911e25f0dSDavid C Somayajulu 			 p_hwfn->p_cxt_mngr->last_free);
183011e25f0dSDavid C Somayajulu 	DP_VERBOSE(p_hwfn, ECORE_MSG_ILT,
183111e25f0dSDavid C Somayajulu 		   "Configured SEARCHER for 0x%08x connections\n",
183211e25f0dSDavid C Somayajulu 		   conn_num);
183311e25f0dSDavid C Somayajulu }
183411e25f0dSDavid C Somayajulu 
183511e25f0dSDavid C Somayajulu /* Timers PF */
183611e25f0dSDavid C Somayajulu #define TM_CFG_NUM_IDS_SHIFT		0
183711e25f0dSDavid C Somayajulu #define TM_CFG_NUM_IDS_MASK		0xFFFFULL
183811e25f0dSDavid C Somayajulu #define TM_CFG_PRE_SCAN_OFFSET_SHIFT	16
183911e25f0dSDavid C Somayajulu #define TM_CFG_PRE_SCAN_OFFSET_MASK	0x1FFULL
184011e25f0dSDavid C Somayajulu #define TM_CFG_PARENT_PF_SHIFT		25
184111e25f0dSDavid C Somayajulu #define TM_CFG_PARENT_PF_MASK		0x7ULL
184211e25f0dSDavid C Somayajulu 
184311e25f0dSDavid C Somayajulu #define TM_CFG_CID_PRE_SCAN_ROWS_SHIFT	30
184411e25f0dSDavid C Somayajulu #define TM_CFG_CID_PRE_SCAN_ROWS_MASK	0x1FFULL
184511e25f0dSDavid C Somayajulu 
184611e25f0dSDavid C Somayajulu #define TM_CFG_TID_OFFSET_SHIFT		30
184711e25f0dSDavid C Somayajulu #define TM_CFG_TID_OFFSET_MASK		0x7FFFFULL
184811e25f0dSDavid C Somayajulu #define TM_CFG_TID_PRE_SCAN_ROWS_SHIFT	49
184911e25f0dSDavid C Somayajulu #define TM_CFG_TID_PRE_SCAN_ROWS_MASK	0x1FFULL
185011e25f0dSDavid C Somayajulu 
ecore_tm_init_pf(struct ecore_hwfn * p_hwfn)185111e25f0dSDavid C Somayajulu static void ecore_tm_init_pf(struct ecore_hwfn *p_hwfn)
185211e25f0dSDavid C Somayajulu {
185311e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
185411e25f0dSDavid C Somayajulu 	u32 active_seg_mask = 0, tm_offset, rt_reg;
185511e25f0dSDavid C Somayajulu 	struct ecore_tm_iids tm_iids;
185611e25f0dSDavid C Somayajulu 	u64 cfg_word;
185711e25f0dSDavid C Somayajulu 	u8 i;
185811e25f0dSDavid C Somayajulu 
185911e25f0dSDavid C Somayajulu 	OSAL_MEM_ZERO(&tm_iids, sizeof(tm_iids));
18609efd0ba7SDavid C Somayajulu 	ecore_cxt_tm_iids(p_mngr, &tm_iids);
186111e25f0dSDavid C Somayajulu 
186211e25f0dSDavid C Somayajulu 	/* @@@TBD No pre-scan for now */
186311e25f0dSDavid C Somayajulu 
186411e25f0dSDavid C Somayajulu 	/* Note: We assume consecutive VFs for a PF */
186511e25f0dSDavid C Somayajulu 	for (i = 0; i < p_mngr->vf_count; i++) {
186611e25f0dSDavid C Somayajulu 		cfg_word = 0;
186711e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_NUM_IDS, tm_iids.per_vf_cids);
186811e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_PRE_SCAN_OFFSET, 0);
186911e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_PARENT_PF, p_hwfn->rel_pf_id);
187011e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_CID_PRE_SCAN_ROWS, 0); /* scan all */
187111e25f0dSDavid C Somayajulu 
187211e25f0dSDavid C Somayajulu 		rt_reg = TM_REG_CONFIG_CONN_MEM_RT_OFFSET +
187311e25f0dSDavid C Somayajulu 			 (sizeof(cfg_word) / sizeof(u32)) *
187411e25f0dSDavid C Somayajulu 			 (p_hwfn->p_dev->p_iov_info->first_vf_in_pf + i);
187511e25f0dSDavid C Somayajulu 		STORE_RT_REG_AGG(p_hwfn, rt_reg, cfg_word);
187611e25f0dSDavid C Somayajulu 	}
187711e25f0dSDavid C Somayajulu 
187811e25f0dSDavid C Somayajulu 	cfg_word = 0;
187911e25f0dSDavid C Somayajulu 	SET_FIELD(cfg_word, TM_CFG_NUM_IDS, tm_iids.pf_cids);
188011e25f0dSDavid C Somayajulu 	SET_FIELD(cfg_word, TM_CFG_PRE_SCAN_OFFSET, 0);
188111e25f0dSDavid C Somayajulu 	SET_FIELD(cfg_word, TM_CFG_PARENT_PF, 0);	  /* n/a for PF */
188211e25f0dSDavid C Somayajulu 	SET_FIELD(cfg_word, TM_CFG_CID_PRE_SCAN_ROWS, 0); /* scan all   */
188311e25f0dSDavid C Somayajulu 
188411e25f0dSDavid C Somayajulu 	rt_reg = TM_REG_CONFIG_CONN_MEM_RT_OFFSET +
188511e25f0dSDavid C Somayajulu 		 (sizeof(cfg_word) / sizeof(u32)) *
188611e25f0dSDavid C Somayajulu 		 (NUM_OF_VFS(p_hwfn->p_dev) + p_hwfn->rel_pf_id);
188711e25f0dSDavid C Somayajulu 	STORE_RT_REG_AGG(p_hwfn, rt_reg, cfg_word);
188811e25f0dSDavid C Somayajulu 
188911e25f0dSDavid C Somayajulu 	/* enale scan */
189011e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, TM_REG_PF_ENABLE_CONN_RT_OFFSET,
189111e25f0dSDavid C Somayajulu 		     tm_iids.pf_cids  ? 0x1 : 0x0);
189211e25f0dSDavid C Somayajulu 
189311e25f0dSDavid C Somayajulu 	/* @@@TBD how to enable the scan for the VFs */
189411e25f0dSDavid C Somayajulu 
189511e25f0dSDavid C Somayajulu 	tm_offset = tm_iids.per_vf_cids;
189611e25f0dSDavid C Somayajulu 
189711e25f0dSDavid C Somayajulu 	/* Note: We assume consecutive VFs for a PF */
189811e25f0dSDavid C Somayajulu 	for (i = 0; i < p_mngr->vf_count; i++) {
189911e25f0dSDavid C Somayajulu 		cfg_word = 0;
190011e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_NUM_IDS, tm_iids.per_vf_tids);
190111e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_PRE_SCAN_OFFSET, 0);
190211e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_PARENT_PF, p_hwfn->rel_pf_id);
190311e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_TID_OFFSET, tm_offset);
190411e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_TID_PRE_SCAN_ROWS, (u64)0);
190511e25f0dSDavid C Somayajulu 
190611e25f0dSDavid C Somayajulu 		rt_reg = TM_REG_CONFIG_TASK_MEM_RT_OFFSET +
190711e25f0dSDavid C Somayajulu 			 (sizeof(cfg_word) / sizeof(u32)) *
190811e25f0dSDavid C Somayajulu 			 (p_hwfn->p_dev->p_iov_info->first_vf_in_pf + i);
190911e25f0dSDavid C Somayajulu 
191011e25f0dSDavid C Somayajulu 		STORE_RT_REG_AGG(p_hwfn, rt_reg, cfg_word);
191111e25f0dSDavid C Somayajulu 	}
191211e25f0dSDavid C Somayajulu 
191311e25f0dSDavid C Somayajulu 	tm_offset = tm_iids.pf_cids;
191411e25f0dSDavid C Somayajulu 	for (i = 0; i < NUM_TASK_PF_SEGMENTS; i++) {
191511e25f0dSDavid C Somayajulu 		cfg_word = 0;
191611e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_NUM_IDS, tm_iids.pf_tids[i]);
191711e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_PRE_SCAN_OFFSET, 0);
191811e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_PARENT_PF, 0);
191911e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_TID_OFFSET, tm_offset);
192011e25f0dSDavid C Somayajulu 		SET_FIELD(cfg_word, TM_CFG_TID_PRE_SCAN_ROWS, (u64)0);
192111e25f0dSDavid C Somayajulu 
192211e25f0dSDavid C Somayajulu 		rt_reg = TM_REG_CONFIG_TASK_MEM_RT_OFFSET +
192311e25f0dSDavid C Somayajulu 			 (sizeof(cfg_word) / sizeof(u32)) *
192411e25f0dSDavid C Somayajulu 			 (NUM_OF_VFS(p_hwfn->p_dev) +
192511e25f0dSDavid C Somayajulu 			 p_hwfn->rel_pf_id * NUM_TASK_PF_SEGMENTS + i);
192611e25f0dSDavid C Somayajulu 
192711e25f0dSDavid C Somayajulu 		STORE_RT_REG_AGG(p_hwfn, rt_reg, cfg_word);
192811e25f0dSDavid C Somayajulu 		active_seg_mask |= (tm_iids.pf_tids[i] ? (1 << i) : 0);
192911e25f0dSDavid C Somayajulu 
193011e25f0dSDavid C Somayajulu 		tm_offset += tm_iids.pf_tids[i];
193111e25f0dSDavid C Somayajulu 	}
193211e25f0dSDavid C Somayajulu 
193311e25f0dSDavid C Somayajulu 	if (ECORE_IS_RDMA_PERSONALITY(p_hwfn))
193411e25f0dSDavid C Somayajulu 		active_seg_mask = 0;
193511e25f0dSDavid C Somayajulu 
193611e25f0dSDavid C Somayajulu 	STORE_RT_REG(p_hwfn, TM_REG_PF_ENABLE_TASK_RT_OFFSET, active_seg_mask);
193711e25f0dSDavid C Somayajulu 
193811e25f0dSDavid C Somayajulu 	/* @@@TBD how to enable the scan for the VFs */
193911e25f0dSDavid C Somayajulu }
194011e25f0dSDavid C Somayajulu 
ecore_prs_init_common(struct ecore_hwfn * p_hwfn)194111e25f0dSDavid C Somayajulu static void ecore_prs_init_common(struct ecore_hwfn *p_hwfn)
194211e25f0dSDavid C Somayajulu {
194311e25f0dSDavid C Somayajulu 	if ((p_hwfn->hw_info.personality == ECORE_PCI_FCOE) &&
194411e25f0dSDavid C Somayajulu 	    p_hwfn->pf_params.fcoe_pf_params.is_target)
194511e25f0dSDavid C Somayajulu 		STORE_RT_REG(p_hwfn, PRS_REG_SEARCH_RESP_INITIATOR_TYPE_RT_OFFSET, 0);
194611e25f0dSDavid C Somayajulu }
194711e25f0dSDavid C Somayajulu 
ecore_prs_init_pf(struct ecore_hwfn * p_hwfn)194811e25f0dSDavid C Somayajulu static void ecore_prs_init_pf(struct ecore_hwfn *p_hwfn)
194911e25f0dSDavid C Somayajulu {
195011e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
19519efd0ba7SDavid C Somayajulu 	struct ecore_conn_type_cfg *p_fcoe;
195211e25f0dSDavid C Somayajulu 	struct ecore_tid_seg *p_tid;
195311e25f0dSDavid C Somayajulu 
19549efd0ba7SDavid C Somayajulu 	p_fcoe = &p_mngr->conn_cfg[PROTOCOLID_FCOE];
19559efd0ba7SDavid C Somayajulu 
195611e25f0dSDavid C Somayajulu 	/* If FCoE is active set the MAX OX_ID (tid) in the Parser */
195711e25f0dSDavid C Somayajulu 	if (!p_fcoe->cid_count)
195811e25f0dSDavid C Somayajulu 		return;
195911e25f0dSDavid C Somayajulu 
196011e25f0dSDavid C Somayajulu 	p_tid = &p_fcoe->tid_seg[ECORE_CXT_FCOE_TID_SEG];
196111e25f0dSDavid C Somayajulu 	if (p_hwfn->pf_params.fcoe_pf_params.is_target) {
196211e25f0dSDavid C Somayajulu 		STORE_RT_REG_AGG(p_hwfn,
196311e25f0dSDavid C Somayajulu 				 PRS_REG_TASK_ID_MAX_TARGET_PF_RT_OFFSET,
196411e25f0dSDavid C Somayajulu 				 p_tid->count);
196511e25f0dSDavid C Somayajulu 	} else {
196611e25f0dSDavid C Somayajulu 		STORE_RT_REG_AGG(p_hwfn,
196711e25f0dSDavid C Somayajulu 				PRS_REG_TASK_ID_MAX_INITIATOR_PF_RT_OFFSET,
196811e25f0dSDavid C Somayajulu 				p_tid->count);
196911e25f0dSDavid C Somayajulu 	}
197011e25f0dSDavid C Somayajulu }
197111e25f0dSDavid C Somayajulu 
ecore_cxt_hw_init_common(struct ecore_hwfn * p_hwfn)197211e25f0dSDavid C Somayajulu void ecore_cxt_hw_init_common(struct ecore_hwfn *p_hwfn)
197311e25f0dSDavid C Somayajulu {
197411e25f0dSDavid C Somayajulu 	/* CDU configuration */
197511e25f0dSDavid C Somayajulu 	ecore_cdu_init_common(p_hwfn);
197611e25f0dSDavid C Somayajulu 	ecore_prs_init_common(p_hwfn);
197711e25f0dSDavid C Somayajulu }
197811e25f0dSDavid C Somayajulu 
ecore_cxt_hw_init_pf(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt)19799efd0ba7SDavid C Somayajulu void ecore_cxt_hw_init_pf(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt)
198011e25f0dSDavid C Somayajulu {
1981217ec208SDavid C Somayajulu 	ecore_qm_init_pf(p_hwfn, p_ptt, true);
198211e25f0dSDavid C Somayajulu 	ecore_cm_init_pf(p_hwfn);
198311e25f0dSDavid C Somayajulu 	ecore_dq_init_pf(p_hwfn);
198411e25f0dSDavid C Somayajulu 	ecore_cdu_init_pf(p_hwfn);
198511e25f0dSDavid C Somayajulu 	ecore_ilt_init_pf(p_hwfn);
198611e25f0dSDavid C Somayajulu 	ecore_src_init_pf(p_hwfn);
198711e25f0dSDavid C Somayajulu 	ecore_tm_init_pf(p_hwfn);
198811e25f0dSDavid C Somayajulu 	ecore_prs_init_pf(p_hwfn);
198911e25f0dSDavid C Somayajulu }
199011e25f0dSDavid C Somayajulu 
_ecore_cxt_acquire_cid(struct ecore_hwfn * p_hwfn,enum protocol_type type,u32 * p_cid,u8 vfid)199111e25f0dSDavid C Somayajulu enum _ecore_status_t _ecore_cxt_acquire_cid(struct ecore_hwfn *p_hwfn,
199211e25f0dSDavid C Somayajulu 					    enum protocol_type type,
199311e25f0dSDavid C Somayajulu 					    u32 *p_cid, u8 vfid)
199411e25f0dSDavid C Somayajulu {
199511e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
199611e25f0dSDavid C Somayajulu 	struct ecore_cid_acquired_map *p_map;
199711e25f0dSDavid C Somayajulu 	u32 rel_cid;
199811e25f0dSDavid C Somayajulu 
199911e25f0dSDavid C Somayajulu 	if (type >= MAX_CONN_TYPES) {
200011e25f0dSDavid C Somayajulu 		DP_NOTICE(p_hwfn, true, "Invalid protocol type %d", type);
200111e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
200211e25f0dSDavid C Somayajulu 	}
200311e25f0dSDavid C Somayajulu 
200411e25f0dSDavid C Somayajulu 	if (vfid >= COMMON_MAX_NUM_VFS && vfid != ECORE_CXT_PF_CID) {
200511e25f0dSDavid C Somayajulu 		DP_NOTICE(p_hwfn, true, "VF [%02x] is out of range\n", vfid);
200611e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
200711e25f0dSDavid C Somayajulu 	}
200811e25f0dSDavid C Somayajulu 
200911e25f0dSDavid C Somayajulu 	/* Determine the right map to take this CID from */
201011e25f0dSDavid C Somayajulu 	if (vfid == ECORE_CXT_PF_CID)
201111e25f0dSDavid C Somayajulu 		p_map = &p_mngr->acquired[type];
201211e25f0dSDavid C Somayajulu 	else
201311e25f0dSDavid C Somayajulu 		p_map = &p_mngr->acquired_vf[type][vfid];
201411e25f0dSDavid C Somayajulu 
201511e25f0dSDavid C Somayajulu 	if (p_map->cid_map == OSAL_NULL) {
201611e25f0dSDavid C Somayajulu 		DP_NOTICE(p_hwfn, true, "Invalid protocol type %d", type);
201711e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
201811e25f0dSDavid C Somayajulu 	}
201911e25f0dSDavid C Somayajulu 
202011e25f0dSDavid C Somayajulu 	rel_cid = OSAL_FIND_FIRST_ZERO_BIT(p_map->cid_map,
202111e25f0dSDavid C Somayajulu 					   p_map->max_count);
202211e25f0dSDavid C Somayajulu 
202311e25f0dSDavid C Somayajulu 	if (rel_cid >= p_map->max_count) {
202411e25f0dSDavid C Somayajulu 		DP_NOTICE(p_hwfn, false, "no CID available for protocol %d\n",
202511e25f0dSDavid C Somayajulu 			  type);
202611e25f0dSDavid C Somayajulu 		return ECORE_NORESOURCES;
202711e25f0dSDavid C Somayajulu 	}
202811e25f0dSDavid C Somayajulu 
202911e25f0dSDavid C Somayajulu 	OSAL_SET_BIT(rel_cid, p_map->cid_map);
203011e25f0dSDavid C Somayajulu 
203111e25f0dSDavid C Somayajulu 	*p_cid = rel_cid + p_map->start_cid;
203211e25f0dSDavid C Somayajulu 
203311e25f0dSDavid C Somayajulu 	DP_VERBOSE(p_hwfn, ECORE_MSG_CXT,
203411e25f0dSDavid C Somayajulu 		   "Acquired cid 0x%08x [rel. %08x] vfid %02x type %d\n",
203511e25f0dSDavid C Somayajulu 		   *p_cid, rel_cid, vfid, type);
203611e25f0dSDavid C Somayajulu 
203711e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
203811e25f0dSDavid C Somayajulu }
203911e25f0dSDavid C Somayajulu 
ecore_cxt_acquire_cid(struct ecore_hwfn * p_hwfn,enum protocol_type type,u32 * p_cid)204011e25f0dSDavid C Somayajulu enum _ecore_status_t ecore_cxt_acquire_cid(struct ecore_hwfn *p_hwfn,
204111e25f0dSDavid C Somayajulu 					   enum protocol_type type,
204211e25f0dSDavid C Somayajulu 					   u32 *p_cid)
204311e25f0dSDavid C Somayajulu {
204411e25f0dSDavid C Somayajulu 	return _ecore_cxt_acquire_cid(p_hwfn, type, p_cid, ECORE_CXT_PF_CID);
204511e25f0dSDavid C Somayajulu }
204611e25f0dSDavid C Somayajulu 
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)204711e25f0dSDavid C Somayajulu static bool ecore_cxt_test_cid_acquired(struct ecore_hwfn *p_hwfn,
204811e25f0dSDavid C Somayajulu 					u32 cid, u8 vfid,
204911e25f0dSDavid C Somayajulu 					enum protocol_type *p_type,
205011e25f0dSDavid C Somayajulu 					struct ecore_cid_acquired_map **pp_map)
205111e25f0dSDavid C Somayajulu {
205211e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
205311e25f0dSDavid C Somayajulu 	u32 rel_cid;
205411e25f0dSDavid C Somayajulu 
205511e25f0dSDavid C Somayajulu 	/* Iterate over protocols and find matching cid range */
205611e25f0dSDavid C Somayajulu 	for (*p_type = 0; *p_type < MAX_CONN_TYPES; (*p_type)++) {
205711e25f0dSDavid C Somayajulu 		if (vfid == ECORE_CXT_PF_CID)
205811e25f0dSDavid C Somayajulu 			*pp_map = &p_mngr->acquired[*p_type];
205911e25f0dSDavid C Somayajulu 		else
206011e25f0dSDavid C Somayajulu 			*pp_map = &p_mngr->acquired_vf[*p_type][vfid];
206111e25f0dSDavid C Somayajulu 
206211e25f0dSDavid C Somayajulu 		if (!((*pp_map)->cid_map))
206311e25f0dSDavid C Somayajulu 			continue;
206411e25f0dSDavid C Somayajulu 		if (cid >= (*pp_map)->start_cid &&
206511e25f0dSDavid C Somayajulu 		    cid < (*pp_map)->start_cid + (*pp_map)->max_count) {
206611e25f0dSDavid C Somayajulu 			break;
206711e25f0dSDavid C Somayajulu 		}
206811e25f0dSDavid C Somayajulu 	}
206911e25f0dSDavid C Somayajulu 
207011e25f0dSDavid C Somayajulu 	if (*p_type == MAX_CONN_TYPES) {
207111e25f0dSDavid C Somayajulu 		DP_NOTICE(p_hwfn, true, "Invalid CID %d vfid %02x", cid, vfid);
207211e25f0dSDavid C Somayajulu 		goto fail;
207311e25f0dSDavid C Somayajulu 	}
207411e25f0dSDavid C Somayajulu 
207511e25f0dSDavid C Somayajulu 	rel_cid = cid - (*pp_map)->start_cid;
207611e25f0dSDavid C Somayajulu 	if (!OSAL_TEST_BIT(rel_cid, (*pp_map)->cid_map)) {
207711e25f0dSDavid C Somayajulu 		DP_NOTICE(p_hwfn, true,
207811e25f0dSDavid C Somayajulu 			  "CID %d [vifd %02x] not acquired", cid, vfid);
207911e25f0dSDavid C Somayajulu 		goto fail;
208011e25f0dSDavid C Somayajulu 	}
208111e25f0dSDavid C Somayajulu 
208211e25f0dSDavid C Somayajulu 	return true;
208311e25f0dSDavid C Somayajulu fail:
208411e25f0dSDavid C Somayajulu 	*p_type = MAX_CONN_TYPES;
208511e25f0dSDavid C Somayajulu 	*pp_map = OSAL_NULL;
208611e25f0dSDavid C Somayajulu 	return false;
208711e25f0dSDavid C Somayajulu }
208811e25f0dSDavid C Somayajulu 
_ecore_cxt_release_cid(struct ecore_hwfn * p_hwfn,u32 cid,u8 vfid)208911e25f0dSDavid C Somayajulu void _ecore_cxt_release_cid(struct ecore_hwfn *p_hwfn, u32 cid, u8 vfid)
209011e25f0dSDavid C Somayajulu {
209111e25f0dSDavid C Somayajulu 	struct ecore_cid_acquired_map *p_map = OSAL_NULL;
209211e25f0dSDavid C Somayajulu 	enum protocol_type type;
209311e25f0dSDavid C Somayajulu 	bool b_acquired;
209411e25f0dSDavid C Somayajulu 	u32 rel_cid;
209511e25f0dSDavid C Somayajulu 
209611e25f0dSDavid C Somayajulu 	if (vfid != ECORE_CXT_PF_CID && vfid > COMMON_MAX_NUM_VFS) {
209711e25f0dSDavid C Somayajulu 		DP_NOTICE(p_hwfn, true,
209811e25f0dSDavid C Somayajulu 			  "Trying to return incorrect CID belonging to VF %02x\n",
209911e25f0dSDavid C Somayajulu 			  vfid);
210011e25f0dSDavid C Somayajulu 		return;
210111e25f0dSDavid C Somayajulu 	}
210211e25f0dSDavid C Somayajulu 
210311e25f0dSDavid C Somayajulu 	/* Test acquired and find matching per-protocol map */
210411e25f0dSDavid C Somayajulu 	b_acquired = ecore_cxt_test_cid_acquired(p_hwfn, cid, vfid,
210511e25f0dSDavid C Somayajulu 						 &type, &p_map);
210611e25f0dSDavid C Somayajulu 
210711e25f0dSDavid C Somayajulu 	if (!b_acquired)
210811e25f0dSDavid C Somayajulu 		return;
210911e25f0dSDavid C Somayajulu 
211011e25f0dSDavid C Somayajulu 	rel_cid = cid - p_map->start_cid;
211111e25f0dSDavid C Somayajulu 	OSAL_CLEAR_BIT(rel_cid, p_map->cid_map);
211211e25f0dSDavid C Somayajulu 
211311e25f0dSDavid C Somayajulu 	DP_VERBOSE(p_hwfn, ECORE_MSG_CXT,
211411e25f0dSDavid C Somayajulu 		   "Released CID 0x%08x [rel. %08x] vfid %02x type %d\n",
211511e25f0dSDavid C Somayajulu 		   cid, rel_cid, vfid, type);
211611e25f0dSDavid C Somayajulu }
211711e25f0dSDavid C Somayajulu 
ecore_cxt_release_cid(struct ecore_hwfn * p_hwfn,u32 cid)211811e25f0dSDavid C Somayajulu void ecore_cxt_release_cid(struct ecore_hwfn *p_hwfn, u32 cid)
211911e25f0dSDavid C Somayajulu {
212011e25f0dSDavid C Somayajulu 	_ecore_cxt_release_cid(p_hwfn, cid, ECORE_CXT_PF_CID);
212111e25f0dSDavid C Somayajulu }
212211e25f0dSDavid C Somayajulu 
ecore_cxt_get_cid_info(struct ecore_hwfn * p_hwfn,struct ecore_cxt_info * p_info)212311e25f0dSDavid C Somayajulu enum _ecore_status_t ecore_cxt_get_cid_info(struct ecore_hwfn *p_hwfn,
212411e25f0dSDavid C Somayajulu 					    struct ecore_cxt_info *p_info)
212511e25f0dSDavid C Somayajulu {
212611e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
212711e25f0dSDavid C Somayajulu 	struct ecore_cid_acquired_map *p_map = OSAL_NULL;
212811e25f0dSDavid C Somayajulu 	u32 conn_cxt_size, hw_p_size, cxts_per_p, line;
212911e25f0dSDavid C Somayajulu 	enum protocol_type type;
213011e25f0dSDavid C Somayajulu 	bool b_acquired;
213111e25f0dSDavid C Somayajulu 
213211e25f0dSDavid C Somayajulu 	/* Test acquired and find matching per-protocol map */
213311e25f0dSDavid C Somayajulu 	b_acquired = ecore_cxt_test_cid_acquired(p_hwfn, p_info->iid,
213411e25f0dSDavid C Somayajulu 						 ECORE_CXT_PF_CID,
213511e25f0dSDavid C Somayajulu 						 &type, &p_map);
213611e25f0dSDavid C Somayajulu 
213711e25f0dSDavid C Somayajulu 	if (!b_acquired)
213811e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
213911e25f0dSDavid C Somayajulu 
214011e25f0dSDavid C Somayajulu 	/* set the protocl type */
214111e25f0dSDavid C Somayajulu 	p_info->type = type;
214211e25f0dSDavid C Somayajulu 
214311e25f0dSDavid C Somayajulu 	/* compute context virtual pointer */
214411e25f0dSDavid C Somayajulu 	hw_p_size = p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC].p_size.val;
214511e25f0dSDavid C Somayajulu 
214611e25f0dSDavid C Somayajulu 	conn_cxt_size = CONN_CXT_SIZE(p_hwfn);
214711e25f0dSDavid C Somayajulu 	cxts_per_p = ILT_PAGE_IN_BYTES(hw_p_size) / conn_cxt_size;
214811e25f0dSDavid C Somayajulu 	line = p_info->iid / cxts_per_p;
214911e25f0dSDavid C Somayajulu 
215011e25f0dSDavid C Somayajulu 	/* Make sure context is allocated (dynamic allocation) */
215111e25f0dSDavid C Somayajulu 	if (!p_mngr->ilt_shadow[line].p_virt)
215211e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
215311e25f0dSDavid C Somayajulu 
215411e25f0dSDavid C Somayajulu 	p_info->p_cxt = (u8 *)p_mngr->ilt_shadow[line].p_virt +
215511e25f0dSDavid C Somayajulu 			      p_info->iid % cxts_per_p * conn_cxt_size;
215611e25f0dSDavid C Somayajulu 
215711e25f0dSDavid C Somayajulu 	DP_VERBOSE(p_hwfn, (ECORE_MSG_ILT | ECORE_MSG_CXT),
215811e25f0dSDavid C Somayajulu 		   "Accessing ILT shadow[%d]: CXT pointer is at %p (for iid %d)\n",
215911e25f0dSDavid C Somayajulu 		   (p_info->iid / cxts_per_p), p_info->p_cxt, p_info->iid);
216011e25f0dSDavid C Somayajulu 
216111e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
216211e25f0dSDavid C Somayajulu }
216311e25f0dSDavid C Somayajulu 
ecore_rdma_set_pf_params(struct ecore_hwfn * p_hwfn,struct ecore_rdma_pf_params * p_params,u32 num_tasks)216411e25f0dSDavid C Somayajulu static void ecore_rdma_set_pf_params(struct ecore_hwfn *p_hwfn,
216511e25f0dSDavid C Somayajulu 				     struct ecore_rdma_pf_params *p_params,
216611e25f0dSDavid C Somayajulu 				     u32 num_tasks)
216711e25f0dSDavid C Somayajulu {
2168217ec208SDavid C Somayajulu 	u32 num_cons, num_qps;
216911e25f0dSDavid C Somayajulu 	enum protocol_type proto;
217011e25f0dSDavid C Somayajulu 
21719efd0ba7SDavid C Somayajulu 	/* The only case RDMA personality can be overriden is if NVRAM is
217211e25f0dSDavid C Somayajulu 	 * configured with ETH_RDMA or if no rdma protocol was requested
217311e25f0dSDavid C Somayajulu 	 */
217411e25f0dSDavid C Somayajulu 	switch (p_params->rdma_protocol) {
217511e25f0dSDavid C Somayajulu 	case ECORE_RDMA_PROTOCOL_DEFAULT:
217611e25f0dSDavid C Somayajulu 		if (p_hwfn->mcp_info->func_info.protocol ==
217711e25f0dSDavid C Somayajulu 		    ECORE_PCI_ETH_RDMA) {
217811e25f0dSDavid C Somayajulu 			DP_NOTICE(p_hwfn, false,
217911e25f0dSDavid C Somayajulu 				  "Current day drivers don't support RoCE & iWARP. Default to RoCE-only\n");
218011e25f0dSDavid C Somayajulu 			p_hwfn->hw_info.personality = ECORE_PCI_ETH_ROCE;
218111e25f0dSDavid C Somayajulu 		}
218211e25f0dSDavid C Somayajulu 		break;
218311e25f0dSDavid C Somayajulu 	case ECORE_RDMA_PROTOCOL_NONE:
218411e25f0dSDavid C Somayajulu 		p_hwfn->hw_info.personality = ECORE_PCI_ETH;
218511e25f0dSDavid C Somayajulu 		return; /* intentional... nothing left to do... */
218611e25f0dSDavid C Somayajulu 	case ECORE_RDMA_PROTOCOL_ROCE:
218711e25f0dSDavid C Somayajulu 		if (p_hwfn->mcp_info->func_info.protocol == ECORE_PCI_ETH_RDMA)
218811e25f0dSDavid C Somayajulu 			p_hwfn->hw_info.personality = ECORE_PCI_ETH_ROCE;
218911e25f0dSDavid C Somayajulu 		break;
219011e25f0dSDavid C Somayajulu 	case ECORE_RDMA_PROTOCOL_IWARP:
219111e25f0dSDavid C Somayajulu 		if (p_hwfn->mcp_info->func_info.protocol == ECORE_PCI_ETH_RDMA)
219211e25f0dSDavid C Somayajulu 			p_hwfn->hw_info.personality = ECORE_PCI_ETH_IWARP;
219311e25f0dSDavid C Somayajulu 		break;
219411e25f0dSDavid C Somayajulu 	}
219511e25f0dSDavid C Somayajulu 
219611e25f0dSDavid C Somayajulu 	switch (p_hwfn->hw_info.personality) {
219711e25f0dSDavid C Somayajulu 	case ECORE_PCI_ETH_IWARP:
21989efd0ba7SDavid C Somayajulu 		/* Each QP requires one connection */
21999efd0ba7SDavid C Somayajulu 		num_cons = OSAL_MIN_T(u32, IWARP_MAX_QPS, p_params->num_qps);
22009efd0ba7SDavid C Somayajulu #ifdef CONFIG_ECORE_IWARP /* required for the define */
22019efd0ba7SDavid C Somayajulu 		/* additional connections required for passive tcp handling */
22029efd0ba7SDavid C Somayajulu 		num_cons += ECORE_IWARP_PREALLOC_CNT;
22039efd0ba7SDavid C Somayajulu #endif
220411e25f0dSDavid C Somayajulu 		proto = PROTOCOLID_IWARP;
220511e25f0dSDavid C Somayajulu 		break;
220611e25f0dSDavid C Somayajulu 	case ECORE_PCI_ETH_ROCE:
220711e25f0dSDavid C Somayajulu 		num_qps = OSAL_MIN_T(u32, ROCE_MAX_QPS, p_params->num_qps);
220811e25f0dSDavid C Somayajulu 		num_cons = num_qps * 2; /* each QP requires two connections */
220911e25f0dSDavid C Somayajulu 		proto = PROTOCOLID_ROCE;
221011e25f0dSDavid C Somayajulu 		break;
221111e25f0dSDavid C Somayajulu 	default:
221211e25f0dSDavid C Somayajulu 		return;
221311e25f0dSDavid C Somayajulu 	}
221411e25f0dSDavid C Somayajulu 
221511e25f0dSDavid C Somayajulu 	if (num_cons && num_tasks) {
2216217ec208SDavid C Somayajulu 		u32 num_srqs, num_xrc_srqs, max_xrc_srqs, page_size;
2217217ec208SDavid C Somayajulu 
221811e25f0dSDavid C Somayajulu 		ecore_cxt_set_proto_cid_count(p_hwfn, proto,
221911e25f0dSDavid C Somayajulu 					      num_cons, 0);
222011e25f0dSDavid C Somayajulu 
222111e25f0dSDavid C Somayajulu 		/* Deliberatly passing ROCE for tasks id. This is because
222211e25f0dSDavid C Somayajulu 		 * iWARP / RoCE share the task id.
222311e25f0dSDavid C Somayajulu 		 */
222411e25f0dSDavid C Somayajulu 		ecore_cxt_set_proto_tid_count(p_hwfn, PROTOCOLID_ROCE,
222511e25f0dSDavid C Somayajulu 					      ECORE_CXT_ROCE_TID_SEG,
222611e25f0dSDavid C Somayajulu 					      1, /* RoCE segment type */
222711e25f0dSDavid C Somayajulu 					      num_tasks,
222811e25f0dSDavid C Somayajulu 					      false); /* !force load */
2229217ec208SDavid C Somayajulu 
2230217ec208SDavid C Somayajulu 		num_srqs = OSAL_MIN_T(u32, ECORE_RDMA_MAX_SRQS,
2231217ec208SDavid C Somayajulu 				      p_params->num_srqs);
2232217ec208SDavid C Somayajulu 
2233217ec208SDavid C Somayajulu 		/* XRC SRQs populate a single ILT page */
2234217ec208SDavid C Somayajulu 		page_size = ecore_cxt_get_ilt_page_size(p_hwfn, ILT_CLI_TSDM);
2235217ec208SDavid C Somayajulu 		max_xrc_srqs =  page_size / XRC_SRQ_CXT_SIZE;
2236217ec208SDavid C Somayajulu 		max_xrc_srqs = OSAL_MIN_T(u32, max_xrc_srqs, ECORE_RDMA_MAX_XRC_SRQS);
2237217ec208SDavid C Somayajulu 
2238217ec208SDavid C Somayajulu 		num_xrc_srqs = OSAL_MIN_T(u32, p_params->num_xrc_srqs,
2239217ec208SDavid C Somayajulu 					  max_xrc_srqs);
2240217ec208SDavid C Somayajulu 		ecore_cxt_set_srq_count(p_hwfn, num_srqs, num_xrc_srqs);
224111e25f0dSDavid C Somayajulu 
224211e25f0dSDavid C Somayajulu 	} else {
224311e25f0dSDavid C Somayajulu 		DP_INFO(p_hwfn->p_dev,
224411e25f0dSDavid C Somayajulu 			"RDMA personality used without setting params!\n");
224511e25f0dSDavid C Somayajulu 	}
224611e25f0dSDavid C Somayajulu }
224711e25f0dSDavid C Somayajulu 
ecore_cxt_set_pf_params(struct ecore_hwfn * p_hwfn,u32 rdma_tasks)224811e25f0dSDavid C Somayajulu enum _ecore_status_t ecore_cxt_set_pf_params(struct ecore_hwfn *p_hwfn,
224911e25f0dSDavid C Somayajulu 					     u32 rdma_tasks)
225011e25f0dSDavid C Somayajulu {
225111e25f0dSDavid C Somayajulu 	/* Set the number of required CORE connections */
225211e25f0dSDavid C Somayajulu 	u32 core_cids = 1; /* SPQ */
225311e25f0dSDavid C Somayajulu 
225411e25f0dSDavid C Somayajulu 	if (p_hwfn->using_ll2)
225511e25f0dSDavid C Somayajulu 		core_cids += 4; /* @@@TBD Use the proper #define */
225611e25f0dSDavid C Somayajulu 
225711e25f0dSDavid C Somayajulu 	ecore_cxt_set_proto_cid_count(p_hwfn, PROTOCOLID_CORE, core_cids, 0);
225811e25f0dSDavid C Somayajulu 
225911e25f0dSDavid C Somayajulu 	switch (p_hwfn->hw_info.personality) {
226011e25f0dSDavid C Somayajulu 	case ECORE_PCI_ETH_RDMA:
226111e25f0dSDavid C Somayajulu 	case ECORE_PCI_ETH_IWARP:
226211e25f0dSDavid C Somayajulu 	case ECORE_PCI_ETH_ROCE:
226311e25f0dSDavid C Somayajulu 	{
226411e25f0dSDavid C Somayajulu 		ecore_rdma_set_pf_params(p_hwfn,
226511e25f0dSDavid C Somayajulu 					 &p_hwfn->pf_params.rdma_pf_params,
226611e25f0dSDavid C Somayajulu 					 rdma_tasks);
226711e25f0dSDavid C Somayajulu 
226811e25f0dSDavid C Somayajulu 		/* no need for break since RoCE coexist with Ethernet */
226911e25f0dSDavid C Somayajulu 	}
227011e25f0dSDavid C Somayajulu 	case ECORE_PCI_ETH:
227111e25f0dSDavid C Somayajulu 	{
2272217ec208SDavid C Somayajulu 		u32 count = 0;
2273217ec208SDavid C Somayajulu 
227411e25f0dSDavid C Somayajulu 		struct ecore_eth_pf_params *p_params =
227511e25f0dSDavid C Somayajulu 					&p_hwfn->pf_params.eth_pf_params;
227611e25f0dSDavid C Somayajulu 
227711e25f0dSDavid C Somayajulu 		if (!p_params->num_vf_cons)
227811e25f0dSDavid C Somayajulu 			p_params->num_vf_cons = ETH_PF_PARAMS_VF_CONS_DEFAULT;
227911e25f0dSDavid C Somayajulu 		ecore_cxt_set_proto_cid_count(p_hwfn, PROTOCOLID_ETH,
228011e25f0dSDavid C Somayajulu 					      p_params->num_cons,
228111e25f0dSDavid C Somayajulu 					      p_params->num_vf_cons);
2282217ec208SDavid C Somayajulu 
2283217ec208SDavid C Somayajulu 		count = p_params->num_arfs_filters;
2284217ec208SDavid C Somayajulu 
2285217ec208SDavid C Somayajulu 		if (!OSAL_TEST_BIT(ECORE_MF_DISABLE_ARFS,
2286217ec208SDavid C Somayajulu 				   &p_hwfn->p_dev->mf_bits))
2287217ec208SDavid C Somayajulu 			p_hwfn->p_cxt_mngr->arfs_count = count;
228811e25f0dSDavid C Somayajulu 
228911e25f0dSDavid C Somayajulu 		break;
229011e25f0dSDavid C Somayajulu 	}
229111e25f0dSDavid C Somayajulu 	case ECORE_PCI_FCOE:
229211e25f0dSDavid C Somayajulu 	{
229311e25f0dSDavid C Somayajulu 		struct ecore_fcoe_pf_params *p_params;
229411e25f0dSDavid C Somayajulu 
229511e25f0dSDavid C Somayajulu 		p_params = &p_hwfn->pf_params.fcoe_pf_params;
229611e25f0dSDavid C Somayajulu 
229711e25f0dSDavid C Somayajulu 		if (p_params->num_cons && p_params->num_tasks) {
229811e25f0dSDavid C Somayajulu 			ecore_cxt_set_proto_cid_count(p_hwfn, PROTOCOLID_FCOE,
229911e25f0dSDavid C Somayajulu 						      p_params->num_cons, 0);
230011e25f0dSDavid C Somayajulu 
230111e25f0dSDavid C Somayajulu 			ecore_cxt_set_proto_tid_count(p_hwfn, PROTOCOLID_FCOE,
230211e25f0dSDavid C Somayajulu 						      ECORE_CXT_FCOE_TID_SEG,
230311e25f0dSDavid C Somayajulu 						      0, /* segment type */
230411e25f0dSDavid C Somayajulu 						      p_params->num_tasks,
230511e25f0dSDavid C Somayajulu 						      true);
230611e25f0dSDavid C Somayajulu 		} else {
230711e25f0dSDavid C Somayajulu 			DP_INFO(p_hwfn->p_dev,
230811e25f0dSDavid C Somayajulu 				"Fcoe personality used without setting params!\n");
230911e25f0dSDavid C Somayajulu 		}
231011e25f0dSDavid C Somayajulu 		break;
231111e25f0dSDavid C Somayajulu 	}
231211e25f0dSDavid C Somayajulu 	case ECORE_PCI_ISCSI:
231311e25f0dSDavid C Somayajulu 	{
231411e25f0dSDavid C Somayajulu 		struct ecore_iscsi_pf_params *p_params;
231511e25f0dSDavid C Somayajulu 
231611e25f0dSDavid C Somayajulu 		p_params = &p_hwfn->pf_params.iscsi_pf_params;
231711e25f0dSDavid C Somayajulu 
231811e25f0dSDavid C Somayajulu 		if (p_params->num_cons && p_params->num_tasks) {
231911e25f0dSDavid C Somayajulu 			ecore_cxt_set_proto_cid_count(p_hwfn, PROTOCOLID_ISCSI,
232011e25f0dSDavid C Somayajulu 						      p_params->num_cons, 0);
232111e25f0dSDavid C Somayajulu 
232211e25f0dSDavid C Somayajulu 			ecore_cxt_set_proto_tid_count(p_hwfn, PROTOCOLID_ISCSI,
232311e25f0dSDavid C Somayajulu 						      ECORE_CXT_ISCSI_TID_SEG,
232411e25f0dSDavid C Somayajulu 						      0, /* segment type */
232511e25f0dSDavid C Somayajulu 						      p_params->num_tasks,
232611e25f0dSDavid C Somayajulu 						      true);
232711e25f0dSDavid C Somayajulu 		} else {
232811e25f0dSDavid C Somayajulu 			DP_INFO(p_hwfn->p_dev,
232911e25f0dSDavid C Somayajulu 				"Iscsi personality used without setting params!\n");
233011e25f0dSDavid C Somayajulu 		}
233111e25f0dSDavid C Somayajulu 		break;
233211e25f0dSDavid C Somayajulu 	}
233311e25f0dSDavid C Somayajulu 	default:
233411e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
233511e25f0dSDavid C Somayajulu 	}
233611e25f0dSDavid C Somayajulu 
233711e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
233811e25f0dSDavid C Somayajulu }
233911e25f0dSDavid C Somayajulu 
ecore_cxt_get_tid_mem_info(struct ecore_hwfn * p_hwfn,struct ecore_tid_mem * p_info)234011e25f0dSDavid C Somayajulu enum _ecore_status_t ecore_cxt_get_tid_mem_info(struct ecore_hwfn *p_hwfn,
234111e25f0dSDavid C Somayajulu 						struct ecore_tid_mem *p_info)
234211e25f0dSDavid C Somayajulu {
234311e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
234411e25f0dSDavid C Somayajulu 	u32 proto, seg, total_lines, i, shadow_line;
234511e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *p_cli;
234611e25f0dSDavid C Somayajulu 	struct ecore_ilt_cli_blk *p_fl_seg;
234711e25f0dSDavid C Somayajulu 	struct ecore_tid_seg *p_seg_info;
234811e25f0dSDavid C Somayajulu 
234911e25f0dSDavid C Somayajulu 	/* Verify the personality */
235011e25f0dSDavid C Somayajulu 	switch (p_hwfn->hw_info.personality) {
235111e25f0dSDavid C Somayajulu 	case ECORE_PCI_FCOE:
235211e25f0dSDavid C Somayajulu 		proto = PROTOCOLID_FCOE;
235311e25f0dSDavid C Somayajulu 		seg = ECORE_CXT_FCOE_TID_SEG;
235411e25f0dSDavid C Somayajulu 		break;
235511e25f0dSDavid C Somayajulu 	case ECORE_PCI_ISCSI:
235611e25f0dSDavid C Somayajulu 		proto = PROTOCOLID_ISCSI;
235711e25f0dSDavid C Somayajulu 		seg = ECORE_CXT_ISCSI_TID_SEG;
235811e25f0dSDavid C Somayajulu 		break;
235911e25f0dSDavid C Somayajulu 	default:
236011e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
236111e25f0dSDavid C Somayajulu 	}
236211e25f0dSDavid C Somayajulu 
236311e25f0dSDavid C Somayajulu 	p_cli = &p_mngr->clients[ILT_CLI_CDUT];
236411e25f0dSDavid C Somayajulu 	if (!p_cli->active) {
236511e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
236611e25f0dSDavid C Somayajulu 	}
236711e25f0dSDavid C Somayajulu 
236811e25f0dSDavid C Somayajulu 	p_seg_info = &p_mngr->conn_cfg[proto].tid_seg[seg];
236911e25f0dSDavid C Somayajulu 	if (!p_seg_info->has_fl_mem)
237011e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
237111e25f0dSDavid C Somayajulu 
237211e25f0dSDavid C Somayajulu 	p_fl_seg = &p_cli->pf_blks[CDUT_FL_SEG_BLK(seg, PF)];
237311e25f0dSDavid C Somayajulu 	total_lines = DIV_ROUND_UP(p_fl_seg->total_size,
237411e25f0dSDavid C Somayajulu 				   p_fl_seg->real_size_in_page);
237511e25f0dSDavid C Somayajulu 
237611e25f0dSDavid C Somayajulu 	for (i = 0; i < total_lines; i++) {
237711e25f0dSDavid C Somayajulu 		shadow_line = i + p_fl_seg->start_line -
237811e25f0dSDavid C Somayajulu 			      p_hwfn->p_cxt_mngr->pf_start_line;
237911e25f0dSDavid C Somayajulu 		p_info->blocks[i] = p_mngr->ilt_shadow[shadow_line].p_virt;
238011e25f0dSDavid C Somayajulu 	}
238111e25f0dSDavid C Somayajulu 	p_info->waste = ILT_PAGE_IN_BYTES(p_cli->p_size.val) -
238211e25f0dSDavid C Somayajulu 			p_fl_seg->real_size_in_page;
238311e25f0dSDavid C Somayajulu 	p_info->tid_size = p_mngr->task_type_size[p_seg_info->type];
238411e25f0dSDavid C Somayajulu 	p_info->num_tids_per_block = p_fl_seg->real_size_in_page /
238511e25f0dSDavid C Somayajulu 				     p_info->tid_size;
238611e25f0dSDavid C Somayajulu 
238711e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
238811e25f0dSDavid C Somayajulu }
238911e25f0dSDavid C Somayajulu 
239011e25f0dSDavid C Somayajulu /* This function is very RoCE oriented, if another protocol in the future
239111e25f0dSDavid C Somayajulu  * will want this feature we'll need to modify the function to be more generic
239211e25f0dSDavid C Somayajulu  */
239311e25f0dSDavid C Somayajulu enum _ecore_status_t
ecore_cxt_dynamic_ilt_alloc(struct ecore_hwfn * p_hwfn,enum ecore_cxt_elem_type elem_type,u32 iid)239411e25f0dSDavid C Somayajulu ecore_cxt_dynamic_ilt_alloc(struct ecore_hwfn *p_hwfn,
239511e25f0dSDavid C Somayajulu 			    enum ecore_cxt_elem_type elem_type,
239611e25f0dSDavid C Somayajulu 			    u32 iid)
239711e25f0dSDavid C Somayajulu {
239811e25f0dSDavid C Somayajulu 	u32 reg_offset, shadow_line, elem_size, hw_p_size, elems_per_p, line;
239911e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *p_cli;
240011e25f0dSDavid C Somayajulu 	struct ecore_ilt_cli_blk *p_blk;
240111e25f0dSDavid C Somayajulu 	struct ecore_ptt *p_ptt;
240211e25f0dSDavid C Somayajulu 	dma_addr_t p_phys;
240311e25f0dSDavid C Somayajulu 	u64 ilt_hw_entry;
240411e25f0dSDavid C Somayajulu 	void *p_virt;
240511e25f0dSDavid C Somayajulu 	enum _ecore_status_t rc = ECORE_SUCCESS;
240611e25f0dSDavid C Somayajulu 
240711e25f0dSDavid C Somayajulu 	switch (elem_type) {
240811e25f0dSDavid C Somayajulu 	case ECORE_ELEM_CXT:
240911e25f0dSDavid C Somayajulu 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC];
241011e25f0dSDavid C Somayajulu 		elem_size = CONN_CXT_SIZE(p_hwfn);
241111e25f0dSDavid C Somayajulu 		p_blk = &p_cli->pf_blks[CDUC_BLK];
241211e25f0dSDavid C Somayajulu 		break;
241311e25f0dSDavid C Somayajulu 	case ECORE_ELEM_SRQ:
2414217ec208SDavid C Somayajulu 		/* The first ILT page is not used for regular SRQs. Skip it. */
2415217ec208SDavid C Somayajulu 		iid += ecore_cxt_srqs_per_page(p_hwfn);
241611e25f0dSDavid C Somayajulu 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_TSDM];
241711e25f0dSDavid C Somayajulu 		elem_size = SRQ_CXT_SIZE;
241811e25f0dSDavid C Somayajulu 		p_blk = &p_cli->pf_blks[SRQ_BLK];
241911e25f0dSDavid C Somayajulu 		break;
2420217ec208SDavid C Somayajulu 	case ECORE_ELEM_XRC_SRQ:
2421217ec208SDavid C Somayajulu 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_TSDM];
2422217ec208SDavid C Somayajulu 		elem_size = XRC_SRQ_CXT_SIZE;
2423217ec208SDavid C Somayajulu 		p_blk = &p_cli->pf_blks[SRQ_BLK];
2424217ec208SDavid C Somayajulu 		break;
242511e25f0dSDavid C Somayajulu 	case ECORE_ELEM_TASK:
242611e25f0dSDavid C Somayajulu 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
242711e25f0dSDavid C Somayajulu 		elem_size = TYPE1_TASK_CXT_SIZE(p_hwfn);
242811e25f0dSDavid C Somayajulu 		p_blk = &p_cli->pf_blks[CDUT_SEG_BLK(ECORE_CXT_ROCE_TID_SEG)];
242911e25f0dSDavid C Somayajulu 		break;
243011e25f0dSDavid C Somayajulu 	default:
243111e25f0dSDavid C Somayajulu 		DP_NOTICE(p_hwfn, false,
243211e25f0dSDavid C Somayajulu 			  "ECORE_INVALID elem type = %d", elem_type);
243311e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
243411e25f0dSDavid C Somayajulu 	}
243511e25f0dSDavid C Somayajulu 
243611e25f0dSDavid C Somayajulu 	/* Calculate line in ilt */
243711e25f0dSDavid C Somayajulu 	hw_p_size = p_cli->p_size.val;
243811e25f0dSDavid C Somayajulu 	elems_per_p = ILT_PAGE_IN_BYTES(hw_p_size) / elem_size;
243911e25f0dSDavid C Somayajulu 	line = p_blk->start_line + (iid / elems_per_p);
244011e25f0dSDavid C Somayajulu 	shadow_line = line - p_hwfn->p_cxt_mngr->pf_start_line;
244111e25f0dSDavid C Somayajulu 
244211e25f0dSDavid C Somayajulu 	/* If line is already allocated, do nothing, otherwise allocate it and
244311e25f0dSDavid C Somayajulu 	 * write it to the PSWRQ2 registers.
244411e25f0dSDavid C Somayajulu 	 * This section can be run in parallel from different contexts and thus
244511e25f0dSDavid C Somayajulu 	 * a mutex protection is needed.
244611e25f0dSDavid C Somayajulu 	 */
2447217ec208SDavid C Somayajulu #ifdef _NTDDK_
2448217ec208SDavid C Somayajulu #pragma warning(suppress : 28121)
2449217ec208SDavid C Somayajulu #endif
245011e25f0dSDavid C Somayajulu 	OSAL_MUTEX_ACQUIRE(&p_hwfn->p_cxt_mngr->mutex);
245111e25f0dSDavid C Somayajulu 
245211e25f0dSDavid C Somayajulu 	if (p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].p_virt)
245311e25f0dSDavid C Somayajulu 		goto out0;
245411e25f0dSDavid C Somayajulu 
245511e25f0dSDavid C Somayajulu 	p_ptt = ecore_ptt_acquire(p_hwfn);
245611e25f0dSDavid C Somayajulu 	if (!p_ptt) {
245711e25f0dSDavid C Somayajulu 		DP_NOTICE(p_hwfn, false,
245811e25f0dSDavid C Somayajulu 			  "ECORE_TIME_OUT on ptt acquire - dynamic allocation");
245911e25f0dSDavid C Somayajulu 		rc = ECORE_TIMEOUT;
246011e25f0dSDavid C Somayajulu 		goto out0;
246111e25f0dSDavid C Somayajulu 	}
246211e25f0dSDavid C Somayajulu 
246311e25f0dSDavid C Somayajulu 	p_virt = OSAL_DMA_ALLOC_COHERENT(p_hwfn->p_dev,
246411e25f0dSDavid C Somayajulu 					 &p_phys,
246511e25f0dSDavid C Somayajulu 					 p_blk->real_size_in_page);
246611e25f0dSDavid C Somayajulu 	if (!p_virt) {
246711e25f0dSDavid C Somayajulu 		rc = ECORE_NOMEM;
246811e25f0dSDavid C Somayajulu 		goto out1;
246911e25f0dSDavid C Somayajulu 	}
247011e25f0dSDavid C Somayajulu 	OSAL_MEM_ZERO(p_virt, p_blk->real_size_in_page);
247111e25f0dSDavid C Somayajulu 
247211e25f0dSDavid C Somayajulu 	/* configuration of refTagMask to 0xF is required for RoCE DIF MR only,
247311e25f0dSDavid C Somayajulu 	 * to compensate for a HW bug, but it is configured even if DIF is not
247411e25f0dSDavid C Somayajulu 	 * enabled. This is harmless and allows us to avoid a dedicated API. We
247511e25f0dSDavid C Somayajulu 	 * configure the field for all of the contexts on the newly allocated
247611e25f0dSDavid C Somayajulu 	 * page.
247711e25f0dSDavid C Somayajulu 	 */
247811e25f0dSDavid C Somayajulu 	if (elem_type == ECORE_ELEM_TASK) {
247911e25f0dSDavid C Somayajulu 		u32 elem_i;
248011e25f0dSDavid C Somayajulu 		u8 *elem_start = (u8 *)p_virt;
248111e25f0dSDavid C Somayajulu 		union type1_task_context *elem;
248211e25f0dSDavid C Somayajulu 
248311e25f0dSDavid C Somayajulu 		for (elem_i = 0; elem_i < elems_per_p; elem_i++) {
248411e25f0dSDavid C Somayajulu 			elem = (union type1_task_context *)elem_start;
248511e25f0dSDavid C Somayajulu 			SET_FIELD(elem->roce_ctx.tdif_context.flags1,
2486217ec208SDavid C Somayajulu 				  TDIF_TASK_CONTEXT_REF_TAG_MASK , 0xf);
248711e25f0dSDavid C Somayajulu 			elem_start += TYPE1_TASK_CXT_SIZE(p_hwfn);
248811e25f0dSDavid C Somayajulu 		}
248911e25f0dSDavid C Somayajulu 	}
249011e25f0dSDavid C Somayajulu 
249111e25f0dSDavid C Somayajulu 	p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].p_virt = p_virt;
249211e25f0dSDavid C Somayajulu 	p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].p_phys = p_phys;
249311e25f0dSDavid C Somayajulu 	p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].size =
249411e25f0dSDavid C Somayajulu 		p_blk->real_size_in_page;
249511e25f0dSDavid C Somayajulu 
249611e25f0dSDavid C Somayajulu 	/* compute absolute offset */
249711e25f0dSDavid C Somayajulu 	reg_offset = PSWRQ2_REG_ILT_MEMORY +
249811e25f0dSDavid C Somayajulu 		     (line * ILT_REG_SIZE_IN_BYTES * ILT_ENTRY_IN_REGS);
249911e25f0dSDavid C Somayajulu 
250011e25f0dSDavid C Somayajulu 	ilt_hw_entry = 0;
250111e25f0dSDavid C Somayajulu 	SET_FIELD(ilt_hw_entry, ILT_ENTRY_VALID, 1ULL);
250211e25f0dSDavid C Somayajulu 	SET_FIELD(ilt_hw_entry,
250311e25f0dSDavid C Somayajulu 		  ILT_ENTRY_PHY_ADDR,
250411e25f0dSDavid C Somayajulu 		  (p_hwfn->p_cxt_mngr->ilt_shadow[shadow_line].p_phys >> 12));
250511e25f0dSDavid C Somayajulu 
250611e25f0dSDavid C Somayajulu 	/* Write via DMAE since the PSWRQ2_REG_ILT_MEMORY line is a wide-bus */
250711e25f0dSDavid C Somayajulu 	ecore_dmae_host2grc(p_hwfn, p_ptt, (u64)(osal_uintptr_t)&ilt_hw_entry,
250811e25f0dSDavid C Somayajulu 			    reg_offset, sizeof(ilt_hw_entry) / sizeof(u32),
2509217ec208SDavid C Somayajulu 			    OSAL_NULL /* default parameters */);
251011e25f0dSDavid C Somayajulu 
251111e25f0dSDavid C Somayajulu 	if (elem_type == ECORE_ELEM_CXT) {
251211e25f0dSDavid C Somayajulu 		u32 last_cid_allocated = (1 + (iid / elems_per_p)) *
251311e25f0dSDavid C Somayajulu 					 elems_per_p;
251411e25f0dSDavid C Somayajulu 
251511e25f0dSDavid C Somayajulu 		/* Update the relevant register in the parser */
251611e25f0dSDavid C Somayajulu 		ecore_wr(p_hwfn, p_ptt, PRS_REG_ROCE_DEST_QP_MAX_PF,
251711e25f0dSDavid C Somayajulu 			 last_cid_allocated - 1);
251811e25f0dSDavid C Somayajulu 
251911e25f0dSDavid C Somayajulu 		/* RoCE w/a -> we don't write to the prs search reg until first
252011e25f0dSDavid C Somayajulu 		 * cid is allocated. This is because the prs checks
252111e25f0dSDavid C Somayajulu 		 * last_cid-1 >=0 making 0 a valid value... this will cause
252211e25f0dSDavid C Somayajulu 		 * the a context load to occur on a RoCE packet received with
252311e25f0dSDavid C Somayajulu 		 * cid=0 even before context was initialized, can happen with a
252411e25f0dSDavid C Somayajulu 		 * stray packet from switch or a packet with crc-error
252511e25f0dSDavid C Somayajulu 		 */
252611e25f0dSDavid C Somayajulu 
252711e25f0dSDavid C Somayajulu 		if (!p_hwfn->b_rdma_enabled_in_prs) {
252811e25f0dSDavid C Somayajulu 			/* Enable Rdma search */
252911e25f0dSDavid C Somayajulu 			ecore_wr(p_hwfn, p_ptt, p_hwfn->rdma_prs_search_reg, 1);
253011e25f0dSDavid C Somayajulu 			p_hwfn->b_rdma_enabled_in_prs = true;
253111e25f0dSDavid C Somayajulu 		}
253211e25f0dSDavid C Somayajulu 	}
253311e25f0dSDavid C Somayajulu 
253411e25f0dSDavid C Somayajulu out1:
253511e25f0dSDavid C Somayajulu 	ecore_ptt_release(p_hwfn, p_ptt);
253611e25f0dSDavid C Somayajulu out0:
253711e25f0dSDavid C Somayajulu 	OSAL_MUTEX_RELEASE(&p_hwfn->p_cxt_mngr->mutex);
253811e25f0dSDavid C Somayajulu 
253911e25f0dSDavid C Somayajulu 	return rc;
254011e25f0dSDavid C Somayajulu }
254111e25f0dSDavid C Somayajulu 
254211e25f0dSDavid C Somayajulu /* This function is very RoCE oriented, if another protocol in the future
254311e25f0dSDavid C Somayajulu  * will want this feature we'll need to modify the function to be more generic
254411e25f0dSDavid C Somayajulu  */
254511e25f0dSDavid C Somayajulu 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)254611e25f0dSDavid C Somayajulu ecore_cxt_free_ilt_range(struct ecore_hwfn *p_hwfn,
254711e25f0dSDavid C Somayajulu 			 enum ecore_cxt_elem_type elem_type,
254811e25f0dSDavid C Somayajulu 			 u32 start_iid, u32 count)
254911e25f0dSDavid C Somayajulu {
255011e25f0dSDavid C Somayajulu 	u32 start_line, end_line, shadow_start_line, shadow_end_line;
255111e25f0dSDavid C Somayajulu 	u32 reg_offset, elem_size, hw_p_size, elems_per_p;
255211e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *p_cli;
255311e25f0dSDavid C Somayajulu 	struct ecore_ilt_cli_blk *p_blk;
255411e25f0dSDavid C Somayajulu 	u32 end_iid = start_iid + count;
255511e25f0dSDavid C Somayajulu 	struct ecore_ptt *p_ptt;
255611e25f0dSDavid C Somayajulu 	u64 ilt_hw_entry = 0;
255711e25f0dSDavid C Somayajulu 	u32 i;
255811e25f0dSDavid C Somayajulu 
255911e25f0dSDavid C Somayajulu 	switch (elem_type) {
256011e25f0dSDavid C Somayajulu 	case ECORE_ELEM_CXT:
256111e25f0dSDavid C Somayajulu 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUC];
256211e25f0dSDavid C Somayajulu 		elem_size = CONN_CXT_SIZE(p_hwfn);
256311e25f0dSDavid C Somayajulu 		p_blk = &p_cli->pf_blks[CDUC_BLK];
256411e25f0dSDavid C Somayajulu 		break;
256511e25f0dSDavid C Somayajulu 	case ECORE_ELEM_SRQ:
256611e25f0dSDavid C Somayajulu 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_TSDM];
256711e25f0dSDavid C Somayajulu 		elem_size = SRQ_CXT_SIZE;
256811e25f0dSDavid C Somayajulu 		p_blk = &p_cli->pf_blks[SRQ_BLK];
256911e25f0dSDavid C Somayajulu 		break;
257011e25f0dSDavid C Somayajulu 	case ECORE_ELEM_TASK:
257111e25f0dSDavid C Somayajulu 		p_cli = &p_hwfn->p_cxt_mngr->clients[ILT_CLI_CDUT];
257211e25f0dSDavid C Somayajulu 		elem_size = TYPE1_TASK_CXT_SIZE(p_hwfn);
257311e25f0dSDavid C Somayajulu 		p_blk = &p_cli->pf_blks[CDUT_SEG_BLK(ECORE_CXT_ROCE_TID_SEG)];
257411e25f0dSDavid C Somayajulu 		break;
257511e25f0dSDavid C Somayajulu 	default:
257611e25f0dSDavid C Somayajulu 		DP_NOTICE(p_hwfn, false,
257711e25f0dSDavid C Somayajulu 			  "ECORE_INVALID elem type = %d", elem_type);
257811e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
257911e25f0dSDavid C Somayajulu 	}
258011e25f0dSDavid C Somayajulu 
258111e25f0dSDavid C Somayajulu 	/* Calculate line in ilt */
258211e25f0dSDavid C Somayajulu 	hw_p_size = p_cli->p_size.val;
258311e25f0dSDavid C Somayajulu 	elems_per_p = ILT_PAGE_IN_BYTES(hw_p_size) / elem_size;
258411e25f0dSDavid C Somayajulu 	start_line = p_blk->start_line + (start_iid / elems_per_p);
258511e25f0dSDavid C Somayajulu 	end_line = p_blk->start_line + (end_iid / elems_per_p);
258611e25f0dSDavid C Somayajulu 	if (((end_iid + 1) / elems_per_p) != (end_iid / elems_per_p))
258711e25f0dSDavid C Somayajulu 		end_line--;
258811e25f0dSDavid C Somayajulu 
258911e25f0dSDavid C Somayajulu 	shadow_start_line = start_line - p_hwfn->p_cxt_mngr->pf_start_line;
259011e25f0dSDavid C Somayajulu 	shadow_end_line = end_line - p_hwfn->p_cxt_mngr->pf_start_line;
259111e25f0dSDavid C Somayajulu 
259211e25f0dSDavid C Somayajulu 	p_ptt = ecore_ptt_acquire(p_hwfn);
259311e25f0dSDavid C Somayajulu 	if (!p_ptt) {
259411e25f0dSDavid C Somayajulu 		DP_NOTICE(p_hwfn, false, "ECORE_TIME_OUT on ptt acquire - dynamic allocation");
259511e25f0dSDavid C Somayajulu 		return ECORE_TIMEOUT;
259611e25f0dSDavid C Somayajulu 	}
259711e25f0dSDavid C Somayajulu 
259811e25f0dSDavid C Somayajulu 	for (i = shadow_start_line; i < shadow_end_line; i++) {
259911e25f0dSDavid C Somayajulu 		if (!p_hwfn->p_cxt_mngr->ilt_shadow[i].p_virt)
260011e25f0dSDavid C Somayajulu 			continue;
260111e25f0dSDavid C Somayajulu 
260211e25f0dSDavid C Somayajulu 		OSAL_DMA_FREE_COHERENT(p_hwfn->p_dev,
260311e25f0dSDavid C Somayajulu 				       p_hwfn->p_cxt_mngr->ilt_shadow[i].p_virt,
260411e25f0dSDavid C Somayajulu 				       p_hwfn->p_cxt_mngr->ilt_shadow[i].p_phys,
260511e25f0dSDavid C Somayajulu 				       p_hwfn->p_cxt_mngr->ilt_shadow[i].size);
260611e25f0dSDavid C Somayajulu 
260711e25f0dSDavid C Somayajulu 		p_hwfn->p_cxt_mngr->ilt_shadow[i].p_virt = OSAL_NULL;
260811e25f0dSDavid C Somayajulu 		p_hwfn->p_cxt_mngr->ilt_shadow[i].p_phys = 0;
260911e25f0dSDavid C Somayajulu 		p_hwfn->p_cxt_mngr->ilt_shadow[i].size = 0;
261011e25f0dSDavid C Somayajulu 
261111e25f0dSDavid C Somayajulu 		/* compute absolute offset */
261211e25f0dSDavid C Somayajulu 		reg_offset = PSWRQ2_REG_ILT_MEMORY +
261311e25f0dSDavid C Somayajulu 			     ((start_line++) * ILT_REG_SIZE_IN_BYTES *
261411e25f0dSDavid C Somayajulu 			      ILT_ENTRY_IN_REGS);
261511e25f0dSDavid C Somayajulu 
261611e25f0dSDavid C Somayajulu 		/* Write via DMAE since the PSWRQ2_REG_ILT_MEMORY line is a
261711e25f0dSDavid C Somayajulu 		 * wide-bus.
261811e25f0dSDavid C Somayajulu 		 */
261911e25f0dSDavid C Somayajulu 		ecore_dmae_host2grc(p_hwfn, p_ptt,
262011e25f0dSDavid C Somayajulu 				    (u64)(osal_uintptr_t)&ilt_hw_entry,
262111e25f0dSDavid C Somayajulu 				    reg_offset,
262211e25f0dSDavid C Somayajulu 				    sizeof(ilt_hw_entry) / sizeof(u32),
2623217ec208SDavid C Somayajulu 				    OSAL_NULL /* default parameters */);
262411e25f0dSDavid C Somayajulu 	}
262511e25f0dSDavid C Somayajulu 
262611e25f0dSDavid C Somayajulu 	ecore_ptt_release(p_hwfn, p_ptt);
262711e25f0dSDavid C Somayajulu 
262811e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
262911e25f0dSDavid C Somayajulu }
263011e25f0dSDavid C Somayajulu 
ecore_cxt_get_task_ctx(struct ecore_hwfn * p_hwfn,u32 tid,u8 ctx_type,void ** pp_task_ctx)263111e25f0dSDavid C Somayajulu enum _ecore_status_t ecore_cxt_get_task_ctx(struct ecore_hwfn *p_hwfn,
263211e25f0dSDavid C Somayajulu 					    u32 tid,
263311e25f0dSDavid C Somayajulu 					    u8 ctx_type,
263411e25f0dSDavid C Somayajulu 					    void **pp_task_ctx)
263511e25f0dSDavid C Somayajulu {
263611e25f0dSDavid C Somayajulu 	struct ecore_cxt_mngr *p_mngr = p_hwfn->p_cxt_mngr;
263711e25f0dSDavid C Somayajulu 	struct ecore_ilt_client_cfg *p_cli;
263811e25f0dSDavid C Somayajulu 	struct ecore_tid_seg *p_seg_info;
26399efd0ba7SDavid C Somayajulu 	struct ecore_ilt_cli_blk *p_seg;
264011e25f0dSDavid C Somayajulu 	u32 num_tids_per_block;
26419efd0ba7SDavid C Somayajulu 	u32 tid_size, ilt_idx;
26429efd0ba7SDavid C Somayajulu 	u32 total_lines;
26439efd0ba7SDavid C Somayajulu 	u32 proto, seg;
264411e25f0dSDavid C Somayajulu 
264511e25f0dSDavid C Somayajulu 	/* Verify the personality */
264611e25f0dSDavid C Somayajulu 	switch (p_hwfn->hw_info.personality) {
264711e25f0dSDavid C Somayajulu 	case ECORE_PCI_FCOE:
264811e25f0dSDavid C Somayajulu 		proto = PROTOCOLID_FCOE;
264911e25f0dSDavid C Somayajulu 		seg = ECORE_CXT_FCOE_TID_SEG;
265011e25f0dSDavid C Somayajulu 		break;
265111e25f0dSDavid C Somayajulu 	case ECORE_PCI_ISCSI:
265211e25f0dSDavid C Somayajulu 		proto = PROTOCOLID_ISCSI;
265311e25f0dSDavid C Somayajulu 		seg = ECORE_CXT_ISCSI_TID_SEG;
265411e25f0dSDavid C Somayajulu 		break;
265511e25f0dSDavid C Somayajulu 	default:
265611e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
265711e25f0dSDavid C Somayajulu 	}
265811e25f0dSDavid C Somayajulu 
265911e25f0dSDavid C Somayajulu 	p_cli = &p_mngr->clients[ILT_CLI_CDUT];
266011e25f0dSDavid C Somayajulu 	if (!p_cli->active) {
266111e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
266211e25f0dSDavid C Somayajulu 	}
266311e25f0dSDavid C Somayajulu 
266411e25f0dSDavid C Somayajulu 	p_seg_info = &p_mngr->conn_cfg[proto].tid_seg[seg];
266511e25f0dSDavid C Somayajulu 
266611e25f0dSDavid C Somayajulu 	if (ctx_type == ECORE_CTX_WORKING_MEM) {
266711e25f0dSDavid C Somayajulu 		p_seg = &p_cli->pf_blks[CDUT_SEG_BLK(seg)];
266811e25f0dSDavid C Somayajulu 	} else if (ctx_type == ECORE_CTX_FL_MEM) {
266911e25f0dSDavid C Somayajulu 		if (!p_seg_info->has_fl_mem) {
267011e25f0dSDavid C Somayajulu 			return ECORE_INVAL;
267111e25f0dSDavid C Somayajulu 		}
267211e25f0dSDavid C Somayajulu 		p_seg = &p_cli->pf_blks[CDUT_FL_SEG_BLK(seg, PF)];
267311e25f0dSDavid C Somayajulu 	} else {
267411e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
267511e25f0dSDavid C Somayajulu 	}
267611e25f0dSDavid C Somayajulu 	total_lines = DIV_ROUND_UP(p_seg->total_size,
267711e25f0dSDavid C Somayajulu 				   p_seg->real_size_in_page);
267811e25f0dSDavid C Somayajulu 	tid_size = p_mngr->task_type_size[p_seg_info->type];
267911e25f0dSDavid C Somayajulu 	num_tids_per_block = p_seg->real_size_in_page / tid_size;
268011e25f0dSDavid C Somayajulu 
268111e25f0dSDavid C Somayajulu 	if (total_lines < tid/num_tids_per_block)
268211e25f0dSDavid C Somayajulu 		return ECORE_INVAL;
268311e25f0dSDavid C Somayajulu 
268411e25f0dSDavid C Somayajulu 	ilt_idx = tid / num_tids_per_block + p_seg->start_line -
268511e25f0dSDavid C Somayajulu 		  p_mngr->pf_start_line;
268611e25f0dSDavid C Somayajulu 	*pp_task_ctx = (u8 *)p_mngr->ilt_shadow[ilt_idx].p_virt +
268711e25f0dSDavid C Somayajulu 			     (tid % num_tids_per_block) * tid_size;
268811e25f0dSDavid C Somayajulu 
268911e25f0dSDavid C Somayajulu 	return ECORE_SUCCESS;
269011e25f0dSDavid C Somayajulu }
2691