60183bb38cd871be9fcab54dcfa0e12c930b4f22
[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 <rte_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_GTPU_EH_DWNLINK     0
29 #define ICE_GTPU_EH_UPLINK      1
30
31 struct rss_type_match_hdr {
32         uint32_t hdr_mask;
33         uint64_t eth_rss_hint;
34 };
35
36 struct ice_hash_match_type {
37         uint64_t hash_type;
38         uint64_t hash_flds;
39 };
40
41 struct rss_meta {
42         uint32_t pkt_hdr;
43         uint64_t hash_flds;
44         uint8_t hash_function;
45 };
46
47 struct ice_hash_flow_cfg {
48         bool simple_xor;
49         struct ice_rss_cfg rss_cfg;
50 };
51
52 static int
53 ice_hash_init(struct ice_adapter *ad);
54
55 static int
56 ice_hash_create(struct ice_adapter *ad,
57                 struct rte_flow *flow,
58                 void *meta,
59                 struct rte_flow_error *error);
60
61 static int
62 ice_hash_destroy(struct ice_adapter *ad,
63                 struct rte_flow *flow,
64                 struct rte_flow_error *error);
65
66 static void
67 ice_hash_uninit(struct ice_adapter *ad);
68
69 static void
70 ice_hash_free(struct rte_flow *flow);
71
72 static int
73 ice_hash_parse_pattern_action(struct ice_adapter *ad,
74                         struct ice_pattern_match_item *array,
75                         uint32_t array_len,
76                         const struct rte_flow_item pattern[],
77                         const struct rte_flow_action actions[],
78                         void **meta,
79                         struct rte_flow_error *error);
80
81 /* The first member is protocol header, the second member is ETH_RSS_*. */
82 struct rss_type_match_hdr hint_empty = {
83         ICE_FLOW_SEG_HDR_NONE,  0};
84 struct rss_type_match_hdr hint_eth_ipv4 = {
85         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER,
86         ETH_RSS_ETH | ETH_RSS_IPV4};
87 struct rss_type_match_hdr hint_eth_ipv4_udp = {
88         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
89         ICE_FLOW_SEG_HDR_UDP,
90         ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_UDP};
91 struct rss_type_match_hdr hint_eth_ipv4_tcp = {
92         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
93         ICE_FLOW_SEG_HDR_TCP,
94         ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_TCP};
95 struct rss_type_match_hdr hint_eth_ipv4_sctp = {
96         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
97         ICE_FLOW_SEG_HDR_SCTP,
98         ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_SCTP};
99 struct rss_type_match_hdr hint_eth_ipv4_gtpu_ipv4 = {
100         ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 |
101         ICE_FLOW_SEG_HDR_IPV_OTHER,
102         ETH_RSS_GTPU | ETH_RSS_IPV4};
103 struct rss_type_match_hdr hint_eth_ipv4_gtpu_ipv4_udp = {
104         ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 |
105         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
106         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_UDP};
107 struct rss_type_match_hdr hint_eth_ipv4_gtpu_ipv4_tcp = {
108         ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 |
109         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
110         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_TCP};
111 struct rss_type_match_hdr hint_eth_ipv4_gtpu_ipv6 = {
112         ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6 |
113         ICE_FLOW_SEG_HDR_IPV_OTHER,
114         ETH_RSS_GTPU | ETH_RSS_IPV6};
115 struct rss_type_match_hdr hint_eth_ipv4_gtpu_ipv6_udp = {
116         ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6 |
117         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
118         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_UDP};
119 struct rss_type_match_hdr hint_eth_ipv4_gtpu_ipv6_tcp = {
120         ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6 |
121         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
122         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_TCP};
123 struct rss_type_match_hdr hint_eth_ipv6_gtpu_ipv4 = {
124         ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 |
125         ICE_FLOW_SEG_HDR_IPV_OTHER,
126         ETH_RSS_GTPU | ETH_RSS_IPV4};
127 struct rss_type_match_hdr hint_eth_ipv6_gtpu_ipv4_udp = {
128         ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 |
129         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
130         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_UDP};
131 struct rss_type_match_hdr hint_eth_ipv6_gtpu_ipv4_tcp = {
132         ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV4 |
133         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
134         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_TCP};
135 struct rss_type_match_hdr hint_eth_ipv6_gtpu_ipv6 = {
136         ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6 |
137         ICE_FLOW_SEG_HDR_IPV_OTHER,
138         ETH_RSS_GTPU | ETH_RSS_IPV6};
139 struct rss_type_match_hdr hint_eth_ipv6_gtpu_ipv6_udp = {
140         ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6 |
141         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
142         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_UDP};
143 struct rss_type_match_hdr hint_eth_ipv6_gtpu_ipv6_tcp = {
144         ICE_FLOW_SEG_HDR_GTPU_IP | ICE_FLOW_SEG_HDR_IPV6 |
145         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
146         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_TCP};
147 struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv4 = {
148         ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 |
149         ICE_FLOW_SEG_HDR_IPV_OTHER,
150         ETH_RSS_GTPU | ETH_RSS_IPV4};
151 struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv4_udp = {
152         ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 |
153         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
154         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_UDP};
155 struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv4_tcp = {
156         ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 |
157         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
158         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_TCP};
159 struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv6 = {
160         ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6 |
161         ICE_FLOW_SEG_HDR_IPV_OTHER,
162         ETH_RSS_GTPU | ETH_RSS_IPV6};
163 struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv6_udp = {
164         ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6 |
165         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
166         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_UDP};
167 struct rss_type_match_hdr hint_eth_ipv4_gtpu_eh_ipv6_tcp = {
168         ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6 |
169         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
170         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_TCP};
171 struct rss_type_match_hdr hint_eth_ipv6_gtpu_eh_ipv4 = {
172         ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 |
173         ICE_FLOW_SEG_HDR_IPV_OTHER,
174         ETH_RSS_GTPU | ETH_RSS_IPV4};
175 struct rss_type_match_hdr hint_eth_ipv6_gtpu_eh_ipv4_udp = {
176         ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 |
177         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
178         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_UDP};
179 struct rss_type_match_hdr hint_eth_ipv6_gtpu_eh_ipv4_tcp = {
180         ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV4 |
181         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
182         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV4_TCP};
183 struct rss_type_match_hdr hint_eth_ipv6_gtpu_eh_ipv6 = {
184         ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6 |
185         ICE_FLOW_SEG_HDR_IPV_OTHER,
186         ETH_RSS_GTPU | ETH_RSS_IPV6};
187 struct rss_type_match_hdr hint_eth_ipv6_gtpu_eh_ipv6_udp = {
188         ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6 |
189         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
190         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_UDP};
191 struct rss_type_match_hdr hint_eth_ipv6_gtpu_eh_ipv6_tcp = {
192         ICE_FLOW_SEG_HDR_GTPU_EH | ICE_FLOW_SEG_HDR_IPV6 |
193         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
194         ETH_RSS_GTPU | ETH_RSS_NONFRAG_IPV6_TCP};
195 struct rss_type_match_hdr hint_eth_pppoes_ipv4 = {
196         ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV4 |
197         ICE_FLOW_SEG_HDR_IPV_OTHER,
198         ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_IPV4};
199 struct rss_type_match_hdr hint_eth_pppoes_ipv4_udp = {
200         ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV4 |
201         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
202         ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV4_UDP};
203 struct rss_type_match_hdr hint_eth_pppoes_ipv4_tcp = {
204         ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV4 |
205         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
206         ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV4_TCP};
207 struct rss_type_match_hdr hint_eth_ipv4_esp = {
208         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
209         ICE_FLOW_SEG_HDR_ESP,
210         ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_ESP};
211 struct rss_type_match_hdr hint_eth_ipv4_udp_esp = {
212         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
213         ICE_FLOW_SEG_HDR_NAT_T_ESP,
214         ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_ESP};
215 struct rss_type_match_hdr hint_eth_ipv4_ah = {
216         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
217         ICE_FLOW_SEG_HDR_AH,
218         ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_AH};
219 struct rss_type_match_hdr hint_eth_ipv4_l2tpv3 = {
220         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
221         ICE_FLOW_SEG_HDR_L2TPV3,
222         ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_L2TPV3};
223 struct rss_type_match_hdr hint_eth_ipv4_pfcp = {
224         ICE_FLOW_SEG_HDR_IPV4 | ICE_FLOW_SEG_HDR_IPV_OTHER |
225         ICE_FLOW_SEG_HDR_PFCP_SESSION,
226         ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_PFCP};
227 struct rss_type_match_hdr hint_eth_vlan_ipv4 = {
228         ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV4 |
229         ICE_FLOW_SEG_HDR_IPV_OTHER,
230         ETH_RSS_ETH | ETH_RSS_IPV4 | ETH_RSS_C_VLAN};
231 struct rss_type_match_hdr hint_eth_vlan_ipv4_udp = {
232         ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV4 |
233         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
234         ETH_RSS_ETH | ETH_RSS_C_VLAN |
235         ETH_RSS_NONFRAG_IPV4_UDP};
236 struct rss_type_match_hdr hint_eth_vlan_ipv4_tcp = {
237         ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV4 |
238         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
239         ETH_RSS_ETH | ETH_RSS_C_VLAN |
240         ETH_RSS_NONFRAG_IPV4_TCP};
241 struct rss_type_match_hdr hint_eth_vlan_ipv4_sctp = {
242         ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV4 |
243         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_SCTP,
244         ETH_RSS_ETH | ETH_RSS_C_VLAN |
245         ETH_RSS_NONFRAG_IPV4_SCTP};
246 struct rss_type_match_hdr hint_eth_ipv6 = {
247         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER,
248         ETH_RSS_ETH | ETH_RSS_IPV6};
249 struct rss_type_match_hdr hint_eth_ipv6_udp = {
250         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
251         ICE_FLOW_SEG_HDR_UDP,
252         ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_UDP};
253 struct rss_type_match_hdr hint_eth_ipv6_tcp = {
254         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
255         ICE_FLOW_SEG_HDR_TCP,
256         ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_TCP};
257 struct rss_type_match_hdr hint_eth_ipv6_sctp = {
258         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
259         ICE_FLOW_SEG_HDR_SCTP,
260         ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_SCTP};
261 struct rss_type_match_hdr hint_eth_ipv6_esp = {
262         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
263         ICE_FLOW_SEG_HDR_ESP,
264         ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_ESP};
265 struct rss_type_match_hdr hint_eth_ipv6_udp_esp = {
266         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
267         ICE_FLOW_SEG_HDR_NAT_T_ESP,
268         ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_ESP};
269 struct rss_type_match_hdr hint_eth_ipv6_ah = {
270         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
271         ICE_FLOW_SEG_HDR_AH,
272         ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_AH};
273 struct rss_type_match_hdr hint_eth_ipv6_l2tpv3 = {
274         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
275         ICE_FLOW_SEG_HDR_L2TPV3,
276         ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_L2TPV3};
277 struct rss_type_match_hdr hint_eth_ipv6_pfcp = {
278         ICE_FLOW_SEG_HDR_IPV6 | ICE_FLOW_SEG_HDR_IPV_OTHER |
279         ICE_FLOW_SEG_HDR_PFCP_SESSION,
280         ETH_RSS_ETH | ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_PFCP};
281 struct rss_type_match_hdr hint_eth_vlan_ipv6 = {
282         ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV6 |
283         ICE_FLOW_SEG_HDR_IPV_OTHER,
284         ETH_RSS_ETH | ETH_RSS_IPV6 | ETH_RSS_C_VLAN};
285 struct rss_type_match_hdr hint_eth_vlan_ipv6_udp = {
286         ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV6 |
287         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
288         ETH_RSS_ETH | ETH_RSS_C_VLAN |
289         ETH_RSS_NONFRAG_IPV6_UDP};
290 struct rss_type_match_hdr hint_eth_vlan_ipv6_tcp = {
291         ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV6 |
292         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
293         ETH_RSS_ETH | ETH_RSS_C_VLAN |
294         ETH_RSS_NONFRAG_IPV6_TCP};
295 struct rss_type_match_hdr hint_eth_vlan_ipv6_sctp = {
296         ICE_FLOW_SEG_HDR_VLAN | ICE_FLOW_SEG_HDR_IPV6 |
297         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_SCTP,
298         ETH_RSS_ETH | ETH_RSS_C_VLAN |
299         ETH_RSS_NONFRAG_IPV6_SCTP};
300 struct rss_type_match_hdr hint_eth_pppoes_ipv6 = {
301         ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV6 |
302         ICE_FLOW_SEG_HDR_IPV_OTHER,
303         ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_IPV6};
304 struct rss_type_match_hdr hint_eth_pppoes_ipv6_udp = {
305         ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV6 |
306         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_UDP,
307         ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV6_UDP};
308 struct rss_type_match_hdr hint_eth_pppoes_ipv6_tcp = {
309         ICE_FLOW_SEG_HDR_PPPOE | ICE_FLOW_SEG_HDR_IPV6 |
310         ICE_FLOW_SEG_HDR_IPV_OTHER | ICE_FLOW_SEG_HDR_TCP,
311         ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_NONFRAG_IPV6_TCP};
312 struct rss_type_match_hdr hint_eth_pppoes = {
313         ICE_FLOW_SEG_HDR_PPPOE,
314         ETH_RSS_ETH | ETH_RSS_PPPOE};
315
316 /* Supported pattern for os default package. */
317 static struct ice_pattern_match_item ice_hash_pattern_list_os[] = {
318         {pattern_eth_ipv4,      ICE_INSET_NONE, &hint_eth_ipv4},
319         {pattern_eth_ipv4_udp,  ICE_INSET_NONE, &hint_eth_ipv4_udp},
320         {pattern_eth_ipv4_tcp,  ICE_INSET_NONE, &hint_eth_ipv4_tcp},
321         {pattern_eth_ipv4_sctp, ICE_INSET_NONE, &hint_eth_ipv4_sctp},
322         {pattern_eth_ipv6,      ICE_INSET_NONE, &hint_eth_ipv6},
323         {pattern_eth_ipv6_udp,  ICE_INSET_NONE, &hint_eth_ipv6_udp},
324         {pattern_eth_ipv6_tcp,  ICE_INSET_NONE, &hint_eth_ipv6_tcp},
325         {pattern_eth_ipv6_sctp, ICE_INSET_NONE, &hint_eth_ipv6_sctp},
326         {pattern_empty,         ICE_INSET_NONE, &hint_empty},
327 };
328
329 /* Supported pattern for comms package. */
330 static struct ice_pattern_match_item ice_hash_pattern_list_comms[] = {
331         {pattern_empty,                     ICE_INSET_NONE,
332                 &hint_empty},
333         {pattern_eth_ipv4,                  ICE_INSET_NONE,
334                 &hint_eth_ipv4},
335         {pattern_eth_ipv4_udp,              ICE_INSET_NONE,
336                 &hint_eth_ipv4_udp},
337         {pattern_eth_ipv4_tcp,              ICE_INSET_NONE,
338                 &hint_eth_ipv4_tcp},
339         {pattern_eth_ipv4_sctp,             ICE_INSET_NONE,
340                 &hint_eth_ipv4_sctp},
341         {pattern_eth_ipv4_gtpu_ipv4,        ICE_INSET_NONE,
342                 &hint_eth_ipv4_gtpu_ipv4},
343         {pattern_eth_ipv4_gtpu_ipv4_udp,    ICE_INSET_NONE,
344                 &hint_eth_ipv4_gtpu_ipv4_udp},
345         {pattern_eth_ipv4_gtpu_ipv4_tcp,    ICE_INSET_NONE,
346                 &hint_eth_ipv4_gtpu_ipv4_tcp},
347         {pattern_eth_ipv4_gtpu_ipv6,        ICE_INSET_NONE,
348                 &hint_eth_ipv4_gtpu_ipv6},
349         {pattern_eth_ipv4_gtpu_ipv6_udp,    ICE_INSET_NONE,
350                 &hint_eth_ipv4_gtpu_ipv6_udp},
351         {pattern_eth_ipv4_gtpu_ipv6_tcp,    ICE_INSET_NONE,
352                 &hint_eth_ipv4_gtpu_ipv6_tcp},
353         {pattern_eth_ipv6_gtpu_ipv4,        ICE_INSET_NONE,
354                 &hint_eth_ipv6_gtpu_ipv4},
355         {pattern_eth_ipv6_gtpu_ipv4_udp,    ICE_INSET_NONE,
356                 &hint_eth_ipv6_gtpu_ipv4_udp},
357         {pattern_eth_ipv6_gtpu_ipv4_tcp,    ICE_INSET_NONE,
358                 &hint_eth_ipv6_gtpu_ipv4_tcp},
359         {pattern_eth_ipv6_gtpu_ipv6,        ICE_INSET_NONE,
360                 &hint_eth_ipv6_gtpu_ipv6},
361         {pattern_eth_ipv6_gtpu_ipv6_udp,    ICE_INSET_NONE,
362                 &hint_eth_ipv6_gtpu_ipv6_udp},
363         {pattern_eth_ipv6_gtpu_ipv6_tcp,    ICE_INSET_NONE,
364                 &hint_eth_ipv6_gtpu_ipv6_tcp},
365         {pattern_eth_ipv4_gtpu_eh_ipv4,     ICE_INSET_NONE,
366                 &hint_eth_ipv4_gtpu_eh_ipv4},
367         {pattern_eth_ipv4_gtpu_eh_ipv4_udp, ICE_INSET_NONE,
368                 &hint_eth_ipv4_gtpu_eh_ipv4_udp},
369         {pattern_eth_ipv4_gtpu_eh_ipv4_tcp, ICE_INSET_NONE,
370                 &hint_eth_ipv4_gtpu_eh_ipv4_tcp},
371         {pattern_eth_ipv4_gtpu_eh_ipv6,     ICE_INSET_NONE,
372                 &hint_eth_ipv4_gtpu_eh_ipv6},
373         {pattern_eth_ipv4_gtpu_eh_ipv6_udp, ICE_INSET_NONE,
374                 &hint_eth_ipv4_gtpu_eh_ipv6_udp},
375         {pattern_eth_ipv4_gtpu_eh_ipv6_tcp, ICE_INSET_NONE,
376                 &hint_eth_ipv4_gtpu_eh_ipv6_tcp},
377         {pattern_eth_ipv6_gtpu_eh_ipv4,     ICE_INSET_NONE,
378                 &hint_eth_ipv6_gtpu_eh_ipv4},
379         {pattern_eth_ipv6_gtpu_eh_ipv4_udp, ICE_INSET_NONE,
380                 &hint_eth_ipv6_gtpu_eh_ipv4_udp},
381         {pattern_eth_ipv6_gtpu_eh_ipv4_tcp, ICE_INSET_NONE,
382                 &hint_eth_ipv6_gtpu_eh_ipv4_tcp},
383         {pattern_eth_ipv6_gtpu_eh_ipv6,     ICE_INSET_NONE,
384                 &hint_eth_ipv6_gtpu_eh_ipv6},
385         {pattern_eth_ipv6_gtpu_eh_ipv6_udp, ICE_INSET_NONE,
386                 &hint_eth_ipv6_gtpu_eh_ipv6_udp},
387         {pattern_eth_ipv6_gtpu_eh_ipv6_tcp, ICE_INSET_NONE,
388                 &hint_eth_ipv6_gtpu_eh_ipv6_tcp},
389         {pattern_eth_pppoes_ipv4,           ICE_INSET_NONE,
390                 &hint_eth_pppoes_ipv4},
391         {pattern_eth_pppoes_ipv4_udp,       ICE_INSET_NONE,
392                 &hint_eth_pppoes_ipv4_udp},
393         {pattern_eth_pppoes_ipv4_tcp,       ICE_INSET_NONE,
394                 &hint_eth_pppoes_ipv4_tcp},
395         {pattern_eth_ipv4_esp,              ICE_INSET_NONE,
396                 &hint_eth_ipv4_esp},
397         {pattern_eth_ipv4_udp_esp,          ICE_INSET_NONE,
398                 &hint_eth_ipv4_udp_esp},
399         {pattern_eth_ipv4_ah,               ICE_INSET_NONE,
400                 &hint_eth_ipv4_ah},
401         {pattern_eth_ipv4_l2tp,             ICE_INSET_NONE,
402                 &hint_eth_ipv4_l2tpv3},
403         {pattern_eth_ipv4_pfcp,             ICE_INSET_NONE,
404                 &hint_eth_ipv4_pfcp},
405         {pattern_eth_vlan_ipv4,             ICE_INSET_NONE,
406                 &hint_eth_vlan_ipv4},
407         {pattern_eth_vlan_ipv4_udp,         ICE_INSET_NONE,
408                 &hint_eth_vlan_ipv4_udp},
409         {pattern_eth_vlan_ipv4_tcp,         ICE_INSET_NONE,
410                 &hint_eth_vlan_ipv4_tcp},
411         {pattern_eth_vlan_ipv4_sctp,        ICE_INSET_NONE,
412                 &hint_eth_vlan_ipv4_sctp},
413         {pattern_eth_ipv6,                  ICE_INSET_NONE,
414                 &hint_eth_ipv6},
415         {pattern_eth_ipv6_udp,              ICE_INSET_NONE,
416                 &hint_eth_ipv6_udp},
417         {pattern_eth_ipv6_tcp,              ICE_INSET_NONE,
418                 &hint_eth_ipv6_tcp},
419         {pattern_eth_ipv6_sctp,             ICE_INSET_NONE,
420                 &hint_eth_ipv6_sctp},
421         {pattern_eth_ipv6_esp,              ICE_INSET_NONE,
422                 &hint_eth_ipv6_esp},
423         {pattern_eth_ipv6_udp_esp,          ICE_INSET_NONE,
424                 &hint_eth_ipv6_udp_esp},
425         {pattern_eth_ipv6_ah,               ICE_INSET_NONE,
426                 &hint_eth_ipv6_ah},
427         {pattern_eth_ipv6_l2tp,             ICE_INSET_NONE,
428                 &hint_eth_ipv6_l2tpv3},
429         {pattern_eth_ipv6_pfcp,             ICE_INSET_NONE,
430                 &hint_eth_ipv6_pfcp},
431         {pattern_eth_vlan_ipv6,             ICE_INSET_NONE,
432                 &hint_eth_vlan_ipv6},
433         {pattern_eth_vlan_ipv6_udp,         ICE_INSET_NONE,
434                 &hint_eth_vlan_ipv6_udp},
435         {pattern_eth_vlan_ipv6_tcp,         ICE_INSET_NONE,
436                 &hint_eth_vlan_ipv6_tcp},
437         {pattern_eth_vlan_ipv6_sctp,        ICE_INSET_NONE,
438                 &hint_eth_vlan_ipv6_sctp},
439         {pattern_eth_pppoes_ipv6,           ICE_INSET_NONE,
440                 &hint_eth_pppoes_ipv6},
441         {pattern_eth_pppoes_ipv6_udp,       ICE_INSET_NONE,
442                 &hint_eth_pppoes_ipv6_udp},
443         {pattern_eth_pppoes_ipv6_tcp,       ICE_INSET_NONE,
444                 &hint_eth_pppoes_ipv6_tcp},
445         {pattern_eth_pppoes,                ICE_INSET_NONE,
446                 &hint_eth_pppoes},
447 };
448
449 /**
450  * The first member is input set combination,
451  * the second member is hash fields.
452  */
453 struct ice_hash_match_type ice_hash_type_list[] = {
454         {ETH_RSS_L2_SRC_ONLY,
455                 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA)},
456         {ETH_RSS_L2_DST_ONLY,
457                 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_DA)},
458         {ETH_RSS_ETH | ETH_RSS_L2_SRC_ONLY,
459                 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA)},
460         {ETH_RSS_ETH | ETH_RSS_L2_DST_ONLY,
461                 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_DA)},
462         {ETH_RSS_ETH,
463                 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA) |
464                 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_DA)},
465         {ETH_RSS_PPPOE,
466                 ICE_FLOW_HASH_PPPOE_SESS_ID},
467         {ETH_RSS_ETH | ETH_RSS_PPPOE | ETH_RSS_L2_SRC_ONLY,
468                 ICE_FLOW_HASH_PPPOE_SESS_ID |
469                 BIT_ULL(ICE_FLOW_FIELD_IDX_ETH_SA)},
470         {ETH_RSS_C_VLAN,
471                 BIT_ULL(ICE_FLOW_FIELD_IDX_C_VLAN)},
472         {ETH_RSS_S_VLAN,
473                 BIT_ULL(ICE_FLOW_FIELD_IDX_S_VLAN)},
474         {ETH_RSS_ESP,
475                 BIT_ULL(ICE_FLOW_FIELD_IDX_ESP_SPI)},
476         {ETH_RSS_AH,
477                 BIT_ULL(ICE_FLOW_FIELD_IDX_AH_SPI)},
478         {ETH_RSS_L2TPV3,
479                 BIT_ULL(ICE_FLOW_FIELD_IDX_L2TPV3_SESS_ID)},
480         {ETH_RSS_PFCP,
481                 BIT_ULL(ICE_FLOW_FIELD_IDX_PFCP_SEID)},
482         {ETH_RSS_GTPU,
483                 BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID)},
484         /* IPV4 */
485         {ETH_RSS_IPV4 | ETH_RSS_L3_SRC_ONLY,
486                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)},
487         {ETH_RSS_IPV4 | ETH_RSS_L3_DST_ONLY,
488                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)},
489         {ETH_RSS_IPV4, ICE_FLOW_HASH_IPV4},
490         {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
491                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) |
492                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
493                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)},
494         {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
495                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) |
496                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
497                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)},
498         {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_SRC_ONLY,
499                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
500                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)},
501         {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
502                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) |
503                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
504                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)},
505         {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
506                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) |
507                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
508                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)},
509         {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L3_DST_ONLY,
510                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
511                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)},
512         {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_SRC_ONLY,
513                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT) |
514                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)},
515         {ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_L4_DST_ONLY,
516                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT) |
517                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)},
518         {ETH_RSS_NONFRAG_IPV4_UDP,
519                 ICE_HASH_UDP_IPV4 |
520                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)},
521         {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
522                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) |
523                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
524                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)},
525         {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
526                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) |
527                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
528                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)},
529         {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_SRC_ONLY,
530                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
531                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)},
532         {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
533                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) |
534                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
535                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)},
536         {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
537                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) |
538                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
539                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)},
540         {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L3_DST_ONLY,
541                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
542                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)},
543         {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_SRC_ONLY,
544                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT) |
545                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)},
546         {ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_L4_DST_ONLY,
547                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT) |
548                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)},
549         {ETH_RSS_NONFRAG_IPV4_TCP,
550                 ICE_HASH_TCP_IPV4 |
551                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)},
552         {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
553                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) |
554                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
555                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)},
556         {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
557                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA) |
558                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
559                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)},
560         {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_SRC_ONLY,
561                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
562                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_SA)},
563         {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
564                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) |
565                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
566                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)},
567         {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
568                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA) |
569                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
570                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)},
571         {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L3_DST_ONLY,
572                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT) |
573                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_DA)},
574         {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_SRC_ONLY,
575                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT) |
576                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)},
577         {ETH_RSS_NONFRAG_IPV4_SCTP | ETH_RSS_L4_DST_ONLY,
578                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT) |
579                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)},
580         {ETH_RSS_NONFRAG_IPV4_SCTP,
581                 ICE_HASH_SCTP_IPV4 |
582                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV4_PROT)},
583         /* IPV6 */
584         {ETH_RSS_IPV6 | ETH_RSS_L3_SRC_ONLY,
585                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)},
586         {ETH_RSS_IPV6 | ETH_RSS_L3_DST_ONLY,
587                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)},
588         {ETH_RSS_IPV6, ICE_FLOW_HASH_IPV6},
589         {ETH_RSS_IPV6_PRE32 | ETH_RSS_L3_SRC_ONLY,
590                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA)},
591         {ETH_RSS_IPV6_PRE32 | ETH_RSS_L3_DST_ONLY,
592                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA)},
593         {ETH_RSS_IPV6_PRE32, ICE_FLOW_HASH_IPV6_PRE32},
594         {ETH_RSS_IPV6_PRE48 | ETH_RSS_L3_SRC_ONLY,
595                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA)},
596         {ETH_RSS_IPV6_PRE48 | ETH_RSS_L3_DST_ONLY,
597                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA)},
598         {ETH_RSS_IPV6_PRE48, ICE_FLOW_HASH_IPV6_PRE48},
599         {ETH_RSS_IPV6_PRE64 | ETH_RSS_L3_SRC_ONLY,
600                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA)},
601         {ETH_RSS_IPV6_PRE64 | ETH_RSS_L3_DST_ONLY,
602                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA)},
603         {ETH_RSS_IPV6_PRE64, ICE_FLOW_HASH_IPV6_PRE64},
604         {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
605                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) |
606                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
607                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)},
608         {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
609                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) |
610                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
611                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)},
612         {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_SRC_ONLY,
613                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
614                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)},
615         {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
616                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) |
617                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
618                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)},
619         {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
620                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) |
621                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
622                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)},
623         {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L3_DST_ONLY,
624                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
625                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)},
626         {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_SRC_ONLY,
627                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT) |
628                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)},
629         {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_L4_DST_ONLY,
630                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT) |
631                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)},
632         {ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_PFCP,
633                 BIT_ULL(ICE_FLOW_FIELD_IDX_PFCP_SEID)},
634         {ETH_RSS_NONFRAG_IPV6_UDP,
635                 ICE_HASH_UDP_IPV6 |
636                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)},
637         {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
638                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) |
639                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)},
640         {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
641                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) |
642                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)},
643         {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L3_SRC_ONLY,
644                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
645                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA)},
646         {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
647                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA) |
648                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)},
649         {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
650                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA) |
651                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)},
652         {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L3_DST_ONLY,
653                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
654                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA)},
655         {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L4_SRC_ONLY,
656                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)},
657         {ETH_RSS_IPV6_PRE32_UDP | ETH_RSS_L4_DST_ONLY,
658                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)},
659         {ETH_RSS_IPV6_PRE32_UDP, ICE_HASH_UDP_IPV6_PRE32},
660         {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
661                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) |
662                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)},
663         {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
664                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) |
665                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)},
666         {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L3_SRC_ONLY,
667                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
668                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA)},
669         {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
670                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA) |
671                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)},
672         {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
673                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA) |
674                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)},
675         {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L3_DST_ONLY,
676                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
677                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA)},
678         {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L4_SRC_ONLY,
679                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)},
680         {ETH_RSS_IPV6_PRE48_UDP | ETH_RSS_L4_DST_ONLY,
681                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)},
682         {ETH_RSS_IPV6_PRE48_UDP, ICE_HASH_UDP_IPV6_PRE48},
683         {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
684                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) |
685                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)},
686         {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
687                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) |
688                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)},
689         {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L3_SRC_ONLY,
690                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
691                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA)},
692         {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
693                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA) |
694                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)},
695         {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
696                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA) |
697                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)},
698         {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L3_DST_ONLY,
699                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
700                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA)},
701         {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L4_SRC_ONLY,
702                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_SRC_PORT)},
703         {ETH_RSS_IPV6_PRE64_UDP | ETH_RSS_L4_DST_ONLY,
704                 BIT_ULL(ICE_FLOW_FIELD_IDX_UDP_DST_PORT)},
705         {ETH_RSS_IPV6_PRE64_UDP, ICE_HASH_UDP_IPV6_PRE64},
706         {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
707                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) |
708                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
709                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)},
710         {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
711                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) |
712                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
713                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)},
714         {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_SRC_ONLY,
715                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
716                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)},
717         {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
718                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) |
719                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
720                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)},
721         {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
722                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) |
723                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
724                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)},
725         {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L3_DST_ONLY,
726                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
727                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)},
728         {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_SRC_ONLY,
729                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT) |
730                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)},
731         {ETH_RSS_NONFRAG_IPV6_TCP | ETH_RSS_L4_DST_ONLY,
732                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT) |
733                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)},
734         {ETH_RSS_NONFRAG_IPV6_TCP,
735                 ICE_HASH_TCP_IPV6 |
736                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)},
737         {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
738                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) |
739                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)},
740         {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
741                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) |
742                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)},
743         {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L3_SRC_ONLY,
744                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
745                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA)},
746         {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
747                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA) |
748                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)},
749         {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
750                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA) |
751                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)},
752         {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L3_DST_ONLY,
753                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
754                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA)},
755         {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L4_SRC_ONLY,
756                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)},
757         {ETH_RSS_IPV6_PRE32_TCP | ETH_RSS_L4_DST_ONLY,
758                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)},
759         {ETH_RSS_IPV6_PRE32_TCP, ICE_HASH_TCP_IPV6_PRE32},
760         {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
761                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) |
762                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)},
763         {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
764                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) |
765                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)},
766         {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L3_SRC_ONLY,
767                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
768                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA)},
769         {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
770                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA) |
771                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)},
772         {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
773                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA) |
774                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)},
775         {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L3_DST_ONLY,
776                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
777                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA)},
778         {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L4_SRC_ONLY,
779                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)},
780         {ETH_RSS_IPV6_PRE48_TCP | ETH_RSS_L4_DST_ONLY,
781                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)},
782         {ETH_RSS_IPV6_PRE48_TCP, ICE_HASH_TCP_IPV6_PRE48},
783         {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
784                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) |
785                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)},
786         {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
787                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) |
788                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)},
789         {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L3_SRC_ONLY,
790                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
791                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA)},
792         {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
793                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA) |
794                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)},
795         {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
796                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA) |
797                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)},
798         {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L3_DST_ONLY,
799                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
800                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA)},
801         {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L4_SRC_ONLY,
802                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_SRC_PORT)},
803         {ETH_RSS_IPV6_PRE64_TCP | ETH_RSS_L4_DST_ONLY,
804                 BIT_ULL(ICE_FLOW_FIELD_IDX_TCP_DST_PORT)},
805         {ETH_RSS_IPV6_PRE64_TCP, ICE_HASH_TCP_IPV6_PRE64},
806         {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
807                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) |
808                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
809                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)},
810         {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
811                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA) |
812                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
813                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)},
814         {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_SRC_ONLY,
815                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
816                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_SA)},
817         {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
818                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) |
819                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
820                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)},
821         {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
822                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA) |
823                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
824                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)},
825         {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_DST_ONLY,
826                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
827                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_DA)},
828         {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_SRC_ONLY,
829                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT) |
830                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)},
831         {ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_DST_ONLY,
832                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT) |
833                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)},
834         {ETH_RSS_NONFRAG_IPV6_SCTP,
835                 ICE_HASH_SCTP_IPV6 |
836                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT)},
837         {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
838                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) |
839                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)},
840         {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
841                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA) |
842                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)},
843         {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L3_SRC_ONLY,
844                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
845                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_SA)},
846         {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
847                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA) |
848                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)},
849         {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
850                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA) |
851                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)},
852         {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L3_DST_ONLY,
853                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
854                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE32_DA)},
855         {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L4_SRC_ONLY,
856                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)},
857         {ETH_RSS_IPV6_PRE32_SCTP | ETH_RSS_L4_DST_ONLY,
858                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)},
859         {ETH_RSS_IPV6_PRE32_SCTP, ICE_HASH_SCTP_IPV6_PRE32},
860         {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
861                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) |
862                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)},
863         {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
864                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA) |
865                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)},
866         {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L3_SRC_ONLY,
867                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
868                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_SA)},
869         {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
870                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA) |
871                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)},
872         {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
873                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA) |
874                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)},
875         {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L3_DST_ONLY,
876                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
877                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE48_DA)},
878         {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L4_SRC_ONLY,
879                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)},
880         {ETH_RSS_IPV6_PRE48_SCTP | ETH_RSS_L4_DST_ONLY,
881                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)},
882         {ETH_RSS_IPV6_PRE48_SCTP, ICE_HASH_SCTP_IPV6_PRE48},
883         {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_SRC_ONLY,
884                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) |
885                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)},
886         {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L3_SRC_ONLY | ETH_RSS_L4_DST_ONLY,
887                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA) |
888                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)},
889         {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L3_SRC_ONLY,
890                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
891                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_SA)},
892         {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_SRC_ONLY,
893                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA) |
894                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)},
895         {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L3_DST_ONLY | ETH_RSS_L4_DST_ONLY,
896                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA) |
897                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)},
898         {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L3_DST_ONLY,
899                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PROT) |
900                 BIT_ULL(ICE_FLOW_FIELD_IDX_IPV6_PRE64_DA)},
901         {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L4_SRC_ONLY,
902                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT)},
903         {ETH_RSS_IPV6_PRE64_SCTP | ETH_RSS_L4_DST_ONLY,
904                 BIT_ULL(ICE_FLOW_FIELD_IDX_SCTP_DST_PORT)},
905         {ETH_RSS_IPV6_PRE64_SCTP, ICE_HASH_SCTP_IPV6_PRE64},
906 };
907
908 static struct ice_flow_engine ice_hash_engine = {
909         .init = ice_hash_init,
910         .create = ice_hash_create,
911         .destroy = ice_hash_destroy,
912         .uninit = ice_hash_uninit,
913         .free = ice_hash_free,
914         .type = ICE_FLOW_ENGINE_HASH,
915 };
916
917 /* Register parser for os package. */
918 static struct ice_flow_parser ice_hash_parser_os = {
919         .engine = &ice_hash_engine,
920         .array = ice_hash_pattern_list_os,
921         .array_len = RTE_DIM(ice_hash_pattern_list_os),
922         .parse_pattern_action = ice_hash_parse_pattern_action,
923         .stage = ICE_FLOW_STAGE_RSS,
924 };
925
926 /* Register parser for comms package. */
927 static struct ice_flow_parser ice_hash_parser_comms = {
928         .engine = &ice_hash_engine,
929         .array = ice_hash_pattern_list_comms,
930         .array_len = RTE_DIM(ice_hash_pattern_list_comms),
931         .parse_pattern_action = ice_hash_parse_pattern_action,
932         .stage = ICE_FLOW_STAGE_RSS,
933 };
934
935 RTE_INIT(ice_hash_engine_init)
936 {
937         struct ice_flow_engine *engine = &ice_hash_engine;
938         ice_register_flow_engine(engine);
939 }
940
941 static int
942 ice_hash_init(struct ice_adapter *ad)
943 {
944         struct ice_flow_parser *parser = NULL;
945
946         if (ad->hw.dcf_enabled)
947                 return 0;
948
949         if (ad->active_pkg_type == ICE_PKG_TYPE_OS_DEFAULT)
950                 parser = &ice_hash_parser_os;
951         else if (ad->active_pkg_type == ICE_PKG_TYPE_COMMS)
952                 parser = &ice_hash_parser_comms;
953         else
954                 return -EINVAL;
955
956         return ice_register_parser(parser, ad);
957 }
958
959 static int
960 ice_hash_parse_pattern(struct ice_pattern_match_item *pattern_match_item,
961                        const struct rte_flow_item pattern[], void **meta,
962                        struct rte_flow_error *error)
963 {
964         uint32_t hdr_mask = ((struct rss_type_match_hdr *)
965                 (pattern_match_item->meta))->hdr_mask;
966         const struct rte_flow_item *item = pattern;
967         const struct rte_flow_item_gtp_psc *psc;
968         uint32_t hdrs = 0;
969
970         for (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {
971                 if (item->last) {
972                         rte_flow_error_set(error, EINVAL,
973                                         RTE_FLOW_ERROR_TYPE_ITEM, item,
974                                         "Not support range");
975                         return -rte_errno;
976                 }
977
978                 switch (item->type) {
979                 case RTE_FLOW_ITEM_TYPE_GTPU:
980                         hdrs |= ICE_FLOW_SEG_HDR_GTPU_IP;
981                         break;
982                 case RTE_FLOW_ITEM_TYPE_GTP_PSC:
983                         psc = item->spec;
984                         hdr_mask &= ~ICE_FLOW_SEG_HDR_GTPU_EH;
985                         hdrs &= ~ICE_FLOW_SEG_HDR_GTPU_IP;
986                         if (!psc)
987                                 hdrs |= ICE_FLOW_SEG_HDR_GTPU_EH;
988                         else if (psc->pdu_type == ICE_GTPU_EH_UPLINK)
989                                 hdrs |= ICE_FLOW_SEG_HDR_GTPU_UP;
990                         else if (psc->pdu_type == ICE_GTPU_EH_DWNLINK)
991                                 hdrs |= ICE_FLOW_SEG_HDR_GTPU_DWN;
992                         break;
993                 default:
994                         break;
995                 }
996         }
997
998         /* Save protocol header to rss_meta. */
999         ((struct rss_meta *)*meta)->pkt_hdr |= hdr_mask | hdrs;
1000
1001         return 0;
1002 }
1003
1004 static int
1005 ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item,
1006                 const struct rte_flow_action actions[],
1007                 void **meta,
1008                 struct rte_flow_error *error)
1009 {
1010         struct rss_type_match_hdr *m = (struct rss_type_match_hdr *)
1011                                 (pattern_match_item->meta);
1012         struct rss_meta *hash_meta = (struct rss_meta *)*meta;
1013         uint32_t type_list_len = RTE_DIM(ice_hash_type_list);
1014         enum rte_flow_action_type action_type;
1015         const struct rte_flow_action_rss *rss;
1016         const struct rte_flow_action *action;
1017         bool hash_map_found = false;
1018         uint64_t rss_attr_src_dst;
1019         uint64_t rss_attr_l3_pre;
1020         uint64_t rss_attr_symm;
1021         uint64_t rss_attr_all;
1022         uint64_t rss_type;
1023         uint16_t i;
1024
1025         /* Supported action is RSS. */
1026         for (action = actions; action->type !=
1027                 RTE_FLOW_ACTION_TYPE_END; action++) {
1028                 action_type = action->type;
1029                 switch (action_type) {
1030                 case RTE_FLOW_ACTION_TYPE_RSS:
1031                         rss = action->conf;
1032                         rss_type = rss->types;
1033
1034                         /* Check hash function and save it to rss_meta. */
1035                         if (pattern_match_item->pattern_list !=
1036                             pattern_empty && rss->func ==
1037                             RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) {
1038                                 return rte_flow_error_set(error, ENOTSUP,
1039                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
1040                                         "Not supported flow");
1041                         } else if (rss->func ==
1042                                    RTE_ETH_HASH_FUNCTION_SIMPLE_XOR){
1043                                 ((struct rss_meta *)*meta)->hash_function =
1044                                 RTE_ETH_HASH_FUNCTION_SIMPLE_XOR;
1045                                 return 0;
1046                         } else if (rss->func ==
1047                                    RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
1048                                 ((struct rss_meta *)*meta)->hash_function =
1049                                 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ;
1050                         }
1051
1052                         if (rss->level)
1053                                 return rte_flow_error_set(error, ENOTSUP,
1054                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
1055                                         "a nonzero RSS encapsulation level is not supported");
1056
1057                         if (rss->key_len)
1058                                 return rte_flow_error_set(error, ENOTSUP,
1059                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
1060                                         "a nonzero RSS key_len is not supported");
1061
1062                         if (rss->queue)
1063                                 return rte_flow_error_set(error, ENOTSUP,
1064                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
1065                                         "a non-NULL RSS queue is not supported");
1066
1067                         /**
1068                          * Check simultaneous use of SRC_ONLY and DST_ONLY
1069                          * of the same level.
1070                          */
1071                         rss_type = rte_eth_rss_hf_refine(rss_type);
1072
1073                         rss_attr_src_dst = ETH_RSS_L2_SRC_ONLY |
1074                                            ETH_RSS_L2_DST_ONLY |
1075                                            ETH_RSS_L3_SRC_ONLY |
1076                                            ETH_RSS_L3_DST_ONLY |
1077                                            ETH_RSS_L4_SRC_ONLY |
1078                                            ETH_RSS_L4_DST_ONLY;
1079
1080                         rss_attr_l3_pre = RTE_ETH_RSS_L3_PRE32 |
1081                                           RTE_ETH_RSS_L3_PRE48 |
1082                                           RTE_ETH_RSS_L3_PRE64;
1083
1084                         rss_attr_symm = ETH_RSS_IPV4 |
1085                                         ETH_RSS_NONFRAG_IPV4_UDP |
1086                                         ETH_RSS_NONFRAG_IPV4_TCP |
1087                                         ETH_RSS_NONFRAG_IPV4_SCTP |
1088                                         ETH_RSS_IPV6 |
1089                                         ETH_RSS_NONFRAG_IPV6_UDP |
1090                                         ETH_RSS_NONFRAG_IPV6_TCP |
1091                                         ETH_RSS_NONFRAG_IPV6_SCTP;
1092
1093                         rss_attr_all = rss_attr_src_dst | rss_attr_l3_pre;
1094
1095                         /* Check if only SRC/DST_ONLY or ipv6 prefix exists. */
1096                         if ((rss_type & ~rss_attr_all) == 0)
1097                                 return rte_flow_error_set(error, ENOTSUP,
1098                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
1099                                         "invalid rss types");
1100
1101                         /**
1102                          * Check if SRC/DST_ONLY is set for SYMMETRIC_TOEPLITZ
1103                          * hash function.
1104                          */
1105                         if (rss->func ==
1106                                 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {
1107                                 if (rss_type & (rss_attr_src_dst |
1108                                                 ~rss_attr_symm))
1109                                         return rte_flow_error_set(error,
1110                                                 ENOTSUP,
1111                                                 RTE_FLOW_ERROR_TYPE_ACTION,
1112                                                 action,
1113                                                 "invalid rss types");
1114                         }
1115
1116                         /* Check if rss types match pattern. */
1117                         if (rss_type & ~rss_attr_all & ~m->eth_rss_hint) {
1118                                 return rte_flow_error_set(error,
1119                                 ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION,
1120                                 action, "Not supported RSS types");
1121                         }
1122
1123                         /* Find matched hash fields according to hash type. */
1124                         for (i = 0; i < type_list_len; i++) {
1125                                 struct ice_hash_match_type *ht_map =
1126                                         &ice_hash_type_list[i];
1127
1128                                 if (rss_type == ht_map->hash_type) {
1129                                         hash_meta->hash_flds =
1130                                                         ht_map->hash_flds;
1131                                         hash_map_found = true;
1132                                         break;
1133                                 }
1134                         }
1135
1136                         if (pattern_match_item->pattern_list !=
1137                             pattern_empty && !hash_map_found) {
1138                                 return rte_flow_error_set(error, ENOTSUP,
1139                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
1140                                         "Not supported flow");
1141                         }
1142
1143                         /* update hash field for nat-t esp. */
1144                         if (rss_type == ETH_RSS_ESP &&
1145                             (m->eth_rss_hint & ETH_RSS_NONFRAG_IPV4_UDP ||
1146                              m->eth_rss_hint & ETH_RSS_NONFRAG_IPV6_UDP)) {
1147                                 hash_meta->hash_flds &=
1148                                 ~(BIT_ULL(ICE_FLOW_FIELD_IDX_ESP_SPI));
1149                                 hash_meta->hash_flds |=
1150                                 BIT_ULL(ICE_FLOW_FIELD_IDX_NAT_T_ESP_SPI);
1151                         }
1152
1153                         /* update hash field for gtpu eh/gtpu dwn/gtpu up. */
1154                         if (hash_meta->pkt_hdr & ICE_FLOW_SEG_HDR_GTPU_EH) {
1155                                 hash_meta->hash_flds &=
1156                                 ~(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID));
1157                                 hash_meta->hash_flds |=
1158                                 BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_EH_TEID);
1159                         } else if (hash_meta->pkt_hdr &
1160                                    ICE_FLOW_SEG_HDR_GTPU_DWN) {
1161                                 hash_meta->hash_flds &=
1162                                 ~(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID));
1163                                 hash_meta->hash_flds |=
1164                                 BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_DWN_TEID);
1165                         } else if (hash_meta->pkt_hdr &
1166                                    ICE_FLOW_SEG_HDR_GTPU_UP) {
1167                                 hash_meta->hash_flds &=
1168                                 ~(BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_IP_TEID));
1169                                 hash_meta->hash_flds |=
1170                                 BIT_ULL(ICE_FLOW_FIELD_IDX_GTPU_UP_TEID);
1171                         }
1172
1173                         break;
1174
1175                 case RTE_FLOW_ACTION_TYPE_END:
1176                         break;
1177
1178                 default:
1179                         rte_flow_error_set(error, EINVAL,
1180                                         RTE_FLOW_ERROR_TYPE_ACTION, action,
1181                                         "Invalid action.");
1182                         return -rte_errno;
1183                 }
1184         }
1185
1186         return 0;
1187 }
1188
1189 static int
1190 ice_hash_parse_pattern_action(__rte_unused struct ice_adapter *ad,
1191                         struct ice_pattern_match_item *array,
1192                         uint32_t array_len,
1193                         const struct rte_flow_item pattern[],
1194                         const struct rte_flow_action actions[],
1195                         void **meta,
1196                         struct rte_flow_error *error)
1197 {
1198         int ret = 0;
1199         struct ice_pattern_match_item *pattern_match_item;
1200         struct rss_meta *rss_meta_ptr;
1201
1202         rss_meta_ptr = rte_zmalloc(NULL, sizeof(*rss_meta_ptr), 0);
1203         if (!rss_meta_ptr) {
1204                 rte_flow_error_set(error, EINVAL,
1205                                 RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1206                                 "No memory for rss_meta_ptr");
1207                 return -ENOMEM;
1208         }
1209
1210         /* Check rss supported pattern and find matched pattern. */
1211         pattern_match_item = ice_search_pattern_match_item(pattern,
1212                                         array, array_len, error);
1213         if (!pattern_match_item) {
1214                 ret = -rte_errno;
1215                 goto error;
1216         }
1217
1218         ret = ice_hash_parse_pattern(pattern_match_item, pattern,
1219                                      (void **)&rss_meta_ptr, error);
1220         if (ret)
1221                 goto error;
1222
1223         /* Check rss action. */
1224         ret = ice_hash_parse_action(pattern_match_item, actions,
1225                                     (void **)&rss_meta_ptr, error);
1226
1227 error:
1228         if (!ret && meta)
1229                 *meta = rss_meta_ptr;
1230         else
1231                 rte_free(rss_meta_ptr);
1232         rte_free(pattern_match_item);
1233
1234         return ret;
1235 }
1236
1237 static int
1238 ice_hash_create(struct ice_adapter *ad,
1239                 struct rte_flow *flow,
1240                 void *meta,
1241                 struct rte_flow_error *error)
1242 {
1243         struct ice_pf *pf = &ad->pf;
1244         struct ice_hw *hw = ICE_PF_TO_HW(pf);
1245         struct ice_vsi *vsi = pf->main_vsi;
1246         int ret;
1247         uint32_t reg;
1248         struct ice_hash_flow_cfg *filter_ptr;
1249
1250         uint32_t headermask = ((struct rss_meta *)meta)->pkt_hdr;
1251         uint64_t hash_field = ((struct rss_meta *)meta)->hash_flds;
1252         uint8_t hash_function = ((struct rss_meta *)meta)->hash_function;
1253
1254         filter_ptr = rte_zmalloc("ice_rss_filter",
1255                                 sizeof(struct ice_hash_flow_cfg), 0);
1256         if (!filter_ptr) {
1257                 rte_flow_error_set(error, EINVAL,
1258                                 RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1259                                 "No memory for filter_ptr");
1260                 return -ENOMEM;
1261         }
1262
1263         if (hash_function == RTE_ETH_HASH_FUNCTION_SIMPLE_XOR) {
1264                 /* Enable registers for simple_xor hash function. */
1265                 reg = ICE_READ_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id));
1266                 reg = (reg & (~VSIQF_HASH_CTL_HASH_SCHEME_M)) |
1267                         (2 << VSIQF_HASH_CTL_HASH_SCHEME_S);
1268                 ICE_WRITE_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id), reg);
1269
1270                 filter_ptr->simple_xor = 1;
1271
1272                 goto out;
1273         } else {
1274                 filter_ptr->rss_cfg.packet_hdr = headermask;
1275                 filter_ptr->rss_cfg.hashed_flds = hash_field;
1276                 filter_ptr->rss_cfg.symm =
1277                         (hash_function ==
1278                                 RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ);
1279
1280                 ret = ice_add_rss_cfg(hw, vsi->idx,
1281                                 filter_ptr->rss_cfg.hashed_flds,
1282                                 filter_ptr->rss_cfg.packet_hdr,
1283                                 filter_ptr->rss_cfg.symm);
1284                 if (ret) {
1285                         rte_flow_error_set(error, EINVAL,
1286                                         RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1287                                         "rss flow create fail");
1288                         goto error;
1289                 }
1290         }
1291
1292 out:
1293         flow->rule = filter_ptr;
1294         rte_free(meta);
1295         return 0;
1296
1297 error:
1298         rte_free(filter_ptr);
1299         rte_free(meta);
1300         return -rte_errno;
1301 }
1302
1303 static int
1304 ice_hash_destroy(struct ice_adapter *ad,
1305                 struct rte_flow *flow,
1306                 struct rte_flow_error *error)
1307 {
1308         struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(ad);
1309         struct ice_hw *hw = ICE_PF_TO_HW(pf);
1310         struct ice_vsi *vsi = pf->main_vsi;
1311         int ret;
1312         uint32_t reg;
1313         struct ice_hash_flow_cfg *filter_ptr;
1314
1315         filter_ptr = (struct ice_hash_flow_cfg *)flow->rule;
1316
1317         if (filter_ptr->simple_xor == 1) {
1318                 /* Return to symmetric_toeplitz state. */
1319                 reg = ICE_READ_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id));
1320                 reg = (reg & (~VSIQF_HASH_CTL_HASH_SCHEME_M)) |
1321                         (1 << VSIQF_HASH_CTL_HASH_SCHEME_S);
1322                 ICE_WRITE_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id), reg);
1323         } else {
1324                 ret = ice_rem_rss_cfg(hw, vsi->idx,
1325                                 filter_ptr->rss_cfg.hashed_flds,
1326                                 filter_ptr->rss_cfg.packet_hdr);
1327                 /* Fixme: Ignore the error if a rule does not exist.
1328                  * Currently a rule for inputset change or symm turn on/off
1329                  * will overwrite an exist rule, while application still
1330                  * have 2 rte_flow handles.
1331                  **/
1332                 if (ret && ret != ICE_ERR_DOES_NOT_EXIST) {
1333                         rte_flow_error_set(error, EINVAL,
1334                                         RTE_FLOW_ERROR_TYPE_HANDLE, NULL,
1335                                         "rss flow destroy fail");
1336                         goto error;
1337                 }
1338         }
1339
1340         rte_free(filter_ptr);
1341         return 0;
1342
1343 error:
1344         rte_free(filter_ptr);
1345         return -rte_errno;
1346 }
1347
1348 static void
1349 ice_hash_uninit(struct ice_adapter *ad)
1350 {
1351         if (ad->hw.dcf_enabled)
1352                 return;
1353
1354         if (ad->active_pkg_type == ICE_PKG_TYPE_OS_DEFAULT)
1355                 ice_unregister_parser(&ice_hash_parser_os, ad);
1356         else if (ad->active_pkg_type == ICE_PKG_TYPE_COMMS)
1357                 ice_unregister_parser(&ice_hash_parser_comms, ad);
1358 }
1359
1360 static void
1361 ice_hash_free(struct rte_flow *flow)
1362 {
1363         rte_free(flow->rule);
1364 }