xref: /dpdk/drivers/net/qede/base/ecore_spq.h (revision 5018f1fc5f18d517c672559d4cc74784a579e037)
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_SPQ_H__
8ec94dbc5SRasesh Mody #define __ECORE_SPQ_H__
9ec94dbc5SRasesh Mody 
10ec94dbc5SRasesh Mody #include "ecore_hsi_common.h"
11ec94dbc5SRasesh Mody #include "ecore_status.h"
12ec94dbc5SRasesh Mody #include "ecore_hsi_eth.h"
13ec94dbc5SRasesh Mody #include "ecore_chain.h"
14ec94dbc5SRasesh Mody #include "ecore_sp_api.h"
15ec94dbc5SRasesh Mody 
16ec94dbc5SRasesh Mody union ramrod_data {
17ec94dbc5SRasesh Mody 	struct pf_start_ramrod_data			pf_start;
18ec94dbc5SRasesh Mody 	struct pf_update_ramrod_data			pf_update;
1922d07d93SRasesh Mody 	struct rl_update_ramrod_data			rl_update;
20ec94dbc5SRasesh Mody 	struct rx_queue_start_ramrod_data		rx_queue_start;
21ec94dbc5SRasesh Mody 	struct rx_queue_update_ramrod_data		rx_queue_update;
22ec94dbc5SRasesh Mody 	struct rx_queue_stop_ramrod_data		rx_queue_stop;
23ec94dbc5SRasesh Mody 	struct tx_queue_start_ramrod_data		tx_queue_start;
24ec94dbc5SRasesh Mody 	struct tx_queue_stop_ramrod_data		tx_queue_stop;
25ec94dbc5SRasesh Mody 	struct vport_start_ramrod_data			vport_start;
26ec94dbc5SRasesh Mody 	struct vport_stop_ramrod_data			vport_stop;
2753437002SHarish Patil 	struct rx_update_gft_filter_data		rx_update_gft;
28ec94dbc5SRasesh Mody 	struct vport_update_ramrod_data			vport_update;
29ec94dbc5SRasesh Mody 	struct core_rx_start_ramrod_data		core_rx_queue_start;
30ec94dbc5SRasesh Mody 	struct core_rx_stop_ramrod_data			core_rx_queue_stop;
31ec94dbc5SRasesh Mody 	struct core_tx_start_ramrod_data		core_tx_queue_start;
32ec94dbc5SRasesh Mody 	struct core_tx_stop_ramrod_data			core_tx_queue_stop;
33ec94dbc5SRasesh Mody 	struct vport_filter_update_ramrod_data		vport_filter_update;
34ec94dbc5SRasesh Mody 
35ec94dbc5SRasesh Mody 	struct vf_start_ramrod_data			vf_start;
36ec94dbc5SRasesh Mody 	struct vf_stop_ramrod_data			vf_stop;
37ec94dbc5SRasesh Mody };
38ec94dbc5SRasesh Mody 
39ec94dbc5SRasesh Mody #define EQ_MAX_CREDIT	0xffffffff
40ec94dbc5SRasesh Mody 
41ec94dbc5SRasesh Mody enum spq_priority {
42ec94dbc5SRasesh Mody 	ECORE_SPQ_PRIORITY_NORMAL,
43ec94dbc5SRasesh Mody 	ECORE_SPQ_PRIORITY_HIGH,
44ec94dbc5SRasesh Mody };
45ec94dbc5SRasesh Mody 
46ec94dbc5SRasesh Mody union ecore_spq_req_comp {
47ec94dbc5SRasesh Mody 	struct ecore_spq_comp_cb cb;
48ec94dbc5SRasesh Mody 	u64			 *done_addr;
49ec94dbc5SRasesh Mody };
50ec94dbc5SRasesh Mody 
51ec94dbc5SRasesh Mody /* SPQ_MODE_EBLOCK */
52ec94dbc5SRasesh Mody struct ecore_spq_comp_done {
53ec94dbc5SRasesh Mody 	u64 done;
54ec94dbc5SRasesh Mody 	u8  fw_return_code;
55ec94dbc5SRasesh Mody };
56ec94dbc5SRasesh Mody 
57ec94dbc5SRasesh Mody struct ecore_spq_entry {
58ec94dbc5SRasesh Mody 	osal_list_entry_t		list;
59ec94dbc5SRasesh Mody 
60ec94dbc5SRasesh Mody 	u8				flags;
61ec94dbc5SRasesh Mody 
62ec94dbc5SRasesh Mody 	/* HSI slow path element */
63ec94dbc5SRasesh Mody 	struct slow_path_element	elem;
64ec94dbc5SRasesh Mody 
65ec94dbc5SRasesh Mody 	union ramrod_data		ramrod;
66ec94dbc5SRasesh Mody 
67ec94dbc5SRasesh Mody 	enum spq_priority		priority;
68ec94dbc5SRasesh Mody 
69ec94dbc5SRasesh Mody 	/* pending queue for this entry */
70ec94dbc5SRasesh Mody 	osal_list_t			*queue;
71ec94dbc5SRasesh Mody 
72ec94dbc5SRasesh Mody 	enum spq_mode			comp_mode;
73ec94dbc5SRasesh Mody 	struct ecore_spq_comp_cb	comp_cb;
74ec94dbc5SRasesh Mody 	struct ecore_spq_comp_done	comp_done; /* SPQ_MODE_EBLOCK */
75ec94dbc5SRasesh Mody };
76ec94dbc5SRasesh Mody 
77ec94dbc5SRasesh Mody struct ecore_eq {
78ec94dbc5SRasesh Mody 	struct ecore_chain	chain;
79ec94dbc5SRasesh Mody 	u8			eq_sb_index;	/* index within the SB */
80ec94dbc5SRasesh Mody 	__le16			*p_fw_cons;	/* ptr to index value */
81ec94dbc5SRasesh Mody };
82ec94dbc5SRasesh Mody 
83ec94dbc5SRasesh Mody struct ecore_consq {
84ec94dbc5SRasesh Mody 	struct ecore_chain	chain;
85ec94dbc5SRasesh Mody };
86ec94dbc5SRasesh Mody 
877f474588SRasesh Mody typedef enum _ecore_status_t
887f474588SRasesh Mody (*ecore_spq_async_comp_cb)(struct ecore_hwfn *p_hwfn,
897f474588SRasesh Mody 			   u8 opcode,
907f474588SRasesh Mody 			   u16 echo,
917f474588SRasesh Mody 			   union event_ring_data *data,
927f474588SRasesh Mody 			   u8 fw_return_code);
937f474588SRasesh Mody 
947f474588SRasesh Mody enum _ecore_status_t
957f474588SRasesh Mody ecore_spq_register_async_cb(struct ecore_hwfn *p_hwfn,
967f474588SRasesh Mody 			    enum protocol_type protocol_id,
977f474588SRasesh Mody 			    ecore_spq_async_comp_cb cb);
987f474588SRasesh Mody 
997f474588SRasesh Mody void
1007f474588SRasesh Mody ecore_spq_unregister_async_cb(struct ecore_hwfn *p_hwfn,
1017f474588SRasesh Mody 			      enum protocol_type protocol_id);
1027f474588SRasesh Mody 
103ec94dbc5SRasesh Mody struct ecore_spq {
104ec94dbc5SRasesh Mody 	osal_spinlock_t			lock;
105ec94dbc5SRasesh Mody 
106ec94dbc5SRasesh Mody 	osal_list_t			unlimited_pending;
107ec94dbc5SRasesh Mody 	osal_list_t			pending;
108ec94dbc5SRasesh Mody 	osal_list_t			completion_pending;
109ec94dbc5SRasesh Mody 	osal_list_t			free_pool;
110ec94dbc5SRasesh Mody 
111ec94dbc5SRasesh Mody 	struct ecore_chain		chain;
112ec94dbc5SRasesh Mody 
113ec94dbc5SRasesh Mody 	/* allocated dma-able memory for spq entries (+ramrod data) */
114ec94dbc5SRasesh Mody 	dma_addr_t			p_phys;
115ec94dbc5SRasesh Mody 	struct ecore_spq_entry		*p_virt;
116ec94dbc5SRasesh Mody 
1172d52085eSRasesh Mody 	/* SPQ max sleep iterations used in __ecore_spq_block() */
1182d52085eSRasesh Mody 	u32				block_sleep_max_iter;
1192d52085eSRasesh Mody 
120ec94dbc5SRasesh Mody 	/* Bitmap for handling out-of-order completions */
121ec94dbc5SRasesh Mody #define SPQ_RING_SIZE		\
122ec94dbc5SRasesh Mody 	(CORE_SPQE_PAGE_SIZE_BYTES / sizeof(struct slow_path_element))
12322d07d93SRasesh Mody /* BITS_PER_LONG */
124*5018f1fcSJoyce Kong #define SPQ_COMP_BMAP_SIZE	(SPQ_RING_SIZE / (sizeof(u32) * 8))
125*5018f1fcSJoyce Kong 	u32			p_comp_bitmap[SPQ_COMP_BMAP_SIZE];
126ec94dbc5SRasesh Mody 	u8			comp_bitmap_idx;
127ec94dbc5SRasesh Mody #define SPQ_COMP_BMAP_SET_BIT(p_spq, idx)				\
128ec94dbc5SRasesh Mody 	(OSAL_SET_BIT(((idx) % SPQ_RING_SIZE), (p_spq)->p_comp_bitmap))
129ec94dbc5SRasesh Mody 
130ec94dbc5SRasesh Mody #define SPQ_COMP_BMAP_CLEAR_BIT(p_spq, idx)				\
131ec94dbc5SRasesh Mody 	(OSAL_CLEAR_BIT(((idx) % SPQ_RING_SIZE), (p_spq)->p_comp_bitmap))
132ec94dbc5SRasesh Mody 
133*5018f1fcSJoyce Kong #define SPQ_COMP_BMAP_GET_BIT(p_spq, idx)	\
134*5018f1fcSJoyce Kong 	(OSAL_GET_BIT(((idx) % SPQ_RING_SIZE), (p_spq)->p_comp_bitmap))
135ec94dbc5SRasesh Mody 
136ec94dbc5SRasesh Mody 	/* Statistics */
137ec94dbc5SRasesh Mody 	u32				unlimited_pending_count;
138ec94dbc5SRasesh Mody 	u32				normal_count;
139ec94dbc5SRasesh Mody 	u32				high_count;
140ec94dbc5SRasesh Mody 	u32				comp_sent_count;
141ec94dbc5SRasesh Mody 	u32				comp_count;
142ec94dbc5SRasesh Mody 
143ec94dbc5SRasesh Mody 	u32				cid;
144e916697fSRasesh Mody 
145e916697fSRasesh Mody 	u32				db_addr_offset;
146e916697fSRasesh Mody 	struct core_db_data		db_data;
1477f474588SRasesh Mody 	ecore_spq_async_comp_cb		async_comp_cb[MAX_PROTOCOL_TYPE];
148ec94dbc5SRasesh Mody };
149ec94dbc5SRasesh Mody 
150ec94dbc5SRasesh Mody struct ecore_port;
151ec94dbc5SRasesh Mody struct ecore_hwfn;
152ec94dbc5SRasesh Mody 
153ec94dbc5SRasesh Mody /**
1542d52085eSRasesh Mody  * @brief ecore_set_spq_block_timeout - calculates the maximum sleep
1552d52085eSRasesh Mody  * iterations used in __ecore_spq_block();
1562d52085eSRasesh Mody  *
1572d52085eSRasesh Mody  * @param p_hwfn
1582d52085eSRasesh Mody  * @param spq_timeout_ms
1592d52085eSRasesh Mody  */
1602d52085eSRasesh Mody void ecore_set_spq_block_timeout(struct ecore_hwfn *p_hwfn,
1612d52085eSRasesh Mody 				 u32 spq_timeout_ms);
1622d52085eSRasesh Mody 
1632d52085eSRasesh Mody /**
164ec94dbc5SRasesh Mody  * @brief ecore_spq_post - Posts a Slow hwfn request to FW, or lacking that
165ec94dbc5SRasesh Mody  *        Pends it to the future list.
166ec94dbc5SRasesh Mody  *
167ec94dbc5SRasesh Mody  * @param p_hwfn
168ec94dbc5SRasesh Mody  * @param p_req
169ec94dbc5SRasesh Mody  *
170ec94dbc5SRasesh Mody  * @return enum _ecore_status_t
171ec94dbc5SRasesh Mody  */
172ec94dbc5SRasesh Mody enum _ecore_status_t ecore_spq_post(struct ecore_hwfn	   *p_hwfn,
173ec94dbc5SRasesh Mody 				    struct ecore_spq_entry *p_ent,
174ec94dbc5SRasesh Mody 				    u8                     *fw_return_code);
175ec94dbc5SRasesh Mody 
176ec94dbc5SRasesh Mody /**
177ec94dbc5SRasesh Mody  * @brief ecore_spq_allocate - Alloocates & initializes the SPQ and EQ.
178ec94dbc5SRasesh Mody  *
179ec94dbc5SRasesh Mody  * @param p_hwfn
180ec94dbc5SRasesh Mody  *
181ec94dbc5SRasesh Mody  * @return enum _ecore_status_t
182ec94dbc5SRasesh Mody  */
183ec94dbc5SRasesh Mody enum _ecore_status_t ecore_spq_alloc(struct ecore_hwfn	*p_hwfn);
184ec94dbc5SRasesh Mody 
185ec94dbc5SRasesh Mody /**
186ec94dbc5SRasesh Mody  * @brief ecore_spq_setup - Reset the SPQ to its start state.
187ec94dbc5SRasesh Mody  *
188ec94dbc5SRasesh Mody  * @param p_hwfn
189ec94dbc5SRasesh Mody  */
190ec94dbc5SRasesh Mody void ecore_spq_setup(struct ecore_hwfn *p_hwfn);
191ec94dbc5SRasesh Mody 
192ec94dbc5SRasesh Mody /**
193ec94dbc5SRasesh Mody  * @brief ecore_spq_deallocate - Deallocates the given SPQ struct.
194ec94dbc5SRasesh Mody  *
195ec94dbc5SRasesh Mody  * @param p_hwfn
196ec94dbc5SRasesh Mody  */
197ec94dbc5SRasesh Mody void ecore_spq_free(struct ecore_hwfn *p_hwfn);
198ec94dbc5SRasesh Mody 
199ec94dbc5SRasesh Mody /**
200ec94dbc5SRasesh Mody  * @brief ecore_spq_get_entry - Obtain an entrry from the spq
201ec94dbc5SRasesh Mody  *        free pool list.
202ec94dbc5SRasesh Mody  *
203ec94dbc5SRasesh Mody  *
204ec94dbc5SRasesh Mody  *
205ec94dbc5SRasesh Mody  * @param p_hwfn
206ec94dbc5SRasesh Mody  * @param pp_ent
207ec94dbc5SRasesh Mody  *
208ec94dbc5SRasesh Mody  * @return enum _ecore_status_t
209ec94dbc5SRasesh Mody  */
210ec94dbc5SRasesh Mody enum _ecore_status_t
2119455b556SRasesh Mody ecore_spq_get_entry(struct ecore_hwfn		*p_hwfn,
2129455b556SRasesh Mody 		    struct ecore_spq_entry	**pp_ent);
213ec94dbc5SRasesh Mody 
214ec94dbc5SRasesh Mody /**
215ec94dbc5SRasesh Mody  * @brief ecore_spq_return_entry - Return an entry to spq free
216ec94dbc5SRasesh Mody  *                                 pool list
217ec94dbc5SRasesh Mody  *
218ec94dbc5SRasesh Mody  * @param p_hwfn
219ec94dbc5SRasesh Mody  * @param p_ent
220ec94dbc5SRasesh Mody  */
221ec94dbc5SRasesh Mody void ecore_spq_return_entry(struct ecore_hwfn		*p_hwfn,
222ec94dbc5SRasesh Mody 			    struct ecore_spq_entry      *p_ent);
223ec94dbc5SRasesh Mody /**
224ec94dbc5SRasesh Mody  * @brief ecore_eq_allocate - Allocates & initializes an EQ struct
225ec94dbc5SRasesh Mody  *
226ec94dbc5SRasesh Mody  * @param p_hwfn
227ec94dbc5SRasesh Mody  * @param num_elem number of elements in the eq
228ec94dbc5SRasesh Mody  *
229d411a2b5SRasesh Mody  * @return enum _ecore_status_t
230ec94dbc5SRasesh Mody  */
231d411a2b5SRasesh Mody enum _ecore_status_t ecore_eq_alloc(struct ecore_hwfn	*p_hwfn, u16 num_elem);
232ec94dbc5SRasesh Mody 
233ec94dbc5SRasesh Mody /**
234d411a2b5SRasesh Mody  * @brief ecore_eq_setup - Reset the EQ to its start state.
235ec94dbc5SRasesh Mody  *
236ec94dbc5SRasesh Mody  * @param p_hwfn
237ec94dbc5SRasesh Mody  */
238d411a2b5SRasesh Mody void ecore_eq_setup(struct ecore_hwfn *p_hwfn);
239ec94dbc5SRasesh Mody 
240ec94dbc5SRasesh Mody /**
241d411a2b5SRasesh Mody  * @brief ecore_eq_free - deallocates the given EQ struct.
242ec94dbc5SRasesh Mody  *
243ec94dbc5SRasesh Mody  * @param p_hwfn
244ec94dbc5SRasesh Mody  */
245d411a2b5SRasesh Mody void ecore_eq_free(struct ecore_hwfn *p_hwfn);
246ec94dbc5SRasesh Mody 
247ec94dbc5SRasesh Mody /**
248ec94dbc5SRasesh Mody  * @brief ecore_eq_prod_update - update the FW with default EQ producer
249ec94dbc5SRasesh Mody  *
250ec94dbc5SRasesh Mody  * @param p_hwfn
251ec94dbc5SRasesh Mody  * @param prod
252ec94dbc5SRasesh Mody  */
2539455b556SRasesh Mody void ecore_eq_prod_update(struct ecore_hwfn	*p_hwfn,
2549455b556SRasesh Mody 			  u16			prod);
255ec94dbc5SRasesh Mody 
256ec94dbc5SRasesh Mody /**
257ec94dbc5SRasesh Mody  * @brief ecore_eq_completion - Completes currently pending EQ elements
258ec94dbc5SRasesh Mody  *
259ec94dbc5SRasesh Mody  * @param p_hwfn
260ec94dbc5SRasesh Mody  * @param cookie
261ec94dbc5SRasesh Mody  *
262ec94dbc5SRasesh Mody  * @return enum _ecore_status_t
263ec94dbc5SRasesh Mody  */
264ec94dbc5SRasesh Mody enum _ecore_status_t ecore_eq_completion(struct ecore_hwfn	*p_hwfn,
265ec94dbc5SRasesh Mody 					 void			*cookie);
266ec94dbc5SRasesh Mody 
267ec94dbc5SRasesh Mody /**
268ec94dbc5SRasesh Mody  * @brief ecore_spq_completion - Completes a single event
269ec94dbc5SRasesh Mody  *
270ec94dbc5SRasesh Mody  * @param p_hwfn
271ec94dbc5SRasesh Mody  * @param echo - echo value from cookie (used for determining completion)
272ec94dbc5SRasesh Mody  * @param p_data - data from cookie (used in callback function if applicable)
273ec94dbc5SRasesh Mody  *
274ec94dbc5SRasesh Mody  * @return enum _ecore_status_t
275ec94dbc5SRasesh Mody  */
276ec94dbc5SRasesh Mody enum _ecore_status_t ecore_spq_completion(struct ecore_hwfn	*p_hwfn,
277ec94dbc5SRasesh Mody 					  __le16		echo,
278ec94dbc5SRasesh Mody 					  u8                    fw_return_code,
279ec94dbc5SRasesh Mody 					  union event_ring_data	*p_data);
280ec94dbc5SRasesh Mody 
281ec94dbc5SRasesh Mody /**
282ec94dbc5SRasesh Mody  * @brief ecore_spq_get_cid - Given p_hwfn, return cid for the hwfn's SPQ
283ec94dbc5SRasesh Mody  *
284ec94dbc5SRasesh Mody  * @param p_hwfn
285ec94dbc5SRasesh Mody  *
286ec94dbc5SRasesh Mody  * @return u32 - SPQ CID
287ec94dbc5SRasesh Mody  */
288ec94dbc5SRasesh Mody u32 ecore_spq_get_cid(struct ecore_hwfn *p_hwfn);
289ec94dbc5SRasesh Mody 
290ec94dbc5SRasesh Mody /**
291d411a2b5SRasesh Mody  * @brief ecore_consq_alloc - Allocates & initializes an ConsQ struct
292ec94dbc5SRasesh Mody  *
293ec94dbc5SRasesh Mody  * @param p_hwfn
294ec94dbc5SRasesh Mody  *
295d411a2b5SRasesh Mody  * @return enum _ecore_status_t
296ec94dbc5SRasesh Mody  */
297d411a2b5SRasesh Mody enum _ecore_status_t ecore_consq_alloc(struct ecore_hwfn *p_hwfn);
298ec94dbc5SRasesh Mody 
299ec94dbc5SRasesh Mody /**
300d411a2b5SRasesh Mody  * @brief ecore_consq_setup - Reset the ConsQ to its start state.
301ec94dbc5SRasesh Mody  *
302ec94dbc5SRasesh Mody  * @param p_hwfn
303ec94dbc5SRasesh Mody  */
304d411a2b5SRasesh Mody void ecore_consq_setup(struct ecore_hwfn *p_hwfn);
305ec94dbc5SRasesh Mody 
306ec94dbc5SRasesh Mody /**
307ec94dbc5SRasesh Mody  * @brief ecore_consq_free - deallocates the given ConsQ struct.
308ec94dbc5SRasesh Mody  *
309ec94dbc5SRasesh Mody  * @param p_hwfn
310ec94dbc5SRasesh Mody  */
311d411a2b5SRasesh Mody void ecore_consq_free(struct ecore_hwfn *p_hwfn);
312ec94dbc5SRasesh Mody 
313ec94dbc5SRasesh Mody #endif /* __ECORE_SPQ_H__ */
314