1*10b69418SYevgeny Kliteynik // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB 2*10b69418SYevgeny Kliteynik /* Copyright (c) 2020 NVIDIA CORPORATION. All rights reserved. */ 3*10b69418SYevgeny Kliteynik 4*10b69418SYevgeny Kliteynik #include <linux/types.h> 5*10b69418SYevgeny Kliteynik #include "mlx5_ifc_dr_ste_v1.h" 6*10b69418SYevgeny Kliteynik #include "dr_ste.h" 7*10b69418SYevgeny Kliteynik 8*10b69418SYevgeny Kliteynik #define DR_STE_CALC_DFNR_TYPE(lookup_type, inner) \ 9*10b69418SYevgeny Kliteynik ((inner) ? DR_STE_V1_LU_TYPE_##lookup_type##_I : \ 10*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_##lookup_type##_O) 11*10b69418SYevgeny Kliteynik 12*10b69418SYevgeny Kliteynik enum dr_ste_v1_entry_format { 13*10b69418SYevgeny Kliteynik DR_STE_V1_TYPE_BWC_BYTE = 0x0, 14*10b69418SYevgeny Kliteynik DR_STE_V1_TYPE_BWC_DW = 0x1, 15*10b69418SYevgeny Kliteynik DR_STE_V1_TYPE_MATCH = 0x2, 16*10b69418SYevgeny Kliteynik }; 17*10b69418SYevgeny Kliteynik 18*10b69418SYevgeny Kliteynik /* Lookup type is built from 2B: [ Definer mode 1B ][ Definer index 1B ] */ 19*10b69418SYevgeny Kliteynik enum { 20*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_NOP = 0x0000, 21*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_TNL = 0x0002, 22*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IBL3_EXT = 0x0102, 23*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_O = 0x0003, 24*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IBL4 = 0x0103, 25*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_I = 0x0004, 26*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_SRC_QP_GVMI = 0x0104, 27*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_O = 0x0005, 28*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_HEADERS_O = 0x0105, 29*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_I = 0x0006, 30*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_HEADERS_I = 0x0106, 31*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_5_TUPLE_O = 0x0007, 32*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_DES_O = 0x0107, 33*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_5_TUPLE_I = 0x0008, 34*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_DES_I = 0x0108, 35*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_O = 0x0009, 36*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_SRC_O = 0x0109, 37*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_I = 0x000a, 38*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_SRC_I = 0x010a, 39*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_DST_O = 0x000b, 40*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_MPLS_O = 0x010b, 41*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_DST_I = 0x000c, 42*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_MPLS_I = 0x010c, 43*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_MISC_O = 0x000d, 44*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_GRE = 0x010d, 45*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER = 0x000e, 46*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_GENERAL_PURPOSE = 0x010e, 47*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_MISC_I = 0x000f, 48*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_STEERING_REGISTERS_0 = 0x010f, 49*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_STEERING_REGISTERS_1 = 0x0110, 50*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0 = 0x0111, 51*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 = 0x0112, 52*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_MISC_O = 0x0113, 53*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_MISC_I = 0x0114, 54*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_INVALID = 0x00ff, 55*10b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_DONT_CARE = MLX5DR_STE_LU_TYPE_DONT_CARE, 56*10b69418SYevgeny Kliteynik }; 57*10b69418SYevgeny Kliteynik 58*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_dst_bit_mask(struct mlx5dr_match_param *value, 59*10b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 60*10b69418SYevgeny Kliteynik { 61*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 62*10b69418SYevgeny Kliteynik 63*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 64*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 65*10b69418SYevgeny Kliteynik 66*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, smac_47_16, mask, smac_47_16); 67*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, smac_15_0, mask, smac_15_0); 68*10b69418SYevgeny Kliteynik 69*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_vlan_id, mask, first_vid); 70*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_cfi, mask, first_cfi); 71*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_priority, mask, first_prio); 72*10b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_src_dst_v1, bit_mask, l3_type, mask, ip_version); 73*10b69418SYevgeny Kliteynik 74*10b69418SYevgeny Kliteynik if (mask->cvlan_tag) { 75*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, bit_mask, first_vlan_qualifier, -1); 76*10b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 77*10b69418SYevgeny Kliteynik } else if (mask->svlan_tag) { 78*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, bit_mask, first_vlan_qualifier, -1); 79*10b69418SYevgeny Kliteynik mask->svlan_tag = 0; 80*10b69418SYevgeny Kliteynik } 81*10b69418SYevgeny Kliteynik } 82*10b69418SYevgeny Kliteynik 83*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_dst_tag(struct mlx5dr_match_param *value, 84*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 85*10b69418SYevgeny Kliteynik u8 *tag) 86*10b69418SYevgeny Kliteynik { 87*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 88*10b69418SYevgeny Kliteynik 89*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, dmac_47_16, spec, dmac_47_16); 90*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, dmac_15_0, spec, dmac_15_0); 91*10b69418SYevgeny Kliteynik 92*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, smac_47_16, spec, smac_47_16); 93*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, smac_15_0, spec, smac_15_0); 94*10b69418SYevgeny Kliteynik 95*10b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 96*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, l3_type, STE_IPV4); 97*10b69418SYevgeny Kliteynik spec->ip_version = 0; 98*10b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 99*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, l3_type, STE_IPV6); 100*10b69418SYevgeny Kliteynik spec->ip_version = 0; 101*10b69418SYevgeny Kliteynik } else if (spec->ip_version) { 102*10b69418SYevgeny Kliteynik return -EINVAL; 103*10b69418SYevgeny Kliteynik } 104*10b69418SYevgeny Kliteynik 105*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_vlan_id, spec, first_vid); 106*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_cfi, spec, first_cfi); 107*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_priority, spec, first_prio); 108*10b69418SYevgeny Kliteynik 109*10b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 110*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 111*10b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 112*10b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 113*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 114*10b69418SYevgeny Kliteynik spec->svlan_tag = 0; 115*10b69418SYevgeny Kliteynik } 116*10b69418SYevgeny Kliteynik return 0; 117*10b69418SYevgeny Kliteynik } 118*10b69418SYevgeny Kliteynik 119*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_dst_init(struct mlx5dr_ste_build *sb, 120*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 121*10b69418SYevgeny Kliteynik { 122*10b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_dst_bit_mask(mask, sb->inner, sb->bit_mask); 123*10b69418SYevgeny Kliteynik 124*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2_SRC_DST, sb->inner); 125*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 126*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_src_dst_tag; 127*10b69418SYevgeny Kliteynik } 128*10b69418SYevgeny Kliteynik 129*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv6_dst_tag(struct mlx5dr_match_param *value, 130*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 131*10b69418SYevgeny Kliteynik u8 *tag) 132*10b69418SYevgeny Kliteynik { 133*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 134*10b69418SYevgeny Kliteynik 135*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_127_96, spec, dst_ip_127_96); 136*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_95_64, spec, dst_ip_95_64); 137*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_63_32, spec, dst_ip_63_32); 138*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_31_0, spec, dst_ip_31_0); 139*10b69418SYevgeny Kliteynik 140*10b69418SYevgeny Kliteynik return 0; 141*10b69418SYevgeny Kliteynik } 142*10b69418SYevgeny Kliteynik 143*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv6_dst_init(struct mlx5dr_ste_build *sb, 144*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 145*10b69418SYevgeny Kliteynik { 146*10b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv6_dst_tag(mask, sb, sb->bit_mask); 147*10b69418SYevgeny Kliteynik 148*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(IPV6_DES, sb->inner); 149*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 150*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv6_dst_tag; 151*10b69418SYevgeny Kliteynik } 152*10b69418SYevgeny Kliteynik 153*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv6_src_tag(struct mlx5dr_match_param *value, 154*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 155*10b69418SYevgeny Kliteynik u8 *tag) 156*10b69418SYevgeny Kliteynik { 157*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 158*10b69418SYevgeny Kliteynik 159*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_127_96, spec, src_ip_127_96); 160*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_95_64, spec, src_ip_95_64); 161*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_63_32, spec, src_ip_63_32); 162*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_31_0, spec, src_ip_31_0); 163*10b69418SYevgeny Kliteynik 164*10b69418SYevgeny Kliteynik return 0; 165*10b69418SYevgeny Kliteynik } 166*10b69418SYevgeny Kliteynik 167*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv6_src_init(struct mlx5dr_ste_build *sb, 168*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 169*10b69418SYevgeny Kliteynik { 170*10b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv6_src_tag(mask, sb, sb->bit_mask); 171*10b69418SYevgeny Kliteynik 172*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(IPV6_SRC, sb->inner); 173*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 174*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv6_src_tag; 175*10b69418SYevgeny Kliteynik } 176*10b69418SYevgeny Kliteynik 177*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag(struct mlx5dr_match_param *value, 178*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 179*10b69418SYevgeny Kliteynik u8 *tag) 180*10b69418SYevgeny Kliteynik { 181*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 182*10b69418SYevgeny Kliteynik 183*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_address, spec, dst_ip_31_0); 184*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_address, spec, src_ip_31_0); 185*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_port, spec, tcp_dport); 186*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_port, spec, udp_dport); 187*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_port, spec, tcp_sport); 188*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_port, spec, udp_sport); 189*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, protocol, spec, ip_protocol); 190*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, fragmented, spec, frag); 191*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, dscp, spec, ip_dscp); 192*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, ecn, spec, ip_ecn); 193*10b69418SYevgeny Kliteynik 194*10b69418SYevgeny Kliteynik if (spec->tcp_flags) { 195*10b69418SYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l3_ipv4_5_tuple_v1, tag, spec); 196*10b69418SYevgeny Kliteynik spec->tcp_flags = 0; 197*10b69418SYevgeny Kliteynik } 198*10b69418SYevgeny Kliteynik 199*10b69418SYevgeny Kliteynik return 0; 200*10b69418SYevgeny Kliteynik } 201*10b69418SYevgeny Kliteynik 202*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv4_5_tuple_init(struct mlx5dr_ste_build *sb, 203*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 204*10b69418SYevgeny Kliteynik { 205*10b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag(mask, sb, sb->bit_mask); 206*10b69418SYevgeny Kliteynik 207*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL3_IPV4_5_TUPLE, sb->inner); 208*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 209*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag; 210*10b69418SYevgeny Kliteynik } 211*10b69418SYevgeny Kliteynik 212*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(struct mlx5dr_match_param *value, 213*10b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 214*10b69418SYevgeny Kliteynik { 215*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 216*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 217*10b69418SYevgeny Kliteynik 218*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_vlan_id, mask, first_vid); 219*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_cfi, mask, first_cfi); 220*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_priority, mask, first_prio); 221*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, ip_fragmented, mask, frag); // ? 222*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, l3_ethertype, mask, ethertype); // ? 223*10b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_src_v1, bit_mask, l3_type, mask, ip_version); 224*10b69418SYevgeny Kliteynik 225*10b69418SYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 226*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, first_vlan_qualifier, -1); 227*10b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 228*10b69418SYevgeny Kliteynik mask->svlan_tag = 0; 229*10b69418SYevgeny Kliteynik } 230*10b69418SYevgeny Kliteynik 231*10b69418SYevgeny Kliteynik if (inner) { 232*10b69418SYevgeny Kliteynik if (misc_mask->inner_second_cvlan_tag || 233*10b69418SYevgeny Kliteynik misc_mask->inner_second_svlan_tag) { 234*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, second_vlan_qualifier, -1); 235*10b69418SYevgeny Kliteynik misc_mask->inner_second_cvlan_tag = 0; 236*10b69418SYevgeny Kliteynik misc_mask->inner_second_svlan_tag = 0; 237*10b69418SYevgeny Kliteynik } 238*10b69418SYevgeny Kliteynik 239*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 240*10b69418SYevgeny Kliteynik second_vlan_id, misc_mask, inner_second_vid); 241*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 242*10b69418SYevgeny Kliteynik second_cfi, misc_mask, inner_second_cfi); 243*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 244*10b69418SYevgeny Kliteynik second_priority, misc_mask, inner_second_prio); 245*10b69418SYevgeny Kliteynik } else { 246*10b69418SYevgeny Kliteynik if (misc_mask->outer_second_cvlan_tag || 247*10b69418SYevgeny Kliteynik misc_mask->outer_second_svlan_tag) { 248*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, second_vlan_qualifier, -1); 249*10b69418SYevgeny Kliteynik misc_mask->outer_second_cvlan_tag = 0; 250*10b69418SYevgeny Kliteynik misc_mask->outer_second_svlan_tag = 0; 251*10b69418SYevgeny Kliteynik } 252*10b69418SYevgeny Kliteynik 253*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 254*10b69418SYevgeny Kliteynik second_vlan_id, misc_mask, outer_second_vid); 255*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 256*10b69418SYevgeny Kliteynik second_cfi, misc_mask, outer_second_cfi); 257*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 258*10b69418SYevgeny Kliteynik second_priority, misc_mask, outer_second_prio); 259*10b69418SYevgeny Kliteynik } 260*10b69418SYevgeny Kliteynik } 261*10b69418SYevgeny Kliteynik 262*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_or_dst_tag(struct mlx5dr_match_param *value, 263*10b69418SYevgeny Kliteynik bool inner, u8 *tag) 264*10b69418SYevgeny Kliteynik { 265*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = inner ? &value->inner : &value->outer; 266*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_spec = &value->misc; 267*10b69418SYevgeny Kliteynik 268*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_vlan_id, spec, first_vid); 269*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_cfi, spec, first_cfi); 270*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_priority, spec, first_prio); 271*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, ip_fragmented, spec, frag); 272*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, l3_ethertype, spec, ethertype); 273*10b69418SYevgeny Kliteynik 274*10b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 275*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, l3_type, STE_IPV4); 276*10b69418SYevgeny Kliteynik spec->ip_version = 0; 277*10b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 278*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, l3_type, STE_IPV6); 279*10b69418SYevgeny Kliteynik spec->ip_version = 0; 280*10b69418SYevgeny Kliteynik } else if (spec->ip_version) { 281*10b69418SYevgeny Kliteynik return -EINVAL; 282*10b69418SYevgeny Kliteynik } 283*10b69418SYevgeny Kliteynik 284*10b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 285*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 286*10b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 287*10b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 288*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 289*10b69418SYevgeny Kliteynik spec->svlan_tag = 0; 290*10b69418SYevgeny Kliteynik } 291*10b69418SYevgeny Kliteynik 292*10b69418SYevgeny Kliteynik if (inner) { 293*10b69418SYevgeny Kliteynik if (misc_spec->inner_second_cvlan_tag) { 294*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_CVLAN); 295*10b69418SYevgeny Kliteynik misc_spec->inner_second_cvlan_tag = 0; 296*10b69418SYevgeny Kliteynik } else if (misc_spec->inner_second_svlan_tag) { 297*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_SVLAN); 298*10b69418SYevgeny Kliteynik misc_spec->inner_second_svlan_tag = 0; 299*10b69418SYevgeny Kliteynik } 300*10b69418SYevgeny Kliteynik 301*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_vlan_id, misc_spec, inner_second_vid); 302*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_cfi, misc_spec, inner_second_cfi); 303*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_priority, misc_spec, inner_second_prio); 304*10b69418SYevgeny Kliteynik } else { 305*10b69418SYevgeny Kliteynik if (misc_spec->outer_second_cvlan_tag) { 306*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_CVLAN); 307*10b69418SYevgeny Kliteynik misc_spec->outer_second_cvlan_tag = 0; 308*10b69418SYevgeny Kliteynik } else if (misc_spec->outer_second_svlan_tag) { 309*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_SVLAN); 310*10b69418SYevgeny Kliteynik misc_spec->outer_second_svlan_tag = 0; 311*10b69418SYevgeny Kliteynik } 312*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_vlan_id, misc_spec, outer_second_vid); 313*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_cfi, misc_spec, outer_second_cfi); 314*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_priority, misc_spec, outer_second_prio); 315*10b69418SYevgeny Kliteynik } 316*10b69418SYevgeny Kliteynik 317*10b69418SYevgeny Kliteynik return 0; 318*10b69418SYevgeny Kliteynik } 319*10b69418SYevgeny Kliteynik 320*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_bit_mask(struct mlx5dr_match_param *value, 321*10b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 322*10b69418SYevgeny Kliteynik { 323*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 324*10b69418SYevgeny Kliteynik 325*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, smac_47_16, mask, smac_47_16); 326*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, smac_15_0, mask, smac_15_0); 327*10b69418SYevgeny Kliteynik 328*10b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 329*10b69418SYevgeny Kliteynik } 330*10b69418SYevgeny Kliteynik 331*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_tag(struct mlx5dr_match_param *value, 332*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 333*10b69418SYevgeny Kliteynik u8 *tag) 334*10b69418SYevgeny Kliteynik { 335*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 336*10b69418SYevgeny Kliteynik 337*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, smac_47_16, spec, smac_47_16); 338*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, smac_15_0, spec, smac_15_0); 339*10b69418SYevgeny Kliteynik 340*10b69418SYevgeny Kliteynik return dr_ste_v1_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 341*10b69418SYevgeny Kliteynik } 342*10b69418SYevgeny Kliteynik 343*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_init(struct mlx5dr_ste_build *sb, 344*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 345*10b69418SYevgeny Kliteynik { 346*10b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_bit_mask(mask, sb->inner, sb->bit_mask); 347*10b69418SYevgeny Kliteynik 348*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2_SRC, sb->inner); 349*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 350*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_src_tag; 351*10b69418SYevgeny Kliteynik } 352*10b69418SYevgeny Kliteynik 353*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_dst_bit_mask(struct mlx5dr_match_param *value, 354*10b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 355*10b69418SYevgeny Kliteynik { 356*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 357*10b69418SYevgeny Kliteynik 358*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 359*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 360*10b69418SYevgeny Kliteynik 361*10b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 362*10b69418SYevgeny Kliteynik } 363*10b69418SYevgeny Kliteynik 364*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_dst_tag(struct mlx5dr_match_param *value, 365*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 366*10b69418SYevgeny Kliteynik u8 *tag) 367*10b69418SYevgeny Kliteynik { 368*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 369*10b69418SYevgeny Kliteynik 370*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, tag, dmac_47_16, spec, dmac_47_16); 371*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, tag, dmac_15_0, spec, dmac_15_0); 372*10b69418SYevgeny Kliteynik 373*10b69418SYevgeny Kliteynik return dr_ste_v1_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 374*10b69418SYevgeny Kliteynik } 375*10b69418SYevgeny Kliteynik 376*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_dst_init(struct mlx5dr_ste_build *sb, 377*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 378*10b69418SYevgeny Kliteynik { 379*10b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_dst_bit_mask(mask, sb->inner, sb->bit_mask); 380*10b69418SYevgeny Kliteynik 381*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2, sb->inner); 382*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 383*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_dst_tag; 384*10b69418SYevgeny Kliteynik } 385*10b69418SYevgeny Kliteynik 386*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_tnl_bit_mask(struct mlx5dr_match_param *value, 387*10b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 388*10b69418SYevgeny Kliteynik { 389*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 390*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 391*10b69418SYevgeny Kliteynik 392*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 393*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 394*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_vlan_id, mask, first_vid); 395*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_cfi, mask, first_cfi); 396*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_priority, mask, first_prio); 397*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, ip_fragmented, mask, frag); 398*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, l3_ethertype, mask, ethertype); 399*10b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_tnl_v1, bit_mask, l3_type, mask, ip_version); 400*10b69418SYevgeny Kliteynik 401*10b69418SYevgeny Kliteynik if (misc->vxlan_vni) { 402*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, bit_mask, 403*10b69418SYevgeny Kliteynik l2_tunneling_network_id, (misc->vxlan_vni << 8)); 404*10b69418SYevgeny Kliteynik misc->vxlan_vni = 0; 405*10b69418SYevgeny Kliteynik } 406*10b69418SYevgeny Kliteynik 407*10b69418SYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 408*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, bit_mask, first_vlan_qualifier, -1); 409*10b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 410*10b69418SYevgeny Kliteynik mask->svlan_tag = 0; 411*10b69418SYevgeny Kliteynik } 412*10b69418SYevgeny Kliteynik } 413*10b69418SYevgeny Kliteynik 414*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_tnl_tag(struct mlx5dr_match_param *value, 415*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 416*10b69418SYevgeny Kliteynik u8 *tag) 417*10b69418SYevgeny Kliteynik { 418*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 419*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 420*10b69418SYevgeny Kliteynik 421*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, dmac_47_16, spec, dmac_47_16); 422*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, dmac_15_0, spec, dmac_15_0); 423*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_vlan_id, spec, first_vid); 424*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_cfi, spec, first_cfi); 425*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, ip_fragmented, spec, frag); 426*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_priority, spec, first_prio); 427*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, l3_ethertype, spec, ethertype); 428*10b69418SYevgeny Kliteynik 429*10b69418SYevgeny Kliteynik if (misc->vxlan_vni) { 430*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l2_tunneling_network_id, 431*10b69418SYevgeny Kliteynik (misc->vxlan_vni << 8)); 432*10b69418SYevgeny Kliteynik misc->vxlan_vni = 0; 433*10b69418SYevgeny Kliteynik } 434*10b69418SYevgeny Kliteynik 435*10b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 436*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 437*10b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 438*10b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 439*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 440*10b69418SYevgeny Kliteynik spec->svlan_tag = 0; 441*10b69418SYevgeny Kliteynik } 442*10b69418SYevgeny Kliteynik 443*10b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 444*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l3_type, STE_IPV4); 445*10b69418SYevgeny Kliteynik spec->ip_version = 0; 446*10b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 447*10b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l3_type, STE_IPV6); 448*10b69418SYevgeny Kliteynik spec->ip_version = 0; 449*10b69418SYevgeny Kliteynik } else if (spec->ip_version) { 450*10b69418SYevgeny Kliteynik return -EINVAL; 451*10b69418SYevgeny Kliteynik } 452*10b69418SYevgeny Kliteynik 453*10b69418SYevgeny Kliteynik return 0; 454*10b69418SYevgeny Kliteynik } 455*10b69418SYevgeny Kliteynik 456*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_tnl_init(struct mlx5dr_ste_build *sb, 457*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 458*10b69418SYevgeny Kliteynik { 459*10b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_tnl_bit_mask(mask, sb->inner, sb->bit_mask); 460*10b69418SYevgeny Kliteynik 461*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL2_TNL; 462*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 463*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_tnl_tag; 464*10b69418SYevgeny Kliteynik } 465*10b69418SYevgeny Kliteynik 466*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv4_misc_tag(struct mlx5dr_match_param *value, 467*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 468*10b69418SYevgeny Kliteynik u8 *tag) 469*10b69418SYevgeny Kliteynik { 470*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 471*10b69418SYevgeny Kliteynik 472*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_misc_v1, tag, time_to_live, spec, ttl_hoplimit); 473*10b69418SYevgeny Kliteynik 474*10b69418SYevgeny Kliteynik return 0; 475*10b69418SYevgeny Kliteynik } 476*10b69418SYevgeny Kliteynik 477*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv4_misc_init(struct mlx5dr_ste_build *sb, 478*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 479*10b69418SYevgeny Kliteynik { 480*10b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv4_misc_tag(mask, sb, sb->bit_mask); 481*10b69418SYevgeny Kliteynik 482*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL3_IPV4_MISC, sb->inner); 483*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 484*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv4_misc_tag; 485*10b69418SYevgeny Kliteynik } 486*10b69418SYevgeny Kliteynik 487*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_ipv6_l3_l4_tag(struct mlx5dr_match_param *value, 488*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 489*10b69418SYevgeny Kliteynik u8 *tag) 490*10b69418SYevgeny Kliteynik { 491*10b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 492*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 493*10b69418SYevgeny Kliteynik 494*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dst_port, spec, tcp_dport); 495*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, src_port, spec, tcp_sport); 496*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dst_port, spec, udp_dport); 497*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, src_port, spec, udp_sport); 498*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, protocol, spec, ip_protocol); 499*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, fragmented, spec, frag); 500*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dscp, spec, ip_dscp); 501*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, ecn, spec, ip_ecn); 502*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, ipv6_hop_limit, spec, ttl_hoplimit); 503*10b69418SYevgeny Kliteynik 504*10b69418SYevgeny Kliteynik if (sb->inner) 505*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, flow_label, misc, inner_ipv6_flow_label); 506*10b69418SYevgeny Kliteynik else 507*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, flow_label, misc, outer_ipv6_flow_label); 508*10b69418SYevgeny Kliteynik 509*10b69418SYevgeny Kliteynik if (spec->tcp_flags) { 510*10b69418SYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l4_v1, tag, spec); 511*10b69418SYevgeny Kliteynik spec->tcp_flags = 0; 512*10b69418SYevgeny Kliteynik } 513*10b69418SYevgeny Kliteynik 514*10b69418SYevgeny Kliteynik return 0; 515*10b69418SYevgeny Kliteynik } 516*10b69418SYevgeny Kliteynik 517*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_ipv6_l3_l4_init(struct mlx5dr_ste_build *sb, 518*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 519*10b69418SYevgeny Kliteynik { 520*10b69418SYevgeny Kliteynik dr_ste_v1_build_eth_ipv6_l3_l4_tag(mask, sb, sb->bit_mask); 521*10b69418SYevgeny Kliteynik 522*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL4, sb->inner); 523*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 524*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_ipv6_l3_l4_tag; 525*10b69418SYevgeny Kliteynik } 526*10b69418SYevgeny Kliteynik 527*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_mpls_tag(struct mlx5dr_match_param *value, 528*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 529*10b69418SYevgeny Kliteynik u8 *tag) 530*10b69418SYevgeny Kliteynik { 531*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 532*10b69418SYevgeny Kliteynik 533*10b69418SYevgeny Kliteynik if (sb->inner) 534*10b69418SYevgeny Kliteynik DR_STE_SET_MPLS(mpls_v1, misc2, inner, tag); 535*10b69418SYevgeny Kliteynik else 536*10b69418SYevgeny Kliteynik DR_STE_SET_MPLS(mpls_v1, misc2, outer, tag); 537*10b69418SYevgeny Kliteynik 538*10b69418SYevgeny Kliteynik return 0; 539*10b69418SYevgeny Kliteynik } 540*10b69418SYevgeny Kliteynik 541*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_mpls_init(struct mlx5dr_ste_build *sb, 542*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 543*10b69418SYevgeny Kliteynik { 544*10b69418SYevgeny Kliteynik dr_ste_v1_build_mpls_tag(mask, sb, sb->bit_mask); 545*10b69418SYevgeny Kliteynik 546*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(MPLS, sb->inner); 547*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 548*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_mpls_tag; 549*10b69418SYevgeny Kliteynik } 550*10b69418SYevgeny Kliteynik 551*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_tnl_gre_tag(struct mlx5dr_match_param *value, 552*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 553*10b69418SYevgeny Kliteynik u8 *tag) 554*10b69418SYevgeny Kliteynik { 555*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 556*10b69418SYevgeny Kliteynik 557*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_protocol, misc, gre_protocol); 558*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_k_present, misc, gre_k_present); 559*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_key_h, misc, gre_key_h); 560*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_key_l, misc, gre_key_l); 561*10b69418SYevgeny Kliteynik 562*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_c_present, misc, gre_c_present); 563*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_s_present, misc, gre_s_present); 564*10b69418SYevgeny Kliteynik 565*10b69418SYevgeny Kliteynik return 0; 566*10b69418SYevgeny Kliteynik } 567*10b69418SYevgeny Kliteynik 568*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_tnl_gre_init(struct mlx5dr_ste_build *sb, 569*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 570*10b69418SYevgeny Kliteynik { 571*10b69418SYevgeny Kliteynik dr_ste_v1_build_tnl_gre_tag(mask, sb, sb->bit_mask); 572*10b69418SYevgeny Kliteynik 573*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_GRE; 574*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 575*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_gre_tag; 576*10b69418SYevgeny Kliteynik } 577*10b69418SYevgeny Kliteynik 578*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_tnl_mpls_tag(struct mlx5dr_match_param *value, 579*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 580*10b69418SYevgeny Kliteynik u8 *tag) 581*10b69418SYevgeny Kliteynik { 582*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 583*10b69418SYevgeny Kliteynik 584*10b69418SYevgeny Kliteynik if (DR_STE_IS_OUTER_MPLS_OVER_GRE_SET(misc2)) { 585*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_label, 586*10b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_label); 587*10b69418SYevgeny Kliteynik 588*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_exp, 589*10b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_exp); 590*10b69418SYevgeny Kliteynik 591*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_s_bos, 592*10b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_s_bos); 593*10b69418SYevgeny Kliteynik 594*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_ttl, 595*10b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_ttl); 596*10b69418SYevgeny Kliteynik } else { 597*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_label, 598*10b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_label); 599*10b69418SYevgeny Kliteynik 600*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_exp, 601*10b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_exp); 602*10b69418SYevgeny Kliteynik 603*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_s_bos, 604*10b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_s_bos); 605*10b69418SYevgeny Kliteynik 606*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_ttl, 607*10b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_ttl); 608*10b69418SYevgeny Kliteynik } 609*10b69418SYevgeny Kliteynik 610*10b69418SYevgeny Kliteynik return 0; 611*10b69418SYevgeny Kliteynik } 612*10b69418SYevgeny Kliteynik 613*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_tnl_mpls_init(struct mlx5dr_ste_build *sb, 614*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 615*10b69418SYevgeny Kliteynik { 616*10b69418SYevgeny Kliteynik dr_ste_v1_build_tnl_mpls_tag(mask, sb, sb->bit_mask); 617*10b69418SYevgeny Kliteynik 618*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_MPLS_I; 619*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 620*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_mpls_tag; 621*10b69418SYevgeny Kliteynik } 622*10b69418SYevgeny Kliteynik 623*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_icmp_tag(struct mlx5dr_match_param *value, 624*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 625*10b69418SYevgeny Kliteynik u8 *tag) 626*10b69418SYevgeny Kliteynik { 627*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 628*10b69418SYevgeny Kliteynik bool is_ipv4 = DR_MASK_IS_ICMPV4_SET(misc3); 629*10b69418SYevgeny Kliteynik u32 *icmp_header_data; 630*10b69418SYevgeny Kliteynik u8 *icmp_type; 631*10b69418SYevgeny Kliteynik u8 *icmp_code; 632*10b69418SYevgeny Kliteynik 633*10b69418SYevgeny Kliteynik if (is_ipv4) { 634*10b69418SYevgeny Kliteynik icmp_header_data = &misc3->icmpv4_header_data; 635*10b69418SYevgeny Kliteynik icmp_type = &misc3->icmpv4_type; 636*10b69418SYevgeny Kliteynik icmp_code = &misc3->icmpv4_code; 637*10b69418SYevgeny Kliteynik } else { 638*10b69418SYevgeny Kliteynik icmp_header_data = &misc3->icmpv6_header_data; 639*10b69418SYevgeny Kliteynik icmp_type = &misc3->icmpv6_type; 640*10b69418SYevgeny Kliteynik icmp_code = &misc3->icmpv6_code; 641*10b69418SYevgeny Kliteynik } 642*10b69418SYevgeny Kliteynik 643*10b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_header_data, *icmp_header_data); 644*10b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_type, *icmp_type); 645*10b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_code, *icmp_code); 646*10b69418SYevgeny Kliteynik 647*10b69418SYevgeny Kliteynik *icmp_header_data = 0; 648*10b69418SYevgeny Kliteynik *icmp_type = 0; 649*10b69418SYevgeny Kliteynik *icmp_code = 0; 650*10b69418SYevgeny Kliteynik 651*10b69418SYevgeny Kliteynik return 0; 652*10b69418SYevgeny Kliteynik } 653*10b69418SYevgeny Kliteynik 654*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_icmp_init(struct mlx5dr_ste_build *sb, 655*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 656*10b69418SYevgeny Kliteynik { 657*10b69418SYevgeny Kliteynik dr_ste_v1_build_icmp_tag(mask, sb, sb->bit_mask); 658*10b69418SYevgeny Kliteynik 659*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL4_MISC_O; 660*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 661*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_icmp_tag; 662*10b69418SYevgeny Kliteynik 663*10b69418SYevgeny Kliteynik return 0; 664*10b69418SYevgeny Kliteynik } 665*10b69418SYevgeny Kliteynik 666*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_general_purpose_tag(struct mlx5dr_match_param *value, 667*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 668*10b69418SYevgeny Kliteynik u8 *tag) 669*10b69418SYevgeny Kliteynik { 670*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 671*10b69418SYevgeny Kliteynik 672*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(general_purpose, tag, general_purpose_lookup_field, 673*10b69418SYevgeny Kliteynik misc2, metadata_reg_a); 674*10b69418SYevgeny Kliteynik 675*10b69418SYevgeny Kliteynik return 0; 676*10b69418SYevgeny Kliteynik } 677*10b69418SYevgeny Kliteynik 678*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_general_purpose_init(struct mlx5dr_ste_build *sb, 679*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 680*10b69418SYevgeny Kliteynik { 681*10b69418SYevgeny Kliteynik dr_ste_v1_build_general_purpose_tag(mask, sb, sb->bit_mask); 682*10b69418SYevgeny Kliteynik 683*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_GENERAL_PURPOSE; 684*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 685*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_general_purpose_tag; 686*10b69418SYevgeny Kliteynik } 687*10b69418SYevgeny Kliteynik 688*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l4_misc_tag(struct mlx5dr_match_param *value, 689*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 690*10b69418SYevgeny Kliteynik u8 *tag) 691*10b69418SYevgeny Kliteynik { 692*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 693*10b69418SYevgeny Kliteynik 694*10b69418SYevgeny Kliteynik if (sb->inner) { 695*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, seq_num, misc3, inner_tcp_seq_num); 696*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, ack_num, misc3, inner_tcp_ack_num); 697*10b69418SYevgeny Kliteynik } else { 698*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, seq_num, misc3, outer_tcp_seq_num); 699*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, ack_num, misc3, outer_tcp_ack_num); 700*10b69418SYevgeny Kliteynik } 701*10b69418SYevgeny Kliteynik 702*10b69418SYevgeny Kliteynik return 0; 703*10b69418SYevgeny Kliteynik } 704*10b69418SYevgeny Kliteynik 705*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l4_misc_init(struct mlx5dr_ste_build *sb, 706*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 707*10b69418SYevgeny Kliteynik { 708*10b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l4_misc_tag(mask, sb, sb->bit_mask); 709*10b69418SYevgeny Kliteynik 710*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL4_MISC_O; 711*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 712*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l4_misc_tag; 713*10b69418SYevgeny Kliteynik } 714*10b69418SYevgeny Kliteynik 715*10b69418SYevgeny Kliteynik static int 716*10b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag(struct mlx5dr_match_param *value, 717*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 718*10b69418SYevgeny Kliteynik u8 *tag) 719*10b69418SYevgeny Kliteynik { 720*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 721*10b69418SYevgeny Kliteynik 722*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 723*10b69418SYevgeny Kliteynik outer_vxlan_gpe_flags, misc3, 724*10b69418SYevgeny Kliteynik outer_vxlan_gpe_flags); 725*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 726*10b69418SYevgeny Kliteynik outer_vxlan_gpe_next_protocol, misc3, 727*10b69418SYevgeny Kliteynik outer_vxlan_gpe_next_protocol); 728*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 729*10b69418SYevgeny Kliteynik outer_vxlan_gpe_vni, misc3, 730*10b69418SYevgeny Kliteynik outer_vxlan_gpe_vni); 731*10b69418SYevgeny Kliteynik 732*10b69418SYevgeny Kliteynik return 0; 733*10b69418SYevgeny Kliteynik } 734*10b69418SYevgeny Kliteynik 735*10b69418SYevgeny Kliteynik static void 736*10b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_init(struct mlx5dr_ste_build *sb, 737*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 738*10b69418SYevgeny Kliteynik { 739*10b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag(mask, sb, sb->bit_mask); 740*10b69418SYevgeny Kliteynik 741*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 742*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 743*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag; 744*10b69418SYevgeny Kliteynik } 745*10b69418SYevgeny Kliteynik 746*10b69418SYevgeny Kliteynik static int 747*10b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tag(struct mlx5dr_match_param *value, 748*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 749*10b69418SYevgeny Kliteynik u8 *tag) 750*10b69418SYevgeny Kliteynik { 751*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 752*10b69418SYevgeny Kliteynik 753*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 754*10b69418SYevgeny Kliteynik geneve_protocol_type, misc, geneve_protocol_type); 755*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 756*10b69418SYevgeny Kliteynik geneve_oam, misc, geneve_oam); 757*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 758*10b69418SYevgeny Kliteynik geneve_opt_len, misc, geneve_opt_len); 759*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 760*10b69418SYevgeny Kliteynik geneve_vni, misc, geneve_vni); 761*10b69418SYevgeny Kliteynik 762*10b69418SYevgeny Kliteynik return 0; 763*10b69418SYevgeny Kliteynik } 764*10b69418SYevgeny Kliteynik 765*10b69418SYevgeny Kliteynik static void 766*10b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_init(struct mlx5dr_ste_build *sb, 767*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 768*10b69418SYevgeny Kliteynik { 769*10b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tag(mask, sb, sb->bit_mask); 770*10b69418SYevgeny Kliteynik 771*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 772*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 773*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_geneve_tag; 774*10b69418SYevgeny Kliteynik } 775*10b69418SYevgeny Kliteynik 776*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_register_0_tag(struct mlx5dr_match_param *value, 777*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 778*10b69418SYevgeny Kliteynik u8 *tag) 779*10b69418SYevgeny Kliteynik { 780*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 781*10b69418SYevgeny Kliteynik 782*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_h, misc2, metadata_reg_c_0); 783*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_l, misc2, metadata_reg_c_1); 784*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_h, misc2, metadata_reg_c_2); 785*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_l, misc2, metadata_reg_c_3); 786*10b69418SYevgeny Kliteynik 787*10b69418SYevgeny Kliteynik return 0; 788*10b69418SYevgeny Kliteynik } 789*10b69418SYevgeny Kliteynik 790*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_register_0_init(struct mlx5dr_ste_build *sb, 791*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 792*10b69418SYevgeny Kliteynik { 793*10b69418SYevgeny Kliteynik dr_ste_v1_build_register_0_tag(mask, sb, sb->bit_mask); 794*10b69418SYevgeny Kliteynik 795*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_STEERING_REGISTERS_0; 796*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 797*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_register_0_tag; 798*10b69418SYevgeny Kliteynik } 799*10b69418SYevgeny Kliteynik 800*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_register_1_tag(struct mlx5dr_match_param *value, 801*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 802*10b69418SYevgeny Kliteynik u8 *tag) 803*10b69418SYevgeny Kliteynik { 804*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 805*10b69418SYevgeny Kliteynik 806*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_h, misc2, metadata_reg_c_4); 807*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_l, misc2, metadata_reg_c_5); 808*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_h, misc2, metadata_reg_c_6); 809*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_l, misc2, metadata_reg_c_7); 810*10b69418SYevgeny Kliteynik 811*10b69418SYevgeny Kliteynik return 0; 812*10b69418SYevgeny Kliteynik } 813*10b69418SYevgeny Kliteynik 814*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_register_1_init(struct mlx5dr_ste_build *sb, 815*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 816*10b69418SYevgeny Kliteynik { 817*10b69418SYevgeny Kliteynik dr_ste_v1_build_register_1_tag(mask, sb, sb->bit_mask); 818*10b69418SYevgeny Kliteynik 819*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_STEERING_REGISTERS_1; 820*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 821*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_register_1_tag; 822*10b69418SYevgeny Kliteynik } 823*10b69418SYevgeny Kliteynik 824*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_src_gvmi_qpn_bit_mask(struct mlx5dr_match_param *value, 825*10b69418SYevgeny Kliteynik u8 *bit_mask) 826*10b69418SYevgeny Kliteynik { 827*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 828*10b69418SYevgeny Kliteynik 829*10b69418SYevgeny Kliteynik DR_STE_SET_ONES(src_gvmi_qp_v1, bit_mask, source_gvmi, misc_mask, source_port); 830*10b69418SYevgeny Kliteynik DR_STE_SET_ONES(src_gvmi_qp_v1, bit_mask, source_qp, misc_mask, source_sqn); 831*10b69418SYevgeny Kliteynik } 832*10b69418SYevgeny Kliteynik 833*10b69418SYevgeny Kliteynik static int dr_ste_v1_build_src_gvmi_qpn_tag(struct mlx5dr_match_param *value, 834*10b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 835*10b69418SYevgeny Kliteynik u8 *tag) 836*10b69418SYevgeny Kliteynik { 837*10b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 838*10b69418SYevgeny Kliteynik struct mlx5dr_cmd_vport_cap *vport_cap; 839*10b69418SYevgeny Kliteynik struct mlx5dr_domain *dmn = sb->dmn; 840*10b69418SYevgeny Kliteynik struct mlx5dr_cmd_caps *caps; 841*10b69418SYevgeny Kliteynik u8 *bit_mask = sb->bit_mask; 842*10b69418SYevgeny Kliteynik 843*10b69418SYevgeny Kliteynik DR_STE_SET_TAG(src_gvmi_qp_v1, tag, source_qp, misc, source_sqn); 844*10b69418SYevgeny Kliteynik 845*10b69418SYevgeny Kliteynik if (sb->vhca_id_valid) { 846*10b69418SYevgeny Kliteynik /* Find port GVMI based on the eswitch_owner_vhca_id */ 847*10b69418SYevgeny Kliteynik if (misc->source_eswitch_owner_vhca_id == dmn->info.caps.gvmi) 848*10b69418SYevgeny Kliteynik caps = &dmn->info.caps; 849*10b69418SYevgeny Kliteynik else if (dmn->peer_dmn && (misc->source_eswitch_owner_vhca_id == 850*10b69418SYevgeny Kliteynik dmn->peer_dmn->info.caps.gvmi)) 851*10b69418SYevgeny Kliteynik caps = &dmn->peer_dmn->info.caps; 852*10b69418SYevgeny Kliteynik else 853*10b69418SYevgeny Kliteynik return -EINVAL; 854*10b69418SYevgeny Kliteynik 855*10b69418SYevgeny Kliteynik misc->source_eswitch_owner_vhca_id = 0; 856*10b69418SYevgeny Kliteynik } else { 857*10b69418SYevgeny Kliteynik caps = &dmn->info.caps; 858*10b69418SYevgeny Kliteynik } 859*10b69418SYevgeny Kliteynik 860*10b69418SYevgeny Kliteynik if (!MLX5_GET(ste_src_gvmi_qp_v1, bit_mask, source_gvmi)) 861*10b69418SYevgeny Kliteynik return 0; 862*10b69418SYevgeny Kliteynik 863*10b69418SYevgeny Kliteynik vport_cap = mlx5dr_get_vport_cap(caps, misc->source_port); 864*10b69418SYevgeny Kliteynik if (!vport_cap) { 865*10b69418SYevgeny Kliteynik mlx5dr_err(dmn, "Vport 0x%x is disabled or invalid\n", 866*10b69418SYevgeny Kliteynik misc->source_port); 867*10b69418SYevgeny Kliteynik return -EINVAL; 868*10b69418SYevgeny Kliteynik } 869*10b69418SYevgeny Kliteynik 870*10b69418SYevgeny Kliteynik if (vport_cap->vport_gvmi) 871*10b69418SYevgeny Kliteynik MLX5_SET(ste_src_gvmi_qp_v1, tag, source_gvmi, vport_cap->vport_gvmi); 872*10b69418SYevgeny Kliteynik 873*10b69418SYevgeny Kliteynik misc->source_port = 0; 874*10b69418SYevgeny Kliteynik return 0; 875*10b69418SYevgeny Kliteynik } 876*10b69418SYevgeny Kliteynik 877*10b69418SYevgeny Kliteynik static void dr_ste_v1_build_src_gvmi_qpn_init(struct mlx5dr_ste_build *sb, 878*10b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 879*10b69418SYevgeny Kliteynik { 880*10b69418SYevgeny Kliteynik dr_ste_v1_build_src_gvmi_qpn_bit_mask(mask, sb->bit_mask); 881*10b69418SYevgeny Kliteynik 882*10b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_SRC_QP_GVMI; 883*10b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 884*10b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_src_gvmi_qpn_tag; 885*10b69418SYevgeny Kliteynik } 886*10b69418SYevgeny Kliteynik 887*10b69418SYevgeny Kliteynik struct mlx5dr_ste_ctx ste_ctx_v1 = { 888*10b69418SYevgeny Kliteynik .build_eth_l2_src_dst_init = &dr_ste_v1_build_eth_l2_src_dst_init, 889*10b69418SYevgeny Kliteynik .build_eth_l3_ipv6_src_init = &dr_ste_v1_build_eth_l3_ipv6_src_init, 890*10b69418SYevgeny Kliteynik .build_eth_l3_ipv6_dst_init = &dr_ste_v1_build_eth_l3_ipv6_dst_init, 891*10b69418SYevgeny Kliteynik .build_eth_l3_ipv4_5_tuple_init = &dr_ste_v1_build_eth_l3_ipv4_5_tuple_init, 892*10b69418SYevgeny Kliteynik .build_eth_l2_src_init = &dr_ste_v1_build_eth_l2_src_init, 893*10b69418SYevgeny Kliteynik .build_eth_l2_dst_init = &dr_ste_v1_build_eth_l2_dst_init, 894*10b69418SYevgeny Kliteynik .build_eth_l2_tnl_init = &dr_ste_v1_build_eth_l2_tnl_init, 895*10b69418SYevgeny Kliteynik .build_eth_l3_ipv4_misc_init = &dr_ste_v1_build_eth_l3_ipv4_misc_init, 896*10b69418SYevgeny Kliteynik .build_eth_ipv6_l3_l4_init = &dr_ste_v1_build_eth_ipv6_l3_l4_init, 897*10b69418SYevgeny Kliteynik .build_mpls_init = &dr_ste_v1_build_mpls_init, 898*10b69418SYevgeny Kliteynik .build_tnl_gre_init = &dr_ste_v1_build_tnl_gre_init, 899*10b69418SYevgeny Kliteynik .build_tnl_mpls_init = &dr_ste_v1_build_tnl_mpls_init, 900*10b69418SYevgeny Kliteynik .build_icmp_init = &dr_ste_v1_build_icmp_init, 901*10b69418SYevgeny Kliteynik .build_general_purpose_init = &dr_ste_v1_build_general_purpose_init, 902*10b69418SYevgeny Kliteynik .build_eth_l4_misc_init = &dr_ste_v1_build_eth_l4_misc_init, 903*10b69418SYevgeny Kliteynik .build_tnl_vxlan_gpe_init = &dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_init, 904*10b69418SYevgeny Kliteynik .build_tnl_geneve_init = &dr_ste_v1_build_flex_parser_tnl_geneve_init, 905*10b69418SYevgeny Kliteynik .build_register_0_init = &dr_ste_v1_build_register_0_init, 906*10b69418SYevgeny Kliteynik .build_register_1_init = &dr_ste_v1_build_register_1_init, 907*10b69418SYevgeny Kliteynik .build_src_gvmi_qpn_init = &dr_ste_v1_build_src_gvmi_qpn_init, 908*10b69418SYevgeny Kliteynik }; 909