ethdev: use extension header for GTP PSC item
[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_OUTER_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 struct ice_rss_hash_cfg eth_tmplt = {
369         ICE_FLOW_SEG_HDR_ETH | ICE_FLOW_SEG_HDR_ETH_NON_IP,
370         ICE_FLOW_HASH_ETH,
371         ICE_RSS_OUTER_HEADERS,
372         0
373 };
374
375 /* IPv4 */
376 #define ICE_RSS_TYPE_ETH_IPV4           (ETH_RSS_ETH | ETH_RSS_IPV4 | \
377                                          ETH_RSS_FRAG_IPV4)
378 #define ICE_RSS_TYPE_ETH_IPV4_UDP       (ICE_RSS_TYPE_ETH_IPV4 | \
379                                          ETH_RSS_NONFRAG_IPV4_UDP)
380 #define ICE_RSS_TYPE_ETH_IPV4_TCP       (ICE_RSS_TYPE_ETH_IPV4 | \
381                                          ETH_RSS_NONFRAG_IPV4_TCP)
382 #define ICE_RSS_TYPE_ETH_IPV4_SCTP      (ICE_RSS_TYPE_ETH_IPV4 | \
383                                          ETH_RSS_NONFRAG_IPV4_SCTP)
384 #define ICE_RSS_TYPE_IPV4               ETH_RSS_IPV4
385 #define ICE_RSS_TYPE_IPV4_UDP           (ETH_RSS_IPV4 | \
386                                          ETH_RSS_NONFRAG_IPV4_UDP)
387 #define ICE_RSS_TYPE_IPV4_TCP           (ETH_RSS_IPV4 | \
388                                          ETH_RSS_NONFRAG_IPV4_TCP)
389 #define ICE_RSS_TYPE_IPV4_SCTP          (ETH_RSS_IPV4 | \
390                                          ETH_RSS_NONFRAG_IPV4_SCTP)
391
392 /* IPv6 */
393 #define ICE_RSS_TYPE_ETH_IPV6           (ETH_RSS_ETH | ETH_RSS_IPV6)
394 #define ICE_RSS_TYPE_ETH_IPV6_FRAG      (ETH_RSS_ETH | ETH_RSS_IPV6 | \
395                                          ETH_RSS_FRAG_IPV6)
396 #define ICE_RSS_TYPE_ETH_IPV6_UDP       (ICE_RSS_TYPE_ETH_IPV6 | \
397                                          ETH_RSS_NONFRAG_IPV6_UDP)
398 #define ICE_RSS_TYPE_ETH_IPV6_TCP       (ICE_RSS_TYPE_ETH_IPV6 | \
399                                          ETH_RSS_NONFRAG_IPV6_TCP)
400 #define ICE_RSS_TYPE_ETH_IPV6_SCTP      (ICE_RSS_TYPE_ETH_IPV6 | \
401                                          ETH_RSS_NONFRAG_IPV6_SCTP)
402 #define ICE_RSS_TYPE_IPV6               ETH_RSS_IPV6
403 #define ICE_RSS_TYPE_IPV6_UDP           (ETH_RSS_IPV6 | \
404                                          ETH_RSS_NONFRAG_IPV6_UDP)
405 #define ICE_RSS_TYPE_IPV6_TCP           (ETH_RSS_IPV6 | \
406                                          ETH_RSS_NONFRAG_IPV6_TCP)
407 #define ICE_RSS_TYPE_IPV6_SCTP          (ETH_RSS_IPV6 | \
408                                          ETH_RSS_NONFRAG_IPV6_SCTP)
409
410 /* VLAN IPV4 */
411 #define ICE_RSS_TYPE_VLAN_IPV4          (ICE_RSS_TYPE_IPV4 | \
412                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN | \
413                                          ETH_RSS_FRAG_IPV4)
414 #define ICE_RSS_TYPE_VLAN_IPV4_UDP      (ICE_RSS_TYPE_IPV4_UDP | \
415                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
416 #define ICE_RSS_TYPE_VLAN_IPV4_TCP      (ICE_RSS_TYPE_IPV4_TCP | \
417                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
418 #define ICE_RSS_TYPE_VLAN_IPV4_SCTP     (ICE_RSS_TYPE_IPV4_SCTP | \
419                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
420 /* VLAN IPv6 */
421 #define ICE_RSS_TYPE_VLAN_IPV6          (ICE_RSS_TYPE_IPV6 | \
422                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
423 #define ICE_RSS_TYPE_VLAN_IPV6_FRAG     (ICE_RSS_TYPE_IPV6 | \
424                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN | \
425                                          ETH_RSS_FRAG_IPV6)
426 #define ICE_RSS_TYPE_VLAN_IPV6_UDP      (ICE_RSS_TYPE_IPV6_UDP | \
427                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
428 #define ICE_RSS_TYPE_VLAN_IPV6_TCP      (ICE_RSS_TYPE_IPV6_TCP | \
429                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
430 #define ICE_RSS_TYPE_VLAN_IPV6_SCTP     (ICE_RSS_TYPE_IPV6_SCTP | \
431                                          ETH_RSS_S_VLAN | ETH_RSS_C_VLAN)
432
433 /* GTPU IPv4 */
434 #define ICE_RSS_TYPE_GTPU_IPV4          (ICE_RSS_TYPE_IPV4 | \
435                                          ETH_RSS_GTPU)
436 #define ICE_RSS_TYPE_GTPU_IPV4_UDP      (ICE_RSS_TYPE_IPV4_UDP | \
437                                          ETH_RSS_GTPU)
438 #define ICE_RSS_TYPE_GTPU_IPV4_TCP      (ICE_RSS_TYPE_IPV4_TCP | \
439                                          ETH_RSS_GTPU)
440 /* GTPU IPv6 */
441 #define ICE_RSS_TYPE_GTPU_IPV6          (ICE_RSS_TYPE_IPV6 | \
442                                          ETH_RSS_GTPU)
443 #define ICE_RSS_TYPE_GTPU_IPV6_UDP      (ICE_RSS_TYPE_IPV6_UDP | \
444                                          ETH_RSS_GTPU)
445 #define ICE_RSS_TYPE_GTPU_IPV6_TCP      (ICE_RSS_TYPE_IPV6_TCP | \
446                                          ETH_RSS_GTPU)
447
448 /* PPPOE */
449 #define ICE_RSS_TYPE_PPPOE              (ETH_RSS_ETH | ETH_RSS_PPPOE)
450
451 /* PPPOE IPv4 */
452 #define ICE_RSS_TYPE_PPPOE_IPV4         (ICE_RSS_TYPE_IPV4 | \
453                                          ICE_RSS_TYPE_PPPOE)
454 #define ICE_RSS_TYPE_PPPOE_IPV4_UDP     (ICE_RSS_TYPE_IPV4_UDP | \
455                                          ICE_RSS_TYPE_PPPOE)
456 #define ICE_RSS_TYPE_PPPOE_IPV4_TCP     (ICE_RSS_TYPE_IPV4_TCP | \
457                                          ICE_RSS_TYPE_PPPOE)
458
459 /* PPPOE IPv6 */
460 #define ICE_RSS_TYPE_PPPOE_IPV6         (ICE_RSS_TYPE_IPV6 | \
461                                          ICE_RSS_TYPE_PPPOE)
462 #define ICE_RSS_TYPE_PPPOE_IPV6_UDP     (ICE_RSS_TYPE_IPV6_UDP | \
463                                          ICE_RSS_TYPE_PPPOE)
464 #define ICE_RSS_TYPE_PPPOE_IPV6_TCP     (ICE_RSS_TYPE_IPV6_TCP | \
465                                          ICE_RSS_TYPE_PPPOE)
466
467 /* ESP, AH, L2TPV3 and PFCP */
468 #define ICE_RSS_TYPE_IPV4_ESP           (ETH_RSS_ESP | ETH_RSS_IPV4)
469 #define ICE_RSS_TYPE_IPV6_ESP           (ETH_RSS_ESP | ETH_RSS_IPV6)
470 #define ICE_RSS_TYPE_IPV4_AH            (ETH_RSS_AH | ETH_RSS_IPV4)
471 #define ICE_RSS_TYPE_IPV6_AH            (ETH_RSS_AH | ETH_RSS_IPV6)
472 #define ICE_RSS_TYPE_IPV4_L2TPV3        (ETH_RSS_L2TPV3 | ETH_RSS_IPV4)
473 #define ICE_RSS_TYPE_IPV6_L2TPV3        (ETH_RSS_L2TPV3 | ETH_RSS_IPV6)
474 #define ICE_RSS_TYPE_IPV4_PFCP          (ETH_RSS_PFCP | ETH_RSS_IPV4)
475 #define ICE_RSS_TYPE_IPV6_PFCP          (ETH_RSS_PFCP | ETH_RSS_IPV6)
476
477 /* MAC */
478 #define ICE_RSS_TYPE_ETH                ETH_RSS_ETH
479
480 /**
481  * Supported pattern for hash.
482  * The first member is pattern item type,
483  * the second member is input set mask,
484  * the third member is ice_rss_hash_cfg template.
485  */
486 static struct ice_pattern_match_item ice_hash_pattern_list[] = {
487         /* IPV4 */
488         {pattern_eth_ipv4,                      ICE_RSS_TYPE_ETH_IPV4,          ICE_INSET_NONE, &ipv4_tmplt},
489         {pattern_eth_ipv4_udp,                  ICE_RSS_TYPE_ETH_IPV4_UDP,      ICE_INSET_NONE, &ipv4_udp_tmplt},
490         {pattern_eth_ipv4_tcp,                  ICE_RSS_TYPE_ETH_IPV4_TCP,      ICE_INSET_NONE, &ipv4_tcp_tmplt},
491         {pattern_eth_ipv4_sctp,                 ICE_RSS_TYPE_ETH_IPV4_SCTP,     ICE_INSET_NONE, &ipv4_sctp_tmplt},
492         {pattern_eth_vlan_ipv4,                 ICE_RSS_TYPE_VLAN_IPV4,         ICE_INSET_NONE, &ipv4_tmplt},
493         {pattern_eth_vlan_ipv4_udp,             ICE_RSS_TYPE_VLAN_IPV4_UDP,     ICE_INSET_NONE, &ipv4_udp_tmplt},
494         {pattern_eth_vlan_ipv4_tcp,             ICE_RSS_TYPE_VLAN_IPV4_TCP,     ICE_INSET_NONE, &ipv4_tcp_tmplt},
495         {pattern_eth_vlan_ipv4_sctp,            ICE_RSS_TYPE_VLAN_IPV4_SCTP,    ICE_INSET_NONE, &ipv4_sctp_tmplt},
496         {pattern_eth_ipv4_gtpu_ipv4,            ICE_RSS_TYPE_GTPU_IPV4,         ICE_INSET_NONE, &outer_ipv4_inner_ipv4_tmplt},
497         {pattern_eth_ipv4_gtpu_ipv4_udp,        ICE_RSS_TYPE_GTPU_IPV4_UDP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv4_udp_tmplt},
498         {pattern_eth_ipv4_gtpu_ipv4_tcp,        ICE_RSS_TYPE_GTPU_IPV4_TCP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv4_tcp_tmplt},
499         {pattern_eth_ipv6_gtpu_ipv4,            ICE_RSS_TYPE_GTPU_IPV4,         ICE_INSET_NONE, &outer_ipv6_inner_ipv4_tmplt},
500         {pattern_eth_ipv6_gtpu_ipv4_udp,        ICE_RSS_TYPE_GTPU_IPV4_UDP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv4_udp_tmplt},
501         {pattern_eth_ipv6_gtpu_ipv4_tcp,        ICE_RSS_TYPE_GTPU_IPV4_TCP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv4_tcp_tmplt},
502         {pattern_eth_ipv4_gtpu_eh_ipv4,         ICE_RSS_TYPE_GTPU_IPV4,         ICE_INSET_NONE, &outer_ipv4_inner_ipv4_tmplt},
503         {pattern_eth_ipv4_gtpu_eh_ipv4_udp,     ICE_RSS_TYPE_GTPU_IPV4_UDP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv4_udp_tmplt},
504         {pattern_eth_ipv4_gtpu_eh_ipv4_tcp,     ICE_RSS_TYPE_GTPU_IPV4_TCP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv4_tcp_tmplt},
505         {pattern_eth_ipv6_gtpu_eh_ipv4,         ICE_RSS_TYPE_GTPU_IPV4,         ICE_INSET_NONE, &outer_ipv6_inner_ipv4_tmplt},
506         {pattern_eth_ipv6_gtpu_eh_ipv4_udp,     ICE_RSS_TYPE_GTPU_IPV4_UDP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv4_udp_tmplt},
507         {pattern_eth_ipv6_gtpu_eh_ipv4_tcp,     ICE_RSS_TYPE_GTPU_IPV4_TCP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv4_tcp_tmplt},
508         {pattern_eth_pppoes_ipv4,               ICE_RSS_TYPE_PPPOE_IPV4,        ICE_INSET_NONE, &ipv4_tmplt},
509         {pattern_eth_pppoes_ipv4_udp,           ICE_RSS_TYPE_PPPOE_IPV4_UDP,    ICE_INSET_NONE, &ipv4_udp_tmplt},
510         {pattern_eth_pppoes_ipv4_tcp,           ICE_RSS_TYPE_PPPOE_IPV4_TCP,    ICE_INSET_NONE, &ipv4_tcp_tmplt},
511         {pattern_eth_ipv4_esp,                  ICE_RSS_TYPE_IPV4_ESP,          ICE_INSET_NONE, &eth_ipv4_esp_tmplt},
512         {pattern_eth_ipv4_udp_esp,              ICE_RSS_TYPE_IPV4_ESP,          ICE_INSET_NONE, &eth_ipv4_udp_esp_tmplt},
513         {pattern_eth_ipv4_ah,                   ICE_RSS_TYPE_IPV4_AH,           ICE_INSET_NONE, &eth_ipv4_ah_tmplt},
514         {pattern_eth_ipv4_l2tp,                 ICE_RSS_TYPE_IPV4_L2TPV3,       ICE_INSET_NONE, &eth_ipv4_l2tpv3_tmplt},
515         {pattern_eth_ipv4_pfcp,                 ICE_RSS_TYPE_IPV4_PFCP,         ICE_INSET_NONE, &eth_ipv4_pfcp_tmplt},
516         /* IPV6 */
517         {pattern_eth_ipv6,                      ICE_RSS_TYPE_ETH_IPV6,          ICE_INSET_NONE, &ipv6_tmplt},
518         {pattern_eth_ipv6_frag_ext,             ICE_RSS_TYPE_ETH_IPV6_FRAG,     ICE_INSET_NONE, &ipv6_frag_tmplt},
519         {pattern_eth_ipv6_udp,                  ICE_RSS_TYPE_ETH_IPV6_UDP,      ICE_INSET_NONE, &ipv6_udp_tmplt},
520         {pattern_eth_ipv6_tcp,                  ICE_RSS_TYPE_ETH_IPV6_TCP,      ICE_INSET_NONE, &ipv6_tcp_tmplt},
521         {pattern_eth_ipv6_sctp,                 ICE_RSS_TYPE_ETH_IPV6_SCTP,     ICE_INSET_NONE, &ipv6_sctp_tmplt},
522         {pattern_eth_vlan_ipv6,                 ICE_RSS_TYPE_VLAN_IPV6,         ICE_INSET_NONE, &ipv6_tmplt},
523         {pattern_eth_vlan_ipv6_frag_ext,        ICE_RSS_TYPE_VLAN_IPV6_FRAG,    ICE_INSET_NONE, &ipv6_frag_tmplt},
524         {pattern_eth_vlan_ipv6_udp,             ICE_RSS_TYPE_VLAN_IPV6_UDP,     ICE_INSET_NONE, &ipv6_udp_tmplt},
525         {pattern_eth_vlan_ipv6_tcp,             ICE_RSS_TYPE_VLAN_IPV6_TCP,     ICE_INSET_NONE, &ipv6_tcp_tmplt},
526         {pattern_eth_vlan_ipv6_sctp,            ICE_RSS_TYPE_VLAN_IPV6_SCTP,    ICE_INSET_NONE, &ipv6_sctp_tmplt},
527         {pattern_eth_ipv4_gtpu_ipv6,            ICE_RSS_TYPE_GTPU_IPV6,         ICE_INSET_NONE, &outer_ipv4_inner_ipv6_tmplt},
528         {pattern_eth_ipv4_gtpu_ipv6_udp,        ICE_RSS_TYPE_GTPU_IPV6_UDP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv6_udp_tmplt},
529         {pattern_eth_ipv4_gtpu_ipv6_tcp,        ICE_RSS_TYPE_GTPU_IPV6_TCP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv6_tcp_tmplt},
530         {pattern_eth_ipv6_gtpu_ipv6,            ICE_RSS_TYPE_GTPU_IPV6,         ICE_INSET_NONE, &outer_ipv6_inner_ipv6_tmplt},
531         {pattern_eth_ipv6_gtpu_ipv6_udp,        ICE_RSS_TYPE_GTPU_IPV6_UDP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv6_udp_tmplt},
532         {pattern_eth_ipv6_gtpu_ipv6_tcp,        ICE_RSS_TYPE_GTPU_IPV6_TCP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv6_tcp_tmplt},
533         {pattern_eth_ipv4_gtpu_eh_ipv6,         ICE_RSS_TYPE_GTPU_IPV6,         ICE_INSET_NONE, &outer_ipv4_inner_ipv6_tmplt},
534         {pattern_eth_ipv4_gtpu_eh_ipv6_udp,     ICE_RSS_TYPE_GTPU_IPV6_UDP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv6_udp_tmplt},
535         {pattern_eth_ipv4_gtpu_eh_ipv6_tcp,     ICE_RSS_TYPE_GTPU_IPV6_TCP,     ICE_INSET_NONE, &outer_ipv4_inner_ipv6_tcp_tmplt},
536         {pattern_eth_ipv6_gtpu_eh_ipv6,         ICE_RSS_TYPE_GTPU_IPV6,         ICE_INSET_NONE, &outer_ipv6_inner_ipv6_tmplt},
537         {pattern_eth_ipv6_gtpu_eh_ipv6_udp,     ICE_RSS_TYPE_GTPU_IPV6_UDP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv6_udp_tmplt},
538         {pattern_eth_ipv6_gtpu_eh_ipv6_tcp,     ICE_RSS_TYPE_GTPU_IPV6_TCP,     ICE_INSET_NONE, &outer_ipv6_inner_ipv6_tcp_tmplt},
539         {pattern_eth_pppoes_ipv6,               ICE_RSS_TYPE_PPPOE_IPV6,        ICE_INSET_NONE, &ipv6_tmplt},
540         {pattern_eth_pppoes_ipv6_udp,           ICE_RSS_TYPE_PPPOE_IPV6_UDP,    ICE_INSET_NONE, &ipv6_udp_tmplt},
541         {pattern_eth_pppoes_ipv6_tcp,           ICE_RSS_TYPE_PPPOE_IPV6_TCP,    ICE_INSET_NONE, &ipv6_tcp_tmplt},
542         {pattern_eth_ipv6_esp,                  ICE_RSS_TYPE_IPV6_ESP,          ICE_INSET_NONE, &eth_ipv6_esp_tmplt},
543         {pattern_eth_ipv6_udp_esp,              ICE_RSS_TYPE_IPV6_ESP,          ICE_INSET_NONE, &eth_ipv6_udp_esp_tmplt},
544         {pattern_eth_ipv6_ah,                   ICE_RSS_TYPE_IPV6_AH,           ICE_INSET_NONE, &eth_ipv6_ah_tmplt},
545         {pattern_eth_ipv6_l2tp,                 ICE_RSS_TYPE_IPV6_L2TPV3,       ICE_INSET_NONE, &eth_ipv6_l2tpv3_tmplt},
546         {pattern_eth_ipv6_pfcp,                 ICE_RSS_TYPE_IPV6_PFCP,         ICE_INSET_NONE, &eth_ipv6_pfcp_tmplt},
547         /* PPPOE */
548         {pattern_eth_pppoes,                    ICE_RSS_TYPE_PPPOE,             ICE_INSET_NONE, &pppoe_tmplt},
549         /* MAC */
550         {pattern_ethertype,                     ICE_RSS_TYPE_ETH,               ICE_INSET_NONE, &eth_tmplt},
551         /* EMPTY */
552         {pattern_empty,                         ICE_INSET_NONE,                 ICE_INSET_NONE, &empty_tmplt},
553 };
554
555 static struct ice_flow_engine ice_hash_engine = {
556         .init = ice_hash_init,
557         .create = ice_hash_create,
558         .destroy = ice_hash_destroy,
559         .uninit = ice_hash_uninit,
560         .free = ice_hash_free,
561         .type = ICE_FLOW_ENGINE_HASH,
562 };
563
564 /* Register parser for os package. */
565 static struct ice_flow_parser ice_hash_parser = {
566         .engine = &ice_hash_engine,
567         .array = ice_hash_pattern_list,
568         .array_len = RTE_DIM(ice_hash_pattern_list),
569         .parse_pattern_action = ice_hash_parse_pattern_action,
570         .stage = ICE_FLOW_STAGE_RSS,
571 };
572
573 RTE_INIT(ice_hash_engine_init)
574 {
575         struct ice_flow_engine *engine = &ice_hash_engine;
576         ice_register_flow_engine(engine);
577 }
578
579 static int
580 ice_hash_init(struct ice_adapter *ad)
581 {
582         struct ice_flow_parser *parser = NULL;
583
584         if (ad->hw.dcf_enabled)
585                 return 0;
586
587         parser = &ice_hash_parser;
588
589         return ice_register_parser(parser, ad);
590 }
591
592 static int
593 ice_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,
594                        struct rte_flow_error *error)
595 {
596         const struct rte_flow_item *item = pattern;
597         const struct rte_flow_item_gtp_psc *psc;
598
599         for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
600                 if (item->last) {
601                         rte_flow_error_set(error, EINVAL,
602                                         RTE_FLOW_ERROR_TYPE_ITEM, item,
603                                         "Not support range");
604                         return -rte_errno;
605                 }
606
607                 switch (item->type) {
608                 case RTE_FLOW_ITEM_TYPE_VLAN:
609                         *phint |= ICE_PHINT_VLAN;
610                         break;
611                 case RTE_FLOW_ITEM_TYPE_PPPOES:
612                         *phint |= ICE_PHINT_PPPOE;
613                         break;
614                 case RTE_FLOW_ITEM_TYPE_GTPU:
615                         *phint |= ICE_PHINT_GTPU;
616                         break;
617                 case RTE_FLOW_ITEM_TYPE_GTP_PSC:
618                         *phint |= ICE_PHINT_GTPU_EH;
619                         psc = item->spec;
620                         if (!psc)
621                                 break;
622                         else if (psc->hdr.type == ICE_GTPU_EH_UPLINK)
623                                 *phint |= ICE_PHINT_GTPU_EH_UP;
624                         else if (psc->hdr.type == ICE_GTPU_EH_DWNLINK)
625                                 *phint |= ICE_PHINT_GTPU_EH_DWN;
626                         break;
627                 default:
628                         break;
629                 }
630         }
631
632         return 0;
633 }
634
635 static void
636 ice_refine_hash_cfg_l234(struct ice_rss_hash_cfg *hash_cfg,
637                          uint64_t rss_type)
638 {
639         uint32_t *addl_hdrs = &hash_cfg->addl_hdrs;
640         uint64_t *hash_flds = &hash_cfg->hash_flds;
641
642         if (*addl_hdrs & ICE_FLOW_SEG_HDR_ETH) {
643                 if (!(rss_type & ETH_RSS_ETH))
644                         *hash_flds &= ~ICE_FLOW_HASH_ETH;
645                 if (rss_type & ETH_RSS_L2_SRC_ONLY)
646                         *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_DA));
647                 else if (rss_type & ETH_RSS_L2_DST_ONLY)
648                         *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA));
649                 *addl_hdrs &= ~ICE_FLOW_SEG_HDR_ETH;
650         }
651
652         if (*addl_hdrs & ICE_FLOW_SEG_HDR_ETH_NON_IP) {
653                 if (rss_type & ETH_RSS_ETH)
654                         *hash_flds |= BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_TYPE);
655         }
656
657         if (*addl_hdrs & ICE_FLOW_SEG_HDR_VLAN) {
658                 if (rss_type & ETH_RSS_C_VLAN)
659                         *hash_flds |= BIT_ULL(ICE_FLOW_FIELD_IDX_C_VLAN);
660                 else if (rss_type & ETH_RSS_S_VLAN)
661                         *hash_flds |= BIT_ULL(ICE_FLOW_FIELD_IDX_S_VLAN);
662         }
663
664         if (*addl_hdrs & ICE_FLOW_SEG_HDR_PPPOE) {
665                 if (!(rss_type & ETH_RSS_PPPOE))
666                         *hash_flds &= ~ICE_FLOW_HASH_PPPOE_SESS_ID;
667         }
668
669         if (*addl_hdrs & ICE_FLOW_SEG_HDR_IPV4) {
670                 if (rss_type &
671                    (ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 |
672                     ETH_RSS_NONFRAG_IPV4_UDP |
673                     ETH_RSS_NONFRAG_IPV4_TCP |
674                     ETH_RSS_NONFRAG_IPV4_SCTP)) {
675                         if (rss_type & ETH_RSS_FRAG_IPV4) {
676                                 *addl_hdrs |= ICE_FLOW_SEG_HDR_IPV_FRAG;
677                                 *addl_hdrs &= ~(ICE_FLOW_SEG_HDR_IPV_OTHER);
678                                 *hash_flds |=
679                                         BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_ID);
680                         }
681                         if (rss_type & ETH_RSS_L3_SRC_ONLY)
682                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA));
683                         else if (rss_type & ETH_RSS_L3_DST_ONLY)
684                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA));
685                         else if (rss_type &
686                                 (ETH_RSS_L4_SRC_ONLY |
687                                 ETH_RSS_L4_DST_ONLY))
688                                 *hash_flds &= ~ICE_FLOW_HASH_IPV4;
689                 } else {
690                         *hash_flds &= ~ICE_FLOW_HASH_IPV4;
691                 }
692         }
693
694         if (*addl_hdrs & ICE_FLOW_SEG_HDR_IPV6) {
695                 if (rss_type &
696                    (ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 |
697                     ETH_RSS_NONFRAG_IPV6_UDP |
698                     ETH_RSS_NONFRAG_IPV6_TCP |
699                     ETH_RSS_NONFRAG_IPV6_SCTP)) {
700                         if (rss_type & ETH_RSS_FRAG_IPV6)
701                                 *hash_flds |=
702                                         BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_ID);
703                         if (rss_type & ETH_RSS_L3_SRC_ONLY)
704                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA));
705                         else if (rss_type & ETH_RSS_L3_DST_ONLY)
706                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA));
707                         else if (rss_type &
708                                 (ETH_RSS_L4_SRC_ONLY |
709                                 ETH_RSS_L4_DST_ONLY))
710                                 *hash_flds &= ~ICE_FLOW_HASH_IPV6;
711                 } else {
712                         *hash_flds &= ~ICE_FLOW_HASH_IPV6;
713                 }
714
715                 if (rss_type & RTE_ETH_RSS_L3_PRE32) {
716                         if (rss_type & ETH_RSS_L3_SRC_ONLY) {
717                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA));
718                                 *hash_flds |= (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA));
719                         } else if (rss_type & ETH_RSS_L3_DST_ONLY) {
720                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA));
721                                 *hash_flds |= (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA));
722                         } else {
723                                 *hash_flds &= ~ICE_FLOW_HASH_IPV6;
724                                 *hash_flds |= ICE_FLOW_HASH_IPV6_PRE32;
725                         }
726                 }
727                 if (rss_type & RTE_ETH_RSS_L3_PRE48) {
728                         if (rss_type & ETH_RSS_L3_SRC_ONLY) {
729                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA));
730                                 *hash_flds |= (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA));
731                         } else if (rss_type & ETH_RSS_L3_DST_ONLY) {
732                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA));
733                                 *hash_flds |= (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA));
734                         } else {
735                                 *hash_flds &= ~ICE_FLOW_HASH_IPV6;
736                                 *hash_flds |= ICE_FLOW_HASH_IPV6_PRE48;
737                         }
738                 }
739                 if (rss_type & RTE_ETH_RSS_L3_PRE64) {
740                         if (rss_type & ETH_RSS_L3_SRC_ONLY) {
741                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA));
742                                 *hash_flds |= (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA));
743                         } else if (rss_type & ETH_RSS_L3_DST_ONLY) {
744                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA));
745                                 *hash_flds |= (BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA));
746                         } else {
747                                 *hash_flds &= ~ICE_FLOW_HASH_IPV6;
748                                 *hash_flds |= ICE_FLOW_HASH_IPV6_PRE64;
749                         }
750                 }
751         }
752
753         if (*addl_hdrs & ICE_FLOW_SEG_HDR_UDP) {
754                 if (rss_type &
755                    (ETH_RSS_NONFRAG_IPV4_UDP |
756                     ETH_RSS_NONFRAG_IPV6_UDP)) {
757                         if (rss_type & ETH_RSS_L4_SRC_ONLY)
758                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT));
759                         else if (rss_type & ETH_RSS_L4_DST_ONLY)
760                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_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_UDP_PORT;
765                 } else {
766                         *hash_flds &= ~ICE_FLOW_HASH_UDP_PORT;
767                 }
768         }
769
770         if (*addl_hdrs & ICE_FLOW_SEG_HDR_TCP) {
771                 if (rss_type &
772                    (ETH_RSS_NONFRAG_IPV4_TCP |
773                     ETH_RSS_NONFRAG_IPV6_TCP)) {
774                         if (rss_type & ETH_RSS_L4_SRC_ONLY)
775                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT));
776                         else if (rss_type & ETH_RSS_L4_DST_ONLY)
777                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_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_TCP_PORT;
782                 } else {
783                         *hash_flds &= ~ICE_FLOW_HASH_TCP_PORT;
784                 }
785         }
786
787         if (*addl_hdrs & ICE_FLOW_SEG_HDR_SCTP) {
788                 if (rss_type &
789                    (ETH_RSS_NONFRAG_IPV4_SCTP |
790                     ETH_RSS_NONFRAG_IPV6_SCTP)) {
791                         if (rss_type & ETH_RSS_L4_SRC_ONLY)
792                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT));
793                         else if (rss_type & ETH_RSS_L4_DST_ONLY)
794                                 *hash_flds &= ~(BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT));
795                         else if (rss_type &
796                                 (ETH_RSS_L3_SRC_ONLY |
797                                   ETH_RSS_L3_DST_ONLY))
798                                 *hash_flds &= ~ICE_FLOW_HASH_SCTP_PORT;
799                 } else {
800                         *hash_flds &= ~ICE_FLOW_HASH_SCTP_PORT;
801                 }
802         }
803
804         if (*addl_hdrs & ICE_FLOW_SEG_HDR_L2TPV3) {
805                 if (!(rss_type & ETH_RSS_L2TPV3))
806                         *hash_flds &= ~ICE_FLOW_HASH_L2TPV3_SESS_ID;
807         }
808
809         if (*addl_hdrs & ICE_FLOW_SEG_HDR_ESP) {
810                 if (!(rss_type & ETH_RSS_ESP))
811                         *hash_flds &= ~ICE_FLOW_HASH_ESP_SPI;
812         }
813
814         if (*addl_hdrs & ICE_FLOW_SEG_HDR_AH) {
815                 if (!(rss_type & ETH_RSS_AH))
816                         *hash_flds &= ~ICE_FLOW_HASH_AH_SPI;
817         }
818
819         if (*addl_hdrs & ICE_FLOW_SEG_HDR_PFCP_SESSION) {
820                 if (!(rss_type & ETH_RSS_PFCP))
821                         *hash_flds &= ~ICE_FLOW_HASH_PFCP_SEID;
822         }
823 }
824
825 static void
826 ice_refine_proto_hdrs_by_pattern(struct ice_rss_hash_cfg *hash_cfg,
827                                  uint64_t phint)
828 {
829         uint32_t *addl_hdrs = &hash_cfg->addl_hdrs;
830         if (phint & ICE_PHINT_VLAN)
831                 *addl_hdrs |= ICE_FLOW_SEG_HDR_VLAN;
832
833         if (phint & ICE_PHINT_PPPOE)
834                 *addl_hdrs |= ICE_FLOW_SEG_HDR_PPPOE;
835
836         if (phint & ICE_PHINT_GTPU_EH_DWN)
837                 *addl_hdrs |= ICE_FLOW_SEG_HDR_GTPU_DWN;
838         else if (phint & ICE_PHINT_GTPU_EH_UP)
839                 *addl_hdrs |= ICE_FLOW_SEG_HDR_GTPU_UP;
840         else if (phint & ICE_PHINT_GTPU_EH)
841                 *addl_hdrs |= ICE_FLOW_SEG_HDR_GTPU_EH;
842         else if (phint & ICE_PHINT_GTPU)
843                 *addl_hdrs |= ICE_FLOW_SEG_HDR_GTPU_IP;
844 }
845
846 static void
847 ice_refine_hash_cfg_gtpu(struct ice_rss_hash_cfg *hash_cfg,
848                          uint64_t rss_type)
849 {
850         uint32_t *addl_hdrs = &hash_cfg->addl_hdrs;
851         uint64_t *hash_flds = &hash_cfg->hash_flds;
852
853         /* update hash field for gtpu eh/gtpu dwn/gtpu up. */
854         if (!(rss_type & ETH_RSS_GTPU))
855                 return;
856
857         if (*addl_hdrs & ICE_FLOW_SEG_HDR_GTPU_DWN)
858                 *hash_flds |= BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID);
859         else if (*addl_hdrs & ICE_FLOW_SEG_HDR_GTPU_UP)
860                 *hash_flds |= BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_UP_TEID);
861         else if (*addl_hdrs & ICE_FLOW_SEG_HDR_GTPU_EH)
862                 *hash_flds |= BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_TEID);
863         else if (*addl_hdrs & ICE_FLOW_SEG_HDR_GTPU_IP)
864                 *hash_flds |= BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID);
865 }
866
867 static void ice_refine_hash_cfg(struct ice_rss_hash_cfg *hash_cfg,
868                                 uint64_t rss_type, uint64_t phint)
869 {
870         ice_refine_proto_hdrs_by_pattern(hash_cfg, phint);
871         ice_refine_hash_cfg_l234(hash_cfg, rss_type);
872         ice_refine_hash_cfg_gtpu(hash_cfg, rss_type);
873 }
874
875 static uint64_t invalid_rss_comb[] = {
876         ETH_RSS_IPV4 | ETH_RSS_NONFRAG_IPV4_UDP,
877         ETH_RSS_IPV4 | ETH_RSS_NONFRAG_IPV4_TCP,
878         ETH_RSS_IPV6 | ETH_RSS_NONFRAG_IPV6_UDP,
879         ETH_RSS_IPV6 | ETH_RSS_NONFRAG_IPV6_TCP,
880         RTE_ETH_RSS_L3_PRE40 |
881         RTE_ETH_RSS_L3_PRE56 |
882         RTE_ETH_RSS_L3_PRE96
883 };
884
885 struct rss_attr_type {
886         uint64_t attr;
887         uint64_t type;
888 };
889
890 static struct rss_attr_type rss_attr_to_valid_type[] = {
891         {ETH_RSS_L2_SRC_ONLY | ETH_RSS_L2_DST_ONLY,     ETH_RSS_ETH},
892         {ETH_RSS_L3_SRC_ONLY | ETH_RSS_L3_DST_ONLY,     VALID_RSS_L3},
893         {ETH_RSS_L4_SRC_ONLY | ETH_RSS_L4_DST_ONLY,     VALID_RSS_L4},
894         /* current ipv6 prefix only supports prefix 64 bits*/
895         {RTE_ETH_RSS_L3_PRE32,                          VALID_RSS_IPV6},
896         {RTE_ETH_RSS_L3_PRE48,                          VALID_RSS_IPV6},
897         {RTE_ETH_RSS_L3_PRE64,                          VALID_RSS_IPV6},
898         {INVALID_RSS_ATTR,                              0}
899 };
900
901 static bool
902 ice_any_invalid_rss_type(enum rte_eth_hash_function rss_func,
903                          uint64_t rss_type, uint64_t allow_rss_type)
904 {
905         uint32_t i;
906
907         /**
908          * Check if l3/l4 SRC/DST_ONLY is set for SYMMETRIC_TOEPLITZ
909          * hash function.
910          */
911         if (rss_func == RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
912                 if (rss_type & (ETH_RSS_L3_SRC_ONLY | ETH_RSS_L3_DST_ONLY |
913                     ETH_RSS_L4_SRC_ONLY | ETH_RSS_L4_DST_ONLY))
914                         return true;
915
916                 if (!(rss_type &
917                    (ETH_RSS_IPV4 | ETH_RSS_IPV6 |
918                     ETH_RSS_FRAG_IPV4 | ETH_RSS_FRAG_IPV6 |
919                     ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP |
920                     ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV6_TCP |
921                     ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_NONFRAG_IPV6_SCTP)))
922                         return true;
923         }
924
925         /* check invalid combination */
926         for (i = 0; i < RTE_DIM(invalid_rss_comb); i++) {
927                 if (__builtin_popcountll(rss_type & invalid_rss_comb[i]) > 1)
928                         return true;
929         }
930
931         /* check invalid RSS attribute */
932         for (i = 0; i < RTE_DIM(rss_attr_to_valid_type); i++) {
933                 struct rss_attr_type *rat = &rss_attr_to_valid_type[i];
934
935                 if (rat->attr & rss_type && !(rat->type & rss_type))
936                         return true;
937         }
938
939         /* check not allowed RSS type */
940         rss_type &= ~VALID_RSS_ATTR;
941
942         return ((rss_type & allow_rss_type) != rss_type);
943 }
944
945 static int
946 ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item,
947                 const struct rte_flow_action actions[],
948                 uint64_t pattern_hint, void **meta,
949                 struct rte_flow_error *error)
950 {
951         struct ice_rss_meta *rss_meta = (struct ice_rss_meta *)*meta;
952         struct ice_rss_hash_cfg *cfg = pattern_match_item->meta;
953         enum rte_flow_action_type action_type;
954         const struct rte_flow_action_rss *rss;
955         const struct rte_flow_action *action;
956         uint64_t rss_type;
957
958         /* Supported action is RSS. */
959         for (action = actions; action->type !=
960                 RTE_FLOW_ACTION_TYPE_END; action++) {
961                 action_type = action->type;
962                 switch (action_type) {
963                 case RTE_FLOW_ACTION_TYPE_RSS:
964                         rss = action->conf;
965                         rss_type = rss->types;
966
967                         /* Check hash function and save it to rss_meta. */
968                         if (pattern_match_item->pattern_list !=
969                             pattern_empty && rss->func ==
970                             RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) {
971                                 return rte_flow_error_set(error, ENOTSUP,
972                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
973                                         "Not supported flow");
974                         } else if (rss->func ==
975                                    RTE_ETH_HASH_FUNCTION_SIMPLE_XOR){
976                                 rss_meta->hash_function =
977                                 RTE_ETH_HASH_FUNCTION_SIMPLE_XOR;
978                                 return 0;
979                         } else if (rss->func ==
980                                    RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
981                                 rss_meta->hash_function =
982                                 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ;
983                                 cfg->symm = true;
984                         }
985
986                         if (rss->level)
987                                 return rte_flow_error_set(error, ENOTSUP,
988                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
989                                         "a nonzero RSS encapsulation level is not supported");
990
991                         if (rss->key_len)
992                                 return rte_flow_error_set(error, ENOTSUP,
993                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
994                                         "a nonzero RSS key_len is not supported");
995
996                         if (rss->queue)
997                                 return rte_flow_error_set(error, ENOTSUP,
998                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
999                                         "a non-NULL RSS queue is not supported");
1000
1001                         /**
1002                          * Check simultaneous use of SRC_ONLY and DST_ONLY
1003                          * of the same level.
1004                          */
1005                         rss_type = rte_eth_rss_hf_refine(rss_type);
1006
1007                         if (ice_any_invalid_rss_type(rss->func, rss_type,
1008                                         pattern_match_item->input_set_mask_o))
1009                                 return rte_flow_error_set(error, ENOTSUP,
1010                                         RTE_FLOW_ERROR_TYPE_ACTION,
1011                                         action, "RSS type not supported");
1012
1013                         rss_meta->cfg = *cfg;
1014                         ice_refine_hash_cfg(&rss_meta->cfg,
1015                                             rss_type, pattern_hint);
1016                         break;
1017                 case RTE_FLOW_ACTION_TYPE_END:
1018                         break;
1019
1020                 default:
1021                         rte_flow_error_set(error, EINVAL,
1022                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
1023                                         "Invalid action.");
1024                         return -rte_errno;
1025                 }
1026         }
1027
1028         return 0;
1029 }
1030
1031 static int
1032 ice_hash_parse_pattern_action(__rte_unused struct ice_adapter *ad,
1033                         struct ice_pattern_match_item *array,
1034                         uint32_t array_len,
1035                         const struct rte_flow_item pattern[],
1036                         const struct rte_flow_action actions[],
1037                         uint32_t priority,
1038                         void **meta,
1039                         struct rte_flow_error *error)
1040 {
1041         int ret = 0;
1042         struct ice_pattern_match_item *pattern_match_item;
1043         struct ice_rss_meta *rss_meta_ptr;
1044         uint64_t phint = ICE_PHINT_NONE;
1045
1046         if (priority >= 1)
1047                 return -rte_errno;
1048
1049         rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0);
1050         if (!rss_meta_ptr) {
1051                 rte_flow_error_set(error, EINVAL,
1052                                 RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1053                                 "No memory for rss_meta_ptr");
1054                 return -ENOMEM;
1055         }
1056
1057         /* Check rss supported pattern and find matched pattern. */
1058         pattern_match_item = ice_search_pattern_match_item(ad, pattern, array,
1059                                                            array_len, error);
1060         if (!pattern_match_item) {
1061                 ret = -rte_errno;
1062                 goto error;
1063         }
1064
1065         ret = ice_hash_parse_pattern(pattern, &phint, error);
1066         if (ret)
1067                 goto error;
1068
1069         /* Check rss action. */
1070         ret = ice_hash_parse_action(pattern_match_item, actions, phint,
1071                                     (void **)&rss_meta_ptr, error);
1072
1073 error:
1074         if (!ret && meta)
1075                 *meta = rss_meta_ptr;
1076         else
1077                 rte_free(rss_meta_ptr);
1078         rte_free(pattern_match_item);
1079
1080         return ret;
1081 }
1082
1083 static int
1084 ice_hash_create(struct ice_adapter *ad,
1085                 struct rte_flow *flow,
1086                 void *meta,
1087                 struct rte_flow_error *error)
1088 {
1089         struct ice_pf *pf = &ad->pf;
1090         struct ice_hw *hw = ICE_PF_TO_HW(pf);
1091         struct ice_vsi *vsi = pf->main_vsi;
1092         int ret;
1093         uint32_t reg;
1094         struct ice_hash_flow_cfg *filter_ptr;
1095         struct ice_rss_meta *rss_meta = (struct ice_rss_meta *)meta;
1096         uint8_t hash_function = rss_meta->hash_function;
1097
1098         filter_ptr = rte_zmalloc("ice_rss_filter",
1099                                 sizeof(struct ice_hash_flow_cfg), 0);
1100         if (!filter_ptr) {
1101                 rte_flow_error_set(error, EINVAL,
1102                                 RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1103                                 "No memory for filter_ptr");
1104                 return -ENOMEM;
1105         }
1106
1107         if (hash_function == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) {
1108                 /* Enable registers for simple_xor hash function. */
1109                 reg = ICE_READ_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id));
1110                 reg = (reg & (~VSIQF_HASH_CTL_HASH_SCHEME_M)) |
1111                         (2 << VSIQF_HASH_CTL_HASH_SCHEME_S);
1112                 ICE_WRITE_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id), reg);
1113
1114                 filter_ptr->simple_xor = 1;
1115
1116                 goto out;
1117         } else {
1118                 memcpy(&filter_ptr->rss_cfg.hash, &rss_meta->cfg,
1119                        sizeof(struct ice_rss_hash_cfg));
1120                 ret = ice_add_rss_cfg_wrap(pf, vsi->idx,
1121                                            &filter_ptr->rss_cfg.hash);
1122                 if (ret) {
1123                         rte_flow_error_set(error, EINVAL,
1124                                         RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1125                                         "rss flow create fail");
1126                         goto error;
1127                 }
1128         }
1129
1130 out:
1131         flow->rule = filter_ptr;
1132         rte_free(meta);
1133         return 0;
1134
1135 error:
1136         rte_free(filter_ptr);
1137         rte_free(meta);
1138         return -rte_errno;
1139 }
1140
1141 static int
1142 ice_hash_destroy(struct ice_adapter *ad,
1143                 struct rte_flow *flow,
1144                 struct rte_flow_error *error)
1145 {
1146         struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(ad);
1147         struct ice_hw *hw = ICE_PF_TO_HW(pf);
1148         struct ice_vsi *vsi = pf->main_vsi;
1149         int ret;
1150         uint32_t reg;
1151         struct ice_hash_flow_cfg *filter_ptr;
1152
1153         filter_ptr = (struct ice_hash_flow_cfg *)flow->rule;
1154
1155         if (filter_ptr->simple_xor == 1) {
1156                 /* Return to symmetric_toeplitz state. */
1157                 reg = ICE_READ_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id));
1158                 reg = (reg & (~VSIQF_HASH_CTL_HASH_SCHEME_M)) |
1159                         (1 << VSIQF_HASH_CTL_HASH_SCHEME_S);
1160                 ICE_WRITE_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id), reg);
1161         } else {
1162                 ret = ice_rem_rss_cfg_wrap(pf, vsi->idx,
1163                                            &filter_ptr->rss_cfg.hash);
1164                 /* Fixme: Ignore the error if a rule does not exist.
1165                  * Currently a rule for inputset change or symm turn on/off
1166                  * will overwrite an exist rule, while application still
1167                  * have 2 rte_flow handles.
1168                  **/
1169                 if (ret && ret != ICE_ERR_DOES_NOT_EXIST) {
1170                         rte_flow_error_set(error, EINVAL,
1171                                         RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1172                                         "rss flow destroy fail");
1173                         goto error;
1174                 }
1175         }
1176
1177         rte_free(filter_ptr);
1178         return 0;
1179
1180 error:
1181         rte_free(filter_ptr);
1182         return -rte_errno;
1183 }
1184
1185 static void
1186 ice_hash_uninit(struct ice_adapter *ad)
1187 {
1188         if (ad->hw.dcf_enabled)
1189                 return;
1190
1191         ice_unregister_parser(&ice_hash_parser, ad);
1192 }
1193
1194 static void
1195 ice_hash_free(struct rte_flow *flow)
1196 {
1197         rte_free(flow->rule);
1198 }