170605ea5SAlex Vesker /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
270605ea5SAlex Vesker /* Copyright (c) 2019, Mellanox Technologies */
370605ea5SAlex Vesker 
470605ea5SAlex Vesker #ifndef _MLX5DR_H_
570605ea5SAlex Vesker #define _MLX5DR_H_
670605ea5SAlex Vesker 
770605ea5SAlex Vesker struct mlx5dr_domain;
870605ea5SAlex Vesker struct mlx5dr_table;
970605ea5SAlex Vesker struct mlx5dr_matcher;
1070605ea5SAlex Vesker struct mlx5dr_rule;
1170605ea5SAlex Vesker struct mlx5dr_action;
1270605ea5SAlex Vesker 
1370605ea5SAlex Vesker enum mlx5dr_domain_type {
1470605ea5SAlex Vesker 	MLX5DR_DOMAIN_TYPE_NIC_RX,
1570605ea5SAlex Vesker 	MLX5DR_DOMAIN_TYPE_NIC_TX,
1670605ea5SAlex Vesker 	MLX5DR_DOMAIN_TYPE_FDB,
1770605ea5SAlex Vesker };
1870605ea5SAlex Vesker 
1970605ea5SAlex Vesker enum mlx5dr_domain_sync_flags {
2070605ea5SAlex Vesker 	MLX5DR_DOMAIN_SYNC_FLAGS_SW = 1 << 0,
2170605ea5SAlex Vesker 	MLX5DR_DOMAIN_SYNC_FLAGS_HW = 1 << 1,
2270605ea5SAlex Vesker };
2370605ea5SAlex Vesker 
2470605ea5SAlex Vesker enum mlx5dr_action_reformat_type {
2570605ea5SAlex Vesker 	DR_ACTION_REFORMAT_TYP_TNL_L2_TO_L2,
2670605ea5SAlex Vesker 	DR_ACTION_REFORMAT_TYP_L2_TO_TNL_L2,
2770605ea5SAlex Vesker 	DR_ACTION_REFORMAT_TYP_TNL_L3_TO_L2,
2870605ea5SAlex Vesker 	DR_ACTION_REFORMAT_TYP_L2_TO_TNL_L3,
297ea9b398SYevgeny Kliteynik 	DR_ACTION_REFORMAT_TYP_INSERT_HDR,
300139145fSYevgeny Kliteynik 	DR_ACTION_REFORMAT_TYP_REMOVE_HDR,
3170605ea5SAlex Vesker };
3270605ea5SAlex Vesker 
3370605ea5SAlex Vesker struct mlx5dr_match_parameters {
3470605ea5SAlex Vesker 	size_t match_sz;
3570605ea5SAlex Vesker 	u64 *match_buf; /* Device spec format */
3670605ea5SAlex Vesker };
3770605ea5SAlex Vesker 
38b8853c96SAlex Vesker struct mlx5dr_action_dest {
39b8853c96SAlex Vesker 	struct mlx5dr_action *dest;
40b8853c96SAlex Vesker 	struct mlx5dr_action *reformat;
41b8853c96SAlex Vesker };
42b8853c96SAlex Vesker 
4370605ea5SAlex Vesker struct mlx5dr_domain *
4470605ea5SAlex Vesker mlx5dr_domain_create(struct mlx5_core_dev *mdev, enum mlx5dr_domain_type type);
4570605ea5SAlex Vesker 
4670605ea5SAlex Vesker int mlx5dr_domain_destroy(struct mlx5dr_domain *domain);
4770605ea5SAlex Vesker 
4870605ea5SAlex Vesker int mlx5dr_domain_sync(struct mlx5dr_domain *domain, u32 flags);
4970605ea5SAlex Vesker 
5070605ea5SAlex Vesker void mlx5dr_domain_set_peer(struct mlx5dr_domain *dmn,
5170605ea5SAlex Vesker 			    struct mlx5dr_domain *peer_dmn);
5270605ea5SAlex Vesker 
5370605ea5SAlex Vesker struct mlx5dr_table *
54b0bb369eSMark Bloch mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level, u32 flags,
55b0bb369eSMark Bloch 		    u16 uid);
5670605ea5SAlex Vesker 
5734ea969dSPaul Blakey struct mlx5dr_table *
5834ea969dSPaul Blakey mlx5dr_table_get_from_fs_ft(struct mlx5_flow_table *ft);
5934ea969dSPaul Blakey 
6070605ea5SAlex Vesker int mlx5dr_table_destroy(struct mlx5dr_table *table);
6170605ea5SAlex Vesker 
6270605ea5SAlex Vesker u32 mlx5dr_table_get_id(struct mlx5dr_table *table);
6370605ea5SAlex Vesker 
6470605ea5SAlex Vesker struct mlx5dr_matcher *
6570605ea5SAlex Vesker mlx5dr_matcher_create(struct mlx5dr_table *table,
66f6409299SHamdan Igbaria 		      u32 priority,
6770605ea5SAlex Vesker 		      u8 match_criteria_enable,
6870605ea5SAlex Vesker 		      struct mlx5dr_match_parameters *mask);
6970605ea5SAlex Vesker 
7070605ea5SAlex Vesker int mlx5dr_matcher_destroy(struct mlx5dr_matcher *matcher);
7170605ea5SAlex Vesker 
7270605ea5SAlex Vesker struct mlx5dr_rule *
7370605ea5SAlex Vesker mlx5dr_rule_create(struct mlx5dr_matcher *matcher,
7470605ea5SAlex Vesker 		   struct mlx5dr_match_parameters *value,
7570605ea5SAlex Vesker 		   size_t num_actions,
7601723919SHamdan Igbaria 		   struct mlx5dr_action *actions[],
7701723919SHamdan Igbaria 		   u32 flow_source);
7870605ea5SAlex Vesker 
7970605ea5SAlex Vesker int mlx5dr_rule_destroy(struct mlx5dr_rule *rule);
8070605ea5SAlex Vesker 
8170605ea5SAlex Vesker int mlx5dr_table_set_miss_action(struct mlx5dr_table *tbl,
8270605ea5SAlex Vesker 				 struct mlx5dr_action *action);
8370605ea5SAlex Vesker 
8470605ea5SAlex Vesker struct mlx5dr_action *
85de346f40SAlex Vesker mlx5dr_action_create_dest_table_num(struct mlx5dr_domain *dmn, u32 table_num);
86de346f40SAlex Vesker 
87de346f40SAlex Vesker struct mlx5dr_action *
8870605ea5SAlex Vesker mlx5dr_action_create_dest_table(struct mlx5dr_table *table);
8970605ea5SAlex Vesker 
9070605ea5SAlex Vesker struct mlx5dr_action *
91aec292eeSAlex Vesker mlx5dr_action_create_dest_flow_fw_table(struct mlx5dr_domain *domain,
92aec292eeSAlex Vesker 					struct mlx5_flow_table *ft);
9370605ea5SAlex Vesker 
9470605ea5SAlex Vesker struct mlx5dr_action *
9570605ea5SAlex Vesker mlx5dr_action_create_dest_vport(struct mlx5dr_domain *domain,
96f9f93bd5SYevgeny Kliteynik 				u16 vport, u8 vhca_id_valid,
9770605ea5SAlex Vesker 				u16 vhca_id);
9870605ea5SAlex Vesker 
99b8853c96SAlex Vesker struct mlx5dr_action *
100b8853c96SAlex Vesker mlx5dr_action_create_mult_dest_tbl(struct mlx5dr_domain *dmn,
101b8853c96SAlex Vesker 				   struct mlx5dr_action_dest *dests,
10263b85f49SYevgeny Kliteynik 				   u32 num_of_dests,
1032c5fc6cdSMaor Dickman 				   bool ignore_flow_level,
1042c5fc6cdSMaor Dickman 				   u32 flow_source);
105b8853c96SAlex Vesker 
10670605ea5SAlex Vesker struct mlx5dr_action *mlx5dr_action_create_drop(void);
10770605ea5SAlex Vesker 
10870605ea5SAlex Vesker struct mlx5dr_action *mlx5dr_action_create_tag(u32 tag_value);
10970605ea5SAlex Vesker 
11070605ea5SAlex Vesker struct mlx5dr_action *
1111ab6dc35SYevgeny Kliteynik mlx5dr_action_create_flow_sampler(struct mlx5dr_domain *dmn, u32 sampler_id);
1121ab6dc35SYevgeny Kliteynik 
1131ab6dc35SYevgeny Kliteynik struct mlx5dr_action *
11470605ea5SAlex Vesker mlx5dr_action_create_flow_counter(u32 counter_id);
11570605ea5SAlex Vesker 
11670605ea5SAlex Vesker struct mlx5dr_action *
11770605ea5SAlex Vesker mlx5dr_action_create_packet_reformat(struct mlx5dr_domain *dmn,
11870605ea5SAlex Vesker 				     enum mlx5dr_action_reformat_type reformat_type,
1193f3f05abSYevgeny Kliteynik 				     u8 reformat_param_0,
1203f3f05abSYevgeny Kliteynik 				     u8 reformat_param_1,
12170605ea5SAlex Vesker 				     size_t data_sz,
12270605ea5SAlex Vesker 				     void *data);
12370605ea5SAlex Vesker 
12470605ea5SAlex Vesker struct mlx5dr_action *
12570605ea5SAlex Vesker mlx5dr_action_create_modify_header(struct mlx5dr_domain *domain,
12670605ea5SAlex Vesker 				   u32 flags,
12770605ea5SAlex Vesker 				   size_t actions_sz,
12870605ea5SAlex Vesker 				   __be64 actions[]);
12970605ea5SAlex Vesker 
13070605ea5SAlex Vesker struct mlx5dr_action *mlx5dr_action_create_pop_vlan(void);
13170605ea5SAlex Vesker 
13270605ea5SAlex Vesker struct mlx5dr_action *
13370605ea5SAlex Vesker mlx5dr_action_create_push_vlan(struct mlx5dr_domain *domain, __be32 vlan_hdr);
13470605ea5SAlex Vesker 
1358920d92bSYevgeny Kliteynik struct mlx5dr_action *
1368920d92bSYevgeny Kliteynik mlx5dr_action_create_aso(struct mlx5dr_domain *dmn,
1378920d92bSYevgeny Kliteynik 			 u32 obj_id,
1388920d92bSYevgeny Kliteynik 			 u8 return_reg_id,
1398920d92bSYevgeny Kliteynik 			 u8 aso_type,
1408920d92bSYevgeny Kliteynik 			 u8 init_color,
1418920d92bSYevgeny Kliteynik 			 u8 meter_id);
1428920d92bSYevgeny Kliteynik 
143*be6d5daeSYevgeny Kliteynik struct mlx5dr_action *
144*be6d5daeSYevgeny Kliteynik mlx5dr_action_create_dest_match_range(struct mlx5dr_domain *dmn,
145*be6d5daeSYevgeny Kliteynik 				      u32 field,
146*be6d5daeSYevgeny Kliteynik 				      struct mlx5_flow_table *hit_ft,
147*be6d5daeSYevgeny Kliteynik 				      struct mlx5_flow_table *miss_ft,
148*be6d5daeSYevgeny Kliteynik 				      u32 min,
149*be6d5daeSYevgeny Kliteynik 				      u32 max);
150*be6d5daeSYevgeny Kliteynik 
15170605ea5SAlex Vesker int mlx5dr_action_destroy(struct mlx5dr_action *action);
15270605ea5SAlex Vesker 
1531339678fSYevgeny Kliteynik int mlx5dr_definer_get(struct mlx5dr_domain *dmn, u16 format_id,
1541339678fSYevgeny Kliteynik 		       u8 *dw_selectors, u8 *byte_selectors,
1551339678fSYevgeny Kliteynik 		       u8 *match_mask, u32 *definer_id);
1561339678fSYevgeny Kliteynik void mlx5dr_definer_put(struct mlx5dr_domain *dmn, u32 definer_id);
1571339678fSYevgeny Kliteynik 
15870605ea5SAlex Vesker static inline bool
15970605ea5SAlex Vesker mlx5dr_is_supported(struct mlx5_core_dev *dev)
16070605ea5SAlex Vesker {
1614aaf96acSMaor Gottlieb 	return MLX5_CAP_GEN(dev, roce) &&
1624aaf96acSMaor Gottlieb 	       (MLX5_CAP_ESW_FLOWTABLE_FDB(dev, sw_owner) ||
16364f45c0fSYevgeny Kliteynik 		(MLX5_CAP_ESW_FLOWTABLE_FDB(dev, sw_owner_v2) &&
16464f45c0fSYevgeny Kliteynik 		 (MLX5_CAP_GEN(dev, steering_format_version) <=
1656862c787SYevgeny Kliteynik 		  MLX5_STEERING_FORMAT_CONNECTX_7)));
16670605ea5SAlex Vesker }
16770605ea5SAlex Vesker 
1683b72422dSYevgeny Kliteynik /* buddy functions & structure */
1693b72422dSYevgeny Kliteynik 
1703b72422dSYevgeny Kliteynik struct mlx5dr_icm_mr;
1713b72422dSYevgeny Kliteynik 
1723b72422dSYevgeny Kliteynik struct mlx5dr_icm_buddy_mem {
1733b72422dSYevgeny Kliteynik 	unsigned long		**bitmap;
1743b72422dSYevgeny Kliteynik 	unsigned int		*num_free;
1753b72422dSYevgeny Kliteynik 	u32			max_order;
1763b72422dSYevgeny Kliteynik 	struct list_head	list_node;
1773b72422dSYevgeny Kliteynik 	struct mlx5dr_icm_mr	*icm_mr;
1783b72422dSYevgeny Kliteynik 	struct mlx5dr_icm_pool	*pool;
1793b72422dSYevgeny Kliteynik 
180edaea001SYevgeny Kliteynik 	/* Amount of memory in used chunks - HW may be accessing this memory */
181284836d9SYevgeny Kliteynik 	u64			used_memory;
1823b72422dSYevgeny Kliteynik 
183e5b2bc30SYevgeny Kliteynik 	/* Memory optimisation */
184e5b2bc30SYevgeny Kliteynik 	struct mlx5dr_ste	*ste_arr;
185e5b2bc30SYevgeny Kliteynik 	struct list_head	*miss_list;
186e5b2bc30SYevgeny Kliteynik 	u8			*hw_ste_arr;
1873b72422dSYevgeny Kliteynik };
1883b72422dSYevgeny Kliteynik 
1893b72422dSYevgeny Kliteynik int mlx5dr_buddy_init(struct mlx5dr_icm_buddy_mem *buddy,
1903b72422dSYevgeny Kliteynik 		      unsigned int max_order);
1913b72422dSYevgeny Kliteynik void mlx5dr_buddy_cleanup(struct mlx5dr_icm_buddy_mem *buddy);
1923b72422dSYevgeny Kliteynik int mlx5dr_buddy_alloc_mem(struct mlx5dr_icm_buddy_mem *buddy,
1933b72422dSYevgeny Kliteynik 			   unsigned int order,
1943b72422dSYevgeny Kliteynik 			   unsigned int *segment);
1953b72422dSYevgeny Kliteynik void mlx5dr_buddy_free_mem(struct mlx5dr_icm_buddy_mem *buddy,
1963b72422dSYevgeny Kliteynik 			   unsigned int seg, unsigned int order);
1973b72422dSYevgeny Kliteynik 
19870605ea5SAlex Vesker #endif /* _MLX5DR_H_ */
199