common/sfc_efx/base: separate target EvQ and IRQ config
[dpdk.git] / drivers / common / sfc_efx / base / rhead_impl.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright(c) 2019-2021 Xilinx, Inc.
4  * Copyright(c) 2018-2019 Solarflare Communications Inc.
5  */
6
7 #ifndef _SYS_RHEAD_IMPL_H
8 #define _SYS_RHEAD_IMPL_H
9
10 #ifdef  __cplusplus
11 extern "C" {
12 #endif
13
14
15 /*
16  * Riverhead requires physically contiguous event rings (so, just one
17  * DMA address is sufficient to represent it), but MCDI interface is still
18  * in terms of 4k size 4k-aligned DMA buffers.
19  */
20 #define RHEAD_EVQ_MAXNBUFS      32
21
22 #define RHEAD_EVQ_MAXNEVS       16384
23 #define RHEAD_EVQ_MINNEVS       256
24
25 #define RHEAD_RXQ_MAXNDESCS     16384
26 #define RHEAD_RXQ_MINNDESCS     256
27
28 #define RHEAD_TXQ_MAXNDESCS     16384
29 #define RHEAD_TXQ_MINNDESCS     256
30
31 #define RHEAD_EVQ_DESC_SIZE     (sizeof (efx_qword_t))
32 #define RHEAD_RXQ_DESC_SIZE     (sizeof (efx_qword_t))
33 #define RHEAD_TXQ_DESC_SIZE     (sizeof (efx_oword_t))
34
35 #if EFSYS_OPT_EV_EXTENDED_WIDTH
36 #define RHEAD_EVQ_EW_DESC_SIZE  (sizeof (efx_xword_t))
37 #endif
38
39
40 /* NIC */
41
42 LIBEFX_INTERNAL
43 extern  __checkReturn   efx_rc_t
44 rhead_board_cfg(
45         __in            efx_nic_t *enp);
46
47 LIBEFX_INTERNAL
48 extern  __checkReturn   efx_rc_t
49 rhead_nic_probe(
50         __in            efx_nic_t *enp);
51
52 LIBEFX_INTERNAL
53 extern  __checkReturn   efx_rc_t
54 rhead_nic_set_drv_limits(
55         __inout         efx_nic_t *enp,
56         __in            efx_drv_limits_t *edlp);
57
58 LIBEFX_INTERNAL
59 extern  __checkReturn   efx_rc_t
60 rhead_nic_get_vi_pool(
61         __in            efx_nic_t *enp,
62         __out           uint32_t *vi_countp);
63
64 LIBEFX_INTERNAL
65 extern  __checkReturn   efx_rc_t
66 rhead_nic_get_bar_region(
67         __in            efx_nic_t *enp,
68         __in            efx_nic_region_t region,
69         __out           uint32_t *offsetp,
70         __out           size_t *sizep);
71
72 LIBEFX_INTERNAL
73 extern  __checkReturn   efx_rc_t
74 rhead_nic_reset(
75         __in            efx_nic_t *enp);
76
77 LIBEFX_INTERNAL
78 extern  __checkReturn   efx_rc_t
79 rhead_nic_init(
80         __in            efx_nic_t *enp);
81
82 LIBEFX_INTERNAL
83 extern  __checkReturn   boolean_t
84 rhead_nic_hw_unavailable(
85         __in            efx_nic_t *enp);
86
87 LIBEFX_INTERNAL
88 extern                  void
89 rhead_nic_set_hw_unavailable(
90         __in            efx_nic_t *enp);
91
92 #if EFSYS_OPT_DIAG
93
94 LIBEFX_INTERNAL
95 extern  __checkReturn   efx_rc_t
96 rhead_nic_register_test(
97         __in            efx_nic_t *enp);
98
99 #endif  /* EFSYS_OPT_DIAG */
100
101 LIBEFX_INTERNAL
102 extern                  void
103 rhead_nic_fini(
104         __in            efx_nic_t *enp);
105
106 LIBEFX_INTERNAL
107 extern                  void
108 rhead_nic_unprobe(
109         __in            efx_nic_t *enp);
110
111
112 /* EV */
113
114 LIBEFX_INTERNAL
115 extern  __checkReturn   efx_rc_t
116 rhead_ev_init(
117         __in            efx_nic_t *enp);
118
119 LIBEFX_INTERNAL
120 extern                  void
121 rhead_ev_fini(
122         __in            efx_nic_t *enp);
123
124 LIBEFX_INTERNAL
125 extern  __checkReturn   efx_rc_t
126 rhead_ev_qcreate(
127         __in            efx_nic_t *enp,
128         __in            unsigned int index,
129         __in            efsys_mem_t *esmp,
130         __in            size_t ndescs,
131         __in            uint32_t id,
132         __in            uint32_t us,
133         __in            uint32_t flags,
134         __in            efx_evq_t *eep);
135
136 LIBEFX_INTERNAL
137 extern                  void
138 rhead_ev_qdestroy(
139         __in            efx_evq_t *eep);
140
141 LIBEFX_INTERNAL
142 extern  __checkReturn   efx_rc_t
143 rhead_ev_qprime(
144         __in            efx_evq_t *eep,
145         __in            unsigned int count);
146
147 LIBEFX_INTERNAL
148 extern                  void
149 rhead_ev_qpost(
150         __in    efx_evq_t *eep,
151         __in    uint16_t data);
152
153 LIBEFX_INTERNAL
154 extern                  void
155 rhead_ev_qpoll(
156         __in            efx_evq_t *eep,
157         __inout         unsigned int *countp,
158         __in            const efx_ev_callbacks_t *eecp,
159         __in_opt        void *arg);
160
161 LIBEFX_INTERNAL
162 extern  __checkReturn   efx_rc_t
163 rhead_ev_qmoderate(
164         __in            efx_evq_t *eep,
165         __in            unsigned int us);
166
167 #if EFSYS_OPT_QSTATS
168
169 LIBEFX_INTERNAL
170 extern                  void
171 rhead_ev_qstats_update(
172         __in                            efx_evq_t *eep,
173         __inout_ecount(EV_NQSTATS)      efsys_stat_t *stat);
174
175 #endif /* EFSYS_OPT_QSTATS */
176
177
178 /* INTR */
179
180 LIBEFX_INTERNAL
181 extern  __checkReturn   efx_rc_t
182 rhead_intr_init(
183         __in            efx_nic_t *enp,
184         __in            efx_intr_type_t type,
185         __in            efsys_mem_t *esmp);
186
187 LIBEFX_INTERNAL
188 extern                  void
189 rhead_intr_enable(
190         __in            efx_nic_t *enp);
191
192 LIBEFX_INTERNAL
193 extern                  void
194 rhead_intr_disable(
195         __in            efx_nic_t *enp);
196
197 LIBEFX_INTERNAL
198 extern                  void
199 rhead_intr_disable_unlocked(
200         __in            efx_nic_t *enp);
201
202 LIBEFX_INTERNAL
203 extern  __checkReturn   efx_rc_t
204 rhead_intr_trigger(
205         __in            efx_nic_t *enp,
206         __in            unsigned int level);
207
208 LIBEFX_INTERNAL
209 extern                  void
210 rhead_intr_status_line(
211         __in            efx_nic_t *enp,
212         __out           boolean_t *fatalp,
213         __out           uint32_t *qmaskp);
214
215 LIBEFX_INTERNAL
216 extern                  void
217 rhead_intr_status_message(
218         __in            efx_nic_t *enp,
219         __in            unsigned int message,
220         __out           boolean_t *fatalp);
221
222 LIBEFX_INTERNAL
223 extern                  void
224 rhead_intr_fatal(
225         __in            efx_nic_t *enp);
226
227 LIBEFX_INTERNAL
228 extern                  void
229 rhead_intr_fini(
230         __in            efx_nic_t *enp);
231
232
233 /* RX */
234
235 LIBEFX_INTERNAL
236 extern  __checkReturn   efx_rc_t
237 rhead_rx_init(
238         __in            efx_nic_t *enp);
239
240 LIBEFX_INTERNAL
241 extern                  void
242 rhead_rx_fini(
243         __in            efx_nic_t *enp);
244
245 #if EFSYS_OPT_RX_SCATTER
246
247 LIBEFX_INTERNAL
248 extern  __checkReturn   efx_rc_t
249 rhead_rx_scatter_enable(
250         __in            efx_nic_t *enp,
251         __in            unsigned int buf_size);
252
253 #endif  /* EFSYS_OPT_RX_SCATTER */
254
255 #if EFSYS_OPT_RX_SCALE
256
257 LIBEFX_INTERNAL
258 extern  __checkReturn   efx_rc_t
259 rhead_rx_scale_context_alloc(
260         __in            efx_nic_t *enp,
261         __in            efx_rx_scale_context_type_t type,
262         __in            uint32_t num_queues,
263         __out           uint32_t *rss_contextp);
264
265 LIBEFX_INTERNAL
266 extern  __checkReturn   efx_rc_t
267 rhead_rx_scale_context_free(
268         __in            efx_nic_t *enp,
269         __in            uint32_t rss_context);
270
271 LIBEFX_INTERNAL
272 extern  __checkReturn   efx_rc_t
273 rhead_rx_scale_mode_set(
274         __in            efx_nic_t *enp,
275         __in            uint32_t rss_context,
276         __in            efx_rx_hash_alg_t alg,
277         __in            efx_rx_hash_type_t type,
278         __in            boolean_t insert);
279
280 LIBEFX_INTERNAL
281 extern  __checkReturn   efx_rc_t
282 rhead_rx_scale_key_set(
283         __in            efx_nic_t *enp,
284         __in            uint32_t rss_context,
285         __in_ecount(n)  uint8_t *key,
286         __in            size_t n);
287
288 LIBEFX_INTERNAL
289 extern  __checkReturn   efx_rc_t
290 rhead_rx_scale_tbl_set(
291         __in            efx_nic_t *enp,
292         __in            uint32_t rss_context,
293         __in_ecount(n)  unsigned int *table,
294         __in            size_t n);
295
296 LIBEFX_INTERNAL
297 extern  __checkReturn   uint32_t
298 rhead_rx_prefix_hash(
299         __in            efx_nic_t *enp,
300         __in            efx_rx_hash_alg_t func,
301         __in            uint8_t *buffer);
302
303 #endif /* EFSYS_OPT_RX_SCALE */
304
305 LIBEFX_INTERNAL
306 extern  __checkReturn   efx_rc_t
307 rhead_rx_prefix_pktlen(
308         __in            efx_nic_t *enp,
309         __in            uint8_t *buffer,
310         __out           uint16_t *lengthp);
311
312 LIBEFX_INTERNAL
313 extern                          void
314 rhead_rx_qpost(
315         __in                    efx_rxq_t *erp,
316         __in_ecount(ndescs)     efsys_dma_addr_t *addrp,
317         __in                    size_t size,
318         __in                    unsigned int ndescs,
319         __in                    unsigned int completed,
320         __in                    unsigned int added);
321
322 LIBEFX_INTERNAL
323 extern                  void
324 rhead_rx_qpush(
325         __in            efx_rxq_t *erp,
326         __in            unsigned int added,
327         __inout         unsigned int *pushedp);
328
329 LIBEFX_INTERNAL
330 extern  __checkReturn   efx_rc_t
331 rhead_rx_qflush(
332         __in            efx_rxq_t *erp);
333
334 LIBEFX_INTERNAL
335 extern          void
336 rhead_rx_qenable(
337         __in            efx_rxq_t *erp);
338
339 union efx_rxq_type_data_u;
340
341 LIBEFX_INTERNAL
342 extern  __checkReturn   efx_rc_t
343 rhead_rx_qcreate(
344         __in            efx_nic_t *enp,
345         __in            unsigned int index,
346         __in            unsigned int label,
347         __in            efx_rxq_type_t type,
348         __in            const union efx_rxq_type_data_u *type_data,
349         __in            efsys_mem_t *esmp,
350         __in            size_t ndescs,
351         __in            uint32_t id,
352         __in            unsigned int flags,
353         __in            efx_evq_t *eep,
354         __in            efx_rxq_t *erp);
355
356 LIBEFX_INTERNAL
357 extern                  void
358 rhead_rx_qdestroy(
359         __in            efx_rxq_t *erp);
360
361
362 /* TX */
363
364 LIBEFX_INTERNAL
365 extern  __checkReturn   efx_rc_t
366 rhead_tx_init(
367         __in            efx_nic_t *enp);
368
369 LIBEFX_INTERNAL
370 extern                  void
371 rhead_tx_fini(
372         __in            efx_nic_t *enp);
373
374 LIBEFX_INTERNAL
375 extern  __checkReturn   efx_rc_t
376 rhead_tx_qcreate(
377         __in            efx_nic_t *enp,
378         __in            unsigned int index,
379         __in            unsigned int label,
380         __in            efsys_mem_t *esmp,
381         __in            size_t ndescs,
382         __in            uint32_t id,
383         __in            uint16_t flags,
384         __in            efx_evq_t *eep,
385         __in            efx_txq_t *etp,
386         __out           unsigned int *addedp);
387
388 LIBEFX_INTERNAL
389 extern          void
390 rhead_tx_qdestroy(
391         __in            efx_txq_t *etp);
392
393 LIBEFX_INTERNAL
394 extern  __checkReturn           efx_rc_t
395 rhead_tx_qpost(
396         __in                    efx_txq_t *etp,
397         __in_ecount(ndescs)     efx_buffer_t *ebp,
398         __in                    unsigned int ndescs,
399         __in                    unsigned int completed,
400         __inout                 unsigned int *addedp);
401
402 LIBEFX_INTERNAL
403 extern                  void
404 rhead_tx_qpush(
405         __in            efx_txq_t *etp,
406         __in            unsigned int added,
407         __in            unsigned int pushed);
408
409 LIBEFX_INTERNAL
410 extern  __checkReturn   efx_rc_t
411 rhead_tx_qpace(
412         __in            efx_txq_t *etp,
413         __in            unsigned int ns);
414
415 LIBEFX_INTERNAL
416 extern  __checkReturn   efx_rc_t
417 rhead_tx_qflush(
418         __in            efx_txq_t *etp);
419
420 LIBEFX_INTERNAL
421 extern                  void
422 rhead_tx_qenable(
423         __in            efx_txq_t *etp);
424
425 LIBEFX_INTERNAL
426 extern  __checkReturn   efx_rc_t
427 rhead_tx_qdesc_post(
428         __in            efx_txq_t *etp,
429         __in_ecount(n)  efx_desc_t *ed,
430         __in            unsigned int n,
431         __in            unsigned int completed,
432         __inout         unsigned int *addedp);
433
434 #if EFSYS_OPT_QSTATS
435
436 LIBEFX_INTERNAL
437 extern                  void
438 rhead_tx_qstats_update(
439         __in                            efx_txq_t *etp,
440         __inout_ecount(TX_NQSTATS)      efsys_stat_t *stat);
441
442 #endif /* EFSYS_OPT_QSTATS */
443
444 #if EFSYS_OPT_TUNNEL
445
446 LIBEFX_INTERNAL
447 extern  __checkReturn   efx_rc_t
448 rhead_tunnel_reconfigure(
449         __in            efx_nic_t *enp);
450
451 LIBEFX_INTERNAL
452 extern                  void
453 rhead_tunnel_fini(
454         __in            efx_nic_t *enp);
455
456 #endif /* EFSYS_OPT_TUNNEL */
457
458 #if EFSYS_OPT_PCI
459
460 /*
461  * Perform discovery of function control window by looking for a
462  * EF100 locator in Xilinx capabilities tables.
463  */
464 LIBEFX_INTERNAL
465 extern  __checkReturn                   efx_rc_t
466 rhead_pci_nic_membar_lookup(
467         __in                            efsys_pci_config_t *espcp,
468         __in                            const efx_pci_ops_t *epop,
469         __out                           efx_bar_region_t *ebrp);
470
471 #endif /* EFSYS_OPT_PCI */
472
473 LIBEFX_INTERNAL
474 extern  __checkReturn                   efx_rc_t
475 rhead_nic_xilinx_cap_tbl_read_ef100_locator(
476         __in                            efsys_bar_t *esbp,
477         __in                            efsys_dma_addr_t offset,
478         __out                           efx_bar_region_t *ebrp);
479
480 #if EFSYS_OPT_VIRTIO
481
482 LIBEFX_INTERNAL
483 extern  __checkReturn                   efx_rc_t
484 rhead_virtio_qstart(
485         __in                            efx_virtio_vq_t *evvp,
486         __in                            efx_virtio_vq_cfg_t *evvcp,
487         __in_opt                        efx_virtio_vq_dyncfg_t *evvdp);
488
489 LIBEFX_INTERNAL
490 extern  __checkReturn                   efx_rc_t
491 rhead_virtio_qstop(
492         __in                            efx_virtio_vq_t *evvp,
493         __out_opt                       efx_virtio_vq_dyncfg_t *evvdp);
494
495 LIBEFX_INTERNAL
496 extern  __checkReturn                   efx_rc_t
497 rhead_virtio_get_doorbell_offset(
498         __in                            efx_virtio_vq_t *evvp,
499         __out                           uint32_t *offsetp);
500
501 LIBEFX_INTERNAL
502 extern  __checkReturn                   efx_rc_t
503 rhead_virtio_get_features(
504         __in                            efx_nic_t *enp,
505         __in                            efx_virtio_device_type_t type,
506         __out                           uint64_t *featuresp);
507
508 LIBEFX_INTERNAL
509 extern  __checkReturn                   efx_rc_t
510 rhead_virtio_verify_features(
511         __in                            efx_nic_t *enp,
512         __in                            efx_virtio_device_type_t type,
513         __in                            uint64_t features);
514
515 #endif /* EFSYS_OPT_VIRTIO */
516
517 #ifdef  __cplusplus
518 }
519 #endif
520
521 #endif  /* _SYS_RHEAD_IMPL_H */