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, 1610b69418SYevgeny Kliteynik }; 1710b69418SYevgeny Kliteynik 1810b69418SYevgeny Kliteynik /* Lookup type is built from 2B: [ Definer mode 1B ][ Definer index 1B ] */ 1910b69418SYevgeny Kliteynik enum { 2010b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_NOP = 0x0000, 2110b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_TNL = 0x0002, 2210b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IBL3_EXT = 0x0102, 2310b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_O = 0x0003, 2410b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IBL4 = 0x0103, 2510b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_I = 0x0004, 2610b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_SRC_QP_GVMI = 0x0104, 2710b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_O = 0x0005, 2810b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_HEADERS_O = 0x0105, 2910b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_I = 0x0006, 3010b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_HEADERS_I = 0x0106, 3110b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_5_TUPLE_O = 0x0007, 3210b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_DES_O = 0x0107, 3310b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_5_TUPLE_I = 0x0008, 3410b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_DES_I = 0x0108, 3510b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_O = 0x0009, 3610b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_SRC_O = 0x0109, 3710b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_I = 0x000a, 3810b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_IPV6_SRC_I = 0x010a, 3910b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_DST_O = 0x000b, 4010b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_MPLS_O = 0x010b, 4110b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL2_SRC_DST_I = 0x000c, 4210b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_MPLS_I = 0x010c, 4310b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_MISC_O = 0x000d, 4410b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_GRE = 0x010d, 4510b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER = 0x000e, 4610b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_GENERAL_PURPOSE = 0x010e, 4710b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL3_IPV4_MISC_I = 0x000f, 4810b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_STEERING_REGISTERS_0 = 0x010f, 4910b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_STEERING_REGISTERS_1 = 0x0110, 50f59464e2SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_OK = 0x0011, 5110b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0 = 0x0111, 5210b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 = 0x0112, 5310b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_MISC_O = 0x0113, 5410b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_MISC_I = 0x0114, 5510b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_INVALID = 0x00ff, 5610b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_DONT_CARE = MLX5DR_STE_LU_TYPE_DONT_CARE, 5710b69418SYevgeny Kliteynik }; 5810b69418SYevgeny Kliteynik 594e856c5dSYevgeny Kliteynik enum dr_ste_v1_header_anchors { 604e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_START_OUTER = 0x00, 614e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_1ST_VLAN = 0x02, 624e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_IPV6_IPV4 = 0x07, 634e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_MAC = 0x13, 644e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_IPV6_IPV4 = 0x19, 654e856c5dSYevgeny Kliteynik }; 664e856c5dSYevgeny Kliteynik 674e856c5dSYevgeny Kliteynik enum dr_ste_v1_action_size { 684e856c5dSYevgeny Kliteynik DR_STE_ACTION_SINGLE_SZ = 4, 694e856c5dSYevgeny Kliteynik DR_STE_ACTION_DOUBLE_SZ = 8, 704e856c5dSYevgeny Kliteynik DR_STE_ACTION_TRIPLE_SZ = 12, 714e856c5dSYevgeny Kliteynik }; 724e856c5dSYevgeny Kliteynik 734e856c5dSYevgeny Kliteynik enum dr_ste_v1_action_insert_ptr_attr { 744e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_NONE = 0, /* Regular push header (e.g. push vlan) */ 754e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP = 1, /* Encapsulation / Tunneling */ 764e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ESP = 2, /* IPsec */ 774e856c5dSYevgeny Kliteynik }; 784e856c5dSYevgeny Kliteynik 794e856c5dSYevgeny Kliteynik enum dr_ste_v1_action_id { 804e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_NOP = 0x00, 814e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_COPY = 0x05, 824e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_SET = 0x06, 834e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_ADD = 0x07, 844e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE = 0x08, 854e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER = 0x09, 864e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_INLINE = 0x0a, 874e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER = 0x0b, 884e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_FLOW_TAG = 0x0c, 894e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_QUEUE_ID_SEL = 0x0d, 904e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_ACCELERATED_LIST = 0x0e, 914e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MODIFY_LIST = 0x0f, 928920d92bSYevgeny Kliteynik DR_STE_V1_ACTION_ID_ASO = 0x12, 934e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_TRAILER = 0x13, 944e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_COUNTER_ID = 0x14, 954e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MAX = 0x21, 964e856c5dSYevgeny Kliteynik /* use for special cases */ 974e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_SPECIAL_ENCAP_L3 = 0x22, 984e856c5dSYevgeny Kliteynik }; 994e856c5dSYevgeny Kliteynik 100c349b413SYevgeny Kliteynik enum { 101c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_0 = 0x00, 102c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_1 = 0x01, 103c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_2 = 0x02, 104c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_0 = 0x08, 105c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_1 = 0x09, 106c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0 = 0x0e, 107c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0 = 0x18, 108c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_1 = 0x19, 109c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_0 = 0x40, 110c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_1 = 0x41, 111c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_0 = 0x44, 112c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_1 = 0x45, 113c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_2 = 0x46, 114c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_3 = 0x47, 115c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_0 = 0x4c, 116c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_1 = 0x4d, 117c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_2 = 0x4e, 118c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_3 = 0x4f, 119c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_0 = 0x5e, 120c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_1 = 0x5f, 121ded6a877SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_CFG_HDR_0_0 = 0x6f, 122ded6a877SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_CFG_HDR_0_1 = 0x70, 123c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_METADATA_2_CQE = 0x7b, 124c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_GNRL_PURPOSE = 0x7c, 12575a3926cSYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_2_0 = 0x8c, 12675a3926cSYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_2_1 = 0x8d, 12775a3926cSYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_1_0 = 0x8e, 12875a3926cSYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_1_1 = 0x8f, 12975a3926cSYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_0_0 = 0x90, 13075a3926cSYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_0_1 = 0x91, 131c349b413SYevgeny Kliteynik }; 132c349b413SYevgeny Kliteynik 1338920d92bSYevgeny Kliteynik enum dr_ste_v1_aso_ctx_type { 1348920d92bSYevgeny Kliteynik DR_STE_V1_ASO_CTX_TYPE_POLICERS = 0x2, 1358920d92bSYevgeny Kliteynik }; 1368920d92bSYevgeny Kliteynik 137c349b413SYevgeny Kliteynik static const struct mlx5dr_ste_action_modify_field dr_ste_v1_action_modify_field_arr[] = { 138c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SMAC_47_16] = { 139c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_0, .start = 0, .end = 31, 140c349b413SYevgeny Kliteynik }, 141c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SMAC_15_0] = { 142c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_1, .start = 16, .end = 31, 143c349b413SYevgeny Kliteynik }, 144c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_ETHERTYPE] = { 145c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_1, .start = 0, .end = 15, 146c349b413SYevgeny Kliteynik }, 147c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DMAC_47_16] = { 148c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_0, .start = 0, .end = 31, 149c349b413SYevgeny Kliteynik }, 150c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DMAC_15_0] = { 151c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_1, .start = 16, .end = 31, 152c349b413SYevgeny Kliteynik }, 153c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_IP_DSCP] = { 154c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0, .start = 18, .end = 23, 155c349b413SYevgeny Kliteynik }, 156c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_FLAGS] = { 157c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_1, .start = 16, .end = 24, 158c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, 159c349b413SYevgeny Kliteynik }, 160c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_SPORT] = { 161c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 16, .end = 31, 162c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, 163c349b413SYevgeny Kliteynik }, 164c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_DPORT] = { 165c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 0, .end = 15, 166c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, 167c349b413SYevgeny Kliteynik }, 168c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_IP_TTL] = { 169c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0, .start = 8, .end = 15, 170c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, 171c349b413SYevgeny Kliteynik }, 172c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_IPV6_HOPLIMIT] = { 173c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0, .start = 8, .end = 15, 174c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 175c349b413SYevgeny Kliteynik }, 176c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_UDP_SPORT] = { 177c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 16, .end = 31, 178c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_UDP, 179c349b413SYevgeny Kliteynik }, 180c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_UDP_DPORT] = { 181c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 0, .end = 15, 182c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_UDP, 183c349b413SYevgeny Kliteynik }, 184c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_127_96] = { 185c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_0, .start = 0, .end = 31, 186c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 187c349b413SYevgeny Kliteynik }, 188c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_95_64] = { 189c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_1, .start = 0, .end = 31, 190c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 191c349b413SYevgeny Kliteynik }, 192c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_63_32] = { 193c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_2, .start = 0, .end = 31, 194c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 195c349b413SYevgeny Kliteynik }, 196c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_31_0] = { 197c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_3, .start = 0, .end = 31, 198c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 199c349b413SYevgeny Kliteynik }, 200c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_127_96] = { 201c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_0, .start = 0, .end = 31, 202c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 203c349b413SYevgeny Kliteynik }, 204c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_95_64] = { 205c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_1, .start = 0, .end = 31, 206c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 207c349b413SYevgeny Kliteynik }, 208c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_63_32] = { 209c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_2, .start = 0, .end = 31, 210c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 211c349b413SYevgeny Kliteynik }, 212c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_31_0] = { 213c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_3, .start = 0, .end = 31, 214c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 215c349b413SYevgeny Kliteynik }, 216c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV4] = { 217c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_0, .start = 0, .end = 31, 218c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, 219c349b413SYevgeny Kliteynik }, 220c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV4] = { 221c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_1, .start = 0, .end = 31, 222c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, 223c349b413SYevgeny Kliteynik }, 224c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_A] = { 225c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_GNRL_PURPOSE, .start = 0, .end = 31, 226c349b413SYevgeny Kliteynik }, 227c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_B] = { 228c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_METADATA_2_CQE, .start = 0, .end = 31, 229c349b413SYevgeny Kliteynik }, 230c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_0] = { 23175a3926cSYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_0_0, .start = 0, .end = 31, 232c349b413SYevgeny Kliteynik }, 233c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_1] = { 23475a3926cSYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_0_1, .start = 0, .end = 31, 235c349b413SYevgeny Kliteynik }, 236c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_2] = { 23775a3926cSYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_1_0, .start = 0, .end = 31, 238c349b413SYevgeny Kliteynik }, 239c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_3] = { 24075a3926cSYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_1_1, .start = 0, .end = 31, 241c349b413SYevgeny Kliteynik }, 242c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_4] = { 24375a3926cSYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_2_0, .start = 0, .end = 31, 244c349b413SYevgeny Kliteynik }, 245c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_5] = { 24675a3926cSYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_2_1, .start = 0, .end = 31, 247c349b413SYevgeny Kliteynik }, 248c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_SEQ_NUM] = { 249c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_0, .start = 0, .end = 31, 250c349b413SYevgeny Kliteynik }, 251c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_ACK_NUM] = { 252c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_1, .start = 0, .end = 31, 253c349b413SYevgeny Kliteynik }, 254c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_FIRST_VID] = { 255c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_2, .start = 0, .end = 15, 256c349b413SYevgeny Kliteynik }, 257ded6a877SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_EMD_31_0] = { 258ded6a877SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_CFG_HDR_0_1, .start = 0, .end = 31, 259ded6a877SYevgeny Kliteynik }, 260ded6a877SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_EMD_47_32] = { 261ded6a877SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_CFG_HDR_0_0, .start = 0, .end = 15, 262ded6a877SYevgeny Kliteynik }, 263c349b413SYevgeny Kliteynik }; 264c349b413SYevgeny Kliteynik 2654e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_entry_type(u8 *hw_ste_p, u8 entry_type) 2664e856c5dSYevgeny Kliteynik { 2674e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, entry_format, entry_type); 2684e856c5dSYevgeny Kliteynik } 2694e856c5dSYevgeny Kliteynik 270*1207a772SYevgeny Kliteynik bool dr_ste_v1_is_miss_addr_set(u8 *hw_ste_p) 271*1207a772SYevgeny Kliteynik { 272*1207a772SYevgeny Kliteynik return false; 273*1207a772SYevgeny Kliteynik } 274*1207a772SYevgeny Kliteynik 2756862c787SYevgeny Kliteynik void dr_ste_v1_set_miss_addr(u8 *hw_ste_p, u64 miss_addr) 276a6098129SYevgeny Kliteynik { 277a6098129SYevgeny Kliteynik u64 index = miss_addr >> 6; 278a6098129SYevgeny Kliteynik 279a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_39_32, index >> 26); 280a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_31_6, index); 281a6098129SYevgeny Kliteynik } 282a6098129SYevgeny Kliteynik 2836862c787SYevgeny Kliteynik u64 dr_ste_v1_get_miss_addr(u8 *hw_ste_p) 284a6098129SYevgeny Kliteynik { 285a6098129SYevgeny Kliteynik u64 index = 28684076c4cSYevgeny Kliteynik ((u64)MLX5_GET(ste_match_bwc_v1, hw_ste_p, miss_address_31_6) | 28784076c4cSYevgeny Kliteynik ((u64)MLX5_GET(ste_match_bwc_v1, hw_ste_p, miss_address_39_32)) << 26); 288a6098129SYevgeny Kliteynik 289a6098129SYevgeny Kliteynik return index << 6; 290a6098129SYevgeny Kliteynik } 291a6098129SYevgeny Kliteynik 2926862c787SYevgeny Kliteynik void dr_ste_v1_set_byte_mask(u8 *hw_ste_p, u16 byte_mask) 293a6098129SYevgeny Kliteynik { 294a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, byte_mask, byte_mask); 295a6098129SYevgeny Kliteynik } 296a6098129SYevgeny Kliteynik 2976862c787SYevgeny Kliteynik u16 dr_ste_v1_get_byte_mask(u8 *hw_ste_p) 298a6098129SYevgeny Kliteynik { 299a6098129SYevgeny Kliteynik return MLX5_GET(ste_match_bwc_v1, hw_ste_p, byte_mask); 300a6098129SYevgeny Kliteynik } 301a6098129SYevgeny Kliteynik 302a6098129SYevgeny Kliteynik static void dr_ste_v1_set_lu_type(u8 *hw_ste_p, u16 lu_type) 303a6098129SYevgeny Kliteynik { 304a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, entry_format, lu_type >> 8); 305a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, match_definer_ctx_idx, lu_type & 0xFF); 306a6098129SYevgeny Kliteynik } 307a6098129SYevgeny Kliteynik 3086862c787SYevgeny Kliteynik void dr_ste_v1_set_next_lu_type(u8 *hw_ste_p, u16 lu_type) 309a6098129SYevgeny Kliteynik { 310a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_entry_format, lu_type >> 8); 311a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, hash_definer_ctx_idx, lu_type & 0xFF); 312a6098129SYevgeny Kliteynik } 313a6098129SYevgeny Kliteynik 3146862c787SYevgeny Kliteynik u16 dr_ste_v1_get_next_lu_type(u8 *hw_ste_p) 315a6098129SYevgeny Kliteynik { 316a6098129SYevgeny Kliteynik u8 mode = MLX5_GET(ste_match_bwc_v1, hw_ste_p, next_entry_format); 317a6098129SYevgeny Kliteynik u8 index = MLX5_GET(ste_match_bwc_v1, hw_ste_p, hash_definer_ctx_idx); 318a6098129SYevgeny Kliteynik 319a6098129SYevgeny Kliteynik return (mode << 8 | index); 320a6098129SYevgeny Kliteynik } 321a6098129SYevgeny Kliteynik 3224e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_hit_gvmi(u8 *hw_ste_p, u16 gvmi) 3234e856c5dSYevgeny Kliteynik { 3244e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_63_48, gvmi); 3254e856c5dSYevgeny Kliteynik } 3264e856c5dSYevgeny Kliteynik 3276862c787SYevgeny Kliteynik void dr_ste_v1_set_hit_addr(u8 *hw_ste_p, u64 icm_addr, u32 ht_size) 328a6098129SYevgeny Kliteynik { 329a6098129SYevgeny Kliteynik u64 index = (icm_addr >> 5) | ht_size; 330a6098129SYevgeny Kliteynik 331a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_39_32_size, index >> 27); 332a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_31_5_size, index); 333a6098129SYevgeny Kliteynik } 334a6098129SYevgeny Kliteynik 3356862c787SYevgeny Kliteynik void dr_ste_v1_init(u8 *hw_ste_p, u16 lu_type, bool is_rx, u16 gvmi) 336a6098129SYevgeny Kliteynik { 337a6098129SYevgeny Kliteynik dr_ste_v1_set_lu_type(hw_ste_p, lu_type); 338a6098129SYevgeny Kliteynik dr_ste_v1_set_next_lu_type(hw_ste_p, MLX5DR_STE_LU_TYPE_DONT_CARE); 339a6098129SYevgeny Kliteynik 340a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, gvmi, gvmi); 341a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_63_48, gvmi); 342a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_63_48, gvmi); 343a6098129SYevgeny Kliteynik } 344a6098129SYevgeny Kliteynik 3456862c787SYevgeny Kliteynik void dr_ste_v1_prepare_for_postsend(u8 *hw_ste_p, u32 ste_size) 3464fe45e1dSYevgeny Kliteynik { 3474fe45e1dSYevgeny Kliteynik u8 *tag = hw_ste_p + DR_STE_SIZE_CTRL; 3484fe45e1dSYevgeny Kliteynik u8 *mask = tag + DR_STE_SIZE_TAG; 3494fe45e1dSYevgeny Kliteynik u8 tmp_tag[DR_STE_SIZE_TAG] = {}; 3504fe45e1dSYevgeny Kliteynik 3514fe45e1dSYevgeny Kliteynik if (ste_size == DR_STE_SIZE_CTRL) 3524fe45e1dSYevgeny Kliteynik return; 3534fe45e1dSYevgeny Kliteynik 3544fe45e1dSYevgeny Kliteynik WARN_ON(ste_size != DR_STE_SIZE); 3554fe45e1dSYevgeny Kliteynik 3564fe45e1dSYevgeny Kliteynik /* Backup tag */ 3574fe45e1dSYevgeny Kliteynik memcpy(tmp_tag, tag, DR_STE_SIZE_TAG); 3584fe45e1dSYevgeny Kliteynik 3594fe45e1dSYevgeny Kliteynik /* Swap mask and tag both are the same size */ 3604fe45e1dSYevgeny Kliteynik memcpy(tag, mask, DR_STE_SIZE_MASK); 3614fe45e1dSYevgeny Kliteynik memcpy(mask, tmp_tag, DR_STE_SIZE_TAG); 3624fe45e1dSYevgeny Kliteynik } 3634fe45e1dSYevgeny Kliteynik 3644e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_flow_tag(u8 *s_action, u32 flow_tag) 3654e856c5dSYevgeny Kliteynik { 3664e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_flow_tag_v1, s_action, action_id, 3674e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_FLOW_TAG); 3684e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_flow_tag_v1, s_action, flow_tag, flow_tag); 3694e856c5dSYevgeny Kliteynik } 3704e856c5dSYevgeny Kliteynik 3714e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_counter_id(u8 *hw_ste_p, u32 ctr_id) 3724e856c5dSYevgeny Kliteynik { 3734e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, counter_id, ctr_id); 3744e856c5dSYevgeny Kliteynik } 3754e856c5dSYevgeny Kliteynik 3764e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_reparse(u8 *hw_ste_p) 3774e856c5dSYevgeny Kliteynik { 3784e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, reparse, 1); 3794e856c5dSYevgeny Kliteynik } 3804e856c5dSYevgeny Kliteynik 381d7418b4eSYevgeny Kliteynik static void dr_ste_v1_set_encap(u8 *hw_ste_p, u8 *d_action, 3824e856c5dSYevgeny Kliteynik u32 reformat_id, int size) 3834e856c5dSYevgeny Kliteynik { 3844e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, action_id, 3854e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER); 3864e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 3874e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, size, size / 2); 3884e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, pointer, reformat_id); 3894e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, attributes, 3904e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP); 3914e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 3924e856c5dSYevgeny Kliteynik } 3934e856c5dSYevgeny Kliteynik 3947ea9b398SYevgeny Kliteynik static void dr_ste_v1_set_insert_hdr(u8 *hw_ste_p, u8 *d_action, 3957ea9b398SYevgeny Kliteynik u32 reformat_id, 3967ea9b398SYevgeny Kliteynik u8 anchor, u8 offset, 3977ea9b398SYevgeny Kliteynik int size) 3987ea9b398SYevgeny Kliteynik { 3997ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, 4007ea9b398SYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_INSERT_POINTER); 4017ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, start_anchor, anchor); 4027ea9b398SYevgeny Kliteynik 4037ea9b398SYevgeny Kliteynik /* The hardware expects here size and offset in words (2 byte) */ 4047ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, size, size / 2); 4057ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, start_offset, offset / 2); 4067ea9b398SYevgeny Kliteynik 4077ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, pointer, reformat_id); 4087ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, attributes, 4097ea9b398SYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_NONE); 4107ea9b398SYevgeny Kliteynik 4117ea9b398SYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4127ea9b398SYevgeny Kliteynik } 4137ea9b398SYevgeny Kliteynik 4140139145fSYevgeny Kliteynik static void dr_ste_v1_set_remove_hdr(u8 *hw_ste_p, u8 *s_action, 4150139145fSYevgeny Kliteynik u8 anchor, u8 offset, 4160139145fSYevgeny Kliteynik int size) 4170139145fSYevgeny Kliteynik { 4180139145fSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 4190139145fSYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE); 4200139145fSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, start_anchor, anchor); 4210139145fSYevgeny Kliteynik 4220139145fSYevgeny Kliteynik /* The hardware expects here size and offset in words (2 byte) */ 4230139145fSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, remove_size, size / 2); 4240139145fSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, start_offset, offset / 2); 4250139145fSYevgeny Kliteynik 4260139145fSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4270139145fSYevgeny Kliteynik } 4280139145fSYevgeny Kliteynik 4292de40f68SYevgeny Kliteynik static void dr_ste_v1_set_push_vlan(u8 *hw_ste_p, u8 *d_action, 4304e856c5dSYevgeny Kliteynik u32 vlan_hdr) 4314e856c5dSYevgeny Kliteynik { 4324e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 4334e856c5dSYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_INSERT_INLINE); 4344e856c5dSYevgeny Kliteynik /* The hardware expects offset to vlan header in words (2 byte) */ 4354e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 4364e856c5dSYevgeny Kliteynik start_offset, HDR_LEN_L2_MACS >> 1); 4374e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 4384e856c5dSYevgeny Kliteynik inline_data, vlan_hdr); 4394e856c5dSYevgeny Kliteynik 4404e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4414e856c5dSYevgeny Kliteynik } 4424e856c5dSYevgeny Kliteynik 4432de40f68SYevgeny Kliteynik static void dr_ste_v1_set_pop_vlan(u8 *hw_ste_p, u8 *s_action, u8 vlans_num) 4444e856c5dSYevgeny Kliteynik { 4454e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 4464e856c5dSYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE); 4474e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 4484e856c5dSYevgeny Kliteynik start_anchor, DR_STE_HEADER_ANCHOR_1ST_VLAN); 4494e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 4504e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 4514e856c5dSYevgeny Kliteynik remove_size, (HDR_LEN_L2_VLAN >> 1) * vlans_num); 4524e856c5dSYevgeny Kliteynik 4534e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4544e856c5dSYevgeny Kliteynik } 4554e856c5dSYevgeny Kliteynik 456d7418b4eSYevgeny Kliteynik static void dr_ste_v1_set_encap_l3(u8 *hw_ste_p, 4574e856c5dSYevgeny Kliteynik u8 *frst_s_action, 4584e856c5dSYevgeny Kliteynik u8 *scnd_d_action, 4594e856c5dSYevgeny Kliteynik u32 reformat_id, 4604e856c5dSYevgeny Kliteynik int size) 4614e856c5dSYevgeny Kliteynik { 4624e856c5dSYevgeny Kliteynik /* Remove L2 headers */ 4634e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, frst_s_action, action_id, 4644e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 4654e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, frst_s_action, end_anchor, 4664e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_IPV6_IPV4); 4674e856c5dSYevgeny Kliteynik 4684e856c5dSYevgeny Kliteynik /* Encapsulate with given reformat ID */ 4694e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, action_id, 4704e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER); 4714e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 4724e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, size, size / 2); 4734e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, pointer, reformat_id); 4744e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, attributes, 4754e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP); 4764e856c5dSYevgeny Kliteynik 4774e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4784e856c5dSYevgeny Kliteynik } 4794e856c5dSYevgeny Kliteynik 4804e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_decap(u8 *hw_ste_p, u8 *s_action) 4814e856c5dSYevgeny Kliteynik { 4824e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, action_id, 4834e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 4844e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, decap, 1); 4854e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, vni_to_cqe, 1); 4864e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, end_anchor, 4874e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_MAC); 4884e856c5dSYevgeny Kliteynik 4894e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4904e856c5dSYevgeny Kliteynik } 4914e856c5dSYevgeny Kliteynik 4924e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rewrite_actions(u8 *hw_ste_p, 4934e856c5dSYevgeny Kliteynik u8 *s_action, 4944e856c5dSYevgeny Kliteynik u16 num_of_actions, 4954e856c5dSYevgeny Kliteynik u32 re_write_index) 4964e856c5dSYevgeny Kliteynik { 4974e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, action_id, 4984e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MODIFY_LIST); 4994e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, num_of_modify_actions, 5004e856c5dSYevgeny Kliteynik num_of_actions); 5014e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, modify_actions_ptr, 5024e856c5dSYevgeny Kliteynik re_write_index); 5034e856c5dSYevgeny Kliteynik 5044e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 5054e856c5dSYevgeny Kliteynik } 5064e856c5dSYevgeny Kliteynik 5078920d92bSYevgeny Kliteynik static void dr_ste_v1_set_aso_flow_meter(u8 *d_action, 5088920d92bSYevgeny Kliteynik u32 object_id, 5098920d92bSYevgeny Kliteynik u32 offset, 5108920d92bSYevgeny Kliteynik u8 dest_reg_id, 5118920d92bSYevgeny Kliteynik u8 init_color) 5128920d92bSYevgeny Kliteynik { 5138920d92bSYevgeny Kliteynik MLX5_SET(ste_double_action_aso_v1, d_action, action_id, 5148920d92bSYevgeny Kliteynik DR_STE_V1_ACTION_ID_ASO); 5158920d92bSYevgeny Kliteynik MLX5_SET(ste_double_action_aso_v1, d_action, aso_context_number, 5168920d92bSYevgeny Kliteynik object_id + (offset / MLX5DR_ASO_FLOW_METER_NUM_PER_OBJ)); 5178920d92bSYevgeny Kliteynik /* Convert reg_c index to HW 64bit index */ 5188920d92bSYevgeny Kliteynik MLX5_SET(ste_double_action_aso_v1, d_action, dest_reg_id, 5198920d92bSYevgeny Kliteynik (dest_reg_id - 1) / 2); 5208920d92bSYevgeny Kliteynik MLX5_SET(ste_double_action_aso_v1, d_action, aso_context_type, 5218920d92bSYevgeny Kliteynik DR_STE_V1_ASO_CTX_TYPE_POLICERS); 5228920d92bSYevgeny Kliteynik MLX5_SET(ste_double_action_aso_v1, d_action, flow_meter.line_id, 5238920d92bSYevgeny Kliteynik offset % MLX5DR_ASO_FLOW_METER_NUM_PER_OBJ); 5248920d92bSYevgeny Kliteynik MLX5_SET(ste_double_action_aso_v1, d_action, flow_meter.initial_color, 5258920d92bSYevgeny Kliteynik init_color); 5268920d92bSYevgeny Kliteynik } 5278920d92bSYevgeny Kliteynik 5284e856c5dSYevgeny Kliteynik static void dr_ste_v1_arr_init_next_match(u8 **last_ste, 5294e856c5dSYevgeny Kliteynik u32 *added_stes, 5304e856c5dSYevgeny Kliteynik u16 gvmi) 5314e856c5dSYevgeny Kliteynik { 5324e856c5dSYevgeny Kliteynik u8 *action; 5334e856c5dSYevgeny Kliteynik 5344e856c5dSYevgeny Kliteynik (*added_stes)++; 5354e856c5dSYevgeny Kliteynik *last_ste += DR_STE_SIZE; 5364e856c5dSYevgeny Kliteynik dr_ste_v1_init(*last_ste, MLX5DR_STE_LU_TYPE_DONT_CARE, 0, gvmi); 5374e856c5dSYevgeny Kliteynik dr_ste_v1_set_entry_type(*last_ste, DR_STE_V1_TYPE_MATCH); 5384e856c5dSYevgeny Kliteynik 5394e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, *last_ste, action); 5404e856c5dSYevgeny Kliteynik memset(action, 0, MLX5_FLD_SZ_BYTES(ste_mask_and_match_v1, action)); 5414e856c5dSYevgeny Kliteynik } 5424e856c5dSYevgeny Kliteynik 5436862c787SYevgeny Kliteynik void dr_ste_v1_set_actions_tx(struct mlx5dr_domain *dmn, 5444e856c5dSYevgeny Kliteynik u8 *action_type_set, 545638a07f1SYevgeny Kliteynik u32 actions_caps, 5464e856c5dSYevgeny Kliteynik u8 *last_ste, 5474e856c5dSYevgeny Kliteynik struct mlx5dr_ste_actions_attr *attr, 5484e856c5dSYevgeny Kliteynik u32 *added_stes) 5494e856c5dSYevgeny Kliteynik { 5504e856c5dSYevgeny Kliteynik u8 *action = MLX5_ADDR_OF(ste_match_bwc_v1, last_ste, action); 5514e856c5dSYevgeny Kliteynik u8 action_sz = DR_STE_ACTION_DOUBLE_SZ; 5522de40f68SYevgeny Kliteynik bool allow_modify_hdr = true; 5534e856c5dSYevgeny Kliteynik bool allow_encap = true; 5544e856c5dSYevgeny Kliteynik 5552de40f68SYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_POP_VLAN]) { 5562de40f68SYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ) { 5572de40f68SYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, 5582de40f68SYevgeny Kliteynik attr->gvmi); 5592de40f68SYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, 5602de40f68SYevgeny Kliteynik last_ste, action); 5612de40f68SYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 5622de40f68SYevgeny Kliteynik } 5632de40f68SYevgeny Kliteynik dr_ste_v1_set_pop_vlan(last_ste, action, attr->vlans.count); 5642de40f68SYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 5652de40f68SYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 566638a07f1SYevgeny Kliteynik 567638a07f1SYevgeny Kliteynik /* Check if vlan_pop and modify_hdr on same STE is supported */ 568638a07f1SYevgeny Kliteynik if (!(actions_caps & DR_STE_CTX_ACTION_CAP_POP_MDFY)) 569638a07f1SYevgeny Kliteynik allow_modify_hdr = false; 5702de40f68SYevgeny Kliteynik } 5712de40f68SYevgeny Kliteynik 5724e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_CTR]) 5734e856c5dSYevgeny Kliteynik dr_ste_v1_set_counter_id(last_ste, attr->ctr_id); 5744e856c5dSYevgeny Kliteynik 5754e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_MODIFY_HDR]) { 5762de40f68SYevgeny Kliteynik if (!allow_modify_hdr || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 5774e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, 5784e856c5dSYevgeny Kliteynik attr->gvmi); 5794e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, 5804e856c5dSYevgeny Kliteynik last_ste, action); 5814e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 5824e856c5dSYevgeny Kliteynik } 5834e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 5844e856c5dSYevgeny Kliteynik attr->modify_actions, 5854e856c5dSYevgeny Kliteynik attr->modify_index); 5864e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 5874e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 5884e856c5dSYevgeny Kliteynik allow_encap = false; 5894e856c5dSYevgeny Kliteynik } 5904e856c5dSYevgeny Kliteynik 5914e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_PUSH_VLAN]) { 5924e856c5dSYevgeny Kliteynik int i; 5934e856c5dSYevgeny Kliteynik 5944e856c5dSYevgeny Kliteynik for (i = 0; i < attr->vlans.count; i++) { 5954e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ || !allow_encap) { 5964e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 5974e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 5984e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 5994e856c5dSYevgeny Kliteynik allow_encap = true; 6004e856c5dSYevgeny Kliteynik } 6012de40f68SYevgeny Kliteynik dr_ste_v1_set_push_vlan(last_ste, action, 6022de40f68SYevgeny Kliteynik attr->vlans.headers[i]); 6034e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 6044e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 6054e856c5dSYevgeny Kliteynik } 6064e856c5dSYevgeny Kliteynik } 6074e856c5dSYevgeny Kliteynik 6084e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L2]) { 6094e856c5dSYevgeny Kliteynik if (!allow_encap || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 6104e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 6114e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 6124e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6134e856c5dSYevgeny Kliteynik allow_encap = true; 6144e856c5dSYevgeny Kliteynik } 615d7418b4eSYevgeny Kliteynik dr_ste_v1_set_encap(last_ste, action, 6167ea9b398SYevgeny Kliteynik attr->reformat.id, 6177ea9b398SYevgeny Kliteynik attr->reformat.size); 6184e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 6194e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 6204e856c5dSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L3]) { 6214e856c5dSYevgeny Kliteynik u8 *d_action; 6224e856c5dSYevgeny Kliteynik 623515ce2ffSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_TRIPLE_SZ) { 6244e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 6254e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 6264e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 627515ce2ffSYevgeny Kliteynik } 6284e856c5dSYevgeny Kliteynik d_action = action + DR_STE_ACTION_SINGLE_SZ; 6294e856c5dSYevgeny Kliteynik 630d7418b4eSYevgeny Kliteynik dr_ste_v1_set_encap_l3(last_ste, 6314e856c5dSYevgeny Kliteynik action, d_action, 6327ea9b398SYevgeny Kliteynik attr->reformat.id, 6337ea9b398SYevgeny Kliteynik attr->reformat.size); 6344e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_TRIPLE_SZ; 6354e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_TRIPLE_SZ; 6367ea9b398SYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_INSERT_HDR]) { 6377ea9b398SYevgeny Kliteynik if (!allow_encap || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 6387ea9b398SYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 6397ea9b398SYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 6407ea9b398SYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6417ea9b398SYevgeny Kliteynik } 6427ea9b398SYevgeny Kliteynik dr_ste_v1_set_insert_hdr(last_ste, action, 6437ea9b398SYevgeny Kliteynik attr->reformat.id, 6447ea9b398SYevgeny Kliteynik attr->reformat.param_0, 6457ea9b398SYevgeny Kliteynik attr->reformat.param_1, 6467ea9b398SYevgeny Kliteynik attr->reformat.size); 6477ea9b398SYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 6487ea9b398SYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 6490139145fSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_REMOVE_HDR]) { 6500139145fSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ) { 6510139145fSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 6520139145fSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 6530139145fSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6540139145fSYevgeny Kliteynik } 6550139145fSYevgeny Kliteynik dr_ste_v1_set_remove_hdr(last_ste, action, 6560139145fSYevgeny Kliteynik attr->reformat.param_0, 6570139145fSYevgeny Kliteynik attr->reformat.param_1, 6580139145fSYevgeny Kliteynik attr->reformat.size); 6590139145fSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 6600139145fSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 6614e856c5dSYevgeny Kliteynik } 6624e856c5dSYevgeny Kliteynik 6638920d92bSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_ASO_FLOW_METER]) { 6648920d92bSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ) { 6658920d92bSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 6668920d92bSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 6678920d92bSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6688920d92bSYevgeny Kliteynik } 6698920d92bSYevgeny Kliteynik dr_ste_v1_set_aso_flow_meter(action, 6708920d92bSYevgeny Kliteynik attr->aso_flow_meter.obj_id, 6718920d92bSYevgeny Kliteynik attr->aso_flow_meter.offset, 6728920d92bSYevgeny Kliteynik attr->aso_flow_meter.dest_reg_id, 6738920d92bSYevgeny Kliteynik attr->aso_flow_meter.init_color); 6748920d92bSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 6758920d92bSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 6768920d92bSYevgeny Kliteynik } 6778920d92bSYevgeny Kliteynik 6784e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_gvmi(last_ste, attr->hit_gvmi); 6794e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_addr(last_ste, attr->final_icm_addr, 1); 6804e856c5dSYevgeny Kliteynik } 6814e856c5dSYevgeny Kliteynik 6826862c787SYevgeny Kliteynik void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn, 6834e856c5dSYevgeny Kliteynik u8 *action_type_set, 684638a07f1SYevgeny Kliteynik u32 actions_caps, 6854e856c5dSYevgeny Kliteynik u8 *last_ste, 6864e856c5dSYevgeny Kliteynik struct mlx5dr_ste_actions_attr *attr, 6874e856c5dSYevgeny Kliteynik u32 *added_stes) 6884e856c5dSYevgeny Kliteynik { 6894e856c5dSYevgeny Kliteynik u8 *action = MLX5_ADDR_OF(ste_match_bwc_v1, last_ste, action); 6904e856c5dSYevgeny Kliteynik u8 action_sz = DR_STE_ACTION_DOUBLE_SZ; 6914e856c5dSYevgeny Kliteynik bool allow_modify_hdr = true; 6924e856c5dSYevgeny Kliteynik bool allow_ctr = true; 6934e856c5dSYevgeny Kliteynik 6944e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_TNL_L3_TO_L2]) { 6954e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 6964e856c5dSYevgeny Kliteynik attr->decap_actions, 6974e856c5dSYevgeny Kliteynik attr->decap_index); 6984e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 6994e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 7004e856c5dSYevgeny Kliteynik allow_modify_hdr = false; 7014e856c5dSYevgeny Kliteynik allow_ctr = false; 7024e856c5dSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_TNL_L2_TO_L2]) { 7034e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_decap(last_ste, action); 7044e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 7054e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 7064e856c5dSYevgeny Kliteynik allow_modify_hdr = false; 7074e856c5dSYevgeny Kliteynik allow_ctr = false; 7084e856c5dSYevgeny Kliteynik } 7094e856c5dSYevgeny Kliteynik 7104e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_TAG]) { 7114e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ) { 7124e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 7134e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 7144e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 7154e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 7164e856c5dSYevgeny Kliteynik allow_ctr = true; 7174e856c5dSYevgeny Kliteynik } 7184e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_flow_tag(action, attr->flow_tag); 7194e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 7204e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 7214e856c5dSYevgeny Kliteynik } 7224e856c5dSYevgeny Kliteynik 7234e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_POP_VLAN]) { 7244e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ || 7254e856c5dSYevgeny Kliteynik !allow_modify_hdr) { 7264e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 7274e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 7284e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 7294e856c5dSYevgeny Kliteynik } 7304e856c5dSYevgeny Kliteynik 7312de40f68SYevgeny Kliteynik dr_ste_v1_set_pop_vlan(last_ste, action, attr->vlans.count); 7324e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 7334e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 734bdc3ab57SYevgeny Kliteynik allow_ctr = false; 735638a07f1SYevgeny Kliteynik 736638a07f1SYevgeny Kliteynik /* Check if vlan_pop and modify_hdr on same STE is supported */ 737638a07f1SYevgeny Kliteynik if (!(actions_caps & DR_STE_CTX_ACTION_CAP_POP_MDFY)) 738638a07f1SYevgeny Kliteynik allow_modify_hdr = false; 7394e856c5dSYevgeny Kliteynik } 7404e856c5dSYevgeny Kliteynik 7414e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_MODIFY_HDR]) { 7424e856c5dSYevgeny Kliteynik /* Modify header and decapsulation must use different STEs */ 7434e856c5dSYevgeny Kliteynik if (!allow_modify_hdr || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 7444e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 7454e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 7464e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 7474e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 7484e856c5dSYevgeny Kliteynik allow_ctr = true; 7494e856c5dSYevgeny Kliteynik } 7504e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 7514e856c5dSYevgeny Kliteynik attr->modify_actions, 7524e856c5dSYevgeny Kliteynik attr->modify_index); 7534e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 7544e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 7554e856c5dSYevgeny Kliteynik } 7564e856c5dSYevgeny Kliteynik 7572de40f68SYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_PUSH_VLAN]) { 7582de40f68SYevgeny Kliteynik int i; 7592de40f68SYevgeny Kliteynik 7602de40f68SYevgeny Kliteynik for (i = 0; i < attr->vlans.count; i++) { 7612de40f68SYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ || 7622de40f68SYevgeny Kliteynik !allow_modify_hdr) { 7632de40f68SYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, 7642de40f68SYevgeny Kliteynik added_stes, 7652de40f68SYevgeny Kliteynik attr->gvmi); 7662de40f68SYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, 7672de40f68SYevgeny Kliteynik last_ste, action); 7682de40f68SYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 7692de40f68SYevgeny Kliteynik } 7702de40f68SYevgeny Kliteynik dr_ste_v1_set_push_vlan(last_ste, action, 7712de40f68SYevgeny Kliteynik attr->vlans.headers[i]); 7722de40f68SYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 7732de40f68SYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 7742de40f68SYevgeny Kliteynik } 7752de40f68SYevgeny Kliteynik } 7762de40f68SYevgeny Kliteynik 7774e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_CTR]) { 7787ea9b398SYevgeny Kliteynik /* Counter action set after decap and before insert_hdr 7797ea9b398SYevgeny Kliteynik * to exclude decaped / encaped header respectively. 7807ea9b398SYevgeny Kliteynik */ 7814e856c5dSYevgeny Kliteynik if (!allow_ctr) { 7824e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 7834e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 7844e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 7854e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 7864e856c5dSYevgeny Kliteynik } 7874e856c5dSYevgeny Kliteynik dr_ste_v1_set_counter_id(last_ste, attr->ctr_id); 788bdc3ab57SYevgeny Kliteynik allow_ctr = false; 7894e856c5dSYevgeny Kliteynik } 7904e856c5dSYevgeny Kliteynik 791d7418b4eSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L2]) { 792d7418b4eSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ) { 793d7418b4eSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 794d7418b4eSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 795d7418b4eSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 796d7418b4eSYevgeny Kliteynik } 797d7418b4eSYevgeny Kliteynik dr_ste_v1_set_encap(last_ste, action, 7987ea9b398SYevgeny Kliteynik attr->reformat.id, 7997ea9b398SYevgeny Kliteynik attr->reformat.size); 800d7418b4eSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 801d7418b4eSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 802d7418b4eSYevgeny Kliteynik allow_modify_hdr = false; 803d7418b4eSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L3]) { 804d7418b4eSYevgeny Kliteynik u8 *d_action; 805d7418b4eSYevgeny Kliteynik 806d7418b4eSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_TRIPLE_SZ) { 807d7418b4eSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 808d7418b4eSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 809d7418b4eSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 810d7418b4eSYevgeny Kliteynik } 811d7418b4eSYevgeny Kliteynik 812d7418b4eSYevgeny Kliteynik d_action = action + DR_STE_ACTION_SINGLE_SZ; 813d7418b4eSYevgeny Kliteynik 814d7418b4eSYevgeny Kliteynik dr_ste_v1_set_encap_l3(last_ste, 815d7418b4eSYevgeny Kliteynik action, d_action, 8167ea9b398SYevgeny Kliteynik attr->reformat.id, 8177ea9b398SYevgeny Kliteynik attr->reformat.size); 818d7418b4eSYevgeny Kliteynik action_sz -= DR_STE_ACTION_TRIPLE_SZ; 819d7418b4eSYevgeny Kliteynik allow_modify_hdr = false; 8207ea9b398SYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_INSERT_HDR]) { 8217ea9b398SYevgeny Kliteynik /* Modify header, decap, and encap must use different STEs */ 8227ea9b398SYevgeny Kliteynik if (!allow_modify_hdr || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 8237ea9b398SYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 8247ea9b398SYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 8257ea9b398SYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 8267ea9b398SYevgeny Kliteynik } 8277ea9b398SYevgeny Kliteynik dr_ste_v1_set_insert_hdr(last_ste, action, 8287ea9b398SYevgeny Kliteynik attr->reformat.id, 8297ea9b398SYevgeny Kliteynik attr->reformat.param_0, 8307ea9b398SYevgeny Kliteynik attr->reformat.param_1, 8317ea9b398SYevgeny Kliteynik attr->reformat.size); 8327ea9b398SYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 8337ea9b398SYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 8347ea9b398SYevgeny Kliteynik allow_modify_hdr = false; 8350139145fSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_REMOVE_HDR]) { 8360139145fSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ) { 8370139145fSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 8380139145fSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 8390139145fSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 8400139145fSYevgeny Kliteynik allow_modify_hdr = true; 8410139145fSYevgeny Kliteynik allow_ctr = true; 8420139145fSYevgeny Kliteynik } 8430139145fSYevgeny Kliteynik dr_ste_v1_set_remove_hdr(last_ste, action, 8440139145fSYevgeny Kliteynik attr->reformat.param_0, 8450139145fSYevgeny Kliteynik attr->reformat.param_1, 8460139145fSYevgeny Kliteynik attr->reformat.size); 8470139145fSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 8480139145fSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 849d7418b4eSYevgeny Kliteynik } 850d7418b4eSYevgeny Kliteynik 8518920d92bSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_ASO_FLOW_METER]) { 8528920d92bSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ) { 8538920d92bSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 8548920d92bSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 8558920d92bSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 8568920d92bSYevgeny Kliteynik } 8578920d92bSYevgeny Kliteynik dr_ste_v1_set_aso_flow_meter(action, 8588920d92bSYevgeny Kliteynik attr->aso_flow_meter.obj_id, 8598920d92bSYevgeny Kliteynik attr->aso_flow_meter.offset, 8608920d92bSYevgeny Kliteynik attr->aso_flow_meter.dest_reg_id, 8618920d92bSYevgeny Kliteynik attr->aso_flow_meter.init_color); 8628920d92bSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 8638920d92bSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 8648920d92bSYevgeny Kliteynik } 8658920d92bSYevgeny Kliteynik 8664e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_gvmi(last_ste, attr->hit_gvmi); 8674e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_addr(last_ste, attr->final_icm_addr, 1); 8684e856c5dSYevgeny Kliteynik } 8694e856c5dSYevgeny Kliteynik 8706862c787SYevgeny Kliteynik void dr_ste_v1_set_action_set(u8 *d_action, 871c349b413SYevgeny Kliteynik u8 hw_field, 872c349b413SYevgeny Kliteynik u8 shifter, 873c349b413SYevgeny Kliteynik u8 length, 874c349b413SYevgeny Kliteynik u32 data) 875c349b413SYevgeny Kliteynik { 876c349b413SYevgeny Kliteynik shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 877c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, action_id, DR_STE_V1_ACTION_ID_SET); 878c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, destination_dw_offset, hw_field); 879c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, destination_left_shifter, shifter); 880c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, destination_length, length); 881c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, inline_data, data); 882c349b413SYevgeny Kliteynik } 883c349b413SYevgeny Kliteynik 8846862c787SYevgeny Kliteynik void dr_ste_v1_set_action_add(u8 *d_action, 885c349b413SYevgeny Kliteynik u8 hw_field, 886c349b413SYevgeny Kliteynik u8 shifter, 887c349b413SYevgeny Kliteynik u8 length, 888c349b413SYevgeny Kliteynik u32 data) 889c349b413SYevgeny Kliteynik { 890c349b413SYevgeny Kliteynik shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 891c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, action_id, DR_STE_V1_ACTION_ID_ADD); 892c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, destination_dw_offset, hw_field); 893c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, destination_left_shifter, shifter); 894c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, destination_length, length); 895c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, add_value, data); 896c349b413SYevgeny Kliteynik } 897c349b413SYevgeny Kliteynik 8986862c787SYevgeny Kliteynik void dr_ste_v1_set_action_copy(u8 *d_action, 899c349b413SYevgeny Kliteynik u8 dst_hw_field, 900c349b413SYevgeny Kliteynik u8 dst_shifter, 901c349b413SYevgeny Kliteynik u8 dst_len, 902c349b413SYevgeny Kliteynik u8 src_hw_field, 903c349b413SYevgeny Kliteynik u8 src_shifter) 904c349b413SYevgeny Kliteynik { 905c349b413SYevgeny Kliteynik dst_shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 906c349b413SYevgeny Kliteynik src_shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 907c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, action_id, DR_STE_V1_ACTION_ID_COPY); 908c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, destination_dw_offset, dst_hw_field); 909c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, destination_left_shifter, dst_shifter); 910c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, destination_length, dst_len); 911c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, source_dw_offset, src_hw_field); 912c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, source_right_shifter, src_shifter); 913c349b413SYevgeny Kliteynik } 914c349b413SYevgeny Kliteynik 915c349b413SYevgeny Kliteynik #define DR_STE_DECAP_L3_ACTION_NUM 8 916c349b413SYevgeny Kliteynik #define DR_STE_L2_HDR_MAX_SZ 20 917c349b413SYevgeny Kliteynik 9186862c787SYevgeny Kliteynik int dr_ste_v1_set_action_decap_l3_list(void *data, 919c349b413SYevgeny Kliteynik u32 data_sz, 920c349b413SYevgeny Kliteynik u8 *hw_action, 921c349b413SYevgeny Kliteynik u32 hw_action_sz, 922c349b413SYevgeny Kliteynik u16 *used_hw_action_num) 923c349b413SYevgeny Kliteynik { 924c349b413SYevgeny Kliteynik u8 padded_data[DR_STE_L2_HDR_MAX_SZ] = {}; 925c349b413SYevgeny Kliteynik void *data_ptr = padded_data; 926c349b413SYevgeny Kliteynik u16 used_actions = 0; 927c349b413SYevgeny Kliteynik u32 inline_data_sz; 928c349b413SYevgeny Kliteynik u32 i; 929c349b413SYevgeny Kliteynik 930c349b413SYevgeny Kliteynik if (hw_action_sz / DR_STE_ACTION_DOUBLE_SZ < DR_STE_DECAP_L3_ACTION_NUM) 931c349b413SYevgeny Kliteynik return -EINVAL; 932c349b413SYevgeny Kliteynik 93365fb7d10SAlex Vesker inline_data_sz = 93465fb7d10SAlex Vesker MLX5_FLD_SZ_BYTES(ste_double_action_insert_with_inline_v1, inline_data); 93565fb7d10SAlex Vesker 93665fb7d10SAlex Vesker /* Add an alignment padding */ 93765fb7d10SAlex Vesker memcpy(padded_data + data_sz % inline_data_sz, data, data_sz); 938c349b413SYevgeny Kliteynik 939c349b413SYevgeny Kliteynik /* Remove L2L3 outer headers */ 940c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, action_id, 941c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 942c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, decap, 1); 943c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, vni_to_cqe, 1); 944c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, end_anchor, 945c349b413SYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_IPV6_IPV4); 946c349b413SYevgeny Kliteynik hw_action += DR_STE_ACTION_DOUBLE_SZ; 947c349b413SYevgeny Kliteynik used_actions++; /* Remove and NOP are a single double action */ 948c349b413SYevgeny Kliteynik 94965fb7d10SAlex Vesker /* Point to the last dword of the header */ 95065fb7d10SAlex Vesker data_ptr += (data_sz / inline_data_sz) * inline_data_sz; 951c349b413SYevgeny Kliteynik 95265fb7d10SAlex Vesker /* Add the new header using inline action 4Byte at a time, the header 95365fb7d10SAlex Vesker * is added in reversed order to the beginning of the packet to avoid 95465fb7d10SAlex Vesker * incorrect parsing by the HW. Since header is 14B or 18B an extra 95565fb7d10SAlex Vesker * two bytes are padded and later removed. 95665fb7d10SAlex Vesker */ 957c349b413SYevgeny Kliteynik for (i = 0; i < data_sz / inline_data_sz + 1; i++) { 958c349b413SYevgeny Kliteynik void *addr_inline; 959c349b413SYevgeny Kliteynik 960c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, hw_action, action_id, 961c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_INLINE); 962c349b413SYevgeny Kliteynik /* The hardware expects here offset to words (2 bytes) */ 96365fb7d10SAlex Vesker MLX5_SET(ste_double_action_insert_with_inline_v1, hw_action, start_offset, 0); 964c349b413SYevgeny Kliteynik 965c349b413SYevgeny Kliteynik /* Copy bytes one by one to avoid endianness problem */ 966c349b413SYevgeny Kliteynik addr_inline = MLX5_ADDR_OF(ste_double_action_insert_with_inline_v1, 967c349b413SYevgeny Kliteynik hw_action, inline_data); 96865fb7d10SAlex Vesker memcpy(addr_inline, data_ptr - i * inline_data_sz, inline_data_sz); 969c349b413SYevgeny Kliteynik hw_action += DR_STE_ACTION_DOUBLE_SZ; 970c349b413SYevgeny Kliteynik used_actions++; 971c349b413SYevgeny Kliteynik } 972c349b413SYevgeny Kliteynik 97365fb7d10SAlex Vesker /* Remove first 2 extra bytes */ 974c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, hw_action, action_id, 975c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE); 97665fb7d10SAlex Vesker MLX5_SET(ste_single_action_remove_header_size_v1, hw_action, start_offset, 0); 977c349b413SYevgeny Kliteynik /* The hardware expects here size in words (2 bytes) */ 978c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, hw_action, remove_size, 1); 979c349b413SYevgeny Kliteynik used_actions++; 980c349b413SYevgeny Kliteynik 981c349b413SYevgeny Kliteynik *used_hw_action_num = used_actions; 982c349b413SYevgeny Kliteynik 983c349b413SYevgeny Kliteynik return 0; 984c349b413SYevgeny Kliteynik } 985c349b413SYevgeny Kliteynik 98610b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_dst_bit_mask(struct mlx5dr_match_param *value, 98710b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 98810b69418SYevgeny Kliteynik { 98910b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 99010b69418SYevgeny Kliteynik 99110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 99210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 99310b69418SYevgeny Kliteynik 99410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, smac_47_16, mask, smac_47_16); 99510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, smac_15_0, mask, smac_15_0); 99610b69418SYevgeny Kliteynik 99710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_vlan_id, mask, first_vid); 99810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_cfi, mask, first_cfi); 99910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_priority, mask, first_prio); 100010b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_src_dst_v1, bit_mask, l3_type, mask, ip_version); 100110b69418SYevgeny Kliteynik 100210b69418SYevgeny Kliteynik if (mask->cvlan_tag) { 100310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, bit_mask, first_vlan_qualifier, -1); 100410b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 100510b69418SYevgeny Kliteynik } else if (mask->svlan_tag) { 100610b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, bit_mask, first_vlan_qualifier, -1); 100710b69418SYevgeny Kliteynik mask->svlan_tag = 0; 100810b69418SYevgeny Kliteynik } 100910b69418SYevgeny Kliteynik } 101010b69418SYevgeny Kliteynik 101110b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_dst_tag(struct mlx5dr_match_param *value, 101210b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 101310b69418SYevgeny Kliteynik u8 *tag) 101410b69418SYevgeny Kliteynik { 101510b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 101610b69418SYevgeny Kliteynik 101710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, dmac_47_16, spec, dmac_47_16); 101810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, dmac_15_0, spec, dmac_15_0); 101910b69418SYevgeny Kliteynik 102010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, smac_47_16, spec, smac_47_16); 102110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, smac_15_0, spec, smac_15_0); 102210b69418SYevgeny Kliteynik 102310b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 102410b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, l3_type, STE_IPV4); 102510b69418SYevgeny Kliteynik spec->ip_version = 0; 102610b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 102710b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, l3_type, STE_IPV6); 102810b69418SYevgeny Kliteynik spec->ip_version = 0; 102910b69418SYevgeny Kliteynik } else if (spec->ip_version) { 103010b69418SYevgeny Kliteynik return -EINVAL; 103110b69418SYevgeny Kliteynik } 103210b69418SYevgeny Kliteynik 103310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_vlan_id, spec, first_vid); 103410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_cfi, spec, first_cfi); 103510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_priority, spec, first_prio); 103610b69418SYevgeny Kliteynik 103710b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 103810b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 103910b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 104010b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 104110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 104210b69418SYevgeny Kliteynik spec->svlan_tag = 0; 104310b69418SYevgeny Kliteynik } 104410b69418SYevgeny Kliteynik return 0; 104510b69418SYevgeny Kliteynik } 104610b69418SYevgeny Kliteynik 10476862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l2_src_dst_init(struct mlx5dr_ste_build *sb, 104810b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 104910b69418SYevgeny Kliteynik { 105010b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_dst_bit_mask(mask, sb->inner, sb->bit_mask); 105110b69418SYevgeny Kliteynik 105210b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2_SRC_DST, sb->inner); 105310b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 105410b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_src_dst_tag; 105510b69418SYevgeny Kliteynik } 105610b69418SYevgeny Kliteynik 105710b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv6_dst_tag(struct mlx5dr_match_param *value, 105810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 105910b69418SYevgeny Kliteynik u8 *tag) 106010b69418SYevgeny Kliteynik { 106110b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 106210b69418SYevgeny Kliteynik 106310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_127_96, spec, dst_ip_127_96); 106410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_95_64, spec, dst_ip_95_64); 106510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_63_32, spec, dst_ip_63_32); 106610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_31_0, spec, dst_ip_31_0); 106710b69418SYevgeny Kliteynik 106810b69418SYevgeny Kliteynik return 0; 106910b69418SYevgeny Kliteynik } 107010b69418SYevgeny Kliteynik 10716862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l3_ipv6_dst_init(struct mlx5dr_ste_build *sb, 107210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 107310b69418SYevgeny Kliteynik { 107410b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv6_dst_tag(mask, sb, sb->bit_mask); 107510b69418SYevgeny Kliteynik 107610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(IPV6_DES, sb->inner); 107710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 107810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv6_dst_tag; 107910b69418SYevgeny Kliteynik } 108010b69418SYevgeny Kliteynik 108110b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv6_src_tag(struct mlx5dr_match_param *value, 108210b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 108310b69418SYevgeny Kliteynik u8 *tag) 108410b69418SYevgeny Kliteynik { 108510b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 108610b69418SYevgeny Kliteynik 108710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_127_96, spec, src_ip_127_96); 108810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_95_64, spec, src_ip_95_64); 108910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_63_32, spec, src_ip_63_32); 109010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_31_0, spec, src_ip_31_0); 109110b69418SYevgeny Kliteynik 109210b69418SYevgeny Kliteynik return 0; 109310b69418SYevgeny Kliteynik } 109410b69418SYevgeny Kliteynik 10956862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l3_ipv6_src_init(struct mlx5dr_ste_build *sb, 109610b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 109710b69418SYevgeny Kliteynik { 109810b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv6_src_tag(mask, sb, sb->bit_mask); 109910b69418SYevgeny Kliteynik 110010b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(IPV6_SRC, sb->inner); 110110b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 110210b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv6_src_tag; 110310b69418SYevgeny Kliteynik } 110410b69418SYevgeny Kliteynik 110510b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag(struct mlx5dr_match_param *value, 110610b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 110710b69418SYevgeny Kliteynik u8 *tag) 110810b69418SYevgeny Kliteynik { 110910b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 111010b69418SYevgeny Kliteynik 111110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_address, spec, dst_ip_31_0); 111210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_address, spec, src_ip_31_0); 111310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_port, spec, tcp_dport); 111410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_port, spec, udp_dport); 111510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_port, spec, tcp_sport); 111610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_port, spec, udp_sport); 111710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, protocol, spec, ip_protocol); 111810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, fragmented, spec, frag); 111910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, dscp, spec, ip_dscp); 112010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, ecn, spec, ip_ecn); 112110b69418SYevgeny Kliteynik 112210b69418SYevgeny Kliteynik if (spec->tcp_flags) { 112310b69418SYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l3_ipv4_5_tuple_v1, tag, spec); 112410b69418SYevgeny Kliteynik spec->tcp_flags = 0; 112510b69418SYevgeny Kliteynik } 112610b69418SYevgeny Kliteynik 112710b69418SYevgeny Kliteynik return 0; 112810b69418SYevgeny Kliteynik } 112910b69418SYevgeny Kliteynik 11306862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l3_ipv4_5_tuple_init(struct mlx5dr_ste_build *sb, 113110b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 113210b69418SYevgeny Kliteynik { 113310b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag(mask, sb, sb->bit_mask); 113410b69418SYevgeny Kliteynik 113510b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL3_IPV4_5_TUPLE, sb->inner); 113610b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 113710b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag; 113810b69418SYevgeny Kliteynik } 113910b69418SYevgeny Kliteynik 114010b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(struct mlx5dr_match_param *value, 114110b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 114210b69418SYevgeny Kliteynik { 114310b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 114410b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 114510b69418SYevgeny Kliteynik 114610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_vlan_id, mask, first_vid); 114710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_cfi, mask, first_cfi); 114810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_priority, mask, first_prio); 114911659ef8SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, ip_fragmented, mask, frag); 115011659ef8SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, l3_ethertype, mask, ethertype); 115110b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_src_v1, bit_mask, l3_type, mask, ip_version); 115210b69418SYevgeny Kliteynik 115310b69418SYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 115410b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, first_vlan_qualifier, -1); 115510b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 115610b69418SYevgeny Kliteynik mask->svlan_tag = 0; 115710b69418SYevgeny Kliteynik } 115810b69418SYevgeny Kliteynik 115910b69418SYevgeny Kliteynik if (inner) { 116010b69418SYevgeny Kliteynik if (misc_mask->inner_second_cvlan_tag || 116110b69418SYevgeny Kliteynik misc_mask->inner_second_svlan_tag) { 116210b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, second_vlan_qualifier, -1); 116310b69418SYevgeny Kliteynik misc_mask->inner_second_cvlan_tag = 0; 116410b69418SYevgeny Kliteynik misc_mask->inner_second_svlan_tag = 0; 116510b69418SYevgeny Kliteynik } 116610b69418SYevgeny Kliteynik 116710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 116810b69418SYevgeny Kliteynik second_vlan_id, misc_mask, inner_second_vid); 116910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 117010b69418SYevgeny Kliteynik second_cfi, misc_mask, inner_second_cfi); 117110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 117210b69418SYevgeny Kliteynik second_priority, misc_mask, inner_second_prio); 117310b69418SYevgeny Kliteynik } else { 117410b69418SYevgeny Kliteynik if (misc_mask->outer_second_cvlan_tag || 117510b69418SYevgeny Kliteynik misc_mask->outer_second_svlan_tag) { 117610b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, second_vlan_qualifier, -1); 117710b69418SYevgeny Kliteynik misc_mask->outer_second_cvlan_tag = 0; 117810b69418SYevgeny Kliteynik misc_mask->outer_second_svlan_tag = 0; 117910b69418SYevgeny Kliteynik } 118010b69418SYevgeny Kliteynik 118110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 118210b69418SYevgeny Kliteynik second_vlan_id, misc_mask, outer_second_vid); 118310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 118410b69418SYevgeny Kliteynik second_cfi, misc_mask, outer_second_cfi); 118510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 118610b69418SYevgeny Kliteynik second_priority, misc_mask, outer_second_prio); 118710b69418SYevgeny Kliteynik } 118810b69418SYevgeny Kliteynik } 118910b69418SYevgeny Kliteynik 119010b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_or_dst_tag(struct mlx5dr_match_param *value, 119110b69418SYevgeny Kliteynik bool inner, u8 *tag) 119210b69418SYevgeny Kliteynik { 119310b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = inner ? &value->inner : &value->outer; 119410b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_spec = &value->misc; 119510b69418SYevgeny Kliteynik 119610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_vlan_id, spec, first_vid); 119710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_cfi, spec, first_cfi); 119810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_priority, spec, first_prio); 119910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, ip_fragmented, spec, frag); 120010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, l3_ethertype, spec, ethertype); 120110b69418SYevgeny Kliteynik 120210b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 120310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, l3_type, STE_IPV4); 120410b69418SYevgeny Kliteynik spec->ip_version = 0; 120510b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 120610b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, l3_type, STE_IPV6); 120710b69418SYevgeny Kliteynik spec->ip_version = 0; 120810b69418SYevgeny Kliteynik } else if (spec->ip_version) { 120910b69418SYevgeny Kliteynik return -EINVAL; 121010b69418SYevgeny Kliteynik } 121110b69418SYevgeny Kliteynik 121210b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 121310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 121410b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 121510b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 121610b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 121710b69418SYevgeny Kliteynik spec->svlan_tag = 0; 121810b69418SYevgeny Kliteynik } 121910b69418SYevgeny Kliteynik 122010b69418SYevgeny Kliteynik if (inner) { 122110b69418SYevgeny Kliteynik if (misc_spec->inner_second_cvlan_tag) { 122210b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_CVLAN); 122310b69418SYevgeny Kliteynik misc_spec->inner_second_cvlan_tag = 0; 122410b69418SYevgeny Kliteynik } else if (misc_spec->inner_second_svlan_tag) { 122510b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_SVLAN); 122610b69418SYevgeny Kliteynik misc_spec->inner_second_svlan_tag = 0; 122710b69418SYevgeny Kliteynik } 122810b69418SYevgeny Kliteynik 122910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_vlan_id, misc_spec, inner_second_vid); 123010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_cfi, misc_spec, inner_second_cfi); 123110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_priority, misc_spec, inner_second_prio); 123210b69418SYevgeny Kliteynik } else { 123310b69418SYevgeny Kliteynik if (misc_spec->outer_second_cvlan_tag) { 123410b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_CVLAN); 123510b69418SYevgeny Kliteynik misc_spec->outer_second_cvlan_tag = 0; 123610b69418SYevgeny Kliteynik } else if (misc_spec->outer_second_svlan_tag) { 123710b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_SVLAN); 123810b69418SYevgeny Kliteynik misc_spec->outer_second_svlan_tag = 0; 123910b69418SYevgeny Kliteynik } 124010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_vlan_id, misc_spec, outer_second_vid); 124110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_cfi, misc_spec, outer_second_cfi); 124210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_priority, misc_spec, outer_second_prio); 124310b69418SYevgeny Kliteynik } 124410b69418SYevgeny Kliteynik 124510b69418SYevgeny Kliteynik return 0; 124610b69418SYevgeny Kliteynik } 124710b69418SYevgeny Kliteynik 124810b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_bit_mask(struct mlx5dr_match_param *value, 124910b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 125010b69418SYevgeny Kliteynik { 125110b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 125210b69418SYevgeny Kliteynik 125310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, smac_47_16, mask, smac_47_16); 125410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, smac_15_0, mask, smac_15_0); 125510b69418SYevgeny Kliteynik 125610b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 125710b69418SYevgeny Kliteynik } 125810b69418SYevgeny Kliteynik 125910b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_tag(struct mlx5dr_match_param *value, 126010b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 126110b69418SYevgeny Kliteynik u8 *tag) 126210b69418SYevgeny Kliteynik { 126310b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 126410b69418SYevgeny Kliteynik 126510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, smac_47_16, spec, smac_47_16); 126610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, smac_15_0, spec, smac_15_0); 126710b69418SYevgeny Kliteynik 126810b69418SYevgeny Kliteynik return dr_ste_v1_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 126910b69418SYevgeny Kliteynik } 127010b69418SYevgeny Kliteynik 12716862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l2_src_init(struct mlx5dr_ste_build *sb, 127210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 127310b69418SYevgeny Kliteynik { 127410b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_bit_mask(mask, sb->inner, sb->bit_mask); 127510b69418SYevgeny Kliteynik 127610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2_SRC, sb->inner); 127710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 127810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_src_tag; 127910b69418SYevgeny Kliteynik } 128010b69418SYevgeny Kliteynik 128110b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_dst_bit_mask(struct mlx5dr_match_param *value, 128210b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 128310b69418SYevgeny Kliteynik { 128410b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 128510b69418SYevgeny Kliteynik 128610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 128710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 128810b69418SYevgeny Kliteynik 128910b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 129010b69418SYevgeny Kliteynik } 129110b69418SYevgeny Kliteynik 129210b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_dst_tag(struct mlx5dr_match_param *value, 129310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 129410b69418SYevgeny Kliteynik u8 *tag) 129510b69418SYevgeny Kliteynik { 129610b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 129710b69418SYevgeny Kliteynik 129810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, tag, dmac_47_16, spec, dmac_47_16); 129910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, tag, dmac_15_0, spec, dmac_15_0); 130010b69418SYevgeny Kliteynik 130110b69418SYevgeny Kliteynik return dr_ste_v1_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 130210b69418SYevgeny Kliteynik } 130310b69418SYevgeny Kliteynik 13046862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l2_dst_init(struct mlx5dr_ste_build *sb, 130510b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 130610b69418SYevgeny Kliteynik { 130710b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_dst_bit_mask(mask, sb->inner, sb->bit_mask); 130810b69418SYevgeny Kliteynik 130910b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2, sb->inner); 131010b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 131110b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_dst_tag; 131210b69418SYevgeny Kliteynik } 131310b69418SYevgeny Kliteynik 131410b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_tnl_bit_mask(struct mlx5dr_match_param *value, 131510b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 131610b69418SYevgeny Kliteynik { 131710b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 131810b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 131910b69418SYevgeny Kliteynik 132010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 132110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 132210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_vlan_id, mask, first_vid); 132310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_cfi, mask, first_cfi); 132410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_priority, mask, first_prio); 132510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, ip_fragmented, mask, frag); 132610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, l3_ethertype, mask, ethertype); 132710b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_tnl_v1, bit_mask, l3_type, mask, ip_version); 132810b69418SYevgeny Kliteynik 132910b69418SYevgeny Kliteynik if (misc->vxlan_vni) { 133010b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, bit_mask, 133110b69418SYevgeny Kliteynik l2_tunneling_network_id, (misc->vxlan_vni << 8)); 133210b69418SYevgeny Kliteynik misc->vxlan_vni = 0; 133310b69418SYevgeny Kliteynik } 133410b69418SYevgeny Kliteynik 133510b69418SYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 133610b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, bit_mask, first_vlan_qualifier, -1); 133710b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 133810b69418SYevgeny Kliteynik mask->svlan_tag = 0; 133910b69418SYevgeny Kliteynik } 134010b69418SYevgeny Kliteynik } 134110b69418SYevgeny Kliteynik 134210b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_tnl_tag(struct mlx5dr_match_param *value, 134310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 134410b69418SYevgeny Kliteynik u8 *tag) 134510b69418SYevgeny Kliteynik { 134610b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 134710b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 134810b69418SYevgeny Kliteynik 134910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, dmac_47_16, spec, dmac_47_16); 135010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, dmac_15_0, spec, dmac_15_0); 135110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_vlan_id, spec, first_vid); 135210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_cfi, spec, first_cfi); 135310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, ip_fragmented, spec, frag); 135410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_priority, spec, first_prio); 135510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, l3_ethertype, spec, ethertype); 135610b69418SYevgeny Kliteynik 135710b69418SYevgeny Kliteynik if (misc->vxlan_vni) { 135810b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l2_tunneling_network_id, 135910b69418SYevgeny Kliteynik (misc->vxlan_vni << 8)); 136010b69418SYevgeny Kliteynik misc->vxlan_vni = 0; 136110b69418SYevgeny Kliteynik } 136210b69418SYevgeny Kliteynik 136310b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 136410b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 136510b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 136610b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 136710b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 136810b69418SYevgeny Kliteynik spec->svlan_tag = 0; 136910b69418SYevgeny Kliteynik } 137010b69418SYevgeny Kliteynik 137110b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 137210b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l3_type, STE_IPV4); 137310b69418SYevgeny Kliteynik spec->ip_version = 0; 137410b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 137510b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l3_type, STE_IPV6); 137610b69418SYevgeny Kliteynik spec->ip_version = 0; 137710b69418SYevgeny Kliteynik } else if (spec->ip_version) { 137810b69418SYevgeny Kliteynik return -EINVAL; 137910b69418SYevgeny Kliteynik } 138010b69418SYevgeny Kliteynik 138110b69418SYevgeny Kliteynik return 0; 138210b69418SYevgeny Kliteynik } 138310b69418SYevgeny Kliteynik 13846862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l2_tnl_init(struct mlx5dr_ste_build *sb, 138510b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 138610b69418SYevgeny Kliteynik { 138710b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_tnl_bit_mask(mask, sb->inner, sb->bit_mask); 138810b69418SYevgeny Kliteynik 138910b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL2_TNL; 139010b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 139110b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_tnl_tag; 139210b69418SYevgeny Kliteynik } 139310b69418SYevgeny Kliteynik 139410b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv4_misc_tag(struct mlx5dr_match_param *value, 139510b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 139610b69418SYevgeny Kliteynik u8 *tag) 139710b69418SYevgeny Kliteynik { 139810b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 139910b69418SYevgeny Kliteynik 140010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_misc_v1, tag, time_to_live, spec, ttl_hoplimit); 14015c422bfaSYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_misc_v1, tag, ihl, spec, ipv4_ihl); 140210b69418SYevgeny Kliteynik 140310b69418SYevgeny Kliteynik return 0; 140410b69418SYevgeny Kliteynik } 140510b69418SYevgeny Kliteynik 14066862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l3_ipv4_misc_init(struct mlx5dr_ste_build *sb, 140710b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 140810b69418SYevgeny Kliteynik { 140910b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv4_misc_tag(mask, sb, sb->bit_mask); 141010b69418SYevgeny Kliteynik 141110b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL3_IPV4_MISC, sb->inner); 141210b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 141310b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv4_misc_tag; 141410b69418SYevgeny Kliteynik } 141510b69418SYevgeny Kliteynik 141610b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_ipv6_l3_l4_tag(struct mlx5dr_match_param *value, 141710b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 141810b69418SYevgeny Kliteynik u8 *tag) 141910b69418SYevgeny Kliteynik { 142010b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 142110b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 142210b69418SYevgeny Kliteynik 142310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dst_port, spec, tcp_dport); 142410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, src_port, spec, tcp_sport); 142510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dst_port, spec, udp_dport); 142610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, src_port, spec, udp_sport); 142710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, protocol, spec, ip_protocol); 142810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, fragmented, spec, frag); 142910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dscp, spec, ip_dscp); 143010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, ecn, spec, ip_ecn); 143110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, ipv6_hop_limit, spec, ttl_hoplimit); 143210b69418SYevgeny Kliteynik 143310b69418SYevgeny Kliteynik if (sb->inner) 143410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, flow_label, misc, inner_ipv6_flow_label); 143510b69418SYevgeny Kliteynik else 143610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, flow_label, misc, outer_ipv6_flow_label); 143710b69418SYevgeny Kliteynik 143810b69418SYevgeny Kliteynik if (spec->tcp_flags) { 143910b69418SYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l4_v1, tag, spec); 144010b69418SYevgeny Kliteynik spec->tcp_flags = 0; 144110b69418SYevgeny Kliteynik } 144210b69418SYevgeny Kliteynik 144310b69418SYevgeny Kliteynik return 0; 144410b69418SYevgeny Kliteynik } 144510b69418SYevgeny Kliteynik 14466862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_ipv6_l3_l4_init(struct mlx5dr_ste_build *sb, 144710b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 144810b69418SYevgeny Kliteynik { 144910b69418SYevgeny Kliteynik dr_ste_v1_build_eth_ipv6_l3_l4_tag(mask, sb, sb->bit_mask); 145010b69418SYevgeny Kliteynik 145110b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL4, sb->inner); 145210b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 145310b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_ipv6_l3_l4_tag; 145410b69418SYevgeny Kliteynik } 145510b69418SYevgeny Kliteynik 145610b69418SYevgeny Kliteynik static int dr_ste_v1_build_mpls_tag(struct mlx5dr_match_param *value, 145710b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 145810b69418SYevgeny Kliteynik u8 *tag) 145910b69418SYevgeny Kliteynik { 146010b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 146110b69418SYevgeny Kliteynik 146210b69418SYevgeny Kliteynik if (sb->inner) 146310b69418SYevgeny Kliteynik DR_STE_SET_MPLS(mpls_v1, misc2, inner, tag); 146410b69418SYevgeny Kliteynik else 146510b69418SYevgeny Kliteynik DR_STE_SET_MPLS(mpls_v1, misc2, outer, tag); 146610b69418SYevgeny Kliteynik 146710b69418SYevgeny Kliteynik return 0; 146810b69418SYevgeny Kliteynik } 146910b69418SYevgeny Kliteynik 14706862c787SYevgeny Kliteynik void dr_ste_v1_build_mpls_init(struct mlx5dr_ste_build *sb, 147110b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 147210b69418SYevgeny Kliteynik { 147310b69418SYevgeny Kliteynik dr_ste_v1_build_mpls_tag(mask, sb, sb->bit_mask); 147410b69418SYevgeny Kliteynik 147510b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(MPLS, sb->inner); 147610b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 147710b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_mpls_tag; 147810b69418SYevgeny Kliteynik } 147910b69418SYevgeny Kliteynik 148010b69418SYevgeny Kliteynik static int dr_ste_v1_build_tnl_gre_tag(struct mlx5dr_match_param *value, 148110b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 148210b69418SYevgeny Kliteynik u8 *tag) 148310b69418SYevgeny Kliteynik { 148410b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 148510b69418SYevgeny Kliteynik 148610b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_protocol, misc, gre_protocol); 148710b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_k_present, misc, gre_k_present); 148810b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_key_h, misc, gre_key_h); 148910b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_key_l, misc, gre_key_l); 149010b69418SYevgeny Kliteynik 149110b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_c_present, misc, gre_c_present); 149210b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_s_present, misc, gre_s_present); 149310b69418SYevgeny Kliteynik 149410b69418SYevgeny Kliteynik return 0; 149510b69418SYevgeny Kliteynik } 149610b69418SYevgeny Kliteynik 14976862c787SYevgeny Kliteynik void dr_ste_v1_build_tnl_gre_init(struct mlx5dr_ste_build *sb, 149810b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 149910b69418SYevgeny Kliteynik { 150010b69418SYevgeny Kliteynik dr_ste_v1_build_tnl_gre_tag(mask, sb, sb->bit_mask); 150110b69418SYevgeny Kliteynik 150210b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_GRE; 150310b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 150410b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_gre_tag; 150510b69418SYevgeny Kliteynik } 150610b69418SYevgeny Kliteynik 150710b69418SYevgeny Kliteynik static int dr_ste_v1_build_tnl_mpls_tag(struct mlx5dr_match_param *value, 150810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 150910b69418SYevgeny Kliteynik u8 *tag) 151010b69418SYevgeny Kliteynik { 151110b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 151210b69418SYevgeny Kliteynik 151310b69418SYevgeny Kliteynik if (DR_STE_IS_OUTER_MPLS_OVER_GRE_SET(misc2)) { 151410b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_label, 151510b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_label); 151610b69418SYevgeny Kliteynik 151710b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_exp, 151810b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_exp); 151910b69418SYevgeny Kliteynik 152010b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_s_bos, 152110b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_s_bos); 152210b69418SYevgeny Kliteynik 152310b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_ttl, 152410b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_ttl); 152510b69418SYevgeny Kliteynik } else { 152610b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_label, 152710b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_label); 152810b69418SYevgeny Kliteynik 152910b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_exp, 153010b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_exp); 153110b69418SYevgeny Kliteynik 153210b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_s_bos, 153310b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_s_bos); 153410b69418SYevgeny Kliteynik 153510b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_ttl, 153610b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_ttl); 153710b69418SYevgeny Kliteynik } 153810b69418SYevgeny Kliteynik 153910b69418SYevgeny Kliteynik return 0; 154010b69418SYevgeny Kliteynik } 154110b69418SYevgeny Kliteynik 15426862c787SYevgeny Kliteynik void dr_ste_v1_build_tnl_mpls_init(struct mlx5dr_ste_build *sb, 154310b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 154410b69418SYevgeny Kliteynik { 154510b69418SYevgeny Kliteynik dr_ste_v1_build_tnl_mpls_tag(mask, sb, sb->bit_mask); 154610b69418SYevgeny Kliteynik 154710b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_MPLS_I; 154810b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 154910b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_mpls_tag; 155010b69418SYevgeny Kliteynik } 155110b69418SYevgeny Kliteynik 155235ba005dSYevgeny Kliteynik static int dr_ste_v1_build_tnl_mpls_over_udp_tag(struct mlx5dr_match_param *value, 155335ba005dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 155435ba005dSYevgeny Kliteynik u8 *tag) 155535ba005dSYevgeny Kliteynik { 155635ba005dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 155735ba005dSYevgeny Kliteynik u8 *parser_ptr; 155835ba005dSYevgeny Kliteynik u8 parser_id; 155935ba005dSYevgeny Kliteynik u32 mpls_hdr; 156035ba005dSYevgeny Kliteynik 156135ba005dSYevgeny Kliteynik mpls_hdr = misc2->outer_first_mpls_over_udp_label << HDR_MPLS_OFFSET_LABEL; 156235ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_udp_label = 0; 156335ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_udp_exp << HDR_MPLS_OFFSET_EXP; 156435ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_udp_exp = 0; 156535ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_udp_s_bos << HDR_MPLS_OFFSET_S_BOS; 156635ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_udp_s_bos = 0; 156735ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_udp_ttl << HDR_MPLS_OFFSET_TTL; 156835ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_udp_ttl = 0; 156935ba005dSYevgeny Kliteynik 157035ba005dSYevgeny Kliteynik parser_id = sb->caps->flex_parser_id_mpls_over_udp; 157135ba005dSYevgeny Kliteynik parser_ptr = dr_ste_calc_flex_parser_offset(tag, parser_id); 157235ba005dSYevgeny Kliteynik *(__be32 *)parser_ptr = cpu_to_be32(mpls_hdr); 157335ba005dSYevgeny Kliteynik 157435ba005dSYevgeny Kliteynik return 0; 157535ba005dSYevgeny Kliteynik } 157635ba005dSYevgeny Kliteynik 15776862c787SYevgeny Kliteynik void dr_ste_v1_build_tnl_mpls_over_udp_init(struct mlx5dr_ste_build *sb, 157835ba005dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 157935ba005dSYevgeny Kliteynik { 158035ba005dSYevgeny Kliteynik dr_ste_v1_build_tnl_mpls_over_udp_tag(mask, sb, sb->bit_mask); 158135ba005dSYevgeny Kliteynik 158235ba005dSYevgeny Kliteynik /* STEs with lookup type FLEX_PARSER_{0/1} includes 158335ba005dSYevgeny Kliteynik * flex parsers_{0-3}/{4-7} respectively. 158435ba005dSYevgeny Kliteynik */ 158535ba005dSYevgeny Kliteynik sb->lu_type = sb->caps->flex_parser_id_mpls_over_udp > DR_STE_MAX_FLEX_0_ID ? 158635ba005dSYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 : 158735ba005dSYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 158835ba005dSYevgeny Kliteynik 158935ba005dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 159035ba005dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_mpls_over_udp_tag; 159135ba005dSYevgeny Kliteynik } 159235ba005dSYevgeny Kliteynik 159335ba005dSYevgeny Kliteynik static int dr_ste_v1_build_tnl_mpls_over_gre_tag(struct mlx5dr_match_param *value, 159435ba005dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 159535ba005dSYevgeny Kliteynik u8 *tag) 159635ba005dSYevgeny Kliteynik { 159735ba005dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 159835ba005dSYevgeny Kliteynik u8 *parser_ptr; 159935ba005dSYevgeny Kliteynik u8 parser_id; 160035ba005dSYevgeny Kliteynik u32 mpls_hdr; 160135ba005dSYevgeny Kliteynik 160235ba005dSYevgeny Kliteynik mpls_hdr = misc2->outer_first_mpls_over_gre_label << HDR_MPLS_OFFSET_LABEL; 160335ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_gre_label = 0; 160435ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_gre_exp << HDR_MPLS_OFFSET_EXP; 160535ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_gre_exp = 0; 160635ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_gre_s_bos << HDR_MPLS_OFFSET_S_BOS; 160735ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_gre_s_bos = 0; 160835ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_gre_ttl << HDR_MPLS_OFFSET_TTL; 160935ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_gre_ttl = 0; 161035ba005dSYevgeny Kliteynik 161135ba005dSYevgeny Kliteynik parser_id = sb->caps->flex_parser_id_mpls_over_gre; 161235ba005dSYevgeny Kliteynik parser_ptr = dr_ste_calc_flex_parser_offset(tag, parser_id); 161335ba005dSYevgeny Kliteynik *(__be32 *)parser_ptr = cpu_to_be32(mpls_hdr); 161435ba005dSYevgeny Kliteynik 161535ba005dSYevgeny Kliteynik return 0; 161635ba005dSYevgeny Kliteynik } 161735ba005dSYevgeny Kliteynik 16186862c787SYevgeny Kliteynik void dr_ste_v1_build_tnl_mpls_over_gre_init(struct mlx5dr_ste_build *sb, 161935ba005dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 162035ba005dSYevgeny Kliteynik { 162135ba005dSYevgeny Kliteynik dr_ste_v1_build_tnl_mpls_over_gre_tag(mask, sb, sb->bit_mask); 162235ba005dSYevgeny Kliteynik 162335ba005dSYevgeny Kliteynik /* STEs with lookup type FLEX_PARSER_{0/1} includes 162435ba005dSYevgeny Kliteynik * flex parsers_{0-3}/{4-7} respectively. 162535ba005dSYevgeny Kliteynik */ 162635ba005dSYevgeny Kliteynik sb->lu_type = sb->caps->flex_parser_id_mpls_over_gre > DR_STE_MAX_FLEX_0_ID ? 162735ba005dSYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 : 162835ba005dSYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 162935ba005dSYevgeny Kliteynik 163035ba005dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 163135ba005dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_mpls_over_gre_tag; 163235ba005dSYevgeny Kliteynik } 163335ba005dSYevgeny Kliteynik 163410b69418SYevgeny Kliteynik static int dr_ste_v1_build_icmp_tag(struct mlx5dr_match_param *value, 163510b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 163610b69418SYevgeny Kliteynik u8 *tag) 163710b69418SYevgeny Kliteynik { 163810b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 163910b69418SYevgeny Kliteynik bool is_ipv4 = DR_MASK_IS_ICMPV4_SET(misc3); 164010b69418SYevgeny Kliteynik u32 *icmp_header_data; 164110b69418SYevgeny Kliteynik u8 *icmp_type; 164210b69418SYevgeny Kliteynik u8 *icmp_code; 164310b69418SYevgeny Kliteynik 164410b69418SYevgeny Kliteynik if (is_ipv4) { 164510b69418SYevgeny Kliteynik icmp_header_data = &misc3->icmpv4_header_data; 164610b69418SYevgeny Kliteynik icmp_type = &misc3->icmpv4_type; 164710b69418SYevgeny Kliteynik icmp_code = &misc3->icmpv4_code; 164810b69418SYevgeny Kliteynik } else { 164910b69418SYevgeny Kliteynik icmp_header_data = &misc3->icmpv6_header_data; 165010b69418SYevgeny Kliteynik icmp_type = &misc3->icmpv6_type; 165110b69418SYevgeny Kliteynik icmp_code = &misc3->icmpv6_code; 165210b69418SYevgeny Kliteynik } 165310b69418SYevgeny Kliteynik 165410b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_header_data, *icmp_header_data); 165510b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_type, *icmp_type); 165610b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_code, *icmp_code); 165710b69418SYevgeny Kliteynik 165810b69418SYevgeny Kliteynik *icmp_header_data = 0; 165910b69418SYevgeny Kliteynik *icmp_type = 0; 166010b69418SYevgeny Kliteynik *icmp_code = 0; 166110b69418SYevgeny Kliteynik 166210b69418SYevgeny Kliteynik return 0; 166310b69418SYevgeny Kliteynik } 166410b69418SYevgeny Kliteynik 16656862c787SYevgeny Kliteynik void dr_ste_v1_build_icmp_init(struct mlx5dr_ste_build *sb, 166610b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 166710b69418SYevgeny Kliteynik { 166810b69418SYevgeny Kliteynik dr_ste_v1_build_icmp_tag(mask, sb, sb->bit_mask); 166910b69418SYevgeny Kliteynik 167010b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL4_MISC_O; 167110b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 167210b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_icmp_tag; 167310b69418SYevgeny Kliteynik } 167410b69418SYevgeny Kliteynik 167510b69418SYevgeny Kliteynik static int dr_ste_v1_build_general_purpose_tag(struct mlx5dr_match_param *value, 167610b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 167710b69418SYevgeny Kliteynik u8 *tag) 167810b69418SYevgeny Kliteynik { 167910b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 168010b69418SYevgeny Kliteynik 168110b69418SYevgeny Kliteynik DR_STE_SET_TAG(general_purpose, tag, general_purpose_lookup_field, 168210b69418SYevgeny Kliteynik misc2, metadata_reg_a); 168310b69418SYevgeny Kliteynik 168410b69418SYevgeny Kliteynik return 0; 168510b69418SYevgeny Kliteynik } 168610b69418SYevgeny Kliteynik 16876862c787SYevgeny Kliteynik void dr_ste_v1_build_general_purpose_init(struct mlx5dr_ste_build *sb, 168810b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 168910b69418SYevgeny Kliteynik { 169010b69418SYevgeny Kliteynik dr_ste_v1_build_general_purpose_tag(mask, sb, sb->bit_mask); 169110b69418SYevgeny Kliteynik 169210b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_GENERAL_PURPOSE; 169310b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 169410b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_general_purpose_tag; 169510b69418SYevgeny Kliteynik } 169610b69418SYevgeny Kliteynik 169710b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l4_misc_tag(struct mlx5dr_match_param *value, 169810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 169910b69418SYevgeny Kliteynik u8 *tag) 170010b69418SYevgeny Kliteynik { 170110b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 170210b69418SYevgeny Kliteynik 170310b69418SYevgeny Kliteynik if (sb->inner) { 170410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, seq_num, misc3, inner_tcp_seq_num); 170510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, ack_num, misc3, inner_tcp_ack_num); 170610b69418SYevgeny Kliteynik } else { 170710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, seq_num, misc3, outer_tcp_seq_num); 170810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, ack_num, misc3, outer_tcp_ack_num); 170910b69418SYevgeny Kliteynik } 171010b69418SYevgeny Kliteynik 171110b69418SYevgeny Kliteynik return 0; 171210b69418SYevgeny Kliteynik } 171310b69418SYevgeny Kliteynik 17146862c787SYevgeny Kliteynik void dr_ste_v1_build_eth_l4_misc_init(struct mlx5dr_ste_build *sb, 171510b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 171610b69418SYevgeny Kliteynik { 171710b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l4_misc_tag(mask, sb, sb->bit_mask); 171810b69418SYevgeny Kliteynik 171910b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL4_MISC_O; 172010b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 172110b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l4_misc_tag; 172210b69418SYevgeny Kliteynik } 172310b69418SYevgeny Kliteynik 172410b69418SYevgeny Kliteynik static int 172510b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag(struct mlx5dr_match_param *value, 172610b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 172710b69418SYevgeny Kliteynik u8 *tag) 172810b69418SYevgeny Kliteynik { 172910b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 173010b69418SYevgeny Kliteynik 173110b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 173210b69418SYevgeny Kliteynik outer_vxlan_gpe_flags, misc3, 173310b69418SYevgeny Kliteynik outer_vxlan_gpe_flags); 173410b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 173510b69418SYevgeny Kliteynik outer_vxlan_gpe_next_protocol, misc3, 173610b69418SYevgeny Kliteynik outer_vxlan_gpe_next_protocol); 173710b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 173810b69418SYevgeny Kliteynik outer_vxlan_gpe_vni, misc3, 173910b69418SYevgeny Kliteynik outer_vxlan_gpe_vni); 174010b69418SYevgeny Kliteynik 174110b69418SYevgeny Kliteynik return 0; 174210b69418SYevgeny Kliteynik } 174310b69418SYevgeny Kliteynik 17446862c787SYevgeny Kliteynik void dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_init(struct mlx5dr_ste_build *sb, 174510b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 174610b69418SYevgeny Kliteynik { 174710b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag(mask, sb, sb->bit_mask); 174810b69418SYevgeny Kliteynik 174910b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 175010b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 175110b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag; 175210b69418SYevgeny Kliteynik } 175310b69418SYevgeny Kliteynik 175410b69418SYevgeny Kliteynik static int 175510b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tag(struct mlx5dr_match_param *value, 175610b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 175710b69418SYevgeny Kliteynik u8 *tag) 175810b69418SYevgeny Kliteynik { 175910b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 176010b69418SYevgeny Kliteynik 176110b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 176210b69418SYevgeny Kliteynik geneve_protocol_type, misc, geneve_protocol_type); 176310b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 176410b69418SYevgeny Kliteynik geneve_oam, misc, geneve_oam); 176510b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 176610b69418SYevgeny Kliteynik geneve_opt_len, misc, geneve_opt_len); 176710b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 176810b69418SYevgeny Kliteynik geneve_vni, misc, geneve_vni); 176910b69418SYevgeny Kliteynik 177010b69418SYevgeny Kliteynik return 0; 177110b69418SYevgeny Kliteynik } 177210b69418SYevgeny Kliteynik 17736862c787SYevgeny Kliteynik void dr_ste_v1_build_flex_parser_tnl_geneve_init(struct mlx5dr_ste_build *sb, 177410b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 177510b69418SYevgeny Kliteynik { 177610b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tag(mask, sb, sb->bit_mask); 177710b69418SYevgeny Kliteynik 177810b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 177910b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 178010b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_geneve_tag; 178110b69418SYevgeny Kliteynik } 178210b69418SYevgeny Kliteynik 178309753babSMuhammad Sammar static int dr_ste_v1_build_tnl_header_0_1_tag(struct mlx5dr_match_param *value, 178409753babSMuhammad Sammar struct mlx5dr_ste_build *sb, 178509753babSMuhammad Sammar uint8_t *tag) 178609753babSMuhammad Sammar { 178709753babSMuhammad Sammar struct mlx5dr_match_misc5 *misc5 = &value->misc5; 178809753babSMuhammad Sammar 178909753babSMuhammad Sammar DR_STE_SET_TAG(tunnel_header, tag, tunnel_header_0, misc5, tunnel_header_0); 179009753babSMuhammad Sammar DR_STE_SET_TAG(tunnel_header, tag, tunnel_header_1, misc5, tunnel_header_1); 179109753babSMuhammad Sammar 179209753babSMuhammad Sammar return 0; 179309753babSMuhammad Sammar } 179409753babSMuhammad Sammar 17956862c787SYevgeny Kliteynik void dr_ste_v1_build_tnl_header_0_1_init(struct mlx5dr_ste_build *sb, 179609753babSMuhammad Sammar struct mlx5dr_match_param *mask) 179709753babSMuhammad Sammar { 179809753babSMuhammad Sammar sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 179909753babSMuhammad Sammar dr_ste_v1_build_tnl_header_0_1_tag(mask, sb, sb->bit_mask); 180009753babSMuhammad Sammar sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 180109753babSMuhammad Sammar sb->ste_build_tag_func = &dr_ste_v1_build_tnl_header_0_1_tag; 180209753babSMuhammad Sammar } 180309753babSMuhammad Sammar 180410b69418SYevgeny Kliteynik static int dr_ste_v1_build_register_0_tag(struct mlx5dr_match_param *value, 180510b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 180610b69418SYevgeny Kliteynik u8 *tag) 180710b69418SYevgeny Kliteynik { 180810b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 180910b69418SYevgeny Kliteynik 181010b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_h, misc2, metadata_reg_c_0); 181110b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_l, misc2, metadata_reg_c_1); 181210b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_h, misc2, metadata_reg_c_2); 181310b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_l, misc2, metadata_reg_c_3); 181410b69418SYevgeny Kliteynik 181510b69418SYevgeny Kliteynik return 0; 181610b69418SYevgeny Kliteynik } 181710b69418SYevgeny Kliteynik 18186862c787SYevgeny Kliteynik void dr_ste_v1_build_register_0_init(struct mlx5dr_ste_build *sb, 181910b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 182010b69418SYevgeny Kliteynik { 182110b69418SYevgeny Kliteynik dr_ste_v1_build_register_0_tag(mask, sb, sb->bit_mask); 182210b69418SYevgeny Kliteynik 182310b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_STEERING_REGISTERS_0; 182410b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 182510b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_register_0_tag; 182610b69418SYevgeny Kliteynik } 182710b69418SYevgeny Kliteynik 182810b69418SYevgeny Kliteynik static int dr_ste_v1_build_register_1_tag(struct mlx5dr_match_param *value, 182910b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 183010b69418SYevgeny Kliteynik u8 *tag) 183110b69418SYevgeny Kliteynik { 183210b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 183310b69418SYevgeny Kliteynik 183410b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_h, misc2, metadata_reg_c_4); 183510b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_l, misc2, metadata_reg_c_5); 183610b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_h, misc2, metadata_reg_c_6); 183710b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_l, misc2, metadata_reg_c_7); 183810b69418SYevgeny Kliteynik 183910b69418SYevgeny Kliteynik return 0; 184010b69418SYevgeny Kliteynik } 184110b69418SYevgeny Kliteynik 18426862c787SYevgeny Kliteynik void dr_ste_v1_build_register_1_init(struct mlx5dr_ste_build *sb, 184310b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 184410b69418SYevgeny Kliteynik { 184510b69418SYevgeny Kliteynik dr_ste_v1_build_register_1_tag(mask, sb, sb->bit_mask); 184610b69418SYevgeny Kliteynik 184710b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_STEERING_REGISTERS_1; 184810b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 184910b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_register_1_tag; 185010b69418SYevgeny Kliteynik } 185110b69418SYevgeny Kliteynik 185210b69418SYevgeny Kliteynik static void dr_ste_v1_build_src_gvmi_qpn_bit_mask(struct mlx5dr_match_param *value, 185310b69418SYevgeny Kliteynik u8 *bit_mask) 185410b69418SYevgeny Kliteynik { 185510b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 185610b69418SYevgeny Kliteynik 185710b69418SYevgeny Kliteynik DR_STE_SET_ONES(src_gvmi_qp_v1, bit_mask, source_gvmi, misc_mask, source_port); 185810b69418SYevgeny Kliteynik DR_STE_SET_ONES(src_gvmi_qp_v1, bit_mask, source_qp, misc_mask, source_sqn); 1859cc82a2e6SYevgeny Kliteynik misc_mask->source_eswitch_owner_vhca_id = 0; 186010b69418SYevgeny Kliteynik } 186110b69418SYevgeny Kliteynik 186210b69418SYevgeny Kliteynik static int dr_ste_v1_build_src_gvmi_qpn_tag(struct mlx5dr_match_param *value, 186310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 186410b69418SYevgeny Kliteynik u8 *tag) 186510b69418SYevgeny Kliteynik { 186610b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 186710b69418SYevgeny Kliteynik struct mlx5dr_cmd_vport_cap *vport_cap; 186810b69418SYevgeny Kliteynik struct mlx5dr_domain *dmn = sb->dmn; 186911a45defSYevgeny Kliteynik struct mlx5dr_domain *vport_dmn; 187010b69418SYevgeny Kliteynik u8 *bit_mask = sb->bit_mask; 187110b69418SYevgeny Kliteynik 187210b69418SYevgeny Kliteynik DR_STE_SET_TAG(src_gvmi_qp_v1, tag, source_qp, misc, source_sqn); 187310b69418SYevgeny Kliteynik 187410b69418SYevgeny Kliteynik if (sb->vhca_id_valid) { 187510b69418SYevgeny Kliteynik /* Find port GVMI based on the eswitch_owner_vhca_id */ 187610b69418SYevgeny Kliteynik if (misc->source_eswitch_owner_vhca_id == dmn->info.caps.gvmi) 187711a45defSYevgeny Kliteynik vport_dmn = dmn; 187810b69418SYevgeny Kliteynik else if (dmn->peer_dmn && (misc->source_eswitch_owner_vhca_id == 187910b69418SYevgeny Kliteynik dmn->peer_dmn->info.caps.gvmi)) 188011a45defSYevgeny Kliteynik vport_dmn = dmn->peer_dmn; 188110b69418SYevgeny Kliteynik else 188210b69418SYevgeny Kliteynik return -EINVAL; 188310b69418SYevgeny Kliteynik 188410b69418SYevgeny Kliteynik misc->source_eswitch_owner_vhca_id = 0; 188510b69418SYevgeny Kliteynik } else { 188611a45defSYevgeny Kliteynik vport_dmn = dmn; 188710b69418SYevgeny Kliteynik } 188810b69418SYevgeny Kliteynik 188910b69418SYevgeny Kliteynik if (!MLX5_GET(ste_src_gvmi_qp_v1, bit_mask, source_gvmi)) 189010b69418SYevgeny Kliteynik return 0; 189110b69418SYevgeny Kliteynik 189211a45defSYevgeny Kliteynik vport_cap = mlx5dr_domain_get_vport_cap(vport_dmn, misc->source_port); 189310b69418SYevgeny Kliteynik if (!vport_cap) { 189410b69418SYevgeny Kliteynik mlx5dr_err(dmn, "Vport 0x%x is disabled or invalid\n", 189510b69418SYevgeny Kliteynik misc->source_port); 189610b69418SYevgeny Kliteynik return -EINVAL; 189710b69418SYevgeny Kliteynik } 189810b69418SYevgeny Kliteynik 189910b69418SYevgeny Kliteynik if (vport_cap->vport_gvmi) 190010b69418SYevgeny Kliteynik MLX5_SET(ste_src_gvmi_qp_v1, tag, source_gvmi, vport_cap->vport_gvmi); 190110b69418SYevgeny Kliteynik 190210b69418SYevgeny Kliteynik misc->source_port = 0; 190310b69418SYevgeny Kliteynik return 0; 190410b69418SYevgeny Kliteynik } 190510b69418SYevgeny Kliteynik 19066862c787SYevgeny Kliteynik void dr_ste_v1_build_src_gvmi_qpn_init(struct mlx5dr_ste_build *sb, 190710b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 190810b69418SYevgeny Kliteynik { 190910b69418SYevgeny Kliteynik dr_ste_v1_build_src_gvmi_qpn_bit_mask(mask, sb->bit_mask); 191010b69418SYevgeny Kliteynik 191110b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_SRC_QP_GVMI; 191210b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 191310b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_src_gvmi_qpn_tag; 191410b69418SYevgeny Kliteynik } 191510b69418SYevgeny Kliteynik 1916160e9cb3SYevgeny Kliteynik static void dr_ste_v1_set_flex_parser(u32 *misc4_field_id, 1917160e9cb3SYevgeny Kliteynik u32 *misc4_field_value, 1918160e9cb3SYevgeny Kliteynik bool *parser_is_used, 1919160e9cb3SYevgeny Kliteynik u8 *tag) 1920160e9cb3SYevgeny Kliteynik { 1921160e9cb3SYevgeny Kliteynik u32 id = *misc4_field_id; 1922160e9cb3SYevgeny Kliteynik u8 *parser_ptr; 1923160e9cb3SYevgeny Kliteynik 192489cdba32SYevgeny Kliteynik if (id >= DR_NUM_OF_FLEX_PARSERS || parser_is_used[id]) 1925160e9cb3SYevgeny Kliteynik return; 1926160e9cb3SYevgeny Kliteynik 1927160e9cb3SYevgeny Kliteynik parser_is_used[id] = true; 1928160e9cb3SYevgeny Kliteynik parser_ptr = dr_ste_calc_flex_parser_offset(tag, id); 1929160e9cb3SYevgeny Kliteynik 1930160e9cb3SYevgeny Kliteynik *(__be32 *)parser_ptr = cpu_to_be32(*misc4_field_value); 1931160e9cb3SYevgeny Kliteynik *misc4_field_id = 0; 1932160e9cb3SYevgeny Kliteynik *misc4_field_value = 0; 1933160e9cb3SYevgeny Kliteynik } 1934160e9cb3SYevgeny Kliteynik 1935160e9cb3SYevgeny Kliteynik static int dr_ste_v1_build_felx_parser_tag(struct mlx5dr_match_param *value, 1936160e9cb3SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 1937160e9cb3SYevgeny Kliteynik u8 *tag) 1938160e9cb3SYevgeny Kliteynik { 1939160e9cb3SYevgeny Kliteynik struct mlx5dr_match_misc4 *misc_4_mask = &value->misc4; 1940160e9cb3SYevgeny Kliteynik bool parser_is_used[DR_NUM_OF_FLEX_PARSERS] = {}; 1941160e9cb3SYevgeny Kliteynik 1942160e9cb3SYevgeny Kliteynik dr_ste_v1_set_flex_parser(&misc_4_mask->prog_sample_field_id_0, 1943160e9cb3SYevgeny Kliteynik &misc_4_mask->prog_sample_field_value_0, 1944160e9cb3SYevgeny Kliteynik parser_is_used, tag); 1945160e9cb3SYevgeny Kliteynik 1946160e9cb3SYevgeny Kliteynik dr_ste_v1_set_flex_parser(&misc_4_mask->prog_sample_field_id_1, 1947160e9cb3SYevgeny Kliteynik &misc_4_mask->prog_sample_field_value_1, 1948160e9cb3SYevgeny Kliteynik parser_is_used, tag); 1949160e9cb3SYevgeny Kliteynik 1950160e9cb3SYevgeny Kliteynik dr_ste_v1_set_flex_parser(&misc_4_mask->prog_sample_field_id_2, 1951160e9cb3SYevgeny Kliteynik &misc_4_mask->prog_sample_field_value_2, 1952160e9cb3SYevgeny Kliteynik parser_is_used, tag); 1953160e9cb3SYevgeny Kliteynik 1954160e9cb3SYevgeny Kliteynik dr_ste_v1_set_flex_parser(&misc_4_mask->prog_sample_field_id_3, 1955160e9cb3SYevgeny Kliteynik &misc_4_mask->prog_sample_field_value_3, 1956160e9cb3SYevgeny Kliteynik parser_is_used, tag); 1957160e9cb3SYevgeny Kliteynik 1958160e9cb3SYevgeny Kliteynik return 0; 1959160e9cb3SYevgeny Kliteynik } 1960160e9cb3SYevgeny Kliteynik 19616862c787SYevgeny Kliteynik void dr_ste_v1_build_flex_parser_0_init(struct mlx5dr_ste_build *sb, 1962160e9cb3SYevgeny Kliteynik struct mlx5dr_match_param *mask) 1963160e9cb3SYevgeny Kliteynik { 1964160e9cb3SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 1965160e9cb3SYevgeny Kliteynik dr_ste_v1_build_felx_parser_tag(mask, sb, sb->bit_mask); 1966160e9cb3SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 1967160e9cb3SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_felx_parser_tag; 1968160e9cb3SYevgeny Kliteynik } 1969160e9cb3SYevgeny Kliteynik 19706862c787SYevgeny Kliteynik void dr_ste_v1_build_flex_parser_1_init(struct mlx5dr_ste_build *sb, 1971160e9cb3SYevgeny Kliteynik struct mlx5dr_match_param *mask) 1972160e9cb3SYevgeny Kliteynik { 1973160e9cb3SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_1; 1974160e9cb3SYevgeny Kliteynik dr_ste_v1_build_felx_parser_tag(mask, sb, sb->bit_mask); 1975160e9cb3SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 1976160e9cb3SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_felx_parser_tag; 1977160e9cb3SYevgeny Kliteynik } 1978160e9cb3SYevgeny Kliteynik 19793442e033SYevgeny Kliteynik static int 19803442e033SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_tag(struct mlx5dr_match_param *value, 19813442e033SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 19823442e033SYevgeny Kliteynik u8 *tag) 19833442e033SYevgeny Kliteynik { 19843442e033SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 19853442e033SYevgeny Kliteynik u8 parser_id = sb->caps->flex_parser_id_geneve_tlv_option_0; 19863442e033SYevgeny Kliteynik u8 *parser_ptr = dr_ste_calc_flex_parser_offset(tag, parser_id); 19873442e033SYevgeny Kliteynik 19883442e033SYevgeny Kliteynik MLX5_SET(ste_flex_parser_0, parser_ptr, flex_parser_3, 19893442e033SYevgeny Kliteynik misc3->geneve_tlv_option_0_data); 19903442e033SYevgeny Kliteynik misc3->geneve_tlv_option_0_data = 0; 19913442e033SYevgeny Kliteynik 19923442e033SYevgeny Kliteynik return 0; 19933442e033SYevgeny Kliteynik } 19943442e033SYevgeny Kliteynik 19956862c787SYevgeny Kliteynik void 19963442e033SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_init(struct mlx5dr_ste_build *sb, 19973442e033SYevgeny Kliteynik struct mlx5dr_match_param *mask) 19983442e033SYevgeny Kliteynik { 19993442e033SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_tag(mask, sb, sb->bit_mask); 20003442e033SYevgeny Kliteynik 20013442e033SYevgeny Kliteynik /* STEs with lookup type FLEX_PARSER_{0/1} includes 20023442e033SYevgeny Kliteynik * flex parsers_{0-3}/{4-7} respectively. 20033442e033SYevgeny Kliteynik */ 20043442e033SYevgeny Kliteynik sb->lu_type = sb->caps->flex_parser_id_geneve_tlv_option_0 > 3 ? 20053442e033SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 : 20063442e033SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 20073442e033SYevgeny Kliteynik 20083442e033SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 20093442e033SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_tag; 20103442e033SYevgeny Kliteynik } 20113442e033SYevgeny Kliteynik 2012f59464e2SYevgeny Kliteynik static int 2013f59464e2SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_exist_tag(struct mlx5dr_match_param *value, 2014f59464e2SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 2015f59464e2SYevgeny Kliteynik uint8_t *tag) 2016f59464e2SYevgeny Kliteynik { 2017f59464e2SYevgeny Kliteynik u8 parser_id = sb->caps->flex_parser_id_geneve_tlv_option_0; 2018f59464e2SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 2019f59464e2SYevgeny Kliteynik 2020f59464e2SYevgeny Kliteynik if (misc->geneve_tlv_option_0_exist) { 2021f59464e2SYevgeny Kliteynik MLX5_SET(ste_flex_parser_ok, tag, flex_parsers_ok, 1 << parser_id); 2022f59464e2SYevgeny Kliteynik misc->geneve_tlv_option_0_exist = 0; 2023f59464e2SYevgeny Kliteynik } 2024f59464e2SYevgeny Kliteynik 2025f59464e2SYevgeny Kliteynik return 0; 2026f59464e2SYevgeny Kliteynik } 2027f59464e2SYevgeny Kliteynik 20286862c787SYevgeny Kliteynik void 2029f59464e2SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_exist_init(struct mlx5dr_ste_build *sb, 2030f59464e2SYevgeny Kliteynik struct mlx5dr_match_param *mask) 2031f59464e2SYevgeny Kliteynik { 2032f59464e2SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_OK; 2033f59464e2SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_exist_tag(mask, sb, sb->bit_mask); 2034f59464e2SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 2035f59464e2SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_exist_tag; 2036f59464e2SYevgeny Kliteynik } 2037f59464e2SYevgeny Kliteynik 2038df9dd15aSYevgeny Kliteynik static int dr_ste_v1_build_flex_parser_tnl_gtpu_tag(struct mlx5dr_match_param *value, 2039df9dd15aSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 2040ae3eddcfSYevgeny Kliteynik u8 *tag) 2041df9dd15aSYevgeny Kliteynik { 2042df9dd15aSYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 2043df9dd15aSYevgeny Kliteynik 2044df9dd15aSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_gtpu, tag, gtpu_msg_flags, misc3, gtpu_msg_flags); 2045df9dd15aSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_gtpu, tag, gtpu_msg_type, misc3, gtpu_msg_type); 2046df9dd15aSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_gtpu, tag, gtpu_teid, misc3, gtpu_teid); 2047df9dd15aSYevgeny Kliteynik 2048df9dd15aSYevgeny Kliteynik return 0; 2049df9dd15aSYevgeny Kliteynik } 2050df9dd15aSYevgeny Kliteynik 20516862c787SYevgeny Kliteynik void dr_ste_v1_build_flex_parser_tnl_gtpu_init(struct mlx5dr_ste_build *sb, 2052df9dd15aSYevgeny Kliteynik struct mlx5dr_match_param *mask) 2053df9dd15aSYevgeny Kliteynik { 2054df9dd15aSYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_gtpu_tag(mask, sb, sb->bit_mask); 2055df9dd15aSYevgeny Kliteynik 2056df9dd15aSYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 2057df9dd15aSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 2058df9dd15aSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_gtpu_tag; 2059df9dd15aSYevgeny Kliteynik } 2060df9dd15aSYevgeny Kliteynik 2061df9dd15aSYevgeny Kliteynik static int 2062df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_0_tag(struct mlx5dr_match_param *value, 2063df9dd15aSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 2064ae3eddcfSYevgeny Kliteynik u8 *tag) 2065df9dd15aSYevgeny Kliteynik { 2066df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_0_id(sb->caps->flex_parser_id_gtpu_dw_0)) 2067df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_dw_0, sb->caps, &value->misc3); 2068df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_0_id(sb->caps->flex_parser_id_gtpu_teid)) 2069df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_teid, sb->caps, &value->misc3); 2070df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_0_id(sb->caps->flex_parser_id_gtpu_dw_2)) 2071df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_dw_2, sb->caps, &value->misc3); 2072df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_0_id(sb->caps->flex_parser_id_gtpu_first_ext_dw_0)) 2073df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_first_ext_dw_0, sb->caps, &value->misc3); 2074df9dd15aSYevgeny Kliteynik return 0; 2075df9dd15aSYevgeny Kliteynik } 2076df9dd15aSYevgeny Kliteynik 20776862c787SYevgeny Kliteynik void 2078df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_0_init(struct mlx5dr_ste_build *sb, 2079df9dd15aSYevgeny Kliteynik struct mlx5dr_match_param *mask) 2080df9dd15aSYevgeny Kliteynik { 2081df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_0_tag(mask, sb, sb->bit_mask); 2082df9dd15aSYevgeny Kliteynik 2083df9dd15aSYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 2084df9dd15aSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 2085df9dd15aSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_gtpu_flex_parser_0_tag; 2086df9dd15aSYevgeny Kliteynik } 2087df9dd15aSYevgeny Kliteynik 2088df9dd15aSYevgeny Kliteynik static int 2089df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_1_tag(struct mlx5dr_match_param *value, 2090df9dd15aSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 2091ae3eddcfSYevgeny Kliteynik u8 *tag) 2092df9dd15aSYevgeny Kliteynik { 2093df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_1_id(sb->caps->flex_parser_id_gtpu_dw_0)) 2094df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_dw_0, sb->caps, &value->misc3); 2095df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_1_id(sb->caps->flex_parser_id_gtpu_teid)) 2096df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_teid, sb->caps, &value->misc3); 2097df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_1_id(sb->caps->flex_parser_id_gtpu_dw_2)) 2098df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_dw_2, sb->caps, &value->misc3); 2099df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_1_id(sb->caps->flex_parser_id_gtpu_first_ext_dw_0)) 2100df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_first_ext_dw_0, sb->caps, &value->misc3); 2101df9dd15aSYevgeny Kliteynik return 0; 2102df9dd15aSYevgeny Kliteynik } 2103df9dd15aSYevgeny Kliteynik 21046862c787SYevgeny Kliteynik void 2105df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_1_init(struct mlx5dr_ste_build *sb, 2106df9dd15aSYevgeny Kliteynik struct mlx5dr_match_param *mask) 2107df9dd15aSYevgeny Kliteynik { 2108df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_1_tag(mask, sb, sb->bit_mask); 2109df9dd15aSYevgeny Kliteynik 2110df9dd15aSYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_1; 2111df9dd15aSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 2112df9dd15aSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_gtpu_flex_parser_1_tag; 2113df9dd15aSYevgeny Kliteynik } 2114df9dd15aSYevgeny Kliteynik 2115638a07f1SYevgeny Kliteynik static struct mlx5dr_ste_ctx ste_ctx_v1 = { 2116a6098129SYevgeny Kliteynik /* Builders */ 211710b69418SYevgeny Kliteynik .build_eth_l2_src_dst_init = &dr_ste_v1_build_eth_l2_src_dst_init, 211810b69418SYevgeny Kliteynik .build_eth_l3_ipv6_src_init = &dr_ste_v1_build_eth_l3_ipv6_src_init, 211910b69418SYevgeny Kliteynik .build_eth_l3_ipv6_dst_init = &dr_ste_v1_build_eth_l3_ipv6_dst_init, 212010b69418SYevgeny Kliteynik .build_eth_l3_ipv4_5_tuple_init = &dr_ste_v1_build_eth_l3_ipv4_5_tuple_init, 212110b69418SYevgeny Kliteynik .build_eth_l2_src_init = &dr_ste_v1_build_eth_l2_src_init, 212210b69418SYevgeny Kliteynik .build_eth_l2_dst_init = &dr_ste_v1_build_eth_l2_dst_init, 212310b69418SYevgeny Kliteynik .build_eth_l2_tnl_init = &dr_ste_v1_build_eth_l2_tnl_init, 212410b69418SYevgeny Kliteynik .build_eth_l3_ipv4_misc_init = &dr_ste_v1_build_eth_l3_ipv4_misc_init, 212510b69418SYevgeny Kliteynik .build_eth_ipv6_l3_l4_init = &dr_ste_v1_build_eth_ipv6_l3_l4_init, 212610b69418SYevgeny Kliteynik .build_mpls_init = &dr_ste_v1_build_mpls_init, 212710b69418SYevgeny Kliteynik .build_tnl_gre_init = &dr_ste_v1_build_tnl_gre_init, 212810b69418SYevgeny Kliteynik .build_tnl_mpls_init = &dr_ste_v1_build_tnl_mpls_init, 212935ba005dSYevgeny Kliteynik .build_tnl_mpls_over_udp_init = &dr_ste_v1_build_tnl_mpls_over_udp_init, 213035ba005dSYevgeny Kliteynik .build_tnl_mpls_over_gre_init = &dr_ste_v1_build_tnl_mpls_over_gre_init, 213110b69418SYevgeny Kliteynik .build_icmp_init = &dr_ste_v1_build_icmp_init, 213210b69418SYevgeny Kliteynik .build_general_purpose_init = &dr_ste_v1_build_general_purpose_init, 213310b69418SYevgeny Kliteynik .build_eth_l4_misc_init = &dr_ste_v1_build_eth_l4_misc_init, 213410b69418SYevgeny Kliteynik .build_tnl_vxlan_gpe_init = &dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_init, 213510b69418SYevgeny Kliteynik .build_tnl_geneve_init = &dr_ste_v1_build_flex_parser_tnl_geneve_init, 21363442e033SYevgeny Kliteynik .build_tnl_geneve_tlv_opt_init = &dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_init, 2137f59464e2SYevgeny Kliteynik .build_tnl_geneve_tlv_opt_exist_init = &dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_exist_init, 213810b69418SYevgeny Kliteynik .build_register_0_init = &dr_ste_v1_build_register_0_init, 213910b69418SYevgeny Kliteynik .build_register_1_init = &dr_ste_v1_build_register_1_init, 214010b69418SYevgeny Kliteynik .build_src_gvmi_qpn_init = &dr_ste_v1_build_src_gvmi_qpn_init, 2141160e9cb3SYevgeny Kliteynik .build_flex_parser_0_init = &dr_ste_v1_build_flex_parser_0_init, 2142160e9cb3SYevgeny Kliteynik .build_flex_parser_1_init = &dr_ste_v1_build_flex_parser_1_init, 2143df9dd15aSYevgeny Kliteynik .build_tnl_gtpu_init = &dr_ste_v1_build_flex_parser_tnl_gtpu_init, 214409753babSMuhammad Sammar .build_tnl_header_0_1_init = &dr_ste_v1_build_tnl_header_0_1_init, 2145df9dd15aSYevgeny Kliteynik .build_tnl_gtpu_flex_parser_0_init = &dr_ste_v1_build_tnl_gtpu_flex_parser_0_init, 2146df9dd15aSYevgeny Kliteynik .build_tnl_gtpu_flex_parser_1_init = &dr_ste_v1_build_tnl_gtpu_flex_parser_1_init, 2147df9dd15aSYevgeny Kliteynik 2148a6098129SYevgeny Kliteynik /* Getters and Setters */ 2149a6098129SYevgeny Kliteynik .ste_init = &dr_ste_v1_init, 2150a6098129SYevgeny Kliteynik .set_next_lu_type = &dr_ste_v1_set_next_lu_type, 2151a6098129SYevgeny Kliteynik .get_next_lu_type = &dr_ste_v1_get_next_lu_type, 2152*1207a772SYevgeny Kliteynik .is_miss_addr_set = &dr_ste_v1_is_miss_addr_set, 2153a6098129SYevgeny Kliteynik .set_miss_addr = &dr_ste_v1_set_miss_addr, 2154a6098129SYevgeny Kliteynik .get_miss_addr = &dr_ste_v1_get_miss_addr, 2155a6098129SYevgeny Kliteynik .set_hit_addr = &dr_ste_v1_set_hit_addr, 2156a6098129SYevgeny Kliteynik .set_byte_mask = &dr_ste_v1_set_byte_mask, 2157a6098129SYevgeny Kliteynik .get_byte_mask = &dr_ste_v1_get_byte_mask, 21584e856c5dSYevgeny Kliteynik /* Actions */ 21592de40f68SYevgeny Kliteynik .actions_caps = DR_STE_CTX_ACTION_CAP_TX_POP | 21602de40f68SYevgeny Kliteynik DR_STE_CTX_ACTION_CAP_RX_PUSH | 2161638a07f1SYevgeny Kliteynik DR_STE_CTX_ACTION_CAP_RX_ENCAP | 2162638a07f1SYevgeny Kliteynik DR_STE_CTX_ACTION_CAP_POP_MDFY, 21634e856c5dSYevgeny Kliteynik .set_actions_rx = &dr_ste_v1_set_actions_rx, 21644e856c5dSYevgeny Kliteynik .set_actions_tx = &dr_ste_v1_set_actions_tx, 2165c349b413SYevgeny Kliteynik .modify_field_arr_sz = ARRAY_SIZE(dr_ste_v1_action_modify_field_arr), 2166c349b413SYevgeny Kliteynik .modify_field_arr = dr_ste_v1_action_modify_field_arr, 2167c349b413SYevgeny Kliteynik .set_action_set = &dr_ste_v1_set_action_set, 2168c349b413SYevgeny Kliteynik .set_action_add = &dr_ste_v1_set_action_add, 2169c349b413SYevgeny Kliteynik .set_action_copy = &dr_ste_v1_set_action_copy, 2170c349b413SYevgeny Kliteynik .set_action_decap_l3_list = &dr_ste_v1_set_action_decap_l3_list, 21714fe45e1dSYevgeny Kliteynik /* Send */ 21724fe45e1dSYevgeny Kliteynik .prepare_for_postsend = &dr_ste_v1_prepare_for_postsend, 217310b69418SYevgeny Kliteynik }; 2174638a07f1SYevgeny Kliteynik 2175638a07f1SYevgeny Kliteynik struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx_v1(void) 2176638a07f1SYevgeny Kliteynik { 2177638a07f1SYevgeny Kliteynik return &ste_ctx_v1; 2178638a07f1SYevgeny Kliteynik } 2179