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