126d688e3SAlex Vesker // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
226d688e3SAlex Vesker /* Copyright (c) 2019 Mellanox Technologies. */
326d688e3SAlex Vesker 
426d688e3SAlex Vesker #include <linux/types.h>
540416d8eSHamdan Igbaria #include <linux/crc32.h>
64bdba39bSYevgeny Kliteynik #include "dr_ste.h"
726d688e3SAlex Vesker 
826d688e3SAlex Vesker struct dr_hw_ste_format {
926d688e3SAlex Vesker 	u8 ctrl[DR_STE_SIZE_CTRL];
1026d688e3SAlex Vesker 	u8 tag[DR_STE_SIZE_TAG];
1126d688e3SAlex Vesker 	u8 mask[DR_STE_SIZE_MASK];
1226d688e3SAlex Vesker };
1326d688e3SAlex Vesker 
dr_ste_crc32_calc(const void * input_data,size_t length)1440416d8eSHamdan Igbaria static u32 dr_ste_crc32_calc(const void *input_data, size_t length)
1540416d8eSHamdan Igbaria {
1640416d8eSHamdan Igbaria 	u32 crc = crc32(0, input_data, length);
1740416d8eSHamdan Igbaria 
18*1e5daf55SErez Shitrit 	return (__force u32)((crc >> 24) & 0xff) | ((crc << 8) & 0xff0000) |
19*1e5daf55SErez Shitrit 			    ((crc >> 8) & 0xff00) | ((crc << 24) & 0xff000000);
2040416d8eSHamdan Igbaria }
2140416d8eSHamdan Igbaria 
mlx5dr_ste_supp_ttl_cs_recalc(struct mlx5dr_cmd_caps * caps)22a283ea1bSYevgeny Kliteynik bool mlx5dr_ste_supp_ttl_cs_recalc(struct mlx5dr_cmd_caps *caps)
23a283ea1bSYevgeny Kliteynik {
24a283ea1bSYevgeny Kliteynik 	return caps->sw_format_ver > MLX5_STEERING_FORMAT_CONNECTX_5;
25a283ea1bSYevgeny Kliteynik }
26a283ea1bSYevgeny Kliteynik 
mlx5dr_ste_calc_hash_index(u8 * hw_ste_p,struct mlx5dr_ste_htbl * htbl)2726d688e3SAlex Vesker u32 mlx5dr_ste_calc_hash_index(u8 *hw_ste_p, struct mlx5dr_ste_htbl *htbl)
2826d688e3SAlex Vesker {
29f51bb517SRongwei Liu 	u32 num_entries = mlx5dr_icm_pool_get_chunk_num_of_entries(htbl->chunk);
3026d688e3SAlex Vesker 	struct dr_hw_ste_format *hw_ste = (struct dr_hw_ste_format *)hw_ste_p;
3126d688e3SAlex Vesker 	u8 masked[DR_STE_SIZE_TAG] = {};
3226d688e3SAlex Vesker 	u32 crc32, index;
3326d688e3SAlex Vesker 	u16 bit;
3426d688e3SAlex Vesker 	int i;
3526d688e3SAlex Vesker 
3626d688e3SAlex Vesker 	/* Don't calculate CRC if the result is predicted */
37f51bb517SRongwei Liu 	if (num_entries == 1 || htbl->byte_mask == 0)
3826d688e3SAlex Vesker 		return 0;
3926d688e3SAlex Vesker 
4026d688e3SAlex Vesker 	/* Mask tag using byte mask, bit per byte */
4126d688e3SAlex Vesker 	bit = 1 << (DR_STE_SIZE_TAG - 1);
4226d688e3SAlex Vesker 	for (i = 0; i < DR_STE_SIZE_TAG; i++) {
4326d688e3SAlex Vesker 		if (htbl->byte_mask & bit)
4426d688e3SAlex Vesker 			masked[i] = hw_ste->tag[i];
4526d688e3SAlex Vesker 
4626d688e3SAlex Vesker 		bit = bit >> 1;
4726d688e3SAlex Vesker 	}
4826d688e3SAlex Vesker 
4940416d8eSHamdan Igbaria 	crc32 = dr_ste_crc32_calc(masked, DR_STE_SIZE_TAG);
50f51bb517SRongwei Liu 	index = crc32 & (num_entries - 1);
5126d688e3SAlex Vesker 
5226d688e3SAlex Vesker 	return index;
5326d688e3SAlex Vesker }
5426d688e3SAlex Vesker 
mlx5dr_ste_conv_bit_to_byte_mask(u8 * bit_mask)555212f9c6SYevgeny Kliteynik u16 mlx5dr_ste_conv_bit_to_byte_mask(u8 *bit_mask)
5626d688e3SAlex Vesker {
5726d688e3SAlex Vesker 	u16 byte_mask = 0;
5826d688e3SAlex Vesker 	int i;
5926d688e3SAlex Vesker 
6026d688e3SAlex Vesker 	for (i = 0; i < DR_STE_SIZE_MASK; i++) {
6126d688e3SAlex Vesker 		byte_mask = byte_mask << 1;
6226d688e3SAlex Vesker 		if (bit_mask[i] == 0xff)
6326d688e3SAlex Vesker 			byte_mask |= 1;
6426d688e3SAlex Vesker 	}
6526d688e3SAlex Vesker 	return byte_mask;
6626d688e3SAlex Vesker }
6726d688e3SAlex Vesker 
dr_ste_get_tag(u8 * hw_ste_p)6864c78942SYevgeny Kliteynik static u8 *dr_ste_get_tag(u8 *hw_ste_p)
69e6b69bf3SYevgeny Kliteynik {
70e6b69bf3SYevgeny Kliteynik 	struct dr_hw_ste_format *hw_ste = (struct dr_hw_ste_format *)hw_ste_p;
71e6b69bf3SYevgeny Kliteynik 
72e6b69bf3SYevgeny Kliteynik 	return hw_ste->tag;
73e6b69bf3SYevgeny Kliteynik }
74e6b69bf3SYevgeny Kliteynik 
mlx5dr_ste_set_bit_mask(u8 * hw_ste_p,u8 * bit_mask)7526d688e3SAlex Vesker void mlx5dr_ste_set_bit_mask(u8 *hw_ste_p, u8 *bit_mask)
7626d688e3SAlex Vesker {
7726d688e3SAlex Vesker 	struct dr_hw_ste_format *hw_ste = (struct dr_hw_ste_format *)hw_ste_p;
7826d688e3SAlex Vesker 
7926d688e3SAlex Vesker 	memcpy(hw_ste->mask, bit_mask, DR_STE_SIZE_MASK);
8026d688e3SAlex Vesker }
8126d688e3SAlex Vesker 
dr_ste_set_always_hit(struct dr_hw_ste_format * hw_ste)8226d688e3SAlex Vesker static void dr_ste_set_always_hit(struct dr_hw_ste_format *hw_ste)
8326d688e3SAlex Vesker {
8426d688e3SAlex Vesker 	memset(&hw_ste->tag, 0, sizeof(hw_ste->tag));
8526d688e3SAlex Vesker 	memset(&hw_ste->mask, 0, sizeof(hw_ste->mask));
8626d688e3SAlex Vesker }
8726d688e3SAlex Vesker 
dr_ste_set_always_miss(struct dr_hw_ste_format * hw_ste)8826d688e3SAlex Vesker static void dr_ste_set_always_miss(struct dr_hw_ste_format *hw_ste)
8926d688e3SAlex Vesker {
9026d688e3SAlex Vesker 	hw_ste->tag[0] = 0xdc;
9126d688e3SAlex Vesker 	hw_ste->mask[0] = 0;
9226d688e3SAlex Vesker }
9326d688e3SAlex Vesker 
mlx5dr_ste_is_miss_addr_set(struct mlx5dr_ste_ctx * ste_ctx,u8 * hw_ste_p)941207a772SYevgeny Kliteynik bool mlx5dr_ste_is_miss_addr_set(struct mlx5dr_ste_ctx *ste_ctx,
951207a772SYevgeny Kliteynik 				 u8 *hw_ste_p)
961207a772SYevgeny Kliteynik {
971207a772SYevgeny Kliteynik 	if (!ste_ctx->is_miss_addr_set)
981207a772SYevgeny Kliteynik 		return false;
991207a772SYevgeny Kliteynik 
1001207a772SYevgeny Kliteynik 	/* check if miss address is already set for this type of STE */
1011207a772SYevgeny Kliteynik 	return ste_ctx->is_miss_addr_set(hw_ste_p);
1021207a772SYevgeny Kliteynik }
1031207a772SYevgeny Kliteynik 
mlx5dr_ste_set_miss_addr(struct mlx5dr_ste_ctx * ste_ctx,u8 * hw_ste_p,u64 miss_addr)1046b93b400SYevgeny Kliteynik void mlx5dr_ste_set_miss_addr(struct mlx5dr_ste_ctx *ste_ctx,
1056b93b400SYevgeny Kliteynik 			      u8 *hw_ste_p, u64 miss_addr)
10664c78942SYevgeny Kliteynik {
1076b93b400SYevgeny Kliteynik 	ste_ctx->set_miss_addr(hw_ste_p, miss_addr);
10864c78942SYevgeny Kliteynik }
10964c78942SYevgeny Kliteynik 
dr_ste_always_miss_addr(struct mlx5dr_ste_ctx * ste_ctx,u8 * hw_ste,u64 miss_addr)1106b93b400SYevgeny Kliteynik static void dr_ste_always_miss_addr(struct mlx5dr_ste_ctx *ste_ctx,
1110d7f1595SRongwei Liu 				    u8 *hw_ste, u64 miss_addr)
11264c78942SYevgeny Kliteynik {
1130d7f1595SRongwei Liu 	ste_ctx->set_next_lu_type(hw_ste, MLX5DR_STE_LU_TYPE_DONT_CARE);
1140d7f1595SRongwei Liu 	ste_ctx->set_miss_addr(hw_ste, miss_addr);
1150d7f1595SRongwei Liu 	dr_ste_set_always_miss((struct dr_hw_ste_format *)hw_ste);
11664c78942SYevgeny Kliteynik }
11764c78942SYevgeny Kliteynik 
mlx5dr_ste_set_hit_addr(struct mlx5dr_ste_ctx * ste_ctx,u8 * hw_ste,u64 icm_addr,u32 ht_size)1186b93b400SYevgeny Kliteynik void mlx5dr_ste_set_hit_addr(struct mlx5dr_ste_ctx *ste_ctx,
1196b93b400SYevgeny Kliteynik 			     u8 *hw_ste, u64 icm_addr, u32 ht_size)
12026d688e3SAlex Vesker {
1216b93b400SYevgeny Kliteynik 	ste_ctx->set_hit_addr(hw_ste, icm_addr, ht_size);
12226d688e3SAlex Vesker }
12326d688e3SAlex Vesker 
mlx5dr_ste_get_icm_addr(struct mlx5dr_ste * ste)12426d688e3SAlex Vesker u64 mlx5dr_ste_get_icm_addr(struct mlx5dr_ste *ste)
12526d688e3SAlex Vesker {
1265c4f9b6eSRongwei Liu 	u64 base_icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(ste->htbl->chunk);
127597534bdSRongwei Liu 	u32 index = ste - ste->htbl->chunk->ste_arr;
12826d688e3SAlex Vesker 
1295c4f9b6eSRongwei Liu 	return base_icm_addr + DR_STE_SIZE * index;
13026d688e3SAlex Vesker }
13126d688e3SAlex Vesker 
mlx5dr_ste_get_mr_addr(struct mlx5dr_ste * ste)13226d688e3SAlex Vesker u64 mlx5dr_ste_get_mr_addr(struct mlx5dr_ste *ste)
13326d688e3SAlex Vesker {
134597534bdSRongwei Liu 	u32 index = ste - ste->htbl->chunk->ste_arr;
13526d688e3SAlex Vesker 
136003f4f9aSRongwei Liu 	return mlx5dr_icm_pool_get_chunk_mr_addr(ste->htbl->chunk) + DR_STE_SIZE * index;
13726d688e3SAlex Vesker }
13826d688e3SAlex Vesker 
mlx5dr_ste_get_hw_ste(struct mlx5dr_ste * ste)1390d7f1595SRongwei Liu u8 *mlx5dr_ste_get_hw_ste(struct mlx5dr_ste *ste)
1400d7f1595SRongwei Liu {
1410d7f1595SRongwei Liu 	u64 index = ste - ste->htbl->chunk->ste_arr;
1420d7f1595SRongwei Liu 
1430d7f1595SRongwei Liu 	return ste->htbl->chunk->hw_ste_arr + DR_STE_SIZE_REDUCED * index;
1440d7f1595SRongwei Liu }
1450d7f1595SRongwei Liu 
mlx5dr_ste_get_miss_list(struct mlx5dr_ste * ste)14626d688e3SAlex Vesker struct list_head *mlx5dr_ste_get_miss_list(struct mlx5dr_ste *ste)
14726d688e3SAlex Vesker {
148597534bdSRongwei Liu 	u32 index = ste - ste->htbl->chunk->ste_arr;
14926d688e3SAlex Vesker 
150597534bdSRongwei Liu 	return &ste->htbl->chunk->miss_list[index];
15126d688e3SAlex Vesker }
15226d688e3SAlex Vesker 
dr_ste_always_hit_htbl(struct mlx5dr_ste_ctx * ste_ctx,u8 * hw_ste,struct mlx5dr_ste_htbl * next_htbl)1536b93b400SYevgeny Kliteynik static void dr_ste_always_hit_htbl(struct mlx5dr_ste_ctx *ste_ctx,
1540d7f1595SRongwei Liu 				   u8 *hw_ste,
15526d688e3SAlex Vesker 				   struct mlx5dr_ste_htbl *next_htbl)
15626d688e3SAlex Vesker {
15726d688e3SAlex Vesker 	struct mlx5dr_icm_chunk *chunk = next_htbl->chunk;
15826d688e3SAlex Vesker 
1596b93b400SYevgeny Kliteynik 	ste_ctx->set_byte_mask(hw_ste, next_htbl->byte_mask);
1606b93b400SYevgeny Kliteynik 	ste_ctx->set_next_lu_type(hw_ste, next_htbl->lu_type);
1615c4f9b6eSRongwei Liu 	ste_ctx->set_hit_addr(hw_ste, mlx5dr_icm_pool_get_chunk_icm_addr(chunk),
162f51bb517SRongwei Liu 			      mlx5dr_icm_pool_get_chunk_num_of_entries(chunk));
16326d688e3SAlex Vesker 
1640d7f1595SRongwei Liu 	dr_ste_set_always_hit((struct dr_hw_ste_format *)hw_ste);
16526d688e3SAlex Vesker }
16626d688e3SAlex Vesker 
mlx5dr_ste_is_last_in_rule(struct mlx5dr_matcher_rx_tx * nic_matcher,u8 ste_location)16726d688e3SAlex Vesker bool mlx5dr_ste_is_last_in_rule(struct mlx5dr_matcher_rx_tx *nic_matcher,
16826d688e3SAlex Vesker 				u8 ste_location)
16926d688e3SAlex Vesker {
17026d688e3SAlex Vesker 	return ste_location == nic_matcher->num_of_builders;
17126d688e3SAlex Vesker }
17226d688e3SAlex Vesker 
17326d688e3SAlex Vesker /* Replace relevant fields, except of:
17426d688e3SAlex Vesker  * htbl - keep the origin htbl
17526d688e3SAlex Vesker  * miss_list + list - already took the src from the list.
17626d688e3SAlex Vesker  * icm_addr/mr_addr - depends on the hosting table.
17726d688e3SAlex Vesker  *
17826d688e3SAlex Vesker  * Before:
17926d688e3SAlex Vesker  * | a | -> | b | -> | c | ->
18026d688e3SAlex Vesker  *
18126d688e3SAlex Vesker  * After:
18226d688e3SAlex Vesker  * | a | -> | c | ->
18326d688e3SAlex Vesker  * While the data that was in b copied to a.
18426d688e3SAlex Vesker  */
dr_ste_replace(struct mlx5dr_ste * dst,struct mlx5dr_ste * src)18526d688e3SAlex Vesker static void dr_ste_replace(struct mlx5dr_ste *dst, struct mlx5dr_ste *src)
18626d688e3SAlex Vesker {
1870d7f1595SRongwei Liu 	memcpy(mlx5dr_ste_get_hw_ste(dst), mlx5dr_ste_get_hw_ste(src),
1880d7f1595SRongwei Liu 	       DR_STE_SIZE_REDUCED);
18926d688e3SAlex Vesker 	dst->next_htbl = src->next_htbl;
19026d688e3SAlex Vesker 	if (dst->next_htbl)
19126d688e3SAlex Vesker 		dst->next_htbl->pointing_ste = dst;
19226d688e3SAlex Vesker 
1934ce380caSYevgeny Kliteynik 	dst->refcount = src->refcount;
19426d688e3SAlex Vesker }
19526d688e3SAlex Vesker 
19626d688e3SAlex Vesker /* Free ste which is the head and the only one in miss_list */
19726d688e3SAlex Vesker static void
dr_ste_remove_head_ste(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste * ste,struct mlx5dr_matcher_rx_tx * nic_matcher,struct mlx5dr_ste_send_info * ste_info_head,struct list_head * send_ste_list,struct mlx5dr_ste_htbl * stats_tbl)1986b93b400SYevgeny Kliteynik dr_ste_remove_head_ste(struct mlx5dr_ste_ctx *ste_ctx,
1996b93b400SYevgeny Kliteynik 		       struct mlx5dr_ste *ste,
20026d688e3SAlex Vesker 		       struct mlx5dr_matcher_rx_tx *nic_matcher,
20126d688e3SAlex Vesker 		       struct mlx5dr_ste_send_info *ste_info_head,
20226d688e3SAlex Vesker 		       struct list_head *send_ste_list,
20326d688e3SAlex Vesker 		       struct mlx5dr_ste_htbl *stats_tbl)
20426d688e3SAlex Vesker {
20526d688e3SAlex Vesker 	u8 tmp_data_ste[DR_STE_SIZE] = {};
20626d688e3SAlex Vesker 	u64 miss_addr;
20726d688e3SAlex Vesker 
2080d7f1595SRongwei Liu 	miss_addr = mlx5dr_icm_pool_get_chunk_icm_addr(nic_matcher->e_anchor->chunk);
20926d688e3SAlex Vesker 
21026d688e3SAlex Vesker 	/* Use temp ste because dr_ste_always_miss_addr
21126d688e3SAlex Vesker 	 * touches bit_mask area which doesn't exist at ste->hw_ste.
2120d7f1595SRongwei Liu 	 * Need to use a full-sized (DR_STE_SIZE) hw_ste.
21326d688e3SAlex Vesker 	 */
2140d7f1595SRongwei Liu 	memcpy(tmp_data_ste, mlx5dr_ste_get_hw_ste(ste), DR_STE_SIZE_REDUCED);
2150d7f1595SRongwei Liu 	dr_ste_always_miss_addr(ste_ctx, tmp_data_ste, miss_addr);
2160d7f1595SRongwei Liu 	memcpy(mlx5dr_ste_get_hw_ste(ste), tmp_data_ste, DR_STE_SIZE_REDUCED);
21726d688e3SAlex Vesker 
21826d688e3SAlex Vesker 	list_del_init(&ste->miss_list_node);
21926d688e3SAlex Vesker 
22026d688e3SAlex Vesker 	/* Write full STE size in order to have "always_miss" */
22126d688e3SAlex Vesker 	mlx5dr_send_fill_and_append_ste_send_info(ste, DR_STE_SIZE,
22226d688e3SAlex Vesker 						  0, tmp_data_ste,
22326d688e3SAlex Vesker 						  ste_info_head,
22426d688e3SAlex Vesker 						  send_ste_list,
22526d688e3SAlex Vesker 						  true /* Copy data */);
22626d688e3SAlex Vesker 
22726d688e3SAlex Vesker 	stats_tbl->ctrl.num_of_valid_entries--;
22826d688e3SAlex Vesker }
22926d688e3SAlex Vesker 
23026d688e3SAlex Vesker /* Free ste which is the head but NOT the only one in miss_list:
23126d688e3SAlex Vesker  * |_ste_| --> |_next_ste_| -->|__| -->|__| -->/0
23226d688e3SAlex Vesker  */
23326d688e3SAlex Vesker static void
dr_ste_replace_head_ste(struct mlx5dr_matcher_rx_tx * nic_matcher,struct mlx5dr_ste * ste,struct mlx5dr_ste * next_ste,struct mlx5dr_ste_send_info * ste_info_head,struct list_head * send_ste_list,struct mlx5dr_ste_htbl * stats_tbl)2348fdac12aSYevgeny Kliteynik dr_ste_replace_head_ste(struct mlx5dr_matcher_rx_tx *nic_matcher,
2358fdac12aSYevgeny Kliteynik 			struct mlx5dr_ste *ste,
2368fdac12aSYevgeny Kliteynik 			struct mlx5dr_ste *next_ste,
23726d688e3SAlex Vesker 			struct mlx5dr_ste_send_info *ste_info_head,
23826d688e3SAlex Vesker 			struct list_head *send_ste_list,
23926d688e3SAlex Vesker 			struct mlx5dr_ste_htbl *stats_tbl)
24026d688e3SAlex Vesker 
24126d688e3SAlex Vesker {
24226d688e3SAlex Vesker 	struct mlx5dr_ste_htbl *next_miss_htbl;
2438fdac12aSYevgeny Kliteynik 	u8 hw_ste[DR_STE_SIZE] = {};
2448fdac12aSYevgeny Kliteynik 	int sb_idx;
24526d688e3SAlex Vesker 
24626d688e3SAlex Vesker 	next_miss_htbl = next_ste->htbl;
24726d688e3SAlex Vesker 
24826d688e3SAlex Vesker 	/* Remove from the miss_list the next_ste before copy */
24926d688e3SAlex Vesker 	list_del_init(&next_ste->miss_list_node);
25026d688e3SAlex Vesker 
25126d688e3SAlex Vesker 	/* Move data from next into ste */
25226d688e3SAlex Vesker 	dr_ste_replace(ste, next_ste);
25326d688e3SAlex Vesker 
2548a015baeSYevgeny Kliteynik 	/* Update the rule on STE change */
2558a015baeSYevgeny Kliteynik 	mlx5dr_rule_set_last_member(next_ste->rule_rx_tx, ste, false);
2568a015baeSYevgeny Kliteynik 
2578fdac12aSYevgeny Kliteynik 	/* Copy all 64 hw_ste bytes */
2580d7f1595SRongwei Liu 	memcpy(hw_ste, mlx5dr_ste_get_hw_ste(ste), DR_STE_SIZE_REDUCED);
2598fdac12aSYevgeny Kliteynik 	sb_idx = ste->ste_chain_location - 1;
2608fdac12aSYevgeny Kliteynik 	mlx5dr_ste_set_bit_mask(hw_ste,
2618fdac12aSYevgeny Kliteynik 				nic_matcher->ste_builder[sb_idx].bit_mask);
2628fdac12aSYevgeny Kliteynik 
26326d688e3SAlex Vesker 	/* Del the htbl that contains the next_ste.
26426d688e3SAlex Vesker 	 * The origin htbl stay with the same number of entries.
26526d688e3SAlex Vesker 	 */
26626d688e3SAlex Vesker 	mlx5dr_htbl_put(next_miss_htbl);
26726d688e3SAlex Vesker 
2688fdac12aSYevgeny Kliteynik 	mlx5dr_send_fill_and_append_ste_send_info(ste, DR_STE_SIZE,
2698fdac12aSYevgeny Kliteynik 						  0, hw_ste,
27026d688e3SAlex Vesker 						  ste_info_head,
27126d688e3SAlex Vesker 						  send_ste_list,
27226d688e3SAlex Vesker 						  true /* Copy data */);
27326d688e3SAlex Vesker 
27426d688e3SAlex Vesker 	stats_tbl->ctrl.num_of_collisions--;
27526d688e3SAlex Vesker 	stats_tbl->ctrl.num_of_valid_entries--;
27626d688e3SAlex Vesker }
27726d688e3SAlex Vesker 
27826d688e3SAlex Vesker /* Free ste that is located in the middle of the miss list:
27926d688e3SAlex Vesker  * |__| -->|_prev_ste_|->|_ste_|-->|_next_ste_|
28026d688e3SAlex Vesker  */
dr_ste_remove_middle_ste(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste * ste,struct mlx5dr_ste_send_info * ste_info,struct list_head * send_ste_list,struct mlx5dr_ste_htbl * stats_tbl)2816b93b400SYevgeny Kliteynik static void dr_ste_remove_middle_ste(struct mlx5dr_ste_ctx *ste_ctx,
2826b93b400SYevgeny Kliteynik 				     struct mlx5dr_ste *ste,
28326d688e3SAlex Vesker 				     struct mlx5dr_ste_send_info *ste_info,
28426d688e3SAlex Vesker 				     struct list_head *send_ste_list,
28526d688e3SAlex Vesker 				     struct mlx5dr_ste_htbl *stats_tbl)
28626d688e3SAlex Vesker {
28726d688e3SAlex Vesker 	struct mlx5dr_ste *prev_ste;
28826d688e3SAlex Vesker 	u64 miss_addr;
28926d688e3SAlex Vesker 
29048cbde4bSAlex Vesker 	prev_ste = list_prev_entry(ste, miss_list_node);
29148cbde4bSAlex Vesker 	if (WARN_ON(!prev_ste))
29226d688e3SAlex Vesker 		return;
29326d688e3SAlex Vesker 
2940d7f1595SRongwei Liu 	miss_addr = ste_ctx->get_miss_addr(mlx5dr_ste_get_hw_ste(ste));
2950d7f1595SRongwei Liu 	ste_ctx->set_miss_addr(mlx5dr_ste_get_hw_ste(prev_ste), miss_addr);
29626d688e3SAlex Vesker 
297f06d4969SYevgeny Kliteynik 	mlx5dr_send_fill_and_append_ste_send_info(prev_ste, DR_STE_SIZE_CTRL, 0,
2980d7f1595SRongwei Liu 						  mlx5dr_ste_get_hw_ste(prev_ste),
2990d7f1595SRongwei Liu 						  ste_info, send_ste_list,
3000d7f1595SRongwei Liu 						  true /* Copy data*/);
30126d688e3SAlex Vesker 
30226d688e3SAlex Vesker 	list_del_init(&ste->miss_list_node);
30326d688e3SAlex Vesker 
30426d688e3SAlex Vesker 	stats_tbl->ctrl.num_of_valid_entries--;
30526d688e3SAlex Vesker 	stats_tbl->ctrl.num_of_collisions--;
30626d688e3SAlex Vesker }
30726d688e3SAlex Vesker 
mlx5dr_ste_free(struct mlx5dr_ste * ste,struct mlx5dr_matcher * matcher,struct mlx5dr_matcher_rx_tx * nic_matcher)30826d688e3SAlex Vesker void mlx5dr_ste_free(struct mlx5dr_ste *ste,
30926d688e3SAlex Vesker 		     struct mlx5dr_matcher *matcher,
31026d688e3SAlex Vesker 		     struct mlx5dr_matcher_rx_tx *nic_matcher)
31126d688e3SAlex Vesker {
31226d688e3SAlex Vesker 	struct mlx5dr_ste_send_info *cur_ste_info, *tmp_ste_info;
31326d688e3SAlex Vesker 	struct mlx5dr_domain *dmn = matcher->tbl->dmn;
3146b93b400SYevgeny Kliteynik 	struct mlx5dr_ste_ctx *ste_ctx = dmn->ste_ctx;
31526d688e3SAlex Vesker 	struct mlx5dr_ste_send_info ste_info_head;
31626d688e3SAlex Vesker 	struct mlx5dr_ste *next_ste, *first_ste;
31726d688e3SAlex Vesker 	bool put_on_origin_table = true;
31826d688e3SAlex Vesker 	struct mlx5dr_ste_htbl *stats_tbl;
31926d688e3SAlex Vesker 	LIST_HEAD(send_ste_list);
32026d688e3SAlex Vesker 
32148cbde4bSAlex Vesker 	first_ste = list_first_entry(mlx5dr_ste_get_miss_list(ste),
32226d688e3SAlex Vesker 				     struct mlx5dr_ste, miss_list_node);
32326d688e3SAlex Vesker 	stats_tbl = first_ste->htbl;
32426d688e3SAlex Vesker 
32526d688e3SAlex Vesker 	/* Two options:
32626d688e3SAlex Vesker 	 * 1. ste is head:
32726d688e3SAlex Vesker 	 *	a. head ste is the only ste in the miss list
32826d688e3SAlex Vesker 	 *	b. head ste is not the only ste in the miss-list
32926d688e3SAlex Vesker 	 * 2. ste is not head
33026d688e3SAlex Vesker 	 */
33126d688e3SAlex Vesker 	if (first_ste == ste) { /* Ste is the head */
33226d688e3SAlex Vesker 		struct mlx5dr_ste *last_ste;
33326d688e3SAlex Vesker 
33426d688e3SAlex Vesker 		last_ste = list_last_entry(mlx5dr_ste_get_miss_list(ste),
33526d688e3SAlex Vesker 					   struct mlx5dr_ste, miss_list_node);
33626d688e3SAlex Vesker 		if (last_ste == first_ste)
33726d688e3SAlex Vesker 			next_ste = NULL;
33826d688e3SAlex Vesker 		else
33948cbde4bSAlex Vesker 			next_ste = list_next_entry(ste, miss_list_node);
34026d688e3SAlex Vesker 
34126d688e3SAlex Vesker 		if (!next_ste) {
34226d688e3SAlex Vesker 			/* One and only entry in the list */
3436b93b400SYevgeny Kliteynik 			dr_ste_remove_head_ste(ste_ctx, ste,
3446b93b400SYevgeny Kliteynik 					       nic_matcher,
34526d688e3SAlex Vesker 					       &ste_info_head,
34626d688e3SAlex Vesker 					       &send_ste_list,
34726d688e3SAlex Vesker 					       stats_tbl);
34826d688e3SAlex Vesker 		} else {
34926d688e3SAlex Vesker 			/* First but not only entry in the list */
3508fdac12aSYevgeny Kliteynik 			dr_ste_replace_head_ste(nic_matcher, ste,
3518fdac12aSYevgeny Kliteynik 						next_ste, &ste_info_head,
35226d688e3SAlex Vesker 						&send_ste_list, stats_tbl);
35326d688e3SAlex Vesker 			put_on_origin_table = false;
35426d688e3SAlex Vesker 		}
35526d688e3SAlex Vesker 	} else { /* Ste in the middle of the list */
3566b93b400SYevgeny Kliteynik 		dr_ste_remove_middle_ste(ste_ctx, ste,
3576b93b400SYevgeny Kliteynik 					 &ste_info_head, &send_ste_list,
3586b93b400SYevgeny Kliteynik 					 stats_tbl);
35926d688e3SAlex Vesker 	}
36026d688e3SAlex Vesker 
36126d688e3SAlex Vesker 	/* Update HW */
36226d688e3SAlex Vesker 	list_for_each_entry_safe(cur_ste_info, tmp_ste_info,
36326d688e3SAlex Vesker 				 &send_ste_list, send_list) {
36426d688e3SAlex Vesker 		list_del(&cur_ste_info->send_list);
36526d688e3SAlex Vesker 		mlx5dr_send_postsend_ste(dmn, cur_ste_info->ste,
36626d688e3SAlex Vesker 					 cur_ste_info->data, cur_ste_info->size,
36726d688e3SAlex Vesker 					 cur_ste_info->offset);
36826d688e3SAlex Vesker 	}
36926d688e3SAlex Vesker 
37026d688e3SAlex Vesker 	if (put_on_origin_table)
37126d688e3SAlex Vesker 		mlx5dr_htbl_put(ste->htbl);
37226d688e3SAlex Vesker }
37326d688e3SAlex Vesker 
mlx5dr_ste_equal_tag(void * src,void * dst)37426d688e3SAlex Vesker bool mlx5dr_ste_equal_tag(void *src, void *dst)
37526d688e3SAlex Vesker {
37626d688e3SAlex Vesker 	struct dr_hw_ste_format *s_hw_ste = (struct dr_hw_ste_format *)src;
37726d688e3SAlex Vesker 	struct dr_hw_ste_format *d_hw_ste = (struct dr_hw_ste_format *)dst;
37826d688e3SAlex Vesker 
37926d688e3SAlex Vesker 	return !memcmp(s_hw_ste->tag, d_hw_ste->tag, DR_STE_SIZE_TAG);
38026d688e3SAlex Vesker }
38126d688e3SAlex Vesker 
mlx5dr_ste_set_hit_addr_by_next_htbl(struct mlx5dr_ste_ctx * ste_ctx,u8 * hw_ste,struct mlx5dr_ste_htbl * next_htbl)3826b93b400SYevgeny Kliteynik void mlx5dr_ste_set_hit_addr_by_next_htbl(struct mlx5dr_ste_ctx *ste_ctx,
3836b93b400SYevgeny Kliteynik 					  u8 *hw_ste,
38426d688e3SAlex Vesker 					  struct mlx5dr_ste_htbl *next_htbl)
38526d688e3SAlex Vesker {
3865c4f9b6eSRongwei Liu 	u64 icm_addr = mlx5dr_icm_pool_get_chunk_icm_addr(next_htbl->chunk);
387f51bb517SRongwei Liu 	u32 num_entries =
388f51bb517SRongwei Liu 		mlx5dr_icm_pool_get_chunk_num_of_entries(next_htbl->chunk);
38926d688e3SAlex Vesker 
390f51bb517SRongwei Liu 	ste_ctx->set_hit_addr(hw_ste, icm_addr, num_entries);
39126d688e3SAlex Vesker }
39226d688e3SAlex Vesker 
mlx5dr_ste_prepare_for_postsend(struct mlx5dr_ste_ctx * ste_ctx,u8 * hw_ste_p,u32 ste_size)3934fe45e1dSYevgeny Kliteynik void mlx5dr_ste_prepare_for_postsend(struct mlx5dr_ste_ctx *ste_ctx,
3944fe45e1dSYevgeny Kliteynik 				     u8 *hw_ste_p, u32 ste_size)
3954fe45e1dSYevgeny Kliteynik {
3964fe45e1dSYevgeny Kliteynik 	if (ste_ctx->prepare_for_postsend)
3974fe45e1dSYevgeny Kliteynik 		ste_ctx->prepare_for_postsend(hw_ste_p, ste_size);
3984fe45e1dSYevgeny Kliteynik }
3994fe45e1dSYevgeny Kliteynik 
40026d688e3SAlex Vesker /* Init one ste as a pattern for ste data array */
mlx5dr_ste_set_formatted_ste(struct mlx5dr_ste_ctx * ste_ctx,u16 gvmi,enum mlx5dr_domain_nic_type nic_type,struct mlx5dr_ste_htbl * htbl,u8 * formatted_ste,struct mlx5dr_htbl_connect_info * connect_info)4016b93b400SYevgeny Kliteynik void mlx5dr_ste_set_formatted_ste(struct mlx5dr_ste_ctx *ste_ctx,
4026b93b400SYevgeny Kliteynik 				  u16 gvmi,
40346f2a8aeSYevgeny Kliteynik 				  enum mlx5dr_domain_nic_type nic_type,
40426d688e3SAlex Vesker 				  struct mlx5dr_ste_htbl *htbl,
40526d688e3SAlex Vesker 				  u8 *formatted_ste,
40626d688e3SAlex Vesker 				  struct mlx5dr_htbl_connect_info *connect_info)
40726d688e3SAlex Vesker {
40846f2a8aeSYevgeny Kliteynik 	bool is_rx = nic_type == DR_DOMAIN_NIC_TYPE_RX;
4090d7f1595SRongwei Liu 	u8 tmp_hw_ste[DR_STE_SIZE] = {0};
41026d688e3SAlex Vesker 
41146f2a8aeSYevgeny Kliteynik 	ste_ctx->ste_init(formatted_ste, htbl->lu_type, is_rx, gvmi);
41226d688e3SAlex Vesker 
4130d7f1595SRongwei Liu 	/* Use temp ste because dr_ste_always_miss_addr/hit_htbl
4140d7f1595SRongwei Liu 	 * touches bit_mask area which doesn't exist at ste->hw_ste.
4150d7f1595SRongwei Liu 	 * Need to use a full-sized (DR_STE_SIZE) hw_ste.
4160d7f1595SRongwei Liu 	 */
4170d7f1595SRongwei Liu 	memcpy(tmp_hw_ste, formatted_ste, DR_STE_SIZE_REDUCED);
41826d688e3SAlex Vesker 	if (connect_info->type == CONNECT_HIT)
4190d7f1595SRongwei Liu 		dr_ste_always_hit_htbl(ste_ctx, tmp_hw_ste,
4200d7f1595SRongwei Liu 				       connect_info->hit_next_htbl);
42126d688e3SAlex Vesker 	else
4220d7f1595SRongwei Liu 		dr_ste_always_miss_addr(ste_ctx, tmp_hw_ste,
4230d7f1595SRongwei Liu 					connect_info->miss_icm_addr);
4240d7f1595SRongwei Liu 	memcpy(formatted_ste, tmp_hw_ste, DR_STE_SIZE_REDUCED);
42526d688e3SAlex Vesker }
42626d688e3SAlex Vesker 
mlx5dr_ste_htbl_init_and_postsend(struct mlx5dr_domain * dmn,struct mlx5dr_domain_rx_tx * nic_dmn,struct mlx5dr_ste_htbl * htbl,struct mlx5dr_htbl_connect_info * connect_info,bool update_hw_ste)42726d688e3SAlex Vesker int mlx5dr_ste_htbl_init_and_postsend(struct mlx5dr_domain *dmn,
42826d688e3SAlex Vesker 				      struct mlx5dr_domain_rx_tx *nic_dmn,
42926d688e3SAlex Vesker 				      struct mlx5dr_ste_htbl *htbl,
43026d688e3SAlex Vesker 				      struct mlx5dr_htbl_connect_info *connect_info,
43126d688e3SAlex Vesker 				      bool update_hw_ste)
43226d688e3SAlex Vesker {
43326d688e3SAlex Vesker 	u8 formatted_ste[DR_STE_SIZE] = {};
43426d688e3SAlex Vesker 
4356b93b400SYevgeny Kliteynik 	mlx5dr_ste_set_formatted_ste(dmn->ste_ctx,
4366b93b400SYevgeny Kliteynik 				     dmn->info.caps.gvmi,
43746f2a8aeSYevgeny Kliteynik 				     nic_dmn->type,
43826d688e3SAlex Vesker 				     htbl,
43926d688e3SAlex Vesker 				     formatted_ste,
44026d688e3SAlex Vesker 				     connect_info);
44126d688e3SAlex Vesker 
44226d688e3SAlex Vesker 	return mlx5dr_send_postsend_formatted_htbl(dmn, htbl, formatted_ste, update_hw_ste);
44326d688e3SAlex Vesker }
44426d688e3SAlex Vesker 
mlx5dr_ste_create_next_htbl(struct mlx5dr_matcher * matcher,struct mlx5dr_matcher_rx_tx * nic_matcher,struct mlx5dr_ste * ste,u8 * cur_hw_ste,enum mlx5dr_icm_chunk_size log_table_size)44526d688e3SAlex Vesker int mlx5dr_ste_create_next_htbl(struct mlx5dr_matcher *matcher,
44626d688e3SAlex Vesker 				struct mlx5dr_matcher_rx_tx *nic_matcher,
44726d688e3SAlex Vesker 				struct mlx5dr_ste *ste,
44826d688e3SAlex Vesker 				u8 *cur_hw_ste,
44926d688e3SAlex Vesker 				enum mlx5dr_icm_chunk_size log_table_size)
45026d688e3SAlex Vesker {
45126d688e3SAlex Vesker 	struct mlx5dr_domain_rx_tx *nic_dmn = nic_matcher->nic_tbl->nic_dmn;
45226d688e3SAlex Vesker 	struct mlx5dr_domain *dmn = matcher->tbl->dmn;
4536b93b400SYevgeny Kliteynik 	struct mlx5dr_ste_ctx *ste_ctx = dmn->ste_ctx;
45426d688e3SAlex Vesker 	struct mlx5dr_htbl_connect_info info;
45526d688e3SAlex Vesker 	struct mlx5dr_ste_htbl *next_htbl;
45626d688e3SAlex Vesker 
45726d688e3SAlex Vesker 	if (!mlx5dr_ste_is_last_in_rule(nic_matcher, ste->ste_chain_location)) {
458dd2d3c8dSYevgeny Kliteynik 		u16 next_lu_type;
45926d688e3SAlex Vesker 		u16 byte_mask;
46026d688e3SAlex Vesker 
4616b93b400SYevgeny Kliteynik 		next_lu_type = ste_ctx->get_next_lu_type(cur_hw_ste);
4626b93b400SYevgeny Kliteynik 		byte_mask = ste_ctx->get_byte_mask(cur_hw_ste);
46326d688e3SAlex Vesker 
46426d688e3SAlex Vesker 		next_htbl = mlx5dr_ste_htbl_alloc(dmn->ste_icm_pool,
46526d688e3SAlex Vesker 						  log_table_size,
46626d688e3SAlex Vesker 						  next_lu_type,
46726d688e3SAlex Vesker 						  byte_mask);
46826d688e3SAlex Vesker 		if (!next_htbl) {
46926d688e3SAlex Vesker 			mlx5dr_dbg(dmn, "Failed allocating table\n");
47026d688e3SAlex Vesker 			return -ENOMEM;
47126d688e3SAlex Vesker 		}
47226d688e3SAlex Vesker 
47326d688e3SAlex Vesker 		/* Write new table to HW */
47426d688e3SAlex Vesker 		info.type = CONNECT_MISS;
4755c4f9b6eSRongwei Liu 		info.miss_icm_addr =
4765c4f9b6eSRongwei Liu 			mlx5dr_icm_pool_get_chunk_icm_addr(nic_matcher->e_anchor->chunk);
47726d688e3SAlex Vesker 		if (mlx5dr_ste_htbl_init_and_postsend(dmn, nic_dmn, next_htbl,
47826d688e3SAlex Vesker 						      &info, false)) {
47926d688e3SAlex Vesker 			mlx5dr_info(dmn, "Failed writing table to HW\n");
48026d688e3SAlex Vesker 			goto free_table;
48126d688e3SAlex Vesker 		}
48226d688e3SAlex Vesker 
4836b93b400SYevgeny Kliteynik 		mlx5dr_ste_set_hit_addr_by_next_htbl(ste_ctx,
4846b93b400SYevgeny Kliteynik 						     cur_hw_ste, next_htbl);
48526d688e3SAlex Vesker 		ste->next_htbl = next_htbl;
48626d688e3SAlex Vesker 		next_htbl->pointing_ste = ste;
48726d688e3SAlex Vesker 	}
48826d688e3SAlex Vesker 
48926d688e3SAlex Vesker 	return 0;
49026d688e3SAlex Vesker 
49126d688e3SAlex Vesker free_table:
49226d688e3SAlex Vesker 	mlx5dr_ste_htbl_free(next_htbl);
49326d688e3SAlex Vesker 	return -ENOENT;
49426d688e3SAlex Vesker }
49526d688e3SAlex Vesker 
mlx5dr_ste_htbl_alloc(struct mlx5dr_icm_pool * pool,enum mlx5dr_icm_chunk_size chunk_size,u16 lu_type,u16 byte_mask)49626d688e3SAlex Vesker struct mlx5dr_ste_htbl *mlx5dr_ste_htbl_alloc(struct mlx5dr_icm_pool *pool,
49726d688e3SAlex Vesker 					      enum mlx5dr_icm_chunk_size chunk_size,
498dd2d3c8dSYevgeny Kliteynik 					      u16 lu_type, u16 byte_mask)
49926d688e3SAlex Vesker {
50026d688e3SAlex Vesker 	struct mlx5dr_icm_chunk *chunk;
50126d688e3SAlex Vesker 	struct mlx5dr_ste_htbl *htbl;
502f51bb517SRongwei Liu 	u32 num_entries;
50326d688e3SAlex Vesker 	int i;
50426d688e3SAlex Vesker 
505fb628b71SYevgeny Kliteynik 	htbl = mlx5dr_icm_pool_alloc_htbl(pool);
50626d688e3SAlex Vesker 	if (!htbl)
50726d688e3SAlex Vesker 		return NULL;
50826d688e3SAlex Vesker 
50926d688e3SAlex Vesker 	chunk = mlx5dr_icm_alloc_chunk(pool, chunk_size);
51026d688e3SAlex Vesker 	if (!chunk)
51126d688e3SAlex Vesker 		goto out_free_htbl;
51226d688e3SAlex Vesker 
51326d688e3SAlex Vesker 	htbl->chunk = chunk;
51426d688e3SAlex Vesker 	htbl->lu_type = lu_type;
51526d688e3SAlex Vesker 	htbl->byte_mask = byte_mask;
5164ce380caSYevgeny Kliteynik 	htbl->refcount = 0;
517fb628b71SYevgeny Kliteynik 	htbl->pointing_ste = NULL;
518fb628b71SYevgeny Kliteynik 	htbl->ctrl.num_of_valid_entries = 0;
519fb628b71SYevgeny Kliteynik 	htbl->ctrl.num_of_collisions = 0;
520f51bb517SRongwei Liu 	num_entries = mlx5dr_icm_pool_get_chunk_num_of_entries(chunk);
52126d688e3SAlex Vesker 
522f51bb517SRongwei Liu 	for (i = 0; i < num_entries; i++) {
523597534bdSRongwei Liu 		struct mlx5dr_ste *ste = &chunk->ste_arr[i];
52426d688e3SAlex Vesker 
52526d688e3SAlex Vesker 		ste->htbl = htbl;
5264ce380caSYevgeny Kliteynik 		ste->refcount = 0;
52726d688e3SAlex Vesker 		INIT_LIST_HEAD(&ste->miss_list_node);
528597534bdSRongwei Liu 		INIT_LIST_HEAD(&chunk->miss_list[i]);
52926d688e3SAlex Vesker 	}
53026d688e3SAlex Vesker 
53126d688e3SAlex Vesker 	return htbl;
53226d688e3SAlex Vesker 
53326d688e3SAlex Vesker out_free_htbl:
534fb628b71SYevgeny Kliteynik 	mlx5dr_icm_pool_free_htbl(pool, htbl);
53526d688e3SAlex Vesker 	return NULL;
53626d688e3SAlex Vesker }
53726d688e3SAlex Vesker 
mlx5dr_ste_htbl_free(struct mlx5dr_ste_htbl * htbl)53826d688e3SAlex Vesker int mlx5dr_ste_htbl_free(struct mlx5dr_ste_htbl *htbl)
53926d688e3SAlex Vesker {
540fb628b71SYevgeny Kliteynik 	struct mlx5dr_icm_pool *pool = htbl->chunk->buddy_mem->pool;
541fb628b71SYevgeny Kliteynik 
5424ce380caSYevgeny Kliteynik 	if (htbl->refcount)
54326d688e3SAlex Vesker 		return -EBUSY;
54426d688e3SAlex Vesker 
54526d688e3SAlex Vesker 	mlx5dr_icm_free_chunk(htbl->chunk);
546fb628b71SYevgeny Kliteynik 	mlx5dr_icm_pool_free_htbl(pool, htbl);
547fb628b71SYevgeny Kliteynik 
54826d688e3SAlex Vesker 	return 0;
54926d688e3SAlex Vesker }
55026d688e3SAlex Vesker 
mlx5dr_ste_set_actions_tx(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_domain * dmn,u8 * action_type_set,u8 * hw_ste_arr,struct mlx5dr_ste_actions_attr * attr,u32 * added_stes)5516b93b400SYevgeny Kliteynik void mlx5dr_ste_set_actions_tx(struct mlx5dr_ste_ctx *ste_ctx,
5526b93b400SYevgeny Kliteynik 			       struct mlx5dr_domain *dmn,
55364c78942SYevgeny Kliteynik 			       u8 *action_type_set,
554ad17dc8cSYevgeny Kliteynik 			       u8 *hw_ste_arr,
55564c78942SYevgeny Kliteynik 			       struct mlx5dr_ste_actions_attr *attr,
55664c78942SYevgeny Kliteynik 			       u32 *added_stes)
55764c78942SYevgeny Kliteynik {
558638a07f1SYevgeny Kliteynik 	ste_ctx->set_actions_tx(dmn, action_type_set, ste_ctx->actions_caps,
559638a07f1SYevgeny Kliteynik 				hw_ste_arr, attr, added_stes);
56064c78942SYevgeny Kliteynik }
56164c78942SYevgeny Kliteynik 
mlx5dr_ste_set_actions_rx(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_domain * dmn,u8 * action_type_set,u8 * hw_ste_arr,struct mlx5dr_ste_actions_attr * attr,u32 * added_stes)5626b93b400SYevgeny Kliteynik void mlx5dr_ste_set_actions_rx(struct mlx5dr_ste_ctx *ste_ctx,
5636b93b400SYevgeny Kliteynik 			       struct mlx5dr_domain *dmn,
56464c78942SYevgeny Kliteynik 			       u8 *action_type_set,
565ad17dc8cSYevgeny Kliteynik 			       u8 *hw_ste_arr,
56664c78942SYevgeny Kliteynik 			       struct mlx5dr_ste_actions_attr *attr,
56764c78942SYevgeny Kliteynik 			       u32 *added_stes)
56864c78942SYevgeny Kliteynik {
569638a07f1SYevgeny Kliteynik 	ste_ctx->set_actions_rx(dmn, action_type_set, ste_ctx->actions_caps,
570638a07f1SYevgeny Kliteynik 				hw_ste_arr, attr, added_stes);
57164c78942SYevgeny Kliteynik }
57264c78942SYevgeny Kliteynik 
5734781df92SYevgeny Kliteynik const struct mlx5dr_ste_action_modify_field *
mlx5dr_ste_conv_modify_hdr_sw_field(struct mlx5dr_ste_ctx * ste_ctx,u16 sw_field)5744781df92SYevgeny Kliteynik mlx5dr_ste_conv_modify_hdr_sw_field(struct mlx5dr_ste_ctx *ste_ctx, u16 sw_field)
5754781df92SYevgeny Kliteynik {
5764781df92SYevgeny Kliteynik 	const struct mlx5dr_ste_action_modify_field *hw_field;
5774781df92SYevgeny Kliteynik 
5784781df92SYevgeny Kliteynik 	if (sw_field >= ste_ctx->modify_field_arr_sz)
5794781df92SYevgeny Kliteynik 		return NULL;
5804781df92SYevgeny Kliteynik 
5814781df92SYevgeny Kliteynik 	hw_field = &ste_ctx->modify_field_arr[sw_field];
5824781df92SYevgeny Kliteynik 	if (!hw_field->end && !hw_field->start)
5834781df92SYevgeny Kliteynik 		return NULL;
5844781df92SYevgeny Kliteynik 
5854781df92SYevgeny Kliteynik 	return hw_field;
5864781df92SYevgeny Kliteynik }
5874781df92SYevgeny Kliteynik 
mlx5dr_ste_set_action_set(struct mlx5dr_ste_ctx * ste_ctx,__be64 * hw_action,u8 hw_field,u8 shifter,u8 length,u32 data)5884781df92SYevgeny Kliteynik void mlx5dr_ste_set_action_set(struct mlx5dr_ste_ctx *ste_ctx,
5894781df92SYevgeny Kliteynik 			       __be64 *hw_action,
5904781df92SYevgeny Kliteynik 			       u8 hw_field,
5914781df92SYevgeny Kliteynik 			       u8 shifter,
5924781df92SYevgeny Kliteynik 			       u8 length,
5934781df92SYevgeny Kliteynik 			       u32 data)
5944781df92SYevgeny Kliteynik {
5954781df92SYevgeny Kliteynik 	ste_ctx->set_action_set((u8 *)hw_action,
5964781df92SYevgeny Kliteynik 				hw_field, shifter, length, data);
5974781df92SYevgeny Kliteynik }
5984781df92SYevgeny Kliteynik 
mlx5dr_ste_set_action_add(struct mlx5dr_ste_ctx * ste_ctx,__be64 * hw_action,u8 hw_field,u8 shifter,u8 length,u32 data)5994781df92SYevgeny Kliteynik void mlx5dr_ste_set_action_add(struct mlx5dr_ste_ctx *ste_ctx,
6004781df92SYevgeny Kliteynik 			       __be64 *hw_action,
6014781df92SYevgeny Kliteynik 			       u8 hw_field,
6024781df92SYevgeny Kliteynik 			       u8 shifter,
6034781df92SYevgeny Kliteynik 			       u8 length,
6044781df92SYevgeny Kliteynik 			       u32 data)
6054781df92SYevgeny Kliteynik {
6064781df92SYevgeny Kliteynik 	ste_ctx->set_action_add((u8 *)hw_action,
6074781df92SYevgeny Kliteynik 				hw_field, shifter, length, data);
6084781df92SYevgeny Kliteynik }
6094781df92SYevgeny Kliteynik 
mlx5dr_ste_set_action_copy(struct mlx5dr_ste_ctx * ste_ctx,__be64 * hw_action,u8 dst_hw_field,u8 dst_shifter,u8 dst_len,u8 src_hw_field,u8 src_shifter)6104781df92SYevgeny Kliteynik void mlx5dr_ste_set_action_copy(struct mlx5dr_ste_ctx *ste_ctx,
6114781df92SYevgeny Kliteynik 				__be64 *hw_action,
6124781df92SYevgeny Kliteynik 				u8 dst_hw_field,
6134781df92SYevgeny Kliteynik 				u8 dst_shifter,
6144781df92SYevgeny Kliteynik 				u8 dst_len,
6154781df92SYevgeny Kliteynik 				u8 src_hw_field,
6164781df92SYevgeny Kliteynik 				u8 src_shifter)
6174781df92SYevgeny Kliteynik {
6184781df92SYevgeny Kliteynik 	ste_ctx->set_action_copy((u8 *)hw_action,
6194781df92SYevgeny Kliteynik 				 dst_hw_field, dst_shifter, dst_len,
6204781df92SYevgeny Kliteynik 				 src_hw_field, src_shifter);
6214781df92SYevgeny Kliteynik }
6224781df92SYevgeny Kliteynik 
mlx5dr_ste_set_action_decap_l3_list(struct mlx5dr_ste_ctx * ste_ctx,void * data,u32 data_sz,u8 * hw_action,u32 hw_action_sz,u16 * used_hw_action_num)6234781df92SYevgeny Kliteynik int mlx5dr_ste_set_action_decap_l3_list(struct mlx5dr_ste_ctx *ste_ctx,
6244781df92SYevgeny Kliteynik 					void *data, u32 data_sz,
6254781df92SYevgeny Kliteynik 					u8 *hw_action, u32 hw_action_sz,
6264781df92SYevgeny Kliteynik 					u16 *used_hw_action_num)
6274781df92SYevgeny Kliteynik {
6284781df92SYevgeny Kliteynik 	/* Only Ethernet frame is supported, with VLAN (18) or without (14) */
6294781df92SYevgeny Kliteynik 	if (data_sz != HDR_LEN_L2 && data_sz != HDR_LEN_L2_W_VLAN)
6304781df92SYevgeny Kliteynik 		return -EINVAL;
6314781df92SYevgeny Kliteynik 
6324781df92SYevgeny Kliteynik 	return ste_ctx->set_action_decap_l3_list(data, data_sz,
6334781df92SYevgeny Kliteynik 						 hw_action, hw_action_sz,
6344781df92SYevgeny Kliteynik 						 used_hw_action_num);
6354781df92SYevgeny Kliteynik }
6364781df92SYevgeny Kliteynik 
6372533e726SYevgeny Kliteynik static int
dr_ste_alloc_modify_hdr_chunk(struct mlx5dr_action * action)6382533e726SYevgeny Kliteynik dr_ste_alloc_modify_hdr_chunk(struct mlx5dr_action *action)
6392533e726SYevgeny Kliteynik {
6402533e726SYevgeny Kliteynik 	struct mlx5dr_domain *dmn = action->rewrite->dmn;
6412533e726SYevgeny Kliteynik 	u32 chunk_size;
6422533e726SYevgeny Kliteynik 	int ret;
6432533e726SYevgeny Kliteynik 
6442533e726SYevgeny Kliteynik 	chunk_size = ilog2(roundup_pow_of_two(action->rewrite->num_of_actions));
6452533e726SYevgeny Kliteynik 
6462533e726SYevgeny Kliteynik 	/* HW modify action index granularity is at least 64B */
6472533e726SYevgeny Kliteynik 	chunk_size = max_t(u32, chunk_size, DR_CHUNK_SIZE_8);
6482533e726SYevgeny Kliteynik 
6492533e726SYevgeny Kliteynik 	action->rewrite->chunk = mlx5dr_icm_alloc_chunk(dmn->action_icm_pool,
6502533e726SYevgeny Kliteynik 							chunk_size);
6512533e726SYevgeny Kliteynik 	if (!action->rewrite->chunk)
6522533e726SYevgeny Kliteynik 		return -ENOMEM;
6532533e726SYevgeny Kliteynik 
6542533e726SYevgeny Kliteynik 	action->rewrite->index = (mlx5dr_icm_pool_get_chunk_icm_addr(action->rewrite->chunk) -
6552533e726SYevgeny Kliteynik 				  dmn->info.caps.hdr_modify_icm_addr) /
6562533e726SYevgeny Kliteynik 				 DR_ACTION_CACHE_LINE_SIZE;
6572533e726SYevgeny Kliteynik 
6582533e726SYevgeny Kliteynik 	ret = mlx5dr_send_postsend_action(action->rewrite->dmn, action);
6592533e726SYevgeny Kliteynik 	if (ret)
6602533e726SYevgeny Kliteynik 		goto free_chunk;
6612533e726SYevgeny Kliteynik 
6622533e726SYevgeny Kliteynik 	return 0;
6632533e726SYevgeny Kliteynik 
6642533e726SYevgeny Kliteynik free_chunk:
6652533e726SYevgeny Kliteynik 	mlx5dr_icm_free_chunk(action->rewrite->chunk);
6662533e726SYevgeny Kliteynik 	return -ENOMEM;
6672533e726SYevgeny Kliteynik }
6682533e726SYevgeny Kliteynik 
dr_ste_free_modify_hdr_chunk(struct mlx5dr_action * action)6692533e726SYevgeny Kliteynik static void dr_ste_free_modify_hdr_chunk(struct mlx5dr_action *action)
6702533e726SYevgeny Kliteynik {
6712533e726SYevgeny Kliteynik 	mlx5dr_icm_free_chunk(action->rewrite->chunk);
6722533e726SYevgeny Kliteynik }
6732533e726SYevgeny Kliteynik 
mlx5dr_ste_alloc_modify_hdr(struct mlx5dr_action * action)6742533e726SYevgeny Kliteynik int mlx5dr_ste_alloc_modify_hdr(struct mlx5dr_action *action)
6752533e726SYevgeny Kliteynik {
6762533e726SYevgeny Kliteynik 	struct mlx5dr_domain *dmn = action->rewrite->dmn;
6772533e726SYevgeny Kliteynik 
6782533e726SYevgeny Kliteynik 	if (mlx5dr_domain_is_support_ptrn_arg(dmn))
6792533e726SYevgeny Kliteynik 		return dmn->ste_ctx->alloc_modify_hdr_chunk(action);
6802533e726SYevgeny Kliteynik 
6812533e726SYevgeny Kliteynik 	return dr_ste_alloc_modify_hdr_chunk(action);
6822533e726SYevgeny Kliteynik }
6832533e726SYevgeny Kliteynik 
mlx5dr_ste_free_modify_hdr(struct mlx5dr_action * action)6842533e726SYevgeny Kliteynik void mlx5dr_ste_free_modify_hdr(struct mlx5dr_action *action)
6852533e726SYevgeny Kliteynik {
6862533e726SYevgeny Kliteynik 	struct mlx5dr_domain *dmn = action->rewrite->dmn;
6872533e726SYevgeny Kliteynik 
6882533e726SYevgeny Kliteynik 	if (mlx5dr_domain_is_support_ptrn_arg(dmn))
6892533e726SYevgeny Kliteynik 		return dmn->ste_ctx->dealloc_modify_hdr_chunk(action);
6902533e726SYevgeny Kliteynik 
6912533e726SYevgeny Kliteynik 	return dr_ste_free_modify_hdr_chunk(action);
6922533e726SYevgeny Kliteynik }
6932533e726SYevgeny Kliteynik 
dr_ste_build_pre_check_spec(struct mlx5dr_domain * dmn,struct mlx5dr_match_spec * spec)694ffb0753bSYevgeny Kliteynik static int dr_ste_build_pre_check_spec(struct mlx5dr_domain *dmn,
695ffb0753bSYevgeny Kliteynik 				       struct mlx5dr_match_spec *spec)
696ffb0753bSYevgeny Kliteynik {
697ffb0753bSYevgeny Kliteynik 	if (spec->ip_version) {
698ffb0753bSYevgeny Kliteynik 		if (spec->ip_version != 0xf) {
699ffb0753bSYevgeny Kliteynik 			mlx5dr_err(dmn,
700ffb0753bSYevgeny Kliteynik 				   "Partial ip_version mask with src/dst IP is not supported\n");
701ffb0753bSYevgeny Kliteynik 			return -EINVAL;
702ffb0753bSYevgeny Kliteynik 		}
703ffb0753bSYevgeny Kliteynik 	} else if (spec->ethertype != 0xffff &&
704ffb0753bSYevgeny Kliteynik 		   (DR_MASK_IS_SRC_IP_SET(spec) || DR_MASK_IS_DST_IP_SET(spec))) {
705ffb0753bSYevgeny Kliteynik 		mlx5dr_err(dmn,
706ffb0753bSYevgeny Kliteynik 			   "Partial/no ethertype mask with src/dst IP is not supported\n");
707ffb0753bSYevgeny Kliteynik 		return -EINVAL;
708ffb0753bSYevgeny Kliteynik 	}
709ffb0753bSYevgeny Kliteynik 
710ffb0753bSYevgeny Kliteynik 	return 0;
711ffb0753bSYevgeny Kliteynik }
712ffb0753bSYevgeny Kliteynik 
mlx5dr_ste_build_pre_check(struct mlx5dr_domain * dmn,u8 match_criteria,struct mlx5dr_match_param * mask,struct mlx5dr_match_param * value)71326d688e3SAlex Vesker int mlx5dr_ste_build_pre_check(struct mlx5dr_domain *dmn,
71426d688e3SAlex Vesker 			       u8 match_criteria,
71526d688e3SAlex Vesker 			       struct mlx5dr_match_param *mask,
71626d688e3SAlex Vesker 			       struct mlx5dr_match_param *value)
71726d688e3SAlex Vesker {
718ffb0753bSYevgeny Kliteynik 	if (value)
719ffb0753bSYevgeny Kliteynik 		return 0;
720ffb0753bSYevgeny Kliteynik 
721ffb0753bSYevgeny Kliteynik 	if (match_criteria & DR_MATCHER_CRITERIA_MISC) {
72226d688e3SAlex Vesker 		if (mask->misc.source_port && mask->misc.source_port != 0xffff) {
72338a5c59dSYevgeny Kliteynik 			mlx5dr_err(dmn,
72438a5c59dSYevgeny Kliteynik 				   "Partial mask source_port is not supported\n");
72538a5c59dSYevgeny Kliteynik 			return -EINVAL;
72638a5c59dSYevgeny Kliteynik 		}
72738a5c59dSYevgeny Kliteynik 		if (mask->misc.source_eswitch_owner_vhca_id &&
72838a5c59dSYevgeny Kliteynik 		    mask->misc.source_eswitch_owner_vhca_id != 0xffff) {
72938a5c59dSYevgeny Kliteynik 			mlx5dr_err(dmn,
73038a5c59dSYevgeny Kliteynik 				   "Partial mask source_eswitch_owner_vhca_id is not supported\n");
73126d688e3SAlex Vesker 			return -EINVAL;
73226d688e3SAlex Vesker 		}
73326d688e3SAlex Vesker 	}
73426d688e3SAlex Vesker 
735ffb0753bSYevgeny Kliteynik 	if ((match_criteria & DR_MATCHER_CRITERIA_OUTER) &&
736ffb0753bSYevgeny Kliteynik 	    dr_ste_build_pre_check_spec(dmn, &mask->outer))
737ffb0753bSYevgeny Kliteynik 		return -EINVAL;
738ffb0753bSYevgeny Kliteynik 
739ffb0753bSYevgeny Kliteynik 	if ((match_criteria & DR_MATCHER_CRITERIA_INNER) &&
740ffb0753bSYevgeny Kliteynik 	    dr_ste_build_pre_check_spec(dmn, &mask->inner))
741ffb0753bSYevgeny Kliteynik 		return -EINVAL;
742ffb0753bSYevgeny Kliteynik 
74326d688e3SAlex Vesker 	return 0;
74426d688e3SAlex Vesker }
74526d688e3SAlex Vesker 
mlx5dr_ste_build_ste_arr(struct mlx5dr_matcher * matcher,struct mlx5dr_matcher_rx_tx * nic_matcher,struct mlx5dr_match_param * value,u8 * ste_arr)74626d688e3SAlex Vesker int mlx5dr_ste_build_ste_arr(struct mlx5dr_matcher *matcher,
74726d688e3SAlex Vesker 			     struct mlx5dr_matcher_rx_tx *nic_matcher,
74826d688e3SAlex Vesker 			     struct mlx5dr_match_param *value,
74926d688e3SAlex Vesker 			     u8 *ste_arr)
75026d688e3SAlex Vesker {
75126d688e3SAlex Vesker 	struct mlx5dr_domain_rx_tx *nic_dmn = nic_matcher->nic_tbl->nic_dmn;
75246f2a8aeSYevgeny Kliteynik 	bool is_rx = nic_dmn->type == DR_DOMAIN_NIC_TYPE_RX;
75326d688e3SAlex Vesker 	struct mlx5dr_domain *dmn = matcher->tbl->dmn;
7546b93b400SYevgeny Kliteynik 	struct mlx5dr_ste_ctx *ste_ctx = dmn->ste_ctx;
75526d688e3SAlex Vesker 	struct mlx5dr_ste_build *sb;
75626d688e3SAlex Vesker 	int ret, i;
75726d688e3SAlex Vesker 
75826d688e3SAlex Vesker 	ret = mlx5dr_ste_build_pre_check(dmn, matcher->match_criteria,
75926d688e3SAlex Vesker 					 &matcher->mask, value);
76026d688e3SAlex Vesker 	if (ret)
76126d688e3SAlex Vesker 		return ret;
76226d688e3SAlex Vesker 
76326d688e3SAlex Vesker 	sb = nic_matcher->ste_builder;
76426d688e3SAlex Vesker 	for (i = 0; i < nic_matcher->num_of_builders; i++) {
7656b93b400SYevgeny Kliteynik 		ste_ctx->ste_init(ste_arr,
76626d688e3SAlex Vesker 				  sb->lu_type,
76746f2a8aeSYevgeny Kliteynik 				  is_rx,
76826d688e3SAlex Vesker 				  dmn->info.caps.gvmi);
76926d688e3SAlex Vesker 
77026d688e3SAlex Vesker 		mlx5dr_ste_set_bit_mask(ste_arr, sb->bit_mask);
77126d688e3SAlex Vesker 
77264c78942SYevgeny Kliteynik 		ret = sb->ste_build_tag_func(value, sb, dr_ste_get_tag(ste_arr));
77326d688e3SAlex Vesker 		if (ret)
77426d688e3SAlex Vesker 			return ret;
77526d688e3SAlex Vesker 
77626d688e3SAlex Vesker 		/* Connect the STEs */
77726d688e3SAlex Vesker 		if (i < (nic_matcher->num_of_builders - 1)) {
77826d688e3SAlex Vesker 			/* Need the next builder for these fields,
77926d688e3SAlex Vesker 			 * not relevant for the last ste in the chain.
78026d688e3SAlex Vesker 			 */
78126d688e3SAlex Vesker 			sb++;
7826b93b400SYevgeny Kliteynik 			ste_ctx->set_next_lu_type(ste_arr, sb->lu_type);
7836b93b400SYevgeny Kliteynik 			ste_ctx->set_byte_mask(ste_arr, sb->byte_mask);
78426d688e3SAlex Vesker 		}
78526d688e3SAlex Vesker 		ste_arr += DR_STE_SIZE;
78626d688e3SAlex Vesker 	}
78726d688e3SAlex Vesker 	return 0;
78826d688e3SAlex Vesker }
78926d688e3SAlex Vesker 
790941f1979SMuhammad Sammar #define IFC_GET_CLR(typ, p, fld, clear) ({ \
791941f1979SMuhammad Sammar 	void *__p = (p); \
792941f1979SMuhammad Sammar 	u32 __t = MLX5_GET(typ, __p, fld); \
793941f1979SMuhammad Sammar 	if (clear) \
794941f1979SMuhammad Sammar 		MLX5_SET(typ, __p, fld, 0); \
795941f1979SMuhammad Sammar 	__t; \
796941f1979SMuhammad Sammar })
797941f1979SMuhammad Sammar 
798941f1979SMuhammad Sammar #define memcpy_and_clear(to, from, len, clear) ({ \
799941f1979SMuhammad Sammar 	void *__to = (to), *__from = (from); \
800941f1979SMuhammad Sammar 	size_t __len = (len); \
801941f1979SMuhammad Sammar 	memcpy(__to, __from, __len); \
802941f1979SMuhammad Sammar 	if (clear) \
803941f1979SMuhammad Sammar 		memset(__from, 0, __len); \
804941f1979SMuhammad Sammar })
805941f1979SMuhammad Sammar 
dr_ste_copy_mask_misc(char * mask,struct mlx5dr_match_misc * spec,bool clr)806941f1979SMuhammad Sammar static void dr_ste_copy_mask_misc(char *mask, struct mlx5dr_match_misc *spec, bool clr)
80726d688e3SAlex Vesker {
808941f1979SMuhammad Sammar 	spec->gre_c_present = IFC_GET_CLR(fte_match_set_misc, mask, gre_c_present, clr);
809941f1979SMuhammad Sammar 	spec->gre_k_present = IFC_GET_CLR(fte_match_set_misc, mask, gre_k_present, clr);
810941f1979SMuhammad Sammar 	spec->gre_s_present = IFC_GET_CLR(fte_match_set_misc, mask, gre_s_present, clr);
811941f1979SMuhammad Sammar 	spec->source_vhca_port = IFC_GET_CLR(fte_match_set_misc, mask, source_vhca_port, clr);
812941f1979SMuhammad Sammar 	spec->source_sqn = IFC_GET_CLR(fte_match_set_misc, mask, source_sqn, clr);
81326d688e3SAlex Vesker 
814941f1979SMuhammad Sammar 	spec->source_port = IFC_GET_CLR(fte_match_set_misc, mask, source_port, clr);
815941f1979SMuhammad Sammar 	spec->source_eswitch_owner_vhca_id =
816941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc, mask, source_eswitch_owner_vhca_id, clr);
81726d688e3SAlex Vesker 
818941f1979SMuhammad Sammar 	spec->outer_second_prio = IFC_GET_CLR(fte_match_set_misc, mask, outer_second_prio, clr);
819941f1979SMuhammad Sammar 	spec->outer_second_cfi = IFC_GET_CLR(fte_match_set_misc, mask, outer_second_cfi, clr);
820941f1979SMuhammad Sammar 	spec->outer_second_vid = IFC_GET_CLR(fte_match_set_misc, mask, outer_second_vid, clr);
821941f1979SMuhammad Sammar 	spec->inner_second_prio = IFC_GET_CLR(fte_match_set_misc, mask, inner_second_prio, clr);
822941f1979SMuhammad Sammar 	spec->inner_second_cfi = IFC_GET_CLR(fte_match_set_misc, mask, inner_second_cfi, clr);
823941f1979SMuhammad Sammar 	spec->inner_second_vid = IFC_GET_CLR(fte_match_set_misc, mask, inner_second_vid, clr);
82426d688e3SAlex Vesker 
82526d688e3SAlex Vesker 	spec->outer_second_cvlan_tag =
826941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc, mask, outer_second_cvlan_tag, clr);
82726d688e3SAlex Vesker 	spec->inner_second_cvlan_tag =
828941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc, mask, inner_second_cvlan_tag, clr);
82926d688e3SAlex Vesker 	spec->outer_second_svlan_tag =
830941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc, mask, outer_second_svlan_tag, clr);
83126d688e3SAlex Vesker 	spec->inner_second_svlan_tag =
832941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc, mask, inner_second_svlan_tag, clr);
833941f1979SMuhammad Sammar 	spec->gre_protocol = IFC_GET_CLR(fte_match_set_misc, mask, gre_protocol, clr);
83426d688e3SAlex Vesker 
835941f1979SMuhammad Sammar 	spec->gre_key_h = IFC_GET_CLR(fte_match_set_misc, mask, gre_key.nvgre.hi, clr);
836941f1979SMuhammad Sammar 	spec->gre_key_l = IFC_GET_CLR(fte_match_set_misc, mask, gre_key.nvgre.lo, clr);
83726d688e3SAlex Vesker 
838941f1979SMuhammad Sammar 	spec->vxlan_vni = IFC_GET_CLR(fte_match_set_misc, mask, vxlan_vni, clr);
83926d688e3SAlex Vesker 
840941f1979SMuhammad Sammar 	spec->geneve_vni = IFC_GET_CLR(fte_match_set_misc, mask, geneve_vni, clr);
841f59464e2SYevgeny Kliteynik 	spec->geneve_tlv_option_0_exist =
842f59464e2SYevgeny Kliteynik 		IFC_GET_CLR(fte_match_set_misc, mask, geneve_tlv_option_0_exist, clr);
843941f1979SMuhammad Sammar 	spec->geneve_oam = IFC_GET_CLR(fte_match_set_misc, mask, geneve_oam, clr);
84426d688e3SAlex Vesker 
84526d688e3SAlex Vesker 	spec->outer_ipv6_flow_label =
846941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc, mask, outer_ipv6_flow_label, clr);
84726d688e3SAlex Vesker 
84826d688e3SAlex Vesker 	spec->inner_ipv6_flow_label =
849941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc, mask, inner_ipv6_flow_label, clr);
85026d688e3SAlex Vesker 
851941f1979SMuhammad Sammar 	spec->geneve_opt_len = IFC_GET_CLR(fte_match_set_misc, mask, geneve_opt_len, clr);
85226d688e3SAlex Vesker 	spec->geneve_protocol_type =
853941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc, mask, geneve_protocol_type, clr);
85426d688e3SAlex Vesker 
855941f1979SMuhammad Sammar 	spec->bth_dst_qp = IFC_GET_CLR(fte_match_set_misc, mask, bth_dst_qp, clr);
85626d688e3SAlex Vesker }
85726d688e3SAlex Vesker 
dr_ste_copy_mask_spec(char * mask,struct mlx5dr_match_spec * spec,bool clr)858941f1979SMuhammad Sammar static void dr_ste_copy_mask_spec(char *mask, struct mlx5dr_match_spec *spec, bool clr)
85926d688e3SAlex Vesker {
860c2ba2c22SSaeed Mahameed 	__be32 raw_ip[4];
86126d688e3SAlex Vesker 
862941f1979SMuhammad Sammar 	spec->smac_47_16 = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, smac_47_16, clr);
86326d688e3SAlex Vesker 
864941f1979SMuhammad Sammar 	spec->smac_15_0 = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, smac_15_0, clr);
865941f1979SMuhammad Sammar 	spec->ethertype = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, ethertype, clr);
86626d688e3SAlex Vesker 
867941f1979SMuhammad Sammar 	spec->dmac_47_16 = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, dmac_47_16, clr);
86826d688e3SAlex Vesker 
869941f1979SMuhammad Sammar 	spec->dmac_15_0 = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, dmac_15_0, clr);
870941f1979SMuhammad Sammar 	spec->first_prio = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, first_prio, clr);
871941f1979SMuhammad Sammar 	spec->first_cfi = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, first_cfi, clr);
872941f1979SMuhammad Sammar 	spec->first_vid = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, first_vid, clr);
87326d688e3SAlex Vesker 
874941f1979SMuhammad Sammar 	spec->ip_protocol = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, ip_protocol, clr);
875941f1979SMuhammad Sammar 	spec->ip_dscp = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, ip_dscp, clr);
876941f1979SMuhammad Sammar 	spec->ip_ecn = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, ip_ecn, clr);
877941f1979SMuhammad Sammar 	spec->cvlan_tag = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, cvlan_tag, clr);
878941f1979SMuhammad Sammar 	spec->svlan_tag = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, svlan_tag, clr);
879941f1979SMuhammad Sammar 	spec->frag = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, frag, clr);
880941f1979SMuhammad Sammar 	spec->ip_version = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, ip_version, clr);
881941f1979SMuhammad Sammar 	spec->tcp_flags = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, tcp_flags, clr);
882941f1979SMuhammad Sammar 	spec->tcp_sport = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, tcp_sport, clr);
883941f1979SMuhammad Sammar 	spec->tcp_dport = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, tcp_dport, clr);
88426d688e3SAlex Vesker 
8855c422bfaSYevgeny Kliteynik 	spec->ipv4_ihl = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, ipv4_ihl, clr);
886941f1979SMuhammad Sammar 	spec->ttl_hoplimit = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, ttl_hoplimit, clr);
88726d688e3SAlex Vesker 
888941f1979SMuhammad Sammar 	spec->udp_sport = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, udp_sport, clr);
889941f1979SMuhammad Sammar 	spec->udp_dport = IFC_GET_CLR(fte_match_set_lyr_2_4, mask, udp_dport, clr);
89026d688e3SAlex Vesker 
891941f1979SMuhammad Sammar 	memcpy_and_clear(raw_ip, MLX5_ADDR_OF(fte_match_set_lyr_2_4, mask,
89226d688e3SAlex Vesker 					      src_ipv4_src_ipv6.ipv6_layout.ipv6),
893941f1979SMuhammad Sammar 			 sizeof(raw_ip), clr);
89426d688e3SAlex Vesker 
89526d688e3SAlex Vesker 	spec->src_ip_127_96 = be32_to_cpu(raw_ip[0]);
89626d688e3SAlex Vesker 	spec->src_ip_95_64 = be32_to_cpu(raw_ip[1]);
89726d688e3SAlex Vesker 	spec->src_ip_63_32 = be32_to_cpu(raw_ip[2]);
89826d688e3SAlex Vesker 	spec->src_ip_31_0 = be32_to_cpu(raw_ip[3]);
89926d688e3SAlex Vesker 
900941f1979SMuhammad Sammar 	memcpy_and_clear(raw_ip, MLX5_ADDR_OF(fte_match_set_lyr_2_4, mask,
90126d688e3SAlex Vesker 					      dst_ipv4_dst_ipv6.ipv6_layout.ipv6),
902941f1979SMuhammad Sammar 			 sizeof(raw_ip), clr);
90326d688e3SAlex Vesker 
90426d688e3SAlex Vesker 	spec->dst_ip_127_96 = be32_to_cpu(raw_ip[0]);
90526d688e3SAlex Vesker 	spec->dst_ip_95_64 = be32_to_cpu(raw_ip[1]);
90626d688e3SAlex Vesker 	spec->dst_ip_63_32 = be32_to_cpu(raw_ip[2]);
90726d688e3SAlex Vesker 	spec->dst_ip_31_0 = be32_to_cpu(raw_ip[3]);
90826d688e3SAlex Vesker }
90926d688e3SAlex Vesker 
dr_ste_copy_mask_misc2(char * mask,struct mlx5dr_match_misc2 * spec,bool clr)910941f1979SMuhammad Sammar static void dr_ste_copy_mask_misc2(char *mask, struct mlx5dr_match_misc2 *spec, bool clr)
91126d688e3SAlex Vesker {
91226d688e3SAlex Vesker 	spec->outer_first_mpls_label =
913941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, outer_first_mpls.mpls_label, clr);
91426d688e3SAlex Vesker 	spec->outer_first_mpls_exp =
915941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, outer_first_mpls.mpls_exp, clr);
91626d688e3SAlex Vesker 	spec->outer_first_mpls_s_bos =
917941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, outer_first_mpls.mpls_s_bos, clr);
91826d688e3SAlex Vesker 	spec->outer_first_mpls_ttl =
919941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, outer_first_mpls.mpls_ttl, clr);
92026d688e3SAlex Vesker 	spec->inner_first_mpls_label =
921941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, inner_first_mpls.mpls_label, clr);
92226d688e3SAlex Vesker 	spec->inner_first_mpls_exp =
923941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, inner_first_mpls.mpls_exp, clr);
92426d688e3SAlex Vesker 	spec->inner_first_mpls_s_bos =
925941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, inner_first_mpls.mpls_s_bos, clr);
92626d688e3SAlex Vesker 	spec->inner_first_mpls_ttl =
927941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, inner_first_mpls.mpls_ttl, clr);
92826d688e3SAlex Vesker 	spec->outer_first_mpls_over_gre_label =
929941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, outer_first_mpls_over_gre.mpls_label, clr);
93026d688e3SAlex Vesker 	spec->outer_first_mpls_over_gre_exp =
931941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, outer_first_mpls_over_gre.mpls_exp, clr);
93226d688e3SAlex Vesker 	spec->outer_first_mpls_over_gre_s_bos =
933941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, outer_first_mpls_over_gre.mpls_s_bos, clr);
93426d688e3SAlex Vesker 	spec->outer_first_mpls_over_gre_ttl =
935941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, outer_first_mpls_over_gre.mpls_ttl, clr);
93626d688e3SAlex Vesker 	spec->outer_first_mpls_over_udp_label =
937941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, outer_first_mpls_over_udp.mpls_label, clr);
93826d688e3SAlex Vesker 	spec->outer_first_mpls_over_udp_exp =
939941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, outer_first_mpls_over_udp.mpls_exp, clr);
94026d688e3SAlex Vesker 	spec->outer_first_mpls_over_udp_s_bos =
941941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, outer_first_mpls_over_udp.mpls_s_bos, clr);
94226d688e3SAlex Vesker 	spec->outer_first_mpls_over_udp_ttl =
943941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc2, mask, outer_first_mpls_over_udp.mpls_ttl, clr);
944941f1979SMuhammad Sammar 	spec->metadata_reg_c_7 = IFC_GET_CLR(fte_match_set_misc2, mask, metadata_reg_c_7, clr);
945941f1979SMuhammad Sammar 	spec->metadata_reg_c_6 = IFC_GET_CLR(fte_match_set_misc2, mask, metadata_reg_c_6, clr);
946941f1979SMuhammad Sammar 	spec->metadata_reg_c_5 = IFC_GET_CLR(fte_match_set_misc2, mask, metadata_reg_c_5, clr);
947941f1979SMuhammad Sammar 	spec->metadata_reg_c_4 = IFC_GET_CLR(fte_match_set_misc2, mask, metadata_reg_c_4, clr);
948941f1979SMuhammad Sammar 	spec->metadata_reg_c_3 = IFC_GET_CLR(fte_match_set_misc2, mask, metadata_reg_c_3, clr);
949941f1979SMuhammad Sammar 	spec->metadata_reg_c_2 = IFC_GET_CLR(fte_match_set_misc2, mask, metadata_reg_c_2, clr);
950941f1979SMuhammad Sammar 	spec->metadata_reg_c_1 = IFC_GET_CLR(fte_match_set_misc2, mask, metadata_reg_c_1, clr);
951941f1979SMuhammad Sammar 	spec->metadata_reg_c_0 = IFC_GET_CLR(fte_match_set_misc2, mask, metadata_reg_c_0, clr);
952941f1979SMuhammad Sammar 	spec->metadata_reg_a = IFC_GET_CLR(fte_match_set_misc2, mask, metadata_reg_a, clr);
95326d688e3SAlex Vesker }
95426d688e3SAlex Vesker 
dr_ste_copy_mask_misc3(char * mask,struct mlx5dr_match_misc3 * spec,bool clr)955941f1979SMuhammad Sammar static void dr_ste_copy_mask_misc3(char *mask, struct mlx5dr_match_misc3 *spec, bool clr)
95626d688e3SAlex Vesker {
957941f1979SMuhammad Sammar 	spec->inner_tcp_seq_num = IFC_GET_CLR(fte_match_set_misc3, mask, inner_tcp_seq_num, clr);
958941f1979SMuhammad Sammar 	spec->outer_tcp_seq_num = IFC_GET_CLR(fte_match_set_misc3, mask, outer_tcp_seq_num, clr);
959941f1979SMuhammad Sammar 	spec->inner_tcp_ack_num = IFC_GET_CLR(fte_match_set_misc3, mask, inner_tcp_ack_num, clr);
960941f1979SMuhammad Sammar 	spec->outer_tcp_ack_num = IFC_GET_CLR(fte_match_set_misc3, mask, outer_tcp_ack_num, clr);
96126d688e3SAlex Vesker 	spec->outer_vxlan_gpe_vni =
962941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc3, mask, outer_vxlan_gpe_vni, clr);
96326d688e3SAlex Vesker 	spec->outer_vxlan_gpe_next_protocol =
964941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc3, mask, outer_vxlan_gpe_next_protocol, clr);
96526d688e3SAlex Vesker 	spec->outer_vxlan_gpe_flags =
966941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc3, mask, outer_vxlan_gpe_flags, clr);
967941f1979SMuhammad Sammar 	spec->icmpv4_header_data = IFC_GET_CLR(fte_match_set_misc3, mask, icmp_header_data, clr);
96826d688e3SAlex Vesker 	spec->icmpv6_header_data =
969941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc3, mask, icmpv6_header_data, clr);
970941f1979SMuhammad Sammar 	spec->icmpv4_type = IFC_GET_CLR(fte_match_set_misc3, mask, icmp_type, clr);
971941f1979SMuhammad Sammar 	spec->icmpv4_code = IFC_GET_CLR(fte_match_set_misc3, mask, icmp_code, clr);
972941f1979SMuhammad Sammar 	spec->icmpv6_type = IFC_GET_CLR(fte_match_set_misc3, mask, icmpv6_type, clr);
973941f1979SMuhammad Sammar 	spec->icmpv6_code = IFC_GET_CLR(fte_match_set_misc3, mask, icmpv6_code, clr);
9743442e033SYevgeny Kliteynik 	spec->geneve_tlv_option_0_data =
975941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc3, mask, geneve_tlv_option_0_data, clr);
976941f1979SMuhammad Sammar 	spec->gtpu_teid = IFC_GET_CLR(fte_match_set_misc3, mask, gtpu_teid, clr);
977941f1979SMuhammad Sammar 	spec->gtpu_msg_flags = IFC_GET_CLR(fte_match_set_misc3, mask, gtpu_msg_flags, clr);
978941f1979SMuhammad Sammar 	spec->gtpu_msg_type = IFC_GET_CLR(fte_match_set_misc3, mask, gtpu_msg_type, clr);
979941f1979SMuhammad Sammar 	spec->gtpu_dw_0 = IFC_GET_CLR(fte_match_set_misc3, mask, gtpu_dw_0, clr);
980941f1979SMuhammad Sammar 	spec->gtpu_dw_2 = IFC_GET_CLR(fte_match_set_misc3, mask, gtpu_dw_2, clr);
981df9dd15aSYevgeny Kliteynik 	spec->gtpu_first_ext_dw_0 =
982941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc3, mask, gtpu_first_ext_dw_0, clr);
98326d688e3SAlex Vesker }
98426d688e3SAlex Vesker 
dr_ste_copy_mask_misc4(char * mask,struct mlx5dr_match_misc4 * spec,bool clr)985941f1979SMuhammad Sammar static void dr_ste_copy_mask_misc4(char *mask, struct mlx5dr_match_misc4 *spec, bool clr)
986160e9cb3SYevgeny Kliteynik {
987160e9cb3SYevgeny Kliteynik 	spec->prog_sample_field_id_0 =
988941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc4, mask, prog_sample_field_id_0, clr);
989160e9cb3SYevgeny Kliteynik 	spec->prog_sample_field_value_0 =
990941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc4, mask, prog_sample_field_value_0, clr);
991160e9cb3SYevgeny Kliteynik 	spec->prog_sample_field_id_1 =
992941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc4, mask, prog_sample_field_id_1, clr);
993160e9cb3SYevgeny Kliteynik 	spec->prog_sample_field_value_1 =
994941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc4, mask, prog_sample_field_value_1, clr);
995160e9cb3SYevgeny Kliteynik 	spec->prog_sample_field_id_2 =
996941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc4, mask, prog_sample_field_id_2, clr);
997160e9cb3SYevgeny Kliteynik 	spec->prog_sample_field_value_2 =
998941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc4, mask, prog_sample_field_value_2, clr);
999160e9cb3SYevgeny Kliteynik 	spec->prog_sample_field_id_3 =
1000941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc4, mask, prog_sample_field_id_3, clr);
1001160e9cb3SYevgeny Kliteynik 	spec->prog_sample_field_value_3 =
1002941f1979SMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc4, mask, prog_sample_field_value_3, clr);
1003160e9cb3SYevgeny Kliteynik }
1004160e9cb3SYevgeny Kliteynik 
dr_ste_copy_mask_misc5(char * mask,struct mlx5dr_match_misc5 * spec,bool clr)10058c2b4feeSMuhammad Sammar static void dr_ste_copy_mask_misc5(char *mask, struct mlx5dr_match_misc5 *spec, bool clr)
10068c2b4feeSMuhammad Sammar {
10078c2b4feeSMuhammad Sammar 	spec->macsec_tag_0 =
10088c2b4feeSMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc5, mask, macsec_tag_0, clr);
10098c2b4feeSMuhammad Sammar 	spec->macsec_tag_1 =
10108c2b4feeSMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc5, mask, macsec_tag_1, clr);
10118c2b4feeSMuhammad Sammar 	spec->macsec_tag_2 =
10128c2b4feeSMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc5, mask, macsec_tag_2, clr);
10138c2b4feeSMuhammad Sammar 	spec->macsec_tag_3 =
10148c2b4feeSMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc5, mask, macsec_tag_3, clr);
10158c2b4feeSMuhammad Sammar 	spec->tunnel_header_0 =
10168c2b4feeSMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc5, mask, tunnel_header_0, clr);
10178c2b4feeSMuhammad Sammar 	spec->tunnel_header_1 =
10188c2b4feeSMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc5, mask, tunnel_header_1, clr);
10198c2b4feeSMuhammad Sammar 	spec->tunnel_header_2 =
10208c2b4feeSMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc5, mask, tunnel_header_2, clr);
10218c2b4feeSMuhammad Sammar 	spec->tunnel_header_3 =
10228c2b4feeSMuhammad Sammar 		IFC_GET_CLR(fte_match_set_misc5, mask, tunnel_header_3, clr);
10238c2b4feeSMuhammad Sammar }
10248c2b4feeSMuhammad Sammar 
mlx5dr_ste_copy_param(u8 match_criteria,struct mlx5dr_match_param * set_param,struct mlx5dr_match_parameters * mask,bool clr)102526d688e3SAlex Vesker void mlx5dr_ste_copy_param(u8 match_criteria,
102626d688e3SAlex Vesker 			   struct mlx5dr_match_param *set_param,
1027941f1979SMuhammad Sammar 			   struct mlx5dr_match_parameters *mask,
1028941f1979SMuhammad Sammar 			   bool clr)
102926d688e3SAlex Vesker {
103026d688e3SAlex Vesker 	u8 tail_param[MLX5_ST_SZ_BYTES(fte_match_set_lyr_2_4)] = {};
103126d688e3SAlex Vesker 	u8 *data = (u8 *)mask->match_buf;
103226d688e3SAlex Vesker 	size_t param_location;
103326d688e3SAlex Vesker 	void *buff;
103426d688e3SAlex Vesker 
103526d688e3SAlex Vesker 	if (match_criteria & DR_MATCHER_CRITERIA_OUTER) {
103626d688e3SAlex Vesker 		if (mask->match_sz < sizeof(struct mlx5dr_match_spec)) {
103726d688e3SAlex Vesker 			memcpy(tail_param, data, mask->match_sz);
103826d688e3SAlex Vesker 			buff = tail_param;
103926d688e3SAlex Vesker 		} else {
104026d688e3SAlex Vesker 			buff = mask->match_buf;
104126d688e3SAlex Vesker 		}
1042941f1979SMuhammad Sammar 		dr_ste_copy_mask_spec(buff, &set_param->outer, clr);
104326d688e3SAlex Vesker 	}
104426d688e3SAlex Vesker 	param_location = sizeof(struct mlx5dr_match_spec);
104526d688e3SAlex Vesker 
104626d688e3SAlex Vesker 	if (match_criteria & DR_MATCHER_CRITERIA_MISC) {
104726d688e3SAlex Vesker 		if (mask->match_sz < param_location +
104826d688e3SAlex Vesker 		    sizeof(struct mlx5dr_match_misc)) {
104926d688e3SAlex Vesker 			memcpy(tail_param, data + param_location,
105026d688e3SAlex Vesker 			       mask->match_sz - param_location);
105126d688e3SAlex Vesker 			buff = tail_param;
105226d688e3SAlex Vesker 		} else {
105326d688e3SAlex Vesker 			buff = data + param_location;
105426d688e3SAlex Vesker 		}
1055941f1979SMuhammad Sammar 		dr_ste_copy_mask_misc(buff, &set_param->misc, clr);
105626d688e3SAlex Vesker 	}
105726d688e3SAlex Vesker 	param_location += sizeof(struct mlx5dr_match_misc);
105826d688e3SAlex Vesker 
105926d688e3SAlex Vesker 	if (match_criteria & DR_MATCHER_CRITERIA_INNER) {
106026d688e3SAlex Vesker 		if (mask->match_sz < param_location +
106126d688e3SAlex Vesker 		    sizeof(struct mlx5dr_match_spec)) {
106226d688e3SAlex Vesker 			memcpy(tail_param, data + param_location,
106326d688e3SAlex Vesker 			       mask->match_sz - param_location);
106426d688e3SAlex Vesker 			buff = tail_param;
106526d688e3SAlex Vesker 		} else {
106626d688e3SAlex Vesker 			buff = data + param_location;
106726d688e3SAlex Vesker 		}
1068941f1979SMuhammad Sammar 		dr_ste_copy_mask_spec(buff, &set_param->inner, clr);
106926d688e3SAlex Vesker 	}
107026d688e3SAlex Vesker 	param_location += sizeof(struct mlx5dr_match_spec);
107126d688e3SAlex Vesker 
107226d688e3SAlex Vesker 	if (match_criteria & DR_MATCHER_CRITERIA_MISC2) {
107326d688e3SAlex Vesker 		if (mask->match_sz < param_location +
107426d688e3SAlex Vesker 		    sizeof(struct mlx5dr_match_misc2)) {
107526d688e3SAlex Vesker 			memcpy(tail_param, data + param_location,
107626d688e3SAlex Vesker 			       mask->match_sz - param_location);
107726d688e3SAlex Vesker 			buff = tail_param;
107826d688e3SAlex Vesker 		} else {
107926d688e3SAlex Vesker 			buff = data + param_location;
108026d688e3SAlex Vesker 		}
1081941f1979SMuhammad Sammar 		dr_ste_copy_mask_misc2(buff, &set_param->misc2, clr);
108226d688e3SAlex Vesker 	}
108326d688e3SAlex Vesker 
108426d688e3SAlex Vesker 	param_location += sizeof(struct mlx5dr_match_misc2);
108526d688e3SAlex Vesker 
108626d688e3SAlex Vesker 	if (match_criteria & DR_MATCHER_CRITERIA_MISC3) {
108726d688e3SAlex Vesker 		if (mask->match_sz < param_location +
108826d688e3SAlex Vesker 		    sizeof(struct mlx5dr_match_misc3)) {
108926d688e3SAlex Vesker 			memcpy(tail_param, data + param_location,
109026d688e3SAlex Vesker 			       mask->match_sz - param_location);
109126d688e3SAlex Vesker 			buff = tail_param;
109226d688e3SAlex Vesker 		} else {
109326d688e3SAlex Vesker 			buff = data + param_location;
109426d688e3SAlex Vesker 		}
1095941f1979SMuhammad Sammar 		dr_ste_copy_mask_misc3(buff, &set_param->misc3, clr);
109626d688e3SAlex Vesker 	}
1097160e9cb3SYevgeny Kliteynik 
1098160e9cb3SYevgeny Kliteynik 	param_location += sizeof(struct mlx5dr_match_misc3);
1099160e9cb3SYevgeny Kliteynik 
1100160e9cb3SYevgeny Kliteynik 	if (match_criteria & DR_MATCHER_CRITERIA_MISC4) {
1101160e9cb3SYevgeny Kliteynik 		if (mask->match_sz < param_location +
1102160e9cb3SYevgeny Kliteynik 		    sizeof(struct mlx5dr_match_misc4)) {
1103160e9cb3SYevgeny Kliteynik 			memcpy(tail_param, data + param_location,
1104160e9cb3SYevgeny Kliteynik 			       mask->match_sz - param_location);
1105160e9cb3SYevgeny Kliteynik 			buff = tail_param;
1106160e9cb3SYevgeny Kliteynik 		} else {
1107160e9cb3SYevgeny Kliteynik 			buff = data + param_location;
1108160e9cb3SYevgeny Kliteynik 		}
1109941f1979SMuhammad Sammar 		dr_ste_copy_mask_misc4(buff, &set_param->misc4, clr);
1110160e9cb3SYevgeny Kliteynik 	}
11118c2b4feeSMuhammad Sammar 
11128c2b4feeSMuhammad Sammar 	param_location += sizeof(struct mlx5dr_match_misc4);
11138c2b4feeSMuhammad Sammar 
11148c2b4feeSMuhammad Sammar 	if (match_criteria & DR_MATCHER_CRITERIA_MISC5) {
11158c2b4feeSMuhammad Sammar 		if (mask->match_sz < param_location +
11168c2b4feeSMuhammad Sammar 		    sizeof(struct mlx5dr_match_misc5)) {
11178c2b4feeSMuhammad Sammar 			memcpy(tail_param, data + param_location,
11188c2b4feeSMuhammad Sammar 			       mask->match_sz - param_location);
11198c2b4feeSMuhammad Sammar 			buff = tail_param;
11208c2b4feeSMuhammad Sammar 		} else {
11218c2b4feeSMuhammad Sammar 			buff = data + param_location;
11228c2b4feeSMuhammad Sammar 		}
11238c2b4feeSMuhammad Sammar 		dr_ste_copy_mask_misc5(buff, &set_param->misc5, clr);
11248c2b4feeSMuhammad Sammar 	}
112526d688e3SAlex Vesker }
112626d688e3SAlex Vesker 
mlx5dr_ste_build_eth_l2_src_dst(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)11275212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_eth_l2_src_dst(struct mlx5dr_ste_ctx *ste_ctx,
11285212f9c6SYevgeny Kliteynik 				     struct mlx5dr_ste_build *sb,
112926d688e3SAlex Vesker 				     struct mlx5dr_match_param *mask,
113026d688e3SAlex Vesker 				     bool inner, bool rx)
113126d688e3SAlex Vesker {
113226d688e3SAlex Vesker 	sb->rx = rx;
113326d688e3SAlex Vesker 	sb->inner = inner;
11345212f9c6SYevgeny Kliteynik 	ste_ctx->build_eth_l2_src_dst_init(sb, mask);
113526d688e3SAlex Vesker }
113626d688e3SAlex Vesker 
mlx5dr_ste_build_eth_l3_ipv6_dst(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)11375212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_eth_l3_ipv6_dst(struct mlx5dr_ste_ctx *ste_ctx,
11385212f9c6SYevgeny Kliteynik 				      struct mlx5dr_ste_build *sb,
113926d688e3SAlex Vesker 				      struct mlx5dr_match_param *mask,
114026d688e3SAlex Vesker 				      bool inner, bool rx)
114126d688e3SAlex Vesker {
114226d688e3SAlex Vesker 	sb->rx = rx;
114326d688e3SAlex Vesker 	sb->inner = inner;
11445212f9c6SYevgeny Kliteynik 	ste_ctx->build_eth_l3_ipv6_dst_init(sb, mask);
114526d688e3SAlex Vesker }
114626d688e3SAlex Vesker 
mlx5dr_ste_build_eth_l3_ipv6_src(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)11475212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_eth_l3_ipv6_src(struct mlx5dr_ste_ctx *ste_ctx,
11485212f9c6SYevgeny Kliteynik 				      struct mlx5dr_ste_build *sb,
114926d688e3SAlex Vesker 				      struct mlx5dr_match_param *mask,
115026d688e3SAlex Vesker 				      bool inner, bool rx)
115126d688e3SAlex Vesker {
115226d688e3SAlex Vesker 	sb->rx = rx;
115326d688e3SAlex Vesker 	sb->inner = inner;
11545212f9c6SYevgeny Kliteynik 	ste_ctx->build_eth_l3_ipv6_src_init(sb, mask);
115526d688e3SAlex Vesker }
115626d688e3SAlex Vesker 
mlx5dr_ste_build_eth_l3_ipv4_5_tuple(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)11575212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_eth_l3_ipv4_5_tuple(struct mlx5dr_ste_ctx *ste_ctx,
11585212f9c6SYevgeny Kliteynik 					  struct mlx5dr_ste_build *sb,
115926d688e3SAlex Vesker 					  struct mlx5dr_match_param *mask,
116026d688e3SAlex Vesker 					  bool inner, bool rx)
116126d688e3SAlex Vesker {
116226d688e3SAlex Vesker 	sb->rx = rx;
116326d688e3SAlex Vesker 	sb->inner = inner;
11645212f9c6SYevgeny Kliteynik 	ste_ctx->build_eth_l3_ipv4_5_tuple_init(sb, mask);
116526d688e3SAlex Vesker }
116626d688e3SAlex Vesker 
mlx5dr_ste_build_eth_l2_src(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)11675212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_eth_l2_src(struct mlx5dr_ste_ctx *ste_ctx,
11685212f9c6SYevgeny Kliteynik 				 struct mlx5dr_ste_build *sb,
116926d688e3SAlex Vesker 				 struct mlx5dr_match_param *mask,
117026d688e3SAlex Vesker 				 bool inner, bool rx)
117126d688e3SAlex Vesker {
117226d688e3SAlex Vesker 	sb->rx = rx;
117326d688e3SAlex Vesker 	sb->inner = inner;
11745212f9c6SYevgeny Kliteynik 	ste_ctx->build_eth_l2_src_init(sb, mask);
117526d688e3SAlex Vesker }
117626d688e3SAlex Vesker 
mlx5dr_ste_build_eth_l2_dst(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)11775212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_eth_l2_dst(struct mlx5dr_ste_ctx *ste_ctx,
11785212f9c6SYevgeny Kliteynik 				 struct mlx5dr_ste_build *sb,
117926d688e3SAlex Vesker 				 struct mlx5dr_match_param *mask,
118026d688e3SAlex Vesker 				 bool inner, bool rx)
118126d688e3SAlex Vesker {
118226d688e3SAlex Vesker 	sb->rx = rx;
118326d688e3SAlex Vesker 	sb->inner = inner;
11845212f9c6SYevgeny Kliteynik 	ste_ctx->build_eth_l2_dst_init(sb, mask);
118526d688e3SAlex Vesker }
118626d688e3SAlex Vesker 
mlx5dr_ste_build_eth_l2_tnl(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)11875212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_eth_l2_tnl(struct mlx5dr_ste_ctx *ste_ctx,
11885212f9c6SYevgeny Kliteynik 				 struct mlx5dr_ste_build *sb,
11895212f9c6SYevgeny Kliteynik 				 struct mlx5dr_match_param *mask, bool inner, bool rx)
11905212f9c6SYevgeny Kliteynik {
11915212f9c6SYevgeny Kliteynik 	sb->rx = rx;
11925212f9c6SYevgeny Kliteynik 	sb->inner = inner;
11935212f9c6SYevgeny Kliteynik 	ste_ctx->build_eth_l2_tnl_init(sb, mask);
11945212f9c6SYevgeny Kliteynik }
11955212f9c6SYevgeny Kliteynik 
mlx5dr_ste_build_eth_l3_ipv4_misc(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)11965212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_eth_l3_ipv4_misc(struct mlx5dr_ste_ctx *ste_ctx,
11975212f9c6SYevgeny Kliteynik 				       struct mlx5dr_ste_build *sb,
119826d688e3SAlex Vesker 				       struct mlx5dr_match_param *mask,
119926d688e3SAlex Vesker 				       bool inner, bool rx)
120026d688e3SAlex Vesker {
120126d688e3SAlex Vesker 	sb->rx = rx;
120226d688e3SAlex Vesker 	sb->inner = inner;
12035212f9c6SYevgeny Kliteynik 	ste_ctx->build_eth_l3_ipv4_misc_init(sb, mask);
120426d688e3SAlex Vesker }
120526d688e3SAlex Vesker 
mlx5dr_ste_build_eth_ipv6_l3_l4(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)12065212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_eth_ipv6_l3_l4(struct mlx5dr_ste_ctx *ste_ctx,
12075212f9c6SYevgeny Kliteynik 				     struct mlx5dr_ste_build *sb,
120826d688e3SAlex Vesker 				     struct mlx5dr_match_param *mask,
120926d688e3SAlex Vesker 				     bool inner, bool rx)
121026d688e3SAlex Vesker {
121126d688e3SAlex Vesker 	sb->rx = rx;
121226d688e3SAlex Vesker 	sb->inner = inner;
12135212f9c6SYevgeny Kliteynik 	ste_ctx->build_eth_ipv6_l3_l4_init(sb, mask);
121426d688e3SAlex Vesker }
121526d688e3SAlex Vesker 
dr_ste_build_empty_always_hit_tag(struct mlx5dr_match_param * value,struct mlx5dr_ste_build * sb,u8 * tag)121626d688e3SAlex Vesker static int dr_ste_build_empty_always_hit_tag(struct mlx5dr_match_param *value,
121726d688e3SAlex Vesker 					     struct mlx5dr_ste_build *sb,
1218e6b69bf3SYevgeny Kliteynik 					     u8 *tag)
121926d688e3SAlex Vesker {
122026d688e3SAlex Vesker 	return 0;
122126d688e3SAlex Vesker }
122226d688e3SAlex Vesker 
mlx5dr_ste_build_empty_always_hit(struct mlx5dr_ste_build * sb,bool rx)122326d688e3SAlex Vesker void mlx5dr_ste_build_empty_always_hit(struct mlx5dr_ste_build *sb, bool rx)
122426d688e3SAlex Vesker {
122526d688e3SAlex Vesker 	sb->rx = rx;
122626d688e3SAlex Vesker 	sb->lu_type = MLX5DR_STE_LU_TYPE_DONT_CARE;
122726d688e3SAlex Vesker 	sb->byte_mask = 0;
122826d688e3SAlex Vesker 	sb->ste_build_tag_func = &dr_ste_build_empty_always_hit_tag;
122926d688e3SAlex Vesker }
123026d688e3SAlex Vesker 
mlx5dr_ste_build_mpls(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)12315212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_mpls(struct mlx5dr_ste_ctx *ste_ctx,
12325212f9c6SYevgeny Kliteynik 			   struct mlx5dr_ste_build *sb,
123326d688e3SAlex Vesker 			   struct mlx5dr_match_param *mask,
123426d688e3SAlex Vesker 			   bool inner, bool rx)
123526d688e3SAlex Vesker {
123626d688e3SAlex Vesker 	sb->rx = rx;
123726d688e3SAlex Vesker 	sb->inner = inner;
12385212f9c6SYevgeny Kliteynik 	ste_ctx->build_mpls_init(sb, mask);
123926d688e3SAlex Vesker }
124026d688e3SAlex Vesker 
mlx5dr_ste_build_tnl_gre(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)12415212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_tnl_gre(struct mlx5dr_ste_ctx *ste_ctx,
12425212f9c6SYevgeny Kliteynik 			      struct mlx5dr_ste_build *sb,
12435212f9c6SYevgeny Kliteynik 			      struct mlx5dr_match_param *mask,
12445212f9c6SYevgeny Kliteynik 			      bool inner, bool rx)
12455212f9c6SYevgeny Kliteynik {
12465212f9c6SYevgeny Kliteynik 	sb->rx = rx;
12475212f9c6SYevgeny Kliteynik 	sb->inner = inner;
12485212f9c6SYevgeny Kliteynik 	ste_ctx->build_tnl_gre_init(sb, mask);
12495212f9c6SYevgeny Kliteynik }
12505212f9c6SYevgeny Kliteynik 
mlx5dr_ste_build_tnl_mpls_over_gre(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,struct mlx5dr_cmd_caps * caps,bool inner,bool rx)125135ba005dSYevgeny Kliteynik void mlx5dr_ste_build_tnl_mpls_over_gre(struct mlx5dr_ste_ctx *ste_ctx,
12525212f9c6SYevgeny Kliteynik 					struct mlx5dr_ste_build *sb,
125326d688e3SAlex Vesker 					struct mlx5dr_match_param *mask,
125435ba005dSYevgeny Kliteynik 					struct mlx5dr_cmd_caps *caps,
125526d688e3SAlex Vesker 					bool inner, bool rx)
125626d688e3SAlex Vesker {
125726d688e3SAlex Vesker 	sb->rx = rx;
125826d688e3SAlex Vesker 	sb->inner = inner;
125935ba005dSYevgeny Kliteynik 	sb->caps = caps;
126035ba005dSYevgeny Kliteynik 	return ste_ctx->build_tnl_mpls_over_gre_init(sb, mask);
126135ba005dSYevgeny Kliteynik }
126235ba005dSYevgeny Kliteynik 
mlx5dr_ste_build_tnl_mpls_over_udp(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,struct mlx5dr_cmd_caps * caps,bool inner,bool rx)126335ba005dSYevgeny Kliteynik void mlx5dr_ste_build_tnl_mpls_over_udp(struct mlx5dr_ste_ctx *ste_ctx,
126435ba005dSYevgeny Kliteynik 					struct mlx5dr_ste_build *sb,
126535ba005dSYevgeny Kliteynik 					struct mlx5dr_match_param *mask,
126635ba005dSYevgeny Kliteynik 					struct mlx5dr_cmd_caps *caps,
126735ba005dSYevgeny Kliteynik 					bool inner, bool rx)
126835ba005dSYevgeny Kliteynik {
126935ba005dSYevgeny Kliteynik 	sb->rx = rx;
127035ba005dSYevgeny Kliteynik 	sb->inner = inner;
127135ba005dSYevgeny Kliteynik 	sb->caps = caps;
127235ba005dSYevgeny Kliteynik 	return ste_ctx->build_tnl_mpls_over_udp_init(sb, mask);
127326d688e3SAlex Vesker }
127426d688e3SAlex Vesker 
mlx5dr_ste_build_icmp(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,struct mlx5dr_cmd_caps * caps,bool inner,bool rx)12754923938dSYevgeny Kliteynik void mlx5dr_ste_build_icmp(struct mlx5dr_ste_ctx *ste_ctx,
12765212f9c6SYevgeny Kliteynik 			   struct mlx5dr_ste_build *sb,
12775212f9c6SYevgeny Kliteynik 			   struct mlx5dr_match_param *mask,
12785212f9c6SYevgeny Kliteynik 			   struct mlx5dr_cmd_caps *caps,
12795212f9c6SYevgeny Kliteynik 			   bool inner, bool rx)
12805212f9c6SYevgeny Kliteynik {
12815212f9c6SYevgeny Kliteynik 	sb->rx = rx;
12825212f9c6SYevgeny Kliteynik 	sb->inner = inner;
12835212f9c6SYevgeny Kliteynik 	sb->caps = caps;
12844923938dSYevgeny Kliteynik 	ste_ctx->build_icmp_init(sb, mask);
12855212f9c6SYevgeny Kliteynik }
12865212f9c6SYevgeny Kliteynik 
mlx5dr_ste_build_general_purpose(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)12875212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_general_purpose(struct mlx5dr_ste_ctx *ste_ctx,
12885212f9c6SYevgeny Kliteynik 				      struct mlx5dr_ste_build *sb,
128926d688e3SAlex Vesker 				      struct mlx5dr_match_param *mask,
129026d688e3SAlex Vesker 				      bool inner, bool rx)
129126d688e3SAlex Vesker {
129226d688e3SAlex Vesker 	sb->rx = rx;
129326d688e3SAlex Vesker 	sb->inner = inner;
12945212f9c6SYevgeny Kliteynik 	ste_ctx->build_general_purpose_init(sb, mask);
129526d688e3SAlex Vesker }
129626d688e3SAlex Vesker 
mlx5dr_ste_build_eth_l4_misc(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)12975212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_eth_l4_misc(struct mlx5dr_ste_ctx *ste_ctx,
12985212f9c6SYevgeny Kliteynik 				  struct mlx5dr_ste_build *sb,
129926d688e3SAlex Vesker 				  struct mlx5dr_match_param *mask,
130026d688e3SAlex Vesker 				  bool inner, bool rx)
130126d688e3SAlex Vesker {
130226d688e3SAlex Vesker 	sb->rx = rx;
130326d688e3SAlex Vesker 	sb->inner = inner;
13045212f9c6SYevgeny Kliteynik 	ste_ctx->build_eth_l4_misc_init(sb, mask);
130526d688e3SAlex Vesker }
130626d688e3SAlex Vesker 
mlx5dr_ste_build_tnl_vxlan_gpe(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)13075212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_tnl_vxlan_gpe(struct mlx5dr_ste_ctx *ste_ctx,
13085212f9c6SYevgeny Kliteynik 				    struct mlx5dr_ste_build *sb,
130926d688e3SAlex Vesker 				    struct mlx5dr_match_param *mask,
131026d688e3SAlex Vesker 				    bool inner, bool rx)
131126d688e3SAlex Vesker {
131226d688e3SAlex Vesker 	sb->rx = rx;
131326d688e3SAlex Vesker 	sb->inner = inner;
13145212f9c6SYevgeny Kliteynik 	ste_ctx->build_tnl_vxlan_gpe_init(sb, mask);
131526d688e3SAlex Vesker }
131626d688e3SAlex Vesker 
mlx5dr_ste_build_tnl_geneve(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)13175212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_tnl_geneve(struct mlx5dr_ste_ctx *ste_ctx,
13185212f9c6SYevgeny Kliteynik 				 struct mlx5dr_ste_build *sb,
1319b6d12238SYevgeny Kliteynik 				 struct mlx5dr_match_param *mask,
1320b6d12238SYevgeny Kliteynik 				 bool inner, bool rx)
1321b6d12238SYevgeny Kliteynik {
1322b6d12238SYevgeny Kliteynik 	sb->rx = rx;
1323b6d12238SYevgeny Kliteynik 	sb->inner = inner;
13245212f9c6SYevgeny Kliteynik 	ste_ctx->build_tnl_geneve_init(sb, mask);
132526d688e3SAlex Vesker }
132626d688e3SAlex Vesker 
mlx5dr_ste_build_tnl_geneve_tlv_opt(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,struct mlx5dr_cmd_caps * caps,bool inner,bool rx)13273442e033SYevgeny Kliteynik void mlx5dr_ste_build_tnl_geneve_tlv_opt(struct mlx5dr_ste_ctx *ste_ctx,
13283442e033SYevgeny Kliteynik 					 struct mlx5dr_ste_build *sb,
13293442e033SYevgeny Kliteynik 					 struct mlx5dr_match_param *mask,
13303442e033SYevgeny Kliteynik 					 struct mlx5dr_cmd_caps *caps,
13313442e033SYevgeny Kliteynik 					 bool inner, bool rx)
13323442e033SYevgeny Kliteynik {
13333442e033SYevgeny Kliteynik 	sb->rx = rx;
13343442e033SYevgeny Kliteynik 	sb->caps = caps;
13353442e033SYevgeny Kliteynik 	sb->inner = inner;
13363442e033SYevgeny Kliteynik 	ste_ctx->build_tnl_geneve_tlv_opt_init(sb, mask);
13373442e033SYevgeny Kliteynik }
13383442e033SYevgeny Kliteynik 
mlx5dr_ste_build_tnl_geneve_tlv_opt_exist(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,struct mlx5dr_cmd_caps * caps,bool inner,bool rx)1339f59464e2SYevgeny Kliteynik void mlx5dr_ste_build_tnl_geneve_tlv_opt_exist(struct mlx5dr_ste_ctx *ste_ctx,
1340f59464e2SYevgeny Kliteynik 					       struct mlx5dr_ste_build *sb,
1341f59464e2SYevgeny Kliteynik 					       struct mlx5dr_match_param *mask,
1342f59464e2SYevgeny Kliteynik 					       struct mlx5dr_cmd_caps *caps,
1343f59464e2SYevgeny Kliteynik 					       bool inner, bool rx)
1344f59464e2SYevgeny Kliteynik {
1345f59464e2SYevgeny Kliteynik 	if (!ste_ctx->build_tnl_geneve_tlv_opt_exist_init)
1346f59464e2SYevgeny Kliteynik 		return;
1347f59464e2SYevgeny Kliteynik 
1348f59464e2SYevgeny Kliteynik 	sb->rx = rx;
1349f59464e2SYevgeny Kliteynik 	sb->caps = caps;
1350f59464e2SYevgeny Kliteynik 	sb->inner = inner;
1351f59464e2SYevgeny Kliteynik 	ste_ctx->build_tnl_geneve_tlv_opt_exist_init(sb, mask);
1352f59464e2SYevgeny Kliteynik }
1353f59464e2SYevgeny Kliteynik 
mlx5dr_ste_build_tnl_gtpu(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)1354df9dd15aSYevgeny Kliteynik void mlx5dr_ste_build_tnl_gtpu(struct mlx5dr_ste_ctx *ste_ctx,
1355df9dd15aSYevgeny Kliteynik 			       struct mlx5dr_ste_build *sb,
1356df9dd15aSYevgeny Kliteynik 			       struct mlx5dr_match_param *mask,
1357df9dd15aSYevgeny Kliteynik 			       bool inner, bool rx)
1358df9dd15aSYevgeny Kliteynik {
1359df9dd15aSYevgeny Kliteynik 	sb->rx = rx;
1360df9dd15aSYevgeny Kliteynik 	sb->inner = inner;
1361df9dd15aSYevgeny Kliteynik 	ste_ctx->build_tnl_gtpu_init(sb, mask);
1362df9dd15aSYevgeny Kliteynik }
1363df9dd15aSYevgeny Kliteynik 
mlx5dr_ste_build_tnl_gtpu_flex_parser_0(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,struct mlx5dr_cmd_caps * caps,bool inner,bool rx)1364df9dd15aSYevgeny Kliteynik void mlx5dr_ste_build_tnl_gtpu_flex_parser_0(struct mlx5dr_ste_ctx *ste_ctx,
1365df9dd15aSYevgeny Kliteynik 					     struct mlx5dr_ste_build *sb,
1366df9dd15aSYevgeny Kliteynik 					     struct mlx5dr_match_param *mask,
1367df9dd15aSYevgeny Kliteynik 					     struct mlx5dr_cmd_caps *caps,
1368df9dd15aSYevgeny Kliteynik 					     bool inner, bool rx)
1369df9dd15aSYevgeny Kliteynik {
1370df9dd15aSYevgeny Kliteynik 	sb->rx = rx;
1371df9dd15aSYevgeny Kliteynik 	sb->caps = caps;
1372df9dd15aSYevgeny Kliteynik 	sb->inner = inner;
1373df9dd15aSYevgeny Kliteynik 	ste_ctx->build_tnl_gtpu_flex_parser_0_init(sb, mask);
1374df9dd15aSYevgeny Kliteynik }
1375df9dd15aSYevgeny Kliteynik 
mlx5dr_ste_build_tnl_gtpu_flex_parser_1(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,struct mlx5dr_cmd_caps * caps,bool inner,bool rx)1376df9dd15aSYevgeny Kliteynik void mlx5dr_ste_build_tnl_gtpu_flex_parser_1(struct mlx5dr_ste_ctx *ste_ctx,
1377df9dd15aSYevgeny Kliteynik 					     struct mlx5dr_ste_build *sb,
1378df9dd15aSYevgeny Kliteynik 					     struct mlx5dr_match_param *mask,
1379df9dd15aSYevgeny Kliteynik 					     struct mlx5dr_cmd_caps *caps,
1380df9dd15aSYevgeny Kliteynik 					     bool inner, bool rx)
1381df9dd15aSYevgeny Kliteynik {
1382df9dd15aSYevgeny Kliteynik 	sb->rx = rx;
1383df9dd15aSYevgeny Kliteynik 	sb->caps = caps;
1384df9dd15aSYevgeny Kliteynik 	sb->inner = inner;
1385df9dd15aSYevgeny Kliteynik 	ste_ctx->build_tnl_gtpu_flex_parser_1_init(sb, mask);
1386df9dd15aSYevgeny Kliteynik }
1387df9dd15aSYevgeny Kliteynik 
mlx5dr_ste_build_register_0(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)13885212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_register_0(struct mlx5dr_ste_ctx *ste_ctx,
13895212f9c6SYevgeny Kliteynik 				 struct mlx5dr_ste_build *sb,
139026d688e3SAlex Vesker 				 struct mlx5dr_match_param *mask,
139126d688e3SAlex Vesker 				 bool inner, bool rx)
139226d688e3SAlex Vesker {
139326d688e3SAlex Vesker 	sb->rx = rx;
139426d688e3SAlex Vesker 	sb->inner = inner;
13955212f9c6SYevgeny Kliteynik 	ste_ctx->build_register_0_init(sb, mask);
139626d688e3SAlex Vesker }
139726d688e3SAlex Vesker 
mlx5dr_ste_build_register_1(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)13985212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_register_1(struct mlx5dr_ste_ctx *ste_ctx,
13995212f9c6SYevgeny Kliteynik 				 struct mlx5dr_ste_build *sb,
140026d688e3SAlex Vesker 				 struct mlx5dr_match_param *mask,
140126d688e3SAlex Vesker 				 bool inner, bool rx)
140226d688e3SAlex Vesker {
140326d688e3SAlex Vesker 	sb->rx = rx;
140426d688e3SAlex Vesker 	sb->inner = inner;
14055212f9c6SYevgeny Kliteynik 	ste_ctx->build_register_1_init(sb, mask);
140626d688e3SAlex Vesker }
140726d688e3SAlex Vesker 
mlx5dr_ste_build_src_gvmi_qpn(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,struct mlx5dr_domain * dmn,bool inner,bool rx)14085212f9c6SYevgeny Kliteynik void mlx5dr_ste_build_src_gvmi_qpn(struct mlx5dr_ste_ctx *ste_ctx,
14095212f9c6SYevgeny Kliteynik 				   struct mlx5dr_ste_build *sb,
141026d688e3SAlex Vesker 				   struct mlx5dr_match_param *mask,
1411640bdb1fSAlaa Hleihel 				   struct mlx5dr_domain *dmn,
141226d688e3SAlex Vesker 				   bool inner, bool rx)
141326d688e3SAlex Vesker {
1414640bdb1fSAlaa Hleihel 	/* Set vhca_id_valid before we reset source_eswitch_owner_vhca_id */
1415640bdb1fSAlaa Hleihel 	sb->vhca_id_valid = mask->misc.source_eswitch_owner_vhca_id;
1416640bdb1fSAlaa Hleihel 
141726d688e3SAlex Vesker 	sb->rx = rx;
1418640bdb1fSAlaa Hleihel 	sb->dmn = dmn;
141926d688e3SAlex Vesker 	sb->inner = inner;
14205212f9c6SYevgeny Kliteynik 	ste_ctx->build_src_gvmi_qpn_init(sb, mask);
14215212f9c6SYevgeny Kliteynik }
14225212f9c6SYevgeny Kliteynik 
mlx5dr_ste_build_flex_parser_0(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)1423160e9cb3SYevgeny Kliteynik void mlx5dr_ste_build_flex_parser_0(struct mlx5dr_ste_ctx *ste_ctx,
1424160e9cb3SYevgeny Kliteynik 				    struct mlx5dr_ste_build *sb,
1425160e9cb3SYevgeny Kliteynik 				    struct mlx5dr_match_param *mask,
1426160e9cb3SYevgeny Kliteynik 				    bool inner, bool rx)
1427160e9cb3SYevgeny Kliteynik {
1428160e9cb3SYevgeny Kliteynik 	sb->rx = rx;
1429160e9cb3SYevgeny Kliteynik 	sb->inner = inner;
1430160e9cb3SYevgeny Kliteynik 	ste_ctx->build_flex_parser_0_init(sb, mask);
1431160e9cb3SYevgeny Kliteynik }
1432160e9cb3SYevgeny Kliteynik 
mlx5dr_ste_build_flex_parser_1(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)1433160e9cb3SYevgeny Kliteynik void mlx5dr_ste_build_flex_parser_1(struct mlx5dr_ste_ctx *ste_ctx,
1434160e9cb3SYevgeny Kliteynik 				    struct mlx5dr_ste_build *sb,
1435160e9cb3SYevgeny Kliteynik 				    struct mlx5dr_match_param *mask,
1436160e9cb3SYevgeny Kliteynik 				    bool inner, bool rx)
1437160e9cb3SYevgeny Kliteynik {
1438160e9cb3SYevgeny Kliteynik 	sb->rx = rx;
1439160e9cb3SYevgeny Kliteynik 	sb->inner = inner;
1440160e9cb3SYevgeny Kliteynik 	ste_ctx->build_flex_parser_1_init(sb, mask);
1441160e9cb3SYevgeny Kliteynik }
1442160e9cb3SYevgeny Kliteynik 
mlx5dr_ste_build_tnl_header_0_1(struct mlx5dr_ste_ctx * ste_ctx,struct mlx5dr_ste_build * sb,struct mlx5dr_match_param * mask,bool inner,bool rx)144309753babSMuhammad Sammar void mlx5dr_ste_build_tnl_header_0_1(struct mlx5dr_ste_ctx *ste_ctx,
144409753babSMuhammad Sammar 				     struct mlx5dr_ste_build *sb,
144509753babSMuhammad Sammar 				     struct mlx5dr_match_param *mask,
144609753babSMuhammad Sammar 				     bool inner, bool rx)
144709753babSMuhammad Sammar {
144809753babSMuhammad Sammar 	sb->rx = rx;
144909753babSMuhammad Sammar 	sb->inner = inner;
145009753babSMuhammad Sammar 	ste_ctx->build_tnl_header_0_1_init(sb, mask);
145109753babSMuhammad Sammar }
145209753babSMuhammad Sammar 
mlx5dr_ste_get_ctx(u8 version)14535212f9c6SYevgeny Kliteynik struct mlx5dr_ste_ctx *mlx5dr_ste_get_ctx(u8 version)
14545212f9c6SYevgeny Kliteynik {
1455638a07f1SYevgeny Kliteynik 	if (version == MLX5_STEERING_FORMAT_CONNECTX_5)
1456638a07f1SYevgeny Kliteynik 		return mlx5dr_ste_get_ctx_v0();
1457638a07f1SYevgeny Kliteynik 	else if (version == MLX5_STEERING_FORMAT_CONNECTX_6DX)
1458638a07f1SYevgeny Kliteynik 		return mlx5dr_ste_get_ctx_v1();
14596862c787SYevgeny Kliteynik 	else if (version == MLX5_STEERING_FORMAT_CONNECTX_7)
14606862c787SYevgeny Kliteynik 		return mlx5dr_ste_get_ctx_v2();
14615212f9c6SYevgeny Kliteynik 
1462638a07f1SYevgeny Kliteynik 	return NULL;
146326d688e3SAlex Vesker }
1464