xref: /f-stack/dpdk/drivers/net/sfc/sfc_ef10_tx.c (revision 8850115b)
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 	/* Both checks may be done, so use bit OR to have only one branching */
344 	if (unlikely((header_len > SFC_TSOH_STD_LEN) |
345 		     (tcph_off > txq->tso_tcp_header_offset_limit)))
346 		return EMSGSIZE;
347 
348 	/*
349 	 * Preliminary estimation of required DMA descriptors, including extra
350 	 * descriptor for TSO header that is needed when the header is
351 	 * separated from payload in one segment. It does not include
352 	 * extra descriptors that may appear when a big segment is split across
353 	 * several descriptors.
354 	 */
355 	needed_desc = m_seg->nb_segs +
356 			(unsigned int)SFC_TSO_OPT_DESCS_NUM +
357 			(unsigned int)SFC_TSO_HDR_DESCS_NUM;
358 
359 	if (needed_desc > *dma_desc_space &&
360 	    !sfc_ef10_try_reap(txq, pkt_start, needed_desc,
361 			       dma_desc_space, reap_done)) {
362 		/*
363 		 * If a future Tx reap may increase available DMA descriptor
364 		 * space, do not try to send the packet.
365 		 */
366 		if (txq->completed != pkt_start)
367 			return ENOSPC;
368 		/*
369 		 * Do not allow to send packet if the maximum DMA
370 		 * descriptor space is not sufficient to hold TSO
371 		 * descriptors, header descriptor and at least 1
372 		 * segment descriptor.
373 		 */
374 		if (*dma_desc_space < SFC_TSO_OPT_DESCS_NUM +
375 				SFC_TSO_HDR_DESCS_NUM + 1)
376 			return EMSGSIZE;
377 	}
378 
379 	/* Check if the header is not fragmented */
380 	if (rte_pktmbuf_data_len(m_seg) >= header_len) {
381 		hdr_addr = rte_pktmbuf_mtod(m_seg, uint8_t *);
382 		hdr_iova = rte_mbuf_data_iova(m_seg);
383 		if (rte_pktmbuf_data_len(m_seg) == header_len) {
384 			/*
385 			 * Associate header mbuf with header descriptor
386 			 * which is located after TSO descriptors.
387 			 */
388 			txq->sw_ring[(pkt_start + SFC_TSO_OPT_DESCS_NUM) &
389 				     txq->ptr_mask].mbuf = m_seg;
390 			m_seg = m_seg->next;
391 			in_off = 0;
392 
393 			/*
394 			 * If there is no payload offset (payload starts at the
395 			 * beginning of a segment) then an extra descriptor for
396 			 * separated header is not needed.
397 			 */
398 			needed_desc--;
399 		} else {
400 			in_off = header_len;
401 		}
402 	} else {
403 		unsigned int copied_segs;
404 		unsigned int hdr_addr_off = (*added & txq->ptr_mask) *
405 				SFC_TSOH_STD_LEN;
406 
407 		hdr_addr = txq->tsoh + hdr_addr_off;
408 		hdr_iova = txq->tsoh_iova + hdr_addr_off;
409 		copied_segs = sfc_tso_prepare_header(hdr_addr, header_len,
410 						     &m_seg, &in_off);
411 
412 		m_seg_to_free_up_to = m_seg;
413 		/*
414 		 * Reduce the number of needed descriptors by the number of
415 		 * segments that entirely consist of header data.
416 		 */
417 		needed_desc -= copied_segs;
418 
419 		/* Extra descriptor for separated header is not needed */
420 		if (in_off == 0)
421 			needed_desc--;
422 	}
423 
424 	switch (first_m_seg->ol_flags & (PKT_TX_IPV4 | PKT_TX_IPV6)) {
425 	case PKT_TX_IPV4: {
426 		const struct ipv4_hdr *iphe4;
427 
428 		iphe4 = (const struct ipv4_hdr *)(hdr_addr + iph_off);
429 		rte_memcpy(&packet_id, &iphe4->packet_id, sizeof(uint16_t));
430 		packet_id = rte_be_to_cpu_16(packet_id);
431 		break;
432 	}
433 	case PKT_TX_IPV6:
434 		packet_id = 0;
435 		break;
436 	default:
437 		return EINVAL;
438 	}
439 
440 	th = (const struct tcp_hdr *)(hdr_addr + tcph_off);
441 	rte_memcpy(&sent_seq, &th->sent_seq, sizeof(uint32_t));
442 	sent_seq = rte_be_to_cpu_32(sent_seq);
443 
444 	sfc_ef10_tx_qdesc_tso2_create(txq, *added, packet_id, 0, sent_seq,
445 			first_m_seg->tso_segsz);
446 	(*added) += SFC_TSO_OPT_DESCS_NUM;
447 
448 	sfc_ef10_tx_qdesc_dma_create(hdr_iova, header_len, false,
449 			&txq->txq_hw_ring[(*added) & txq->ptr_mask]);
450 	(*added)++;
451 
452 	do {
453 		rte_iova_t next_frag = rte_mbuf_data_iova(m_seg);
454 		unsigned int seg_len = rte_pktmbuf_data_len(m_seg);
455 		unsigned int id;
456 
457 		next_frag += in_off;
458 		seg_len -= in_off;
459 		in_off = 0;
460 
461 		do {
462 			rte_iova_t frag_addr = next_frag;
463 			size_t frag_len;
464 
465 			frag_len = RTE_MIN(seg_len,
466 					   SFC_EF10_TX_DMA_DESC_LEN_MAX);
467 
468 			next_frag += frag_len;
469 			seg_len -= frag_len;
470 
471 			eop = (seg_len == 0 && m_seg->next == NULL);
472 
473 			id = (*added) & txq->ptr_mask;
474 			(*added)++;
475 
476 			/*
477 			 * Initially we assume that one DMA descriptor is needed
478 			 * for every segment. When the segment is split across
479 			 * several DMA descriptors, increase the estimation.
480 			 */
481 			needed_desc += (seg_len != 0);
482 
483 			/*
484 			 * When no more descriptors can be added, but not all
485 			 * segments are processed.
486 			 */
487 			if (*added - pkt_start == *dma_desc_space &&
488 			    !eop &&
489 			    !sfc_ef10_try_reap(txq, pkt_start, needed_desc,
490 						dma_desc_space, reap_done)) {
491 				struct rte_mbuf *m;
492 				struct rte_mbuf *m_next;
493 
494 				if (txq->completed != pkt_start) {
495 					unsigned int i;
496 
497 					/*
498 					 * Reset mbuf associations with added
499 					 * descriptors.
500 					 */
501 					for (i = pkt_start; i != *added; i++) {
502 						id = i & txq->ptr_mask;
503 						txq->sw_ring[id].mbuf = NULL;
504 					}
505 					return ENOSPC;
506 				}
507 
508 				/* Free the segments that cannot be sent */
509 				for (m = m_seg->next; m != NULL; m = m_next) {
510 					m_next = m->next;
511 					rte_pktmbuf_free_seg(m);
512 				}
513 				eop = true;
514 				/* Ignore the rest of the segment */
515 				seg_len = 0;
516 			}
517 
518 			sfc_ef10_tx_qdesc_dma_create(frag_addr, frag_len,
519 					eop, &txq->txq_hw_ring[id]);
520 
521 		} while (seg_len != 0);
522 
523 		txq->sw_ring[id].mbuf = m_seg;
524 
525 		m_seg = m_seg->next;
526 	} while (!eop);
527 
528 	/*
529 	 * Free segments which content was entirely copied to the TSO header
530 	 * memory space of Tx queue
531 	 */
532 	for (m_seg = first_m_seg; m_seg != m_seg_to_free_up_to;) {
533 		struct rte_mbuf *seg_to_free = m_seg;
534 
535 		m_seg = m_seg->next;
536 		rte_pktmbuf_free_seg(seg_to_free);
537 	}
538 
539 	return 0;
540 }
541 
542 static uint16_t
543 sfc_ef10_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
544 {
545 	struct sfc_ef10_txq * const txq = sfc_ef10_txq_by_dp_txq(tx_queue);
546 	unsigned int added;
547 	unsigned int dma_desc_space;
548 	bool reap_done;
549 	struct rte_mbuf **pktp;
550 	struct rte_mbuf **pktp_end;
551 
552 	if (unlikely(txq->flags &
553 		     (SFC_EF10_TXQ_NOT_RUNNING | SFC_EF10_TXQ_EXCEPTION)))
554 		return 0;
555 
556 	added = txq->added;
557 	dma_desc_space = txq->max_fill_level - (added - txq->completed);
558 
559 	reap_done = (dma_desc_space < txq->free_thresh);
560 	if (reap_done) {
561 		sfc_ef10_tx_reap(txq);
562 		dma_desc_space = txq->max_fill_level - (added - txq->completed);
563 	}
564 
565 	for (pktp = &tx_pkts[0], pktp_end = &tx_pkts[nb_pkts];
566 	     pktp != pktp_end;
567 	     ++pktp) {
568 		struct rte_mbuf *m_seg = *pktp;
569 		unsigned int pkt_start = added;
570 		uint32_t pkt_len;
571 
572 		if (likely(pktp + 1 != pktp_end))
573 			rte_mbuf_prefetch_part1(pktp[1]);
574 
575 		if (m_seg->ol_flags & PKT_TX_TCP_SEG) {
576 			int rc;
577 
578 			rc = sfc_ef10_xmit_tso_pkt(txq, m_seg, &added,
579 					&dma_desc_space, &reap_done);
580 			if (rc != 0) {
581 				added = pkt_start;
582 
583 				/* Packet can be sent in following xmit calls */
584 				if (likely(rc == ENOSPC))
585 					break;
586 
587 				/*
588 				 * Packet cannot be sent, tell RTE that
589 				 * it is sent, but actually drop it and
590 				 * continue with another packet
591 				 */
592 				rte_pktmbuf_free(*pktp);
593 				continue;
594 			}
595 
596 			goto dma_desc_space_update;
597 		}
598 
599 		if (sfc_ef10_tx_pkt_descs_max(m_seg) > dma_desc_space) {
600 			if (reap_done)
601 				break;
602 
603 			/* Push already prepared descriptors before polling */
604 			if (added != txq->added) {
605 				sfc_ef10_tx_qpush(txq, added, txq->added);
606 				txq->added = added;
607 			}
608 
609 			sfc_ef10_tx_reap(txq);
610 			reap_done = true;
611 			dma_desc_space = txq->max_fill_level -
612 				(added - txq->completed);
613 			if (sfc_ef10_tx_pkt_descs_max(m_seg) > dma_desc_space)
614 				break;
615 		}
616 
617 		pkt_len = m_seg->pkt_len;
618 		do {
619 			rte_iova_t seg_addr = rte_mbuf_data_iova(m_seg);
620 			unsigned int seg_len = rte_pktmbuf_data_len(m_seg);
621 			unsigned int id = added & txq->ptr_mask;
622 
623 			SFC_ASSERT(seg_len <= SFC_EF10_TX_DMA_DESC_LEN_MAX);
624 
625 			pkt_len -= seg_len;
626 
627 			sfc_ef10_tx_qdesc_dma_create(seg_addr,
628 				seg_len, (pkt_len == 0),
629 				&txq->txq_hw_ring[id]);
630 
631 			/*
632 			 * rte_pktmbuf_free() is commonly used in DPDK for
633 			 * recycling packets - the function checks every
634 			 * segment's reference counter and returns the
635 			 * buffer to its pool whenever possible;
636 			 * nevertheless, freeing mbuf segments one by one
637 			 * may entail some performance decline;
638 			 * from this point, sfc_efx_tx_reap() does the same job
639 			 * on its own and frees buffers in bulks (all mbufs
640 			 * within a bulk belong to the same pool);
641 			 * from this perspective, individual segment pointers
642 			 * must be associated with the corresponding SW
643 			 * descriptors independently so that only one loop
644 			 * is sufficient on reap to inspect all the buffers
645 			 */
646 			txq->sw_ring[id].mbuf = m_seg;
647 
648 			++added;
649 
650 		} while ((m_seg = m_seg->next) != 0);
651 
652 dma_desc_space_update:
653 		dma_desc_space -= (added - pkt_start);
654 	}
655 
656 	if (likely(added != txq->added)) {
657 		sfc_ef10_tx_qpush(txq, added, txq->added);
658 		txq->added = added;
659 	}
660 
661 #if SFC_TX_XMIT_PKTS_REAP_AT_LEAST_ONCE
662 	if (!reap_done)
663 		sfc_ef10_tx_reap(txq);
664 #endif
665 
666 	return pktp - &tx_pkts[0];
667 }
668 
669 static void
670 sfc_ef10_simple_tx_reap(struct sfc_ef10_txq *txq)
671 {
672 	const unsigned int old_read_ptr = txq->evq_read_ptr;
673 	const unsigned int ptr_mask = txq->ptr_mask;
674 	unsigned int completed = txq->completed;
675 	unsigned int pending = completed;
676 
677 	pending += sfc_ef10_tx_process_events(txq);
678 
679 	if (pending != completed) {
680 		struct rte_mbuf *bulk[SFC_TX_REAP_BULK_SIZE];
681 		unsigned int nb = 0;
682 
683 		do {
684 			struct sfc_ef10_tx_sw_desc *txd;
685 
686 			txd = &txq->sw_ring[completed & ptr_mask];
687 
688 			if (nb == RTE_DIM(bulk)) {
689 				rte_mempool_put_bulk(bulk[0]->pool,
690 						     (void *)bulk, nb);
691 				nb = 0;
692 			}
693 
694 			bulk[nb++] = txd->mbuf;
695 		} while (++completed != pending);
696 
697 		rte_mempool_put_bulk(bulk[0]->pool, (void *)bulk, nb);
698 
699 		txq->completed = completed;
700 	}
701 
702 	sfc_ef10_ev_qclear(txq->evq_hw_ring, ptr_mask, old_read_ptr,
703 			   txq->evq_read_ptr);
704 }
705 
706 
707 static uint16_t
708 sfc_ef10_simple_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
709 			  uint16_t nb_pkts)
710 {
711 	struct sfc_ef10_txq * const txq = sfc_ef10_txq_by_dp_txq(tx_queue);
712 	unsigned int ptr_mask;
713 	unsigned int added;
714 	unsigned int dma_desc_space;
715 	bool reap_done;
716 	struct rte_mbuf **pktp;
717 	struct rte_mbuf **pktp_end;
718 
719 	if (unlikely(txq->flags &
720 		     (SFC_EF10_TXQ_NOT_RUNNING | SFC_EF10_TXQ_EXCEPTION)))
721 		return 0;
722 
723 	ptr_mask = txq->ptr_mask;
724 	added = txq->added;
725 	dma_desc_space = txq->max_fill_level - (added - txq->completed);
726 
727 	reap_done = (dma_desc_space < RTE_MAX(txq->free_thresh, nb_pkts));
728 	if (reap_done) {
729 		sfc_ef10_simple_tx_reap(txq);
730 		dma_desc_space = txq->max_fill_level - (added - txq->completed);
731 	}
732 
733 	pktp_end = &tx_pkts[MIN(nb_pkts, dma_desc_space)];
734 	for (pktp = &tx_pkts[0]; pktp != pktp_end; ++pktp) {
735 		struct rte_mbuf *pkt = *pktp;
736 		unsigned int id = added & ptr_mask;
737 
738 		SFC_ASSERT(rte_pktmbuf_data_len(pkt) <=
739 			   SFC_EF10_TX_DMA_DESC_LEN_MAX);
740 
741 		sfc_ef10_tx_qdesc_dma_create(rte_mbuf_data_iova(pkt),
742 					     rte_pktmbuf_data_len(pkt),
743 					     true, &txq->txq_hw_ring[id]);
744 
745 		txq->sw_ring[id].mbuf = pkt;
746 
747 		++added;
748 	}
749 
750 	if (likely(added != txq->added)) {
751 		sfc_ef10_tx_qpush(txq, added, txq->added);
752 		txq->added = added;
753 	}
754 
755 #if SFC_TX_XMIT_PKTS_REAP_AT_LEAST_ONCE
756 	if (!reap_done)
757 		sfc_ef10_simple_tx_reap(txq);
758 #endif
759 
760 	return pktp - &tx_pkts[0];
761 }
762 
763 static sfc_dp_tx_get_dev_info_t sfc_ef10_get_dev_info;
764 static void
765 sfc_ef10_get_dev_info(struct rte_eth_dev_info *dev_info)
766 {
767 	/*
768 	 * Number of descriptors just defines maximum number of pushed
769 	 * descriptors (fill level).
770 	 */
771 	dev_info->tx_desc_lim.nb_min = 1;
772 	dev_info->tx_desc_lim.nb_align = 1;
773 }
774 
775 static sfc_dp_tx_qsize_up_rings_t sfc_ef10_tx_qsize_up_rings;
776 static int
777 sfc_ef10_tx_qsize_up_rings(uint16_t nb_tx_desc,
778 			   unsigned int *txq_entries,
779 			   unsigned int *evq_entries,
780 			   unsigned int *txq_max_fill_level)
781 {
782 	/*
783 	 * rte_ethdev API guarantees that the number meets min, max and
784 	 * alignment requirements.
785 	 */
786 	if (nb_tx_desc <= EFX_TXQ_MINNDESCS)
787 		*txq_entries = EFX_TXQ_MINNDESCS;
788 	else
789 		*txq_entries = rte_align32pow2(nb_tx_desc);
790 
791 	*evq_entries = *txq_entries;
792 
793 	*txq_max_fill_level = RTE_MIN(nb_tx_desc,
794 				      SFC_EF10_TXQ_LIMIT(*evq_entries));
795 	return 0;
796 }
797 
798 static sfc_dp_tx_qcreate_t sfc_ef10_tx_qcreate;
799 static int
800 sfc_ef10_tx_qcreate(uint16_t port_id, uint16_t queue_id,
801 		    const struct rte_pci_addr *pci_addr, int socket_id,
802 		    const struct sfc_dp_tx_qcreate_info *info,
803 		    struct sfc_dp_txq **dp_txqp)
804 {
805 	struct sfc_ef10_txq *txq;
806 	int rc;
807 
808 	rc = EINVAL;
809 	if (info->txq_entries != info->evq_entries)
810 		goto fail_bad_args;
811 
812 	rc = ENOMEM;
813 	txq = rte_zmalloc_socket("sfc-ef10-txq", sizeof(*txq),
814 				 RTE_CACHE_LINE_SIZE, socket_id);
815 	if (txq == NULL)
816 		goto fail_txq_alloc;
817 
818 	sfc_dp_queue_init(&txq->dp.dpq, port_id, queue_id, pci_addr);
819 
820 	rc = ENOMEM;
821 	txq->sw_ring = rte_calloc_socket("sfc-ef10-txq-sw_ring",
822 					 info->txq_entries,
823 					 sizeof(*txq->sw_ring),
824 					 RTE_CACHE_LINE_SIZE, socket_id);
825 	if (txq->sw_ring == NULL)
826 		goto fail_sw_ring_alloc;
827 
828 	if (info->offloads & DEV_TX_OFFLOAD_TCP_TSO) {
829 		txq->tsoh = rte_calloc_socket("sfc-ef10-txq-tsoh",
830 					      info->txq_entries,
831 					      SFC_TSOH_STD_LEN,
832 					      RTE_CACHE_LINE_SIZE,
833 					      socket_id);
834 		if (txq->tsoh == NULL)
835 			goto fail_tsoh_alloc;
836 
837 		txq->tsoh_iova = rte_malloc_virt2iova(txq->tsoh);
838 	}
839 
840 	txq->flags = SFC_EF10_TXQ_NOT_RUNNING;
841 	txq->ptr_mask = info->txq_entries - 1;
842 	txq->max_fill_level = info->max_fill_level;
843 	txq->free_thresh = info->free_thresh;
844 	txq->txq_hw_ring = info->txq_hw_ring;
845 	txq->doorbell = (volatile uint8_t *)info->mem_bar +
846 			ER_DZ_TX_DESC_UPD_REG_OFST +
847 			(info->hw_index << info->vi_window_shift);
848 	txq->evq_hw_ring = info->evq_hw_ring;
849 	txq->tso_tcp_header_offset_limit = info->tso_tcp_header_offset_limit;
850 
851 	*dp_txqp = &txq->dp;
852 	return 0;
853 
854 fail_tsoh_alloc:
855 	rte_free(txq->sw_ring);
856 
857 fail_sw_ring_alloc:
858 	rte_free(txq);
859 
860 fail_txq_alloc:
861 fail_bad_args:
862 	return rc;
863 }
864 
865 static sfc_dp_tx_qdestroy_t sfc_ef10_tx_qdestroy;
866 static void
867 sfc_ef10_tx_qdestroy(struct sfc_dp_txq *dp_txq)
868 {
869 	struct sfc_ef10_txq *txq = sfc_ef10_txq_by_dp_txq(dp_txq);
870 
871 	rte_free(txq->tsoh);
872 	rte_free(txq->sw_ring);
873 	rte_free(txq);
874 }
875 
876 static sfc_dp_tx_qstart_t sfc_ef10_tx_qstart;
877 static int
878 sfc_ef10_tx_qstart(struct sfc_dp_txq *dp_txq, unsigned int evq_read_ptr,
879 		   unsigned int txq_desc_index)
880 {
881 	struct sfc_ef10_txq *txq = sfc_ef10_txq_by_dp_txq(dp_txq);
882 
883 	txq->evq_read_ptr = evq_read_ptr;
884 	txq->added = txq->completed = txq_desc_index;
885 
886 	txq->flags |= SFC_EF10_TXQ_STARTED;
887 	txq->flags &= ~(SFC_EF10_TXQ_NOT_RUNNING | SFC_EF10_TXQ_EXCEPTION);
888 
889 	return 0;
890 }
891 
892 static sfc_dp_tx_qstop_t sfc_ef10_tx_qstop;
893 static void
894 sfc_ef10_tx_qstop(struct sfc_dp_txq *dp_txq, unsigned int *evq_read_ptr)
895 {
896 	struct sfc_ef10_txq *txq = sfc_ef10_txq_by_dp_txq(dp_txq);
897 
898 	txq->flags |= SFC_EF10_TXQ_NOT_RUNNING;
899 
900 	*evq_read_ptr = txq->evq_read_ptr;
901 }
902 
903 static sfc_dp_tx_qtx_ev_t sfc_ef10_tx_qtx_ev;
904 static bool
905 sfc_ef10_tx_qtx_ev(struct sfc_dp_txq *dp_txq, __rte_unused unsigned int id)
906 {
907 	__rte_unused struct sfc_ef10_txq *txq = sfc_ef10_txq_by_dp_txq(dp_txq);
908 
909 	SFC_ASSERT(txq->flags & SFC_EF10_TXQ_NOT_RUNNING);
910 
911 	/*
912 	 * It is safe to ignore Tx event since we reap all mbufs on
913 	 * queue purge anyway.
914 	 */
915 
916 	return false;
917 }
918 
919 static sfc_dp_tx_qreap_t sfc_ef10_tx_qreap;
920 static void
921 sfc_ef10_tx_qreap(struct sfc_dp_txq *dp_txq)
922 {
923 	struct sfc_ef10_txq *txq = sfc_ef10_txq_by_dp_txq(dp_txq);
924 	unsigned int completed;
925 
926 	for (completed = txq->completed; completed != txq->added; ++completed) {
927 		struct sfc_ef10_tx_sw_desc *txd;
928 
929 		txd = &txq->sw_ring[completed & txq->ptr_mask];
930 		if (txd->mbuf != NULL) {
931 			rte_pktmbuf_free_seg(txd->mbuf);
932 			txd->mbuf = NULL;
933 		}
934 	}
935 
936 	txq->flags &= ~SFC_EF10_TXQ_STARTED;
937 }
938 
939 static unsigned int
940 sfc_ef10_tx_qdesc_npending(struct sfc_ef10_txq *txq)
941 {
942 	const unsigned int curr_done = txq->completed - 1;
943 	unsigned int anew_done = curr_done;
944 	efx_qword_t tx_ev;
945 	const unsigned int evq_old_read_ptr = txq->evq_read_ptr;
946 
947 	if (unlikely(txq->flags &
948 		     (SFC_EF10_TXQ_NOT_RUNNING | SFC_EF10_TXQ_EXCEPTION)))
949 		return 0;
950 
951 	while (sfc_ef10_tx_get_event(txq, &tx_ev))
952 		anew_done = EFX_QWORD_FIELD(tx_ev, ESF_DZ_TX_DESCR_INDX);
953 
954 	/*
955 	 * The function does not process events, so return event queue read
956 	 * pointer to the original position to allow the events that were
957 	 * read to be processed later
958 	 */
959 	txq->evq_read_ptr = evq_old_read_ptr;
960 
961 	return (anew_done - curr_done) & txq->ptr_mask;
962 }
963 
964 static sfc_dp_tx_qdesc_status_t sfc_ef10_tx_qdesc_status;
965 static int
966 sfc_ef10_tx_qdesc_status(struct sfc_dp_txq *dp_txq,
967 			 uint16_t offset)
968 {
969 	struct sfc_ef10_txq *txq = sfc_ef10_txq_by_dp_txq(dp_txq);
970 	unsigned int npending = sfc_ef10_tx_qdesc_npending(txq);
971 
972 	if (unlikely(offset > txq->ptr_mask))
973 		return -EINVAL;
974 
975 	if (unlikely(offset >= txq->max_fill_level))
976 		return RTE_ETH_TX_DESC_UNAVAIL;
977 
978 	if (unlikely(offset < npending))
979 		return RTE_ETH_TX_DESC_FULL;
980 
981 	return RTE_ETH_TX_DESC_DONE;
982 }
983 
984 struct sfc_dp_tx sfc_ef10_tx = {
985 	.dp = {
986 		.name		= SFC_KVARG_DATAPATH_EF10,
987 		.type		= SFC_DP_TX,
988 		.hw_fw_caps	= SFC_DP_HW_FW_CAP_EF10,
989 	},
990 	.features		= SFC_DP_TX_FEAT_TSO |
991 				  SFC_DP_TX_FEAT_MULTI_SEG |
992 				  SFC_DP_TX_FEAT_MULTI_POOL |
993 				  SFC_DP_TX_FEAT_REFCNT |
994 				  SFC_DP_TX_FEAT_MULTI_PROCESS,
995 	.get_dev_info		= sfc_ef10_get_dev_info,
996 	.qsize_up_rings		= sfc_ef10_tx_qsize_up_rings,
997 	.qcreate		= sfc_ef10_tx_qcreate,
998 	.qdestroy		= sfc_ef10_tx_qdestroy,
999 	.qstart			= sfc_ef10_tx_qstart,
1000 	.qtx_ev			= sfc_ef10_tx_qtx_ev,
1001 	.qstop			= sfc_ef10_tx_qstop,
1002 	.qreap			= sfc_ef10_tx_qreap,
1003 	.qdesc_status		= sfc_ef10_tx_qdesc_status,
1004 	.pkt_burst		= sfc_ef10_xmit_pkts,
1005 };
1006 
1007 struct sfc_dp_tx sfc_ef10_simple_tx = {
1008 	.dp = {
1009 		.name		= SFC_KVARG_DATAPATH_EF10_SIMPLE,
1010 		.type		= SFC_DP_TX,
1011 	},
1012 	.features		= SFC_DP_TX_FEAT_MULTI_PROCESS,
1013 	.get_dev_info		= sfc_ef10_get_dev_info,
1014 	.qsize_up_rings		= sfc_ef10_tx_qsize_up_rings,
1015 	.qcreate		= sfc_ef10_tx_qcreate,
1016 	.qdestroy		= sfc_ef10_tx_qdestroy,
1017 	.qstart			= sfc_ef10_tx_qstart,
1018 	.qtx_ev			= sfc_ef10_tx_qtx_ev,
1019 	.qstop			= sfc_ef10_tx_qstop,
1020 	.qreap			= sfc_ef10_tx_qreap,
1021 	.qdesc_status		= sfc_ef10_tx_qdesc_status,
1022 	.pkt_burst		= sfc_ef10_simple_xmit_pkts,
1023 };
1024