110b69418SYevgeny Kliteynik // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB 210b69418SYevgeny Kliteynik /* Copyright (c) 2020 NVIDIA CORPORATION. All rights reserved. */ 310b69418SYevgeny Kliteynik 410b69418SYevgeny Kliteynik #include <linux/types.h> 510b69418SYevgeny Kliteynik #include "mlx5_ifc_dr_ste_v1.h" 66862c787SYevgeny Kliteynik #include "dr_ste_v1.h" 710b69418SYevgeny Kliteynik 810b69418SYevgeny Kliteynik #define DR_STE_CALC_DFNR_TYPE(lookup_type, inner) \ 910b69418SYevgeny Kliteynik ((inner) ? DR_STE_V1_LU_TYPE_##lookup_type##_I : \ 1010b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_##lookup_type##_O) 1110b69418SYevgeny Kliteynik 1210b69418SYevgeny Kliteynik enum dr_ste_v1_entry_format { 1310b69418SYevgeny Kliteynik DR_STE_V1_TYPE_BWC_BYTE = 0x0, 1410b69418SYevgeny Kliteynik DR_STE_V1_TYPE_BWC_DW = 0x1, 1510b69418SYevgeny Kliteynik DR_STE_V1_TYPE_MATCH = 0x2, 16be6d5daeSYevgeny Kliteynik DR_STE_V1_TYPE_MATCH_RANGES = 0x7, 1710b69418SYevgeny Kliteynik }; 1810b69418SYevgeny Kliteynik 1910b69418SYevgeny Kliteynik /* Lookup type is built from 2B: [ Definer mode 1B ][ Definer index 1B ] */ 2010b69418SYevgeny Kliteynik enum { 2110b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_NOP = 0x0000, 2210b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_TNL = 0x0002, 2310b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IBL3_EXT = 0x0102, 2410b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_O = 0x0003, 2510b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IBL4 = 0x0103, 2610b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_I = 0x0004, 2710b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_SRC_QP_GVMI = 0x0104, 2810b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_O = 0x0005, 2910b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_HEADERS_O = 0x0105, 3010b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_I = 0x0006, 3110b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_HEADERS_I = 0x0106, 3210b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_5_TUPLE_O = 0x0007, 3310b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_DES_O = 0x0107, 3410b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_5_TUPLE_I = 0x0008, 3510b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_DES_I = 0x0108, 3610b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_O = 0x0009, 3710b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_SRC_O = 0x0109, 3810b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_I = 0x000a, 3910b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_SRC_I = 0x010a, 4010b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_DST_O = 0x000b, 4110b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_MPLS_O = 0x010b, 4210b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_DST_I = 0x000c, 4310b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_MPLS_I = 0x010c, 4410b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_MISC_O = 0x000d, 4510b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_GRE = 0x010d, 4610b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER = 0x000e, 4710b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_GENERAL_PURPOSE = 0x010e, 4810b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_MISC_I = 0x000f, 4910b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_STEERING_REGISTERS_0 = 0x010f, 5010b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_STEERING_REGISTERS_1 = 0x0110, 51f59464e2SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_OK = 0x0011, 5210b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0 = 0x0111, 5310b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 = 0x0112, 5410b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_MISC_O = 0x0113, 5510b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_MISC_I = 0x0114, 5610b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_INVALID = 0x00ff, 5710b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_DONT_CARE = MLX5DR_STE_LU_TYPE_DONT_CARE, 5810b69418SYevgeny Kliteynik }; 5910b69418SYevgeny Kliteynik 604e856c5dSYevgeny Kliteynik enum dr_ste_v1_header_anchors { 614e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_START_OUTER = 0x00, 624e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_1ST_VLAN = 0x02, 634e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_IPV6_IPV4 = 0x07, 644e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_MAC = 0x13, 654e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_IPV6_IPV4 = 0x19, 664e856c5dSYevgeny Kliteynik }; 674e856c5dSYevgeny Kliteynik 684e856c5dSYevgeny Kliteynik enum dr_ste_v1_action_size { 694e856c5dSYevgeny Kliteynik DR_STE_ACTION_SINGLE_SZ = 4, 704e856c5dSYevgeny Kliteynik DR_STE_ACTION_DOUBLE_SZ = 8, 714e856c5dSYevgeny Kliteynik DR_STE_ACTION_TRIPLE_SZ = 12, 724e856c5dSYevgeny Kliteynik }; 734e856c5dSYevgeny Kliteynik 744e856c5dSYevgeny Kliteynik enum dr_ste_v1_action_insert_ptr_attr { 754e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_NONE = 0, /* Regular push header (e.g. push vlan) */ 764e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP = 1, /* Encapsulation / Tunneling */ 774e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ESP = 2, /* IPsec */ 784e856c5dSYevgeny Kliteynik }; 794e856c5dSYevgeny Kliteynik 804e856c5dSYevgeny Kliteynik enum dr_ste_v1_action_id { 814e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_NOP = 0x00, 824e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_COPY = 0x05, 834e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_SET = 0x06, 844e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_ADD = 0x07, 854e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE = 0x08, 864e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER = 0x09, 874e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_INLINE = 0x0a, 884e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER = 0x0b, 894e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_FLOW_TAG = 0x0c, 904e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_QUEUE_ID_SEL = 0x0d, 914e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_ACCELERATED_LIST = 0x0e, 924e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MODIFY_LIST = 0x0f, 938920d92bSYevgeny Kliteynik DR_STE_V1_ACTION_ID_ASO = 0x12, 944e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_TRAILER = 0x13, 954e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_COUNTER_ID = 0x14, 964e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MAX = 0x21, 974e856c5dSYevgeny Kliteynik /* use for special cases */ 984e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_SPECIAL_ENCAP_L3 = 0x22, 994e856c5dSYevgeny Kliteynik }; 1004e856c5dSYevgeny Kliteynik 101c349b413SYevgeny Kliteynik enum { 102c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_0 = 0x00, 103c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_1 = 0x01, 104c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_2 = 0x02, 105c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_0 = 0x08, 106c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_1 = 0x09, 107c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0 = 0x0e, 108c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0 = 0x18, 109c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_1 = 0x19, 110c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_0 = 0x40, 111c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_1 = 0x41, 112c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_0 = 0x44, 113c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_1 = 0x45, 114c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_2 = 0x46, 115c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_3 = 0x47, 116c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_0 = 0x4c, 117c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_1 = 0x4d, 118c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_2 = 0x4e, 119c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_3 = 0x4f, 120c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_0 = 0x5e, 121c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_1 = 0x5f, 122ded6a877SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_CFG_HDR_0_0 = 0x6f, 123ded6a877SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_CFG_HDR_0_1 = 0x70, 124c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_METADATA_2_CQE = 0x7b, 125c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_GNRL_PURPOSE = 0x7c, 12675a3926cSYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_2_0 = 0x8c, 12775a3926cSYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_2_1 = 0x8d, 12875a3926cSYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_1_0 = 0x8e, 12975a3926cSYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_1_1 = 0x8f, 13075a3926cSYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_0_0 = 0x90, 13175a3926cSYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_0_1 = 0x91, 132c349b413SYevgeny Kliteynik }; 133c349b413SYevgeny Kliteynik 1348920d92bSYevgeny Kliteynik enum dr_ste_v1_aso_ctx_type { 1358920d92bSYevgeny Kliteynik DR_STE_V1_ASO_CTX_TYPE_POLICERS = 0x2, 1368920d92bSYevgeny Kliteynik }; 1378920d92bSYevgeny Kliteynik 138c349b413SYevgeny Kliteynik static const struct mlx5dr_ste_action_modify_field dr_ste_v1_action_modify_field_arr[] = { 139c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SMAC_47_16] = { 140c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_0, .start = 0, .end = 31, 141c349b413SYevgeny Kliteynik }, 142c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SMAC_15_0] = { 143c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_1, .start = 16, .end = 31, 144c349b413SYevgeny Kliteynik }, 145c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_ETHERTYPE] = { 146c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_1, .start = 0, .end = 15, 147c349b413SYevgeny Kliteynik }, 148c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DMAC_47_16] = { 149c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_0, .start = 0, .end = 31, 150c349b413SYevgeny Kliteynik }, 151c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DMAC_15_0] = { 152c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_1, .start = 16, .end = 31, 153c349b413SYevgeny Kliteynik }, 154c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_IP_DSCP] = { 155c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0, .start = 18, .end = 23, 156c349b413SYevgeny Kliteynik }, 157c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_FLAGS] = { 158c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_1, .start = 16, .end = 24, 159c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, 160c349b413SYevgeny Kliteynik }, 161c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_SPORT] = { 162c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 16, .end = 31, 163c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, 164c349b413SYevgeny Kliteynik }, 165c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_DPORT] = { 166c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 0, .end = 15, 167c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, 168c349b413SYevgeny Kliteynik }, 169c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_IP_TTL] = { 170c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0, .start = 8, .end = 15, 171c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, 172c349b413SYevgeny Kliteynik }, 173c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_IPV6_HOPLIMIT] = { 174c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0, .start = 8, .end = 15, 175c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 176c349b413SYevgeny Kliteynik }, 177c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_UDP_SPORT] = { 178c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 16, .end = 31, 179c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_UDP, 180c349b413SYevgeny Kliteynik }, 181c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_UDP_DPORT] = { 182c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 0, .end = 15, 183c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_UDP, 184c349b413SYevgeny Kliteynik }, 185c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_127_96] = { 186c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_0, .start = 0, .end = 31, 187c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 188c349b413SYevgeny Kliteynik }, 189c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_95_64] = { 190c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_1, .start = 0, .end = 31, 191c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 192c349b413SYevgeny Kliteynik }, 193c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_63_32] = { 194c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_2, .start = 0, .end = 31, 195c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 196c349b413SYevgeny Kliteynik }, 197c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_31_0] = { 198c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_3, .start = 0, .end = 31, 199c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 200c349b413SYevgeny Kliteynik }, 201c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_127_96] = { 202c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_0, .start = 0, .end = 31, 203c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 204c349b413SYevgeny Kliteynik }, 205c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_95_64] = { 206c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_1, .start = 0, .end = 31, 207c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 208c349b413SYevgeny Kliteynik }, 209c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_63_32] = { 210c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_2, .start = 0, .end = 31, 211c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 212c349b413SYevgeny Kliteynik }, 213c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_31_0] = { 214c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_3, .start = 0, .end = 31, 215c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 216c349b413SYevgeny Kliteynik }, 217c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV4] = { 218c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_0, .start = 0, .end = 31, 219c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, 220c349b413SYevgeny Kliteynik }, 221c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV4] = { 222c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_1, .start = 0, .end = 31, 223c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, 224c349b413SYevgeny Kliteynik }, 225c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_A] = { 226c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_GNRL_PURPOSE, .start = 0, .end = 31, 227c349b413SYevgeny Kliteynik }, 228c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_B] = { 229c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_METADATA_2_CQE, .start = 0, .end = 31, 230c349b413SYevgeny Kliteynik }, 231c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_0] = { 23275a3926cSYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_0_0, .start = 0, .end = 31, 233c349b413SYevgeny Kliteynik }, 234c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_1] = { 23575a3926cSYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_0_1, .start = 0, .end = 31, 236c349b413SYevgeny Kliteynik }, 237c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_2] = { 23875a3926cSYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_1_0, .start = 0, .end = 31, 239c349b413SYevgeny Kliteynik }, 240c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_3] = { 24175a3926cSYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_1_1, .start = 0, .end = 31, 242c349b413SYevgeny Kliteynik }, 243c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_4] = { 24475a3926cSYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_2_0, .start = 0, .end = 31, 245c349b413SYevgeny Kliteynik }, 246c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_5] = { 24775a3926cSYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_2_1, .start = 0, .end = 31, 248c349b413SYevgeny Kliteynik }, 249c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_SEQ_NUM] = { 250c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_0, .start = 0, .end = 31, 251c349b413SYevgeny Kliteynik }, 252c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_ACK_NUM] = { 253c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_1, .start = 0, .end = 31, 254c349b413SYevgeny Kliteynik }, 255c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_FIRST_VID] = { 256c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_2, .start = 0, .end = 15, 257c349b413SYevgeny Kliteynik }, 258ded6a877SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_EMD_31_0] = { 259ded6a877SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_CFG_HDR_0_1, .start = 0, .end = 31, 260ded6a877SYevgeny Kliteynik }, 261ded6a877SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_EMD_47_32] = { 262ded6a877SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_CFG_HDR_0_0, .start = 0, .end = 15, 263ded6a877SYevgeny Kliteynik }, 264c349b413SYevgeny Kliteynik }; 265c349b413SYevgeny Kliteynik 2664e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_entry_type(u8 *hw_ste_p, u8 entry_type) 2674e856c5dSYevgeny Kliteynik { 2684e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, entry_format, entry_type); 2694e856c5dSYevgeny Kliteynik } 2704e856c5dSYevgeny Kliteynik 2711207a772SYevgeny Kliteynik bool dr_ste_v1_is_miss_addr_set(u8 *hw_ste_p) 2721207a772SYevgeny Kliteynik { 273be6d5daeSYevgeny Kliteynik u8 entry_type = MLX5_GET(ste_match_bwc_v1, hw_ste_p, entry_format); 274be6d5daeSYevgeny Kliteynik 275be6d5daeSYevgeny Kliteynik /* unlike MATCH STE, for MATCH_RANGES STE both hit and miss addresses 276be6d5daeSYevgeny Kliteynik * are part of the action, so they both set as part of STE init 277be6d5daeSYevgeny Kliteynik */ 278be6d5daeSYevgeny Kliteynik return entry_type == DR_STE_V1_TYPE_MATCH_RANGES; 2791207a772SYevgeny Kliteynik } 2801207a772SYevgeny Kliteynik 2816862c787SYevgeny Kliteynik void dr_ste_v1_set_miss_addr(u8 *hw_ste_p, u64 miss_addr) 282a6098129SYevgeny Kliteynik { 283a6098129SYevgeny Kliteynik u64 index = miss_addr >> 6; 284a6098129SYevgeny Kliteynik 285a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_39_32, index >> 26); 286a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_31_6, index); 287a6098129SYevgeny Kliteynik } 288a6098129SYevgeny Kliteynik 2896862c787SYevgeny Kliteynik u64 dr_ste_v1_get_miss_addr(u8 *hw_ste_p) 290a6098129SYevgeny Kliteynik { 291a6098129SYevgeny Kliteynik u64 index = 29284076c4cSYevgeny Kliteynik ((u64)MLX5_GET(ste_match_bwc_v1, hw_ste_p, miss_address_31_6) | 29384076c4cSYevgeny Kliteynik ((u64)MLX5_GET(ste_match_bwc_v1, hw_ste_p, miss_address_39_32)) << 26); 294a6098129SYevgeny Kliteynik 295a6098129SYevgeny Kliteynik return index << 6; 296a6098129SYevgeny Kliteynik } 297a6098129SYevgeny Kliteynik 2986862c787SYevgeny Kliteynik void dr_ste_v1_set_byte_mask(u8 *hw_ste_p, u16 byte_mask) 299a6098129SYevgeny Kliteynik { 300a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, byte_mask, byte_mask); 301a6098129SYevgeny Kliteynik } 302a6098129SYevgeny Kliteynik 3036862c787SYevgeny Kliteynik u16 dr_ste_v1_get_byte_mask(u8 *hw_ste_p) 304a6098129SYevgeny Kliteynik { 305a6098129SYevgeny Kliteynik return MLX5_GET(ste_match_bwc_v1, hw_ste_p, byte_mask); 306a6098129SYevgeny Kliteynik } 307a6098129SYevgeny Kliteynik 308a6098129SYevgeny Kliteynik static void dr_ste_v1_set_lu_type(u8 *hw_ste_p, u16 lu_type) 309a6098129SYevgeny Kliteynik { 310a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, entry_format, lu_type >> 8); 311a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, match_definer_ctx_idx, lu_type & 0xFF); 312a6098129SYevgeny Kliteynik } 313a6098129SYevgeny Kliteynik 3146862c787SYevgeny Kliteynik void dr_ste_v1_set_next_lu_type(u8 *hw_ste_p, u16 lu_type) 315a6098129SYevgeny Kliteynik { 316a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_entry_format, lu_type >> 8); 317a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, hash_definer_ctx_idx, lu_type & 0xFF); 318a6098129SYevgeny Kliteynik } 319a6098129SYevgeny Kliteynik 3206862c787SYevgeny Kliteynik u16 dr_ste_v1_get_next_lu_type(u8 *hw_ste_p) 321a6098129SYevgeny Kliteynik { 322a6098129SYevgeny Kliteynik u8 mode = MLX5_GET(ste_match_bwc_v1, hw_ste_p, next_entry_format); 323a6098129SYevgeny Kliteynik u8 index = MLX5_GET(ste_match_bwc_v1, hw_ste_p, hash_definer_ctx_idx); 324a6098129SYevgeny Kliteynik 325a6098129SYevgeny Kliteynik return (mode << 8 | index); 326a6098129SYevgeny Kliteynik } 327a6098129SYevgeny Kliteynik 3284e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_hit_gvmi(u8 *hw_ste_p, u16 gvmi) 3294e856c5dSYevgeny Kliteynik { 3304e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_63_48, gvmi); 3314e856c5dSYevgeny Kliteynik } 3324e856c5dSYevgeny Kliteynik 3336862c787SYevgeny Kliteynik void dr_ste_v1_set_hit_addr(u8 *hw_ste_p, u64 icm_addr, u32 ht_size) 334a6098129SYevgeny Kliteynik { 335a6098129SYevgeny Kliteynik u64 index = (icm_addr >> 5) | ht_size; 336a6098129SYevgeny Kliteynik 337a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_39_32_size, index >> 27); 338a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_31_5_size, index); 339a6098129SYevgeny Kliteynik } 340a6098129SYevgeny Kliteynik 3416862c787SYevgeny Kliteynik void dr_ste_v1_init(u8 *hw_ste_p, u16 lu_type, bool is_rx, u16 gvmi) 342a6098129SYevgeny Kliteynik { 343a6098129SYevgeny Kliteynik dr_ste_v1_set_lu_type(hw_ste_p, lu_type); 344a6098129SYevgeny Kliteynik dr_ste_v1_set_next_lu_type(hw_ste_p, MLX5DR_STE_LU_TYPE_DONT_CARE); 345a6098129SYevgeny Kliteynik 346a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, gvmi, gvmi); 347a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_63_48, gvmi); 348a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_63_48, gvmi); 349a6098129SYevgeny Kliteynik } 350a6098129SYevgeny Kliteynik 3516862c787SYevgeny Kliteynik void dr_ste_v1_prepare_for_postsend(u8 *hw_ste_p, u32 ste_size) 3524fe45e1dSYevgeny Kliteynik { 3534fe45e1dSYevgeny Kliteynik u8 *tag = hw_ste_p + DR_STE_SIZE_CTRL; 3544fe45e1dSYevgeny Kliteynik u8 *mask = tag + DR_STE_SIZE_TAG; 3554fe45e1dSYevgeny Kliteynik u8 tmp_tag[DR_STE_SIZE_TAG] = {}; 3564fe45e1dSYevgeny Kliteynik 3574fe45e1dSYevgeny Kliteynik if (ste_size == DR_STE_SIZE_CTRL) 3584fe45e1dSYevgeny Kliteynik return; 3594fe45e1dSYevgeny Kliteynik 3604fe45e1dSYevgeny Kliteynik WARN_ON(ste_size != DR_STE_SIZE); 3614fe45e1dSYevgeny Kliteynik 3624fe45e1dSYevgeny Kliteynik /* Backup tag */ 3634fe45e1dSYevgeny Kliteynik memcpy(tmp_tag, tag, DR_STE_SIZE_TAG); 3644fe45e1dSYevgeny Kliteynik 3654fe45e1dSYevgeny Kliteynik /* Swap mask and tag both are the same size */ 3664fe45e1dSYevgeny Kliteynik memcpy(tag, mask, DR_STE_SIZE_MASK); 3674fe45e1dSYevgeny Kliteynik memcpy(mask, tmp_tag, DR_STE_SIZE_TAG); 3684fe45e1dSYevgeny Kliteynik } 3694fe45e1dSYevgeny Kliteynik 3704e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_flow_tag(u8 *s_action, u32 flow_tag) 3714e856c5dSYevgeny Kliteynik { 3724e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_flow_tag_v1, s_action, action_id, 3734e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_FLOW_TAG); 3744e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_flow_tag_v1, s_action, flow_tag, flow_tag); 3754e856c5dSYevgeny Kliteynik } 3764e856c5dSYevgeny Kliteynik 3774e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_counter_id(u8 *hw_ste_p, u32 ctr_id) 3784e856c5dSYevgeny Kliteynik { 3794e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, counter_id, ctr_id); 3804e856c5dSYevgeny Kliteynik } 3814e856c5dSYevgeny Kliteynik 3824e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_reparse(u8 *hw_ste_p) 3834e856c5dSYevgeny Kliteynik { 3844e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, reparse, 1); 3854e856c5dSYevgeny Kliteynik } 3864e856c5dSYevgeny Kliteynik 387d7418b4eSYevgeny Kliteynik static void dr_ste_v1_set_encap(u8 *hw_ste_p, u8 *d_action, 3884e856c5dSYevgeny Kliteynik u32 reformat_id, int size) 3894e856c5dSYevgeny Kliteynik { 3904e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, action_id, 3914e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER); 3924e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 3934e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, size, size / 2); 3944e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, pointer, reformat_id); 3954e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, attributes, 3964e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP); 3974e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 3984e856c5dSYevgeny Kliteynik } 3994e856c5dSYevgeny Kliteynik 4007ea9b398SYevgeny Kliteynik static void dr_ste_v1_set_insert_hdr(u8 *hw_ste_p, u8 *d_action, 4017ea9b398SYevgeny Kliteynik u32 reformat_id, 4027ea9b398SYevgeny Kliteynik u8 anchor, u8 offset, 4037ea9b398SYevgeny Kliteynik int size) 4047ea9b398SYevgeny Kliteynik { 4057ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, 4067ea9b398SYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_INSERT_POINTER); 4077ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, start_anchor, anchor); 4087ea9b398SYevgeny Kliteynik 4097ea9b398SYevgeny Kliteynik /* The hardware expects here size and offset in words (2 byte) */ 4107ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, size, size / 2); 4117ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, start_offset, offset / 2); 4127ea9b398SYevgeny Kliteynik 4137ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, pointer, reformat_id); 4147ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, attributes, 4157ea9b398SYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_NONE); 4167ea9b398SYevgeny Kliteynik 4177ea9b398SYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4187ea9b398SYevgeny Kliteynik } 4197ea9b398SYevgeny Kliteynik 4200139145fSYevgeny Kliteynik static void dr_ste_v1_set_remove_hdr(u8 *hw_ste_p, u8 *s_action, 4210139145fSYevgeny Kliteynik u8 anchor, u8 offset, 4220139145fSYevgeny Kliteynik int size) 4230139145fSYevgeny Kliteynik { 4240139145fSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 4250139145fSYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE); 4260139145fSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, start_anchor, anchor); 4270139145fSYevgeny Kliteynik 4280139145fSYevgeny Kliteynik /* The hardware expects here size and offset in words (2 byte) */ 4290139145fSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, remove_size, size / 2); 4300139145fSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, start_offset, offset / 2); 4310139145fSYevgeny Kliteynik 4320139145fSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4330139145fSYevgeny Kliteynik } 4340139145fSYevgeny Kliteynik 4352de40f68SYevgeny Kliteynik static void dr_ste_v1_set_push_vlan(u8 *hw_ste_p, u8 *d_action, 4364e856c5dSYevgeny Kliteynik u32 vlan_hdr) 4374e856c5dSYevgeny Kliteynik { 4384e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 4394e856c5dSYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_INSERT_INLINE); 4404e856c5dSYevgeny Kliteynik /* The hardware expects offset to vlan header in words (2 byte) */ 4414e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 4424e856c5dSYevgeny Kliteynik start_offset, HDR_LEN_L2_MACS >> 1); 4434e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 4444e856c5dSYevgeny Kliteynik inline_data, vlan_hdr); 4454e856c5dSYevgeny Kliteynik 4464e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4474e856c5dSYevgeny Kliteynik } 4484e856c5dSYevgeny Kliteynik 4492de40f68SYevgeny Kliteynik static void dr_ste_v1_set_pop_vlan(u8 *hw_ste_p, u8 *s_action, u8 vlans_num) 4504e856c5dSYevgeny Kliteynik { 4514e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 4524e856c5dSYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE); 4534e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 4544e856c5dSYevgeny Kliteynik start_anchor, DR_STE_HEADER_ANCHOR_1ST_VLAN); 4554e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 4564e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 4574e856c5dSYevgeny Kliteynik remove_size, (HDR_LEN_L2_VLAN >> 1) * vlans_num); 4584e856c5dSYevgeny Kliteynik 4594e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4604e856c5dSYevgeny Kliteynik } 4614e856c5dSYevgeny Kliteynik 462d7418b4eSYevgeny Kliteynik static void dr_ste_v1_set_encap_l3(u8 *hw_ste_p, 4634e856c5dSYevgeny Kliteynik u8 *frst_s_action, 4644e856c5dSYevgeny Kliteynik u8 *scnd_d_action, 4654e856c5dSYevgeny Kliteynik u32 reformat_id, 4664e856c5dSYevgeny Kliteynik int size) 4674e856c5dSYevgeny Kliteynik { 4684e856c5dSYevgeny Kliteynik /* Remove L2 headers */ 4694e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, frst_s_action, action_id, 4704e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 4714e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, frst_s_action, end_anchor, 4724e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_IPV6_IPV4); 4734e856c5dSYevgeny Kliteynik 4744e856c5dSYevgeny Kliteynik /* Encapsulate with given reformat ID */ 4754e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, action_id, 4764e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER); 4774e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 4784e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, size, size / 2); 4794e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, pointer, reformat_id); 4804e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, attributes, 4814e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP); 4824e856c5dSYevgeny Kliteynik 4834e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4844e856c5dSYevgeny Kliteynik } 4854e856c5dSYevgeny Kliteynik 4864e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_decap(u8 *hw_ste_p, u8 *s_action) 4874e856c5dSYevgeny Kliteynik { 4884e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, action_id, 4894e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 4904e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, decap, 1); 4914e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, vni_to_cqe, 1); 4924e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, end_anchor, 4934e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_MAC); 4944e856c5dSYevgeny Kliteynik 4954e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4964e856c5dSYevgeny Kliteynik } 4974e856c5dSYevgeny Kliteynik 49862e40c85SYevgeny Kliteynik static void dr_ste_v1_set_accelerated_rewrite_actions(u8 *hw_ste_p, 49962e40c85SYevgeny Kliteynik u8 *d_action, 50062e40c85SYevgeny Kliteynik u16 num_of_actions, 50162e40c85SYevgeny Kliteynik u32 rewrite_pattern, 502*40ff097fSYevgeny Kliteynik u32 rewrite_args, 503*40ff097fSYevgeny Kliteynik u8 *action_data) 50462e40c85SYevgeny Kliteynik { 505*40ff097fSYevgeny Kliteynik if (action_data) { 506*40ff097fSYevgeny Kliteynik memcpy(d_action, action_data, DR_MODIFY_ACTION_SIZE); 507*40ff097fSYevgeny Kliteynik } else { 50862e40c85SYevgeny Kliteynik MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action, 50962e40c85SYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_ACCELERATED_LIST); 51062e40c85SYevgeny Kliteynik MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action, 51162e40c85SYevgeny Kliteynik modify_actions_pattern_pointer, rewrite_pattern); 51262e40c85SYevgeny Kliteynik MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action, 51362e40c85SYevgeny Kliteynik number_of_modify_actions, num_of_actions); 51462e40c85SYevgeny Kliteynik MLX5_SET(ste_double_action_accelerated_modify_action_list_v1, d_action, 51562e40c85SYevgeny Kliteynik modify_actions_argument_pointer, rewrite_args); 516*40ff097fSYevgeny Kliteynik } 51762e40c85SYevgeny Kliteynik 51862e40c85SYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 51962e40c85SYevgeny Kliteynik } 52062e40c85SYevgeny Kliteynik 52162e40c85SYevgeny Kliteynik static void dr_ste_v1_set_basic_rewrite_actions(u8 *hw_ste_p, 5224e856c5dSYevgeny Kliteynik u8 *s_action, 5234e856c5dSYevgeny Kliteynik u16 num_of_actions, 52462e40c85SYevgeny Kliteynik u32 rewrite_index) 5254e856c5dSYevgeny Kliteynik { 5264e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, action_id, 5274e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MODIFY_LIST); 5284e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, num_of_modify_actions, 5294e856c5dSYevgeny Kliteynik num_of_actions); 5304e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, modify_actions_ptr, 53162e40c85SYevgeny Kliteynik rewrite_index); 5324e856c5dSYevgeny Kliteynik 5334e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 5344e856c5dSYevgeny Kliteynik } 5354e856c5dSYevgeny Kliteynik 53662e40c85SYevgeny Kliteynik static void dr_ste_v1_set_rewrite_actions(u8 *hw_ste_p, 53762e40c85SYevgeny Kliteynik u8 *action, 53862e40c85SYevgeny Kliteynik u16 num_of_actions, 53962e40c85SYevgeny Kliteynik u32 rewrite_pattern, 540*40ff097fSYevgeny Kliteynik u32 rewrite_args, 541*40ff097fSYevgeny Kliteynik u8 *action_data) 54262e40c85SYevgeny Kliteynik { 54362e40c85SYevgeny Kliteynik if (rewrite_pattern != MLX5DR_INVALID_PATTERN_INDEX) 54462e40c85SYevgeny Kliteynik return dr_ste_v1_set_accelerated_rewrite_actions(hw_ste_p, 54562e40c85SYevgeny Kliteynik action, 54662e40c85SYevgeny Kliteynik num_of_actions, 54762e40c85SYevgeny Kliteynik rewrite_pattern, 548*40ff097fSYevgeny Kliteynik rewrite_args, 549*40ff097fSYevgeny Kliteynik action_data); 55062e40c85SYevgeny Kliteynik 55162e40c85SYevgeny Kliteynik /* fall back to the code that doesn't support accelerated modify header */ 55262e40c85SYevgeny Kliteynik return dr_ste_v1_set_basic_rewrite_actions(hw_ste_p, 55362e40c85SYevgeny Kliteynik action, 55462e40c85SYevgeny Kliteynik num_of_actions, 55562e40c85SYevgeny Kliteynik rewrite_args); 55662e40c85SYevgeny Kliteynik } 55762e40c85SYevgeny Kliteynik 5588920d92bSYevgeny Kliteynik static void dr_ste_v1_set_aso_flow_meter(u8 *d_action, 5598920d92bSYevgeny Kliteynik u32 object_id, 5608920d92bSYevgeny Kliteynik u32 offset, 5618920d92bSYevgeny Kliteynik u8 dest_reg_id, 5628920d92bSYevgeny Kliteynik u8 init_color) 5638920d92bSYevgeny Kliteynik { 5648920d92bSYevgeny Kliteynik MLX5_SET(ste_double_action_aso_v1, d_action, action_id, 5658920d92bSYevgeny Kliteynik DR_STE_V1_ACTION_ID_ASO); 5668920d92bSYevgeny Kliteynik MLX5_SET(ste_double_action_aso_v1, d_action, aso_context_number, 5678920d92bSYevgeny Kliteynik object_id + (offset / MLX5DR_ASO_FLOW_METER_NUM_PER_OBJ)); 5688920d92bSYevgeny Kliteynik /* Convert reg_c index to HW 64bit index */ 5698920d92bSYevgeny Kliteynik MLX5_SET(ste_double_action_aso_v1, d_action, dest_reg_id, 5708920d92bSYevgeny Kliteynik (dest_reg_id - 1) / 2); 5718920d92bSYevgeny Kliteynik MLX5_SET(ste_double_action_aso_v1, d_action, aso_context_type, 5728920d92bSYevgeny Kliteynik DR_STE_V1_ASO_CTX_TYPE_POLICERS); 5738920d92bSYevgeny Kliteynik MLX5_SET(ste_double_action_aso_v1, d_action, flow_meter.line_id, 5748920d92bSYevgeny Kliteynik offset % MLX5DR_ASO_FLOW_METER_NUM_PER_OBJ); 5758920d92bSYevgeny Kliteynik MLX5_SET(ste_double_action_aso_v1, d_action, flow_meter.initial_color, 5768920d92bSYevgeny Kliteynik init_color); 5778920d92bSYevgeny Kliteynik } 5788920d92bSYevgeny Kliteynik 579be6d5daeSYevgeny Kliteynik static void dr_ste_v1_set_match_range_pkt_len(u8 *hw_ste_p, u32 definer_id, 580be6d5daeSYevgeny Kliteynik u32 min, u32 max) 581be6d5daeSYevgeny Kliteynik { 582be6d5daeSYevgeny Kliteynik MLX5_SET(ste_match_ranges_v1, hw_ste_p, match_definer_ctx_idx, definer_id); 583be6d5daeSYevgeny Kliteynik 584be6d5daeSYevgeny Kliteynik /* When the STE will be sent, its mask and tags will be swapped in 585be6d5daeSYevgeny Kliteynik * dr_ste_v1_prepare_for_postsend(). This, however, is match range STE 586be6d5daeSYevgeny Kliteynik * which doesn't have mask, and shouldn't have mask/tag swapped. 587be6d5daeSYevgeny Kliteynik * We're using the common utilities functions to send this STE, so need 588be6d5daeSYevgeny Kliteynik * to allow for this swapping - place the values in the corresponding 589be6d5daeSYevgeny Kliteynik * locations to allow flipping them when writing to ICM. 590be6d5daeSYevgeny Kliteynik * 591be6d5daeSYevgeny Kliteynik * min/max_value_2 corresponds to match_dw_0 in its definer. 592be6d5daeSYevgeny Kliteynik * To allow mask/tag swapping, writing the min/max_2 to min/max_0. 593be6d5daeSYevgeny Kliteynik * 594be6d5daeSYevgeny Kliteynik * Pkt len is 2 bytes that are stored in the higher section of the DW. 595be6d5daeSYevgeny Kliteynik */ 596be6d5daeSYevgeny Kliteynik MLX5_SET(ste_match_ranges_v1, hw_ste_p, min_value_0, min << 16); 597be6d5daeSYevgeny Kliteynik MLX5_SET(ste_match_ranges_v1, hw_ste_p, max_value_0, max << 16); 598be6d5daeSYevgeny Kliteynik } 599be6d5daeSYevgeny Kliteynik 6004e856c5dSYevgeny Kliteynik static void dr_ste_v1_arr_init_next_match(u8 **last_ste, 6014e856c5dSYevgeny Kliteynik u32 *added_stes, 6024e856c5dSYevgeny Kliteynik u16 gvmi) 6034e856c5dSYevgeny Kliteynik { 6044e856c5dSYevgeny Kliteynik u8 *action; 6054e856c5dSYevgeny Kliteynik 6064e856c5dSYevgeny Kliteynik (*added_stes)++; 6074e856c5dSYevgeny Kliteynik *last_ste += DR_STE_SIZE; 6084e856c5dSYevgeny Kliteynik dr_ste_v1_init(*last_ste, MLX5DR_STE_LU_TYPE_DONT_CARE, 0, gvmi); 6094e856c5dSYevgeny Kliteynik dr_ste_v1_set_entry_type(*last_ste, DR_STE_V1_TYPE_MATCH); 6104e856c5dSYevgeny Kliteynik 6114e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, *last_ste, action); 6124e856c5dSYevgeny Kliteynik memset(action, 0, MLX5_FLD_SZ_BYTES(ste_mask_and_match_v1, action)); 6134e856c5dSYevgeny Kliteynik } 6144e856c5dSYevgeny Kliteynik 615be6d5daeSYevgeny Kliteynik static void dr_ste_v1_arr_init_next_match_range(u8 **last_ste, 616be6d5daeSYevgeny Kliteynik u32 *added_stes, 617be6d5daeSYevgeny Kliteynik u16 gvmi) 618be6d5daeSYevgeny Kliteynik { 619be6d5daeSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(last_ste, added_stes, gvmi); 620be6d5daeSYevgeny Kliteynik dr_ste_v1_set_entry_type(*last_ste, DR_STE_V1_TYPE_MATCH_RANGES); 621be6d5daeSYevgeny Kliteynik } 622be6d5daeSYevgeny Kliteynik 6236862c787SYevgeny Kliteynik void dr_ste_v1_set_actions_tx(struct mlx5dr_domain *dmn, 6244e856c5dSYevgeny Kliteynik u8 *action_type_set, 625638a07f1SYevgeny Kliteynik u32 actions_caps, 6264e856c5dSYevgeny Kliteynik u8 *last_ste, 6274e856c5dSYevgeny Kliteynik struct mlx5dr_ste_actions_attr *attr, 6284e856c5dSYevgeny Kliteynik u32 *added_stes) 6294e856c5dSYevgeny Kliteynik { 6304e856c5dSYevgeny Kliteynik u8 *action = MLX5_ADDR_OF(ste_match_bwc_v1, last_ste, action); 6314e856c5dSYevgeny Kliteynik u8 action_sz = DR_STE_ACTION_DOUBLE_SZ; 6322de40f68SYevgeny Kliteynik bool allow_modify_hdr = true; 6334e856c5dSYevgeny Kliteynik bool allow_encap = true; 6344e856c5dSYevgeny Kliteynik 6352de40f68SYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_POP_VLAN]) { 6362de40f68SYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ) { 6372de40f68SYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, 6382de40f68SYevgeny Kliteynik attr->gvmi); 6392de40f68SYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, 6402de40f68SYevgeny Kliteynik last_ste, action); 6412de40f68SYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6422de40f68SYevgeny Kliteynik } 6432de40f68SYevgeny Kliteynik dr_ste_v1_set_pop_vlan(last_ste, action, attr->vlans.count); 6442de40f68SYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 6452de40f68SYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 646638a07f1SYevgeny Kliteynik 647638a07f1SYevgeny Kliteynik /* Check if vlan_pop and modify_hdr on same STE is supported */ 648638a07f1SYevgeny Kliteynik if (!(actions_caps & DR_STE_CTX_ACTION_CAP_POP_MDFY)) 649638a07f1SYevgeny Kliteynik allow_modify_hdr = false; 6502de40f68SYevgeny Kliteynik } 6512de40f68SYevgeny Kliteynik 6524e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_MODIFY_HDR]) { 6532de40f68SYevgeny Kliteynik if (!allow_modify_hdr || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 6544e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, 6554e856c5dSYevgeny Kliteynik attr->gvmi); 6564e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, 6574e856c5dSYevgeny Kliteynik last_ste, action); 6584e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6594e856c5dSYevgeny Kliteynik } 6604e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 6614e856c5dSYevgeny Kliteynik attr->modify_actions, 66262e40c85SYevgeny Kliteynik attr->modify_pat_idx, 663*40ff097fSYevgeny Kliteynik attr->modify_index, 664*40ff097fSYevgeny Kliteynik attr->single_modify_action); 6654e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 6664e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 6674e856c5dSYevgeny Kliteynik allow_encap = false; 6684e856c5dSYevgeny Kliteynik } 6694e856c5dSYevgeny Kliteynik 6704e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_PUSH_VLAN]) { 6714e856c5dSYevgeny Kliteynik int i; 6724e856c5dSYevgeny Kliteynik 6734e856c5dSYevgeny Kliteynik for (i = 0; i < attr->vlans.count; i++) { 6744e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ || !allow_encap) { 6754e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 6764e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 6774e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6784e856c5dSYevgeny Kliteynik allow_encap = true; 6794e856c5dSYevgeny Kliteynik } 6802de40f68SYevgeny Kliteynik dr_ste_v1_set_push_vlan(last_ste, action, 6812de40f68SYevgeny Kliteynik attr->vlans.headers[i]); 6824e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 6834e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 6844e856c5dSYevgeny Kliteynik } 6854e856c5dSYevgeny Kliteynik } 6864e856c5dSYevgeny Kliteynik 6874e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L2]) { 6884e856c5dSYevgeny Kliteynik if (!allow_encap || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 6894e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 6904e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 6914e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6924e856c5dSYevgeny Kliteynik allow_encap = true; 6934e856c5dSYevgeny Kliteynik } 694d7418b4eSYevgeny Kliteynik dr_ste_v1_set_encap(last_ste, action, 6957ea9b398SYevgeny Kliteynik attr->reformat.id, 6967ea9b398SYevgeny Kliteynik attr->reformat.size); 6974e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 6984e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 6994e856c5dSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L3]) { 7004e856c5dSYevgeny Kliteynik u8 *d_action; 7014e856c5dSYevgeny Kliteynik 702515ce2ffSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_TRIPLE_SZ) { 7034e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 7044e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 7054e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 706515ce2ffSYevgeny Kliteynik } 7074e856c5dSYevgeny Kliteynik d_action = action + DR_STE_ACTION_SINGLE_SZ; 7084e856c5dSYevgeny Kliteynik 709d7418b4eSYevgeny Kliteynik dr_ste_v1_set_encap_l3(last_ste, 7104e856c5dSYevgeny Kliteynik action, d_action, 7117ea9b398SYevgeny Kliteynik attr->reformat.id, 7127ea9b398SYevgeny Kliteynik attr->reformat.size); 7134e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_TRIPLE_SZ; 7144e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_TRIPLE_SZ; 7157ea9b398SYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_INSERT_HDR]) { 7167ea9b398SYevgeny Kliteynik if (!allow_encap || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 7177ea9b398SYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 7187ea9b398SYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 7197ea9b398SYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 7207ea9b398SYevgeny Kliteynik } 7217ea9b398SYevgeny Kliteynik dr_ste_v1_set_insert_hdr(last_ste, action, 7227ea9b398SYevgeny Kliteynik attr->reformat.id, 7237ea9b398SYevgeny Kliteynik attr->reformat.param_0, 7247ea9b398SYevgeny Kliteynik attr->reformat.param_1, 7257ea9b398SYevgeny Kliteynik attr->reformat.size); 7267ea9b398SYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 7277ea9b398SYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 7280139145fSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_REMOVE_HDR]) { 7290139145fSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ) { 7300139145fSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 7310139145fSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 7320139145fSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 7330139145fSYevgeny Kliteynik } 7340139145fSYevgeny Kliteynik dr_ste_v1_set_remove_hdr(last_ste, action, 7350139145fSYevgeny Kliteynik attr->reformat.param_0, 7360139145fSYevgeny Kliteynik attr->reformat.param_1, 7370139145fSYevgeny Kliteynik attr->reformat.size); 7380139145fSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 7390139145fSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 7404e856c5dSYevgeny Kliteynik } 7414e856c5dSYevgeny Kliteynik 7428920d92bSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_ASO_FLOW_METER]) { 7438920d92bSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ) { 7448920d92bSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 7458920d92bSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 7468920d92bSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 7478920d92bSYevgeny Kliteynik } 7488920d92bSYevgeny Kliteynik dr_ste_v1_set_aso_flow_meter(action, 7498920d92bSYevgeny Kliteynik attr->aso_flow_meter.obj_id, 7508920d92bSYevgeny Kliteynik attr->aso_flow_meter.offset, 7518920d92bSYevgeny Kliteynik attr->aso_flow_meter.dest_reg_id, 7528920d92bSYevgeny Kliteynik attr->aso_flow_meter.init_color); 7538920d92bSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 7548920d92bSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 7558920d92bSYevgeny Kliteynik } 7568920d92bSYevgeny Kliteynik 757be6d5daeSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_RANGE]) { 758be6d5daeSYevgeny Kliteynik /* match ranges requires a new STE of its own type */ 759be6d5daeSYevgeny Kliteynik dr_ste_v1_arr_init_next_match_range(&last_ste, added_stes, attr->gvmi); 760be6d5daeSYevgeny Kliteynik dr_ste_v1_set_miss_addr(last_ste, attr->range.miss_icm_addr); 761be6d5daeSYevgeny Kliteynik 762be6d5daeSYevgeny Kliteynik /* we do not support setting any action on the match ranges STE */ 763be6d5daeSYevgeny Kliteynik action_sz = 0; 764be6d5daeSYevgeny Kliteynik 765be6d5daeSYevgeny Kliteynik dr_ste_v1_set_match_range_pkt_len(last_ste, 766be6d5daeSYevgeny Kliteynik attr->range.definer_id, 767be6d5daeSYevgeny Kliteynik attr->range.min, 768be6d5daeSYevgeny Kliteynik attr->range.max); 769be6d5daeSYevgeny Kliteynik } 770be6d5daeSYevgeny Kliteynik 771cee6484eSYevgeny Kliteynik /* set counter ID on the last STE to adhere to DMFS behavior */ 772cee6484eSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_CTR]) 773cee6484eSYevgeny Kliteynik dr_ste_v1_set_counter_id(last_ste, attr->ctr_id); 774cee6484eSYevgeny Kliteynik 7754e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_gvmi(last_ste, attr->hit_gvmi); 7764e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_addr(last_ste, attr->final_icm_addr, 1); 7774e856c5dSYevgeny Kliteynik } 7784e856c5dSYevgeny Kliteynik 7796862c787SYevgeny Kliteynik void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn, 7804e856c5dSYevgeny Kliteynik u8 *action_type_set, 781638a07f1SYevgeny Kliteynik u32 actions_caps, 7824e856c5dSYevgeny Kliteynik u8 *last_ste, 7834e856c5dSYevgeny Kliteynik struct mlx5dr_ste_actions_attr *attr, 7844e856c5dSYevgeny Kliteynik u32 *added_stes) 7854e856c5dSYevgeny Kliteynik { 7864e856c5dSYevgeny Kliteynik u8 *action = MLX5_ADDR_OF(ste_match_bwc_v1, last_ste, action); 7874e856c5dSYevgeny Kliteynik u8 action_sz = DR_STE_ACTION_DOUBLE_SZ; 7884e856c5dSYevgeny Kliteynik bool allow_modify_hdr = true; 7894e856c5dSYevgeny Kliteynik bool allow_ctr = true; 7904e856c5dSYevgeny Kliteynik 7914e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_TNL_L3_TO_L2]) { 7924e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 7934e856c5dSYevgeny Kliteynik attr->decap_actions, 79462e40c85SYevgeny Kliteynik attr->decap_pat_idx, 795*40ff097fSYevgeny Kliteynik attr->decap_index, 796*40ff097fSYevgeny Kliteynik NULL); 7974e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 7984e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 7994e856c5dSYevgeny Kliteynik allow_modify_hdr = false; 8004e856c5dSYevgeny Kliteynik allow_ctr = false; 8014e856c5dSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_TNL_L2_TO_L2]) { 8024e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_decap(last_ste, action); 8034e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 8044e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 8054e856c5dSYevgeny Kliteynik allow_modify_hdr = false; 8064e856c5dSYevgeny Kliteynik allow_ctr = false; 8074e856c5dSYevgeny Kliteynik } 8084e856c5dSYevgeny Kliteynik 8094e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_TAG]) { 8104e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ) { 8114e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 8124e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 8134e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 8144e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 8154e856c5dSYevgeny Kliteynik allow_ctr = true; 8164e856c5dSYevgeny Kliteynik } 8174e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_flow_tag(action, attr->flow_tag); 8184e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 8194e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 8204e856c5dSYevgeny Kliteynik } 8214e856c5dSYevgeny Kliteynik 8224e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_POP_VLAN]) { 8234e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ || 8244e856c5dSYevgeny Kliteynik !allow_modify_hdr) { 8254e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 8264e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 8274e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 8284e856c5dSYevgeny Kliteynik } 8294e856c5dSYevgeny Kliteynik 8302de40f68SYevgeny Kliteynik dr_ste_v1_set_pop_vlan(last_ste, action, attr->vlans.count); 8314e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 8324e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 833bdc3ab57SYevgeny Kliteynik allow_ctr = false; 834638a07f1SYevgeny Kliteynik 835638a07f1SYevgeny Kliteynik /* Check if vlan_pop and modify_hdr on same STE is supported */ 836638a07f1SYevgeny Kliteynik if (!(actions_caps & DR_STE_CTX_ACTION_CAP_POP_MDFY)) 837638a07f1SYevgeny Kliteynik allow_modify_hdr = false; 8384e856c5dSYevgeny Kliteynik } 8394e856c5dSYevgeny Kliteynik 8404e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_MODIFY_HDR]) { 8414e856c5dSYevgeny Kliteynik /* Modify header and decapsulation must use different STEs */ 8424e856c5dSYevgeny Kliteynik if (!allow_modify_hdr || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 8434e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 8444e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 8454e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 8464e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 8474e856c5dSYevgeny Kliteynik allow_ctr = true; 8484e856c5dSYevgeny Kliteynik } 8494e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 8504e856c5dSYevgeny Kliteynik attr->modify_actions, 85162e40c85SYevgeny Kliteynik attr->modify_pat_idx, 852*40ff097fSYevgeny Kliteynik attr->modify_index, 853*40ff097fSYevgeny Kliteynik attr->single_modify_action); 8544e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 8554e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 8564e856c5dSYevgeny Kliteynik } 8574e856c5dSYevgeny Kliteynik 8582de40f68SYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_PUSH_VLAN]) { 8592de40f68SYevgeny Kliteynik int i; 8602de40f68SYevgeny Kliteynik 8612de40f68SYevgeny Kliteynik for (i = 0; i < attr->vlans.count; i++) { 8622de40f68SYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ || 8632de40f68SYevgeny Kliteynik !allow_modify_hdr) { 8642de40f68SYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, 8652de40f68SYevgeny Kliteynik added_stes, 8662de40f68SYevgeny Kliteynik attr->gvmi); 8672de40f68SYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, 8682de40f68SYevgeny Kliteynik last_ste, action); 8692de40f68SYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 8702de40f68SYevgeny Kliteynik } 8712de40f68SYevgeny Kliteynik dr_ste_v1_set_push_vlan(last_ste, action, 8722de40f68SYevgeny Kliteynik attr->vlans.headers[i]); 8732de40f68SYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 8742de40f68SYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 8752de40f68SYevgeny Kliteynik } 8762de40f68SYevgeny Kliteynik } 8772de40f68SYevgeny Kliteynik 8784e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_CTR]) { 8797ea9b398SYevgeny Kliteynik /* Counter action set after decap and before insert_hdr 8807ea9b398SYevgeny Kliteynik * to exclude decaped / encaped header respectively. 8817ea9b398SYevgeny Kliteynik */ 8824e856c5dSYevgeny Kliteynik if (!allow_ctr) { 8834e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 8844e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 8854e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 8864e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 8874e856c5dSYevgeny Kliteynik } 8884e856c5dSYevgeny Kliteynik dr_ste_v1_set_counter_id(last_ste, attr->ctr_id); 889bdc3ab57SYevgeny Kliteynik allow_ctr = false; 8904e856c5dSYevgeny Kliteynik } 8914e856c5dSYevgeny Kliteynik 892d7418b4eSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L2]) { 893d7418b4eSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ) { 894d7418b4eSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 895d7418b4eSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 896d7418b4eSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 897d7418b4eSYevgeny Kliteynik } 898d7418b4eSYevgeny Kliteynik dr_ste_v1_set_encap(last_ste, action, 8997ea9b398SYevgeny Kliteynik attr->reformat.id, 9007ea9b398SYevgeny Kliteynik attr->reformat.size); 901d7418b4eSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 902d7418b4eSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 903d7418b4eSYevgeny Kliteynik allow_modify_hdr = false; 904d7418b4eSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L3]) { 905d7418b4eSYevgeny Kliteynik u8 *d_action; 906d7418b4eSYevgeny Kliteynik 907d7418b4eSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_TRIPLE_SZ) { 908d7418b4eSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 909d7418b4eSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 910d7418b4eSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 911d7418b4eSYevgeny Kliteynik } 912d7418b4eSYevgeny Kliteynik 913d7418b4eSYevgeny Kliteynik d_action = action + DR_STE_ACTION_SINGLE_SZ; 914d7418b4eSYevgeny Kliteynik 915d7418b4eSYevgeny Kliteynik dr_ste_v1_set_encap_l3(last_ste, 916d7418b4eSYevgeny Kliteynik action, d_action, 9177ea9b398SYevgeny Kliteynik attr->reformat.id, 9187ea9b398SYevgeny Kliteynik attr->reformat.size); 919d7418b4eSYevgeny Kliteynik action_sz -= DR_STE_ACTION_TRIPLE_SZ; 920d7418b4eSYevgeny Kliteynik allow_modify_hdr = false; 9217ea9b398SYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_INSERT_HDR]) { 9227ea9b398SYevgeny Kliteynik /* Modify header, decap, and encap must use different STEs */ 9237ea9b398SYevgeny Kliteynik if (!allow_modify_hdr || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 9247ea9b398SYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 9257ea9b398SYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 9267ea9b398SYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 9277ea9b398SYevgeny Kliteynik } 9287ea9b398SYevgeny Kliteynik dr_ste_v1_set_insert_hdr(last_ste, action, 9297ea9b398SYevgeny Kliteynik attr->reformat.id, 9307ea9b398SYevgeny Kliteynik attr->reformat.param_0, 9317ea9b398SYevgeny Kliteynik attr->reformat.param_1, 9327ea9b398SYevgeny Kliteynik attr->reformat.size); 9337ea9b398SYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 9347ea9b398SYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 9357ea9b398SYevgeny Kliteynik allow_modify_hdr = false; 9360139145fSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_REMOVE_HDR]) { 9370139145fSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ) { 9380139145fSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 9390139145fSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 9400139145fSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 9410139145fSYevgeny Kliteynik allow_modify_hdr = true; 9420139145fSYevgeny Kliteynik allow_ctr = true; 9430139145fSYevgeny Kliteynik } 9440139145fSYevgeny Kliteynik dr_ste_v1_set_remove_hdr(last_ste, action, 9450139145fSYevgeny Kliteynik attr->reformat.param_0, 9460139145fSYevgeny Kliteynik attr->reformat.param_1, 9470139145fSYevgeny Kliteynik attr->reformat.size); 9480139145fSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 9490139145fSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 950d7418b4eSYevgeny Kliteynik } 951d7418b4eSYevgeny Kliteynik 9528920d92bSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_ASO_FLOW_METER]) { 9538920d92bSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ) { 9548920d92bSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 9558920d92bSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 9568920d92bSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 9578920d92bSYevgeny Kliteynik } 9588920d92bSYevgeny Kliteynik dr_ste_v1_set_aso_flow_meter(action, 9598920d92bSYevgeny Kliteynik attr->aso_flow_meter.obj_id, 9608920d92bSYevgeny Kliteynik attr->aso_flow_meter.offset, 9618920d92bSYevgeny Kliteynik attr->aso_flow_meter.dest_reg_id, 9628920d92bSYevgeny Kliteynik attr->aso_flow_meter.init_color); 9638920d92bSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 9648920d92bSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 9658920d92bSYevgeny Kliteynik } 9668920d92bSYevgeny Kliteynik 967be6d5daeSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_RANGE]) { 968be6d5daeSYevgeny Kliteynik /* match ranges requires a new STE of its own type */ 969be6d5daeSYevgeny Kliteynik dr_ste_v1_arr_init_next_match_range(&last_ste, added_stes, attr->gvmi); 970be6d5daeSYevgeny Kliteynik dr_ste_v1_set_miss_addr(last_ste, attr->range.miss_icm_addr); 971be6d5daeSYevgeny Kliteynik 972be6d5daeSYevgeny Kliteynik /* we do not support setting any action on the match ranges STE */ 973be6d5daeSYevgeny Kliteynik action_sz = 0; 974be6d5daeSYevgeny Kliteynik 975be6d5daeSYevgeny Kliteynik dr_ste_v1_set_match_range_pkt_len(last_ste, 976be6d5daeSYevgeny Kliteynik attr->range.definer_id, 977be6d5daeSYevgeny Kliteynik attr->range.min, 978be6d5daeSYevgeny Kliteynik attr->range.max); 979be6d5daeSYevgeny Kliteynik } 980be6d5daeSYevgeny Kliteynik 9814e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_gvmi(last_ste, attr->hit_gvmi); 9824e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_addr(last_ste, attr->final_icm_addr, 1); 9834e856c5dSYevgeny Kliteynik } 9844e856c5dSYevgeny Kliteynik 9856862c787SYevgeny Kliteynik void dr_ste_v1_set_action_set(u8 *d_action, 986c349b413SYevgeny Kliteynik u8 hw_field, 987c349b413SYevgeny Kliteynik u8 shifter, 988c349b413SYevgeny Kliteynik u8 length, 989c349b413SYevgeny Kliteynik u32 data) 990c349b413SYevgeny Kliteynik { 991c349b413SYevgeny Kliteynik shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 992c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, action_id, DR_STE_V1_ACTION_ID_SET); 993c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, destination_dw_offset, hw_field); 994c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, destination_left_shifter, shifter); 995c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, destination_length, length); 996c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, inline_data, data); 997c349b413SYevgeny Kliteynik } 998c349b413SYevgeny Kliteynik 9996862c787SYevgeny Kliteynik void dr_ste_v1_set_action_add(u8 *d_action, 1000c349b413SYevgeny Kliteynik u8 hw_field, 1001c349b413SYevgeny Kliteynik u8 shifter, 1002c349b413SYevgeny Kliteynik u8 length, 1003c349b413SYevgeny Kliteynik u32 data) 1004c349b413SYevgeny Kliteynik { 1005c349b413SYevgeny Kliteynik shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 1006c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, action_id, DR_STE_V1_ACTION_ID_ADD); 1007c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, destination_dw_offset, hw_field); 1008c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, destination_left_shifter, shifter); 1009c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, destination_length, length); 1010c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, add_value, data); 1011c349b413SYevgeny Kliteynik } 1012c349b413SYevgeny Kliteynik 10136862c787SYevgeny Kliteynik void dr_ste_v1_set_action_copy(u8 *d_action, 1014c349b413SYevgeny Kliteynik u8 dst_hw_field, 1015c349b413SYevgeny Kliteynik u8 dst_shifter, 1016c349b413SYevgeny Kliteynik u8 dst_len, 1017c349b413SYevgeny Kliteynik u8 src_hw_field, 1018c349b413SYevgeny Kliteynik u8 src_shifter) 1019c349b413SYevgeny Kliteynik { 1020c349b413SYevgeny Kliteynik dst_shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 1021c349b413SYevgeny Kliteynik src_shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 1022c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, action_id, DR_STE_V1_ACTION_ID_COPY); 1023c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, destination_dw_offset, dst_hw_field); 1024c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, destination_left_shifter, dst_shifter); 1025c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, destination_length, dst_len); 1026c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, source_dw_offset, src_hw_field); 1027c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, source_right_shifter, src_shifter); 1028c349b413SYevgeny Kliteynik } 1029c349b413SYevgeny Kliteynik 1030c349b413SYevgeny Kliteynik #define DR_STE_DECAP_L3_ACTION_NUM 8 1031c349b413SYevgeny Kliteynik #define DR_STE_L2_HDR_MAX_SZ 20 1032c349b413SYevgeny Kliteynik 10336862c787SYevgeny Kliteynik int dr_ste_v1_set_action_decap_l3_list(void *data, 1034c349b413SYevgeny Kliteynik u32 data_sz, 1035c349b413SYevgeny Kliteynik u8 *hw_action, 1036c349b413SYevgeny Kliteynik u32 hw_action_sz, 1037c349b413SYevgeny Kliteynik u16 *used_hw_action_num) 1038c349b413SYevgeny Kliteynik { 1039c349b413SYevgeny Kliteynik u8 padded_data[DR_STE_L2_HDR_MAX_SZ] = {}; 1040c349b413SYevgeny Kliteynik void *data_ptr = padded_data; 1041c349b413SYevgeny Kliteynik u16 used_actions = 0; 1042c349b413SYevgeny Kliteynik u32 inline_data_sz; 1043c349b413SYevgeny Kliteynik u32 i; 1044c349b413SYevgeny Kliteynik 1045c349b413SYevgeny Kliteynik if (hw_action_sz / DR_STE_ACTION_DOUBLE_SZ < DR_STE_DECAP_L3_ACTION_NUM) 1046c349b413SYevgeny Kliteynik return -EINVAL; 1047c349b413SYevgeny Kliteynik 104865fb7d10SAlex Vesker inline_data_sz = 104965fb7d10SAlex Vesker MLX5_FLD_SZ_BYTES(ste_double_action_insert_with_inline_v1, inline_data); 105065fb7d10SAlex Vesker 105165fb7d10SAlex Vesker /* Add an alignment padding */ 105265fb7d10SAlex Vesker memcpy(padded_data + data_sz % inline_data_sz, data, data_sz); 1053c349b413SYevgeny Kliteynik 1054c349b413SYevgeny Kliteynik /* Remove L2L3 outer headers */ 1055c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, action_id, 1056c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 1057c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, decap, 1); 1058c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, vni_to_cqe, 1); 1059c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, end_anchor, 1060c349b413SYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_IPV6_IPV4); 1061c349b413SYevgeny Kliteynik hw_action += DR_STE_ACTION_DOUBLE_SZ; 1062c349b413SYevgeny Kliteynik used_actions++; /* Remove and NOP are a single double action */ 1063c349b413SYevgeny Kliteynik 106465fb7d10SAlex Vesker /* Point to the last dword of the header */ 106565fb7d10SAlex Vesker data_ptr += (data_sz / inline_data_sz) * inline_data_sz; 1066c349b413SYevgeny Kliteynik 106765fb7d10SAlex Vesker /* Add the new header using inline action 4Byte at a time, the header 106865fb7d10SAlex Vesker * is added in reversed order to the beginning of the packet to avoid 106965fb7d10SAlex Vesker * incorrect parsing by the HW. Since header is 14B or 18B an extra 107065fb7d10SAlex Vesker * two bytes are padded and later removed. 107165fb7d10SAlex Vesker */ 1072c349b413SYevgeny Kliteynik for (i = 0; i < data_sz / inline_data_sz + 1; i++) { 1073c349b413SYevgeny Kliteynik void *addr_inline; 1074c349b413SYevgeny Kliteynik 1075c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, hw_action, action_id, 1076c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_INLINE); 1077c349b413SYevgeny Kliteynik /* The hardware expects here offset to words (2 bytes) */ 107865fb7d10SAlex Vesker MLX5_SET(ste_double_action_insert_with_inline_v1, hw_action, start_offset, 0); 1079c349b413SYevgeny Kliteynik 1080c349b413SYevgeny Kliteynik /* Copy bytes one by one to avoid endianness problem */ 1081c349b413SYevgeny Kliteynik addr_inline = MLX5_ADDR_OF(ste_double_action_insert_with_inline_v1, 1082c349b413SYevgeny Kliteynik hw_action, inline_data); 108365fb7d10SAlex Vesker memcpy(addr_inline, data_ptr - i * inline_data_sz, inline_data_sz); 1084c349b413SYevgeny Kliteynik hw_action += DR_STE_ACTION_DOUBLE_SZ; 1085c349b413SYevgeny Kliteynik used_actions++; 1086c349b413SYevgeny Kliteynik } 1087c349b413SYevgeny Kliteynik 108865fb7d10SAlex Vesker /* Remove first 2 extra bytes */ 1089c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, hw_action, action_id, 1090c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE); 109165fb7d10SAlex Vesker MLX5_SET(ste_single_action_remove_header_size_v1, hw_action, start_offset, 0); 1092c349b413SYevgeny Kliteynik /* The hardware expects here size in words (2 bytes) */ 1093c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, hw_action, remove_size, 1); 1094c349b413SYevgeny Kliteynik used_actions++; 1095c349b413SYevgeny Kliteynik 1096c349b413SYevgeny Kliteynik *used_hw_action_num = used_actions; 1097c349b413SYevgeny Kliteynik 1098c349b413SYevgeny Kliteynik return 0; 1099c349b413SYevgeny Kliteynik } 1100c349b413SYevgeny Kliteynik 110110b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_dst_bit_mask(struct mlx5dr_match_param *value, 110210b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 110310b69418SYevgeny Kliteynik { 110410b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 110510b69418SYevgeny Kliteynik 110610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 110710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 110810b69418SYevgeny Kliteynik 110910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, smac_47_16, mask, smac_47_16); 111010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, smac_15_0, mask, smac_15_0); 111110b69418SYevgeny Kliteynik 111210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_vlan_id, mask, first_vid); 111310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_cfi, mask, first_cfi); 111410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_priority, mask, first_prio); 111510b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_src_dst_v1, bit_mask, l3_type, mask, ip_version); 111610b69418SYevgeny Kliteynik 111710b69418SYevgeny Kliteynik if (mask->cvlan_tag) { 111810b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, bit_mask, first_vlan_qualifier, -1); 111910b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 112010b69418SYevgeny Kliteynik } else if (mask->svlan_tag) { 112110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, bit_mask, first_vlan_qualifier, -1); 112210b69418SYevgeny Kliteynik mask->svlan_tag = 0; 112310b69418SYevgeny Kliteynik } 112410b69418SYevgeny Kliteynik } 112510b69418SYevgeny Kliteynik 112610b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_dst_tag(struct mlx5dr_match_param *value, 112710b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 112810b69418SYevgeny Kliteynik u8 *tag) 112910b69418SYevgeny Kliteynik { 113010b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 113110b69418SYevgeny Kliteynik 113210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, dmac_47_16, spec, dmac_47_16); 113310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, dmac_15_0, spec, dmac_15_0); 113410b69418SYevgeny Kliteynik 113510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, smac_47_16, spec, smac_47_16); 113610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, smac_15_0, spec, smac_15_0); 113710b69418SYevgeny Kliteynik 113810b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 113910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, l3_type, STE_IPV4); 114010b69418SYevgeny Kliteynik spec->ip_version = 0; 114110b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 114210b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, l3_type, STE_IPV6); 114310b69418SYevgeny Kliteynik spec->ip_version = 0; 114410b69418SYevgeny Kliteynik } else if (spec->ip_version) { 114510b69418SYevgeny Kliteynik return -EINVAL; 114610b69418SYevgeny Kliteynik } 114710b69418SYevgeny Kliteynik 114810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_vlan_id, spec, first_vid); 114910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_cfi, spec, first_cfi); 115010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_priority, spec, first_prio); 115110b69418SYevgeny Kliteynik 115210b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 115310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 115410b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 115510b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 115610b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 115710b69418SYevgeny Kliteynik spec->svlan_tag = 0; 115810b69418SYevgeny Kliteynik } 115910b69418SYevgeny Kliteynik return 0; 116010b69418SYevgeny Kliteynik } 116110b69418SYevgeny Kliteynik 11626862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l2_src_dst_init(struct mlx5dr_ste_build *sb, 116310b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 116410b69418SYevgeny Kliteynik { 116510b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_dst_bit_mask(mask, sb->inner, sb->bit_mask); 116610b69418SYevgeny Kliteynik 116710b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2_SRC_DST, sb->inner); 116810b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 116910b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_src_dst_tag; 117010b69418SYevgeny Kliteynik } 117110b69418SYevgeny Kliteynik 117210b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv6_dst_tag(struct mlx5dr_match_param *value, 117310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 117410b69418SYevgeny Kliteynik u8 *tag) 117510b69418SYevgeny Kliteynik { 117610b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 117710b69418SYevgeny Kliteynik 117810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_127_96, spec, dst_ip_127_96); 117910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_95_64, spec, dst_ip_95_64); 118010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_63_32, spec, dst_ip_63_32); 118110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_31_0, spec, dst_ip_31_0); 118210b69418SYevgeny Kliteynik 118310b69418SYevgeny Kliteynik return 0; 118410b69418SYevgeny Kliteynik } 118510b69418SYevgeny Kliteynik 11866862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l3_ipv6_dst_init(struct mlx5dr_ste_build *sb, 118710b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 118810b69418SYevgeny Kliteynik { 118910b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv6_dst_tag(mask, sb, sb->bit_mask); 119010b69418SYevgeny Kliteynik 119110b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(IPV6_DES, sb->inner); 119210b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 119310b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv6_dst_tag; 119410b69418SYevgeny Kliteynik } 119510b69418SYevgeny Kliteynik 119610b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv6_src_tag(struct mlx5dr_match_param *value, 119710b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 119810b69418SYevgeny Kliteynik u8 *tag) 119910b69418SYevgeny Kliteynik { 120010b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 120110b69418SYevgeny Kliteynik 120210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_127_96, spec, src_ip_127_96); 120310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_95_64, spec, src_ip_95_64); 120410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_63_32, spec, src_ip_63_32); 120510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_31_0, spec, src_ip_31_0); 120610b69418SYevgeny Kliteynik 120710b69418SYevgeny Kliteynik return 0; 120810b69418SYevgeny Kliteynik } 120910b69418SYevgeny Kliteynik 12106862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l3_ipv6_src_init(struct mlx5dr_ste_build *sb, 121110b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 121210b69418SYevgeny Kliteynik { 121310b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv6_src_tag(mask, sb, sb->bit_mask); 121410b69418SYevgeny Kliteynik 121510b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(IPV6_SRC, sb->inner); 121610b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 121710b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv6_src_tag; 121810b69418SYevgeny Kliteynik } 121910b69418SYevgeny Kliteynik 122010b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag(struct mlx5dr_match_param *value, 122110b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 122210b69418SYevgeny Kliteynik u8 *tag) 122310b69418SYevgeny Kliteynik { 122410b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 122510b69418SYevgeny Kliteynik 122610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_address, spec, dst_ip_31_0); 122710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_address, spec, src_ip_31_0); 122810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_port, spec, tcp_dport); 122910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_port, spec, udp_dport); 123010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_port, spec, tcp_sport); 123110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_port, spec, udp_sport); 123210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, protocol, spec, ip_protocol); 123310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, fragmented, spec, frag); 123410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, dscp, spec, ip_dscp); 123510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, ecn, spec, ip_ecn); 123610b69418SYevgeny Kliteynik 123710b69418SYevgeny Kliteynik if (spec->tcp_flags) { 123810b69418SYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l3_ipv4_5_tuple_v1, tag, spec); 123910b69418SYevgeny Kliteynik spec->tcp_flags = 0; 124010b69418SYevgeny Kliteynik } 124110b69418SYevgeny Kliteynik 124210b69418SYevgeny Kliteynik return 0; 124310b69418SYevgeny Kliteynik } 124410b69418SYevgeny Kliteynik 12456862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l3_ipv4_5_tuple_init(struct mlx5dr_ste_build *sb, 124610b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 124710b69418SYevgeny Kliteynik { 124810b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag(mask, sb, sb->bit_mask); 124910b69418SYevgeny Kliteynik 125010b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL3_IPV4_5_TUPLE, sb->inner); 125110b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 125210b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag; 125310b69418SYevgeny Kliteynik } 125410b69418SYevgeny Kliteynik 125510b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(struct mlx5dr_match_param *value, 125610b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 125710b69418SYevgeny Kliteynik { 125810b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 125910b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 126010b69418SYevgeny Kliteynik 126110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_vlan_id, mask, first_vid); 126210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_cfi, mask, first_cfi); 126310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_priority, mask, first_prio); 126411659ef8SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, ip_fragmented, mask, frag); 126511659ef8SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, l3_ethertype, mask, ethertype); 126610b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_src_v1, bit_mask, l3_type, mask, ip_version); 126710b69418SYevgeny Kliteynik 126810b69418SYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 126910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, first_vlan_qualifier, -1); 127010b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 127110b69418SYevgeny Kliteynik mask->svlan_tag = 0; 127210b69418SYevgeny Kliteynik } 127310b69418SYevgeny Kliteynik 127410b69418SYevgeny Kliteynik if (inner) { 127510b69418SYevgeny Kliteynik if (misc_mask->inner_second_cvlan_tag || 127610b69418SYevgeny Kliteynik misc_mask->inner_second_svlan_tag) { 127710b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, second_vlan_qualifier, -1); 127810b69418SYevgeny Kliteynik misc_mask->inner_second_cvlan_tag = 0; 127910b69418SYevgeny Kliteynik misc_mask->inner_second_svlan_tag = 0; 128010b69418SYevgeny Kliteynik } 128110b69418SYevgeny Kliteynik 128210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 128310b69418SYevgeny Kliteynik second_vlan_id, misc_mask, inner_second_vid); 128410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 128510b69418SYevgeny Kliteynik second_cfi, misc_mask, inner_second_cfi); 128610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 128710b69418SYevgeny Kliteynik second_priority, misc_mask, inner_second_prio); 128810b69418SYevgeny Kliteynik } else { 128910b69418SYevgeny Kliteynik if (misc_mask->outer_second_cvlan_tag || 129010b69418SYevgeny Kliteynik misc_mask->outer_second_svlan_tag) { 129110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, second_vlan_qualifier, -1); 129210b69418SYevgeny Kliteynik misc_mask->outer_second_cvlan_tag = 0; 129310b69418SYevgeny Kliteynik misc_mask->outer_second_svlan_tag = 0; 129410b69418SYevgeny Kliteynik } 129510b69418SYevgeny Kliteynik 129610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 129710b69418SYevgeny Kliteynik second_vlan_id, misc_mask, outer_second_vid); 129810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 129910b69418SYevgeny Kliteynik second_cfi, misc_mask, outer_second_cfi); 130010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 130110b69418SYevgeny Kliteynik second_priority, misc_mask, outer_second_prio); 130210b69418SYevgeny Kliteynik } 130310b69418SYevgeny Kliteynik } 130410b69418SYevgeny Kliteynik 130510b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_or_dst_tag(struct mlx5dr_match_param *value, 130610b69418SYevgeny Kliteynik bool inner, u8 *tag) 130710b69418SYevgeny Kliteynik { 130810b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = inner ? &value->inner : &value->outer; 130910b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_spec = &value->misc; 131010b69418SYevgeny Kliteynik 131110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_vlan_id, spec, first_vid); 131210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_cfi, spec, first_cfi); 131310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_priority, spec, first_prio); 131410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, ip_fragmented, spec, frag); 131510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, l3_ethertype, spec, ethertype); 131610b69418SYevgeny Kliteynik 131710b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 131810b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, l3_type, STE_IPV4); 131910b69418SYevgeny Kliteynik spec->ip_version = 0; 132010b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 132110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, l3_type, STE_IPV6); 132210b69418SYevgeny Kliteynik spec->ip_version = 0; 132310b69418SYevgeny Kliteynik } else if (spec->ip_version) { 132410b69418SYevgeny Kliteynik return -EINVAL; 132510b69418SYevgeny Kliteynik } 132610b69418SYevgeny Kliteynik 132710b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 132810b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 132910b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 133010b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 133110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 133210b69418SYevgeny Kliteynik spec->svlan_tag = 0; 133310b69418SYevgeny Kliteynik } 133410b69418SYevgeny Kliteynik 133510b69418SYevgeny Kliteynik if (inner) { 133610b69418SYevgeny Kliteynik if (misc_spec->inner_second_cvlan_tag) { 133710b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_CVLAN); 133810b69418SYevgeny Kliteynik misc_spec->inner_second_cvlan_tag = 0; 133910b69418SYevgeny Kliteynik } else if (misc_spec->inner_second_svlan_tag) { 134010b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_SVLAN); 134110b69418SYevgeny Kliteynik misc_spec->inner_second_svlan_tag = 0; 134210b69418SYevgeny Kliteynik } 134310b69418SYevgeny Kliteynik 134410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_vlan_id, misc_spec, inner_second_vid); 134510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_cfi, misc_spec, inner_second_cfi); 134610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_priority, misc_spec, inner_second_prio); 134710b69418SYevgeny Kliteynik } else { 134810b69418SYevgeny Kliteynik if (misc_spec->outer_second_cvlan_tag) { 134910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_CVLAN); 135010b69418SYevgeny Kliteynik misc_spec->outer_second_cvlan_tag = 0; 135110b69418SYevgeny Kliteynik } else if (misc_spec->outer_second_svlan_tag) { 135210b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_SVLAN); 135310b69418SYevgeny Kliteynik misc_spec->outer_second_svlan_tag = 0; 135410b69418SYevgeny Kliteynik } 135510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_vlan_id, misc_spec, outer_second_vid); 135610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_cfi, misc_spec, outer_second_cfi); 135710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_priority, misc_spec, outer_second_prio); 135810b69418SYevgeny Kliteynik } 135910b69418SYevgeny Kliteynik 136010b69418SYevgeny Kliteynik return 0; 136110b69418SYevgeny Kliteynik } 136210b69418SYevgeny Kliteynik 136310b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_bit_mask(struct mlx5dr_match_param *value, 136410b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 136510b69418SYevgeny Kliteynik { 136610b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 136710b69418SYevgeny Kliteynik 136810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, smac_47_16, mask, smac_47_16); 136910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, smac_15_0, mask, smac_15_0); 137010b69418SYevgeny Kliteynik 137110b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 137210b69418SYevgeny Kliteynik } 137310b69418SYevgeny Kliteynik 137410b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_tag(struct mlx5dr_match_param *value, 137510b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 137610b69418SYevgeny Kliteynik u8 *tag) 137710b69418SYevgeny Kliteynik { 137810b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 137910b69418SYevgeny Kliteynik 138010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, smac_47_16, spec, smac_47_16); 138110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, smac_15_0, spec, smac_15_0); 138210b69418SYevgeny Kliteynik 138310b69418SYevgeny Kliteynik return dr_ste_v1_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 138410b69418SYevgeny Kliteynik } 138510b69418SYevgeny Kliteynik 13866862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l2_src_init(struct mlx5dr_ste_build *sb, 138710b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 138810b69418SYevgeny Kliteynik { 138910b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_bit_mask(mask, sb->inner, sb->bit_mask); 139010b69418SYevgeny Kliteynik 139110b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2_SRC, sb->inner); 139210b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 139310b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_src_tag; 139410b69418SYevgeny Kliteynik } 139510b69418SYevgeny Kliteynik 139610b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_dst_bit_mask(struct mlx5dr_match_param *value, 139710b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 139810b69418SYevgeny Kliteynik { 139910b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 140010b69418SYevgeny Kliteynik 140110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 140210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 140310b69418SYevgeny Kliteynik 140410b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 140510b69418SYevgeny Kliteynik } 140610b69418SYevgeny Kliteynik 140710b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_dst_tag(struct mlx5dr_match_param *value, 140810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 140910b69418SYevgeny Kliteynik u8 *tag) 141010b69418SYevgeny Kliteynik { 141110b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 141210b69418SYevgeny Kliteynik 141310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, tag, dmac_47_16, spec, dmac_47_16); 141410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, tag, dmac_15_0, spec, dmac_15_0); 141510b69418SYevgeny Kliteynik 141610b69418SYevgeny Kliteynik return dr_ste_v1_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 141710b69418SYevgeny Kliteynik } 141810b69418SYevgeny Kliteynik 14196862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l2_dst_init(struct mlx5dr_ste_build *sb, 142010b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 142110b69418SYevgeny Kliteynik { 142210b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_dst_bit_mask(mask, sb->inner, sb->bit_mask); 142310b69418SYevgeny Kliteynik 142410b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2, sb->inner); 142510b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 142610b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_dst_tag; 142710b69418SYevgeny Kliteynik } 142810b69418SYevgeny Kliteynik 142910b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_tnl_bit_mask(struct mlx5dr_match_param *value, 143010b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 143110b69418SYevgeny Kliteynik { 143210b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 143310b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 143410b69418SYevgeny Kliteynik 143510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 143610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 143710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_vlan_id, mask, first_vid); 143810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_cfi, mask, first_cfi); 143910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_priority, mask, first_prio); 144010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, ip_fragmented, mask, frag); 144110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, l3_ethertype, mask, ethertype); 144210b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_tnl_v1, bit_mask, l3_type, mask, ip_version); 144310b69418SYevgeny Kliteynik 144410b69418SYevgeny Kliteynik if (misc->vxlan_vni) { 144510b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, bit_mask, 144610b69418SYevgeny Kliteynik l2_tunneling_network_id, (misc->vxlan_vni << 8)); 144710b69418SYevgeny Kliteynik misc->vxlan_vni = 0; 144810b69418SYevgeny Kliteynik } 144910b69418SYevgeny Kliteynik 145010b69418SYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 145110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, bit_mask, first_vlan_qualifier, -1); 145210b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 145310b69418SYevgeny Kliteynik mask->svlan_tag = 0; 145410b69418SYevgeny Kliteynik } 145510b69418SYevgeny Kliteynik } 145610b69418SYevgeny Kliteynik 145710b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_tnl_tag(struct mlx5dr_match_param *value, 145810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 145910b69418SYevgeny Kliteynik u8 *tag) 146010b69418SYevgeny Kliteynik { 146110b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 146210b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 146310b69418SYevgeny Kliteynik 146410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, dmac_47_16, spec, dmac_47_16); 146510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, dmac_15_0, spec, dmac_15_0); 146610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_vlan_id, spec, first_vid); 146710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_cfi, spec, first_cfi); 146810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, ip_fragmented, spec, frag); 146910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_priority, spec, first_prio); 147010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, l3_ethertype, spec, ethertype); 147110b69418SYevgeny Kliteynik 147210b69418SYevgeny Kliteynik if (misc->vxlan_vni) { 147310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l2_tunneling_network_id, 147410b69418SYevgeny Kliteynik (misc->vxlan_vni << 8)); 147510b69418SYevgeny Kliteynik misc->vxlan_vni = 0; 147610b69418SYevgeny Kliteynik } 147710b69418SYevgeny Kliteynik 147810b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 147910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 148010b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 148110b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 148210b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 148310b69418SYevgeny Kliteynik spec->svlan_tag = 0; 148410b69418SYevgeny Kliteynik } 148510b69418SYevgeny Kliteynik 148610b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 148710b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l3_type, STE_IPV4); 148810b69418SYevgeny Kliteynik spec->ip_version = 0; 148910b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 149010b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l3_type, STE_IPV6); 149110b69418SYevgeny Kliteynik spec->ip_version = 0; 149210b69418SYevgeny Kliteynik } else if (spec->ip_version) { 149310b69418SYevgeny Kliteynik return -EINVAL; 149410b69418SYevgeny Kliteynik } 149510b69418SYevgeny Kliteynik 149610b69418SYevgeny Kliteynik return 0; 149710b69418SYevgeny Kliteynik } 149810b69418SYevgeny Kliteynik 14996862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l2_tnl_init(struct mlx5dr_ste_build *sb, 150010b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 150110b69418SYevgeny Kliteynik { 150210b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_tnl_bit_mask(mask, sb->inner, sb->bit_mask); 150310b69418SYevgeny Kliteynik 150410b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL2_TNL; 150510b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 150610b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_tnl_tag; 150710b69418SYevgeny Kliteynik } 150810b69418SYevgeny Kliteynik 150910b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv4_misc_tag(struct mlx5dr_match_param *value, 151010b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 151110b69418SYevgeny Kliteynik u8 *tag) 151210b69418SYevgeny Kliteynik { 151310b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 151410b69418SYevgeny Kliteynik 151510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_misc_v1, tag, time_to_live, spec, ttl_hoplimit); 15165c422bfaSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_misc_v1, tag, ihl, spec, ipv4_ihl); 151710b69418SYevgeny Kliteynik 151810b69418SYevgeny Kliteynik return 0; 151910b69418SYevgeny Kliteynik } 152010b69418SYevgeny Kliteynik 15216862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l3_ipv4_misc_init(struct mlx5dr_ste_build *sb, 152210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 152310b69418SYevgeny Kliteynik { 152410b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv4_misc_tag(mask, sb, sb->bit_mask); 152510b69418SYevgeny Kliteynik 152610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL3_IPV4_MISC, sb->inner); 152710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 152810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv4_misc_tag; 152910b69418SYevgeny Kliteynik } 153010b69418SYevgeny Kliteynik 153110b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_ipv6_l3_l4_tag(struct mlx5dr_match_param *value, 153210b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 153310b69418SYevgeny Kliteynik u8 *tag) 153410b69418SYevgeny Kliteynik { 153510b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 153610b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 153710b69418SYevgeny Kliteynik 153810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dst_port, spec, tcp_dport); 153910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, src_port, spec, tcp_sport); 154010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dst_port, spec, udp_dport); 154110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, src_port, spec, udp_sport); 154210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, protocol, spec, ip_protocol); 154310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, fragmented, spec, frag); 154410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dscp, spec, ip_dscp); 154510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, ecn, spec, ip_ecn); 154610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, ipv6_hop_limit, spec, ttl_hoplimit); 154710b69418SYevgeny Kliteynik 154810b69418SYevgeny Kliteynik if (sb->inner) 154910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, flow_label, misc, inner_ipv6_flow_label); 155010b69418SYevgeny Kliteynik else 155110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, flow_label, misc, outer_ipv6_flow_label); 155210b69418SYevgeny Kliteynik 155310b69418SYevgeny Kliteynik if (spec->tcp_flags) { 155410b69418SYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l4_v1, tag, spec); 155510b69418SYevgeny Kliteynik spec->tcp_flags = 0; 155610b69418SYevgeny Kliteynik } 155710b69418SYevgeny Kliteynik 155810b69418SYevgeny Kliteynik return 0; 155910b69418SYevgeny Kliteynik } 156010b69418SYevgeny Kliteynik 15616862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_ipv6_l3_l4_init(struct mlx5dr_ste_build *sb, 156210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 156310b69418SYevgeny Kliteynik { 156410b69418SYevgeny Kliteynik dr_ste_v1_build_eth_ipv6_l3_l4_tag(mask, sb, sb->bit_mask); 156510b69418SYevgeny Kliteynik 156610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL4, sb->inner); 156710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 156810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_ipv6_l3_l4_tag; 156910b69418SYevgeny Kliteynik } 157010b69418SYevgeny Kliteynik 157110b69418SYevgeny Kliteynik static int dr_ste_v1_build_mpls_tag(struct mlx5dr_match_param *value, 157210b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 157310b69418SYevgeny Kliteynik u8 *tag) 157410b69418SYevgeny Kliteynik { 157510b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 157610b69418SYevgeny Kliteynik 157710b69418SYevgeny Kliteynik if (sb->inner) 157810b69418SYevgeny Kliteynik DR_STE_SET_MPLS(mpls_v1, misc2, inner, tag); 157910b69418SYevgeny Kliteynik else 158010b69418SYevgeny Kliteynik DR_STE_SET_MPLS(mpls_v1, misc2, outer, tag); 158110b69418SYevgeny Kliteynik 158210b69418SYevgeny Kliteynik return 0; 158310b69418SYevgeny Kliteynik } 158410b69418SYevgeny Kliteynik 15856862c787SYevgeny Kliteynik void dr_ste_v1_build_mpls_init(struct mlx5dr_ste_build *sb, 158610b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 158710b69418SYevgeny Kliteynik { 158810b69418SYevgeny Kliteynik dr_ste_v1_build_mpls_tag(mask, sb, sb->bit_mask); 158910b69418SYevgeny Kliteynik 159010b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(MPLS, sb->inner); 159110b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 159210b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_mpls_tag; 159310b69418SYevgeny Kliteynik } 159410b69418SYevgeny Kliteynik 159510b69418SYevgeny Kliteynik static int dr_ste_v1_build_tnl_gre_tag(struct mlx5dr_match_param *value, 159610b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 159710b69418SYevgeny Kliteynik u8 *tag) 159810b69418SYevgeny Kliteynik { 159910b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 160010b69418SYevgeny Kliteynik 160110b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_protocol, misc, gre_protocol); 160210b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_k_present, misc, gre_k_present); 160310b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_key_h, misc, gre_key_h); 160410b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_key_l, misc, gre_key_l); 160510b69418SYevgeny Kliteynik 160610b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_c_present, misc, gre_c_present); 160710b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_s_present, misc, gre_s_present); 160810b69418SYevgeny Kliteynik 160910b69418SYevgeny Kliteynik return 0; 161010b69418SYevgeny Kliteynik } 161110b69418SYevgeny Kliteynik 16126862c787SYevgeny Kliteynik void dr_ste_v1_build_tnl_gre_init(struct mlx5dr_ste_build *sb, 161310b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 161410b69418SYevgeny Kliteynik { 161510b69418SYevgeny Kliteynik dr_ste_v1_build_tnl_gre_tag(mask, sb, sb->bit_mask); 161610b69418SYevgeny Kliteynik 161710b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_GRE; 161810b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 161910b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_gre_tag; 162010b69418SYevgeny Kliteynik } 162110b69418SYevgeny Kliteynik 162210b69418SYevgeny Kliteynik static int dr_ste_v1_build_tnl_mpls_tag(struct mlx5dr_match_param *value, 162310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 162410b69418SYevgeny Kliteynik u8 *tag) 162510b69418SYevgeny Kliteynik { 162610b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 162710b69418SYevgeny Kliteynik 162810b69418SYevgeny Kliteynik if (DR_STE_IS_OUTER_MPLS_OVER_GRE_SET(misc2)) { 162910b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_label, 163010b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_label); 163110b69418SYevgeny Kliteynik 163210b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_exp, 163310b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_exp); 163410b69418SYevgeny Kliteynik 163510b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_s_bos, 163610b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_s_bos); 163710b69418SYevgeny Kliteynik 163810b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_ttl, 163910b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_ttl); 164010b69418SYevgeny Kliteynik } else { 164110b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_label, 164210b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_label); 164310b69418SYevgeny Kliteynik 164410b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_exp, 164510b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_exp); 164610b69418SYevgeny Kliteynik 164710b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_s_bos, 164810b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_s_bos); 164910b69418SYevgeny Kliteynik 165010b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_ttl, 165110b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_ttl); 165210b69418SYevgeny Kliteynik } 165310b69418SYevgeny Kliteynik 165410b69418SYevgeny Kliteynik return 0; 165510b69418SYevgeny Kliteynik } 165610b69418SYevgeny Kliteynik 16576862c787SYevgeny Kliteynik void dr_ste_v1_build_tnl_mpls_init(struct mlx5dr_ste_build *sb, 165810b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 165910b69418SYevgeny Kliteynik { 166010b69418SYevgeny Kliteynik dr_ste_v1_build_tnl_mpls_tag(mask, sb, sb->bit_mask); 166110b69418SYevgeny Kliteynik 166210b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_MPLS_I; 166310b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 166410b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_mpls_tag; 166510b69418SYevgeny Kliteynik } 166610b69418SYevgeny Kliteynik 166735ba005dSYevgeny Kliteynik static int dr_ste_v1_build_tnl_mpls_over_udp_tag(struct mlx5dr_match_param *value, 166835ba005dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 166935ba005dSYevgeny Kliteynik u8 *tag) 167035ba005dSYevgeny Kliteynik { 167135ba005dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 167235ba005dSYevgeny Kliteynik u8 *parser_ptr; 167335ba005dSYevgeny Kliteynik u8 parser_id; 167435ba005dSYevgeny Kliteynik u32 mpls_hdr; 167535ba005dSYevgeny Kliteynik 167635ba005dSYevgeny Kliteynik mpls_hdr = misc2->outer_first_mpls_over_udp_label << HDR_MPLS_OFFSET_LABEL; 167735ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_udp_label = 0; 167835ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_udp_exp << HDR_MPLS_OFFSET_EXP; 167935ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_udp_exp = 0; 168035ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_udp_s_bos << HDR_MPLS_OFFSET_S_BOS; 168135ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_udp_s_bos = 0; 168235ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_udp_ttl << HDR_MPLS_OFFSET_TTL; 168335ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_udp_ttl = 0; 168435ba005dSYevgeny Kliteynik 168535ba005dSYevgeny Kliteynik parser_id = sb->caps->flex_parser_id_mpls_over_udp; 168635ba005dSYevgeny Kliteynik parser_ptr = dr_ste_calc_flex_parser_offset(tag, parser_id); 168735ba005dSYevgeny Kliteynik *(__be32 *)parser_ptr = cpu_to_be32(mpls_hdr); 168835ba005dSYevgeny Kliteynik 168935ba005dSYevgeny Kliteynik return 0; 169035ba005dSYevgeny Kliteynik } 169135ba005dSYevgeny Kliteynik 16926862c787SYevgeny Kliteynik void dr_ste_v1_build_tnl_mpls_over_udp_init(struct mlx5dr_ste_build *sb, 169335ba005dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 169435ba005dSYevgeny Kliteynik { 169535ba005dSYevgeny Kliteynik dr_ste_v1_build_tnl_mpls_over_udp_tag(mask, sb, sb->bit_mask); 169635ba005dSYevgeny Kliteynik 169735ba005dSYevgeny Kliteynik /* STEs with lookup type FLEX_PARSER_{0/1} includes 169835ba005dSYevgeny Kliteynik * flex parsers_{0-3}/{4-7} respectively. 169935ba005dSYevgeny Kliteynik */ 170035ba005dSYevgeny Kliteynik sb->lu_type = sb->caps->flex_parser_id_mpls_over_udp > DR_STE_MAX_FLEX_0_ID ? 170135ba005dSYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 : 170235ba005dSYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 170335ba005dSYevgeny Kliteynik 170435ba005dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 170535ba005dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_mpls_over_udp_tag; 170635ba005dSYevgeny Kliteynik } 170735ba005dSYevgeny Kliteynik 170835ba005dSYevgeny Kliteynik static int dr_ste_v1_build_tnl_mpls_over_gre_tag(struct mlx5dr_match_param *value, 170935ba005dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 171035ba005dSYevgeny Kliteynik u8 *tag) 171135ba005dSYevgeny Kliteynik { 171235ba005dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 171335ba005dSYevgeny Kliteynik u8 *parser_ptr; 171435ba005dSYevgeny Kliteynik u8 parser_id; 171535ba005dSYevgeny Kliteynik u32 mpls_hdr; 171635ba005dSYevgeny Kliteynik 171735ba005dSYevgeny Kliteynik mpls_hdr = misc2->outer_first_mpls_over_gre_label << HDR_MPLS_OFFSET_LABEL; 171835ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_gre_label = 0; 171935ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_gre_exp << HDR_MPLS_OFFSET_EXP; 172035ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_gre_exp = 0; 172135ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_gre_s_bos << HDR_MPLS_OFFSET_S_BOS; 172235ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_gre_s_bos = 0; 172335ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_gre_ttl << HDR_MPLS_OFFSET_TTL; 172435ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_gre_ttl = 0; 172535ba005dSYevgeny Kliteynik 172635ba005dSYevgeny Kliteynik parser_id = sb->caps->flex_parser_id_mpls_over_gre; 172735ba005dSYevgeny Kliteynik parser_ptr = dr_ste_calc_flex_parser_offset(tag, parser_id); 172835ba005dSYevgeny Kliteynik *(__be32 *)parser_ptr = cpu_to_be32(mpls_hdr); 172935ba005dSYevgeny Kliteynik 173035ba005dSYevgeny Kliteynik return 0; 173135ba005dSYevgeny Kliteynik } 173235ba005dSYevgeny Kliteynik 17336862c787SYevgeny Kliteynik void dr_ste_v1_build_tnl_mpls_over_gre_init(struct mlx5dr_ste_build *sb, 173435ba005dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 173535ba005dSYevgeny Kliteynik { 173635ba005dSYevgeny Kliteynik dr_ste_v1_build_tnl_mpls_over_gre_tag(mask, sb, sb->bit_mask); 173735ba005dSYevgeny Kliteynik 173835ba005dSYevgeny Kliteynik /* STEs with lookup type FLEX_PARSER_{0/1} includes 173935ba005dSYevgeny Kliteynik * flex parsers_{0-3}/{4-7} respectively. 174035ba005dSYevgeny Kliteynik */ 174135ba005dSYevgeny Kliteynik sb->lu_type = sb->caps->flex_parser_id_mpls_over_gre > DR_STE_MAX_FLEX_0_ID ? 174235ba005dSYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 : 174335ba005dSYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 174435ba005dSYevgeny Kliteynik 174535ba005dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 174635ba005dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_mpls_over_gre_tag; 174735ba005dSYevgeny Kliteynik } 174835ba005dSYevgeny Kliteynik 174910b69418SYevgeny Kliteynik static int dr_ste_v1_build_icmp_tag(struct mlx5dr_match_param *value, 175010b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 175110b69418SYevgeny Kliteynik u8 *tag) 175210b69418SYevgeny Kliteynik { 175310b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 175410b69418SYevgeny Kliteynik bool is_ipv4 = DR_MASK_IS_ICMPV4_SET(misc3); 175510b69418SYevgeny Kliteynik u32 *icmp_header_data; 175610b69418SYevgeny Kliteynik u8 *icmp_type; 175710b69418SYevgeny Kliteynik u8 *icmp_code; 175810b69418SYevgeny Kliteynik 175910b69418SYevgeny Kliteynik if (is_ipv4) { 176010b69418SYevgeny Kliteynik icmp_header_data = &misc3->icmpv4_header_data; 176110b69418SYevgeny Kliteynik icmp_type = &misc3->icmpv4_type; 176210b69418SYevgeny Kliteynik icmp_code = &misc3->icmpv4_code; 176310b69418SYevgeny Kliteynik } else { 176410b69418SYevgeny Kliteynik icmp_header_data = &misc3->icmpv6_header_data; 176510b69418SYevgeny Kliteynik icmp_type = &misc3->icmpv6_type; 176610b69418SYevgeny Kliteynik icmp_code = &misc3->icmpv6_code; 176710b69418SYevgeny Kliteynik } 176810b69418SYevgeny Kliteynik 176910b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_header_data, *icmp_header_data); 177010b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_type, *icmp_type); 177110b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_code, *icmp_code); 177210b69418SYevgeny Kliteynik 177310b69418SYevgeny Kliteynik *icmp_header_data = 0; 177410b69418SYevgeny Kliteynik *icmp_type = 0; 177510b69418SYevgeny Kliteynik *icmp_code = 0; 177610b69418SYevgeny Kliteynik 177710b69418SYevgeny Kliteynik return 0; 177810b69418SYevgeny Kliteynik } 177910b69418SYevgeny Kliteynik 17806862c787SYevgeny Kliteynik void dr_ste_v1_build_icmp_init(struct mlx5dr_ste_build *sb, 178110b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 178210b69418SYevgeny Kliteynik { 178310b69418SYevgeny Kliteynik dr_ste_v1_build_icmp_tag(mask, sb, sb->bit_mask); 178410b69418SYevgeny Kliteynik 178510b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL4_MISC_O; 178610b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 178710b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_icmp_tag; 178810b69418SYevgeny Kliteynik } 178910b69418SYevgeny Kliteynik 179010b69418SYevgeny Kliteynik static int dr_ste_v1_build_general_purpose_tag(struct mlx5dr_match_param *value, 179110b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 179210b69418SYevgeny Kliteynik u8 *tag) 179310b69418SYevgeny Kliteynik { 179410b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 179510b69418SYevgeny Kliteynik 179610b69418SYevgeny Kliteynik DR_STE_SET_TAG(general_purpose, tag, general_purpose_lookup_field, 179710b69418SYevgeny Kliteynik misc2, metadata_reg_a); 179810b69418SYevgeny Kliteynik 179910b69418SYevgeny Kliteynik return 0; 180010b69418SYevgeny Kliteynik } 180110b69418SYevgeny Kliteynik 18026862c787SYevgeny Kliteynik void dr_ste_v1_build_general_purpose_init(struct mlx5dr_ste_build *sb, 180310b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 180410b69418SYevgeny Kliteynik { 180510b69418SYevgeny Kliteynik dr_ste_v1_build_general_purpose_tag(mask, sb, sb->bit_mask); 180610b69418SYevgeny Kliteynik 180710b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_GENERAL_PURPOSE; 180810b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 180910b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_general_purpose_tag; 181010b69418SYevgeny Kliteynik } 181110b69418SYevgeny Kliteynik 181210b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l4_misc_tag(struct mlx5dr_match_param *value, 181310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 181410b69418SYevgeny Kliteynik u8 *tag) 181510b69418SYevgeny Kliteynik { 181610b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 181710b69418SYevgeny Kliteynik 181810b69418SYevgeny Kliteynik if (sb->inner) { 181910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, seq_num, misc3, inner_tcp_seq_num); 182010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, ack_num, misc3, inner_tcp_ack_num); 182110b69418SYevgeny Kliteynik } else { 182210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, seq_num, misc3, outer_tcp_seq_num); 182310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, ack_num, misc3, outer_tcp_ack_num); 182410b69418SYevgeny Kliteynik } 182510b69418SYevgeny Kliteynik 182610b69418SYevgeny Kliteynik return 0; 182710b69418SYevgeny Kliteynik } 182810b69418SYevgeny Kliteynik 18296862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l4_misc_init(struct mlx5dr_ste_build *sb, 183010b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 183110b69418SYevgeny Kliteynik { 183210b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l4_misc_tag(mask, sb, sb->bit_mask); 183310b69418SYevgeny Kliteynik 183410b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL4_MISC_O; 183510b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 183610b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l4_misc_tag; 183710b69418SYevgeny Kliteynik } 183810b69418SYevgeny Kliteynik 183910b69418SYevgeny Kliteynik static int 184010b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag(struct mlx5dr_match_param *value, 184110b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 184210b69418SYevgeny Kliteynik u8 *tag) 184310b69418SYevgeny Kliteynik { 184410b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 184510b69418SYevgeny Kliteynik 184610b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 184710b69418SYevgeny Kliteynik outer_vxlan_gpe_flags, misc3, 184810b69418SYevgeny Kliteynik outer_vxlan_gpe_flags); 184910b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 185010b69418SYevgeny Kliteynik outer_vxlan_gpe_next_protocol, misc3, 185110b69418SYevgeny Kliteynik outer_vxlan_gpe_next_protocol); 185210b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 185310b69418SYevgeny Kliteynik outer_vxlan_gpe_vni, misc3, 185410b69418SYevgeny Kliteynik outer_vxlan_gpe_vni); 185510b69418SYevgeny Kliteynik 185610b69418SYevgeny Kliteynik return 0; 185710b69418SYevgeny Kliteynik } 185810b69418SYevgeny Kliteynik 18596862c787SYevgeny Kliteynik void dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_init(struct mlx5dr_ste_build *sb, 186010b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 186110b69418SYevgeny Kliteynik { 186210b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag(mask, sb, sb->bit_mask); 186310b69418SYevgeny Kliteynik 186410b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 186510b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 186610b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag; 186710b69418SYevgeny Kliteynik } 186810b69418SYevgeny Kliteynik 186910b69418SYevgeny Kliteynik static int 187010b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tag(struct mlx5dr_match_param *value, 187110b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 187210b69418SYevgeny Kliteynik u8 *tag) 187310b69418SYevgeny Kliteynik { 187410b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 187510b69418SYevgeny Kliteynik 187610b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 187710b69418SYevgeny Kliteynik geneve_protocol_type, misc, geneve_protocol_type); 187810b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 187910b69418SYevgeny Kliteynik geneve_oam, misc, geneve_oam); 188010b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 188110b69418SYevgeny Kliteynik geneve_opt_len, misc, geneve_opt_len); 188210b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 188310b69418SYevgeny Kliteynik geneve_vni, misc, geneve_vni); 188410b69418SYevgeny Kliteynik 188510b69418SYevgeny Kliteynik return 0; 188610b69418SYevgeny Kliteynik } 188710b69418SYevgeny Kliteynik 18886862c787SYevgeny Kliteynik void dr_ste_v1_build_flex_parser_tnl_geneve_init(struct mlx5dr_ste_build *sb, 188910b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 189010b69418SYevgeny Kliteynik { 189110b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tag(mask, sb, sb->bit_mask); 189210b69418SYevgeny Kliteynik 189310b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 189410b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 189510b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_geneve_tag; 189610b69418SYevgeny Kliteynik } 189710b69418SYevgeny Kliteynik 189809753babSMuhammad Sammar static int dr_ste_v1_build_tnl_header_0_1_tag(struct mlx5dr_match_param *value, 189909753babSMuhammad Sammar struct mlx5dr_ste_build *sb, 190009753babSMuhammad Sammar uint8_t *tag) 190109753babSMuhammad Sammar { 190209753babSMuhammad Sammar struct mlx5dr_match_misc5 *misc5 = &value->misc5; 190309753babSMuhammad Sammar 190409753babSMuhammad Sammar DR_STE_SET_TAG(tunnel_header, tag, tunnel_header_0, misc5, tunnel_header_0); 190509753babSMuhammad Sammar DR_STE_SET_TAG(tunnel_header, tag, tunnel_header_1, misc5, tunnel_header_1); 190609753babSMuhammad Sammar 190709753babSMuhammad Sammar return 0; 190809753babSMuhammad Sammar } 190909753babSMuhammad Sammar 19106862c787SYevgeny Kliteynik void dr_ste_v1_build_tnl_header_0_1_init(struct mlx5dr_ste_build *sb, 191109753babSMuhammad Sammar struct mlx5dr_match_param *mask) 191209753babSMuhammad Sammar { 191309753babSMuhammad Sammar sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 191409753babSMuhammad Sammar dr_ste_v1_build_tnl_header_0_1_tag(mask, sb, sb->bit_mask); 191509753babSMuhammad Sammar sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 191609753babSMuhammad Sammar sb->ste_build_tag_func = &dr_ste_v1_build_tnl_header_0_1_tag; 191709753babSMuhammad Sammar } 191809753babSMuhammad Sammar 191910b69418SYevgeny Kliteynik static int dr_ste_v1_build_register_0_tag(struct mlx5dr_match_param *value, 192010b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 192110b69418SYevgeny Kliteynik u8 *tag) 192210b69418SYevgeny Kliteynik { 192310b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 192410b69418SYevgeny Kliteynik 192510b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_h, misc2, metadata_reg_c_0); 192610b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_l, misc2, metadata_reg_c_1); 192710b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_h, misc2, metadata_reg_c_2); 192810b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_l, misc2, metadata_reg_c_3); 192910b69418SYevgeny Kliteynik 193010b69418SYevgeny Kliteynik return 0; 193110b69418SYevgeny Kliteynik } 193210b69418SYevgeny Kliteynik 19336862c787SYevgeny Kliteynik void dr_ste_v1_build_register_0_init(struct mlx5dr_ste_build *sb, 193410b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 193510b69418SYevgeny Kliteynik { 193610b69418SYevgeny Kliteynik dr_ste_v1_build_register_0_tag(mask, sb, sb->bit_mask); 193710b69418SYevgeny Kliteynik 193810b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_STEERING_REGISTERS_0; 193910b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 194010b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_register_0_tag; 194110b69418SYevgeny Kliteynik } 194210b69418SYevgeny Kliteynik 194310b69418SYevgeny Kliteynik static int dr_ste_v1_build_register_1_tag(struct mlx5dr_match_param *value, 194410b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 194510b69418SYevgeny Kliteynik u8 *tag) 194610b69418SYevgeny Kliteynik { 194710b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 194810b69418SYevgeny Kliteynik 194910b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_h, misc2, metadata_reg_c_4); 195010b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_l, misc2, metadata_reg_c_5); 195110b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_h, misc2, metadata_reg_c_6); 195210b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_l, misc2, metadata_reg_c_7); 195310b69418SYevgeny Kliteynik 195410b69418SYevgeny Kliteynik return 0; 195510b69418SYevgeny Kliteynik } 195610b69418SYevgeny Kliteynik 19576862c787SYevgeny Kliteynik void dr_ste_v1_build_register_1_init(struct mlx5dr_ste_build *sb, 195810b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 195910b69418SYevgeny Kliteynik { 196010b69418SYevgeny Kliteynik dr_ste_v1_build_register_1_tag(mask, sb, sb->bit_mask); 196110b69418SYevgeny Kliteynik 196210b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_STEERING_REGISTERS_1; 196310b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 196410b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_register_1_tag; 196510b69418SYevgeny Kliteynik } 196610b69418SYevgeny Kliteynik 196710b69418SYevgeny Kliteynik static void dr_ste_v1_build_src_gvmi_qpn_bit_mask(struct mlx5dr_match_param *value, 196810b69418SYevgeny Kliteynik u8 *bit_mask) 196910b69418SYevgeny Kliteynik { 197010b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 197110b69418SYevgeny Kliteynik 197210b69418SYevgeny Kliteynik DR_STE_SET_ONES(src_gvmi_qp_v1, bit_mask, source_gvmi, misc_mask, source_port); 197310b69418SYevgeny Kliteynik DR_STE_SET_ONES(src_gvmi_qp_v1, bit_mask, source_qp, misc_mask, source_sqn); 1974cc82a2e6SYevgeny Kliteynik misc_mask->source_eswitch_owner_vhca_id = 0; 197510b69418SYevgeny Kliteynik } 197610b69418SYevgeny Kliteynik 197710b69418SYevgeny Kliteynik static int dr_ste_v1_build_src_gvmi_qpn_tag(struct mlx5dr_match_param *value, 197810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 197910b69418SYevgeny Kliteynik u8 *tag) 198010b69418SYevgeny Kliteynik { 198110b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 198210b69418SYevgeny Kliteynik struct mlx5dr_cmd_vport_cap *vport_cap; 198310b69418SYevgeny Kliteynik struct mlx5dr_domain *dmn = sb->dmn; 198411a45defSYevgeny Kliteynik struct mlx5dr_domain *vport_dmn; 198510b69418SYevgeny Kliteynik u8 *bit_mask = sb->bit_mask; 198610b69418SYevgeny Kliteynik 198710b69418SYevgeny Kliteynik DR_STE_SET_TAG(src_gvmi_qp_v1, tag, source_qp, misc, source_sqn); 198810b69418SYevgeny Kliteynik 198910b69418SYevgeny Kliteynik if (sb->vhca_id_valid) { 199010b69418SYevgeny Kliteynik /* Find port GVMI based on the eswitch_owner_vhca_id */ 199110b69418SYevgeny Kliteynik if (misc->source_eswitch_owner_vhca_id == dmn->info.caps.gvmi) 199211a45defSYevgeny Kliteynik vport_dmn = dmn; 199310b69418SYevgeny Kliteynik else if (dmn->peer_dmn && (misc->source_eswitch_owner_vhca_id == 199410b69418SYevgeny Kliteynik dmn->peer_dmn->info.caps.gvmi)) 199511a45defSYevgeny Kliteynik vport_dmn = dmn->peer_dmn; 199610b69418SYevgeny Kliteynik else 199710b69418SYevgeny Kliteynik return -EINVAL; 199810b69418SYevgeny Kliteynik 199910b69418SYevgeny Kliteynik misc->source_eswitch_owner_vhca_id = 0; 200010b69418SYevgeny Kliteynik } else { 200111a45defSYevgeny Kliteynik vport_dmn = dmn; 200210b69418SYevgeny Kliteynik } 200310b69418SYevgeny Kliteynik 200410b69418SYevgeny Kliteynik if (!MLX5_GET(ste_src_gvmi_qp_v1, bit_mask, source_gvmi)) 200510b69418SYevgeny Kliteynik return 0; 200610b69418SYevgeny Kliteynik 200711a45defSYevgeny Kliteynik vport_cap = mlx5dr_domain_get_vport_cap(vport_dmn, misc->source_port); 200810b69418SYevgeny Kliteynik if (!vport_cap) { 200910b69418SYevgeny Kliteynik mlx5dr_err(dmn, "Vport 0x%x is disabled or invalid\n", 201010b69418SYevgeny Kliteynik misc->source_port); 201110b69418SYevgeny Kliteynik return -EINVAL; 201210b69418SYevgeny Kliteynik } 201310b69418SYevgeny Kliteynik 201410b69418SYevgeny Kliteynik if (vport_cap->vport_gvmi) 201510b69418SYevgeny Kliteynik MLX5_SET(ste_src_gvmi_qp_v1, tag, source_gvmi, vport_cap->vport_gvmi); 201610b69418SYevgeny Kliteynik 201710b69418SYevgeny Kliteynik misc->source_port = 0; 201810b69418SYevgeny Kliteynik return 0; 201910b69418SYevgeny Kliteynik } 202010b69418SYevgeny Kliteynik 20216862c787SYevgeny Kliteynik void dr_ste_v1_build_src_gvmi_qpn_init(struct mlx5dr_ste_build *sb, 202210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 202310b69418SYevgeny Kliteynik { 202410b69418SYevgeny Kliteynik dr_ste_v1_build_src_gvmi_qpn_bit_mask(mask, sb->bit_mask); 202510b69418SYevgeny Kliteynik 202610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_SRC_QP_GVMI; 202710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 202810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_src_gvmi_qpn_tag; 202910b69418SYevgeny Kliteynik } 203010b69418SYevgeny Kliteynik 2031160e9cb3SYevgeny Kliteynik static void dr_ste_v1_set_flex_parser(u32 *misc4_field_id, 2032160e9cb3SYevgeny Kliteynik u32 *misc4_field_value, 2033160e9cb3SYevgeny Kliteynik bool *parser_is_used, 2034160e9cb3SYevgeny Kliteynik u8 *tag) 2035160e9cb3SYevgeny Kliteynik { 2036160e9cb3SYevgeny Kliteynik u32 id = *misc4_field_id; 2037160e9cb3SYevgeny Kliteynik u8 *parser_ptr; 2038160e9cb3SYevgeny Kliteynik 203989cdba32SYevgeny Kliteynik if (id >= DR_NUM_OF_FLEX_PARSERS || parser_is_used[id]) 2040160e9cb3SYevgeny Kliteynik return; 2041160e9cb3SYevgeny Kliteynik 2042160e9cb3SYevgeny Kliteynik parser_is_used[id] = true; 2043160e9cb3SYevgeny Kliteynik parser_ptr = dr_ste_calc_flex_parser_offset(tag, id); 2044160e9cb3SYevgeny Kliteynik 2045160e9cb3SYevgeny Kliteynik *(__be32 *)parser_ptr = cpu_to_be32(*misc4_field_value); 2046160e9cb3SYevgeny Kliteynik *misc4_field_id = 0; 2047160e9cb3SYevgeny Kliteynik *misc4_field_value = 0; 2048160e9cb3SYevgeny Kliteynik } 2049160e9cb3SYevgeny Kliteynik 2050160e9cb3SYevgeny Kliteynik static int dr_ste_v1_build_felx_parser_tag(struct mlx5dr_match_param *value, 2051160e9cb3SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 2052160e9cb3SYevgeny Kliteynik u8 *tag) 2053160e9cb3SYevgeny Kliteynik { 2054160e9cb3SYevgeny Kliteynik struct mlx5dr_match_misc4 *misc_4_mask = &value->misc4; 2055160e9cb3SYevgeny Kliteynik bool parser_is_used[DR_NUM_OF_FLEX_PARSERS] = {}; 2056160e9cb3SYevgeny Kliteynik 2057160e9cb3SYevgeny Kliteynik dr_ste_v1_set_flex_parser(&misc_4_mask->prog_sample_field_id_0, 2058160e9cb3SYevgeny Kliteynik &misc_4_mask->prog_sample_field_value_0, 2059160e9cb3SYevgeny Kliteynik parser_is_used, tag); 2060160e9cb3SYevgeny Kliteynik 2061160e9cb3SYevgeny Kliteynik dr_ste_v1_set_flex_parser(&misc_4_mask->prog_sample_field_id_1, 2062160e9cb3SYevgeny Kliteynik &misc_4_mask->prog_sample_field_value_1, 2063160e9cb3SYevgeny Kliteynik parser_is_used, tag); 2064160e9cb3SYevgeny Kliteynik 2065160e9cb3SYevgeny Kliteynik dr_ste_v1_set_flex_parser(&misc_4_mask->prog_sample_field_id_2, 2066160e9cb3SYevgeny Kliteynik &misc_4_mask->prog_sample_field_value_2, 2067160e9cb3SYevgeny Kliteynik parser_is_used, tag); 2068160e9cb3SYevgeny Kliteynik 2069160e9cb3SYevgeny Kliteynik dr_ste_v1_set_flex_parser(&misc_4_mask->prog_sample_field_id_3, 2070160e9cb3SYevgeny Kliteynik &misc_4_mask->prog_sample_field_value_3, 2071160e9cb3SYevgeny Kliteynik parser_is_used, tag); 2072160e9cb3SYevgeny Kliteynik 2073160e9cb3SYevgeny Kliteynik return 0; 2074160e9cb3SYevgeny Kliteynik } 2075160e9cb3SYevgeny Kliteynik 20766862c787SYevgeny Kliteynik void dr_ste_v1_build_flex_parser_0_init(struct mlx5dr_ste_build *sb, 2077160e9cb3SYevgeny Kliteynik struct mlx5dr_match_param *mask) 2078160e9cb3SYevgeny Kliteynik { 2079160e9cb3SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 2080160e9cb3SYevgeny Kliteynik dr_ste_v1_build_felx_parser_tag(mask, sb, sb->bit_mask); 2081160e9cb3SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 2082160e9cb3SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_felx_parser_tag; 2083160e9cb3SYevgeny Kliteynik } 2084160e9cb3SYevgeny Kliteynik 20856862c787SYevgeny Kliteynik void dr_ste_v1_build_flex_parser_1_init(struct mlx5dr_ste_build *sb, 2086160e9cb3SYevgeny Kliteynik struct mlx5dr_match_param *mask) 2087160e9cb3SYevgeny Kliteynik { 2088160e9cb3SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_1; 2089160e9cb3SYevgeny Kliteynik dr_ste_v1_build_felx_parser_tag(mask, sb, sb->bit_mask); 2090160e9cb3SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 2091160e9cb3SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_felx_parser_tag; 2092160e9cb3SYevgeny Kliteynik } 2093160e9cb3SYevgeny Kliteynik 20943442e033SYevgeny Kliteynik static int 20953442e033SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_tag(struct mlx5dr_match_param *value, 20963442e033SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 20973442e033SYevgeny Kliteynik u8 *tag) 20983442e033SYevgeny Kliteynik { 20993442e033SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 21003442e033SYevgeny Kliteynik u8 parser_id = sb->caps->flex_parser_id_geneve_tlv_option_0; 21013442e033SYevgeny Kliteynik u8 *parser_ptr = dr_ste_calc_flex_parser_offset(tag, parser_id); 21023442e033SYevgeny Kliteynik 21033442e033SYevgeny Kliteynik MLX5_SET(ste_flex_parser_0, parser_ptr, flex_parser_3, 21043442e033SYevgeny Kliteynik misc3->geneve_tlv_option_0_data); 21053442e033SYevgeny Kliteynik misc3->geneve_tlv_option_0_data = 0; 21063442e033SYevgeny Kliteynik 21073442e033SYevgeny Kliteynik return 0; 21083442e033SYevgeny Kliteynik } 21093442e033SYevgeny Kliteynik 21106862c787SYevgeny Kliteynik void 21113442e033SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_init(struct mlx5dr_ste_build *sb, 21123442e033SYevgeny Kliteynik struct mlx5dr_match_param *mask) 21133442e033SYevgeny Kliteynik { 21143442e033SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_tag(mask, sb, sb->bit_mask); 21153442e033SYevgeny Kliteynik 21163442e033SYevgeny Kliteynik /* STEs with lookup type FLEX_PARSER_{0/1} includes 21173442e033SYevgeny Kliteynik * flex parsers_{0-3}/{4-7} respectively. 21183442e033SYevgeny Kliteynik */ 21193442e033SYevgeny Kliteynik sb->lu_type = sb->caps->flex_parser_id_geneve_tlv_option_0 > 3 ? 21203442e033SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 : 21213442e033SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 21223442e033SYevgeny Kliteynik 21233442e033SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 21243442e033SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_tag; 21253442e033SYevgeny Kliteynik } 21263442e033SYevgeny Kliteynik 2127f59464e2SYevgeny Kliteynik static int 2128f59464e2SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_exist_tag(struct mlx5dr_match_param *value, 2129f59464e2SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 2130f59464e2SYevgeny Kliteynik uint8_t *tag) 2131f59464e2SYevgeny Kliteynik { 2132f59464e2SYevgeny Kliteynik u8 parser_id = sb->caps->flex_parser_id_geneve_tlv_option_0; 2133f59464e2SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 2134f59464e2SYevgeny Kliteynik 2135f59464e2SYevgeny Kliteynik if (misc->geneve_tlv_option_0_exist) { 2136f59464e2SYevgeny Kliteynik MLX5_SET(ste_flex_parser_ok, tag, flex_parsers_ok, 1 << parser_id); 2137f59464e2SYevgeny Kliteynik misc->geneve_tlv_option_0_exist = 0; 2138f59464e2SYevgeny Kliteynik } 2139f59464e2SYevgeny Kliteynik 2140f59464e2SYevgeny Kliteynik return 0; 2141f59464e2SYevgeny Kliteynik } 2142f59464e2SYevgeny Kliteynik 21436862c787SYevgeny Kliteynik void 2144f59464e2SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_exist_init(struct mlx5dr_ste_build *sb, 2145f59464e2SYevgeny Kliteynik struct mlx5dr_match_param *mask) 2146f59464e2SYevgeny Kliteynik { 2147f59464e2SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_OK; 2148f59464e2SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_exist_tag(mask, sb, sb->bit_mask); 2149f59464e2SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 2150f59464e2SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_exist_tag; 2151f59464e2SYevgeny Kliteynik } 2152f59464e2SYevgeny Kliteynik 2153df9dd15aSYevgeny Kliteynik static int dr_ste_v1_build_flex_parser_tnl_gtpu_tag(struct mlx5dr_match_param *value, 2154df9dd15aSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 2155ae3eddcfSYevgeny Kliteynik u8 *tag) 2156df9dd15aSYevgeny Kliteynik { 2157df9dd15aSYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 2158df9dd15aSYevgeny Kliteynik 2159df9dd15aSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_gtpu, tag, gtpu_msg_flags, misc3, gtpu_msg_flags); 2160df9dd15aSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_gtpu, tag, gtpu_msg_type, misc3, gtpu_msg_type); 2161df9dd15aSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_gtpu, tag, gtpu_teid, misc3, gtpu_teid); 2162df9dd15aSYevgeny Kliteynik 2163df9dd15aSYevgeny Kliteynik return 0; 2164df9dd15aSYevgeny Kliteynik } 2165df9dd15aSYevgeny Kliteynik 21666862c787SYevgeny Kliteynik void dr_ste_v1_build_flex_parser_tnl_gtpu_init(struct mlx5dr_ste_build *sb, 2167df9dd15aSYevgeny Kliteynik struct mlx5dr_match_param *mask) 2168df9dd15aSYevgeny Kliteynik { 2169df9dd15aSYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_gtpu_tag(mask, sb, sb->bit_mask); 2170df9dd15aSYevgeny Kliteynik 2171df9dd15aSYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 2172df9dd15aSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 2173df9dd15aSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_gtpu_tag; 2174df9dd15aSYevgeny Kliteynik } 2175df9dd15aSYevgeny Kliteynik 2176df9dd15aSYevgeny Kliteynik static int 2177df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_0_tag(struct mlx5dr_match_param *value, 2178df9dd15aSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 2179ae3eddcfSYevgeny Kliteynik u8 *tag) 2180df9dd15aSYevgeny Kliteynik { 2181df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_0_id(sb->caps->flex_parser_id_gtpu_dw_0)) 2182df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_dw_0, sb->caps, &value->misc3); 2183df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_0_id(sb->caps->flex_parser_id_gtpu_teid)) 2184df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_teid, sb->caps, &value->misc3); 2185df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_0_id(sb->caps->flex_parser_id_gtpu_dw_2)) 2186df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_dw_2, sb->caps, &value->misc3); 2187df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_0_id(sb->caps->flex_parser_id_gtpu_first_ext_dw_0)) 2188df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_first_ext_dw_0, sb->caps, &value->misc3); 2189df9dd15aSYevgeny Kliteynik return 0; 2190df9dd15aSYevgeny Kliteynik } 2191df9dd15aSYevgeny Kliteynik 21926862c787SYevgeny Kliteynik void 2193df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_0_init(struct mlx5dr_ste_build *sb, 2194df9dd15aSYevgeny Kliteynik struct mlx5dr_match_param *mask) 2195df9dd15aSYevgeny Kliteynik { 2196df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_0_tag(mask, sb, sb->bit_mask); 2197df9dd15aSYevgeny Kliteynik 2198df9dd15aSYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 2199df9dd15aSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 2200df9dd15aSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_gtpu_flex_parser_0_tag; 2201df9dd15aSYevgeny Kliteynik } 2202df9dd15aSYevgeny Kliteynik 2203df9dd15aSYevgeny Kliteynik static int 2204df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_1_tag(struct mlx5dr_match_param *value, 2205df9dd15aSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 2206ae3eddcfSYevgeny Kliteynik u8 *tag) 2207df9dd15aSYevgeny Kliteynik { 2208df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_1_id(sb->caps->flex_parser_id_gtpu_dw_0)) 2209df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_dw_0, sb->caps, &value->misc3); 2210df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_1_id(sb->caps->flex_parser_id_gtpu_teid)) 2211df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_teid, sb->caps, &value->misc3); 2212df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_1_id(sb->caps->flex_parser_id_gtpu_dw_2)) 2213df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_dw_2, sb->caps, &value->misc3); 2214df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_1_id(sb->caps->flex_parser_id_gtpu_first_ext_dw_0)) 2215df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_first_ext_dw_0, sb->caps, &value->misc3); 2216df9dd15aSYevgeny Kliteynik return 0; 2217df9dd15aSYevgeny Kliteynik } 2218df9dd15aSYevgeny Kliteynik 22196862c787SYevgeny Kliteynik void 2220df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_1_init(struct mlx5dr_ste_build *sb, 2221df9dd15aSYevgeny Kliteynik struct mlx5dr_match_param *mask) 2222df9dd15aSYevgeny Kliteynik { 2223df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_1_tag(mask, sb, sb->bit_mask); 2224df9dd15aSYevgeny Kliteynik 2225df9dd15aSYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_1; 2226df9dd15aSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 2227df9dd15aSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_gtpu_flex_parser_1_tag; 2228df9dd15aSYevgeny Kliteynik } 2229df9dd15aSYevgeny Kliteynik 22302533e726SYevgeny Kliteynik int dr_ste_v1_alloc_modify_hdr_ptrn_arg(struct mlx5dr_action *action) 22312533e726SYevgeny Kliteynik { 22322533e726SYevgeny Kliteynik struct mlx5dr_ptrn_mgr *ptrn_mgr; 22330caebaddSYevgeny Kliteynik int ret; 22342533e726SYevgeny Kliteynik 22352533e726SYevgeny Kliteynik ptrn_mgr = action->rewrite->dmn->ptrn_mgr; 22362533e726SYevgeny Kliteynik if (!ptrn_mgr) 22372533e726SYevgeny Kliteynik return -EOPNOTSUPP; 22382533e726SYevgeny Kliteynik 22390caebaddSYevgeny Kliteynik action->rewrite->arg = mlx5dr_arg_get_obj(action->rewrite->dmn->arg_mgr, 22400caebaddSYevgeny Kliteynik action->rewrite->num_of_actions, 22410caebaddSYevgeny Kliteynik action->rewrite->data); 22420caebaddSYevgeny Kliteynik if (!action->rewrite->arg) { 22430caebaddSYevgeny Kliteynik mlx5dr_err(action->rewrite->dmn, "Failed allocating args for modify header\n"); 22440caebaddSYevgeny Kliteynik return -EAGAIN; 22450caebaddSYevgeny Kliteynik } 22460caebaddSYevgeny Kliteynik 22472533e726SYevgeny Kliteynik action->rewrite->ptrn = 22482533e726SYevgeny Kliteynik mlx5dr_ptrn_cache_get_pattern(ptrn_mgr, 22492533e726SYevgeny Kliteynik action->rewrite->num_of_actions, 22502533e726SYevgeny Kliteynik action->rewrite->data); 22512533e726SYevgeny Kliteynik if (!action->rewrite->ptrn) { 22522533e726SYevgeny Kliteynik mlx5dr_err(action->rewrite->dmn, "Failed to get pattern\n"); 22530caebaddSYevgeny Kliteynik ret = -EAGAIN; 22540caebaddSYevgeny Kliteynik goto put_arg; 22552533e726SYevgeny Kliteynik } 22562533e726SYevgeny Kliteynik 22572533e726SYevgeny Kliteynik return 0; 22580caebaddSYevgeny Kliteynik 22590caebaddSYevgeny Kliteynik put_arg: 22600caebaddSYevgeny Kliteynik mlx5dr_arg_put_obj(action->rewrite->dmn->arg_mgr, 22610caebaddSYevgeny Kliteynik action->rewrite->arg); 22620caebaddSYevgeny Kliteynik return ret; 22632533e726SYevgeny Kliteynik } 22642533e726SYevgeny Kliteynik 22652533e726SYevgeny Kliteynik void dr_ste_v1_free_modify_hdr_ptrn_arg(struct mlx5dr_action *action) 22662533e726SYevgeny Kliteynik { 22672533e726SYevgeny Kliteynik mlx5dr_ptrn_cache_put_pattern(action->rewrite->dmn->ptrn_mgr, 22682533e726SYevgeny Kliteynik action->rewrite->ptrn); 22690caebaddSYevgeny Kliteynik mlx5dr_arg_put_obj(action->rewrite->dmn->arg_mgr, 22700caebaddSYevgeny Kliteynik action->rewrite->arg); 22712533e726SYevgeny Kliteynik } 22722533e726SYevgeny Kliteynik 2273638a07f1SYevgeny Kliteynik static struct mlx5dr_ste_ctx ste_ctx_v1 = { 2274a6098129SYevgeny Kliteynik /* Builders */ 227510b69418SYevgeny Kliteynik .build_eth_l2_src_dst_init = &dr_ste_v1_build_eth_l2_src_dst_init, 227610b69418SYevgeny Kliteynik .build_eth_l3_ipv6_src_init = &dr_ste_v1_build_eth_l3_ipv6_src_init, 227710b69418SYevgeny Kliteynik .build_eth_l3_ipv6_dst_init = &dr_ste_v1_build_eth_l3_ipv6_dst_init, 227810b69418SYevgeny Kliteynik .build_eth_l3_ipv4_5_tuple_init = &dr_ste_v1_build_eth_l3_ipv4_5_tuple_init, 227910b69418SYevgeny Kliteynik .build_eth_l2_src_init = &dr_ste_v1_build_eth_l2_src_init, 228010b69418SYevgeny Kliteynik .build_eth_l2_dst_init = &dr_ste_v1_build_eth_l2_dst_init, 228110b69418SYevgeny Kliteynik .build_eth_l2_tnl_init = &dr_ste_v1_build_eth_l2_tnl_init, 228210b69418SYevgeny Kliteynik .build_eth_l3_ipv4_misc_init = &dr_ste_v1_build_eth_l3_ipv4_misc_init, 228310b69418SYevgeny Kliteynik .build_eth_ipv6_l3_l4_init = &dr_ste_v1_build_eth_ipv6_l3_l4_init, 228410b69418SYevgeny Kliteynik .build_mpls_init = &dr_ste_v1_build_mpls_init, 228510b69418SYevgeny Kliteynik .build_tnl_gre_init = &dr_ste_v1_build_tnl_gre_init, 228610b69418SYevgeny Kliteynik .build_tnl_mpls_init = &dr_ste_v1_build_tnl_mpls_init, 228735ba005dSYevgeny Kliteynik .build_tnl_mpls_over_udp_init = &dr_ste_v1_build_tnl_mpls_over_udp_init, 228835ba005dSYevgeny Kliteynik .build_tnl_mpls_over_gre_init = &dr_ste_v1_build_tnl_mpls_over_gre_init, 228910b69418SYevgeny Kliteynik .build_icmp_init = &dr_ste_v1_build_icmp_init, 229010b69418SYevgeny Kliteynik .build_general_purpose_init = &dr_ste_v1_build_general_purpose_init, 229110b69418SYevgeny Kliteynik .build_eth_l4_misc_init = &dr_ste_v1_build_eth_l4_misc_init, 229210b69418SYevgeny Kliteynik .build_tnl_vxlan_gpe_init = &dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_init, 229310b69418SYevgeny Kliteynik .build_tnl_geneve_init = &dr_ste_v1_build_flex_parser_tnl_geneve_init, 22943442e033SYevgeny Kliteynik .build_tnl_geneve_tlv_opt_init = &dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_init, 2295f59464e2SYevgeny Kliteynik .build_tnl_geneve_tlv_opt_exist_init = &dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_exist_init, 229610b69418SYevgeny Kliteynik .build_register_0_init = &dr_ste_v1_build_register_0_init, 229710b69418SYevgeny Kliteynik .build_register_1_init = &dr_ste_v1_build_register_1_init, 229810b69418SYevgeny Kliteynik .build_src_gvmi_qpn_init = &dr_ste_v1_build_src_gvmi_qpn_init, 2299160e9cb3SYevgeny Kliteynik .build_flex_parser_0_init = &dr_ste_v1_build_flex_parser_0_init, 2300160e9cb3SYevgeny Kliteynik .build_flex_parser_1_init = &dr_ste_v1_build_flex_parser_1_init, 2301df9dd15aSYevgeny Kliteynik .build_tnl_gtpu_init = &dr_ste_v1_build_flex_parser_tnl_gtpu_init, 230209753babSMuhammad Sammar .build_tnl_header_0_1_init = &dr_ste_v1_build_tnl_header_0_1_init, 2303df9dd15aSYevgeny Kliteynik .build_tnl_gtpu_flex_parser_0_init = &dr_ste_v1_build_tnl_gtpu_flex_parser_0_init, 2304df9dd15aSYevgeny Kliteynik .build_tnl_gtpu_flex_parser_1_init = &dr_ste_v1_build_tnl_gtpu_flex_parser_1_init, 2305df9dd15aSYevgeny Kliteynik 2306a6098129SYevgeny Kliteynik /* Getters and Setters */ 2307a6098129SYevgeny Kliteynik .ste_init = &dr_ste_v1_init, 2308a6098129SYevgeny Kliteynik .set_next_lu_type = &dr_ste_v1_set_next_lu_type, 2309a6098129SYevgeny Kliteynik .get_next_lu_type = &dr_ste_v1_get_next_lu_type, 23101207a772SYevgeny Kliteynik .is_miss_addr_set = &dr_ste_v1_is_miss_addr_set, 2311a6098129SYevgeny Kliteynik .set_miss_addr = &dr_ste_v1_set_miss_addr, 2312a6098129SYevgeny Kliteynik .get_miss_addr = &dr_ste_v1_get_miss_addr, 2313a6098129SYevgeny Kliteynik .set_hit_addr = &dr_ste_v1_set_hit_addr, 2314a6098129SYevgeny Kliteynik .set_byte_mask = &dr_ste_v1_set_byte_mask, 2315a6098129SYevgeny Kliteynik .get_byte_mask = &dr_ste_v1_get_byte_mask, 23164e856c5dSYevgeny Kliteynik /* Actions */ 23172de40f68SYevgeny Kliteynik .actions_caps = DR_STE_CTX_ACTION_CAP_TX_POP | 23182de40f68SYevgeny Kliteynik DR_STE_CTX_ACTION_CAP_RX_PUSH | 2319638a07f1SYevgeny Kliteynik DR_STE_CTX_ACTION_CAP_RX_ENCAP | 2320638a07f1SYevgeny Kliteynik DR_STE_CTX_ACTION_CAP_POP_MDFY, 23214e856c5dSYevgeny Kliteynik .set_actions_rx = &dr_ste_v1_set_actions_rx, 23224e856c5dSYevgeny Kliteynik .set_actions_tx = &dr_ste_v1_set_actions_tx, 2323c349b413SYevgeny Kliteynik .modify_field_arr_sz = ARRAY_SIZE(dr_ste_v1_action_modify_field_arr), 2324c349b413SYevgeny Kliteynik .modify_field_arr = dr_ste_v1_action_modify_field_arr, 2325c349b413SYevgeny Kliteynik .set_action_set = &dr_ste_v1_set_action_set, 2326c349b413SYevgeny Kliteynik .set_action_add = &dr_ste_v1_set_action_add, 2327c349b413SYevgeny Kliteynik .set_action_copy = &dr_ste_v1_set_action_copy, 2328c349b413SYevgeny Kliteynik .set_action_decap_l3_list = &dr_ste_v1_set_action_decap_l3_list, 23292533e726SYevgeny Kliteynik .alloc_modify_hdr_chunk = &dr_ste_v1_alloc_modify_hdr_ptrn_arg, 23302533e726SYevgeny Kliteynik .dealloc_modify_hdr_chunk = &dr_ste_v1_free_modify_hdr_ptrn_arg, 23312533e726SYevgeny Kliteynik 23324fe45e1dSYevgeny Kliteynik /* Send */ 23334fe45e1dSYevgeny Kliteynik .prepare_for_postsend = &dr_ste_v1_prepare_for_postsend, 233410b69418SYevgeny Kliteynik }; 2335638a07f1SYevgeny Kliteynik 2336638a07f1SYevgeny Kliteynik struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx_v1(void) 2337638a07f1SYevgeny Kliteynik { 2338638a07f1SYevgeny Kliteynik return &ste_ctx_v1; 2339638a07f1SYevgeny Kliteynik } 2340