xref: /dpdk/drivers/common/sfc_efx/base/rhead_impl.h (revision f5057be340e44f3edc0fe90fa875eb89a4c49b4f)
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 #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 #ifdef	__cplusplus
481 }
482 #endif
483 
484 #endif	/* _SYS_RHEAD_IMPL_H */
485