common/sfc_efx/base: update EF100 registers definitions
[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            uint32_t irq,
135         __in            efx_evq_t *eep);
136
137 LIBEFX_INTERNAL
138 extern                  void
139 rhead_ev_qdestroy(
140         __in            efx_evq_t *eep);
141
142 LIBEFX_INTERNAL
143 extern  __checkReturn   efx_rc_t
144 rhead_ev_qprime(
145         __in            efx_evq_t *eep,
146         __in            unsigned int count);
147
148 LIBEFX_INTERNAL
149 extern                  void
150 rhead_ev_qpost(
151         __in    efx_evq_t *eep,
152         __in    uint16_t data);
153
154 LIBEFX_INTERNAL
155 extern                  void
156 rhead_ev_qpoll(
157         __in            efx_evq_t *eep,
158         __inout         unsigned int *countp,
159         __in            const efx_ev_callbacks_t *eecp,
160         __in_opt        void *arg);
161
162 LIBEFX_INTERNAL
163 extern  __checkReturn   efx_rc_t
164 rhead_ev_qmoderate(
165         __in            efx_evq_t *eep,
166         __in            unsigned int us);
167
168 #if EFSYS_OPT_QSTATS
169
170 LIBEFX_INTERNAL
171 extern                  void
172 rhead_ev_qstats_update(
173         __in                            efx_evq_t *eep,
174         __inout_ecount(EV_NQSTATS)      efsys_stat_t *stat);
175
176 #endif /* EFSYS_OPT_QSTATS */
177
178
179 /* INTR */
180
181 LIBEFX_INTERNAL
182 extern  __checkReturn   efx_rc_t
183 rhead_intr_init(
184         __in            efx_nic_t *enp,
185         __in            efx_intr_type_t type,
186         __in            efsys_mem_t *esmp);
187
188 LIBEFX_INTERNAL
189 extern                  void
190 rhead_intr_enable(
191         __in            efx_nic_t *enp);
192
193 LIBEFX_INTERNAL
194 extern                  void
195 rhead_intr_disable(
196         __in            efx_nic_t *enp);
197
198 LIBEFX_INTERNAL
199 extern                  void
200 rhead_intr_disable_unlocked(
201         __in            efx_nic_t *enp);
202
203 LIBEFX_INTERNAL
204 extern  __checkReturn   efx_rc_t
205 rhead_intr_trigger(
206         __in            efx_nic_t *enp,
207         __in            unsigned int level);
208
209 LIBEFX_INTERNAL
210 extern                  void
211 rhead_intr_status_line(
212         __in            efx_nic_t *enp,
213         __out           boolean_t *fatalp,
214         __out           uint32_t *qmaskp);
215
216 LIBEFX_INTERNAL
217 extern                  void
218 rhead_intr_status_message(
219         __in            efx_nic_t *enp,
220         __in            unsigned int message,
221         __out           boolean_t *fatalp);
222
223 LIBEFX_INTERNAL
224 extern                  void
225 rhead_intr_fatal(
226         __in            efx_nic_t *enp);
227
228 LIBEFX_INTERNAL
229 extern                  void
230 rhead_intr_fini(
231         __in            efx_nic_t *enp);
232
233
234 /* RX */
235
236 LIBEFX_INTERNAL
237 extern  __checkReturn   efx_rc_t
238 rhead_rx_init(
239         __in            efx_nic_t *enp);
240
241 LIBEFX_INTERNAL
242 extern                  void
243 rhead_rx_fini(
244         __in            efx_nic_t *enp);
245
246 #if EFSYS_OPT_RX_SCATTER
247
248 LIBEFX_INTERNAL
249 extern  __checkReturn   efx_rc_t
250 rhead_rx_scatter_enable(
251         __in            efx_nic_t *enp,
252         __in            unsigned int buf_size);
253
254 #endif  /* EFSYS_OPT_RX_SCATTER */
255
256 #if EFSYS_OPT_RX_SCALE
257
258 LIBEFX_INTERNAL
259 extern  __checkReturn   efx_rc_t
260 rhead_rx_scale_context_alloc(
261         __in            efx_nic_t *enp,
262         __in            efx_rx_scale_context_type_t type,
263         __in            uint32_t num_queues,
264         __out           uint32_t *rss_contextp);
265
266 LIBEFX_INTERNAL
267 extern  __checkReturn   efx_rc_t
268 rhead_rx_scale_context_free(
269         __in            efx_nic_t *enp,
270         __in            uint32_t rss_context);
271
272 LIBEFX_INTERNAL
273 extern  __checkReturn   efx_rc_t
274 rhead_rx_scale_mode_set(
275         __in            efx_nic_t *enp,
276         __in            uint32_t rss_context,
277         __in            efx_rx_hash_alg_t alg,
278         __in            efx_rx_hash_type_t type,
279         __in            boolean_t insert);
280
281 LIBEFX_INTERNAL
282 extern  __checkReturn   efx_rc_t
283 rhead_rx_scale_key_set(
284         __in            efx_nic_t *enp,
285         __in            uint32_t rss_context,
286         __in_ecount(n)  uint8_t *key,
287         __in            size_t n);
288
289 LIBEFX_INTERNAL
290 extern  __checkReturn   efx_rc_t
291 rhead_rx_scale_tbl_set(
292         __in            efx_nic_t *enp,
293         __in            uint32_t rss_context,
294         __in_ecount(n)  unsigned int *table,
295         __in            size_t n);
296
297 LIBEFX_INTERNAL
298 extern  __checkReturn   uint32_t
299 rhead_rx_prefix_hash(
300         __in            efx_nic_t *enp,
301         __in            efx_rx_hash_alg_t func,
302         __in            uint8_t *buffer);
303
304 #endif /* EFSYS_OPT_RX_SCALE */
305
306 LIBEFX_INTERNAL
307 extern  __checkReturn   efx_rc_t
308 rhead_rx_prefix_pktlen(
309         __in            efx_nic_t *enp,
310         __in            uint8_t *buffer,
311         __out           uint16_t *lengthp);
312
313 LIBEFX_INTERNAL
314 extern                          void
315 rhead_rx_qpost(
316         __in                    efx_rxq_t *erp,
317         __in_ecount(ndescs)     efsys_dma_addr_t *addrp,
318         __in                    size_t size,
319         __in                    unsigned int ndescs,
320         __in                    unsigned int completed,
321         __in                    unsigned int added);
322
323 LIBEFX_INTERNAL
324 extern                  void
325 rhead_rx_qpush(
326         __in            efx_rxq_t *erp,
327         __in            unsigned int added,
328         __inout         unsigned int *pushedp);
329
330 LIBEFX_INTERNAL
331 extern  __checkReturn   efx_rc_t
332 rhead_rx_qflush(
333         __in            efx_rxq_t *erp);
334
335 LIBEFX_INTERNAL
336 extern          void
337 rhead_rx_qenable(
338         __in            efx_rxq_t *erp);
339
340 union efx_rxq_type_data_u;
341
342 LIBEFX_INTERNAL
343 extern  __checkReturn   efx_rc_t
344 rhead_rx_qcreate(
345         __in            efx_nic_t *enp,
346         __in            unsigned int index,
347         __in            unsigned int label,
348         __in            efx_rxq_type_t type,
349         __in            const union efx_rxq_type_data_u *type_data,
350         __in            efsys_mem_t *esmp,
351         __in            size_t ndescs,
352         __in            uint32_t id,
353         __in            unsigned int flags,
354         __in            efx_evq_t *eep,
355         __in            efx_rxq_t *erp);
356
357 LIBEFX_INTERNAL
358 extern                  void
359 rhead_rx_qdestroy(
360         __in            efx_rxq_t *erp);
361
362
363 /* TX */
364
365 LIBEFX_INTERNAL
366 extern  __checkReturn   efx_rc_t
367 rhead_tx_init(
368         __in            efx_nic_t *enp);
369
370 LIBEFX_INTERNAL
371 extern                  void
372 rhead_tx_fini(
373         __in            efx_nic_t *enp);
374
375 LIBEFX_INTERNAL
376 extern  __checkReturn   efx_rc_t
377 rhead_tx_qcreate(
378         __in            efx_nic_t *enp,
379         __in            unsigned int index,
380         __in            unsigned int label,
381         __in            efsys_mem_t *esmp,
382         __in            size_t ndescs,
383         __in            uint32_t id,
384         __in            uint16_t flags,
385         __in            efx_evq_t *eep,
386         __in            efx_txq_t *etp,
387         __out           unsigned int *addedp);
388
389 LIBEFX_INTERNAL
390 extern          void
391 rhead_tx_qdestroy(
392         __in            efx_txq_t *etp);
393
394 LIBEFX_INTERNAL
395 extern  __checkReturn           efx_rc_t
396 rhead_tx_qpost(
397         __in                    efx_txq_t *etp,
398         __in_ecount(ndescs)     efx_buffer_t *ebp,
399         __in                    unsigned int ndescs,
400         __in                    unsigned int completed,
401         __inout                 unsigned int *addedp);
402
403 LIBEFX_INTERNAL
404 extern                  void
405 rhead_tx_qpush(
406         __in            efx_txq_t *etp,
407         __in            unsigned int added,
408         __in            unsigned int pushed);
409
410 LIBEFX_INTERNAL
411 extern  __checkReturn   efx_rc_t
412 rhead_tx_qpace(
413         __in            efx_txq_t *etp,
414         __in            unsigned int ns);
415
416 LIBEFX_INTERNAL
417 extern  __checkReturn   efx_rc_t
418 rhead_tx_qflush(
419         __in            efx_txq_t *etp);
420
421 LIBEFX_INTERNAL
422 extern                  void
423 rhead_tx_qenable(
424         __in            efx_txq_t *etp);
425
426 LIBEFX_INTERNAL
427 extern  __checkReturn   efx_rc_t
428 rhead_tx_qdesc_post(
429         __in            efx_txq_t *etp,
430         __in_ecount(n)  efx_desc_t *ed,
431         __in            unsigned int n,
432         __in            unsigned int completed,
433         __inout         unsigned int *addedp);
434
435 #if EFSYS_OPT_QSTATS
436
437 LIBEFX_INTERNAL
438 extern                  void
439 rhead_tx_qstats_update(
440         __in                            efx_txq_t *etp,
441         __inout_ecount(TX_NQSTATS)      efsys_stat_t *stat);
442
443 #endif /* EFSYS_OPT_QSTATS */
444
445 #if EFSYS_OPT_TUNNEL
446
447 LIBEFX_INTERNAL
448 extern  __checkReturn   efx_rc_t
449 rhead_tunnel_reconfigure(
450         __in            efx_nic_t *enp);
451
452 LIBEFX_INTERNAL
453 extern                  void
454 rhead_tunnel_fini(
455         __in            efx_nic_t *enp);
456
457 #endif /* EFSYS_OPT_TUNNEL */
458
459 #if EFSYS_OPT_PCI
460
461 /*
462  * Perform discovery of function control window by looking for a
463  * EF100 locator in Xilinx capabilities tables.
464  */
465 LIBEFX_INTERNAL
466 extern  __checkReturn                   efx_rc_t
467 rhead_pci_nic_membar_lookup(
468         __in                            efsys_pci_config_t *espcp,
469         __in                            const efx_pci_ops_t *epop,
470         __out                           efx_bar_region_t *ebrp);
471
472 #endif /* EFSYS_OPT_PCI */
473
474 LIBEFX_INTERNAL
475 extern  __checkReturn                   efx_rc_t
476 rhead_nic_xilinx_cap_tbl_read_ef100_locator(
477         __in                            efsys_bar_t *esbp,
478         __in                            efsys_dma_addr_t offset,
479         __out                           efx_bar_region_t *ebrp);
480
481 #if EFSYS_OPT_VIRTIO
482
483 LIBEFX_INTERNAL
484 extern  __checkReturn                   efx_rc_t
485 rhead_virtio_qstart(
486         __in                            efx_virtio_vq_t *evvp,
487         __in                            efx_virtio_vq_cfg_t *evvcp,
488         __in_opt                        efx_virtio_vq_dyncfg_t *evvdp);
489
490 LIBEFX_INTERNAL
491 extern  __checkReturn                   efx_rc_t
492 rhead_virtio_qstop(
493         __in                            efx_virtio_vq_t *evvp,
494         __out_opt                       efx_virtio_vq_dyncfg_t *evvdp);
495
496 LIBEFX_INTERNAL
497 extern  __checkReturn                   efx_rc_t
498 rhead_virtio_get_doorbell_offset(
499         __in                            efx_virtio_vq_t *evvp,
500         __out                           uint32_t *offsetp);
501
502 LIBEFX_INTERNAL
503 extern  __checkReturn                   efx_rc_t
504 rhead_virtio_get_features(
505         __in                            efx_nic_t *enp,
506         __in                            efx_virtio_device_type_t type,
507         __out                           uint64_t *featuresp);
508
509 LIBEFX_INTERNAL
510 extern  __checkReturn                   efx_rc_t
511 rhead_virtio_verify_features(
512         __in                            efx_nic_t *enp,
513         __in                            efx_virtio_device_type_t type,
514         __in                            uint64_t features);
515
516 #endif /* EFSYS_OPT_VIRTIO */
517
518 #ifdef  __cplusplus
519 }
520 #endif
521
522 #endif  /* _SYS_RHEAD_IMPL_H */