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