common/sfc_efx/base: implement Rx control path for Riverhead
[dpdk.git] / drivers / common / sfc_efx / base / rhead_impl.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright(c) 2019-2020 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
36 /* NIC */
37
38 LIBEFX_INTERNAL
39 extern  __checkReturn   efx_rc_t
40 rhead_board_cfg(
41         __in            efx_nic_t *enp);
42
43 LIBEFX_INTERNAL
44 extern  __checkReturn   efx_rc_t
45 rhead_nic_probe(
46         __in            efx_nic_t *enp);
47
48 LIBEFX_INTERNAL
49 extern  __checkReturn   efx_rc_t
50 rhead_nic_set_drv_limits(
51         __inout         efx_nic_t *enp,
52         __in            efx_drv_limits_t *edlp);
53
54 LIBEFX_INTERNAL
55 extern  __checkReturn   efx_rc_t
56 rhead_nic_get_vi_pool(
57         __in            efx_nic_t *enp,
58         __out           uint32_t *vi_countp);
59
60 LIBEFX_INTERNAL
61 extern  __checkReturn   efx_rc_t
62 rhead_nic_get_bar_region(
63         __in            efx_nic_t *enp,
64         __in            efx_nic_region_t region,
65         __out           uint32_t *offsetp,
66         __out           size_t *sizep);
67
68 LIBEFX_INTERNAL
69 extern  __checkReturn   efx_rc_t
70 rhead_nic_reset(
71         __in            efx_nic_t *enp);
72
73 LIBEFX_INTERNAL
74 extern  __checkReturn   efx_rc_t
75 rhead_nic_init(
76         __in            efx_nic_t *enp);
77
78 LIBEFX_INTERNAL
79 extern  __checkReturn   boolean_t
80 rhead_nic_hw_unavailable(
81         __in            efx_nic_t *enp);
82
83 LIBEFX_INTERNAL
84 extern                  void
85 rhead_nic_set_hw_unavailable(
86         __in            efx_nic_t *enp);
87
88 #if EFSYS_OPT_DIAG
89
90 LIBEFX_INTERNAL
91 extern  __checkReturn   efx_rc_t
92 rhead_nic_register_test(
93         __in            efx_nic_t *enp);
94
95 #endif  /* EFSYS_OPT_DIAG */
96
97 LIBEFX_INTERNAL
98 extern                  void
99 rhead_nic_fini(
100         __in            efx_nic_t *enp);
101
102 LIBEFX_INTERNAL
103 extern                  void
104 rhead_nic_unprobe(
105         __in            efx_nic_t *enp);
106
107
108 /* EV */
109
110 LIBEFX_INTERNAL
111 extern  __checkReturn   efx_rc_t
112 rhead_ev_init(
113         __in            efx_nic_t *enp);
114
115 LIBEFX_INTERNAL
116 extern                  void
117 rhead_ev_fini(
118         __in            efx_nic_t *enp);
119
120 LIBEFX_INTERNAL
121 extern  __checkReturn   efx_rc_t
122 rhead_ev_qcreate(
123         __in            efx_nic_t *enp,
124         __in            unsigned int index,
125         __in            efsys_mem_t *esmp,
126         __in            size_t ndescs,
127         __in            uint32_t id,
128         __in            uint32_t us,
129         __in            uint32_t flags,
130         __in            efx_evq_t *eep);
131
132 LIBEFX_INTERNAL
133 extern                  void
134 rhead_ev_qdestroy(
135         __in            efx_evq_t *eep);
136
137 LIBEFX_INTERNAL
138 extern  __checkReturn   efx_rc_t
139 rhead_ev_qprime(
140         __in            efx_evq_t *eep,
141         __in            unsigned int count);
142
143 LIBEFX_INTERNAL
144 extern                  void
145 rhead_ev_qpost(
146         __in    efx_evq_t *eep,
147         __in    uint16_t data);
148
149 LIBEFX_INTERNAL
150 extern                  void
151 rhead_ev_qpoll(
152         __in            efx_evq_t *eep,
153         __inout         unsigned int *countp,
154         __in            const efx_ev_callbacks_t *eecp,
155         __in_opt        void *arg);
156
157 LIBEFX_INTERNAL
158 extern  __checkReturn   efx_rc_t
159 rhead_ev_qmoderate(
160         __in            efx_evq_t *eep,
161         __in            unsigned int us);
162
163 #if EFSYS_OPT_QSTATS
164
165 LIBEFX_INTERNAL
166 extern                  void
167 rhead_ev_qstats_update(
168         __in                            efx_evq_t *eep,
169         __inout_ecount(EV_NQSTATS)      efsys_stat_t *stat);
170
171 #endif /* EFSYS_OPT_QSTATS */
172
173
174 /* INTR */
175
176 LIBEFX_INTERNAL
177 extern  __checkReturn   efx_rc_t
178 rhead_intr_init(
179         __in            efx_nic_t *enp,
180         __in            efx_intr_type_t type,
181         __in            efsys_mem_t *esmp);
182
183 LIBEFX_INTERNAL
184 extern                  void
185 rhead_intr_enable(
186         __in            efx_nic_t *enp);
187
188 LIBEFX_INTERNAL
189 extern                  void
190 rhead_intr_disable(
191         __in            efx_nic_t *enp);
192
193 LIBEFX_INTERNAL
194 extern                  void
195 rhead_intr_disable_unlocked(
196         __in            efx_nic_t *enp);
197
198 LIBEFX_INTERNAL
199 extern  __checkReturn   efx_rc_t
200 rhead_intr_trigger(
201         __in            efx_nic_t *enp,
202         __in            unsigned int level);
203
204 LIBEFX_INTERNAL
205 extern                  void
206 rhead_intr_status_line(
207         __in            efx_nic_t *enp,
208         __out           boolean_t *fatalp,
209         __out           uint32_t *qmaskp);
210
211 LIBEFX_INTERNAL
212 extern                  void
213 rhead_intr_status_message(
214         __in            efx_nic_t *enp,
215         __in            unsigned int message,
216         __out           boolean_t *fatalp);
217
218 LIBEFX_INTERNAL
219 extern                  void
220 rhead_intr_fatal(
221         __in            efx_nic_t *enp);
222
223 LIBEFX_INTERNAL
224 extern                  void
225 rhead_intr_fini(
226         __in            efx_nic_t *enp);
227
228
229 /* RX */
230
231 LIBEFX_INTERNAL
232 extern  __checkReturn   efx_rc_t
233 rhead_rx_init(
234         __in            efx_nic_t *enp);
235
236 LIBEFX_INTERNAL
237 extern                  void
238 rhead_rx_fini(
239         __in            efx_nic_t *enp);
240
241 #if EFSYS_OPT_RX_SCATTER
242
243 LIBEFX_INTERNAL
244 extern  __checkReturn   efx_rc_t
245 rhead_rx_scatter_enable(
246         __in            efx_nic_t *enp,
247         __in            unsigned int buf_size);
248
249 #endif  /* EFSYS_OPT_RX_SCATTER */
250
251 #if EFSYS_OPT_RX_SCALE
252
253 LIBEFX_INTERNAL
254 extern  __checkReturn   efx_rc_t
255 rhead_rx_scale_context_alloc(
256         __in            efx_nic_t *enp,
257         __in            efx_rx_scale_context_type_t type,
258         __in            uint32_t num_queues,
259         __out           uint32_t *rss_contextp);
260
261 LIBEFX_INTERNAL
262 extern  __checkReturn   efx_rc_t
263 rhead_rx_scale_context_free(
264         __in            efx_nic_t *enp,
265         __in            uint32_t rss_context);
266
267 LIBEFX_INTERNAL
268 extern  __checkReturn   efx_rc_t
269 rhead_rx_scale_mode_set(
270         __in            efx_nic_t *enp,
271         __in            uint32_t rss_context,
272         __in            efx_rx_hash_alg_t alg,
273         __in            efx_rx_hash_type_t type,
274         __in            boolean_t insert);
275
276 LIBEFX_INTERNAL
277 extern  __checkReturn   efx_rc_t
278 rhead_rx_scale_key_set(
279         __in            efx_nic_t *enp,
280         __in            uint32_t rss_context,
281         __in_ecount(n)  uint8_t *key,
282         __in            size_t n);
283
284 LIBEFX_INTERNAL
285 extern  __checkReturn   efx_rc_t
286 rhead_rx_scale_tbl_set(
287         __in            efx_nic_t *enp,
288         __in            uint32_t rss_context,
289         __in_ecount(n)  unsigned int *table,
290         __in            size_t n);
291
292 LIBEFX_INTERNAL
293 extern  __checkReturn   uint32_t
294 rhead_rx_prefix_hash(
295         __in            efx_nic_t *enp,
296         __in            efx_rx_hash_alg_t func,
297         __in            uint8_t *buffer);
298
299 #endif /* EFSYS_OPT_RX_SCALE */
300
301 LIBEFX_INTERNAL
302 extern  __checkReturn   efx_rc_t
303 rhead_rx_prefix_pktlen(
304         __in            efx_nic_t *enp,
305         __in            uint8_t *buffer,
306         __out           uint16_t *lengthp);
307
308 LIBEFX_INTERNAL
309 extern                          void
310 rhead_rx_qpost(
311         __in                    efx_rxq_t *erp,
312         __in_ecount(ndescs)     efsys_dma_addr_t *addrp,
313         __in                    size_t size,
314         __in                    unsigned int ndescs,
315         __in                    unsigned int completed,
316         __in                    unsigned int added);
317
318 LIBEFX_INTERNAL
319 extern                  void
320 rhead_rx_qpush(
321         __in            efx_rxq_t *erp,
322         __in            unsigned int added,
323         __inout         unsigned int *pushedp);
324
325 LIBEFX_INTERNAL
326 extern  __checkReturn   efx_rc_t
327 rhead_rx_qflush(
328         __in            efx_rxq_t *erp);
329
330 LIBEFX_INTERNAL
331 extern          void
332 rhead_rx_qenable(
333         __in            efx_rxq_t *erp);
334
335 union efx_rxq_type_data_u;
336
337 LIBEFX_INTERNAL
338 extern  __checkReturn   efx_rc_t
339 rhead_rx_qcreate(
340         __in            efx_nic_t *enp,
341         __in            unsigned int index,
342         __in            unsigned int label,
343         __in            efx_rxq_type_t type,
344         __in            const union efx_rxq_type_data_u *type_data,
345         __in            efsys_mem_t *esmp,
346         __in            size_t ndescs,
347         __in            uint32_t id,
348         __in            unsigned int flags,
349         __in            efx_evq_t *eep,
350         __in            efx_rxq_t *erp);
351
352 LIBEFX_INTERNAL
353 extern                  void
354 rhead_rx_qdestroy(
355         __in            efx_rxq_t *erp);
356
357
358 #ifdef  __cplusplus
359 }
360 #endif
361
362 #endif  /* _SYS_RHEAD_IMPL_H */