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