xref: /dpdk/drivers/common/sfc_efx/base/rhead_impl.h (revision daa02b5cddbb8e11b31d41e2bf7bb1ae64dcae2f)
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 */
523