xref: /dpdk/drivers/common/sfc_efx/base/rhead_impl.h (revision e7ea5f304f0f7f433b4d60b21db7beec225c2123)
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 	__in		uint32_t table_nentries,
265 	__out		uint32_t *rss_contextp);
266 
267 LIBEFX_INTERNAL
268 extern	__checkReturn	efx_rc_t
269 rhead_rx_scale_context_free(
270 	__in		efx_nic_t *enp,
271 	__in		uint32_t rss_context);
272 
273 LIBEFX_INTERNAL
274 extern	__checkReturn	efx_rc_t
275 rhead_rx_scale_mode_set(
276 	__in		efx_nic_t *enp,
277 	__in		uint32_t rss_context,
278 	__in		efx_rx_hash_alg_t alg,
279 	__in		efx_rx_hash_type_t type,
280 	__in		boolean_t insert);
281 
282 LIBEFX_INTERNAL
283 extern	__checkReturn	efx_rc_t
284 rhead_rx_scale_key_set(
285 	__in		efx_nic_t *enp,
286 	__in		uint32_t rss_context,
287 	__in_ecount(n)	uint8_t *key,
288 	__in		size_t n);
289 
290 LIBEFX_INTERNAL
291 extern	__checkReturn		efx_rc_t
292 rhead_rx_scale_tbl_set(
293 	__in			efx_nic_t *enp,
294 	__in			uint32_t rss_context,
295 	__in_ecount(nentries)	unsigned int *table,
296 	__in			size_t nentries);
297 
298 LIBEFX_INTERNAL
299 extern	__checkReturn	uint32_t
300 rhead_rx_prefix_hash(
301 	__in		efx_nic_t *enp,
302 	__in		efx_rx_hash_alg_t func,
303 	__in		uint8_t *buffer);
304 
305 #endif /* EFSYS_OPT_RX_SCALE */
306 
307 LIBEFX_INTERNAL
308 extern	__checkReturn	efx_rc_t
309 rhead_rx_prefix_pktlen(
310 	__in		efx_nic_t *enp,
311 	__in		uint8_t *buffer,
312 	__out		uint16_t *lengthp);
313 
314 LIBEFX_INTERNAL
315 extern				void
316 rhead_rx_qpost(
317 	__in			efx_rxq_t *erp,
318 	__in_ecount(ndescs)	efsys_dma_addr_t *addrp,
319 	__in			size_t size,
320 	__in			unsigned int ndescs,
321 	__in			unsigned int completed,
322 	__in			unsigned int added);
323 
324 LIBEFX_INTERNAL
325 extern			void
326 rhead_rx_qpush(
327 	__in		efx_rxq_t *erp,
328 	__in		unsigned int added,
329 	__inout		unsigned int *pushedp);
330 
331 LIBEFX_INTERNAL
332 extern	__checkReturn	efx_rc_t
333 rhead_rx_qflush(
334 	__in		efx_rxq_t *erp);
335 
336 LIBEFX_INTERNAL
337 extern		void
338 rhead_rx_qenable(
339 	__in		efx_rxq_t *erp);
340 
341 union efx_rxq_type_data_u;
342 
343 LIBEFX_INTERNAL
344 extern	__checkReturn	efx_rc_t
345 rhead_rx_qcreate(
346 	__in		efx_nic_t *enp,
347 	__in		unsigned int index,
348 	__in		unsigned int label,
349 	__in		efx_rxq_type_t type,
350 	__in		const union efx_rxq_type_data_u *type_data,
351 	__in		efsys_mem_t *esmp,
352 	__in		size_t ndescs,
353 	__in		uint32_t id,
354 	__in		unsigned int flags,
355 	__in		efx_evq_t *eep,
356 	__in		efx_rxq_t *erp);
357 
358 LIBEFX_INTERNAL
359 extern			void
360 rhead_rx_qdestroy(
361 	__in		efx_rxq_t *erp);
362 
363 
364 /* TX */
365 
366 LIBEFX_INTERNAL
367 extern	__checkReturn	efx_rc_t
368 rhead_tx_init(
369 	__in		efx_nic_t *enp);
370 
371 LIBEFX_INTERNAL
372 extern			void
373 rhead_tx_fini(
374 	__in		efx_nic_t *enp);
375 
376 LIBEFX_INTERNAL
377 extern	__checkReturn	efx_rc_t
378 rhead_tx_qcreate(
379 	__in		efx_nic_t *enp,
380 	__in		unsigned int index,
381 	__in		unsigned int label,
382 	__in		efsys_mem_t *esmp,
383 	__in		size_t ndescs,
384 	__in		uint32_t id,
385 	__in		uint16_t flags,
386 	__in		efx_evq_t *eep,
387 	__in		efx_txq_t *etp,
388 	__out		unsigned int *addedp);
389 
390 LIBEFX_INTERNAL
391 extern		void
392 rhead_tx_qdestroy(
393 	__in		efx_txq_t *etp);
394 
395 LIBEFX_INTERNAL
396 extern	__checkReturn		efx_rc_t
397 rhead_tx_qpost(
398 	__in			efx_txq_t *etp,
399 	__in_ecount(ndescs)	efx_buffer_t *ebp,
400 	__in			unsigned int ndescs,
401 	__in			unsigned int completed,
402 	__inout			unsigned int *addedp);
403 
404 LIBEFX_INTERNAL
405 extern			void
406 rhead_tx_qpush(
407 	__in		efx_txq_t *etp,
408 	__in		unsigned int added,
409 	__in		unsigned int pushed);
410 
411 LIBEFX_INTERNAL
412 extern	__checkReturn	efx_rc_t
413 rhead_tx_qpace(
414 	__in		efx_txq_t *etp,
415 	__in		unsigned int ns);
416 
417 LIBEFX_INTERNAL
418 extern	__checkReturn	efx_rc_t
419 rhead_tx_qflush(
420 	__in		efx_txq_t *etp);
421 
422 LIBEFX_INTERNAL
423 extern			void
424 rhead_tx_qenable(
425 	__in		efx_txq_t *etp);
426 
427 LIBEFX_INTERNAL
428 extern	__checkReturn	efx_rc_t
429 rhead_tx_qdesc_post(
430 	__in		efx_txq_t *etp,
431 	__in_ecount(n)	efx_desc_t *ed,
432 	__in		unsigned int n,
433 	__in		unsigned int completed,
434 	__inout		unsigned int *addedp);
435 
436 #if EFSYS_OPT_QSTATS
437 
438 LIBEFX_INTERNAL
439 extern			void
440 rhead_tx_qstats_update(
441 	__in				efx_txq_t *etp,
442 	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat);
443 
444 #endif /* EFSYS_OPT_QSTATS */
445 
446 #if EFSYS_OPT_TUNNEL
447 
448 LIBEFX_INTERNAL
449 extern	__checkReturn	efx_rc_t
450 rhead_tunnel_reconfigure(
451 	__in		efx_nic_t *enp);
452 
453 LIBEFX_INTERNAL
454 extern			void
455 rhead_tunnel_fini(
456 	__in		efx_nic_t *enp);
457 
458 #endif /* EFSYS_OPT_TUNNEL */
459 
460 #if EFSYS_OPT_PCI
461 
462 /*
463  * Perform discovery of function control window by looking for a
464  * EF100 locator in Xilinx capabilities tables.
465  */
466 LIBEFX_INTERNAL
467 extern	__checkReturn			efx_rc_t
468 rhead_pci_nic_membar_lookup(
469 	__in				efsys_pci_config_t *espcp,
470 	__in				const efx_pci_ops_t *epop,
471 	__out				efx_bar_region_t *ebrp);
472 
473 #endif /* EFSYS_OPT_PCI */
474 
475 LIBEFX_INTERNAL
476 extern	__checkReturn			efx_rc_t
477 rhead_nic_xilinx_cap_tbl_read_ef100_locator(
478 	__in				efsys_bar_t *esbp,
479 	__in				efsys_dma_addr_t offset,
480 	__out				efx_bar_region_t *ebrp);
481 
482 #if EFSYS_OPT_VIRTIO
483 
484 LIBEFX_INTERNAL
485 extern	__checkReturn			efx_rc_t
486 rhead_virtio_qstart(
487 	__in				efx_virtio_vq_t *evvp,
488 	__in				efx_virtio_vq_cfg_t *evvcp,
489 	__in_opt			efx_virtio_vq_dyncfg_t *evvdp);
490 
491 LIBEFX_INTERNAL
492 extern	__checkReturn			efx_rc_t
493 rhead_virtio_qstop(
494 	__in				efx_virtio_vq_t *evvp,
495 	__out_opt			efx_virtio_vq_dyncfg_t *evvdp);
496 
497 LIBEFX_INTERNAL
498 extern	__checkReturn			efx_rc_t
499 rhead_virtio_get_doorbell_offset(
500 	__in				efx_virtio_vq_t *evvp,
501 	__out				uint32_t *offsetp);
502 
503 LIBEFX_INTERNAL
504 extern	__checkReturn			efx_rc_t
505 rhead_virtio_get_features(
506 	__in				efx_nic_t *enp,
507 	__in				efx_virtio_device_type_t type,
508 	__out				uint64_t *featuresp);
509 
510 LIBEFX_INTERNAL
511 extern	__checkReturn			efx_rc_t
512 rhead_virtio_verify_features(
513 	__in				efx_nic_t *enp,
514 	__in				efx_virtio_device_type_t type,
515 	__in				uint64_t features);
516 
517 #endif /* EFSYS_OPT_VIRTIO */
518 
519 #ifdef	__cplusplus
520 }
521 #endif
522 
523 #endif	/* _SYS_RHEAD_IMPL_H */
524