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 80ea16068cSYongseok Koh uint32_t mlx5_ptype_table[] __rte_cache_aligned = { 81ea16068cSYongseok Koh [0xff] = RTE_PTYPE_ALL_MASK, /* Last entry for errored packet. */ 82ea16068cSYongseok Koh }; 83ea16068cSYongseok Koh 845f8ba81cSXueming Li uint8_t mlx5_cksum_table[1 << 10] __rte_cache_aligned; 855f8ba81cSXueming Li uint8_t mlx5_swp_types_table[1 << 10] __rte_cache_aligned; 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 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 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: 257*daa02b5cSOlivier Matz * bit[0] = RTE_MBUF_F_TX_TCP_SEG 258*daa02b5cSOlivier Matz * bit[2:3] = RTE_MBUF_F_TX_UDP_CKSUM, RTE_MBUF_F_TX_TCP_CKSUM 259*daa02b5cSOlivier Matz * bit[4] = RTE_MBUF_F_TX_IP_CKSUM 260*daa02b5cSOlivier 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 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: 295*daa02b5cSOlivier Matz * bit[0:1] = RTE_MBUF_F_TX_L4_MASK 296*daa02b5cSOlivier Matz * bit[4] = RTE_MBUF_F_TX_IPV6 297*daa02b5cSOlivier Matz * bit[8] = RTE_MBUF_F_TX_OUTER_IPV6 298*daa02b5cSOlivier 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; 308*daa02b5cSOlivier 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 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 /** 35784537d3cSDekel Peled * Modify a Verbs/DevX queue state. 3582d77cb61SMatan Azrad * This must be called from the primary process. 3592d77cb61SMatan Azrad * 3602d77cb61SMatan Azrad * @param dev 3612d77cb61SMatan Azrad * Pointer to Ethernet device. 3622d77cb61SMatan Azrad * @param sm 3632d77cb61SMatan Azrad * State modify request parameters. 3642d77cb61SMatan Azrad * 3652d77cb61SMatan Azrad * @return 3662d77cb61SMatan Azrad * 0 in case of success else non-zero value and rte_errno is set. 3672d77cb61SMatan Azrad */ 3682d77cb61SMatan Azrad int 3692d77cb61SMatan Azrad mlx5_queue_state_modify_primary(struct rte_eth_dev *dev, 3702d77cb61SMatan Azrad const struct mlx5_mp_arg_queue_state_modify *sm) 3712d77cb61SMatan Azrad { 3722d77cb61SMatan Azrad int ret; 3732d77cb61SMatan Azrad struct mlx5_priv *priv = dev->data->dev_private; 3742d77cb61SMatan Azrad 3752d77cb61SMatan Azrad if (sm->is_wq) { 3762d77cb61SMatan Azrad struct mlx5_rxq_data *rxq = (*priv->rxqs)[sm->queue_id]; 3772d77cb61SMatan Azrad struct mlx5_rxq_ctrl *rxq_ctrl = 3782d77cb61SMatan Azrad container_of(rxq, struct mlx5_rxq_ctrl, rxq); 3792d77cb61SMatan Azrad 3804c6d80f1SMichael Baum ret = priv->obj_ops.rxq_obj_modify(rxq_ctrl->obj, sm->state); 3812d77cb61SMatan Azrad if (ret) { 38206fa6988SDekel Peled DRV_LOG(ERR, "Cannot change Rx WQ state to %u - %s", 3832d77cb61SMatan Azrad sm->state, strerror(errno)); 3842d77cb61SMatan Azrad rte_errno = errno; 3852d77cb61SMatan Azrad return ret; 3862d77cb61SMatan Azrad } 38735c090eaSMatan Azrad } else { 38835c090eaSMatan Azrad struct mlx5_txq_data *txq = (*priv->txqs)[sm->queue_id]; 38935c090eaSMatan Azrad struct mlx5_txq_ctrl *txq_ctrl = 39035c090eaSMatan Azrad container_of(txq, struct mlx5_txq_ctrl, txq); 3913a87b964SViacheslav Ovsiienko 3925d9f3c3fSMichael Baum ret = priv->obj_ops.txq_obj_modify(txq_ctrl->obj, 3935d9f3c3fSMichael Baum MLX5_TXQ_MOD_ERR2RDY, 3945d9f3c3fSMichael Baum (uint8_t)priv->dev_port); 3955d9f3c3fSMichael Baum if (ret) 3963a87b964SViacheslav Ovsiienko return ret; 3973a87b964SViacheslav Ovsiienko } 3982d77cb61SMatan Azrad return 0; 3992d77cb61SMatan Azrad } 4002d77cb61SMatan Azrad 4012d77cb61SMatan Azrad /** 4022d77cb61SMatan Azrad * Modify a Verbs queue state. 4032d77cb61SMatan Azrad * 4042d77cb61SMatan Azrad * @param dev 4052d77cb61SMatan Azrad * Pointer to Ethernet device. 4062d77cb61SMatan Azrad * @param sm 4072d77cb61SMatan Azrad * State modify request parameters. 4082d77cb61SMatan Azrad * 4092d77cb61SMatan Azrad * @return 4102d77cb61SMatan Azrad * 0 in case of success else non-zero value. 4112d77cb61SMatan Azrad */ 412a96102c8SMichael Baum int 4132d77cb61SMatan Azrad mlx5_queue_state_modify(struct rte_eth_dev *dev, 4142d77cb61SMatan Azrad struct mlx5_mp_arg_queue_state_modify *sm) 4152d77cb61SMatan Azrad { 416a4de9586SVu Pham struct mlx5_priv *priv = dev->data->dev_private; 4172d77cb61SMatan Azrad int ret = 0; 4182d77cb61SMatan Azrad 4192d77cb61SMatan Azrad switch (rte_eal_process_type()) { 4202d77cb61SMatan Azrad case RTE_PROC_PRIMARY: 4212d77cb61SMatan Azrad ret = mlx5_queue_state_modify_primary(dev, sm); 4222d77cb61SMatan Azrad break; 4232d77cb61SMatan Azrad case RTE_PROC_SECONDARY: 424a4de9586SVu Pham ret = mlx5_mp_req_queue_state_modify(&priv->mp_id, sm); 4252d77cb61SMatan Azrad break; 4262d77cb61SMatan Azrad default: 4272d77cb61SMatan Azrad break; 4282d77cb61SMatan Azrad } 4292d77cb61SMatan Azrad return ret; 4302d77cb61SMatan Azrad } 431