1316485Sdavidcs/*
2316485Sdavidcs * Copyright (c) 2017-2018 Cavium, Inc.
3316485Sdavidcs * All rights reserved.
4316485Sdavidcs *
5316485Sdavidcs *  Redistribution and use in source and binary forms, with or without
6316485Sdavidcs *  modification, are permitted provided that the following conditions
7316485Sdavidcs *  are met:
8316485Sdavidcs *
9316485Sdavidcs *  1. Redistributions of source code must retain the above copyright
10316485Sdavidcs *     notice, this list of conditions and the following disclaimer.
11316485Sdavidcs *  2. Redistributions in binary form must reproduce the above copyright
12316485Sdavidcs *     notice, this list of conditions and the following disclaimer in the
13316485Sdavidcs *     documentation and/or other materials provided with the distribution.
14316485Sdavidcs *
15316485Sdavidcs *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16316485Sdavidcs *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17316485Sdavidcs *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18316485Sdavidcs *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19316485Sdavidcs *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20316485Sdavidcs *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21316485Sdavidcs *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22316485Sdavidcs *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23316485Sdavidcs *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24316485Sdavidcs *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25316485Sdavidcs *  POSSIBILITY OF SUCH DAMAGE.
26316485Sdavidcs *
27316485Sdavidcs * $FreeBSD: stable/11/sys/dev/qlnx/qlnxe/ecore_cxt.h 337517 2018-08-09 01:17:35Z davidcs $
28316485Sdavidcs *
29316485Sdavidcs */
30316485Sdavidcs
31316485Sdavidcs#ifndef _ECORE_CID_
32316485Sdavidcs#define _ECORE_CID_
33316485Sdavidcs
34316485Sdavidcs#include "ecore_hsi_common.h"
35316485Sdavidcs#include "ecore_proto_if.h"
36316485Sdavidcs#include "ecore_cxt_api.h"
37316485Sdavidcs
38316485Sdavidcs/* Tasks segments definitions  */
39316485Sdavidcs#define ECORE_CXT_ISCSI_TID_SEG			PROTOCOLID_ISCSI	/* 0 */
40316485Sdavidcs#define ECORE_CXT_FCOE_TID_SEG			PROTOCOLID_FCOE		/* 1 */
41316485Sdavidcs#define ECORE_CXT_ROCE_TID_SEG			PROTOCOLID_ROCE		/* 2 */
42316485Sdavidcs
43316485Sdavidcsenum ecore_cxt_elem_type {
44316485Sdavidcs	ECORE_ELEM_CXT,
45316485Sdavidcs	ECORE_ELEM_SRQ,
46337517Sdavidcs	ECORE_ELEM_TASK,
47337517Sdavidcs	ECORE_ELEM_XRC_SRQ,
48316485Sdavidcs};
49316485Sdavidcs
50337517Sdavidcsenum ilt_clients {
51337517Sdavidcs	ILT_CLI_CDUC,
52337517Sdavidcs	ILT_CLI_CDUT,
53337517Sdavidcs	ILT_CLI_QM,
54337517Sdavidcs	ILT_CLI_TM,
55337517Sdavidcs	ILT_CLI_SRC,
56337517Sdavidcs	ILT_CLI_TSDM,
57337517Sdavidcs	ILT_CLI_MAX
58337517Sdavidcs};
59337517Sdavidcs
60316485Sdavidcsu32 ecore_cxt_get_proto_cid_count(struct ecore_hwfn *p_hwfn,
61316485Sdavidcs				  enum protocol_type type,
62316485Sdavidcs				  u32 *vf_cid);
63316485Sdavidcs
64316485Sdavidcsu32 ecore_cxt_get_proto_tid_count(struct ecore_hwfn *p_hwfn,
65316485Sdavidcs				  enum protocol_type type);
66316485Sdavidcs
67316485Sdavidcsu32 ecore_cxt_get_proto_cid_start(struct ecore_hwfn *p_hwfn,
68316485Sdavidcs				  enum protocol_type type);
69337517Sdavidcs
70316485Sdavidcsu32 ecore_cxt_get_srq_count(struct ecore_hwfn *p_hwfn);
71316485Sdavidcs
72337517Sdavidcsu32 ecore_cxt_get_xrc_srq_count(struct ecore_hwfn *p_hwfn);
73337517Sdavidcs
74316485Sdavidcs/**
75316485Sdavidcs * @brief ecore_cxt_set_pf_params - Set the PF params for cxt init
76316485Sdavidcs *
77316485Sdavidcs * @param p_hwfn
78316485Sdavidcs *
79316485Sdavidcs * @return enum _ecore_status_t
80316485Sdavidcs */
81316485Sdavidcsenum _ecore_status_t ecore_cxt_set_pf_params(struct ecore_hwfn *p_hwfn,
82316485Sdavidcs					     u32 rdma_tasks);
83316485Sdavidcs
84316485Sdavidcs/**
85316485Sdavidcs * @brief ecore_cxt_cfg_ilt_compute - compute ILT init parameters
86316485Sdavidcs *
87316485Sdavidcs * @param p_hwfn
88316485Sdavidcs * @param last_line
89316485Sdavidcs *
90316485Sdavidcs * @return enum _ecore_status_t
91316485Sdavidcs */
92316485Sdavidcsenum _ecore_status_t ecore_cxt_cfg_ilt_compute(struct ecore_hwfn *p_hwfn,
93316485Sdavidcs					       u32 *last_line);
94316485Sdavidcs
95316485Sdavidcs/**
96316485Sdavidcs * @brief ecore_cxt_cfg_ilt_compute_excess - how many lines can be decreased
97316485Sdavidcs *
98316485Sdavidcs * @param p_hwfn
99316485Sdavidcs * @param used_lines
100316485Sdavidcs */
101316485Sdavidcsu32 ecore_cxt_cfg_ilt_compute_excess(struct ecore_hwfn *p_hwfn, u32 used_lines);
102316485Sdavidcs
103316485Sdavidcs/**
104316485Sdavidcs * @brief ecore_cxt_mngr_alloc - Allocate and init the context manager struct
105316485Sdavidcs *
106316485Sdavidcs * @param p_hwfn
107316485Sdavidcs *
108316485Sdavidcs * @return enum _ecore_status_t
109316485Sdavidcs */
110316485Sdavidcsenum _ecore_status_t ecore_cxt_mngr_alloc(struct ecore_hwfn *p_hwfn);
111316485Sdavidcs
112316485Sdavidcs/**
113316485Sdavidcs * @brief ecore_cxt_mngr_free
114316485Sdavidcs *
115316485Sdavidcs * @param p_hwfn
116316485Sdavidcs */
117316485Sdavidcsvoid ecore_cxt_mngr_free(struct ecore_hwfn *p_hwfn);
118316485Sdavidcs
119316485Sdavidcs/**
120316485Sdavidcs * @brief ecore_cxt_tables_alloc - Allocate ILT shadow, Searcher T2, acquired map
121316485Sdavidcs *
122316485Sdavidcs * @param p_hwfn
123316485Sdavidcs *
124316485Sdavidcs * @return enum _ecore_status_t
125316485Sdavidcs */
126316485Sdavidcsenum _ecore_status_t ecore_cxt_tables_alloc(struct ecore_hwfn *p_hwfn);
127316485Sdavidcs
128316485Sdavidcs/**
129316485Sdavidcs * @brief ecore_cxt_mngr_setup - Reset the acquired CIDs
130316485Sdavidcs *
131316485Sdavidcs * @param p_hwfn
132316485Sdavidcs */
133316485Sdavidcsvoid ecore_cxt_mngr_setup(struct ecore_hwfn *p_hwfn);
134316485Sdavidcs
135316485Sdavidcs/**
136316485Sdavidcs * @brief ecore_cxt_hw_init_common - Initailze ILT and DQ, common phase, per path.
137316485Sdavidcs *
138316485Sdavidcs * @param p_hwfn
139316485Sdavidcs */
140316485Sdavidcsvoid ecore_cxt_hw_init_common(struct ecore_hwfn *p_hwfn);
141316485Sdavidcs
142316485Sdavidcs/**
143316485Sdavidcs * @brief ecore_cxt_hw_init_pf - Initailze ILT and DQ, PF phase, per path.
144316485Sdavidcs *
145316485Sdavidcs * @param p_hwfn
146320164Sdavidcs * @param p_ptt
147316485Sdavidcs */
148320164Sdavidcsvoid ecore_cxt_hw_init_pf(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt);
149316485Sdavidcs
150316485Sdavidcs/**
151316485Sdavidcs * @brief ecore_qm_init_pf - Initailze the QM PF phase, per path
152316485Sdavidcs *
153316485Sdavidcs * @param p_hwfn
154320164Sdavidcs * @param p_ptt
155337517Sdavidcs * @param is_pf_loading
156316485Sdavidcs */
157337517Sdavidcsvoid ecore_qm_init_pf(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt,
158337517Sdavidcs		      bool is_pf_loading);
159316485Sdavidcs
160316485Sdavidcs /**
161316485Sdavidcs * @brief Reconfigures QM pf on the fly
162316485Sdavidcs *
163316485Sdavidcs * @param p_hwfn
164316485Sdavidcs * @param p_ptt
165316485Sdavidcs *
166316485Sdavidcs * @return enum _ecore_status_t
167316485Sdavidcs */
168316485Sdavidcsenum _ecore_status_t ecore_qm_reconf(struct ecore_hwfn *p_hwfn,
169316485Sdavidcs				     struct ecore_ptt *p_ptt);
170316485Sdavidcs
171316485Sdavidcs#define ECORE_CXT_PF_CID (0xff)
172316485Sdavidcs
173316485Sdavidcs/**
174316485Sdavidcs * @brief ecore_cxt_release - Release a cid
175316485Sdavidcs *
176316485Sdavidcs * @param p_hwfn
177316485Sdavidcs * @param cid
178316485Sdavidcs */
179316485Sdavidcsvoid ecore_cxt_release_cid(struct ecore_hwfn *p_hwfn, u32 cid);
180316485Sdavidcs
181316485Sdavidcs/**
182316485Sdavidcs * @brief ecore_cxt_release - Release a cid belonging to a vf-queue
183316485Sdavidcs *
184316485Sdavidcs * @param p_hwfn
185316485Sdavidcs * @param cid
186316485Sdavidcs * @param vfid - engine relative index. ECORE_CXT_PF_CID if belongs to PF
187316485Sdavidcs */
188316485Sdavidcsvoid _ecore_cxt_release_cid(struct ecore_hwfn *p_hwfn,
189316485Sdavidcs			    u32 cid, u8 vfid);
190316485Sdavidcs
191316485Sdavidcs/**
192316485Sdavidcs * @brief ecore_cxt_acquire - Acquire a new cid of a specific protocol type
193316485Sdavidcs *
194316485Sdavidcs * @param p_hwfn
195316485Sdavidcs * @param type
196316485Sdavidcs * @param p_cid
197316485Sdavidcs *
198316485Sdavidcs * @return enum _ecore_status_t
199316485Sdavidcs */
200316485Sdavidcsenum _ecore_status_t ecore_cxt_acquire_cid(struct ecore_hwfn *p_hwfn,
201316485Sdavidcs					   enum protocol_type type,
202316485Sdavidcs					   u32 *p_cid);
203316485Sdavidcs
204316485Sdavidcs/**
205316485Sdavidcs * @brief _ecore_cxt_acquire - Acquire a new cid of a specific protocol type
206316485Sdavidcs *                             for a vf-queue
207316485Sdavidcs *
208316485Sdavidcs * @param p_hwfn
209316485Sdavidcs * @param type
210316485Sdavidcs * @param p_cid
211316485Sdavidcs * @param vfid - engine relative index. ECORE_CXT_PF_CID if belongs to PF
212316485Sdavidcs *
213316485Sdavidcs * @return enum _ecore_status_t
214316485Sdavidcs */
215316485Sdavidcsenum _ecore_status_t _ecore_cxt_acquire_cid(struct ecore_hwfn *p_hwfn,
216316485Sdavidcs					    enum protocol_type type,
217316485Sdavidcs					    u32 *p_cid, u8 vfid);
218316485Sdavidcs
219316485Sdavidcs/**
220316485Sdavidcs * @brief ecore_cxt_get_tid_mem_info - function checks if the
221316485Sdavidcs *        page containing the iid in the ilt is already
222316485Sdavidcs *        allocated, if it is not it allocates the page.
223316485Sdavidcs *
224316485Sdavidcs * @param p_hwfn
225316485Sdavidcs * @param elem_type
226316485Sdavidcs * @param iid
227316485Sdavidcs *
228316485Sdavidcs * @return enum _ecore_status_t
229316485Sdavidcs */
230316485Sdavidcsenum _ecore_status_t
231316485Sdavidcsecore_cxt_dynamic_ilt_alloc(struct ecore_hwfn *p_hwfn,
232316485Sdavidcs			    enum ecore_cxt_elem_type elem_type,
233316485Sdavidcs			    u32 iid);
234316485Sdavidcs
235316485Sdavidcs/**
236316485Sdavidcs * @brief ecore_cxt_free_ilt_range - function frees ilt pages
237316485Sdavidcs *        associated with the protocol and element type passed.
238316485Sdavidcs *
239316485Sdavidcs * @param p_hwfn
240316485Sdavidcs * @param proto
241316485Sdavidcs *
242316485Sdavidcs * @return enum _ecore_status_t
243316485Sdavidcs */
244316485Sdavidcsenum _ecore_status_t
245316485Sdavidcsecore_cxt_free_ilt_range(struct ecore_hwfn *p_hwfn,
246316485Sdavidcs			 enum ecore_cxt_elem_type elem_type,
247316485Sdavidcs			 u32 start_iid, u32 count);
248316485Sdavidcs
249316485Sdavidcs#define ECORE_CTX_WORKING_MEM 0
250316485Sdavidcs#define ECORE_CTX_FL_MEM 1
251316485Sdavidcsenum _ecore_status_t ecore_cxt_get_task_ctx(struct ecore_hwfn *p_hwfn,
252316485Sdavidcs					    u32 tid,
253316485Sdavidcs					    u8 ctx_type,
254316485Sdavidcs					    void **task_ctx);
255316485Sdavidcs
256337517Sdavidcsu32 ecore_cxt_get_ilt_page_size(struct ecore_hwfn *p_hwfn,
257337517Sdavidcs				enum ilt_clients ilt_client);
258337517Sdavidcs
259337517Sdavidcsu32 ecore_cxt_get_total_srq_count(struct ecore_hwfn *p_hwfn);
260337517Sdavidcs
261316485Sdavidcs#endif /* _ECORE_CID_ */
262