1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
2 /* QLogic qed NIC Driver
3  * Copyright (c) 2015-2017  QLogic Corporation
4  * Copyright (c) 2019-2020 Marvell International Ltd.
5  */
6 
7 #ifndef _QED_SP_H
8 #define _QED_SP_H
9 
10 #include <linux/types.h>
11 #include <linux/kernel.h>
12 #include <linux/list.h>
13 #include <linux/slab.h>
14 #include <linux/spinlock.h>
15 #include <linux/qed/qed_chain.h>
16 #include "qed.h"
17 #include "qed_hsi.h"
18 
19 enum spq_mode {
20 	QED_SPQ_MODE_BLOCK,     /* Client will poll a designated mem. address */
21 	QED_SPQ_MODE_CB,        /* Client supplies a callback */
22 	QED_SPQ_MODE_EBLOCK,    /* QED should block until completion */
23 };
24 
25 struct qed_spq_comp_cb {
26 	void	(*function)(struct qed_hwfn *,
27 			    void *,
28 			    union event_ring_data *,
29 			    u8 fw_return_code);
30 	void	*cookie;
31 };
32 
33 /**
34  * @brief qed_eth_cqe_completion - handles the completion of a
35  *        ramrod on the cqe ring
36  *
37  * @param p_hwfn
38  * @param cqe
39  *
40  * @return int
41  */
42 int qed_eth_cqe_completion(struct qed_hwfn *p_hwfn,
43 			   struct eth_slow_path_rx_cqe *cqe);
44 
45 /**
46  *  @file
47  *
48  *  QED Slow-hwfn queue interface
49  */
50 
51 union ramrod_data {
52 	struct pf_start_ramrod_data pf_start;
53 	struct pf_update_ramrod_data pf_update;
54 	struct rx_queue_start_ramrod_data rx_queue_start;
55 	struct rx_queue_update_ramrod_data rx_queue_update;
56 	struct rx_queue_stop_ramrod_data rx_queue_stop;
57 	struct tx_queue_start_ramrod_data tx_queue_start;
58 	struct tx_queue_stop_ramrod_data tx_queue_stop;
59 	struct vport_start_ramrod_data vport_start;
60 	struct vport_stop_ramrod_data vport_stop;
61 	struct rx_update_gft_filter_data rx_update_gft;
62 	struct vport_update_ramrod_data vport_update;
63 	struct core_rx_start_ramrod_data core_rx_queue_start;
64 	struct core_rx_stop_ramrod_data core_rx_queue_stop;
65 	struct core_tx_start_ramrod_data core_tx_queue_start;
66 	struct core_tx_stop_ramrod_data core_tx_queue_stop;
67 	struct vport_filter_update_ramrod_data vport_filter_update;
68 
69 	struct rdma_init_func_ramrod_data rdma_init_func;
70 	struct rdma_close_func_ramrod_data rdma_close_func;
71 	struct rdma_register_tid_ramrod_data rdma_register_tid;
72 	struct rdma_deregister_tid_ramrod_data rdma_deregister_tid;
73 	struct roce_create_qp_resp_ramrod_data roce_create_qp_resp;
74 	struct roce_create_qp_req_ramrod_data roce_create_qp_req;
75 	struct roce_modify_qp_resp_ramrod_data roce_modify_qp_resp;
76 	struct roce_modify_qp_req_ramrod_data roce_modify_qp_req;
77 	struct roce_query_qp_resp_ramrod_data roce_query_qp_resp;
78 	struct roce_query_qp_req_ramrod_data roce_query_qp_req;
79 	struct roce_destroy_qp_resp_ramrod_data roce_destroy_qp_resp;
80 	struct roce_destroy_qp_req_ramrod_data roce_destroy_qp_req;
81 	struct roce_init_func_ramrod_data roce_init_func;
82 	struct rdma_create_cq_ramrod_data rdma_create_cq;
83 	struct rdma_destroy_cq_ramrod_data rdma_destroy_cq;
84 	struct rdma_srq_create_ramrod_data rdma_create_srq;
85 	struct rdma_srq_destroy_ramrod_data rdma_destroy_srq;
86 	struct rdma_srq_modify_ramrod_data rdma_modify_srq;
87 	struct iwarp_create_qp_ramrod_data iwarp_create_qp;
88 	struct iwarp_tcp_offload_ramrod_data iwarp_tcp_offload;
89 	struct iwarp_mpa_offload_ramrod_data iwarp_mpa_offload;
90 	struct iwarp_modify_qp_ramrod_data iwarp_modify_qp;
91 	struct iwarp_init_func_ramrod_data iwarp_init_func;
92 	struct fcoe_init_ramrod_params fcoe_init;
93 	struct fcoe_conn_offload_ramrod_params fcoe_conn_ofld;
94 	struct fcoe_conn_terminate_ramrod_params fcoe_conn_terminate;
95 	struct fcoe_stat_ramrod_params fcoe_stat;
96 
97 	struct iscsi_init_ramrod_params iscsi_init;
98 	struct iscsi_spe_conn_offload iscsi_conn_offload;
99 	struct iscsi_conn_update_ramrod_params iscsi_conn_update;
100 	struct iscsi_spe_conn_mac_update iscsi_conn_mac_update;
101 	struct iscsi_spe_conn_termination iscsi_conn_terminate;
102 
103 	struct nvmetcp_init_ramrod_params nvmetcp_init;
104 	struct nvmetcp_spe_conn_offload nvmetcp_conn_offload;
105 	struct nvmetcp_conn_update_ramrod_params nvmetcp_conn_update;
106 	struct nvmetcp_spe_conn_termination nvmetcp_conn_terminate;
107 
108 	struct vf_start_ramrod_data vf_start;
109 	struct vf_stop_ramrod_data vf_stop;
110 };
111 
112 #define EQ_MAX_CREDIT   0xffffffff
113 
114 enum spq_priority {
115 	QED_SPQ_PRIORITY_NORMAL,
116 	QED_SPQ_PRIORITY_HIGH,
117 };
118 
119 union qed_spq_req_comp {
120 	struct qed_spq_comp_cb	cb;
121 	u64			*done_addr;
122 };
123 
124 struct qed_spq_comp_done {
125 	unsigned int	done;
126 	u8		fw_return_code;
127 };
128 
129 struct qed_spq_entry {
130 	struct list_head		list;
131 
132 	u8				flags;
133 
134 	/* HSI slow path element */
135 	struct slow_path_element	elem;
136 
137 	union ramrod_data		ramrod;
138 
139 	enum spq_priority		priority;
140 
141 	/* pending queue for this entry */
142 	struct list_head		*queue;
143 
144 	enum spq_mode			comp_mode;
145 	struct qed_spq_comp_cb		comp_cb;
146 	struct qed_spq_comp_done	comp_done; /* SPQ_MODE_EBLOCK */
147 
148 	/* Posted entry for unlimited list entry in EBLOCK mode */
149 	struct qed_spq_entry		*post_ent;
150 };
151 
152 struct qed_eq {
153 	struct qed_chain	chain;
154 	u8			eq_sb_index;    /* index within the SB */
155 	__le16			*p_fw_cons;     /* ptr to index value */
156 };
157 
158 struct qed_consq {
159 	struct qed_chain chain;
160 };
161 
162 typedef int (*qed_spq_async_comp_cb)(struct qed_hwfn *p_hwfn, u8 opcode,
163 				     __le16 echo, union event_ring_data *data,
164 				     u8 fw_return_code);
165 
166 int
167 qed_spq_register_async_cb(struct qed_hwfn *p_hwfn,
168 			  enum protocol_type protocol_id,
169 			  qed_spq_async_comp_cb cb);
170 
171 void
172 qed_spq_unregister_async_cb(struct qed_hwfn *p_hwfn,
173 			    enum protocol_type protocol_id);
174 
175 struct qed_spq {
176 	spinlock_t		lock; /* SPQ lock */
177 
178 	struct list_head	unlimited_pending;
179 	struct list_head	pending;
180 	struct list_head	completion_pending;
181 	struct list_head	free_pool;
182 
183 	struct qed_chain	chain;
184 
185 	/* allocated dma-able memory for spq entries (+ramrod data) */
186 	dma_addr_t		p_phys;
187 	struct qed_spq_entry	*p_virt;
188 
189 #define SPQ_RING_SIZE \
190 	(CORE_SPQE_PAGE_SIZE_BYTES / sizeof(struct slow_path_element))
191 
192 	/* Bitmap for handling out-of-order completions */
193 	DECLARE_BITMAP(p_comp_bitmap, SPQ_RING_SIZE);
194 	u8			comp_bitmap_idx;
195 
196 	/* Statistics */
197 	u32			unlimited_pending_count;
198 	u32			normal_count;
199 	u32			high_count;
200 	u32			comp_sent_count;
201 	u32			comp_count;
202 
203 	u32			cid;
204 	u32			db_addr_offset;
205 	struct core_db_data	db_data;
206 	qed_spq_async_comp_cb	async_comp_cb[MAX_PROTOCOL_TYPE];
207 };
208 
209 /**
210  * @brief qed_spq_post - Posts a Slow hwfn request to FW, or lacking that
211  *        Pends it to the future list.
212  *
213  * @param p_hwfn
214  * @param p_req
215  *
216  * @return int
217  */
218 int qed_spq_post(struct qed_hwfn *p_hwfn,
219 		 struct qed_spq_entry *p_ent,
220 		 u8 *fw_return_code);
221 
222 /**
223  * @brief qed_spq_allocate - Alloocates & initializes the SPQ and EQ.
224  *
225  * @param p_hwfn
226  *
227  * @return int
228  */
229 int qed_spq_alloc(struct qed_hwfn *p_hwfn);
230 
231 /**
232  * @brief qed_spq_setup - Reset the SPQ to its start state.
233  *
234  * @param p_hwfn
235  */
236 void qed_spq_setup(struct qed_hwfn *p_hwfn);
237 
238 /**
239  * @brief qed_spq_deallocate - Deallocates the given SPQ struct.
240  *
241  * @param p_hwfn
242  */
243 void qed_spq_free(struct qed_hwfn *p_hwfn);
244 
245 /**
246  * @brief qed_spq_get_entry - Obtain an entrry from the spq
247  *        free pool list.
248  *
249  *
250  *
251  * @param p_hwfn
252  * @param pp_ent
253  *
254  * @return int
255  */
256 int
257 qed_spq_get_entry(struct qed_hwfn *p_hwfn,
258 		  struct qed_spq_entry **pp_ent);
259 
260 /**
261  * @brief qed_spq_return_entry - Return an entry to spq free
262  *                                 pool list
263  *
264  * @param p_hwfn
265  * @param p_ent
266  */
267 void qed_spq_return_entry(struct qed_hwfn *p_hwfn,
268 			  struct qed_spq_entry *p_ent);
269 /**
270  * @brief qed_eq_allocate - Allocates & initializes an EQ struct
271  *
272  * @param p_hwfn
273  * @param num_elem number of elements in the eq
274  *
275  * @return int
276  */
277 int qed_eq_alloc(struct qed_hwfn *p_hwfn, u16 num_elem);
278 
279 /**
280  * @brief qed_eq_setup - Reset the EQ to its start state.
281  *
282  * @param p_hwfn
283  */
284 void qed_eq_setup(struct qed_hwfn *p_hwfn);
285 
286 /**
287  * @brief qed_eq_free - deallocates the given EQ struct.
288  *
289  * @param p_hwfn
290  */
291 void qed_eq_free(struct qed_hwfn *p_hwfn);
292 
293 /**
294  * @brief qed_eq_prod_update - update the FW with default EQ producer
295  *
296  * @param p_hwfn
297  * @param prod
298  */
299 void qed_eq_prod_update(struct qed_hwfn *p_hwfn,
300 			u16 prod);
301 
302 /**
303  * @brief qed_eq_completion - Completes currently pending EQ elements
304  *
305  * @param p_hwfn
306  * @param cookie
307  *
308  * @return int
309  */
310 int qed_eq_completion(struct qed_hwfn *p_hwfn,
311 		      void *cookie);
312 
313 /**
314  * @brief qed_spq_completion - Completes a single event
315  *
316  * @param p_hwfn
317  * @param echo - echo value from cookie (used for determining completion)
318  * @param p_data - data from cookie (used in callback function if applicable)
319  *
320  * @return int
321  */
322 int qed_spq_completion(struct qed_hwfn *p_hwfn,
323 		       __le16 echo,
324 		       u8 fw_return_code,
325 		       union event_ring_data *p_data);
326 
327 /**
328  * @brief qed_spq_get_cid - Given p_hwfn, return cid for the hwfn's SPQ
329  *
330  * @param p_hwfn
331  *
332  * @return u32 - SPQ CID
333  */
334 u32 qed_spq_get_cid(struct qed_hwfn *p_hwfn);
335 
336 /**
337  * @brief qed_consq_alloc - Allocates & initializes an ConsQ
338  *        struct
339  *
340  * @param p_hwfn
341  *
342  * @return int
343  */
344 int qed_consq_alloc(struct qed_hwfn *p_hwfn);
345 
346 /**
347  * @brief qed_consq_setup - Reset the ConsQ to its start state.
348  *
349  * @param p_hwfn
350  */
351 void qed_consq_setup(struct qed_hwfn *p_hwfn);
352 
353 /**
354  * @brief qed_consq_free - deallocates the given ConsQ struct.
355  *
356  * @param p_hwfn
357  */
358 void qed_consq_free(struct qed_hwfn *p_hwfn);
359 int qed_spq_pend_post(struct qed_hwfn *p_hwfn);
360 
361 /**
362  * @file
363  *
364  * @brief Slow-hwfn low-level commands (Ramrods) function definitions.
365  */
366 
367 #define QED_SP_EQ_COMPLETION  0x01
368 #define QED_SP_CQE_COMPLETION 0x02
369 
370 struct qed_sp_init_data {
371 	u32			cid;
372 	u16			opaque_fid;
373 
374 	/* Information regarding operation upon sending & completion */
375 	enum spq_mode		comp_mode;
376 	struct qed_spq_comp_cb *p_comp_data;
377 };
378 
379 /**
380  * @brief Returns a SPQ entry to the pool / frees the entry if allocated.
381  *        Should be called on in error flows after initializing the SPQ entry
382  *        and before posting it.
383  *
384  * @param p_hwfn
385  * @param p_ent
386  */
387 void qed_sp_destroy_request(struct qed_hwfn *p_hwfn,
388 			    struct qed_spq_entry *p_ent);
389 
390 int qed_sp_init_request(struct qed_hwfn *p_hwfn,
391 			struct qed_spq_entry **pp_ent,
392 			u8 cmd,
393 			u8 protocol,
394 			struct qed_sp_init_data *p_data);
395 
396 /**
397  * @brief qed_sp_pf_start - PF Function Start Ramrod
398  *
399  * This ramrod is sent to initialize a physical function (PF). It will
400  * configure the function related parameters and write its completion to the
401  * event ring specified in the parameters.
402  *
403  * Ramrods complete on the common event ring for the PF. This ring is
404  * allocated by the driver on host memory and its parameters are written
405  * to the internal RAM of the UStorm by the Function Start Ramrod.
406  *
407  * @param p_hwfn
408  * @param p_ptt
409  * @param p_tunn
410  * @param allow_npar_tx_switch
411  *
412  * @return int
413  */
414 
415 int qed_sp_pf_start(struct qed_hwfn *p_hwfn,
416 		    struct qed_ptt *p_ptt,
417 		    struct qed_tunnel_info *p_tunn,
418 		    bool allow_npar_tx_switch);
419 
420 /**
421  * @brief qed_sp_pf_update - PF Function Update Ramrod
422  *
423  * This ramrod updates function-related parameters. Every parameter can be
424  * updated independently, according to configuration flags.
425  *
426  * @param p_hwfn
427  *
428  * @return int
429  */
430 
431 int qed_sp_pf_update(struct qed_hwfn *p_hwfn);
432 
433 /**
434  * @brief qed_sp_pf_update_stag - Update firmware of new outer tag
435  *
436  * @param p_hwfn
437  *
438  * @return int
439  */
440 int qed_sp_pf_update_stag(struct qed_hwfn *p_hwfn);
441 
442 /**
443  * @brief qed_sp_pf_stop - PF Function Stop Ramrod
444  *
445  * This ramrod is sent to close a Physical Function (PF). It is the last ramrod
446  * sent and the last completion written to the PFs Event Ring. This ramrod also
447  * deletes the context for the Slowhwfn connection on this PF.
448  *
449  * @note Not required for first packet.
450  *
451  * @param p_hwfn
452  *
453  * @return int
454  */
455 
456 /**
457  * @brief qed_sp_pf_update_ufp - PF ufp update Ramrod
458  *
459  * @param p_hwfn
460  *
461  * @return int
462  */
463 int qed_sp_pf_update_ufp(struct qed_hwfn *p_hwfn);
464 
465 int qed_sp_pf_stop(struct qed_hwfn *p_hwfn);
466 
467 int qed_sp_pf_update_tunn_cfg(struct qed_hwfn *p_hwfn,
468 			      struct qed_ptt *p_ptt,
469 			      struct qed_tunnel_info *p_tunn,
470 			      enum spq_mode comp_mode,
471 			      struct qed_spq_comp_cb *p_comp_data);
472 /**
473  * @brief qed_sp_heartbeat_ramrod - Send empty Ramrod
474  *
475  * @param p_hwfn
476  *
477  * @return int
478  */
479 
480 int qed_sp_heartbeat_ramrod(struct qed_hwfn *p_hwfn);
481 
482 #endif
483