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 98*c349b413SYevgeny Kliteynik enum { 99*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_0 = 0x00, 100*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_1 = 0x01, 101*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_2 = 0x02, 102*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_0 = 0x08, 103*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_1 = 0x09, 104*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0 = 0x0e, 105*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0 = 0x18, 106*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_1 = 0x19, 107*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_0 = 0x40, 108*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_1 = 0x41, 109*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_0 = 0x44, 110*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_1 = 0x45, 111*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_2 = 0x46, 112*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_3 = 0x47, 113*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_0 = 0x4c, 114*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_1 = 0x4d, 115*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_2 = 0x4e, 116*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_3 = 0x4f, 117*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_0 = 0x5e, 118*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_1 = 0x5f, 119*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_METADATA_2_CQE = 0x7b, 120*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_GNRL_PURPOSE = 0x7c, 121*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_2 = 0x8c, 122*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_3 = 0x8d, 123*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_4 = 0x8e, 124*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_5 = 0x8f, 125*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_6 = 0x90, 126*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_MDFY_FLD_REGISTER_7 = 0x91, 127*c349b413SYevgeny Kliteynik }; 128*c349b413SYevgeny Kliteynik 129*c349b413SYevgeny Kliteynik static const struct mlx5dr_ste_action_modify_field dr_ste_v1_action_modify_field_arr[] = { 130*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SMAC_47_16] = { 131*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_0, .start = 0, .end = 31, 132*c349b413SYevgeny Kliteynik }, 133*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SMAC_15_0] = { 134*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_SRC_L2_OUT_1, .start = 16, .end = 31, 135*c349b413SYevgeny Kliteynik }, 136*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_ETHERTYPE] = { 137*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_1, .start = 0, .end = 15, 138*c349b413SYevgeny Kliteynik }, 139*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DMAC_47_16] = { 140*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_0, .start = 0, .end = 31, 141*c349b413SYevgeny Kliteynik }, 142*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DMAC_15_0] = { 143*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_1, .start = 16, .end = 31, 144*c349b413SYevgeny Kliteynik }, 145*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_IP_DSCP] = { 146*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0, .start = 18, .end = 23, 147*c349b413SYevgeny Kliteynik }, 148*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_FLAGS] = { 149*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_1, .start = 16, .end = 24, 150*c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, 151*c349b413SYevgeny Kliteynik }, 152*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_SPORT] = { 153*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 16, .end = 31, 154*c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, 155*c349b413SYevgeny Kliteynik }, 156*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_DPORT] = { 157*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 0, .end = 15, 158*c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_TCP, 159*c349b413SYevgeny Kliteynik }, 160*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_IP_TTL] = { 161*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0, .start = 8, .end = 15, 162*c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, 163*c349b413SYevgeny Kliteynik }, 164*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_IPV6_HOPLIMIT] = { 165*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L3_OUT_0, .start = 8, .end = 15, 166*c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 167*c349b413SYevgeny Kliteynik }, 168*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_UDP_SPORT] = { 169*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 16, .end = 31, 170*c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_UDP, 171*c349b413SYevgeny Kliteynik }, 172*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_UDP_DPORT] = { 173*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L4_OUT_0, .start = 0, .end = 15, 174*c349b413SYevgeny Kliteynik .l4_type = DR_STE_ACTION_MDFY_TYPE_L4_UDP, 175*c349b413SYevgeny Kliteynik }, 176*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_127_96] = { 177*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_0, .start = 0, .end = 31, 178*c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 179*c349b413SYevgeny Kliteynik }, 180*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_95_64] = { 181*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_1, .start = 0, .end = 31, 182*c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 183*c349b413SYevgeny Kliteynik }, 184*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_63_32] = { 185*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_2, .start = 0, .end = 31, 186*c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 187*c349b413SYevgeny Kliteynik }, 188*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV6_31_0] = { 189*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_SRC_OUT_3, .start = 0, .end = 31, 190*c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 191*c349b413SYevgeny Kliteynik }, 192*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_127_96] = { 193*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_0, .start = 0, .end = 31, 194*c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 195*c349b413SYevgeny Kliteynik }, 196*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_95_64] = { 197*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_1, .start = 0, .end = 31, 198*c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 199*c349b413SYevgeny Kliteynik }, 200*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_63_32] = { 201*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_2, .start = 0, .end = 31, 202*c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 203*c349b413SYevgeny Kliteynik }, 204*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV6_31_0] = { 205*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV6_DST_OUT_3, .start = 0, .end = 31, 206*c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV6, 207*c349b413SYevgeny Kliteynik }, 208*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_SIPV4] = { 209*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_0, .start = 0, .end = 31, 210*c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, 211*c349b413SYevgeny Kliteynik }, 212*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_DIPV4] = { 213*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_IPV4_OUT_1, .start = 0, .end = 31, 214*c349b413SYevgeny Kliteynik .l3_type = DR_STE_ACTION_MDFY_TYPE_L3_IPV4, 215*c349b413SYevgeny Kliteynik }, 216*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_A] = { 217*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_GNRL_PURPOSE, .start = 0, .end = 31, 218*c349b413SYevgeny Kliteynik }, 219*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_B] = { 220*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_METADATA_2_CQE, .start = 0, .end = 31, 221*c349b413SYevgeny Kliteynik }, 222*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_0] = { 223*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_6, .start = 0, .end = 31, 224*c349b413SYevgeny Kliteynik }, 225*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_1] = { 226*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_7, .start = 0, .end = 31, 227*c349b413SYevgeny Kliteynik }, 228*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_2] = { 229*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_4, .start = 0, .end = 31, 230*c349b413SYevgeny Kliteynik }, 231*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_3] = { 232*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_5, .start = 0, .end = 31, 233*c349b413SYevgeny Kliteynik }, 234*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_4] = { 235*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_2, .start = 0, .end = 31, 236*c349b413SYevgeny Kliteynik }, 237*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_METADATA_REG_C_5] = { 238*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_REGISTER_3, .start = 0, .end = 31, 239*c349b413SYevgeny Kliteynik }, 240*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_SEQ_NUM] = { 241*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_0, .start = 0, .end = 31, 242*c349b413SYevgeny Kliteynik }, 243*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_TCP_ACK_NUM] = { 244*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_TCP_MISC_1, .start = 0, .end = 31, 245*c349b413SYevgeny Kliteynik }, 246*c349b413SYevgeny Kliteynik [MLX5_ACTION_IN_FIELD_OUT_FIRST_VID] = { 247*c349b413SYevgeny Kliteynik .hw_field = DR_STE_V1_ACTION_MDFY_FLD_L2_OUT_2, .start = 0, .end = 15, 248*c349b413SYevgeny Kliteynik }, 249*c349b413SYevgeny Kliteynik }; 250*c349b413SYevgeny Kliteynik 2514e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_entry_type(u8 *hw_ste_p, u8 entry_type) 2524e856c5dSYevgeny Kliteynik { 2534e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, entry_format, entry_type); 2544e856c5dSYevgeny Kliteynik } 2554e856c5dSYevgeny Kliteynik 256a6098129SYevgeny Kliteynik static void dr_ste_v1_set_miss_addr(u8 *hw_ste_p, u64 miss_addr) 257a6098129SYevgeny Kliteynik { 258a6098129SYevgeny Kliteynik u64 index = miss_addr >> 6; 259a6098129SYevgeny Kliteynik 260a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_39_32, index >> 26); 261a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_31_6, index); 262a6098129SYevgeny Kliteynik } 263a6098129SYevgeny Kliteynik 264a6098129SYevgeny Kliteynik static u64 dr_ste_v1_get_miss_addr(u8 *hw_ste_p) 265a6098129SYevgeny Kliteynik { 266a6098129SYevgeny Kliteynik u64 index = 267a6098129SYevgeny Kliteynik (MLX5_GET(ste_match_bwc_v1, hw_ste_p, miss_address_31_6) | 268a6098129SYevgeny Kliteynik MLX5_GET(ste_match_bwc_v1, hw_ste_p, miss_address_39_32) << 26); 269a6098129SYevgeny Kliteynik 270a6098129SYevgeny Kliteynik return index << 6; 271a6098129SYevgeny Kliteynik } 272a6098129SYevgeny Kliteynik 273a6098129SYevgeny Kliteynik static void dr_ste_v1_set_byte_mask(u8 *hw_ste_p, u16 byte_mask) 274a6098129SYevgeny Kliteynik { 275a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, byte_mask, byte_mask); 276a6098129SYevgeny Kliteynik } 277a6098129SYevgeny Kliteynik 278a6098129SYevgeny Kliteynik static u16 dr_ste_v1_get_byte_mask(u8 *hw_ste_p) 279a6098129SYevgeny Kliteynik { 280a6098129SYevgeny Kliteynik return MLX5_GET(ste_match_bwc_v1, hw_ste_p, byte_mask); 281a6098129SYevgeny Kliteynik } 282a6098129SYevgeny Kliteynik 283a6098129SYevgeny Kliteynik static void dr_ste_v1_set_lu_type(u8 *hw_ste_p, u16 lu_type) 284a6098129SYevgeny Kliteynik { 285a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, entry_format, lu_type >> 8); 286a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, match_definer_ctx_idx, lu_type & 0xFF); 287a6098129SYevgeny Kliteynik } 288a6098129SYevgeny Kliteynik 289a6098129SYevgeny Kliteynik static void dr_ste_v1_set_next_lu_type(u8 *hw_ste_p, u16 lu_type) 290a6098129SYevgeny Kliteynik { 291a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_entry_format, lu_type >> 8); 292a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, hash_definer_ctx_idx, lu_type & 0xFF); 293a6098129SYevgeny Kliteynik } 294a6098129SYevgeny Kliteynik 295a6098129SYevgeny Kliteynik static u16 dr_ste_v1_get_next_lu_type(u8 *hw_ste_p) 296a6098129SYevgeny Kliteynik { 297a6098129SYevgeny Kliteynik u8 mode = MLX5_GET(ste_match_bwc_v1, hw_ste_p, next_entry_format); 298a6098129SYevgeny Kliteynik u8 index = MLX5_GET(ste_match_bwc_v1, hw_ste_p, hash_definer_ctx_idx); 299a6098129SYevgeny Kliteynik 300a6098129SYevgeny Kliteynik return (mode << 8 | index); 301a6098129SYevgeny Kliteynik } 302a6098129SYevgeny Kliteynik 3034e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_hit_gvmi(u8 *hw_ste_p, u16 gvmi) 3044e856c5dSYevgeny Kliteynik { 3054e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_63_48, gvmi); 3064e856c5dSYevgeny Kliteynik } 3074e856c5dSYevgeny Kliteynik 308a6098129SYevgeny Kliteynik static void dr_ste_v1_set_hit_addr(u8 *hw_ste_p, u64 icm_addr, u32 ht_size) 309a6098129SYevgeny Kliteynik { 310a6098129SYevgeny Kliteynik u64 index = (icm_addr >> 5) | ht_size; 311a6098129SYevgeny Kliteynik 312a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_39_32_size, index >> 27); 313a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_31_5_size, index); 314a6098129SYevgeny Kliteynik } 315a6098129SYevgeny Kliteynik 316a6098129SYevgeny Kliteynik static void dr_ste_v1_init(u8 *hw_ste_p, u16 lu_type, 317a6098129SYevgeny Kliteynik u8 entry_type, u16 gvmi) 318a6098129SYevgeny Kliteynik { 319a6098129SYevgeny Kliteynik dr_ste_v1_set_lu_type(hw_ste_p, lu_type); 320a6098129SYevgeny Kliteynik dr_ste_v1_set_next_lu_type(hw_ste_p, MLX5DR_STE_LU_TYPE_DONT_CARE); 321a6098129SYevgeny Kliteynik 322a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, gvmi, gvmi); 323a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, next_table_base_63_48, gvmi); 324a6098129SYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, miss_address_63_48, gvmi); 325a6098129SYevgeny Kliteynik } 326a6098129SYevgeny Kliteynik 3274e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_flow_tag(u8 *s_action, u32 flow_tag) 3284e856c5dSYevgeny Kliteynik { 3294e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_flow_tag_v1, s_action, action_id, 3304e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_FLOW_TAG); 3314e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_flow_tag_v1, s_action, flow_tag, flow_tag); 3324e856c5dSYevgeny Kliteynik } 3334e856c5dSYevgeny Kliteynik 3344e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_counter_id(u8 *hw_ste_p, u32 ctr_id) 3354e856c5dSYevgeny Kliteynik { 3364e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, counter_id, ctr_id); 3374e856c5dSYevgeny Kliteynik } 3384e856c5dSYevgeny Kliteynik 3394e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_reparse(u8 *hw_ste_p) 3404e856c5dSYevgeny Kliteynik { 3414e856c5dSYevgeny Kliteynik MLX5_SET(ste_match_bwc_v1, hw_ste_p, reparse, 1); 3424e856c5dSYevgeny Kliteynik } 3434e856c5dSYevgeny Kliteynik 3444e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_tx_encap(u8 *hw_ste_p, u8 *d_action, 3454e856c5dSYevgeny Kliteynik u32 reformat_id, int size) 3464e856c5dSYevgeny Kliteynik { 3474e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, action_id, 3484e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER); 3494e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 3504e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, size, size / 2); 3514e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, pointer, reformat_id); 3524e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, d_action, attributes, 3534e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP); 3544e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 3554e856c5dSYevgeny Kliteynik } 3564e856c5dSYevgeny Kliteynik 3574e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_tx_push_vlan(u8 *hw_ste_p, u8 *d_action, 3584e856c5dSYevgeny Kliteynik u32 vlan_hdr) 3594e856c5dSYevgeny Kliteynik { 3604e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 3614e856c5dSYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_INSERT_INLINE); 3624e856c5dSYevgeny Kliteynik /* The hardware expects offset to vlan header in words (2 byte) */ 3634e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 3644e856c5dSYevgeny Kliteynik start_offset, HDR_LEN_L2_MACS >> 1); 3654e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, d_action, 3664e856c5dSYevgeny Kliteynik inline_data, vlan_hdr); 3674e856c5dSYevgeny Kliteynik 3684e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 3694e856c5dSYevgeny Kliteynik } 3704e856c5dSYevgeny Kliteynik 3714e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_pop_vlan(u8 *hw_ste_p, u8 *s_action, u8 vlans_num) 3724e856c5dSYevgeny Kliteynik { 3734e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 3744e856c5dSYevgeny Kliteynik action_id, DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE); 3754e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 3764e856c5dSYevgeny Kliteynik start_anchor, DR_STE_HEADER_ANCHOR_1ST_VLAN); 3774e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 3784e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, s_action, 3794e856c5dSYevgeny Kliteynik remove_size, (HDR_LEN_L2_VLAN >> 1) * vlans_num); 3804e856c5dSYevgeny Kliteynik 3814e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 3824e856c5dSYevgeny Kliteynik } 3834e856c5dSYevgeny Kliteynik 3844e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_tx_encap_l3(u8 *hw_ste_p, 3854e856c5dSYevgeny Kliteynik u8 *frst_s_action, 3864e856c5dSYevgeny Kliteynik u8 *scnd_d_action, 3874e856c5dSYevgeny Kliteynik u32 reformat_id, 3884e856c5dSYevgeny Kliteynik int size) 3894e856c5dSYevgeny Kliteynik { 3904e856c5dSYevgeny Kliteynik /* Remove L2 headers */ 3914e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, frst_s_action, action_id, 3924e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 3934e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, frst_s_action, end_anchor, 3944e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_IPV6_IPV4); 3954e856c5dSYevgeny Kliteynik 3964e856c5dSYevgeny Kliteynik /* Encapsulate with given reformat ID */ 3974e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, action_id, 3984e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_POINTER); 3994e856c5dSYevgeny Kliteynik /* The hardware expects here size in words (2 byte) */ 4004e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, size, size / 2); 4014e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, pointer, reformat_id); 4024e856c5dSYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_ptr_v1, scnd_d_action, attributes, 4034e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_INSERT_PTR_ATTR_ENCAP); 4044e856c5dSYevgeny Kliteynik 4054e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4064e856c5dSYevgeny Kliteynik } 4074e856c5dSYevgeny Kliteynik 4084e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_decap(u8 *hw_ste_p, u8 *s_action) 4094e856c5dSYevgeny Kliteynik { 4104e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, action_id, 4114e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 4124e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, decap, 1); 4134e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, vni_to_cqe, 1); 4144e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, s_action, end_anchor, 4154e856c5dSYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_MAC); 4164e856c5dSYevgeny Kliteynik 4174e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4184e856c5dSYevgeny Kliteynik } 4194e856c5dSYevgeny Kliteynik 4204e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rx_decap_l3(u8 *hw_ste_p, 4214e856c5dSYevgeny Kliteynik u8 *s_action, 4224e856c5dSYevgeny Kliteynik u16 decap_actions, 4234e856c5dSYevgeny Kliteynik u32 decap_index) 4244e856c5dSYevgeny Kliteynik { 4254e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, action_id, 4264e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MODIFY_LIST); 4274e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, num_of_modify_actions, 4284e856c5dSYevgeny Kliteynik decap_actions); 4294e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, modify_actions_ptr, 4304e856c5dSYevgeny Kliteynik decap_index); 4314e856c5dSYevgeny Kliteynik 4324e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4334e856c5dSYevgeny Kliteynik } 4344e856c5dSYevgeny Kliteynik 4354e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_rewrite_actions(u8 *hw_ste_p, 4364e856c5dSYevgeny Kliteynik u8 *s_action, 4374e856c5dSYevgeny Kliteynik u16 num_of_actions, 4384e856c5dSYevgeny Kliteynik u32 re_write_index) 4394e856c5dSYevgeny Kliteynik { 4404e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, action_id, 4414e856c5dSYevgeny Kliteynik DR_STE_V1_ACTION_ID_MODIFY_LIST); 4424e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, num_of_modify_actions, 4434e856c5dSYevgeny Kliteynik num_of_actions); 4444e856c5dSYevgeny Kliteynik MLX5_SET(ste_single_action_modify_list_v1, s_action, modify_actions_ptr, 4454e856c5dSYevgeny Kliteynik re_write_index); 4464e856c5dSYevgeny Kliteynik 4474e856c5dSYevgeny Kliteynik dr_ste_v1_set_reparse(hw_ste_p); 4484e856c5dSYevgeny Kliteynik } 4494e856c5dSYevgeny Kliteynik 4504e856c5dSYevgeny Kliteynik static void dr_ste_v1_arr_init_next_match(u8 **last_ste, 4514e856c5dSYevgeny Kliteynik u32 *added_stes, 4524e856c5dSYevgeny Kliteynik u16 gvmi) 4534e856c5dSYevgeny Kliteynik { 4544e856c5dSYevgeny Kliteynik u8 *action; 4554e856c5dSYevgeny Kliteynik 4564e856c5dSYevgeny Kliteynik (*added_stes)++; 4574e856c5dSYevgeny Kliteynik *last_ste += DR_STE_SIZE; 4584e856c5dSYevgeny Kliteynik dr_ste_v1_init(*last_ste, MLX5DR_STE_LU_TYPE_DONT_CARE, 0, gvmi); 4594e856c5dSYevgeny Kliteynik dr_ste_v1_set_entry_type(*last_ste, DR_STE_V1_TYPE_MATCH); 4604e856c5dSYevgeny Kliteynik 4614e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, *last_ste, action); 4624e856c5dSYevgeny Kliteynik memset(action, 0, MLX5_FLD_SZ_BYTES(ste_mask_and_match_v1, action)); 4634e856c5dSYevgeny Kliteynik } 4644e856c5dSYevgeny Kliteynik 4654e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_actions_tx(struct mlx5dr_domain *dmn, 4664e856c5dSYevgeny Kliteynik u8 *action_type_set, 4674e856c5dSYevgeny Kliteynik u8 *last_ste, 4684e856c5dSYevgeny Kliteynik struct mlx5dr_ste_actions_attr *attr, 4694e856c5dSYevgeny Kliteynik u32 *added_stes) 4704e856c5dSYevgeny Kliteynik { 4714e856c5dSYevgeny Kliteynik u8 *action = MLX5_ADDR_OF(ste_match_bwc_v1, last_ste, action); 4724e856c5dSYevgeny Kliteynik u8 action_sz = DR_STE_ACTION_DOUBLE_SZ; 4734e856c5dSYevgeny Kliteynik bool allow_encap = true; 4744e856c5dSYevgeny Kliteynik 4754e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_CTR]) 4764e856c5dSYevgeny Kliteynik dr_ste_v1_set_counter_id(last_ste, attr->ctr_id); 4774e856c5dSYevgeny Kliteynik 4784e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_MODIFY_HDR]) { 4794e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ) { 4804e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, 4814e856c5dSYevgeny Kliteynik attr->gvmi); 4824e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, 4834e856c5dSYevgeny Kliteynik last_ste, action); 4844e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 4854e856c5dSYevgeny Kliteynik } 4864e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 4874e856c5dSYevgeny Kliteynik attr->modify_actions, 4884e856c5dSYevgeny Kliteynik attr->modify_index); 4894e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 4904e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 4914e856c5dSYevgeny Kliteynik allow_encap = false; 4924e856c5dSYevgeny Kliteynik } 4934e856c5dSYevgeny Kliteynik 4944e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_PUSH_VLAN]) { 4954e856c5dSYevgeny Kliteynik int i; 4964e856c5dSYevgeny Kliteynik 4974e856c5dSYevgeny Kliteynik for (i = 0; i < attr->vlans.count; i++) { 4984e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_DOUBLE_SZ || !allow_encap) { 4994e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 5004e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 5014e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 5024e856c5dSYevgeny Kliteynik allow_encap = true; 5034e856c5dSYevgeny Kliteynik } 5044e856c5dSYevgeny Kliteynik dr_ste_v1_set_tx_push_vlan(last_ste, action, attr->vlans.headers[i]); 5054e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 5064e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 5074e856c5dSYevgeny Kliteynik } 5084e856c5dSYevgeny Kliteynik } 5094e856c5dSYevgeny Kliteynik 5104e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L2]) { 5114e856c5dSYevgeny Kliteynik if (!allow_encap || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 5124e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 5134e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 5144e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 5154e856c5dSYevgeny Kliteynik allow_encap = true; 5164e856c5dSYevgeny Kliteynik } 5174e856c5dSYevgeny Kliteynik dr_ste_v1_set_tx_encap(last_ste, action, 5184e856c5dSYevgeny Kliteynik attr->reformat_id, 5194e856c5dSYevgeny Kliteynik attr->reformat_size); 5204e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 5214e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 5224e856c5dSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_L2_TO_TNL_L3]) { 5234e856c5dSYevgeny Kliteynik u8 *d_action; 5244e856c5dSYevgeny Kliteynik 5254e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 5264e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 5274e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 5284e856c5dSYevgeny Kliteynik d_action = action + DR_STE_ACTION_SINGLE_SZ; 5294e856c5dSYevgeny Kliteynik 5304e856c5dSYevgeny Kliteynik dr_ste_v1_set_tx_encap_l3(last_ste, 5314e856c5dSYevgeny Kliteynik action, d_action, 5324e856c5dSYevgeny Kliteynik attr->reformat_id, 5334e856c5dSYevgeny Kliteynik attr->reformat_size); 5344e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_TRIPLE_SZ; 5354e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_TRIPLE_SZ; 5364e856c5dSYevgeny Kliteynik } 5374e856c5dSYevgeny Kliteynik 5384e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_gvmi(last_ste, attr->hit_gvmi); 5394e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_addr(last_ste, attr->final_icm_addr, 1); 5404e856c5dSYevgeny Kliteynik } 5414e856c5dSYevgeny Kliteynik 5424e856c5dSYevgeny Kliteynik static void dr_ste_v1_set_actions_rx(struct mlx5dr_domain *dmn, 5434e856c5dSYevgeny Kliteynik u8 *action_type_set, 5444e856c5dSYevgeny Kliteynik u8 *last_ste, 5454e856c5dSYevgeny Kliteynik struct mlx5dr_ste_actions_attr *attr, 5464e856c5dSYevgeny Kliteynik u32 *added_stes) 5474e856c5dSYevgeny Kliteynik { 5484e856c5dSYevgeny Kliteynik u8 *action = MLX5_ADDR_OF(ste_match_bwc_v1, last_ste, action); 5494e856c5dSYevgeny Kliteynik u8 action_sz = DR_STE_ACTION_DOUBLE_SZ; 5504e856c5dSYevgeny Kliteynik bool allow_modify_hdr = true; 5514e856c5dSYevgeny Kliteynik bool allow_ctr = true; 5524e856c5dSYevgeny Kliteynik 5534e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_TNL_L3_TO_L2]) { 5544e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_decap_l3(last_ste, action, 5554e856c5dSYevgeny Kliteynik attr->decap_actions, 5564e856c5dSYevgeny Kliteynik attr->decap_index); 5574e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 5584e856c5dSYevgeny Kliteynik attr->decap_actions, 5594e856c5dSYevgeny Kliteynik attr->decap_index); 5604e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 5614e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 5624e856c5dSYevgeny Kliteynik allow_modify_hdr = false; 5634e856c5dSYevgeny Kliteynik allow_ctr = false; 5644e856c5dSYevgeny Kliteynik } else if (action_type_set[DR_ACTION_TYP_TNL_L2_TO_L2]) { 5654e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_decap(last_ste, action); 5664e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 5674e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 5684e856c5dSYevgeny Kliteynik allow_modify_hdr = false; 5694e856c5dSYevgeny Kliteynik allow_ctr = false; 5704e856c5dSYevgeny Kliteynik } 5714e856c5dSYevgeny Kliteynik 5724e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_TAG]) { 5734e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ) { 5744e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 5754e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 5764e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 5774e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 5784e856c5dSYevgeny Kliteynik allow_ctr = true; 5794e856c5dSYevgeny Kliteynik } 5804e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_flow_tag(action, attr->flow_tag); 5814e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 5824e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 5834e856c5dSYevgeny Kliteynik } 5844e856c5dSYevgeny Kliteynik 5854e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_POP_VLAN]) { 5864e856c5dSYevgeny Kliteynik if (action_sz < DR_STE_ACTION_SINGLE_SZ || 5874e856c5dSYevgeny Kliteynik !allow_modify_hdr) { 5884e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 5894e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 5904e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 5914e856c5dSYevgeny Kliteynik allow_modify_hdr = false; 5924e856c5dSYevgeny Kliteynik allow_ctr = false; 5934e856c5dSYevgeny Kliteynik } 5944e856c5dSYevgeny Kliteynik 5954e856c5dSYevgeny Kliteynik dr_ste_v1_set_rx_pop_vlan(last_ste, action, attr->vlans.count); 5964e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_SINGLE_SZ; 5974e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_SINGLE_SZ; 5984e856c5dSYevgeny Kliteynik } 5994e856c5dSYevgeny Kliteynik 6004e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_MODIFY_HDR]) { 6014e856c5dSYevgeny Kliteynik /* Modify header and decapsulation must use different STEs */ 6024e856c5dSYevgeny Kliteynik if (!allow_modify_hdr || action_sz < DR_STE_ACTION_DOUBLE_SZ) { 6034e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 6044e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 6054e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6064e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 6074e856c5dSYevgeny Kliteynik allow_ctr = true; 6084e856c5dSYevgeny Kliteynik } 6094e856c5dSYevgeny Kliteynik dr_ste_v1_set_rewrite_actions(last_ste, action, 6104e856c5dSYevgeny Kliteynik attr->modify_actions, 6114e856c5dSYevgeny Kliteynik attr->modify_index); 6124e856c5dSYevgeny Kliteynik action_sz -= DR_STE_ACTION_DOUBLE_SZ; 6134e856c5dSYevgeny Kliteynik action += DR_STE_ACTION_DOUBLE_SZ; 6144e856c5dSYevgeny Kliteynik } 6154e856c5dSYevgeny Kliteynik 6164e856c5dSYevgeny Kliteynik if (action_type_set[DR_ACTION_TYP_CTR]) { 6174e856c5dSYevgeny Kliteynik /* Counter action set after decap to exclude decaped header */ 6184e856c5dSYevgeny Kliteynik if (!allow_ctr) { 6194e856c5dSYevgeny Kliteynik dr_ste_v1_arr_init_next_match(&last_ste, added_stes, attr->gvmi); 6204e856c5dSYevgeny Kliteynik action = MLX5_ADDR_OF(ste_mask_and_match_v1, last_ste, action); 6214e856c5dSYevgeny Kliteynik action_sz = DR_STE_ACTION_TRIPLE_SZ; 6224e856c5dSYevgeny Kliteynik allow_modify_hdr = true; 6234e856c5dSYevgeny Kliteynik allow_ctr = false; 6244e856c5dSYevgeny Kliteynik } 6254e856c5dSYevgeny Kliteynik dr_ste_v1_set_counter_id(last_ste, attr->ctr_id); 6264e856c5dSYevgeny Kliteynik } 6274e856c5dSYevgeny Kliteynik 6284e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_gvmi(last_ste, attr->hit_gvmi); 6294e856c5dSYevgeny Kliteynik dr_ste_v1_set_hit_addr(last_ste, attr->final_icm_addr, 1); 6304e856c5dSYevgeny Kliteynik } 6314e856c5dSYevgeny Kliteynik 632*c349b413SYevgeny Kliteynik static void dr_ste_v1_set_action_set(u8 *d_action, 633*c349b413SYevgeny Kliteynik u8 hw_field, 634*c349b413SYevgeny Kliteynik u8 shifter, 635*c349b413SYevgeny Kliteynik u8 length, 636*c349b413SYevgeny Kliteynik u32 data) 637*c349b413SYevgeny Kliteynik { 638*c349b413SYevgeny Kliteynik shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 639*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, action_id, DR_STE_V1_ACTION_ID_SET); 640*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, destination_dw_offset, hw_field); 641*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, destination_left_shifter, shifter); 642*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, destination_length, length); 643*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_set_v1, d_action, inline_data, data); 644*c349b413SYevgeny Kliteynik } 645*c349b413SYevgeny Kliteynik 646*c349b413SYevgeny Kliteynik static void dr_ste_v1_set_action_add(u8 *d_action, 647*c349b413SYevgeny Kliteynik u8 hw_field, 648*c349b413SYevgeny Kliteynik u8 shifter, 649*c349b413SYevgeny Kliteynik u8 length, 650*c349b413SYevgeny Kliteynik u32 data) 651*c349b413SYevgeny Kliteynik { 652*c349b413SYevgeny Kliteynik shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 653*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, action_id, DR_STE_V1_ACTION_ID_ADD); 654*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, destination_dw_offset, hw_field); 655*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, destination_left_shifter, shifter); 656*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, destination_length, length); 657*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_add_v1, d_action, add_value, data); 658*c349b413SYevgeny Kliteynik } 659*c349b413SYevgeny Kliteynik 660*c349b413SYevgeny Kliteynik static void dr_ste_v1_set_action_copy(u8 *d_action, 661*c349b413SYevgeny Kliteynik u8 dst_hw_field, 662*c349b413SYevgeny Kliteynik u8 dst_shifter, 663*c349b413SYevgeny Kliteynik u8 dst_len, 664*c349b413SYevgeny Kliteynik u8 src_hw_field, 665*c349b413SYevgeny Kliteynik u8 src_shifter) 666*c349b413SYevgeny Kliteynik { 667*c349b413SYevgeny Kliteynik dst_shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 668*c349b413SYevgeny Kliteynik src_shifter += MLX5_MODIFY_HEADER_V1_QW_OFFSET; 669*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, action_id, DR_STE_V1_ACTION_ID_COPY); 670*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, destination_dw_offset, dst_hw_field); 671*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, destination_left_shifter, dst_shifter); 672*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, destination_length, dst_len); 673*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, source_dw_offset, src_hw_field); 674*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_copy_v1, d_action, source_right_shifter, src_shifter); 675*c349b413SYevgeny Kliteynik } 676*c349b413SYevgeny Kliteynik 677*c349b413SYevgeny Kliteynik #define DR_STE_DECAP_L3_ACTION_NUM 8 678*c349b413SYevgeny Kliteynik #define DR_STE_L2_HDR_MAX_SZ 20 679*c349b413SYevgeny Kliteynik 680*c349b413SYevgeny Kliteynik static int dr_ste_v1_set_action_decap_l3_list(void *data, 681*c349b413SYevgeny Kliteynik u32 data_sz, 682*c349b413SYevgeny Kliteynik u8 *hw_action, 683*c349b413SYevgeny Kliteynik u32 hw_action_sz, 684*c349b413SYevgeny Kliteynik u16 *used_hw_action_num) 685*c349b413SYevgeny Kliteynik { 686*c349b413SYevgeny Kliteynik u8 padded_data[DR_STE_L2_HDR_MAX_SZ] = {}; 687*c349b413SYevgeny Kliteynik void *data_ptr = padded_data; 688*c349b413SYevgeny Kliteynik u16 used_actions = 0; 689*c349b413SYevgeny Kliteynik u32 inline_data_sz; 690*c349b413SYevgeny Kliteynik u32 i; 691*c349b413SYevgeny Kliteynik 692*c349b413SYevgeny Kliteynik if (hw_action_sz / DR_STE_ACTION_DOUBLE_SZ < DR_STE_DECAP_L3_ACTION_NUM) 693*c349b413SYevgeny Kliteynik return -EINVAL; 694*c349b413SYevgeny Kliteynik 695*c349b413SYevgeny Kliteynik memcpy(padded_data, data, data_sz); 696*c349b413SYevgeny Kliteynik 697*c349b413SYevgeny Kliteynik /* Remove L2L3 outer headers */ 698*c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, action_id, 699*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_HEADER_TO_HEADER); 700*c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, decap, 1); 701*c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, vni_to_cqe, 1); 702*c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_v1, hw_action, end_anchor, 703*c349b413SYevgeny Kliteynik DR_STE_HEADER_ANCHOR_INNER_IPV6_IPV4); 704*c349b413SYevgeny Kliteynik hw_action += DR_STE_ACTION_DOUBLE_SZ; 705*c349b413SYevgeny Kliteynik used_actions++; /* Remove and NOP are a single double action */ 706*c349b413SYevgeny Kliteynik 707*c349b413SYevgeny Kliteynik inline_data_sz = 708*c349b413SYevgeny Kliteynik MLX5_FLD_SZ_BYTES(ste_double_action_insert_with_inline_v1, inline_data); 709*c349b413SYevgeny Kliteynik 710*c349b413SYevgeny Kliteynik /* Add the new header inline + 2 extra bytes */ 711*c349b413SYevgeny Kliteynik for (i = 0; i < data_sz / inline_data_sz + 1; i++) { 712*c349b413SYevgeny Kliteynik void *addr_inline; 713*c349b413SYevgeny Kliteynik 714*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, hw_action, action_id, 715*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_ID_INSERT_INLINE); 716*c349b413SYevgeny Kliteynik /* The hardware expects here offset to words (2 bytes) */ 717*c349b413SYevgeny Kliteynik MLX5_SET(ste_double_action_insert_with_inline_v1, hw_action, start_offset, 718*c349b413SYevgeny Kliteynik i * 2); 719*c349b413SYevgeny Kliteynik 720*c349b413SYevgeny Kliteynik /* Copy bytes one by one to avoid endianness problem */ 721*c349b413SYevgeny Kliteynik addr_inline = MLX5_ADDR_OF(ste_double_action_insert_with_inline_v1, 722*c349b413SYevgeny Kliteynik hw_action, inline_data); 723*c349b413SYevgeny Kliteynik memcpy(addr_inline, data_ptr, inline_data_sz); 724*c349b413SYevgeny Kliteynik hw_action += DR_STE_ACTION_DOUBLE_SZ; 725*c349b413SYevgeny Kliteynik data_ptr += inline_data_sz; 726*c349b413SYevgeny Kliteynik used_actions++; 727*c349b413SYevgeny Kliteynik } 728*c349b413SYevgeny Kliteynik 729*c349b413SYevgeny Kliteynik /* Remove 2 extra bytes */ 730*c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, hw_action, action_id, 731*c349b413SYevgeny Kliteynik DR_STE_V1_ACTION_ID_REMOVE_BY_SIZE); 732*c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, hw_action, start_offset, data_sz / 2); 733*c349b413SYevgeny Kliteynik /* The hardware expects here size in words (2 bytes) */ 734*c349b413SYevgeny Kliteynik MLX5_SET(ste_single_action_remove_header_size_v1, hw_action, remove_size, 1); 735*c349b413SYevgeny Kliteynik used_actions++; 736*c349b413SYevgeny Kliteynik 737*c349b413SYevgeny Kliteynik *used_hw_action_num = used_actions; 738*c349b413SYevgeny Kliteynik 739*c349b413SYevgeny Kliteynik return 0; 740*c349b413SYevgeny Kliteynik } 741*c349b413SYevgeny Kliteynik 74210b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_dst_bit_mask(struct mlx5dr_match_param *value, 74310b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 74410b69418SYevgeny Kliteynik { 74510b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 74610b69418SYevgeny Kliteynik 74710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 74810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 74910b69418SYevgeny Kliteynik 75010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, smac_47_16, mask, smac_47_16); 75110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, smac_15_0, mask, smac_15_0); 75210b69418SYevgeny Kliteynik 75310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_vlan_id, mask, first_vid); 75410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_cfi, mask, first_cfi); 75510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, bit_mask, first_priority, mask, first_prio); 75610b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_src_dst_v1, bit_mask, l3_type, mask, ip_version); 75710b69418SYevgeny Kliteynik 75810b69418SYevgeny Kliteynik if (mask->cvlan_tag) { 75910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, bit_mask, first_vlan_qualifier, -1); 76010b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 76110b69418SYevgeny Kliteynik } else if (mask->svlan_tag) { 76210b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, bit_mask, first_vlan_qualifier, -1); 76310b69418SYevgeny Kliteynik mask->svlan_tag = 0; 76410b69418SYevgeny Kliteynik } 76510b69418SYevgeny Kliteynik } 76610b69418SYevgeny Kliteynik 76710b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_dst_tag(struct mlx5dr_match_param *value, 76810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 76910b69418SYevgeny Kliteynik u8 *tag) 77010b69418SYevgeny Kliteynik { 77110b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 77210b69418SYevgeny Kliteynik 77310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, dmac_47_16, spec, dmac_47_16); 77410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, dmac_15_0, spec, dmac_15_0); 77510b69418SYevgeny Kliteynik 77610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, smac_47_16, spec, smac_47_16); 77710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, smac_15_0, spec, smac_15_0); 77810b69418SYevgeny Kliteynik 77910b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 78010b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, l3_type, STE_IPV4); 78110b69418SYevgeny Kliteynik spec->ip_version = 0; 78210b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 78310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, l3_type, STE_IPV6); 78410b69418SYevgeny Kliteynik spec->ip_version = 0; 78510b69418SYevgeny Kliteynik } else if (spec->ip_version) { 78610b69418SYevgeny Kliteynik return -EINVAL; 78710b69418SYevgeny Kliteynik } 78810b69418SYevgeny Kliteynik 78910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_vlan_id, spec, first_vid); 79010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_cfi, spec, first_cfi); 79110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_dst_v1, tag, first_priority, spec, first_prio); 79210b69418SYevgeny Kliteynik 79310b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 79410b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 79510b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 79610b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 79710b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_dst_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 79810b69418SYevgeny Kliteynik spec->svlan_tag = 0; 79910b69418SYevgeny Kliteynik } 80010b69418SYevgeny Kliteynik return 0; 80110b69418SYevgeny Kliteynik } 80210b69418SYevgeny Kliteynik 80310b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_dst_init(struct mlx5dr_ste_build *sb, 80410b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 80510b69418SYevgeny Kliteynik { 80610b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_dst_bit_mask(mask, sb->inner, sb->bit_mask); 80710b69418SYevgeny Kliteynik 80810b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2_SRC_DST, sb->inner); 80910b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 81010b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_src_dst_tag; 81110b69418SYevgeny Kliteynik } 81210b69418SYevgeny Kliteynik 81310b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv6_dst_tag(struct mlx5dr_match_param *value, 81410b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 81510b69418SYevgeny Kliteynik u8 *tag) 81610b69418SYevgeny Kliteynik { 81710b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 81810b69418SYevgeny Kliteynik 81910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_127_96, spec, dst_ip_127_96); 82010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_95_64, spec, dst_ip_95_64); 82110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_63_32, spec, dst_ip_63_32); 82210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_dst, tag, dst_ip_31_0, spec, dst_ip_31_0); 82310b69418SYevgeny Kliteynik 82410b69418SYevgeny Kliteynik return 0; 82510b69418SYevgeny Kliteynik } 82610b69418SYevgeny Kliteynik 82710b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv6_dst_init(struct mlx5dr_ste_build *sb, 82810b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 82910b69418SYevgeny Kliteynik { 83010b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv6_dst_tag(mask, sb, sb->bit_mask); 83110b69418SYevgeny Kliteynik 83210b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(IPV6_DES, sb->inner); 83310b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 83410b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv6_dst_tag; 83510b69418SYevgeny Kliteynik } 83610b69418SYevgeny Kliteynik 83710b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv6_src_tag(struct mlx5dr_match_param *value, 83810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 83910b69418SYevgeny Kliteynik u8 *tag) 84010b69418SYevgeny Kliteynik { 84110b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 84210b69418SYevgeny Kliteynik 84310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_127_96, spec, src_ip_127_96); 84410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_95_64, spec, src_ip_95_64); 84510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_63_32, spec, src_ip_63_32); 84610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv6_src, tag, src_ip_31_0, spec, src_ip_31_0); 84710b69418SYevgeny Kliteynik 84810b69418SYevgeny Kliteynik return 0; 84910b69418SYevgeny Kliteynik } 85010b69418SYevgeny Kliteynik 85110b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv6_src_init(struct mlx5dr_ste_build *sb, 85210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 85310b69418SYevgeny Kliteynik { 85410b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv6_src_tag(mask, sb, sb->bit_mask); 85510b69418SYevgeny Kliteynik 85610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(IPV6_SRC, sb->inner); 85710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 85810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv6_src_tag; 85910b69418SYevgeny Kliteynik } 86010b69418SYevgeny Kliteynik 86110b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag(struct mlx5dr_match_param *value, 86210b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 86310b69418SYevgeny Kliteynik u8 *tag) 86410b69418SYevgeny Kliteynik { 86510b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 86610b69418SYevgeny Kliteynik 86710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_address, spec, dst_ip_31_0); 86810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_address, spec, src_ip_31_0); 86910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_port, spec, tcp_dport); 87010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, destination_port, spec, udp_dport); 87110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_port, spec, tcp_sport); 87210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, source_port, spec, udp_sport); 87310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, protocol, spec, ip_protocol); 87410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, fragmented, spec, frag); 87510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, dscp, spec, ip_dscp); 87610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_5_tuple_v1, tag, ecn, spec, ip_ecn); 87710b69418SYevgeny Kliteynik 87810b69418SYevgeny Kliteynik if (spec->tcp_flags) { 87910b69418SYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l3_ipv4_5_tuple_v1, tag, spec); 88010b69418SYevgeny Kliteynik spec->tcp_flags = 0; 88110b69418SYevgeny Kliteynik } 88210b69418SYevgeny Kliteynik 88310b69418SYevgeny Kliteynik return 0; 88410b69418SYevgeny Kliteynik } 88510b69418SYevgeny Kliteynik 88610b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv4_5_tuple_init(struct mlx5dr_ste_build *sb, 88710b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 88810b69418SYevgeny Kliteynik { 88910b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag(mask, sb, sb->bit_mask); 89010b69418SYevgeny Kliteynik 89110b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL3_IPV4_5_TUPLE, sb->inner); 89210b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 89310b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv4_5_tuple_tag; 89410b69418SYevgeny Kliteynik } 89510b69418SYevgeny Kliteynik 89610b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(struct mlx5dr_match_param *value, 89710b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 89810b69418SYevgeny Kliteynik { 89910b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 90010b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 90110b69418SYevgeny Kliteynik 90210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_vlan_id, mask, first_vid); 90310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_cfi, mask, first_cfi); 90410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, first_priority, mask, first_prio); 90510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, ip_fragmented, mask, frag); // ? 90610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, l3_ethertype, mask, ethertype); // ? 90710b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_src_v1, bit_mask, l3_type, mask, ip_version); 90810b69418SYevgeny Kliteynik 90910b69418SYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 91010b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, first_vlan_qualifier, -1); 91110b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 91210b69418SYevgeny Kliteynik mask->svlan_tag = 0; 91310b69418SYevgeny Kliteynik } 91410b69418SYevgeny Kliteynik 91510b69418SYevgeny Kliteynik if (inner) { 91610b69418SYevgeny Kliteynik if (misc_mask->inner_second_cvlan_tag || 91710b69418SYevgeny Kliteynik misc_mask->inner_second_svlan_tag) { 91810b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, second_vlan_qualifier, -1); 91910b69418SYevgeny Kliteynik misc_mask->inner_second_cvlan_tag = 0; 92010b69418SYevgeny Kliteynik misc_mask->inner_second_svlan_tag = 0; 92110b69418SYevgeny Kliteynik } 92210b69418SYevgeny Kliteynik 92310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 92410b69418SYevgeny Kliteynik second_vlan_id, misc_mask, inner_second_vid); 92510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 92610b69418SYevgeny Kliteynik second_cfi, misc_mask, inner_second_cfi); 92710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 92810b69418SYevgeny Kliteynik second_priority, misc_mask, inner_second_prio); 92910b69418SYevgeny Kliteynik } else { 93010b69418SYevgeny Kliteynik if (misc_mask->outer_second_cvlan_tag || 93110b69418SYevgeny Kliteynik misc_mask->outer_second_svlan_tag) { 93210b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, bit_mask, second_vlan_qualifier, -1); 93310b69418SYevgeny Kliteynik misc_mask->outer_second_cvlan_tag = 0; 93410b69418SYevgeny Kliteynik misc_mask->outer_second_svlan_tag = 0; 93510b69418SYevgeny Kliteynik } 93610b69418SYevgeny Kliteynik 93710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 93810b69418SYevgeny Kliteynik second_vlan_id, misc_mask, outer_second_vid); 93910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 94010b69418SYevgeny Kliteynik second_cfi, misc_mask, outer_second_cfi); 94110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, 94210b69418SYevgeny Kliteynik second_priority, misc_mask, outer_second_prio); 94310b69418SYevgeny Kliteynik } 94410b69418SYevgeny Kliteynik } 94510b69418SYevgeny Kliteynik 94610b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_or_dst_tag(struct mlx5dr_match_param *value, 94710b69418SYevgeny Kliteynik bool inner, u8 *tag) 94810b69418SYevgeny Kliteynik { 94910b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = inner ? &value->inner : &value->outer; 95010b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_spec = &value->misc; 95110b69418SYevgeny Kliteynik 95210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_vlan_id, spec, first_vid); 95310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_cfi, spec, first_cfi); 95410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, first_priority, spec, first_prio); 95510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, ip_fragmented, spec, frag); 95610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, l3_ethertype, spec, ethertype); 95710b69418SYevgeny Kliteynik 95810b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 95910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, l3_type, STE_IPV4); 96010b69418SYevgeny Kliteynik spec->ip_version = 0; 96110b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 96210b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, l3_type, STE_IPV6); 96310b69418SYevgeny Kliteynik spec->ip_version = 0; 96410b69418SYevgeny Kliteynik } else if (spec->ip_version) { 96510b69418SYevgeny Kliteynik return -EINVAL; 96610b69418SYevgeny Kliteynik } 96710b69418SYevgeny Kliteynik 96810b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 96910b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 97010b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 97110b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 97210b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 97310b69418SYevgeny Kliteynik spec->svlan_tag = 0; 97410b69418SYevgeny Kliteynik } 97510b69418SYevgeny Kliteynik 97610b69418SYevgeny Kliteynik if (inner) { 97710b69418SYevgeny Kliteynik if (misc_spec->inner_second_cvlan_tag) { 97810b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_CVLAN); 97910b69418SYevgeny Kliteynik misc_spec->inner_second_cvlan_tag = 0; 98010b69418SYevgeny Kliteynik } else if (misc_spec->inner_second_svlan_tag) { 98110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_SVLAN); 98210b69418SYevgeny Kliteynik misc_spec->inner_second_svlan_tag = 0; 98310b69418SYevgeny Kliteynik } 98410b69418SYevgeny Kliteynik 98510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_vlan_id, misc_spec, inner_second_vid); 98610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_cfi, misc_spec, inner_second_cfi); 98710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_priority, misc_spec, inner_second_prio); 98810b69418SYevgeny Kliteynik } else { 98910b69418SYevgeny Kliteynik if (misc_spec->outer_second_cvlan_tag) { 99010b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_CVLAN); 99110b69418SYevgeny Kliteynik misc_spec->outer_second_cvlan_tag = 0; 99210b69418SYevgeny Kliteynik } else if (misc_spec->outer_second_svlan_tag) { 99310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_src_v1, tag, second_vlan_qualifier, DR_STE_SVLAN); 99410b69418SYevgeny Kliteynik misc_spec->outer_second_svlan_tag = 0; 99510b69418SYevgeny Kliteynik } 99610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_vlan_id, misc_spec, outer_second_vid); 99710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_cfi, misc_spec, outer_second_cfi); 99810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, second_priority, misc_spec, outer_second_prio); 99910b69418SYevgeny Kliteynik } 100010b69418SYevgeny Kliteynik 100110b69418SYevgeny Kliteynik return 0; 100210b69418SYevgeny Kliteynik } 100310b69418SYevgeny Kliteynik 100410b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_bit_mask(struct mlx5dr_match_param *value, 100510b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 100610b69418SYevgeny Kliteynik { 100710b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 100810b69418SYevgeny Kliteynik 100910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, smac_47_16, mask, smac_47_16); 101010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, bit_mask, smac_15_0, mask, smac_15_0); 101110b69418SYevgeny Kliteynik 101210b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 101310b69418SYevgeny Kliteynik } 101410b69418SYevgeny Kliteynik 101510b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_src_tag(struct mlx5dr_match_param *value, 101610b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 101710b69418SYevgeny Kliteynik u8 *tag) 101810b69418SYevgeny Kliteynik { 101910b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 102010b69418SYevgeny Kliteynik 102110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, smac_47_16, spec, smac_47_16); 102210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_src_v1, tag, smac_15_0, spec, smac_15_0); 102310b69418SYevgeny Kliteynik 102410b69418SYevgeny Kliteynik return dr_ste_v1_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 102510b69418SYevgeny Kliteynik } 102610b69418SYevgeny Kliteynik 102710b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_src_init(struct mlx5dr_ste_build *sb, 102810b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 102910b69418SYevgeny Kliteynik { 103010b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_bit_mask(mask, sb->inner, sb->bit_mask); 103110b69418SYevgeny Kliteynik 103210b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2_SRC, sb->inner); 103310b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 103410b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_src_tag; 103510b69418SYevgeny Kliteynik } 103610b69418SYevgeny Kliteynik 103710b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_dst_bit_mask(struct mlx5dr_match_param *value, 103810b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 103910b69418SYevgeny Kliteynik { 104010b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 104110b69418SYevgeny Kliteynik 104210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 104310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 104410b69418SYevgeny Kliteynik 104510b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_src_or_dst_bit_mask(value, inner, bit_mask); 104610b69418SYevgeny Kliteynik } 104710b69418SYevgeny Kliteynik 104810b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_dst_tag(struct mlx5dr_match_param *value, 104910b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 105010b69418SYevgeny Kliteynik u8 *tag) 105110b69418SYevgeny Kliteynik { 105210b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 105310b69418SYevgeny Kliteynik 105410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, tag, dmac_47_16, spec, dmac_47_16); 105510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_dst_v1, tag, dmac_15_0, spec, dmac_15_0); 105610b69418SYevgeny Kliteynik 105710b69418SYevgeny Kliteynik return dr_ste_v1_build_eth_l2_src_or_dst_tag(value, sb->inner, tag); 105810b69418SYevgeny Kliteynik } 105910b69418SYevgeny Kliteynik 106010b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_dst_init(struct mlx5dr_ste_build *sb, 106110b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 106210b69418SYevgeny Kliteynik { 106310b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_dst_bit_mask(mask, sb->inner, sb->bit_mask); 106410b69418SYevgeny Kliteynik 106510b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL2, sb->inner); 106610b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 106710b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_dst_tag; 106810b69418SYevgeny Kliteynik } 106910b69418SYevgeny Kliteynik 107010b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_tnl_bit_mask(struct mlx5dr_match_param *value, 107110b69418SYevgeny Kliteynik bool inner, u8 *bit_mask) 107210b69418SYevgeny Kliteynik { 107310b69418SYevgeny Kliteynik struct mlx5dr_match_spec *mask = inner ? &value->inner : &value->outer; 107410b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 107510b69418SYevgeny Kliteynik 107610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, dmac_47_16, mask, dmac_47_16); 107710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, dmac_15_0, mask, dmac_15_0); 107810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_vlan_id, mask, first_vid); 107910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_cfi, mask, first_cfi); 108010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, first_priority, mask, first_prio); 108110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, ip_fragmented, mask, frag); 108210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, bit_mask, l3_ethertype, mask, ethertype); 108310b69418SYevgeny Kliteynik DR_STE_SET_ONES(eth_l2_tnl_v1, bit_mask, l3_type, mask, ip_version); 108410b69418SYevgeny Kliteynik 108510b69418SYevgeny Kliteynik if (misc->vxlan_vni) { 108610b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, bit_mask, 108710b69418SYevgeny Kliteynik l2_tunneling_network_id, (misc->vxlan_vni << 8)); 108810b69418SYevgeny Kliteynik misc->vxlan_vni = 0; 108910b69418SYevgeny Kliteynik } 109010b69418SYevgeny Kliteynik 109110b69418SYevgeny Kliteynik if (mask->svlan_tag || mask->cvlan_tag) { 109210b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, bit_mask, first_vlan_qualifier, -1); 109310b69418SYevgeny Kliteynik mask->cvlan_tag = 0; 109410b69418SYevgeny Kliteynik mask->svlan_tag = 0; 109510b69418SYevgeny Kliteynik } 109610b69418SYevgeny Kliteynik } 109710b69418SYevgeny Kliteynik 109810b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l2_tnl_tag(struct mlx5dr_match_param *value, 109910b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 110010b69418SYevgeny Kliteynik u8 *tag) 110110b69418SYevgeny Kliteynik { 110210b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 110310b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 110410b69418SYevgeny Kliteynik 110510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, dmac_47_16, spec, dmac_47_16); 110610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, dmac_15_0, spec, dmac_15_0); 110710b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_vlan_id, spec, first_vid); 110810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_cfi, spec, first_cfi); 110910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, ip_fragmented, spec, frag); 111010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, first_priority, spec, first_prio); 111110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l2_tnl_v1, tag, l3_ethertype, spec, ethertype); 111210b69418SYevgeny Kliteynik 111310b69418SYevgeny Kliteynik if (misc->vxlan_vni) { 111410b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l2_tunneling_network_id, 111510b69418SYevgeny Kliteynik (misc->vxlan_vni << 8)); 111610b69418SYevgeny Kliteynik misc->vxlan_vni = 0; 111710b69418SYevgeny Kliteynik } 111810b69418SYevgeny Kliteynik 111910b69418SYevgeny Kliteynik if (spec->cvlan_tag) { 112010b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, first_vlan_qualifier, DR_STE_CVLAN); 112110b69418SYevgeny Kliteynik spec->cvlan_tag = 0; 112210b69418SYevgeny Kliteynik } else if (spec->svlan_tag) { 112310b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, first_vlan_qualifier, DR_STE_SVLAN); 112410b69418SYevgeny Kliteynik spec->svlan_tag = 0; 112510b69418SYevgeny Kliteynik } 112610b69418SYevgeny Kliteynik 112710b69418SYevgeny Kliteynik if (spec->ip_version == IP_VERSION_IPV4) { 112810b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l3_type, STE_IPV4); 112910b69418SYevgeny Kliteynik spec->ip_version = 0; 113010b69418SYevgeny Kliteynik } else if (spec->ip_version == IP_VERSION_IPV6) { 113110b69418SYevgeny Kliteynik MLX5_SET(ste_eth_l2_tnl_v1, tag, l3_type, STE_IPV6); 113210b69418SYevgeny Kliteynik spec->ip_version = 0; 113310b69418SYevgeny Kliteynik } else if (spec->ip_version) { 113410b69418SYevgeny Kliteynik return -EINVAL; 113510b69418SYevgeny Kliteynik } 113610b69418SYevgeny Kliteynik 113710b69418SYevgeny Kliteynik return 0; 113810b69418SYevgeny Kliteynik } 113910b69418SYevgeny Kliteynik 114010b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l2_tnl_init(struct mlx5dr_ste_build *sb, 114110b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 114210b69418SYevgeny Kliteynik { 114310b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l2_tnl_bit_mask(mask, sb->inner, sb->bit_mask); 114410b69418SYevgeny Kliteynik 114510b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL2_TNL; 114610b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 114710b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l2_tnl_tag; 114810b69418SYevgeny Kliteynik } 114910b69418SYevgeny Kliteynik 115010b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l3_ipv4_misc_tag(struct mlx5dr_match_param *value, 115110b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 115210b69418SYevgeny Kliteynik u8 *tag) 115310b69418SYevgeny Kliteynik { 115410b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 115510b69418SYevgeny Kliteynik 115610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l3_ipv4_misc_v1, tag, time_to_live, spec, ttl_hoplimit); 115710b69418SYevgeny Kliteynik 115810b69418SYevgeny Kliteynik return 0; 115910b69418SYevgeny Kliteynik } 116010b69418SYevgeny Kliteynik 116110b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l3_ipv4_misc_init(struct mlx5dr_ste_build *sb, 116210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 116310b69418SYevgeny Kliteynik { 116410b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l3_ipv4_misc_tag(mask, sb, sb->bit_mask); 116510b69418SYevgeny Kliteynik 116610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL3_IPV4_MISC, sb->inner); 116710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 116810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l3_ipv4_misc_tag; 116910b69418SYevgeny Kliteynik } 117010b69418SYevgeny Kliteynik 117110b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_ipv6_l3_l4_tag(struct mlx5dr_match_param *value, 117210b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 117310b69418SYevgeny Kliteynik u8 *tag) 117410b69418SYevgeny Kliteynik { 117510b69418SYevgeny Kliteynik struct mlx5dr_match_spec *spec = sb->inner ? &value->inner : &value->outer; 117610b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 117710b69418SYevgeny Kliteynik 117810b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dst_port, spec, tcp_dport); 117910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, src_port, spec, tcp_sport); 118010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dst_port, spec, udp_dport); 118110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, src_port, spec, udp_sport); 118210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, protocol, spec, ip_protocol); 118310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, fragmented, spec, frag); 118410b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, dscp, spec, ip_dscp); 118510b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, ecn, spec, ip_ecn); 118610b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, ipv6_hop_limit, spec, ttl_hoplimit); 118710b69418SYevgeny Kliteynik 118810b69418SYevgeny Kliteynik if (sb->inner) 118910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, flow_label, misc, inner_ipv6_flow_label); 119010b69418SYevgeny Kliteynik else 119110b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_v1, tag, flow_label, misc, outer_ipv6_flow_label); 119210b69418SYevgeny Kliteynik 119310b69418SYevgeny Kliteynik if (spec->tcp_flags) { 119410b69418SYevgeny Kliteynik DR_STE_SET_TCP_FLAGS(eth_l4_v1, tag, spec); 119510b69418SYevgeny Kliteynik spec->tcp_flags = 0; 119610b69418SYevgeny Kliteynik } 119710b69418SYevgeny Kliteynik 119810b69418SYevgeny Kliteynik return 0; 119910b69418SYevgeny Kliteynik } 120010b69418SYevgeny Kliteynik 120110b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_ipv6_l3_l4_init(struct mlx5dr_ste_build *sb, 120210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 120310b69418SYevgeny Kliteynik { 120410b69418SYevgeny Kliteynik dr_ste_v1_build_eth_ipv6_l3_l4_tag(mask, sb, sb->bit_mask); 120510b69418SYevgeny Kliteynik 120610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(ETHL4, sb->inner); 120710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 120810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_ipv6_l3_l4_tag; 120910b69418SYevgeny Kliteynik } 121010b69418SYevgeny Kliteynik 121110b69418SYevgeny Kliteynik static int dr_ste_v1_build_mpls_tag(struct mlx5dr_match_param *value, 121210b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 121310b69418SYevgeny Kliteynik u8 *tag) 121410b69418SYevgeny Kliteynik { 121510b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 121610b69418SYevgeny Kliteynik 121710b69418SYevgeny Kliteynik if (sb->inner) 121810b69418SYevgeny Kliteynik DR_STE_SET_MPLS(mpls_v1, misc2, inner, tag); 121910b69418SYevgeny Kliteynik else 122010b69418SYevgeny Kliteynik DR_STE_SET_MPLS(mpls_v1, misc2, outer, tag); 122110b69418SYevgeny Kliteynik 122210b69418SYevgeny Kliteynik return 0; 122310b69418SYevgeny Kliteynik } 122410b69418SYevgeny Kliteynik 122510b69418SYevgeny Kliteynik static void dr_ste_v1_build_mpls_init(struct mlx5dr_ste_build *sb, 122610b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 122710b69418SYevgeny Kliteynik { 122810b69418SYevgeny Kliteynik dr_ste_v1_build_mpls_tag(mask, sb, sb->bit_mask); 122910b69418SYevgeny Kliteynik 123010b69418SYevgeny Kliteynik sb->lu_type = DR_STE_CALC_DFNR_TYPE(MPLS, sb->inner); 123110b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 123210b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_mpls_tag; 123310b69418SYevgeny Kliteynik } 123410b69418SYevgeny Kliteynik 123510b69418SYevgeny Kliteynik static int dr_ste_v1_build_tnl_gre_tag(struct mlx5dr_match_param *value, 123610b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 123710b69418SYevgeny Kliteynik u8 *tag) 123810b69418SYevgeny Kliteynik { 123910b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 124010b69418SYevgeny Kliteynik 124110b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_protocol, misc, gre_protocol); 124210b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_k_present, misc, gre_k_present); 124310b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_key_h, misc, gre_key_h); 124410b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_key_l, misc, gre_key_l); 124510b69418SYevgeny Kliteynik 124610b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_c_present, misc, gre_c_present); 124710b69418SYevgeny Kliteynik DR_STE_SET_TAG(gre_v1, tag, gre_s_present, misc, gre_s_present); 124810b69418SYevgeny Kliteynik 124910b69418SYevgeny Kliteynik return 0; 125010b69418SYevgeny Kliteynik } 125110b69418SYevgeny Kliteynik 125210b69418SYevgeny Kliteynik static void dr_ste_v1_build_tnl_gre_init(struct mlx5dr_ste_build *sb, 125310b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 125410b69418SYevgeny Kliteynik { 125510b69418SYevgeny Kliteynik dr_ste_v1_build_tnl_gre_tag(mask, sb, sb->bit_mask); 125610b69418SYevgeny Kliteynik 125710b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_GRE; 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_tnl_gre_tag; 126010b69418SYevgeny Kliteynik } 126110b69418SYevgeny Kliteynik 126210b69418SYevgeny Kliteynik static int dr_ste_v1_build_tnl_mpls_tag(struct mlx5dr_match_param *value, 126310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 126410b69418SYevgeny Kliteynik u8 *tag) 126510b69418SYevgeny Kliteynik { 126610b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 126710b69418SYevgeny Kliteynik 126810b69418SYevgeny Kliteynik if (DR_STE_IS_OUTER_MPLS_OVER_GRE_SET(misc2)) { 126910b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_label, 127010b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_label); 127110b69418SYevgeny Kliteynik 127210b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_exp, 127310b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_exp); 127410b69418SYevgeny Kliteynik 127510b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_s_bos, 127610b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_s_bos); 127710b69418SYevgeny Kliteynik 127810b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_ttl, 127910b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_gre_ttl); 128010b69418SYevgeny Kliteynik } else { 128110b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_label, 128210b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_label); 128310b69418SYevgeny Kliteynik 128410b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_exp, 128510b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_exp); 128610b69418SYevgeny Kliteynik 128710b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_s_bos, 128810b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_s_bos); 128910b69418SYevgeny Kliteynik 129010b69418SYevgeny Kliteynik DR_STE_SET_TAG(mpls_v1, tag, mpls0_ttl, 129110b69418SYevgeny Kliteynik misc2, outer_first_mpls_over_udp_ttl); 129210b69418SYevgeny Kliteynik } 129310b69418SYevgeny Kliteynik 129410b69418SYevgeny Kliteynik return 0; 129510b69418SYevgeny Kliteynik } 129610b69418SYevgeny Kliteynik 129710b69418SYevgeny Kliteynik static void dr_ste_v1_build_tnl_mpls_init(struct mlx5dr_ste_build *sb, 129810b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 129910b69418SYevgeny Kliteynik { 130010b69418SYevgeny Kliteynik dr_ste_v1_build_tnl_mpls_tag(mask, sb, sb->bit_mask); 130110b69418SYevgeny Kliteynik 130210b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_MPLS_I; 130310b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 130410b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_tnl_mpls_tag; 130510b69418SYevgeny Kliteynik } 130610b69418SYevgeny Kliteynik 130710b69418SYevgeny Kliteynik static int dr_ste_v1_build_icmp_tag(struct mlx5dr_match_param *value, 130810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 130910b69418SYevgeny Kliteynik u8 *tag) 131010b69418SYevgeny Kliteynik { 131110b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 131210b69418SYevgeny Kliteynik bool is_ipv4 = DR_MASK_IS_ICMPV4_SET(misc3); 131310b69418SYevgeny Kliteynik u32 *icmp_header_data; 131410b69418SYevgeny Kliteynik u8 *icmp_type; 131510b69418SYevgeny Kliteynik u8 *icmp_code; 131610b69418SYevgeny Kliteynik 131710b69418SYevgeny Kliteynik if (is_ipv4) { 131810b69418SYevgeny Kliteynik icmp_header_data = &misc3->icmpv4_header_data; 131910b69418SYevgeny Kliteynik icmp_type = &misc3->icmpv4_type; 132010b69418SYevgeny Kliteynik icmp_code = &misc3->icmpv4_code; 132110b69418SYevgeny Kliteynik } else { 132210b69418SYevgeny Kliteynik icmp_header_data = &misc3->icmpv6_header_data; 132310b69418SYevgeny Kliteynik icmp_type = &misc3->icmpv6_type; 132410b69418SYevgeny Kliteynik icmp_code = &misc3->icmpv6_code; 132510b69418SYevgeny Kliteynik } 132610b69418SYevgeny Kliteynik 132710b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_header_data, *icmp_header_data); 132810b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_type, *icmp_type); 132910b69418SYevgeny Kliteynik MLX5_SET(ste_icmp_v1, tag, icmp_code, *icmp_code); 133010b69418SYevgeny Kliteynik 133110b69418SYevgeny Kliteynik *icmp_header_data = 0; 133210b69418SYevgeny Kliteynik *icmp_type = 0; 133310b69418SYevgeny Kliteynik *icmp_code = 0; 133410b69418SYevgeny Kliteynik 133510b69418SYevgeny Kliteynik return 0; 133610b69418SYevgeny Kliteynik } 133710b69418SYevgeny Kliteynik 133810b69418SYevgeny Kliteynik static int dr_ste_v1_build_icmp_init(struct mlx5dr_ste_build *sb, 133910b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 134010b69418SYevgeny Kliteynik { 134110b69418SYevgeny Kliteynik dr_ste_v1_build_icmp_tag(mask, sb, sb->bit_mask); 134210b69418SYevgeny Kliteynik 134310b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL4_MISC_O; 134410b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 134510b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_icmp_tag; 134610b69418SYevgeny Kliteynik 134710b69418SYevgeny Kliteynik return 0; 134810b69418SYevgeny Kliteynik } 134910b69418SYevgeny Kliteynik 135010b69418SYevgeny Kliteynik static int dr_ste_v1_build_general_purpose_tag(struct mlx5dr_match_param *value, 135110b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 135210b69418SYevgeny Kliteynik u8 *tag) 135310b69418SYevgeny Kliteynik { 135410b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 135510b69418SYevgeny Kliteynik 135610b69418SYevgeny Kliteynik DR_STE_SET_TAG(general_purpose, tag, general_purpose_lookup_field, 135710b69418SYevgeny Kliteynik misc2, metadata_reg_a); 135810b69418SYevgeny Kliteynik 135910b69418SYevgeny Kliteynik return 0; 136010b69418SYevgeny Kliteynik } 136110b69418SYevgeny Kliteynik 136210b69418SYevgeny Kliteynik static void dr_ste_v1_build_general_purpose_init(struct mlx5dr_ste_build *sb, 136310b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 136410b69418SYevgeny Kliteynik { 136510b69418SYevgeny Kliteynik dr_ste_v1_build_general_purpose_tag(mask, sb, sb->bit_mask); 136610b69418SYevgeny Kliteynik 136710b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_GENERAL_PURPOSE; 136810b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 136910b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_general_purpose_tag; 137010b69418SYevgeny Kliteynik } 137110b69418SYevgeny Kliteynik 137210b69418SYevgeny Kliteynik static int dr_ste_v1_build_eth_l4_misc_tag(struct mlx5dr_match_param *value, 137310b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 137410b69418SYevgeny Kliteynik u8 *tag) 137510b69418SYevgeny Kliteynik { 137610b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 137710b69418SYevgeny Kliteynik 137810b69418SYevgeny Kliteynik if (sb->inner) { 137910b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, seq_num, misc3, inner_tcp_seq_num); 138010b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, ack_num, misc3, inner_tcp_ack_num); 138110b69418SYevgeny Kliteynik } else { 138210b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, seq_num, misc3, outer_tcp_seq_num); 138310b69418SYevgeny Kliteynik DR_STE_SET_TAG(eth_l4_misc_v1, tag, ack_num, misc3, outer_tcp_ack_num); 138410b69418SYevgeny Kliteynik } 138510b69418SYevgeny Kliteynik 138610b69418SYevgeny Kliteynik return 0; 138710b69418SYevgeny Kliteynik } 138810b69418SYevgeny Kliteynik 138910b69418SYevgeny Kliteynik static void dr_ste_v1_build_eth_l4_misc_init(struct mlx5dr_ste_build *sb, 139010b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 139110b69418SYevgeny Kliteynik { 139210b69418SYevgeny Kliteynik dr_ste_v1_build_eth_l4_misc_tag(mask, sb, sb->bit_mask); 139310b69418SYevgeny Kliteynik 139410b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_ETHL4_MISC_O; 139510b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 139610b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_eth_l4_misc_tag; 139710b69418SYevgeny Kliteynik } 139810b69418SYevgeny Kliteynik 139910b69418SYevgeny Kliteynik static int 140010b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag(struct mlx5dr_match_param *value, 140110b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 140210b69418SYevgeny Kliteynik u8 *tag) 140310b69418SYevgeny Kliteynik { 140410b69418SYevgeny Kliteynik struct mlx5dr_match_misc3 *misc3 = &value->misc3; 140510b69418SYevgeny Kliteynik 140610b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 140710b69418SYevgeny Kliteynik outer_vxlan_gpe_flags, misc3, 140810b69418SYevgeny Kliteynik outer_vxlan_gpe_flags); 140910b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 141010b69418SYevgeny Kliteynik outer_vxlan_gpe_next_protocol, misc3, 141110b69418SYevgeny Kliteynik outer_vxlan_gpe_next_protocol); 141210b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_vxlan_gpe, tag, 141310b69418SYevgeny Kliteynik outer_vxlan_gpe_vni, misc3, 141410b69418SYevgeny Kliteynik outer_vxlan_gpe_vni); 141510b69418SYevgeny Kliteynik 141610b69418SYevgeny Kliteynik return 0; 141710b69418SYevgeny Kliteynik } 141810b69418SYevgeny Kliteynik 141910b69418SYevgeny Kliteynik static void 142010b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_init(struct mlx5dr_ste_build *sb, 142110b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 142210b69418SYevgeny Kliteynik { 142310b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag(mask, sb, sb->bit_mask); 142410b69418SYevgeny Kliteynik 142510b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 142610b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 142710b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_tag; 142810b69418SYevgeny Kliteynik } 142910b69418SYevgeny Kliteynik 143010b69418SYevgeny Kliteynik static int 143110b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tag(struct mlx5dr_match_param *value, 143210b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 143310b69418SYevgeny Kliteynik u8 *tag) 143410b69418SYevgeny Kliteynik { 143510b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 143610b69418SYevgeny Kliteynik 143710b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 143810b69418SYevgeny Kliteynik geneve_protocol_type, misc, geneve_protocol_type); 143910b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 144010b69418SYevgeny Kliteynik geneve_oam, misc, geneve_oam); 144110b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 144210b69418SYevgeny Kliteynik geneve_opt_len, misc, geneve_opt_len); 144310b69418SYevgeny Kliteynik DR_STE_SET_TAG(flex_parser_tnl_geneve, tag, 144410b69418SYevgeny Kliteynik geneve_vni, misc, geneve_vni); 144510b69418SYevgeny Kliteynik 144610b69418SYevgeny Kliteynik return 0; 144710b69418SYevgeny Kliteynik } 144810b69418SYevgeny Kliteynik 144910b69418SYevgeny Kliteynik static void 145010b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_init(struct mlx5dr_ste_build *sb, 145110b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 145210b69418SYevgeny Kliteynik { 145310b69418SYevgeny Kliteynik dr_ste_v1_build_flex_parser_tnl_geneve_tag(mask, sb, sb->bit_mask); 145410b69418SYevgeny Kliteynik 145510b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_FLEX_PARSER_TNL_HEADER; 145610b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 145710b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_flex_parser_tnl_geneve_tag; 145810b69418SYevgeny Kliteynik } 145910b69418SYevgeny Kliteynik 146010b69418SYevgeny Kliteynik static int dr_ste_v1_build_register_0_tag(struct mlx5dr_match_param *value, 146110b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 146210b69418SYevgeny Kliteynik u8 *tag) 146310b69418SYevgeny Kliteynik { 146410b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 146510b69418SYevgeny Kliteynik 146610b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_h, misc2, metadata_reg_c_0); 146710b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_0_l, misc2, metadata_reg_c_1); 146810b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_h, misc2, metadata_reg_c_2); 146910b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_0, tag, register_1_l, misc2, metadata_reg_c_3); 147010b69418SYevgeny Kliteynik 147110b69418SYevgeny Kliteynik return 0; 147210b69418SYevgeny Kliteynik } 147310b69418SYevgeny Kliteynik 147410b69418SYevgeny Kliteynik static void dr_ste_v1_build_register_0_init(struct mlx5dr_ste_build *sb, 147510b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 147610b69418SYevgeny Kliteynik { 147710b69418SYevgeny Kliteynik dr_ste_v1_build_register_0_tag(mask, sb, sb->bit_mask); 147810b69418SYevgeny Kliteynik 147910b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_STEERING_REGISTERS_0; 148010b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 148110b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_register_0_tag; 148210b69418SYevgeny Kliteynik } 148310b69418SYevgeny Kliteynik 148410b69418SYevgeny Kliteynik static int dr_ste_v1_build_register_1_tag(struct mlx5dr_match_param *value, 148510b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 148610b69418SYevgeny Kliteynik u8 *tag) 148710b69418SYevgeny Kliteynik { 148810b69418SYevgeny Kliteynik struct mlx5dr_match_misc2 *misc2 = &value->misc2; 148910b69418SYevgeny Kliteynik 149010b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_h, misc2, metadata_reg_c_4); 149110b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_2_l, misc2, metadata_reg_c_5); 149210b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_h, misc2, metadata_reg_c_6); 149310b69418SYevgeny Kliteynik DR_STE_SET_TAG(register_1, tag, register_3_l, misc2, metadata_reg_c_7); 149410b69418SYevgeny Kliteynik 149510b69418SYevgeny Kliteynik return 0; 149610b69418SYevgeny Kliteynik } 149710b69418SYevgeny Kliteynik 149810b69418SYevgeny Kliteynik static void dr_ste_v1_build_register_1_init(struct mlx5dr_ste_build *sb, 149910b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 150010b69418SYevgeny Kliteynik { 150110b69418SYevgeny Kliteynik dr_ste_v1_build_register_1_tag(mask, sb, sb->bit_mask); 150210b69418SYevgeny Kliteynik 150310b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_STEERING_REGISTERS_1; 150410b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 150510b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_register_1_tag; 150610b69418SYevgeny Kliteynik } 150710b69418SYevgeny Kliteynik 150810b69418SYevgeny Kliteynik static void dr_ste_v1_build_src_gvmi_qpn_bit_mask(struct mlx5dr_match_param *value, 150910b69418SYevgeny Kliteynik u8 *bit_mask) 151010b69418SYevgeny Kliteynik { 151110b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc_mask = &value->misc; 151210b69418SYevgeny Kliteynik 151310b69418SYevgeny Kliteynik DR_STE_SET_ONES(src_gvmi_qp_v1, bit_mask, source_gvmi, misc_mask, source_port); 151410b69418SYevgeny Kliteynik DR_STE_SET_ONES(src_gvmi_qp_v1, bit_mask, source_qp, misc_mask, source_sqn); 151510b69418SYevgeny Kliteynik } 151610b69418SYevgeny Kliteynik 151710b69418SYevgeny Kliteynik static int dr_ste_v1_build_src_gvmi_qpn_tag(struct mlx5dr_match_param *value, 151810b69418SYevgeny Kliteynik struct mlx5dr_ste_build *sb, 151910b69418SYevgeny Kliteynik u8 *tag) 152010b69418SYevgeny Kliteynik { 152110b69418SYevgeny Kliteynik struct mlx5dr_match_misc *misc = &value->misc; 152210b69418SYevgeny Kliteynik struct mlx5dr_cmd_vport_cap *vport_cap; 152310b69418SYevgeny Kliteynik struct mlx5dr_domain *dmn = sb->dmn; 152410b69418SYevgeny Kliteynik struct mlx5dr_cmd_caps *caps; 152510b69418SYevgeny Kliteynik u8 *bit_mask = sb->bit_mask; 152610b69418SYevgeny Kliteynik 152710b69418SYevgeny Kliteynik DR_STE_SET_TAG(src_gvmi_qp_v1, tag, source_qp, misc, source_sqn); 152810b69418SYevgeny Kliteynik 152910b69418SYevgeny Kliteynik if (sb->vhca_id_valid) { 153010b69418SYevgeny Kliteynik /* Find port GVMI based on the eswitch_owner_vhca_id */ 153110b69418SYevgeny Kliteynik if (misc->source_eswitch_owner_vhca_id == dmn->info.caps.gvmi) 153210b69418SYevgeny Kliteynik caps = &dmn->info.caps; 153310b69418SYevgeny Kliteynik else if (dmn->peer_dmn && (misc->source_eswitch_owner_vhca_id == 153410b69418SYevgeny Kliteynik dmn->peer_dmn->info.caps.gvmi)) 153510b69418SYevgeny Kliteynik caps = &dmn->peer_dmn->info.caps; 153610b69418SYevgeny Kliteynik else 153710b69418SYevgeny Kliteynik return -EINVAL; 153810b69418SYevgeny Kliteynik 153910b69418SYevgeny Kliteynik misc->source_eswitch_owner_vhca_id = 0; 154010b69418SYevgeny Kliteynik } else { 154110b69418SYevgeny Kliteynik caps = &dmn->info.caps; 154210b69418SYevgeny Kliteynik } 154310b69418SYevgeny Kliteynik 154410b69418SYevgeny Kliteynik if (!MLX5_GET(ste_src_gvmi_qp_v1, bit_mask, source_gvmi)) 154510b69418SYevgeny Kliteynik return 0; 154610b69418SYevgeny Kliteynik 154710b69418SYevgeny Kliteynik vport_cap = mlx5dr_get_vport_cap(caps, misc->source_port); 154810b69418SYevgeny Kliteynik if (!vport_cap) { 154910b69418SYevgeny Kliteynik mlx5dr_err(dmn, "Vport 0x%x is disabled or invalid\n", 155010b69418SYevgeny Kliteynik misc->source_port); 155110b69418SYevgeny Kliteynik return -EINVAL; 155210b69418SYevgeny Kliteynik } 155310b69418SYevgeny Kliteynik 155410b69418SYevgeny Kliteynik if (vport_cap->vport_gvmi) 155510b69418SYevgeny Kliteynik MLX5_SET(ste_src_gvmi_qp_v1, tag, source_gvmi, vport_cap->vport_gvmi); 155610b69418SYevgeny Kliteynik 155710b69418SYevgeny Kliteynik misc->source_port = 0; 155810b69418SYevgeny Kliteynik return 0; 155910b69418SYevgeny Kliteynik } 156010b69418SYevgeny Kliteynik 156110b69418SYevgeny Kliteynik static void dr_ste_v1_build_src_gvmi_qpn_init(struct mlx5dr_ste_build *sb, 156210b69418SYevgeny Kliteynik struct mlx5dr_match_param *mask) 156310b69418SYevgeny Kliteynik { 156410b69418SYevgeny Kliteynik dr_ste_v1_build_src_gvmi_qpn_bit_mask(mask, sb->bit_mask); 156510b69418SYevgeny Kliteynik 156610b69418SYevgeny Kliteynik sb->lu_type = DR_STE_V1_LU_TYPE_SRC_QP_GVMI; 156710b69418SYevgeny Kliteynik sb->byte_mask = mlx5dr_ste_conv_bit_to_byte_mask(sb->bit_mask); 156810b69418SYevgeny Kliteynik sb->ste_build_tag_func = &dr_ste_v1_build_src_gvmi_qpn_tag; 156910b69418SYevgeny Kliteynik } 157010b69418SYevgeny Kliteynik 157110b69418SYevgeny Kliteynik struct mlx5dr_ste_ctx ste_ctx_v1 = { 1572a6098129SYevgeny Kliteynik /* Builders */ 157310b69418SYevgeny Kliteynik .build_eth_l2_src_dst_init = &dr_ste_v1_build_eth_l2_src_dst_init, 157410b69418SYevgeny Kliteynik .build_eth_l3_ipv6_src_init = &dr_ste_v1_build_eth_l3_ipv6_src_init, 157510b69418SYevgeny Kliteynik .build_eth_l3_ipv6_dst_init = &dr_ste_v1_build_eth_l3_ipv6_dst_init, 157610b69418SYevgeny Kliteynik .build_eth_l3_ipv4_5_tuple_init = &dr_ste_v1_build_eth_l3_ipv4_5_tuple_init, 157710b69418SYevgeny Kliteynik .build_eth_l2_src_init = &dr_ste_v1_build_eth_l2_src_init, 157810b69418SYevgeny Kliteynik .build_eth_l2_dst_init = &dr_ste_v1_build_eth_l2_dst_init, 157910b69418SYevgeny Kliteynik .build_eth_l2_tnl_init = &dr_ste_v1_build_eth_l2_tnl_init, 158010b69418SYevgeny Kliteynik .build_eth_l3_ipv4_misc_init = &dr_ste_v1_build_eth_l3_ipv4_misc_init, 158110b69418SYevgeny Kliteynik .build_eth_ipv6_l3_l4_init = &dr_ste_v1_build_eth_ipv6_l3_l4_init, 158210b69418SYevgeny Kliteynik .build_mpls_init = &dr_ste_v1_build_mpls_init, 158310b69418SYevgeny Kliteynik .build_tnl_gre_init = &dr_ste_v1_build_tnl_gre_init, 158410b69418SYevgeny Kliteynik .build_tnl_mpls_init = &dr_ste_v1_build_tnl_mpls_init, 158510b69418SYevgeny Kliteynik .build_icmp_init = &dr_ste_v1_build_icmp_init, 158610b69418SYevgeny Kliteynik .build_general_purpose_init = &dr_ste_v1_build_general_purpose_init, 158710b69418SYevgeny Kliteynik .build_eth_l4_misc_init = &dr_ste_v1_build_eth_l4_misc_init, 158810b69418SYevgeny Kliteynik .build_tnl_vxlan_gpe_init = &dr_ste_v1_build_flex_parser_tnl_vxlan_gpe_init, 158910b69418SYevgeny Kliteynik .build_tnl_geneve_init = &dr_ste_v1_build_flex_parser_tnl_geneve_init, 159010b69418SYevgeny Kliteynik .build_register_0_init = &dr_ste_v1_build_register_0_init, 159110b69418SYevgeny Kliteynik .build_register_1_init = &dr_ste_v1_build_register_1_init, 159210b69418SYevgeny Kliteynik .build_src_gvmi_qpn_init = &dr_ste_v1_build_src_gvmi_qpn_init, 1593a6098129SYevgeny Kliteynik /* Getters and Setters */ 1594a6098129SYevgeny Kliteynik .ste_init = &dr_ste_v1_init, 1595a6098129SYevgeny Kliteynik .set_next_lu_type = &dr_ste_v1_set_next_lu_type, 1596a6098129SYevgeny Kliteynik .get_next_lu_type = &dr_ste_v1_get_next_lu_type, 1597a6098129SYevgeny Kliteynik .set_miss_addr = &dr_ste_v1_set_miss_addr, 1598a6098129SYevgeny Kliteynik .get_miss_addr = &dr_ste_v1_get_miss_addr, 1599a6098129SYevgeny Kliteynik .set_hit_addr = &dr_ste_v1_set_hit_addr, 1600a6098129SYevgeny Kliteynik .set_byte_mask = &dr_ste_v1_set_byte_mask, 1601a6098129SYevgeny Kliteynik .get_byte_mask = &dr_ste_v1_get_byte_mask, 16024e856c5dSYevgeny Kliteynik /* Actions */ 16034e856c5dSYevgeny Kliteynik .set_actions_rx = &dr_ste_v1_set_actions_rx, 16044e856c5dSYevgeny Kliteynik .set_actions_tx = &dr_ste_v1_set_actions_tx, 1605*c349b413SYevgeny Kliteynik .modify_field_arr_sz = ARRAY_SIZE(dr_ste_v1_action_modify_field_arr), 1606*c349b413SYevgeny Kliteynik .modify_field_arr = dr_ste_v1_action_modify_field_arr, 1607*c349b413SYevgeny Kliteynik .set_action_set = &dr_ste_v1_set_action_set, 1608*c349b413SYevgeny Kliteynik .set_action_add = &dr_ste_v1_set_action_add, 1609*c349b413SYevgeny Kliteynik .set_action_copy = &dr_ste_v1_set_action_copy, 1610*c349b413SYevgeny Kliteynik .set_action_decap_l3_list = &dr_ste_v1_set_action_decap_l3_list, 161110b69418SYevgeny Kliteynik }; 1612