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 | ||
b3638e1a MG |
41 | enum { |
42 | MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO = 1 << 16, | |
05564d0a AY |
43 | MLX5_FLOW_CONTEXT_ACTION_ENCRYPT = 1 << 17, |
44 | MLX5_FLOW_CONTEXT_ACTION_DECRYPT = 1 << 18, | |
b3638e1a MG |
45 | }; |
46 | ||
c9f1b073 | 47 | enum { |
60786f09 | 48 | MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT = BIT(0), |
61444b45 | 49 | MLX5_FLOW_TABLE_TUNNEL_EN_DECAP = BIT(1), |
c6d4e45d | 50 | MLX5_FLOW_TABLE_TERMINATION = BIT(2), |
c9f1b073 HHZ |
51 | }; |
52 | ||
038d2ef8 MG |
53 | #define LEFTOVERS_RULE_NUM 2 |
54 | static inline void build_leftovers_ft_param(int *priority, | |
55 | int *n_ent, | |
56 | int *n_grp) | |
57 | { | |
58 | *priority = 0; /* Priority of leftovers_prio-0 */ | |
59 | *n_ent = LEFTOVERS_RULE_NUM; | |
60 | *n_grp = LEFTOVERS_RULE_NUM; | |
61 | } | |
62 | ||
25302363 | 63 | enum mlx5_flow_namespace_type { |
4cbdd30e | 64 | MLX5_FLOW_NAMESPACE_BYPASS, |
3e75d4eb | 65 | MLX5_FLOW_NAMESPACE_LAG, |
acbc2004 | 66 | MLX5_FLOW_NAMESPACE_OFFLOADS, |
6dc6071c | 67 | MLX5_FLOW_NAMESPACE_ETHTOOL, |
25302363 | 68 | MLX5_FLOW_NAMESPACE_KERNEL, |
4cbdd30e | 69 | MLX5_FLOW_NAMESPACE_LEFTOVERS, |
153fefbf | 70 | MLX5_FLOW_NAMESPACE_ANCHOR, |
25302363 | 71 | MLX5_FLOW_NAMESPACE_FDB, |
efdc810b MHY |
72 | MLX5_FLOW_NAMESPACE_ESW_EGRESS, |
73 | MLX5_FLOW_NAMESPACE_ESW_INGRESS, | |
87d22483 MG |
74 | MLX5_FLOW_NAMESPACE_SNIFFER_RX, |
75 | MLX5_FLOW_NAMESPACE_SNIFFER_TX, | |
5f418378 | 76 | MLX5_FLOW_NAMESPACE_EGRESS, |
d83eb50e | 77 | MLX5_FLOW_NAMESPACE_RDMA_RX, |
25302363 MG |
78 | }; |
79 | ||
b6d9ccb1 | 80 | enum { |
d9cb0675 | 81 | FDB_BYPASS_PATH, |
b6d9ccb1 MB |
82 | FDB_FAST_PATH, |
83 | FDB_SLOW_PATH, | |
84 | }; | |
85 | ||
26a81453 | 86 | struct mlx5_flow_table; |
86d722ad | 87 | struct mlx5_flow_group; |
86d722ad | 88 | struct mlx5_flow_namespace; |
74491de9 | 89 | struct mlx5_flow_handle; |
26a81453 | 90 | |
bb0ee7dc JL |
91 | enum { |
92 | FLOW_CONTEXT_HAS_TAG = BIT(0), | |
93 | }; | |
94 | ||
95 | struct mlx5_flow_context { | |
96 | u32 flags; | |
97 | u32 flow_tag; | |
8d212ff0 | 98 | u32 flow_source; |
bb0ee7dc JL |
99 | }; |
100 | ||
c5bb1730 MG |
101 | struct mlx5_flow_spec { |
102 | u8 match_criteria_enable; | |
103 | u32 match_criteria[MLX5_ST_SZ_DW(fte_match_param)]; | |
104 | u32 match_value[MLX5_ST_SZ_DW(fte_match_param)]; | |
bb0ee7dc | 105 | struct mlx5_flow_context flow_context; |
c5bb1730 MG |
106 | }; |
107 | ||
aa39c2c0 EB |
108 | enum { |
109 | MLX5_FLOW_DEST_VPORT_VHCA_ID = BIT(0), | |
a2c6162b | 110 | MLX5_FLOW_DEST_VPORT_REFORMAT_ID = BIT(1), |
aa39c2c0 EB |
111 | }; |
112 | ||
26a81453 MG |
113 | struct mlx5_flow_destination { |
114 | enum mlx5_flow_destination_type type; | |
115 | union { | |
116 | u32 tir_num; | |
664000b6 | 117 | u32 ft_num; |
26a81453 | 118 | struct mlx5_flow_table *ft; |
171c7625 | 119 | u32 counter_id; |
b17f7fc1 SK |
120 | struct { |
121 | u16 num; | |
122 | u16 vhca_id; | |
a2c6162b | 123 | u32 reformat_id; |
aa39c2c0 | 124 | u8 flags; |
b17f7fc1 | 125 | } vport; |
26a81453 MG |
126 | }; |
127 | }; | |
86d722ad | 128 | |
328edb49 PB |
129 | struct mlx5_flow_namespace * |
130 | mlx5_get_fdb_sub_ns(struct mlx5_core_dev *dev, int n); | |
86d722ad MG |
131 | struct mlx5_flow_namespace * |
132 | mlx5_get_flow_namespace(struct mlx5_core_dev *dev, | |
133 | enum mlx5_flow_namespace_type type); | |
9b93ab98 GP |
134 | struct mlx5_flow_namespace * |
135 | mlx5_get_flow_vport_acl_namespace(struct mlx5_core_dev *dev, | |
136 | enum mlx5_flow_namespace_type type, | |
137 | int vport); | |
86d722ad | 138 | |
f0d22d18 MG |
139 | struct mlx5_flow_table * |
140 | mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns, | |
141 | int prio, | |
142 | int num_flow_table_entries, | |
d63cd286 | 143 | int max_num_groups, |
c9f1b073 HHZ |
144 | u32 level, |
145 | u32 flags); | |
f0d22d18 | 146 | |
b3ba5149 ES |
147 | struct mlx5_flow_table_attr { |
148 | int prio; | |
149 | int max_fte; | |
150 | u32 level; | |
151 | u32 flags; | |
b3ba5149 ES |
152 | }; |
153 | ||
86d722ad MG |
154 | struct mlx5_flow_table * |
155 | mlx5_create_flow_table(struct mlx5_flow_namespace *ns, | |
b3ba5149 ES |
156 | struct mlx5_flow_table_attr *ft_attr); |
157 | ||
efdc810b MHY |
158 | struct mlx5_flow_table * |
159 | mlx5_create_vport_flow_table(struct mlx5_flow_namespace *ns, | |
160 | int prio, | |
161 | int num_flow_table_entries, | |
162 | u32 level, u16 vport); | |
aaff1bea AH |
163 | struct mlx5_flow_table *mlx5_create_lag_demux_flow_table( |
164 | struct mlx5_flow_namespace *ns, | |
165 | int prio, u32 level); | |
86d722ad MG |
166 | int mlx5_destroy_flow_table(struct mlx5_flow_table *ft); |
167 | ||
168 | /* inbox should be set with the following values: | |
169 | * start_flow_index | |
170 | * end_flow_index | |
171 | * match_criteria_enable | |
172 | * match_criteria | |
173 | */ | |
174 | struct mlx5_flow_group * | |
175 | mlx5_create_flow_group(struct mlx5_flow_table *ft, u32 *in); | |
176 | void mlx5_destroy_flow_group(struct mlx5_flow_group *fg); | |
177 | ||
0c06897a OG |
178 | struct mlx5_fs_vlan { |
179 | u16 ethtype; | |
180 | u16 vid; | |
181 | u8 prio; | |
182 | }; | |
183 | ||
8da6fe2a JL |
184 | #define MLX5_FS_VLAN_DEPTH 2 |
185 | ||
d5634fee | 186 | enum { |
bb0ee7dc | 187 | FLOW_ACT_NO_APPEND = BIT(0), |
d5634fee PB |
188 | }; |
189 | ||
66958ed9 HHZ |
190 | struct mlx5_flow_act { |
191 | u32 action; | |
60786f09 | 192 | u32 reformat_id; |
2a69cb9f | 193 | u32 modify_id; |
05564d0a | 194 | uintptr_t esp_id; |
d5634fee | 195 | u32 flags; |
8da6fe2a | 196 | struct mlx5_fs_vlan vlan[MLX5_FS_VLAN_DEPTH]; |
3b3233fb | 197 | struct ib_counters *counters; |
66958ed9 HHZ |
198 | }; |
199 | ||
e753b2b5 | 200 | #define MLX5_DECLARE_FLOW_ACT(name) \ |
d5634fee | 201 | struct mlx5_flow_act name = { .action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST,\ |
d5634fee PB |
202 | .reformat_id = 0, \ |
203 | .modify_id = 0, \ | |
204 | .flags = 0, } | |
e753b2b5 | 205 | |
86d722ad MG |
206 | /* Single destination per rule. |
207 | * Group ID is implied by the match criteria. | |
208 | */ | |
74491de9 MB |
209 | struct mlx5_flow_handle * |
210 | mlx5_add_flow_rules(struct mlx5_flow_table *ft, | |
5233794b | 211 | const struct mlx5_flow_spec *spec, |
66958ed9 | 212 | struct mlx5_flow_act *flow_act, |
74491de9 | 213 | struct mlx5_flow_destination *dest, |
cf916ffb | 214 | int num_dest); |
74491de9 MB |
215 | void mlx5_del_flow_rules(struct mlx5_flow_handle *fr); |
216 | ||
217 | int mlx5_modify_rule_destination(struct mlx5_flow_handle *handler, | |
218 | struct mlx5_flow_destination *new_dest, | |
219 | struct mlx5_flow_destination *old_dest); | |
220 | ||
43a335e0 AV |
221 | struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging); |
222 | void mlx5_fc_destroy(struct mlx5_core_dev *dev, struct mlx5_fc *counter); | |
90bb7692 | 223 | u64 mlx5_fc_query_lastuse(struct mlx5_fc *counter); |
43a335e0 AV |
224 | void mlx5_fc_query_cached(struct mlx5_fc *counter, |
225 | u64 *bytes, u64 *packets, u64 *lastuse); | |
5f9bf63a RS |
226 | int mlx5_fc_query(struct mlx5_core_dev *dev, struct mlx5_fc *counter, |
227 | u64 *packets, u64 *bytes); | |
171c7625 | 228 | u32 mlx5_fc_id(struct mlx5_fc *counter); |
5f9bf63a | 229 | |
50854114 YH |
230 | int mlx5_fs_add_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn); |
231 | int mlx5_fs_remove_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn); | |
232 | ||
90c1d1b8 MB |
233 | int mlx5_modify_header_alloc(struct mlx5_core_dev *dev, |
234 | u8 namespace, u8 num_actions, | |
235 | void *modify_actions, u32 *modify_header_id); | |
236 | void mlx5_modify_header_dealloc(struct mlx5_core_dev *dev, | |
237 | u32 modify_header_id); | |
238 | ||
50acec06 MB |
239 | int mlx5_packet_reformat_alloc(struct mlx5_core_dev *dev, |
240 | int reformat_type, | |
241 | size_t size, | |
242 | void *reformat_data, | |
243 | enum mlx5_flow_namespace_type namespace, | |
244 | u32 *packet_reformat_id); | |
245 | void mlx5_packet_reformat_dealloc(struct mlx5_core_dev *dev, | |
246 | u32 packet_reformat_id); | |
247 | ||
26a81453 | 248 | #endif |