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