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" 610b69418SYevgeny Kliteynik #include "dr_ste.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, 5010b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0 = 0x0111, 5110b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 = 0x0112, 5210b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_MISC_O = 0x0113, 5310b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_ETHL4_MISC_I = 0x0114, 5410b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_INVALID = 0x00ff, 5510b69418SYevgeny Kliteynik DR_STE_V1_LU_TYPE_DONT_CARE = MLX5DR_STE_LU_TYPE_DONT_CARE, 5610b69418SYevgeny Kliteynik }; 5710b69418SYevgeny Kliteynik 584e856c5dSYevgeny Kliteynik enum dr_ste_v1_header_anchors { 594e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_START_OUTER = 0x00, 604e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_1ST_VLAN = 0x02, 614e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_IPV6_IPV4 = 0x07, 624e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_MAC = 0x13, 634e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_IPV6_IPV4 = 0x19, 644e856c5dSYevgeny Kliteynik }; 654e856c5dSYevgeny Kliteynik 664e856c5dSYevgeny Kliteynik enum dr_ste_v1_action_size { 674e856c5dSYevgeny Kliteynik DR_STE_ACTION_SINGLE_SZ = 4, 684e856c5dSYevgeny Kliteynik DR_STE_ACTION_DOUBLE_SZ = 8, 694e856c5dSYevgeny Kliteynik DR_STE_ACTION_TRIPLE_SZ = 12, 704e856c5dSYevgeny Kliteynik }; 714e856c5dSYevgeny Kliteynik 724e856c5dSYevgeny Kliteynik enum dr_ste_v1_action_insert_ptr_attr { 734e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_NONE = 0, /* Regular push header (e.g. push vlan) */ 744e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP = 1, /* Encapsulation / Tunneling */ 754e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ESP = 2, /* IPsec */ 764e856c5dSYevgeny Kliteynik }; 774e856c5dSYevgeny Kliteynik 784e856c5dSYevgeny Kliteynik enum dr_ste_v1_action_id { 794e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_NOP = 0x00, 804e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_COPY = 0x05, 814e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_SET = 0x06, 824e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_ADD = 0x07, 834e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE = 0x08, 844e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER = 0x09, 854e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_INLINE = 0x0a, 864e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER = 0x0b, 874e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_FLOW_TAG = 0x0c, 884e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_QUEUE_ID_SEL = 0x0d, 894e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_ACCELERATED_LIST = 0x0e, 904e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MODIFY_LIST = 0x0f, 914e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_TRAILER = 0x13, 924e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_COUNTER_ID = 0x14, 934e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MAX = 0x21, 944e856c5dSYevgeny Kliteynik /* use for special cases */ 954e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_SPECIAL_ENCAP_L3 = 0x22, 964e856c5dSYevgeny Kliteynik }; 974e856c5dSYevgeny Kliteynik 98c349b413SYevgeny Kliteynik enum { 99c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_0 = 0x00, 100c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_1 = 0x01, 101c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_2 = 0x02, 102c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_0 = 0x08, 103c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_1 = 0x09, 104c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0 = 0x0e, 105c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0 = 0x18, 106c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_1 = 0x19, 107c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_0 = 0x40, 108c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_1 = 0x41, 109c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_0 = 0x44, 110c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_1 = 0x45, 111c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_2 = 0x46, 112c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_3 = 0x47, 113c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_0 = 0x4c, 114c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_1 = 0x4d, 115c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_2 = 0x4e, 116c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_3 = 0x4f, 117c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_0 = 0x5e, 118c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_1 = 0x5f, 119*ded6a877SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_CFG_HDR_0_0 = 0x6f, 120*ded6a877SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_CFG_HDR_0_1 = 0x70, 121c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_METADATA_2_CQE = 0x7b, 122c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_GNRL_PURPOSE = 0x7c, 123c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_2 = 0x8c, 124c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_3 = 0x8d, 125c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_4 = 0x8e, 126c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_5 = 0x8f, 127c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_6 = 0x90, 128c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_7 = 0x91, 129c349b413SYevgeny Kliteynik }; 130c349b413SYevgeny Kliteynik 131c349b413SYevgeny Kliteynik static const struct mlx5dr_ste_action_modify_field dr_ste_v1_action_modify_field_arr[] = { 132c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SMAC_47_16] = { 133c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_0, .start = 0, .end = 31, 134c349b413SYevgeny Kliteynik }, 135c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SMAC_15_0] = { 136c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_1, .start = 16, .end = 31, 137c349b413SYevgeny Kliteynik }, 138c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_ETHERTYPE] = { 139c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_1, .start = 0, .end = 15, 140c349b413SYevgeny Kliteynik }, 141c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DMAC_47_16] = { 142c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_0, .start = 0, .end = 31, 143c349b413SYevgeny Kliteynik }, 144c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DMAC_15_0] = { 145c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_1, .start = 16, .end = 31, 146c349b413SYevgeny Kliteynik }, 147c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_IP_DSCP] = { 148c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0, .start = 18, .end = 23, 149c349b413SYevgeny Kliteynik }, 150c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_FLAGS] = { 151c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_1, .start = 16, .end = 24, 152c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, 153c349b413SYevgeny Kliteynik }, 154c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_SPORT] = { 155c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 16, .end = 31, 156c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, 157c349b413SYevgeny Kliteynik }, 158c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_DPORT] = { 159c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 0, .end = 15, 160c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, 161c349b413SYevgeny Kliteynik }, 162c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_IP_TTL] = { 163c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0, .start = 8, .end = 15, 164c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, 165c349b413SYevgeny Kliteynik }, 166c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_IPV6_HOPLIMIT] = { 167c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0, .start = 8, .end = 15, 168c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 169c349b413SYevgeny Kliteynik }, 170c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_UDP_SPORT] = { 171c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 16, .end = 31, 172c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_UDP, 173c349b413SYevgeny Kliteynik }, 174c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_UDP_DPORT] = { 175c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 0, .end = 15, 176c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_UDP, 177c349b413SYevgeny Kliteynik }, 178c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_127_96] = { 179c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_0, .start = 0, .end = 31, 180c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 181c349b413SYevgeny Kliteynik }, 182c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_95_64] = { 183c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_1, .start = 0, .end = 31, 184c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 185c349b413SYevgeny Kliteynik }, 186c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_63_32] = { 187c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_2, .start = 0, .end = 31, 188c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 189c349b413SYevgeny Kliteynik }, 190c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_31_0] = { 191c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_3, .start = 0, .end = 31, 192c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 193c349b413SYevgeny Kliteynik }, 194c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_127_96] = { 195c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_0, .start = 0, .end = 31, 196c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 197c349b413SYevgeny Kliteynik }, 198c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_95_64] = { 199c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_1, .start = 0, .end = 31, 200c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 201c349b413SYevgeny Kliteynik }, 202c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_63_32] = { 203c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_2, .start = 0, .end = 31, 204c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 205c349b413SYevgeny Kliteynik }, 206c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_31_0] = { 207c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_3, .start = 0, .end = 31, 208c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 209c349b413SYevgeny Kliteynik }, 210c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV4] = { 211c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_0, .start = 0, .end = 31, 212c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, 213c349b413SYevgeny Kliteynik }, 214c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV4] = { 215c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_1, .start = 0, .end = 31, 216c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, 217c349b413SYevgeny Kliteynik }, 218c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_A] = { 219c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_GNRL_PURPOSE, .start = 0, .end = 31, 220c349b413SYevgeny Kliteynik }, 221c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_B] = { 222c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_METADATA_2_CQE, .start = 0, .end = 31, 223c349b413SYevgeny Kliteynik }, 224c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_0] = { 225c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_6, .start = 0, .end = 31, 226c349b413SYevgeny Kliteynik }, 227c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_1] = { 228c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_7, .start = 0, .end = 31, 229c349b413SYevgeny Kliteynik }, 230c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_2] = { 231c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_4, .start = 0, .end = 31, 232c349b413SYevgeny Kliteynik }, 233c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_3] = { 234c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_5, .start = 0, .end = 31, 235c349b413SYevgeny Kliteynik }, 236c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_4] = { 237c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_2, .start = 0, .end = 31, 238c349b413SYevgeny Kliteynik }, 239c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_5] = { 240c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_3, .start = 0, .end = 31, 241c349b413SYevgeny Kliteynik }, 242c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_SEQ_NUM] = { 243c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_0, .start = 0, .end = 31, 244c349b413SYevgeny Kliteynik }, 245c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_ACK_NUM] = { 246c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_1, .start = 0, .end = 31, 247c349b413SYevgeny Kliteynik }, 248c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_FIRST_VID] = { 249c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_2, .start = 0, .end = 15, 250c349b413SYevgeny Kliteynik }, 251*ded6a877SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_EMD_31_0] = { 252*ded6a877SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_CFG_HDR_0_1, .start = 0, .end = 31, 253*ded6a877SYevgeny Kliteynik }, 254*ded6a877SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_EMD_47_32] = { 255*ded6a877SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_CFG_HDR_0_0, .start = 0, .end = 15, 256*ded6a877SYevgeny Kliteynik }, 257c349b413SYevgeny Kliteynik }; 258c349b413SYevgeny Kliteynik 2594e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_entry_type(u8 *hw_ste_p, u8 entry_type) 2604e856c5dSYevgeny Kliteynik { 2614e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, entry_format, entry_type); 2624e856c5dSYevgeny Kliteynik } 2634e856c5dSYevgeny Kliteynik 264a6098129SYevgeny Kliteynik static void dr_ste_v1_set_miss_addr(u8 *hw_ste_p, u64 miss_addr) 265a6098129SYevgeny Kliteynik { 266a6098129SYevgeny Kliteynik u64 index = miss_addr >> 6; 267a6098129SYevgeny Kliteynik 268a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_39_32, index >> 26); 269a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_31_6, index); 270a6098129SYevgeny Kliteynik } 271a6098129SYevgeny Kliteynik 272a6098129SYevgeny Kliteynik static u64 dr_ste_v1_get_miss_addr(u8 *hw_ste_p) 273a6098129SYevgeny Kliteynik { 274a6098129SYevgeny Kliteynik u64 index = 27584076c4cSYevgeny Kliteynik ((u64)MLX5_GET(ste_match_bwc_v1, hw_ste_p, miss_address_31_6) | 27684076c4cSYevgeny Kliteynik ((u64)MLX5_GET(ste_match_bwc_v1, hw_ste_p, miss_address_39_32)) << 26); 277a6098129SYevgeny Kliteynik 278a6098129SYevgeny Kliteynik return index << 6; 279a6098129SYevgeny Kliteynik } 280a6098129SYevgeny Kliteynik 281a6098129SYevgeny Kliteynik static void dr_ste_v1_set_byte_mask(u8 *hw_ste_p, u16 byte_mask) 282a6098129SYevgeny Kliteynik { 283a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, byte_mask, byte_mask); 284a6098129SYevgeny Kliteynik } 285a6098129SYevgeny Kliteynik 286a6098129SYevgeny Kliteynik static u16 dr_ste_v1_get_byte_mask(u8 *hw_ste_p) 287a6098129SYevgeny Kliteynik { 288a6098129SYevgeny Kliteynik return MLX5_GET(ste_match_bwc_v1, hw_ste_p, byte_mask); 289a6098129SYevgeny Kliteynik } 290a6098129SYevgeny Kliteynik 291a6098129SYevgeny Kliteynik static void dr_ste_v1_set_lu_type(u8 *hw_ste_p, u16 lu_type) 292a6098129SYevgeny Kliteynik { 293a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, entry_format, lu_type >> 8); 294a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, match_definer_ctx_idx, lu_type & 0xFF); 295a6098129SYevgeny Kliteynik } 296a6098129SYevgeny Kliteynik 297a6098129SYevgeny Kliteynik static void dr_ste_v1_set_next_lu_type(u8 *hw_ste_p, u16 lu_type) 298a6098129SYevgeny Kliteynik { 299a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_entry_format, lu_type >> 8); 300a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, hash_definer_ctx_idx, lu_type & 0xFF); 301a6098129SYevgeny Kliteynik } 302a6098129SYevgeny Kliteynik 303a6098129SYevgeny Kliteynik static u16 dr_ste_v1_get_next_lu_type(u8 *hw_ste_p) 304a6098129SYevgeny Kliteynik { 305a6098129SYevgeny Kliteynik u8 mode = MLX5_GET(ste_match_bwc_v1, hw_ste_p, next_entry_format); 306a6098129SYevgeny Kliteynik u8 index = MLX5_GET(ste_match_bwc_v1, hw_ste_p, hash_definer_ctx_idx); 307a6098129SYevgeny Kliteynik 308a6098129SYevgeny Kliteynik return (mode << 8 | index); 309a6098129SYevgeny Kliteynik } 310a6098129SYevgeny Kliteynik 3114e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_hit_gvmi(u8 *hw_ste_p, u16 gvmi) 3124e856c5dSYevgeny Kliteynik { 3134e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_63_48, gvmi); 3144e856c5dSYevgeny Kliteynik } 3154e856c5dSYevgeny Kliteynik 316a6098129SYevgeny Kliteynik static void dr_ste_v1_set_hit_addr(u8 *hw_ste_p, u64 icm_addr, u32 ht_size) 317a6098129SYevgeny Kliteynik { 318a6098129SYevgeny Kliteynik u64 index = (icm_addr >> 5) | ht_size; 319a6098129SYevgeny Kliteynik 320a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_39_32_size, index >> 27); 321a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_31_5_size, index); 322a6098129SYevgeny Kliteynik } 323a6098129SYevgeny Kliteynik 324a6098129SYevgeny Kliteynik static void dr_ste_v1_init(u8 *hw_ste_p, u16 lu_type, 325a6098129SYevgeny Kliteynik u8 entry_type, u16 gvmi) 326a6098129SYevgeny Kliteynik { 327a6098129SYevgeny Kliteynik dr_ste_v1_set_lu_type(hw_ste_p, lu_type); 328a6098129SYevgeny Kliteynik dr_ste_v1_set_next_lu_type(hw_ste_p, MLX5DR_STE_LU_TYPE_DONT_CARE); 329a6098129SYevgeny Kliteynik 330a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, gvmi, gvmi); 331a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_63_48, gvmi); 332a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_63_48, gvmi); 333a6098129SYevgeny Kliteynik } 334a6098129SYevgeny Kliteynik 3354fe45e1dSYevgeny Kliteynik static void dr_ste_v1_prepare_for_postsend(u8 *hw_ste_p, 3364fe45e1dSYevgeny Kliteynik u32 ste_size) 3374fe45e1dSYevgeny Kliteynik { 3384fe45e1dSYevgeny Kliteynik u8 *tag = hw_ste_p + DR_STE_SIZE_CTRL; 3394fe45e1dSYevgeny Kliteynik u8 *mask = tag + DR_STE_SIZE_TAG; 3404fe45e1dSYevgeny Kliteynik u8 tmp_tag[DR_STE_SIZE_TAG] = {}; 3414fe45e1dSYevgeny Kliteynik 3424fe45e1dSYevgeny Kliteynik if (ste_size == DR_STE_SIZE_CTRL) 3434fe45e1dSYevgeny Kliteynik return; 3444fe45e1dSYevgeny Kliteynik 3454fe45e1dSYevgeny Kliteynik WARN_ON(ste_size != DR_STE_SIZE); 3464fe45e1dSYevgeny Kliteynik 3474fe45e1dSYevgeny Kliteynik /* Backup tag */ 3484fe45e1dSYevgeny Kliteynik memcpy(tmp_tag, tag, DR_STE_SIZE_TAG); 3494fe45e1dSYevgeny Kliteynik 3504fe45e1dSYevgeny Kliteynik /* Swap mask and tag both are the same size */ 3514fe45e1dSYevgeny Kliteynik memcpy(tag, mask, DR_STE_SIZE_MASK); 3524fe45e1dSYevgeny Kliteynik memcpy(mask, tmp_tag, DR_STE_SIZE_TAG); 3534fe45e1dSYevgeny Kliteynik } 3544fe45e1dSYevgeny Kliteynik 3554e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_flow_tag(u8 *s_action, u32 flow_tag) 3564e856c5dSYevgeny Kliteynik { 3574e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_flow_tag_v1, s_action, action_id, 3584e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_FLOW_TAG); 3594e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_flow_tag_v1, s_action, flow_tag, flow_tag); 3604e856c5dSYevgeny Kliteynik } 3614e856c5dSYevgeny Kliteynik 3624e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_counter_id(u8 *hw_ste_p, u32 ctr_id) 3634e856c5dSYevgeny Kliteynik { 3644e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, counter_id, ctr_id); 3654e856c5dSYevgeny Kliteynik } 3664e856c5dSYevgeny Kliteynik 3674e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_reparse(u8 *hw_ste_p) 3684e856c5dSYevgeny Kliteynik { 3694e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, reparse, 1); 3704e856c5dSYevgeny Kliteynik } 3714e856c5dSYevgeny Kliteynik 372d7418b4eSYevgeny Kliteynik static void dr_ste_v1_set_encap(u8 *hw_ste_p, u8 *d_action, 3734e856c5dSYevgeny Kliteynik u32 reformat_id, int size) 3744e856c5dSYevgeny Kliteynik { 3754e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, action_id, 3764e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER); 3774e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 3784e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, size, size / 2); 3794e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, pointer, reformat_id); 3804e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, attributes, 3814e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP); 3824e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 3834e856c5dSYevgeny Kliteynik } 3844e856c5dSYevgeny Kliteynik 3857ea9b398SYevgeny Kliteynik static void dr_ste_v1_set_insert_hdr(u8 *hw_ste_p, u8 *d_action, 3867ea9b398SYevgeny Kliteynik u32 reformat_id, 3877ea9b398SYevgeny Kliteynik u8 anchor, u8 offset, 3887ea9b398SYevgeny Kliteynik int size) 3897ea9b398SYevgeny Kliteynik { 3907ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, 3917ea9b398SYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_INSERT_POINTER); 3927ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, start_anchor, anchor); 3937ea9b398SYevgeny Kliteynik 3947ea9b398SYevgeny Kliteynik /* The hardware expects here size and offset in words (2 byte) */ 3957ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, size, size / 2); 3967ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, start_offset, offset / 2); 3977ea9b398SYevgeny Kliteynik 3987ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, pointer, reformat_id); 3997ea9b398SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, attributes, 4007ea9b398SYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_NONE); 4017ea9b398SYevgeny Kliteynik 4027ea9b398SYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4037ea9b398SYevgeny Kliteynik } 4047ea9b398SYevgeny Kliteynik 4054e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_tx_push_vlan(u8 *hw_ste_p, u8 *d_action, 4064e856c5dSYevgeny Kliteynik u32 vlan_hdr) 4074e856c5dSYevgeny Kliteynik { 4084e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 4094e856c5dSYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_INSERT_INLINE); 4104e856c5dSYevgeny Kliteynik /* The hardware expects offset to vlan header in words (2 byte) */ 4114e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 4124e856c5dSYevgeny Kliteynik start_offset, HDR_LEN_L2_MACS >> 1); 4134e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 4144e856c5dSYevgeny Kliteynik inline_data, vlan_hdr); 4154e856c5dSYevgeny Kliteynik 4164e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4174e856c5dSYevgeny Kliteynik } 4184e856c5dSYevgeny Kliteynik 4194e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_pop_vlan(u8 *hw_ste_p, u8 *s_action, u8 vlans_num) 4204e856c5dSYevgeny Kliteynik { 4214e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 4224e856c5dSYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE); 4234e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 4244e856c5dSYevgeny Kliteynik start_anchor, DR_STE_HEADER_ANCHOR_1ST_VLAN); 4254e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 4264e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 4274e856c5dSYevgeny Kliteynik remove_size, (HDR_LEN_L2_VLAN >> 1) * vlans_num); 4284e856c5dSYevgeny Kliteynik 4294e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4304e856c5dSYevgeny Kliteynik } 4314e856c5dSYevgeny Kliteynik 432d7418b4eSYevgeny Kliteynik static void dr_ste_v1_set_encap_l3(u8 *hw_ste_p, 4334e856c5dSYevgeny Kliteynik u8 *frst_s_action, 4344e856c5dSYevgeny Kliteynik u8 *scnd_d_action, 4354e856c5dSYevgeny Kliteynik u32 reformat_id, 4364e856c5dSYevgeny Kliteynik int size) 4374e856c5dSYevgeny Kliteynik { 4384e856c5dSYevgeny Kliteynik /* Remove L2 headers */ 4394e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, frst_s_action, action_id, 4404e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 4414e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, frst_s_action, end_anchor, 4424e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_IPV6_IPV4); 4434e856c5dSYevgeny Kliteynik 4444e856c5dSYevgeny Kliteynik /* Encapsulate with given reformat ID */ 4454e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, action_id, 4464e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER); 4474e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 4484e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, size, size / 2); 4494e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, pointer, reformat_id); 4504e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, attributes, 4514e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP); 4524e856c5dSYevgeny Kliteynik 4534e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4544e856c5dSYevgeny Kliteynik } 4554e856c5dSYevgeny Kliteynik 4564e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_decap(u8 *hw_ste_p, u8 *s_action) 4574e856c5dSYevgeny Kliteynik { 4584e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, action_id, 4594e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 4604e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, decap, 1); 4614e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, vni_to_cqe, 1); 4624e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, end_anchor, 4634e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_MAC); 4644e856c5dSYevgeny Kliteynik 4654e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4664e856c5dSYevgeny Kliteynik } 4674e856c5dSYevgeny Kliteynik 4684e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rewrite_actions(u8 *hw_ste_p, 4694e856c5dSYevgeny Kliteynik u8 *s_action, 4704e856c5dSYevgeny Kliteynik u16 num_of_actions, 4714e856c5dSYevgeny Kliteynik u32 re_write_index) 4724e856c5dSYevgeny Kliteynik { 4734e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, action_id, 4744e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MODIFY_LIST); 4754e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, num_of_modify_actions, 4764e856c5dSYevgeny Kliteynik num_of_actions); 4774e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, modify_actions_ptr, 4784e856c5dSYevgeny Kliteynik re_write_index); 4794e856c5dSYevgeny Kliteynik 4804e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4814e856c5dSYevgeny Kliteynik } 4824e856c5dSYevgeny Kliteynik 4834e856c5dSYevgeny Kliteynik static void dr_ste_v1_arr_init_next_match(u8 **last_ste, 4844e856c5dSYevgeny Kliteynik u32 *added_stes, 4854e856c5dSYevgeny Kliteynik u16 gvmi) 4864e856c5dSYevgeny Kliteynik { 4874e856c5dSYevgeny Kliteynik u8 *action; 4884e856c5dSYevgeny Kliteynik 4894e856c5dSYevgeny Kliteynik (*added_stes)++; 4904e856c5dSYevgeny Kliteynik *last_ste += DR_STE_SIZE; 4914e856c5dSYevgeny Kliteynik dr_ste_v1_init(*last_ste, MLX5DR_STE_LU_TYPE_DONT_CARE, 0, gvmi); 4924e856c5dSYevgeny Kliteynik dr_ste_v1_set_entry_type(*last_ste, DR_STE_V1_TYPE_MATCH); 4934e856c5dSYevgeny Kliteynik 4944e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, *last_ste, action); 4954e856c5dSYevgeny Kliteynik memset(action, 0, MLX5_FLD_SZ_BYTES(ste_mask_and_match_v1, action)); 4964e856c5dSYevgeny Kliteynik } 4974e856c5dSYevgeny Kliteynik 4984e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_actions_tx(struct mlx5dr_domain *dmn, 4994e856c5dSYevgeny Kliteynik u8 *action_type_set, 5004e856c5dSYevgeny Kliteynik u8 *last_ste, 5014e856c5dSYevgeny Kliteynik struct mlx5dr_ste_actions_attr *attr, 5024e856c5dSYevgeny Kliteynik u32 *added_stes) 5034e856c5dSYevgeny Kliteynik { 5044e856c5dSYevgeny Kliteynik u8 *action = MLX5_ADDR_OF(ste_match_bwc_v1, last_ste, action); 5054e856c5dSYevgeny Kliteynik u8 action_sz = DR_STE_ACTION_DOUBLE_SZ; 5064e856c5dSYevgeny Kliteynik bool allow_encap = true; 5074e856c5dSYevgeny Kliteynik 5084e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_CTR]) 5094e856c5dSYevgeny Kliteynik dr_ste_v1_set_counter_id(last_ste, attr->ctr_id); 5104e856c5dSYevgeny Kliteynik 5114e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_MODIFY_HDR]) { 5124e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ) { 5134e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, 5144e856c5dSYevgeny Kliteynik attr->gvmi); 5154e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, 5164e856c5dSYevgeny Kliteynik last_ste, action); 5174e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 5184e856c5dSYevgeny Kliteynik } 5194e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 5204e856c5dSYevgeny Kliteynik attr->modify_actions, 5214e856c5dSYevgeny Kliteynik attr->modify_index); 5224e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 5234e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 5244e856c5dSYevgeny Kliteynik allow_encap = false; 5254e856c5dSYevgeny Kliteynik } 5264e856c5dSYevgeny Kliteynik 5274e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_PUSH_VLAN]) { 5284e856c5dSYevgeny Kliteynik int i; 5294e856c5dSYevgeny Kliteynik 5304e856c5dSYevgeny Kliteynik for (i = 0; i < attr->vlans.count; i++) { 5314e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ || !allow_encap) { 5324e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 5334e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 5344e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 5354e856c5dSYevgeny Kliteynik allow_encap = true; 5364e856c5dSYevgeny Kliteynik } 5374e856c5dSYevgeny Kliteynik dr_ste_v1_set_tx_push_vlan(last_ste, action, attr->vlans.headers[i]); 5384e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 5394e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 5404e856c5dSYevgeny Kliteynik } 5414e856c5dSYevgeny Kliteynik } 5424e856c5dSYevgeny Kliteynik 5434e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L2]) { 5444e856c5dSYevgeny Kliteynik if (!allow_encap || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 5454e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 5464e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 5474e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 5484e856c5dSYevgeny Kliteynik allow_encap = true; 5494e856c5dSYevgeny Kliteynik } 550d7418b4eSYevgeny Kliteynik dr_ste_v1_set_encap(last_ste, action, 5517ea9b398SYevgeny Kliteynik attr->reformat.id, 5527ea9b398SYevgeny Kliteynik attr->reformat.size); 5534e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 5544e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 5554e856c5dSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L3]) { 5564e856c5dSYevgeny Kliteynik u8 *d_action; 5574e856c5dSYevgeny Kliteynik 5584e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 5594e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 5604e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 5614e856c5dSYevgeny Kliteynik d_action = action + DR_STE_ACTION_SINGLE_SZ; 5624e856c5dSYevgeny Kliteynik 563d7418b4eSYevgeny Kliteynik dr_ste_v1_set_encap_l3(last_ste, 5644e856c5dSYevgeny Kliteynik action, d_action, 5657ea9b398SYevgeny Kliteynik attr->reformat.id, 5667ea9b398SYevgeny Kliteynik attr->reformat.size); 5674e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_TRIPLE_SZ; 5684e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_TRIPLE_SZ; 5697ea9b398SYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_INSERT_HDR]) { 5707ea9b398SYevgeny Kliteynik if (!allow_encap || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 5717ea9b398SYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 5727ea9b398SYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 5737ea9b398SYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 5747ea9b398SYevgeny Kliteynik } 5757ea9b398SYevgeny Kliteynik dr_ste_v1_set_insert_hdr(last_ste, action, 5767ea9b398SYevgeny Kliteynik attr->reformat.id, 5777ea9b398SYevgeny Kliteynik attr->reformat.param_0, 5787ea9b398SYevgeny Kliteynik attr->reformat.param_1, 5797ea9b398SYevgeny Kliteynik attr->reformat.size); 5807ea9b398SYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 5817ea9b398SYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 5824e856c5dSYevgeny Kliteynik } 5834e856c5dSYevgeny Kliteynik 5844e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_gvmi(last_ste, attr->hit_gvmi); 5854e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_addr(last_ste, attr->final_icm_addr, 1); 5864e856c5dSYevgeny Kliteynik } 5874e856c5dSYevgeny Kliteynik 5884e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn, 5894e856c5dSYevgeny Kliteynik u8 *action_type_set, 5904e856c5dSYevgeny Kliteynik u8 *last_ste, 5914e856c5dSYevgeny Kliteynik struct mlx5dr_ste_actions_attr *attr, 5924e856c5dSYevgeny Kliteynik u32 *added_stes) 5934e856c5dSYevgeny Kliteynik { 5944e856c5dSYevgeny Kliteynik u8 *action = MLX5_ADDR_OF(ste_match_bwc_v1, last_ste, action); 5954e856c5dSYevgeny Kliteynik u8 action_sz = DR_STE_ACTION_DOUBLE_SZ; 5964e856c5dSYevgeny Kliteynik bool allow_modify_hdr = true; 5974e856c5dSYevgeny Kliteynik bool allow_ctr = true; 5984e856c5dSYevgeny Kliteynik 5994e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_TNL_L3_TO_L2]) { 6004e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 6014e856c5dSYevgeny Kliteynik attr->decap_actions, 6024e856c5dSYevgeny Kliteynik attr->decap_index); 6034e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 6044e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 6054e856c5dSYevgeny Kliteynik allow_modify_hdr = false; 6064e856c5dSYevgeny Kliteynik allow_ctr = false; 6074e856c5dSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_TNL_L2_TO_L2]) { 6084e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_decap(last_ste, action); 6094e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 6104e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 6114e856c5dSYevgeny Kliteynik allow_modify_hdr = false; 6124e856c5dSYevgeny Kliteynik allow_ctr = false; 6134e856c5dSYevgeny Kliteynik } 6144e856c5dSYevgeny Kliteynik 6154e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_TAG]) { 6164e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ) { 6174e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 6184e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 6194e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6204e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 6214e856c5dSYevgeny Kliteynik allow_ctr = true; 6224e856c5dSYevgeny Kliteynik } 6234e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_flow_tag(action, attr->flow_tag); 6244e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 6254e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 6264e856c5dSYevgeny Kliteynik } 6274e856c5dSYevgeny Kliteynik 6284e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_POP_VLAN]) { 6294e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ || 6304e856c5dSYevgeny Kliteynik !allow_modify_hdr) { 6314e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 6324e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 6334e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6344e856c5dSYevgeny Kliteynik allow_modify_hdr = false; 6354e856c5dSYevgeny Kliteynik allow_ctr = false; 6364e856c5dSYevgeny Kliteynik } 6374e856c5dSYevgeny Kliteynik 6384e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_pop_vlan(last_ste, action, attr->vlans.count); 6394e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 6404e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 6414e856c5dSYevgeny Kliteynik } 6424e856c5dSYevgeny Kliteynik 6434e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_MODIFY_HDR]) { 6444e856c5dSYevgeny Kliteynik /* Modify header and decapsulation must use different STEs */ 6454e856c5dSYevgeny Kliteynik if (!allow_modify_hdr || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 6464e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 6474e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 6484e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6494e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 6504e856c5dSYevgeny Kliteynik allow_ctr = true; 6514e856c5dSYevgeny Kliteynik } 6524e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 6534e856c5dSYevgeny Kliteynik attr->modify_actions, 6544e856c5dSYevgeny Kliteynik attr->modify_index); 6554e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 6564e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 6574e856c5dSYevgeny Kliteynik } 6584e856c5dSYevgeny Kliteynik 6594e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_CTR]) { 6607ea9b398SYevgeny Kliteynik /* Counter action set after decap and before insert_hdr 6617ea9b398SYevgeny Kliteynik * to exclude decaped / encaped header respectively. 6627ea9b398SYevgeny Kliteynik */ 6634e856c5dSYevgeny Kliteynik if (!allow_ctr) { 6644e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 6654e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 6664e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6674e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 6684e856c5dSYevgeny Kliteynik allow_ctr = false; 6694e856c5dSYevgeny Kliteynik } 6704e856c5dSYevgeny Kliteynik dr_ste_v1_set_counter_id(last_ste, attr->ctr_id); 6714e856c5dSYevgeny Kliteynik } 6724e856c5dSYevgeny Kliteynik 673d7418b4eSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L2]) { 674d7418b4eSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ) { 675d7418b4eSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 676d7418b4eSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 677d7418b4eSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 678d7418b4eSYevgeny Kliteynik } 679d7418b4eSYevgeny Kliteynik dr_ste_v1_set_encap(last_ste, action, 6807ea9b398SYevgeny Kliteynik attr->reformat.id, 6817ea9b398SYevgeny Kliteynik attr->reformat.size); 682d7418b4eSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 683d7418b4eSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 684d7418b4eSYevgeny Kliteynik allow_modify_hdr = false; 685d7418b4eSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L3]) { 686d7418b4eSYevgeny Kliteynik u8 *d_action; 687d7418b4eSYevgeny Kliteynik 688d7418b4eSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_TRIPLE_SZ) { 689d7418b4eSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 690d7418b4eSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 691d7418b4eSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 692d7418b4eSYevgeny Kliteynik } 693d7418b4eSYevgeny Kliteynik 694d7418b4eSYevgeny Kliteynik d_action = action + DR_STE_ACTION_SINGLE_SZ; 695d7418b4eSYevgeny Kliteynik 696d7418b4eSYevgeny Kliteynik dr_ste_v1_set_encap_l3(last_ste, 697d7418b4eSYevgeny Kliteynik action, d_action, 6987ea9b398SYevgeny Kliteynik attr->reformat.id, 6997ea9b398SYevgeny Kliteynik attr->reformat.size); 700d7418b4eSYevgeny Kliteynik action_sz -= DR_STE_ACTION_TRIPLE_SZ; 701d7418b4eSYevgeny Kliteynik allow_modify_hdr = false; 7027ea9b398SYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_INSERT_HDR]) { 7037ea9b398SYevgeny Kliteynik /* Modify header, decap, and encap must use different STEs */ 7047ea9b398SYevgeny Kliteynik if (!allow_modify_hdr || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 7057ea9b398SYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 7067ea9b398SYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 7077ea9b398SYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 7087ea9b398SYevgeny Kliteynik } 7097ea9b398SYevgeny Kliteynik dr_ste_v1_set_insert_hdr(last_ste, action, 7107ea9b398SYevgeny Kliteynik attr->reformat.id, 7117ea9b398SYevgeny Kliteynik attr->reformat.param_0, 7127ea9b398SYevgeny Kliteynik attr->reformat.param_1, 7137ea9b398SYevgeny Kliteynik attr->reformat.size); 7147ea9b398SYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 7157ea9b398SYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 7167ea9b398SYevgeny Kliteynik allow_modify_hdr = false; 717d7418b4eSYevgeny Kliteynik } 718d7418b4eSYevgeny Kliteynik 7194e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_gvmi(last_ste, attr->hit_gvmi); 7204e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_addr(last_ste, attr->final_icm_addr, 1); 7214e856c5dSYevgeny Kliteynik } 7224e856c5dSYevgeny Kliteynik 723c349b413SYevgeny Kliteynik static void dr_ste_v1_set_action_set(u8 *d_action, 724c349b413SYevgeny Kliteynik u8 hw_field, 725c349b413SYevgeny Kliteynik u8 shifter, 726c349b413SYevgeny Kliteynik u8 length, 727c349b413SYevgeny Kliteynik u32 data) 728c349b413SYevgeny Kliteynik { 729c349b413SYevgeny Kliteynik shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 730c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, action_id, DR_STE_V1_ACTION_ID_SET); 731c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, destination_dw_offset, hw_field); 732c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, destination_left_shifter, shifter); 733c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, destination_length, length); 734c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, inline_data, data); 735c349b413SYevgeny Kliteynik } 736c349b413SYevgeny Kliteynik 737c349b413SYevgeny Kliteynik static void dr_ste_v1_set_action_add(u8 *d_action, 738c349b413SYevgeny Kliteynik u8 hw_field, 739c349b413SYevgeny Kliteynik u8 shifter, 740c349b413SYevgeny Kliteynik u8 length, 741c349b413SYevgeny Kliteynik u32 data) 742c349b413SYevgeny Kliteynik { 743c349b413SYevgeny Kliteynik shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 744c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, action_id, DR_STE_V1_ACTION_ID_ADD); 745c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, destination_dw_offset, hw_field); 746c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, destination_left_shifter, shifter); 747c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, destination_length, length); 748c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, add_value, data); 749c349b413SYevgeny Kliteynik } 750c349b413SYevgeny Kliteynik 751c349b413SYevgeny Kliteynik static void dr_ste_v1_set_action_copy(u8 *d_action, 752c349b413SYevgeny Kliteynik u8 dst_hw_field, 753c349b413SYevgeny Kliteynik u8 dst_shifter, 754c349b413SYevgeny Kliteynik u8 dst_len, 755c349b413SYevgeny Kliteynik u8 src_hw_field, 756c349b413SYevgeny Kliteynik u8 src_shifter) 757c349b413SYevgeny Kliteynik { 758c349b413SYevgeny Kliteynik dst_shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 759c349b413SYevgeny Kliteynik src_shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 760c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, action_id, DR_STE_V1_ACTION_ID_COPY); 761c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, destination_dw_offset, dst_hw_field); 762c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, destination_left_shifter, dst_shifter); 763c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, destination_length, dst_len); 764c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, source_dw_offset, src_hw_field); 765c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, source_right_shifter, src_shifter); 766c349b413SYevgeny Kliteynik } 767c349b413SYevgeny Kliteynik 768c349b413SYevgeny Kliteynik #define DR_STE_DECAP_L3_ACTION_NUM 8 769c349b413SYevgeny Kliteynik #define DR_STE_L2_HDR_MAX_SZ 20 770c349b413SYevgeny Kliteynik 771c349b413SYevgeny Kliteynik static int dr_ste_v1_set_action_decap_l3_list(void *data, 772c349b413SYevgeny Kliteynik u32 data_sz, 773c349b413SYevgeny Kliteynik u8 *hw_action, 774c349b413SYevgeny Kliteynik u32 hw_action_sz, 775c349b413SYevgeny Kliteynik u16 *used_hw_action_num) 776c349b413SYevgeny Kliteynik { 777c349b413SYevgeny Kliteynik u8 padded_data[DR_STE_L2_HDR_MAX_SZ] = {}; 778c349b413SYevgeny Kliteynik void *data_ptr = padded_data; 779c349b413SYevgeny Kliteynik u16 used_actions = 0; 780c349b413SYevgeny Kliteynik u32 inline_data_sz; 781c349b413SYevgeny Kliteynik u32 i; 782c349b413SYevgeny Kliteynik 783c349b413SYevgeny Kliteynik if (hw_action_sz / DR_STE_ACTION_DOUBLE_SZ < DR_STE_DECAP_L3_ACTION_NUM) 784c349b413SYevgeny Kliteynik return -EINVAL; 785c349b413SYevgeny Kliteynik 786c349b413SYevgeny Kliteynik memcpy(padded_data, data, data_sz); 787c349b413SYevgeny Kliteynik 788c349b413SYevgeny Kliteynik /* Remove L2L3 outer headers */ 789c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, action_id, 790c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 791c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, decap, 1); 792c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, vni_to_cqe, 1); 793c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, end_anchor, 794c349b413SYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_IPV6_IPV4); 795c349b413SYevgeny Kliteynik hw_action += DR_STE_ACTION_DOUBLE_SZ; 796c349b413SYevgeny Kliteynik used_actions++; /* Remove and NOP are a single double action */ 797c349b413SYevgeny Kliteynik 798c349b413SYevgeny Kliteynik inline_data_sz = 799c349b413SYevgeny Kliteynik MLX5_FLD_SZ_BYTES(ste_double_action_insert_with_inline_v1, inline_data); 800c349b413SYevgeny Kliteynik 801c349b413SYevgeny Kliteynik /* Add the new header inline + 2 extra bytes */ 802c349b413SYevgeny Kliteynik for (i = 0; i < data_sz / inline_data_sz + 1; i++) { 803c349b413SYevgeny Kliteynik void *addr_inline; 804c349b413SYevgeny Kliteynik 805c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, hw_action, action_id, 806c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_INLINE); 807c349b413SYevgeny Kliteynik /* The hardware expects here offset to words (2 bytes) */ 808c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, hw_action, start_offset, 809c349b413SYevgeny Kliteynik i * 2); 810c349b413SYevgeny Kliteynik 811c349b413SYevgeny Kliteynik /* Copy bytes one by one to avoid endianness problem */ 812c349b413SYevgeny Kliteynik addr_inline = MLX5_ADDR_OF(ste_double_action_insert_with_inline_v1, 813c349b413SYevgeny Kliteynik hw_action, inline_data); 814c349b413SYevgeny Kliteynik memcpy(addr_inline, data_ptr, inline_data_sz); 815c349b413SYevgeny Kliteynik hw_action += DR_STE_ACTION_DOUBLE_SZ; 816c349b413SYevgeny Kliteynik data_ptr += inline_data_sz; 817c349b413SYevgeny Kliteynik used_actions++; 818c349b413SYevgeny Kliteynik } 819c349b413SYevgeny Kliteynik 820c349b413SYevgeny Kliteynik /* Remove 2 extra bytes */ 821c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, hw_action, action_id, 822c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE); 823c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, hw_action, start_offset, data_sz / 2); 824c349b413SYevgeny Kliteynik /* The hardware expects here size in words (2 bytes) */ 825c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, hw_action, remove_size, 1); 826c349b413SYevgeny Kliteynik used_actions++; 827c349b413SYevgeny Kliteynik 828c349b413SYevgeny Kliteynik *used_hw_action_num = used_actions; 829c349b413SYevgeny Kliteynik 830c349b413SYevgeny Kliteynik return 0; 831c349b413SYevgeny Kliteynik } 832c349b413SYevgeny Kliteynik 83310b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_dst_bit_mask(struct mlx5dr_match_param *value, 83410b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 83510b69418SYevgeny Kliteynik { 83610b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 83710b69418SYevgeny Kliteynik 83810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 83910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 84010b69418SYevgeny Kliteynik 84110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, smac_47_16, mask, smac_47_16); 84210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, smac_15_0, mask, smac_15_0); 84310b69418SYevgeny Kliteynik 84410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_vlan_id, mask, first_vid); 84510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_cfi, mask, first_cfi); 84610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_priority, mask, first_prio); 84710b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_src_dst_v1, bit_mask, l3_type, mask, ip_version); 84810b69418SYevgeny Kliteynik 84910b69418SYevgeny Kliteynik if (mask->cvlan_tag) { 85010b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, bit_mask, first_vlan_qualifier, -1); 85110b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 85210b69418SYevgeny Kliteynik } else if (mask->svlan_tag) { 85310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, bit_mask, first_vlan_qualifier, -1); 85410b69418SYevgeny Kliteynik mask->svlan_tag = 0; 85510b69418SYevgeny Kliteynik } 85610b69418SYevgeny Kliteynik } 85710b69418SYevgeny Kliteynik 85810b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_dst_tag(struct mlx5dr_match_param *value, 85910b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 86010b69418SYevgeny Kliteynik u8 *tag) 86110b69418SYevgeny Kliteynik { 86210b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 86310b69418SYevgeny Kliteynik 86410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, dmac_47_16, spec, dmac_47_16); 86510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, dmac_15_0, spec, dmac_15_0); 86610b69418SYevgeny Kliteynik 86710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, smac_47_16, spec, smac_47_16); 86810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, smac_15_0, spec, smac_15_0); 86910b69418SYevgeny Kliteynik 87010b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 87110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, l3_type, STE_IPV4); 87210b69418SYevgeny Kliteynik spec->ip_version = 0; 87310b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 87410b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, l3_type, STE_IPV6); 87510b69418SYevgeny Kliteynik spec->ip_version = 0; 87610b69418SYevgeny Kliteynik } else if (spec->ip_version) { 87710b69418SYevgeny Kliteynik return -EINVAL; 87810b69418SYevgeny Kliteynik } 87910b69418SYevgeny Kliteynik 88010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_vlan_id, spec, first_vid); 88110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_cfi, spec, first_cfi); 88210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_priority, spec, first_prio); 88310b69418SYevgeny Kliteynik 88410b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 88510b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 88610b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 88710b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 88810b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 88910b69418SYevgeny Kliteynik spec->svlan_tag = 0; 89010b69418SYevgeny Kliteynik } 89110b69418SYevgeny Kliteynik return 0; 89210b69418SYevgeny Kliteynik } 89310b69418SYevgeny Kliteynik 89410b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_dst_init(struct mlx5dr_ste_build *sb, 89510b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 89610b69418SYevgeny Kliteynik { 89710b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_dst_bit_mask(mask, sb->inner, sb->bit_mask); 89810b69418SYevgeny Kliteynik 89910b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2_SRC_DST, sb->inner); 90010b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 90110b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_src_dst_tag; 90210b69418SYevgeny Kliteynik } 90310b69418SYevgeny Kliteynik 90410b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv6_dst_tag(struct mlx5dr_match_param *value, 90510b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 90610b69418SYevgeny Kliteynik u8 *tag) 90710b69418SYevgeny Kliteynik { 90810b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 90910b69418SYevgeny Kliteynik 91010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_127_96, spec, dst_ip_127_96); 91110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_95_64, spec, dst_ip_95_64); 91210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_63_32, spec, dst_ip_63_32); 91310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_31_0, spec, dst_ip_31_0); 91410b69418SYevgeny Kliteynik 91510b69418SYevgeny Kliteynik return 0; 91610b69418SYevgeny Kliteynik } 91710b69418SYevgeny Kliteynik 91810b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv6_dst_init(struct mlx5dr_ste_build *sb, 91910b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 92010b69418SYevgeny Kliteynik { 92110b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv6_dst_tag(mask, sb, sb->bit_mask); 92210b69418SYevgeny Kliteynik 92310b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(IPV6_DES, sb->inner); 92410b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 92510b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv6_dst_tag; 92610b69418SYevgeny Kliteynik } 92710b69418SYevgeny Kliteynik 92810b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv6_src_tag(struct mlx5dr_match_param *value, 92910b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 93010b69418SYevgeny Kliteynik u8 *tag) 93110b69418SYevgeny Kliteynik { 93210b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 93310b69418SYevgeny Kliteynik 93410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_127_96, spec, src_ip_127_96); 93510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_95_64, spec, src_ip_95_64); 93610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_63_32, spec, src_ip_63_32); 93710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_31_0, spec, src_ip_31_0); 93810b69418SYevgeny Kliteynik 93910b69418SYevgeny Kliteynik return 0; 94010b69418SYevgeny Kliteynik } 94110b69418SYevgeny Kliteynik 94210b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv6_src_init(struct mlx5dr_ste_build *sb, 94310b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 94410b69418SYevgeny Kliteynik { 94510b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv6_src_tag(mask, sb, sb->bit_mask); 94610b69418SYevgeny Kliteynik 94710b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(IPV6_SRC, sb->inner); 94810b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 94910b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv6_src_tag; 95010b69418SYevgeny Kliteynik } 95110b69418SYevgeny Kliteynik 95210b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag(struct mlx5dr_match_param *value, 95310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 95410b69418SYevgeny Kliteynik u8 *tag) 95510b69418SYevgeny Kliteynik { 95610b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 95710b69418SYevgeny Kliteynik 95810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_address, spec, dst_ip_31_0); 95910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_address, spec, src_ip_31_0); 96010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_port, spec, tcp_dport); 96110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_port, spec, udp_dport); 96210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_port, spec, tcp_sport); 96310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_port, spec, udp_sport); 96410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, protocol, spec, ip_protocol); 96510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, fragmented, spec, frag); 96610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, dscp, spec, ip_dscp); 96710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, ecn, spec, ip_ecn); 96810b69418SYevgeny Kliteynik 96910b69418SYevgeny Kliteynik if (spec->tcp_flags) { 97010b69418SYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l3_ipv4_5_tuple_v1, tag, spec); 97110b69418SYevgeny Kliteynik spec->tcp_flags = 0; 97210b69418SYevgeny Kliteynik } 97310b69418SYevgeny Kliteynik 97410b69418SYevgeny Kliteynik return 0; 97510b69418SYevgeny Kliteynik } 97610b69418SYevgeny Kliteynik 97710b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv4_5_tuple_init(struct mlx5dr_ste_build *sb, 97810b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 97910b69418SYevgeny Kliteynik { 98010b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag(mask, sb, sb->bit_mask); 98110b69418SYevgeny Kliteynik 98210b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL3_IPV4_5_TUPLE, sb->inner); 98310b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 98410b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag; 98510b69418SYevgeny Kliteynik } 98610b69418SYevgeny Kliteynik 98710b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(struct mlx5dr_match_param *value, 98810b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 98910b69418SYevgeny Kliteynik { 99010b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 99110b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 99210b69418SYevgeny Kliteynik 99310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_vlan_id, mask, first_vid); 99410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_cfi, mask, first_cfi); 99510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_priority, mask, first_prio); 99610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, ip_fragmented, mask, frag); // ? 99710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, l3_ethertype, mask, ethertype); // ? 99810b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_src_v1, bit_mask, l3_type, mask, ip_version); 99910b69418SYevgeny Kliteynik 100010b69418SYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 100110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, first_vlan_qualifier, -1); 100210b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 100310b69418SYevgeny Kliteynik mask->svlan_tag = 0; 100410b69418SYevgeny Kliteynik } 100510b69418SYevgeny Kliteynik 100610b69418SYevgeny Kliteynik if (inner) { 100710b69418SYevgeny Kliteynik if (misc_mask->inner_second_cvlan_tag || 100810b69418SYevgeny Kliteynik misc_mask->inner_second_svlan_tag) { 100910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, second_vlan_qualifier, -1); 101010b69418SYevgeny Kliteynik misc_mask->inner_second_cvlan_tag = 0; 101110b69418SYevgeny Kliteynik misc_mask->inner_second_svlan_tag = 0; 101210b69418SYevgeny Kliteynik } 101310b69418SYevgeny Kliteynik 101410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 101510b69418SYevgeny Kliteynik second_vlan_id, misc_mask, inner_second_vid); 101610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 101710b69418SYevgeny Kliteynik second_cfi, misc_mask, inner_second_cfi); 101810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 101910b69418SYevgeny Kliteynik second_priority, misc_mask, inner_second_prio); 102010b69418SYevgeny Kliteynik } else { 102110b69418SYevgeny Kliteynik if (misc_mask->outer_second_cvlan_tag || 102210b69418SYevgeny Kliteynik misc_mask->outer_second_svlan_tag) { 102310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, second_vlan_qualifier, -1); 102410b69418SYevgeny Kliteynik misc_mask->outer_second_cvlan_tag = 0; 102510b69418SYevgeny Kliteynik misc_mask->outer_second_svlan_tag = 0; 102610b69418SYevgeny Kliteynik } 102710b69418SYevgeny Kliteynik 102810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 102910b69418SYevgeny Kliteynik second_vlan_id, misc_mask, outer_second_vid); 103010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 103110b69418SYevgeny Kliteynik second_cfi, misc_mask, outer_second_cfi); 103210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 103310b69418SYevgeny Kliteynik second_priority, misc_mask, outer_second_prio); 103410b69418SYevgeny Kliteynik } 103510b69418SYevgeny Kliteynik } 103610b69418SYevgeny Kliteynik 103710b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_or_dst_tag(struct mlx5dr_match_param *value, 103810b69418SYevgeny Kliteynik bool inner, u8 *tag) 103910b69418SYevgeny Kliteynik { 104010b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = inner ? &value->inner : &value->outer; 104110b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_spec = &value->misc; 104210b69418SYevgeny Kliteynik 104310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_vlan_id, spec, first_vid); 104410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_cfi, spec, first_cfi); 104510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_priority, spec, first_prio); 104610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, ip_fragmented, spec, frag); 104710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, l3_ethertype, spec, ethertype); 104810b69418SYevgeny Kliteynik 104910b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 105010b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, l3_type, STE_IPV4); 105110b69418SYevgeny Kliteynik spec->ip_version = 0; 105210b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 105310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, l3_type, STE_IPV6); 105410b69418SYevgeny Kliteynik spec->ip_version = 0; 105510b69418SYevgeny Kliteynik } else if (spec->ip_version) { 105610b69418SYevgeny Kliteynik return -EINVAL; 105710b69418SYevgeny Kliteynik } 105810b69418SYevgeny Kliteynik 105910b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 106010b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 106110b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 106210b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 106310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 106410b69418SYevgeny Kliteynik spec->svlan_tag = 0; 106510b69418SYevgeny Kliteynik } 106610b69418SYevgeny Kliteynik 106710b69418SYevgeny Kliteynik if (inner) { 106810b69418SYevgeny Kliteynik if (misc_spec->inner_second_cvlan_tag) { 106910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_CVLAN); 107010b69418SYevgeny Kliteynik misc_spec->inner_second_cvlan_tag = 0; 107110b69418SYevgeny Kliteynik } else if (misc_spec->inner_second_svlan_tag) { 107210b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_SVLAN); 107310b69418SYevgeny Kliteynik misc_spec->inner_second_svlan_tag = 0; 107410b69418SYevgeny Kliteynik } 107510b69418SYevgeny Kliteynik 107610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_vlan_id, misc_spec, inner_second_vid); 107710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_cfi, misc_spec, inner_second_cfi); 107810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_priority, misc_spec, inner_second_prio); 107910b69418SYevgeny Kliteynik } else { 108010b69418SYevgeny Kliteynik if (misc_spec->outer_second_cvlan_tag) { 108110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_CVLAN); 108210b69418SYevgeny Kliteynik misc_spec->outer_second_cvlan_tag = 0; 108310b69418SYevgeny Kliteynik } else if (misc_spec->outer_second_svlan_tag) { 108410b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_SVLAN); 108510b69418SYevgeny Kliteynik misc_spec->outer_second_svlan_tag = 0; 108610b69418SYevgeny Kliteynik } 108710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_vlan_id, misc_spec, outer_second_vid); 108810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_cfi, misc_spec, outer_second_cfi); 108910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_priority, misc_spec, outer_second_prio); 109010b69418SYevgeny Kliteynik } 109110b69418SYevgeny Kliteynik 109210b69418SYevgeny Kliteynik return 0; 109310b69418SYevgeny Kliteynik } 109410b69418SYevgeny Kliteynik 109510b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_bit_mask(struct mlx5dr_match_param *value, 109610b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 109710b69418SYevgeny Kliteynik { 109810b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 109910b69418SYevgeny Kliteynik 110010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, smac_47_16, mask, smac_47_16); 110110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, smac_15_0, mask, smac_15_0); 110210b69418SYevgeny Kliteynik 110310b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 110410b69418SYevgeny Kliteynik } 110510b69418SYevgeny Kliteynik 110610b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_tag(struct mlx5dr_match_param *value, 110710b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 110810b69418SYevgeny Kliteynik u8 *tag) 110910b69418SYevgeny Kliteynik { 111010b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 111110b69418SYevgeny Kliteynik 111210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, smac_47_16, spec, smac_47_16); 111310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, smac_15_0, spec, smac_15_0); 111410b69418SYevgeny Kliteynik 111510b69418SYevgeny Kliteynik return dr_ste_v1_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 111610b69418SYevgeny Kliteynik } 111710b69418SYevgeny Kliteynik 111810b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_init(struct mlx5dr_ste_build *sb, 111910b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 112010b69418SYevgeny Kliteynik { 112110b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_bit_mask(mask, sb->inner, sb->bit_mask); 112210b69418SYevgeny Kliteynik 112310b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2_SRC, sb->inner); 112410b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 112510b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_src_tag; 112610b69418SYevgeny Kliteynik } 112710b69418SYevgeny Kliteynik 112810b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_dst_bit_mask(struct mlx5dr_match_param *value, 112910b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 113010b69418SYevgeny Kliteynik { 113110b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 113210b69418SYevgeny Kliteynik 113310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 113410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 113510b69418SYevgeny Kliteynik 113610b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 113710b69418SYevgeny Kliteynik } 113810b69418SYevgeny Kliteynik 113910b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_dst_tag(struct mlx5dr_match_param *value, 114010b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 114110b69418SYevgeny Kliteynik u8 *tag) 114210b69418SYevgeny Kliteynik { 114310b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 114410b69418SYevgeny Kliteynik 114510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, tag, dmac_47_16, spec, dmac_47_16); 114610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, tag, dmac_15_0, spec, dmac_15_0); 114710b69418SYevgeny Kliteynik 114810b69418SYevgeny Kliteynik return dr_ste_v1_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 114910b69418SYevgeny Kliteynik } 115010b69418SYevgeny Kliteynik 115110b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_dst_init(struct mlx5dr_ste_build *sb, 115210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 115310b69418SYevgeny Kliteynik { 115410b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_dst_bit_mask(mask, sb->inner, sb->bit_mask); 115510b69418SYevgeny Kliteynik 115610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2, sb->inner); 115710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 115810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_dst_tag; 115910b69418SYevgeny Kliteynik } 116010b69418SYevgeny Kliteynik 116110b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_tnl_bit_mask(struct mlx5dr_match_param *value, 116210b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 116310b69418SYevgeny Kliteynik { 116410b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 116510b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 116610b69418SYevgeny Kliteynik 116710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 116810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 116910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_vlan_id, mask, first_vid); 117010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_cfi, mask, first_cfi); 117110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_priority, mask, first_prio); 117210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, ip_fragmented, mask, frag); 117310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, l3_ethertype, mask, ethertype); 117410b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_tnl_v1, bit_mask, l3_type, mask, ip_version); 117510b69418SYevgeny Kliteynik 117610b69418SYevgeny Kliteynik if (misc->vxlan_vni) { 117710b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, bit_mask, 117810b69418SYevgeny Kliteynik l2_tunneling_network_id, (misc->vxlan_vni << 8)); 117910b69418SYevgeny Kliteynik misc->vxlan_vni = 0; 118010b69418SYevgeny Kliteynik } 118110b69418SYevgeny Kliteynik 118210b69418SYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 118310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, bit_mask, first_vlan_qualifier, -1); 118410b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 118510b69418SYevgeny Kliteynik mask->svlan_tag = 0; 118610b69418SYevgeny Kliteynik } 118710b69418SYevgeny Kliteynik } 118810b69418SYevgeny Kliteynik 118910b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_tnl_tag(struct mlx5dr_match_param *value, 119010b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 119110b69418SYevgeny Kliteynik u8 *tag) 119210b69418SYevgeny Kliteynik { 119310b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 119410b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 119510b69418SYevgeny Kliteynik 119610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, dmac_47_16, spec, dmac_47_16); 119710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, dmac_15_0, spec, dmac_15_0); 119810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_vlan_id, spec, first_vid); 119910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_cfi, spec, first_cfi); 120010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, ip_fragmented, spec, frag); 120110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_priority, spec, first_prio); 120210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, l3_ethertype, spec, ethertype); 120310b69418SYevgeny Kliteynik 120410b69418SYevgeny Kliteynik if (misc->vxlan_vni) { 120510b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l2_tunneling_network_id, 120610b69418SYevgeny Kliteynik (misc->vxlan_vni << 8)); 120710b69418SYevgeny Kliteynik misc->vxlan_vni = 0; 120810b69418SYevgeny Kliteynik } 120910b69418SYevgeny Kliteynik 121010b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 121110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 121210b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 121310b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 121410b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 121510b69418SYevgeny Kliteynik spec->svlan_tag = 0; 121610b69418SYevgeny Kliteynik } 121710b69418SYevgeny Kliteynik 121810b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 121910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l3_type, STE_IPV4); 122010b69418SYevgeny Kliteynik spec->ip_version = 0; 122110b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 122210b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l3_type, STE_IPV6); 122310b69418SYevgeny Kliteynik spec->ip_version = 0; 122410b69418SYevgeny Kliteynik } else if (spec->ip_version) { 122510b69418SYevgeny Kliteynik return -EINVAL; 122610b69418SYevgeny Kliteynik } 122710b69418SYevgeny Kliteynik 122810b69418SYevgeny Kliteynik return 0; 122910b69418SYevgeny Kliteynik } 123010b69418SYevgeny Kliteynik 123110b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_tnl_init(struct mlx5dr_ste_build *sb, 123210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 123310b69418SYevgeny Kliteynik { 123410b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_tnl_bit_mask(mask, sb->inner, sb->bit_mask); 123510b69418SYevgeny Kliteynik 123610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL2_TNL; 123710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 123810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_tnl_tag; 123910b69418SYevgeny Kliteynik } 124010b69418SYevgeny Kliteynik 124110b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv4_misc_tag(struct mlx5dr_match_param *value, 124210b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 124310b69418SYevgeny Kliteynik u8 *tag) 124410b69418SYevgeny Kliteynik { 124510b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 124610b69418SYevgeny Kliteynik 124710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_misc_v1, tag, time_to_live, spec, ttl_hoplimit); 124810b69418SYevgeny Kliteynik 124910b69418SYevgeny Kliteynik return 0; 125010b69418SYevgeny Kliteynik } 125110b69418SYevgeny Kliteynik 125210b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv4_misc_init(struct mlx5dr_ste_build *sb, 125310b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 125410b69418SYevgeny Kliteynik { 125510b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv4_misc_tag(mask, sb, sb->bit_mask); 125610b69418SYevgeny Kliteynik 125710b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL3_IPV4_MISC, sb->inner); 125810b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 125910b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv4_misc_tag; 126010b69418SYevgeny Kliteynik } 126110b69418SYevgeny Kliteynik 126210b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_ipv6_l3_l4_tag(struct mlx5dr_match_param *value, 126310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 126410b69418SYevgeny Kliteynik u8 *tag) 126510b69418SYevgeny Kliteynik { 126610b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 126710b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 126810b69418SYevgeny Kliteynik 126910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dst_port, spec, tcp_dport); 127010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, src_port, spec, tcp_sport); 127110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dst_port, spec, udp_dport); 127210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, src_port, spec, udp_sport); 127310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, protocol, spec, ip_protocol); 127410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, fragmented, spec, frag); 127510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dscp, spec, ip_dscp); 127610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, ecn, spec, ip_ecn); 127710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, ipv6_hop_limit, spec, ttl_hoplimit); 127810b69418SYevgeny Kliteynik 127910b69418SYevgeny Kliteynik if (sb->inner) 128010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, flow_label, misc, inner_ipv6_flow_label); 128110b69418SYevgeny Kliteynik else 128210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, flow_label, misc, outer_ipv6_flow_label); 128310b69418SYevgeny Kliteynik 128410b69418SYevgeny Kliteynik if (spec->tcp_flags) { 128510b69418SYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l4_v1, tag, spec); 128610b69418SYevgeny Kliteynik spec->tcp_flags = 0; 128710b69418SYevgeny Kliteynik } 128810b69418SYevgeny Kliteynik 128910b69418SYevgeny Kliteynik return 0; 129010b69418SYevgeny Kliteynik } 129110b69418SYevgeny Kliteynik 129210b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_ipv6_l3_l4_init(struct mlx5dr_ste_build *sb, 129310b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 129410b69418SYevgeny Kliteynik { 129510b69418SYevgeny Kliteynik dr_ste_v1_build_eth_ipv6_l3_l4_tag(mask, sb, sb->bit_mask); 129610b69418SYevgeny Kliteynik 129710b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL4, sb->inner); 129810b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 129910b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_ipv6_l3_l4_tag; 130010b69418SYevgeny Kliteynik } 130110b69418SYevgeny Kliteynik 130210b69418SYevgeny Kliteynik static int dr_ste_v1_build_mpls_tag(struct mlx5dr_match_param *value, 130310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 130410b69418SYevgeny Kliteynik u8 *tag) 130510b69418SYevgeny Kliteynik { 130610b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 130710b69418SYevgeny Kliteynik 130810b69418SYevgeny Kliteynik if (sb->inner) 130910b69418SYevgeny Kliteynik DR_STE_SET_MPLS(mpls_v1, misc2, inner, tag); 131010b69418SYevgeny Kliteynik else 131110b69418SYevgeny Kliteynik DR_STE_SET_MPLS(mpls_v1, misc2, outer, tag); 131210b69418SYevgeny Kliteynik 131310b69418SYevgeny Kliteynik return 0; 131410b69418SYevgeny Kliteynik } 131510b69418SYevgeny Kliteynik 131610b69418SYevgeny Kliteynik static void dr_ste_v1_build_mpls_init(struct mlx5dr_ste_build *sb, 131710b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 131810b69418SYevgeny Kliteynik { 131910b69418SYevgeny Kliteynik dr_ste_v1_build_mpls_tag(mask, sb, sb->bit_mask); 132010b69418SYevgeny Kliteynik 132110b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(MPLS, sb->inner); 132210b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 132310b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_mpls_tag; 132410b69418SYevgeny Kliteynik } 132510b69418SYevgeny Kliteynik 132610b69418SYevgeny Kliteynik static int dr_ste_v1_build_tnl_gre_tag(struct mlx5dr_match_param *value, 132710b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 132810b69418SYevgeny Kliteynik u8 *tag) 132910b69418SYevgeny Kliteynik { 133010b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 133110b69418SYevgeny Kliteynik 133210b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_protocol, misc, gre_protocol); 133310b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_k_present, misc, gre_k_present); 133410b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_key_h, misc, gre_key_h); 133510b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_key_l, misc, gre_key_l); 133610b69418SYevgeny Kliteynik 133710b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_c_present, misc, gre_c_present); 133810b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_s_present, misc, gre_s_present); 133910b69418SYevgeny Kliteynik 134010b69418SYevgeny Kliteynik return 0; 134110b69418SYevgeny Kliteynik } 134210b69418SYevgeny Kliteynik 134310b69418SYevgeny Kliteynik static void dr_ste_v1_build_tnl_gre_init(struct mlx5dr_ste_build *sb, 134410b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 134510b69418SYevgeny Kliteynik { 134610b69418SYevgeny Kliteynik dr_ste_v1_build_tnl_gre_tag(mask, sb, sb->bit_mask); 134710b69418SYevgeny Kliteynik 134810b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_GRE; 134910b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 135010b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_gre_tag; 135110b69418SYevgeny Kliteynik } 135210b69418SYevgeny Kliteynik 135310b69418SYevgeny Kliteynik static int dr_ste_v1_build_tnl_mpls_tag(struct mlx5dr_match_param *value, 135410b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 135510b69418SYevgeny Kliteynik u8 *tag) 135610b69418SYevgeny Kliteynik { 135710b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 135810b69418SYevgeny Kliteynik 135910b69418SYevgeny Kliteynik if (DR_STE_IS_OUTER_MPLS_OVER_GRE_SET(misc2)) { 136010b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_label, 136110b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_label); 136210b69418SYevgeny Kliteynik 136310b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_exp, 136410b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_exp); 136510b69418SYevgeny Kliteynik 136610b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_s_bos, 136710b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_s_bos); 136810b69418SYevgeny Kliteynik 136910b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_ttl, 137010b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_ttl); 137110b69418SYevgeny Kliteynik } else { 137210b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_label, 137310b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_label); 137410b69418SYevgeny Kliteynik 137510b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_exp, 137610b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_exp); 137710b69418SYevgeny Kliteynik 137810b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_s_bos, 137910b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_s_bos); 138010b69418SYevgeny Kliteynik 138110b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_ttl, 138210b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_ttl); 138310b69418SYevgeny Kliteynik } 138410b69418SYevgeny Kliteynik 138510b69418SYevgeny Kliteynik return 0; 138610b69418SYevgeny Kliteynik } 138710b69418SYevgeny Kliteynik 138810b69418SYevgeny Kliteynik static void dr_ste_v1_build_tnl_mpls_init(struct mlx5dr_ste_build *sb, 138910b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 139010b69418SYevgeny Kliteynik { 139110b69418SYevgeny Kliteynik dr_ste_v1_build_tnl_mpls_tag(mask, sb, sb->bit_mask); 139210b69418SYevgeny Kliteynik 139310b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_MPLS_I; 139410b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 139510b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_mpls_tag; 139610b69418SYevgeny Kliteynik } 139710b69418SYevgeny Kliteynik 139835ba005dSYevgeny Kliteynik static int dr_ste_v1_build_tnl_mpls_over_udp_tag(struct mlx5dr_match_param *value, 139935ba005dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 140035ba005dSYevgeny Kliteynik u8 *tag) 140135ba005dSYevgeny Kliteynik { 140235ba005dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 140335ba005dSYevgeny Kliteynik u8 *parser_ptr; 140435ba005dSYevgeny Kliteynik u8 parser_id; 140535ba005dSYevgeny Kliteynik u32 mpls_hdr; 140635ba005dSYevgeny Kliteynik 140735ba005dSYevgeny Kliteynik mpls_hdr = misc2->outer_first_mpls_over_udp_label << HDR_MPLS_OFFSET_LABEL; 140835ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_udp_label = 0; 140935ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_udp_exp << HDR_MPLS_OFFSET_EXP; 141035ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_udp_exp = 0; 141135ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_udp_s_bos << HDR_MPLS_OFFSET_S_BOS; 141235ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_udp_s_bos = 0; 141335ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_udp_ttl << HDR_MPLS_OFFSET_TTL; 141435ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_udp_ttl = 0; 141535ba005dSYevgeny Kliteynik 141635ba005dSYevgeny Kliteynik parser_id = sb->caps->flex_parser_id_mpls_over_udp; 141735ba005dSYevgeny Kliteynik parser_ptr = dr_ste_calc_flex_parser_offset(tag, parser_id); 141835ba005dSYevgeny Kliteynik *(__be32 *)parser_ptr = cpu_to_be32(mpls_hdr); 141935ba005dSYevgeny Kliteynik 142035ba005dSYevgeny Kliteynik return 0; 142135ba005dSYevgeny Kliteynik } 142235ba005dSYevgeny Kliteynik 142335ba005dSYevgeny Kliteynik static void dr_ste_v1_build_tnl_mpls_over_udp_init(struct mlx5dr_ste_build *sb, 142435ba005dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 142535ba005dSYevgeny Kliteynik { 142635ba005dSYevgeny Kliteynik dr_ste_v1_build_tnl_mpls_over_udp_tag(mask, sb, sb->bit_mask); 142735ba005dSYevgeny Kliteynik 142835ba005dSYevgeny Kliteynik /* STEs with lookup type FLEX_PARSER_{0/1} includes 142935ba005dSYevgeny Kliteynik * flex parsers_{0-3}/{4-7} respectively. 143035ba005dSYevgeny Kliteynik */ 143135ba005dSYevgeny Kliteynik sb->lu_type = sb->caps->flex_parser_id_mpls_over_udp > DR_STE_MAX_FLEX_0_ID ? 143235ba005dSYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 : 143335ba005dSYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 143435ba005dSYevgeny Kliteynik 143535ba005dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 143635ba005dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_mpls_over_udp_tag; 143735ba005dSYevgeny Kliteynik } 143835ba005dSYevgeny Kliteynik 143935ba005dSYevgeny Kliteynik static int dr_ste_v1_build_tnl_mpls_over_gre_tag(struct mlx5dr_match_param *value, 144035ba005dSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 144135ba005dSYevgeny Kliteynik u8 *tag) 144235ba005dSYevgeny Kliteynik { 144335ba005dSYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 144435ba005dSYevgeny Kliteynik u8 *parser_ptr; 144535ba005dSYevgeny Kliteynik u8 parser_id; 144635ba005dSYevgeny Kliteynik u32 mpls_hdr; 144735ba005dSYevgeny Kliteynik 144835ba005dSYevgeny Kliteynik mpls_hdr = misc2->outer_first_mpls_over_gre_label << HDR_MPLS_OFFSET_LABEL; 144935ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_gre_label = 0; 145035ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_gre_exp << HDR_MPLS_OFFSET_EXP; 145135ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_gre_exp = 0; 145235ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_gre_s_bos << HDR_MPLS_OFFSET_S_BOS; 145335ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_gre_s_bos = 0; 145435ba005dSYevgeny Kliteynik mpls_hdr |= misc2->outer_first_mpls_over_gre_ttl << HDR_MPLS_OFFSET_TTL; 145535ba005dSYevgeny Kliteynik misc2->outer_first_mpls_over_gre_ttl = 0; 145635ba005dSYevgeny Kliteynik 145735ba005dSYevgeny Kliteynik parser_id = sb->caps->flex_parser_id_mpls_over_gre; 145835ba005dSYevgeny Kliteynik parser_ptr = dr_ste_calc_flex_parser_offset(tag, parser_id); 145935ba005dSYevgeny Kliteynik *(__be32 *)parser_ptr = cpu_to_be32(mpls_hdr); 146035ba005dSYevgeny Kliteynik 146135ba005dSYevgeny Kliteynik return 0; 146235ba005dSYevgeny Kliteynik } 146335ba005dSYevgeny Kliteynik 146435ba005dSYevgeny Kliteynik static void dr_ste_v1_build_tnl_mpls_over_gre_init(struct mlx5dr_ste_build *sb, 146535ba005dSYevgeny Kliteynik struct mlx5dr_match_param *mask) 146635ba005dSYevgeny Kliteynik { 146735ba005dSYevgeny Kliteynik dr_ste_v1_build_tnl_mpls_over_gre_tag(mask, sb, sb->bit_mask); 146835ba005dSYevgeny Kliteynik 146935ba005dSYevgeny Kliteynik /* STEs with lookup type FLEX_PARSER_{0/1} includes 147035ba005dSYevgeny Kliteynik * flex parsers_{0-3}/{4-7} respectively. 147135ba005dSYevgeny Kliteynik */ 147235ba005dSYevgeny Kliteynik sb->lu_type = sb->caps->flex_parser_id_mpls_over_gre > DR_STE_MAX_FLEX_0_ID ? 147335ba005dSYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 : 147435ba005dSYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 147535ba005dSYevgeny Kliteynik 147635ba005dSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 147735ba005dSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_mpls_over_gre_tag; 147835ba005dSYevgeny Kliteynik } 147935ba005dSYevgeny Kliteynik 148010b69418SYevgeny Kliteynik static int dr_ste_v1_build_icmp_tag(struct mlx5dr_match_param *value, 148110b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 148210b69418SYevgeny Kliteynik u8 *tag) 148310b69418SYevgeny Kliteynik { 148410b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 148510b69418SYevgeny Kliteynik bool is_ipv4 = DR_MASK_IS_ICMPV4_SET(misc3); 148610b69418SYevgeny Kliteynik u32 *icmp_header_data; 148710b69418SYevgeny Kliteynik u8 *icmp_type; 148810b69418SYevgeny Kliteynik u8 *icmp_code; 148910b69418SYevgeny Kliteynik 149010b69418SYevgeny Kliteynik if (is_ipv4) { 149110b69418SYevgeny Kliteynik icmp_header_data = &misc3->icmpv4_header_data; 149210b69418SYevgeny Kliteynik icmp_type = &misc3->icmpv4_type; 149310b69418SYevgeny Kliteynik icmp_code = &misc3->icmpv4_code; 149410b69418SYevgeny Kliteynik } else { 149510b69418SYevgeny Kliteynik icmp_header_data = &misc3->icmpv6_header_data; 149610b69418SYevgeny Kliteynik icmp_type = &misc3->icmpv6_type; 149710b69418SYevgeny Kliteynik icmp_code = &misc3->icmpv6_code; 149810b69418SYevgeny Kliteynik } 149910b69418SYevgeny Kliteynik 150010b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_header_data, *icmp_header_data); 150110b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_type, *icmp_type); 150210b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_code, *icmp_code); 150310b69418SYevgeny Kliteynik 150410b69418SYevgeny Kliteynik *icmp_header_data = 0; 150510b69418SYevgeny Kliteynik *icmp_type = 0; 150610b69418SYevgeny Kliteynik *icmp_code = 0; 150710b69418SYevgeny Kliteynik 150810b69418SYevgeny Kliteynik return 0; 150910b69418SYevgeny Kliteynik } 151010b69418SYevgeny Kliteynik 15114923938dSYevgeny Kliteynik static void dr_ste_v1_build_icmp_init(struct mlx5dr_ste_build *sb, 151210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 151310b69418SYevgeny Kliteynik { 151410b69418SYevgeny Kliteynik dr_ste_v1_build_icmp_tag(mask, sb, sb->bit_mask); 151510b69418SYevgeny Kliteynik 151610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL4_MISC_O; 151710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 151810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_icmp_tag; 151910b69418SYevgeny Kliteynik } 152010b69418SYevgeny Kliteynik 152110b69418SYevgeny Kliteynik static int dr_ste_v1_build_general_purpose_tag(struct mlx5dr_match_param *value, 152210b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 152310b69418SYevgeny Kliteynik u8 *tag) 152410b69418SYevgeny Kliteynik { 152510b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 152610b69418SYevgeny Kliteynik 152710b69418SYevgeny Kliteynik DR_STE_SET_TAG(general_purpose, tag, general_purpose_lookup_field, 152810b69418SYevgeny Kliteynik misc2, metadata_reg_a); 152910b69418SYevgeny Kliteynik 153010b69418SYevgeny Kliteynik return 0; 153110b69418SYevgeny Kliteynik } 153210b69418SYevgeny Kliteynik 153310b69418SYevgeny Kliteynik static void dr_ste_v1_build_general_purpose_init(struct mlx5dr_ste_build *sb, 153410b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 153510b69418SYevgeny Kliteynik { 153610b69418SYevgeny Kliteynik dr_ste_v1_build_general_purpose_tag(mask, sb, sb->bit_mask); 153710b69418SYevgeny Kliteynik 153810b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_GENERAL_PURPOSE; 153910b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 154010b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_general_purpose_tag; 154110b69418SYevgeny Kliteynik } 154210b69418SYevgeny Kliteynik 154310b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l4_misc_tag(struct mlx5dr_match_param *value, 154410b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 154510b69418SYevgeny Kliteynik u8 *tag) 154610b69418SYevgeny Kliteynik { 154710b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 154810b69418SYevgeny Kliteynik 154910b69418SYevgeny Kliteynik if (sb->inner) { 155010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, seq_num, misc3, inner_tcp_seq_num); 155110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, ack_num, misc3, inner_tcp_ack_num); 155210b69418SYevgeny Kliteynik } else { 155310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, seq_num, misc3, outer_tcp_seq_num); 155410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, ack_num, misc3, outer_tcp_ack_num); 155510b69418SYevgeny Kliteynik } 155610b69418SYevgeny Kliteynik 155710b69418SYevgeny Kliteynik return 0; 155810b69418SYevgeny Kliteynik } 155910b69418SYevgeny Kliteynik 156010b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l4_misc_init(struct mlx5dr_ste_build *sb, 156110b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 156210b69418SYevgeny Kliteynik { 156310b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l4_misc_tag(mask, sb, sb->bit_mask); 156410b69418SYevgeny Kliteynik 156510b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL4_MISC_O; 156610b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 156710b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l4_misc_tag; 156810b69418SYevgeny Kliteynik } 156910b69418SYevgeny Kliteynik 157010b69418SYevgeny Kliteynik static int 157110b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag(struct mlx5dr_match_param *value, 157210b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 157310b69418SYevgeny Kliteynik u8 *tag) 157410b69418SYevgeny Kliteynik { 157510b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 157610b69418SYevgeny Kliteynik 157710b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 157810b69418SYevgeny Kliteynik outer_vxlan_gpe_flags, misc3, 157910b69418SYevgeny Kliteynik outer_vxlan_gpe_flags); 158010b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 158110b69418SYevgeny Kliteynik outer_vxlan_gpe_next_protocol, misc3, 158210b69418SYevgeny Kliteynik outer_vxlan_gpe_next_protocol); 158310b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 158410b69418SYevgeny Kliteynik outer_vxlan_gpe_vni, misc3, 158510b69418SYevgeny Kliteynik outer_vxlan_gpe_vni); 158610b69418SYevgeny Kliteynik 158710b69418SYevgeny Kliteynik return 0; 158810b69418SYevgeny Kliteynik } 158910b69418SYevgeny Kliteynik 159010b69418SYevgeny Kliteynik static void 159110b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_init(struct mlx5dr_ste_build *sb, 159210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 159310b69418SYevgeny Kliteynik { 159410b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag(mask, sb, sb->bit_mask); 159510b69418SYevgeny Kliteynik 159610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 159710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 159810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag; 159910b69418SYevgeny Kliteynik } 160010b69418SYevgeny Kliteynik 160110b69418SYevgeny Kliteynik static int 160210b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tag(struct mlx5dr_match_param *value, 160310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 160410b69418SYevgeny Kliteynik u8 *tag) 160510b69418SYevgeny Kliteynik { 160610b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 160710b69418SYevgeny Kliteynik 160810b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 160910b69418SYevgeny Kliteynik geneve_protocol_type, misc, geneve_protocol_type); 161010b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 161110b69418SYevgeny Kliteynik geneve_oam, misc, geneve_oam); 161210b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 161310b69418SYevgeny Kliteynik geneve_opt_len, misc, geneve_opt_len); 161410b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 161510b69418SYevgeny Kliteynik geneve_vni, misc, geneve_vni); 161610b69418SYevgeny Kliteynik 161710b69418SYevgeny Kliteynik return 0; 161810b69418SYevgeny Kliteynik } 161910b69418SYevgeny Kliteynik 162010b69418SYevgeny Kliteynik static void 162110b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_init(struct mlx5dr_ste_build *sb, 162210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 162310b69418SYevgeny Kliteynik { 162410b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tag(mask, sb, sb->bit_mask); 162510b69418SYevgeny Kliteynik 162610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 162710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 162810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_geneve_tag; 162910b69418SYevgeny Kliteynik } 163010b69418SYevgeny Kliteynik 163110b69418SYevgeny Kliteynik static int dr_ste_v1_build_register_0_tag(struct mlx5dr_match_param *value, 163210b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 163310b69418SYevgeny Kliteynik u8 *tag) 163410b69418SYevgeny Kliteynik { 163510b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 163610b69418SYevgeny Kliteynik 163710b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_h, misc2, metadata_reg_c_0); 163810b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_l, misc2, metadata_reg_c_1); 163910b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_h, misc2, metadata_reg_c_2); 164010b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_l, misc2, metadata_reg_c_3); 164110b69418SYevgeny Kliteynik 164210b69418SYevgeny Kliteynik return 0; 164310b69418SYevgeny Kliteynik } 164410b69418SYevgeny Kliteynik 164510b69418SYevgeny Kliteynik static void dr_ste_v1_build_register_0_init(struct mlx5dr_ste_build *sb, 164610b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 164710b69418SYevgeny Kliteynik { 164810b69418SYevgeny Kliteynik dr_ste_v1_build_register_0_tag(mask, sb, sb->bit_mask); 164910b69418SYevgeny Kliteynik 165010b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_STEERING_REGISTERS_0; 165110b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 165210b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_register_0_tag; 165310b69418SYevgeny Kliteynik } 165410b69418SYevgeny Kliteynik 165510b69418SYevgeny Kliteynik static int dr_ste_v1_build_register_1_tag(struct mlx5dr_match_param *value, 165610b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 165710b69418SYevgeny Kliteynik u8 *tag) 165810b69418SYevgeny Kliteynik { 165910b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 166010b69418SYevgeny Kliteynik 166110b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_h, misc2, metadata_reg_c_4); 166210b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_l, misc2, metadata_reg_c_5); 166310b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_h, misc2, metadata_reg_c_6); 166410b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_l, misc2, metadata_reg_c_7); 166510b69418SYevgeny Kliteynik 166610b69418SYevgeny Kliteynik return 0; 166710b69418SYevgeny Kliteynik } 166810b69418SYevgeny Kliteynik 166910b69418SYevgeny Kliteynik static void dr_ste_v1_build_register_1_init(struct mlx5dr_ste_build *sb, 167010b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 167110b69418SYevgeny Kliteynik { 167210b69418SYevgeny Kliteynik dr_ste_v1_build_register_1_tag(mask, sb, sb->bit_mask); 167310b69418SYevgeny Kliteynik 167410b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_STEERING_REGISTERS_1; 167510b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 167610b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_register_1_tag; 167710b69418SYevgeny Kliteynik } 167810b69418SYevgeny Kliteynik 167910b69418SYevgeny Kliteynik static void dr_ste_v1_build_src_gvmi_qpn_bit_mask(struct mlx5dr_match_param *value, 168010b69418SYevgeny Kliteynik u8 *bit_mask) 168110b69418SYevgeny Kliteynik { 168210b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 168310b69418SYevgeny Kliteynik 168410b69418SYevgeny Kliteynik DR_STE_SET_ONES(src_gvmi_qp_v1, bit_mask, source_gvmi, misc_mask, source_port); 168510b69418SYevgeny Kliteynik DR_STE_SET_ONES(src_gvmi_qp_v1, bit_mask, source_qp, misc_mask, source_sqn); 1686cc82a2e6SYevgeny Kliteynik misc_mask->source_eswitch_owner_vhca_id = 0; 168710b69418SYevgeny Kliteynik } 168810b69418SYevgeny Kliteynik 168910b69418SYevgeny Kliteynik static int dr_ste_v1_build_src_gvmi_qpn_tag(struct mlx5dr_match_param *value, 169010b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 169110b69418SYevgeny Kliteynik u8 *tag) 169210b69418SYevgeny Kliteynik { 169310b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 169410b69418SYevgeny Kliteynik struct mlx5dr_cmd_vport_cap *vport_cap; 169510b69418SYevgeny Kliteynik struct mlx5dr_domain *dmn = sb->dmn; 169610b69418SYevgeny Kliteynik struct mlx5dr_cmd_caps *caps; 169710b69418SYevgeny Kliteynik u8 *bit_mask = sb->bit_mask; 169810b69418SYevgeny Kliteynik 169910b69418SYevgeny Kliteynik DR_STE_SET_TAG(src_gvmi_qp_v1, tag, source_qp, misc, source_sqn); 170010b69418SYevgeny Kliteynik 170110b69418SYevgeny Kliteynik if (sb->vhca_id_valid) { 170210b69418SYevgeny Kliteynik /* Find port GVMI based on the eswitch_owner_vhca_id */ 170310b69418SYevgeny Kliteynik if (misc->source_eswitch_owner_vhca_id == dmn->info.caps.gvmi) 170410b69418SYevgeny Kliteynik caps = &dmn->info.caps; 170510b69418SYevgeny Kliteynik else if (dmn->peer_dmn && (misc->source_eswitch_owner_vhca_id == 170610b69418SYevgeny Kliteynik dmn->peer_dmn->info.caps.gvmi)) 170710b69418SYevgeny Kliteynik caps = &dmn->peer_dmn->info.caps; 170810b69418SYevgeny Kliteynik else 170910b69418SYevgeny Kliteynik return -EINVAL; 171010b69418SYevgeny Kliteynik 171110b69418SYevgeny Kliteynik misc->source_eswitch_owner_vhca_id = 0; 171210b69418SYevgeny Kliteynik } else { 171310b69418SYevgeny Kliteynik caps = &dmn->info.caps; 171410b69418SYevgeny Kliteynik } 171510b69418SYevgeny Kliteynik 171610b69418SYevgeny Kliteynik if (!MLX5_GET(ste_src_gvmi_qp_v1, bit_mask, source_gvmi)) 171710b69418SYevgeny Kliteynik return 0; 171810b69418SYevgeny Kliteynik 171910b69418SYevgeny Kliteynik vport_cap = mlx5dr_get_vport_cap(caps, misc->source_port); 172010b69418SYevgeny Kliteynik if (!vport_cap) { 172110b69418SYevgeny Kliteynik mlx5dr_err(dmn, "Vport 0x%x is disabled or invalid\n", 172210b69418SYevgeny Kliteynik misc->source_port); 172310b69418SYevgeny Kliteynik return -EINVAL; 172410b69418SYevgeny Kliteynik } 172510b69418SYevgeny Kliteynik 172610b69418SYevgeny Kliteynik if (vport_cap->vport_gvmi) 172710b69418SYevgeny Kliteynik MLX5_SET(ste_src_gvmi_qp_v1, tag, source_gvmi, vport_cap->vport_gvmi); 172810b69418SYevgeny Kliteynik 172910b69418SYevgeny Kliteynik misc->source_port = 0; 173010b69418SYevgeny Kliteynik return 0; 173110b69418SYevgeny Kliteynik } 173210b69418SYevgeny Kliteynik 173310b69418SYevgeny Kliteynik static void dr_ste_v1_build_src_gvmi_qpn_init(struct mlx5dr_ste_build *sb, 173410b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 173510b69418SYevgeny Kliteynik { 173610b69418SYevgeny Kliteynik dr_ste_v1_build_src_gvmi_qpn_bit_mask(mask, sb->bit_mask); 173710b69418SYevgeny Kliteynik 173810b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_SRC_QP_GVMI; 173910b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 174010b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_src_gvmi_qpn_tag; 174110b69418SYevgeny Kliteynik } 174210b69418SYevgeny Kliteynik 1743160e9cb3SYevgeny Kliteynik static void dr_ste_v1_set_flex_parser(u32 *misc4_field_id, 1744160e9cb3SYevgeny Kliteynik u32 *misc4_field_value, 1745160e9cb3SYevgeny Kliteynik bool *parser_is_used, 1746160e9cb3SYevgeny Kliteynik u8 *tag) 1747160e9cb3SYevgeny Kliteynik { 1748160e9cb3SYevgeny Kliteynik u32 id = *misc4_field_id; 1749160e9cb3SYevgeny Kliteynik u8 *parser_ptr; 1750160e9cb3SYevgeny Kliteynik 1751160e9cb3SYevgeny Kliteynik if (parser_is_used[id]) 1752160e9cb3SYevgeny Kliteynik return; 1753160e9cb3SYevgeny Kliteynik 1754160e9cb3SYevgeny Kliteynik parser_is_used[id] = true; 1755160e9cb3SYevgeny Kliteynik parser_ptr = dr_ste_calc_flex_parser_offset(tag, id); 1756160e9cb3SYevgeny Kliteynik 1757160e9cb3SYevgeny Kliteynik *(__be32 *)parser_ptr = cpu_to_be32(*misc4_field_value); 1758160e9cb3SYevgeny Kliteynik *misc4_field_id = 0; 1759160e9cb3SYevgeny Kliteynik *misc4_field_value = 0; 1760160e9cb3SYevgeny Kliteynik } 1761160e9cb3SYevgeny Kliteynik 1762160e9cb3SYevgeny Kliteynik static int dr_ste_v1_build_felx_parser_tag(struct mlx5dr_match_param *value, 1763160e9cb3SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 1764160e9cb3SYevgeny Kliteynik u8 *tag) 1765160e9cb3SYevgeny Kliteynik { 1766160e9cb3SYevgeny Kliteynik struct mlx5dr_match_misc4 *misc_4_mask = &value->misc4; 1767160e9cb3SYevgeny Kliteynik bool parser_is_used[DR_NUM_OF_FLEX_PARSERS] = {}; 1768160e9cb3SYevgeny Kliteynik 1769160e9cb3SYevgeny Kliteynik dr_ste_v1_set_flex_parser(&misc_4_mask->prog_sample_field_id_0, 1770160e9cb3SYevgeny Kliteynik &misc_4_mask->prog_sample_field_value_0, 1771160e9cb3SYevgeny Kliteynik parser_is_used, tag); 1772160e9cb3SYevgeny Kliteynik 1773160e9cb3SYevgeny Kliteynik dr_ste_v1_set_flex_parser(&misc_4_mask->prog_sample_field_id_1, 1774160e9cb3SYevgeny Kliteynik &misc_4_mask->prog_sample_field_value_1, 1775160e9cb3SYevgeny Kliteynik parser_is_used, tag); 1776160e9cb3SYevgeny Kliteynik 1777160e9cb3SYevgeny Kliteynik dr_ste_v1_set_flex_parser(&misc_4_mask->prog_sample_field_id_2, 1778160e9cb3SYevgeny Kliteynik &misc_4_mask->prog_sample_field_value_2, 1779160e9cb3SYevgeny Kliteynik parser_is_used, tag); 1780160e9cb3SYevgeny Kliteynik 1781160e9cb3SYevgeny Kliteynik dr_ste_v1_set_flex_parser(&misc_4_mask->prog_sample_field_id_3, 1782160e9cb3SYevgeny Kliteynik &misc_4_mask->prog_sample_field_value_3, 1783160e9cb3SYevgeny Kliteynik parser_is_used, tag); 1784160e9cb3SYevgeny Kliteynik 1785160e9cb3SYevgeny Kliteynik return 0; 1786160e9cb3SYevgeny Kliteynik } 1787160e9cb3SYevgeny Kliteynik 1788160e9cb3SYevgeny Kliteynik static void dr_ste_v1_build_flex_parser_0_init(struct mlx5dr_ste_build *sb, 1789160e9cb3SYevgeny Kliteynik struct mlx5dr_match_param *mask) 1790160e9cb3SYevgeny Kliteynik { 1791160e9cb3SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 1792160e9cb3SYevgeny Kliteynik dr_ste_v1_build_felx_parser_tag(mask, sb, sb->bit_mask); 1793160e9cb3SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 1794160e9cb3SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_felx_parser_tag; 1795160e9cb3SYevgeny Kliteynik } 1796160e9cb3SYevgeny Kliteynik 1797160e9cb3SYevgeny Kliteynik static void dr_ste_v1_build_flex_parser_1_init(struct mlx5dr_ste_build *sb, 1798160e9cb3SYevgeny Kliteynik struct mlx5dr_match_param *mask) 1799160e9cb3SYevgeny Kliteynik { 1800160e9cb3SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_1; 1801160e9cb3SYevgeny Kliteynik dr_ste_v1_build_felx_parser_tag(mask, sb, sb->bit_mask); 1802160e9cb3SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 1803160e9cb3SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_felx_parser_tag; 1804160e9cb3SYevgeny Kliteynik } 1805160e9cb3SYevgeny Kliteynik 18063442e033SYevgeny Kliteynik static int 18073442e033SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_tag(struct mlx5dr_match_param *value, 18083442e033SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 18093442e033SYevgeny Kliteynik u8 *tag) 18103442e033SYevgeny Kliteynik { 18113442e033SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 18123442e033SYevgeny Kliteynik u8 parser_id = sb->caps->flex_parser_id_geneve_tlv_option_0; 18133442e033SYevgeny Kliteynik u8 *parser_ptr = dr_ste_calc_flex_parser_offset(tag, parser_id); 18143442e033SYevgeny Kliteynik 18153442e033SYevgeny Kliteynik MLX5_SET(ste_flex_parser_0, parser_ptr, flex_parser_3, 18163442e033SYevgeny Kliteynik misc3->geneve_tlv_option_0_data); 18173442e033SYevgeny Kliteynik misc3->geneve_tlv_option_0_data = 0; 18183442e033SYevgeny Kliteynik 18193442e033SYevgeny Kliteynik return 0; 18203442e033SYevgeny Kliteynik } 18213442e033SYevgeny Kliteynik 18223442e033SYevgeny Kliteynik static void 18233442e033SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_init(struct mlx5dr_ste_build *sb, 18243442e033SYevgeny Kliteynik struct mlx5dr_match_param *mask) 18253442e033SYevgeny Kliteynik { 18263442e033SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_tag(mask, sb, sb->bit_mask); 18273442e033SYevgeny Kliteynik 18283442e033SYevgeny Kliteynik /* STEs with lookup type FLEX_PARSER_{0/1} includes 18293442e033SYevgeny Kliteynik * flex parsers_{0-3}/{4-7} respectively. 18303442e033SYevgeny Kliteynik */ 18313442e033SYevgeny Kliteynik sb->lu_type = sb->caps->flex_parser_id_geneve_tlv_option_0 > 3 ? 18323442e033SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_1 : 18333442e033SYevgeny Kliteynik DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 18343442e033SYevgeny Kliteynik 18353442e033SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 18363442e033SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_tag; 18373442e033SYevgeny Kliteynik } 18383442e033SYevgeny Kliteynik 1839df9dd15aSYevgeny Kliteynik static int dr_ste_v1_build_flex_parser_tnl_gtpu_tag(struct mlx5dr_match_param *value, 1840df9dd15aSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 1841df9dd15aSYevgeny Kliteynik uint8_t *tag) 1842df9dd15aSYevgeny Kliteynik { 1843df9dd15aSYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 1844df9dd15aSYevgeny Kliteynik 1845df9dd15aSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_gtpu, tag, gtpu_msg_flags, misc3, gtpu_msg_flags); 1846df9dd15aSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_gtpu, tag, gtpu_msg_type, misc3, gtpu_msg_type); 1847df9dd15aSYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_gtpu, tag, gtpu_teid, misc3, gtpu_teid); 1848df9dd15aSYevgeny Kliteynik 1849df9dd15aSYevgeny Kliteynik return 0; 1850df9dd15aSYevgeny Kliteynik } 1851df9dd15aSYevgeny Kliteynik 1852df9dd15aSYevgeny Kliteynik static void dr_ste_v1_build_flex_parser_tnl_gtpu_init(struct mlx5dr_ste_build *sb, 1853df9dd15aSYevgeny Kliteynik struct mlx5dr_match_param *mask) 1854df9dd15aSYevgeny Kliteynik { 1855df9dd15aSYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_gtpu_tag(mask, sb, sb->bit_mask); 1856df9dd15aSYevgeny Kliteynik 1857df9dd15aSYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 1858df9dd15aSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 1859df9dd15aSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_gtpu_tag; 1860df9dd15aSYevgeny Kliteynik } 1861df9dd15aSYevgeny Kliteynik 1862df9dd15aSYevgeny Kliteynik static int 1863df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_0_tag(struct mlx5dr_match_param *value, 1864df9dd15aSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 1865df9dd15aSYevgeny Kliteynik uint8_t *tag) 1866df9dd15aSYevgeny Kliteynik { 1867df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_0_id(sb->caps->flex_parser_id_gtpu_dw_0)) 1868df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_dw_0, sb->caps, &value->misc3); 1869df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_0_id(sb->caps->flex_parser_id_gtpu_teid)) 1870df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_teid, sb->caps, &value->misc3); 1871df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_0_id(sb->caps->flex_parser_id_gtpu_dw_2)) 1872df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_dw_2, sb->caps, &value->misc3); 1873df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_0_id(sb->caps->flex_parser_id_gtpu_first_ext_dw_0)) 1874df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_first_ext_dw_0, sb->caps, &value->misc3); 1875df9dd15aSYevgeny Kliteynik return 0; 1876df9dd15aSYevgeny Kliteynik } 1877df9dd15aSYevgeny Kliteynik 1878df9dd15aSYevgeny Kliteynik static void 1879df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_0_init(struct mlx5dr_ste_build *sb, 1880df9dd15aSYevgeny Kliteynik struct mlx5dr_match_param *mask) 1881df9dd15aSYevgeny Kliteynik { 1882df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_0_tag(mask, sb, sb->bit_mask); 1883df9dd15aSYevgeny Kliteynik 1884df9dd15aSYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_0; 1885df9dd15aSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 1886df9dd15aSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_gtpu_flex_parser_0_tag; 1887df9dd15aSYevgeny Kliteynik } 1888df9dd15aSYevgeny Kliteynik 1889df9dd15aSYevgeny Kliteynik static int 1890df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_1_tag(struct mlx5dr_match_param *value, 1891df9dd15aSYevgeny Kliteynik struct mlx5dr_ste_build *sb, 1892df9dd15aSYevgeny Kliteynik uint8_t *tag) 1893df9dd15aSYevgeny Kliteynik { 1894df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_1_id(sb->caps->flex_parser_id_gtpu_dw_0)) 1895df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_dw_0, sb->caps, &value->misc3); 1896df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_1_id(sb->caps->flex_parser_id_gtpu_teid)) 1897df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_teid, sb->caps, &value->misc3); 1898df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_1_id(sb->caps->flex_parser_id_gtpu_dw_2)) 1899df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_dw_2, sb->caps, &value->misc3); 1900df9dd15aSYevgeny Kliteynik if (dr_is_flex_parser_1_id(sb->caps->flex_parser_id_gtpu_first_ext_dw_0)) 1901df9dd15aSYevgeny Kliteynik DR_STE_SET_FLEX_PARSER_FIELD(tag, gtpu_first_ext_dw_0, sb->caps, &value->misc3); 1902df9dd15aSYevgeny Kliteynik return 0; 1903df9dd15aSYevgeny Kliteynik } 1904df9dd15aSYevgeny Kliteynik 1905df9dd15aSYevgeny Kliteynik static void 1906df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_1_init(struct mlx5dr_ste_build *sb, 1907df9dd15aSYevgeny Kliteynik struct mlx5dr_match_param *mask) 1908df9dd15aSYevgeny Kliteynik { 1909df9dd15aSYevgeny Kliteynik dr_ste_v1_build_tnl_gtpu_flex_parser_1_tag(mask, sb, sb->bit_mask); 1910df9dd15aSYevgeny Kliteynik 1911df9dd15aSYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_1; 1912df9dd15aSYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 1913df9dd15aSYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_gtpu_flex_parser_1_tag; 1914df9dd15aSYevgeny Kliteynik } 1915df9dd15aSYevgeny Kliteynik 191610b69418SYevgeny Kliteynik struct mlx5dr_ste_ctx ste_ctx_v1 = { 1917a6098129SYevgeny Kliteynik /* Builders */ 191810b69418SYevgeny Kliteynik .build_eth_l2_src_dst_init = &dr_ste_v1_build_eth_l2_src_dst_init, 191910b69418SYevgeny Kliteynik .build_eth_l3_ipv6_src_init = &dr_ste_v1_build_eth_l3_ipv6_src_init, 192010b69418SYevgeny Kliteynik .build_eth_l3_ipv6_dst_init = &dr_ste_v1_build_eth_l3_ipv6_dst_init, 192110b69418SYevgeny Kliteynik .build_eth_l3_ipv4_5_tuple_init = &dr_ste_v1_build_eth_l3_ipv4_5_tuple_init, 192210b69418SYevgeny Kliteynik .build_eth_l2_src_init = &dr_ste_v1_build_eth_l2_src_init, 192310b69418SYevgeny Kliteynik .build_eth_l2_dst_init = &dr_ste_v1_build_eth_l2_dst_init, 192410b69418SYevgeny Kliteynik .build_eth_l2_tnl_init = &dr_ste_v1_build_eth_l2_tnl_init, 192510b69418SYevgeny Kliteynik .build_eth_l3_ipv4_misc_init = &dr_ste_v1_build_eth_l3_ipv4_misc_init, 192610b69418SYevgeny Kliteynik .build_eth_ipv6_l3_l4_init = &dr_ste_v1_build_eth_ipv6_l3_l4_init, 192710b69418SYevgeny Kliteynik .build_mpls_init = &dr_ste_v1_build_mpls_init, 192810b69418SYevgeny Kliteynik .build_tnl_gre_init = &dr_ste_v1_build_tnl_gre_init, 192910b69418SYevgeny Kliteynik .build_tnl_mpls_init = &dr_ste_v1_build_tnl_mpls_init, 193035ba005dSYevgeny Kliteynik .build_tnl_mpls_over_udp_init = &dr_ste_v1_build_tnl_mpls_over_udp_init, 193135ba005dSYevgeny Kliteynik .build_tnl_mpls_over_gre_init = &dr_ste_v1_build_tnl_mpls_over_gre_init, 193210b69418SYevgeny Kliteynik .build_icmp_init = &dr_ste_v1_build_icmp_init, 193310b69418SYevgeny Kliteynik .build_general_purpose_init = &dr_ste_v1_build_general_purpose_init, 193410b69418SYevgeny Kliteynik .build_eth_l4_misc_init = &dr_ste_v1_build_eth_l4_misc_init, 193510b69418SYevgeny Kliteynik .build_tnl_vxlan_gpe_init = &dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_init, 193610b69418SYevgeny Kliteynik .build_tnl_geneve_init = &dr_ste_v1_build_flex_parser_tnl_geneve_init, 19373442e033SYevgeny Kliteynik .build_tnl_geneve_tlv_opt_init = &dr_ste_v1_build_flex_parser_tnl_geneve_tlv_opt_init, 193810b69418SYevgeny Kliteynik .build_register_0_init = &dr_ste_v1_build_register_0_init, 193910b69418SYevgeny Kliteynik .build_register_1_init = &dr_ste_v1_build_register_1_init, 194010b69418SYevgeny Kliteynik .build_src_gvmi_qpn_init = &dr_ste_v1_build_src_gvmi_qpn_init, 1941160e9cb3SYevgeny Kliteynik .build_flex_parser_0_init = &dr_ste_v1_build_flex_parser_0_init, 1942160e9cb3SYevgeny Kliteynik .build_flex_parser_1_init = &dr_ste_v1_build_flex_parser_1_init, 1943df9dd15aSYevgeny Kliteynik .build_tnl_gtpu_init = &dr_ste_v1_build_flex_parser_tnl_gtpu_init, 1944df9dd15aSYevgeny Kliteynik .build_tnl_gtpu_flex_parser_0_init = &dr_ste_v1_build_tnl_gtpu_flex_parser_0_init, 1945df9dd15aSYevgeny Kliteynik .build_tnl_gtpu_flex_parser_1_init = &dr_ste_v1_build_tnl_gtpu_flex_parser_1_init, 1946df9dd15aSYevgeny Kliteynik 1947a6098129SYevgeny Kliteynik /* Getters and Setters */ 1948a6098129SYevgeny Kliteynik .ste_init = &dr_ste_v1_init, 1949a6098129SYevgeny Kliteynik .set_next_lu_type = &dr_ste_v1_set_next_lu_type, 1950a6098129SYevgeny Kliteynik .get_next_lu_type = &dr_ste_v1_get_next_lu_type, 1951a6098129SYevgeny Kliteynik .set_miss_addr = &dr_ste_v1_set_miss_addr, 1952a6098129SYevgeny Kliteynik .get_miss_addr = &dr_ste_v1_get_miss_addr, 1953a6098129SYevgeny Kliteynik .set_hit_addr = &dr_ste_v1_set_hit_addr, 1954a6098129SYevgeny Kliteynik .set_byte_mask = &dr_ste_v1_set_byte_mask, 1955a6098129SYevgeny Kliteynik .get_byte_mask = &dr_ste_v1_get_byte_mask, 19564e856c5dSYevgeny Kliteynik /* Actions */ 1957d7418b4eSYevgeny Kliteynik .actions_caps = DR_STE_CTX_ACTION_CAP_RX_ENCAP, 19584e856c5dSYevgeny Kliteynik .set_actions_rx = &dr_ste_v1_set_actions_rx, 19594e856c5dSYevgeny Kliteynik .set_actions_tx = &dr_ste_v1_set_actions_tx, 1960c349b413SYevgeny Kliteynik .modify_field_arr_sz = ARRAY_SIZE(dr_ste_v1_action_modify_field_arr), 1961c349b413SYevgeny Kliteynik .modify_field_arr = dr_ste_v1_action_modify_field_arr, 1962c349b413SYevgeny Kliteynik .set_action_set = &dr_ste_v1_set_action_set, 1963c349b413SYevgeny Kliteynik .set_action_add = &dr_ste_v1_set_action_add, 1964c349b413SYevgeny Kliteynik .set_action_copy = &dr_ste_v1_set_action_copy, 1965c349b413SYevgeny Kliteynik .set_action_decap_l3_list = &dr_ste_v1_set_action_decap_l3_list, 19664fe45e1dSYevgeny Kliteynik /* Send */ 19674fe45e1dSYevgeny Kliteynik .prepare_for_postsend = &dr_ste_v1_prepare_for_postsend, 196810b69418SYevgeny Kliteynik }; 1969