1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2015-2020
3 */
4
5 #include <sys/queue.h>
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <errno.h>
11 #include <stdint.h>
12 #include <stdarg.h>
13 #include <unistd.h>
14 #include <inttypes.h>
15
16 #include <rte_byteorder.h>
17 #include <rte_common.h>
18 #include <rte_cycles.h>
19 #include <rte_log.h>
20 #include <rte_debug.h>
21 #include <rte_ethdev.h>
22 #include <rte_ethdev_driver.h>
23 #include <rte_memzone.h>
24 #include <rte_atomic.h>
25 #include <rte_mempool.h>
26 #include <rte_malloc.h>
27 #include <rte_mbuf.h>
28 #include <rte_ether.h>
29 #include <rte_prefetch.h>
30 #include <rte_udp.h>
31 #include <rte_tcp.h>
32 #include <rte_sctp.h>
33 #include <rte_string_fns.h>
34 #include <rte_errno.h>
35 #include <rte_ip.h>
36 #include <rte_net.h>
37
38 #include "txgbe_logs.h"
39 #include "base/txgbe.h"
40 #include "txgbe_ethdev.h"
41 #include "txgbe_rxtx.h"
42
43 #ifdef RTE_LIBRTE_IEEE1588
44 #define TXGBE_TX_IEEE1588_TMST PKT_TX_IEEE1588_TMST
45 #else
46 #define TXGBE_TX_IEEE1588_TMST 0
47 #endif
48
49 /* Bit Mask to indicate what bits required for building TX context */
50 static const u64 TXGBE_TX_OFFLOAD_MASK = (PKT_TX_IP_CKSUM |
51 PKT_TX_OUTER_IPV6 |
52 PKT_TX_OUTER_IPV4 |
53 PKT_TX_IPV6 |
54 PKT_TX_IPV4 |
55 PKT_TX_VLAN_PKT |
56 PKT_TX_L4_MASK |
57 PKT_TX_TCP_SEG |
58 PKT_TX_TUNNEL_MASK |
59 PKT_TX_OUTER_IP_CKSUM |
60 TXGBE_TX_IEEE1588_TMST);
61
62 #define TXGBE_TX_OFFLOAD_NOTSUP_MASK \
63 (PKT_TX_OFFLOAD_MASK ^ TXGBE_TX_OFFLOAD_MASK)
64
65 /*
66 * Prefetch a cache line into all cache levels.
67 */
68 #define rte_txgbe_prefetch(p) rte_prefetch0(p)
69
70 static int
txgbe_is_vf(struct rte_eth_dev * dev)71 txgbe_is_vf(struct rte_eth_dev *dev)
72 {
73 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
74
75 switch (hw->mac.type) {
76 case txgbe_mac_raptor_vf:
77 return 1;
78 default:
79 return 0;
80 }
81 }
82
83 /*********************************************************************
84 *
85 * TX functions
86 *
87 **********************************************************************/
88
89 /*
90 * Check for descriptors with their DD bit set and free mbufs.
91 * Return the total number of buffers freed.
92 */
93 static __rte_always_inline int
txgbe_tx_free_bufs(struct txgbe_tx_queue * txq)94 txgbe_tx_free_bufs(struct txgbe_tx_queue *txq)
95 {
96 struct txgbe_tx_entry *txep;
97 uint32_t status;
98 int i, nb_free = 0;
99 struct rte_mbuf *m, *free[RTE_TXGBE_TX_MAX_FREE_BUF_SZ];
100
101 /* check DD bit on threshold descriptor */
102 status = txq->tx_ring[txq->tx_next_dd].dw3;
103 if (!(status & rte_cpu_to_le_32(TXGBE_TXD_DD))) {
104 if (txq->nb_tx_free >> 1 < txq->tx_free_thresh)
105 txgbe_set32_masked(txq->tdc_reg_addr,
106 TXGBE_TXCFG_FLUSH, TXGBE_TXCFG_FLUSH);
107 return 0;
108 }
109
110 /*
111 * first buffer to free from S/W ring is at index
112 * tx_next_dd - (tx_free_thresh-1)
113 */
114 txep = &txq->sw_ring[txq->tx_next_dd - (txq->tx_free_thresh - 1)];
115 for (i = 0; i < txq->tx_free_thresh; ++i, ++txep) {
116 /* free buffers one at a time */
117 m = rte_pktmbuf_prefree_seg(txep->mbuf);
118 txep->mbuf = NULL;
119
120 if (unlikely(m == NULL))
121 continue;
122
123 if (nb_free >= RTE_TXGBE_TX_MAX_FREE_BUF_SZ ||
124 (nb_free > 0 && m->pool != free[0]->pool)) {
125 rte_mempool_put_bulk(free[0]->pool,
126 (void **)free, nb_free);
127 nb_free = 0;
128 }
129
130 free[nb_free++] = m;
131 }
132
133 if (nb_free > 0)
134 rte_mempool_put_bulk(free[0]->pool, (void **)free, nb_free);
135
136 /* buffers were freed, update counters */
137 txq->nb_tx_free = (uint16_t)(txq->nb_tx_free + txq->tx_free_thresh);
138 txq->tx_next_dd = (uint16_t)(txq->tx_next_dd + txq->tx_free_thresh);
139 if (txq->tx_next_dd >= txq->nb_tx_desc)
140 txq->tx_next_dd = (uint16_t)(txq->tx_free_thresh - 1);
141
142 return txq->tx_free_thresh;
143 }
144
145 /* Populate 4 descriptors with data from 4 mbufs */
146 static inline void
tx4(volatile struct txgbe_tx_desc * txdp,struct rte_mbuf ** pkts)147 tx4(volatile struct txgbe_tx_desc *txdp, struct rte_mbuf **pkts)
148 {
149 uint64_t buf_dma_addr;
150 uint32_t pkt_len;
151 int i;
152
153 for (i = 0; i < 4; ++i, ++txdp, ++pkts) {
154 buf_dma_addr = rte_mbuf_data_iova(*pkts);
155 pkt_len = (*pkts)->data_len;
156
157 /* write data to descriptor */
158 txdp->qw0 = rte_cpu_to_le_64(buf_dma_addr);
159 txdp->dw2 = cpu_to_le32(TXGBE_TXD_FLAGS |
160 TXGBE_TXD_DATLEN(pkt_len));
161 txdp->dw3 = cpu_to_le32(TXGBE_TXD_PAYLEN(pkt_len));
162
163 rte_prefetch0(&(*pkts)->pool);
164 }
165 }
166
167 /* Populate 1 descriptor with data from 1 mbuf */
168 static inline void
tx1(volatile struct txgbe_tx_desc * txdp,struct rte_mbuf ** pkts)169 tx1(volatile struct txgbe_tx_desc *txdp, struct rte_mbuf **pkts)
170 {
171 uint64_t buf_dma_addr;
172 uint32_t pkt_len;
173
174 buf_dma_addr = rte_mbuf_data_iova(*pkts);
175 pkt_len = (*pkts)->data_len;
176
177 /* write data to descriptor */
178 txdp->qw0 = cpu_to_le64(buf_dma_addr);
179 txdp->dw2 = cpu_to_le32(TXGBE_TXD_FLAGS |
180 TXGBE_TXD_DATLEN(pkt_len));
181 txdp->dw3 = cpu_to_le32(TXGBE_TXD_PAYLEN(pkt_len));
182
183 rte_prefetch0(&(*pkts)->pool);
184 }
185
186 /*
187 * Fill H/W descriptor ring with mbuf data.
188 * Copy mbuf pointers to the S/W ring.
189 */
190 static inline void
txgbe_tx_fill_hw_ring(struct txgbe_tx_queue * txq,struct rte_mbuf ** pkts,uint16_t nb_pkts)191 txgbe_tx_fill_hw_ring(struct txgbe_tx_queue *txq, struct rte_mbuf **pkts,
192 uint16_t nb_pkts)
193 {
194 volatile struct txgbe_tx_desc *txdp = &txq->tx_ring[txq->tx_tail];
195 struct txgbe_tx_entry *txep = &txq->sw_ring[txq->tx_tail];
196 const int N_PER_LOOP = 4;
197 const int N_PER_LOOP_MASK = N_PER_LOOP - 1;
198 int mainpart, leftover;
199 int i, j;
200
201 /*
202 * Process most of the packets in chunks of N pkts. Any
203 * leftover packets will get processed one at a time.
204 */
205 mainpart = (nb_pkts & ((uint32_t)~N_PER_LOOP_MASK));
206 leftover = (nb_pkts & ((uint32_t)N_PER_LOOP_MASK));
207 for (i = 0; i < mainpart; i += N_PER_LOOP) {
208 /* Copy N mbuf pointers to the S/W ring */
209 for (j = 0; j < N_PER_LOOP; ++j)
210 (txep + i + j)->mbuf = *(pkts + i + j);
211 tx4(txdp + i, pkts + i);
212 }
213
214 if (unlikely(leftover > 0)) {
215 for (i = 0; i < leftover; ++i) {
216 (txep + mainpart + i)->mbuf = *(pkts + mainpart + i);
217 tx1(txdp + mainpart + i, pkts + mainpart + i);
218 }
219 }
220 }
221
222 static inline uint16_t
tx_xmit_pkts(void * tx_queue,struct rte_mbuf ** tx_pkts,uint16_t nb_pkts)223 tx_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
224 uint16_t nb_pkts)
225 {
226 struct txgbe_tx_queue *txq = (struct txgbe_tx_queue *)tx_queue;
227 uint16_t n = 0;
228
229 /*
230 * Begin scanning the H/W ring for done descriptors when the
231 * number of available descriptors drops below tx_free_thresh. For
232 * each done descriptor, free the associated buffer.
233 */
234 if (txq->nb_tx_free < txq->tx_free_thresh)
235 txgbe_tx_free_bufs(txq);
236
237 /* Only use descriptors that are available */
238 nb_pkts = (uint16_t)RTE_MIN(txq->nb_tx_free, nb_pkts);
239 if (unlikely(nb_pkts == 0))
240 return 0;
241
242 /* Use exactly nb_pkts descriptors */
243 txq->nb_tx_free = (uint16_t)(txq->nb_tx_free - nb_pkts);
244
245 /*
246 * At this point, we know there are enough descriptors in the
247 * ring to transmit all the packets. This assumes that each
248 * mbuf contains a single segment, and that no new offloads
249 * are expected, which would require a new context descriptor.
250 */
251
252 /*
253 * See if we're going to wrap-around. If so, handle the top
254 * of the descriptor ring first, then do the bottom. If not,
255 * the processing looks just like the "bottom" part anyway...
256 */
257 if ((txq->tx_tail + nb_pkts) > txq->nb_tx_desc) {
258 n = (uint16_t)(txq->nb_tx_desc - txq->tx_tail);
259 txgbe_tx_fill_hw_ring(txq, tx_pkts, n);
260 txq->tx_tail = 0;
261 }
262
263 /* Fill H/W descriptor ring with mbuf data */
264 txgbe_tx_fill_hw_ring(txq, tx_pkts + n, (uint16_t)(nb_pkts - n));
265 txq->tx_tail = (uint16_t)(txq->tx_tail + (nb_pkts - n));
266
267 /*
268 * Check for wrap-around. This would only happen if we used
269 * up to the last descriptor in the ring, no more, no less.
270 */
271 if (txq->tx_tail >= txq->nb_tx_desc)
272 txq->tx_tail = 0;
273
274 PMD_TX_LOG(DEBUG, "port_id=%u queue_id=%u tx_tail=%u nb_tx=%u",
275 (uint16_t)txq->port_id, (uint16_t)txq->queue_id,
276 (uint16_t)txq->tx_tail, (uint16_t)nb_pkts);
277
278 /* update tail pointer */
279 rte_wmb();
280 txgbe_set32_relaxed(txq->tdt_reg_addr, txq->tx_tail);
281
282 return nb_pkts;
283 }
284
285 uint16_t
txgbe_xmit_pkts_simple(void * tx_queue,struct rte_mbuf ** tx_pkts,uint16_t nb_pkts)286 txgbe_xmit_pkts_simple(void *tx_queue, struct rte_mbuf **tx_pkts,
287 uint16_t nb_pkts)
288 {
289 uint16_t nb_tx;
290
291 /* Try to transmit at least chunks of TX_MAX_BURST pkts */
292 if (likely(nb_pkts <= RTE_PMD_TXGBE_TX_MAX_BURST))
293 return tx_xmit_pkts(tx_queue, tx_pkts, nb_pkts);
294
295 /* transmit more than the max burst, in chunks of TX_MAX_BURST */
296 nb_tx = 0;
297 while (nb_pkts) {
298 uint16_t ret, n;
299
300 n = (uint16_t)RTE_MIN(nb_pkts, RTE_PMD_TXGBE_TX_MAX_BURST);
301 ret = tx_xmit_pkts(tx_queue, &tx_pkts[nb_tx], n);
302 nb_tx = (uint16_t)(nb_tx + ret);
303 nb_pkts = (uint16_t)(nb_pkts - ret);
304 if (ret < n)
305 break;
306 }
307
308 return nb_tx;
309 }
310
311 static inline void
txgbe_set_xmit_ctx(struct txgbe_tx_queue * txq,volatile struct txgbe_tx_ctx_desc * ctx_txd,uint64_t ol_flags,union txgbe_tx_offload tx_offload)312 txgbe_set_xmit_ctx(struct txgbe_tx_queue *txq,
313 volatile struct txgbe_tx_ctx_desc *ctx_txd,
314 uint64_t ol_flags, union txgbe_tx_offload tx_offload)
315 {
316 union txgbe_tx_offload tx_offload_mask;
317 uint32_t type_tucmd_mlhl;
318 uint32_t mss_l4len_idx;
319 uint32_t ctx_idx;
320 uint32_t vlan_macip_lens;
321 uint32_t tunnel_seed;
322
323 ctx_idx = txq->ctx_curr;
324 tx_offload_mask.data[0] = 0;
325 tx_offload_mask.data[1] = 0;
326
327 /* Specify which HW CTX to upload. */
328 mss_l4len_idx = TXGBE_TXD_IDX(ctx_idx);
329 type_tucmd_mlhl = TXGBE_TXD_CTXT;
330
331 tx_offload_mask.ptid |= ~0;
332 type_tucmd_mlhl |= TXGBE_TXD_PTID(tx_offload.ptid);
333
334 /* check if TCP segmentation required for this packet */
335 if (ol_flags & PKT_TX_TCP_SEG) {
336 tx_offload_mask.l2_len |= ~0;
337 tx_offload_mask.l3_len |= ~0;
338 tx_offload_mask.l4_len |= ~0;
339 tx_offload_mask.tso_segsz |= ~0;
340 mss_l4len_idx |= TXGBE_TXD_MSS(tx_offload.tso_segsz);
341 mss_l4len_idx |= TXGBE_TXD_L4LEN(tx_offload.l4_len);
342 } else { /* no TSO, check if hardware checksum is needed */
343 if (ol_flags & PKT_TX_IP_CKSUM) {
344 tx_offload_mask.l2_len |= ~0;
345 tx_offload_mask.l3_len |= ~0;
346 }
347
348 switch (ol_flags & PKT_TX_L4_MASK) {
349 case PKT_TX_UDP_CKSUM:
350 mss_l4len_idx |=
351 TXGBE_TXD_L4LEN(sizeof(struct rte_udp_hdr));
352 tx_offload_mask.l2_len |= ~0;
353 tx_offload_mask.l3_len |= ~0;
354 break;
355 case PKT_TX_TCP_CKSUM:
356 mss_l4len_idx |=
357 TXGBE_TXD_L4LEN(sizeof(struct rte_tcp_hdr));
358 tx_offload_mask.l2_len |= ~0;
359 tx_offload_mask.l3_len |= ~0;
360 break;
361 case PKT_TX_SCTP_CKSUM:
362 mss_l4len_idx |=
363 TXGBE_TXD_L4LEN(sizeof(struct rte_sctp_hdr));
364 tx_offload_mask.l2_len |= ~0;
365 tx_offload_mask.l3_len |= ~0;
366 break;
367 default:
368 break;
369 }
370 }
371
372 vlan_macip_lens = TXGBE_TXD_IPLEN(tx_offload.l3_len >> 1);
373
374 if (ol_flags & PKT_TX_TUNNEL_MASK) {
375 tx_offload_mask.outer_tun_len |= ~0;
376 tx_offload_mask.outer_l2_len |= ~0;
377 tx_offload_mask.outer_l3_len |= ~0;
378 tx_offload_mask.l2_len |= ~0;
379 tunnel_seed = TXGBE_TXD_ETUNLEN(tx_offload.outer_tun_len >> 1);
380 tunnel_seed |= TXGBE_TXD_EIPLEN(tx_offload.outer_l3_len >> 2);
381
382 switch (ol_flags & PKT_TX_TUNNEL_MASK) {
383 case PKT_TX_TUNNEL_IPIP:
384 /* for non UDP / GRE tunneling, set to 0b */
385 break;
386 case PKT_TX_TUNNEL_VXLAN:
387 case PKT_TX_TUNNEL_GENEVE:
388 tunnel_seed |= TXGBE_TXD_ETYPE_UDP;
389 break;
390 case PKT_TX_TUNNEL_GRE:
391 tunnel_seed |= TXGBE_TXD_ETYPE_GRE;
392 break;
393 default:
394 PMD_TX_LOG(ERR, "Tunnel type not supported");
395 return;
396 }
397 vlan_macip_lens |= TXGBE_TXD_MACLEN(tx_offload.outer_l2_len);
398 } else {
399 tunnel_seed = 0;
400 vlan_macip_lens |= TXGBE_TXD_MACLEN(tx_offload.l2_len);
401 }
402
403 if (ol_flags & PKT_TX_VLAN_PKT) {
404 tx_offload_mask.vlan_tci |= ~0;
405 vlan_macip_lens |= TXGBE_TXD_VLAN(tx_offload.vlan_tci);
406 }
407
408 txq->ctx_cache[ctx_idx].flags = ol_flags;
409 txq->ctx_cache[ctx_idx].tx_offload.data[0] =
410 tx_offload_mask.data[0] & tx_offload.data[0];
411 txq->ctx_cache[ctx_idx].tx_offload.data[1] =
412 tx_offload_mask.data[1] & tx_offload.data[1];
413 txq->ctx_cache[ctx_idx].tx_offload_mask = tx_offload_mask;
414
415 ctx_txd->dw0 = rte_cpu_to_le_32(vlan_macip_lens);
416 ctx_txd->dw1 = rte_cpu_to_le_32(tunnel_seed);
417 ctx_txd->dw2 = rte_cpu_to_le_32(type_tucmd_mlhl);
418 ctx_txd->dw3 = rte_cpu_to_le_32(mss_l4len_idx);
419 }
420
421 /*
422 * Check which hardware context can be used. Use the existing match
423 * or create a new context descriptor.
424 */
425 static inline uint32_t
what_ctx_update(struct txgbe_tx_queue * txq,uint64_t flags,union txgbe_tx_offload tx_offload)426 what_ctx_update(struct txgbe_tx_queue *txq, uint64_t flags,
427 union txgbe_tx_offload tx_offload)
428 {
429 /* If match with the current used context */
430 if (likely(txq->ctx_cache[txq->ctx_curr].flags == flags &&
431 (txq->ctx_cache[txq->ctx_curr].tx_offload.data[0] ==
432 (txq->ctx_cache[txq->ctx_curr].tx_offload_mask.data[0]
433 & tx_offload.data[0])) &&
434 (txq->ctx_cache[txq->ctx_curr].tx_offload.data[1] ==
435 (txq->ctx_cache[txq->ctx_curr].tx_offload_mask.data[1]
436 & tx_offload.data[1]))))
437 return txq->ctx_curr;
438
439 /* What if match with the next context */
440 txq->ctx_curr ^= 1;
441 if (likely(txq->ctx_cache[txq->ctx_curr].flags == flags &&
442 (txq->ctx_cache[txq->ctx_curr].tx_offload.data[0] ==
443 (txq->ctx_cache[txq->ctx_curr].tx_offload_mask.data[0]
444 & tx_offload.data[0])) &&
445 (txq->ctx_cache[txq->ctx_curr].tx_offload.data[1] ==
446 (txq->ctx_cache[txq->ctx_curr].tx_offload_mask.data[1]
447 & tx_offload.data[1]))))
448 return txq->ctx_curr;
449
450 /* Mismatch, use the previous context */
451 return TXGBE_CTX_NUM;
452 }
453
454 static inline uint32_t
tx_desc_cksum_flags_to_olinfo(uint64_t ol_flags)455 tx_desc_cksum_flags_to_olinfo(uint64_t ol_flags)
456 {
457 uint32_t tmp = 0;
458
459 if ((ol_flags & PKT_TX_L4_MASK) != PKT_TX_L4_NO_CKSUM) {
460 tmp |= TXGBE_TXD_CC;
461 tmp |= TXGBE_TXD_L4CS;
462 }
463 if (ol_flags & PKT_TX_IP_CKSUM) {
464 tmp |= TXGBE_TXD_CC;
465 tmp |= TXGBE_TXD_IPCS;
466 }
467 if (ol_flags & PKT_TX_OUTER_IP_CKSUM) {
468 tmp |= TXGBE_TXD_CC;
469 tmp |= TXGBE_TXD_EIPCS;
470 }
471 if (ol_flags & PKT_TX_TCP_SEG) {
472 tmp |= TXGBE_TXD_CC;
473 /* implies IPv4 cksum */
474 if (ol_flags & PKT_TX_IPV4)
475 tmp |= TXGBE_TXD_IPCS;
476 tmp |= TXGBE_TXD_L4CS;
477 }
478 if (ol_flags & PKT_TX_VLAN_PKT)
479 tmp |= TXGBE_TXD_CC;
480
481 return tmp;
482 }
483
484 static inline uint32_t
tx_desc_ol_flags_to_cmdtype(uint64_t ol_flags)485 tx_desc_ol_flags_to_cmdtype(uint64_t ol_flags)
486 {
487 uint32_t cmdtype = 0;
488
489 if (ol_flags & PKT_TX_VLAN_PKT)
490 cmdtype |= TXGBE_TXD_VLE;
491 if (ol_flags & PKT_TX_TCP_SEG)
492 cmdtype |= TXGBE_TXD_TSE;
493 if (ol_flags & PKT_TX_MACSEC)
494 cmdtype |= TXGBE_TXD_LINKSEC;
495 return cmdtype;
496 }
497
498 static inline uint8_t
tx_desc_ol_flags_to_ptid(uint64_t oflags,uint32_t ptype)499 tx_desc_ol_flags_to_ptid(uint64_t oflags, uint32_t ptype)
500 {
501 bool tun;
502
503 if (ptype)
504 return txgbe_encode_ptype(ptype);
505
506 /* Only support flags in TXGBE_TX_OFFLOAD_MASK */
507 tun = !!(oflags & PKT_TX_TUNNEL_MASK);
508
509 /* L2 level */
510 ptype = RTE_PTYPE_L2_ETHER;
511 if (oflags & PKT_TX_VLAN)
512 ptype |= RTE_PTYPE_L2_ETHER_VLAN;
513
514 /* L3 level */
515 if (oflags & (PKT_TX_OUTER_IPV4 | PKT_TX_OUTER_IP_CKSUM))
516 ptype |= RTE_PTYPE_L3_IPV4;
517 else if (oflags & (PKT_TX_OUTER_IPV6))
518 ptype |= RTE_PTYPE_L3_IPV6;
519
520 if (oflags & (PKT_TX_IPV4 | PKT_TX_IP_CKSUM))
521 ptype |= (tun ? RTE_PTYPE_INNER_L3_IPV4 : RTE_PTYPE_L3_IPV4);
522 else if (oflags & (PKT_TX_IPV6))
523 ptype |= (tun ? RTE_PTYPE_INNER_L3_IPV6 : RTE_PTYPE_L3_IPV6);
524
525 /* L4 level */
526 switch (oflags & (PKT_TX_L4_MASK)) {
527 case PKT_TX_TCP_CKSUM:
528 ptype |= (tun ? RTE_PTYPE_INNER_L4_TCP : RTE_PTYPE_L4_TCP);
529 break;
530 case PKT_TX_UDP_CKSUM:
531 ptype |= (tun ? RTE_PTYPE_INNER_L4_UDP : RTE_PTYPE_L4_UDP);
532 break;
533 case PKT_TX_SCTP_CKSUM:
534 ptype |= (tun ? RTE_PTYPE_INNER_L4_SCTP : RTE_PTYPE_L4_SCTP);
535 break;
536 }
537
538 if (oflags & PKT_TX_TCP_SEG)
539 ptype |= (tun ? RTE_PTYPE_INNER_L4_TCP : RTE_PTYPE_L4_TCP);
540
541 /* Tunnel */
542 switch (oflags & PKT_TX_TUNNEL_MASK) {
543 case PKT_TX_TUNNEL_VXLAN:
544 ptype |= RTE_PTYPE_L2_ETHER |
545 RTE_PTYPE_L3_IPV4 |
546 RTE_PTYPE_TUNNEL_VXLAN;
547 ptype |= RTE_PTYPE_INNER_L2_ETHER;
548 break;
549 case PKT_TX_TUNNEL_GRE:
550 ptype |= RTE_PTYPE_L2_ETHER |
551 RTE_PTYPE_L3_IPV4 |
552 RTE_PTYPE_TUNNEL_GRE;
553 ptype |= RTE_PTYPE_INNER_L2_ETHER;
554 break;
555 case PKT_TX_TUNNEL_GENEVE:
556 ptype |= RTE_PTYPE_L2_ETHER |
557 RTE_PTYPE_L3_IPV4 |
558 RTE_PTYPE_TUNNEL_GENEVE;
559 ptype |= RTE_PTYPE_INNER_L2_ETHER;
560 break;
561 case PKT_TX_TUNNEL_VXLAN_GPE:
562 ptype |= RTE_PTYPE_L2_ETHER |
563 RTE_PTYPE_L3_IPV4 |
564 RTE_PTYPE_TUNNEL_VXLAN_GPE;
565 ptype |= RTE_PTYPE_INNER_L2_ETHER;
566 break;
567 case PKT_TX_TUNNEL_IPIP:
568 case PKT_TX_TUNNEL_IP:
569 ptype |= RTE_PTYPE_L2_ETHER |
570 RTE_PTYPE_L3_IPV4 |
571 RTE_PTYPE_TUNNEL_IP;
572 break;
573 }
574
575 return txgbe_encode_ptype(ptype);
576 }
577
578 #ifndef DEFAULT_TX_FREE_THRESH
579 #define DEFAULT_TX_FREE_THRESH 32
580 #endif
581
582 /* Reset transmit descriptors after they have been used */
583 static inline int
txgbe_xmit_cleanup(struct txgbe_tx_queue * txq)584 txgbe_xmit_cleanup(struct txgbe_tx_queue *txq)
585 {
586 struct txgbe_tx_entry *sw_ring = txq->sw_ring;
587 volatile struct txgbe_tx_desc *txr = txq->tx_ring;
588 uint16_t last_desc_cleaned = txq->last_desc_cleaned;
589 uint16_t nb_tx_desc = txq->nb_tx_desc;
590 uint16_t desc_to_clean_to;
591 uint16_t nb_tx_to_clean;
592 uint32_t status;
593
594 /* Determine the last descriptor needing to be cleaned */
595 desc_to_clean_to = (uint16_t)(last_desc_cleaned + txq->tx_free_thresh);
596 if (desc_to_clean_to >= nb_tx_desc)
597 desc_to_clean_to = (uint16_t)(desc_to_clean_to - nb_tx_desc);
598
599 /* Check to make sure the last descriptor to clean is done */
600 desc_to_clean_to = sw_ring[desc_to_clean_to].last_id;
601 status = txr[desc_to_clean_to].dw3;
602 if (!(status & rte_cpu_to_le_32(TXGBE_TXD_DD))) {
603 PMD_TX_FREE_LOG(DEBUG,
604 "TX descriptor %4u is not done"
605 "(port=%d queue=%d)",
606 desc_to_clean_to,
607 txq->port_id, txq->queue_id);
608 if (txq->nb_tx_free >> 1 < txq->tx_free_thresh)
609 txgbe_set32_masked(txq->tdc_reg_addr,
610 TXGBE_TXCFG_FLUSH, TXGBE_TXCFG_FLUSH);
611 /* Failed to clean any descriptors, better luck next time */
612 return -(1);
613 }
614
615 /* Figure out how many descriptors will be cleaned */
616 if (last_desc_cleaned > desc_to_clean_to)
617 nb_tx_to_clean = (uint16_t)((nb_tx_desc - last_desc_cleaned) +
618 desc_to_clean_to);
619 else
620 nb_tx_to_clean = (uint16_t)(desc_to_clean_to -
621 last_desc_cleaned);
622
623 PMD_TX_FREE_LOG(DEBUG,
624 "Cleaning %4u TX descriptors: %4u to %4u "
625 "(port=%d queue=%d)",
626 nb_tx_to_clean, last_desc_cleaned, desc_to_clean_to,
627 txq->port_id, txq->queue_id);
628
629 /*
630 * The last descriptor to clean is done, so that means all the
631 * descriptors from the last descriptor that was cleaned
632 * up to the last descriptor with the RS bit set
633 * are done. Only reset the threshold descriptor.
634 */
635 txr[desc_to_clean_to].dw3 = 0;
636
637 /* Update the txq to reflect the last descriptor that was cleaned */
638 txq->last_desc_cleaned = desc_to_clean_to;
639 txq->nb_tx_free = (uint16_t)(txq->nb_tx_free + nb_tx_to_clean);
640
641 /* No Error */
642 return 0;
643 }
644
645 static inline uint8_t
txgbe_get_tun_len(struct rte_mbuf * mbuf)646 txgbe_get_tun_len(struct rte_mbuf *mbuf)
647 {
648 struct txgbe_genevehdr genevehdr;
649 const struct txgbe_genevehdr *gh;
650 uint8_t tun_len;
651
652 switch (mbuf->ol_flags & PKT_TX_TUNNEL_MASK) {
653 case PKT_TX_TUNNEL_IPIP:
654 tun_len = 0;
655 break;
656 case PKT_TX_TUNNEL_VXLAN:
657 case PKT_TX_TUNNEL_VXLAN_GPE:
658 tun_len = sizeof(struct txgbe_udphdr)
659 + sizeof(struct txgbe_vxlanhdr);
660 break;
661 case PKT_TX_TUNNEL_GRE:
662 tun_len = sizeof(struct txgbe_nvgrehdr);
663 break;
664 case PKT_TX_TUNNEL_GENEVE:
665 gh = rte_pktmbuf_read(mbuf,
666 mbuf->outer_l2_len + mbuf->outer_l3_len,
667 sizeof(genevehdr), &genevehdr);
668 tun_len = sizeof(struct txgbe_udphdr)
669 + sizeof(struct txgbe_genevehdr)
670 + (gh->opt_len << 2);
671 break;
672 default:
673 tun_len = 0;
674 }
675
676 return tun_len;
677 }
678
679 uint16_t
txgbe_xmit_pkts(void * tx_queue,struct rte_mbuf ** tx_pkts,uint16_t nb_pkts)680 txgbe_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
681 uint16_t nb_pkts)
682 {
683 struct txgbe_tx_queue *txq;
684 struct txgbe_tx_entry *sw_ring;
685 struct txgbe_tx_entry *txe, *txn;
686 volatile struct txgbe_tx_desc *txr;
687 volatile struct txgbe_tx_desc *txd;
688 struct rte_mbuf *tx_pkt;
689 struct rte_mbuf *m_seg;
690 uint64_t buf_dma_addr;
691 uint32_t olinfo_status;
692 uint32_t cmd_type_len;
693 uint32_t pkt_len;
694 uint16_t slen;
695 uint64_t ol_flags;
696 uint16_t tx_id;
697 uint16_t tx_last;
698 uint16_t nb_tx;
699 uint16_t nb_used;
700 uint64_t tx_ol_req;
701 uint32_t ctx = 0;
702 uint32_t new_ctx;
703 union txgbe_tx_offload tx_offload;
704
705 tx_offload.data[0] = 0;
706 tx_offload.data[1] = 0;
707 txq = tx_queue;
708 sw_ring = txq->sw_ring;
709 txr = txq->tx_ring;
710 tx_id = txq->tx_tail;
711 txe = &sw_ring[tx_id];
712
713 /* Determine if the descriptor ring needs to be cleaned. */
714 if (txq->nb_tx_free < txq->tx_free_thresh)
715 txgbe_xmit_cleanup(txq);
716
717 rte_prefetch0(&txe->mbuf->pool);
718
719 /* TX loop */
720 for (nb_tx = 0; nb_tx < nb_pkts; nb_tx++) {
721 new_ctx = 0;
722 tx_pkt = *tx_pkts++;
723 pkt_len = tx_pkt->pkt_len;
724
725 /*
726 * Determine how many (if any) context descriptors
727 * are needed for offload functionality.
728 */
729 ol_flags = tx_pkt->ol_flags;
730
731 /* If hardware offload required */
732 tx_ol_req = ol_flags & TXGBE_TX_OFFLOAD_MASK;
733 if (tx_ol_req) {
734 tx_offload.ptid = tx_desc_ol_flags_to_ptid(tx_ol_req,
735 tx_pkt->packet_type);
736 tx_offload.l2_len = tx_pkt->l2_len;
737 tx_offload.l3_len = tx_pkt->l3_len;
738 tx_offload.l4_len = tx_pkt->l4_len;
739 tx_offload.vlan_tci = tx_pkt->vlan_tci;
740 tx_offload.tso_segsz = tx_pkt->tso_segsz;
741 tx_offload.outer_l2_len = tx_pkt->outer_l2_len;
742 tx_offload.outer_l3_len = tx_pkt->outer_l3_len;
743 tx_offload.outer_tun_len = txgbe_get_tun_len(tx_pkt);
744
745 /* If new context need be built or reuse the exist ctx*/
746 ctx = what_ctx_update(txq, tx_ol_req, tx_offload);
747 /* Only allocate context descriptor if required */
748 new_ctx = (ctx == TXGBE_CTX_NUM);
749 ctx = txq->ctx_curr;
750 }
751
752 /*
753 * Keep track of how many descriptors are used this loop
754 * This will always be the number of segments + the number of
755 * Context descriptors required to transmit the packet
756 */
757 nb_used = (uint16_t)(tx_pkt->nb_segs + new_ctx);
758
759 /*
760 * The number of descriptors that must be allocated for a
761 * packet is the number of segments of that packet, plus 1
762 * Context Descriptor for the hardware offload, if any.
763 * Determine the last TX descriptor to allocate in the TX ring
764 * for the packet, starting from the current position (tx_id)
765 * in the ring.
766 */
767 tx_last = (uint16_t)(tx_id + nb_used - 1);
768
769 /* Circular ring */
770 if (tx_last >= txq->nb_tx_desc)
771 tx_last = (uint16_t)(tx_last - txq->nb_tx_desc);
772
773 PMD_TX_LOG(DEBUG, "port_id=%u queue_id=%u pktlen=%u"
774 " tx_first=%u tx_last=%u",
775 (uint16_t)txq->port_id,
776 (uint16_t)txq->queue_id,
777 (uint32_t)pkt_len,
778 (uint16_t)tx_id,
779 (uint16_t)tx_last);
780
781 /*
782 * Make sure there are enough TX descriptors available to
783 * transmit the entire packet.
784 * nb_used better be less than or equal to txq->tx_free_thresh
785 */
786 if (nb_used > txq->nb_tx_free) {
787 PMD_TX_FREE_LOG(DEBUG,
788 "Not enough free TX descriptors "
789 "nb_used=%4u nb_free=%4u "
790 "(port=%d queue=%d)",
791 nb_used, txq->nb_tx_free,
792 txq->port_id, txq->queue_id);
793
794 if (txgbe_xmit_cleanup(txq) != 0) {
795 /* Could not clean any descriptors */
796 if (nb_tx == 0)
797 return 0;
798 goto end_of_tx;
799 }
800
801 /* nb_used better be <= txq->tx_free_thresh */
802 if (unlikely(nb_used > txq->tx_free_thresh)) {
803 PMD_TX_FREE_LOG(DEBUG,
804 "The number of descriptors needed to "
805 "transmit the packet exceeds the "
806 "RS bit threshold. This will impact "
807 "performance."
808 "nb_used=%4u nb_free=%4u "
809 "tx_free_thresh=%4u. "
810 "(port=%d queue=%d)",
811 nb_used, txq->nb_tx_free,
812 txq->tx_free_thresh,
813 txq->port_id, txq->queue_id);
814 /*
815 * Loop here until there are enough TX
816 * descriptors or until the ring cannot be
817 * cleaned.
818 */
819 while (nb_used > txq->nb_tx_free) {
820 if (txgbe_xmit_cleanup(txq) != 0) {
821 /*
822 * Could not clean any
823 * descriptors
824 */
825 if (nb_tx == 0)
826 return 0;
827 goto end_of_tx;
828 }
829 }
830 }
831 }
832
833 /*
834 * By now there are enough free TX descriptors to transmit
835 * the packet.
836 */
837
838 /*
839 * Set common flags of all TX Data Descriptors.
840 *
841 * The following bits must be set in all Data Descriptors:
842 * - TXGBE_TXD_DTYP_DATA
843 * - TXGBE_TXD_DCMD_DEXT
844 *
845 * The following bits must be set in the first Data Descriptor
846 * and are ignored in the other ones:
847 * - TXGBE_TXD_DCMD_IFCS
848 * - TXGBE_TXD_MAC_1588
849 * - TXGBE_TXD_DCMD_VLE
850 *
851 * The following bits must only be set in the last Data
852 * Descriptor:
853 * - TXGBE_TXD_CMD_EOP
854 *
855 * The following bits can be set in any Data Descriptor, but
856 * are only set in the last Data Descriptor:
857 * - TXGBE_TXD_CMD_RS
858 */
859 cmd_type_len = TXGBE_TXD_FCS;
860
861 #ifdef RTE_LIBRTE_IEEE1588
862 if (ol_flags & PKT_TX_IEEE1588_TMST)
863 cmd_type_len |= TXGBE_TXD_1588;
864 #endif
865
866 olinfo_status = 0;
867 if (tx_ol_req) {
868 if (ol_flags & PKT_TX_TCP_SEG) {
869 /* when TSO is on, paylen in descriptor is the
870 * not the packet len but the tcp payload len
871 */
872 pkt_len -= (tx_offload.l2_len +
873 tx_offload.l3_len + tx_offload.l4_len);
874 pkt_len -=
875 (tx_pkt->ol_flags & PKT_TX_TUNNEL_MASK)
876 ? tx_offload.outer_l2_len +
877 tx_offload.outer_l3_len : 0;
878 }
879
880 /*
881 * Setup the TX Advanced Context Descriptor if required
882 */
883 if (new_ctx) {
884 volatile struct txgbe_tx_ctx_desc *ctx_txd;
885
886 ctx_txd = (volatile struct txgbe_tx_ctx_desc *)
887 &txr[tx_id];
888
889 txn = &sw_ring[txe->next_id];
890 rte_prefetch0(&txn->mbuf->pool);
891
892 if (txe->mbuf != NULL) {
893 rte_pktmbuf_free_seg(txe->mbuf);
894 txe->mbuf = NULL;
895 }
896
897 txgbe_set_xmit_ctx(txq, ctx_txd, tx_ol_req,
898 tx_offload);
899
900 txe->last_id = tx_last;
901 tx_id = txe->next_id;
902 txe = txn;
903 }
904
905 /*
906 * Setup the TX Advanced Data Descriptor,
907 * This path will go through
908 * whatever new/reuse the context descriptor
909 */
910 cmd_type_len |= tx_desc_ol_flags_to_cmdtype(ol_flags);
911 olinfo_status |=
912 tx_desc_cksum_flags_to_olinfo(ol_flags);
913 olinfo_status |= TXGBE_TXD_IDX(ctx);
914 }
915
916 olinfo_status |= TXGBE_TXD_PAYLEN(pkt_len);
917
918 m_seg = tx_pkt;
919 do {
920 txd = &txr[tx_id];
921 txn = &sw_ring[txe->next_id];
922 rte_prefetch0(&txn->mbuf->pool);
923
924 if (txe->mbuf != NULL)
925 rte_pktmbuf_free_seg(txe->mbuf);
926 txe->mbuf = m_seg;
927
928 /*
929 * Set up Transmit Data Descriptor.
930 */
931 slen = m_seg->data_len;
932 buf_dma_addr = rte_mbuf_data_iova(m_seg);
933 txd->qw0 = rte_cpu_to_le_64(buf_dma_addr);
934 txd->dw2 = rte_cpu_to_le_32(cmd_type_len | slen);
935 txd->dw3 = rte_cpu_to_le_32(olinfo_status);
936 txe->last_id = tx_last;
937 tx_id = txe->next_id;
938 txe = txn;
939 m_seg = m_seg->next;
940 } while (m_seg != NULL);
941
942 /*
943 * The last packet data descriptor needs End Of Packet (EOP)
944 */
945 cmd_type_len |= TXGBE_TXD_EOP;
946 txq->nb_tx_free = (uint16_t)(txq->nb_tx_free - nb_used);
947
948 txd->dw2 |= rte_cpu_to_le_32(cmd_type_len);
949 }
950
951 end_of_tx:
952
953 rte_wmb();
954
955 /*
956 * Set the Transmit Descriptor Tail (TDT)
957 */
958 PMD_TX_LOG(DEBUG, "port_id=%u queue_id=%u tx_tail=%u nb_tx=%u",
959 (uint16_t)txq->port_id, (uint16_t)txq->queue_id,
960 (uint16_t)tx_id, (uint16_t)nb_tx);
961 txgbe_set32_relaxed(txq->tdt_reg_addr, tx_id);
962 txq->tx_tail = tx_id;
963
964 return nb_tx;
965 }
966
967 /*********************************************************************
968 *
969 * TX prep functions
970 *
971 **********************************************************************/
972 uint16_t
txgbe_prep_pkts(void * tx_queue,struct rte_mbuf ** tx_pkts,uint16_t nb_pkts)973 txgbe_prep_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
974 {
975 int i, ret;
976 uint64_t ol_flags;
977 struct rte_mbuf *m;
978 struct txgbe_tx_queue *txq = (struct txgbe_tx_queue *)tx_queue;
979
980 for (i = 0; i < nb_pkts; i++) {
981 m = tx_pkts[i];
982 ol_flags = m->ol_flags;
983
984 /**
985 * Check if packet meets requirements for number of segments
986 *
987 * NOTE: for txgbe it's always (40 - WTHRESH) for both TSO and
988 * non-TSO
989 */
990
991 if (m->nb_segs > TXGBE_TX_MAX_SEG - txq->wthresh) {
992 rte_errno = -EINVAL;
993 return i;
994 }
995
996 if (ol_flags & TXGBE_TX_OFFLOAD_NOTSUP_MASK) {
997 rte_errno = -ENOTSUP;
998 return i;
999 }
1000
1001 #ifdef RTE_LIBRTE_ETHDEV_DEBUG
1002 ret = rte_validate_tx_offload(m);
1003 if (ret != 0) {
1004 rte_errno = ret;
1005 return i;
1006 }
1007 #endif
1008 ret = rte_net_intel_cksum_prepare(m);
1009 if (ret != 0) {
1010 rte_errno = ret;
1011 return i;
1012 }
1013 }
1014
1015 return i;
1016 }
1017
1018 /*********************************************************************
1019 *
1020 * RX functions
1021 *
1022 **********************************************************************/
1023 /* @note: fix txgbe_dev_supported_ptypes_get() if any change here. */
1024 static inline uint32_t
txgbe_rxd_pkt_info_to_pkt_type(uint32_t pkt_info,uint16_t ptid_mask)1025 txgbe_rxd_pkt_info_to_pkt_type(uint32_t pkt_info, uint16_t ptid_mask)
1026 {
1027 uint16_t ptid = TXGBE_RXD_PTID(pkt_info);
1028
1029 ptid &= ptid_mask;
1030
1031 return txgbe_decode_ptype(ptid);
1032 }
1033
1034 static inline uint64_t
txgbe_rxd_pkt_info_to_pkt_flags(uint32_t pkt_info)1035 txgbe_rxd_pkt_info_to_pkt_flags(uint32_t pkt_info)
1036 {
1037 static uint64_t ip_rss_types_map[16] __rte_cache_aligned = {
1038 0, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH,
1039 0, PKT_RX_RSS_HASH, 0, PKT_RX_RSS_HASH,
1040 PKT_RX_RSS_HASH, 0, 0, 0,
1041 0, 0, 0, PKT_RX_FDIR,
1042 };
1043 #ifdef RTE_LIBRTE_IEEE1588
1044 static uint64_t ip_pkt_etqf_map[8] = {
1045 0, 0, 0, PKT_RX_IEEE1588_PTP,
1046 0, 0, 0, 0,
1047 };
1048 int etfid = txgbe_etflt_id(TXGBE_RXD_PTID(pkt_info));
1049 if (likely(-1 != etfid))
1050 return ip_pkt_etqf_map[etfid] |
1051 ip_rss_types_map[TXGBE_RXD_RSSTYPE(pkt_info)];
1052 else
1053 return ip_rss_types_map[TXGBE_RXD_RSSTYPE(pkt_info)];
1054 #else
1055 return ip_rss_types_map[TXGBE_RXD_RSSTYPE(pkt_info)];
1056 #endif
1057 }
1058
1059 static inline uint64_t
rx_desc_status_to_pkt_flags(uint32_t rx_status,uint64_t vlan_flags)1060 rx_desc_status_to_pkt_flags(uint32_t rx_status, uint64_t vlan_flags)
1061 {
1062 uint64_t pkt_flags;
1063
1064 /*
1065 * Check if VLAN present only.
1066 * Do not check whether L3/L4 rx checksum done by NIC or not,
1067 * That can be found from rte_eth_rxmode.offloads flag
1068 */
1069 pkt_flags = (rx_status & TXGBE_RXD_STAT_VLAN &&
1070 vlan_flags & PKT_RX_VLAN_STRIPPED)
1071 ? vlan_flags : 0;
1072
1073 #ifdef RTE_LIBRTE_IEEE1588
1074 if (rx_status & TXGBE_RXD_STAT_1588)
1075 pkt_flags = pkt_flags | PKT_RX_IEEE1588_TMST;
1076 #endif
1077 return pkt_flags;
1078 }
1079
1080 static inline uint64_t
rx_desc_error_to_pkt_flags(uint32_t rx_status)1081 rx_desc_error_to_pkt_flags(uint32_t rx_status)
1082 {
1083 uint64_t pkt_flags = 0;
1084
1085 /* checksum offload can't be disabled */
1086 if (rx_status & TXGBE_RXD_STAT_IPCS) {
1087 pkt_flags |= (rx_status & TXGBE_RXD_ERR_IPCS
1088 ? PKT_RX_IP_CKSUM_BAD : PKT_RX_IP_CKSUM_GOOD);
1089 }
1090
1091 if (rx_status & TXGBE_RXD_STAT_L4CS) {
1092 pkt_flags |= (rx_status & TXGBE_RXD_ERR_L4CS
1093 ? PKT_RX_L4_CKSUM_BAD : PKT_RX_L4_CKSUM_GOOD);
1094 }
1095
1096 if (rx_status & TXGBE_RXD_STAT_EIPCS &&
1097 rx_status & TXGBE_RXD_ERR_EIPCS) {
1098 pkt_flags |= PKT_RX_EIP_CKSUM_BAD;
1099 }
1100
1101 return pkt_flags;
1102 }
1103
1104 /*
1105 * LOOK_AHEAD defines how many desc statuses to check beyond the
1106 * current descriptor.
1107 * It must be a pound define for optimal performance.
1108 * Do not change the value of LOOK_AHEAD, as the txgbe_rx_scan_hw_ring
1109 * function only works with LOOK_AHEAD=8.
1110 */
1111 #define LOOK_AHEAD 8
1112 #if (LOOK_AHEAD != 8)
1113 #error "PMD TXGBE: LOOK_AHEAD must be 8\n"
1114 #endif
1115 static inline int
txgbe_rx_scan_hw_ring(struct txgbe_rx_queue * rxq)1116 txgbe_rx_scan_hw_ring(struct txgbe_rx_queue *rxq)
1117 {
1118 volatile struct txgbe_rx_desc *rxdp;
1119 struct txgbe_rx_entry *rxep;
1120 struct rte_mbuf *mb;
1121 uint16_t pkt_len;
1122 uint64_t pkt_flags;
1123 int nb_dd;
1124 uint32_t s[LOOK_AHEAD];
1125 uint32_t pkt_info[LOOK_AHEAD];
1126 int i, j, nb_rx = 0;
1127 uint32_t status;
1128
1129 /* get references to current descriptor and S/W ring entry */
1130 rxdp = &rxq->rx_ring[rxq->rx_tail];
1131 rxep = &rxq->sw_ring[rxq->rx_tail];
1132
1133 status = rxdp->qw1.lo.status;
1134 /* check to make sure there is at least 1 packet to receive */
1135 if (!(status & rte_cpu_to_le_32(TXGBE_RXD_STAT_DD)))
1136 return 0;
1137
1138 /*
1139 * Scan LOOK_AHEAD descriptors at a time to determine which descriptors
1140 * reference packets that are ready to be received.
1141 */
1142 for (i = 0; i < RTE_PMD_TXGBE_RX_MAX_BURST;
1143 i += LOOK_AHEAD, rxdp += LOOK_AHEAD, rxep += LOOK_AHEAD) {
1144 /* Read desc statuses backwards to avoid race condition */
1145 for (j = 0; j < LOOK_AHEAD; j++)
1146 s[j] = rte_le_to_cpu_32(rxdp[j].qw1.lo.status);
1147
1148 rte_atomic_thread_fence(__ATOMIC_ACQUIRE);
1149
1150 /* Compute how many status bits were set */
1151 for (nb_dd = 0; nb_dd < LOOK_AHEAD &&
1152 (s[nb_dd] & TXGBE_RXD_STAT_DD); nb_dd++)
1153 ;
1154
1155 for (j = 0; j < nb_dd; j++)
1156 pkt_info[j] = rte_le_to_cpu_32(rxdp[j].qw0.dw0);
1157
1158 nb_rx += nb_dd;
1159
1160 /* Translate descriptor info to mbuf format */
1161 for (j = 0; j < nb_dd; ++j) {
1162 mb = rxep[j].mbuf;
1163 pkt_len = rte_le_to_cpu_16(rxdp[j].qw1.hi.len) -
1164 rxq->crc_len;
1165 mb->data_len = pkt_len;
1166 mb->pkt_len = pkt_len;
1167 mb->vlan_tci = rte_le_to_cpu_16(rxdp[j].qw1.hi.tag);
1168
1169 /* convert descriptor fields to rte mbuf flags */
1170 pkt_flags = rx_desc_status_to_pkt_flags(s[j],
1171 rxq->vlan_flags);
1172 pkt_flags |= rx_desc_error_to_pkt_flags(s[j]);
1173 pkt_flags |=
1174 txgbe_rxd_pkt_info_to_pkt_flags(pkt_info[j]);
1175 mb->ol_flags = pkt_flags;
1176 mb->packet_type =
1177 txgbe_rxd_pkt_info_to_pkt_type(pkt_info[j],
1178 rxq->pkt_type_mask);
1179
1180 if (likely(pkt_flags & PKT_RX_RSS_HASH))
1181 mb->hash.rss =
1182 rte_le_to_cpu_32(rxdp[j].qw0.dw1);
1183 else if (pkt_flags & PKT_RX_FDIR) {
1184 mb->hash.fdir.hash =
1185 rte_le_to_cpu_16(rxdp[j].qw0.hi.csum) &
1186 TXGBE_ATR_HASH_MASK;
1187 mb->hash.fdir.id =
1188 rte_le_to_cpu_16(rxdp[j].qw0.hi.ipid);
1189 }
1190 }
1191
1192 /* Move mbuf pointers from the S/W ring to the stage */
1193 for (j = 0; j < LOOK_AHEAD; ++j)
1194 rxq->rx_stage[i + j] = rxep[j].mbuf;
1195
1196 /* stop if all requested packets could not be received */
1197 if (nb_dd != LOOK_AHEAD)
1198 break;
1199 }
1200
1201 /* clear software ring entries so we can cleanup correctly */
1202 for (i = 0; i < nb_rx; ++i)
1203 rxq->sw_ring[rxq->rx_tail + i].mbuf = NULL;
1204
1205 return nb_rx;
1206 }
1207
1208 static inline int
txgbe_rx_alloc_bufs(struct txgbe_rx_queue * rxq,bool reset_mbuf)1209 txgbe_rx_alloc_bufs(struct txgbe_rx_queue *rxq, bool reset_mbuf)
1210 {
1211 volatile struct txgbe_rx_desc *rxdp;
1212 struct txgbe_rx_entry *rxep;
1213 struct rte_mbuf *mb;
1214 uint16_t alloc_idx;
1215 __le64 dma_addr;
1216 int diag, i;
1217
1218 /* allocate buffers in bulk directly into the S/W ring */
1219 alloc_idx = rxq->rx_free_trigger - (rxq->rx_free_thresh - 1);
1220 rxep = &rxq->sw_ring[alloc_idx];
1221 diag = rte_mempool_get_bulk(rxq->mb_pool, (void *)rxep,
1222 rxq->rx_free_thresh);
1223 if (unlikely(diag != 0))
1224 return -ENOMEM;
1225
1226 rxdp = &rxq->rx_ring[alloc_idx];
1227 for (i = 0; i < rxq->rx_free_thresh; ++i) {
1228 /* populate the static rte mbuf fields */
1229 mb = rxep[i].mbuf;
1230 if (reset_mbuf)
1231 mb->port = rxq->port_id;
1232
1233 rte_mbuf_refcnt_set(mb, 1);
1234 mb->data_off = RTE_PKTMBUF_HEADROOM;
1235
1236 /* populate the descriptors */
1237 dma_addr = rte_cpu_to_le_64(rte_mbuf_data_iova_default(mb));
1238 TXGBE_RXD_HDRADDR(&rxdp[i], 0);
1239 TXGBE_RXD_PKTADDR(&rxdp[i], dma_addr);
1240 }
1241
1242 /* update state of internal queue structure */
1243 rxq->rx_free_trigger = rxq->rx_free_trigger + rxq->rx_free_thresh;
1244 if (rxq->rx_free_trigger >= rxq->nb_rx_desc)
1245 rxq->rx_free_trigger = rxq->rx_free_thresh - 1;
1246
1247 /* no errors */
1248 return 0;
1249 }
1250
1251 static inline uint16_t
txgbe_rx_fill_from_stage(struct txgbe_rx_queue * rxq,struct rte_mbuf ** rx_pkts,uint16_t nb_pkts)1252 txgbe_rx_fill_from_stage(struct txgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts,
1253 uint16_t nb_pkts)
1254 {
1255 struct rte_mbuf **stage = &rxq->rx_stage[rxq->rx_next_avail];
1256 int i;
1257
1258 /* how many packets are ready to return? */
1259 nb_pkts = (uint16_t)RTE_MIN(nb_pkts, rxq->rx_nb_avail);
1260
1261 /* copy mbuf pointers to the application's packet list */
1262 for (i = 0; i < nb_pkts; ++i)
1263 rx_pkts[i] = stage[i];
1264
1265 /* update internal queue state */
1266 rxq->rx_nb_avail = (uint16_t)(rxq->rx_nb_avail - nb_pkts);
1267 rxq->rx_next_avail = (uint16_t)(rxq->rx_next_avail + nb_pkts);
1268
1269 return nb_pkts;
1270 }
1271
1272 static inline uint16_t
txgbe_rx_recv_pkts(void * rx_queue,struct rte_mbuf ** rx_pkts,uint16_t nb_pkts)1273 txgbe_rx_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
1274 uint16_t nb_pkts)
1275 {
1276 struct txgbe_rx_queue *rxq = (struct txgbe_rx_queue *)rx_queue;
1277 struct rte_eth_dev *dev = &rte_eth_devices[rxq->port_id];
1278 uint16_t nb_rx = 0;
1279
1280 /* Any previously recv'd pkts will be returned from the Rx stage */
1281 if (rxq->rx_nb_avail)
1282 return txgbe_rx_fill_from_stage(rxq, rx_pkts, nb_pkts);
1283
1284 /* Scan the H/W ring for packets to receive */
1285 nb_rx = (uint16_t)txgbe_rx_scan_hw_ring(rxq);
1286
1287 /* update internal queue state */
1288 rxq->rx_next_avail = 0;
1289 rxq->rx_nb_avail = nb_rx;
1290 rxq->rx_tail = (uint16_t)(rxq->rx_tail + nb_rx);
1291
1292 /* if required, allocate new buffers to replenish descriptors */
1293 if (rxq->rx_tail > rxq->rx_free_trigger) {
1294 uint16_t cur_free_trigger = rxq->rx_free_trigger;
1295
1296 if (txgbe_rx_alloc_bufs(rxq, true) != 0) {
1297 int i, j;
1298
1299 PMD_RX_LOG(DEBUG, "RX mbuf alloc failed port_id=%u "
1300 "queue_id=%u", (uint16_t)rxq->port_id,
1301 (uint16_t)rxq->queue_id);
1302
1303 dev->data->rx_mbuf_alloc_failed +=
1304 rxq->rx_free_thresh;
1305
1306 /*
1307 * Need to rewind any previous receives if we cannot
1308 * allocate new buffers to replenish the old ones.
1309 */
1310 rxq->rx_nb_avail = 0;
1311 rxq->rx_tail = (uint16_t)(rxq->rx_tail - nb_rx);
1312 for (i = 0, j = rxq->rx_tail; i < nb_rx; ++i, ++j)
1313 rxq->sw_ring[j].mbuf = rxq->rx_stage[i];
1314
1315 return 0;
1316 }
1317
1318 /* update tail pointer */
1319 rte_wmb();
1320 txgbe_set32_relaxed(rxq->rdt_reg_addr, cur_free_trigger);
1321 }
1322
1323 if (rxq->rx_tail >= rxq->nb_rx_desc)
1324 rxq->rx_tail = 0;
1325
1326 /* received any packets this loop? */
1327 if (rxq->rx_nb_avail)
1328 return txgbe_rx_fill_from_stage(rxq, rx_pkts, nb_pkts);
1329
1330 return 0;
1331 }
1332
1333 /* split requests into chunks of size RTE_PMD_TXGBE_RX_MAX_BURST */
1334 uint16_t
txgbe_recv_pkts_bulk_alloc(void * rx_queue,struct rte_mbuf ** rx_pkts,uint16_t nb_pkts)1335 txgbe_recv_pkts_bulk_alloc(void *rx_queue, struct rte_mbuf **rx_pkts,
1336 uint16_t nb_pkts)
1337 {
1338 uint16_t nb_rx;
1339
1340 if (unlikely(nb_pkts == 0))
1341 return 0;
1342
1343 if (likely(nb_pkts <= RTE_PMD_TXGBE_RX_MAX_BURST))
1344 return txgbe_rx_recv_pkts(rx_queue, rx_pkts, nb_pkts);
1345
1346 /* request is relatively large, chunk it up */
1347 nb_rx = 0;
1348 while (nb_pkts) {
1349 uint16_t ret, n;
1350
1351 n = (uint16_t)RTE_MIN(nb_pkts, RTE_PMD_TXGBE_RX_MAX_BURST);
1352 ret = txgbe_rx_recv_pkts(rx_queue, &rx_pkts[nb_rx], n);
1353 nb_rx = (uint16_t)(nb_rx + ret);
1354 nb_pkts = (uint16_t)(nb_pkts - ret);
1355 if (ret < n)
1356 break;
1357 }
1358
1359 return nb_rx;
1360 }
1361
1362 uint16_t
txgbe_recv_pkts(void * rx_queue,struct rte_mbuf ** rx_pkts,uint16_t nb_pkts)1363 txgbe_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
1364 uint16_t nb_pkts)
1365 {
1366 struct txgbe_rx_queue *rxq;
1367 volatile struct txgbe_rx_desc *rx_ring;
1368 volatile struct txgbe_rx_desc *rxdp;
1369 struct txgbe_rx_entry *sw_ring;
1370 struct txgbe_rx_entry *rxe;
1371 struct rte_mbuf *rxm;
1372 struct rte_mbuf *nmb;
1373 struct txgbe_rx_desc rxd;
1374 uint64_t dma_addr;
1375 uint32_t staterr;
1376 uint32_t pkt_info;
1377 uint16_t pkt_len;
1378 uint16_t rx_id;
1379 uint16_t nb_rx;
1380 uint16_t nb_hold;
1381 uint64_t pkt_flags;
1382
1383 nb_rx = 0;
1384 nb_hold = 0;
1385 rxq = rx_queue;
1386 rx_id = rxq->rx_tail;
1387 rx_ring = rxq->rx_ring;
1388 sw_ring = rxq->sw_ring;
1389 struct rte_eth_dev *dev = &rte_eth_devices[rxq->port_id];
1390 while (nb_rx < nb_pkts) {
1391 /*
1392 * The order of operations here is important as the DD status
1393 * bit must not be read after any other descriptor fields.
1394 * rx_ring and rxdp are pointing to volatile data so the order
1395 * of accesses cannot be reordered by the compiler. If they were
1396 * not volatile, they could be reordered which could lead to
1397 * using invalid descriptor fields when read from rxd.
1398 */
1399 rxdp = &rx_ring[rx_id];
1400 staterr = rxdp->qw1.lo.status;
1401 if (!(staterr & rte_cpu_to_le_32(TXGBE_RXD_STAT_DD)))
1402 break;
1403 rxd = *rxdp;
1404
1405 /*
1406 * End of packet.
1407 *
1408 * If the TXGBE_RXD_STAT_EOP flag is not set, the RX packet
1409 * is likely to be invalid and to be dropped by the various
1410 * validation checks performed by the network stack.
1411 *
1412 * Allocate a new mbuf to replenish the RX ring descriptor.
1413 * If the allocation fails:
1414 * - arrange for that RX descriptor to be the first one
1415 * being parsed the next time the receive function is
1416 * invoked [on the same queue].
1417 *
1418 * - Stop parsing the RX ring and return immediately.
1419 *
1420 * This policy do not drop the packet received in the RX
1421 * descriptor for which the allocation of a new mbuf failed.
1422 * Thus, it allows that packet to be later retrieved if
1423 * mbuf have been freed in the mean time.
1424 * As a side effect, holding RX descriptors instead of
1425 * systematically giving them back to the NIC may lead to
1426 * RX ring exhaustion situations.
1427 * However, the NIC can gracefully prevent such situations
1428 * to happen by sending specific "back-pressure" flow control
1429 * frames to its peer(s).
1430 */
1431 PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_id=%u "
1432 "ext_err_stat=0x%08x pkt_len=%u",
1433 (uint16_t)rxq->port_id, (uint16_t)rxq->queue_id,
1434 (uint16_t)rx_id, (uint32_t)staterr,
1435 (uint16_t)rte_le_to_cpu_16(rxd.qw1.hi.len));
1436
1437 nmb = rte_mbuf_raw_alloc(rxq->mb_pool);
1438 if (nmb == NULL) {
1439 PMD_RX_LOG(DEBUG, "RX mbuf alloc failed port_id=%u "
1440 "queue_id=%u", (uint16_t)rxq->port_id,
1441 (uint16_t)rxq->queue_id);
1442 dev->data->rx_mbuf_alloc_failed++;
1443 break;
1444 }
1445
1446 nb_hold++;
1447 rxe = &sw_ring[rx_id];
1448 rx_id++;
1449 if (rx_id == rxq->nb_rx_desc)
1450 rx_id = 0;
1451
1452 /* Prefetch next mbuf while processing current one. */
1453 rte_txgbe_prefetch(sw_ring[rx_id].mbuf);
1454
1455 /*
1456 * When next RX descriptor is on a cache-line boundary,
1457 * prefetch the next 4 RX descriptors and the next 8 pointers
1458 * to mbufs.
1459 */
1460 if ((rx_id & 0x3) == 0) {
1461 rte_txgbe_prefetch(&rx_ring[rx_id]);
1462 rte_txgbe_prefetch(&sw_ring[rx_id]);
1463 }
1464
1465 rxm = rxe->mbuf;
1466 rxe->mbuf = nmb;
1467 dma_addr = rte_cpu_to_le_64(rte_mbuf_data_iova_default(nmb));
1468 TXGBE_RXD_HDRADDR(rxdp, 0);
1469 TXGBE_RXD_PKTADDR(rxdp, dma_addr);
1470
1471 /*
1472 * Initialize the returned mbuf.
1473 * 1) setup generic mbuf fields:
1474 * - number of segments,
1475 * - next segment,
1476 * - packet length,
1477 * - RX port identifier.
1478 * 2) integrate hardware offload data, if any:
1479 * - RSS flag & hash,
1480 * - IP checksum flag,
1481 * - VLAN TCI, if any,
1482 * - error flags.
1483 */
1484 pkt_len = (uint16_t)(rte_le_to_cpu_16(rxd.qw1.hi.len) -
1485 rxq->crc_len);
1486 rxm->data_off = RTE_PKTMBUF_HEADROOM;
1487 rte_packet_prefetch((char *)rxm->buf_addr + rxm->data_off);
1488 rxm->nb_segs = 1;
1489 rxm->next = NULL;
1490 rxm->pkt_len = pkt_len;
1491 rxm->data_len = pkt_len;
1492 rxm->port = rxq->port_id;
1493
1494 pkt_info = rte_le_to_cpu_32(rxd.qw0.dw0);
1495 /* Only valid if PKT_RX_VLAN set in pkt_flags */
1496 rxm->vlan_tci = rte_le_to_cpu_16(rxd.qw1.hi.tag);
1497
1498 pkt_flags = rx_desc_status_to_pkt_flags(staterr,
1499 rxq->vlan_flags);
1500 pkt_flags |= rx_desc_error_to_pkt_flags(staterr);
1501 pkt_flags |= txgbe_rxd_pkt_info_to_pkt_flags(pkt_info);
1502 rxm->ol_flags = pkt_flags;
1503 rxm->packet_type = txgbe_rxd_pkt_info_to_pkt_type(pkt_info,
1504 rxq->pkt_type_mask);
1505
1506 if (likely(pkt_flags & PKT_RX_RSS_HASH)) {
1507 rxm->hash.rss = rte_le_to_cpu_32(rxd.qw0.dw1);
1508 } else if (pkt_flags & PKT_RX_FDIR) {
1509 rxm->hash.fdir.hash =
1510 rte_le_to_cpu_16(rxd.qw0.hi.csum) &
1511 TXGBE_ATR_HASH_MASK;
1512 rxm->hash.fdir.id = rte_le_to_cpu_16(rxd.qw0.hi.ipid);
1513 }
1514 /*
1515 * Store the mbuf address into the next entry of the array
1516 * of returned packets.
1517 */
1518 rx_pkts[nb_rx++] = rxm;
1519 }
1520 rxq->rx_tail = rx_id;
1521
1522 /*
1523 * If the number of free RX descriptors is greater than the RX free
1524 * threshold of the queue, advance the Receive Descriptor Tail (RDT)
1525 * register.
1526 * Update the RDT with the value of the last processed RX descriptor
1527 * minus 1, to guarantee that the RDT register is never equal to the
1528 * RDH register, which creates a "full" ring situation from the
1529 * hardware point of view...
1530 */
1531 nb_hold = (uint16_t)(nb_hold + rxq->nb_rx_hold);
1532 if (nb_hold > rxq->rx_free_thresh) {
1533 PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_tail=%u "
1534 "nb_hold=%u nb_rx=%u",
1535 (uint16_t)rxq->port_id, (uint16_t)rxq->queue_id,
1536 (uint16_t)rx_id, (uint16_t)nb_hold,
1537 (uint16_t)nb_rx);
1538 rx_id = (uint16_t)((rx_id == 0) ?
1539 (rxq->nb_rx_desc - 1) : (rx_id - 1));
1540 txgbe_set32(rxq->rdt_reg_addr, rx_id);
1541 nb_hold = 0;
1542 }
1543 rxq->nb_rx_hold = nb_hold;
1544 return nb_rx;
1545 }
1546
1547 /**
1548 * txgbe_fill_cluster_head_buf - fill the first mbuf of the returned packet
1549 *
1550 * Fill the following info in the HEAD buffer of the Rx cluster:
1551 * - RX port identifier
1552 * - hardware offload data, if any:
1553 * - RSS flag & hash
1554 * - IP checksum flag
1555 * - VLAN TCI, if any
1556 * - error flags
1557 * @head HEAD of the packet cluster
1558 * @desc HW descriptor to get data from
1559 * @rxq Pointer to the Rx queue
1560 */
1561 static inline void
txgbe_fill_cluster_head_buf(struct rte_mbuf * head,struct txgbe_rx_desc * desc,struct txgbe_rx_queue * rxq,uint32_t staterr)1562 txgbe_fill_cluster_head_buf(struct rte_mbuf *head, struct txgbe_rx_desc *desc,
1563 struct txgbe_rx_queue *rxq, uint32_t staterr)
1564 {
1565 uint32_t pkt_info;
1566 uint64_t pkt_flags;
1567
1568 head->port = rxq->port_id;
1569
1570 /* The vlan_tci field is only valid when PKT_RX_VLAN is
1571 * set in the pkt_flags field.
1572 */
1573 head->vlan_tci = rte_le_to_cpu_16(desc->qw1.hi.tag);
1574 pkt_info = rte_le_to_cpu_32(desc->qw0.dw0);
1575 pkt_flags = rx_desc_status_to_pkt_flags(staterr, rxq->vlan_flags);
1576 pkt_flags |= rx_desc_error_to_pkt_flags(staterr);
1577 pkt_flags |= txgbe_rxd_pkt_info_to_pkt_flags(pkt_info);
1578 head->ol_flags = pkt_flags;
1579 head->packet_type = txgbe_rxd_pkt_info_to_pkt_type(pkt_info,
1580 rxq->pkt_type_mask);
1581
1582 if (likely(pkt_flags & PKT_RX_RSS_HASH)) {
1583 head->hash.rss = rte_le_to_cpu_32(desc->qw0.dw1);
1584 } else if (pkt_flags & PKT_RX_FDIR) {
1585 head->hash.fdir.hash = rte_le_to_cpu_16(desc->qw0.hi.csum)
1586 & TXGBE_ATR_HASH_MASK;
1587 head->hash.fdir.id = rte_le_to_cpu_16(desc->qw0.hi.ipid);
1588 }
1589 }
1590
1591 /**
1592 * txgbe_recv_pkts_lro - receive handler for and LRO case.
1593 *
1594 * @rx_queue Rx queue handle
1595 * @rx_pkts table of received packets
1596 * @nb_pkts size of rx_pkts table
1597 * @bulk_alloc if TRUE bulk allocation is used for a HW ring refilling
1598 *
1599 * Handles the Rx HW ring completions when RSC feature is configured. Uses an
1600 * additional ring of txgbe_rsc_entry's that will hold the relevant RSC info.
1601 *
1602 * We use the same logic as in Linux and in FreeBSD txgbe drivers:
1603 * 1) When non-EOP RSC completion arrives:
1604 * a) Update the HEAD of the current RSC aggregation cluster with the new
1605 * segment's data length.
1606 * b) Set the "next" pointer of the current segment to point to the segment
1607 * at the NEXTP index.
1608 * c) Pass the HEAD of RSC aggregation cluster on to the next NEXTP entry
1609 * in the sw_rsc_ring.
1610 * 2) When EOP arrives we just update the cluster's total length and offload
1611 * flags and deliver the cluster up to the upper layers. In our case - put it
1612 * in the rx_pkts table.
1613 *
1614 * Returns the number of received packets/clusters (according to the "bulk
1615 * receive" interface).
1616 */
1617 static inline uint16_t
txgbe_recv_pkts_lro(void * rx_queue,struct rte_mbuf ** rx_pkts,uint16_t nb_pkts,bool bulk_alloc)1618 txgbe_recv_pkts_lro(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts,
1619 bool bulk_alloc)
1620 {
1621 struct txgbe_rx_queue *rxq = rx_queue;
1622 struct rte_eth_dev *dev = &rte_eth_devices[rxq->port_id];
1623 volatile struct txgbe_rx_desc *rx_ring = rxq->rx_ring;
1624 struct txgbe_rx_entry *sw_ring = rxq->sw_ring;
1625 struct txgbe_scattered_rx_entry *sw_sc_ring = rxq->sw_sc_ring;
1626 uint16_t rx_id = rxq->rx_tail;
1627 uint16_t nb_rx = 0;
1628 uint16_t nb_hold = rxq->nb_rx_hold;
1629 uint16_t prev_id = rxq->rx_tail;
1630
1631 while (nb_rx < nb_pkts) {
1632 bool eop;
1633 struct txgbe_rx_entry *rxe;
1634 struct txgbe_scattered_rx_entry *sc_entry;
1635 struct txgbe_scattered_rx_entry *next_sc_entry = NULL;
1636 struct txgbe_rx_entry *next_rxe = NULL;
1637 struct rte_mbuf *first_seg;
1638 struct rte_mbuf *rxm;
1639 struct rte_mbuf *nmb = NULL;
1640 struct txgbe_rx_desc rxd;
1641 uint16_t data_len;
1642 uint16_t next_id;
1643 volatile struct txgbe_rx_desc *rxdp;
1644 uint32_t staterr;
1645
1646 next_desc:
1647 /*
1648 * The code in this whole file uses the volatile pointer to
1649 * ensure the read ordering of the status and the rest of the
1650 * descriptor fields (on the compiler level only!!!). This is so
1651 * UGLY - why not to just use the compiler barrier instead? DPDK
1652 * even has the rte_compiler_barrier() for that.
1653 *
1654 * But most importantly this is just wrong because this doesn't
1655 * ensure memory ordering in a general case at all. For
1656 * instance, DPDK is supposed to work on Power CPUs where
1657 * compiler barrier may just not be enough!
1658 *
1659 * I tried to write only this function properly to have a
1660 * starting point (as a part of an LRO/RSC series) but the
1661 * compiler cursed at me when I tried to cast away the
1662 * "volatile" from rx_ring (yes, it's volatile too!!!). So, I'm
1663 * keeping it the way it is for now.
1664 *
1665 * The code in this file is broken in so many other places and
1666 * will just not work on a big endian CPU anyway therefore the
1667 * lines below will have to be revisited together with the rest
1668 * of the txgbe PMD.
1669 *
1670 * TODO:
1671 * - Get rid of "volatile" and let the compiler do its job.
1672 * - Use the proper memory barrier (rte_rmb()) to ensure the
1673 * memory ordering below.
1674 */
1675 rxdp = &rx_ring[rx_id];
1676 staterr = rte_le_to_cpu_32(rxdp->qw1.lo.status);
1677
1678 if (!(staterr & TXGBE_RXD_STAT_DD))
1679 break;
1680
1681 rxd = *rxdp;
1682
1683 PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_id=%u "
1684 "staterr=0x%x data_len=%u",
1685 rxq->port_id, rxq->queue_id, rx_id, staterr,
1686 rte_le_to_cpu_16(rxd.qw1.hi.len));
1687
1688 if (!bulk_alloc) {
1689 nmb = rte_mbuf_raw_alloc(rxq->mb_pool);
1690 if (nmb == NULL) {
1691 PMD_RX_LOG(DEBUG, "RX mbuf alloc failed "
1692 "port_id=%u queue_id=%u",
1693 rxq->port_id, rxq->queue_id);
1694
1695 dev->data->rx_mbuf_alloc_failed++;
1696 break;
1697 }
1698 } else if (nb_hold > rxq->rx_free_thresh) {
1699 uint16_t next_rdt = rxq->rx_free_trigger;
1700
1701 if (!txgbe_rx_alloc_bufs(rxq, false)) {
1702 rte_wmb();
1703 txgbe_set32_relaxed(rxq->rdt_reg_addr,
1704 next_rdt);
1705 nb_hold -= rxq->rx_free_thresh;
1706 } else {
1707 PMD_RX_LOG(DEBUG, "RX bulk alloc failed "
1708 "port_id=%u queue_id=%u",
1709 rxq->port_id, rxq->queue_id);
1710
1711 dev->data->rx_mbuf_alloc_failed++;
1712 break;
1713 }
1714 }
1715
1716 nb_hold++;
1717 rxe = &sw_ring[rx_id];
1718 eop = staterr & TXGBE_RXD_STAT_EOP;
1719
1720 next_id = rx_id + 1;
1721 if (next_id == rxq->nb_rx_desc)
1722 next_id = 0;
1723
1724 /* Prefetch next mbuf while processing current one. */
1725 rte_txgbe_prefetch(sw_ring[next_id].mbuf);
1726
1727 /*
1728 * When next RX descriptor is on a cache-line boundary,
1729 * prefetch the next 4 RX descriptors and the next 4 pointers
1730 * to mbufs.
1731 */
1732 if ((next_id & 0x3) == 0) {
1733 rte_txgbe_prefetch(&rx_ring[next_id]);
1734 rte_txgbe_prefetch(&sw_ring[next_id]);
1735 }
1736
1737 rxm = rxe->mbuf;
1738
1739 if (!bulk_alloc) {
1740 __le64 dma =
1741 rte_cpu_to_le_64(rte_mbuf_data_iova_default(nmb));
1742 /*
1743 * Update RX descriptor with the physical address of the
1744 * new data buffer of the new allocated mbuf.
1745 */
1746 rxe->mbuf = nmb;
1747
1748 rxm->data_off = RTE_PKTMBUF_HEADROOM;
1749 TXGBE_RXD_HDRADDR(rxdp, 0);
1750 TXGBE_RXD_PKTADDR(rxdp, dma);
1751 } else {
1752 rxe->mbuf = NULL;
1753 }
1754
1755 /*
1756 * Set data length & data buffer address of mbuf.
1757 */
1758 data_len = rte_le_to_cpu_16(rxd.qw1.hi.len);
1759 rxm->data_len = data_len;
1760
1761 if (!eop) {
1762 uint16_t nextp_id;
1763 /*
1764 * Get next descriptor index:
1765 * - For RSC it's in the NEXTP field.
1766 * - For a scattered packet - it's just a following
1767 * descriptor.
1768 */
1769 if (TXGBE_RXD_RSCCNT(rxd.qw0.dw0))
1770 nextp_id = TXGBE_RXD_NEXTP(staterr);
1771 else
1772 nextp_id = next_id;
1773
1774 next_sc_entry = &sw_sc_ring[nextp_id];
1775 next_rxe = &sw_ring[nextp_id];
1776 rte_txgbe_prefetch(next_rxe);
1777 }
1778
1779 sc_entry = &sw_sc_ring[rx_id];
1780 first_seg = sc_entry->fbuf;
1781 sc_entry->fbuf = NULL;
1782
1783 /*
1784 * If this is the first buffer of the received packet,
1785 * set the pointer to the first mbuf of the packet and
1786 * initialize its context.
1787 * Otherwise, update the total length and the number of segments
1788 * of the current scattered packet, and update the pointer to
1789 * the last mbuf of the current packet.
1790 */
1791 if (first_seg == NULL) {
1792 first_seg = rxm;
1793 first_seg->pkt_len = data_len;
1794 first_seg->nb_segs = 1;
1795 } else {
1796 first_seg->pkt_len += data_len;
1797 first_seg->nb_segs++;
1798 }
1799
1800 prev_id = rx_id;
1801 rx_id = next_id;
1802
1803 /*
1804 * If this is not the last buffer of the received packet, update
1805 * the pointer to the first mbuf at the NEXTP entry in the
1806 * sw_sc_ring and continue to parse the RX ring.
1807 */
1808 if (!eop && next_rxe) {
1809 rxm->next = next_rxe->mbuf;
1810 next_sc_entry->fbuf = first_seg;
1811 goto next_desc;
1812 }
1813
1814 /* Initialize the first mbuf of the returned packet */
1815 txgbe_fill_cluster_head_buf(first_seg, &rxd, rxq, staterr);
1816
1817 /*
1818 * Deal with the case, when HW CRC srip is disabled.
1819 * That can't happen when LRO is enabled, but still could
1820 * happen for scattered RX mode.
1821 */
1822 first_seg->pkt_len -= rxq->crc_len;
1823 if (unlikely(rxm->data_len <= rxq->crc_len)) {
1824 struct rte_mbuf *lp;
1825
1826 for (lp = first_seg; lp->next != rxm; lp = lp->next)
1827 ;
1828
1829 first_seg->nb_segs--;
1830 lp->data_len -= rxq->crc_len - rxm->data_len;
1831 lp->next = NULL;
1832 rte_pktmbuf_free_seg(rxm);
1833 } else {
1834 rxm->data_len -= rxq->crc_len;
1835 }
1836
1837 /* Prefetch data of first segment, if configured to do so. */
1838 rte_packet_prefetch((char *)first_seg->buf_addr +
1839 first_seg->data_off);
1840
1841 /*
1842 * Store the mbuf address into the next entry of the array
1843 * of returned packets.
1844 */
1845 rx_pkts[nb_rx++] = first_seg;
1846 }
1847
1848 /*
1849 * Record index of the next RX descriptor to probe.
1850 */
1851 rxq->rx_tail = rx_id;
1852
1853 /*
1854 * If the number of free RX descriptors is greater than the RX free
1855 * threshold of the queue, advance the Receive Descriptor Tail (RDT)
1856 * register.
1857 * Update the RDT with the value of the last processed RX descriptor
1858 * minus 1, to guarantee that the RDT register is never equal to the
1859 * RDH register, which creates a "full" ring situation from the
1860 * hardware point of view...
1861 */
1862 if (!bulk_alloc && nb_hold > rxq->rx_free_thresh) {
1863 PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_tail=%u "
1864 "nb_hold=%u nb_rx=%u",
1865 rxq->port_id, rxq->queue_id, rx_id, nb_hold, nb_rx);
1866
1867 rte_wmb();
1868 txgbe_set32_relaxed(rxq->rdt_reg_addr, prev_id);
1869 nb_hold = 0;
1870 }
1871
1872 rxq->nb_rx_hold = nb_hold;
1873 return nb_rx;
1874 }
1875
1876 uint16_t
txgbe_recv_pkts_lro_single_alloc(void * rx_queue,struct rte_mbuf ** rx_pkts,uint16_t nb_pkts)1877 txgbe_recv_pkts_lro_single_alloc(void *rx_queue, struct rte_mbuf **rx_pkts,
1878 uint16_t nb_pkts)
1879 {
1880 return txgbe_recv_pkts_lro(rx_queue, rx_pkts, nb_pkts, false);
1881 }
1882
1883 uint16_t
txgbe_recv_pkts_lro_bulk_alloc(void * rx_queue,struct rte_mbuf ** rx_pkts,uint16_t nb_pkts)1884 txgbe_recv_pkts_lro_bulk_alloc(void *rx_queue, struct rte_mbuf **rx_pkts,
1885 uint16_t nb_pkts)
1886 {
1887 return txgbe_recv_pkts_lro(rx_queue, rx_pkts, nb_pkts, true);
1888 }
1889
1890 uint64_t
txgbe_get_rx_queue_offloads(struct rte_eth_dev * dev __rte_unused)1891 txgbe_get_rx_queue_offloads(struct rte_eth_dev *dev __rte_unused)
1892 {
1893 return DEV_RX_OFFLOAD_VLAN_STRIP;
1894 }
1895
1896 uint64_t
txgbe_get_rx_port_offloads(struct rte_eth_dev * dev)1897 txgbe_get_rx_port_offloads(struct rte_eth_dev *dev)
1898 {
1899 uint64_t offloads;
1900 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
1901 struct rte_eth_dev_sriov *sriov = &RTE_ETH_DEV_SRIOV(dev);
1902
1903 offloads = DEV_RX_OFFLOAD_IPV4_CKSUM |
1904 DEV_RX_OFFLOAD_UDP_CKSUM |
1905 DEV_RX_OFFLOAD_TCP_CKSUM |
1906 DEV_RX_OFFLOAD_KEEP_CRC |
1907 DEV_RX_OFFLOAD_JUMBO_FRAME |
1908 DEV_RX_OFFLOAD_VLAN_FILTER |
1909 DEV_RX_OFFLOAD_RSS_HASH |
1910 DEV_RX_OFFLOAD_SCATTER;
1911
1912 if (!txgbe_is_vf(dev))
1913 offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
1914 DEV_RX_OFFLOAD_QINQ_STRIP |
1915 DEV_RX_OFFLOAD_VLAN_EXTEND);
1916
1917 /*
1918 * RSC is only supported by PF devices in a non-SR-IOV
1919 * mode.
1920 */
1921 if (hw->mac.type == txgbe_mac_raptor && !sriov->active)
1922 offloads |= DEV_RX_OFFLOAD_TCP_LRO;
1923
1924 if (hw->mac.type == txgbe_mac_raptor)
1925 offloads |= DEV_RX_OFFLOAD_MACSEC_STRIP;
1926
1927 offloads |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
1928
1929 return offloads;
1930 }
1931
1932 static void __rte_cold
txgbe_tx_queue_release_mbufs(struct txgbe_tx_queue * txq)1933 txgbe_tx_queue_release_mbufs(struct txgbe_tx_queue *txq)
1934 {
1935 unsigned int i;
1936
1937 if (txq->sw_ring != NULL) {
1938 for (i = 0; i < txq->nb_tx_desc; i++) {
1939 if (txq->sw_ring[i].mbuf != NULL) {
1940 rte_pktmbuf_free_seg(txq->sw_ring[i].mbuf);
1941 txq->sw_ring[i].mbuf = NULL;
1942 }
1943 }
1944 }
1945 }
1946
1947 static int
txgbe_tx_done_cleanup_full(struct txgbe_tx_queue * txq,uint32_t free_cnt)1948 txgbe_tx_done_cleanup_full(struct txgbe_tx_queue *txq, uint32_t free_cnt)
1949 {
1950 struct txgbe_tx_entry *swr_ring = txq->sw_ring;
1951 uint16_t i, tx_last, tx_id;
1952 uint16_t nb_tx_free_last;
1953 uint16_t nb_tx_to_clean;
1954 uint32_t pkt_cnt;
1955
1956 /* Start free mbuf from the next of tx_tail */
1957 tx_last = txq->tx_tail;
1958 tx_id = swr_ring[tx_last].next_id;
1959
1960 if (txq->nb_tx_free == 0 && txgbe_xmit_cleanup(txq))
1961 return 0;
1962
1963 nb_tx_to_clean = txq->nb_tx_free;
1964 nb_tx_free_last = txq->nb_tx_free;
1965 if (!free_cnt)
1966 free_cnt = txq->nb_tx_desc;
1967
1968 /* Loop through swr_ring to count the amount of
1969 * freeable mubfs and packets.
1970 */
1971 for (pkt_cnt = 0; pkt_cnt < free_cnt; ) {
1972 for (i = 0; i < nb_tx_to_clean &&
1973 pkt_cnt < free_cnt &&
1974 tx_id != tx_last; i++) {
1975 if (swr_ring[tx_id].mbuf != NULL) {
1976 rte_pktmbuf_free_seg(swr_ring[tx_id].mbuf);
1977 swr_ring[tx_id].mbuf = NULL;
1978
1979 /*
1980 * last segment in the packet,
1981 * increment packet count
1982 */
1983 pkt_cnt += (swr_ring[tx_id].last_id == tx_id);
1984 }
1985
1986 tx_id = swr_ring[tx_id].next_id;
1987 }
1988
1989 if (pkt_cnt < free_cnt) {
1990 if (txgbe_xmit_cleanup(txq))
1991 break;
1992
1993 nb_tx_to_clean = txq->nb_tx_free - nb_tx_free_last;
1994 nb_tx_free_last = txq->nb_tx_free;
1995 }
1996 }
1997
1998 return (int)pkt_cnt;
1999 }
2000
2001 static int
txgbe_tx_done_cleanup_simple(struct txgbe_tx_queue * txq,uint32_t free_cnt)2002 txgbe_tx_done_cleanup_simple(struct txgbe_tx_queue *txq,
2003 uint32_t free_cnt)
2004 {
2005 int i, n, cnt;
2006
2007 if (free_cnt == 0 || free_cnt > txq->nb_tx_desc)
2008 free_cnt = txq->nb_tx_desc;
2009
2010 cnt = free_cnt - free_cnt % txq->tx_free_thresh;
2011
2012 for (i = 0; i < cnt; i += n) {
2013 if (txq->nb_tx_desc - txq->nb_tx_free < txq->tx_free_thresh)
2014 break;
2015
2016 n = txgbe_tx_free_bufs(txq);
2017
2018 if (n == 0)
2019 break;
2020 }
2021
2022 return i;
2023 }
2024
2025 int
txgbe_dev_tx_done_cleanup(void * tx_queue,uint32_t free_cnt)2026 txgbe_dev_tx_done_cleanup(void *tx_queue, uint32_t free_cnt)
2027 {
2028 struct txgbe_tx_queue *txq = (struct txgbe_tx_queue *)tx_queue;
2029 if (txq->offloads == 0 &&
2030 txq->tx_free_thresh >= RTE_PMD_TXGBE_TX_MAX_BURST)
2031 return txgbe_tx_done_cleanup_simple(txq, free_cnt);
2032
2033 return txgbe_tx_done_cleanup_full(txq, free_cnt);
2034 }
2035
2036 static void __rte_cold
txgbe_tx_free_swring(struct txgbe_tx_queue * txq)2037 txgbe_tx_free_swring(struct txgbe_tx_queue *txq)
2038 {
2039 if (txq != NULL &&
2040 txq->sw_ring != NULL)
2041 rte_free(txq->sw_ring);
2042 }
2043
2044 static void __rte_cold
txgbe_tx_queue_release(struct txgbe_tx_queue * txq)2045 txgbe_tx_queue_release(struct txgbe_tx_queue *txq)
2046 {
2047 if (txq != NULL && txq->ops != NULL) {
2048 txq->ops->release_mbufs(txq);
2049 txq->ops->free_swring(txq);
2050 rte_free(txq);
2051 }
2052 }
2053
2054 void __rte_cold
txgbe_dev_tx_queue_release(void * txq)2055 txgbe_dev_tx_queue_release(void *txq)
2056 {
2057 txgbe_tx_queue_release(txq);
2058 }
2059
2060 /* (Re)set dynamic txgbe_tx_queue fields to defaults */
2061 static void __rte_cold
txgbe_reset_tx_queue(struct txgbe_tx_queue * txq)2062 txgbe_reset_tx_queue(struct txgbe_tx_queue *txq)
2063 {
2064 static const struct txgbe_tx_desc zeroed_desc = {0};
2065 struct txgbe_tx_entry *txe = txq->sw_ring;
2066 uint16_t prev, i;
2067
2068 /* Zero out HW ring memory */
2069 for (i = 0; i < txq->nb_tx_desc; i++)
2070 txq->tx_ring[i] = zeroed_desc;
2071
2072 /* Initialize SW ring entries */
2073 prev = (uint16_t)(txq->nb_tx_desc - 1);
2074 for (i = 0; i < txq->nb_tx_desc; i++) {
2075 volatile struct txgbe_tx_desc *txd = &txq->tx_ring[i];
2076
2077 txd->dw3 = rte_cpu_to_le_32(TXGBE_TXD_DD);
2078 txe[i].mbuf = NULL;
2079 txe[i].last_id = i;
2080 txe[prev].next_id = i;
2081 prev = i;
2082 }
2083
2084 txq->tx_next_dd = (uint16_t)(txq->tx_free_thresh - 1);
2085 txq->tx_tail = 0;
2086
2087 /*
2088 * Always allow 1 descriptor to be un-allocated to avoid
2089 * a H/W race condition
2090 */
2091 txq->last_desc_cleaned = (uint16_t)(txq->nb_tx_desc - 1);
2092 txq->nb_tx_free = (uint16_t)(txq->nb_tx_desc - 1);
2093 txq->ctx_curr = 0;
2094 memset((void *)&txq->ctx_cache, 0,
2095 TXGBE_CTX_NUM * sizeof(struct txgbe_ctx_info));
2096 }
2097
2098 static const struct txgbe_txq_ops def_txq_ops = {
2099 .release_mbufs = txgbe_tx_queue_release_mbufs,
2100 .free_swring = txgbe_tx_free_swring,
2101 .reset = txgbe_reset_tx_queue,
2102 };
2103
2104 /* Takes an ethdev and a queue and sets up the tx function to be used based on
2105 * the queue parameters. Used in tx_queue_setup by primary process and then
2106 * in dev_init by secondary process when attaching to an existing ethdev.
2107 */
2108 void __rte_cold
txgbe_set_tx_function(struct rte_eth_dev * dev,struct txgbe_tx_queue * txq)2109 txgbe_set_tx_function(struct rte_eth_dev *dev, struct txgbe_tx_queue *txq)
2110 {
2111 /* Use a simple Tx queue (no offloads, no multi segs) if possible */
2112 if (txq->offloads == 0 &&
2113 txq->tx_free_thresh >= RTE_PMD_TXGBE_TX_MAX_BURST) {
2114 PMD_INIT_LOG(DEBUG, "Using simple tx code path");
2115 dev->tx_pkt_burst = txgbe_xmit_pkts_simple;
2116 dev->tx_pkt_prepare = NULL;
2117 } else {
2118 PMD_INIT_LOG(DEBUG, "Using full-featured tx code path");
2119 PMD_INIT_LOG(DEBUG,
2120 " - offloads = 0x%" PRIx64,
2121 txq->offloads);
2122 PMD_INIT_LOG(DEBUG,
2123 " - tx_free_thresh = %lu [RTE_PMD_TXGBE_TX_MAX_BURST=%lu]",
2124 (unsigned long)txq->tx_free_thresh,
2125 (unsigned long)RTE_PMD_TXGBE_TX_MAX_BURST);
2126 dev->tx_pkt_burst = txgbe_xmit_pkts;
2127 dev->tx_pkt_prepare = txgbe_prep_pkts;
2128 }
2129 }
2130
2131 uint64_t
txgbe_get_tx_queue_offloads(struct rte_eth_dev * dev)2132 txgbe_get_tx_queue_offloads(struct rte_eth_dev *dev)
2133 {
2134 RTE_SET_USED(dev);
2135
2136 return 0;
2137 }
2138
2139 uint64_t
txgbe_get_tx_port_offloads(struct rte_eth_dev * dev)2140 txgbe_get_tx_port_offloads(struct rte_eth_dev *dev)
2141 {
2142 uint64_t tx_offload_capa;
2143
2144 tx_offload_capa =
2145 DEV_TX_OFFLOAD_VLAN_INSERT |
2146 DEV_TX_OFFLOAD_IPV4_CKSUM |
2147 DEV_TX_OFFLOAD_UDP_CKSUM |
2148 DEV_TX_OFFLOAD_TCP_CKSUM |
2149 DEV_TX_OFFLOAD_SCTP_CKSUM |
2150 DEV_TX_OFFLOAD_TCP_TSO |
2151 DEV_TX_OFFLOAD_UDP_TSO |
2152 DEV_TX_OFFLOAD_UDP_TNL_TSO |
2153 DEV_TX_OFFLOAD_IP_TNL_TSO |
2154 DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
2155 DEV_TX_OFFLOAD_GRE_TNL_TSO |
2156 DEV_TX_OFFLOAD_IPIP_TNL_TSO |
2157 DEV_TX_OFFLOAD_GENEVE_TNL_TSO |
2158 DEV_TX_OFFLOAD_MULTI_SEGS;
2159
2160 if (!txgbe_is_vf(dev))
2161 tx_offload_capa |= DEV_TX_OFFLOAD_QINQ_INSERT;
2162
2163 tx_offload_capa |= DEV_TX_OFFLOAD_MACSEC_INSERT;
2164
2165 tx_offload_capa |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;
2166
2167 return tx_offload_capa;
2168 }
2169
2170 int __rte_cold
txgbe_dev_tx_queue_setup(struct rte_eth_dev * dev,uint16_t queue_idx,uint16_t nb_desc,unsigned int socket_id,const struct rte_eth_txconf * tx_conf)2171 txgbe_dev_tx_queue_setup(struct rte_eth_dev *dev,
2172 uint16_t queue_idx,
2173 uint16_t nb_desc,
2174 unsigned int socket_id,
2175 const struct rte_eth_txconf *tx_conf)
2176 {
2177 const struct rte_memzone *tz;
2178 struct txgbe_tx_queue *txq;
2179 struct txgbe_hw *hw;
2180 uint16_t tx_free_thresh;
2181 uint64_t offloads;
2182
2183 PMD_INIT_FUNC_TRACE();
2184 hw = TXGBE_DEV_HW(dev);
2185
2186 offloads = tx_conf->offloads | dev->data->dev_conf.txmode.offloads;
2187
2188 /*
2189 * Validate number of transmit descriptors.
2190 * It must not exceed hardware maximum, and must be multiple
2191 * of TXGBE_ALIGN.
2192 */
2193 if (nb_desc % TXGBE_TXD_ALIGN != 0 ||
2194 nb_desc > TXGBE_RING_DESC_MAX ||
2195 nb_desc < TXGBE_RING_DESC_MIN) {
2196 return -EINVAL;
2197 }
2198
2199 /*
2200 * The TX descriptor ring will be cleaned after txq->tx_free_thresh
2201 * descriptors are used or if the number of descriptors required
2202 * to transmit a packet is greater than the number of free TX
2203 * descriptors.
2204 * One descriptor in the TX ring is used as a sentinel to avoid a
2205 * H/W race condition, hence the maximum threshold constraints.
2206 * When set to zero use default values.
2207 */
2208 tx_free_thresh = (uint16_t)((tx_conf->tx_free_thresh) ?
2209 tx_conf->tx_free_thresh : DEFAULT_TX_FREE_THRESH);
2210 if (tx_free_thresh >= (nb_desc - 3)) {
2211 PMD_INIT_LOG(ERR, "tx_free_thresh must be less than the number of "
2212 "TX descriptors minus 3. (tx_free_thresh=%u "
2213 "port=%d queue=%d)",
2214 (unsigned int)tx_free_thresh,
2215 (int)dev->data->port_id, (int)queue_idx);
2216 return -(EINVAL);
2217 }
2218
2219 if ((nb_desc % tx_free_thresh) != 0) {
2220 PMD_INIT_LOG(ERR, "tx_free_thresh must be a divisor of the "
2221 "number of TX descriptors. (tx_free_thresh=%u "
2222 "port=%d queue=%d)", (unsigned int)tx_free_thresh,
2223 (int)dev->data->port_id, (int)queue_idx);
2224 return -(EINVAL);
2225 }
2226
2227 /* Free memory prior to re-allocation if needed... */
2228 if (dev->data->tx_queues[queue_idx] != NULL) {
2229 txgbe_tx_queue_release(dev->data->tx_queues[queue_idx]);
2230 dev->data->tx_queues[queue_idx] = NULL;
2231 }
2232
2233 /* First allocate the tx queue data structure */
2234 txq = rte_zmalloc_socket("ethdev TX queue",
2235 sizeof(struct txgbe_tx_queue),
2236 RTE_CACHE_LINE_SIZE, socket_id);
2237 if (txq == NULL)
2238 return -ENOMEM;
2239
2240 /*
2241 * Allocate TX ring hardware descriptors. A memzone large enough to
2242 * handle the maximum ring size is allocated in order to allow for
2243 * resizing in later calls to the queue setup function.
2244 */
2245 tz = rte_eth_dma_zone_reserve(dev, "tx_ring", queue_idx,
2246 sizeof(struct txgbe_tx_desc) * TXGBE_RING_DESC_MAX,
2247 TXGBE_ALIGN, socket_id);
2248 if (tz == NULL) {
2249 txgbe_tx_queue_release(txq);
2250 return -ENOMEM;
2251 }
2252
2253 txq->nb_tx_desc = nb_desc;
2254 txq->tx_free_thresh = tx_free_thresh;
2255 txq->pthresh = tx_conf->tx_thresh.pthresh;
2256 txq->hthresh = tx_conf->tx_thresh.hthresh;
2257 txq->wthresh = tx_conf->tx_thresh.wthresh;
2258 txq->queue_id = queue_idx;
2259 txq->reg_idx = (uint16_t)((RTE_ETH_DEV_SRIOV(dev).active == 0) ?
2260 queue_idx : RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx + queue_idx);
2261 txq->port_id = dev->data->port_id;
2262 txq->offloads = offloads;
2263 txq->ops = &def_txq_ops;
2264 txq->tx_deferred_start = tx_conf->tx_deferred_start;
2265
2266 /* Modification to set tail pointer for virtual function
2267 * if vf is detected.
2268 */
2269 if (hw->mac.type == txgbe_mac_raptor_vf) {
2270 txq->tdt_reg_addr = TXGBE_REG_ADDR(hw, TXGBE_TXWP(queue_idx));
2271 txq->tdc_reg_addr = TXGBE_REG_ADDR(hw, TXGBE_TXCFG(queue_idx));
2272 } else {
2273 txq->tdt_reg_addr = TXGBE_REG_ADDR(hw,
2274 TXGBE_TXWP(txq->reg_idx));
2275 txq->tdc_reg_addr = TXGBE_REG_ADDR(hw,
2276 TXGBE_TXCFG(txq->reg_idx));
2277 }
2278
2279 txq->tx_ring_phys_addr = TMZ_PADDR(tz);
2280 txq->tx_ring = (struct txgbe_tx_desc *)TMZ_VADDR(tz);
2281
2282 /* Allocate software ring */
2283 txq->sw_ring = rte_zmalloc_socket("txq->sw_ring",
2284 sizeof(struct txgbe_tx_entry) * nb_desc,
2285 RTE_CACHE_LINE_SIZE, socket_id);
2286 if (txq->sw_ring == NULL) {
2287 txgbe_tx_queue_release(txq);
2288 return -ENOMEM;
2289 }
2290 PMD_INIT_LOG(DEBUG, "sw_ring=%p hw_ring=%p dma_addr=0x%" PRIx64,
2291 txq->sw_ring, txq->tx_ring, txq->tx_ring_phys_addr);
2292
2293 /* set up scalar TX function as appropriate */
2294 txgbe_set_tx_function(dev, txq);
2295
2296 txq->ops->reset(txq);
2297
2298 dev->data->tx_queues[queue_idx] = txq;
2299
2300 return 0;
2301 }
2302
2303 /**
2304 * txgbe_free_sc_cluster - free the not-yet-completed scattered cluster
2305 *
2306 * The "next" pointer of the last segment of (not-yet-completed) RSC clusters
2307 * in the sw_rsc_ring is not set to NULL but rather points to the next
2308 * mbuf of this RSC aggregation (that has not been completed yet and still
2309 * resides on the HW ring). So, instead of calling for rte_pktmbuf_free() we
2310 * will just free first "nb_segs" segments of the cluster explicitly by calling
2311 * an rte_pktmbuf_free_seg().
2312 *
2313 * @m scattered cluster head
2314 */
2315 static void __rte_cold
txgbe_free_sc_cluster(struct rte_mbuf * m)2316 txgbe_free_sc_cluster(struct rte_mbuf *m)
2317 {
2318 uint16_t i, nb_segs = m->nb_segs;
2319 struct rte_mbuf *next_seg;
2320
2321 for (i = 0; i < nb_segs; i++) {
2322 next_seg = m->next;
2323 rte_pktmbuf_free_seg(m);
2324 m = next_seg;
2325 }
2326 }
2327
2328 static void __rte_cold
txgbe_rx_queue_release_mbufs(struct txgbe_rx_queue * rxq)2329 txgbe_rx_queue_release_mbufs(struct txgbe_rx_queue *rxq)
2330 {
2331 unsigned int i;
2332
2333 if (rxq->sw_ring != NULL) {
2334 for (i = 0; i < rxq->nb_rx_desc; i++) {
2335 if (rxq->sw_ring[i].mbuf != NULL) {
2336 rte_pktmbuf_free_seg(rxq->sw_ring[i].mbuf);
2337 rxq->sw_ring[i].mbuf = NULL;
2338 }
2339 }
2340 if (rxq->rx_nb_avail) {
2341 for (i = 0; i < rxq->rx_nb_avail; ++i) {
2342 struct rte_mbuf *mb;
2343
2344 mb = rxq->rx_stage[rxq->rx_next_avail + i];
2345 rte_pktmbuf_free_seg(mb);
2346 }
2347 rxq->rx_nb_avail = 0;
2348 }
2349 }
2350
2351 if (rxq->sw_sc_ring)
2352 for (i = 0; i < rxq->nb_rx_desc; i++)
2353 if (rxq->sw_sc_ring[i].fbuf) {
2354 txgbe_free_sc_cluster(rxq->sw_sc_ring[i].fbuf);
2355 rxq->sw_sc_ring[i].fbuf = NULL;
2356 }
2357 }
2358
2359 static void __rte_cold
txgbe_rx_queue_release(struct txgbe_rx_queue * rxq)2360 txgbe_rx_queue_release(struct txgbe_rx_queue *rxq)
2361 {
2362 if (rxq != NULL) {
2363 txgbe_rx_queue_release_mbufs(rxq);
2364 rte_free(rxq->sw_ring);
2365 rte_free(rxq->sw_sc_ring);
2366 rte_free(rxq);
2367 }
2368 }
2369
2370 void __rte_cold
txgbe_dev_rx_queue_release(void * rxq)2371 txgbe_dev_rx_queue_release(void *rxq)
2372 {
2373 txgbe_rx_queue_release(rxq);
2374 }
2375
2376 /*
2377 * Check if Rx Burst Bulk Alloc function can be used.
2378 * Return
2379 * 0: the preconditions are satisfied and the bulk allocation function
2380 * can be used.
2381 * -EINVAL: the preconditions are NOT satisfied and the default Rx burst
2382 * function must be used.
2383 */
2384 static inline int __rte_cold
check_rx_burst_bulk_alloc_preconditions(struct txgbe_rx_queue * rxq)2385 check_rx_burst_bulk_alloc_preconditions(struct txgbe_rx_queue *rxq)
2386 {
2387 int ret = 0;
2388
2389 /*
2390 * Make sure the following pre-conditions are satisfied:
2391 * rxq->rx_free_thresh >= RTE_PMD_TXGBE_RX_MAX_BURST
2392 * rxq->rx_free_thresh < rxq->nb_rx_desc
2393 * (rxq->nb_rx_desc % rxq->rx_free_thresh) == 0
2394 * Scattered packets are not supported. This should be checked
2395 * outside of this function.
2396 */
2397 if (!(rxq->rx_free_thresh >= RTE_PMD_TXGBE_RX_MAX_BURST)) {
2398 PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions: "
2399 "rxq->rx_free_thresh=%d, "
2400 "RTE_PMD_TXGBE_RX_MAX_BURST=%d",
2401 rxq->rx_free_thresh, RTE_PMD_TXGBE_RX_MAX_BURST);
2402 ret = -EINVAL;
2403 } else if (!(rxq->rx_free_thresh < rxq->nb_rx_desc)) {
2404 PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions: "
2405 "rxq->rx_free_thresh=%d, "
2406 "rxq->nb_rx_desc=%d",
2407 rxq->rx_free_thresh, rxq->nb_rx_desc);
2408 ret = -EINVAL;
2409 } else if (!((rxq->nb_rx_desc % rxq->rx_free_thresh) == 0)) {
2410 PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions: "
2411 "rxq->nb_rx_desc=%d, "
2412 "rxq->rx_free_thresh=%d",
2413 rxq->nb_rx_desc, rxq->rx_free_thresh);
2414 ret = -EINVAL;
2415 }
2416
2417 return ret;
2418 }
2419
2420 /* Reset dynamic txgbe_rx_queue fields back to defaults */
2421 static void __rte_cold
txgbe_reset_rx_queue(struct txgbe_adapter * adapter,struct txgbe_rx_queue * rxq)2422 txgbe_reset_rx_queue(struct txgbe_adapter *adapter, struct txgbe_rx_queue *rxq)
2423 {
2424 static const struct txgbe_rx_desc zeroed_desc = {
2425 {{0}, {0} }, {{0}, {0} } };
2426 unsigned int i;
2427 uint16_t len = rxq->nb_rx_desc;
2428
2429 /*
2430 * By default, the Rx queue setup function allocates enough memory for
2431 * TXGBE_RING_DESC_MAX. The Rx Burst bulk allocation function requires
2432 * extra memory at the end of the descriptor ring to be zero'd out.
2433 */
2434 if (adapter->rx_bulk_alloc_allowed)
2435 /* zero out extra memory */
2436 len += RTE_PMD_TXGBE_RX_MAX_BURST;
2437
2438 /*
2439 * Zero out HW ring memory. Zero out extra memory at the end of
2440 * the H/W ring so look-ahead logic in Rx Burst bulk alloc function
2441 * reads extra memory as zeros.
2442 */
2443 for (i = 0; i < len; i++)
2444 rxq->rx_ring[i] = zeroed_desc;
2445
2446 /*
2447 * initialize extra software ring entries. Space for these extra
2448 * entries is always allocated
2449 */
2450 memset(&rxq->fake_mbuf, 0x0, sizeof(rxq->fake_mbuf));
2451 for (i = rxq->nb_rx_desc; i < len; ++i)
2452 rxq->sw_ring[i].mbuf = &rxq->fake_mbuf;
2453
2454 rxq->rx_nb_avail = 0;
2455 rxq->rx_next_avail = 0;
2456 rxq->rx_free_trigger = (uint16_t)(rxq->rx_free_thresh - 1);
2457 rxq->rx_tail = 0;
2458 rxq->nb_rx_hold = 0;
2459 rxq->pkt_first_seg = NULL;
2460 rxq->pkt_last_seg = NULL;
2461 }
2462
2463 int __rte_cold
txgbe_dev_rx_queue_setup(struct rte_eth_dev * dev,uint16_t queue_idx,uint16_t nb_desc,unsigned int socket_id,const struct rte_eth_rxconf * rx_conf,struct rte_mempool * mp)2464 txgbe_dev_rx_queue_setup(struct rte_eth_dev *dev,
2465 uint16_t queue_idx,
2466 uint16_t nb_desc,
2467 unsigned int socket_id,
2468 const struct rte_eth_rxconf *rx_conf,
2469 struct rte_mempool *mp)
2470 {
2471 const struct rte_memzone *rz;
2472 struct txgbe_rx_queue *rxq;
2473 struct txgbe_hw *hw;
2474 uint16_t len;
2475 struct txgbe_adapter *adapter = TXGBE_DEV_ADAPTER(dev);
2476 uint64_t offloads;
2477
2478 PMD_INIT_FUNC_TRACE();
2479 hw = TXGBE_DEV_HW(dev);
2480
2481 offloads = rx_conf->offloads | dev->data->dev_conf.rxmode.offloads;
2482
2483 /*
2484 * Validate number of receive descriptors.
2485 * It must not exceed hardware maximum, and must be multiple
2486 * of TXGBE_ALIGN.
2487 */
2488 if (nb_desc % TXGBE_RXD_ALIGN != 0 ||
2489 nb_desc > TXGBE_RING_DESC_MAX ||
2490 nb_desc < TXGBE_RING_DESC_MIN) {
2491 return -EINVAL;
2492 }
2493
2494 /* Free memory prior to re-allocation if needed... */
2495 if (dev->data->rx_queues[queue_idx] != NULL) {
2496 txgbe_rx_queue_release(dev->data->rx_queues[queue_idx]);
2497 dev->data->rx_queues[queue_idx] = NULL;
2498 }
2499
2500 /* First allocate the rx queue data structure */
2501 rxq = rte_zmalloc_socket("ethdev RX queue",
2502 sizeof(struct txgbe_rx_queue),
2503 RTE_CACHE_LINE_SIZE, socket_id);
2504 if (rxq == NULL)
2505 return -ENOMEM;
2506 rxq->mb_pool = mp;
2507 rxq->nb_rx_desc = nb_desc;
2508 rxq->rx_free_thresh = rx_conf->rx_free_thresh;
2509 rxq->queue_id = queue_idx;
2510 rxq->reg_idx = (uint16_t)((RTE_ETH_DEV_SRIOV(dev).active == 0) ?
2511 queue_idx : RTE_ETH_DEV_SRIOV(dev).def_pool_q_idx + queue_idx);
2512 rxq->port_id = dev->data->port_id;
2513 if (dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_KEEP_CRC)
2514 rxq->crc_len = RTE_ETHER_CRC_LEN;
2515 else
2516 rxq->crc_len = 0;
2517 rxq->drop_en = rx_conf->rx_drop_en;
2518 rxq->rx_deferred_start = rx_conf->rx_deferred_start;
2519 rxq->offloads = offloads;
2520
2521 /*
2522 * The packet type in RX descriptor is different for different NICs.
2523 * So set different masks for different NICs.
2524 */
2525 rxq->pkt_type_mask = TXGBE_PTID_MASK;
2526
2527 /*
2528 * Allocate RX ring hardware descriptors. A memzone large enough to
2529 * handle the maximum ring size is allocated in order to allow for
2530 * resizing in later calls to the queue setup function.
2531 */
2532 rz = rte_eth_dma_zone_reserve(dev, "rx_ring", queue_idx,
2533 RX_RING_SZ, TXGBE_ALIGN, socket_id);
2534 if (rz == NULL) {
2535 txgbe_rx_queue_release(rxq);
2536 return -ENOMEM;
2537 }
2538
2539 /*
2540 * Zero init all the descriptors in the ring.
2541 */
2542 memset(rz->addr, 0, RX_RING_SZ);
2543
2544 /*
2545 * Modified to setup VFRDT for Virtual Function
2546 */
2547 if (hw->mac.type == txgbe_mac_raptor_vf) {
2548 rxq->rdt_reg_addr =
2549 TXGBE_REG_ADDR(hw, TXGBE_RXWP(queue_idx));
2550 rxq->rdh_reg_addr =
2551 TXGBE_REG_ADDR(hw, TXGBE_RXRP(queue_idx));
2552 } else {
2553 rxq->rdt_reg_addr =
2554 TXGBE_REG_ADDR(hw, TXGBE_RXWP(rxq->reg_idx));
2555 rxq->rdh_reg_addr =
2556 TXGBE_REG_ADDR(hw, TXGBE_RXRP(rxq->reg_idx));
2557 }
2558
2559 rxq->rx_ring_phys_addr = TMZ_PADDR(rz);
2560 rxq->rx_ring = (struct txgbe_rx_desc *)TMZ_VADDR(rz);
2561
2562 /*
2563 * Certain constraints must be met in order to use the bulk buffer
2564 * allocation Rx burst function. If any of Rx queues doesn't meet them
2565 * the feature should be disabled for the whole port.
2566 */
2567 if (check_rx_burst_bulk_alloc_preconditions(rxq)) {
2568 PMD_INIT_LOG(DEBUG, "queue[%d] doesn't meet Rx Bulk Alloc "
2569 "preconditions - canceling the feature for "
2570 "the whole port[%d]",
2571 rxq->queue_id, rxq->port_id);
2572 adapter->rx_bulk_alloc_allowed = false;
2573 }
2574
2575 /*
2576 * Allocate software ring. Allow for space at the end of the
2577 * S/W ring to make sure look-ahead logic in bulk alloc Rx burst
2578 * function does not access an invalid memory region.
2579 */
2580 len = nb_desc;
2581 if (adapter->rx_bulk_alloc_allowed)
2582 len += RTE_PMD_TXGBE_RX_MAX_BURST;
2583
2584 rxq->sw_ring = rte_zmalloc_socket("rxq->sw_ring",
2585 sizeof(struct txgbe_rx_entry) * len,
2586 RTE_CACHE_LINE_SIZE, socket_id);
2587 if (!rxq->sw_ring) {
2588 txgbe_rx_queue_release(rxq);
2589 return -ENOMEM;
2590 }
2591
2592 /*
2593 * Always allocate even if it's not going to be needed in order to
2594 * simplify the code.
2595 *
2596 * This ring is used in LRO and Scattered Rx cases and Scattered Rx may
2597 * be requested in txgbe_dev_rx_init(), which is called later from
2598 * dev_start() flow.
2599 */
2600 rxq->sw_sc_ring =
2601 rte_zmalloc_socket("rxq->sw_sc_ring",
2602 sizeof(struct txgbe_scattered_rx_entry) * len,
2603 RTE_CACHE_LINE_SIZE, socket_id);
2604 if (!rxq->sw_sc_ring) {
2605 txgbe_rx_queue_release(rxq);
2606 return -ENOMEM;
2607 }
2608
2609 PMD_INIT_LOG(DEBUG, "sw_ring=%p sw_sc_ring=%p hw_ring=%p "
2610 "dma_addr=0x%" PRIx64,
2611 rxq->sw_ring, rxq->sw_sc_ring, rxq->rx_ring,
2612 rxq->rx_ring_phys_addr);
2613
2614 dev->data->rx_queues[queue_idx] = rxq;
2615
2616 txgbe_reset_rx_queue(adapter, rxq);
2617
2618 return 0;
2619 }
2620
2621 uint32_t
txgbe_dev_rx_queue_count(struct rte_eth_dev * dev,uint16_t rx_queue_id)2622 txgbe_dev_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
2623 {
2624 #define TXGBE_RXQ_SCAN_INTERVAL 4
2625 volatile struct txgbe_rx_desc *rxdp;
2626 struct txgbe_rx_queue *rxq;
2627 uint32_t desc = 0;
2628
2629 rxq = dev->data->rx_queues[rx_queue_id];
2630 rxdp = &rxq->rx_ring[rxq->rx_tail];
2631
2632 while ((desc < rxq->nb_rx_desc) &&
2633 (rxdp->qw1.lo.status &
2634 rte_cpu_to_le_32(TXGBE_RXD_STAT_DD))) {
2635 desc += TXGBE_RXQ_SCAN_INTERVAL;
2636 rxdp += TXGBE_RXQ_SCAN_INTERVAL;
2637 if (rxq->rx_tail + desc >= rxq->nb_rx_desc)
2638 rxdp = &(rxq->rx_ring[rxq->rx_tail +
2639 desc - rxq->nb_rx_desc]);
2640 }
2641
2642 return desc;
2643 }
2644
2645 int
txgbe_dev_rx_descriptor_status(void * rx_queue,uint16_t offset)2646 txgbe_dev_rx_descriptor_status(void *rx_queue, uint16_t offset)
2647 {
2648 struct txgbe_rx_queue *rxq = rx_queue;
2649 volatile uint32_t *status;
2650 uint32_t nb_hold, desc;
2651
2652 if (unlikely(offset >= rxq->nb_rx_desc))
2653 return -EINVAL;
2654
2655 nb_hold = rxq->nb_rx_hold;
2656 if (offset >= rxq->nb_rx_desc - nb_hold)
2657 return RTE_ETH_RX_DESC_UNAVAIL;
2658
2659 desc = rxq->rx_tail + offset;
2660 if (desc >= rxq->nb_rx_desc)
2661 desc -= rxq->nb_rx_desc;
2662
2663 status = &rxq->rx_ring[desc].qw1.lo.status;
2664 if (*status & rte_cpu_to_le_32(TXGBE_RXD_STAT_DD))
2665 return RTE_ETH_RX_DESC_DONE;
2666
2667 return RTE_ETH_RX_DESC_AVAIL;
2668 }
2669
2670 int
txgbe_dev_tx_descriptor_status(void * tx_queue,uint16_t offset)2671 txgbe_dev_tx_descriptor_status(void *tx_queue, uint16_t offset)
2672 {
2673 struct txgbe_tx_queue *txq = tx_queue;
2674 volatile uint32_t *status;
2675 uint32_t desc;
2676
2677 if (unlikely(offset >= txq->nb_tx_desc))
2678 return -EINVAL;
2679
2680 desc = txq->tx_tail + offset;
2681 if (desc >= txq->nb_tx_desc) {
2682 desc -= txq->nb_tx_desc;
2683 if (desc >= txq->nb_tx_desc)
2684 desc -= txq->nb_tx_desc;
2685 }
2686
2687 status = &txq->tx_ring[desc].dw3;
2688 if (*status & rte_cpu_to_le_32(TXGBE_TXD_DD))
2689 return RTE_ETH_TX_DESC_DONE;
2690
2691 return RTE_ETH_TX_DESC_FULL;
2692 }
2693
2694 void __rte_cold
txgbe_dev_clear_queues(struct rte_eth_dev * dev)2695 txgbe_dev_clear_queues(struct rte_eth_dev *dev)
2696 {
2697 unsigned int i;
2698 struct txgbe_adapter *adapter = TXGBE_DEV_ADAPTER(dev);
2699
2700 PMD_INIT_FUNC_TRACE();
2701
2702 for (i = 0; i < dev->data->nb_tx_queues; i++) {
2703 struct txgbe_tx_queue *txq = dev->data->tx_queues[i];
2704
2705 if (txq != NULL) {
2706 txq->ops->release_mbufs(txq);
2707 txq->ops->reset(txq);
2708 }
2709 }
2710
2711 for (i = 0; i < dev->data->nb_rx_queues; i++) {
2712 struct txgbe_rx_queue *rxq = dev->data->rx_queues[i];
2713
2714 if (rxq != NULL) {
2715 txgbe_rx_queue_release_mbufs(rxq);
2716 txgbe_reset_rx_queue(adapter, rxq);
2717 }
2718 }
2719 }
2720
2721 void
txgbe_dev_free_queues(struct rte_eth_dev * dev)2722 txgbe_dev_free_queues(struct rte_eth_dev *dev)
2723 {
2724 unsigned int i;
2725
2726 PMD_INIT_FUNC_TRACE();
2727
2728 for (i = 0; i < dev->data->nb_rx_queues; i++) {
2729 txgbe_dev_rx_queue_release(dev->data->rx_queues[i]);
2730 dev->data->rx_queues[i] = NULL;
2731 }
2732 dev->data->nb_rx_queues = 0;
2733
2734 for (i = 0; i < dev->data->nb_tx_queues; i++) {
2735 txgbe_dev_tx_queue_release(dev->data->tx_queues[i]);
2736 dev->data->tx_queues[i] = NULL;
2737 }
2738 dev->data->nb_tx_queues = 0;
2739 }
2740
2741 /**
2742 * Receive Side Scaling (RSS)
2743 *
2744 * Principles:
2745 * The source and destination IP addresses of the IP header and the source
2746 * and destination ports of TCP/UDP headers, if any, of received packets are
2747 * hashed against a configurable random key to compute a 32-bit RSS hash result.
2748 * The seven (7) LSBs of the 32-bit hash result are used as an index into a
2749 * 128-entry redirection table (RETA). Each entry of the RETA provides a 3-bit
2750 * RSS output index which is used as the RX queue index where to store the
2751 * received packets.
2752 * The following output is supplied in the RX write-back descriptor:
2753 * - 32-bit result of the Microsoft RSS hash function,
2754 * - 4-bit RSS type field.
2755 */
2756
2757 /*
2758 * Used as the default key.
2759 */
2760 static uint8_t rss_intel_key[40] = {
2761 0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2,
2762 0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0,
2763 0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4,
2764 0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C,
2765 0x6A, 0x42, 0xB7, 0x3B, 0xBE, 0xAC, 0x01, 0xFA,
2766 };
2767
2768 static void
txgbe_rss_disable(struct rte_eth_dev * dev)2769 txgbe_rss_disable(struct rte_eth_dev *dev)
2770 {
2771 struct txgbe_hw *hw;
2772
2773 hw = TXGBE_DEV_HW(dev);
2774
2775 wr32m(hw, TXGBE_RACTL, TXGBE_RACTL_RSSENA, 0);
2776 }
2777
2778 int
txgbe_dev_rss_hash_update(struct rte_eth_dev * dev,struct rte_eth_rss_conf * rss_conf)2779 txgbe_dev_rss_hash_update(struct rte_eth_dev *dev,
2780 struct rte_eth_rss_conf *rss_conf)
2781 {
2782 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
2783 uint8_t *hash_key;
2784 uint32_t mrqc;
2785 uint32_t rss_key;
2786 uint64_t rss_hf;
2787 uint16_t i;
2788
2789 if (!txgbe_rss_update_sp(hw->mac.type)) {
2790 PMD_DRV_LOG(ERR, "RSS hash update is not supported on this "
2791 "NIC.");
2792 return -ENOTSUP;
2793 }
2794
2795 hash_key = rss_conf->rss_key;
2796 if (hash_key) {
2797 /* Fill in RSS hash key */
2798 for (i = 0; i < 10; i++) {
2799 rss_key = LS32(hash_key[(i * 4) + 0], 0, 0xFF);
2800 rss_key |= LS32(hash_key[(i * 4) + 1], 8, 0xFF);
2801 rss_key |= LS32(hash_key[(i * 4) + 2], 16, 0xFF);
2802 rss_key |= LS32(hash_key[(i * 4) + 3], 24, 0xFF);
2803 wr32a(hw, TXGBE_REG_RSSKEY, i, rss_key);
2804 }
2805 }
2806
2807 /* Set configured hashing protocols */
2808 rss_hf = rss_conf->rss_hf & TXGBE_RSS_OFFLOAD_ALL;
2809 mrqc = rd32(hw, TXGBE_RACTL);
2810 mrqc &= ~TXGBE_RACTL_RSSMASK;
2811 if (rss_hf & ETH_RSS_IPV4)
2812 mrqc |= TXGBE_RACTL_RSSIPV4;
2813 if (rss_hf & ETH_RSS_NONFRAG_IPV4_TCP)
2814 mrqc |= TXGBE_RACTL_RSSIPV4TCP;
2815 if (rss_hf & ETH_RSS_IPV6 ||
2816 rss_hf & ETH_RSS_IPV6_EX)
2817 mrqc |= TXGBE_RACTL_RSSIPV6;
2818 if (rss_hf & ETH_RSS_NONFRAG_IPV6_TCP ||
2819 rss_hf & ETH_RSS_IPV6_TCP_EX)
2820 mrqc |= TXGBE_RACTL_RSSIPV6TCP;
2821 if (rss_hf & ETH_RSS_NONFRAG_IPV4_UDP)
2822 mrqc |= TXGBE_RACTL_RSSIPV4UDP;
2823 if (rss_hf & ETH_RSS_NONFRAG_IPV6_UDP ||
2824 rss_hf & ETH_RSS_IPV6_UDP_EX)
2825 mrqc |= TXGBE_RACTL_RSSIPV6UDP;
2826
2827 if (rss_hf)
2828 mrqc |= TXGBE_RACTL_RSSENA;
2829 else
2830 mrqc &= ~TXGBE_RACTL_RSSENA;
2831
2832 wr32(hw, TXGBE_RACTL, mrqc);
2833
2834 return 0;
2835 }
2836
2837 int
txgbe_dev_rss_hash_conf_get(struct rte_eth_dev * dev,struct rte_eth_rss_conf * rss_conf)2838 txgbe_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
2839 struct rte_eth_rss_conf *rss_conf)
2840 {
2841 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
2842 uint8_t *hash_key;
2843 uint32_t mrqc;
2844 uint32_t rss_key;
2845 uint64_t rss_hf;
2846 uint16_t i;
2847
2848 hash_key = rss_conf->rss_key;
2849 if (hash_key) {
2850 /* Return RSS hash key */
2851 for (i = 0; i < 10; i++) {
2852 rss_key = rd32a(hw, TXGBE_REG_RSSKEY, i);
2853 hash_key[(i * 4) + 0] = RS32(rss_key, 0, 0xFF);
2854 hash_key[(i * 4) + 1] = RS32(rss_key, 8, 0xFF);
2855 hash_key[(i * 4) + 2] = RS32(rss_key, 16, 0xFF);
2856 hash_key[(i * 4) + 3] = RS32(rss_key, 24, 0xFF);
2857 }
2858 }
2859
2860 rss_hf = 0;
2861 mrqc = rd32(hw, TXGBE_RACTL);
2862 if (mrqc & TXGBE_RACTL_RSSIPV4)
2863 rss_hf |= ETH_RSS_IPV4;
2864 if (mrqc & TXGBE_RACTL_RSSIPV4TCP)
2865 rss_hf |= ETH_RSS_NONFRAG_IPV4_TCP;
2866 if (mrqc & TXGBE_RACTL_RSSIPV6)
2867 rss_hf |= ETH_RSS_IPV6 |
2868 ETH_RSS_IPV6_EX;
2869 if (mrqc & TXGBE_RACTL_RSSIPV6TCP)
2870 rss_hf |= ETH_RSS_NONFRAG_IPV6_TCP |
2871 ETH_RSS_IPV6_TCP_EX;
2872 if (mrqc & TXGBE_RACTL_RSSIPV4UDP)
2873 rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP;
2874 if (mrqc & TXGBE_RACTL_RSSIPV6UDP)
2875 rss_hf |= ETH_RSS_NONFRAG_IPV6_UDP |
2876 ETH_RSS_IPV6_UDP_EX;
2877 if (!(mrqc & TXGBE_RACTL_RSSENA))
2878 rss_hf = 0;
2879
2880 rss_hf &= TXGBE_RSS_OFFLOAD_ALL;
2881
2882 rss_conf->rss_hf = rss_hf;
2883 return 0;
2884 }
2885
2886 static void
txgbe_rss_configure(struct rte_eth_dev * dev)2887 txgbe_rss_configure(struct rte_eth_dev *dev)
2888 {
2889 struct rte_eth_rss_conf rss_conf;
2890 struct txgbe_adapter *adapter = TXGBE_DEV_ADAPTER(dev);
2891 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
2892 uint32_t reta;
2893 uint16_t i;
2894 uint16_t j;
2895
2896 PMD_INIT_FUNC_TRACE();
2897
2898 /*
2899 * Fill in redirection table
2900 * The byte-swap is needed because NIC registers are in
2901 * little-endian order.
2902 */
2903 if (adapter->rss_reta_updated == 0) {
2904 reta = 0;
2905 for (i = 0, j = 0; i < ETH_RSS_RETA_SIZE_128; i++, j++) {
2906 if (j == dev->data->nb_rx_queues)
2907 j = 0;
2908 reta = (reta >> 8) | LS32(j, 24, 0xFF);
2909 if ((i & 3) == 3)
2910 wr32a(hw, TXGBE_REG_RSSTBL, i >> 2, reta);
2911 }
2912 }
2913 /*
2914 * Configure the RSS key and the RSS protocols used to compute
2915 * the RSS hash of input packets.
2916 */
2917 rss_conf = dev->data->dev_conf.rx_adv_conf.rss_conf;
2918 if (rss_conf.rss_key == NULL)
2919 rss_conf.rss_key = rss_intel_key; /* Default hash key */
2920 txgbe_dev_rss_hash_update(dev, &rss_conf);
2921 }
2922
2923 #define NUM_VFTA_REGISTERS 128
2924 #define NIC_RX_BUFFER_SIZE 0x200
2925
2926 static void
txgbe_vmdq_dcb_configure(struct rte_eth_dev * dev)2927 txgbe_vmdq_dcb_configure(struct rte_eth_dev *dev)
2928 {
2929 struct rte_eth_vmdq_dcb_conf *cfg;
2930 struct txgbe_hw *hw;
2931 enum rte_eth_nb_pools num_pools;
2932 uint32_t mrqc, vt_ctl, queue_mapping, vlanctrl;
2933 uint16_t pbsize;
2934 uint8_t nb_tcs; /* number of traffic classes */
2935 int i;
2936
2937 PMD_INIT_FUNC_TRACE();
2938 hw = TXGBE_DEV_HW(dev);
2939 cfg = &dev->data->dev_conf.rx_adv_conf.vmdq_dcb_conf;
2940 num_pools = cfg->nb_queue_pools;
2941 /* Check we have a valid number of pools */
2942 if (num_pools != ETH_16_POOLS && num_pools != ETH_32_POOLS) {
2943 txgbe_rss_disable(dev);
2944 return;
2945 }
2946 /* 16 pools -> 8 traffic classes, 32 pools -> 4 traffic classes */
2947 nb_tcs = (uint8_t)(ETH_VMDQ_DCB_NUM_QUEUES / (int)num_pools);
2948
2949 /*
2950 * split rx buffer up into sections, each for 1 traffic class
2951 */
2952 pbsize = (uint16_t)(NIC_RX_BUFFER_SIZE / nb_tcs);
2953 for (i = 0; i < nb_tcs; i++) {
2954 uint32_t rxpbsize = rd32(hw, TXGBE_PBRXSIZE(i));
2955
2956 rxpbsize &= (~(0x3FF << 10));
2957 /* clear 10 bits. */
2958 rxpbsize |= (pbsize << 10); /* set value */
2959 wr32(hw, TXGBE_PBRXSIZE(i), rxpbsize);
2960 }
2961 /* zero alloc all unused TCs */
2962 for (i = nb_tcs; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2963 uint32_t rxpbsize = rd32(hw, TXGBE_PBRXSIZE(i));
2964
2965 rxpbsize &= (~(0x3FF << 10));
2966 /* clear 10 bits. */
2967 wr32(hw, TXGBE_PBRXSIZE(i), rxpbsize);
2968 }
2969
2970 if (num_pools == ETH_16_POOLS) {
2971 mrqc = TXGBE_PORTCTL_NUMTC_8;
2972 mrqc |= TXGBE_PORTCTL_NUMVT_16;
2973 } else {
2974 mrqc = TXGBE_PORTCTL_NUMTC_4;
2975 mrqc |= TXGBE_PORTCTL_NUMVT_32;
2976 }
2977 wr32m(hw, TXGBE_PORTCTL,
2978 TXGBE_PORTCTL_NUMTC_MASK | TXGBE_PORTCTL_NUMVT_MASK, mrqc);
2979
2980 vt_ctl = TXGBE_POOLCTL_RPLEN;
2981 if (cfg->enable_default_pool)
2982 vt_ctl |= TXGBE_POOLCTL_DEFPL(cfg->default_pool);
2983 else
2984 vt_ctl |= TXGBE_POOLCTL_DEFDSA;
2985
2986 wr32(hw, TXGBE_POOLCTL, vt_ctl);
2987
2988 queue_mapping = 0;
2989 for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++)
2990 /*
2991 * mapping is done with 3 bits per priority,
2992 * so shift by i*3 each time
2993 */
2994 queue_mapping |= ((cfg->dcb_tc[i] & 0x07) << (i * 3));
2995
2996 wr32(hw, TXGBE_RPUP2TC, queue_mapping);
2997
2998 wr32(hw, TXGBE_ARBRXCTL, TXGBE_ARBRXCTL_RRM);
2999
3000 /* enable vlan filtering and allow all vlan tags through */
3001 vlanctrl = rd32(hw, TXGBE_VLANCTL);
3002 vlanctrl |= TXGBE_VLANCTL_VFE; /* enable vlan filters */
3003 wr32(hw, TXGBE_VLANCTL, vlanctrl);
3004
3005 /* enable all vlan filters */
3006 for (i = 0; i < NUM_VFTA_REGISTERS; i++)
3007 wr32(hw, TXGBE_VLANTBL(i), 0xFFFFFFFF);
3008
3009 wr32(hw, TXGBE_POOLRXENA(0),
3010 num_pools == ETH_16_POOLS ? 0xFFFF : 0xFFFFFFFF);
3011
3012 wr32(hw, TXGBE_ETHADDRIDX, 0);
3013 wr32(hw, TXGBE_ETHADDRASSL, 0xFFFFFFFF);
3014 wr32(hw, TXGBE_ETHADDRASSH, 0xFFFFFFFF);
3015
3016 /* set up filters for vlan tags as configured */
3017 for (i = 0; i < cfg->nb_pool_maps; i++) {
3018 /* set vlan id in VF register and set the valid bit */
3019 wr32(hw, TXGBE_PSRVLANIDX, i);
3020 wr32(hw, TXGBE_PSRVLAN, (TXGBE_PSRVLAN_EA |
3021 (cfg->pool_map[i].vlan_id & 0xFFF)));
3022
3023 wr32(hw, TXGBE_PSRVLANPLM(0), cfg->pool_map[i].pools);
3024 }
3025 }
3026
3027 /**
3028 * txgbe_dcb_config_tx_hw_config - Configure general DCB TX parameters
3029 * @dev: pointer to eth_dev structure
3030 * @dcb_config: pointer to txgbe_dcb_config structure
3031 */
3032 static void
txgbe_dcb_tx_hw_config(struct rte_eth_dev * dev,struct txgbe_dcb_config * dcb_config)3033 txgbe_dcb_tx_hw_config(struct rte_eth_dev *dev,
3034 struct txgbe_dcb_config *dcb_config)
3035 {
3036 uint32_t reg;
3037 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
3038
3039 PMD_INIT_FUNC_TRACE();
3040
3041 /* Disable the Tx desc arbiter */
3042 reg = rd32(hw, TXGBE_ARBTXCTL);
3043 reg |= TXGBE_ARBTXCTL_DIA;
3044 wr32(hw, TXGBE_ARBTXCTL, reg);
3045
3046 /* Enable DCB for Tx with 8 TCs */
3047 reg = rd32(hw, TXGBE_PORTCTL);
3048 reg &= TXGBE_PORTCTL_NUMTC_MASK;
3049 reg |= TXGBE_PORTCTL_DCB;
3050 if (dcb_config->num_tcs.pg_tcs == 8)
3051 reg |= TXGBE_PORTCTL_NUMTC_8;
3052 else
3053 reg |= TXGBE_PORTCTL_NUMTC_4;
3054
3055 wr32(hw, TXGBE_PORTCTL, reg);
3056
3057 /* Enable the Tx desc arbiter */
3058 reg = rd32(hw, TXGBE_ARBTXCTL);
3059 reg &= ~TXGBE_ARBTXCTL_DIA;
3060 wr32(hw, TXGBE_ARBTXCTL, reg);
3061 }
3062
3063 /**
3064 * txgbe_vmdq_dcb_hw_tx_config - Configure general VMDQ+DCB TX parameters
3065 * @dev: pointer to rte_eth_dev structure
3066 * @dcb_config: pointer to txgbe_dcb_config structure
3067 */
3068 static void
txgbe_vmdq_dcb_hw_tx_config(struct rte_eth_dev * dev,struct txgbe_dcb_config * dcb_config)3069 txgbe_vmdq_dcb_hw_tx_config(struct rte_eth_dev *dev,
3070 struct txgbe_dcb_config *dcb_config)
3071 {
3072 struct rte_eth_vmdq_dcb_tx_conf *vmdq_tx_conf =
3073 &dev->data->dev_conf.tx_adv_conf.vmdq_dcb_tx_conf;
3074 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
3075
3076 PMD_INIT_FUNC_TRACE();
3077 /*PF VF Transmit Enable*/
3078 wr32(hw, TXGBE_POOLTXENA(0),
3079 vmdq_tx_conf->nb_queue_pools ==
3080 ETH_16_POOLS ? 0xFFFF : 0xFFFFFFFF);
3081
3082 /*Configure general DCB TX parameters*/
3083 txgbe_dcb_tx_hw_config(dev, dcb_config);
3084 }
3085
3086 static void
txgbe_vmdq_dcb_rx_config(struct rte_eth_dev * dev,struct txgbe_dcb_config * dcb_config)3087 txgbe_vmdq_dcb_rx_config(struct rte_eth_dev *dev,
3088 struct txgbe_dcb_config *dcb_config)
3089 {
3090 struct rte_eth_vmdq_dcb_conf *vmdq_rx_conf =
3091 &dev->data->dev_conf.rx_adv_conf.vmdq_dcb_conf;
3092 struct txgbe_dcb_tc_config *tc;
3093 uint8_t i, j;
3094
3095 /* convert rte_eth_conf.rx_adv_conf to struct txgbe_dcb_config */
3096 if (vmdq_rx_conf->nb_queue_pools == ETH_16_POOLS) {
3097 dcb_config->num_tcs.pg_tcs = ETH_8_TCS;
3098 dcb_config->num_tcs.pfc_tcs = ETH_8_TCS;
3099 } else {
3100 dcb_config->num_tcs.pg_tcs = ETH_4_TCS;
3101 dcb_config->num_tcs.pfc_tcs = ETH_4_TCS;
3102 }
3103
3104 /* Initialize User Priority to Traffic Class mapping */
3105 for (j = 0; j < TXGBE_DCB_TC_MAX; j++) {
3106 tc = &dcb_config->tc_config[j];
3107 tc->path[TXGBE_DCB_RX_CONFIG].up_to_tc_bitmap = 0;
3108 }
3109
3110 /* User Priority to Traffic Class mapping */
3111 for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
3112 j = vmdq_rx_conf->dcb_tc[i];
3113 tc = &dcb_config->tc_config[j];
3114 tc->path[TXGBE_DCB_RX_CONFIG].up_to_tc_bitmap |=
3115 (uint8_t)(1 << i);
3116 }
3117 }
3118
3119 static void
txgbe_dcb_vt_tx_config(struct rte_eth_dev * dev,struct txgbe_dcb_config * dcb_config)3120 txgbe_dcb_vt_tx_config(struct rte_eth_dev *dev,
3121 struct txgbe_dcb_config *dcb_config)
3122 {
3123 struct rte_eth_vmdq_dcb_tx_conf *vmdq_tx_conf =
3124 &dev->data->dev_conf.tx_adv_conf.vmdq_dcb_tx_conf;
3125 struct txgbe_dcb_tc_config *tc;
3126 uint8_t i, j;
3127
3128 /* convert rte_eth_conf.rx_adv_conf to struct txgbe_dcb_config */
3129 if (vmdq_tx_conf->nb_queue_pools == ETH_16_POOLS) {
3130 dcb_config->num_tcs.pg_tcs = ETH_8_TCS;
3131 dcb_config->num_tcs.pfc_tcs = ETH_8_TCS;
3132 } else {
3133 dcb_config->num_tcs.pg_tcs = ETH_4_TCS;
3134 dcb_config->num_tcs.pfc_tcs = ETH_4_TCS;
3135 }
3136
3137 /* Initialize User Priority to Traffic Class mapping */
3138 for (j = 0; j < TXGBE_DCB_TC_MAX; j++) {
3139 tc = &dcb_config->tc_config[j];
3140 tc->path[TXGBE_DCB_TX_CONFIG].up_to_tc_bitmap = 0;
3141 }
3142
3143 /* User Priority to Traffic Class mapping */
3144 for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
3145 j = vmdq_tx_conf->dcb_tc[i];
3146 tc = &dcb_config->tc_config[j];
3147 tc->path[TXGBE_DCB_TX_CONFIG].up_to_tc_bitmap |=
3148 (uint8_t)(1 << i);
3149 }
3150 }
3151
3152 static void
txgbe_dcb_rx_config(struct rte_eth_dev * dev,struct txgbe_dcb_config * dcb_config)3153 txgbe_dcb_rx_config(struct rte_eth_dev *dev,
3154 struct txgbe_dcb_config *dcb_config)
3155 {
3156 struct rte_eth_dcb_rx_conf *rx_conf =
3157 &dev->data->dev_conf.rx_adv_conf.dcb_rx_conf;
3158 struct txgbe_dcb_tc_config *tc;
3159 uint8_t i, j;
3160
3161 dcb_config->num_tcs.pg_tcs = (uint8_t)rx_conf->nb_tcs;
3162 dcb_config->num_tcs.pfc_tcs = (uint8_t)rx_conf->nb_tcs;
3163
3164 /* Initialize User Priority to Traffic Class mapping */
3165 for (j = 0; j < TXGBE_DCB_TC_MAX; j++) {
3166 tc = &dcb_config->tc_config[j];
3167 tc->path[TXGBE_DCB_RX_CONFIG].up_to_tc_bitmap = 0;
3168 }
3169
3170 /* User Priority to Traffic Class mapping */
3171 for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
3172 j = rx_conf->dcb_tc[i];
3173 tc = &dcb_config->tc_config[j];
3174 tc->path[TXGBE_DCB_RX_CONFIG].up_to_tc_bitmap |=
3175 (uint8_t)(1 << i);
3176 }
3177 }
3178
3179 static void
txgbe_dcb_tx_config(struct rte_eth_dev * dev,struct txgbe_dcb_config * dcb_config)3180 txgbe_dcb_tx_config(struct rte_eth_dev *dev,
3181 struct txgbe_dcb_config *dcb_config)
3182 {
3183 struct rte_eth_dcb_tx_conf *tx_conf =
3184 &dev->data->dev_conf.tx_adv_conf.dcb_tx_conf;
3185 struct txgbe_dcb_tc_config *tc;
3186 uint8_t i, j;
3187
3188 dcb_config->num_tcs.pg_tcs = (uint8_t)tx_conf->nb_tcs;
3189 dcb_config->num_tcs.pfc_tcs = (uint8_t)tx_conf->nb_tcs;
3190
3191 /* Initialize User Priority to Traffic Class mapping */
3192 for (j = 0; j < TXGBE_DCB_TC_MAX; j++) {
3193 tc = &dcb_config->tc_config[j];
3194 tc->path[TXGBE_DCB_TX_CONFIG].up_to_tc_bitmap = 0;
3195 }
3196
3197 /* User Priority to Traffic Class mapping */
3198 for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
3199 j = tx_conf->dcb_tc[i];
3200 tc = &dcb_config->tc_config[j];
3201 tc->path[TXGBE_DCB_TX_CONFIG].up_to_tc_bitmap |=
3202 (uint8_t)(1 << i);
3203 }
3204 }
3205
3206 /**
3207 * txgbe_dcb_rx_hw_config - Configure general DCB RX HW parameters
3208 * @dev: pointer to eth_dev structure
3209 * @dcb_config: pointer to txgbe_dcb_config structure
3210 */
3211 static void
txgbe_dcb_rx_hw_config(struct rte_eth_dev * dev,struct txgbe_dcb_config * dcb_config)3212 txgbe_dcb_rx_hw_config(struct rte_eth_dev *dev,
3213 struct txgbe_dcb_config *dcb_config)
3214 {
3215 uint32_t reg;
3216 uint32_t vlanctrl;
3217 uint8_t i;
3218 uint32_t q;
3219 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
3220
3221 PMD_INIT_FUNC_TRACE();
3222 /*
3223 * Disable the arbiter before changing parameters
3224 * (always enable recycle mode; WSP)
3225 */
3226 reg = TXGBE_ARBRXCTL_RRM | TXGBE_ARBRXCTL_WSP | TXGBE_ARBRXCTL_DIA;
3227 wr32(hw, TXGBE_ARBRXCTL, reg);
3228
3229 reg = rd32(hw, TXGBE_PORTCTL);
3230 reg &= ~(TXGBE_PORTCTL_NUMTC_MASK | TXGBE_PORTCTL_NUMVT_MASK);
3231 if (dcb_config->num_tcs.pg_tcs == 4) {
3232 reg |= TXGBE_PORTCTL_NUMTC_4;
3233 if (dcb_config->vt_mode)
3234 reg |= TXGBE_PORTCTL_NUMVT_32;
3235 else
3236 wr32(hw, TXGBE_POOLCTL, 0);
3237 }
3238
3239 if (dcb_config->num_tcs.pg_tcs == 8) {
3240 reg |= TXGBE_PORTCTL_NUMTC_8;
3241 if (dcb_config->vt_mode)
3242 reg |= TXGBE_PORTCTL_NUMVT_16;
3243 else
3244 wr32(hw, TXGBE_POOLCTL, 0);
3245 }
3246
3247 wr32(hw, TXGBE_PORTCTL, reg);
3248
3249 if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
3250 /* Disable drop for all queues in VMDQ mode*/
3251 for (q = 0; q < TXGBE_MAX_RX_QUEUE_NUM; q++) {
3252 u32 val = 1 << (q % 32);
3253 wr32m(hw, TXGBE_QPRXDROP(q / 32), val, val);
3254 }
3255 } else {
3256 /* Enable drop for all queues in SRIOV mode */
3257 for (q = 0; q < TXGBE_MAX_RX_QUEUE_NUM; q++) {
3258 u32 val = 1 << (q % 32);
3259 wr32m(hw, TXGBE_QPRXDROP(q / 32), val, val);
3260 }
3261 }
3262
3263 /* VLNCTL: enable vlan filtering and allow all vlan tags through */
3264 vlanctrl = rd32(hw, TXGBE_VLANCTL);
3265 vlanctrl |= TXGBE_VLANCTL_VFE; /* enable vlan filters */
3266 wr32(hw, TXGBE_VLANCTL, vlanctrl);
3267
3268 /* VLANTBL - enable all vlan filters */
3269 for (i = 0; i < NUM_VFTA_REGISTERS; i++)
3270 wr32(hw, TXGBE_VLANTBL(i), 0xFFFFFFFF);
3271
3272 /*
3273 * Configure Rx packet plane (recycle mode; WSP) and
3274 * enable arbiter
3275 */
3276 reg = TXGBE_ARBRXCTL_RRM | TXGBE_ARBRXCTL_WSP;
3277 wr32(hw, TXGBE_ARBRXCTL, reg);
3278 }
3279
3280 static void
txgbe_dcb_hw_arbite_rx_config(struct txgbe_hw * hw,uint16_t * refill,uint16_t * max,uint8_t * bwg_id,uint8_t * tsa,uint8_t * map)3281 txgbe_dcb_hw_arbite_rx_config(struct txgbe_hw *hw, uint16_t *refill,
3282 uint16_t *max, uint8_t *bwg_id, uint8_t *tsa, uint8_t *map)
3283 {
3284 txgbe_dcb_config_rx_arbiter_raptor(hw, refill, max, bwg_id,
3285 tsa, map);
3286 }
3287
3288 static void
txgbe_dcb_hw_arbite_tx_config(struct txgbe_hw * hw,uint16_t * refill,uint16_t * max,uint8_t * bwg_id,uint8_t * tsa,uint8_t * map)3289 txgbe_dcb_hw_arbite_tx_config(struct txgbe_hw *hw, uint16_t *refill,
3290 uint16_t *max, uint8_t *bwg_id, uint8_t *tsa, uint8_t *map)
3291 {
3292 switch (hw->mac.type) {
3293 case txgbe_mac_raptor:
3294 txgbe_dcb_config_tx_desc_arbiter_raptor(hw, refill,
3295 max, bwg_id, tsa);
3296 txgbe_dcb_config_tx_data_arbiter_raptor(hw, refill,
3297 max, bwg_id, tsa, map);
3298 break;
3299 default:
3300 break;
3301 }
3302 }
3303
3304 #define DCB_RX_CONFIG 1
3305 #define DCB_TX_CONFIG 1
3306 #define DCB_TX_PB 1024
3307 /**
3308 * txgbe_dcb_hw_configure - Enable DCB and configure
3309 * general DCB in VT mode and non-VT mode parameters
3310 * @dev: pointer to rte_eth_dev structure
3311 * @dcb_config: pointer to txgbe_dcb_config structure
3312 */
3313 static int
txgbe_dcb_hw_configure(struct rte_eth_dev * dev,struct txgbe_dcb_config * dcb_config)3314 txgbe_dcb_hw_configure(struct rte_eth_dev *dev,
3315 struct txgbe_dcb_config *dcb_config)
3316 {
3317 int ret = 0;
3318 uint8_t i, pfc_en, nb_tcs;
3319 uint16_t pbsize, rx_buffer_size;
3320 uint8_t config_dcb_rx = 0;
3321 uint8_t config_dcb_tx = 0;
3322 uint8_t tsa[TXGBE_DCB_TC_MAX] = {0};
3323 uint8_t bwgid[TXGBE_DCB_TC_MAX] = {0};
3324 uint16_t refill[TXGBE_DCB_TC_MAX] = {0};
3325 uint16_t max[TXGBE_DCB_TC_MAX] = {0};
3326 uint8_t map[TXGBE_DCB_TC_MAX] = {0};
3327 struct txgbe_dcb_tc_config *tc;
3328 uint32_t max_frame = dev->data->mtu +
3329 RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN;
3330 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
3331 struct txgbe_bw_conf *bw_conf = TXGBE_DEV_BW_CONF(dev);
3332
3333 switch (dev->data->dev_conf.rxmode.mq_mode) {
3334 case ETH_MQ_RX_VMDQ_DCB:
3335 dcb_config->vt_mode = true;
3336 config_dcb_rx = DCB_RX_CONFIG;
3337 /*
3338 * get dcb and VT rx configuration parameters
3339 * from rte_eth_conf
3340 */
3341 txgbe_vmdq_dcb_rx_config(dev, dcb_config);
3342 /*Configure general VMDQ and DCB RX parameters*/
3343 txgbe_vmdq_dcb_configure(dev);
3344 break;
3345 case ETH_MQ_RX_DCB:
3346 case ETH_MQ_RX_DCB_RSS:
3347 dcb_config->vt_mode = false;
3348 config_dcb_rx = DCB_RX_CONFIG;
3349 /* Get dcb TX configuration parameters from rte_eth_conf */
3350 txgbe_dcb_rx_config(dev, dcb_config);
3351 /*Configure general DCB RX parameters*/
3352 txgbe_dcb_rx_hw_config(dev, dcb_config);
3353 break;
3354 default:
3355 PMD_INIT_LOG(ERR, "Incorrect DCB RX mode configuration");
3356 break;
3357 }
3358 switch (dev->data->dev_conf.txmode.mq_mode) {
3359 case ETH_MQ_TX_VMDQ_DCB:
3360 dcb_config->vt_mode = true;
3361 config_dcb_tx = DCB_TX_CONFIG;
3362 /* get DCB and VT TX configuration parameters
3363 * from rte_eth_conf
3364 */
3365 txgbe_dcb_vt_tx_config(dev, dcb_config);
3366 /* Configure general VMDQ and DCB TX parameters */
3367 txgbe_vmdq_dcb_hw_tx_config(dev, dcb_config);
3368 break;
3369
3370 case ETH_MQ_TX_DCB:
3371 dcb_config->vt_mode = false;
3372 config_dcb_tx = DCB_TX_CONFIG;
3373 /* get DCB TX configuration parameters from rte_eth_conf */
3374 txgbe_dcb_tx_config(dev, dcb_config);
3375 /* Configure general DCB TX parameters */
3376 txgbe_dcb_tx_hw_config(dev, dcb_config);
3377 break;
3378 default:
3379 PMD_INIT_LOG(ERR, "Incorrect DCB TX mode configuration");
3380 break;
3381 }
3382
3383 nb_tcs = dcb_config->num_tcs.pfc_tcs;
3384 /* Unpack map */
3385 txgbe_dcb_unpack_map_cee(dcb_config, TXGBE_DCB_RX_CONFIG, map);
3386 if (nb_tcs == ETH_4_TCS) {
3387 /* Avoid un-configured priority mapping to TC0 */
3388 uint8_t j = 4;
3389 uint8_t mask = 0xFF;
3390
3391 for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES - 4; i++)
3392 mask = (uint8_t)(mask & (~(1 << map[i])));
3393 for (i = 0; mask && (i < TXGBE_DCB_TC_MAX); i++) {
3394 if ((mask & 0x1) && j < ETH_DCB_NUM_USER_PRIORITIES)
3395 map[j++] = i;
3396 mask >>= 1;
3397 }
3398 /* Re-configure 4 TCs BW */
3399 for (i = 0; i < nb_tcs; i++) {
3400 tc = &dcb_config->tc_config[i];
3401 if (bw_conf->tc_num != nb_tcs)
3402 tc->path[TXGBE_DCB_TX_CONFIG].bwg_percent =
3403 (uint8_t)(100 / nb_tcs);
3404 tc->path[TXGBE_DCB_RX_CONFIG].bwg_percent =
3405 (uint8_t)(100 / nb_tcs);
3406 }
3407 for (; i < TXGBE_DCB_TC_MAX; i++) {
3408 tc = &dcb_config->tc_config[i];
3409 tc->path[TXGBE_DCB_TX_CONFIG].bwg_percent = 0;
3410 tc->path[TXGBE_DCB_RX_CONFIG].bwg_percent = 0;
3411 }
3412 } else {
3413 /* Re-configure 8 TCs BW */
3414 for (i = 0; i < nb_tcs; i++) {
3415 tc = &dcb_config->tc_config[i];
3416 if (bw_conf->tc_num != nb_tcs)
3417 tc->path[TXGBE_DCB_TX_CONFIG].bwg_percent =
3418 (uint8_t)(100 / nb_tcs + (i & 1));
3419 tc->path[TXGBE_DCB_RX_CONFIG].bwg_percent =
3420 (uint8_t)(100 / nb_tcs + (i & 1));
3421 }
3422 }
3423
3424 rx_buffer_size = NIC_RX_BUFFER_SIZE;
3425
3426 if (config_dcb_rx) {
3427 /* Set RX buffer size */
3428 pbsize = (uint16_t)(rx_buffer_size / nb_tcs);
3429 uint32_t rxpbsize = pbsize << 10;
3430
3431 for (i = 0; i < nb_tcs; i++)
3432 wr32(hw, TXGBE_PBRXSIZE(i), rxpbsize);
3433
3434 /* zero alloc all unused TCs */
3435 for (; i < ETH_DCB_NUM_USER_PRIORITIES; i++)
3436 wr32(hw, TXGBE_PBRXSIZE(i), 0);
3437 }
3438 if (config_dcb_tx) {
3439 /* Only support an equally distributed
3440 * Tx packet buffer strategy.
3441 */
3442 uint32_t txpktsize = TXGBE_PBTXSIZE_MAX / nb_tcs;
3443 uint32_t txpbthresh = (txpktsize / DCB_TX_PB) -
3444 TXGBE_TXPKT_SIZE_MAX;
3445
3446 for (i = 0; i < nb_tcs; i++) {
3447 wr32(hw, TXGBE_PBTXSIZE(i), txpktsize);
3448 wr32(hw, TXGBE_PBTXDMATH(i), txpbthresh);
3449 }
3450 /* Clear unused TCs, if any, to zero buffer size*/
3451 for (; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
3452 wr32(hw, TXGBE_PBTXSIZE(i), 0);
3453 wr32(hw, TXGBE_PBTXDMATH(i), 0);
3454 }
3455 }
3456
3457 /*Calculates traffic class credits*/
3458 txgbe_dcb_calculate_tc_credits_cee(hw, dcb_config, max_frame,
3459 TXGBE_DCB_TX_CONFIG);
3460 txgbe_dcb_calculate_tc_credits_cee(hw, dcb_config, max_frame,
3461 TXGBE_DCB_RX_CONFIG);
3462
3463 if (config_dcb_rx) {
3464 /* Unpack CEE standard containers */
3465 txgbe_dcb_unpack_refill_cee(dcb_config,
3466 TXGBE_DCB_RX_CONFIG, refill);
3467 txgbe_dcb_unpack_max_cee(dcb_config, max);
3468 txgbe_dcb_unpack_bwgid_cee(dcb_config,
3469 TXGBE_DCB_RX_CONFIG, bwgid);
3470 txgbe_dcb_unpack_tsa_cee(dcb_config,
3471 TXGBE_DCB_RX_CONFIG, tsa);
3472 /* Configure PG(ETS) RX */
3473 txgbe_dcb_hw_arbite_rx_config(hw, refill, max, bwgid, tsa, map);
3474 }
3475
3476 if (config_dcb_tx) {
3477 /* Unpack CEE standard containers */
3478 txgbe_dcb_unpack_refill_cee(dcb_config,
3479 TXGBE_DCB_TX_CONFIG, refill);
3480 txgbe_dcb_unpack_max_cee(dcb_config, max);
3481 txgbe_dcb_unpack_bwgid_cee(dcb_config,
3482 TXGBE_DCB_TX_CONFIG, bwgid);
3483 txgbe_dcb_unpack_tsa_cee(dcb_config,
3484 TXGBE_DCB_TX_CONFIG, tsa);
3485 /* Configure PG(ETS) TX */
3486 txgbe_dcb_hw_arbite_tx_config(hw, refill, max, bwgid, tsa, map);
3487 }
3488
3489 /* Configure queue statistics registers */
3490 txgbe_dcb_config_tc_stats_raptor(hw, dcb_config);
3491
3492 /* Check if the PFC is supported */
3493 if (dev->data->dev_conf.dcb_capability_en & ETH_DCB_PFC_SUPPORT) {
3494 pbsize = (uint16_t)(rx_buffer_size / nb_tcs);
3495 for (i = 0; i < nb_tcs; i++) {
3496 /* If the TC count is 8,
3497 * and the default high_water is 48,
3498 * the low_water is 16 as default.
3499 */
3500 hw->fc.high_water[i] = (pbsize * 3) / 4;
3501 hw->fc.low_water[i] = pbsize / 4;
3502 /* Enable pfc for this TC */
3503 tc = &dcb_config->tc_config[i];
3504 tc->pfc = txgbe_dcb_pfc_enabled;
3505 }
3506 txgbe_dcb_unpack_pfc_cee(dcb_config, map, &pfc_en);
3507 if (dcb_config->num_tcs.pfc_tcs == ETH_4_TCS)
3508 pfc_en &= 0x0F;
3509 ret = txgbe_dcb_config_pfc(hw, pfc_en, map);
3510 }
3511
3512 return ret;
3513 }
3514
txgbe_configure_pb(struct rte_eth_dev * dev)3515 void txgbe_configure_pb(struct rte_eth_dev *dev)
3516 {
3517 struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
3518 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
3519
3520 int hdrm;
3521 int tc = dev_conf->rx_adv_conf.dcb_rx_conf.nb_tcs;
3522
3523 /* Reserve 256KB(/512KB) rx buffer for fdir */
3524 hdrm = 256; /*KB*/
3525
3526 hw->mac.setup_pba(hw, tc, hdrm, PBA_STRATEGY_EQUAL);
3527 }
3528
txgbe_configure_port(struct rte_eth_dev * dev)3529 void txgbe_configure_port(struct rte_eth_dev *dev)
3530 {
3531 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
3532 int i = 0;
3533 uint16_t tpids[8] = {RTE_ETHER_TYPE_VLAN, RTE_ETHER_TYPE_QINQ,
3534 0x9100, 0x9200,
3535 0x0000, 0x0000,
3536 0x0000, 0x0000};
3537
3538 PMD_INIT_FUNC_TRACE();
3539
3540 /* default outer vlan tpid */
3541 wr32(hw, TXGBE_EXTAG,
3542 TXGBE_EXTAG_ETAG(RTE_ETHER_TYPE_ETAG) |
3543 TXGBE_EXTAG_VLAN(RTE_ETHER_TYPE_QINQ));
3544
3545 /* default inner vlan tpid */
3546 wr32m(hw, TXGBE_VLANCTL,
3547 TXGBE_VLANCTL_TPID_MASK,
3548 TXGBE_VLANCTL_TPID(RTE_ETHER_TYPE_VLAN));
3549 wr32m(hw, TXGBE_DMATXCTRL,
3550 TXGBE_DMATXCTRL_TPID_MASK,
3551 TXGBE_DMATXCTRL_TPID(RTE_ETHER_TYPE_VLAN));
3552
3553 /* default vlan tpid filters */
3554 for (i = 0; i < 8; i++) {
3555 wr32m(hw, TXGBE_TAGTPID(i / 2),
3556 (i % 2 ? TXGBE_TAGTPID_MSB_MASK
3557 : TXGBE_TAGTPID_LSB_MASK),
3558 (i % 2 ? TXGBE_TAGTPID_MSB(tpids[i])
3559 : TXGBE_TAGTPID_LSB(tpids[i])));
3560 }
3561
3562 /* default vxlan port */
3563 wr32(hw, TXGBE_VXLANPORT, 4789);
3564 }
3565
3566 /**
3567 * txgbe_configure_dcb - Configure DCB Hardware
3568 * @dev: pointer to rte_eth_dev
3569 */
txgbe_configure_dcb(struct rte_eth_dev * dev)3570 void txgbe_configure_dcb(struct rte_eth_dev *dev)
3571 {
3572 struct txgbe_dcb_config *dcb_cfg = TXGBE_DEV_DCB_CONFIG(dev);
3573 struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
3574
3575 PMD_INIT_FUNC_TRACE();
3576
3577 /* check support mq_mode for DCB */
3578 if (dev_conf->rxmode.mq_mode != ETH_MQ_RX_VMDQ_DCB &&
3579 dev_conf->rxmode.mq_mode != ETH_MQ_RX_DCB &&
3580 dev_conf->rxmode.mq_mode != ETH_MQ_RX_DCB_RSS)
3581 return;
3582
3583 if (dev->data->nb_rx_queues > ETH_DCB_NUM_QUEUES)
3584 return;
3585
3586 /** Configure DCB hardware **/
3587 txgbe_dcb_hw_configure(dev, dcb_cfg);
3588 }
3589
3590 /*
3591 * VMDq only support for 10 GbE NIC.
3592 */
3593 static void
txgbe_vmdq_rx_hw_configure(struct rte_eth_dev * dev)3594 txgbe_vmdq_rx_hw_configure(struct rte_eth_dev *dev)
3595 {
3596 struct rte_eth_vmdq_rx_conf *cfg;
3597 struct txgbe_hw *hw;
3598 enum rte_eth_nb_pools num_pools;
3599 uint32_t mrqc, vt_ctl, vlanctrl;
3600 uint32_t vmolr = 0;
3601 int i;
3602
3603 PMD_INIT_FUNC_TRACE();
3604 hw = TXGBE_DEV_HW(dev);
3605 cfg = &dev->data->dev_conf.rx_adv_conf.vmdq_rx_conf;
3606 num_pools = cfg->nb_queue_pools;
3607
3608 txgbe_rss_disable(dev);
3609
3610 /* enable vmdq */
3611 mrqc = TXGBE_PORTCTL_NUMVT_64;
3612 wr32m(hw, TXGBE_PORTCTL, TXGBE_PORTCTL_NUMVT_MASK, mrqc);
3613
3614 /* turn on virtualisation and set the default pool */
3615 vt_ctl = TXGBE_POOLCTL_RPLEN;
3616 if (cfg->enable_default_pool)
3617 vt_ctl |= TXGBE_POOLCTL_DEFPL(cfg->default_pool);
3618 else
3619 vt_ctl |= TXGBE_POOLCTL_DEFDSA;
3620
3621 wr32(hw, TXGBE_POOLCTL, vt_ctl);
3622
3623 for (i = 0; i < (int)num_pools; i++) {
3624 vmolr = txgbe_convert_vm_rx_mask_to_val(cfg->rx_mode, vmolr);
3625 wr32(hw, TXGBE_POOLETHCTL(i), vmolr);
3626 }
3627
3628 /* enable vlan filtering and allow all vlan tags through */
3629 vlanctrl = rd32(hw, TXGBE_VLANCTL);
3630 vlanctrl |= TXGBE_VLANCTL_VFE; /* enable vlan filters */
3631 wr32(hw, TXGBE_VLANCTL, vlanctrl);
3632
3633 /* enable all vlan filters */
3634 for (i = 0; i < NUM_VFTA_REGISTERS; i++)
3635 wr32(hw, TXGBE_VLANTBL(i), UINT32_MAX);
3636
3637 /* pool enabling for receive - 64 */
3638 wr32(hw, TXGBE_POOLRXENA(0), UINT32_MAX);
3639 if (num_pools == ETH_64_POOLS)
3640 wr32(hw, TXGBE_POOLRXENA(1), UINT32_MAX);
3641
3642 /*
3643 * allow pools to read specific mac addresses
3644 * In this case, all pools should be able to read from mac addr 0
3645 */
3646 wr32(hw, TXGBE_ETHADDRIDX, 0);
3647 wr32(hw, TXGBE_ETHADDRASSL, 0xFFFFFFFF);
3648 wr32(hw, TXGBE_ETHADDRASSH, 0xFFFFFFFF);
3649
3650 /* set up filters for vlan tags as configured */
3651 for (i = 0; i < cfg->nb_pool_maps; i++) {
3652 /* set vlan id in VF register and set the valid bit */
3653 wr32(hw, TXGBE_PSRVLANIDX, i);
3654 wr32(hw, TXGBE_PSRVLAN, (TXGBE_PSRVLAN_EA |
3655 TXGBE_PSRVLAN_VID(cfg->pool_map[i].vlan_id)));
3656 /*
3657 * Put the allowed pools in VFB reg. As we only have 16 or 64
3658 * pools, we only need to use the first half of the register
3659 * i.e. bits 0-31
3660 */
3661 if (((cfg->pool_map[i].pools >> 32) & UINT32_MAX) == 0)
3662 wr32(hw, TXGBE_PSRVLANPLM(0),
3663 (cfg->pool_map[i].pools & UINT32_MAX));
3664 else
3665 wr32(hw, TXGBE_PSRVLANPLM(1),
3666 ((cfg->pool_map[i].pools >> 32) & UINT32_MAX));
3667 }
3668
3669 /* Tx General Switch Control Enables VMDQ loopback */
3670 if (cfg->enable_loop_back) {
3671 wr32(hw, TXGBE_PSRCTL, TXGBE_PSRCTL_LBENA);
3672 for (i = 0; i < 64; i++)
3673 wr32m(hw, TXGBE_POOLETHCTL(i),
3674 TXGBE_POOLETHCTL_LLB, TXGBE_POOLETHCTL_LLB);
3675 }
3676
3677 txgbe_flush(hw);
3678 }
3679
3680 /*
3681 * txgbe_vmdq_tx_hw_configure - Configure general VMDq TX parameters
3682 * @hw: pointer to hardware structure
3683 */
3684 static void
txgbe_vmdq_tx_hw_configure(struct txgbe_hw * hw)3685 txgbe_vmdq_tx_hw_configure(struct txgbe_hw *hw)
3686 {
3687 uint32_t reg;
3688 uint32_t q;
3689
3690 PMD_INIT_FUNC_TRACE();
3691 /*PF VF Transmit Enable*/
3692 wr32(hw, TXGBE_POOLTXENA(0), UINT32_MAX);
3693 wr32(hw, TXGBE_POOLTXENA(1), UINT32_MAX);
3694
3695 /* Disable the Tx desc arbiter */
3696 reg = rd32(hw, TXGBE_ARBTXCTL);
3697 reg |= TXGBE_ARBTXCTL_DIA;
3698 wr32(hw, TXGBE_ARBTXCTL, reg);
3699
3700 wr32m(hw, TXGBE_PORTCTL, TXGBE_PORTCTL_NUMVT_MASK,
3701 TXGBE_PORTCTL_NUMVT_64);
3702
3703 /* Disable drop for all queues */
3704 for (q = 0; q < 128; q++) {
3705 u32 val = 1 << (q % 32);
3706 wr32m(hw, TXGBE_QPRXDROP(q / 32), val, val);
3707 }
3708
3709 /* Enable the Tx desc arbiter */
3710 reg = rd32(hw, TXGBE_ARBTXCTL);
3711 reg &= ~TXGBE_ARBTXCTL_DIA;
3712 wr32(hw, TXGBE_ARBTXCTL, reg);
3713
3714 txgbe_flush(hw);
3715 }
3716
3717 static int __rte_cold
txgbe_alloc_rx_queue_mbufs(struct txgbe_rx_queue * rxq)3718 txgbe_alloc_rx_queue_mbufs(struct txgbe_rx_queue *rxq)
3719 {
3720 struct txgbe_rx_entry *rxe = rxq->sw_ring;
3721 uint64_t dma_addr;
3722 unsigned int i;
3723
3724 /* Initialize software ring entries */
3725 for (i = 0; i < rxq->nb_rx_desc; i++) {
3726 volatile struct txgbe_rx_desc *rxd;
3727 struct rte_mbuf *mbuf = rte_mbuf_raw_alloc(rxq->mb_pool);
3728
3729 if (mbuf == NULL) {
3730 PMD_INIT_LOG(ERR, "RX mbuf alloc failed queue_id=%u",
3731 (unsigned int)rxq->queue_id);
3732 return -ENOMEM;
3733 }
3734
3735 mbuf->data_off = RTE_PKTMBUF_HEADROOM;
3736 mbuf->port = rxq->port_id;
3737
3738 dma_addr =
3739 rte_cpu_to_le_64(rte_mbuf_data_iova_default(mbuf));
3740 rxd = &rxq->rx_ring[i];
3741 TXGBE_RXD_HDRADDR(rxd, 0);
3742 TXGBE_RXD_PKTADDR(rxd, dma_addr);
3743 rxe[i].mbuf = mbuf;
3744 }
3745
3746 return 0;
3747 }
3748
3749 static int
txgbe_config_vf_rss(struct rte_eth_dev * dev)3750 txgbe_config_vf_rss(struct rte_eth_dev *dev)
3751 {
3752 struct txgbe_hw *hw;
3753 uint32_t mrqc;
3754
3755 txgbe_rss_configure(dev);
3756
3757 hw = TXGBE_DEV_HW(dev);
3758
3759 /* enable VF RSS */
3760 mrqc = rd32(hw, TXGBE_PORTCTL);
3761 mrqc &= ~(TXGBE_PORTCTL_NUMTC_MASK | TXGBE_PORTCTL_NUMVT_MASK);
3762 switch (RTE_ETH_DEV_SRIOV(dev).active) {
3763 case ETH_64_POOLS:
3764 mrqc |= TXGBE_PORTCTL_NUMVT_64;
3765 break;
3766
3767 case ETH_32_POOLS:
3768 mrqc |= TXGBE_PORTCTL_NUMVT_32;
3769 break;
3770
3771 default:
3772 PMD_INIT_LOG(ERR, "Invalid pool number in IOV mode with VMDQ RSS");
3773 return -EINVAL;
3774 }
3775
3776 wr32(hw, TXGBE_PORTCTL, mrqc);
3777
3778 return 0;
3779 }
3780
3781 static int
txgbe_config_vf_default(struct rte_eth_dev * dev)3782 txgbe_config_vf_default(struct rte_eth_dev *dev)
3783 {
3784 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
3785 uint32_t mrqc;
3786
3787 mrqc = rd32(hw, TXGBE_PORTCTL);
3788 mrqc &= ~(TXGBE_PORTCTL_NUMTC_MASK | TXGBE_PORTCTL_NUMVT_MASK);
3789 switch (RTE_ETH_DEV_SRIOV(dev).active) {
3790 case ETH_64_POOLS:
3791 mrqc |= TXGBE_PORTCTL_NUMVT_64;
3792 break;
3793
3794 case ETH_32_POOLS:
3795 mrqc |= TXGBE_PORTCTL_NUMVT_32;
3796 break;
3797
3798 case ETH_16_POOLS:
3799 mrqc |= TXGBE_PORTCTL_NUMVT_16;
3800 break;
3801 default:
3802 PMD_INIT_LOG(ERR,
3803 "invalid pool number in IOV mode");
3804 return 0;
3805 }
3806
3807 wr32(hw, TXGBE_PORTCTL, mrqc);
3808
3809 return 0;
3810 }
3811
3812 static int
txgbe_dev_mq_rx_configure(struct rte_eth_dev * dev)3813 txgbe_dev_mq_rx_configure(struct rte_eth_dev *dev)
3814 {
3815 if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
3816 /*
3817 * SRIOV inactive scheme
3818 * any DCB/RSS w/o VMDq multi-queue setting
3819 */
3820 switch (dev->data->dev_conf.rxmode.mq_mode) {
3821 case ETH_MQ_RX_RSS:
3822 case ETH_MQ_RX_DCB_RSS:
3823 case ETH_MQ_RX_VMDQ_RSS:
3824 txgbe_rss_configure(dev);
3825 break;
3826
3827 case ETH_MQ_RX_VMDQ_DCB:
3828 txgbe_vmdq_dcb_configure(dev);
3829 break;
3830
3831 case ETH_MQ_RX_VMDQ_ONLY:
3832 txgbe_vmdq_rx_hw_configure(dev);
3833 break;
3834
3835 case ETH_MQ_RX_NONE:
3836 default:
3837 /* if mq_mode is none, disable rss mode.*/
3838 txgbe_rss_disable(dev);
3839 break;
3840 }
3841 } else {
3842 /* SRIOV active scheme
3843 * Support RSS together with SRIOV.
3844 */
3845 switch (dev->data->dev_conf.rxmode.mq_mode) {
3846 case ETH_MQ_RX_RSS:
3847 case ETH_MQ_RX_VMDQ_RSS:
3848 txgbe_config_vf_rss(dev);
3849 break;
3850 case ETH_MQ_RX_VMDQ_DCB:
3851 case ETH_MQ_RX_DCB:
3852 /* In SRIOV, the configuration is the same as VMDq case */
3853 txgbe_vmdq_dcb_configure(dev);
3854 break;
3855 /* DCB/RSS together with SRIOV is not supported */
3856 case ETH_MQ_RX_VMDQ_DCB_RSS:
3857 case ETH_MQ_RX_DCB_RSS:
3858 PMD_INIT_LOG(ERR,
3859 "Could not support DCB/RSS with VMDq & SRIOV");
3860 return -1;
3861 default:
3862 txgbe_config_vf_default(dev);
3863 break;
3864 }
3865 }
3866
3867 return 0;
3868 }
3869
3870 static int
txgbe_dev_mq_tx_configure(struct rte_eth_dev * dev)3871 txgbe_dev_mq_tx_configure(struct rte_eth_dev *dev)
3872 {
3873 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
3874 uint32_t mtqc;
3875 uint32_t rttdcs;
3876
3877 /* disable arbiter */
3878 rttdcs = rd32(hw, TXGBE_ARBTXCTL);
3879 rttdcs |= TXGBE_ARBTXCTL_DIA;
3880 wr32(hw, TXGBE_ARBTXCTL, rttdcs);
3881
3882 if (RTE_ETH_DEV_SRIOV(dev).active == 0) {
3883 /*
3884 * SRIOV inactive scheme
3885 * any DCB w/o VMDq multi-queue setting
3886 */
3887 if (dev->data->dev_conf.txmode.mq_mode == ETH_MQ_TX_VMDQ_ONLY)
3888 txgbe_vmdq_tx_hw_configure(hw);
3889 else
3890 wr32m(hw, TXGBE_PORTCTL, TXGBE_PORTCTL_NUMVT_MASK, 0);
3891 } else {
3892 switch (RTE_ETH_DEV_SRIOV(dev).active) {
3893 /*
3894 * SRIOV active scheme
3895 * FIXME if support DCB together with VMDq & SRIOV
3896 */
3897 case ETH_64_POOLS:
3898 mtqc = TXGBE_PORTCTL_NUMVT_64;
3899 break;
3900 case ETH_32_POOLS:
3901 mtqc = TXGBE_PORTCTL_NUMVT_32;
3902 break;
3903 case ETH_16_POOLS:
3904 mtqc = TXGBE_PORTCTL_NUMVT_16;
3905 break;
3906 default:
3907 mtqc = 0;
3908 PMD_INIT_LOG(ERR, "invalid pool number in IOV mode");
3909 }
3910 wr32m(hw, TXGBE_PORTCTL, TXGBE_PORTCTL_NUMVT_MASK, mtqc);
3911 }
3912
3913 /* re-enable arbiter */
3914 rttdcs &= ~TXGBE_ARBTXCTL_DIA;
3915 wr32(hw, TXGBE_ARBTXCTL, rttdcs);
3916
3917 return 0;
3918 }
3919
3920 /**
3921 * txgbe_get_rscctl_maxdesc
3922 *
3923 * @pool Memory pool of the Rx queue
3924 */
3925 static inline uint32_t
txgbe_get_rscctl_maxdesc(struct rte_mempool * pool)3926 txgbe_get_rscctl_maxdesc(struct rte_mempool *pool)
3927 {
3928 struct rte_pktmbuf_pool_private *mp_priv = rte_mempool_get_priv(pool);
3929
3930 uint16_t maxdesc =
3931 RTE_IPV4_MAX_PKT_LEN /
3932 (mp_priv->mbuf_data_room_size - RTE_PKTMBUF_HEADROOM);
3933
3934 if (maxdesc >= 16)
3935 return TXGBE_RXCFG_RSCMAX_16;
3936 else if (maxdesc >= 8)
3937 return TXGBE_RXCFG_RSCMAX_8;
3938 else if (maxdesc >= 4)
3939 return TXGBE_RXCFG_RSCMAX_4;
3940 else
3941 return TXGBE_RXCFG_RSCMAX_1;
3942 }
3943
3944 /**
3945 * txgbe_set_rsc - configure RSC related port HW registers
3946 *
3947 * Configures the port's RSC related registers.
3948 *
3949 * @dev port handle
3950 *
3951 * Returns 0 in case of success or a non-zero error code
3952 */
3953 static int
txgbe_set_rsc(struct rte_eth_dev * dev)3954 txgbe_set_rsc(struct rte_eth_dev *dev)
3955 {
3956 struct rte_eth_rxmode *rx_conf = &dev->data->dev_conf.rxmode;
3957 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
3958 struct rte_eth_dev_info dev_info = { 0 };
3959 bool rsc_capable = false;
3960 uint16_t i;
3961 uint32_t rdrxctl;
3962 uint32_t rfctl;
3963
3964 /* Sanity check */
3965 dev->dev_ops->dev_infos_get(dev, &dev_info);
3966 if (dev_info.rx_offload_capa & DEV_RX_OFFLOAD_TCP_LRO)
3967 rsc_capable = true;
3968
3969 if (!rsc_capable && (rx_conf->offloads & DEV_RX_OFFLOAD_TCP_LRO)) {
3970 PMD_INIT_LOG(CRIT, "LRO is requested on HW that doesn't "
3971 "support it");
3972 return -EINVAL;
3973 }
3974
3975 /* RSC global configuration */
3976
3977 if ((rx_conf->offloads & DEV_RX_OFFLOAD_KEEP_CRC) &&
3978 (rx_conf->offloads & DEV_RX_OFFLOAD_TCP_LRO)) {
3979 PMD_INIT_LOG(CRIT, "LRO can't be enabled when HW CRC "
3980 "is disabled");
3981 return -EINVAL;
3982 }
3983
3984 rfctl = rd32(hw, TXGBE_PSRCTL);
3985 if (rsc_capable && (rx_conf->offloads & DEV_RX_OFFLOAD_TCP_LRO))
3986 rfctl &= ~TXGBE_PSRCTL_RSCDIA;
3987 else
3988 rfctl |= TXGBE_PSRCTL_RSCDIA;
3989 wr32(hw, TXGBE_PSRCTL, rfctl);
3990
3991 /* If LRO hasn't been requested - we are done here. */
3992 if (!(rx_conf->offloads & DEV_RX_OFFLOAD_TCP_LRO))
3993 return 0;
3994
3995 /* Set PSRCTL.RSCACK bit */
3996 rdrxctl = rd32(hw, TXGBE_PSRCTL);
3997 rdrxctl |= TXGBE_PSRCTL_RSCACK;
3998 wr32(hw, TXGBE_PSRCTL, rdrxctl);
3999
4000 /* Per-queue RSC configuration */
4001 for (i = 0; i < dev->data->nb_rx_queues; i++) {
4002 struct txgbe_rx_queue *rxq = dev->data->rx_queues[i];
4003 uint32_t srrctl =
4004 rd32(hw, TXGBE_RXCFG(rxq->reg_idx));
4005 uint32_t psrtype =
4006 rd32(hw, TXGBE_POOLRSS(rxq->reg_idx));
4007 uint32_t eitr =
4008 rd32(hw, TXGBE_ITR(rxq->reg_idx));
4009
4010 /*
4011 * txgbe PMD doesn't support header-split at the moment.
4012 */
4013 srrctl &= ~TXGBE_RXCFG_HDRLEN_MASK;
4014 srrctl |= TXGBE_RXCFG_HDRLEN(128);
4015
4016 /*
4017 * TODO: Consider setting the Receive Descriptor Minimum
4018 * Threshold Size for an RSC case. This is not an obviously
4019 * beneficiary option but the one worth considering...
4020 */
4021
4022 srrctl |= TXGBE_RXCFG_RSCENA;
4023 srrctl &= ~TXGBE_RXCFG_RSCMAX_MASK;
4024 srrctl |= txgbe_get_rscctl_maxdesc(rxq->mb_pool);
4025 psrtype |= TXGBE_POOLRSS_L4HDR;
4026
4027 /*
4028 * RSC: Set ITR interval corresponding to 2K ints/s.
4029 *
4030 * Full-sized RSC aggregations for a 10Gb/s link will
4031 * arrive at about 20K aggregation/s rate.
4032 *
4033 * 2K inst/s rate will make only 10% of the
4034 * aggregations to be closed due to the interrupt timer
4035 * expiration for a streaming at wire-speed case.
4036 *
4037 * For a sparse streaming case this setting will yield
4038 * at most 500us latency for a single RSC aggregation.
4039 */
4040 eitr &= ~TXGBE_ITR_IVAL_MASK;
4041 eitr |= TXGBE_ITR_IVAL_10G(TXGBE_QUEUE_ITR_INTERVAL_DEFAULT);
4042 eitr |= TXGBE_ITR_WRDSA;
4043
4044 wr32(hw, TXGBE_RXCFG(rxq->reg_idx), srrctl);
4045 wr32(hw, TXGBE_POOLRSS(rxq->reg_idx), psrtype);
4046 wr32(hw, TXGBE_ITR(rxq->reg_idx), eitr);
4047
4048 /*
4049 * RSC requires the mapping of the queue to the
4050 * interrupt vector.
4051 */
4052 txgbe_set_ivar_map(hw, 0, rxq->reg_idx, i);
4053 }
4054
4055 dev->data->lro = 1;
4056
4057 PMD_INIT_LOG(DEBUG, "enabling LRO mode");
4058
4059 return 0;
4060 }
4061
4062 void __rte_cold
txgbe_set_rx_function(struct rte_eth_dev * dev)4063 txgbe_set_rx_function(struct rte_eth_dev *dev)
4064 {
4065 struct txgbe_adapter *adapter = TXGBE_DEV_ADAPTER(dev);
4066
4067 /*
4068 * Initialize the appropriate LRO callback.
4069 *
4070 * If all queues satisfy the bulk allocation preconditions
4071 * (adapter->rx_bulk_alloc_allowed is TRUE) then we may use
4072 * bulk allocation. Otherwise use a single allocation version.
4073 */
4074 if (dev->data->lro) {
4075 if (adapter->rx_bulk_alloc_allowed) {
4076 PMD_INIT_LOG(DEBUG, "LRO is requested. Using a bulk "
4077 "allocation version");
4078 dev->rx_pkt_burst = txgbe_recv_pkts_lro_bulk_alloc;
4079 } else {
4080 PMD_INIT_LOG(DEBUG, "LRO is requested. Using a single "
4081 "allocation version");
4082 dev->rx_pkt_burst = txgbe_recv_pkts_lro_single_alloc;
4083 }
4084 } else if (dev->data->scattered_rx) {
4085 /*
4086 * Set the non-LRO scattered callback: there are bulk and
4087 * single allocation versions.
4088 */
4089 if (adapter->rx_bulk_alloc_allowed) {
4090 PMD_INIT_LOG(DEBUG, "Using a Scattered with bulk "
4091 "allocation callback (port=%d).",
4092 dev->data->port_id);
4093 dev->rx_pkt_burst = txgbe_recv_pkts_lro_bulk_alloc;
4094 } else {
4095 PMD_INIT_LOG(DEBUG, "Using Regular (non-vector, "
4096 "single allocation) "
4097 "Scattered Rx callback "
4098 "(port=%d).",
4099 dev->data->port_id);
4100
4101 dev->rx_pkt_burst = txgbe_recv_pkts_lro_single_alloc;
4102 }
4103 /*
4104 * Below we set "simple" callbacks according to port/queues parameters.
4105 * If parameters allow we are going to choose between the following
4106 * callbacks:
4107 * - Bulk Allocation
4108 * - Single buffer allocation (the simplest one)
4109 */
4110 } else if (adapter->rx_bulk_alloc_allowed) {
4111 PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions are "
4112 "satisfied. Rx Burst Bulk Alloc function "
4113 "will be used on port=%d.",
4114 dev->data->port_id);
4115
4116 dev->rx_pkt_burst = txgbe_recv_pkts_bulk_alloc;
4117 } else {
4118 PMD_INIT_LOG(DEBUG, "Rx Burst Bulk Alloc Preconditions are not "
4119 "satisfied, or Scattered Rx is requested "
4120 "(port=%d).",
4121 dev->data->port_id);
4122
4123 dev->rx_pkt_burst = txgbe_recv_pkts;
4124 }
4125 }
4126
4127 /*
4128 * Initializes Receive Unit.
4129 */
4130 int __rte_cold
txgbe_dev_rx_init(struct rte_eth_dev * dev)4131 txgbe_dev_rx_init(struct rte_eth_dev *dev)
4132 {
4133 struct txgbe_hw *hw;
4134 struct txgbe_rx_queue *rxq;
4135 uint64_t bus_addr;
4136 uint32_t fctrl;
4137 uint32_t hlreg0;
4138 uint32_t srrctl;
4139 uint32_t rdrxctl;
4140 uint32_t rxcsum;
4141 uint16_t buf_size;
4142 uint16_t i;
4143 struct rte_eth_rxmode *rx_conf = &dev->data->dev_conf.rxmode;
4144 int rc;
4145
4146 PMD_INIT_FUNC_TRACE();
4147 hw = TXGBE_DEV_HW(dev);
4148
4149 /*
4150 * Make sure receives are disabled while setting
4151 * up the RX context (registers, descriptor rings, etc.).
4152 */
4153 wr32m(hw, TXGBE_MACRXCFG, TXGBE_MACRXCFG_ENA, 0);
4154 wr32m(hw, TXGBE_PBRXCTL, TXGBE_PBRXCTL_ENA, 0);
4155
4156 /* Enable receipt of broadcasted frames */
4157 fctrl = rd32(hw, TXGBE_PSRCTL);
4158 fctrl |= TXGBE_PSRCTL_BCA;
4159 wr32(hw, TXGBE_PSRCTL, fctrl);
4160
4161 /*
4162 * Configure CRC stripping, if any.
4163 */
4164 hlreg0 = rd32(hw, TXGBE_SECRXCTL);
4165 if (rx_conf->offloads & DEV_RX_OFFLOAD_KEEP_CRC)
4166 hlreg0 &= ~TXGBE_SECRXCTL_CRCSTRIP;
4167 else
4168 hlreg0 |= TXGBE_SECRXCTL_CRCSTRIP;
4169 wr32(hw, TXGBE_SECRXCTL, hlreg0);
4170
4171 /*
4172 * Configure jumbo frame support, if any.
4173 */
4174 if (rx_conf->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
4175 wr32m(hw, TXGBE_FRMSZ, TXGBE_FRMSZ_MAX_MASK,
4176 TXGBE_FRMSZ_MAX(rx_conf->max_rx_pkt_len));
4177 } else {
4178 wr32m(hw, TXGBE_FRMSZ, TXGBE_FRMSZ_MAX_MASK,
4179 TXGBE_FRMSZ_MAX(TXGBE_FRAME_SIZE_DFT));
4180 }
4181
4182 /*
4183 * If loopback mode is configured, set LPBK bit.
4184 */
4185 hlreg0 = rd32(hw, TXGBE_PSRCTL);
4186 if (hw->mac.type == txgbe_mac_raptor &&
4187 dev->data->dev_conf.lpbk_mode)
4188 hlreg0 |= TXGBE_PSRCTL_LBENA;
4189 else
4190 hlreg0 &= ~TXGBE_PSRCTL_LBENA;
4191
4192 wr32(hw, TXGBE_PSRCTL, hlreg0);
4193
4194 /*
4195 * Assume no header split and no VLAN strip support
4196 * on any Rx queue first .
4197 */
4198 rx_conf->offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
4199
4200 /* Setup RX queues */
4201 for (i = 0; i < dev->data->nb_rx_queues; i++) {
4202 rxq = dev->data->rx_queues[i];
4203
4204 /*
4205 * Reset crc_len in case it was changed after queue setup by a
4206 * call to configure.
4207 */
4208 if (rx_conf->offloads & DEV_RX_OFFLOAD_KEEP_CRC)
4209 rxq->crc_len = RTE_ETHER_CRC_LEN;
4210 else
4211 rxq->crc_len = 0;
4212
4213 /* Setup the Base and Length of the Rx Descriptor Rings */
4214 bus_addr = rxq->rx_ring_phys_addr;
4215 wr32(hw, TXGBE_RXBAL(rxq->reg_idx),
4216 (uint32_t)(bus_addr & BIT_MASK32));
4217 wr32(hw, TXGBE_RXBAH(rxq->reg_idx),
4218 (uint32_t)(bus_addr >> 32));
4219 wr32(hw, TXGBE_RXRP(rxq->reg_idx), 0);
4220 wr32(hw, TXGBE_RXWP(rxq->reg_idx), 0);
4221
4222 srrctl = TXGBE_RXCFG_RNGLEN(rxq->nb_rx_desc);
4223
4224 /* Set if packets are dropped when no descriptors available */
4225 if (rxq->drop_en)
4226 srrctl |= TXGBE_RXCFG_DROP;
4227
4228 /*
4229 * Configure the RX buffer size in the PKTLEN field of
4230 * the RXCFG register of the queue.
4231 * The value is in 1 KB resolution. Valid values can be from
4232 * 1 KB to 16 KB.
4233 */
4234 buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rxq->mb_pool) -
4235 RTE_PKTMBUF_HEADROOM);
4236 buf_size = ROUND_UP(buf_size, 0x1 << 10);
4237 srrctl |= TXGBE_RXCFG_PKTLEN(buf_size);
4238
4239 wr32(hw, TXGBE_RXCFG(rxq->reg_idx), srrctl);
4240
4241 /* It adds dual VLAN length for supporting dual VLAN */
4242 if (dev->data->dev_conf.rxmode.max_rx_pkt_len +
4243 2 * TXGBE_VLAN_TAG_SIZE > buf_size)
4244 dev->data->scattered_rx = 1;
4245 if (rxq->offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
4246 rx_conf->offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
4247 }
4248
4249 if (rx_conf->offloads & DEV_RX_OFFLOAD_SCATTER)
4250 dev->data->scattered_rx = 1;
4251
4252 /*
4253 * Device configured with multiple RX queues.
4254 */
4255 txgbe_dev_mq_rx_configure(dev);
4256
4257 /*
4258 * Setup the Checksum Register.
4259 * Disable Full-Packet Checksum which is mutually exclusive with RSS.
4260 * Enable IP/L4 checksum computation by hardware if requested to do so.
4261 */
4262 rxcsum = rd32(hw, TXGBE_PSRCTL);
4263 rxcsum |= TXGBE_PSRCTL_PCSD;
4264 if (rx_conf->offloads & DEV_RX_OFFLOAD_CHECKSUM)
4265 rxcsum |= TXGBE_PSRCTL_L4CSUM;
4266 else
4267 rxcsum &= ~TXGBE_PSRCTL_L4CSUM;
4268
4269 wr32(hw, TXGBE_PSRCTL, rxcsum);
4270
4271 if (hw->mac.type == txgbe_mac_raptor) {
4272 rdrxctl = rd32(hw, TXGBE_SECRXCTL);
4273 if (rx_conf->offloads & DEV_RX_OFFLOAD_KEEP_CRC)
4274 rdrxctl &= ~TXGBE_SECRXCTL_CRCSTRIP;
4275 else
4276 rdrxctl |= TXGBE_SECRXCTL_CRCSTRIP;
4277 wr32(hw, TXGBE_SECRXCTL, rdrxctl);
4278 }
4279
4280 rc = txgbe_set_rsc(dev);
4281 if (rc)
4282 return rc;
4283
4284 txgbe_set_rx_function(dev);
4285
4286 return 0;
4287 }
4288
4289 /*
4290 * Initializes Transmit Unit.
4291 */
4292 void __rte_cold
txgbe_dev_tx_init(struct rte_eth_dev * dev)4293 txgbe_dev_tx_init(struct rte_eth_dev *dev)
4294 {
4295 struct txgbe_hw *hw;
4296 struct txgbe_tx_queue *txq;
4297 uint64_t bus_addr;
4298 uint16_t i;
4299
4300 PMD_INIT_FUNC_TRACE();
4301 hw = TXGBE_DEV_HW(dev);
4302
4303 /* Setup the Base and Length of the Tx Descriptor Rings */
4304 for (i = 0; i < dev->data->nb_tx_queues; i++) {
4305 txq = dev->data->tx_queues[i];
4306
4307 bus_addr = txq->tx_ring_phys_addr;
4308 wr32(hw, TXGBE_TXBAL(txq->reg_idx),
4309 (uint32_t)(bus_addr & BIT_MASK32));
4310 wr32(hw, TXGBE_TXBAH(txq->reg_idx),
4311 (uint32_t)(bus_addr >> 32));
4312 wr32m(hw, TXGBE_TXCFG(txq->reg_idx), TXGBE_TXCFG_BUFLEN_MASK,
4313 TXGBE_TXCFG_BUFLEN(txq->nb_tx_desc));
4314 /* Setup the HW Tx Head and TX Tail descriptor pointers */
4315 wr32(hw, TXGBE_TXRP(txq->reg_idx), 0);
4316 wr32(hw, TXGBE_TXWP(txq->reg_idx), 0);
4317 }
4318
4319 /* Device configured with multiple TX queues. */
4320 txgbe_dev_mq_tx_configure(dev);
4321 }
4322
4323 /*
4324 * Set up link loopback mode Tx->Rx.
4325 */
4326 static inline void __rte_cold
txgbe_setup_loopback_link_raptor(struct txgbe_hw * hw)4327 txgbe_setup_loopback_link_raptor(struct txgbe_hw *hw)
4328 {
4329 PMD_INIT_FUNC_TRACE();
4330
4331 wr32m(hw, TXGBE_MACRXCFG, TXGBE_MACRXCFG_LB, TXGBE_MACRXCFG_LB);
4332
4333 msec_delay(50);
4334 }
4335
4336 /*
4337 * Start Transmit and Receive Units.
4338 */
4339 int __rte_cold
txgbe_dev_rxtx_start(struct rte_eth_dev * dev)4340 txgbe_dev_rxtx_start(struct rte_eth_dev *dev)
4341 {
4342 struct txgbe_hw *hw;
4343 struct txgbe_tx_queue *txq;
4344 struct txgbe_rx_queue *rxq;
4345 uint32_t dmatxctl;
4346 uint32_t rxctrl;
4347 uint16_t i;
4348 int ret = 0;
4349
4350 PMD_INIT_FUNC_TRACE();
4351 hw = TXGBE_DEV_HW(dev);
4352
4353 for (i = 0; i < dev->data->nb_tx_queues; i++) {
4354 txq = dev->data->tx_queues[i];
4355 /* Setup Transmit Threshold Registers */
4356 wr32m(hw, TXGBE_TXCFG(txq->reg_idx),
4357 TXGBE_TXCFG_HTHRESH_MASK |
4358 TXGBE_TXCFG_WTHRESH_MASK,
4359 TXGBE_TXCFG_HTHRESH(txq->hthresh) |
4360 TXGBE_TXCFG_WTHRESH(txq->wthresh));
4361 }
4362
4363 dmatxctl = rd32(hw, TXGBE_DMATXCTRL);
4364 dmatxctl |= TXGBE_DMATXCTRL_ENA;
4365 wr32(hw, TXGBE_DMATXCTRL, dmatxctl);
4366
4367 for (i = 0; i < dev->data->nb_tx_queues; i++) {
4368 txq = dev->data->tx_queues[i];
4369 if (!txq->tx_deferred_start) {
4370 ret = txgbe_dev_tx_queue_start(dev, i);
4371 if (ret < 0)
4372 return ret;
4373 }
4374 }
4375
4376 for (i = 0; i < dev->data->nb_rx_queues; i++) {
4377 rxq = dev->data->rx_queues[i];
4378 if (!rxq->rx_deferred_start) {
4379 ret = txgbe_dev_rx_queue_start(dev, i);
4380 if (ret < 0)
4381 return ret;
4382 }
4383 }
4384
4385 /* Enable Receive engine */
4386 rxctrl = rd32(hw, TXGBE_PBRXCTL);
4387 rxctrl |= TXGBE_PBRXCTL_ENA;
4388 hw->mac.enable_rx_dma(hw, rxctrl);
4389
4390 /* If loopback mode is enabled, set up the link accordingly */
4391 if (hw->mac.type == txgbe_mac_raptor &&
4392 dev->data->dev_conf.lpbk_mode)
4393 txgbe_setup_loopback_link_raptor(hw);
4394
4395 return 0;
4396 }
4397
4398 void
txgbe_dev_save_rx_queue(struct txgbe_hw * hw,uint16_t rx_queue_id)4399 txgbe_dev_save_rx_queue(struct txgbe_hw *hw, uint16_t rx_queue_id)
4400 {
4401 u32 *reg = &hw->q_rx_regs[rx_queue_id * 8];
4402 *(reg++) = rd32(hw, TXGBE_RXBAL(rx_queue_id));
4403 *(reg++) = rd32(hw, TXGBE_RXBAH(rx_queue_id));
4404 *(reg++) = rd32(hw, TXGBE_RXCFG(rx_queue_id));
4405 }
4406
4407 void
txgbe_dev_store_rx_queue(struct txgbe_hw * hw,uint16_t rx_queue_id)4408 txgbe_dev_store_rx_queue(struct txgbe_hw *hw, uint16_t rx_queue_id)
4409 {
4410 u32 *reg = &hw->q_rx_regs[rx_queue_id * 8];
4411 wr32(hw, TXGBE_RXBAL(rx_queue_id), *(reg++));
4412 wr32(hw, TXGBE_RXBAH(rx_queue_id), *(reg++));
4413 wr32(hw, TXGBE_RXCFG(rx_queue_id), *(reg++) & ~TXGBE_RXCFG_ENA);
4414 }
4415
4416 void
txgbe_dev_save_tx_queue(struct txgbe_hw * hw,uint16_t tx_queue_id)4417 txgbe_dev_save_tx_queue(struct txgbe_hw *hw, uint16_t tx_queue_id)
4418 {
4419 u32 *reg = &hw->q_tx_regs[tx_queue_id * 8];
4420 *(reg++) = rd32(hw, TXGBE_TXBAL(tx_queue_id));
4421 *(reg++) = rd32(hw, TXGBE_TXBAH(tx_queue_id));
4422 *(reg++) = rd32(hw, TXGBE_TXCFG(tx_queue_id));
4423 }
4424
4425 void
txgbe_dev_store_tx_queue(struct txgbe_hw * hw,uint16_t tx_queue_id)4426 txgbe_dev_store_tx_queue(struct txgbe_hw *hw, uint16_t tx_queue_id)
4427 {
4428 u32 *reg = &hw->q_tx_regs[tx_queue_id * 8];
4429 wr32(hw, TXGBE_TXBAL(tx_queue_id), *(reg++));
4430 wr32(hw, TXGBE_TXBAH(tx_queue_id), *(reg++));
4431 wr32(hw, TXGBE_TXCFG(tx_queue_id), *(reg++) & ~TXGBE_TXCFG_ENA);
4432 }
4433
4434 /*
4435 * Start Receive Units for specified queue.
4436 */
4437 int __rte_cold
txgbe_dev_rx_queue_start(struct rte_eth_dev * dev,uint16_t rx_queue_id)4438 txgbe_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
4439 {
4440 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
4441 struct txgbe_rx_queue *rxq;
4442 uint32_t rxdctl;
4443 int poll_ms;
4444
4445 PMD_INIT_FUNC_TRACE();
4446
4447 rxq = dev->data->rx_queues[rx_queue_id];
4448
4449 /* Allocate buffers for descriptor rings */
4450 if (txgbe_alloc_rx_queue_mbufs(rxq) != 0) {
4451 PMD_INIT_LOG(ERR, "Could not alloc mbuf for queue:%d",
4452 rx_queue_id);
4453 return -1;
4454 }
4455 rxdctl = rd32(hw, TXGBE_RXCFG(rxq->reg_idx));
4456 rxdctl |= TXGBE_RXCFG_ENA;
4457 wr32(hw, TXGBE_RXCFG(rxq->reg_idx), rxdctl);
4458
4459 /* Wait until RX Enable ready */
4460 poll_ms = RTE_TXGBE_REGISTER_POLL_WAIT_10_MS;
4461 do {
4462 rte_delay_ms(1);
4463 rxdctl = rd32(hw, TXGBE_RXCFG(rxq->reg_idx));
4464 } while (--poll_ms && !(rxdctl & TXGBE_RXCFG_ENA));
4465 if (!poll_ms)
4466 PMD_INIT_LOG(ERR, "Could not enable Rx Queue %d", rx_queue_id);
4467 rte_wmb();
4468 wr32(hw, TXGBE_RXRP(rxq->reg_idx), 0);
4469 wr32(hw, TXGBE_RXWP(rxq->reg_idx), rxq->nb_rx_desc - 1);
4470 dev->data->rx_queue_state[rx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
4471
4472 return 0;
4473 }
4474
4475 /*
4476 * Stop Receive Units for specified queue.
4477 */
4478 int __rte_cold
txgbe_dev_rx_queue_stop(struct rte_eth_dev * dev,uint16_t rx_queue_id)4479 txgbe_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)
4480 {
4481 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
4482 struct txgbe_adapter *adapter = TXGBE_DEV_ADAPTER(dev);
4483 struct txgbe_rx_queue *rxq;
4484 uint32_t rxdctl;
4485 int poll_ms;
4486
4487 PMD_INIT_FUNC_TRACE();
4488
4489 rxq = dev->data->rx_queues[rx_queue_id];
4490
4491 txgbe_dev_save_rx_queue(hw, rxq->reg_idx);
4492 wr32m(hw, TXGBE_RXCFG(rxq->reg_idx), TXGBE_RXCFG_ENA, 0);
4493
4494 /* Wait until RX Enable bit clear */
4495 poll_ms = RTE_TXGBE_REGISTER_POLL_WAIT_10_MS;
4496 do {
4497 rte_delay_ms(1);
4498 rxdctl = rd32(hw, TXGBE_RXCFG(rxq->reg_idx));
4499 } while (--poll_ms && (rxdctl & TXGBE_RXCFG_ENA));
4500 if (!poll_ms)
4501 PMD_INIT_LOG(ERR, "Could not disable Rx Queue %d", rx_queue_id);
4502
4503 rte_delay_us(RTE_TXGBE_WAIT_100_US);
4504 txgbe_dev_store_rx_queue(hw, rxq->reg_idx);
4505
4506 txgbe_rx_queue_release_mbufs(rxq);
4507 txgbe_reset_rx_queue(adapter, rxq);
4508 dev->data->rx_queue_state[rx_queue_id] = RTE_ETH_QUEUE_STATE_STOPPED;
4509
4510 return 0;
4511 }
4512
4513 /*
4514 * Start Transmit Units for specified queue.
4515 */
4516 int __rte_cold
txgbe_dev_tx_queue_start(struct rte_eth_dev * dev,uint16_t tx_queue_id)4517 txgbe_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
4518 {
4519 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
4520 struct txgbe_tx_queue *txq;
4521 uint32_t txdctl;
4522 int poll_ms;
4523
4524 PMD_INIT_FUNC_TRACE();
4525
4526 txq = dev->data->tx_queues[tx_queue_id];
4527 wr32m(hw, TXGBE_TXCFG(txq->reg_idx), TXGBE_TXCFG_ENA, TXGBE_TXCFG_ENA);
4528
4529 /* Wait until TX Enable ready */
4530 poll_ms = RTE_TXGBE_REGISTER_POLL_WAIT_10_MS;
4531 do {
4532 rte_delay_ms(1);
4533 txdctl = rd32(hw, TXGBE_TXCFG(txq->reg_idx));
4534 } while (--poll_ms && !(txdctl & TXGBE_TXCFG_ENA));
4535 if (!poll_ms)
4536 PMD_INIT_LOG(ERR, "Could not enable "
4537 "Tx Queue %d", tx_queue_id);
4538
4539 rte_wmb();
4540 wr32(hw, TXGBE_TXWP(txq->reg_idx), txq->tx_tail);
4541 dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
4542
4543 return 0;
4544 }
4545
4546 /*
4547 * Stop Transmit Units for specified queue.
4548 */
4549 int __rte_cold
txgbe_dev_tx_queue_stop(struct rte_eth_dev * dev,uint16_t tx_queue_id)4550 txgbe_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
4551 {
4552 struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
4553 struct txgbe_tx_queue *txq;
4554 uint32_t txdctl;
4555 uint32_t txtdh, txtdt;
4556 int poll_ms;
4557
4558 PMD_INIT_FUNC_TRACE();
4559
4560 txq = dev->data->tx_queues[tx_queue_id];
4561
4562 /* Wait until TX queue is empty */
4563 poll_ms = RTE_TXGBE_REGISTER_POLL_WAIT_10_MS;
4564 do {
4565 rte_delay_us(RTE_TXGBE_WAIT_100_US);
4566 txtdh = rd32(hw, TXGBE_TXRP(txq->reg_idx));
4567 txtdt = rd32(hw, TXGBE_TXWP(txq->reg_idx));
4568 } while (--poll_ms && (txtdh != txtdt));
4569 if (!poll_ms)
4570 PMD_INIT_LOG(ERR,
4571 "Tx Queue %d is not empty when stopping.",
4572 tx_queue_id);
4573
4574 txgbe_dev_save_tx_queue(hw, txq->reg_idx);
4575 wr32m(hw, TXGBE_TXCFG(txq->reg_idx), TXGBE_TXCFG_ENA, 0);
4576
4577 /* Wait until TX Enable bit clear */
4578 poll_ms = RTE_TXGBE_REGISTER_POLL_WAIT_10_MS;
4579 do {
4580 rte_delay_ms(1);
4581 txdctl = rd32(hw, TXGBE_TXCFG(txq->reg_idx));
4582 } while (--poll_ms && (txdctl & TXGBE_TXCFG_ENA));
4583 if (!poll_ms)
4584 PMD_INIT_LOG(ERR, "Could not disable Tx Queue %d",
4585 tx_queue_id);
4586
4587 rte_delay_us(RTE_TXGBE_WAIT_100_US);
4588 txgbe_dev_store_tx_queue(hw, txq->reg_idx);
4589
4590 if (txq->ops != NULL) {
4591 txq->ops->release_mbufs(txq);
4592 txq->ops->reset(txq);
4593 }
4594 dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STOPPED;
4595
4596 return 0;
4597 }
4598
4599 void
txgbe_rxq_info_get(struct rte_eth_dev * dev,uint16_t queue_id,struct rte_eth_rxq_info * qinfo)4600 txgbe_rxq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
4601 struct rte_eth_rxq_info *qinfo)
4602 {
4603 struct txgbe_rx_queue *rxq;
4604
4605 rxq = dev->data->rx_queues[queue_id];
4606
4607 qinfo->mp = rxq->mb_pool;
4608 qinfo->scattered_rx = dev->data->scattered_rx;
4609 qinfo->nb_desc = rxq->nb_rx_desc;
4610
4611 qinfo->conf.rx_free_thresh = rxq->rx_free_thresh;
4612 qinfo->conf.rx_drop_en = rxq->drop_en;
4613 qinfo->conf.rx_deferred_start = rxq->rx_deferred_start;
4614 qinfo->conf.offloads = rxq->offloads;
4615 }
4616
4617 void
txgbe_txq_info_get(struct rte_eth_dev * dev,uint16_t queue_id,struct rte_eth_txq_info * qinfo)4618 txgbe_txq_info_get(struct rte_eth_dev *dev, uint16_t queue_id,
4619 struct rte_eth_txq_info *qinfo)
4620 {
4621 struct txgbe_tx_queue *txq;
4622
4623 txq = dev->data->tx_queues[queue_id];
4624
4625 qinfo->nb_desc = txq->nb_tx_desc;
4626
4627 qinfo->conf.tx_thresh.pthresh = txq->pthresh;
4628 qinfo->conf.tx_thresh.hthresh = txq->hthresh;
4629 qinfo->conf.tx_thresh.wthresh = txq->wthresh;
4630
4631 qinfo->conf.tx_free_thresh = txq->tx_free_thresh;
4632 qinfo->conf.offloads = txq->offloads;
4633 qinfo->conf.tx_deferred_start = txq->tx_deferred_start;
4634 }
4635
4636