xref: /freebsd/sys/dev/mlx5/fs.h (revision b762b199afc6ed56ac95ca19c7fc29c2927fa85c)
15a93b4cdSHans Petter Selasky /*-
25a93b4cdSHans Petter Selasky  * Copyright (c) 2013-2017, Mellanox Technologies, Ltd.  All rights reserved.
35a93b4cdSHans Petter Selasky  *
45a93b4cdSHans Petter Selasky  * Redistribution and use in source and binary forms, with or without
55a93b4cdSHans Petter Selasky  * modification, are permitted provided that the following conditions
65a93b4cdSHans Petter Selasky  * are met:
75a93b4cdSHans Petter Selasky  * 1. Redistributions of source code must retain the above copyright
85a93b4cdSHans Petter Selasky  *    notice, this list of conditions and the following disclaimer.
95a93b4cdSHans Petter Selasky  * 2. Redistributions in binary form must reproduce the above copyright
105a93b4cdSHans Petter Selasky  *    notice, this list of conditions and the following disclaimer in the
115a93b4cdSHans Petter Selasky  *    documentation and/or other materials provided with the distribution.
125a93b4cdSHans Petter Selasky  *
135a93b4cdSHans Petter Selasky  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS `AS IS' AND
145a93b4cdSHans Petter Selasky  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155a93b4cdSHans Petter Selasky  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
165a93b4cdSHans Petter Selasky  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
175a93b4cdSHans Petter Selasky  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
185a93b4cdSHans Petter Selasky  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
195a93b4cdSHans Petter Selasky  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
205a93b4cdSHans Petter Selasky  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
215a93b4cdSHans Petter Selasky  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
225a93b4cdSHans Petter Selasky  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
235a93b4cdSHans Petter Selasky  * SUCH DAMAGE.
245a93b4cdSHans Petter Selasky  */
255a93b4cdSHans Petter Selasky 
265a93b4cdSHans Petter Selasky #ifndef _MLX5_FS_
275a93b4cdSHans Petter Selasky #define _MLX5_FS_
285a93b4cdSHans Petter Selasky 
295a93b4cdSHans Petter Selasky #include <linux/list.h>
3097beac79SKonstantin Belousov #include <linux/bitops.h>
315a93b4cdSHans Petter Selasky 
325a93b4cdSHans Petter Selasky #include <dev/mlx5/mlx5_ifc.h>
335a93b4cdSHans Petter Selasky #include <dev/mlx5/device.h>
345a93b4cdSHans Petter Selasky #include <dev/mlx5/driver.h>
355a93b4cdSHans Petter Selasky 
36*e23731dbSKonstantin Belousov enum mlx5_flow_destination_type {
37*e23731dbSKonstantin Belousov         MLX5_FLOW_DESTINATION_TYPE_NONE,
38*e23731dbSKonstantin Belousov         MLX5_FLOW_DESTINATION_TYPE_VPORT,
39*e23731dbSKonstantin Belousov         MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE,
40*e23731dbSKonstantin Belousov         MLX5_FLOW_DESTINATION_TYPE_TIR,
41*e23731dbSKonstantin Belousov         MLX5_FLOW_DESTINATION_TYPE_FLOW_SAMPLER,
42*e23731dbSKonstantin Belousov         MLX5_FLOW_DESTINATION_TYPE_UPLINK,
43*e23731dbSKonstantin Belousov         MLX5_FLOW_DESTINATION_TYPE_PORT,
44*e23731dbSKonstantin Belousov         MLX5_FLOW_DESTINATION_TYPE_COUNTER,
45*e23731dbSKonstantin Belousov         MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM,
46*e23731dbSKonstantin Belousov         MLX5_FLOW_DESTINATION_TYPE_RANGE,
47*e23731dbSKonstantin Belousov         MLX5_FLOW_DESTINATION_TYPE_TABLE_TYPE,
48*e23731dbSKonstantin Belousov };
49*e23731dbSKonstantin Belousov 
505a93b4cdSHans Petter Selasky enum {
515a93b4cdSHans Petter Selasky         MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO  = 1 << 16,
52*e23731dbSKonstantin Belousov         MLX5_FLOW_CONTEXT_ACTION_ENCRYPT        = 1 << 17,
53*e23731dbSKonstantin Belousov         MLX5_FLOW_CONTEXT_ACTION_DECRYPT        = 1 << 18,
54*e23731dbSKonstantin Belousov         MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_NS    = 1 << 19,
55*e23731dbSKonstantin Belousov };
56*e23731dbSKonstantin Belousov 
57*e23731dbSKonstantin Belousov enum {
58*e23731dbSKonstantin Belousov         MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT = BIT(0),
59*e23731dbSKonstantin Belousov         MLX5_FLOW_TABLE_TUNNEL_EN_DECAP = BIT(1),
60*e23731dbSKonstantin Belousov         MLX5_FLOW_TABLE_TERMINATION = BIT(2),
61*e23731dbSKonstantin Belousov         MLX5_FLOW_TABLE_UNMANAGED = BIT(3),
62*e23731dbSKonstantin Belousov         MLX5_FLOW_TABLE_OTHER_VPORT = BIT(4),
635a93b4cdSHans Petter Selasky };
645a93b4cdSHans Petter Selasky 
655a93b4cdSHans Petter Selasky /*Flow tag*/
665a93b4cdSHans Petter Selasky enum {
675a93b4cdSHans Petter Selasky 	MLX5_FS_DEFAULT_FLOW_TAG  = 0xFFFFFF,
685a93b4cdSHans Petter Selasky 	MLX5_FS_ETH_FLOW_TAG  = 0xFFFFFE,
695a93b4cdSHans Petter Selasky 	MLX5_FS_SNIFFER_FLOW_TAG  = 0xFFFFFD,
705a93b4cdSHans Petter Selasky };
715a93b4cdSHans Petter Selasky 
725a93b4cdSHans Petter Selasky enum {
735a93b4cdSHans Petter Selasky 	MLX5_FS_FLOW_TAG_MASK = 0xFFFFFF,
745a93b4cdSHans Petter Selasky };
755a93b4cdSHans Petter Selasky 
765a93b4cdSHans Petter Selasky #define FS_MAX_TYPES		10
775a93b4cdSHans Petter Selasky #define FS_MAX_ENTRIES		32000U
785a93b4cdSHans Petter Selasky 
7945e2e55dSMark Bloch #define	FS_REFORMAT_KEYWORD "_reformat"
8045e2e55dSMark Bloch 
815a93b4cdSHans Petter Selasky enum mlx5_flow_namespace_type {
825a93b4cdSHans Petter Selasky 	MLX5_FLOW_NAMESPACE_BYPASS,
83*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_KERNEL_RX_MACSEC,
84*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_LAG,
850ee1b09eSHans Petter Selasky 	MLX5_FLOW_NAMESPACE_OFFLOADS,
86*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_ETHTOOL,
875a93b4cdSHans Petter Selasky 	MLX5_FLOW_NAMESPACE_KERNEL,
885a93b4cdSHans Petter Selasky 	MLX5_FLOW_NAMESPACE_LEFTOVERS,
89*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_ANCHOR,
90*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_FDB_BYPASS,
915a93b4cdSHans Petter Selasky 	MLX5_FLOW_NAMESPACE_FDB,
925a93b4cdSHans Petter Selasky 	MLX5_FLOW_NAMESPACE_ESW_EGRESS,
935a93b4cdSHans Petter Selasky 	MLX5_FLOW_NAMESPACE_ESW_INGRESS,
94*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_SNIFFER_RX,
95*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_SNIFFER_TX,
96*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_EGRESS,
97*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_EGRESS_IPSEC,
98*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_EGRESS_MACSEC,
99*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_RDMA_RX,
100*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL,
101*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_RDMA_TX,
102*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_PORT_SEL,
103*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_RDMA_RX_COUNTERS,
104*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_RDMA_TX_COUNTERS,
105*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_RDMA_RX_IPSEC,
106*e23731dbSKonstantin Belousov 	MLX5_FLOW_NAMESPACE_RDMA_TX_IPSEC,
107*e23731dbSKonstantin Belousov };
108*e23731dbSKonstantin Belousov 
109*e23731dbSKonstantin Belousov enum {
110*e23731dbSKonstantin Belousov 	FDB_BYPASS_PATH,
111*e23731dbSKonstantin Belousov 	FDB_TC_OFFLOAD,
112*e23731dbSKonstantin Belousov 	FDB_FT_OFFLOAD,
113*e23731dbSKonstantin Belousov 	FDB_TC_MISS,
114*e23731dbSKonstantin Belousov 	FDB_BR_OFFLOAD,
115*e23731dbSKonstantin Belousov 	FDB_SLOW_PATH,
116*e23731dbSKonstantin Belousov 	FDB_PER_VPORT,
1175a93b4cdSHans Petter Selasky };
1185a93b4cdSHans Petter Selasky 
1195a93b4cdSHans Petter Selasky struct mlx5_flow_table;
1205a93b4cdSHans Petter Selasky struct mlx5_flow_group;
1215a93b4cdSHans Petter Selasky struct mlx5_flow_rule;
1225a93b4cdSHans Petter Selasky struct mlx5_flow_namespace;
123*e23731dbSKonstantin Belousov struct mlx5_flow_handle;
124*e23731dbSKonstantin Belousov 
125*e23731dbSKonstantin Belousov enum {
126*e23731dbSKonstantin Belousov 	FLOW_CONTEXT_HAS_TAG = BIT(0),
127*e23731dbSKonstantin Belousov };
128*e23731dbSKonstantin Belousov 
129*e23731dbSKonstantin Belousov struct mlx5_flow_context {
130*e23731dbSKonstantin Belousov 	u32 flags;
131*e23731dbSKonstantin Belousov 	u32 flow_tag;
132*e23731dbSKonstantin Belousov 	u32 flow_source;
133*e23731dbSKonstantin Belousov };
1345a93b4cdSHans Petter Selasky 
1355a93b4cdSHans Petter Selasky struct mlx5_flow_spec {
1365a93b4cdSHans Petter Selasky 	u8   match_criteria_enable;
1375a93b4cdSHans Petter Selasky 	u32  match_criteria[MLX5_ST_SZ_DW(fte_match_param)];
1385a93b4cdSHans Petter Selasky 	u32  match_value[MLX5_ST_SZ_DW(fte_match_param)];
139*e23731dbSKonstantin Belousov 	struct mlx5_flow_context flow_context;
140*e23731dbSKonstantin Belousov };
141*e23731dbSKonstantin Belousov 
142*e23731dbSKonstantin Belousov enum {
143*e23731dbSKonstantin Belousov 	MLX5_FLOW_DEST_VPORT_VHCA_ID      = BIT(0),
144*e23731dbSKonstantin Belousov 	MLX5_FLOW_DEST_VPORT_REFORMAT_ID  = BIT(1),
145*e23731dbSKonstantin Belousov };
146*e23731dbSKonstantin Belousov 
147*e23731dbSKonstantin Belousov enum mlx5_flow_dest_range_field {
148*e23731dbSKonstantin Belousov 	MLX5_FLOW_DEST_RANGE_FIELD_PKT_LEN = 0,
1495a93b4cdSHans Petter Selasky };
1505a93b4cdSHans Petter Selasky 
1515a93b4cdSHans Petter Selasky struct mlx5_flow_destination {
152*e23731dbSKonstantin Belousov 	enum mlx5_flow_destination_type type;
1535a93b4cdSHans Petter Selasky 	union {
1545a93b4cdSHans Petter Selasky 		u32                     tir_num;
155*e23731dbSKonstantin Belousov 		u32                     ft_num;
1565a93b4cdSHans Petter Selasky 		struct mlx5_flow_table  *ft;
157*e23731dbSKonstantin Belousov 		u32                     counter_id;
158*e23731dbSKonstantin Belousov 		struct {
159*e23731dbSKonstantin Belousov 			u16             num;
160*e23731dbSKonstantin Belousov 			u16             vhca_id;
161*e23731dbSKonstantin Belousov 			struct mlx5_pkt_reformat *pkt_reformat;
162*e23731dbSKonstantin Belousov 			u8              flags;
163*e23731dbSKonstantin Belousov 		} vport;
164*e23731dbSKonstantin Belousov 		struct {
165*e23731dbSKonstantin Belousov 			struct mlx5_flow_table         *hit_ft;
166*e23731dbSKonstantin Belousov 			struct mlx5_flow_table         *miss_ft;
167*e23731dbSKonstantin Belousov 			enum mlx5_flow_dest_range_field field;
168*e23731dbSKonstantin Belousov 			u32                             min;
169*e23731dbSKonstantin Belousov 			u32                             max;
170*e23731dbSKonstantin Belousov 		} range;
171*e23731dbSKonstantin Belousov 		u32                     sampler_id;
1725a93b4cdSHans Petter Selasky 	};
1735a93b4cdSHans Petter Selasky };
1745a93b4cdSHans Petter Selasky 
175*e23731dbSKonstantin Belousov struct mlx5_exe_aso {
176*e23731dbSKonstantin Belousov 	u32 object_id;
177*e23731dbSKonstantin Belousov 	u8 type;
178*e23731dbSKonstantin Belousov 	u8 return_reg_id;
179*e23731dbSKonstantin Belousov 	union {
180*e23731dbSKonstantin Belousov 		u32 ctrl_data;
181*e23731dbSKonstantin Belousov 		struct {
182*e23731dbSKonstantin Belousov 			u8 meter_idx;
183*e23731dbSKonstantin Belousov 			u8 init_color;
184*e23731dbSKonstantin Belousov 		} flow_meter;
185*e23731dbSKonstantin Belousov 	};
186cb054a49SMark Bloch };
187cb054a49SMark Bloch 
188*e23731dbSKonstantin Belousov enum {
189*e23731dbSKonstantin Belousov 	FLOW_ACT_NO_APPEND = BIT(0),
190*e23731dbSKonstantin Belousov 	FLOW_ACT_IGNORE_FLOW_LEVEL = BIT(1),
191*e23731dbSKonstantin Belousov };
192*e23731dbSKonstantin Belousov 
193*e23731dbSKonstantin Belousov struct mlx5_fs_vlan {
194*e23731dbSKonstantin Belousov 	u16 ethtype;
195*e23731dbSKonstantin Belousov 	u16 vid;
196*e23731dbSKonstantin Belousov 	u8  prio;
197*e23731dbSKonstantin Belousov };
198*e23731dbSKonstantin Belousov 
199*e23731dbSKonstantin Belousov #define MLX5_FS_VLAN_DEPTH      2
200*e23731dbSKonstantin Belousov 
201*e23731dbSKonstantin Belousov enum mlx5_flow_act_crypto_type {
202*e23731dbSKonstantin Belousov 	MLX5_FLOW_ACT_CRYPTO_TYPE_IPSEC,
203*e23731dbSKonstantin Belousov };
204*e23731dbSKonstantin Belousov 
205*e23731dbSKonstantin Belousov enum mlx5_flow_act_crypto_op {
206*e23731dbSKonstantin Belousov 	MLX5_FLOW_ACT_CRYPTO_OP_ENCRYPT,
207*e23731dbSKonstantin Belousov 	MLX5_FLOW_ACT_CRYPTO_OP_DECRYPT,
208*e23731dbSKonstantin Belousov };
209*e23731dbSKonstantin Belousov 
210*e23731dbSKonstantin Belousov struct mlx5_flow_act_crypto_params {
211*e23731dbSKonstantin Belousov 	u32 obj_id;
212*e23731dbSKonstantin Belousov 	u8 type; /* see enum mlx5_flow_act_crypto_type */
213*e23731dbSKonstantin Belousov 	u8 op; /* see enum mlx5_flow_act_crypto_op */
2146a6af22bSMark Bloch };
2156a6af22bSMark Bloch 
216cb054a49SMark Bloch struct mlx5_flow_act {
217*e23731dbSKonstantin Belousov 	u32 action;
218847542c6SMark Bloch 	struct mlx5_modify_hdr  *modify_hdr;
21945e2e55dSMark Bloch 	struct mlx5_pkt_reformat *pkt_reformat;
220*e23731dbSKonstantin Belousov 	struct mlx5_flow_act_crypto_params crypto;
221*e23731dbSKonstantin Belousov 	u32 flags;
222*e23731dbSKonstantin Belousov 	struct mlx5_fs_vlan vlan[MLX5_FS_VLAN_DEPTH];
223*e23731dbSKonstantin Belousov 	struct ib_counters *counters;
224*e23731dbSKonstantin Belousov 	struct mlx5_flow_group *fg;
225*e23731dbSKonstantin Belousov 	struct mlx5_exe_aso exe_aso;
226cb054a49SMark Bloch };
227cb054a49SMark Bloch 
2285a93b4cdSHans Petter Selasky #define FT_NAME_STR_SZ 20
2295a93b4cdSHans Petter Selasky #define LEFTOVERS_RULE_NUM 2
build_leftovers_ft_param(char * name,unsigned int * priority,int * n_ent,int * n_grp)2305a93b4cdSHans Petter Selasky static inline void build_leftovers_ft_param(char *name,
2315a93b4cdSHans Petter Selasky 	unsigned int *priority,
2325a93b4cdSHans Petter Selasky 	int *n_ent,
2335a93b4cdSHans Petter Selasky 	int *n_grp)
2345a93b4cdSHans Petter Selasky {
2355a93b4cdSHans Petter Selasky 	snprintf(name, FT_NAME_STR_SZ, "leftovers");
2365a93b4cdSHans Petter Selasky 	*priority = 0; /*Priority of leftovers_prio-0*/
2375a93b4cdSHans Petter Selasky 	*n_ent = LEFTOVERS_RULE_NUM + 1; /*1: star rules*/
2385a93b4cdSHans Petter Selasky 	*n_grp = LEFTOVERS_RULE_NUM;
2395a93b4cdSHans Petter Selasky }
2405a93b4cdSHans Petter Selasky 
outer_header_zero(u32 * match_criteria)2415a93b4cdSHans Petter Selasky static inline bool outer_header_zero(u32 *match_criteria)
2425a93b4cdSHans Petter Selasky {
2435a93b4cdSHans Petter Selasky 	int size = MLX5_ST_SZ_BYTES(fte_match_param);
2445a93b4cdSHans Petter Selasky 	char *outer_headers_c = MLX5_ADDR_OF(fte_match_param, match_criteria,
2455a93b4cdSHans Petter Selasky 					     outer_headers);
2465a93b4cdSHans Petter Selasky 
2475a93b4cdSHans Petter Selasky 	return outer_headers_c[0] == 0 && !memcmp(outer_headers_c,
2485a93b4cdSHans Petter Selasky 						  outer_headers_c + 1,
2495a93b4cdSHans Petter Selasky 						  size - 1);
2505a93b4cdSHans Petter Selasky }
2515a93b4cdSHans Petter Selasky 
2525a93b4cdSHans Petter Selasky struct mlx5_flow_namespace *
253*e23731dbSKonstantin Belousov mlx5_get_flow_vport_acl_namespace(struct mlx5_core_dev *dev,
254*e23731dbSKonstantin Belousov                                   enum mlx5_flow_namespace_type type,
255*e23731dbSKonstantin Belousov                                   int vport);
256*e23731dbSKonstantin Belousov 
257*e23731dbSKonstantin Belousov struct mlx5_flow_table_attr {
258*e23731dbSKonstantin Belousov         int prio;
259*e23731dbSKonstantin Belousov         int max_fte;
260*e23731dbSKonstantin Belousov         u32 level;
261*e23731dbSKonstantin Belousov         u32 flags;
262*e23731dbSKonstantin Belousov         u16 uid;
263*e23731dbSKonstantin Belousov         struct mlx5_flow_table *next_ft;
264*e23731dbSKonstantin Belousov 
265*e23731dbSKonstantin Belousov         struct {
266*e23731dbSKonstantin Belousov                 int max_num_groups;
267*e23731dbSKonstantin Belousov                 int num_reserved_entries;
268*e23731dbSKonstantin Belousov         } autogroup;
269*e23731dbSKonstantin Belousov };
270*e23731dbSKonstantin Belousov 
271*e23731dbSKonstantin Belousov struct mlx5_flow_namespace *
272*e23731dbSKonstantin Belousov mlx5_get_fdb_sub_ns(struct mlx5_core_dev *dev, int n);
273*e23731dbSKonstantin Belousov 
274*e23731dbSKonstantin Belousov struct mlx5_flow_namespace *
2755a93b4cdSHans Petter Selasky mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
2765a93b4cdSHans Petter Selasky 			enum mlx5_flow_namespace_type type);
2775a93b4cdSHans Petter Selasky 
2785a93b4cdSHans Petter Selasky /* The underlying implementation create two more entries for
2795a93b4cdSHans Petter Selasky  * chaining flow tables. the user should be aware that if he pass
2805a93b4cdSHans Petter Selasky  * max_num_ftes as 2^N it will result in doubled size flow table
2815a93b4cdSHans Petter Selasky  */
2825a93b4cdSHans Petter Selasky struct mlx5_flow_table *
2835a93b4cdSHans Petter Selasky mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns,
284*e23731dbSKonstantin Belousov 				    struct mlx5_flow_table_attr *ft_attr);
2855a93b4cdSHans Petter Selasky 
2865a93b4cdSHans Petter Selasky struct mlx5_flow_table *
2875a93b4cdSHans Petter Selasky mlx5_create_vport_flow_table(struct mlx5_flow_namespace *ns,
288*e23731dbSKonstantin Belousov                              struct mlx5_flow_table_attr *ft_attr, u16 vport);
289*e23731dbSKonstantin Belousov 
290*e23731dbSKonstantin Belousov struct mlx5_flow_table *mlx5_create_lag_demux_flow_table(
291*e23731dbSKonstantin Belousov                                                struct mlx5_flow_namespace *ns,
292*e23731dbSKonstantin Belousov                                                int prio, u32 level);
2935a93b4cdSHans Petter Selasky 
2945a93b4cdSHans Petter Selasky struct mlx5_flow_table *
2955a93b4cdSHans Petter Selasky mlx5_create_flow_table(struct mlx5_flow_namespace *ns,
296*e23731dbSKonstantin Belousov                        struct mlx5_flow_table_attr *ft_attr);
2975a93b4cdSHans Petter Selasky int mlx5_destroy_flow_table(struct mlx5_flow_table *ft);
2985a93b4cdSHans Petter Selasky 
2995a93b4cdSHans Petter Selasky /* inbox should be set with the following values:
3005a93b4cdSHans Petter Selasky  * start_flow_index
3015a93b4cdSHans Petter Selasky  * end_flow_index
3025a93b4cdSHans Petter Selasky  * match_criteria_enable
3035a93b4cdSHans Petter Selasky  * match_criteria
3045a93b4cdSHans Petter Selasky  */
3055a93b4cdSHans Petter Selasky struct mlx5_flow_group *
3065a93b4cdSHans Petter Selasky mlx5_create_flow_group(struct mlx5_flow_table *ft, u32 *in);
3075a93b4cdSHans Petter Selasky void mlx5_destroy_flow_group(struct mlx5_flow_group *fg);
3085a93b4cdSHans Petter Selasky 
309*e23731dbSKonstantin Belousov struct mlx5_flow_handle *
310*e23731dbSKonstantin Belousov mlx5_add_flow_rules(struct mlx5_flow_table *ft,
311*e23731dbSKonstantin Belousov                     const struct mlx5_flow_spec *spec,
312cb054a49SMark Bloch                     struct mlx5_flow_act *flow_act,
313*e23731dbSKonstantin Belousov                     struct mlx5_flow_destination *dest,
314*e23731dbSKonstantin Belousov                     int num_dest);
315*e23731dbSKonstantin Belousov void mlx5_del_flow_rules(struct mlx5_flow_handle **pp);
316*e23731dbSKonstantin Belousov 
317*e23731dbSKonstantin Belousov int mlx5_modify_rule_destination(struct mlx5_flow_handle *handler,
318*e23731dbSKonstantin Belousov                                  struct mlx5_flow_destination *new_dest,
319*e23731dbSKonstantin Belousov                                  struct mlx5_flow_destination *old_dest);
3205a93b4cdSHans Petter Selasky 
3215a93b4cdSHans Petter Selasky /*The following API is for sniffer*/
3225a93b4cdSHans Petter Selasky typedef int (*rule_event_fn)(struct mlx5_flow_rule *rule,
3235a93b4cdSHans Petter Selasky 			     bool ctx_changed,
3245a93b4cdSHans Petter Selasky 			     void *client_data,
3255a93b4cdSHans Petter Selasky 			     void *context);
3265a93b4cdSHans Petter Selasky 
3275a93b4cdSHans Petter Selasky struct mlx5_flow_handler;
3285a93b4cdSHans Petter Selasky 
3295a93b4cdSHans Petter Selasky struct flow_client_priv_data;
3305a93b4cdSHans Petter Selasky 
3315a93b4cdSHans Petter Selasky void mlx5e_sniffer_roce_mode_notify(
3325a93b4cdSHans Petter Selasky 	struct mlx5_core_dev *mdev,
3335a93b4cdSHans Petter Selasky 	int action);
3345a93b4cdSHans Petter Selasky 
3355a93b4cdSHans Petter Selasky int mlx5_set_rule_private_data(struct mlx5_flow_rule *rule, struct
3365a93b4cdSHans Petter Selasky 			       mlx5_flow_handler *handler,  void
3375a93b4cdSHans Petter Selasky 			       *client_data);
3385a93b4cdSHans Petter Selasky 
3395a93b4cdSHans Petter Selasky struct mlx5_flow_handler *mlx5_register_rule_notifier(struct mlx5_core_dev *dev,
3405a93b4cdSHans Petter Selasky 						      enum mlx5_flow_namespace_type ns_type,
3415a93b4cdSHans Petter Selasky 						      rule_event_fn add_cb,
3425a93b4cdSHans Petter Selasky 						      rule_event_fn del_cb,
3435a93b4cdSHans Petter Selasky 						      void *context);
3445a93b4cdSHans Petter Selasky 
3455a93b4cdSHans Petter Selasky void mlx5_unregister_rule_notifier(struct mlx5_flow_handler *handler);
3465a93b4cdSHans Petter Selasky 
3475a93b4cdSHans Petter Selasky void mlx5_flow_iterate_existing_rules(struct mlx5_flow_namespace *ns,
3485a93b4cdSHans Petter Selasky 					     rule_event_fn cb,
3495a93b4cdSHans Petter Selasky 					     void *context);
3505a93b4cdSHans Petter Selasky 
3515a93b4cdSHans Petter Selasky void mlx5_get_match_criteria(u32 *match_criteria,
3525a93b4cdSHans Petter Selasky 			     struct mlx5_flow_rule *rule);
3535a93b4cdSHans Petter Selasky 
3545a93b4cdSHans Petter Selasky void mlx5_get_match_value(u32 *match_value,
3555a93b4cdSHans Petter Selasky 			  struct mlx5_flow_rule *rule);
3565a93b4cdSHans Petter Selasky 
3575a93b4cdSHans Petter Selasky u8 mlx5_get_match_criteria_enable(struct mlx5_flow_rule *rule);
3585a93b4cdSHans Petter Selasky 
3595a93b4cdSHans Petter Selasky struct mlx5_flow_rules_list *get_roce_flow_rules(u8 roce_mode);
3605a93b4cdSHans Petter Selasky 
3615a93b4cdSHans Petter Selasky void mlx5_del_flow_rules_list(struct mlx5_flow_rules_list *rules_list);
3625a93b4cdSHans Petter Selasky 
3635a93b4cdSHans Petter Selasky struct mlx5_flow_rules_list {
3645a93b4cdSHans Petter Selasky 	struct list_head head;
3655a93b4cdSHans Petter Selasky };
3665a93b4cdSHans Petter Selasky 
3675a93b4cdSHans Petter Selasky struct mlx5_flow_rule_node {
3685a93b4cdSHans Petter Selasky 	struct	list_head list;
3695a93b4cdSHans Petter Selasky 	u32	match_criteria[MLX5_ST_SZ_DW(fte_match_param)];
3705a93b4cdSHans Petter Selasky 	u32	match_value[MLX5_ST_SZ_DW(fte_match_param)];
3715a93b4cdSHans Petter Selasky 	u8	match_criteria_enable;
3725a93b4cdSHans Petter Selasky };
3735a93b4cdSHans Petter Selasky 
3745a93b4cdSHans Petter Selasky struct mlx5_core_fs_mask {
3755a93b4cdSHans Petter Selasky 	u8	match_criteria_enable;
3765a93b4cdSHans Petter Selasky 	u32	match_criteria[MLX5_ST_SZ_DW(fte_match_param)];
3775a93b4cdSHans Petter Selasky };
3785a93b4cdSHans Petter Selasky 
3795a93b4cdSHans Petter Selasky bool fs_match_exact_val(
3805a93b4cdSHans Petter Selasky 		struct mlx5_core_fs_mask *mask,
3815a93b4cdSHans Petter Selasky 		void *val1,
3825a93b4cdSHans Petter Selasky 		void *val2);
3835a93b4cdSHans Petter Selasky 
3845a93b4cdSHans Petter Selasky bool fs_match_exact_mask(
3855a93b4cdSHans Petter Selasky 		u8 match_criteria_enable1,
3865a93b4cdSHans Petter Selasky 		u8 match_criteria_enable2,
3875a93b4cdSHans Petter Selasky 		void *mask1,
3885a93b4cdSHans Petter Selasky 		void *mask2);
3895a93b4cdSHans Petter Selasky /**********end API for sniffer**********/
390e4f84168SMark Bloch struct mlx5_modify_hdr *mlx5_modify_header_alloc(struct mlx5_core_dev *dev,
391e4f84168SMark Bloch 						 enum mlx5_flow_namespace_type ns_type,
392e4f84168SMark Bloch 						 u8 num_actions,
393e4f84168SMark Bloch 						 void *modify_actions);
394e4f84168SMark Bloch void mlx5_modify_header_dealloc(struct mlx5_core_dev *dev,
395e4f84168SMark Bloch 				struct mlx5_modify_hdr *modify_hdr);
396bb4645b9SMark Bloch 
397bb4645b9SMark Bloch struct mlx5_pkt_reformat_params {
398bb4645b9SMark Bloch         int type;
399bb4645b9SMark Bloch         u8 param_0;
400bb4645b9SMark Bloch         u8 param_1;
401bb4645b9SMark Bloch         size_t size;
402bb4645b9SMark Bloch         void *data;
403bb4645b9SMark Bloch };
404bb4645b9SMark Bloch 
405bb4645b9SMark Bloch struct mlx5_pkt_reformat *mlx5_packet_reformat_alloc(struct mlx5_core_dev *dev,
406bb4645b9SMark Bloch 						     struct mlx5_pkt_reformat_params *params,
407bb4645b9SMark Bloch 						     enum mlx5_flow_namespace_type ns_type);
408bb4645b9SMark Bloch void mlx5_packet_reformat_dealloc(struct mlx5_core_dev *dev,
409bb4645b9SMark Bloch 					  struct mlx5_pkt_reformat *pkt_reformat);
41035bbcf09SRaed Salem /********** Flow counters API **********/
41135bbcf09SRaed Salem struct mlx5_fc;
41235bbcf09SRaed Salem struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging);
41335bbcf09SRaed Salem 
41435bbcf09SRaed Salem /* As mlx5_fc_create() but doesn't queue stats refresh thread. */
41535bbcf09SRaed Salem struct mlx5_fc *mlx5_fc_create_ex(struct mlx5_core_dev *dev, bool aging);
41635bbcf09SRaed Salem 
41735bbcf09SRaed Salem void mlx5_fc_destroy(struct mlx5_core_dev *dev, struct mlx5_fc *counter);
41835bbcf09SRaed Salem u64 mlx5_fc_query_lastuse(struct mlx5_fc *counter);
41935bbcf09SRaed Salem void mlx5_fc_query_cached(struct mlx5_fc *counter,
42035bbcf09SRaed Salem                           u64 *bytes, u64 *packets, u64 *lastuse);
42135bbcf09SRaed Salem int mlx5_fc_query(struct mlx5_core_dev *dev, struct mlx5_fc *counter,
42235bbcf09SRaed Salem                   u64 *packets, u64 *bytes);
42335bbcf09SRaed Salem u32 mlx5_fc_id(struct mlx5_fc *counter);
42435bbcf09SRaed Salem /******* End of Flow counters API ******/
425*e23731dbSKonstantin Belousov 
426*e23731dbSKonstantin Belousov u32 mlx5_flow_table_id(struct mlx5_flow_table *ft);
427*e23731dbSKonstantin Belousov int mlx5_fs_add_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn);
428*e23731dbSKonstantin Belousov int mlx5_fs_remove_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn);
4295a93b4cdSHans Petter Selasky #endif
430