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