xref: /dpdk/drivers/net/mlx5/mlx5_rxtx.c (revision 3dfa78770ed53c376df2da7c2bd997e0b2d33cd1)
18fd92a66SOlivier Matz /* SPDX-License-Identifier: BSD-3-Clause
22e22920bSAdrien Mazarguil  * Copyright 2015 6WIND S.A.
3eb8121abSViacheslav Ovsiienko  * Copyright 2015-2019 Mellanox Technologies, Ltd
42e22920bSAdrien Mazarguil  */
52e22920bSAdrien Mazarguil 
62e22920bSAdrien Mazarguil #include <stdint.h>
72e22920bSAdrien Mazarguil #include <string.h>
82e22920bSAdrien Mazarguil #include <stdlib.h>
92e22920bSAdrien Mazarguil 
102e22920bSAdrien Mazarguil #include <rte_mbuf.h>
112e22920bSAdrien Mazarguil #include <rte_mempool.h>
122e22920bSAdrien Mazarguil #include <rte_prefetch.h>
132e22920bSAdrien Mazarguil #include <rte_common.h>
142e22920bSAdrien Mazarguil #include <rte_branch_prediction.h>
156218063bSNélio Laranjeiro #include <rte_ether.h>
1688c07335SMatan Azrad #include <rte_cycles.h>
17a18ac611SViacheslav Ovsiienko #include <rte_flow.h>
182e22920bSAdrien Mazarguil 
197b4f1e6bSMatan Azrad #include <mlx5_prm.h>
2093e30982SMatan Azrad #include <mlx5_common.h>
217b4f1e6bSMatan Azrad 
220f20acbfSAlexander Kozyrev #include "mlx5_autoconf.h"
237b4f1e6bSMatan Azrad #include "mlx5_defs.h"
242e22920bSAdrien Mazarguil #include "mlx5.h"
252e22920bSAdrien Mazarguil #include "mlx5_utils.h"
262e22920bSAdrien Mazarguil #include "mlx5_rxtx.h"
27151cbe3aSMichael Baum #include "mlx5_rx.h"
28377b69fbSMichael Baum #include "mlx5_tx.h"
296218063bSNélio Laranjeiro 
309b9890e2SOphir Munk /* static asserts */
319b9890e2SOphir Munk static_assert(MLX5_CQE_STATUS_HW_OWN < 0, "Must be negative value");
329b9890e2SOphir Munk static_assert(MLX5_CQE_STATUS_SW_OWN < 0, "Must be negative value");
339b9890e2SOphir Munk static_assert(MLX5_ESEG_MIN_INLINE_SIZE ==
349b9890e2SOphir Munk 		(sizeof(uint16_t) +
359b9890e2SOphir Munk 		 sizeof(rte_v128u32_t)),
369b9890e2SOphir Munk 		"invalid Ethernet Segment data size");
379b9890e2SOphir Munk static_assert(MLX5_ESEG_MIN_INLINE_SIZE ==
389b9890e2SOphir Munk 		(sizeof(uint16_t) +
399b9890e2SOphir Munk 		 sizeof(struct rte_vlan_hdr) +
409b9890e2SOphir Munk 		 2 * RTE_ETHER_ADDR_LEN),
419b9890e2SOphir Munk 		"invalid Ethernet Segment data size");
429b9890e2SOphir Munk static_assert(MLX5_ESEG_MIN_INLINE_SIZE ==
439b9890e2SOphir Munk 		(sizeof(uint16_t) +
449b9890e2SOphir Munk 		 sizeof(rte_v128u32_t)),
459b9890e2SOphir Munk 		"invalid Ethernet Segment data size");
469b9890e2SOphir Munk static_assert(MLX5_ESEG_MIN_INLINE_SIZE ==
479b9890e2SOphir Munk 		(sizeof(uint16_t) +
489b9890e2SOphir Munk 		 sizeof(struct rte_vlan_hdr) +
499b9890e2SOphir Munk 		 2 * RTE_ETHER_ADDR_LEN),
509b9890e2SOphir Munk 		"invalid Ethernet Segment data size");
519b9890e2SOphir Munk static_assert(MLX5_ESEG_MIN_INLINE_SIZE ==
529b9890e2SOphir Munk 		(sizeof(uint16_t) +
539b9890e2SOphir Munk 		 sizeof(rte_v128u32_t)),
549b9890e2SOphir Munk 		"invalid Ethernet Segment data size");
559b9890e2SOphir Munk static_assert(MLX5_ESEG_MIN_INLINE_SIZE ==
569b9890e2SOphir Munk 		(sizeof(uint16_t) +
579b9890e2SOphir Munk 		 sizeof(struct rte_vlan_hdr) +
589b9890e2SOphir Munk 		 2 * RTE_ETHER_ADDR_LEN),
599b9890e2SOphir Munk 		"invalid Ethernet Segment data size");
609b9890e2SOphir Munk static_assert(MLX5_DSEG_MIN_INLINE_SIZE ==
619b9890e2SOphir Munk 		(2 * RTE_ETHER_ADDR_LEN),
629b9890e2SOphir Munk 		"invalid Data Segment data size");
639b9890e2SOphir Munk static_assert(MLX5_EMPW_MIN_PACKETS >= 2, "invalid min size");
649b9890e2SOphir Munk static_assert(MLX5_EMPW_MIN_PACKETS >= 2, "invalid min size");
659b9890e2SOphir Munk static_assert((sizeof(struct rte_vlan_hdr) +
669b9890e2SOphir Munk 			sizeof(struct rte_ether_hdr)) ==
679b9890e2SOphir Munk 		MLX5_ESEG_MIN_INLINE_SIZE,
689b9890e2SOphir Munk 		"invalid min inline data size");
699b9890e2SOphir Munk static_assert(MLX5_WQE_SIZE_MAX / MLX5_WSEG_SIZE <=
709b9890e2SOphir Munk 		MLX5_DSEG_MAX, "invalid WQE max size");
719b9890e2SOphir Munk static_assert(MLX5_WQE_CSEG_SIZE == MLX5_WSEG_SIZE,
729b9890e2SOphir Munk 		"invalid WQE Control Segment size");
739b9890e2SOphir Munk static_assert(MLX5_WQE_ESEG_SIZE == MLX5_WSEG_SIZE,
749b9890e2SOphir Munk 		"invalid WQE Ethernet Segment size");
759b9890e2SOphir Munk static_assert(MLX5_WQE_DSEG_SIZE == MLX5_WSEG_SIZE,
769b9890e2SOphir Munk 		"invalid WQE Data Segment size");
779b9890e2SOphir Munk static_assert(MLX5_WQE_SIZE == 4 * MLX5_WSEG_SIZE,
789b9890e2SOphir Munk 		"invalid WQE size");
799b9890e2SOphir Munk 
8027595cd8STyler Retzlaff alignas(RTE_CACHE_LINE_SIZE) uint32_t mlx5_ptype_table[] = {
81ea16068cSYongseok Koh 	[0xff] = RTE_PTYPE_ALL_MASK, /* Last entry for errored packet. */
82ea16068cSYongseok Koh };
83ea16068cSYongseok Koh 
8427595cd8STyler Retzlaff alignas(RTE_CACHE_LINE_SIZE) uint8_t mlx5_cksum_table[1 << 10];
8527595cd8STyler Retzlaff alignas(RTE_CACHE_LINE_SIZE) uint8_t mlx5_swp_types_table[1 << 10];
865f8ba81cSXueming Li 
87efa79e68SOri Kam uint64_t rte_net_mlx5_dynf_inline_mask;
88efa79e68SOri Kam 
89ea16068cSYongseok Koh /**
90ea16068cSYongseok Koh  * Build a table to translate Rx completion flags to packet type.
91ea16068cSYongseok Koh  *
92ea16068cSYongseok Koh  * @note: fix mlx5_dev_supported_ptypes_get() if any change here.
93ea16068cSYongseok Koh  */
94ea16068cSYongseok Koh void
mlx5_set_ptype_table(void)95ea16068cSYongseok Koh mlx5_set_ptype_table(void)
96ea16068cSYongseok Koh {
97ea16068cSYongseok Koh 	unsigned int i;
98ea16068cSYongseok Koh 	uint32_t (*p)[RTE_DIM(mlx5_ptype_table)] = &mlx5_ptype_table;
99ea16068cSYongseok Koh 
1009807f113SYongseok Koh 	/* Last entry must not be overwritten, reserved for errored packet. */
1019807f113SYongseok Koh 	for (i = 0; i < RTE_DIM(mlx5_ptype_table) - 1; ++i)
102ea16068cSYongseok Koh 		(*p)[i] = RTE_PTYPE_UNKNOWN;
1036cb559d6SYongseok Koh 	/*
1046cb559d6SYongseok Koh 	 * The index to the array should have:
105ea16068cSYongseok Koh 	 * bit[1:0] = l3_hdr_type
106ea16068cSYongseok Koh 	 * bit[4:2] = l4_hdr_type
107ea16068cSYongseok Koh 	 * bit[5] = ip_frag
108ea16068cSYongseok Koh 	 * bit[6] = tunneled
109ea16068cSYongseok Koh 	 * bit[7] = outer_l3_type
11099c12dccSNélio Laranjeiro 	 */
1113ca63b88SShahaf Shuler 	/* L2 */
1123ca63b88SShahaf Shuler 	(*p)[0x00] = RTE_PTYPE_L2_ETHER;
113ea16068cSYongseok Koh 	/* L3 */
114ea16068cSYongseok Koh 	(*p)[0x01] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
115ea16068cSYongseok Koh 		     RTE_PTYPE_L4_NONFRAG;
116ea16068cSYongseok Koh 	(*p)[0x02] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
117ea16068cSYongseok Koh 		     RTE_PTYPE_L4_NONFRAG;
118ea16068cSYongseok Koh 	/* Fragmented */
119ea16068cSYongseok Koh 	(*p)[0x21] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
120ea16068cSYongseok Koh 		     RTE_PTYPE_L4_FRAG;
121ea16068cSYongseok Koh 	(*p)[0x22] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
122ea16068cSYongseok Koh 		     RTE_PTYPE_L4_FRAG;
123ea16068cSYongseok Koh 	/* TCP */
124ea16068cSYongseok Koh 	(*p)[0x05] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
125ea16068cSYongseok Koh 		     RTE_PTYPE_L4_TCP;
126ea16068cSYongseok Koh 	(*p)[0x06] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
127ea16068cSYongseok Koh 		     RTE_PTYPE_L4_TCP;
1280915e287SBin Huang 	(*p)[0x0d] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
1290915e287SBin Huang 		     RTE_PTYPE_L4_TCP;
1300915e287SBin Huang 	(*p)[0x0e] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
1310915e287SBin Huang 		     RTE_PTYPE_L4_TCP;
1320915e287SBin Huang 	(*p)[0x11] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
1330915e287SBin Huang 		     RTE_PTYPE_L4_TCP;
1340915e287SBin Huang 	(*p)[0x12] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
1350915e287SBin Huang 		     RTE_PTYPE_L4_TCP;
136ea16068cSYongseok Koh 	/* UDP */
137ea16068cSYongseok Koh 	(*p)[0x09] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
138ea16068cSYongseok Koh 		     RTE_PTYPE_L4_UDP;
139ea16068cSYongseok Koh 	(*p)[0x0a] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
140ea16068cSYongseok Koh 		     RTE_PTYPE_L4_UDP;
141ea16068cSYongseok Koh 	/* Repeat with outer_l3_type being set. Just in case. */
142ea16068cSYongseok Koh 	(*p)[0x81] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
143ea16068cSYongseok Koh 		     RTE_PTYPE_L4_NONFRAG;
144ea16068cSYongseok Koh 	(*p)[0x82] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
145ea16068cSYongseok Koh 		     RTE_PTYPE_L4_NONFRAG;
146ea16068cSYongseok Koh 	(*p)[0xa1] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
147ea16068cSYongseok Koh 		     RTE_PTYPE_L4_FRAG;
148ea16068cSYongseok Koh 	(*p)[0xa2] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
149ea16068cSYongseok Koh 		     RTE_PTYPE_L4_FRAG;
150ea16068cSYongseok Koh 	(*p)[0x85] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
151ea16068cSYongseok Koh 		     RTE_PTYPE_L4_TCP;
152ea16068cSYongseok Koh 	(*p)[0x86] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
153ea16068cSYongseok Koh 		     RTE_PTYPE_L4_TCP;
1540915e287SBin Huang 	(*p)[0x8d] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
1550915e287SBin Huang 		     RTE_PTYPE_L4_TCP;
1560915e287SBin Huang 	(*p)[0x8e] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
1570915e287SBin Huang 		     RTE_PTYPE_L4_TCP;
1580915e287SBin Huang 	(*p)[0x91] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
1590915e287SBin Huang 		     RTE_PTYPE_L4_TCP;
1600915e287SBin Huang 	(*p)[0x92] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
1610915e287SBin Huang 		     RTE_PTYPE_L4_TCP;
162ea16068cSYongseok Koh 	(*p)[0x89] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
163ea16068cSYongseok Koh 		     RTE_PTYPE_L4_UDP;
164ea16068cSYongseok Koh 	(*p)[0x8a] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
165ea16068cSYongseok Koh 		     RTE_PTYPE_L4_UDP;
166ea16068cSYongseok Koh 	/* Tunneled - L3 */
1673cc08bc6SXueming Li 	(*p)[0x40] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN;
168ea16068cSYongseok Koh 	(*p)[0x41] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
169ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
170ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L4_NONFRAG;
171ea16068cSYongseok Koh 	(*p)[0x42] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
172ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
173ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L4_NONFRAG;
1743cc08bc6SXueming Li 	(*p)[0xc0] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN;
175ea16068cSYongseok Koh 	(*p)[0xc1] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
176ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
177ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L4_NONFRAG;
178ea16068cSYongseok Koh 	(*p)[0xc2] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
179ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
180ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L4_NONFRAG;
181ea16068cSYongseok Koh 	/* Tunneled - Fragmented */
182ea16068cSYongseok Koh 	(*p)[0x61] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
183ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
184ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L4_FRAG;
185ea16068cSYongseok Koh 	(*p)[0x62] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
186ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
187ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L4_FRAG;
188ea16068cSYongseok Koh 	(*p)[0xe1] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
189ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
190ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L4_FRAG;
191ea16068cSYongseok Koh 	(*p)[0xe2] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
192ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
193ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L4_FRAG;
194ea16068cSYongseok Koh 	/* Tunneled - TCP */
195ea16068cSYongseok Koh 	(*p)[0x45] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
196ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
1976c897093SYongseok Koh 		     RTE_PTYPE_INNER_L4_TCP;
198ea16068cSYongseok Koh 	(*p)[0x46] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
199ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
2006c897093SYongseok Koh 		     RTE_PTYPE_INNER_L4_TCP;
2010915e287SBin Huang 	(*p)[0x4d] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
2020915e287SBin Huang 		     RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
2030915e287SBin Huang 		     RTE_PTYPE_INNER_L4_TCP;
2040915e287SBin Huang 	(*p)[0x4e] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
2050915e287SBin Huang 		     RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
2060915e287SBin Huang 		     RTE_PTYPE_INNER_L4_TCP;
2070915e287SBin Huang 	(*p)[0x51] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
2080915e287SBin Huang 		     RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
2090915e287SBin Huang 		     RTE_PTYPE_INNER_L4_TCP;
2100915e287SBin Huang 	(*p)[0x52] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
2110915e287SBin Huang 		     RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
2120915e287SBin Huang 		     RTE_PTYPE_INNER_L4_TCP;
213ea16068cSYongseok Koh 	(*p)[0xc5] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
214ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
2156c897093SYongseok Koh 		     RTE_PTYPE_INNER_L4_TCP;
216ea16068cSYongseok Koh 	(*p)[0xc6] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
217ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
2186c897093SYongseok Koh 		     RTE_PTYPE_INNER_L4_TCP;
2190915e287SBin Huang 	(*p)[0xcd] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
2200915e287SBin Huang 		     RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
2210915e287SBin Huang 		     RTE_PTYPE_INNER_L4_TCP;
2220915e287SBin Huang 	(*p)[0xce] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
2230915e287SBin Huang 		     RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
2240915e287SBin Huang 		     RTE_PTYPE_INNER_L4_TCP;
2250915e287SBin Huang 	(*p)[0xd1] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
2260915e287SBin Huang 		     RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
2270915e287SBin Huang 		     RTE_PTYPE_INNER_L4_TCP;
2280915e287SBin Huang 	(*p)[0xd2] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
2290915e287SBin Huang 		     RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
2300915e287SBin Huang 		     RTE_PTYPE_INNER_L4_TCP;
231ea16068cSYongseok Koh 	/* Tunneled - UDP */
232ea16068cSYongseok Koh 	(*p)[0x49] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
233ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
2346c897093SYongseok Koh 		     RTE_PTYPE_INNER_L4_UDP;
235ea16068cSYongseok Koh 	(*p)[0x4a] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV4_EXT_UNKNOWN |
236ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
2376c897093SYongseok Koh 		     RTE_PTYPE_INNER_L4_UDP;
238ea16068cSYongseok Koh 	(*p)[0xc9] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
239ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN |
2406c897093SYongseok Koh 		     RTE_PTYPE_INNER_L4_UDP;
241ea16068cSYongseok Koh 	(*p)[0xca] = RTE_PTYPE_L2_ETHER | RTE_PTYPE_L3_IPV6_EXT_UNKNOWN |
242ea16068cSYongseok Koh 		     RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN |
2436c897093SYongseok Koh 		     RTE_PTYPE_INNER_L4_UDP;
244ea16068cSYongseok Koh }
245fdcb0f53SNélio Laranjeiro 
2462e22920bSAdrien Mazarguil /**
2475f8ba81cSXueming Li  * Build a table to translate packet to checksum type of Verbs.
2485f8ba81cSXueming Li  */
2495f8ba81cSXueming Li void
mlx5_set_cksum_table(void)2505f8ba81cSXueming Li mlx5_set_cksum_table(void)
2515f8ba81cSXueming Li {
2525f8ba81cSXueming Li 	unsigned int i;
2535f8ba81cSXueming Li 	uint8_t v;
2545f8ba81cSXueming Li 
2555f8ba81cSXueming Li 	/*
2565f8ba81cSXueming Li 	 * The index should have:
257daa02b5cSOlivier Matz 	 * bit[0] = RTE_MBUF_F_TX_TCP_SEG
258daa02b5cSOlivier Matz 	 * bit[2:3] = RTE_MBUF_F_TX_UDP_CKSUM, RTE_MBUF_F_TX_TCP_CKSUM
259daa02b5cSOlivier Matz 	 * bit[4] = RTE_MBUF_F_TX_IP_CKSUM
260daa02b5cSOlivier Matz 	 * bit[8] = RTE_MBUF_F_TX_OUTER_IP_CKSUM
2615f8ba81cSXueming Li 	 * bit[9] = tunnel
2625f8ba81cSXueming Li 	 */
2635f8ba81cSXueming Li 	for (i = 0; i < RTE_DIM(mlx5_cksum_table); ++i) {
2645f8ba81cSXueming Li 		v = 0;
2655f8ba81cSXueming Li 		if (i & (1 << 9)) {
2665f8ba81cSXueming Li 			/* Tunneled packet. */
2675f8ba81cSXueming Li 			if (i & (1 << 8)) /* Outer IP. */
2685f8ba81cSXueming Li 				v |= MLX5_ETH_WQE_L3_CSUM;
2695f8ba81cSXueming Li 			if (i & (1 << 4)) /* Inner IP. */
2705f8ba81cSXueming Li 				v |= MLX5_ETH_WQE_L3_INNER_CSUM;
2715f8ba81cSXueming Li 			if (i & (3 << 2 | 1 << 0)) /* L4 or TSO. */
2725f8ba81cSXueming Li 				v |= MLX5_ETH_WQE_L4_INNER_CSUM;
2735f8ba81cSXueming Li 		} else {
2745f8ba81cSXueming Li 			/* No tunnel. */
2755f8ba81cSXueming Li 			if (i & (1 << 4)) /* IP. */
2765f8ba81cSXueming Li 				v |= MLX5_ETH_WQE_L3_CSUM;
2775f8ba81cSXueming Li 			if (i & (3 << 2 | 1 << 0)) /* L4 or TSO. */
2785f8ba81cSXueming Li 				v |= MLX5_ETH_WQE_L4_CSUM;
2795f8ba81cSXueming Li 		}
2805f8ba81cSXueming Li 		mlx5_cksum_table[i] = v;
2815f8ba81cSXueming Li 	}
2825f8ba81cSXueming Li }
2835f8ba81cSXueming Li 
2845f8ba81cSXueming Li /**
2855f8ba81cSXueming Li  * Build a table to translate packet type of mbuf to SWP type of Verbs.
2865f8ba81cSXueming Li  */
2875f8ba81cSXueming Li void
mlx5_set_swp_types_table(void)2885f8ba81cSXueming Li mlx5_set_swp_types_table(void)
2895f8ba81cSXueming Li {
2905f8ba81cSXueming Li 	unsigned int i;
2915f8ba81cSXueming Li 	uint8_t v;
2925f8ba81cSXueming Li 
2935f8ba81cSXueming Li 	/*
2945f8ba81cSXueming Li 	 * The index should have:
295daa02b5cSOlivier Matz 	 * bit[0:1] = RTE_MBUF_F_TX_L4_MASK
296daa02b5cSOlivier Matz 	 * bit[4] = RTE_MBUF_F_TX_IPV6
297daa02b5cSOlivier Matz 	 * bit[8] = RTE_MBUF_F_TX_OUTER_IPV6
298daa02b5cSOlivier Matz 	 * bit[9] = RTE_MBUF_F_TX_OUTER_UDP
2995f8ba81cSXueming Li 	 */
3005f8ba81cSXueming Li 	for (i = 0; i < RTE_DIM(mlx5_swp_types_table); ++i) {
3015f8ba81cSXueming Li 		v = 0;
3025f8ba81cSXueming Li 		if (i & (1 << 8))
3035f8ba81cSXueming Li 			v |= MLX5_ETH_WQE_L3_OUTER_IPV6;
3045f8ba81cSXueming Li 		if (i & (1 << 9))
3055f8ba81cSXueming Li 			v |= MLX5_ETH_WQE_L4_OUTER_UDP;
3065f8ba81cSXueming Li 		if (i & (1 << 4))
3075f8ba81cSXueming Li 			v |= MLX5_ETH_WQE_L3_INNER_IPV6;
308daa02b5cSOlivier Matz 		if ((i & 3) == (RTE_MBUF_F_TX_UDP_CKSUM >> 52))
3095f8ba81cSXueming Li 			v |= MLX5_ETH_WQE_L4_INNER_UDP;
3105f8ba81cSXueming Li 		mlx5_swp_types_table[i] = v;
3115f8ba81cSXueming Li 	}
3125f8ba81cSXueming Li }
3135f8ba81cSXueming Li 
314066cfecdSMatan Azrad #define MLX5_SYSTEM_LOG_DIR "/var/log"
315066cfecdSMatan Azrad /**
316066cfecdSMatan Azrad  * Dump debug information to log file.
317066cfecdSMatan Azrad  *
318066cfecdSMatan Azrad  * @param fname
319066cfecdSMatan Azrad  *   The file name.
320066cfecdSMatan Azrad  * @param hex_title
321066cfecdSMatan Azrad  *   If not NULL this string is printed as a header to the output
322066cfecdSMatan Azrad  *   and the output will be in hexadecimal view.
323066cfecdSMatan Azrad  * @param buf
324066cfecdSMatan Azrad  *   This is the buffer address to print out.
325066cfecdSMatan Azrad  * @param len
326066cfecdSMatan Azrad  *   The number of bytes to dump out.
327066cfecdSMatan Azrad  */
328066cfecdSMatan Azrad void
mlx5_dump_debug_information(const char * fname,const char * hex_title,const void * buf,unsigned int hex_len)329066cfecdSMatan Azrad mlx5_dump_debug_information(const char *fname, const char *hex_title,
330066cfecdSMatan Azrad 			    const void *buf, unsigned int hex_len)
331066cfecdSMatan Azrad {
332066cfecdSMatan Azrad 	FILE *fd;
333066cfecdSMatan Azrad 
334066cfecdSMatan Azrad 	MKSTR(path, "%s/%s", MLX5_SYSTEM_LOG_DIR, fname);
335066cfecdSMatan Azrad 	fd = fopen(path, "a+");
336066cfecdSMatan Azrad 	if (!fd) {
33706fa6988SDekel Peled 		DRV_LOG(WARNING, "cannot open %s for debug dump", path);
338066cfecdSMatan Azrad 		MKSTR(path2, "./%s", fname);
339066cfecdSMatan Azrad 		fd = fopen(path2, "a+");
340066cfecdSMatan Azrad 		if (!fd) {
34106fa6988SDekel Peled 			DRV_LOG(ERR, "cannot open %s for debug dump", path2);
342066cfecdSMatan Azrad 			return;
343066cfecdSMatan Azrad 		}
34406fa6988SDekel Peled 		DRV_LOG(INFO, "New debug dump in file %s", path2);
345066cfecdSMatan Azrad 	} else {
34606fa6988SDekel Peled 		DRV_LOG(INFO, "New debug dump in file %s", path);
347066cfecdSMatan Azrad 	}
348066cfecdSMatan Azrad 	if (hex_title)
349066cfecdSMatan Azrad 		rte_hexdump(fd, hex_title, buf, hex_len);
350066cfecdSMatan Azrad 	else
351066cfecdSMatan Azrad 		fprintf(fd, "%s", (const char *)buf);
352066cfecdSMatan Azrad 	fprintf(fd, "\n\n\n");
353066cfecdSMatan Azrad 	fclose(fd);
354066cfecdSMatan Azrad }
355066cfecdSMatan Azrad 
35626f04883STom Barbette /**
357*3dfa7877SKiran Vedere  * Dump information to a logfile
358*3dfa7877SKiran Vedere  *
359*3dfa7877SKiran Vedere  * @param fd
360*3dfa7877SKiran Vedere  *   File descriptor to logfile. File descriptor open/close is managed by caller.
361*3dfa7877SKiran Vedere  * @param title
362*3dfa7877SKiran Vedere  *   If not NULL this string is printed as a header to the output
363*3dfa7877SKiran Vedere  *   and the output will be in hexadecimal view.
364*3dfa7877SKiran Vedere  * @param buf
365*3dfa7877SKiran Vedere  *   This is the buffer address to print out.
366*3dfa7877SKiran Vedere  * @param len
367*3dfa7877SKiran Vedere  *   The number of bytes to dump out.
368*3dfa7877SKiran Vedere  */
369*3dfa7877SKiran Vedere void
mlx5_dump_to_file(FILE * fd,const char * title,const void * buf,unsigned int len)370*3dfa7877SKiran Vedere mlx5_dump_to_file(FILE *fd, const char *title,
371*3dfa7877SKiran Vedere 			    const void *buf, unsigned int len)
372*3dfa7877SKiran Vedere {
373*3dfa7877SKiran Vedere 	if (title)
374*3dfa7877SKiran Vedere 		rte_hexdump(fd, title, buf, len);
375*3dfa7877SKiran Vedere 	else
376*3dfa7877SKiran Vedere 		fprintf(fd, "%s", (const char *)buf);
377*3dfa7877SKiran Vedere 	fprintf(fd, "\n\n\n");
378*3dfa7877SKiran Vedere }
379*3dfa7877SKiran Vedere 
380*3dfa7877SKiran Vedere /**
38184537d3cSDekel Peled  * Modify a Verbs/DevX queue state.
3822d77cb61SMatan Azrad  * This must be called from the primary process.
3832d77cb61SMatan Azrad  *
3842d77cb61SMatan Azrad  * @param dev
3852d77cb61SMatan Azrad  *   Pointer to Ethernet device.
3862d77cb61SMatan Azrad  * @param sm
3872d77cb61SMatan Azrad  *   State modify request parameters.
3882d77cb61SMatan Azrad  *
3892d77cb61SMatan Azrad  * @return
3902d77cb61SMatan Azrad  *   0 in case of success else non-zero value and rte_errno is set.
3912d77cb61SMatan Azrad  */
3922d77cb61SMatan Azrad int
mlx5_queue_state_modify_primary(struct rte_eth_dev * dev,const struct mlx5_mp_arg_queue_state_modify * sm)3932d77cb61SMatan Azrad mlx5_queue_state_modify_primary(struct rte_eth_dev *dev,
3942d77cb61SMatan Azrad 			const struct mlx5_mp_arg_queue_state_modify *sm)
3952d77cb61SMatan Azrad {
3962d77cb61SMatan Azrad 	int ret;
3972d77cb61SMatan Azrad 	struct mlx5_priv *priv = dev->data->dev_private;
3982d77cb61SMatan Azrad 
3992d77cb61SMatan Azrad 	if (sm->is_wq) {
4005ceb3a02SXueming Li 		struct mlx5_rxq_priv *rxq = mlx5_rxq_get(dev, sm->queue_id);
4012d77cb61SMatan Azrad 
4025ceb3a02SXueming Li 		ret = priv->obj_ops.rxq_obj_modify(rxq, sm->state);
4032d77cb61SMatan Azrad 		if (ret) {
40406fa6988SDekel Peled 			DRV_LOG(ERR, "Cannot change Rx WQ state to %u  - %s",
4052d77cb61SMatan Azrad 					sm->state, strerror(errno));
4062d77cb61SMatan Azrad 			rte_errno = errno;
4072d77cb61SMatan Azrad 			return ret;
4082d77cb61SMatan Azrad 		}
40935c090eaSMatan Azrad 	} else {
41035c090eaSMatan Azrad 		struct mlx5_txq_data *txq = (*priv->txqs)[sm->queue_id];
41135c090eaSMatan Azrad 		struct mlx5_txq_ctrl *txq_ctrl =
41235c090eaSMatan Azrad 			container_of(txq, struct mlx5_txq_ctrl, txq);
4133a87b964SViacheslav Ovsiienko 
4145d9f3c3fSMichael Baum 		ret = priv->obj_ops.txq_obj_modify(txq_ctrl->obj,
4155d9f3c3fSMichael Baum 						   MLX5_TXQ_MOD_ERR2RDY,
4165d9f3c3fSMichael Baum 						   (uint8_t)priv->dev_port);
4175d9f3c3fSMichael Baum 		if (ret)
4183a87b964SViacheslav Ovsiienko 			return ret;
4193a87b964SViacheslav Ovsiienko 	}
4202d77cb61SMatan Azrad 	return 0;
4212d77cb61SMatan Azrad }
4222d77cb61SMatan Azrad 
4232d77cb61SMatan Azrad /**
4242d77cb61SMatan Azrad  * Modify a Verbs queue state.
4252d77cb61SMatan Azrad  *
4262d77cb61SMatan Azrad  * @param dev
4272d77cb61SMatan Azrad  *   Pointer to Ethernet device.
4282d77cb61SMatan Azrad  * @param sm
4292d77cb61SMatan Azrad  *   State modify request parameters.
4302d77cb61SMatan Azrad  *
4312d77cb61SMatan Azrad  * @return
4322d77cb61SMatan Azrad  *   0 in case of success else non-zero value.
4332d77cb61SMatan Azrad  */
434a96102c8SMichael Baum int
mlx5_queue_state_modify(struct rte_eth_dev * dev,struct mlx5_mp_arg_queue_state_modify * sm)4352d77cb61SMatan Azrad mlx5_queue_state_modify(struct rte_eth_dev *dev,
4362d77cb61SMatan Azrad 			struct mlx5_mp_arg_queue_state_modify *sm)
4372d77cb61SMatan Azrad {
438a4de9586SVu Pham 	struct mlx5_priv *priv = dev->data->dev_private;
4392d77cb61SMatan Azrad 	int ret = 0;
4402d77cb61SMatan Azrad 
4412d77cb61SMatan Azrad 	switch (rte_eal_process_type()) {
4422d77cb61SMatan Azrad 	case RTE_PROC_PRIMARY:
4432d77cb61SMatan Azrad 		ret = mlx5_queue_state_modify_primary(dev, sm);
4442d77cb61SMatan Azrad 		break;
4452d77cb61SMatan Azrad 	case RTE_PROC_SECONDARY:
446a4de9586SVu Pham 		ret = mlx5_mp_req_queue_state_modify(&priv->mp_id, sm);
4472d77cb61SMatan Azrad 		break;
4482d77cb61SMatan Azrad 	default:
4492d77cb61SMatan Azrad 		break;
4502d77cb61SMatan Azrad 	}
4512d77cb61SMatan Azrad 	return ret;
4522d77cb61SMatan Azrad }
453