1
2
3
4
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
19enum spq_mode {
20 QED_SPQ_MODE_BLOCK,
21 QED_SPQ_MODE_CB,
22 QED_SPQ_MODE_EBLOCK,
23};
24
25struct 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
35
36
37
38
39
40
41
42int qed_eth_cqe_completion(struct qed_hwfn *p_hwfn,
43 struct eth_slow_path_rx_cqe *cqe);
44
45
46
47
48
49
50
51union 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 vf_start_ramrod_data vf_start;
104 struct vf_stop_ramrod_data vf_stop;
105};
106
107#define EQ_MAX_CREDIT 0xffffffff
108
109enum spq_priority {
110 QED_SPQ_PRIORITY_NORMAL,
111 QED_SPQ_PRIORITY_HIGH,
112};
113
114union qed_spq_req_comp {
115 struct qed_spq_comp_cb cb;
116 u64 *done_addr;
117};
118
119struct qed_spq_comp_done {
120 unsigned int done;
121 u8 fw_return_code;
122};
123
124struct qed_spq_entry {
125 struct list_head list;
126
127 u8 flags;
128
129
130 struct slow_path_element elem;
131
132 union ramrod_data ramrod;
133
134 enum spq_priority priority;
135
136
137 struct list_head *queue;
138
139 enum spq_mode comp_mode;
140 struct qed_spq_comp_cb comp_cb;
141 struct qed_spq_comp_done comp_done;
142
143
144 struct qed_spq_entry *post_ent;
145};
146
147struct qed_eq {
148 struct qed_chain chain;
149 u8 eq_sb_index;
150 __le16 *p_fw_cons;
151};
152
153struct qed_consq {
154 struct qed_chain chain;
155};
156
157typedef int (*qed_spq_async_comp_cb)(struct qed_hwfn *p_hwfn, u8 opcode,
158 __le16 echo, union event_ring_data *data,
159 u8 fw_return_code);
160
161int
162qed_spq_register_async_cb(struct qed_hwfn *p_hwfn,
163 enum protocol_type protocol_id,
164 qed_spq_async_comp_cb cb);
165
166void
167qed_spq_unregister_async_cb(struct qed_hwfn *p_hwfn,
168 enum protocol_type protocol_id);
169
170struct qed_spq {
171 spinlock_t lock;
172
173 struct list_head unlimited_pending;
174 struct list_head pending;
175 struct list_head completion_pending;
176 struct list_head free_pool;
177
178 struct qed_chain chain;
179
180
181 dma_addr_t p_phys;
182 struct qed_spq_entry *p_virt;
183
184#define SPQ_RING_SIZE \
185 (CORE_SPQE_PAGE_SIZE_BYTES / sizeof(struct slow_path_element))
186
187
188 DECLARE_BITMAP(p_comp_bitmap, SPQ_RING_SIZE);
189 u8 comp_bitmap_idx;
190
191
192 u32 unlimited_pending_count;
193 u32 normal_count;
194 u32 high_count;
195 u32 comp_sent_count;
196 u32 comp_count;
197
198 u32 cid;
199 u32 db_addr_offset;
200 struct core_db_data db_data;
201 qed_spq_async_comp_cb async_comp_cb[MAX_PROTOCOL_TYPE];
202};
203
204
205
206
207
208
209
210
211
212
213int qed_spq_post(struct qed_hwfn *p_hwfn,
214 struct qed_spq_entry *p_ent,
215 u8 *fw_return_code);
216
217
218
219
220
221
222
223
224int qed_spq_alloc(struct qed_hwfn *p_hwfn);
225
226
227
228
229
230
231void qed_spq_setup(struct qed_hwfn *p_hwfn);
232
233
234
235
236
237
238void qed_spq_free(struct qed_hwfn *p_hwfn);
239
240
241
242
243
244
245
246
247
248
249
250
251int
252qed_spq_get_entry(struct qed_hwfn *p_hwfn,
253 struct qed_spq_entry **pp_ent);
254
255
256
257
258
259
260
261
262void qed_spq_return_entry(struct qed_hwfn *p_hwfn,
263 struct qed_spq_entry *p_ent);
264
265
266
267
268
269
270
271
272int qed_eq_alloc(struct qed_hwfn *p_hwfn, u16 num_elem);
273
274
275
276
277
278
279void qed_eq_setup(struct qed_hwfn *p_hwfn);
280
281
282
283
284
285
286void qed_eq_free(struct qed_hwfn *p_hwfn);
287
288
289
290
291
292
293
294void qed_eq_prod_update(struct qed_hwfn *p_hwfn,
295 u16 prod);
296
297
298
299
300
301
302
303
304
305int qed_eq_completion(struct qed_hwfn *p_hwfn,
306 void *cookie);
307
308
309
310
311
312
313
314
315
316
317int qed_spq_completion(struct qed_hwfn *p_hwfn,
318 __le16 echo,
319 u8 fw_return_code,
320 union event_ring_data *p_data);
321
322
323
324
325
326
327
328
329u32 qed_spq_get_cid(struct qed_hwfn *p_hwfn);
330
331
332
333
334
335
336
337
338
339int qed_consq_alloc(struct qed_hwfn *p_hwfn);
340
341
342
343
344
345
346void qed_consq_setup(struct qed_hwfn *p_hwfn);
347
348
349
350
351
352
353void qed_consq_free(struct qed_hwfn *p_hwfn);
354int qed_spq_pend_post(struct qed_hwfn *p_hwfn);
355
356
357
358
359
360
361
362#define QED_SP_EQ_COMPLETION 0x01
363#define QED_SP_CQE_COMPLETION 0x02
364
365struct qed_sp_init_data {
366 u32 cid;
367 u16 opaque_fid;
368
369
370 enum spq_mode comp_mode;
371 struct qed_spq_comp_cb *p_comp_data;
372};
373
374
375
376
377
378
379
380
381
382void qed_sp_destroy_request(struct qed_hwfn *p_hwfn,
383 struct qed_spq_entry *p_ent);
384
385int qed_sp_init_request(struct qed_hwfn *p_hwfn,
386 struct qed_spq_entry **pp_ent,
387 u8 cmd,
388 u8 protocol,
389 struct qed_sp_init_data *p_data);
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410int qed_sp_pf_start(struct qed_hwfn *p_hwfn,
411 struct qed_ptt *p_ptt,
412 struct qed_tunnel_info *p_tunn,
413 bool allow_npar_tx_switch);
414
415
416
417
418
419
420
421
422
423
424
425
426int qed_sp_pf_update(struct qed_hwfn *p_hwfn);
427
428
429
430
431
432
433
434
435int qed_sp_pf_update_stag(struct qed_hwfn *p_hwfn);
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458int qed_sp_pf_update_ufp(struct qed_hwfn *p_hwfn);
459
460int qed_sp_pf_stop(struct qed_hwfn *p_hwfn);
461
462int qed_sp_pf_update_tunn_cfg(struct qed_hwfn *p_hwfn,
463 struct qed_ptt *p_ptt,
464 struct qed_tunnel_info *p_tunn,
465 enum spq_mode comp_mode,
466 struct qed_spq_comp_cb *p_comp_data);
467
468
469
470
471
472
473
474
475int qed_sp_heartbeat_ramrod(struct qed_hwfn *p_hwfn);
476
477#endif
478