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,
516d5b7321SShay Drory 			    struct mlx5dr_domain *peer_dmn,
52*62752c0bSShay Drory 			    u16 peer_vhca_id);
5370605ea5SAlex Vesker 
5470605ea5SAlex Vesker struct mlx5dr_table *
55b0bb369eSMark Bloch mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level, u32 flags,
56b0bb369eSMark Bloch 		    u16 uid);
5770605ea5SAlex Vesker 
5834ea969dSPaul Blakey struct mlx5dr_table *
5934ea969dSPaul Blakey mlx5dr_table_get_from_fs_ft(struct mlx5_flow_table *ft);
6034ea969dSPaul Blakey 
6170605ea5SAlex Vesker int mlx5dr_table_destroy(struct mlx5dr_table *table);
6270605ea5SAlex Vesker 
6370605ea5SAlex Vesker u32 mlx5dr_table_get_id(struct mlx5dr_table *table);
6470605ea5SAlex Vesker 
6570605ea5SAlex Vesker struct mlx5dr_matcher *
6670605ea5SAlex Vesker mlx5dr_matcher_create(struct mlx5dr_table *table,
67f6409299SHamdan Igbaria 		      u32 priority,
6870605ea5SAlex Vesker 		      u8 match_criteria_enable,
6970605ea5SAlex Vesker 		      struct mlx5dr_match_parameters *mask);
7070605ea5SAlex Vesker 
7170605ea5SAlex Vesker int mlx5dr_matcher_destroy(struct mlx5dr_matcher *matcher);
7270605ea5SAlex Vesker 
7370605ea5SAlex Vesker struct mlx5dr_rule *
7470605ea5SAlex Vesker mlx5dr_rule_create(struct mlx5dr_matcher *matcher,
7570605ea5SAlex Vesker 		   struct mlx5dr_match_parameters *value,
7670605ea5SAlex Vesker 		   size_t num_actions,
7701723919SHamdan Igbaria 		   struct mlx5dr_action *actions[],
7801723919SHamdan Igbaria 		   u32 flow_source);
7970605ea5SAlex Vesker 
8070605ea5SAlex Vesker int mlx5dr_rule_destroy(struct mlx5dr_rule *rule);
8170605ea5SAlex Vesker 
8270605ea5SAlex Vesker int mlx5dr_table_set_miss_action(struct mlx5dr_table *tbl,
8370605ea5SAlex Vesker 				 struct mlx5dr_action *action);
8470605ea5SAlex Vesker 
8570605ea5SAlex Vesker struct mlx5dr_action *
86de346f40SAlex Vesker mlx5dr_action_create_dest_table_num(struct mlx5dr_domain *dmn, u32 table_num);
87de346f40SAlex Vesker 
88de346f40SAlex Vesker struct mlx5dr_action *
8970605ea5SAlex Vesker mlx5dr_action_create_dest_table(struct mlx5dr_table *table);
9070605ea5SAlex Vesker 
9170605ea5SAlex Vesker struct mlx5dr_action *
92aec292eeSAlex Vesker mlx5dr_action_create_dest_flow_fw_table(struct mlx5dr_domain *domain,
93aec292eeSAlex Vesker 					struct mlx5_flow_table *ft);
9470605ea5SAlex Vesker 
9570605ea5SAlex Vesker struct mlx5dr_action *
9670605ea5SAlex Vesker mlx5dr_action_create_dest_vport(struct mlx5dr_domain *domain,
97f9f93bd5SYevgeny Kliteynik 				u16 vport, u8 vhca_id_valid,
9870605ea5SAlex Vesker 				u16 vhca_id);
9970605ea5SAlex Vesker 
100b8853c96SAlex Vesker struct mlx5dr_action *
101b8853c96SAlex Vesker mlx5dr_action_create_mult_dest_tbl(struct mlx5dr_domain *dmn,
102b8853c96SAlex Vesker 				   struct mlx5dr_action_dest *dests,
10363b85f49SYevgeny Kliteynik 				   u32 num_of_dests,
1042c5fc6cdSMaor Dickman 				   bool ignore_flow_level,
1052c5fc6cdSMaor Dickman 				   u32 flow_source);
106b8853c96SAlex Vesker 
10770605ea5SAlex Vesker struct mlx5dr_action *mlx5dr_action_create_drop(void);
10870605ea5SAlex Vesker 
10970605ea5SAlex Vesker struct mlx5dr_action *mlx5dr_action_create_tag(u32 tag_value);
11070605ea5SAlex Vesker 
11170605ea5SAlex Vesker struct mlx5dr_action *
1121ab6dc35SYevgeny Kliteynik mlx5dr_action_create_flow_sampler(struct mlx5dr_domain *dmn, u32 sampler_id);
1131ab6dc35SYevgeny Kliteynik 
1141ab6dc35SYevgeny Kliteynik struct mlx5dr_action *
11570605ea5SAlex Vesker mlx5dr_action_create_flow_counter(u32 counter_id);
11670605ea5SAlex Vesker 
11770605ea5SAlex Vesker struct mlx5dr_action *
11870605ea5SAlex Vesker mlx5dr_action_create_packet_reformat(struct mlx5dr_domain *dmn,
11970605ea5SAlex Vesker 				     enum mlx5dr_action_reformat_type reformat_type,
1203f3f05abSYevgeny Kliteynik 				     u8 reformat_param_0,
1213f3f05abSYevgeny Kliteynik 				     u8 reformat_param_1,
12270605ea5SAlex Vesker 				     size_t data_sz,
12370605ea5SAlex Vesker 				     void *data);
12470605ea5SAlex Vesker 
12570605ea5SAlex Vesker struct mlx5dr_action *
12670605ea5SAlex Vesker mlx5dr_action_create_modify_header(struct mlx5dr_domain *domain,
12770605ea5SAlex Vesker 				   u32 flags,
12870605ea5SAlex Vesker 				   size_t actions_sz,
12970605ea5SAlex Vesker 				   __be64 actions[]);
13070605ea5SAlex Vesker 
13170605ea5SAlex Vesker struct mlx5dr_action *mlx5dr_action_create_pop_vlan(void);
13270605ea5SAlex Vesker 
13370605ea5SAlex Vesker struct mlx5dr_action *
13470605ea5SAlex Vesker mlx5dr_action_create_push_vlan(struct mlx5dr_domain *domain, __be32 vlan_hdr);
13570605ea5SAlex Vesker 
1368920d92bSYevgeny Kliteynik struct mlx5dr_action *
1378920d92bSYevgeny Kliteynik mlx5dr_action_create_aso(struct mlx5dr_domain *dmn,
1388920d92bSYevgeny Kliteynik 			 u32 obj_id,
1398920d92bSYevgeny Kliteynik 			 u8 return_reg_id,
1408920d92bSYevgeny Kliteynik 			 u8 aso_type,
1418920d92bSYevgeny Kliteynik 			 u8 init_color,
1428920d92bSYevgeny Kliteynik 			 u8 meter_id);
1438920d92bSYevgeny Kliteynik 
144be6d5daeSYevgeny Kliteynik struct mlx5dr_action *
145be6d5daeSYevgeny Kliteynik mlx5dr_action_create_dest_match_range(struct mlx5dr_domain *dmn,
146be6d5daeSYevgeny Kliteynik 				      u32 field,
147be6d5daeSYevgeny Kliteynik 				      struct mlx5_flow_table *hit_ft,
148be6d5daeSYevgeny Kliteynik 				      struct mlx5_flow_table *miss_ft,
149be6d5daeSYevgeny Kliteynik 				      u32 min,
150be6d5daeSYevgeny Kliteynik 				      u32 max);
151be6d5daeSYevgeny Kliteynik 
15270605ea5SAlex Vesker int mlx5dr_action_destroy(struct mlx5dr_action *action);
15370605ea5SAlex Vesker 
15487cd0649SYevgeny Kliteynik u32 mlx5dr_action_get_pkt_reformat_id(struct mlx5dr_action *action);
15587cd0649SYevgeny Kliteynik 
1561339678fSYevgeny Kliteynik int mlx5dr_definer_get(struct mlx5dr_domain *dmn, u16 format_id,
1571339678fSYevgeny Kliteynik 		       u8 *dw_selectors, u8 *byte_selectors,
1581339678fSYevgeny Kliteynik 		       u8 *match_mask, u32 *definer_id);
1591339678fSYevgeny Kliteynik void mlx5dr_definer_put(struct mlx5dr_domain *dmn, u32 definer_id);
1601339678fSYevgeny Kliteynik 
16170605ea5SAlex Vesker static inline bool
mlx5dr_is_supported(struct mlx5_core_dev * dev)16270605ea5SAlex Vesker mlx5dr_is_supported(struct mlx5_core_dev *dev)
16370605ea5SAlex Vesker {
1644aaf96acSMaor Gottlieb 	return MLX5_CAP_GEN(dev, roce) &&
1654aaf96acSMaor Gottlieb 	       (MLX5_CAP_ESW_FLOWTABLE_FDB(dev, sw_owner) ||
16664f45c0fSYevgeny Kliteynik 		(MLX5_CAP_ESW_FLOWTABLE_FDB(dev, sw_owner_v2) &&
16764f45c0fSYevgeny Kliteynik 		 (MLX5_CAP_GEN(dev, steering_format_version) <=
1686862c787SYevgeny Kliteynik 		  MLX5_STEERING_FORMAT_CONNECTX_7)));
16970605ea5SAlex Vesker }
17070605ea5SAlex Vesker 
1713b72422dSYevgeny Kliteynik /* buddy functions & structure */
1723b72422dSYevgeny Kliteynik 
1733b72422dSYevgeny Kliteynik struct mlx5dr_icm_mr;
1743b72422dSYevgeny Kliteynik 
1753b72422dSYevgeny Kliteynik struct mlx5dr_icm_buddy_mem {
1763b72422dSYevgeny Kliteynik 	unsigned long		**bitmap;
1773b72422dSYevgeny Kliteynik 	unsigned int		*num_free;
1783b72422dSYevgeny Kliteynik 	u32			max_order;
1793b72422dSYevgeny Kliteynik 	struct list_head	list_node;
1803b72422dSYevgeny Kliteynik 	struct mlx5dr_icm_mr	*icm_mr;
1813b72422dSYevgeny Kliteynik 	struct mlx5dr_icm_pool	*pool;
1823b72422dSYevgeny Kliteynik 
183edaea001SYevgeny Kliteynik 	/* Amount of memory in used chunks - HW may be accessing this memory */
184284836d9SYevgeny Kliteynik 	u64			used_memory;
1853b72422dSYevgeny Kliteynik 
186e5b2bc30SYevgeny Kliteynik 	/* Memory optimisation */
187e5b2bc30SYevgeny Kliteynik 	struct mlx5dr_ste	*ste_arr;
188e5b2bc30SYevgeny Kliteynik 	struct list_head	*miss_list;
189e5b2bc30SYevgeny Kliteynik 	u8			*hw_ste_arr;
1903b72422dSYevgeny Kliteynik };
1913b72422dSYevgeny Kliteynik 
1923b72422dSYevgeny Kliteynik int mlx5dr_buddy_init(struct mlx5dr_icm_buddy_mem *buddy,
1933b72422dSYevgeny Kliteynik 		      unsigned int max_order);
1943b72422dSYevgeny Kliteynik void mlx5dr_buddy_cleanup(struct mlx5dr_icm_buddy_mem *buddy);
1953b72422dSYevgeny Kliteynik int mlx5dr_buddy_alloc_mem(struct mlx5dr_icm_buddy_mem *buddy,
1963b72422dSYevgeny Kliteynik 			   unsigned int order,
1973b72422dSYevgeny Kliteynik 			   unsigned int *segment);
1983b72422dSYevgeny Kliteynik void mlx5dr_buddy_free_mem(struct mlx5dr_icm_buddy_mem *buddy,
1993b72422dSYevgeny Kliteynik 			   unsigned int seg, unsigned int order);
2003b72422dSYevgeny Kliteynik 
20170605ea5SAlex Vesker #endif /* _MLX5DR_H_ */
202