xref: /dpdk/drivers/net/qede/base/ecore_int.h (revision 52fa735c22e14ee0a7b4f8e13751578207315072)
13126df22SRasesh Mody /* SPDX-License-Identifier: BSD-3-Clause
29adde217SRasesh Mody  * Copyright (c) 2016 - 2018 Cavium Inc.
3ec94dbc5SRasesh Mody  * All rights reserved.
49adde217SRasesh Mody  * www.cavium.com
5ec94dbc5SRasesh Mody  */
6ec94dbc5SRasesh Mody 
7ec94dbc5SRasesh Mody #ifndef __ECORE_INT_H__
8ec94dbc5SRasesh Mody #define __ECORE_INT_H__
9ec94dbc5SRasesh Mody 
10ec94dbc5SRasesh Mody #include "ecore.h"
11ec94dbc5SRasesh Mody #include "ecore_int_api.h"
12ec94dbc5SRasesh Mody 
13ec94dbc5SRasesh Mody #define ECORE_CAU_DEF_RX_TIMER_RES 0
14ec94dbc5SRasesh Mody #define ECORE_CAU_DEF_TX_TIMER_RES 0
15ec94dbc5SRasesh Mody 
16ec94dbc5SRasesh Mody #define ECORE_SB_ATT_IDX	0x0001
17ec94dbc5SRasesh Mody #define ECORE_SB_EVENT_MASK	0x0003
18ec94dbc5SRasesh Mody 
19ec94dbc5SRasesh Mody #define SB_ALIGNED_SIZE(p_hwfn) \
20*52fa735cSRasesh Mody 	ALIGNED_TYPE_SIZE(struct status_block, p_hwfn)
21ec94dbc5SRasesh Mody 
226e4fcea9SRasesh Mody #define ECORE_SB_INVALID_IDX	0xffff
236e4fcea9SRasesh Mody 
24ec94dbc5SRasesh Mody struct ecore_igu_block {
25ec94dbc5SRasesh Mody 	u8 status;
26ec94dbc5SRasesh Mody #define ECORE_IGU_STATUS_FREE	0x01
27ec94dbc5SRasesh Mody #define ECORE_IGU_STATUS_VALID	0x02
28ec94dbc5SRasesh Mody #define ECORE_IGU_STATUS_PF	0x04
296e4fcea9SRasesh Mody #define ECORE_IGU_STATUS_DSB	0x08
30ec94dbc5SRasesh Mody 
31ec94dbc5SRasesh Mody 	u8 vector_number;
32ec94dbc5SRasesh Mody 	u8 function_id;
33ec94dbc5SRasesh Mody 	u8 is_pf;
34ec94dbc5SRasesh Mody 
356e4fcea9SRasesh Mody 	/* Index inside IGU [meant for back reference] */
366e4fcea9SRasesh Mody 	u16 igu_sb_id;
376e4fcea9SRasesh Mody 
386e4fcea9SRasesh Mody 	struct ecore_sb_info *sb_info;
39ec94dbc5SRasesh Mody };
40ec94dbc5SRasesh Mody 
41ec94dbc5SRasesh Mody struct ecore_igu_info {
426e4fcea9SRasesh Mody 	struct ecore_igu_block entry[MAX_TOT_SB_PER_PATH];
43ec94dbc5SRasesh Mody 	u16 igu_dsb_id;
446e4fcea9SRasesh Mody 
456e4fcea9SRasesh Mody 	/* The numbers can shift when using APIs to switch SBs between PF and
466e4fcea9SRasesh Mody 	 * VF.
476e4fcea9SRasesh Mody 	 */
486e4fcea9SRasesh Mody 	struct ecore_sb_cnt_info usage;
496e4fcea9SRasesh Mody 
506e4fcea9SRasesh Mody 	/* Determine whether we can shift SBs between VFs and PFs */
516e4fcea9SRasesh Mody 	bool b_allow_pf_vf_change;
52ec94dbc5SRasesh Mody };
53ec94dbc5SRasesh Mody 
546e4fcea9SRasesh Mody /**
556e4fcea9SRasesh Mody  * @brief - Make sure the IGU CAM reflects the resources provided by MFW
566e4fcea9SRasesh Mody  *
576e4fcea9SRasesh Mody  * @param p_hwfn
586e4fcea9SRasesh Mody  * @param p_ptt
596e4fcea9SRasesh Mody  */
606e4fcea9SRasesh Mody int ecore_int_igu_reset_cam(struct ecore_hwfn *p_hwfn,
616e4fcea9SRasesh Mody 			    struct ecore_ptt *p_ptt);
626e4fcea9SRasesh Mody 
636e4fcea9SRasesh Mody /**
646e4fcea9SRasesh Mody  * @brief - Make sure IGU CAM reflects the default resources once again,
656e4fcea9SRasesh Mody  *          starting with a 'dirty' SW database.
666e4fcea9SRasesh Mody  * @param p_hwfn
676e4fcea9SRasesh Mody  * @param p_ptt
686e4fcea9SRasesh Mody  */
696e4fcea9SRasesh Mody int ecore_int_igu_reset_cam_default(struct ecore_hwfn *p_hwfn,
706e4fcea9SRasesh Mody 				    struct ecore_ptt *p_ptt);
716e4fcea9SRasesh Mody 
726e4fcea9SRasesh Mody /**
736e4fcea9SRasesh Mody  * @brief Translate the weakly-defined client sb-id into an IGU sb-id
746e4fcea9SRasesh Mody  *
756e4fcea9SRasesh Mody  * @param p_hwfn
766e4fcea9SRasesh Mody  * @param sb_id - user provided sb_id
776e4fcea9SRasesh Mody  *
786e4fcea9SRasesh Mody  * @return an index inside IGU CAM where the SB resides
796e4fcea9SRasesh Mody  */
806e4fcea9SRasesh Mody u16 ecore_get_igu_sb_id(struct ecore_hwfn *p_hwfn, u16 sb_id);
816e4fcea9SRasesh Mody 
826e4fcea9SRasesh Mody /**
836e4fcea9SRasesh Mody  * @brief return a pointer to an unused valid SB
846e4fcea9SRasesh Mody  *
856e4fcea9SRasesh Mody  * @param p_hwfn
866e4fcea9SRasesh Mody  * @param b_is_pf - true iff we want a SB belonging to a PF
876e4fcea9SRasesh Mody  *
886e4fcea9SRasesh Mody  * @return point to an igu_block, OSAL_NULL if none is available
896e4fcea9SRasesh Mody  */
906e4fcea9SRasesh Mody struct ecore_igu_block *
916e4fcea9SRasesh Mody ecore_get_igu_free_sb(struct ecore_hwfn *p_hwfn, bool b_is_pf);
92ec94dbc5SRasesh Mody /* TODO Names of function may change... */
93ec94dbc5SRasesh Mody void ecore_int_igu_init_pure_rt(struct ecore_hwfn *p_hwfn,
94ec94dbc5SRasesh Mody 				struct ecore_ptt *p_ptt,
95ec94dbc5SRasesh Mody 				bool b_set, bool b_slowpath);
96ec94dbc5SRasesh Mody 
97ec94dbc5SRasesh Mody void ecore_int_igu_init_rt(struct ecore_hwfn *p_hwfn);
98ec94dbc5SRasesh Mody 
99ec94dbc5SRasesh Mody /**
100ec94dbc5SRasesh Mody  * @brief ecore_int_igu_read_cam - Reads the IGU CAM.
101ec94dbc5SRasesh Mody  *	This function needs to be called during hardware
102ec94dbc5SRasesh Mody  *	prepare. It reads the info from igu cam to know which
103ec94dbc5SRasesh Mody  *	status block is the default / base status block etc.
104ec94dbc5SRasesh Mody  *
105ec94dbc5SRasesh Mody  * @param p_hwfn
106ec94dbc5SRasesh Mody  * @param p_ptt
107ec94dbc5SRasesh Mody  *
108ec94dbc5SRasesh Mody  * @return enum _ecore_status_t
109ec94dbc5SRasesh Mody  */
110ec94dbc5SRasesh Mody enum _ecore_status_t ecore_int_igu_read_cam(struct ecore_hwfn *p_hwfn,
111ec94dbc5SRasesh Mody 					    struct ecore_ptt *p_ptt);
112ec94dbc5SRasesh Mody 
113ec94dbc5SRasesh Mody typedef enum _ecore_status_t (*ecore_int_comp_cb_t) (struct ecore_hwfn *p_hwfn,
114ec94dbc5SRasesh Mody 						     void *cookie);
115ec94dbc5SRasesh Mody /**
116ec94dbc5SRasesh Mody  * @brief ecore_int_register_cb - Register callback func for
117ec94dbc5SRasesh Mody  *      slowhwfn statusblock.
118ec94dbc5SRasesh Mody  *
119ec94dbc5SRasesh Mody  *	Every protocol that uses the slowhwfn status block
120ec94dbc5SRasesh Mody  *	should register a callback function that will be called
121ec94dbc5SRasesh Mody  *	once there is an update of the sp status block.
122ec94dbc5SRasesh Mody  *
123ec94dbc5SRasesh Mody  * @param p_hwfn
124ec94dbc5SRasesh Mody  * @param comp_cb - function to be called when there is an
125ec94dbc5SRasesh Mody  *                  interrupt on the sp sb
126ec94dbc5SRasesh Mody  *
127ec94dbc5SRasesh Mody  * @param cookie  - passed to the callback function
128ec94dbc5SRasesh Mody  * @param sb_idx  - OUT parameter which gives the chosen index
129ec94dbc5SRasesh Mody  *                  for this protocol.
130ec94dbc5SRasesh Mody  * @param p_fw_cons  - pointer to the actual address of the
131ec94dbc5SRasesh Mody  *                     consumer for this protocol.
132ec94dbc5SRasesh Mody  *
133ec94dbc5SRasesh Mody  * @return enum _ecore_status_t
134ec94dbc5SRasesh Mody  */
135ec94dbc5SRasesh Mody enum _ecore_status_t ecore_int_register_cb(struct ecore_hwfn *p_hwfn,
136ec94dbc5SRasesh Mody 					   ecore_int_comp_cb_t comp_cb,
137ec94dbc5SRasesh Mody 					   void *cookie,
138ec94dbc5SRasesh Mody 					   u8 *sb_idx, __le16 **p_fw_cons);
139ec94dbc5SRasesh Mody /**
140ec94dbc5SRasesh Mody  * @brief ecore_int_unregister_cb - Unregisters callback
141ec94dbc5SRasesh Mody  *      function from sp sb.
142ec94dbc5SRasesh Mody  *      Partner of ecore_int_register_cb -> should be called
143ec94dbc5SRasesh Mody  *      when no longer required.
144ec94dbc5SRasesh Mody  *
145ec94dbc5SRasesh Mody  * @param p_hwfn
146ec94dbc5SRasesh Mody  * @param pi
147ec94dbc5SRasesh Mody  *
148ec94dbc5SRasesh Mody  * @return enum _ecore_status_t
149ec94dbc5SRasesh Mody  */
150ec94dbc5SRasesh Mody enum _ecore_status_t ecore_int_unregister_cb(struct ecore_hwfn *p_hwfn, u8 pi);
151ec94dbc5SRasesh Mody 
152ec94dbc5SRasesh Mody /**
153ec94dbc5SRasesh Mody  * @brief ecore_int_get_sp_sb_id - Get the slowhwfn sb id.
154ec94dbc5SRasesh Mody  *
155ec94dbc5SRasesh Mody  * @param p_hwfn
156ec94dbc5SRasesh Mody  *
157ec94dbc5SRasesh Mody  * @return u16
158ec94dbc5SRasesh Mody  */
159ec94dbc5SRasesh Mody u16 ecore_int_get_sp_sb_id(struct ecore_hwfn *p_hwfn);
160ec94dbc5SRasesh Mody 
161ec94dbc5SRasesh Mody /**
162ec94dbc5SRasesh Mody  * @brief Status block cleanup. Should be called for each status
163ec94dbc5SRasesh Mody  *        block that will be used -> both PF / VF
164ec94dbc5SRasesh Mody  *
165ec94dbc5SRasesh Mody  * @param p_hwfn
166ec94dbc5SRasesh Mody  * @param p_ptt
167ec94dbc5SRasesh Mody  * @param sb_id		- igu status block id
168ec94dbc5SRasesh Mody  * @param opaque	- opaque fid of the sb owner.
169ec94dbc5SRasesh Mody  * @param cleanup_set	- set(1) / clear(0)
170ec94dbc5SRasesh Mody  */
171ec94dbc5SRasesh Mody void ecore_int_igu_init_pure_rt_single(struct ecore_hwfn	*p_hwfn,
172ec94dbc5SRasesh Mody 				       struct ecore_ptt		*p_ptt,
1736e4fcea9SRasesh Mody 				       u16			sb_id,
1746e4fcea9SRasesh Mody 				       u16			opaque,
1756e4fcea9SRasesh Mody 				       bool			b_set);
176ec94dbc5SRasesh Mody 
177ec94dbc5SRasesh Mody /**
178ec94dbc5SRasesh Mody  * @brief ecore_int_cau_conf - configure cau for a given status
179ec94dbc5SRasesh Mody  *        block
180ec94dbc5SRasesh Mody  *
181ec94dbc5SRasesh Mody  * @param p_hwfn
182ec94dbc5SRasesh Mody  * @param ptt
183ec94dbc5SRasesh Mody  * @param sb_phys
184ec94dbc5SRasesh Mody  * @param igu_sb_id
185ec94dbc5SRasesh Mody  * @param vf_number
186ec94dbc5SRasesh Mody  * @param vf_valid
187ec94dbc5SRasesh Mody  */
188ec94dbc5SRasesh Mody void ecore_int_cau_conf_sb(struct ecore_hwfn *p_hwfn,
189ec94dbc5SRasesh Mody 			   struct ecore_ptt *p_ptt,
190ec94dbc5SRasesh Mody 			   dma_addr_t sb_phys,
191ec94dbc5SRasesh Mody 			   u16 igu_sb_id, u16 vf_number, u8 vf_valid);
192ec94dbc5SRasesh Mody 
193ec94dbc5SRasesh Mody /**
194ec94dbc5SRasesh Mody * @brief ecore_int_alloc
195ec94dbc5SRasesh Mody *
196ec94dbc5SRasesh Mody * @param p_hwfn
197ec94dbc5SRasesh Mody  * @param p_ptt
198ec94dbc5SRasesh Mody *
199ec94dbc5SRasesh Mody * @return enum _ecore_status_t
200ec94dbc5SRasesh Mody */
201ec94dbc5SRasesh Mody enum _ecore_status_t ecore_int_alloc(struct ecore_hwfn	*p_hwfn,
202ec94dbc5SRasesh Mody 				     struct ecore_ptt	*p_ptt);
203ec94dbc5SRasesh Mody 
204ec94dbc5SRasesh Mody /**
205ec94dbc5SRasesh Mody * @brief ecore_int_free
206ec94dbc5SRasesh Mody *
207ec94dbc5SRasesh Mody * @param p_hwfn
208ec94dbc5SRasesh Mody */
209ec94dbc5SRasesh Mody void ecore_int_free(struct ecore_hwfn *p_hwfn);
210ec94dbc5SRasesh Mody 
211ec94dbc5SRasesh Mody /**
212ec94dbc5SRasesh Mody * @brief ecore_int_setup
213ec94dbc5SRasesh Mody *
214ec94dbc5SRasesh Mody * @param p_hwfn
215ec94dbc5SRasesh Mody * @param p_ptt
216ec94dbc5SRasesh Mody */
217ec94dbc5SRasesh Mody void ecore_int_setup(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt);
218ec94dbc5SRasesh Mody 
219ec94dbc5SRasesh Mody /**
220ec94dbc5SRasesh Mody  * @brief - Enable Interrupt & Attention for hw function
221ec94dbc5SRasesh Mody  *
222ec94dbc5SRasesh Mody  * @param p_hwfn
223ec94dbc5SRasesh Mody  * @param p_ptt
224ec94dbc5SRasesh Mody  * @param int_mode
225ec94dbc5SRasesh Mody  *
226ec94dbc5SRasesh Mody * @return enum _ecore_status_t
227ec94dbc5SRasesh Mody  */
228ec94dbc5SRasesh Mody enum _ecore_status_t ecore_int_igu_enable(struct ecore_hwfn *p_hwfn,
229ec94dbc5SRasesh Mody 					  struct ecore_ptt *p_ptt,
230ec94dbc5SRasesh Mody 					  enum ecore_int_mode int_mode);
231ec94dbc5SRasesh Mody 
232ec94dbc5SRasesh Mody /**
233ec94dbc5SRasesh Mody  * @brief - Initialize CAU status block entry
234ec94dbc5SRasesh Mody  *
235ec94dbc5SRasesh Mody  * @param p_hwfn
236ec94dbc5SRasesh Mody  * @param p_sb_entry
237ec94dbc5SRasesh Mody  * @param pf_id
238ec94dbc5SRasesh Mody  * @param vf_number
239ec94dbc5SRasesh Mody  * @param vf_valid
240ec94dbc5SRasesh Mody  */
241ec94dbc5SRasesh Mody void ecore_init_cau_sb_entry(struct ecore_hwfn *p_hwfn,
242ec94dbc5SRasesh Mody 			     struct cau_sb_entry *p_sb_entry, u8 pf_id,
243ec94dbc5SRasesh Mody 			     u16 vf_number, u8 vf_valid);
244ec94dbc5SRasesh Mody 
24522d07d93SRasesh Mody enum _ecore_status_t ecore_int_set_timer_res(struct ecore_hwfn *p_hwfn,
24622d07d93SRasesh Mody 					     struct ecore_ptt *p_ptt,
24722d07d93SRasesh Mody 					     u8 timer_res, u16 sb_id, bool tx);
248ec94dbc5SRasesh Mody #ifndef ASIC_ONLY
249ec94dbc5SRasesh Mody #define ECORE_MAPPING_MEMORY_SIZE(dev) \
250ec94dbc5SRasesh Mody 	((CHIP_REV_IS_SLOW(dev) && (!(dev)->b_is_emul_full)) ? \
251ec94dbc5SRasesh Mody 	 136 : NUM_OF_SBS(dev))
252ec94dbc5SRasesh Mody #else
253ec94dbc5SRasesh Mody #define ECORE_MAPPING_MEMORY_SIZE(dev) NUM_OF_SBS(dev)
254ec94dbc5SRasesh Mody #endif
255ec94dbc5SRasesh Mody 
25660c78a5eSRasesh Mody enum _ecore_status_t ecore_pglueb_rbc_attn_handler(struct ecore_hwfn *p_hwfn,
25752c5f7b5SRasesh Mody 						   struct ecore_ptt *p_ptt,
25852c5f7b5SRasesh Mody 						   bool is_hw_init);
259797ce8eeSShahed Shaikh void ecore_pf_flr_igu_cleanup(struct ecore_hwfn *p_hwfn);
26060c78a5eSRasesh Mody 
261ec94dbc5SRasesh Mody #endif /* __ECORE_INT_H__ */
262