xref: /f-stack/dpdk/drivers/net/sfc/sfc_ef10_tx.c (revision 16d80a6d)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright (c) 2016-2018 Solarflare Communications Inc.
4  * All rights reserved.
5  *
6  * This software was jointly developed between OKTET Labs (under contract
7  * for Solarflare) and Solarflare Communications, Inc.
8  */
9 
10 #include <stdbool.h>
11 
12 #include <rte_mbuf.h>
13 #include <rte_io.h>
14 #include <rte_ip.h>
15 #include <rte_tcp.h>
16 
17 #include "efx.h"
18 #include "efx_types.h"
19 #include "efx_regs.h"
20 #include "efx_regs_ef10.h"
21 
22 #include "sfc_dp_tx.h"
23 #include "sfc_tweak.h"
24 #include "sfc_kvargs.h"
25 #include "sfc_ef10.h"
26 #include "sfc_tso.h"
27 
28 #define sfc_ef10_tx_err(dpq, ...) \
29 	SFC_DP_LOG(SFC_KVARG_DATAPATH_EF10, ERR, dpq, __VA_ARGS__)
30 
31 /** Maximum length of the DMA descriptor data */
32 #define SFC_EF10_TX_DMA_DESC_LEN_MAX \
33 	((1u << ESF_DZ_TX_KER_BYTE_CNT_WIDTH) - 1)
34 
35 /**
36  * Maximum number of descriptors/buffers in the Tx ring.
37  * It should guarantee that corresponding event queue never overfill.
38  * EF10 native datapath uses event queue of the same size as Tx queue.
39  * Maximum number of events on datapath can be estimated as number of
40  * Tx queue entries (one event per Tx buffer in the worst case) plus
41  * Tx error and flush events.
42  */
43 #define SFC_EF10_TXQ_LIMIT(_ndesc) \
44 	((_ndesc) - 1 /* head must not step on tail */ - \
45 	 (SFC_EF10_EV_PER_CACHE_LINE - 1) /* max unused EvQ entries */ - \
46 	 1 /* Rx error */ - 1 /* flush */)
47 
48 struct sfc_ef10_tx_sw_desc {
49 	struct rte_mbuf			*mbuf;
50 };
51 
52 struct sfc_ef10_txq {
53 	unsigned int			flags;
54 #define SFC_EF10_TXQ_STARTED		0x1
55 #define SFC_EF10_TXQ_NOT_RUNNING	0x2
56 #define SFC_EF10_TXQ_EXCEPTION		0x4
57 
58 	unsigned int			ptr_mask;
59 	unsigned int			added;
60 	unsigned int			completed;
61 	unsigned int			max_fill_level;
62 	unsigned int			free_thresh;
63 	unsigned int			evq_read_ptr;
64 	struct sfc_ef10_tx_sw_desc	*sw_ring;
65 	efx_qword_t			*txq_hw_ring;
66 	volatile void			*doorbell;
67 	efx_qword_t			*evq_hw_ring;
68 	uint8_t				*tsoh;
69 	rte_iova_t			tsoh_iova;
70 	uint16_t			tso_tcp_header_offset_limit;
71 
72 	/* Datapath transmit queue anchor */
73 	struct sfc_dp_txq		dp;
74 };
75 
76 static inline struct sfc_ef10_txq *
77 sfc_ef10_txq_by_dp_txq(struct sfc_dp_txq *dp_txq)
78 {
79 	return container_of(dp_txq, struct sfc_ef10_txq, dp);
80 }
81 
82 static bool
83 sfc_ef10_tx_get_event(struct sfc_ef10_txq *txq, efx_qword_t *tx_ev)
84 {
85 	volatile efx_qword_t *evq_hw_ring = txq->evq_hw_ring;
86 
87 	/*
88 	 * Exception flag is set when reap is done.
89 	 * It is never done twice per packet burst get and absence of
90 	 * the flag is checked on burst get entry.
91 	 */
92 	SFC_ASSERT((txq->flags & SFC_EF10_TXQ_EXCEPTION) == 0);
93 
94 	*tx_ev = evq_hw_ring[txq->evq_read_ptr & txq->ptr_mask];
95 
96 	if (!sfc_ef10_ev_present(*tx_ev))
97 		return false;
98 
99 	if (unlikely(EFX_QWORD_FIELD(*tx_ev, FSF_AZ_EV_CODE) !=
100 		     FSE_AZ_EV_CODE_TX_EV)) {
101 		/*
102 		 * Do not move read_ptr to keep the event for exception
103 		 * handling by the control path.
104 		 */
105 		txq->flags |= SFC_EF10_TXQ_EXCEPTION;
106 		sfc_ef10_tx_err(&txq->dp.dpq,
107 				"TxQ exception at EvQ read ptr %#x",
108 				txq->evq_read_ptr);
109 		return false;
110 	}
111 
112 	txq->evq_read_ptr++;
113 	return true;
114 }
115 
116 static unsigned int
117 sfc_ef10_tx_process_events(struct sfc_ef10_txq *txq)
118 {
119 	const unsigned int curr_done = txq->completed - 1;
120 	unsigned int anew_done = curr_done;
121 	efx_qword_t tx_ev;
122 
123 	while (sfc_ef10_tx_get_event(txq, &tx_ev)) {
124 		/*
125 		 * DROP_EVENT is an internal to the NIC, software should
126 		 * never see it and, therefore, may ignore it.
127 		 */
128 
129 		/* Update the latest done descriptor */
130 		anew_done = EFX_QWORD_FIELD(tx_ev, ESF_DZ_TX_DESCR_INDX);
131 	}
132 	return (anew_done - curr_done) & txq->ptr_mask;
133 }
134 
135 static void
136 sfc_ef10_tx_reap(struct sfc_ef10_txq *txq)
137 {
138 	const unsigned int old_read_ptr = txq->evq_read_ptr;
139 	const unsigned int ptr_mask = txq->ptr_mask;
140 	unsigned int completed = txq->completed;
141 	unsigned int pending = completed;
142 
143 	pending += sfc_ef10_tx_process_events(txq);
144 
145 	if (pending != completed) {
146 		struct rte_mbuf *bulk[SFC_TX_REAP_BULK_SIZE];
147 		unsigned int nb = 0;
148 
149 		do {
150 			struct sfc_ef10_tx_sw_desc *txd;
151 			struct rte_mbuf *m;
152 
153 			txd = &txq->sw_ring[completed & ptr_mask];
154 			if (txd->mbuf == NULL)
155 				continue;
156 
157 			m = rte_pktmbuf_prefree_seg(txd->mbuf);
158 			txd->mbuf = NULL;
159 			if (m == NULL)
160 				continue;
161 
162 			if ((nb == RTE_DIM(bulk)) ||
163 			    ((nb != 0) && (m->pool != bulk[0]->pool))) {
164 				rte_mempool_put_bulk(bulk[0]->pool,
165 						     (void *)bulk, nb);
166 				nb = 0;
167 			}
168 
169 			bulk[nb++] = m;
170 		} while (++completed != pending);
171 
172 		if (nb != 0)
173 			rte_mempool_put_bulk(bulk[0]->pool, (void *)bulk, nb);
174 
175 		txq->completed = completed;
176 	}
177 
178 	sfc_ef10_ev_qclear(txq->evq_hw_ring, ptr_mask, old_read_ptr,
179 			   txq->evq_read_ptr);
180 }
181 
182 static void
183 sfc_ef10_tx_qdesc_dma_create(rte_iova_t addr, uint16_t size, bool eop,
184 			     efx_qword_t *edp)
185 {
186 	EFX_POPULATE_QWORD_4(*edp,
187 			     ESF_DZ_TX_KER_TYPE, 0,
188 			     ESF_DZ_TX_KER_CONT, !eop,
189 			     ESF_DZ_TX_KER_BYTE_CNT, size,
190 			     ESF_DZ_TX_KER_BUF_ADDR, addr);
191 }
192 
193 static void
194 sfc_ef10_tx_qdesc_tso2_create(struct sfc_ef10_txq * const txq,
195 			      unsigned int added, uint16_t ipv4_id,
196 			      uint16_t outer_ipv4_id, uint32_t tcp_seq,
197 			      uint16_t tcp_mss)
198 {
199 	EFX_POPULATE_QWORD_5(txq->txq_hw_ring[added & txq->ptr_mask],
200 			    ESF_DZ_TX_DESC_IS_OPT, 1,
201 			    ESF_DZ_TX_OPTION_TYPE,
202 			    ESE_DZ_TX_OPTION_DESC_TSO,
203 			    ESF_DZ_TX_TSO_OPTION_TYPE,
204 			    ESE_DZ_TX_TSO_OPTION_DESC_FATSO2A,
205 			    ESF_DZ_TX_TSO_IP_ID, ipv4_id,
206 			    ESF_DZ_TX_TSO_TCP_SEQNO, tcp_seq);
207 	EFX_POPULATE_QWORD_5(txq->txq_hw_ring[(added + 1) & txq->ptr_mask],
208 			    ESF_DZ_TX_DESC_IS_OPT, 1,
209 			    ESF_DZ_TX_OPTION_TYPE,
210 			    ESE_DZ_TX_OPTION_DESC_TSO,
211 			    ESF_DZ_TX_TSO_OPTION_TYPE,
212 			    ESE_DZ_TX_TSO_OPTION_DESC_FATSO2B,
213 			    ESF_DZ_TX_TSO_TCP_MSS, tcp_mss,
214 			    ESF_DZ_TX_TSO_OUTER_IPID, outer_ipv4_id);
215 }
216 
217 static inline void
218 sfc_ef10_tx_qpush(struct sfc_ef10_txq *txq, unsigned int added,
219 		  unsigned int pushed)
220 {
221 	efx_qword_t desc;
222 	efx_oword_t oword;
223 
224 	/*
225 	 * This improves performance by pushing a TX descriptor at the same
226 	 * time as the doorbell. The descriptor must be added to the TXQ,
227 	 * so that can be used if the hardware decides not to use the pushed
228 	 * descriptor.
229 	 */
230 	desc.eq_u64[0] = txq->txq_hw_ring[pushed & txq->ptr_mask].eq_u64[0];
231 	EFX_POPULATE_OWORD_3(oword,
232 		ERF_DZ_TX_DESC_WPTR, added & txq->ptr_mask,
233 		ERF_DZ_TX_DESC_HWORD, EFX_QWORD_FIELD(desc, EFX_DWORD_1),
234 		ERF_DZ_TX_DESC_LWORD, EFX_QWORD_FIELD(desc, EFX_DWORD_0));
235 
236 	/* DMA sync to device is not required */
237 
238 	/*
239 	 * rte_io_wmb() which guarantees that the STORE operations
240 	 * (i.e. Tx and event descriptor updates) that precede
241 	 * the rte_io_wmb() call are visible to NIC before the STORE
242 	 * operations that follow it (i.e. doorbell write).
243 	 */
244 	rte_io_wmb();
245 
246 	*(volatile __m128i *)txq->doorbell = oword.eo_u128[0];
247 }
248 
249 static unsigned int
250 sfc_ef10_tx_pkt_descs_max(const struct rte_mbuf *m)
251 {
252 	unsigned int extra_descs_per_seg;
253 	unsigned int extra_descs_per_pkt;
254 
255 	/*
256 	 * VLAN offload is not supported yet, so no extra descriptors
257 	 * are required for VLAN option descriptor.
258 	 */
259 
260 /** Maximum length of the mbuf segment data */
261 #define SFC_MBUF_SEG_LEN_MAX		UINT16_MAX
262 	RTE_BUILD_BUG_ON(sizeof(m->data_len) != 2);
263 
264 	/*
265 	 * Each segment is already counted once below.  So, calculate
266 	 * how many extra DMA descriptors may be required per segment in
267 	 * the worst case because of maximum DMA descriptor length limit.
268 	 * If maximum segment length is less or equal to maximum DMA
269 	 * descriptor length, no extra DMA descriptors are required.
270 	 */
271 	extra_descs_per_seg =
272 		(SFC_MBUF_SEG_LEN_MAX - 1) / SFC_EF10_TX_DMA_DESC_LEN_MAX;
273 
274 /** Maximum length of the packet */
275 #define SFC_MBUF_PKT_LEN_MAX		UINT32_MAX
276 	RTE_BUILD_BUG_ON(sizeof(m->pkt_len) != 4);
277 
278 	/*
279 	 * One more limitation on maximum number of extra DMA descriptors
280 	 * comes from slicing entire packet because of DMA descriptor length
281 	 * limit taking into account that there is at least one segment
282 	 * which is already counted below (so division of the maximum
283 	 * packet length minus one with round down).
284 	 * TSO is not supported yet, so packet length is limited by
285 	 * maximum PDU size.
286 	 */
287 	extra_descs_per_pkt =
288 		(RTE_MIN((unsigned int)EFX_MAC_PDU_MAX,
289 			 SFC_MBUF_PKT_LEN_MAX) - 1) /
290 		SFC_EF10_TX_DMA_DESC_LEN_MAX;
291 
292 	return m->nb_segs + RTE_MIN(m->nb_segs * extra_descs_per_seg,
293 				    extra_descs_per_pkt);
294 }
295 
296 static bool
297 sfc_ef10_try_reap(struct sfc_ef10_txq * const txq, unsigned int added,
298 		  unsigned int needed_desc, unsigned int *dma_desc_space,
299 		  bool *reap_done)
300 {
301 	if (*reap_done)
302 		return false;
303 
304 	if (added != txq->added) {
305 		sfc_ef10_tx_qpush(txq, added, txq->added);
306 		txq->added = added;
307 	}
308 
309 	sfc_ef10_tx_reap(txq);
310 	*reap_done = true;
311 
312 	/*
313 	 * Recalculate DMA descriptor space since Tx reap may change
314 	 * the number of completed descriptors
315 	 */
316 	*dma_desc_space = txq->max_fill_level -
317 		(added - txq->completed);
318 
319 	return (needed_desc <= *dma_desc_space);
320 }
321 
322 static int
323 sfc_ef10_xmit_tso_pkt(struct sfc_ef10_txq * const txq, struct rte_mbuf *m_seg,
324 		      unsigned int *added, unsigned int *dma_desc_space,
325 		      bool *reap_done)
326 {
327 	size_t iph_off = m_seg->l2_len;
328 	size_t tcph_off = m_seg->l2_len + m_seg->l3_len;
329 	size_t header_len = m_seg->l2_len + m_seg->l3_len + m_seg->l4_len;
330 	/* Offset of the payload in the last segment that contains the header */
331 	size_t in_off = 0;
332 	const struct tcp_hdr *th;
333 	uint16_t packet_id;
334 	uint32_t sent_seq;
335 	uint8_t *hdr_addr;
336 	rte_iova_t hdr_iova;
337 	struct rte_mbuf *first_m_seg = m_seg;
338 	unsigned int pkt_start = *added;
339 	unsigned int needed_desc;
340 	struct rte_mbuf *m_seg_to_free_up_to = first_m_seg;
341 	bool eop;
342 
343 	if (unlikely(tcph_off > txq->tso_tcp_header_offset_limit))
344 		return EMSGSIZE;
345 
346 	/*
347 	 * Preliminary estimation of required DMA descriptors, including extra
348 	 * descriptor for TSO header that is needed when the header is
349 	 * separated from payload in one segment. It does not include
350 	 * extra descriptors that may appear when a big segment is split across
351 	 * several descriptors.
352 	 */
353 	needed_desc = m_seg->nb_segs +
354 			(unsigned int)SFC_TSO_OPT_DESCS_NUM +
355 			(unsigned int)SFC_TSO_HDR_DESCS_NUM;
356 
357 	if (needed_desc > *dma_desc_space &&
358 	    !sfc_ef10_try_reap(txq, pkt_start, needed_desc,
359 			       dma_desc_space, reap_done)) {
360 		/*
361 		 * If a future Tx reap may increase available DMA descriptor
362 		 * space, do not try to send the packet.
363 		 */
364 		if (txq->completed != pkt_start)
365 			return ENOSPC;
366 		/*
367 		 * Do not allow to send packet if the maximum DMA
368 		 * descriptor space is not sufficient to hold TSO
369 		 * descriptors, header descriptor and at least 1
370 		 * segment descriptor.
371 		 */
372 		if (*dma_desc_space < SFC_TSO_OPT_DESCS_NUM +
373 				SFC_TSO_HDR_DESCS_NUM + 1)
374 			return EMSGSIZE;
375 	}
376 
377 	/* Check if the header is not fragmented */
378 	if (rte_pktmbuf_data_len(m_seg) >= header_len) {
379 		hdr_addr = rte_pktmbuf_mtod(m_seg, uint8_t *);
380 		hdr_iova = rte_mbuf_data_iova(m_seg);
381 		if (rte_pktmbuf_data_len(m_seg) == header_len) {
382 			/* Cannot send a packet that consists only of header */
383 			if (unlikely(m_seg->next == NULL))
384 				return EMSGSIZE;
385 			/*
386 			 * Associate header mbuf with header descriptor
387 			 * which is located after TSO descriptors.
388 			 */
389 			txq->sw_ring[(pkt_start + SFC_TSO_OPT_DESCS_NUM) &
390 				     txq->ptr_mask].mbuf = m_seg;
391 			m_seg = m_seg->next;
392 			in_off = 0;
393 
394 			/*
395 			 * If there is no payload offset (payload starts at the
396 			 * beginning of a segment) then an extra descriptor for
397 			 * separated header is not needed.
398 			 */
399 			needed_desc--;
400 		} else {
401 			in_off = header_len;
402 		}
403 	} else {
404 		unsigned int copied_segs;
405 		unsigned int hdr_addr_off = (*added & txq->ptr_mask) *
406 				SFC_TSOH_STD_LEN;
407 
408 		/*
409 		 * Discard a packet if header linearization is needed but
410 		 * the header is too big.
411 		 */
412 		if (unlikely(header_len > SFC_TSOH_STD_LEN))
413 			return EMSGSIZE;
414 
415 		hdr_addr = txq->tsoh + hdr_addr_off;
416 		hdr_iova = txq->tsoh_iova + hdr_addr_off;
417 		copied_segs = sfc_tso_prepare_header(hdr_addr, header_len,
418 						     &m_seg, &in_off);
419 
420 		/* Cannot send a packet that consists only of header */
421 		if (unlikely(m_seg == NULL))
422 			return EMSGSIZE;
423 
424 		m_seg_to_free_up_to = m_seg;
425 		/*
426 		 * Reduce the number of needed descriptors by the number of
427 		 * segments that entirely consist of header data.
428 		 */
429 		needed_desc -= copied_segs;
430 
431 		/* Extra descriptor for separated header is not needed */
432 		if (in_off == 0)
433 			needed_desc--;
434 	}
435 
436 	switch (first_m_seg->ol_flags & (PKT_TX_IPV4 | PKT_TX_IPV6)) {
437 	case PKT_TX_IPV4: {
438 		const struct ipv4_hdr *iphe4;
439 
440 		iphe4 = (const struct ipv4_hdr *)(hdr_addr + iph_off);
441 		rte_memcpy(&packet_id, &iphe4->packet_id, sizeof(uint16_t));
442 		packet_id = rte_be_to_cpu_16(packet_id);
443 		break;
444 	}
445 	case PKT_TX_IPV6:
446 		packet_id = 0;
447 		break;
448 	default:
449 		return EINVAL;
450 	}
451 
452 	th = (const struct tcp_hdr *)(hdr_addr + tcph_off);
453 	rte_memcpy(&sent_seq, &th->sent_seq, sizeof(uint32_t));
454 	sent_seq = rte_be_to_cpu_32(sent_seq);
455 
456 	sfc_ef10_tx_qdesc_tso2_create(txq, *added, packet_id, 0, sent_seq,
457 			first_m_seg->tso_segsz);
458 	(*added) += SFC_TSO_OPT_DESCS_NUM;
459 
460 	sfc_ef10_tx_qdesc_dma_create(hdr_iova, header_len, false,
461 			&txq->txq_hw_ring[(*added) & txq->ptr_mask]);
462 	(*added)++;
463 
464 	do {
465 		rte_iova_t next_frag = rte_mbuf_data_iova(m_seg);
466 		unsigned int seg_len = rte_pktmbuf_data_len(m_seg);
467 		unsigned int id;
468 
469 		next_frag += in_off;
470 		seg_len -= in_off;
471 		in_off = 0;
472 
473 		do {
474 			rte_iova_t frag_addr = next_frag;
475 			size_t frag_len;
476 
477 			frag_len = RTE_MIN(seg_len,
478 					   SFC_EF10_TX_DMA_DESC_LEN_MAX);
479 
480 			next_frag += frag_len;
481 			seg_len -= frag_len;
482 
483 			eop = (seg_len == 0 && m_seg->next == NULL);
484 
485 			id = (*added) & txq->ptr_mask;
486 			(*added)++;
487 
488 			/*
489 			 * Initially we assume that one DMA descriptor is needed
490 			 * for every segment. When the segment is split across
491 			 * several DMA descriptors, increase the estimation.
492 			 */
493 			needed_desc += (seg_len != 0);
494 
495 			/*
496 			 * When no more descriptors can be added, but not all
497 			 * segments are processed.
498 			 */
499 			if (*added - pkt_start == *dma_desc_space &&
500 			    !eop &&
501 			    !sfc_ef10_try_reap(txq, pkt_start, needed_desc,
502 						dma_desc_space, reap_done)) {
503 				struct rte_mbuf *m;
504 				struct rte_mbuf *m_next;
505 
506 				if (txq->completed != pkt_start) {
507 					unsigned int i;
508 
509 					/*
510 					 * Reset mbuf associations with added
511 					 * descriptors.
512 					 */
513 					for (i = pkt_start; i != *added; i++) {
514 						id = i & txq->ptr_mask;
515 						txq->sw_ring[id].mbuf = NULL;
516 					}
517 					return ENOSPC;
518 				}
519 
520 				/* Free the segments that cannot be sent */
521 				for (m = m_seg->next; m != NULL; m = m_next) {
522 					m_next = m->next;
523 					rte_pktmbuf_free_seg(m);
524 				}
525 				eop = true;
526 				/* Ignore the rest of the segment */
527 				seg_len = 0;
528 			}
529 
530 			sfc_ef10_tx_qdesc_dma_create(frag_addr, frag_len,
531 					eop, &txq->txq_hw_ring[id]);
532 
533 		} while (seg_len != 0);
534 
535 		txq->sw_ring[id].mbuf = m_seg;
536 
537 		m_seg = m_seg->next;
538 	} while (!eop);
539 
540 	/*
541 	 * Free segments which content was entirely copied to the TSO header
542 	 * memory space of Tx queue
543 	 */
544 	for (m_seg = first_m_seg; m_seg != m_seg_to_free_up_to;) {
545 		struct rte_mbuf *seg_to_free = m_seg;
546 
547 		m_seg = m_seg->next;
548 		rte_pktmbuf_free_seg(seg_to_free);
549 	}
550 
551 	return 0;
552 }
553 
554 static uint16_t
555 sfc_ef10_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
556 {
557 	struct sfc_ef10_txq * const txq = sfc_ef10_txq_by_dp_txq(tx_queue);
558 	unsigned int added;
559 	unsigned int dma_desc_space;
560 	bool reap_done;
561 	struct rte_mbuf **pktp;
562 	struct rte_mbuf **pktp_end;
563 
564 	if (unlikely(txq->flags &
565 		     (SFC_EF10_TXQ_NOT_RUNNING | SFC_EF10_TXQ_EXCEPTION)))
566 		return 0;
567 
568 	added = txq->added;
569 	dma_desc_space = txq->max_fill_level - (added - txq->completed);
570 
571 	reap_done = (dma_desc_space < txq->free_thresh);
572 	if (reap_done) {
573 		sfc_ef10_tx_reap(txq);
574 		dma_desc_space = txq->max_fill_level - (added - txq->completed);
575 	}
576 
577 	for (pktp = &tx_pkts[0], pktp_end = &tx_pkts[nb_pkts];
578 	     pktp != pktp_end;
579 	     ++pktp) {
580 		struct rte_mbuf *m_seg = *pktp;
581 		unsigned int pkt_start = added;
582 		uint32_t pkt_len;
583 
584 		if (likely(pktp + 1 != pktp_end))
585 			rte_mbuf_prefetch_part1(pktp[1]);
586 
587 		if (m_seg->ol_flags & PKT_TX_TCP_SEG) {
588 			int rc;
589 
590 			rc = sfc_ef10_xmit_tso_pkt(txq, m_seg, &added,
591 					&dma_desc_space, &reap_done);
592 			if (rc != 0) {
593 				added = pkt_start;
594 
595 				/* Packet can be sent in following xmit calls */
596 				if (likely(rc == ENOSPC))
597 					break;
598 
599 				/*
600 				 * Packet cannot be sent, tell RTE that
601 				 * it is sent, but actually drop it and
602 				 * continue with another packet
603 				 */
604 				rte_pktmbuf_free(*pktp);
605 				continue;
606 			}
607 
608 			goto dma_desc_space_update;
609 		}
610 
611 		if (sfc_ef10_tx_pkt_descs_max(m_seg) > dma_desc_space) {
612 			if (reap_done)
613 				break;
614 
615 			/* Push already prepared descriptors before polling */
616 			if (added != txq->added) {
617 				sfc_ef10_tx_qpush(txq, added, txq->added);
618 				txq->added = added;
619 			}
620 
621 			sfc_ef10_tx_reap(txq);
622 			reap_done = true;
623 			dma_desc_space = txq->max_fill_level -
624 				(added - txq->completed);
625 			if (sfc_ef10_tx_pkt_descs_max(m_seg) > dma_desc_space)
626 				break;
627 		}
628 
629 		pkt_len = m_seg->pkt_len;
630 		do {
631 			rte_iova_t seg_addr = rte_mbuf_data_iova(m_seg);
632 			unsigned int seg_len = rte_pktmbuf_data_len(m_seg);
633 			unsigned int id = added & txq->ptr_mask;
634 
635 			SFC_ASSERT(seg_len <= SFC_EF10_TX_DMA_DESC_LEN_MAX);
636 
637 			pkt_len -= seg_len;
638 
639 			sfc_ef10_tx_qdesc_dma_create(seg_addr,
640 				seg_len, (pkt_len == 0),
641 				&txq->txq_hw_ring[id]);
642 
643 			/*
644 			 * rte_pktmbuf_free() is commonly used in DPDK for
645 			 * recycling packets - the function checks every
646 			 * segment's reference counter and returns the
647 			 * buffer to its pool whenever possible;
648 			 * nevertheless, freeing mbuf segments one by one
649 			 * may entail some performance decline;
650 			 * from this point, sfc_efx_tx_reap() does the same job
651 			 * on its own and frees buffers in bulks (all mbufs
652 			 * within a bulk belong to the same pool);
653 			 * from this perspective, individual segment pointers
654 			 * must be associated with the corresponding SW
655 			 * descriptors independently so that only one loop
656 			 * is sufficient on reap to inspect all the buffers
657 			 */
658 			txq->sw_ring[id].mbuf = m_seg;
659 
660 			++added;
661 
662 		} while ((m_seg = m_seg->next) != 0);
663 
664 dma_desc_space_update:
665 		dma_desc_space -= (added - pkt_start);
666 	}
667 
668 	if (likely(added != txq->added)) {
669 		sfc_ef10_tx_qpush(txq, added, txq->added);
670 		txq->added = added;
671 	}
672 
673 #if SFC_TX_XMIT_PKTS_REAP_AT_LEAST_ONCE
674 	if (!reap_done)
675 		sfc_ef10_tx_reap(txq);
676 #endif
677 
678 	return pktp - &tx_pkts[0];
679 }
680 
681 static void
682 sfc_ef10_simple_tx_reap(struct sfc_ef10_txq *txq)
683 {
684 	const unsigned int old_read_ptr = txq->evq_read_ptr;
685 	const unsigned int ptr_mask = txq->ptr_mask;
686 	unsigned int completed = txq->completed;
687 	unsigned int pending = completed;
688 
689 	pending += sfc_ef10_tx_process_events(txq);
690 
691 	if (pending != completed) {
692 		struct rte_mbuf *bulk[SFC_TX_REAP_BULK_SIZE];
693 		unsigned int nb = 0;
694 
695 		do {
696 			struct sfc_ef10_tx_sw_desc *txd;
697 
698 			txd = &txq->sw_ring[completed & ptr_mask];
699 
700 			if (nb == RTE_DIM(bulk)) {
701 				rte_mempool_put_bulk(bulk[0]->pool,
702 						     (void *)bulk, nb);
703 				nb = 0;
704 			}
705 
706 			bulk[nb++] = txd->mbuf;
707 		} while (++completed != pending);
708 
709 		rte_mempool_put_bulk(bulk[0]->pool, (void *)bulk, nb);
710 
711 		txq->completed = completed;
712 	}
713 
714 	sfc_ef10_ev_qclear(txq->evq_hw_ring, ptr_mask, old_read_ptr,
715 			   txq->evq_read_ptr);
716 }
717 
718 
719 static uint16_t
720 sfc_ef10_simple_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
721 			  uint16_t nb_pkts)
722 {
723 	struct sfc_ef10_txq * const txq = sfc_ef10_txq_by_dp_txq(tx_queue);
724 	unsigned int ptr_mask;
725 	unsigned int added;
726 	unsigned int dma_desc_space;
727 	bool reap_done;
728 	struct rte_mbuf **pktp;
729 	struct rte_mbuf **pktp_end;
730 
731 	if (unlikely(txq->flags &
732 		     (SFC_EF10_TXQ_NOT_RUNNING | SFC_EF10_TXQ_EXCEPTION)))
733 		return 0;
734 
735 	ptr_mask = txq->ptr_mask;
736 	added = txq->added;
737 	dma_desc_space = txq->max_fill_level - (added - txq->completed);
738 
739 	reap_done = (dma_desc_space < RTE_MAX(txq->free_thresh, nb_pkts));
740 	if (reap_done) {
741 		sfc_ef10_simple_tx_reap(txq);
742 		dma_desc_space = txq->max_fill_level - (added - txq->completed);
743 	}
744 
745 	pktp_end = &tx_pkts[MIN(nb_pkts, dma_desc_space)];
746 	for (pktp = &tx_pkts[0]; pktp != pktp_end; ++pktp) {
747 		struct rte_mbuf *pkt = *pktp;
748 		unsigned int id = added & ptr_mask;
749 
750 		SFC_ASSERT(rte_pktmbuf_data_len(pkt) <=
751 			   SFC_EF10_TX_DMA_DESC_LEN_MAX);
752 
753 		sfc_ef10_tx_qdesc_dma_create(rte_mbuf_data_iova(pkt),
754 					     rte_pktmbuf_data_len(pkt),
755 					     true, &txq->txq_hw_ring[id]);
756 
757 		txq->sw_ring[id].mbuf = pkt;
758 
759 		++added;
760 	}
761 
762 	if (likely(added != txq->added)) {
763 		sfc_ef10_tx_qpush(txq, added, txq->added);
764 		txq->added = added;
765 	}
766 
767 #if SFC_TX_XMIT_PKTS_REAP_AT_LEAST_ONCE
768 	if (!reap_done)
769 		sfc_ef10_simple_tx_reap(txq);
770 #endif
771 
772 	return pktp - &tx_pkts[0];
773 }
774 
775 static sfc_dp_tx_get_dev_info_t sfc_ef10_get_dev_info;
776 static void
777 sfc_ef10_get_dev_info(struct rte_eth_dev_info *dev_info)
778 {
779 	/*
780 	 * Number of descriptors just defines maximum number of pushed
781 	 * descriptors (fill level).
782 	 */
783 	dev_info->tx_desc_lim.nb_min = 1;
784 	dev_info->tx_desc_lim.nb_align = 1;
785 }
786 
787 static sfc_dp_tx_qsize_up_rings_t sfc_ef10_tx_qsize_up_rings;
788 static int
789 sfc_ef10_tx_qsize_up_rings(uint16_t nb_tx_desc,
790 			   unsigned int *txq_entries,
791 			   unsigned int *evq_entries,
792 			   unsigned int *txq_max_fill_level)
793 {
794 	/*
795 	 * rte_ethdev API guarantees that the number meets min, max and
796 	 * alignment requirements.
797 	 */
798 	if (nb_tx_desc <= EFX_TXQ_MINNDESCS)
799 		*txq_entries = EFX_TXQ_MINNDESCS;
800 	else
801 		*txq_entries = rte_align32pow2(nb_tx_desc);
802 
803 	*evq_entries = *txq_entries;
804 
805 	*txq_max_fill_level = RTE_MIN(nb_tx_desc,
806 				      SFC_EF10_TXQ_LIMIT(*evq_entries));
807 	return 0;
808 }
809 
810 static sfc_dp_tx_qcreate_t sfc_ef10_tx_qcreate;
811 static int
812 sfc_ef10_tx_qcreate(uint16_t port_id, uint16_t queue_id,
813 		    const struct rte_pci_addr *pci_addr, int socket_id,
814 		    const struct sfc_dp_tx_qcreate_info *info,
815 		    struct sfc_dp_txq **dp_txqp)
816 {
817 	struct sfc_ef10_txq *txq;
818 	int rc;
819 
820 	rc = EINVAL;
821 	if (info->txq_entries != info->evq_entries)
822 		goto fail_bad_args;
823 
824 	rc = ENOMEM;
825 	txq = rte_zmalloc_socket("sfc-ef10-txq", sizeof(*txq),
826 				 RTE_CACHE_LINE_SIZE, socket_id);
827 	if (txq == NULL)
828 		goto fail_txq_alloc;
829 
830 	sfc_dp_queue_init(&txq->dp.dpq, port_id, queue_id, pci_addr);
831 
832 	rc = ENOMEM;
833 	txq->sw_ring = rte_calloc_socket("sfc-ef10-txq-sw_ring",
834 					 info->txq_entries,
835 					 sizeof(*txq->sw_ring),
836 					 RTE_CACHE_LINE_SIZE, socket_id);
837 	if (txq->sw_ring == NULL)
838 		goto fail_sw_ring_alloc;
839 
840 	if (info->offloads & DEV_TX_OFFLOAD_TCP_TSO) {
841 		txq->tsoh = rte_calloc_socket("sfc-ef10-txq-tsoh",
842 					      info->txq_entries,
843 					      SFC_TSOH_STD_LEN,
844 					      RTE_CACHE_LINE_SIZE,
845 					      socket_id);
846 		if (txq->tsoh == NULL)
847 			goto fail_tsoh_alloc;
848 
849 		txq->tsoh_iova = rte_malloc_virt2iova(txq->tsoh);
850 	}
851 
852 	txq->flags = SFC_EF10_TXQ_NOT_RUNNING;
853 	txq->ptr_mask = info->txq_entries - 1;
854 	txq->max_fill_level = info->max_fill_level;
855 	txq->free_thresh = info->free_thresh;
856 	txq->txq_hw_ring = info->txq_hw_ring;
857 	txq->doorbell = (volatile uint8_t *)info->mem_bar +
858 			ER_DZ_TX_DESC_UPD_REG_OFST +
859 			(info->hw_index << info->vi_window_shift);
860 	txq->evq_hw_ring = info->evq_hw_ring;
861 	txq->tso_tcp_header_offset_limit = info->tso_tcp_header_offset_limit;
862 
863 	*dp_txqp = &txq->dp;
864 	return 0;
865 
866 fail_tsoh_alloc:
867 	rte_free(txq->sw_ring);
868 
869 fail_sw_ring_alloc:
870 	rte_free(txq);
871 
872 fail_txq_alloc:
873 fail_bad_args:
874 	return rc;
875 }
876 
877 static sfc_dp_tx_qdestroy_t sfc_ef10_tx_qdestroy;
878 static void
879 sfc_ef10_tx_qdestroy(struct sfc_dp_txq *dp_txq)
880 {
881 	struct sfc_ef10_txq *txq = sfc_ef10_txq_by_dp_txq(dp_txq);
882 
883 	rte_free(txq->tsoh);
884 	rte_free(txq->sw_ring);
885 	rte_free(txq);
886 }
887 
888 static sfc_dp_tx_qstart_t sfc_ef10_tx_qstart;
889 static int
890 sfc_ef10_tx_qstart(struct sfc_dp_txq *dp_txq, unsigned int evq_read_ptr,
891 		   unsigned int txq_desc_index)
892 {
893 	struct sfc_ef10_txq *txq = sfc_ef10_txq_by_dp_txq(dp_txq);
894 
895 	txq->evq_read_ptr = evq_read_ptr;
896 	txq->added = txq->completed = txq_desc_index;
897 
898 	txq->flags |= SFC_EF10_TXQ_STARTED;
899 	txq->flags &= ~(SFC_EF10_TXQ_NOT_RUNNING | SFC_EF10_TXQ_EXCEPTION);
900 
901 	return 0;
902 }
903 
904 static sfc_dp_tx_qstop_t sfc_ef10_tx_qstop;
905 static void
906 sfc_ef10_tx_qstop(struct sfc_dp_txq *dp_txq, unsigned int *evq_read_ptr)
907 {
908 	struct sfc_ef10_txq *txq = sfc_ef10_txq_by_dp_txq(dp_txq);
909 
910 	txq->flags |= SFC_EF10_TXQ_NOT_RUNNING;
911 
912 	*evq_read_ptr = txq->evq_read_ptr;
913 }
914 
915 static sfc_dp_tx_qtx_ev_t sfc_ef10_tx_qtx_ev;
916 static bool
917 sfc_ef10_tx_qtx_ev(struct sfc_dp_txq *dp_txq, __rte_unused unsigned int id)
918 {
919 	__rte_unused struct sfc_ef10_txq *txq = sfc_ef10_txq_by_dp_txq(dp_txq);
920 
921 	SFC_ASSERT(txq->flags & SFC_EF10_TXQ_NOT_RUNNING);
922 
923 	/*
924 	 * It is safe to ignore Tx event since we reap all mbufs on
925 	 * queue purge anyway.
926 	 */
927 
928 	return false;
929 }
930 
931 static sfc_dp_tx_qreap_t sfc_ef10_tx_qreap;
932 static void
933 sfc_ef10_tx_qreap(struct sfc_dp_txq *dp_txq)
934 {
935 	struct sfc_ef10_txq *txq = sfc_ef10_txq_by_dp_txq(dp_txq);
936 	unsigned int completed;
937 
938 	for (completed = txq->completed; completed != txq->added; ++completed) {
939 		struct sfc_ef10_tx_sw_desc *txd;
940 
941 		txd = &txq->sw_ring[completed & txq->ptr_mask];
942 		if (txd->mbuf != NULL) {
943 			rte_pktmbuf_free_seg(txd->mbuf);
944 			txd->mbuf = NULL;
945 		}
946 	}
947 
948 	txq->flags &= ~SFC_EF10_TXQ_STARTED;
949 }
950 
951 static unsigned int
952 sfc_ef10_tx_qdesc_npending(struct sfc_ef10_txq *txq)
953 {
954 	const unsigned int curr_done = txq->completed - 1;
955 	unsigned int anew_done = curr_done;
956 	efx_qword_t tx_ev;
957 	const unsigned int evq_old_read_ptr = txq->evq_read_ptr;
958 
959 	if (unlikely(txq->flags &
960 		     (SFC_EF10_TXQ_NOT_RUNNING | SFC_EF10_TXQ_EXCEPTION)))
961 		return 0;
962 
963 	while (sfc_ef10_tx_get_event(txq, &tx_ev))
964 		anew_done = EFX_QWORD_FIELD(tx_ev, ESF_DZ_TX_DESCR_INDX);
965 
966 	/*
967 	 * The function does not process events, so return event queue read
968 	 * pointer to the original position to allow the events that were
969 	 * read to be processed later
970 	 */
971 	txq->evq_read_ptr = evq_old_read_ptr;
972 
973 	return (anew_done - curr_done) & txq->ptr_mask;
974 }
975 
976 static sfc_dp_tx_qdesc_status_t sfc_ef10_tx_qdesc_status;
977 static int
978 sfc_ef10_tx_qdesc_status(struct sfc_dp_txq *dp_txq,
979 			 uint16_t offset)
980 {
981 	struct sfc_ef10_txq *txq = sfc_ef10_txq_by_dp_txq(dp_txq);
982 	unsigned int npending = sfc_ef10_tx_qdesc_npending(txq);
983 
984 	if (unlikely(offset > txq->ptr_mask))
985 		return -EINVAL;
986 
987 	if (unlikely(offset >= txq->max_fill_level))
988 		return RTE_ETH_TX_DESC_UNAVAIL;
989 
990 	if (unlikely(offset < npending))
991 		return RTE_ETH_TX_DESC_FULL;
992 
993 	return RTE_ETH_TX_DESC_DONE;
994 }
995 
996 struct sfc_dp_tx sfc_ef10_tx = {
997 	.dp = {
998 		.name		= SFC_KVARG_DATAPATH_EF10,
999 		.type		= SFC_DP_TX,
1000 		.hw_fw_caps	= SFC_DP_HW_FW_CAP_EF10,
1001 	},
1002 	.features		= SFC_DP_TX_FEAT_TSO |
1003 				  SFC_DP_TX_FEAT_MULTI_SEG |
1004 				  SFC_DP_TX_FEAT_MULTI_POOL |
1005 				  SFC_DP_TX_FEAT_REFCNT |
1006 				  SFC_DP_TX_FEAT_MULTI_PROCESS,
1007 	.get_dev_info		= sfc_ef10_get_dev_info,
1008 	.qsize_up_rings		= sfc_ef10_tx_qsize_up_rings,
1009 	.qcreate		= sfc_ef10_tx_qcreate,
1010 	.qdestroy		= sfc_ef10_tx_qdestroy,
1011 	.qstart			= sfc_ef10_tx_qstart,
1012 	.qtx_ev			= sfc_ef10_tx_qtx_ev,
1013 	.qstop			= sfc_ef10_tx_qstop,
1014 	.qreap			= sfc_ef10_tx_qreap,
1015 	.qdesc_status		= sfc_ef10_tx_qdesc_status,
1016 	.pkt_burst		= sfc_ef10_xmit_pkts,
1017 };
1018 
1019 struct sfc_dp_tx sfc_ef10_simple_tx = {
1020 	.dp = {
1021 		.name		= SFC_KVARG_DATAPATH_EF10_SIMPLE,
1022 		.type		= SFC_DP_TX,
1023 	},
1024 	.features		= SFC_DP_TX_FEAT_MULTI_PROCESS,
1025 	.get_dev_info		= sfc_ef10_get_dev_info,
1026 	.qsize_up_rings		= sfc_ef10_tx_qsize_up_rings,
1027 	.qcreate		= sfc_ef10_tx_qcreate,
1028 	.qdestroy		= sfc_ef10_tx_qdestroy,
1029 	.qstart			= sfc_ef10_tx_qstart,
1030 	.qtx_ev			= sfc_ef10_tx_qtx_ev,
1031 	.qstop			= sfc_ef10_tx_qstop,
1032 	.qreap			= sfc_ef10_tx_qreap,
1033 	.qdesc_status		= sfc_ef10_tx_qdesc_status,
1034 	.pkt_burst		= sfc_ef10_simple_xmit_pkts,
1035 };
1036