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,
2970605ea5SAlex Vesker };
3070605ea5SAlex Vesker 
3170605ea5SAlex Vesker struct mlx5dr_match_parameters {
3270605ea5SAlex Vesker 	size_t match_sz;
3370605ea5SAlex Vesker 	u64 *match_buf; /* Device spec format */
3470605ea5SAlex Vesker };
3570605ea5SAlex Vesker 
36b8853c96SAlex Vesker struct mlx5dr_action_dest {
37b8853c96SAlex Vesker 	struct mlx5dr_action *dest;
38b8853c96SAlex Vesker 	struct mlx5dr_action *reformat;
39b8853c96SAlex Vesker };
40b8853c96SAlex Vesker 
4170605ea5SAlex Vesker struct mlx5dr_domain *
4270605ea5SAlex Vesker mlx5dr_domain_create(struct mlx5_core_dev *mdev, enum mlx5dr_domain_type type);
4370605ea5SAlex Vesker 
4470605ea5SAlex Vesker int mlx5dr_domain_destroy(struct mlx5dr_domain *domain);
4570605ea5SAlex Vesker 
4670605ea5SAlex Vesker int mlx5dr_domain_sync(struct mlx5dr_domain *domain, u32 flags);
4770605ea5SAlex Vesker 
4870605ea5SAlex Vesker void mlx5dr_domain_set_peer(struct mlx5dr_domain *dmn,
4970605ea5SAlex Vesker 			    struct mlx5dr_domain *peer_dmn);
5070605ea5SAlex Vesker 
5170605ea5SAlex Vesker struct mlx5dr_table *
52988fd6b3SErez Shitrit mlx5dr_table_create(struct mlx5dr_domain *domain, u32 level, u32 flags);
5370605ea5SAlex Vesker 
5470605ea5SAlex Vesker int mlx5dr_table_destroy(struct mlx5dr_table *table);
5570605ea5SAlex Vesker 
5670605ea5SAlex Vesker u32 mlx5dr_table_get_id(struct mlx5dr_table *table);
5770605ea5SAlex Vesker 
5870605ea5SAlex Vesker struct mlx5dr_matcher *
5970605ea5SAlex Vesker mlx5dr_matcher_create(struct mlx5dr_table *table,
60f6409299SHamdan Igbaria 		      u32 priority,
6170605ea5SAlex Vesker 		      u8 match_criteria_enable,
6270605ea5SAlex Vesker 		      struct mlx5dr_match_parameters *mask);
6370605ea5SAlex Vesker 
6470605ea5SAlex Vesker int mlx5dr_matcher_destroy(struct mlx5dr_matcher *matcher);
6570605ea5SAlex Vesker 
6670605ea5SAlex Vesker struct mlx5dr_rule *
6770605ea5SAlex Vesker mlx5dr_rule_create(struct mlx5dr_matcher *matcher,
6870605ea5SAlex Vesker 		   struct mlx5dr_match_parameters *value,
6970605ea5SAlex Vesker 		   size_t num_actions,
7001723919SHamdan Igbaria 		   struct mlx5dr_action *actions[],
7101723919SHamdan Igbaria 		   u32 flow_source);
7270605ea5SAlex Vesker 
7370605ea5SAlex Vesker int mlx5dr_rule_destroy(struct mlx5dr_rule *rule);
7470605ea5SAlex Vesker 
7570605ea5SAlex Vesker int mlx5dr_table_set_miss_action(struct mlx5dr_table *tbl,
7670605ea5SAlex Vesker 				 struct mlx5dr_action *action);
7770605ea5SAlex Vesker 
7870605ea5SAlex Vesker struct mlx5dr_action *
79de346f40SAlex Vesker mlx5dr_action_create_dest_table_num(struct mlx5dr_domain *dmn, u32 table_num);
80de346f40SAlex Vesker 
81de346f40SAlex Vesker struct mlx5dr_action *
8270605ea5SAlex Vesker mlx5dr_action_create_dest_table(struct mlx5dr_table *table);
8370605ea5SAlex Vesker 
8470605ea5SAlex Vesker struct mlx5dr_action *
85aec292eeSAlex Vesker mlx5dr_action_create_dest_flow_fw_table(struct mlx5dr_domain *domain,
86aec292eeSAlex Vesker 					struct mlx5_flow_table *ft);
8770605ea5SAlex Vesker 
8870605ea5SAlex Vesker struct mlx5dr_action *
8970605ea5SAlex Vesker mlx5dr_action_create_dest_vport(struct mlx5dr_domain *domain,
9070605ea5SAlex Vesker 				u32 vport, u8 vhca_id_valid,
9170605ea5SAlex Vesker 				u16 vhca_id);
9270605ea5SAlex Vesker 
93b8853c96SAlex Vesker struct mlx5dr_action *
94b8853c96SAlex Vesker mlx5dr_action_create_mult_dest_tbl(struct mlx5dr_domain *dmn,
95b8853c96SAlex Vesker 				   struct mlx5dr_action_dest *dests,
96b8853c96SAlex Vesker 				   u32 num_of_dests);
97b8853c96SAlex Vesker 
9870605ea5SAlex Vesker struct mlx5dr_action *mlx5dr_action_create_drop(void);
9970605ea5SAlex Vesker 
10070605ea5SAlex Vesker struct mlx5dr_action *mlx5dr_action_create_tag(u32 tag_value);
10170605ea5SAlex Vesker 
10270605ea5SAlex Vesker struct mlx5dr_action *
10370605ea5SAlex Vesker mlx5dr_action_create_flow_counter(u32 counter_id);
10470605ea5SAlex Vesker 
10570605ea5SAlex Vesker struct mlx5dr_action *
10670605ea5SAlex Vesker mlx5dr_action_create_packet_reformat(struct mlx5dr_domain *dmn,
10770605ea5SAlex Vesker 				     enum mlx5dr_action_reformat_type reformat_type,
10870605ea5SAlex Vesker 				     size_t data_sz,
10970605ea5SAlex Vesker 				     void *data);
11070605ea5SAlex Vesker 
11170605ea5SAlex Vesker struct mlx5dr_action *
11270605ea5SAlex Vesker mlx5dr_action_create_modify_header(struct mlx5dr_domain *domain,
11370605ea5SAlex Vesker 				   u32 flags,
11470605ea5SAlex Vesker 				   size_t actions_sz,
11570605ea5SAlex Vesker 				   __be64 actions[]);
11670605ea5SAlex Vesker 
11770605ea5SAlex Vesker struct mlx5dr_action *mlx5dr_action_create_pop_vlan(void);
11870605ea5SAlex Vesker 
11970605ea5SAlex Vesker struct mlx5dr_action *
12070605ea5SAlex Vesker mlx5dr_action_create_push_vlan(struct mlx5dr_domain *domain, __be32 vlan_hdr);
12170605ea5SAlex Vesker 
12270605ea5SAlex Vesker int mlx5dr_action_destroy(struct mlx5dr_action *action);
12370605ea5SAlex Vesker 
12470605ea5SAlex Vesker static inline bool
12570605ea5SAlex Vesker mlx5dr_is_supported(struct mlx5_core_dev *dev)
12670605ea5SAlex Vesker {
12770605ea5SAlex Vesker 	return MLX5_CAP_ESW_FLOWTABLE_FDB(dev, sw_owner);
12870605ea5SAlex Vesker }
12970605ea5SAlex Vesker 
13070605ea5SAlex Vesker #endif /* _MLX5DR_H_ */
131