Commit | Line | Data |
---|---|---|
26a81453 MG |
1 | /* |
2 | * Copyright (c) 2015, Mellanox Technologies. All rights reserved. | |
3 | * | |
4 | * This software is available to you under a choice of one of two | |
5 | * licenses. You may choose to be licensed under the terms of the GNU | |
6 | * General Public License (GPL) Version 2, available from the file | |
7 | * COPYING in the main directory of this source tree, or the | |
8 | * OpenIB.org BSD license below: | |
9 | * | |
10 | * Redistribution and use in source and binary forms, with or | |
11 | * without modification, are permitted provided that the following | |
12 | * conditions are met: | |
13 | * | |
14 | * - Redistributions of source code must retain the above | |
15 | * copyright notice, this list of conditions and the following | |
16 | * disclaimer. | |
17 | * | |
18 | * - Redistributions in binary form must reproduce the above | |
19 | * copyright notice, this list of conditions and the following | |
20 | * disclaimer in the documentation and/or other materials | |
21 | * provided with the distribution. | |
22 | * | |
23 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
24 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
25 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
26 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS | |
27 | * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | |
28 | * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
29 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
30 | * SOFTWARE. | |
31 | */ | |
32 | ||
33 | #ifndef _MLX5_FS_ | |
34 | #define _MLX5_FS_ | |
35 | ||
86d722ad | 36 | #include <linux/mlx5/driver.h> |
26a81453 MG |
37 | #include <linux/mlx5/mlx5_ifc.h> |
38 | ||
25302363 MG |
39 | #define MLX5_FS_DEFAULT_FLOW_TAG 0x0 |
40 | ||
371cf74e MG |
41 | #define MLX5_SET_CFG(p, f, v) MLX5_SET(create_flow_group_in, p, f, v) |
42 | ||
d639af62 | 43 | enum mlx5_flow_destination_type { |
6510bc0d | 44 | MLX5_FLOW_DESTINATION_TYPE_NONE, |
d639af62 MB |
45 | MLX5_FLOW_DESTINATION_TYPE_VPORT, |
46 | MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE, | |
47 | MLX5_FLOW_DESTINATION_TYPE_TIR, | |
48 | MLX5_FLOW_DESTINATION_TYPE_FLOW_SAMPLER, | |
49 | MLX5_FLOW_DESTINATION_TYPE_UPLINK, | |
50 | MLX5_FLOW_DESTINATION_TYPE_PORT, | |
51 | MLX5_FLOW_DESTINATION_TYPE_COUNTER, | |
52 | MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM, | |
38bf24c3 | 53 | MLX5_FLOW_DESTINATION_TYPE_RANGE, |
4f226b71 | 54 | MLX5_FLOW_DESTINATION_TYPE_TABLE_TYPE, |
d639af62 MB |
55 | }; |
56 | ||
b3638e1a MG |
57 | enum { |
58 | MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO = 1 << 16, | |
05564d0a AY |
59 | MLX5_FLOW_CONTEXT_ACTION_ENCRYPT = 1 << 17, |
60 | MLX5_FLOW_CONTEXT_ACTION_DECRYPT = 1 << 18, | |
9254f8ed | 61 | MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_NS = 1 << 19, |
b3638e1a MG |
62 | }; |
63 | ||
c9f1b073 | 64 | enum { |
60786f09 | 65 | MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT = BIT(0), |
61444b45 | 66 | MLX5_FLOW_TABLE_TUNNEL_EN_DECAP = BIT(1), |
c6d4e45d | 67 | MLX5_FLOW_TABLE_TERMINATION = BIT(2), |
5281a0c9 | 68 | MLX5_FLOW_TABLE_UNMANAGED = BIT(3), |
617b860c | 69 | MLX5_FLOW_TABLE_OTHER_VPORT = BIT(4), |
653b7eb9 | 70 | MLX5_FLOW_TABLE_UPLINK_VPORT = BIT(5), |
c9f1b073 HHZ |
71 | }; |
72 | ||
038d2ef8 MG |
73 | #define LEFTOVERS_RULE_NUM 2 |
74 | static inline void build_leftovers_ft_param(int *priority, | |
75 | int *n_ent, | |
76 | int *n_grp) | |
77 | { | |
78 | *priority = 0; /* Priority of leftovers_prio-0 */ | |
79 | *n_ent = LEFTOVERS_RULE_NUM; | |
80 | *n_grp = LEFTOVERS_RULE_NUM; | |
81 | } | |
82 | ||
25302363 | 83 | enum mlx5_flow_namespace_type { |
4cbdd30e | 84 | MLX5_FLOW_NAMESPACE_BYPASS, |
15d187e2 | 85 | MLX5_FLOW_NAMESPACE_KERNEL_RX_MACSEC, |
3e75d4eb | 86 | MLX5_FLOW_NAMESPACE_LAG, |
acbc2004 | 87 | MLX5_FLOW_NAMESPACE_OFFLOADS, |
6dc6071c | 88 | MLX5_FLOW_NAMESPACE_ETHTOOL, |
25302363 | 89 | MLX5_FLOW_NAMESPACE_KERNEL, |
4cbdd30e | 90 | MLX5_FLOW_NAMESPACE_LEFTOVERS, |
153fefbf | 91 | MLX5_FLOW_NAMESPACE_ANCHOR, |
22c3f2f5 | 92 | MLX5_FLOW_NAMESPACE_FDB_BYPASS, |
25302363 | 93 | MLX5_FLOW_NAMESPACE_FDB, |
efdc810b MHY |
94 | MLX5_FLOW_NAMESPACE_ESW_EGRESS, |
95 | MLX5_FLOW_NAMESPACE_ESW_INGRESS, | |
87d22483 MG |
96 | MLX5_FLOW_NAMESPACE_SNIFFER_RX, |
97 | MLX5_FLOW_NAMESPACE_SNIFFER_TX, | |
5f418378 | 98 | MLX5_FLOW_NAMESPACE_EGRESS, |
ee534d7f LN |
99 | MLX5_FLOW_NAMESPACE_EGRESS_IPSEC, |
100 | MLX5_FLOW_NAMESPACE_EGRESS_MACSEC, | |
d83eb50e | 101 | MLX5_FLOW_NAMESPACE_RDMA_RX, |
e6806e9a | 102 | MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL, |
24670b1a | 103 | MLX5_FLOW_NAMESPACE_RDMA_TX, |
425a563a | 104 | MLX5_FLOW_NAMESPACE_PORT_SEL, |
b8dfed63 AL |
105 | MLX5_FLOW_NAMESPACE_RDMA_RX_COUNTERS, |
106 | MLX5_FLOW_NAMESPACE_RDMA_TX_COUNTERS, | |
f91ddd3a MZ |
107 | MLX5_FLOW_NAMESPACE_RDMA_RX_IPSEC, |
108 | MLX5_FLOW_NAMESPACE_RDMA_TX_IPSEC, | |
afcb21d5 PH |
109 | MLX5_FLOW_NAMESPACE_RDMA_RX_MACSEC, |
110 | MLX5_FLOW_NAMESPACE_RDMA_TX_MACSEC, | |
25302363 MG |
111 | }; |
112 | ||
b6d9ccb1 | 113 | enum { |
d9cb0675 | 114 | FDB_BYPASS_PATH, |
1762f132 | 115 | FDB_CRYPTO_INGRESS, |
975b992f PB |
116 | FDB_TC_OFFLOAD, |
117 | FDB_FT_OFFLOAD, | |
ec3be887 | 118 | FDB_TC_MISS, |
19e9bfa0 | 119 | FDB_BR_OFFLOAD, |
b6d9ccb1 | 120 | FDB_SLOW_PATH, |
c6c2bf5d | 121 | FDB_CRYPTO_EGRESS, |
96e32687 | 122 | FDB_PER_VPORT, |
b6d9ccb1 MB |
123 | }; |
124 | ||
2b688ea5 MG |
125 | struct mlx5_pkt_reformat; |
126 | struct mlx5_modify_hdr; | |
e7e2519e | 127 | struct mlx5_flow_definer; |
26a81453 | 128 | struct mlx5_flow_table; |
86d722ad | 129 | struct mlx5_flow_group; |
86d722ad | 130 | struct mlx5_flow_namespace; |
74491de9 | 131 | struct mlx5_flow_handle; |
26a81453 | 132 | |
bb0ee7dc JL |
133 | enum { |
134 | FLOW_CONTEXT_HAS_TAG = BIT(0), | |
135 | }; | |
136 | ||
137 | struct mlx5_flow_context { | |
138 | u32 flags; | |
139 | u32 flow_tag; | |
8d212ff0 | 140 | u32 flow_source; |
bb0ee7dc JL |
141 | }; |
142 | ||
c5bb1730 MG |
143 | struct mlx5_flow_spec { |
144 | u8 match_criteria_enable; | |
145 | u32 match_criteria[MLX5_ST_SZ_DW(fte_match_param)]; | |
146 | u32 match_value[MLX5_ST_SZ_DW(fte_match_param)]; | |
bb0ee7dc | 147 | struct mlx5_flow_context flow_context; |
c5bb1730 MG |
148 | }; |
149 | ||
aa39c2c0 EB |
150 | enum { |
151 | MLX5_FLOW_DEST_VPORT_VHCA_ID = BIT(0), | |
a2c6162b | 152 | MLX5_FLOW_DEST_VPORT_REFORMAT_ID = BIT(1), |
aa39c2c0 EB |
153 | }; |
154 | ||
38bf24c3 YK |
155 | enum mlx5_flow_dest_range_field { |
156 | MLX5_FLOW_DEST_RANGE_FIELD_PKT_LEN = 0, | |
157 | }; | |
158 | ||
26a81453 MG |
159 | struct mlx5_flow_destination { |
160 | enum mlx5_flow_destination_type type; | |
161 | union { | |
162 | u32 tir_num; | |
664000b6 | 163 | u32 ft_num; |
26a81453 | 164 | struct mlx5_flow_table *ft; |
171c7625 | 165 | u32 counter_id; |
b17f7fc1 SK |
166 | struct { |
167 | u16 num; | |
168 | u16 vhca_id; | |
2b688ea5 | 169 | struct mlx5_pkt_reformat *pkt_reformat; |
aa39c2c0 | 170 | u8 flags; |
b17f7fc1 | 171 | } vport; |
38bf24c3 YK |
172 | struct { |
173 | struct mlx5_flow_table *hit_ft; | |
174 | struct mlx5_flow_table *miss_ft; | |
175 | enum mlx5_flow_dest_range_field field; | |
176 | u32 min; | |
177 | u32 max; | |
178 | } range; | |
38730630 | 179 | u32 sampler_id; |
26a81453 MG |
180 | }; |
181 | }; | |
86d722ad | 182 | |
dd58edc3 | 183 | struct mod_hdr_tbl { |
d2faae25 | 184 | struct mutex lock; /* protects hlist */ |
dd58edc3 VB |
185 | DECLARE_HASHTABLE(hlist, 8); |
186 | }; | |
187 | ||
328edb49 PB |
188 | struct mlx5_flow_namespace * |
189 | mlx5_get_fdb_sub_ns(struct mlx5_core_dev *dev, int n); | |
86d722ad MG |
190 | struct mlx5_flow_namespace * |
191 | mlx5_get_flow_namespace(struct mlx5_core_dev *dev, | |
192 | enum mlx5_flow_namespace_type type); | |
9b93ab98 GP |
193 | struct mlx5_flow_namespace * |
194 | mlx5_get_flow_vport_acl_namespace(struct mlx5_core_dev *dev, | |
195 | enum mlx5_flow_namespace_type type, | |
196 | int vport); | |
86d722ad | 197 | |
b3ba5149 ES |
198 | struct mlx5_flow_table_attr { |
199 | int prio; | |
200 | int max_fte; | |
201 | u32 level; | |
202 | u32 flags; | |
b0bb369e | 203 | u16 uid; |
5281a0c9 | 204 | struct mlx5_flow_table *next_ft; |
61dc7b01 PB |
205 | |
206 | struct { | |
207 | int max_num_groups; | |
79cdb0aa | 208 | int num_reserved_entries; |
61dc7b01 | 209 | } autogroup; |
b3ba5149 ES |
210 | }; |
211 | ||
86d722ad MG |
212 | struct mlx5_flow_table * |
213 | mlx5_create_flow_table(struct mlx5_flow_namespace *ns, | |
b3ba5149 ES |
214 | struct mlx5_flow_table_attr *ft_attr); |
215 | ||
61dc7b01 PB |
216 | struct mlx5_flow_table * |
217 | mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns, | |
218 | struct mlx5_flow_table_attr *ft_attr); | |
219 | ||
efdc810b MHY |
220 | struct mlx5_flow_table * |
221 | mlx5_create_vport_flow_table(struct mlx5_flow_namespace *ns, | |
617b860c | 222 | struct mlx5_flow_table_attr *ft_attr, u16 vport); |
aaff1bea AH |
223 | struct mlx5_flow_table *mlx5_create_lag_demux_flow_table( |
224 | struct mlx5_flow_namespace *ns, | |
225 | int prio, u32 level); | |
86d722ad MG |
226 | int mlx5_destroy_flow_table(struct mlx5_flow_table *ft); |
227 | ||
228 | /* inbox should be set with the following values: | |
229 | * start_flow_index | |
230 | * end_flow_index | |
231 | * match_criteria_enable | |
232 | * match_criteria | |
233 | */ | |
234 | struct mlx5_flow_group * | |
235 | mlx5_create_flow_group(struct mlx5_flow_table *ft, u32 *in); | |
236 | void mlx5_destroy_flow_group(struct mlx5_flow_group *fg); | |
237 | ||
91707779 JL |
238 | struct mlx5_exe_aso { |
239 | u32 object_id; | |
240 | u8 type; | |
241 | u8 return_reg_id; | |
242 | union { | |
243 | u32 ctrl_data; | |
244 | struct { | |
245 | u8 meter_idx; | |
246 | u8 init_color; | |
247 | } flow_meter; | |
248 | }; | |
249 | }; | |
250 | ||
0c06897a OG |
251 | struct mlx5_fs_vlan { |
252 | u16 ethtype; | |
253 | u16 vid; | |
254 | u8 prio; | |
255 | }; | |
256 | ||
8da6fe2a JL |
257 | #define MLX5_FS_VLAN_DEPTH 2 |
258 | ||
d5634fee | 259 | enum { |
bb0ee7dc | 260 | FLOW_ACT_NO_APPEND = BIT(0), |
ff189b43 | 261 | FLOW_ACT_IGNORE_FLOW_LEVEL = BIT(1), |
d5634fee PB |
262 | }; |
263 | ||
66958ed9 HHZ |
264 | struct mlx5_flow_act { |
265 | u32 action; | |
2b688ea5 MG |
266 | struct mlx5_modify_hdr *modify_hdr; |
267 | struct mlx5_pkt_reformat *pkt_reformat; | |
e227ee99 LN |
268 | struct mlx5_flow_act_crypto_params { |
269 | u8 type; | |
270 | u32 obj_id; | |
271 | } crypto; | |
d5634fee | 272 | u32 flags; |
8da6fe2a | 273 | struct mlx5_fs_vlan vlan[MLX5_FS_VLAN_DEPTH]; |
3b3233fb | 274 | struct ib_counters *counters; |
c2c922da | 275 | struct mlx5_flow_group *fg; |
91707779 | 276 | struct mlx5_exe_aso exe_aso; |
66958ed9 HHZ |
277 | }; |
278 | ||
e753b2b5 | 279 | #define MLX5_DECLARE_FLOW_ACT(name) \ |
d5634fee | 280 | struct mlx5_flow_act name = { .action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST,\ |
d5634fee | 281 | .flags = 0, } |
e753b2b5 | 282 | |
86d722ad MG |
283 | /* Single destination per rule. |
284 | * Group ID is implied by the match criteria. | |
285 | */ | |
74491de9 MB |
286 | struct mlx5_flow_handle * |
287 | mlx5_add_flow_rules(struct mlx5_flow_table *ft, | |
5233794b | 288 | const struct mlx5_flow_spec *spec, |
66958ed9 | 289 | struct mlx5_flow_act *flow_act, |
74491de9 | 290 | struct mlx5_flow_destination *dest, |
cf916ffb | 291 | int num_dest); |
74491de9 MB |
292 | void mlx5_del_flow_rules(struct mlx5_flow_handle *fr); |
293 | ||
294 | int mlx5_modify_rule_destination(struct mlx5_flow_handle *handler, | |
295 | struct mlx5_flow_destination *new_dest, | |
296 | struct mlx5_flow_destination *old_dest); | |
297 | ||
43a335e0 | 298 | struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging); |
504e1572 PB |
299 | |
300 | /* As mlx5_fc_create() but doesn't queue stats refresh thread. */ | |
301 | struct mlx5_fc *mlx5_fc_create_ex(struct mlx5_core_dev *dev, bool aging); | |
302 | ||
43a335e0 | 303 | void mlx5_fc_destroy(struct mlx5_core_dev *dev, struct mlx5_fc *counter); |
90bb7692 | 304 | u64 mlx5_fc_query_lastuse(struct mlx5_fc *counter); |
43a335e0 AV |
305 | void mlx5_fc_query_cached(struct mlx5_fc *counter, |
306 | u64 *bytes, u64 *packets, u64 *lastuse); | |
2b68d659 OS |
307 | void mlx5_fc_query_cached_raw(struct mlx5_fc *counter, |
308 | u64 *bytes, u64 *packets, u64 *lastuse); | |
5f9bf63a RS |
309 | int mlx5_fc_query(struct mlx5_core_dev *dev, struct mlx5_fc *counter, |
310 | u64 *packets, u64 *bytes); | |
171c7625 | 311 | u32 mlx5_fc_id(struct mlx5_fc *counter); |
5f9bf63a | 312 | |
50854114 YH |
313 | int mlx5_fs_add_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn); |
314 | int mlx5_fs_remove_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn); | |
315 | ||
2b688ea5 MG |
316 | struct mlx5_modify_hdr *mlx5_modify_header_alloc(struct mlx5_core_dev *dev, |
317 | u8 ns_type, u8 num_actions, | |
318 | void *modify_actions); | |
90c1d1b8 | 319 | void mlx5_modify_header_dealloc(struct mlx5_core_dev *dev, |
2b688ea5 | 320 | struct mlx5_modify_hdr *modify_hdr); |
e7e2519e MG |
321 | struct mlx5_flow_definer * |
322 | mlx5_create_match_definer(struct mlx5_core_dev *dev, | |
323 | enum mlx5_flow_namespace_type ns_type, u16 format_id, | |
324 | u32 *match_mask); | |
325 | void mlx5_destroy_match_definer(struct mlx5_core_dev *dev, | |
326 | struct mlx5_flow_definer *definer); | |
327 | int mlx5_get_match_definer_id(struct mlx5_flow_definer *definer); | |
2b688ea5 | 328 | |
3f3f05ab YK |
329 | struct mlx5_pkt_reformat_params { |
330 | int type; | |
331 | u8 param_0; | |
332 | u8 param_1; | |
333 | size_t size; | |
334 | void *data; | |
335 | }; | |
336 | ||
2b688ea5 | 337 | struct mlx5_pkt_reformat *mlx5_packet_reformat_alloc(struct mlx5_core_dev *dev, |
3f3f05ab | 338 | struct mlx5_pkt_reformat_params *params, |
2b688ea5 | 339 | enum mlx5_flow_namespace_type ns_type); |
50acec06 | 340 | void mlx5_packet_reformat_dealloc(struct mlx5_core_dev *dev, |
2b688ea5 | 341 | struct mlx5_pkt_reformat *reformat); |
50acec06 | 342 | |
6c27c56c | 343 | u32 mlx5_flow_table_id(struct mlx5_flow_table *ft); |
26a81453 | 344 | #endif |