net/ice: fix IP RSS configuration template
[dpdk.git] / drivers / net / ice / ice_hash.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019 Intel Corporation
3  */
4
5 #include <sys/queue.h>
6 #include <stdio.h>
7 #include <errno.h>
8 #include <stdint.h>
9 #include <string.h>
10 #include <unistd.h>
11 #include <stdarg.h>
12
13 #include <rte_debug.h>
14 #include <rte_ether.h>
15 #include <ethdev_driver.h>
16 #include <rte_log.h>
17 #include <rte_malloc.h>
18 #include <rte_eth_ctrl.h>
19 #include <rte_tailq.h>
20 #include <rte_flow_driver.h>
21
22 #include "ice_logs.h"
23 #include "base/ice_type.h"
24 #include "base/ice_flow.h"
25 #include "ice_ethdev.h"
26 #include "ice_generic_flow.h"
27
28 #define ICE_PHINT_NONE                          0
29 #define ICE_PHINT_VLAN                          BIT_ULL(0)
30 #define ICE_PHINT_PPPOE                         BIT_ULL(1)
31 #define ICE_PHINT_GTPU                          BIT_ULL(2)
32 #define ICE_PHINT_GTPU_EH                       BIT_ULL(3)
33 #define ICE_PHINT_GTPU_EH_DWN                   BIT_ULL(4)
34 #define ICE_PHINT_GTPU_EH_UP                    BIT_ULL(5)
35
36 #define ICE_GTPU_EH_DWNLINK     0
37 #define ICE_GTPU_EH_UPLINK      1
38
39 #define ICE_IPV4_PROT           BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)
40 #define ICE_IPV6_PROT           BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)
41
42 #define VALID_RSS_IPV4_L4       (ETH_RSS_NONFRAG_IPV4_UDP       | \
43                                  ETH_RSS_NONFRAG_IPV4_TCP       | \
44                                  ETH_RSS_NONFRAG_IPV4_SCTP)
45
46 #define VALID_RSS_IPV6_L4       (ETH_RSS_NONFRAG_IPV6_UDP       | \
47                                  ETH_RSS_NONFRAG_IPV6_TCP       | \
48                                  ETH_RSS_NONFRAG_IPV6_SCTP)
49
50 #define VALID_RSS_IPV4          (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
51                                  VALID_RSS_IPV4_L4)
52 #define VALID_RSS_IPV6          (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | \
53                                  VALID_RSS_IPV6_L4)
54 #define VALID_RSS_L3            (VALID_RSS_IPV4 | VALID_RSS_IPV6)
55 #define VALID_RSS_L4            (VALID_RSS_IPV4_L4 | VALID_RSS_IPV6_L4)
56
57 #define VALID_RSS_ATTR          (ETH_RSS_L3_SRC_ONLY    | \
58                                  ETH_RSS_L3_DST_ONLY    | \
59                                  ETH_RSS_L4_SRC_ONLY    | \
60                                  ETH_RSS_L4_DST_ONLY    | \
61                                  ETH_RSS_L2_SRC_ONLY    | \
62                                  ETH_RSS_L2_DST_ONLY    | \
63                                  RTE_ETH_RSS_L3_PRE32   | \
64                                  RTE_ETH_RSS_L3_PRE48   | \
65                                  RTE_ETH_RSS_L3_PRE64)
66
67 #define INVALID_RSS_ATTR        (RTE_ETH_RSS_L3_PRE40   | \
68                                  RTE_ETH_RSS_L3_PRE56   | \
69                                  RTE_ETH_RSS_L3_PRE96)
70
71 struct ice_rss_meta {
72         uint8_t hash_function;
73         struct ice_rss_hash_cfg cfg;
74 };
75
76 struct ice_hash_flow_cfg {
77         bool simple_xor;
78         struct ice_rss_cfg rss_cfg;
79 };
80
81 static int
82 ice_hash_init(struct ice_adapter *ad);
83
84 static int
85 ice_hash_create(struct ice_adapter *ad,
86                 struct rte_flow *flow,
87                 void *meta,
88                 struct rte_flow_error *error);
89
90 static int
91 ice_hash_destroy(struct ice_adapter *ad,
92                 struct rte_flow *flow,
93                 struct rte_flow_error *error);
94
95 static void
96 ice_hash_uninit(struct ice_adapter *ad);
97
98 static void
99 ice_hash_free(struct rte_flow *flow);
100
101 static int
102 ice_hash_parse_pattern_action(struct ice_adapter *ad,
103                         struct ice_pattern_match_item *array,
104                         uint32_t array_len,
105                         const struct rte_flow_item pattern[],
106                         const struct rte_flow_action actions[],
107                         uint32_t priority,
108                         void **meta,
109                         struct rte_flow_error *error);
110
111 /* Rss configuration template */
112 struct ice_rss_hash_cfg ipv4_tmplt = {
113         ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV4 |
114         ICE_FLOW_SEG_HDR_IPV_OTHER,
115         ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV4,
116         ICE_RSS_OUTER_HEADERS,
117         0
118 };
119
120 struct ice_rss_hash_cfg ipv4_udp_tmplt = {
121         ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV4 |
122         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
123         ICE_FLOW_HASH_ETH | ICE_HASH_UDP_IPV4 | ICE_IPV4_PROT,
124         ICE_RSS_OUTER_HEADERS,
125         0
126 };
127
128 struct ice_rss_hash_cfg ipv4_tcp_tmplt = {
129         ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV4 |
130         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
131         ICE_FLOW_HASH_ETH | ICE_HASH_TCP_IPV4 | ICE_IPV4_PROT,
132         ICE_RSS_OUTER_HEADERS,
133         0
134 };
135
136 struct ice_rss_hash_cfg ipv4_sctp_tmplt = {
137         ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV4 |
138         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_SCTP,
139         ICE_FLOW_HASH_ETH | ICE_HASH_SCTP_IPV4 | ICE_IPV4_PROT,
140         ICE_RSS_OUTER_HEADERS,
141         0
142 };
143
144 struct ice_rss_hash_cfg ipv6_tmplt = {
145         ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 |
146         ICE_FLOW_SEG_HDR_IPV_OTHER,
147         ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV6,
148         ICE_RSS_OUTER_HEADERS,
149         0
150 };
151
152 struct ice_rss_hash_cfg ipv6_frag_tmplt = {
153         ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 |
154         ICE_FLOW_SEG_HDR_IPV_FRAG,
155         ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_IPV6,
156         ICE_RSS_ANY_HEADERS,
157         0
158 };
159
160 struct ice_rss_hash_cfg ipv6_udp_tmplt = {
161         ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 |
162         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
163         ICE_FLOW_HASH_ETH | ICE_HASH_UDP_IPV6 | ICE_IPV6_PROT,
164         ICE_RSS_OUTER_HEADERS,
165         0
166 };
167
168 struct ice_rss_hash_cfg ipv6_tcp_tmplt = {
169         ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 |
170         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
171         ICE_FLOW_HASH_ETH | ICE_HASH_TCP_IPV6 | ICE_IPV6_PROT,
172         ICE_RSS_OUTER_HEADERS,
173         0
174 };
175
176 struct ice_rss_hash_cfg ipv6_sctp_tmplt = {
177         ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_IPV6 |
178         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_SCTP,
179         ICE_FLOW_HASH_ETH | ICE_HASH_SCTP_IPV6 | ICE_IPV6_PROT,
180         ICE_RSS_OUTER_HEADERS,
181         0
182 };
183
184 struct ice_rss_hash_cfg outer_ipv4_inner_ipv4_tmplt = {
185         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER,
186         ICE_FLOW_HASH_IPV4,
187         ICE_RSS_INNER_HEADERS_W_OUTER_IPV4,
188         0
189 };
190 struct ice_rss_hash_cfg outer_ipv4_inner_ipv4_udp_tmplt = {
191         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
192         ICE_FLOW_SEG_HDR_UDP,
193         ICE_HASH_UDP_IPV4 | ICE_IPV4_PROT,
194         ICE_RSS_INNER_HEADERS_W_OUTER_IPV4,
195         0
196 };
197
198 struct ice_rss_hash_cfg outer_ipv4_inner_ipv4_tcp_tmplt = {
199         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
200         ICE_FLOW_SEG_HDR_TCP,
201         ICE_HASH_TCP_IPV4 | ICE_IPV4_PROT,
202         ICE_RSS_INNER_HEADERS_W_OUTER_IPV4,
203         0
204 };
205
206 struct ice_rss_hash_cfg outer_ipv6_inner_ipv4_tmplt = {
207         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER,
208         ICE_FLOW_HASH_IPV4,
209         ICE_RSS_INNER_HEADERS_W_OUTER_IPV6,
210         0
211 };
212
213 struct ice_rss_hash_cfg outer_ipv6_inner_ipv4_udp_tmplt = {
214         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
215         ICE_FLOW_SEG_HDR_UDP,
216         ICE_HASH_UDP_IPV4 | ICE_IPV4_PROT,
217         ICE_RSS_INNER_HEADERS_W_OUTER_IPV6,
218         0
219 };
220
221 struct ice_rss_hash_cfg outer_ipv6_inner_ipv4_tcp_tmplt = {
222         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
223         ICE_FLOW_SEG_HDR_TCP,
224         ICE_HASH_TCP_IPV4 | ICE_IPV4_PROT,
225         ICE_RSS_INNER_HEADERS_W_OUTER_IPV6,
226         0
227 };
228
229 struct ice_rss_hash_cfg outer_ipv4_inner_ipv6_tmplt = {
230         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER,
231         ICE_FLOW_HASH_IPV6,
232         ICE_RSS_INNER_HEADERS_W_OUTER_IPV4,
233         0
234 };
235
236 struct ice_rss_hash_cfg outer_ipv4_inner_ipv6_udp_tmplt = {
237         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
238         ICE_FLOW_SEG_HDR_UDP,
239         ICE_HASH_UDP_IPV6 | ICE_IPV6_PROT,
240         ICE_RSS_INNER_HEADERS_W_OUTER_IPV4,
241         0
242 };
243
244 struct ice_rss_hash_cfg outer_ipv4_inner_ipv6_tcp_tmplt = {
245         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
246         ICE_FLOW_SEG_HDR_TCP,
247         ICE_HASH_TCP_IPV6 | ICE_IPV6_PROT,
248         ICE_RSS_INNER_HEADERS_W_OUTER_IPV4,
249         0
250 };
251
252 struct ice_rss_hash_cfg outer_ipv6_inner_ipv6_tmplt = {
253         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER,
254         ICE_FLOW_HASH_IPV6,
255         ICE_RSS_INNER_HEADERS_W_OUTER_IPV6,
256         0
257 };
258 struct ice_rss_hash_cfg outer_ipv6_inner_ipv6_udp_tmplt = {
259         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
260         ICE_FLOW_SEG_HDR_UDP,
261         ICE_HASH_UDP_IPV6 | ICE_IPV6_PROT,
262         ICE_RSS_INNER_HEADERS_W_OUTER_IPV6,
263         0
264 };
265
266 struct ice_rss_hash_cfg outer_ipv6_inner_ipv6_tcp_tmplt = {
267         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
268         ICE_FLOW_SEG_HDR_TCP,
269         ICE_HASH_TCP_IPV6 | ICE_IPV6_PROT,
270         ICE_RSS_INNER_HEADERS_W_OUTER_IPV6,
271         0
272 };
273
274 struct ice_rss_hash_cfg eth_ipv4_esp_tmplt = {
275         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
276         ICE_FLOW_SEG_HDR_ESP,
277         ICE_FLOW_HASH_ESP_SPI,
278         ICE_RSS_OUTER_HEADERS,
279         0
280 };
281
282 struct ice_rss_hash_cfg eth_ipv4_udp_esp_tmplt = {
283         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
284         ICE_FLOW_SEG_HDR_NAT_T_ESP,
285         ICE_FLOW_HASH_NAT_T_ESP_SPI,
286         ICE_RSS_OUTER_HEADERS,
287         0
288 };
289
290 struct ice_rss_hash_cfg eth_ipv4_ah_tmplt = {
291         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
292         ICE_FLOW_SEG_HDR_AH,
293         ICE_FLOW_HASH_AH_SPI,
294         ICE_RSS_OUTER_HEADERS,
295         0
296 };
297
298 struct ice_rss_hash_cfg eth_ipv4_l2tpv3_tmplt = {
299         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
300         ICE_FLOW_SEG_HDR_L2TPV3,
301         ICE_FLOW_HASH_L2TPV3_SESS_ID,
302         ICE_RSS_OUTER_HEADERS,
303         0
304 };
305
306 struct ice_rss_hash_cfg eth_ipv4_pfcp_tmplt = {
307         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
308         ICE_FLOW_SEG_HDR_PFCP_SESSION,
309         ICE_FLOW_HASH_PFCP_SEID,
310         ICE_RSS_OUTER_HEADERS,
311         0
312 };
313
314 struct ice_rss_hash_cfg eth_ipv6_esp_tmplt = {
315         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
316         ICE_FLOW_SEG_HDR_ESP,
317         ICE_FLOW_HASH_ESP_SPI,
318         ICE_RSS_OUTER_HEADERS,
319         0
320 };
321
322 struct ice_rss_hash_cfg eth_ipv6_udp_esp_tmplt = {
323         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
324         ICE_FLOW_SEG_HDR_NAT_T_ESP,
325         ICE_FLOW_HASH_NAT_T_ESP_SPI,
326         ICE_RSS_OUTER_HEADERS,
327         0
328 };
329
330 struct ice_rss_hash_cfg eth_ipv6_ah_tmplt = {
331         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
332         ICE_FLOW_SEG_HDR_AH,
333         ICE_FLOW_HASH_AH_SPI,
334         ICE_RSS_OUTER_HEADERS,
335         0
336 };
337
338 struct ice_rss_hash_cfg eth_ipv6_l2tpv3_tmplt = {
339         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
340         ICE_FLOW_SEG_HDR_L2TPV3,
341         ICE_FLOW_HASH_L2TPV3_SESS_ID,
342         ICE_RSS_OUTER_HEADERS,
343         0
344 };
345
346 struct ice_rss_hash_cfg eth_ipv6_pfcp_tmplt = {
347         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
348         ICE_FLOW_SEG_HDR_PFCP_SESSION,
349         ICE_FLOW_HASH_PFCP_SEID,
350         ICE_RSS_OUTER_HEADERS,
351         0
352 };
353
354 struct ice_rss_hash_cfg pppoe_tmplt = {
355         ICE_FLOW_SEG_HDR_ETH,
356         ICE_FLOW_HASH_ETH | ICE_FLOW_HASH_PPPOE_SESS_ID,
357         ICE_RSS_OUTER_HEADERS,
358         0
359 };
360
361 struct ice_rss_hash_cfg empty_tmplt = {
362         ICE_FLOW_SEG_HDR_NONE,
363         0,
364         ICE_RSS_ANY_HEADERS,
365         0
366 };
367
368 /* IPv4 */
369 #define ICE_RSS_TYPE_ETH_IPV4           (ETH_RSS_ETH | ETH_RSS_IPV4 | \
370                                          ETH_RSS_FRAG_IPV4)
371 #define ICE_RSS_TYPE_ETH_IPV4_UDP       (ICE_RSS_TYPE_ETH_IPV4 | \
372                                          ETH_RSS_NONFRAG_IPV4_UDP)
373 #define ICE_RSS_TYPE_ETH_IPV4_TCP       (ICE_RSS_TYPE_ETH_IPV4 | \
374                                          ETH_RSS_NONFRAG_IPV4_TCP)
375 #define ICE_RSS_TYPE_ETH_IPV4_SCTP      (ICE_RSS_TYPE_ETH_IPV4 | \
376                                          ETH_RSS_NONFRAG_IPV4_SCTP)
377 #define ICE_RSS_TYPE_IPV4               ETH_RSS_IPV4
378 #define ICE_RSS_TYPE_IPV4_UDP           (ETH_RSS_IPV4 | \
379                                          ETH_RSS_NONFRAG_IPV4_UDP)
380 #define ICE_RSS_TYPE_IPV4_TCP           (ETH_RSS_IPV4 | \
381                                          ETH_RSS_NONFRAG_IPV4_TCP)
382 #define ICE_RSS_TYPE_IPV4_SCTP          (ETH_RSS_IPV4 | \
383                                          ETH_RSS_NONFRAG_IPV4_SCTP)
384
385 /* IPv6 */
386 #define ICE_RSS_TYPE_ETH_IPV6           (ETH_RSS_ETH | ETH_RSS_IPV6)
387 #define ICE_RSS_TYPE_ETH_IPV6_FRAG      (ETH_RSS_ETH | ETH_RSS_IPV6 | \
388                                          ETH_RSS_FRAG_IPV6)
389 #define ICE_RSS_TYPE_ETH_IPV6_UDP       (ICE_RSS_TYPE_ETH_IPV6 | \
390                                          ETH_RSS_NONFRAG_IPV6_UDP)
391 #define ICE_RSS_TYPE_ETH_IPV6_TCP       (ICE_RSS_TYPE_ETH_IPV6 | \
392                                          ETH_RSS_NONFRAG_IPV6_TCP)
393 #define ICE_RSS_TYPE_ETH_IPV6_SCTP      (ICE_RSS_TYPE_ETH_IPV6 | \
394                                          ETH_RSS_NONFRAG_IPV6_SCTP)
395 #define ICE_RSS_TYPE_IPV6               ETH_RSS_IPV6
396 #define ICE_RSS_TYPE_IPV6_UDP           (ETH_RSS_IPV6 | \
397                                          ETH_RSS_NONFRAG_IPV6_UDP)
398 #define ICE_RSS_TYPE_IPV6_TCP           (ETH_RSS_IPV6 | \
399                                          ETH_RSS_NONFRAG_IPV6_TCP)
400 #define ICE_RSS_TYPE_IPV6_SCTP          (ETH_RSS_IPV6 | \
401                                          ETH_RSS_NONFRAG_IPV6_SCTP)
402
403 /* VLAN IPV4 */
404 #define ICE_RSS_TYPE_VLAN_IPV4          (ICE_RSS_TYPE_IPV4 | \
405                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN | \
406                                          ETH_RSS_FRAG_IPV4)
407 #define ICE_RSS_TYPE_VLAN_IPV4_UDP      (ICE_RSS_TYPE_IPV4_UDP | \
408                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
409 #define ICE_RSS_TYPE_VLAN_IPV4_TCP      (ICE_RSS_TYPE_IPV4_TCP | \
410                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
411 #define ICE_RSS_TYPE_VLAN_IPV4_SCTP     (ICE_RSS_TYPE_IPV4_SCTP | \
412                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
413 /* VLAN IPv6 */
414 #define ICE_RSS_TYPE_VLAN_IPV6          (ICE_RSS_TYPE_IPV6 | \
415                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
416 #define ICE_RSS_TYPE_VLAN_IPV6_FRAG     (ICE_RSS_TYPE_IPV6 | \
417                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN | \
418                                          ETH_RSS_FRAG_IPV6)
419 #define ICE_RSS_TYPE_VLAN_IPV6_UDP      (ICE_RSS_TYPE_IPV6_UDP | \
420                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
421 #define ICE_RSS_TYPE_VLAN_IPV6_TCP      (ICE_RSS_TYPE_IPV6_TCP | \
422                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
423 #define ICE_RSS_TYPE_VLAN_IPV6_SCTP     (ICE_RSS_TYPE_IPV6_SCTP | \
424                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
425
426 /* GTPU IPv4 */
427 #define ICE_RSS_TYPE_GTPU_IPV4          (ICE_RSS_TYPE_IPV4 | \
428                                          ETH_RSS_GTPU)
429 #define ICE_RSS_TYPE_GTPU_IPV4_UDP      (ICE_RSS_TYPE_IPV4_UDP | \
430                                          ETH_RSS_GTPU)
431 #define ICE_RSS_TYPE_GTPU_IPV4_TCP      (ICE_RSS_TYPE_IPV4_TCP | \
432                                          ETH_RSS_GTPU)
433 /* GTPU IPv6 */
434 #define ICE_RSS_TYPE_GTPU_IPV6          (ICE_RSS_TYPE_IPV6 | \
435                                          ETH_RSS_GTPU)
436 #define ICE_RSS_TYPE_GTPU_IPV6_UDP      (ICE_RSS_TYPE_IPV6_UDP | \
437                                          ETH_RSS_GTPU)
438 #define ICE_RSS_TYPE_GTPU_IPV6_TCP      (ICE_RSS_TYPE_IPV6_TCP | \
439                                          ETH_RSS_GTPU)
440
441 /* PPPOE */
442 #define ICE_RSS_TYPE_PPPOE              (ETH_RSS_ETH | ETH_RSS_PPPOE)
443
444 /* PPPOE IPv4 */
445 #define ICE_RSS_TYPE_PPPOE_IPV4         (ICE_RSS_TYPE_IPV4 | \
446                                          ICE_RSS_TYPE_PPPOE)
447 #define ICE_RSS_TYPE_PPPOE_IPV4_UDP     (ICE_RSS_TYPE_IPV4_UDP | \
448                                          ICE_RSS_TYPE_PPPOE)
449 #define ICE_RSS_TYPE_PPPOE_IPV4_TCP     (ICE_RSS_TYPE_IPV4_TCP | \
450                                          ICE_RSS_TYPE_PPPOE)
451
452 /* PPPOE IPv6 */
453 #define ICE_RSS_TYPE_PPPOE_IPV6         (ICE_RSS_TYPE_IPV6 | \
454                                          ICE_RSS_TYPE_PPPOE)
455 #define ICE_RSS_TYPE_PPPOE_IPV6_UDP     (ICE_RSS_TYPE_IPV6_UDP | \
456                                          ICE_RSS_TYPE_PPPOE)
457 #define ICE_RSS_TYPE_PPPOE_IPV6_TCP     (ICE_RSS_TYPE_IPV6_TCP | \
458                                          ICE_RSS_TYPE_PPPOE)
459
460 /* ESP, AH, L2TPV3 and PFCP */
461 #define ICE_RSS_TYPE_IPV4_ESP           (ETH_RSS_ESP | ETH_RSS_IPV4)
462 #define ICE_RSS_TYPE_IPV6_ESP           (ETH_RSS_ESP | ETH_RSS_IPV6)
463 #define ICE_RSS_TYPE_IPV4_AH            (ETH_RSS_AH | ETH_RSS_IPV4)
464 #define ICE_RSS_TYPE_IPV6_AH            (ETH_RSS_AH | ETH_RSS_IPV6)
465 #define ICE_RSS_TYPE_IPV4_L2TPV3        (ETH_RSS_L2TPV3 | ETH_RSS_IPV4)
466 #define ICE_RSS_TYPE_IPV6_L2TPV3        (ETH_RSS_L2TPV3 | ETH_RSS_IPV6)
467 #define ICE_RSS_TYPE_IPV4_PFCP          (ETH_RSS_PFCP | ETH_RSS_IPV4)
468 #define ICE_RSS_TYPE_IPV6_PFCP          (ETH_RSS_PFCP | ETH_RSS_IPV6)
469
470 /**
471  * Supported pattern for hash.
472  * The first member is pattern item type,
473  * the second member is input set mask,
474  * the third member is ice_rss_hash_cfg template.
475  */
476 static struct ice_pattern_match_item ice_hash_pattern_list[] = {
477         /* IPV4 */
478         {pattern_eth_ipv4,                      ICE_RSS_TYPE_ETH_IPV4,          ICE_INSET_NONE, &ipv4_tmplt},
479         {pattern_eth_ipv4_udp,                  ICE_RSS_TYPE_ETH_IPV4_UDP,      ICE_INSET_NONE, &ipv4_udp_tmplt},
480         {pattern_eth_ipv4_tcp,                  ICE_RSS_TYPE_ETH_IPV4_TCP,      ICE_INSET_NONE, &ipv4_tcp_tmplt},
481         {pattern_eth_ipv4_sctp,                 ICE_RSS_TYPE_ETH_IPV4_SCTP,     ICE_INSET_NONE, &ipv4_sctp_tmplt},
482         {pattern_eth_vlan_ipv4,                 ICE_RSS_TYPE_VLAN_IPV4,         ICE_INSET_NONE, &ipv4_tmplt},
483         {pattern_eth_vlan_ipv4_udp,             ICE_RSS_TYPE_VLAN_IPV4_UDP,     ICE_INSET_NONE, &ipv4_udp_tmplt},
484         {pattern_eth_vlan_ipv4_tcp,             ICE_RSS_TYPE_VLAN_IPV4_TCP,     ICE_INSET_NONE, &ipv4_tcp_tmplt},
485         {pattern_eth_vlan_ipv4_sctp,            ICE_RSS_TYPE_VLAN_IPV4_SCTP,    ICE_INSET_NONE, &ipv4_sctp_tmplt},
486         {pattern_eth_ipv4_gtpu_ipv4,            ICE_RSS_TYPE_GTPU_IPV4,         ICE_INSET_NONE, &outer_ipv4_inner_ipv4_tmplt},
487         {pattern_eth_ipv4_gtpu_ipv4_udp,        ICE_RSS_TYPE_GTPU_IPV4_UDP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv4_udp_tmplt},
488         {pattern_eth_ipv4_gtpu_ipv4_tcp,        ICE_RSS_TYPE_GTPU_IPV4_TCP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv4_tcp_tmplt},
489         {pattern_eth_ipv6_gtpu_ipv4,            ICE_RSS_TYPE_GTPU_IPV4,         ICE_INSET_NONE, &outer_ipv6_inner_ipv4_tmplt},
490         {pattern_eth_ipv6_gtpu_ipv4_udp,        ICE_RSS_TYPE_GTPU_IPV4_UDP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv4_udp_tmplt},
491         {pattern_eth_ipv6_gtpu_ipv4_tcp,        ICE_RSS_TYPE_GTPU_IPV4_TCP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv4_tcp_tmplt},
492         {pattern_eth_ipv4_gtpu_eh_ipv4,         ICE_RSS_TYPE_GTPU_IPV4,         ICE_INSET_NONE, &outer_ipv4_inner_ipv4_tmplt},
493         {pattern_eth_ipv4_gtpu_eh_ipv4_udp,     ICE_RSS_TYPE_GTPU_IPV4_UDP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv4_udp_tmplt},
494         {pattern_eth_ipv4_gtpu_eh_ipv4_tcp,     ICE_RSS_TYPE_GTPU_IPV4_TCP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv4_tcp_tmplt},
495         {pattern_eth_ipv6_gtpu_eh_ipv4,         ICE_RSS_TYPE_GTPU_IPV4,         ICE_INSET_NONE, &outer_ipv6_inner_ipv4_tmplt},
496         {pattern_eth_ipv6_gtpu_eh_ipv4_udp,     ICE_RSS_TYPE_GTPU_IPV4_UDP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv4_udp_tmplt},
497         {pattern_eth_ipv6_gtpu_eh_ipv4_tcp,     ICE_RSS_TYPE_GTPU_IPV4_TCP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv4_tcp_tmplt},
498         {pattern_eth_pppoes_ipv4,               ICE_RSS_TYPE_PPPOE_IPV4,        ICE_INSET_NONE, &ipv4_tmplt},
499         {pattern_eth_pppoes_ipv4_udp,           ICE_RSS_TYPE_PPPOE_IPV4_UDP,    ICE_INSET_NONE, &ipv4_udp_tmplt},
500         {pattern_eth_pppoes_ipv4_tcp,           ICE_RSS_TYPE_PPPOE_IPV4_TCP,    ICE_INSET_NONE, &ipv4_tcp_tmplt},
501         {pattern_eth_ipv4_esp,                  ICE_RSS_TYPE_IPV4_ESP,          ICE_INSET_NONE, &eth_ipv4_esp_tmplt},
502         {pattern_eth_ipv4_udp_esp,              ICE_RSS_TYPE_IPV4_ESP,          ICE_INSET_NONE, &eth_ipv4_udp_esp_tmplt},
503         {pattern_eth_ipv4_ah,                   ICE_RSS_TYPE_IPV4_AH,           ICE_INSET_NONE, &eth_ipv4_ah_tmplt},
504         {pattern_eth_ipv4_l2tp,                 ICE_RSS_TYPE_IPV4_L2TPV3,       ICE_INSET_NONE, &eth_ipv4_l2tpv3_tmplt},
505         {pattern_eth_ipv4_pfcp,                 ICE_RSS_TYPE_IPV4_PFCP,         ICE_INSET_NONE, &eth_ipv4_pfcp_tmplt},
506         /* IPV6 */
507         {pattern_eth_ipv6,                      ICE_RSS_TYPE_ETH_IPV6,          ICE_INSET_NONE, &ipv6_tmplt},
508         {pattern_eth_ipv6_frag_ext,             ICE_RSS_TYPE_ETH_IPV6_FRAG,     ICE_INSET_NONE, &ipv6_frag_tmplt},
509         {pattern_eth_ipv6_udp,                  ICE_RSS_TYPE_ETH_IPV6_UDP,      ICE_INSET_NONE, &ipv6_udp_tmplt},
510         {pattern_eth_ipv6_tcp,                  ICE_RSS_TYPE_ETH_IPV6_TCP,      ICE_INSET_NONE, &ipv6_tcp_tmplt},
511         {pattern_eth_ipv6_sctp,                 ICE_RSS_TYPE_ETH_IPV6_SCTP,     ICE_INSET_NONE, &ipv6_sctp_tmplt},
512         {pattern_eth_vlan_ipv6,                 ICE_RSS_TYPE_VLAN_IPV6,         ICE_INSET_NONE, &ipv6_tmplt},
513         {pattern_eth_vlan_ipv6_frag_ext,        ICE_RSS_TYPE_VLAN_IPV6_FRAG,    ICE_INSET_NONE, &ipv6_frag_tmplt},
514         {pattern_eth_vlan_ipv6_udp,             ICE_RSS_TYPE_VLAN_IPV6_UDP,     ICE_INSET_NONE, &ipv6_udp_tmplt},
515         {pattern_eth_vlan_ipv6_tcp,             ICE_RSS_TYPE_VLAN_IPV6_TCP,     ICE_INSET_NONE, &ipv6_tcp_tmplt},
516         {pattern_eth_vlan_ipv6_sctp,            ICE_RSS_TYPE_VLAN_IPV6_SCTP,    ICE_INSET_NONE, &ipv6_sctp_tmplt},
517         {pattern_eth_ipv4_gtpu_ipv6,            ICE_RSS_TYPE_GTPU_IPV6,         ICE_INSET_NONE, &outer_ipv4_inner_ipv6_tmplt},
518         {pattern_eth_ipv4_gtpu_ipv6_udp,        ICE_RSS_TYPE_GTPU_IPV6_UDP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv6_udp_tmplt},
519         {pattern_eth_ipv4_gtpu_ipv6_tcp,        ICE_RSS_TYPE_GTPU_IPV6_TCP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv6_tcp_tmplt},
520         {pattern_eth_ipv6_gtpu_ipv6,            ICE_RSS_TYPE_GTPU_IPV6,         ICE_INSET_NONE, &outer_ipv6_inner_ipv6_tmplt},
521         {pattern_eth_ipv6_gtpu_ipv6_udp,        ICE_RSS_TYPE_GTPU_IPV6_UDP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv6_udp_tmplt},
522         {pattern_eth_ipv6_gtpu_ipv6_tcp,        ICE_RSS_TYPE_GTPU_IPV6_TCP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv6_tcp_tmplt},
523         {pattern_eth_ipv4_gtpu_eh_ipv6,         ICE_RSS_TYPE_GTPU_IPV6,         ICE_INSET_NONE, &outer_ipv4_inner_ipv6_tmplt},
524         {pattern_eth_ipv4_gtpu_eh_ipv6_udp,     ICE_RSS_TYPE_GTPU_IPV6_UDP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv6_udp_tmplt},
525         {pattern_eth_ipv4_gtpu_eh_ipv6_tcp,     ICE_RSS_TYPE_GTPU_IPV6_TCP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv6_tcp_tmplt},
526         {pattern_eth_ipv6_gtpu_eh_ipv6,         ICE_RSS_TYPE_GTPU_IPV6,         ICE_INSET_NONE, &outer_ipv6_inner_ipv6_tmplt},
527         {pattern_eth_ipv6_gtpu_eh_ipv6_udp,     ICE_RSS_TYPE_GTPU_IPV6_UDP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv6_udp_tmplt},
528         {pattern_eth_ipv6_gtpu_eh_ipv6_tcp,     ICE_RSS_TYPE_GTPU_IPV6_TCP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv6_tcp_tmplt},
529         {pattern_eth_pppoes_ipv6,               ICE_RSS_TYPE_PPPOE_IPV6,        ICE_INSET_NONE, &ipv6_tmplt},
530         {pattern_eth_pppoes_ipv6_udp,           ICE_RSS_TYPE_PPPOE_IPV6_UDP,    ICE_INSET_NONE, &ipv6_udp_tmplt},
531         {pattern_eth_pppoes_ipv6_tcp,           ICE_RSS_TYPE_PPPOE_IPV6_TCP,    ICE_INSET_NONE, &ipv6_tcp_tmplt},
532         {pattern_eth_ipv6_esp,                  ICE_RSS_TYPE_IPV6_ESP,          ICE_INSET_NONE, &eth_ipv6_esp_tmplt},
533         {pattern_eth_ipv6_udp_esp,              ICE_RSS_TYPE_IPV6_ESP,          ICE_INSET_NONE, &eth_ipv6_udp_esp_tmplt},
534         {pattern_eth_ipv6_ah,                   ICE_RSS_TYPE_IPV6_AH,           ICE_INSET_NONE, &eth_ipv6_ah_tmplt},
535         {pattern_eth_ipv6_l2tp,                 ICE_RSS_TYPE_IPV6_L2TPV3,       ICE_INSET_NONE, &eth_ipv6_l2tpv3_tmplt},
536         {pattern_eth_ipv6_pfcp,                 ICE_RSS_TYPE_IPV6_PFCP,         ICE_INSET_NONE, &eth_ipv6_pfcp_tmplt},
537         /* PPPOE */
538         {pattern_eth_pppoes,                    ICE_RSS_TYPE_PPPOE,             ICE_INSET_NONE, &pppoe_tmplt},
539         /* EMPTY */
540         {pattern_empty,                         ICE_INSET_NONE,                 ICE_INSET_NONE, &empty_tmplt},
541 };
542
543 static struct ice_flow_engine ice_hash_engine = {
544         .init = ice_hash_init,
545         .create = ice_hash_create,
546         .destroy = ice_hash_destroy,
547         .uninit = ice_hash_uninit,
548         .free = ice_hash_free,
549         .type = ICE_FLOW_ENGINE_HASH,
550 };
551
552 /* Register parser for os package. */
553 static struct ice_flow_parser ice_hash_parser = {
554         .engine = &ice_hash_engine,
555         .array = ice_hash_pattern_list,
556         .array_len = RTE_DIM(ice_hash_pattern_list),
557         .parse_pattern_action = ice_hash_parse_pattern_action,
558         .stage = ICE_FLOW_STAGE_RSS,
559 };
560
561 RTE_INIT(ice_hash_engine_init)
562 {
563         struct ice_flow_engine *engine = &ice_hash_engine;
564         ice_register_flow_engine(engine);
565 }
566
567 static int
568 ice_hash_init(struct ice_adapter *ad)
569 {
570         struct ice_flow_parser *parser = NULL;
571
572         if (ad->hw.dcf_enabled)
573                 return 0;
574
575         parser = &ice_hash_parser;
576
577         return ice_register_parser(parser, ad);
578 }
579
580 static int
581 ice_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,
582                        struct rte_flow_error *error)
583 {
584         const struct rte_flow_item *item = pattern;
585         const struct rte_flow_item_gtp_psc *psc;
586
587         for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
588                 if (item->last) {
589                         rte_flow_error_set(error, EINVAL,
590                                         RTE_FLOW_ERROR_TYPE_ITEM, item,
591                                         "Not support range");
592                         return -rte_errno;
593                 }
594
595                 switch (item->type) {
596                 case RTE_FLOW_ITEM_TYPE_VLAN:
597                         *phint |= ICE_PHINT_VLAN;
598                         break;
599                 case RTE_FLOW_ITEM_TYPE_PPPOES:
600                         *phint |= ICE_PHINT_PPPOE;
601                         break;
602                 case RTE_FLOW_ITEM_TYPE_GTPU:
603                         *phint |= ICE_PHINT_GTPU;
604                         break;
605                 case RTE_FLOW_ITEM_TYPE_GTP_PSC:
606                         *phint |= ICE_PHINT_GTPU_EH;
607                         psc = item->spec;
608                         if (!psc)
609                                 break;
610                         else if (psc->pdu_type == ICE_GTPU_EH_UPLINK)
611                                 *phint |= ICE_PHINT_GTPU_EH_UP;
612                         else if (psc->pdu_type == ICE_GTPU_EH_DWNLINK)
613                                 *phint |= ICE_PHINT_GTPU_EH_DWN;
614                         break;
615                 default:
616                         break;
617                 }
618         }
619
620         return 0;
621 }
622
623 static void
624 ice_refine_hash_cfg_l234(struct ice_rss_hash_cfg *hash_cfg,
625                          uint64_t rss_type)
626 {
627         uint32_t *addl_hdrs = &hash_cfg->addl_hdrs;
628         uint64_t *hash_flds = &hash_cfg->hash_flds;
629
630         if (*addl_hdrs & ICE_FLOW_SEG_HDR_ETH) {
631                 if (!(rss_type & ETH_RSS_ETH))
632                         *hash_flds &= ~ICE_FLOW_HASH_ETH;
633                 if (rss_type & ETH_RSS_L2_SRC_ONLY)
634                         *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_DA));
635                 else if (rss_type & ETH_RSS_L2_DST_ONLY)
636                         *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA));
637                 *addl_hdrs &= ~ICE_FLOW_SEG_HDR_ETH;
638         }
639
640         if (*addl_hdrs & ICE_FLOW_SEG_HDR_VLAN) {
641                 if (rss_type & ETH_RSS_C_VLAN)
642                         *hash_flds |= BIT_ULL(ICE_FLOW_FIELD_IDX_C_VLAN);
643                 else if (rss_type & ETH_RSS_S_VLAN)
644                         *hash_flds |= BIT_ULL(ICE_FLOW_FIELD_IDX_S_VLAN);
645         }
646
647         if (*addl_hdrs & ICE_FLOW_SEG_HDR_PPPOE) {
648                 if (!(rss_type & ETH_RSS_PPPOE))
649                         *hash_flds &= ~ICE_FLOW_HASH_PPPOE_SESS_ID;
650         }
651
652         if (*addl_hdrs & ICE_FLOW_SEG_HDR_IPV4) {
653                 if (rss_type &
654                    (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 |
655                     ETH_RSS_NONFRAG_IPV4_UDP |
656                     ETH_RSS_NONFRAG_IPV4_TCP |
657                     ETH_RSS_NONFRAG_IPV4_SCTP)) {
658                         if (rss_type & ETH_RSS_FRAG_IPV4) {
659                                 *addl_hdrs |= ICE_FLOW_SEG_HDR_IPV_FRAG;
660                                 *addl_hdrs &= ~(ICE_FLOW_SEG_HDR_IPV_OTHER);
661                                 *hash_flds |=
662                                         BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_ID);
663                         }
664                         if (rss_type & ETH_RSS_L3_SRC_ONLY)
665                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA));
666                         else if (rss_type & ETH_RSS_L3_DST_ONLY)
667                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA));
668                         else if (rss_type &
669                                 (ETH_RSS_L4_SRC_ONLY |
670                                 ETH_RSS_L4_DST_ONLY))
671                                 *hash_flds &= ~ICE_FLOW_HASH_IPV4;
672                 } else {
673                         *hash_flds &= ~ICE_FLOW_HASH_IPV4;
674                 }
675         }
676
677         if (*addl_hdrs & ICE_FLOW_SEG_HDR_IPV6) {
678                 if (rss_type &
679                    (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 |
680                     ETH_RSS_NONFRAG_IPV6_UDP |
681                     ETH_RSS_NONFRAG_IPV6_TCP |
682                     ETH_RSS_NONFRAG_IPV6_SCTP)) {
683                         if (rss_type & ETH_RSS_FRAG_IPV6)
684                                 *hash_flds |=
685                                         BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_ID);
686                         if (rss_type & ETH_RSS_L3_SRC_ONLY)
687                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA));
688                         else if (rss_type & ETH_RSS_L3_DST_ONLY)
689                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA));
690                         else if (rss_type &
691                                 (ETH_RSS_L4_SRC_ONLY |
692                                 ETH_RSS_L4_DST_ONLY))
693                                 *hash_flds &= ~ICE_FLOW_HASH_IPV6;
694                 } else {
695                         *hash_flds &= ~ICE_FLOW_HASH_IPV6;
696                 }
697
698                 if (rss_type & RTE_ETH_RSS_L3_PRE32) {
699                         if (rss_type & ETH_RSS_L3_SRC_ONLY) {
700                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA));
701                                 *hash_flds |= (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA));
702                         } else if (rss_type & ETH_RSS_L3_DST_ONLY) {
703                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA));
704                                 *hash_flds |= (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA));
705                         } else {
706                                 *hash_flds &= ~ICE_FLOW_HASH_IPV6;
707                                 *hash_flds |= ICE_FLOW_HASH_IPV6_PRE32;
708                         }
709                 }
710                 if (rss_type & RTE_ETH_RSS_L3_PRE48) {
711                         if (rss_type & ETH_RSS_L3_SRC_ONLY) {
712                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA));
713                                 *hash_flds |= (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA));
714                         } else if (rss_type & ETH_RSS_L3_DST_ONLY) {
715                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA));
716                                 *hash_flds |= (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA));
717                         } else {
718                                 *hash_flds &= ~ICE_FLOW_HASH_IPV6;
719                                 *hash_flds |= ICE_FLOW_HASH_IPV6_PRE48;
720                         }
721                 }
722                 if (rss_type & RTE_ETH_RSS_L3_PRE64) {
723                         if (rss_type & ETH_RSS_L3_SRC_ONLY) {
724                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA));
725                                 *hash_flds |= (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA));
726                         } else if (rss_type & ETH_RSS_L3_DST_ONLY) {
727                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA));
728                                 *hash_flds |= (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA));
729                         } else {
730                                 *hash_flds &= ~ICE_FLOW_HASH_IPV6;
731                                 *hash_flds |= ICE_FLOW_HASH_IPV6_PRE64;
732                         }
733                 }
734         }
735
736         if (*addl_hdrs & ICE_FLOW_SEG_HDR_UDP) {
737                 if (rss_type &
738                    (ETH_RSS_NONFRAG_IPV4_UDP |
739                     ETH_RSS_NONFRAG_IPV6_UDP)) {
740                         if (rss_type & ETH_RSS_L4_SRC_ONLY)
741                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT));
742                         else if (rss_type & ETH_RSS_L4_DST_ONLY)
743                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT));
744                         else if (rss_type &
745                                 (ETH_RSS_L3_SRC_ONLY |
746                                   ETH_RSS_L3_DST_ONLY))
747                                 *hash_flds &= ~ICE_FLOW_HASH_UDP_PORT;
748                 } else {
749                         *hash_flds &= ~ICE_FLOW_HASH_UDP_PORT;
750                 }
751         }
752
753         if (*addl_hdrs & ICE_FLOW_SEG_HDR_TCP) {
754                 if (rss_type &
755                    (ETH_RSS_NONFRAG_IPV4_TCP |
756                     ETH_RSS_NONFRAG_IPV6_TCP)) {
757                         if (rss_type & ETH_RSS_L4_SRC_ONLY)
758                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT));
759                         else if (rss_type & ETH_RSS_L4_DST_ONLY)
760                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT));
761                         else if (rss_type &
762                                 (ETH_RSS_L3_SRC_ONLY |
763                                   ETH_RSS_L3_DST_ONLY))
764                                 *hash_flds &= ~ICE_FLOW_HASH_TCP_PORT;
765                 } else {
766                         *hash_flds &= ~ICE_FLOW_HASH_TCP_PORT;
767                 }
768         }
769
770         if (*addl_hdrs & ICE_FLOW_SEG_HDR_SCTP) {
771                 if (rss_type &
772                    (ETH_RSS_NONFRAG_IPV4_SCTP |
773                     ETH_RSS_NONFRAG_IPV6_SCTP)) {
774                         if (rss_type & ETH_RSS_L4_SRC_ONLY)
775                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT));
776                         else if (rss_type & ETH_RSS_L4_DST_ONLY)
777                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT));
778                         else if (rss_type &
779                                 (ETH_RSS_L3_SRC_ONLY |
780                                   ETH_RSS_L3_DST_ONLY))
781                                 *hash_flds &= ~ICE_FLOW_HASH_SCTP_PORT;
782                 } else {
783                         *hash_flds &= ~ICE_FLOW_HASH_SCTP_PORT;
784                 }
785         }
786
787         if (*addl_hdrs & ICE_FLOW_SEG_HDR_L2TPV3) {
788                 if (!(rss_type & ETH_RSS_L2TPV3))
789                         *hash_flds &= ~ICE_FLOW_HASH_L2TPV3_SESS_ID;
790         }
791
792         if (*addl_hdrs & ICE_FLOW_SEG_HDR_ESP) {
793                 if (!(rss_type & ETH_RSS_ESP))
794                         *hash_flds &= ~ICE_FLOW_HASH_ESP_SPI;
795         }
796
797         if (*addl_hdrs & ICE_FLOW_SEG_HDR_AH) {
798                 if (!(rss_type & ETH_RSS_AH))
799                         *hash_flds &= ~ICE_FLOW_HASH_AH_SPI;
800         }
801
802         if (*addl_hdrs & ICE_FLOW_SEG_HDR_PFCP_SESSION) {
803                 if (!(rss_type & ETH_RSS_PFCP))
804                         *hash_flds &= ~ICE_FLOW_HASH_PFCP_SEID;
805         }
806 }
807
808 static void
809 ice_refine_proto_hdrs_by_pattern(struct ice_rss_hash_cfg *hash_cfg,
810                                  uint64_t phint)
811 {
812         uint32_t *addl_hdrs = &hash_cfg->addl_hdrs;
813         if (phint & ICE_PHINT_VLAN)
814                 *addl_hdrs |= ICE_FLOW_SEG_HDR_VLAN;
815
816         if (phint & ICE_PHINT_PPPOE)
817                 *addl_hdrs |= ICE_FLOW_SEG_HDR_PPPOE;
818
819         if (phint & ICE_PHINT_GTPU_EH_DWN)
820                 *addl_hdrs |= ICE_FLOW_SEG_HDR_GTPU_DWN;
821         else if (phint & ICE_PHINT_GTPU_EH_UP)
822                 *addl_hdrs |= ICE_FLOW_SEG_HDR_GTPU_UP;
823         else if (phint & ICE_PHINT_GTPU_EH)
824                 *addl_hdrs |= ICE_FLOW_SEG_HDR_GTPU_EH;
825         else if (phint & ICE_PHINT_GTPU)
826                 *addl_hdrs |= ICE_FLOW_SEG_HDR_GTPU_IP;
827 }
828
829 static void
830 ice_refine_hash_cfg_gtpu(struct ice_rss_hash_cfg *hash_cfg,
831                          uint64_t rss_type)
832 {
833         uint32_t *addl_hdrs = &hash_cfg->addl_hdrs;
834         uint64_t *hash_flds = &hash_cfg->hash_flds;
835
836         /* update hash field for gtpu eh/gtpu dwn/gtpu up. */
837         if (!(rss_type & ETH_RSS_GTPU))
838                 return;
839
840         if (*addl_hdrs & ICE_FLOW_SEG_HDR_GTPU_DWN)
841                 *hash_flds |= BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID);
842         else if (*addl_hdrs & ICE_FLOW_SEG_HDR_GTPU_UP)
843                 *hash_flds |= BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_UP_TEID);
844         else if (*addl_hdrs & ICE_FLOW_SEG_HDR_GTPU_EH)
845                 *hash_flds |= BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_TEID);
846         else if (*addl_hdrs & ICE_FLOW_SEG_HDR_GTPU_IP)
847                 *hash_flds |= BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID);
848 }
849
850 static void ice_refine_hash_cfg(struct ice_rss_hash_cfg *hash_cfg,
851                                 uint64_t rss_type, uint64_t phint)
852 {
853         ice_refine_proto_hdrs_by_pattern(hash_cfg, phint);
854         ice_refine_hash_cfg_l234(hash_cfg, rss_type);
855         ice_refine_hash_cfg_gtpu(hash_cfg, rss_type);
856 }
857
858 static uint64_t invalid_rss_comb[] = {
859         ETH_RSS_IPV4 | ETH_RSS_NONFRAG_IPV4_UDP,
860         ETH_RSS_IPV4 | ETH_RSS_NONFRAG_IPV4_TCP,
861         ETH_RSS_IPV6 | ETH_RSS_NONFRAG_IPV6_UDP,
862         ETH_RSS_IPV6 | ETH_RSS_NONFRAG_IPV6_TCP,
863         RTE_ETH_RSS_L3_PRE40 |
864         RTE_ETH_RSS_L3_PRE56 |
865         RTE_ETH_RSS_L3_PRE96
866 };
867
868 struct rss_attr_type {
869         uint64_t attr;
870         uint64_t type;
871 };
872
873 static struct rss_attr_type rss_attr_to_valid_type[] = {
874         {ETH_RSS_L2_SRC_ONLY | ETH_RSS_L2_DST_ONLY,     ETH_RSS_ETH},
875         {ETH_RSS_L3_SRC_ONLY | ETH_RSS_L3_DST_ONLY,     VALID_RSS_L3},
876         {ETH_RSS_L4_SRC_ONLY | ETH_RSS_L4_DST_ONLY,     VALID_RSS_L4},
877         /* current ipv6 prefix only supports prefix 64 bits*/
878         {RTE_ETH_RSS_L3_PRE32,                          VALID_RSS_IPV6},
879         {RTE_ETH_RSS_L3_PRE48,                          VALID_RSS_IPV6},
880         {RTE_ETH_RSS_L3_PRE64,                          VALID_RSS_IPV6},
881         {INVALID_RSS_ATTR,                              0}
882 };
883
884 static bool
885 ice_any_invalid_rss_type(enum rte_eth_hash_function rss_func,
886                          uint64_t rss_type, uint64_t allow_rss_type)
887 {
888         uint32_t i;
889
890         /**
891          * Check if l3/l4 SRC/DST_ONLY is set for SYMMETRIC_TOEPLITZ
892          * hash function.
893          */
894         if (rss_func == RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
895                 if (rss_type & (ETH_RSS_L3_SRC_ONLY | ETH_RSS_L3_DST_ONLY |
896                     ETH_RSS_L4_SRC_ONLY | ETH_RSS_L4_DST_ONLY))
897                         return true;
898
899                 if (!(rss_type &
900                    (ETH_RSS_IPV4 | ETH_RSS_IPV6 |
901                     ETH_RSS_FRAG_IPV4 | ETH_RSS_FRAG_IPV6 |
902                     ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP |
903                     ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV6_TCP |
904                     ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_NONFRAG_IPV6_SCTP)))
905                         return true;
906         }
907
908         /* check invalid combination */
909         for (i = 0; i < RTE_DIM(invalid_rss_comb); i++) {
910                 if (__builtin_popcountll(rss_type & invalid_rss_comb[i]) > 1)
911                         return true;
912         }
913
914         /* check invalid RSS attribute */
915         for (i = 0; i < RTE_DIM(rss_attr_to_valid_type); i++) {
916                 struct rss_attr_type *rat = &rss_attr_to_valid_type[i];
917
918                 if (rat->attr & rss_type && !(rat->type & rss_type))
919                         return true;
920         }
921
922         /* check not allowed RSS type */
923         rss_type &= ~VALID_RSS_ATTR;
924
925         return ((rss_type & allow_rss_type) != rss_type);
926 }
927
928 static int
929 ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item,
930                 const struct rte_flow_action actions[],
931                 uint64_t pattern_hint, void **meta,
932                 struct rte_flow_error *error)
933 {
934         struct ice_rss_meta *rss_meta = (struct ice_rss_meta *)*meta;
935         struct ice_rss_hash_cfg *cfg = pattern_match_item->meta;
936         enum rte_flow_action_type action_type;
937         const struct rte_flow_action_rss *rss;
938         const struct rte_flow_action *action;
939         uint64_t rss_type;
940
941         /* Supported action is RSS. */
942         for (action = actions; action->type !=
943                 RTE_FLOW_ACTION_TYPE_END; action++) {
944                 action_type = action->type;
945                 switch (action_type) {
946                 case RTE_FLOW_ACTION_TYPE_RSS:
947                         rss = action->conf;
948                         rss_type = rss->types;
949
950                         /* Check hash function and save it to rss_meta. */
951                         if (pattern_match_item->pattern_list !=
952                             pattern_empty && rss->func ==
953                             RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) {
954                                 return rte_flow_error_set(error, ENOTSUP,
955                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
956                                         "Not supported flow");
957                         } else if (rss->func ==
958                                    RTE_ETH_HASH_FUNCTION_SIMPLE_XOR){
959                                 rss_meta->hash_function =
960                                 RTE_ETH_HASH_FUNCTION_SIMPLE_XOR;
961                                 return 0;
962                         } else if (rss->func ==
963                                    RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
964                                 rss_meta->hash_function =
965                                 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ;
966                                 cfg->symm = true;
967                         }
968
969                         if (rss->level)
970                                 return rte_flow_error_set(error, ENOTSUP,
971                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
972                                         "a nonzero RSS encapsulation level is not supported");
973
974                         if (rss->key_len)
975                                 return rte_flow_error_set(error, ENOTSUP,
976                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
977                                         "a nonzero RSS key_len is not supported");
978
979                         if (rss->queue)
980                                 return rte_flow_error_set(error, ENOTSUP,
981                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
982                                         "a non-NULL RSS queue is not supported");
983
984                         /**
985                          * Check simultaneous use of SRC_ONLY and DST_ONLY
986                          * of the same level.
987                          */
988                         rss_type = rte_eth_rss_hf_refine(rss_type);
989
990                         if (ice_any_invalid_rss_type(rss->func, rss_type,
991                                         pattern_match_item->input_set_mask_o))
992                                 return rte_flow_error_set(error, ENOTSUP,
993                                         RTE_FLOW_ERROR_TYPE_ACTION,
994                                         action, "RSS type not supported");
995
996                         rss_meta->cfg = *cfg;
997                         ice_refine_hash_cfg(&rss_meta->cfg,
998                                             rss_type, pattern_hint);
999                         break;
1000                 case RTE_FLOW_ACTION_TYPE_END:
1001                         break;
1002
1003                 default:
1004                         rte_flow_error_set(error, EINVAL,
1005                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
1006                                         "Invalid action.");
1007                         return -rte_errno;
1008                 }
1009         }
1010
1011         return 0;
1012 }
1013
1014 static int
1015 ice_hash_parse_pattern_action(__rte_unused struct ice_adapter *ad,
1016                         struct ice_pattern_match_item *array,
1017                         uint32_t array_len,
1018                         const struct rte_flow_item pattern[],
1019                         const struct rte_flow_action actions[],
1020                         uint32_t priority __rte_unused,
1021                         void **meta,
1022                         struct rte_flow_error *error)
1023 {
1024         int ret = 0;
1025         struct ice_pattern_match_item *pattern_match_item;
1026         struct ice_rss_meta *rss_meta_ptr;
1027         uint64_t phint = ICE_PHINT_NONE;
1028
1029         rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0);
1030         if (!rss_meta_ptr) {
1031                 rte_flow_error_set(error, EINVAL,
1032                                 RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1033                                 "No memory for rss_meta_ptr");
1034                 return -ENOMEM;
1035         }
1036
1037         /* Check rss supported pattern and find matched pattern. */
1038         pattern_match_item = ice_search_pattern_match_item(ad, pattern, array,
1039                                                            array_len, error);
1040         if (!pattern_match_item) {
1041                 ret = -rte_errno;
1042                 goto error;
1043         }
1044
1045         ret = ice_hash_parse_pattern(pattern, &phint, error);
1046         if (ret)
1047                 goto error;
1048
1049         /* Check rss action. */
1050         ret = ice_hash_parse_action(pattern_match_item, actions, phint,
1051                                     (void **)&rss_meta_ptr, error);
1052
1053 error:
1054         if (!ret && meta)
1055                 *meta = rss_meta_ptr;
1056         else
1057                 rte_free(rss_meta_ptr);
1058         rte_free(pattern_match_item);
1059
1060         return ret;
1061 }
1062
1063 static int
1064 ice_hash_create(struct ice_adapter *ad,
1065                 struct rte_flow *flow,
1066                 void *meta,
1067                 struct rte_flow_error *error)
1068 {
1069         struct ice_pf *pf = &ad->pf;
1070         struct ice_hw *hw = ICE_PF_TO_HW(pf);
1071         struct ice_vsi *vsi = pf->main_vsi;
1072         int ret;
1073         uint32_t reg;
1074         struct ice_hash_flow_cfg *filter_ptr;
1075         struct ice_rss_meta *rss_meta = (struct ice_rss_meta *)meta;
1076         uint8_t hash_function = rss_meta->hash_function;
1077
1078         filter_ptr = rte_zmalloc("ice_rss_filter",
1079                                 sizeof(struct ice_hash_flow_cfg), 0);
1080         if (!filter_ptr) {
1081                 rte_flow_error_set(error, EINVAL,
1082                                 RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1083                                 "No memory for filter_ptr");
1084                 return -ENOMEM;
1085         }
1086
1087         if (hash_function == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) {
1088                 /* Enable registers for simple_xor hash function. */
1089                 reg = ICE_READ_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id));
1090                 reg = (reg & (~VSIQF_HASH_CTL_HASH_SCHEME_M)) |
1091                         (2 << VSIQF_HASH_CTL_HASH_SCHEME_S);
1092                 ICE_WRITE_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id), reg);
1093
1094                 filter_ptr->simple_xor = 1;
1095
1096                 goto out;
1097         } else {
1098                 memcpy(&filter_ptr->rss_cfg.hash, &rss_meta->cfg,
1099                        sizeof(struct ice_rss_hash_cfg));
1100                 ret = ice_add_rss_cfg_wrap(pf, vsi->idx,
1101                                            &filter_ptr->rss_cfg.hash);
1102                 if (ret) {
1103                         rte_flow_error_set(error, EINVAL,
1104                                         RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1105                                         "rss flow create fail");
1106                         goto error;
1107                 }
1108         }
1109
1110 out:
1111         flow->rule = filter_ptr;
1112         rte_free(meta);
1113         return 0;
1114
1115 error:
1116         rte_free(filter_ptr);
1117         rte_free(meta);
1118         return -rte_errno;
1119 }
1120
1121 static int
1122 ice_hash_destroy(struct ice_adapter *ad,
1123                 struct rte_flow *flow,
1124                 struct rte_flow_error *error)
1125 {
1126         struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(ad);
1127         struct ice_hw *hw = ICE_PF_TO_HW(pf);
1128         struct ice_vsi *vsi = pf->main_vsi;
1129         int ret;
1130         uint32_t reg;
1131         struct ice_hash_flow_cfg *filter_ptr;
1132
1133         filter_ptr = (struct ice_hash_flow_cfg *)flow->rule;
1134
1135         if (filter_ptr->simple_xor == 1) {
1136                 /* Return to symmetric_toeplitz state. */
1137                 reg = ICE_READ_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id));
1138                 reg = (reg & (~VSIQF_HASH_CTL_HASH_SCHEME_M)) |
1139                         (1 << VSIQF_HASH_CTL_HASH_SCHEME_S);
1140                 ICE_WRITE_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id), reg);
1141         } else {
1142                 ret = ice_rem_rss_cfg_wrap(pf, vsi->idx,
1143                                            &filter_ptr->rss_cfg.hash);
1144                 /* Fixme: Ignore the error if a rule does not exist.
1145                  * Currently a rule for inputset change or symm turn on/off
1146                  * will overwrite an exist rule, while application still
1147                  * have 2 rte_flow handles.
1148                  **/
1149                 if (ret && ret != ICE_ERR_DOES_NOT_EXIST) {
1150                         rte_flow_error_set(error, EINVAL,
1151                                         RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1152                                         "rss flow destroy fail");
1153                         goto error;
1154                 }
1155         }
1156
1157         rte_free(filter_ptr);
1158         return 0;
1159
1160 error:
1161         rte_free(filter_ptr);
1162         return -rte_errno;
1163 }
1164
1165 static void
1166 ice_hash_uninit(struct ice_adapter *ad)
1167 {
1168         if (ad->hw.dcf_enabled)
1169                 return;
1170
1171         ice_unregister_parser(&ice_hash_parser, ad);
1172 }
1173
1174 static void
1175 ice_hash_free(struct rte_flow *flow)
1176 {
1177         rte_free(flow->rule);
1178 }