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