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