xref: /dpdk/drivers/net/mlx5/mlx5_flow.h (revision 6f7d6622f5ea5637a77ac03f80de9ced8e67fac9)
184c406e7SOri Kam /* SPDX-License-Identifier: BSD-3-Clause
284c406e7SOri Kam  * Copyright 2018 Mellanox Technologies, Ltd
384c406e7SOri Kam  */
484c406e7SOri Kam 
584c406e7SOri Kam #ifndef RTE_PMD_MLX5_FLOW_H_
684c406e7SOri Kam #define RTE_PMD_MLX5_FLOW_H_
784c406e7SOri Kam 
884c406e7SOri Kam #include <stdalign.h>
984c406e7SOri Kam #include <stdint.h>
1084c406e7SOri Kam #include <string.h>
1189813a52SDmitry Kozlyuk #include <sys/queue.h>
1284c406e7SOri Kam 
13f15db67dSMatan Azrad #include <rte_alarm.h>
143bd26b23SSuanming Mou #include <rte_mtr.h>
15f15db67dSMatan Azrad 
169d60f545SOphir Munk #include <mlx5_glue.h>
177b4f1e6bSMatan Azrad #include <mlx5_prm.h>
187b4f1e6bSMatan Azrad 
19f5bf91deSMoti Haimovsky #include "mlx5.h"
205f5e2f86SAlexander Kozyrev #include "rte_pmd_mlx5.h"
2122681deeSAlex Vesker #include "hws/mlx5dr.h"
22f5bf91deSMoti Haimovsky 
23a5640386SXueming Li /* E-Switch Manager port, used for rte_flow_item_port_id. */
24a5640386SXueming Li #define MLX5_PORT_ESW_MGR UINT32_MAX
25a5640386SXueming Li 
2633d506b9SShun Hao /* E-Switch Manager port, used for rte_flow_item_ethdev. */
2733d506b9SShun Hao #define MLX5_REPRESENTED_PORT_ESW_MGR UINT16_MAX
2833d506b9SShun Hao 
2970d84dc7SOri Kam /* Private rte flow items. */
3070d84dc7SOri Kam enum mlx5_rte_flow_item_type {
3170d84dc7SOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_END = INT_MIN,
3270d84dc7SOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_TAG,
3375a00812SSuanming Mou 	MLX5_RTE_FLOW_ITEM_TYPE_SQ,
3450f576d6SSuanming Mou 	MLX5_RTE_FLOW_ITEM_TYPE_VLAN,
354ec6360dSGregory Etelson 	MLX5_RTE_FLOW_ITEM_TYPE_TUNNEL,
3670d84dc7SOri Kam };
3770d84dc7SOri Kam 
38baf516beSViacheslav Ovsiienko /* Private (internal) rte flow actions. */
3970d84dc7SOri Kam enum mlx5_rte_flow_action_type {
4070d84dc7SOri Kam 	MLX5_RTE_FLOW_ACTION_TYPE_END = INT_MIN,
4170d84dc7SOri Kam 	MLX5_RTE_FLOW_ACTION_TYPE_TAG,
42dd3c774fSViacheslav Ovsiienko 	MLX5_RTE_FLOW_ACTION_TYPE_MARK,
43baf516beSViacheslav Ovsiienko 	MLX5_RTE_FLOW_ACTION_TYPE_COPY_MREG,
443c78124fSShiri Kuzin 	MLX5_RTE_FLOW_ACTION_TYPE_DEFAULT_MISS,
454ec6360dSGregory Etelson 	MLX5_RTE_FLOW_ACTION_TYPE_TUNNEL_SET,
4681073e1fSMatan Azrad 	MLX5_RTE_FLOW_ACTION_TYPE_AGE,
4751ec04dcSShun Hao 	MLX5_RTE_FLOW_ACTION_TYPE_COUNT,
48f3191849SMichael Baum 	MLX5_RTE_FLOW_ACTION_TYPE_JUMP,
497ab3962dSSuanming Mou 	MLX5_RTE_FLOW_ACTION_TYPE_RSS,
5048fbb0e9SAlexander Kozyrev 	MLX5_RTE_FLOW_ACTION_TYPE_METER_MARK,
5170d84dc7SOri Kam };
5270d84dc7SOri Kam 
53ddb68e47SBing Zhao /* Private (internal) Field IDs for MODIFY_FIELD action. */
54ddb68e47SBing Zhao enum mlx5_rte_flow_field_id {
55ddb68e47SBing Zhao 	MLX5_RTE_FLOW_FIELD_END = INT_MIN,
56ddb68e47SBing Zhao 	MLX5_RTE_FLOW_FIELD_META_REG,
57ddb68e47SBing Zhao };
58ddb68e47SBing Zhao 
5948fbb0e9SAlexander Kozyrev #define MLX5_INDIRECT_ACTION_TYPE_OFFSET 29
604a42ac1fSMatan Azrad 
61478ba4bbSSuanming Mou #define MLX5_INDIRECT_ACTION_TYPE_GET(handle) \
62478ba4bbSSuanming Mou 	(((uint32_t)(uintptr_t)(handle)) >> MLX5_INDIRECT_ACTION_TYPE_OFFSET)
63478ba4bbSSuanming Mou 
64478ba4bbSSuanming Mou #define MLX5_INDIRECT_ACTION_IDX_GET(handle) \
65478ba4bbSSuanming Mou 	(((uint32_t)(uintptr_t)(handle)) & \
66478ba4bbSSuanming Mou 	 ((1u << MLX5_INDIRECT_ACTION_TYPE_OFFSET) - 1))
67478ba4bbSSuanming Mou 
684a42ac1fSMatan Azrad enum {
694b61b877SBing Zhao 	MLX5_INDIRECT_ACTION_TYPE_RSS,
704b61b877SBing Zhao 	MLX5_INDIRECT_ACTION_TYPE_AGE,
71f3191849SMichael Baum 	MLX5_INDIRECT_ACTION_TYPE_COUNT,
722db75e8bSBing Zhao 	MLX5_INDIRECT_ACTION_TYPE_CT,
7348fbb0e9SAlexander Kozyrev 	MLX5_INDIRECT_ACTION_TYPE_METER_MARK,
7415896eafSGregory Etelson 	MLX5_INDIRECT_ACTION_TYPE_QUOTA,
754a42ac1fSMatan Azrad };
764a42ac1fSMatan Azrad 
7748fbb0e9SAlexander Kozyrev /* Now, the maximal ports will be supported is 16, action number is 32M. */
7848fbb0e9SAlexander Kozyrev #define MLX5_INDIRECT_ACT_CT_MAX_PORT 0x10
794f74cb68SBing Zhao 
804f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_OWNER_SHIFT 22
814f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_OWNER_MASK (MLX5_INDIRECT_ACT_CT_MAX_PORT - 1)
824f74cb68SBing Zhao 
8348fbb0e9SAlexander Kozyrev /* 29-31: type, 25-28: owner port, 0-24: index */
844f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_GEN_IDX(owner, index) \
854f74cb68SBing Zhao 	((MLX5_INDIRECT_ACTION_TYPE_CT << MLX5_INDIRECT_ACTION_TYPE_OFFSET) | \
864f74cb68SBing Zhao 	 (((owner) & MLX5_INDIRECT_ACT_CT_OWNER_MASK) << \
874f74cb68SBing Zhao 	  MLX5_INDIRECT_ACT_CT_OWNER_SHIFT) | (index))
884f74cb68SBing Zhao 
894f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_GET_OWNER(index) \
904f74cb68SBing Zhao 	(((index) >> MLX5_INDIRECT_ACT_CT_OWNER_SHIFT) & \
914f74cb68SBing Zhao 	 MLX5_INDIRECT_ACT_CT_OWNER_MASK)
924f74cb68SBing Zhao 
934f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_GET_IDX(index) \
944f74cb68SBing Zhao 	((index) & ((1 << MLX5_INDIRECT_ACT_CT_OWNER_SHIFT) - 1))
954f74cb68SBing Zhao 
96463170a7SSuanming Mou #define MLX5_ACTION_CTX_CT_GET_IDX  MLX5_INDIRECT_ACT_CT_GET_IDX
97463170a7SSuanming Mou #define MLX5_ACTION_CTX_CT_GET_OWNER MLX5_INDIRECT_ACT_CT_GET_OWNER
98463170a7SSuanming Mou #define MLX5_ACTION_CTX_CT_GEN_IDX MLX5_INDIRECT_ACT_CT_GEN_IDX
99463170a7SSuanming Mou 
10070d84dc7SOri Kam /* Matches on selected register. */
10170d84dc7SOri Kam struct mlx5_rte_flow_item_tag {
102baf516beSViacheslav Ovsiienko 	enum modify_reg id;
103cff811c7SViacheslav Ovsiienko 	uint32_t data;
10470d84dc7SOri Kam };
10570d84dc7SOri Kam 
10670d84dc7SOri Kam /* Modify selected register. */
10770d84dc7SOri Kam struct mlx5_rte_flow_action_set_tag {
108baf516beSViacheslav Ovsiienko 	enum modify_reg id;
109a597ef33SShun Hao 	uint8_t offset;
110a597ef33SShun Hao 	uint8_t length;
111cff811c7SViacheslav Ovsiienko 	uint32_t data;
11270d84dc7SOri Kam };
11370d84dc7SOri Kam 
114baf516beSViacheslav Ovsiienko struct mlx5_flow_action_copy_mreg {
115baf516beSViacheslav Ovsiienko 	enum modify_reg dst;
116baf516beSViacheslav Ovsiienko 	enum modify_reg src;
117baf516beSViacheslav Ovsiienko };
118baf516beSViacheslav Ovsiienko 
1193c84f34eSOri Kam /* Matches on source queue. */
12075a00812SSuanming Mou struct mlx5_rte_flow_item_sq {
12126e1eaf2SDariusz Sosnowski 	uint32_t queue; /* DevX SQ number */
1223c84f34eSOri Kam };
1233c84f34eSOri Kam 
1243e8edd0eSViacheslav Ovsiienko /* Feature name to allocate metadata register. */
1253e8edd0eSViacheslav Ovsiienko enum mlx5_feature_name {
1263e8edd0eSViacheslav Ovsiienko 	MLX5_HAIRPIN_RX,
1273e8edd0eSViacheslav Ovsiienko 	MLX5_HAIRPIN_TX,
1283e8edd0eSViacheslav Ovsiienko 	MLX5_METADATA_RX,
1293e8edd0eSViacheslav Ovsiienko 	MLX5_METADATA_TX,
1303e8edd0eSViacheslav Ovsiienko 	MLX5_METADATA_FDB,
1313e8edd0eSViacheslav Ovsiienko 	MLX5_FLOW_MARK,
1323e8edd0eSViacheslav Ovsiienko 	MLX5_APP_TAG,
1333e8edd0eSViacheslav Ovsiienko 	MLX5_COPY_MARK,
13427efd5deSSuanming Mou 	MLX5_MTR_COLOR,
13583306d6cSShun Hao 	MLX5_MTR_ID,
13631ef2982SDekel Peled 	MLX5_ASO_FLOW_HIT,
1378ebbc01fSBing Zhao 	MLX5_ASO_CONNTRACK,
138a9b6ea45SJiawei Wang 	MLX5_SAMPLE_ID,
1393e8edd0eSViacheslav Ovsiienko };
1403e8edd0eSViacheslav Ovsiienko 
1418bb81f26SXueming Li /* Default queue number. */
1428bb81f26SXueming Li #define MLX5_RSSQ_DEFAULT_NUM 16
1438bb81f26SXueming Li 
14484c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L2 (1u << 0)
14584c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3_IPV4 (1u << 1)
14684c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3_IPV6 (1u << 2)
14784c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4_UDP (1u << 3)
14884c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4_TCP (1u << 4)
14984c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_VLAN (1u << 5)
15084c406e7SOri Kam 
15184c406e7SOri Kam /* Pattern inner Layer bits. */
15284c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L2 (1u << 6)
15384c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3_IPV4 (1u << 7)
15484c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3_IPV6 (1u << 8)
15584c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4_UDP (1u << 9)
15684c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4_TCP (1u << 10)
15784c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_VLAN (1u << 11)
15884c406e7SOri Kam 
15984c406e7SOri Kam /* Pattern tunnel Layer bits. */
16084c406e7SOri Kam #define MLX5_FLOW_LAYER_VXLAN (1u << 12)
16184c406e7SOri Kam #define MLX5_FLOW_LAYER_VXLAN_GPE (1u << 13)
16284c406e7SOri Kam #define MLX5_FLOW_LAYER_GRE (1u << 14)
16384c406e7SOri Kam #define MLX5_FLOW_LAYER_MPLS (1u << 15)
164ea81c1b8SDekel Peled /* List of tunnel Layer bits continued below. */
16584c406e7SOri Kam 
1666bd7fbd0SDekel Peled /* General pattern items bits. */
1676bd7fbd0SDekel Peled #define MLX5_FLOW_ITEM_METADATA (1u << 16)
1682e4c987aSOri Kam #define MLX5_FLOW_ITEM_PORT_ID (1u << 17)
16970d84dc7SOri Kam #define MLX5_FLOW_ITEM_TAG (1u << 18)
17055deee17SViacheslav Ovsiienko #define MLX5_FLOW_ITEM_MARK (1u << 19)
1716bd7fbd0SDekel Peled 
172d53aa89aSXiaoyu Min /* Pattern MISC bits. */
17320ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_ICMP (1u << 20)
17420ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_ICMP6 (1u << 21)
17520ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_GRE_KEY (1u << 22)
176d53aa89aSXiaoyu Min 
177ea81c1b8SDekel Peled /* Pattern tunnel Layer bits (continued). */
17820ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_IPIP (1u << 23)
17920ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_IPV6_ENCAP (1u << 24)
18020ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_NVGRE (1u << 25)
18120ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_GENEVE (1u << 26)
1825e33bebdSXiaoyu Min 
1833c84f34eSOri Kam /* Queue items. */
18475a00812SSuanming Mou #define MLX5_FLOW_ITEM_SQ (1u << 27)
1853c84f34eSOri Kam 
186f31d7a01SDekel Peled /* Pattern tunnel Layer bits (continued). */
187f31d7a01SDekel Peled #define MLX5_FLOW_LAYER_GTP (1u << 28)
188f31d7a01SDekel Peled 
189c7eca236SBing Zhao /* Pattern eCPRI Layer bit. */
190c7eca236SBing Zhao #define MLX5_FLOW_LAYER_ECPRI (UINT64_C(1) << 29)
191c7eca236SBing Zhao 
1920e5a0d8fSDekel Peled /* IPv6 Fragment Extension Header bit. */
1930e5a0d8fSDekel Peled #define MLX5_FLOW_LAYER_OUTER_L3_IPV6_FRAG_EXT (1u << 30)
1940e5a0d8fSDekel Peled #define MLX5_FLOW_LAYER_INNER_L3_IPV6_FRAG_EXT (1u << 31)
1950e5a0d8fSDekel Peled 
1962c9f9617SShiri Kuzin /* Pattern tunnel Layer bits (continued). */
197f7239fceSShiri Kuzin #define MLX5_FLOW_LAYER_GENEVE_OPT (UINT64_C(1) << 32)
1982c9f9617SShiri Kuzin #define MLX5_FLOW_LAYER_GTP_PSC (UINT64_C(1) << 33)
1992c9f9617SShiri Kuzin 
20006741117SGregory Etelson /* INTEGRITY item bits */
20106741117SGregory Etelson #define MLX5_FLOW_ITEM_OUTER_INTEGRITY (UINT64_C(1) << 34)
20206741117SGregory Etelson #define MLX5_FLOW_ITEM_INNER_INTEGRITY (UINT64_C(1) << 35)
20323b0a8b2SGregory Etelson #define MLX5_FLOW_ITEM_INTEGRITY \
20423b0a8b2SGregory Etelson 	(MLX5_FLOW_ITEM_OUTER_INTEGRITY | MLX5_FLOW_ITEM_INNER_INTEGRITY)
20579f89527SGregory Etelson 
206aca19061SBing Zhao /* Conntrack item. */
20706741117SGregory Etelson #define MLX5_FLOW_LAYER_ASO_CT (UINT64_C(1) << 36)
208aca19061SBing Zhao 
209a23e9b6eSGregory Etelson /* Flex item */
21060bc2805SGregory Etelson #define MLX5_FLOW_ITEM_OUTER_FLEX (UINT64_C(1) << 37)
21160bc2805SGregory Etelson #define MLX5_FLOW_ITEM_INNER_FLEX (UINT64_C(1) << 38)
21260bc2805SGregory Etelson #define MLX5_FLOW_ITEM_FLEX_TUNNEL (UINT64_C(1) << 39)
213a23e9b6eSGregory Etelson 
21418ca4a4eSRaja Zidane /* ESP item */
21518ca4a4eSRaja Zidane #define MLX5_FLOW_ITEM_ESP (UINT64_C(1) << 40)
21618ca4a4eSRaja Zidane 
217e8146c63SSean Zhang /* Port Representor/Represented Port item */
218e8146c63SSean Zhang #define MLX5_FLOW_ITEM_PORT_REPRESENTOR (UINT64_C(1) << 41)
219e8146c63SSean Zhang #define MLX5_FLOW_ITEM_REPRESENTED_PORT (UINT64_C(1) << 42)
220e8146c63SSean Zhang 
22175a00812SSuanming Mou /* Meter color item */
22275a00812SSuanming Mou #define MLX5_FLOW_ITEM_METER_COLOR (UINT64_C(1) << 44)
22315896eafSGregory Etelson #define MLX5_FLOW_ITEM_QUOTA (UINT64_C(1) << 45)
22415896eafSGregory Etelson 
22575a00812SSuanming Mou 
22600e57916SRongwei Liu /* IPv6 routing extension item */
22700e57916SRongwei Liu #define MLX5_FLOW_ITEM_OUTER_IPV6_ROUTING_EXT (UINT64_C(1) << 45)
22800e57916SRongwei Liu #define MLX5_FLOW_ITEM_INNER_IPV6_ROUTING_EXT (UINT64_C(1) << 46)
22900e57916SRongwei Liu 
230674afdf0SJiawei Wang /* Aggregated affinity item */
231674afdf0SJiawei Wang #define MLX5_FLOW_ITEM_AGGR_AFFINITY (UINT64_C(1) << 49)
232674afdf0SJiawei Wang 
23332c2847aSDong Zhou /* IB BTH ITEM. */
23432c2847aSDong Zhou #define MLX5_FLOW_ITEM_IB_BTH (1ull << 51)
23532c2847aSDong Zhou 
236*6f7d6622SHaifei Luo /* NSH ITEM */
237*6f7d6622SHaifei Luo #define MLX5_FLOW_ITEM_NSH (1ull << 53)
238*6f7d6622SHaifei Luo 
23984c406e7SOri Kam /* Outer Masks. */
24084c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3 \
24184c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_OUTER_L3_IPV6)
24284c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4 \
24384c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L4_UDP | MLX5_FLOW_LAYER_OUTER_L4_TCP)
24484c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER \
24584c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_OUTER_L3 | \
24684c406e7SOri Kam 	 MLX5_FLOW_LAYER_OUTER_L4)
24784c406e7SOri Kam 
24884c406e7SOri Kam /* Tunnel Masks. */
24984c406e7SOri Kam #define MLX5_FLOW_LAYER_TUNNEL \
25084c406e7SOri Kam 	(MLX5_FLOW_LAYER_VXLAN | MLX5_FLOW_LAYER_VXLAN_GPE | \
251ea81c1b8SDekel Peled 	 MLX5_FLOW_LAYER_GRE | MLX5_FLOW_LAYER_NVGRE | MLX5_FLOW_LAYER_MPLS | \
252e59a5dbcSMoti Haimovsky 	 MLX5_FLOW_LAYER_IPIP | MLX5_FLOW_LAYER_IPV6_ENCAP | \
253a23e9b6eSGregory Etelson 	 MLX5_FLOW_LAYER_GENEVE | MLX5_FLOW_LAYER_GTP | \
254a23e9b6eSGregory Etelson 	 MLX5_FLOW_ITEM_FLEX_TUNNEL)
25584c406e7SOri Kam 
25684c406e7SOri Kam /* Inner Masks. */
25784c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3 \
25884c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV6)
25984c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4 \
26084c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L4_UDP | MLX5_FLOW_LAYER_INNER_L4_TCP)
26184c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER \
26284c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L2 | MLX5_FLOW_LAYER_INNER_L3 | \
26384c406e7SOri Kam 	 MLX5_FLOW_LAYER_INNER_L4)
26484c406e7SOri Kam 
2654bb14c83SDekel Peled /* Layer Masks. */
2664bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L2 \
2674bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_INNER_L2)
2684bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV4 \
2694bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV4)
2704bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV6 \
2714bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV6 | MLX5_FLOW_LAYER_INNER_L3_IPV6)
2724bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3 \
2734bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_L3_IPV4 | MLX5_FLOW_LAYER_L3_IPV6)
2744bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L4 \
2754bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L4 | MLX5_FLOW_LAYER_INNER_L4)
2764bb14c83SDekel Peled 
27784c406e7SOri Kam /* Actions */
278e5517406SShun Hao #define MLX5_FLOW_ACTION_DROP (1ull << 0)
279e5517406SShun Hao #define MLX5_FLOW_ACTION_QUEUE (1ull << 1)
280e5517406SShun Hao #define MLX5_FLOW_ACTION_RSS (1ull << 2)
281e5517406SShun Hao #define MLX5_FLOW_ACTION_FLAG (1ull << 3)
282e5517406SShun Hao #define MLX5_FLOW_ACTION_MARK (1ull << 4)
283e5517406SShun Hao #define MLX5_FLOW_ACTION_COUNT (1ull << 5)
284e5517406SShun Hao #define MLX5_FLOW_ACTION_PORT_ID (1ull << 6)
285e5517406SShun Hao #define MLX5_FLOW_ACTION_OF_POP_VLAN (1ull << 7)
286e5517406SShun Hao #define MLX5_FLOW_ACTION_OF_PUSH_VLAN (1ull << 8)
287e5517406SShun Hao #define MLX5_FLOW_ACTION_OF_SET_VLAN_VID (1ull << 9)
288e5517406SShun Hao #define MLX5_FLOW_ACTION_OF_SET_VLAN_PCP (1ull << 10)
289e5517406SShun Hao #define MLX5_FLOW_ACTION_SET_IPV4_SRC (1ull << 11)
290e5517406SShun Hao #define MLX5_FLOW_ACTION_SET_IPV4_DST (1ull << 12)
291e5517406SShun Hao #define MLX5_FLOW_ACTION_SET_IPV6_SRC (1ull << 13)
292e5517406SShun Hao #define MLX5_FLOW_ACTION_SET_IPV6_DST (1ull << 14)
293e5517406SShun Hao #define MLX5_FLOW_ACTION_SET_TP_SRC (1ull << 15)
294e5517406SShun Hao #define MLX5_FLOW_ACTION_SET_TP_DST (1ull << 16)
295e5517406SShun Hao #define MLX5_FLOW_ACTION_JUMP (1ull << 17)
296e5517406SShun Hao #define MLX5_FLOW_ACTION_SET_TTL (1ull << 18)
297e5517406SShun Hao #define MLX5_FLOW_ACTION_DEC_TTL (1ull << 19)
298e5517406SShun Hao #define MLX5_FLOW_ACTION_SET_MAC_SRC (1ull << 20)
299e5517406SShun Hao #define MLX5_FLOW_ACTION_SET_MAC_DST (1ull << 21)
300e5517406SShun Hao #define MLX5_FLOW_ACTION_ENCAP (1ull << 22)
301e5517406SShun Hao #define MLX5_FLOW_ACTION_DECAP (1ull << 23)
302e5517406SShun Hao #define MLX5_FLOW_ACTION_INC_TCP_SEQ (1ull << 24)
303e5517406SShun Hao #define MLX5_FLOW_ACTION_DEC_TCP_SEQ (1ull << 25)
304e5517406SShun Hao #define MLX5_FLOW_ACTION_INC_TCP_ACK (1ull << 26)
305e5517406SShun Hao #define MLX5_FLOW_ACTION_DEC_TCP_ACK (1ull << 27)
30606387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_TAG (1ull << 28)
30706387be8SMatan Azrad #define MLX5_FLOW_ACTION_MARK_EXT (1ull << 29)
30806387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_META (1ull << 30)
30906387be8SMatan Azrad #define MLX5_FLOW_ACTION_METER (1ull << 31)
31006387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_IPV4_DSCP (1ull << 32)
31106387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_IPV6_DSCP (1ull << 33)
312fa2d01c8SDong Zhou #define MLX5_FLOW_ACTION_AGE (1ull << 34)
3133c78124fSShiri Kuzin #define MLX5_FLOW_ACTION_DEFAULT_MISS (1ull << 35)
31496b1f027SJiawei Wang #define MLX5_FLOW_ACTION_SAMPLE (1ull << 36)
3154ec6360dSGregory Etelson #define MLX5_FLOW_ACTION_TUNNEL_SET (1ull << 37)
3164ec6360dSGregory Etelson #define MLX5_FLOW_ACTION_TUNNEL_MATCH (1ull << 38)
317641dbe4fSAlexander Kozyrev #define MLX5_FLOW_ACTION_MODIFY_FIELD (1ull << 39)
31844432018SLi Zhang #define MLX5_FLOW_ACTION_METER_WITH_TERMINATED_POLICY (1ull << 40)
3192d084f69SBing Zhao #define MLX5_FLOW_ACTION_CT (1ull << 41)
32025c4d6dfSMichael Savisko #define MLX5_FLOW_ACTION_SEND_TO_KERNEL (1ull << 42)
32104a4de75SMichael Baum #define MLX5_FLOW_ACTION_INDIRECT_COUNT (1ull << 43)
32204a4de75SMichael Baum #define MLX5_FLOW_ACTION_INDIRECT_AGE (1ull << 44)
32315896eafSGregory Etelson #define MLX5_FLOW_ACTION_QUOTA (1ull << 46)
32484c406e7SOri Kam 
325e2b05b22SShun Hao #define MLX5_FLOW_DROP_INCLUSIVE_ACTIONS \
326e2b05b22SShun Hao 	(MLX5_FLOW_ACTION_COUNT | MLX5_FLOW_ACTION_SAMPLE | MLX5_FLOW_ACTION_AGE)
327e2b05b22SShun Hao 
32884c406e7SOri Kam #define MLX5_FLOW_FATE_ACTIONS \
329684b9a1bSOri Kam 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_QUEUE | \
3303c78124fSShiri Kuzin 	 MLX5_FLOW_ACTION_RSS | MLX5_FLOW_ACTION_JUMP | \
33144432018SLi Zhang 	 MLX5_FLOW_ACTION_DEFAULT_MISS | \
33225c4d6dfSMichael Savisko 	 MLX5_FLOW_ACTION_METER_WITH_TERMINATED_POLICY | \
33325c4d6dfSMichael Savisko 	 MLX5_FLOW_ACTION_SEND_TO_KERNEL)
33484c406e7SOri Kam 
3352e4c987aSOri Kam #define MLX5_FLOW_FATE_ESWITCH_ACTIONS \
3362e4c987aSOri Kam 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_PORT_ID | \
337b2cd3918SJiawei Wang 	 MLX5_FLOW_ACTION_SEND_TO_KERNEL | \
33844432018SLi Zhang 	 MLX5_FLOW_ACTION_JUMP | MLX5_FLOW_ACTION_METER_WITH_TERMINATED_POLICY)
3394b8727f0SDekel Peled 
3404bb14c83SDekel Peled #define MLX5_FLOW_MODIFY_HDR_ACTIONS (MLX5_FLOW_ACTION_SET_IPV4_SRC | \
3414bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV4_DST | \
3424bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV6_SRC | \
3434bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV6_DST | \
3444bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TP_SRC | \
3454bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TP_DST | \
3464bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TTL | \
3474bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_DEC_TTL | \
3484bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_MAC_SRC | \
349585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_SET_MAC_DST | \
350585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_INC_TCP_SEQ | \
351585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_DEC_TCP_SEQ | \
352585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_INC_TCP_ACK | \
3535f163d52SMoti Haimovsky 				      MLX5_FLOW_ACTION_DEC_TCP_ACK | \
35470d84dc7SOri Kam 				      MLX5_FLOW_ACTION_OF_SET_VLAN_VID | \
35555deee17SViacheslav Ovsiienko 				      MLX5_FLOW_ACTION_SET_TAG | \
356fcc8d2f7SViacheslav Ovsiienko 				      MLX5_FLOW_ACTION_MARK_EXT | \
3576f26e604SSuanming Mou 				      MLX5_FLOW_ACTION_SET_META | \
3586f26e604SSuanming Mou 				      MLX5_FLOW_ACTION_SET_IPV4_DSCP | \
359641dbe4fSAlexander Kozyrev 				      MLX5_FLOW_ACTION_SET_IPV6_DSCP | \
360641dbe4fSAlexander Kozyrev 				      MLX5_FLOW_ACTION_MODIFY_FIELD)
3614bb14c83SDekel Peled 
3629aee7a84SMoti Haimovsky #define MLX5_FLOW_VLAN_ACTIONS (MLX5_FLOW_ACTION_OF_POP_VLAN | \
3639aee7a84SMoti Haimovsky 				MLX5_FLOW_ACTION_OF_PUSH_VLAN)
36406387be8SMatan Azrad 
36506387be8SMatan Azrad #define MLX5_FLOW_XCAP_ACTIONS (MLX5_FLOW_ACTION_ENCAP | MLX5_FLOW_ACTION_DECAP)
36606387be8SMatan Azrad 
36784c406e7SOri Kam #ifndef IPPROTO_MPLS
36884c406e7SOri Kam #define IPPROTO_MPLS 137
36984c406e7SOri Kam #endif
37084c406e7SOri Kam 
371d1abe664SDekel Peled /* UDP port number for MPLS */
372d1abe664SDekel Peled #define MLX5_UDP_PORT_MPLS 6635
373d1abe664SDekel Peled 
374fc2c498cSOri Kam /* UDP port numbers for VxLAN. */
375fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN 4789
376fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN_GPE 4790
377fc2c498cSOri Kam 
37832c2847aSDong Zhou /* UDP port numbers for RoCEv2. */
37932c2847aSDong Zhou #define MLX5_UDP_PORT_ROCEv2 4791
38032c2847aSDong Zhou 
381e59a5dbcSMoti Haimovsky /* UDP port numbers for GENEVE. */
382e59a5dbcSMoti Haimovsky #define MLX5_UDP_PORT_GENEVE 6081
383e59a5dbcSMoti Haimovsky 
3845f8ae44dSDong Zhou /* Lowest priority indicator. */
3855f8ae44dSDong Zhou #define MLX5_FLOW_LOWEST_PRIO_INDICATOR ((uint32_t)-1)
3865f8ae44dSDong Zhou 
3875f8ae44dSDong Zhou /*
3885f8ae44dSDong Zhou  * Max priority for ingress\egress flow groups
3895f8ae44dSDong Zhou  * greater than 0 and for any transfer flow group.
3905f8ae44dSDong Zhou  * From user configation: 0 - 21843.
3915f8ae44dSDong Zhou  */
3925f8ae44dSDong Zhou #define MLX5_NON_ROOT_FLOW_MAX_PRIO	(21843 + 1)
39384c406e7SOri Kam 
39484c406e7SOri Kam /*
39584c406e7SOri Kam  * Number of sub priorities.
39684c406e7SOri Kam  * For each kind of pattern matching i.e. L2, L3, L4 to have a correct
39784c406e7SOri Kam  * matching on the NIC (firmware dependent) L4 most have the higher priority
39884c406e7SOri Kam  * followed by L3 and ending with L2.
39984c406e7SOri Kam  */
40084c406e7SOri Kam #define MLX5_PRIORITY_MAP_L2 2
40184c406e7SOri Kam #define MLX5_PRIORITY_MAP_L3 1
40284c406e7SOri Kam #define MLX5_PRIORITY_MAP_L4 0
40384c406e7SOri Kam #define MLX5_PRIORITY_MAP_MAX 3
40484c406e7SOri Kam 
405fc2c498cSOri Kam /* Valid layer type for IPV4 RSS. */
406fc2c498cSOri Kam #define MLX5_IPV4_LAYER_TYPES \
407295968d1SFerruh Yigit 	(RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_FRAG_IPV4 | \
408295968d1SFerruh Yigit 	 RTE_ETH_RSS_NONFRAG_IPV4_TCP | RTE_ETH_RSS_NONFRAG_IPV4_UDP | \
409295968d1SFerruh Yigit 	 RTE_ETH_RSS_NONFRAG_IPV4_OTHER)
410fc2c498cSOri Kam 
411fc2c498cSOri Kam /* IBV hash source bits  for IPV4. */
412fc2c498cSOri Kam #define MLX5_IPV4_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4)
413fc2c498cSOri Kam 
414fc2c498cSOri Kam /* Valid layer type for IPV6 RSS. */
415fc2c498cSOri Kam #define MLX5_IPV6_LAYER_TYPES \
416295968d1SFerruh Yigit 	(RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_FRAG_IPV6 | RTE_ETH_RSS_NONFRAG_IPV6_TCP | \
417295968d1SFerruh Yigit 	 RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_IPV6_EX  | RTE_ETH_RSS_IPV6_TCP_EX | \
418295968d1SFerruh Yigit 	 RTE_ETH_RSS_IPV6_UDP_EX | RTE_ETH_RSS_NONFRAG_IPV6_OTHER)
419fc2c498cSOri Kam 
420fc2c498cSOri Kam /* IBV hash source bits  for IPV6. */
421fc2c498cSOri Kam #define MLX5_IPV6_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6)
422fc2c498cSOri Kam 
423c3e33304SDekel Peled /* IBV hash bits for L3 SRC. */
424c3e33304SDekel Peled #define MLX5_L3_SRC_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_SRC_IPV6)
425c3e33304SDekel Peled 
426c3e33304SDekel Peled /* IBV hash bits for L3 DST. */
427c3e33304SDekel Peled #define MLX5_L3_DST_IBV_RX_HASH (IBV_RX_HASH_DST_IPV4 | IBV_RX_HASH_DST_IPV6)
428c3e33304SDekel Peled 
429c3e33304SDekel Peled /* IBV hash bits for TCP. */
430c3e33304SDekel Peled #define MLX5_TCP_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_TCP | \
431c3e33304SDekel Peled 			      IBV_RX_HASH_DST_PORT_TCP)
432c3e33304SDekel Peled 
433c3e33304SDekel Peled /* IBV hash bits for UDP. */
434c3e33304SDekel Peled #define MLX5_UDP_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_UDP | \
435c3e33304SDekel Peled 			      IBV_RX_HASH_DST_PORT_UDP)
436c3e33304SDekel Peled 
437c3e33304SDekel Peled /* IBV hash bits for L4 SRC. */
438c3e33304SDekel Peled #define MLX5_L4_SRC_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_TCP | \
439c3e33304SDekel Peled 				 IBV_RX_HASH_SRC_PORT_UDP)
440c3e33304SDekel Peled 
441c3e33304SDekel Peled /* IBV hash bits for L4 DST. */
442c3e33304SDekel Peled #define MLX5_L4_DST_IBV_RX_HASH (IBV_RX_HASH_DST_PORT_TCP | \
443c3e33304SDekel Peled 				 IBV_RX_HASH_DST_PORT_UDP)
444e59a5dbcSMoti Haimovsky 
445e59a5dbcSMoti Haimovsky /* Geneve header first 16Bit */
446e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_MASK 0x3
447e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_SHIFT 14
448e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_VAL(a) \
449e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_VER_SHIFT)) & (MLX5_GENEVE_VER_MASK))
450e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_MASK 0x3F
451e440d6cfSShiri Kuzin #define MLX5_GENEVE_OPTLEN_SHIFT 8
452e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_VAL(a) \
453e59a5dbcSMoti Haimovsky 	    (((a) >> (MLX5_GENEVE_OPTLEN_SHIFT)) & (MLX5_GENEVE_OPTLEN_MASK))
454e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_MASK 0x1
455e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_SHIFT 7
456e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_VAL(a) \
457e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_OAMF_SHIFT)) & (MLX5_GENEVE_OAMF_MASK))
458e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_MASK 0x1
459e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_SHIFT 6
460e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_VAL(a) \
461e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_CRITO_SHIFT)) & (MLX5_GENEVE_CRITO_MASK))
462e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_MASK 0x3F
463e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_VAL(a) ((a) & (MLX5_GENEVE_RSVD_MASK))
464e59a5dbcSMoti Haimovsky /*
465e59a5dbcSMoti Haimovsky  * The length of the Geneve options fields, expressed in four byte multiples,
466e59a5dbcSMoti Haimovsky  * not including the eight byte fixed tunnel.
467e59a5dbcSMoti Haimovsky  */
468e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_0 14
469e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_1 63
470e59a5dbcSMoti Haimovsky 
471f9210259SViacheslav Ovsiienko #define MLX5_ENCAPSULATION_DECISION_SIZE (sizeof(struct rte_ether_hdr) + \
472f9210259SViacheslav Ovsiienko 					  sizeof(struct rte_ipv4_hdr))
4732c9f9617SShiri Kuzin /* GTP extension header flag. */
4742c9f9617SShiri Kuzin #define MLX5_GTP_EXT_HEADER_FLAG 4
4752c9f9617SShiri Kuzin 
47606cd4cf6SShiri Kuzin /* GTP extension header PDU type shift. */
47706cd4cf6SShiri Kuzin #define MLX5_GTP_PDU_TYPE_SHIFT(a) ((a) << 4)
47806cd4cf6SShiri Kuzin 
4796859e67eSDekel Peled /* IPv4 fragment_offset field contains relevant data in bits 2 to 15. */
4806859e67eSDekel Peled #define MLX5_IPV4_FRAG_OFFSET_MASK \
4816859e67eSDekel Peled 		(RTE_IPV4_HDR_OFFSET_MASK | RTE_IPV4_HDR_MF_FLAG)
4826859e67eSDekel Peled 
4836859e67eSDekel Peled /* Specific item's fields can accept a range of values (using spec and last). */
4846859e67eSDekel Peled #define MLX5_ITEM_RANGE_NOT_ACCEPTED	false
4856859e67eSDekel Peled #define MLX5_ITEM_RANGE_ACCEPTED	true
4866859e67eSDekel Peled 
48772a944dbSBing Zhao /* Software header modify action numbers of a flow. */
48872a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_IPV4		1
48972a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_IPV6		4
49072a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_MAC		2
49172a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_VID		1
492ea7cc15aSDmitry Kozlyuk #define MLX5_ACT_NUM_MDF_PORT		1
49372a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_TTL		1
49472a944dbSBing Zhao #define MLX5_ACT_NUM_DEC_TTL		MLX5_ACT_NUM_MDF_TTL
49572a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_TCPSEQ		1
49672a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_TCPACK		1
49772a944dbSBing Zhao #define MLX5_ACT_NUM_SET_REG		1
49872a944dbSBing Zhao #define MLX5_ACT_NUM_SET_TAG		1
49972a944dbSBing Zhao #define MLX5_ACT_NUM_CPY_MREG		MLX5_ACT_NUM_SET_TAG
50072a944dbSBing Zhao #define MLX5_ACT_NUM_SET_MARK		MLX5_ACT_NUM_SET_TAG
50172a944dbSBing Zhao #define MLX5_ACT_NUM_SET_META		MLX5_ACT_NUM_SET_TAG
50272a944dbSBing Zhao #define MLX5_ACT_NUM_SET_DSCP		1
50372a944dbSBing Zhao 
504641dbe4fSAlexander Kozyrev /* Maximum number of fields to modify in MODIFY_FIELD */
505641dbe4fSAlexander Kozyrev #define MLX5_ACT_MAX_MOD_FIELDS 5
506641dbe4fSAlexander Kozyrev 
5075cac1a5cSBing Zhao /* Syndrome bits definition for connection tracking. */
5085cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_VALID		(0x0 << 6)
5095cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_INVALID	(0x1 << 6)
5105cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_TRAP		(0x2 << 6)
5115cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_STATE_CHANGE	(0x1 << 1)
5125cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_BAD_PACKET	(0x1 << 0)
5135cac1a5cSBing Zhao 
5140c76d1c9SYongseok Koh enum mlx5_flow_drv_type {
5150c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_MIN,
5160c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_DV,
5170c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_VERBS,
5182b679150SSuanming Mou 	MLX5_FLOW_TYPE_HW,
5190c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_MAX,
5200c76d1c9SYongseok Koh };
5210c76d1c9SYongseok Koh 
522488d13abSSuanming Mou /* Fate action type. */
523488d13abSSuanming Mou enum mlx5_flow_fate_type {
524488d13abSSuanming Mou 	MLX5_FLOW_FATE_NONE, /* Egress flow. */
525488d13abSSuanming Mou 	MLX5_FLOW_FATE_QUEUE,
526488d13abSSuanming Mou 	MLX5_FLOW_FATE_JUMP,
527488d13abSSuanming Mou 	MLX5_FLOW_FATE_PORT_ID,
528488d13abSSuanming Mou 	MLX5_FLOW_FATE_DROP,
5293c78124fSShiri Kuzin 	MLX5_FLOW_FATE_DEFAULT_MISS,
530fabf8a37SSuanming Mou 	MLX5_FLOW_FATE_SHARED_RSS,
53150cc92ddSShun Hao 	MLX5_FLOW_FATE_MTR,
53225c4d6dfSMichael Savisko 	MLX5_FLOW_FATE_SEND_TO_KERNEL,
533488d13abSSuanming Mou 	MLX5_FLOW_FATE_MAX,
534488d13abSSuanming Mou };
535488d13abSSuanming Mou 
536865a0c15SOri Kam /* Matcher PRM representation */
537865a0c15SOri Kam struct mlx5_flow_dv_match_params {
538865a0c15SOri Kam 	size_t size;
539865a0c15SOri Kam 	/**< Size of match value. Do NOT split size and key! */
540865a0c15SOri Kam 	uint32_t buf[MLX5_ST_SZ_DW(fte_match_param)];
541865a0c15SOri Kam 	/**< Matcher value. This value is used as the mask or as a key. */
542865a0c15SOri Kam };
543865a0c15SOri Kam 
544865a0c15SOri Kam /* Matcher structure. */
545865a0c15SOri Kam struct mlx5_flow_dv_matcher {
546e78e5408SMatan Azrad 	struct mlx5_list_entry entry; /**< Pointer to the next element. */
547e9e36e52SBing Zhao 	struct mlx5_flow_tbl_resource *tbl;
548e9e36e52SBing Zhao 	/**< Pointer to the table(group) the matcher associated with. */
549865a0c15SOri Kam 	void *matcher_object; /**< Pointer to DV matcher */
550865a0c15SOri Kam 	uint16_t crc; /**< CRC of key. */
551865a0c15SOri Kam 	uint16_t priority; /**< Priority of matcher. */
552865a0c15SOri Kam 	struct mlx5_flow_dv_match_params mask; /**< Matcher mask. */
553865a0c15SOri Kam };
554865a0c15SOri Kam 
5554bb14c83SDekel Peled #define MLX5_ENCAP_MAX_LEN 132
5564bb14c83SDekel Peled 
557c513f05cSDekel Peled /* Encap/decap resource structure. */
558c513f05cSDekel Peled struct mlx5_flow_dv_encap_decap_resource {
559961b6774SMatan Azrad 	struct mlx5_list_entry entry;
560c513f05cSDekel Peled 	/* Pointer to next element. */
561cf7d1995SAlexander Kozyrev 	uint32_t refcnt; /**< Reference counter. */
5626ad7cfaaSDekel Peled 	void *action;
5636ad7cfaaSDekel Peled 	/**< Encap/decap action object. */
564c513f05cSDekel Peled 	uint8_t buf[MLX5_ENCAP_MAX_LEN];
565c513f05cSDekel Peled 	size_t size;
566c513f05cSDekel Peled 	uint8_t reformat_type;
567c513f05cSDekel Peled 	uint8_t ft_type;
5684f84a197SOri Kam 	uint64_t flags; /**< Flags for RDMA API. */
569bf615b07SSuanming Mou 	uint32_t idx; /**< Index for the index memory pool. */
570c513f05cSDekel Peled };
571c513f05cSDekel Peled 
572cbb66daaSOri Kam /* Tag resource structure. */
573cbb66daaSOri Kam struct mlx5_flow_dv_tag_resource {
574961b6774SMatan Azrad 	struct mlx5_list_entry entry;
575e484e403SBing Zhao 	/**< hash list entry for tag resource, tag value as the key. */
576cbb66daaSOri Kam 	void *action;
5776ad7cfaaSDekel Peled 	/**< Tag action object. */
578cf7d1995SAlexander Kozyrev 	uint32_t refcnt; /**< Reference counter. */
5795f114269SSuanming Mou 	uint32_t idx; /**< Index for the index memory pool. */
580f5b0aed2SSuanming Mou 	uint32_t tag_id; /**< Tag ID. */
581cbb66daaSOri Kam };
582cbb66daaSOri Kam 
5834bb14c83SDekel Peled /* Modify resource structure */
5844bb14c83SDekel Peled struct mlx5_flow_dv_modify_hdr_resource {
585961b6774SMatan Azrad 	struct mlx5_list_entry entry;
58616a7dbc4SXueming Li 	void *action; /**< Modify header action object. */
5874f3d8d0eSMatan Azrad 	uint32_t idx;
58816a7dbc4SXueming Li 	/* Key area for hash list matching: */
5894bb14c83SDekel Peled 	uint8_t ft_type; /**< Flow table type, Rx or Tx. */
590e681eb05SMatan Azrad 	uint8_t actions_num; /**< Number of modification actions. */
591e681eb05SMatan Azrad 	bool root; /**< Whether action is in root table. */
592024e9575SBing Zhao 	struct mlx5_modification_cmd actions[];
593024e9575SBing Zhao 	/**< Modification actions. */
594e681eb05SMatan Azrad } __rte_packed;
5954bb14c83SDekel Peled 
5963fe88961SSuanming Mou /* Modify resource key of the hash organization. */
5973fe88961SSuanming Mou union mlx5_flow_modify_hdr_key {
5983fe88961SSuanming Mou 	struct {
5993fe88961SSuanming Mou 		uint32_t ft_type:8;	/**< Flow table type, Rx or Tx. */
6003fe88961SSuanming Mou 		uint32_t actions_num:5;	/**< Number of modification actions. */
6013fe88961SSuanming Mou 		uint32_t group:19;	/**< Flow group id. */
6023fe88961SSuanming Mou 		uint32_t cksum;		/**< Actions check sum. */
6033fe88961SSuanming Mou 	};
6043fe88961SSuanming Mou 	uint64_t v64;			/**< full 64bits value of key */
6053fe88961SSuanming Mou };
6063fe88961SSuanming Mou 
607684b9a1bSOri Kam /* Jump action resource structure. */
608684b9a1bSOri Kam struct mlx5_flow_dv_jump_tbl_resource {
6096c1d9a64SBing Zhao 	void *action; /**< Pointer to the rdma core action. */
610684b9a1bSOri Kam };
611684b9a1bSOri Kam 
612c269b517SOri Kam /* Port ID resource structure. */
613c269b517SOri Kam struct mlx5_flow_dv_port_id_action_resource {
614e78e5408SMatan Azrad 	struct mlx5_list_entry entry;
6150fd5f82aSXueming Li 	void *action; /**< Action object. */
616c269b517SOri Kam 	uint32_t port_id; /**< Port ID value. */
6170fd5f82aSXueming Li 	uint32_t idx; /**< Indexed pool memory index. */
618c269b517SOri Kam };
619c269b517SOri Kam 
6209aee7a84SMoti Haimovsky /* Push VLAN action resource structure */
6219aee7a84SMoti Haimovsky struct mlx5_flow_dv_push_vlan_action_resource {
622e78e5408SMatan Azrad 	struct mlx5_list_entry entry; /* Cache entry. */
6236ad7cfaaSDekel Peled 	void *action; /**< Action object. */
6249aee7a84SMoti Haimovsky 	uint8_t ft_type; /**< Flow table type, Rx, Tx or FDB. */
6259aee7a84SMoti Haimovsky 	rte_be32_t vlan_tag; /**< VLAN tag value. */
6263422af2aSXueming Li 	uint32_t idx; /**< Indexed pool memory index. */
6279aee7a84SMoti Haimovsky };
6289aee7a84SMoti Haimovsky 
629dd3c774fSViacheslav Ovsiienko /* Metadata register copy table entry. */
630dd3c774fSViacheslav Ovsiienko struct mlx5_flow_mreg_copy_resource {
631dd3c774fSViacheslav Ovsiienko 	/*
632dd3c774fSViacheslav Ovsiienko 	 * Hash list entry for copy table.
633dd3c774fSViacheslav Ovsiienko 	 *  - Key is 32/64-bit MARK action ID.
634dd3c774fSViacheslav Ovsiienko 	 *  - MUST be the first entry.
635dd3c774fSViacheslav Ovsiienko 	 */
636961b6774SMatan Azrad 	struct mlx5_list_entry hlist_ent;
637dd3c774fSViacheslav Ovsiienko 	LIST_ENTRY(mlx5_flow_mreg_copy_resource) next;
638dd3c774fSViacheslav Ovsiienko 	/* List entry for device flows. */
63990e6053aSSuanming Mou 	uint32_t idx;
640ab612adcSSuanming Mou 	uint32_t rix_flow; /* Built flow for copy. */
641f5b0aed2SSuanming Mou 	uint32_t mark_id;
642dd3c774fSViacheslav Ovsiienko };
643dd3c774fSViacheslav Ovsiienko 
644afd7a625SXueming Li /* Table tunnel parameter. */
645afd7a625SXueming Li struct mlx5_flow_tbl_tunnel_prm {
646afd7a625SXueming Li 	const struct mlx5_flow_tunnel *tunnel;
647afd7a625SXueming Li 	uint32_t group_id;
648afd7a625SXueming Li 	bool external;
649afd7a625SXueming Li };
650afd7a625SXueming Li 
651860897d2SBing Zhao /* Table data structure of the hash organization. */
652860897d2SBing Zhao struct mlx5_flow_tbl_data_entry {
653961b6774SMatan Azrad 	struct mlx5_list_entry entry;
654e9e36e52SBing Zhao 	/**< hash list entry, 64-bits key inside. */
655860897d2SBing Zhao 	struct mlx5_flow_tbl_resource tbl;
656e9e36e52SBing Zhao 	/**< flow table resource. */
657679f46c7SMatan Azrad 	struct mlx5_list *matchers;
658e9e36e52SBing Zhao 	/**< matchers' header associated with the flow table. */
6596c1d9a64SBing Zhao 	struct mlx5_flow_dv_jump_tbl_resource jump;
6606c1d9a64SBing Zhao 	/**< jump resource, at most one for each table created. */
6617ac99475SSuanming Mou 	uint32_t idx; /**< index for the indexed mempool. */
6624ec6360dSGregory Etelson 	/**< tunnel offload */
6634ec6360dSGregory Etelson 	const struct mlx5_flow_tunnel *tunnel;
6644ec6360dSGregory Etelson 	uint32_t group_id;
665f5b0aed2SSuanming Mou 	uint32_t external:1;
6667be78d02SJosh Soref 	uint32_t tunnel_offload:1; /* Tunnel offload table or not. */
667f5b0aed2SSuanming Mou 	uint32_t is_egress:1; /**< Egress table. */
668f5b0aed2SSuanming Mou 	uint32_t is_transfer:1; /**< Transfer table. */
669f5b0aed2SSuanming Mou 	uint32_t dummy:1; /**<  DR table. */
6702d2cef5dSLi Zhang 	uint32_t id:22; /**< Table ID. */
6712d2cef5dSLi Zhang 	uint32_t reserve:5; /**< Reserved to future using. */
6722d2cef5dSLi Zhang 	uint32_t level; /**< Table level. */
673860897d2SBing Zhao };
674860897d2SBing Zhao 
675b4c0ddbfSJiawei Wang /* Sub rdma-core actions list. */
676b4c0ddbfSJiawei Wang struct mlx5_flow_sub_actions_list {
677b4c0ddbfSJiawei Wang 	uint32_t actions_num; /**< Number of sample actions. */
678b4c0ddbfSJiawei Wang 	uint64_t action_flags;
679b4c0ddbfSJiawei Wang 	void *dr_queue_action;
680b4c0ddbfSJiawei Wang 	void *dr_tag_action;
681b4c0ddbfSJiawei Wang 	void *dr_cnt_action;
68200c10c22SJiawei Wang 	void *dr_port_id_action;
68300c10c22SJiawei Wang 	void *dr_encap_action;
6846a951567SJiawei Wang 	void *dr_jump_action;
685b4c0ddbfSJiawei Wang };
686b4c0ddbfSJiawei Wang 
687b4c0ddbfSJiawei Wang /* Sample sub-actions resource list. */
688b4c0ddbfSJiawei Wang struct mlx5_flow_sub_actions_idx {
689b4c0ddbfSJiawei Wang 	uint32_t rix_hrxq; /**< Hash Rx queue object index. */
690b4c0ddbfSJiawei Wang 	uint32_t rix_tag; /**< Index to the tag action. */
69100c10c22SJiawei Wang 	uint32_t rix_port_id_action; /**< Index to port ID action resource. */
69200c10c22SJiawei Wang 	uint32_t rix_encap_decap; /**< Index to encap/decap resource. */
6936a951567SJiawei Wang 	uint32_t rix_jump; /**< Index to the jump action resource. */
694b4c0ddbfSJiawei Wang };
695b4c0ddbfSJiawei Wang 
696b4c0ddbfSJiawei Wang /* Sample action resource structure. */
697b4c0ddbfSJiawei Wang struct mlx5_flow_dv_sample_resource {
698e78e5408SMatan Azrad 	struct mlx5_list_entry entry; /**< Cache entry. */
69919784141SSuanming Mou 	union {
700b4c0ddbfSJiawei Wang 		void *verbs_action; /**< Verbs sample action object. */
70119784141SSuanming Mou 		void **sub_actions; /**< Sample sub-action array. */
70219784141SSuanming Mou 	};
70301c05ee0SSuanming Mou 	struct rte_eth_dev *dev; /**< Device registers the action. */
70419784141SSuanming Mou 	uint32_t idx; /** Sample object index. */
705b4c0ddbfSJiawei Wang 	uint8_t ft_type; /** Flow Table Type */
706b4c0ddbfSJiawei Wang 	uint32_t ft_id; /** Flow Table Level */
707b4c0ddbfSJiawei Wang 	uint32_t ratio;   /** Sample Ratio */
708b4c0ddbfSJiawei Wang 	uint64_t set_action; /** Restore reg_c0 value */
709b4c0ddbfSJiawei Wang 	void *normal_path_tbl; /** Flow Table pointer */
710b4c0ddbfSJiawei Wang 	struct mlx5_flow_sub_actions_idx sample_idx;
711b4c0ddbfSJiawei Wang 	/**< Action index resources. */
712b4c0ddbfSJiawei Wang 	struct mlx5_flow_sub_actions_list sample_act;
713b4c0ddbfSJiawei Wang 	/**< Action resources. */
714b4c0ddbfSJiawei Wang };
715b4c0ddbfSJiawei Wang 
71600c10c22SJiawei Wang #define MLX5_MAX_DEST_NUM	2
71700c10c22SJiawei Wang 
71800c10c22SJiawei Wang /* Destination array action resource structure. */
71900c10c22SJiawei Wang struct mlx5_flow_dv_dest_array_resource {
720e78e5408SMatan Azrad 	struct mlx5_list_entry entry; /**< Cache entry. */
72119784141SSuanming Mou 	uint32_t idx; /** Destination array action object index. */
72200c10c22SJiawei Wang 	uint8_t ft_type; /** Flow Table Type */
72300c10c22SJiawei Wang 	uint8_t num_of_dest; /**< Number of destination actions. */
72401c05ee0SSuanming Mou 	struct rte_eth_dev *dev; /**< Device registers the action. */
72500c10c22SJiawei Wang 	void *action; /**< Pointer to the rdma core action. */
72600c10c22SJiawei Wang 	struct mlx5_flow_sub_actions_idx sample_idx[MLX5_MAX_DEST_NUM];
72700c10c22SJiawei Wang 	/**< Action index resources. */
72800c10c22SJiawei Wang 	struct mlx5_flow_sub_actions_list sample_act[MLX5_MAX_DEST_NUM];
72900c10c22SJiawei Wang 	/**< Action resources. */
73000c10c22SJiawei Wang };
73100c10c22SJiawei Wang 
732750ff30aSGregory Etelson /* PMD flow priority for tunnel */
733750ff30aSGregory Etelson #define MLX5_TUNNEL_PRIO_GET(rss_desc) \
734750ff30aSGregory Etelson 	((rss_desc)->level >= 2 ? MLX5_PRIORITY_MAP_L2 : MLX5_PRIORITY_MAP_L4)
735750ff30aSGregory Etelson 
736e745f900SSuanming Mou 
737c42f44bdSBing Zhao /** Device flow handle structure for DV mode only. */
738c42f44bdSBing Zhao struct mlx5_flow_handle_dv {
739c42f44bdSBing Zhao 	/* Flow DV api: */
740c42f44bdSBing Zhao 	struct mlx5_flow_dv_matcher *matcher; /**< Cache to matcher. */
741c42f44bdSBing Zhao 	struct mlx5_flow_dv_modify_hdr_resource *modify_hdr;
742c42f44bdSBing Zhao 	/**< Pointer to modify header resource in cache. */
74377749adaSSuanming Mou 	uint32_t rix_encap_decap;
74477749adaSSuanming Mou 	/**< Index to encap/decap resource in cache. */
74577749adaSSuanming Mou 	uint32_t rix_push_vlan;
7468acf8ac9SSuanming Mou 	/**< Index to push VLAN action resource in cache. */
74777749adaSSuanming Mou 	uint32_t rix_tag;
7485f114269SSuanming Mou 	/**< Index to the tag action. */
749b4c0ddbfSJiawei Wang 	uint32_t rix_sample;
750b4c0ddbfSJiawei Wang 	/**< Index to sample action resource in cache. */
75100c10c22SJiawei Wang 	uint32_t rix_dest_array;
75200c10c22SJiawei Wang 	/**< Index to destination array resource in cache. */
75377749adaSSuanming Mou } __rte_packed;
754c42f44bdSBing Zhao 
755c42f44bdSBing Zhao /** Device flow handle structure: used both for creating & destroying. */
756c42f44bdSBing Zhao struct mlx5_flow_handle {
757b88341caSSuanming Mou 	SILIST_ENTRY(uint32_t)next;
75877749adaSSuanming Mou 	struct mlx5_vf_vlan vf_vlan; /**< Structure for VF VLAN workaround. */
759b88341caSSuanming Mou 	/**< Index to next device flow handle. */
7600ddd1143SYongseok Koh 	uint64_t layers;
76124663641SYongseok Koh 	/**< Bit-fields of present layers, see MLX5_FLOW_LAYER_*. */
762341c8941SDekel Peled 	void *drv_flow; /**< pointer to driver flow object. */
76383306d6cSShun Hao 	uint32_t split_flow_id:27; /**< Sub flow unique match flow id. */
7647be78d02SJosh Soref 	uint32_t is_meter_flow_id:1; /**< Indicate if flow_id is for meter. */
76525c4d6dfSMichael Savisko 	uint32_t fate_action:4; /**< Fate action type. */
7666fc18392SSuanming Mou 	union {
76777749adaSSuanming Mou 		uint32_t rix_hrxq; /**< Hash Rx queue object index. */
76877749adaSSuanming Mou 		uint32_t rix_jump; /**< Index to the jump action resource. */
76977749adaSSuanming Mou 		uint32_t rix_port_id_action;
7706fc18392SSuanming Mou 		/**< Index to port ID action resource. */
77177749adaSSuanming Mou 		uint32_t rix_fate;
772488d13abSSuanming Mou 		/**< Generic value indicates the fate action. */
7733c78124fSShiri Kuzin 		uint32_t rix_default_fate;
7743c78124fSShiri Kuzin 		/**< Indicates default miss fate action. */
775fabf8a37SSuanming Mou 		uint32_t rix_srss;
776fabf8a37SSuanming Mou 		/**< Indicates shared RSS fate action. */
7776fc18392SSuanming Mou 	};
778f1ae0b35SOphir Munk #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H)
779c42f44bdSBing Zhao 	struct mlx5_flow_handle_dv dvh;
780c42f44bdSBing Zhao #endif
781cfe337e7SGregory Etelson 	uint8_t flex_item; /**< referenced Flex Item bitmask. */
78277749adaSSuanming Mou } __rte_packed;
783c42f44bdSBing Zhao 
784c42f44bdSBing Zhao /*
785e7bfa359SBing Zhao  * Size for Verbs device flow handle structure only. Do not use the DV only
786e7bfa359SBing Zhao  * structure in Verbs. No DV flows attributes will be accessed.
787e7bfa359SBing Zhao  * Macro offsetof() could also be used here.
788e7bfa359SBing Zhao  */
789f1ae0b35SOphir Munk #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H)
790e7bfa359SBing Zhao #define MLX5_FLOW_HANDLE_VERBS_SIZE \
791e7bfa359SBing Zhao 	(sizeof(struct mlx5_flow_handle) - sizeof(struct mlx5_flow_handle_dv))
792e7bfa359SBing Zhao #else
793e7bfa359SBing Zhao #define MLX5_FLOW_HANDLE_VERBS_SIZE (sizeof(struct mlx5_flow_handle))
794e7bfa359SBing Zhao #endif
795e7bfa359SBing Zhao 
796c42f44bdSBing Zhao /** Device flow structure only for DV flow creation. */
797e7bfa359SBing Zhao struct mlx5_flow_dv_workspace {
798c42f44bdSBing Zhao 	uint32_t group; /**< The group index. */
7992d2cef5dSLi Zhang 	uint32_t table_id; /**< Flow table identifier. */
800c42f44bdSBing Zhao 	uint8_t transfer; /**< 1 if the flow is E-Switch flow. */
801c42f44bdSBing Zhao 	int actions_n; /**< number of actions. */
802c42f44bdSBing Zhao 	void *actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS]; /**< Action list. */
803014d1cbeSSuanming Mou 	struct mlx5_flow_dv_encap_decap_resource *encap_decap;
804014d1cbeSSuanming Mou 	/**< Pointer to encap/decap resource in cache. */
8058acf8ac9SSuanming Mou 	struct mlx5_flow_dv_push_vlan_action_resource *push_vlan_res;
8068acf8ac9SSuanming Mou 	/**< Pointer to push VLAN action resource in cache. */
8075f114269SSuanming Mou 	struct mlx5_flow_dv_tag_resource *tag_resource;
8087ac99475SSuanming Mou 	/**< pointer to the tag action. */
809f3faf9eaSSuanming Mou 	struct mlx5_flow_dv_port_id_action_resource *port_id_action;
810f3faf9eaSSuanming Mou 	/**< Pointer to port ID action resource. */
8117ac99475SSuanming Mou 	struct mlx5_flow_dv_jump_tbl_resource *jump;
8127ac99475SSuanming Mou 	/**< Pointer to the jump action resource. */
813c42f44bdSBing Zhao 	struct mlx5_flow_dv_match_params value;
814c42f44bdSBing Zhao 	/**< Holds the value that the packet is compared to. */
815b4c0ddbfSJiawei Wang 	struct mlx5_flow_dv_sample_resource *sample_res;
816b4c0ddbfSJiawei Wang 	/**< Pointer to the sample action resource. */
81700c10c22SJiawei Wang 	struct mlx5_flow_dv_dest_array_resource *dest_array_res;
81800c10c22SJiawei Wang 	/**< Pointer to the destination array resource. */
819c42f44bdSBing Zhao };
820c42f44bdSBing Zhao 
821f1ae0b35SOphir Munk #ifdef HAVE_INFINIBAND_VERBS_H
822e7bfa359SBing Zhao /*
823e7bfa359SBing Zhao  * Maximal Verbs flow specifications & actions size.
824e7bfa359SBing Zhao  * Some elements are mutually exclusive, but enough space should be allocated.
825e7bfa359SBing Zhao  * Tunnel cases: 1. Max 2 Ethernet + IP(v6 len > v4 len) + TCP/UDP headers.
826e7bfa359SBing Zhao  *               2. One tunnel header (exception: GRE + MPLS),
827e7bfa359SBing Zhao  *                  SPEC length: GRE == tunnel.
828e7bfa359SBing Zhao  * Actions: 1. 1 Mark OR Flag.
829e7bfa359SBing Zhao  *          2. 1 Drop (if any).
830e7bfa359SBing Zhao  *          3. No limitation for counters, but it makes no sense to support too
831e7bfa359SBing Zhao  *             many counters in a single device flow.
832e7bfa359SBing Zhao  */
833e7bfa359SBing Zhao #ifdef HAVE_IBV_DEVICE_MPLS_SUPPORT
834e7bfa359SBing Zhao #define MLX5_VERBS_MAX_SPEC_SIZE \
835e7bfa359SBing Zhao 		( \
836e7bfa359SBing Zhao 			(2 * (sizeof(struct ibv_flow_spec_eth) + \
837e7bfa359SBing Zhao 			      sizeof(struct ibv_flow_spec_ipv6) + \
838e7bfa359SBing Zhao 			      sizeof(struct ibv_flow_spec_tcp_udp)) + \
839e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_gre) + \
840e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_mpls)) \
841e7bfa359SBing Zhao 		)
842e7bfa359SBing Zhao #else
843e7bfa359SBing Zhao #define MLX5_VERBS_MAX_SPEC_SIZE \
844e7bfa359SBing Zhao 		( \
845e7bfa359SBing Zhao 			(2 * (sizeof(struct ibv_flow_spec_eth) + \
846e7bfa359SBing Zhao 			      sizeof(struct ibv_flow_spec_ipv6) + \
847e7bfa359SBing Zhao 			      sizeof(struct ibv_flow_spec_tcp_udp)) + \
848e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_tunnel)) \
849e7bfa359SBing Zhao 		)
850e7bfa359SBing Zhao #endif
851e7bfa359SBing Zhao 
852e7bfa359SBing Zhao #if defined(HAVE_IBV_DEVICE_COUNTERS_SET_V42) || \
853e7bfa359SBing Zhao 	defined(HAVE_IBV_DEVICE_COUNTERS_SET_V45)
854e7bfa359SBing Zhao #define MLX5_VERBS_MAX_ACT_SIZE \
855e7bfa359SBing Zhao 		( \
856e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_action_tag) + \
857e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_action_drop) + \
858e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_counter_action) * 4 \
859e7bfa359SBing Zhao 		)
860e7bfa359SBing Zhao #else
861e7bfa359SBing Zhao #define MLX5_VERBS_MAX_ACT_SIZE \
862e7bfa359SBing Zhao 		( \
863e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_action_tag) + \
864e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_action_drop) \
865e7bfa359SBing Zhao 		)
866e7bfa359SBing Zhao #endif
867e7bfa359SBing Zhao 
868e7bfa359SBing Zhao #define MLX5_VERBS_MAX_SPEC_ACT_SIZE \
869e7bfa359SBing Zhao 		(MLX5_VERBS_MAX_SPEC_SIZE + MLX5_VERBS_MAX_ACT_SIZE)
870e7bfa359SBing Zhao 
871c42f44bdSBing Zhao /** Device flow structure only for Verbs flow creation. */
872e7bfa359SBing Zhao struct mlx5_flow_verbs_workspace {
873c42f44bdSBing Zhao 	unsigned int size; /**< Size of the attribute. */
874e7bfa359SBing Zhao 	struct ibv_flow_attr attr; /**< Verbs flow attribute buffer. */
875e7bfa359SBing Zhao 	uint8_t specs[MLX5_VERBS_MAX_SPEC_ACT_SIZE];
876e7bfa359SBing Zhao 	/**< Specifications & actions buffer of verbs flow. */
877c42f44bdSBing Zhao };
878f1ae0b35SOphir Munk #endif /* HAVE_INFINIBAND_VERBS_H */
879c42f44bdSBing Zhao 
880ae2927cdSJiawei Wang #define MLX5_SCALE_FLOW_GROUP_BIT 0
881ae2927cdSJiawei Wang #define MLX5_SCALE_JUMP_FLOW_GROUP_BIT 1
882ae2927cdSJiawei Wang 
883e7bfa359SBing Zhao /** Maximal number of device sub-flows supported. */
884e7bfa359SBing Zhao #define MLX5_NUM_MAX_DEV_FLOWS 32
885e7bfa359SBing Zhao 
8868c5a231bSGregory Etelson /**
8878c5a231bSGregory Etelson  * tunnel offload rules type
8888c5a231bSGregory Etelson  */
8898c5a231bSGregory Etelson enum mlx5_tof_rule_type {
8908c5a231bSGregory Etelson 	MLX5_TUNNEL_OFFLOAD_NONE = 0,
8918c5a231bSGregory Etelson 	MLX5_TUNNEL_OFFLOAD_SET_RULE,
8928c5a231bSGregory Etelson 	MLX5_TUNNEL_OFFLOAD_MATCH_RULE,
8938c5a231bSGregory Etelson 	MLX5_TUNNEL_OFFLOAD_MISS_RULE,
8948c5a231bSGregory Etelson };
8958c5a231bSGregory Etelson 
896c42f44bdSBing Zhao /** Device flow structure. */
8979ade91dfSJiawei Wang __extension__
898c42f44bdSBing Zhao struct mlx5_flow {
899c42f44bdSBing Zhao 	struct rte_flow *flow; /**< Pointer to the main flow. */
900fa2d01c8SDong Zhou 	uint32_t flow_idx; /**< The memory pool index to the main flow. */
9016ad7cfaaSDekel Peled 	uint64_t hash_fields; /**< Hash Rx queue hash fields. */
902488d13abSSuanming Mou 	uint64_t act_flags;
903488d13abSSuanming Mou 	/**< Bit-fields of detected actions, see MLX5_FLOW_ACTION_*. */
904b67b4ecbSDekel Peled 	bool external; /**< true if the flow is created external to PMD. */
9059ade91dfSJiawei Wang 	uint8_t ingress:1; /**< 1 if the flow is ingress. */
906ae2927cdSJiawei Wang 	uint8_t skip_scale:2;
9070e04e1e2SXueming Li 	uint8_t symmetric_hash_function:1;
908ae2927cdSJiawei Wang 	/**
909ae2927cdSJiawei Wang 	 * Each Bit be set to 1 if Skip the scale the flow group with factor.
910ae2927cdSJiawei Wang 	 * If bit0 be set to 1, then skip the scale the original flow group;
911ae2927cdSJiawei Wang 	 * If bit1 be set to 1, then skip the scale the jump flow group if
912ae2927cdSJiawei Wang 	 * having jump action.
913ae2927cdSJiawei Wang 	 * 00: Enable scale in a flow, default value.
914ae2927cdSJiawei Wang 	 * 01: Skip scale the flow group with factor, enable scale the group
915ae2927cdSJiawei Wang 	 * of jump action.
916ae2927cdSJiawei Wang 	 * 10: Enable scale the group with factor, skip scale the group of
917ae2927cdSJiawei Wang 	 * jump action.
918ae2927cdSJiawei Wang 	 * 11: Skip scale the table with factor both for flow group and jump
919ae2927cdSJiawei Wang 	 * group.
920ae2927cdSJiawei Wang 	 */
921c42f44bdSBing Zhao 	union {
922f1ae0b35SOphir Munk #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H)
923e7bfa359SBing Zhao 		struct mlx5_flow_dv_workspace dv;
924c42f44bdSBing Zhao #endif
925f1ae0b35SOphir Munk #ifdef HAVE_INFINIBAND_VERBS_H
926e7bfa359SBing Zhao 		struct mlx5_flow_verbs_workspace verbs;
927f1ae0b35SOphir Munk #endif
928c42f44bdSBing Zhao 	};
929e7bfa359SBing Zhao 	struct mlx5_flow_handle *handle;
930b88341caSSuanming Mou 	uint32_t handle_idx; /* Index of the mlx5 flow handle memory. */
9314ec6360dSGregory Etelson 	const struct mlx5_flow_tunnel *tunnel;
9328c5a231bSGregory Etelson 	enum mlx5_tof_rule_type tof_type;
93384c406e7SOri Kam };
93484c406e7SOri Kam 
93533e01809SSuanming Mou /* Flow meter state. */
93633e01809SSuanming Mou #define MLX5_FLOW_METER_DISABLE 0
93733e01809SSuanming Mou #define MLX5_FLOW_METER_ENABLE 1
93833e01809SSuanming Mou 
93929efa63aSLi Zhang #define MLX5_ASO_WQE_CQE_RESPONSE_DELAY 10u
94029efa63aSLi Zhang #define MLX5_MTR_POLL_WQE_CQE_TIMES 100000u
941e6100c7bSLi Zhang 
942ebaf1b31SBing Zhao #define MLX5_CT_POLL_WQE_CQE_TIMES MLX5_MTR_POLL_WQE_CQE_TIMES
943ebaf1b31SBing Zhao 
9443bd26b23SSuanming Mou #define MLX5_MAN_WIDTH 8
945e6100c7bSLi Zhang /* Legacy Meter parameter structure. */
946e6100c7bSLi Zhang struct mlx5_legacy_flow_meter {
947e6100c7bSLi Zhang 	struct mlx5_flow_meter_info fm;
948e6100c7bSLi Zhang 	/* Must be the first in struct. */
949e6100c7bSLi Zhang 	TAILQ_ENTRY(mlx5_legacy_flow_meter) next;
9503f373f35SSuanming Mou 	/**< Pointer to the next flow meter structure. */
95144432018SLi Zhang 	uint32_t idx;
95244432018SLi Zhang 	/* Index to meter object. */
9533bd26b23SSuanming Mou };
9543bd26b23SSuanming Mou 
9554ec6360dSGregory Etelson #define MLX5_MAX_TUNNELS 256
9564ec6360dSGregory Etelson #define MLX5_TNL_MISS_RULE_PRIORITY 3
9574ec6360dSGregory Etelson #define MLX5_TNL_MISS_FDB_JUMP_GRP  0x1234faac
9584ec6360dSGregory Etelson 
9594ec6360dSGregory Etelson /*
9604ec6360dSGregory Etelson  * When tunnel offload is active, all JUMP group ids are converted
9614ec6360dSGregory Etelson  * using the same method. That conversion is applied both to tunnel and
9624ec6360dSGregory Etelson  * regular rule types.
9634ec6360dSGregory Etelson  * Group ids used in tunnel rules are relative to it's tunnel (!).
9644ec6360dSGregory Etelson  * Application can create number of steer rules, using the same
9654ec6360dSGregory Etelson  * tunnel, with different group id in each rule.
9664ec6360dSGregory Etelson  * Each tunnel stores its groups internally in PMD tunnel object.
9674ec6360dSGregory Etelson  * Groups used in regular rules do not belong to any tunnel and are stored
9684ec6360dSGregory Etelson  * in tunnel hub.
9694ec6360dSGregory Etelson  */
9704ec6360dSGregory Etelson 
9714ec6360dSGregory Etelson struct mlx5_flow_tunnel {
9724ec6360dSGregory Etelson 	LIST_ENTRY(mlx5_flow_tunnel) chain;
9734ec6360dSGregory Etelson 	struct rte_flow_tunnel app_tunnel;	/** app tunnel copy */
9744ec6360dSGregory Etelson 	uint32_t tunnel_id;			/** unique tunnel ID */
9754ec6360dSGregory Etelson 	uint32_t refctn;
9764ec6360dSGregory Etelson 	struct rte_flow_action action;
9774ec6360dSGregory Etelson 	struct rte_flow_item item;
9784ec6360dSGregory Etelson 	struct mlx5_hlist *groups;		/** tunnel groups */
9794ec6360dSGregory Etelson };
9804ec6360dSGregory Etelson 
9814ec6360dSGregory Etelson /** PMD tunnel related context */
9824ec6360dSGregory Etelson struct mlx5_flow_tunnel_hub {
983868d2e34SGregory Etelson 	/* Tunnels list
984868d2e34SGregory Etelson 	 * Access to the list MUST be MT protected
985868d2e34SGregory Etelson 	 */
9864ec6360dSGregory Etelson 	LIST_HEAD(, mlx5_flow_tunnel) tunnels;
987868d2e34SGregory Etelson 	 /* protect access to the tunnels list */
988868d2e34SGregory Etelson 	rte_spinlock_t sl;
9894ec6360dSGregory Etelson 	struct mlx5_hlist *groups;		/** non tunnel groups */
9904ec6360dSGregory Etelson };
9914ec6360dSGregory Etelson 
9924ec6360dSGregory Etelson /* convert jump group to flow table ID in tunnel rules */
9934ec6360dSGregory Etelson struct tunnel_tbl_entry {
994961b6774SMatan Azrad 	struct mlx5_list_entry hash;
9954ec6360dSGregory Etelson 	uint32_t flow_table;
996f5b0aed2SSuanming Mou 	uint32_t tunnel_id;
997f5b0aed2SSuanming Mou 	uint32_t group;
9984ec6360dSGregory Etelson };
9994ec6360dSGregory Etelson 
10004ec6360dSGregory Etelson static inline uint32_t
10014ec6360dSGregory Etelson tunnel_id_to_flow_tbl(uint32_t id)
10024ec6360dSGregory Etelson {
10034ec6360dSGregory Etelson 	return id | (1u << 16);
10044ec6360dSGregory Etelson }
10054ec6360dSGregory Etelson 
10064ec6360dSGregory Etelson static inline uint32_t
10074ec6360dSGregory Etelson tunnel_flow_tbl_to_id(uint32_t flow_tbl)
10084ec6360dSGregory Etelson {
10094ec6360dSGregory Etelson 	return flow_tbl & ~(1u << 16);
10104ec6360dSGregory Etelson }
10114ec6360dSGregory Etelson 
10124ec6360dSGregory Etelson union tunnel_tbl_key {
10134ec6360dSGregory Etelson 	uint64_t val;
10144ec6360dSGregory Etelson 	struct {
10154ec6360dSGregory Etelson 		uint32_t tunnel_id;
10164ec6360dSGregory Etelson 		uint32_t group;
10174ec6360dSGregory Etelson 	};
10184ec6360dSGregory Etelson };
10194ec6360dSGregory Etelson 
10204ec6360dSGregory Etelson static inline struct mlx5_flow_tunnel_hub *
10214ec6360dSGregory Etelson mlx5_tunnel_hub(struct rte_eth_dev *dev)
10224ec6360dSGregory Etelson {
10234ec6360dSGregory Etelson 	struct mlx5_priv *priv = dev->data->dev_private;
10244ec6360dSGregory Etelson 	return priv->sh->tunnel_hub;
10254ec6360dSGregory Etelson }
10264ec6360dSGregory Etelson 
10274ec6360dSGregory Etelson static inline bool
10288c5a231bSGregory Etelson is_tunnel_offload_active(const struct rte_eth_dev *dev)
10294ec6360dSGregory Etelson {
1030bc1d90a3SGregory Etelson #ifdef HAVE_IBV_FLOW_DV_SUPPORT
10318c5a231bSGregory Etelson 	const struct mlx5_priv *priv = dev->data->dev_private;
1032a13ec19cSMichael Baum 	return !!priv->sh->config.dv_miss_info;
1033bc1d90a3SGregory Etelson #else
1034bc1d90a3SGregory Etelson 	RTE_SET_USED(dev);
1035bc1d90a3SGregory Etelson 	return false;
1036bc1d90a3SGregory Etelson #endif
10374ec6360dSGregory Etelson }
10384ec6360dSGregory Etelson 
10394ec6360dSGregory Etelson static inline bool
10408c5a231bSGregory Etelson is_flow_tunnel_match_rule(enum mlx5_tof_rule_type tof_rule_type)
10414ec6360dSGregory Etelson {
10428c5a231bSGregory Etelson 	return tof_rule_type == MLX5_TUNNEL_OFFLOAD_MATCH_RULE;
10434ec6360dSGregory Etelson }
10444ec6360dSGregory Etelson 
10454ec6360dSGregory Etelson static inline bool
10468c5a231bSGregory Etelson is_flow_tunnel_steer_rule(enum mlx5_tof_rule_type tof_rule_type)
10474ec6360dSGregory Etelson {
10488c5a231bSGregory Etelson 	return tof_rule_type == MLX5_TUNNEL_OFFLOAD_SET_RULE;
10494ec6360dSGregory Etelson }
10504ec6360dSGregory Etelson 
10514ec6360dSGregory Etelson static inline const struct mlx5_flow_tunnel *
10524ec6360dSGregory Etelson flow_actions_to_tunnel(const struct rte_flow_action actions[])
10534ec6360dSGregory Etelson {
10544ec6360dSGregory Etelson 	return actions[0].conf;
10554ec6360dSGregory Etelson }
10564ec6360dSGregory Etelson 
10574ec6360dSGregory Etelson static inline const struct mlx5_flow_tunnel *
10584ec6360dSGregory Etelson flow_items_to_tunnel(const struct rte_flow_item items[])
10594ec6360dSGregory Etelson {
10604ec6360dSGregory Etelson 	return items[0].spec;
10614ec6360dSGregory Etelson }
10624ec6360dSGregory Etelson 
10630f4aa72bSSuanming Mou /**
1064c23626f2SMichael Baum  * Gets the tag array given for RTE_FLOW_FIELD_TAG type.
1065c23626f2SMichael Baum  *
1066c23626f2SMichael Baum  * In old API the value was provided in "level" field, but in new API
1067c23626f2SMichael Baum  * it is provided in "tag_array" field. Since encapsulation level is not
1068c23626f2SMichael Baum  * relevant for metadata, the tag array can be still provided in "level"
1069c23626f2SMichael Baum  * for backwards compatibility.
1070c23626f2SMichael Baum  *
1071c23626f2SMichael Baum  * @param[in] data
1072c23626f2SMichael Baum  *   Pointer to tag modify data structure.
1073c23626f2SMichael Baum  *
1074c23626f2SMichael Baum  * @return
1075c23626f2SMichael Baum  *   Tag array index.
1076c23626f2SMichael Baum  */
1077c23626f2SMichael Baum static inline uint8_t
1078c23626f2SMichael Baum flow_tag_index_get(const struct rte_flow_action_modify_data *data)
1079c23626f2SMichael Baum {
1080c23626f2SMichael Baum 	return data->tag_index ? data->tag_index : data->level;
1081c23626f2SMichael Baum }
1082c23626f2SMichael Baum 
1083c23626f2SMichael Baum /**
10840f4aa72bSSuanming Mou  * Fetch 1, 2, 3 or 4 byte field from the byte array
10850f4aa72bSSuanming Mou  * and return as unsigned integer in host-endian format.
10860f4aa72bSSuanming Mou  *
10870f4aa72bSSuanming Mou  * @param[in] data
10880f4aa72bSSuanming Mou  *   Pointer to data array.
10890f4aa72bSSuanming Mou  * @param[in] size
10900f4aa72bSSuanming Mou  *   Size of field to extract.
10910f4aa72bSSuanming Mou  *
10920f4aa72bSSuanming Mou  * @return
10930f4aa72bSSuanming Mou  *   converted field in host endian format.
10940f4aa72bSSuanming Mou  */
10950f4aa72bSSuanming Mou static inline uint32_t
10960f4aa72bSSuanming Mou flow_dv_fetch_field(const uint8_t *data, uint32_t size)
10970f4aa72bSSuanming Mou {
10980f4aa72bSSuanming Mou 	uint32_t ret;
10990f4aa72bSSuanming Mou 
11000f4aa72bSSuanming Mou 	switch (size) {
11010f4aa72bSSuanming Mou 	case 1:
11020f4aa72bSSuanming Mou 		ret = *data;
11030f4aa72bSSuanming Mou 		break;
11040f4aa72bSSuanming Mou 	case 2:
11050f4aa72bSSuanming Mou 		ret = rte_be_to_cpu_16(*(const unaligned_uint16_t *)data);
11060f4aa72bSSuanming Mou 		break;
11070f4aa72bSSuanming Mou 	case 3:
11080f4aa72bSSuanming Mou 		ret = rte_be_to_cpu_16(*(const unaligned_uint16_t *)data);
11090f4aa72bSSuanming Mou 		ret = (ret << 8) | *(data + sizeof(uint16_t));
11100f4aa72bSSuanming Mou 		break;
11110f4aa72bSSuanming Mou 	case 4:
11120f4aa72bSSuanming Mou 		ret = rte_be_to_cpu_32(*(const unaligned_uint32_t *)data);
11130f4aa72bSSuanming Mou 		break;
11140f4aa72bSSuanming Mou 	default:
11150f4aa72bSSuanming Mou 		MLX5_ASSERT(false);
11160f4aa72bSSuanming Mou 		ret = 0;
11170f4aa72bSSuanming Mou 		break;
11180f4aa72bSSuanming Mou 	}
11190f4aa72bSSuanming Mou 	return ret;
11200f4aa72bSSuanming Mou }
11210f4aa72bSSuanming Mou 
11223c37110eSMichael Baum static inline bool
11233c37110eSMichael Baum flow_modify_field_support_tag_array(enum rte_flow_field_id field)
11243c37110eSMichael Baum {
11259e21f6cdSBing Zhao 	switch ((int)field) {
11263c37110eSMichael Baum 	case RTE_FLOW_FIELD_TAG:
11274580dcecSMichael Baum 	case RTE_FLOW_FIELD_MPLS:
11289e21f6cdSBing Zhao 	case MLX5_RTE_FLOW_FIELD_META_REG:
11293c37110eSMichael Baum 		return true;
11303c37110eSMichael Baum 	default:
11313c37110eSMichael Baum 		break;
11323c37110eSMichael Baum 	}
11333c37110eSMichael Baum 	return false;
11343c37110eSMichael Baum }
11353c37110eSMichael Baum 
11360f4aa72bSSuanming Mou struct field_modify_info {
11370f4aa72bSSuanming Mou 	uint32_t size; /* Size of field in protocol header, in bytes. */
11380f4aa72bSSuanming Mou 	uint32_t offset; /* Offset of field in protocol header, in bytes. */
11390f4aa72bSSuanming Mou 	enum mlx5_modification_field id;
11406b6c0b8dSRongwei Liu 	uint32_t shift;
11416b6c0b8dSRongwei Liu 	uint8_t is_flex; /* Temporary indicator for flex item modify filed WA. */
11420f4aa72bSSuanming Mou };
11430f4aa72bSSuanming Mou 
114475a00812SSuanming Mou /* HW steering flow attributes. */
114575a00812SSuanming Mou struct mlx5_flow_attr {
114675a00812SSuanming Mou 	uint32_t port_id; /* Port index. */
114775a00812SSuanming Mou 	uint32_t group; /* Flow group. */
114875a00812SSuanming Mou 	uint32_t priority; /* Original Priority. */
114975a00812SSuanming Mou 	/* rss level, used by priority adjustment. */
115075a00812SSuanming Mou 	uint32_t rss_level;
115175a00812SSuanming Mou 	/* Action flags, used by priority adjustment. */
115275a00812SSuanming Mou 	uint32_t act_flags;
115375a00812SSuanming Mou 	uint32_t tbl_type; /* Flow table type. */
115475a00812SSuanming Mou };
115575a00812SSuanming Mou 
115684c406e7SOri Kam /* Flow structure. */
115784c406e7SOri Kam struct rte_flow {
1158b88341caSSuanming Mou 	uint32_t dev_handles;
1159e7bfa359SBing Zhao 	/**< Device flow handles that are part of the flow. */
1160b4edeaf3SSuanming Mou 	uint32_t type:2;
11610136df99SSuanming Mou 	uint32_t drv_type:2; /**< Driver type. */
11624ec6360dSGregory Etelson 	uint32_t tunnel:1;
1163e6100c7bSLi Zhang 	uint32_t meter:24; /**< Holds flow meter id. */
11642d084f69SBing Zhao 	uint32_t indirect_type:2; /**< Indirect action type. */
11650136df99SSuanming Mou 	uint32_t rix_mreg_copy;
11660136df99SSuanming Mou 	/**< Index to metadata register copy table resource. */
11670136df99SSuanming Mou 	uint32_t counter; /**< Holds flow counter. */
11684ec6360dSGregory Etelson 	uint32_t tunnel_id;  /**< Tunnel id */
11692d084f69SBing Zhao 	union {
1170f935ed4bSDekel Peled 		uint32_t age; /**< Holds ASO age bit index. */
11712d084f69SBing Zhao 		uint32_t ct; /**< Holds ASO CT index. */
11722d084f69SBing Zhao 	};
1173f15f0c38SShiri Kuzin 	uint32_t geneve_tlv_option; /**< Holds Geneve TLV option id. > */
11740136df99SSuanming Mou } __rte_packed;
11752720f833SYongseok Koh 
117604a4de75SMichael Baum /*
117704a4de75SMichael Baum  * HWS COUNTER ID's layout
117804a4de75SMichael Baum  *       3                   2                   1                   0
117904a4de75SMichael Baum  *     1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
118004a4de75SMichael Baum  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
118104a4de75SMichael Baum  *    |  T  |     | D |                                               |
118204a4de75SMichael Baum  *    ~  Y  |     | C |                    IDX                        ~
118304a4de75SMichael Baum  *    |  P  |     | S |                                               |
118404a4de75SMichael Baum  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
118504a4de75SMichael Baum  *
118604a4de75SMichael Baum  *    Bit 31:29 = TYPE = MLX5_INDIRECT_ACTION_TYPE_COUNT = b'10
118704a4de75SMichael Baum  *    Bit 25:24 = DCS index
118804a4de75SMichael Baum  *    Bit 23:00 = IDX in this counter belonged DCS bulk.
118904a4de75SMichael Baum  */
119004a4de75SMichael Baum typedef uint32_t cnt_id_t;
119104a4de75SMichael Baum 
119242431df9SSuanming Mou #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H)
119342431df9SSuanming Mou 
119422681deeSAlex Vesker #ifdef PEDANTIC
119522681deeSAlex Vesker #pragma GCC diagnostic ignored "-Wpedantic"
119622681deeSAlex Vesker #endif
119722681deeSAlex Vesker 
1198c40c061aSSuanming Mou /* HWS flow struct. */
1199c40c061aSSuanming Mou struct rte_flow_hw {
1200c40c061aSSuanming Mou 	uint32_t idx; /* Flow index from indexed pool. */
120163296851SAlexander Kozyrev 	uint32_t res_idx; /* Resource index from indexed pool. */
1202f13fab23SSuanming Mou 	uint32_t fate_type; /* Fate action type. */
1203f13fab23SSuanming Mou 	union {
1204f13fab23SSuanming Mou 		/* Jump action. */
1205f13fab23SSuanming Mou 		struct mlx5_hw_jump_action *jump;
12063a2f674bSSuanming Mou 		struct mlx5_hrxq *hrxq; /* TIR action. */
1207f13fab23SSuanming Mou 	};
1208c40c061aSSuanming Mou 	struct rte_flow_template_table *table; /* The table flow allcated from. */
120963296851SAlexander Kozyrev 	uint8_t mt_idx;
121004a4de75SMichael Baum 	uint32_t age_idx;
121104a4de75SMichael Baum 	cnt_id_t cnt_id;
121248fbb0e9SAlexander Kozyrev 	uint32_t mtr_id;
121360db7673SAlexander Kozyrev 	uint32_t rule_idx;
121422681deeSAlex Vesker 	uint8_t rule[0]; /* HWS layer data struct. */
1215c40c061aSSuanming Mou } __rte_packed;
1216c40c061aSSuanming Mou 
121722681deeSAlex Vesker #ifdef PEDANTIC
121822681deeSAlex Vesker #pragma GCC diagnostic error "-Wpedantic"
121922681deeSAlex Vesker #endif
122022681deeSAlex Vesker 
1221f13fab23SSuanming Mou /* rte flow action translate to DR action struct. */
1222f13fab23SSuanming Mou struct mlx5_action_construct_data {
1223f13fab23SSuanming Mou 	LIST_ENTRY(mlx5_action_construct_data) next;
1224f13fab23SSuanming Mou 	/* Ensure the action types are matched. */
1225f13fab23SSuanming Mou 	int type;
1226f13fab23SSuanming Mou 	uint32_t idx;  /* Data index. */
1227f13fab23SSuanming Mou 	uint16_t action_src; /* rte_flow_action src offset. */
1228f13fab23SSuanming Mou 	uint16_t action_dst; /* mlx5dr_rule_action dst offset. */
12297ab3962dSSuanming Mou 	union {
12307ab3962dSSuanming Mou 		struct {
1231fe3620aaSSuanming Mou 			/* encap data len. */
1232fe3620aaSSuanming Mou 			uint16_t len;
1233fe3620aaSSuanming Mou 		} encap;
1234fe3620aaSSuanming Mou 		struct {
12350f4aa72bSSuanming Mou 			/* Modify header action offset in pattern. */
12360f4aa72bSSuanming Mou 			uint16_t mhdr_cmds_off;
12370f4aa72bSSuanming Mou 			/* Offset in pattern after modify header actions. */
12380f4aa72bSSuanming Mou 			uint16_t mhdr_cmds_end;
12390f4aa72bSSuanming Mou 			/*
12400f4aa72bSSuanming Mou 			 * True if this action is masked and does not need to
12410f4aa72bSSuanming Mou 			 * be generated.
12420f4aa72bSSuanming Mou 			 */
12430f4aa72bSSuanming Mou 			bool shared;
12440f4aa72bSSuanming Mou 			/*
12450f4aa72bSSuanming Mou 			 * Modified field definitions in dst field (SET, ADD)
12460f4aa72bSSuanming Mou 			 * or src field (COPY).
12470f4aa72bSSuanming Mou 			 */
12480f4aa72bSSuanming Mou 			struct field_modify_info field[MLX5_ACT_MAX_MOD_FIELDS];
12490f4aa72bSSuanming Mou 			/* Modified field definitions in dst field (COPY). */
12500f4aa72bSSuanming Mou 			struct field_modify_info dcopy[MLX5_ACT_MAX_MOD_FIELDS];
12510f4aa72bSSuanming Mou 			/*
12520f4aa72bSSuanming Mou 			 * Masks applied to field values to generate
12530f4aa72bSSuanming Mou 			 * PRM actions.
12540f4aa72bSSuanming Mou 			 */
12550f4aa72bSSuanming Mou 			uint32_t mask[MLX5_ACT_MAX_MOD_FIELDS];
12560f4aa72bSSuanming Mou 		} modify_header;
12570f4aa72bSSuanming Mou 		struct {
12580e04e1e2SXueming Li 			bool symmetric_hash_function; /* Symmetric RSS hash */
12597ab3962dSSuanming Mou 			uint64_t types; /* RSS hash types. */
12607ab3962dSSuanming Mou 			uint32_t level; /* RSS level. */
12617ab3962dSSuanming Mou 			uint32_t idx; /* Shared action index. */
12627ab3962dSSuanming Mou 		} shared_rss;
12634d368e1dSXiaoyu Min 		struct {
126404a4de75SMichael Baum 			cnt_id_t id;
12654d368e1dSXiaoyu Min 		} shared_counter;
126648fbb0e9SAlexander Kozyrev 		struct {
126748fbb0e9SAlexander Kozyrev 			uint32_t id;
126848fbb0e9SAlexander Kozyrev 		} shared_meter;
12697ab3962dSSuanming Mou 	};
1270f13fab23SSuanming Mou };
1271f13fab23SSuanming Mou 
127242431df9SSuanming Mou /* Flow item template struct. */
127342431df9SSuanming Mou struct rte_flow_pattern_template {
127442431df9SSuanming Mou 	LIST_ENTRY(rte_flow_pattern_template) next;
127542431df9SSuanming Mou 	/* Template attributes. */
127642431df9SSuanming Mou 	struct rte_flow_pattern_template_attr attr;
127742431df9SSuanming Mou 	struct mlx5dr_match_template *mt; /* mlx5 match template. */
12787ab3962dSSuanming Mou 	uint64_t item_flags; /* Item layer flags. */
1279483181f7SDariusz Sosnowski 	uint64_t orig_item_nb; /* Number of pattern items provided by the user (with END item). */
128042431df9SSuanming Mou 	uint32_t refcnt;  /* Reference counter. */
12811939eb6fSDariusz Sosnowski 	/*
12821939eb6fSDariusz Sosnowski 	 * If true, then rule pattern should be prepended with
12831939eb6fSDariusz Sosnowski 	 * represented_port pattern item.
12841939eb6fSDariusz Sosnowski 	 */
12851939eb6fSDariusz Sosnowski 	bool implicit_port;
1286483181f7SDariusz Sosnowski 	/*
1287483181f7SDariusz Sosnowski 	 * If true, then rule pattern should be prepended with
1288483181f7SDariusz Sosnowski 	 * tag pattern item for representor matching.
1289483181f7SDariusz Sosnowski 	 */
1290483181f7SDariusz Sosnowski 	bool implicit_tag;
12918c0ca752SRongwei Liu 	uint8_t flex_item; /* flex item index. */
129242431df9SSuanming Mou };
129342431df9SSuanming Mou 
1294836b5c9bSSuanming Mou /* Flow action template struct. */
1295836b5c9bSSuanming Mou struct rte_flow_actions_template {
1296836b5c9bSSuanming Mou 	LIST_ENTRY(rte_flow_actions_template) next;
1297836b5c9bSSuanming Mou 	/* Template attributes. */
1298836b5c9bSSuanming Mou 	struct rte_flow_actions_template_attr attr;
1299836b5c9bSSuanming Mou 	struct rte_flow_action *actions; /* Cached flow actions. */
1300836b5c9bSSuanming Mou 	struct rte_flow_action *masks; /* Cached action masks.*/
1301f1fecffaSDariusz Sosnowski 	struct mlx5dr_action_template *tmpl; /* mlx5dr action template. */
130204a4de75SMichael Baum 	uint64_t action_flags; /* Bit-map of all valid action in template. */
1303f1fecffaSDariusz Sosnowski 	uint16_t dr_actions_num; /* Amount of DR rules actions. */
1304f1fecffaSDariusz Sosnowski 	uint16_t actions_num; /* Amount of flow actions */
1305f1fecffaSDariusz Sosnowski 	uint16_t *actions_off; /* DR action offset for given rte action offset. */
1306f1fecffaSDariusz Sosnowski 	uint16_t reformat_off; /* Offset of DR reformat action. */
13070f4aa72bSSuanming Mou 	uint16_t mhdr_off; /* Offset of DR modify header action. */
1308836b5c9bSSuanming Mou 	uint32_t refcnt; /* Reference counter. */
1309ddb68e47SBing Zhao 	uint16_t rx_cpy_pos; /* Action position of Rx metadata to be copied. */
13106b6c0b8dSRongwei Liu 	uint8_t flex_item; /* flex item index. */
1311836b5c9bSSuanming Mou };
1312836b5c9bSSuanming Mou 
1313d1559d66SSuanming Mou /* Jump action struct. */
1314d1559d66SSuanming Mou struct mlx5_hw_jump_action {
1315d1559d66SSuanming Mou 	/* Action jump from root. */
1316d1559d66SSuanming Mou 	struct mlx5dr_action *root_action;
1317d1559d66SSuanming Mou 	/* HW steering jump action. */
1318d1559d66SSuanming Mou 	struct mlx5dr_action *hws_action;
1319d1559d66SSuanming Mou };
1320d1559d66SSuanming Mou 
1321fe3620aaSSuanming Mou /* Encap decap action struct. */
1322fe3620aaSSuanming Mou struct mlx5_hw_encap_decap_action {
1323fe3620aaSSuanming Mou 	struct mlx5dr_action *action; /* Action object. */
13247f6daa49SSuanming Mou 	/* Is header_reformat action shared across flows in table. */
13257f6daa49SSuanming Mou 	bool shared;
1326fe3620aaSSuanming Mou 	size_t data_size; /* Action metadata size. */
1327fe3620aaSSuanming Mou 	uint8_t data[]; /* Action data. */
1328fe3620aaSSuanming Mou };
1329fe3620aaSSuanming Mou 
13300f4aa72bSSuanming Mou #define MLX5_MHDR_MAX_CMD ((MLX5_MAX_MODIFY_NUM) * 2 + 1)
13310f4aa72bSSuanming Mou 
13320f4aa72bSSuanming Mou /* Modify field action struct. */
13330f4aa72bSSuanming Mou struct mlx5_hw_modify_header_action {
13340f4aa72bSSuanming Mou 	/* Reference to DR action */
13350f4aa72bSSuanming Mou 	struct mlx5dr_action *action;
13360f4aa72bSSuanming Mou 	/* Modify header action position in action rule table. */
13370f4aa72bSSuanming Mou 	uint16_t pos;
13380f4aa72bSSuanming Mou 	/* Is MODIFY_HEADER action shared across flows in table. */
13390f4aa72bSSuanming Mou 	bool shared;
13400f4aa72bSSuanming Mou 	/* Amount of modification commands stored in the precompiled buffer. */
13410f4aa72bSSuanming Mou 	uint32_t mhdr_cmds_num;
13420f4aa72bSSuanming Mou 	/* Precompiled modification commands. */
13430f4aa72bSSuanming Mou 	struct mlx5_modification_cmd mhdr_cmds[MLX5_MHDR_MAX_CMD];
13440f4aa72bSSuanming Mou };
13450f4aa72bSSuanming Mou 
1346f13fab23SSuanming Mou /* The maximum actions support in the flow. */
1347f13fab23SSuanming Mou #define MLX5_HW_MAX_ACTS 16
1348f13fab23SSuanming Mou 
1349d1559d66SSuanming Mou /* DR action set struct. */
1350d1559d66SSuanming Mou struct mlx5_hw_actions {
1351f13fab23SSuanming Mou 	/* Dynamic action list. */
1352f13fab23SSuanming Mou 	LIST_HEAD(act_list, mlx5_action_construct_data) act_list;
1353f13fab23SSuanming Mou 	struct mlx5_hw_jump_action *jump; /* Jump action. */
13543a2f674bSSuanming Mou 	struct mlx5_hrxq *tir; /* TIR action. */
13550f4aa72bSSuanming Mou 	struct mlx5_hw_modify_header_action *mhdr; /* Modify header action. */
1356fe3620aaSSuanming Mou 	/* Encap/Decap action. */
1357fe3620aaSSuanming Mou 	struct mlx5_hw_encap_decap_action *encap_decap;
1358fe3620aaSSuanming Mou 	uint16_t encap_decap_pos; /* Encap/Decap action position. */
13591deadfd7SSuanming Mou 	uint32_t mark:1; /* Indicate the mark action. */
136004a4de75SMichael Baum 	cnt_id_t cnt_id; /* Counter id. */
136148fbb0e9SAlexander Kozyrev 	uint32_t mtr_id; /* Meter id. */
1362f13fab23SSuanming Mou 	/* Translated DR action array from action template. */
1363f13fab23SSuanming Mou 	struct mlx5dr_rule_action rule_acts[MLX5_HW_MAX_ACTS];
1364d1559d66SSuanming Mou };
1365d1559d66SSuanming Mou 
1366d1559d66SSuanming Mou /* mlx5 action template struct. */
1367d1559d66SSuanming Mou struct mlx5_hw_action_template {
1368d1559d66SSuanming Mou 	/* Action template pointer. */
1369d1559d66SSuanming Mou 	struct rte_flow_actions_template *action_template;
1370d1559d66SSuanming Mou 	struct mlx5_hw_actions acts; /* Template actions. */
1371d1559d66SSuanming Mou };
1372d1559d66SSuanming Mou 
1373d1559d66SSuanming Mou /* mlx5 flow group struct. */
1374d1559d66SSuanming Mou struct mlx5_flow_group {
1375d1559d66SSuanming Mou 	struct mlx5_list_entry entry;
13761939eb6fSDariusz Sosnowski 	struct rte_eth_dev *dev; /* Reference to corresponding device. */
1377d1559d66SSuanming Mou 	struct mlx5dr_table *tbl; /* HWS table object. */
1378d1559d66SSuanming Mou 	struct mlx5_hw_jump_action jump; /* Jump action. */
1379d1559d66SSuanming Mou 	enum mlx5dr_table_type type; /* Table type. */
1380d1559d66SSuanming Mou 	uint32_t group_id; /* Group id. */
1381d1559d66SSuanming Mou 	uint32_t idx; /* Group memory index. */
1382d1559d66SSuanming Mou };
1383d1559d66SSuanming Mou 
1384d1559d66SSuanming Mou 
1385d1559d66SSuanming Mou #define MLX5_HW_TBL_MAX_ITEM_TEMPLATE 2
1386d1559d66SSuanming Mou #define MLX5_HW_TBL_MAX_ACTION_TEMPLATE 32
1387d1559d66SSuanming Mou 
1388ddb68e47SBing Zhao struct mlx5_flow_template_table_cfg {
1389ddb68e47SBing Zhao 	struct rte_flow_template_table_attr attr; /* Table attributes passed through flow API. */
1390ddb68e47SBing Zhao 	bool external; /* True if created by flow API, false if table is internal to PMD. */
1391ddb68e47SBing Zhao };
1392ddb68e47SBing Zhao 
1393d1559d66SSuanming Mou struct rte_flow_template_table {
1394d1559d66SSuanming Mou 	LIST_ENTRY(rte_flow_template_table) next;
1395d1559d66SSuanming Mou 	struct mlx5_flow_group *grp; /* The group rte_flow_template_table uses. */
1396d1559d66SSuanming Mou 	struct mlx5dr_matcher *matcher; /* Template matcher. */
1397d1559d66SSuanming Mou 	/* Item templates bind to the table. */
1398d1559d66SSuanming Mou 	struct rte_flow_pattern_template *its[MLX5_HW_TBL_MAX_ITEM_TEMPLATE];
1399d1559d66SSuanming Mou 	/* Action templates bind to the table. */
1400d1559d66SSuanming Mou 	struct mlx5_hw_action_template ats[MLX5_HW_TBL_MAX_ACTION_TEMPLATE];
1401d1559d66SSuanming Mou 	struct mlx5_indexed_pool *flow; /* The table's flow ipool. */
140263296851SAlexander Kozyrev 	struct mlx5_indexed_pool *resource; /* The table's resource ipool. */
1403ddb68e47SBing Zhao 	struct mlx5_flow_template_table_cfg cfg;
1404d1559d66SSuanming Mou 	uint32_t type; /* Flow table type RX/TX/FDB. */
1405d1559d66SSuanming Mou 	uint8_t nb_item_templates; /* Item template number. */
1406d1559d66SSuanming Mou 	uint8_t nb_action_templates; /* Action template number. */
1407d1559d66SSuanming Mou 	uint32_t refcnt; /* Table reference counter. */
1408d1559d66SSuanming Mou };
1409d1559d66SSuanming Mou 
141042431df9SSuanming Mou #endif
141142431df9SSuanming Mou 
1412d7cfcdddSAndrey Vesnovaty /*
1413d7cfcdddSAndrey Vesnovaty  * Define list of valid combinations of RX Hash fields
1414d7cfcdddSAndrey Vesnovaty  * (see enum ibv_rx_hash_fields).
1415d7cfcdddSAndrey Vesnovaty  */
1416d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV4 (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4)
1417d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV4_TCP \
1418d7cfcdddSAndrey Vesnovaty 	(MLX5_RSS_HASH_IPV4 | \
1419c83456cdSDekel Peled 	 IBV_RX_HASH_SRC_PORT_TCP | IBV_RX_HASH_DST_PORT_TCP)
1420d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV4_UDP \
1421d7cfcdddSAndrey Vesnovaty 	(MLX5_RSS_HASH_IPV4 | \
1422c83456cdSDekel Peled 	 IBV_RX_HASH_SRC_PORT_UDP | IBV_RX_HASH_DST_PORT_UDP)
1423d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV6 (IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6)
1424d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV6_TCP \
1425d7cfcdddSAndrey Vesnovaty 	(MLX5_RSS_HASH_IPV6 | \
1426c83456cdSDekel Peled 	 IBV_RX_HASH_SRC_PORT_TCP | IBV_RX_HASH_DST_PORT_TCP)
1427d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV6_UDP \
1428d7cfcdddSAndrey Vesnovaty 	(MLX5_RSS_HASH_IPV6 | \
1429c83456cdSDekel Peled 	 IBV_RX_HASH_SRC_PORT_UDP | IBV_RX_HASH_DST_PORT_UDP)
1430212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_SRC_ONLY IBV_RX_HASH_SRC_IPV4
1431212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_DST_ONLY IBV_RX_HASH_DST_IPV4
1432212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_SRC_ONLY IBV_RX_HASH_SRC_IPV6
1433212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_DST_ONLY IBV_RX_HASH_DST_IPV6
1434212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_UDP_SRC_ONLY \
1435212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV4 | IBV_RX_HASH_SRC_PORT_UDP)
1436212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_UDP_DST_ONLY \
1437212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV4 | IBV_RX_HASH_DST_PORT_UDP)
1438212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_UDP_SRC_ONLY \
1439212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV6 | IBV_RX_HASH_SRC_PORT_UDP)
1440212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_UDP_DST_ONLY \
1441212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV6 | IBV_RX_HASH_DST_PORT_UDP)
1442212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_TCP_SRC_ONLY \
1443212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV4 | IBV_RX_HASH_SRC_PORT_TCP)
1444212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_TCP_DST_ONLY \
1445212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV4 | IBV_RX_HASH_DST_PORT_TCP)
1446212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_TCP_SRC_ONLY \
1447212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV6 | IBV_RX_HASH_SRC_PORT_TCP)
1448212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_TCP_DST_ONLY \
1449212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV6 | IBV_RX_HASH_DST_PORT_TCP)
145018ca4a4eSRaja Zidane 
145118ca4a4eSRaja Zidane #ifndef HAVE_IBV_RX_HASH_IPSEC_SPI
145218ca4a4eSRaja Zidane #define IBV_RX_HASH_IPSEC_SPI (1U << 8)
145318ca4a4eSRaja Zidane #endif
145418ca4a4eSRaja Zidane 
145518ca4a4eSRaja Zidane #define MLX5_RSS_HASH_ESP_SPI IBV_RX_HASH_IPSEC_SPI
145618ca4a4eSRaja Zidane #define MLX5_RSS_HASH_IPV4_ESP (MLX5_RSS_HASH_IPV4 | \
145718ca4a4eSRaja Zidane 				MLX5_RSS_HASH_ESP_SPI)
145818ca4a4eSRaja Zidane #define MLX5_RSS_HASH_IPV6_ESP (MLX5_RSS_HASH_IPV6 | \
145918ca4a4eSRaja Zidane 				MLX5_RSS_HASH_ESP_SPI)
1460d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_NONE 0ULL
1461d7cfcdddSAndrey Vesnovaty 
14620e04e1e2SXueming Li #define MLX5_RSS_IS_SYMM(func) \
14630e04e1e2SXueming Li 		((func) == RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ)
14640e04e1e2SXueming Li 
146579f89527SGregory Etelson 
146679f89527SGregory Etelson /* extract next protocol type from Ethernet & VLAN headers */
146779f89527SGregory Etelson #define MLX5_ETHER_TYPE_FROM_HEADER(_s, _m, _itm, _prt) do { \
146879f89527SGregory Etelson 	(_prt) = ((const struct _s *)(_itm)->mask)->_m;       \
146979f89527SGregory Etelson 	(_prt) &= ((const struct _s *)(_itm)->spec)->_m;      \
147079f89527SGregory Etelson 	(_prt) = rte_be_to_cpu_16((_prt));                    \
147179f89527SGregory Etelson } while (0)
147279f89527SGregory Etelson 
1473d7cfcdddSAndrey Vesnovaty /* array of valid combinations of RX Hash fields for RSS */
1474d7cfcdddSAndrey Vesnovaty static const uint64_t mlx5_rss_hash_fields[] = {
1475d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_IPV4,
1476d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_IPV4_TCP,
1477d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_IPV4_UDP,
147818ca4a4eSRaja Zidane 	MLX5_RSS_HASH_IPV4_ESP,
1479d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_IPV6,
1480d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_IPV6_TCP,
1481d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_IPV6_UDP,
148218ca4a4eSRaja Zidane 	MLX5_RSS_HASH_IPV6_ESP,
148318ca4a4eSRaja Zidane 	MLX5_RSS_HASH_ESP_SPI,
1484d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_NONE,
1485d7cfcdddSAndrey Vesnovaty };
1486d7cfcdddSAndrey Vesnovaty 
1487d7cfcdddSAndrey Vesnovaty /* Shared RSS action structure */
1488d7cfcdddSAndrey Vesnovaty struct mlx5_shared_action_rss {
14894a42ac1fSMatan Azrad 	ILIST_ENTRY(uint32_t)next; /**< Index to the next RSS structure. */
14904a42ac1fSMatan Azrad 	uint32_t refcnt; /**< Atomically accessed refcnt. */
1491d7cfcdddSAndrey Vesnovaty 	struct rte_flow_action_rss origin; /**< Original rte RSS action. */
1492d7cfcdddSAndrey Vesnovaty 	uint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */
1493fa7ad49eSAndrey Vesnovaty 	struct mlx5_ind_table_obj *ind_tbl;
1494fa7ad49eSAndrey Vesnovaty 	/**< Hash RX queues (hrxq, hrxq_tunnel fields) indirection table. */
1495d7cfcdddSAndrey Vesnovaty 	uint32_t hrxq[MLX5_RSS_HASH_FIELDS_LEN];
1496d7cfcdddSAndrey Vesnovaty 	/**< Hash RX queue indexes mapped to mlx5_rss_hash_fields */
1497fa7ad49eSAndrey Vesnovaty 	rte_spinlock_t action_rss_sl; /**< Shared RSS action spinlock. */
1498d7cfcdddSAndrey Vesnovaty };
1499d7cfcdddSAndrey Vesnovaty 
15004b61b877SBing Zhao struct rte_flow_action_handle {
15014a42ac1fSMatan Azrad 	uint32_t id;
1502d7cfcdddSAndrey Vesnovaty };
1503d7cfcdddSAndrey Vesnovaty 
15048bb81f26SXueming Li /* Thread specific flow workspace intermediate data. */
15058bb81f26SXueming Li struct mlx5_flow_workspace {
15060064bf43SXueming Li 	/* If creating another flow in same thread, push new as stack. */
15070064bf43SXueming Li 	struct mlx5_flow_workspace *prev;
15080064bf43SXueming Li 	struct mlx5_flow_workspace *next;
1509dc7c5e0aSGregory Etelson 	struct mlx5_flow_workspace *gc;
15100064bf43SXueming Li 	uint32_t inuse; /* can't create new flow with current. */
15118bb81f26SXueming Li 	struct mlx5_flow flows[MLX5_NUM_MAX_DEV_FLOWS];
15120064bf43SXueming Li 	struct mlx5_flow_rss_desc rss_desc;
151338c6dc20SXueming Li 	uint32_t flow_idx; /* Intermediate device flow index. */
1514e6100c7bSLi Zhang 	struct mlx5_flow_meter_info *fm; /* Pointer to the meter in flow. */
151550cc92ddSShun Hao 	struct mlx5_flow_meter_policy *policy;
151650cc92ddSShun Hao 	/* The meter policy used by meter in flow. */
151750cc92ddSShun Hao 	struct mlx5_flow_meter_policy *final_policy;
151850cc92ddSShun Hao 	/* The final policy when meter policy is hierarchy. */
151951ec04dcSShun Hao 	uint32_t skip_matcher_reg:1;
152051ec04dcSShun Hao 	/* Indicates if need to skip matcher register in translate. */
1521082becbfSRaja Zidane 	uint32_t mark:1; /* Indicates if flow contains mark action. */
1522cd4ab742SSuanming Mou 	uint32_t vport_meta_tag; /* Used for vport index match. */
1523cd4ab742SSuanming Mou };
1524cd4ab742SSuanming Mou 
1525cd4ab742SSuanming Mou /* Matcher translate type. */
1526cd4ab742SSuanming Mou enum MLX5_SET_MATCHER {
1527cd4ab742SSuanming Mou 	MLX5_SET_MATCHER_SW_V = 1 << 0,
1528cd4ab742SSuanming Mou 	MLX5_SET_MATCHER_SW_M = 1 << 1,
1529cd4ab742SSuanming Mou 	MLX5_SET_MATCHER_HS_V = 1 << 2,
1530cd4ab742SSuanming Mou 	MLX5_SET_MATCHER_HS_M = 1 << 3,
1531cd4ab742SSuanming Mou };
1532cd4ab742SSuanming Mou 
1533cd4ab742SSuanming Mou #define MLX5_SET_MATCHER_SW (MLX5_SET_MATCHER_SW_V | MLX5_SET_MATCHER_SW_M)
1534cd4ab742SSuanming Mou #define MLX5_SET_MATCHER_HS (MLX5_SET_MATCHER_HS_V | MLX5_SET_MATCHER_HS_M)
1535cd4ab742SSuanming Mou #define MLX5_SET_MATCHER_V (MLX5_SET_MATCHER_SW_V | MLX5_SET_MATCHER_HS_V)
1536cd4ab742SSuanming Mou #define MLX5_SET_MATCHER_M (MLX5_SET_MATCHER_SW_M | MLX5_SET_MATCHER_HS_M)
1537cd4ab742SSuanming Mou 
1538cd4ab742SSuanming Mou /* Flow matcher workspace intermediate data. */
1539cd4ab742SSuanming Mou struct mlx5_dv_matcher_workspace {
1540cd4ab742SSuanming Mou 	uint8_t priority; /* Flow priority. */
1541cd4ab742SSuanming Mou 	uint64_t last_item; /* Last item in pattern. */
1542cd4ab742SSuanming Mou 	uint64_t item_flags; /* Flow item pattern flags. */
1543cd4ab742SSuanming Mou 	uint64_t action_flags; /* Flow action flags. */
1544cd4ab742SSuanming Mou 	bool external; /* External flow or not. */
1545cd4ab742SSuanming Mou 	uint32_t vlan_tag:12; /* Flow item VLAN tag. */
1546cd4ab742SSuanming Mou 	uint8_t next_protocol; /* Tunnel next protocol */
1547cd4ab742SSuanming Mou 	uint32_t geneve_tlv_option; /* Flow item Geneve TLV option. */
1548cd4ab742SSuanming Mou 	uint32_t group; /* Flow group. */
1549cd4ab742SSuanming Mou 	uint16_t udp_dport; /* Flow item UDP port. */
1550cd4ab742SSuanming Mou 	const struct rte_flow_attr *attr; /* Flow attribute. */
1551cd4ab742SSuanming Mou 	struct mlx5_flow_rss_desc *rss_desc; /* RSS descriptor. */
1552cd4ab742SSuanming Mou 	const struct rte_flow_item *tunnel_item; /* Flow tunnel item. */
1553cd4ab742SSuanming Mou 	const struct rte_flow_item *gre_item; /* Flow GRE item. */
1554a3778a47SGregory Etelson 	const struct rte_flow_item *integrity_items[2];
15558bb81f26SXueming Li };
15568bb81f26SXueming Li 
15579ade91dfSJiawei Wang struct mlx5_flow_split_info {
1558693c7d4bSJiawei Wang 	uint32_t external:1;
15599ade91dfSJiawei Wang 	/**< True if flow is created by request external to PMD. */
1560693c7d4bSJiawei Wang 	uint32_t prefix_mark:1; /**< Prefix subflow mark flag. */
1561693c7d4bSJiawei Wang 	uint32_t skip_scale:8; /**< Skip the scale the table with factor. */
15629ade91dfSJiawei Wang 	uint32_t flow_idx; /**< This memory pool index to the flow. */
15632d2cef5dSLi Zhang 	uint32_t table_id; /**< Flow table identifier. */
1564693c7d4bSJiawei Wang 	uint64_t prefix_layers; /**< Prefix subflow layers. */
15659ade91dfSJiawei Wang };
15669ade91dfSJiawei Wang 
15675bd0e3e6SDariusz Sosnowski struct flow_hw_port_info {
15685bd0e3e6SDariusz Sosnowski 	uint32_t regc_mask;
15695bd0e3e6SDariusz Sosnowski 	uint32_t regc_value;
15705bd0e3e6SDariusz Sosnowski 	uint32_t is_wire:1;
15715bd0e3e6SDariusz Sosnowski };
15725bd0e3e6SDariusz Sosnowski 
15735bd0e3e6SDariusz Sosnowski extern struct flow_hw_port_info mlx5_flow_hw_port_infos[RTE_MAX_ETHPORTS];
15745bd0e3e6SDariusz Sosnowski 
15758a89038fSBing Zhao #define MLX5_FLOW_HW_TAGS_MAX 8
15768a89038fSBing Zhao extern uint32_t mlx5_flow_hw_avl_tags_init_cnt;
15778a89038fSBing Zhao extern enum modify_reg mlx5_flow_hw_avl_tags[];
1578463170a7SSuanming Mou extern enum modify_reg mlx5_flow_hw_aso_tag;
15798a89038fSBing Zhao 
15805bd0e3e6SDariusz Sosnowski /*
15815bd0e3e6SDariusz Sosnowski  * Get metadata match tag and mask for given rte_eth_dev port.
15825bd0e3e6SDariusz Sosnowski  * Used in HWS rule creation.
15835bd0e3e6SDariusz Sosnowski  */
15845bd0e3e6SDariusz Sosnowski static __rte_always_inline const struct flow_hw_port_info *
15855bd0e3e6SDariusz Sosnowski flow_hw_conv_port_id(const uint16_t port_id)
15865bd0e3e6SDariusz Sosnowski {
15875bd0e3e6SDariusz Sosnowski 	struct flow_hw_port_info *port_info;
15885bd0e3e6SDariusz Sosnowski 
15895bd0e3e6SDariusz Sosnowski 	if (port_id >= RTE_MAX_ETHPORTS)
15905bd0e3e6SDariusz Sosnowski 		return NULL;
15915bd0e3e6SDariusz Sosnowski 	port_info = &mlx5_flow_hw_port_infos[port_id];
15925bd0e3e6SDariusz Sosnowski 	return !!port_info->regc_mask ? port_info : NULL;
15935bd0e3e6SDariusz Sosnowski }
15945bd0e3e6SDariusz Sosnowski 
15955bd0e3e6SDariusz Sosnowski #ifdef HAVE_IBV_FLOW_DV_SUPPORT
15965bd0e3e6SDariusz Sosnowski /*
15975bd0e3e6SDariusz Sosnowski  * Get metadata match tag and mask for the uplink port represented
15985bd0e3e6SDariusz Sosnowski  * by given IB context. Used in HWS context creation.
15995bd0e3e6SDariusz Sosnowski  */
16005bd0e3e6SDariusz Sosnowski static __rte_always_inline const struct flow_hw_port_info *
16015bd0e3e6SDariusz Sosnowski flow_hw_get_wire_port(struct ibv_context *ibctx)
16025bd0e3e6SDariusz Sosnowski {
16035bd0e3e6SDariusz Sosnowski 	struct ibv_device *ibdev = ibctx->device;
16045bd0e3e6SDariusz Sosnowski 	uint16_t port_id;
16055bd0e3e6SDariusz Sosnowski 
16065bd0e3e6SDariusz Sosnowski 	MLX5_ETH_FOREACH_DEV(port_id, NULL) {
16075bd0e3e6SDariusz Sosnowski 		const struct mlx5_priv *priv =
16085bd0e3e6SDariusz Sosnowski 				rte_eth_devices[port_id].data->dev_private;
16095bd0e3e6SDariusz Sosnowski 
16105bd0e3e6SDariusz Sosnowski 		if (priv && priv->master) {
16115bd0e3e6SDariusz Sosnowski 			struct ibv_context *port_ibctx = priv->sh->cdev->ctx;
16125bd0e3e6SDariusz Sosnowski 
16135bd0e3e6SDariusz Sosnowski 			if (port_ibctx->device == ibdev)
16145bd0e3e6SDariusz Sosnowski 				return flow_hw_conv_port_id(port_id);
16155bd0e3e6SDariusz Sosnowski 		}
16165bd0e3e6SDariusz Sosnowski 	}
16175bd0e3e6SDariusz Sosnowski 	return NULL;
16185bd0e3e6SDariusz Sosnowski }
16195bd0e3e6SDariusz Sosnowski #endif
16205bd0e3e6SDariusz Sosnowski 
1621f1fecffaSDariusz Sosnowski extern uint32_t mlx5_flow_hw_flow_metadata_config_refcnt;
1622f1fecffaSDariusz Sosnowski extern uint8_t mlx5_flow_hw_flow_metadata_esw_en;
1623f1fecffaSDariusz Sosnowski extern uint8_t mlx5_flow_hw_flow_metadata_xmeta_en;
1624f1fecffaSDariusz Sosnowski 
1625f1fecffaSDariusz Sosnowski void flow_hw_init_flow_metadata_config(struct rte_eth_dev *dev);
1626f1fecffaSDariusz Sosnowski void flow_hw_clear_flow_metadata_config(void);
1627f1fecffaSDariusz Sosnowski 
16288a89038fSBing Zhao /*
16298a89038fSBing Zhao  * Convert metadata or tag to the actual register.
16308a89038fSBing Zhao  * META: Can only be used to match in the FDB in this stage, fixed C_1.
16318a89038fSBing Zhao  * TAG: C_x expect meter color reg and the reserved ones.
16328a89038fSBing Zhao  * TODO: Per port / device, FDB or NIC for Meta matching.
16338a89038fSBing Zhao  */
16348a89038fSBing Zhao static __rte_always_inline int
16358a89038fSBing Zhao flow_hw_get_reg_id(enum rte_flow_item_type type, uint32_t id)
16368a89038fSBing Zhao {
16378a89038fSBing Zhao 	switch (type) {
16388a89038fSBing Zhao 	case RTE_FLOW_ITEM_TYPE_META:
1639f1fecffaSDariusz Sosnowski #ifdef HAVE_MLX5_HWS_SUPPORT
1640f1fecffaSDariusz Sosnowski 		if (mlx5_flow_hw_flow_metadata_esw_en &&
1641f1fecffaSDariusz Sosnowski 		    mlx5_flow_hw_flow_metadata_xmeta_en == MLX5_XMETA_MODE_META32_HWS) {
16428a89038fSBing Zhao 			return REG_C_1;
1643f1fecffaSDariusz Sosnowski 		}
1644f1fecffaSDariusz Sosnowski #endif
1645f1fecffaSDariusz Sosnowski 		/*
1646f1fecffaSDariusz Sosnowski 		 * On root table - PMD allows only egress META matching, thus
1647f1fecffaSDariusz Sosnowski 		 * REG_A matching is sufficient.
1648f1fecffaSDariusz Sosnowski 		 *
1649f1fecffaSDariusz Sosnowski 		 * On non-root tables - REG_A corresponds to general_purpose_lookup_field,
1650f1fecffaSDariusz Sosnowski 		 * which translates to REG_A in NIC TX and to REG_B in NIC RX.
1651f1fecffaSDariusz Sosnowski 		 * However, current FW does not implement REG_B case right now, so
1652f1fecffaSDariusz Sosnowski 		 * REG_B case should be rejected on pattern template validation.
1653f1fecffaSDariusz Sosnowski 		 */
1654f1fecffaSDariusz Sosnowski 		return REG_A;
1655463170a7SSuanming Mou 	case RTE_FLOW_ITEM_TYPE_CONNTRACK:
165648fbb0e9SAlexander Kozyrev 	case RTE_FLOW_ITEM_TYPE_METER_COLOR:
1657463170a7SSuanming Mou 		return mlx5_flow_hw_aso_tag;
16588a89038fSBing Zhao 	case RTE_FLOW_ITEM_TYPE_TAG:
16595f5e2f86SAlexander Kozyrev 		if (id == MLX5_LINEAR_HASH_TAG_INDEX)
16605f5e2f86SAlexander Kozyrev 			return REG_C_3;
16618a89038fSBing Zhao 		MLX5_ASSERT(id < MLX5_FLOW_HW_TAGS_MAX);
16628a89038fSBing Zhao 		return mlx5_flow_hw_avl_tags[id];
16638a89038fSBing Zhao 	default:
16648a89038fSBing Zhao 		return REG_NON;
16658a89038fSBing Zhao 	}
16668a89038fSBing Zhao }
16678a89038fSBing Zhao 
16685bd0e3e6SDariusz Sosnowski void flow_hw_set_port_info(struct rte_eth_dev *dev);
16695bd0e3e6SDariusz Sosnowski void flow_hw_clear_port_info(struct rte_eth_dev *dev);
16705bd0e3e6SDariusz Sosnowski 
16718a89038fSBing Zhao void flow_hw_init_tags_set(struct rte_eth_dev *dev);
16728a89038fSBing Zhao void flow_hw_clear_tags_set(struct rte_eth_dev *dev);
16738a89038fSBing Zhao 
16741939eb6fSDariusz Sosnowski int flow_hw_create_vport_action(struct rte_eth_dev *dev);
16751939eb6fSDariusz Sosnowski void flow_hw_destroy_vport_action(struct rte_eth_dev *dev);
16761939eb6fSDariusz Sosnowski 
167784c406e7SOri Kam typedef int (*mlx5_flow_validate_t)(struct rte_eth_dev *dev,
167884c406e7SOri Kam 				    const struct rte_flow_attr *attr,
167984c406e7SOri Kam 				    const struct rte_flow_item items[],
168084c406e7SOri Kam 				    const struct rte_flow_action actions[],
1681b67b4ecbSDekel Peled 				    bool external,
168272a944dbSBing Zhao 				    int hairpin,
168384c406e7SOri Kam 				    struct rte_flow_error *error);
168484c406e7SOri Kam typedef struct mlx5_flow *(*mlx5_flow_prepare_t)
1685e7bfa359SBing Zhao 	(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
1686e7bfa359SBing Zhao 	 const struct rte_flow_item items[],
1687c1cfb132SYongseok Koh 	 const struct rte_flow_action actions[], struct rte_flow_error *error);
168884c406e7SOri Kam typedef int (*mlx5_flow_translate_t)(struct rte_eth_dev *dev,
168984c406e7SOri Kam 				     struct mlx5_flow *dev_flow,
169084c406e7SOri Kam 				     const struct rte_flow_attr *attr,
169184c406e7SOri Kam 				     const struct rte_flow_item items[],
169284c406e7SOri Kam 				     const struct rte_flow_action actions[],
169384c406e7SOri Kam 				     struct rte_flow_error *error);
169484c406e7SOri Kam typedef int (*mlx5_flow_apply_t)(struct rte_eth_dev *dev, struct rte_flow *flow,
169584c406e7SOri Kam 				 struct rte_flow_error *error);
169684c406e7SOri Kam typedef void (*mlx5_flow_remove_t)(struct rte_eth_dev *dev,
169784c406e7SOri Kam 				   struct rte_flow *flow);
169884c406e7SOri Kam typedef void (*mlx5_flow_destroy_t)(struct rte_eth_dev *dev,
169984c406e7SOri Kam 				    struct rte_flow *flow);
1700684dafe7SMoti Haimovsky typedef int (*mlx5_flow_query_t)(struct rte_eth_dev *dev,
1701684dafe7SMoti Haimovsky 				 struct rte_flow *flow,
1702684dafe7SMoti Haimovsky 				 const struct rte_flow_action *actions,
1703684dafe7SMoti Haimovsky 				 void *data,
1704684dafe7SMoti Haimovsky 				 struct rte_flow_error *error);
170544432018SLi Zhang typedef int (*mlx5_flow_create_mtr_tbls_t)(struct rte_eth_dev *dev,
170644432018SLi Zhang 					struct mlx5_flow_meter_info *fm,
170744432018SLi Zhang 					uint32_t mtr_idx,
170844432018SLi Zhang 					uint8_t domain_bitmap);
170944432018SLi Zhang typedef void (*mlx5_flow_destroy_mtr_tbls_t)(struct rte_eth_dev *dev,
171044432018SLi Zhang 				struct mlx5_flow_meter_info *fm);
1711afb4aa4fSLi Zhang typedef void (*mlx5_flow_destroy_mtr_drop_tbls_t)(struct rte_eth_dev *dev);
1712fc6ce56bSLi Zhang typedef struct mlx5_flow_meter_sub_policy *
1713fc6ce56bSLi Zhang 	(*mlx5_flow_meter_sub_policy_rss_prepare_t)
1714fc6ce56bSLi Zhang 		(struct rte_eth_dev *dev,
1715fc6ce56bSLi Zhang 		struct mlx5_flow_meter_policy *mtr_policy,
1716fc6ce56bSLi Zhang 		struct mlx5_flow_rss_desc *rss_desc[MLX5_MTR_RTE_COLORS]);
17178e5c9feaSShun Hao typedef int (*mlx5_flow_meter_hierarchy_rule_create_t)
17188e5c9feaSShun Hao 		(struct rte_eth_dev *dev,
17198e5c9feaSShun Hao 		struct mlx5_flow_meter_info *fm,
17208e5c9feaSShun Hao 		int32_t src_port,
17218e5c9feaSShun Hao 		const struct rte_flow_item *item,
17228e5c9feaSShun Hao 		struct rte_flow_error *error);
1723ec962badSLi Zhang typedef void (*mlx5_flow_destroy_sub_policy_with_rxq_t)
1724ec962badSLi Zhang 	(struct rte_eth_dev *dev,
1725ec962badSLi Zhang 	struct mlx5_flow_meter_policy *mtr_policy);
1726e6100c7bSLi Zhang typedef uint32_t (*mlx5_flow_mtr_alloc_t)
1727e6100c7bSLi Zhang 					    (struct rte_eth_dev *dev);
1728e6100c7bSLi Zhang typedef void (*mlx5_flow_mtr_free_t)(struct rte_eth_dev *dev,
1729e6100c7bSLi Zhang 						uint32_t mtr_idx);
1730956d5c74SSuanming Mou typedef uint32_t (*mlx5_flow_counter_alloc_t)
1731e189f55cSSuanming Mou 				   (struct rte_eth_dev *dev);
1732e189f55cSSuanming Mou typedef void (*mlx5_flow_counter_free_t)(struct rte_eth_dev *dev,
1733956d5c74SSuanming Mou 					 uint32_t cnt);
1734e189f55cSSuanming Mou typedef int (*mlx5_flow_counter_query_t)(struct rte_eth_dev *dev,
1735956d5c74SSuanming Mou 					 uint32_t cnt,
1736e189f55cSSuanming Mou 					 bool clear, uint64_t *pkts,
17379b57df55SHaifei Luo 					 uint64_t *bytes, void **action);
1738fa2d01c8SDong Zhou typedef int (*mlx5_flow_get_aged_flows_t)
1739fa2d01c8SDong Zhou 					(struct rte_eth_dev *dev,
1740fa2d01c8SDong Zhou 					 void **context,
1741fa2d01c8SDong Zhou 					 uint32_t nb_contexts,
1742fa2d01c8SDong Zhou 					 struct rte_flow_error *error);
174304a4de75SMichael Baum typedef int (*mlx5_flow_get_q_aged_flows_t)
174404a4de75SMichael Baum 					(struct rte_eth_dev *dev,
174504a4de75SMichael Baum 					 uint32_t queue_id,
174604a4de75SMichael Baum 					 void **context,
174704a4de75SMichael Baum 					 uint32_t nb_contexts,
174804a4de75SMichael Baum 					 struct rte_flow_error *error);
1749d7cfcdddSAndrey Vesnovaty typedef int (*mlx5_flow_action_validate_t)
1750d7cfcdddSAndrey Vesnovaty 				(struct rte_eth_dev *dev,
17514b61b877SBing Zhao 				 const struct rte_flow_indir_action_conf *conf,
1752d7cfcdddSAndrey Vesnovaty 				 const struct rte_flow_action *action,
1753d7cfcdddSAndrey Vesnovaty 				 struct rte_flow_error *error);
17544b61b877SBing Zhao typedef struct rte_flow_action_handle *(*mlx5_flow_action_create_t)
1755d7cfcdddSAndrey Vesnovaty 				(struct rte_eth_dev *dev,
17564b61b877SBing Zhao 				 const struct rte_flow_indir_action_conf *conf,
1757d7cfcdddSAndrey Vesnovaty 				 const struct rte_flow_action *action,
1758d7cfcdddSAndrey Vesnovaty 				 struct rte_flow_error *error);
1759d7cfcdddSAndrey Vesnovaty typedef int (*mlx5_flow_action_destroy_t)
1760d7cfcdddSAndrey Vesnovaty 				(struct rte_eth_dev *dev,
17614b61b877SBing Zhao 				 struct rte_flow_action_handle *action,
1762d7cfcdddSAndrey Vesnovaty 				 struct rte_flow_error *error);
1763d7cfcdddSAndrey Vesnovaty typedef int (*mlx5_flow_action_update_t)
1764d7cfcdddSAndrey Vesnovaty 			(struct rte_eth_dev *dev,
17654b61b877SBing Zhao 			 struct rte_flow_action_handle *action,
17664b61b877SBing Zhao 			 const void *update,
1767d7cfcdddSAndrey Vesnovaty 			 struct rte_flow_error *error);
176881073e1fSMatan Azrad typedef int (*mlx5_flow_action_query_t)
176981073e1fSMatan Azrad 			(struct rte_eth_dev *dev,
17704b61b877SBing Zhao 			 const struct rte_flow_action_handle *action,
177181073e1fSMatan Azrad 			 void *data,
177281073e1fSMatan Azrad 			 struct rte_flow_error *error);
177315896eafSGregory Etelson typedef int (*mlx5_flow_action_query_update_t)
177415896eafSGregory Etelson 			(struct rte_eth_dev *dev,
177515896eafSGregory Etelson 			 struct rte_flow_action_handle *handle,
177615896eafSGregory Etelson 			 const void *update, void *data,
177715896eafSGregory Etelson 			 enum rte_flow_query_update_mode qu_mode,
177815896eafSGregory Etelson 			 struct rte_flow_error *error);
177923f627e0SBing Zhao typedef int (*mlx5_flow_sync_domain_t)
178023f627e0SBing Zhao 			(struct rte_eth_dev *dev,
178123f627e0SBing Zhao 			 uint32_t domains,
178223f627e0SBing Zhao 			 uint32_t flags);
1783afb4aa4fSLi Zhang typedef int (*mlx5_flow_validate_mtr_acts_t)
1784afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev,
1785afb4aa4fSLi Zhang 			 const struct rte_flow_action *actions[RTE_COLORS],
1786afb4aa4fSLi Zhang 			 struct rte_flow_attr *attr,
1787afb4aa4fSLi Zhang 			 bool *is_rss,
1788afb4aa4fSLi Zhang 			 uint8_t *domain_bitmap,
17894b7bf3ffSBing Zhao 			 uint8_t *policy_mode,
1790afb4aa4fSLi Zhang 			 struct rte_mtr_error *error);
1791afb4aa4fSLi Zhang typedef int (*mlx5_flow_create_mtr_acts_t)
1792afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev,
1793afb4aa4fSLi Zhang 		      struct mlx5_flow_meter_policy *mtr_policy,
1794afb4aa4fSLi Zhang 		      const struct rte_flow_action *actions[RTE_COLORS],
17956431068dSSean Zhang 		      struct rte_flow_attr *attr,
1796afb4aa4fSLi Zhang 		      struct rte_mtr_error *error);
1797afb4aa4fSLi Zhang typedef void (*mlx5_flow_destroy_mtr_acts_t)
1798afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev,
1799afb4aa4fSLi Zhang 		      struct mlx5_flow_meter_policy *mtr_policy);
1800afb4aa4fSLi Zhang typedef int (*mlx5_flow_create_policy_rules_t)
1801afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev,
1802afb4aa4fSLi Zhang 			  struct mlx5_flow_meter_policy *mtr_policy);
1803afb4aa4fSLi Zhang typedef void (*mlx5_flow_destroy_policy_rules_t)
1804afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev,
1805afb4aa4fSLi Zhang 			  struct mlx5_flow_meter_policy *mtr_policy);
1806afb4aa4fSLi Zhang typedef int (*mlx5_flow_create_def_policy_t)
1807afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev);
1808afb4aa4fSLi Zhang typedef void (*mlx5_flow_destroy_def_policy_t)
1809afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev);
1810c5042f93SDmitry Kozlyuk typedef int (*mlx5_flow_discover_priorities_t)
1811c5042f93SDmitry Kozlyuk 			(struct rte_eth_dev *dev,
1812c5042f93SDmitry Kozlyuk 			 const uint16_t *vprio, int vprio_n);
1813db25cadcSViacheslav Ovsiienko typedef struct rte_flow_item_flex_handle *(*mlx5_flow_item_create_t)
1814db25cadcSViacheslav Ovsiienko 			(struct rte_eth_dev *dev,
1815db25cadcSViacheslav Ovsiienko 			 const struct rte_flow_item_flex_conf *conf,
1816db25cadcSViacheslav Ovsiienko 			 struct rte_flow_error *error);
1817db25cadcSViacheslav Ovsiienko typedef int (*mlx5_flow_item_release_t)
1818db25cadcSViacheslav Ovsiienko 			(struct rte_eth_dev *dev,
1819db25cadcSViacheslav Ovsiienko 			 const struct rte_flow_item_flex_handle *handle,
1820db25cadcSViacheslav Ovsiienko 			 struct rte_flow_error *error);
1821db25cadcSViacheslav Ovsiienko typedef int (*mlx5_flow_item_update_t)
1822db25cadcSViacheslav Ovsiienko 			(struct rte_eth_dev *dev,
1823db25cadcSViacheslav Ovsiienko 			 const struct rte_flow_item_flex_handle *handle,
1824db25cadcSViacheslav Ovsiienko 			 const struct rte_flow_item_flex_conf *conf,
1825db25cadcSViacheslav Ovsiienko 			 struct rte_flow_error *error);
1826b401400dSSuanming Mou typedef int (*mlx5_flow_info_get_t)
1827b401400dSSuanming Mou 			(struct rte_eth_dev *dev,
1828b401400dSSuanming Mou 			 struct rte_flow_port_info *port_info,
1829b401400dSSuanming Mou 			 struct rte_flow_queue_info *queue_info,
1830b401400dSSuanming Mou 			 struct rte_flow_error *error);
1831b401400dSSuanming Mou typedef int (*mlx5_flow_port_configure_t)
1832b401400dSSuanming Mou 			(struct rte_eth_dev *dev,
1833b401400dSSuanming Mou 			 const struct rte_flow_port_attr *port_attr,
1834b401400dSSuanming Mou 			 uint16_t nb_queue,
1835b401400dSSuanming Mou 			 const struct rte_flow_queue_attr *queue_attr[],
1836b401400dSSuanming Mou 			 struct rte_flow_error *err);
183724865366SAlexander Kozyrev typedef int (*mlx5_flow_pattern_validate_t)
183824865366SAlexander Kozyrev 			(struct rte_eth_dev *dev,
183924865366SAlexander Kozyrev 			 const struct rte_flow_pattern_template_attr *attr,
184024865366SAlexander Kozyrev 			 const struct rte_flow_item items[],
184124865366SAlexander Kozyrev 			 struct rte_flow_error *error);
184242431df9SSuanming Mou typedef struct rte_flow_pattern_template *(*mlx5_flow_pattern_template_create_t)
184342431df9SSuanming Mou 			(struct rte_eth_dev *dev,
184442431df9SSuanming Mou 			 const struct rte_flow_pattern_template_attr *attr,
184542431df9SSuanming Mou 			 const struct rte_flow_item items[],
184642431df9SSuanming Mou 			 struct rte_flow_error *error);
184742431df9SSuanming Mou typedef int (*mlx5_flow_pattern_template_destroy_t)
184842431df9SSuanming Mou 			(struct rte_eth_dev *dev,
184942431df9SSuanming Mou 			 struct rte_flow_pattern_template *template,
185042431df9SSuanming Mou 			 struct rte_flow_error *error);
185124865366SAlexander Kozyrev typedef int (*mlx5_flow_actions_validate_t)
185224865366SAlexander Kozyrev 			(struct rte_eth_dev *dev,
185324865366SAlexander Kozyrev 			 const struct rte_flow_actions_template_attr *attr,
185424865366SAlexander Kozyrev 			 const struct rte_flow_action actions[],
185524865366SAlexander Kozyrev 			 const struct rte_flow_action masks[],
185624865366SAlexander Kozyrev 			 struct rte_flow_error *error);
1857836b5c9bSSuanming Mou typedef struct rte_flow_actions_template *(*mlx5_flow_actions_template_create_t)
1858836b5c9bSSuanming Mou 			(struct rte_eth_dev *dev,
1859836b5c9bSSuanming Mou 			 const struct rte_flow_actions_template_attr *attr,
1860836b5c9bSSuanming Mou 			 const struct rte_flow_action actions[],
1861836b5c9bSSuanming Mou 			 const struct rte_flow_action masks[],
1862836b5c9bSSuanming Mou 			 struct rte_flow_error *error);
1863836b5c9bSSuanming Mou typedef int (*mlx5_flow_actions_template_destroy_t)
1864836b5c9bSSuanming Mou 			(struct rte_eth_dev *dev,
1865836b5c9bSSuanming Mou 			 struct rte_flow_actions_template *template,
1866836b5c9bSSuanming Mou 			 struct rte_flow_error *error);
1867d1559d66SSuanming Mou typedef struct rte_flow_template_table *(*mlx5_flow_table_create_t)
1868d1559d66SSuanming Mou 		(struct rte_eth_dev *dev,
1869d1559d66SSuanming Mou 		 const struct rte_flow_template_table_attr *attr,
1870d1559d66SSuanming Mou 		 struct rte_flow_pattern_template *item_templates[],
1871d1559d66SSuanming Mou 		 uint8_t nb_item_templates,
1872d1559d66SSuanming Mou 		 struct rte_flow_actions_template *action_templates[],
1873d1559d66SSuanming Mou 		 uint8_t nb_action_templates,
1874d1559d66SSuanming Mou 		 struct rte_flow_error *error);
1875d1559d66SSuanming Mou typedef int (*mlx5_flow_table_destroy_t)
1876d1559d66SSuanming Mou 			(struct rte_eth_dev *dev,
1877d1559d66SSuanming Mou 			 struct rte_flow_template_table *table,
1878d1559d66SSuanming Mou 			 struct rte_flow_error *error);
1879c40c061aSSuanming Mou typedef struct rte_flow *(*mlx5_flow_async_flow_create_t)
1880c40c061aSSuanming Mou 			(struct rte_eth_dev *dev,
1881c40c061aSSuanming Mou 			 uint32_t queue,
1882c40c061aSSuanming Mou 			 const struct rte_flow_op_attr *attr,
1883c40c061aSSuanming Mou 			 struct rte_flow_template_table *table,
1884c40c061aSSuanming Mou 			 const struct rte_flow_item items[],
1885c40c061aSSuanming Mou 			 uint8_t pattern_template_index,
1886c40c061aSSuanming Mou 			 const struct rte_flow_action actions[],
1887c40c061aSSuanming Mou 			 uint8_t action_template_index,
1888c40c061aSSuanming Mou 			 void *user_data,
1889c40c061aSSuanming Mou 			 struct rte_flow_error *error);
189060db7673SAlexander Kozyrev typedef struct rte_flow *(*mlx5_flow_async_flow_create_by_index_t)
189160db7673SAlexander Kozyrev 			(struct rte_eth_dev *dev,
189260db7673SAlexander Kozyrev 			 uint32_t queue,
189360db7673SAlexander Kozyrev 			 const struct rte_flow_op_attr *attr,
189460db7673SAlexander Kozyrev 			 struct rte_flow_template_table *table,
189560db7673SAlexander Kozyrev 			 uint32_t rule_index,
189660db7673SAlexander Kozyrev 			 const struct rte_flow_action actions[],
189760db7673SAlexander Kozyrev 			 uint8_t action_template_index,
189860db7673SAlexander Kozyrev 			 void *user_data,
189960db7673SAlexander Kozyrev 			 struct rte_flow_error *error);
190063296851SAlexander Kozyrev typedef int (*mlx5_flow_async_flow_update_t)
190163296851SAlexander Kozyrev 			(struct rte_eth_dev *dev,
190263296851SAlexander Kozyrev 			 uint32_t queue,
190363296851SAlexander Kozyrev 			 const struct rte_flow_op_attr *attr,
190463296851SAlexander Kozyrev 			 struct rte_flow *flow,
190563296851SAlexander Kozyrev 			 const struct rte_flow_action actions[],
190663296851SAlexander Kozyrev 			 uint8_t action_template_index,
190763296851SAlexander Kozyrev 			 void *user_data,
190863296851SAlexander Kozyrev 			 struct rte_flow_error *error);
1909c40c061aSSuanming Mou typedef int (*mlx5_flow_async_flow_destroy_t)
1910c40c061aSSuanming Mou 			(struct rte_eth_dev *dev,
1911c40c061aSSuanming Mou 			 uint32_t queue,
1912c40c061aSSuanming Mou 			 const struct rte_flow_op_attr *attr,
1913c40c061aSSuanming Mou 			 struct rte_flow *flow,
1914c40c061aSSuanming Mou 			 void *user_data,
1915c40c061aSSuanming Mou 			 struct rte_flow_error *error);
1916c40c061aSSuanming Mou typedef int (*mlx5_flow_pull_t)
1917c40c061aSSuanming Mou 			(struct rte_eth_dev *dev,
1918c40c061aSSuanming Mou 			 uint32_t queue,
1919c40c061aSSuanming Mou 			 struct rte_flow_op_result res[],
1920c40c061aSSuanming Mou 			 uint16_t n_res,
1921c40c061aSSuanming Mou 			 struct rte_flow_error *error);
1922c40c061aSSuanming Mou typedef int (*mlx5_flow_push_t)
1923c40c061aSSuanming Mou 			(struct rte_eth_dev *dev,
1924c40c061aSSuanming Mou 			 uint32_t queue,
1925c40c061aSSuanming Mou 			 struct rte_flow_error *error);
192681073e1fSMatan Azrad 
19277ab3962dSSuanming Mou typedef struct rte_flow_action_handle *(*mlx5_flow_async_action_handle_create_t)
19287ab3962dSSuanming Mou 			(struct rte_eth_dev *dev,
19297ab3962dSSuanming Mou 			 uint32_t queue,
19307ab3962dSSuanming Mou 			 const struct rte_flow_op_attr *attr,
19317ab3962dSSuanming Mou 			 const struct rte_flow_indir_action_conf *conf,
19327ab3962dSSuanming Mou 			 const struct rte_flow_action *action,
19337ab3962dSSuanming Mou 			 void *user_data,
19347ab3962dSSuanming Mou 			 struct rte_flow_error *error);
19357ab3962dSSuanming Mou 
19367ab3962dSSuanming Mou typedef int (*mlx5_flow_async_action_handle_update_t)
19377ab3962dSSuanming Mou 			(struct rte_eth_dev *dev,
19387ab3962dSSuanming Mou 			 uint32_t queue,
19397ab3962dSSuanming Mou 			 const struct rte_flow_op_attr *attr,
19407ab3962dSSuanming Mou 			 struct rte_flow_action_handle *handle,
19417ab3962dSSuanming Mou 			 const void *update,
19427ab3962dSSuanming Mou 			 void *user_data,
19437ab3962dSSuanming Mou 			 struct rte_flow_error *error);
194415896eafSGregory Etelson typedef int (*mlx5_flow_async_action_handle_query_update_t)
194515896eafSGregory Etelson 			(struct rte_eth_dev *dev, uint32_t queue_id,
194615896eafSGregory Etelson 			 const struct rte_flow_op_attr *op_attr,
194715896eafSGregory Etelson 			 struct rte_flow_action_handle *action_handle,
194815896eafSGregory Etelson 			 const void *update, void *data,
194915896eafSGregory Etelson 			 enum rte_flow_query_update_mode qu_mode,
195015896eafSGregory Etelson 			 void *user_data, struct rte_flow_error *error);
1951478ba4bbSSuanming Mou typedef int (*mlx5_flow_async_action_handle_query_t)
1952478ba4bbSSuanming Mou 			(struct rte_eth_dev *dev,
1953478ba4bbSSuanming Mou 			 uint32_t queue,
1954478ba4bbSSuanming Mou 			 const struct rte_flow_op_attr *attr,
1955478ba4bbSSuanming Mou 			 const struct rte_flow_action_handle *handle,
1956478ba4bbSSuanming Mou 			 void *data,
1957478ba4bbSSuanming Mou 			 void *user_data,
1958478ba4bbSSuanming Mou 			 struct rte_flow_error *error);
1959478ba4bbSSuanming Mou 
19607ab3962dSSuanming Mou typedef int (*mlx5_flow_async_action_handle_destroy_t)
19617ab3962dSSuanming Mou 			(struct rte_eth_dev *dev,
19627ab3962dSSuanming Mou 			 uint32_t queue,
19637ab3962dSSuanming Mou 			 const struct rte_flow_op_attr *attr,
19647ab3962dSSuanming Mou 			 struct rte_flow_action_handle *handle,
19657ab3962dSSuanming Mou 			 void *user_data,
19667ab3962dSSuanming Mou 			 struct rte_flow_error *error);
19677ab3962dSSuanming Mou 
196884c406e7SOri Kam struct mlx5_flow_driver_ops {
196984c406e7SOri Kam 	mlx5_flow_validate_t validate;
197084c406e7SOri Kam 	mlx5_flow_prepare_t prepare;
197184c406e7SOri Kam 	mlx5_flow_translate_t translate;
197284c406e7SOri Kam 	mlx5_flow_apply_t apply;
197384c406e7SOri Kam 	mlx5_flow_remove_t remove;
197484c406e7SOri Kam 	mlx5_flow_destroy_t destroy;
1975684dafe7SMoti Haimovsky 	mlx5_flow_query_t query;
197646a5e6bcSSuanming Mou 	mlx5_flow_create_mtr_tbls_t create_mtr_tbls;
197746a5e6bcSSuanming Mou 	mlx5_flow_destroy_mtr_tbls_t destroy_mtr_tbls;
1978afb4aa4fSLi Zhang 	mlx5_flow_destroy_mtr_drop_tbls_t destroy_mtr_drop_tbls;
1979e6100c7bSLi Zhang 	mlx5_flow_mtr_alloc_t create_meter;
1980e6100c7bSLi Zhang 	mlx5_flow_mtr_free_t free_meter;
1981afb4aa4fSLi Zhang 	mlx5_flow_validate_mtr_acts_t validate_mtr_acts;
1982afb4aa4fSLi Zhang 	mlx5_flow_create_mtr_acts_t create_mtr_acts;
1983afb4aa4fSLi Zhang 	mlx5_flow_destroy_mtr_acts_t destroy_mtr_acts;
1984afb4aa4fSLi Zhang 	mlx5_flow_create_policy_rules_t create_policy_rules;
1985afb4aa4fSLi Zhang 	mlx5_flow_destroy_policy_rules_t destroy_policy_rules;
1986afb4aa4fSLi Zhang 	mlx5_flow_create_def_policy_t create_def_policy;
1987afb4aa4fSLi Zhang 	mlx5_flow_destroy_def_policy_t destroy_def_policy;
1988fc6ce56bSLi Zhang 	mlx5_flow_meter_sub_policy_rss_prepare_t meter_sub_policy_rss_prepare;
19898e5c9feaSShun Hao 	mlx5_flow_meter_hierarchy_rule_create_t meter_hierarchy_rule_create;
1990ec962badSLi Zhang 	mlx5_flow_destroy_sub_policy_with_rxq_t destroy_sub_policy_with_rxq;
1991e189f55cSSuanming Mou 	mlx5_flow_counter_alloc_t counter_alloc;
1992e189f55cSSuanming Mou 	mlx5_flow_counter_free_t counter_free;
1993e189f55cSSuanming Mou 	mlx5_flow_counter_query_t counter_query;
1994fa2d01c8SDong Zhou 	mlx5_flow_get_aged_flows_t get_aged_flows;
199504a4de75SMichael Baum 	mlx5_flow_get_q_aged_flows_t get_q_aged_flows;
1996d7cfcdddSAndrey Vesnovaty 	mlx5_flow_action_validate_t action_validate;
1997d7cfcdddSAndrey Vesnovaty 	mlx5_flow_action_create_t action_create;
1998d7cfcdddSAndrey Vesnovaty 	mlx5_flow_action_destroy_t action_destroy;
1999d7cfcdddSAndrey Vesnovaty 	mlx5_flow_action_update_t action_update;
200081073e1fSMatan Azrad 	mlx5_flow_action_query_t action_query;
200115896eafSGregory Etelson 	mlx5_flow_action_query_update_t action_query_update;
200223f627e0SBing Zhao 	mlx5_flow_sync_domain_t sync_domain;
2003c5042f93SDmitry Kozlyuk 	mlx5_flow_discover_priorities_t discover_priorities;
2004db25cadcSViacheslav Ovsiienko 	mlx5_flow_item_create_t item_create;
2005db25cadcSViacheslav Ovsiienko 	mlx5_flow_item_release_t item_release;
2006db25cadcSViacheslav Ovsiienko 	mlx5_flow_item_update_t item_update;
2007b401400dSSuanming Mou 	mlx5_flow_info_get_t info_get;
2008b401400dSSuanming Mou 	mlx5_flow_port_configure_t configure;
200924865366SAlexander Kozyrev 	mlx5_flow_pattern_validate_t pattern_validate;
201042431df9SSuanming Mou 	mlx5_flow_pattern_template_create_t pattern_template_create;
201142431df9SSuanming Mou 	mlx5_flow_pattern_template_destroy_t pattern_template_destroy;
201224865366SAlexander Kozyrev 	mlx5_flow_actions_validate_t actions_validate;
2013836b5c9bSSuanming Mou 	mlx5_flow_actions_template_create_t actions_template_create;
2014836b5c9bSSuanming Mou 	mlx5_flow_actions_template_destroy_t actions_template_destroy;
2015d1559d66SSuanming Mou 	mlx5_flow_table_create_t template_table_create;
2016d1559d66SSuanming Mou 	mlx5_flow_table_destroy_t template_table_destroy;
2017c40c061aSSuanming Mou 	mlx5_flow_async_flow_create_t async_flow_create;
201860db7673SAlexander Kozyrev 	mlx5_flow_async_flow_create_by_index_t async_flow_create_by_index;
201963296851SAlexander Kozyrev 	mlx5_flow_async_flow_update_t async_flow_update;
2020c40c061aSSuanming Mou 	mlx5_flow_async_flow_destroy_t async_flow_destroy;
2021c40c061aSSuanming Mou 	mlx5_flow_pull_t pull;
2022c40c061aSSuanming Mou 	mlx5_flow_push_t push;
20237ab3962dSSuanming Mou 	mlx5_flow_async_action_handle_create_t async_action_create;
20247ab3962dSSuanming Mou 	mlx5_flow_async_action_handle_update_t async_action_update;
202515896eafSGregory Etelson 	mlx5_flow_async_action_handle_query_update_t async_action_query_update;
2026478ba4bbSSuanming Mou 	mlx5_flow_async_action_handle_query_t async_action_query;
20277ab3962dSSuanming Mou 	mlx5_flow_async_action_handle_destroy_t async_action_destroy;
202884c406e7SOri Kam };
202984c406e7SOri Kam 
203084c406e7SOri Kam /* mlx5_flow.c */
203184c406e7SOri Kam 
203275a00812SSuanming Mou struct mlx5_flow_workspace *mlx5_flow_push_thread_workspace(void);
203375a00812SSuanming Mou void mlx5_flow_pop_thread_workspace(void);
20348bb81f26SXueming Li struct mlx5_flow_workspace *mlx5_flow_get_thread_workspace(void);
2035dc7c5e0aSGregory Etelson void mlx5_flow_workspace_gc_release(void);
2036dc7c5e0aSGregory Etelson 
20374ec6360dSGregory Etelson __extension__
20384ec6360dSGregory Etelson struct flow_grp_info {
20394ec6360dSGregory Etelson 	uint64_t external:1;
20404ec6360dSGregory Etelson 	uint64_t transfer:1;
20414ec6360dSGregory Etelson 	uint64_t fdb_def_rule:1;
20424ec6360dSGregory Etelson 	/* force standard group translation */
20434ec6360dSGregory Etelson 	uint64_t std_tbl_fix:1;
2044ae2927cdSJiawei Wang 	uint64_t skip_scale:2;
20454ec6360dSGregory Etelson };
20464ec6360dSGregory Etelson 
20474ec6360dSGregory Etelson static inline bool
20484ec6360dSGregory Etelson tunnel_use_standard_attr_group_translate
20498c5a231bSGregory Etelson 		    (const struct rte_eth_dev *dev,
20504ec6360dSGregory Etelson 		     const struct rte_flow_attr *attr,
20518c5a231bSGregory Etelson 		     const struct mlx5_flow_tunnel *tunnel,
20528c5a231bSGregory Etelson 		     enum mlx5_tof_rule_type tof_rule_type)
20534ec6360dSGregory Etelson {
20544ec6360dSGregory Etelson 	bool verdict;
20554ec6360dSGregory Etelson 
20564ec6360dSGregory Etelson 	if (!is_tunnel_offload_active(dev))
20574ec6360dSGregory Etelson 		/* no tunnel offload API */
20584ec6360dSGregory Etelson 		verdict = true;
20594ec6360dSGregory Etelson 	else if (tunnel) {
20604ec6360dSGregory Etelson 		/*
20614ec6360dSGregory Etelson 		 * OvS will use jump to group 0 in tunnel steer rule.
20624ec6360dSGregory Etelson 		 * If tunnel steer rule starts from group 0 (attr.group == 0)
20634ec6360dSGregory Etelson 		 * that 0 group must be translated with standard method.
20644ec6360dSGregory Etelson 		 * attr.group == 0 in tunnel match rule translated with tunnel
20654ec6360dSGregory Etelson 		 * method
20664ec6360dSGregory Etelson 		 */
20674ec6360dSGregory Etelson 		verdict = !attr->group &&
20688c5a231bSGregory Etelson 			  is_flow_tunnel_steer_rule(tof_rule_type);
20694ec6360dSGregory Etelson 	} else {
20704ec6360dSGregory Etelson 		/*
20714ec6360dSGregory Etelson 		 * non-tunnel group translation uses standard method for
20724ec6360dSGregory Etelson 		 * root group only: attr.group == 0
20734ec6360dSGregory Etelson 		 */
20744ec6360dSGregory Etelson 		verdict = !attr->group;
20754ec6360dSGregory Etelson 	}
20764ec6360dSGregory Etelson 
20774ec6360dSGregory Etelson 	return verdict;
20784ec6360dSGregory Etelson }
20794ec6360dSGregory Etelson 
2080e6100c7bSLi Zhang /**
2081e6100c7bSLi Zhang  * Get DV flow aso meter by index.
2082e6100c7bSLi Zhang  *
2083e6100c7bSLi Zhang  * @param[in] dev
2084e6100c7bSLi Zhang  *   Pointer to the Ethernet device structure.
2085e6100c7bSLi Zhang  * @param[in] idx
2086e6100c7bSLi Zhang  *   mlx5 flow aso meter index in the container.
2087e6100c7bSLi Zhang  * @param[out] ppool
2088e6100c7bSLi Zhang  *   mlx5 flow aso meter pool in the container,
2089e6100c7bSLi Zhang  *
2090e6100c7bSLi Zhang  * @return
2091e6100c7bSLi Zhang  *   Pointer to the aso meter, NULL otherwise.
2092e6100c7bSLi Zhang  */
2093e6100c7bSLi Zhang static inline struct mlx5_aso_mtr *
2094e6100c7bSLi Zhang mlx5_aso_meter_by_idx(struct mlx5_priv *priv, uint32_t idx)
2095e6100c7bSLi Zhang {
2096e6100c7bSLi Zhang 	struct mlx5_aso_mtr_pool *pool;
2097afb4aa4fSLi Zhang 	struct mlx5_aso_mtr_pools_mng *pools_mng =
2098afb4aa4fSLi Zhang 				&priv->sh->mtrmng->pools_mng;
2099e6100c7bSLi Zhang 
210024865366SAlexander Kozyrev 	if (priv->mtr_bulk.aso)
210124865366SAlexander Kozyrev 		return priv->mtr_bulk.aso + idx;
210248fbb0e9SAlexander Kozyrev 	/* Decrease to original index. */
210348fbb0e9SAlexander Kozyrev 	idx--;
2104afb4aa4fSLi Zhang 	MLX5_ASSERT(idx / MLX5_ASO_MTRS_PER_POOL < pools_mng->n);
21057797b0feSJiawei Wang 	rte_rwlock_read_lock(&pools_mng->resize_mtrwl);
2106afb4aa4fSLi Zhang 	pool = pools_mng->pools[idx / MLX5_ASO_MTRS_PER_POOL];
21077797b0feSJiawei Wang 	rte_rwlock_read_unlock(&pools_mng->resize_mtrwl);
2108e6100c7bSLi Zhang 	return &pool->mtrs[idx % MLX5_ASO_MTRS_PER_POOL];
2109e6100c7bSLi Zhang }
2110e6100c7bSLi Zhang 
211179f89527SGregory Etelson static __rte_always_inline const struct rte_flow_item *
211279f89527SGregory Etelson mlx5_find_end_item(const struct rte_flow_item *item)
211379f89527SGregory Etelson {
211479f89527SGregory Etelson 	for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++);
211579f89527SGregory Etelson 	return item;
211679f89527SGregory Etelson }
211779f89527SGregory Etelson 
211879f89527SGregory Etelson static __rte_always_inline bool
211979f89527SGregory Etelson mlx5_validate_integrity_item(const struct rte_flow_item_integrity *item)
212079f89527SGregory Etelson {
212179f89527SGregory Etelson 	struct rte_flow_item_integrity test = *item;
212279f89527SGregory Etelson 	test.l3_ok = 0;
212379f89527SGregory Etelson 	test.l4_ok = 0;
212479f89527SGregory Etelson 	test.ipv4_csum_ok = 0;
212579f89527SGregory Etelson 	test.l4_csum_ok = 0;
212679f89527SGregory Etelson 	return (test.value == 0);
212779f89527SGregory Etelson }
212879f89527SGregory Etelson 
21292db75e8bSBing Zhao /*
21304f74cb68SBing Zhao  * Get ASO CT action by device and index.
21312db75e8bSBing Zhao  *
21322db75e8bSBing Zhao  * @param[in] dev
21332db75e8bSBing Zhao  *   Pointer to the Ethernet device structure.
21342db75e8bSBing Zhao  * @param[in] idx
21352db75e8bSBing Zhao  *   Index to the ASO CT action.
21362db75e8bSBing Zhao  *
21372db75e8bSBing Zhao  * @return
21382db75e8bSBing Zhao  *   The specified ASO CT action pointer.
21392db75e8bSBing Zhao  */
21402db75e8bSBing Zhao static inline struct mlx5_aso_ct_action *
21414f74cb68SBing Zhao flow_aso_ct_get_by_dev_idx(struct rte_eth_dev *dev, uint32_t idx)
21422db75e8bSBing Zhao {
21432db75e8bSBing Zhao 	struct mlx5_priv *priv = dev->data->dev_private;
21442db75e8bSBing Zhao 	struct mlx5_aso_ct_pools_mng *mng = priv->sh->ct_mng;
21452db75e8bSBing Zhao 	struct mlx5_aso_ct_pool *pool;
21462db75e8bSBing Zhao 
21472db75e8bSBing Zhao 	idx--;
21482db75e8bSBing Zhao 	MLX5_ASSERT((idx / MLX5_ASO_CT_ACTIONS_PER_POOL) < mng->n);
21492db75e8bSBing Zhao 	/* Bit operation AND could be used. */
21502db75e8bSBing Zhao 	rte_rwlock_read_lock(&mng->resize_rwl);
21512db75e8bSBing Zhao 	pool = mng->pools[idx / MLX5_ASO_CT_ACTIONS_PER_POOL];
21522db75e8bSBing Zhao 	rte_rwlock_read_unlock(&mng->resize_rwl);
21532db75e8bSBing Zhao 	return &pool->actions[idx % MLX5_ASO_CT_ACTIONS_PER_POOL];
21542db75e8bSBing Zhao }
21552db75e8bSBing Zhao 
21564f74cb68SBing Zhao /*
21574f74cb68SBing Zhao  * Get ASO CT action by owner & index.
21584f74cb68SBing Zhao  *
21594f74cb68SBing Zhao  * @param[in] dev
21604f74cb68SBing Zhao  *   Pointer to the Ethernet device structure.
21614f74cb68SBing Zhao  * @param[in] idx
21624f74cb68SBing Zhao  *   Index to the ASO CT action and owner port combination.
21634f74cb68SBing Zhao  *
21644f74cb68SBing Zhao  * @return
21654f74cb68SBing Zhao  *   The specified ASO CT action pointer.
21664f74cb68SBing Zhao  */
21674f74cb68SBing Zhao static inline struct mlx5_aso_ct_action *
21684f74cb68SBing Zhao flow_aso_ct_get_by_idx(struct rte_eth_dev *dev, uint32_t own_idx)
21694f74cb68SBing Zhao {
21704f74cb68SBing Zhao 	struct mlx5_priv *priv = dev->data->dev_private;
21714f74cb68SBing Zhao 	struct mlx5_aso_ct_action *ct;
21724f74cb68SBing Zhao 	uint16_t owner = (uint16_t)MLX5_INDIRECT_ACT_CT_GET_OWNER(own_idx);
21734f74cb68SBing Zhao 	uint32_t idx = MLX5_INDIRECT_ACT_CT_GET_IDX(own_idx);
21744f74cb68SBing Zhao 
21754f74cb68SBing Zhao 	if (owner == PORT_ID(priv)) {
21764f74cb68SBing Zhao 		ct = flow_aso_ct_get_by_dev_idx(dev, idx);
21774f74cb68SBing Zhao 	} else {
21784f74cb68SBing Zhao 		struct rte_eth_dev *owndev = &rte_eth_devices[owner];
21794f74cb68SBing Zhao 
21804f74cb68SBing Zhao 		MLX5_ASSERT(owner < RTE_MAX_ETHPORTS);
21814f74cb68SBing Zhao 		if (dev->data->dev_started != 1)
21824f74cb68SBing Zhao 			return NULL;
21834f74cb68SBing Zhao 		ct = flow_aso_ct_get_by_dev_idx(owndev, idx);
21844f74cb68SBing Zhao 		if (ct->peer != PORT_ID(priv))
21854f74cb68SBing Zhao 			return NULL;
21864f74cb68SBing Zhao 	}
21874f74cb68SBing Zhao 	return ct;
21884f74cb68SBing Zhao }
21894f74cb68SBing Zhao 
2190985b4792SGregory Etelson static inline uint16_t
2191985b4792SGregory Etelson mlx5_translate_tunnel_etypes(uint64_t pattern_flags)
2192985b4792SGregory Etelson {
2193985b4792SGregory Etelson 	if (pattern_flags & MLX5_FLOW_LAYER_INNER_L2)
2194985b4792SGregory Etelson 		return RTE_ETHER_TYPE_TEB;
2195985b4792SGregory Etelson 	else if (pattern_flags & MLX5_FLOW_LAYER_INNER_L3_IPV4)
2196985b4792SGregory Etelson 		return RTE_ETHER_TYPE_IPV4;
2197985b4792SGregory Etelson 	else if (pattern_flags & MLX5_FLOW_LAYER_INNER_L3_IPV6)
2198985b4792SGregory Etelson 		return RTE_ETHER_TYPE_IPV6;
2199985b4792SGregory Etelson 	else if (pattern_flags & MLX5_FLOW_LAYER_MPLS)
2200985b4792SGregory Etelson 		return RTE_ETHER_TYPE_MPLS;
2201985b4792SGregory Etelson 	return 0;
2202985b4792SGregory Etelson }
2203985b4792SGregory Etelson 
2204c40c061aSSuanming Mou int flow_hw_q_flow_flush(struct rte_eth_dev *dev,
2205c40c061aSSuanming Mou 			 struct rte_flow_error *error);
220675a00812SSuanming Mou 
220775a00812SSuanming Mou /*
220875a00812SSuanming Mou  * Convert rte_mtr_color to mlx5 color.
220975a00812SSuanming Mou  *
221075a00812SSuanming Mou  * @param[in] rcol
221175a00812SSuanming Mou  *   rte_mtr_color.
221275a00812SSuanming Mou  *
221375a00812SSuanming Mou  * @return
221475a00812SSuanming Mou  *   mlx5 color.
221575a00812SSuanming Mou  */
221675a00812SSuanming Mou static inline int
221775a00812SSuanming Mou rte_col_2_mlx5_col(enum rte_color rcol)
221875a00812SSuanming Mou {
221975a00812SSuanming Mou 	switch (rcol) {
222075a00812SSuanming Mou 	case RTE_COLOR_GREEN:
222175a00812SSuanming Mou 		return MLX5_FLOW_COLOR_GREEN;
222275a00812SSuanming Mou 	case RTE_COLOR_YELLOW:
222375a00812SSuanming Mou 		return MLX5_FLOW_COLOR_YELLOW;
222475a00812SSuanming Mou 	case RTE_COLOR_RED:
222575a00812SSuanming Mou 		return MLX5_FLOW_COLOR_RED;
222675a00812SSuanming Mou 	default:
222775a00812SSuanming Mou 		break;
222875a00812SSuanming Mou 	}
222975a00812SSuanming Mou 	return MLX5_FLOW_COLOR_UNDEFINED;
223075a00812SSuanming Mou }
223175a00812SSuanming Mou 
2232e9de8f33SJiawei Wang /**
2233e9de8f33SJiawei Wang  * Indicates whether flow source vport is representor port.
2234e9de8f33SJiawei Wang  *
2235e9de8f33SJiawei Wang  * @param[in] priv
2236e9de8f33SJiawei Wang  *   Pointer to device private context structure.
2237e9de8f33SJiawei Wang  * @param[in] act_priv
2238e9de8f33SJiawei Wang  *   Pointer to actual device private context structure if have.
2239e9de8f33SJiawei Wang  *
2240e9de8f33SJiawei Wang  * @return
2241e9de8f33SJiawei Wang  *   True when the flow source vport is representor port, false otherwise.
2242e9de8f33SJiawei Wang  */
2243e9de8f33SJiawei Wang static inline bool
2244e9de8f33SJiawei Wang flow_source_vport_representor(struct mlx5_priv *priv, struct mlx5_priv *act_priv)
2245e9de8f33SJiawei Wang {
2246e9de8f33SJiawei Wang 	MLX5_ASSERT(priv);
2247e9de8f33SJiawei Wang 	return (!act_priv ? (priv->representor_id != UINT16_MAX) :
2248e9de8f33SJiawei Wang 		 (act_priv->representor_id != UINT16_MAX));
2249e9de8f33SJiawei Wang }
2250e9de8f33SJiawei Wang 
22519fa7c1cdSDariusz Sosnowski /* All types of Ethernet patterns used in control flow rules. */
22529fa7c1cdSDariusz Sosnowski enum mlx5_flow_ctrl_rx_eth_pattern_type {
22539fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_ETH_PATTERN_ALL = 0,
22549fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_ETH_PATTERN_ALL_MCAST,
22559fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_ETH_PATTERN_BCAST,
22569fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_ETH_PATTERN_BCAST_VLAN,
22579fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_ETH_PATTERN_IPV4_MCAST,
22589fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_ETH_PATTERN_IPV4_MCAST_VLAN,
22599fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_ETH_PATTERN_IPV6_MCAST,
22609fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_ETH_PATTERN_IPV6_MCAST_VLAN,
22619fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_ETH_PATTERN_DMAC,
22629fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_ETH_PATTERN_DMAC_VLAN,
22639fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_ETH_PATTERN_MAX,
22649fa7c1cdSDariusz Sosnowski };
22659fa7c1cdSDariusz Sosnowski 
22669fa7c1cdSDariusz Sosnowski /* All types of RSS actions used in control flow rules. */
22679fa7c1cdSDariusz Sosnowski enum mlx5_flow_ctrl_rx_expanded_rss_type {
22689fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_EXPANDED_RSS_NON_IP = 0,
22699fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_EXPANDED_RSS_IPV4,
22709fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_EXPANDED_RSS_IPV4_UDP,
22719fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_EXPANDED_RSS_IPV4_TCP,
22729fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_EXPANDED_RSS_IPV6,
22739fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_EXPANDED_RSS_IPV6_UDP,
22749fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_EXPANDED_RSS_IPV6_TCP,
22759fa7c1cdSDariusz Sosnowski 	MLX5_FLOW_HW_CTRL_RX_EXPANDED_RSS_MAX,
22769fa7c1cdSDariusz Sosnowski };
22779fa7c1cdSDariusz Sosnowski 
22789fa7c1cdSDariusz Sosnowski /**
22799fa7c1cdSDariusz Sosnowski  * Contains pattern template, template table and its attributes for a single
22809fa7c1cdSDariusz Sosnowski  * combination of Ethernet pattern and RSS action. Used to create control flow rules
22819fa7c1cdSDariusz Sosnowski  * with HWS.
22829fa7c1cdSDariusz Sosnowski  */
22839fa7c1cdSDariusz Sosnowski struct mlx5_flow_hw_ctrl_rx_table {
22849fa7c1cdSDariusz Sosnowski 	struct rte_flow_template_table_attr attr;
22859fa7c1cdSDariusz Sosnowski 	struct rte_flow_pattern_template *pt;
22869fa7c1cdSDariusz Sosnowski 	struct rte_flow_template_table *tbl;
22879fa7c1cdSDariusz Sosnowski };
22889fa7c1cdSDariusz Sosnowski 
22899fa7c1cdSDariusz Sosnowski /* Contains all templates required to create control flow rules with HWS. */
22909fa7c1cdSDariusz Sosnowski struct mlx5_flow_hw_ctrl_rx {
22919fa7c1cdSDariusz Sosnowski 	struct rte_flow_actions_template *rss[MLX5_FLOW_HW_CTRL_RX_EXPANDED_RSS_MAX];
22929fa7c1cdSDariusz Sosnowski 	struct mlx5_flow_hw_ctrl_rx_table tables[MLX5_FLOW_HW_CTRL_RX_ETH_PATTERN_MAX]
22939fa7c1cdSDariusz Sosnowski 						[MLX5_FLOW_HW_CTRL_RX_EXPANDED_RSS_MAX];
22949fa7c1cdSDariusz Sosnowski };
22959fa7c1cdSDariusz Sosnowski 
22969fa7c1cdSDariusz Sosnowski #define MLX5_CTRL_PROMISCUOUS    (RTE_BIT32(0))
22979fa7c1cdSDariusz Sosnowski #define MLX5_CTRL_ALL_MULTICAST  (RTE_BIT32(1))
22989fa7c1cdSDariusz Sosnowski #define MLX5_CTRL_BROADCAST      (RTE_BIT32(2))
22999fa7c1cdSDariusz Sosnowski #define MLX5_CTRL_IPV4_MULTICAST (RTE_BIT32(3))
23009fa7c1cdSDariusz Sosnowski #define MLX5_CTRL_IPV6_MULTICAST (RTE_BIT32(4))
23019fa7c1cdSDariusz Sosnowski #define MLX5_CTRL_DMAC           (RTE_BIT32(5))
23029fa7c1cdSDariusz Sosnowski #define MLX5_CTRL_VLAN_FILTER    (RTE_BIT32(6))
23039fa7c1cdSDariusz Sosnowski 
23049fa7c1cdSDariusz Sosnowski int mlx5_flow_hw_ctrl_flows(struct rte_eth_dev *dev, uint32_t flags);
23059fa7c1cdSDariusz Sosnowski void mlx5_flow_hw_cleanup_ctrl_rx_templates(struct rte_eth_dev *dev);
23069fa7c1cdSDariusz Sosnowski 
23074ec6360dSGregory Etelson int mlx5_flow_group_to_table(struct rte_eth_dev *dev,
23084ec6360dSGregory Etelson 			     const struct mlx5_flow_tunnel *tunnel,
23094ec6360dSGregory Etelson 			     uint32_t group, uint32_t *table,
2310eab3ca48SGregory Etelson 			     const struct flow_grp_info *flags,
23114ec6360dSGregory Etelson 			     struct rte_flow_error *error);
2312e745f900SSuanming Mou uint64_t mlx5_flow_hashfields_adjust(struct mlx5_flow_rss_desc *rss_desc,
2313e745f900SSuanming Mou 				     int tunnel, uint64_t layer_types,
2314fc2c498cSOri Kam 				     uint64_t hash_fields);
23153eca5f8aSOphir Munk int mlx5_flow_discover_priorities(struct rte_eth_dev *dev);
231684c406e7SOri Kam uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
231784c406e7SOri Kam 				   uint32_t subpriority);
23185f8ae44dSDong Zhou uint32_t mlx5_get_lowest_priority(struct rte_eth_dev *dev,
23195f8ae44dSDong Zhou 					const struct rte_flow_attr *attr);
23205f8ae44dSDong Zhou uint16_t mlx5_get_matcher_priority(struct rte_eth_dev *dev,
23215f8ae44dSDong Zhou 				   const struct rte_flow_attr *attr,
2322ebe9afedSXueming Li 				   uint32_t subpriority, bool external);
23237f6e276bSMichael Savisko uint32_t mlx5_get_send_to_kernel_priority(struct rte_eth_dev *dev);
232499d49f47SMatan Azrad int mlx5_flow_get_reg_id(struct rte_eth_dev *dev,
23253e8edd0eSViacheslav Ovsiienko 				     enum mlx5_feature_name feature,
23263e8edd0eSViacheslav Ovsiienko 				     uint32_t id,
23273e8edd0eSViacheslav Ovsiienko 				     struct rte_flow_error *error);
2328e4fcdcd6SMoti Haimovsky const struct rte_flow_action *mlx5_flow_find_action
2329e4fcdcd6SMoti Haimovsky 					(const struct rte_flow_action *actions,
2330e4fcdcd6SMoti Haimovsky 					 enum rte_flow_action_type action);
2331d7cfcdddSAndrey Vesnovaty int mlx5_validate_action_rss(struct rte_eth_dev *dev,
2332d7cfcdddSAndrey Vesnovaty 			     const struct rte_flow_action *action,
2333d7cfcdddSAndrey Vesnovaty 			     struct rte_flow_error *error);
233484c406e7SOri Kam int mlx5_flow_validate_action_count(struct rte_eth_dev *dev,
23353e9fa079SDekel Peled 				    const struct rte_flow_attr *attr,
233684c406e7SOri Kam 				    struct rte_flow_error *error);
2337c1f0cdaeSDariusz Sosnowski int mlx5_flow_validate_action_drop(struct rte_eth_dev *dev,
2338c1f0cdaeSDariusz Sosnowski 				   bool is_root,
23393e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
234084c406e7SOri Kam 				   struct rte_flow_error *error);
234184c406e7SOri Kam int mlx5_flow_validate_action_flag(uint64_t action_flags,
23423e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
234384c406e7SOri Kam 				   struct rte_flow_error *error);
234484c406e7SOri Kam int mlx5_flow_validate_action_mark(const struct rte_flow_action *action,
234584c406e7SOri Kam 				   uint64_t action_flags,
23463e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
234784c406e7SOri Kam 				   struct rte_flow_error *error);
234884c406e7SOri Kam int mlx5_flow_validate_action_queue(const struct rte_flow_action *action,
234984c406e7SOri Kam 				    uint64_t action_flags,
235084c406e7SOri Kam 				    struct rte_eth_dev *dev,
23513e9fa079SDekel Peled 				    const struct rte_flow_attr *attr,
235284c406e7SOri Kam 				    struct rte_flow_error *error);
235384c406e7SOri Kam int mlx5_flow_validate_action_rss(const struct rte_flow_action *action,
235484c406e7SOri Kam 				  uint64_t action_flags,
235584c406e7SOri Kam 				  struct rte_eth_dev *dev,
23563e9fa079SDekel Peled 				  const struct rte_flow_attr *attr,
23571183f12fSOri Kam 				  uint64_t item_flags,
235884c406e7SOri Kam 				  struct rte_flow_error *error);
23593c78124fSShiri Kuzin int mlx5_flow_validate_action_default_miss(uint64_t action_flags,
23603c78124fSShiri Kuzin 				const struct rte_flow_attr *attr,
23613c78124fSShiri Kuzin 				struct rte_flow_error *error);
2362c23626f2SMichael Baum int flow_validate_modify_field_level
2363c23626f2SMichael Baum 			(const struct rte_flow_action_modify_data *data,
2364c23626f2SMichael Baum 			 struct rte_flow_error *error);
23656bd7fbd0SDekel Peled int mlx5_flow_item_acceptable(const struct rte_flow_item *item,
23666bd7fbd0SDekel Peled 			      const uint8_t *mask,
23676bd7fbd0SDekel Peled 			      const uint8_t *nic_mask,
23686bd7fbd0SDekel Peled 			      unsigned int size,
23696859e67eSDekel Peled 			      bool range_accepted,
23706bd7fbd0SDekel Peled 			      struct rte_flow_error *error);
237184c406e7SOri Kam int mlx5_flow_validate_item_eth(const struct rte_flow_item *item,
237286b59a1aSMatan Azrad 				uint64_t item_flags, bool ext_vlan_sup,
237384c406e7SOri Kam 				struct rte_flow_error *error);
237484c406e7SOri Kam int mlx5_flow_validate_item_gre(const struct rte_flow_item *item,
237584c406e7SOri Kam 				uint64_t item_flags,
237684c406e7SOri Kam 				uint8_t target_protocol,
237784c406e7SOri Kam 				struct rte_flow_error *error);
2378a7a03655SXiaoyu Min int mlx5_flow_validate_item_gre_key(const struct rte_flow_item *item,
2379a7a03655SXiaoyu Min 				    uint64_t item_flags,
2380a7a03655SXiaoyu Min 				    const struct rte_flow_item *gre_item,
2381a7a03655SXiaoyu Min 				    struct rte_flow_error *error);
23825c4d4917SSean Zhang int mlx5_flow_validate_item_gre_option(struct rte_eth_dev *dev,
23835c4d4917SSean Zhang 				       const struct rte_flow_item *item,
23845c4d4917SSean Zhang 				       uint64_t item_flags,
23855c4d4917SSean Zhang 				       const struct rte_flow_attr *attr,
23865c4d4917SSean Zhang 				       const struct rte_flow_item *gre_item,
23875c4d4917SSean Zhang 				       struct rte_flow_error *error);
238884c406e7SOri Kam int mlx5_flow_validate_item_ipv4(const struct rte_flow_item *item,
2389ed4c5247SShahaf Shuler 				 uint64_t item_flags,
2390fba32130SXiaoyu Min 				 uint64_t last_item,
2391fba32130SXiaoyu Min 				 uint16_t ether_type,
239255c61fa7SViacheslav Ovsiienko 				 const struct rte_flow_item_ipv4 *acc_mask,
23936859e67eSDekel Peled 				 bool range_accepted,
239484c406e7SOri Kam 				 struct rte_flow_error *error);
239584c406e7SOri Kam int mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item,
239684c406e7SOri Kam 				 uint64_t item_flags,
2397fba32130SXiaoyu Min 				 uint64_t last_item,
2398fba32130SXiaoyu Min 				 uint16_t ether_type,
239955c61fa7SViacheslav Ovsiienko 				 const struct rte_flow_item_ipv6 *acc_mask,
240084c406e7SOri Kam 				 struct rte_flow_error *error);
240138f7efaaSDekel Peled int mlx5_flow_validate_item_mpls(struct rte_eth_dev *dev,
240238f7efaaSDekel Peled 				 const struct rte_flow_item *item,
240384c406e7SOri Kam 				 uint64_t item_flags,
240438f7efaaSDekel Peled 				 uint64_t prev_layer,
240584c406e7SOri Kam 				 struct rte_flow_error *error);
240684c406e7SOri Kam int mlx5_flow_validate_item_tcp(const struct rte_flow_item *item,
240784c406e7SOri Kam 				uint64_t item_flags,
240884c406e7SOri Kam 				uint8_t target_protocol,
240992378c2bSMoti Haimovsky 				const struct rte_flow_item_tcp *flow_mask,
241084c406e7SOri Kam 				struct rte_flow_error *error);
241184c406e7SOri Kam int mlx5_flow_validate_item_udp(const struct rte_flow_item *item,
241284c406e7SOri Kam 				uint64_t item_flags,
241384c406e7SOri Kam 				uint8_t target_protocol,
241484c406e7SOri Kam 				struct rte_flow_error *error);
241584c406e7SOri Kam int mlx5_flow_validate_item_vlan(const struct rte_flow_item *item,
2416ed4c5247SShahaf Shuler 				 uint64_t item_flags,
2417dfedf3e3SViacheslav Ovsiienko 				 struct rte_eth_dev *dev,
241884c406e7SOri Kam 				 struct rte_flow_error *error);
2419630a587bSRongwei Liu int mlx5_flow_validate_item_vxlan(struct rte_eth_dev *dev,
2420a1fd0c82SRongwei Liu 				  uint16_t udp_dport,
2421630a587bSRongwei Liu 				  const struct rte_flow_item *item,
242284c406e7SOri Kam 				  uint64_t item_flags,
24231939eb6fSDariusz Sosnowski 				  bool root,
242484c406e7SOri Kam 				  struct rte_flow_error *error);
242584c406e7SOri Kam int mlx5_flow_validate_item_vxlan_gpe(const struct rte_flow_item *item,
242684c406e7SOri Kam 				      uint64_t item_flags,
242784c406e7SOri Kam 				      struct rte_eth_dev *dev,
242884c406e7SOri Kam 				      struct rte_flow_error *error);
2429d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp(const struct rte_flow_item *item,
2430d53aa89aSXiaoyu Min 				 uint64_t item_flags,
2431d53aa89aSXiaoyu Min 				 uint8_t target_protocol,
2432d53aa89aSXiaoyu Min 				 struct rte_flow_error *error);
2433d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp6(const struct rte_flow_item *item,
2434d53aa89aSXiaoyu Min 				   uint64_t item_flags,
2435d53aa89aSXiaoyu Min 				   uint8_t target_protocol,
2436d53aa89aSXiaoyu Min 				   struct rte_flow_error *error);
243701314192SLeo Xu int mlx5_flow_validate_item_icmp6_echo(const struct rte_flow_item *item,
243801314192SLeo Xu 				       uint64_t item_flags,
243901314192SLeo Xu 				       uint8_t target_protocol,
244001314192SLeo Xu 				       struct rte_flow_error *error);
2441ea81c1b8SDekel Peled int mlx5_flow_validate_item_nvgre(const struct rte_flow_item *item,
2442ea81c1b8SDekel Peled 				  uint64_t item_flags,
2443ea81c1b8SDekel Peled 				  uint8_t target_protocol,
2444ea81c1b8SDekel Peled 				  struct rte_flow_error *error);
2445e59a5dbcSMoti Haimovsky int mlx5_flow_validate_item_geneve(const struct rte_flow_item *item,
2446e59a5dbcSMoti Haimovsky 				   uint64_t item_flags,
2447e59a5dbcSMoti Haimovsky 				   struct rte_eth_dev *dev,
2448e59a5dbcSMoti Haimovsky 				   struct rte_flow_error *error);
2449f7239fceSShiri Kuzin int mlx5_flow_validate_item_geneve_opt(const struct rte_flow_item *item,
2450f7239fceSShiri Kuzin 				   uint64_t last_item,
2451f7239fceSShiri Kuzin 				   const struct rte_flow_item *geneve_item,
2452f7239fceSShiri Kuzin 				   struct rte_eth_dev *dev,
2453f7239fceSShiri Kuzin 				   struct rte_flow_error *error);
2454c7eca236SBing Zhao int mlx5_flow_validate_item_ecpri(const struct rte_flow_item *item,
2455c7eca236SBing Zhao 				  uint64_t item_flags,
2456c7eca236SBing Zhao 				  uint64_t last_item,
2457c7eca236SBing Zhao 				  uint16_t ether_type,
2458c7eca236SBing Zhao 				  const struct rte_flow_item_ecpri *acc_mask,
2459c7eca236SBing Zhao 				  struct rte_flow_error *error);
2460*6f7d6622SHaifei Luo int mlx5_flow_validate_item_nsh(struct rte_eth_dev *dev,
2461*6f7d6622SHaifei Luo 				const struct rte_flow_item *item,
2462*6f7d6622SHaifei Luo 				struct rte_flow_error *error);
246344432018SLi Zhang int mlx5_flow_create_mtr_tbls(struct rte_eth_dev *dev,
246444432018SLi Zhang 			      struct mlx5_flow_meter_info *fm,
246544432018SLi Zhang 			      uint32_t mtr_idx,
246644432018SLi Zhang 			      uint8_t domain_bitmap);
246744432018SLi Zhang void mlx5_flow_destroy_mtr_tbls(struct rte_eth_dev *dev,
246844432018SLi Zhang 			       struct mlx5_flow_meter_info *fm);
2469afb4aa4fSLi Zhang void mlx5_flow_destroy_mtr_drop_tbls(struct rte_eth_dev *dev);
2470fc6ce56bSLi Zhang struct mlx5_flow_meter_sub_policy *mlx5_flow_meter_sub_policy_rss_prepare
2471fc6ce56bSLi Zhang 		(struct rte_eth_dev *dev,
2472fc6ce56bSLi Zhang 		struct mlx5_flow_meter_policy *mtr_policy,
2473fc6ce56bSLi Zhang 		struct mlx5_flow_rss_desc *rss_desc[MLX5_MTR_RTE_COLORS]);
2474ec962badSLi Zhang void mlx5_flow_destroy_sub_policy_with_rxq(struct rte_eth_dev *dev,
2475ec962badSLi Zhang 		struct mlx5_flow_meter_policy *mtr_policy);
2476994829e6SSuanming Mou int mlx5_flow_dv_discover_counter_offset_support(struct rte_eth_dev *dev);
247745633c46SSuanming Mou int mlx5_flow_discover_dr_action_support(struct rte_eth_dev *dev);
2478ec4e11d4SDmitry Kozlyuk int mlx5_action_handle_attach(struct rte_eth_dev *dev);
2479ec4e11d4SDmitry Kozlyuk int mlx5_action_handle_detach(struct rte_eth_dev *dev);
24804b61b877SBing Zhao int mlx5_action_handle_flush(struct rte_eth_dev *dev);
24814ec6360dSGregory Etelson void mlx5_release_tunnel_hub(struct mlx5_dev_ctx_shared *sh, uint16_t port_id);
24824ec6360dSGregory Etelson int mlx5_alloc_tunnel_hub(struct mlx5_dev_ctx_shared *sh);
2483afd7a625SXueming Li 
2484961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_tbl_create_cb(void *tool_ctx, void *entry_ctx);
2485961b6774SMatan Azrad int flow_dv_tbl_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
2486f5b0aed2SSuanming Mou 			 void *cb_ctx);
2487961b6774SMatan Azrad void flow_dv_tbl_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
2488961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_tbl_clone_cb(void *tool_ctx,
2489961b6774SMatan Azrad 					     struct mlx5_list_entry *oentry,
2490961b6774SMatan Azrad 					     void *entry_ctx);
2491961b6774SMatan Azrad void flow_dv_tbl_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry);
2492afd7a625SXueming Li struct mlx5_flow_tbl_resource *flow_dv_tbl_resource_get(struct rte_eth_dev *dev,
24932d2cef5dSLi Zhang 		uint32_t table_level, uint8_t egress, uint8_t transfer,
2494afd7a625SXueming Li 		bool external, const struct mlx5_flow_tunnel *tunnel,
24952d2cef5dSLi Zhang 		uint32_t group_id, uint8_t dummy,
24962d2cef5dSLi Zhang 		uint32_t table_id, struct rte_flow_error *error);
2497f31a141eSMichael Savisko int flow_dv_tbl_resource_release(struct mlx5_dev_ctx_shared *sh,
2498f31a141eSMichael Savisko 				 struct mlx5_flow_tbl_resource *tbl);
2499afd7a625SXueming Li 
2500961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_tag_create_cb(void *tool_ctx, void *cb_ctx);
2501961b6774SMatan Azrad int flow_dv_tag_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
2502f5b0aed2SSuanming Mou 			 void *cb_ctx);
2503961b6774SMatan Azrad void flow_dv_tag_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
2504961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_tag_clone_cb(void *tool_ctx,
2505961b6774SMatan Azrad 					     struct mlx5_list_entry *oentry,
2506f5b0aed2SSuanming Mou 					     void *cb_ctx);
2507961b6774SMatan Azrad void flow_dv_tag_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry);
2508f7f73ac1SXueming Li 
2509961b6774SMatan Azrad int flow_dv_modify_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
2510961b6774SMatan Azrad 			    void *cb_ctx);
2511961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_modify_create_cb(void *tool_ctx, void *ctx);
2512961b6774SMatan Azrad void flow_dv_modify_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
2513961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_modify_clone_cb(void *tool_ctx,
2514961b6774SMatan Azrad 						struct mlx5_list_entry *oentry,
2515961b6774SMatan Azrad 						void *ctx);
2516961b6774SMatan Azrad void flow_dv_modify_clone_free_cb(void *tool_ctx,
2517961b6774SMatan Azrad 				  struct mlx5_list_entry *entry);
2518961b6774SMatan Azrad 
2519961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_mreg_create_cb(void *tool_ctx, void *ctx);
2520961b6774SMatan Azrad int flow_dv_mreg_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
2521961b6774SMatan Azrad 			  void *cb_ctx);
2522961b6774SMatan Azrad void flow_dv_mreg_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
2523961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_mreg_clone_cb(void *tool_ctx,
2524961b6774SMatan Azrad 					      struct mlx5_list_entry *entry,
2525961b6774SMatan Azrad 					      void *ctx);
2526961b6774SMatan Azrad void flow_dv_mreg_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry);
2527961b6774SMatan Azrad 
2528961b6774SMatan Azrad int flow_dv_encap_decap_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
2529961b6774SMatan Azrad 				 void *cb_ctx);
2530961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_encap_decap_create_cb(void *tool_ctx,
2531961b6774SMatan Azrad 						      void *cb_ctx);
2532961b6774SMatan Azrad void flow_dv_encap_decap_remove_cb(void *tool_ctx,
2533961b6774SMatan Azrad 				   struct mlx5_list_entry *entry);
2534961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_encap_decap_clone_cb(void *tool_ctx,
2535961b6774SMatan Azrad 						  struct mlx5_list_entry *entry,
2536961b6774SMatan Azrad 						  void *cb_ctx);
2537961b6774SMatan Azrad void flow_dv_encap_decap_clone_free_cb(void *tool_ctx,
2538961b6774SMatan Azrad 				       struct mlx5_list_entry *entry);
253918726355SXueming Li 
25406507c9f5SSuanming Mou int flow_dv_matcher_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
2541e78e5408SMatan Azrad 			     void *ctx);
25426507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_matcher_create_cb(void *tool_ctx, void *ctx);
25436507c9f5SSuanming Mou void flow_dv_matcher_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
25446507c9f5SSuanming Mou 
25456507c9f5SSuanming Mou int flow_dv_port_id_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
25466507c9f5SSuanming Mou 			     void *cb_ctx);
25476507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_port_id_create_cb(void *tool_ctx, void *cb_ctx);
25486507c9f5SSuanming Mou void flow_dv_port_id_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
25496507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_port_id_clone_cb(void *tool_ctx,
25506507c9f5SSuanming Mou 				struct mlx5_list_entry *entry, void *cb_ctx);
25516507c9f5SSuanming Mou void flow_dv_port_id_clone_free_cb(void *tool_ctx,
2552e78e5408SMatan Azrad 				   struct mlx5_list_entry *entry);
255318726355SXueming Li 
25546507c9f5SSuanming Mou int flow_dv_push_vlan_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
2555e78e5408SMatan Azrad 			       void *cb_ctx);
25566507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_push_vlan_create_cb(void *tool_ctx,
2557491b7137SMatan Azrad 						    void *cb_ctx);
25586507c9f5SSuanming Mou void flow_dv_push_vlan_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
25596507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_push_vlan_clone_cb(void *tool_ctx,
2560e78e5408SMatan Azrad 				 struct mlx5_list_entry *entry, void *cb_ctx);
25616507c9f5SSuanming Mou void flow_dv_push_vlan_clone_free_cb(void *tool_ctx,
2562491b7137SMatan Azrad 				     struct mlx5_list_entry *entry);
25633422af2aSXueming Li 
25646507c9f5SSuanming Mou int flow_dv_sample_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
2565e78e5408SMatan Azrad 			    void *cb_ctx);
25666507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_sample_create_cb(void *tool_ctx, void *cb_ctx);
25676507c9f5SSuanming Mou void flow_dv_sample_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
25686507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_sample_clone_cb(void *tool_ctx,
2569491b7137SMatan Azrad 				 struct mlx5_list_entry *entry, void *cb_ctx);
25706507c9f5SSuanming Mou void flow_dv_sample_clone_free_cb(void *tool_ctx,
2571491b7137SMatan Azrad 				  struct mlx5_list_entry *entry);
257219784141SSuanming Mou 
25736507c9f5SSuanming Mou int flow_dv_dest_array_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
2574e78e5408SMatan Azrad 				void *cb_ctx);
25756507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_dest_array_create_cb(void *tool_ctx,
25766507c9f5SSuanming Mou 						     void *cb_ctx);
25776507c9f5SSuanming Mou void flow_dv_dest_array_remove_cb(void *tool_ctx,
2578e78e5408SMatan Azrad 				  struct mlx5_list_entry *entry);
25796507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_dest_array_clone_cb(void *tool_ctx,
2580491b7137SMatan Azrad 				   struct mlx5_list_entry *entry, void *cb_ctx);
25816507c9f5SSuanming Mou void flow_dv_dest_array_clone_free_cb(void *tool_ctx,
2582491b7137SMatan Azrad 				      struct mlx5_list_entry *entry);
25833a2f674bSSuanming Mou void flow_dv_hashfields_set(uint64_t item_flags,
25843a2f674bSSuanming Mou 			    struct mlx5_flow_rss_desc *rss_desc,
25853a2f674bSSuanming Mou 			    uint64_t *hash_fields);
25863a2f674bSSuanming Mou void flow_dv_action_rss_l34_hash_adjust(uint64_t rss_types,
25873a2f674bSSuanming Mou 					uint64_t *hash_field);
25887ab3962dSSuanming Mou uint32_t flow_dv_action_rss_hrxq_lookup(struct rte_eth_dev *dev, uint32_t idx,
25897ab3962dSSuanming Mou 					const uint64_t hash_fields);
25906507c9f5SSuanming Mou 
2591d1559d66SSuanming Mou struct mlx5_list_entry *flow_hw_grp_create_cb(void *tool_ctx, void *cb_ctx);
2592d1559d66SSuanming Mou void flow_hw_grp_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
2593d1559d66SSuanming Mou int flow_hw_grp_match_cb(void *tool_ctx,
2594d1559d66SSuanming Mou 			 struct mlx5_list_entry *entry,
2595d1559d66SSuanming Mou 			 void *cb_ctx);
2596d1559d66SSuanming Mou struct mlx5_list_entry *flow_hw_grp_clone_cb(void *tool_ctx,
2597d1559d66SSuanming Mou 					     struct mlx5_list_entry *oentry,
2598d1559d66SSuanming Mou 					     void *cb_ctx);
2599d1559d66SSuanming Mou void flow_hw_grp_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry);
2600d1559d66SSuanming Mou 
260181073e1fSMatan Azrad struct mlx5_aso_age_action *flow_aso_age_get_by_idx(struct rte_eth_dev *dev,
260281073e1fSMatan Azrad 						    uint32_t age_idx);
2603f15f0c38SShiri Kuzin int flow_dev_geneve_tlv_option_resource_register(struct rte_eth_dev *dev,
2604f15f0c38SShiri Kuzin 					     const struct rte_flow_item *item,
2605f15f0c38SShiri Kuzin 					     struct rte_flow_error *error);
260644864503SSuanming Mou void flow_dev_geneve_tlv_option_resource_release(struct mlx5_dev_ctx_shared *sh);
260744864503SSuanming Mou 
26085d55a494STal Shnaiderman void flow_release_workspace(void *data);
26095d55a494STal Shnaiderman int mlx5_flow_os_init_workspace_once(void);
26105d55a494STal Shnaiderman void *mlx5_flow_os_get_specific_workspace(void);
26115d55a494STal Shnaiderman int mlx5_flow_os_set_specific_workspace(struct mlx5_flow_workspace *data);
26125d55a494STal Shnaiderman void mlx5_flow_os_release_workspace(void);
2613e6100c7bSLi Zhang uint32_t mlx5_flow_mtr_alloc(struct rte_eth_dev *dev);
2614e6100c7bSLi Zhang void mlx5_flow_mtr_free(struct rte_eth_dev *dev, uint32_t mtr_idx);
2615afb4aa4fSLi Zhang int mlx5_flow_validate_mtr_acts(struct rte_eth_dev *dev,
2616afb4aa4fSLi Zhang 			const struct rte_flow_action *actions[RTE_COLORS],
2617afb4aa4fSLi Zhang 			struct rte_flow_attr *attr,
2618afb4aa4fSLi Zhang 			bool *is_rss,
2619afb4aa4fSLi Zhang 			uint8_t *domain_bitmap,
26204b7bf3ffSBing Zhao 			uint8_t *policy_mode,
2621afb4aa4fSLi Zhang 			struct rte_mtr_error *error);
2622afb4aa4fSLi Zhang void mlx5_flow_destroy_mtr_acts(struct rte_eth_dev *dev,
2623afb4aa4fSLi Zhang 		      struct mlx5_flow_meter_policy *mtr_policy);
2624afb4aa4fSLi Zhang int mlx5_flow_create_mtr_acts(struct rte_eth_dev *dev,
2625afb4aa4fSLi Zhang 		      struct mlx5_flow_meter_policy *mtr_policy,
2626afb4aa4fSLi Zhang 		      const struct rte_flow_action *actions[RTE_COLORS],
26276431068dSSean Zhang 		      struct rte_flow_attr *attr,
2628afb4aa4fSLi Zhang 		      struct rte_mtr_error *error);
2629afb4aa4fSLi Zhang int mlx5_flow_create_policy_rules(struct rte_eth_dev *dev,
2630afb4aa4fSLi Zhang 			     struct mlx5_flow_meter_policy *mtr_policy);
2631afb4aa4fSLi Zhang void mlx5_flow_destroy_policy_rules(struct rte_eth_dev *dev,
2632afb4aa4fSLi Zhang 			     struct mlx5_flow_meter_policy *mtr_policy);
2633afb4aa4fSLi Zhang int mlx5_flow_create_def_policy(struct rte_eth_dev *dev);
2634afb4aa4fSLi Zhang void mlx5_flow_destroy_def_policy(struct rte_eth_dev *dev);
2635afb4aa4fSLi Zhang void flow_drv_rxq_flags_set(struct rte_eth_dev *dev,
2636afb4aa4fSLi Zhang 		       struct mlx5_flow_handle *dev_handle);
26378c5a231bSGregory Etelson const struct mlx5_flow_tunnel *
26388c5a231bSGregory Etelson mlx5_get_tof(const struct rte_flow_item *items,
26398c5a231bSGregory Etelson 	     const struct rte_flow_action *actions,
26408c5a231bSGregory Etelson 	     enum mlx5_tof_rule_type *rule_type);
2641b401400dSSuanming Mou void
2642b401400dSSuanming Mou flow_hw_resource_release(struct rte_eth_dev *dev);
2643f64a7946SRongwei Liu void
2644f64a7946SRongwei Liu flow_hw_rxq_flag_set(struct rte_eth_dev *dev, bool enable);
26457ab3962dSSuanming Mou int flow_dv_action_validate(struct rte_eth_dev *dev,
26467ab3962dSSuanming Mou 			    const struct rte_flow_indir_action_conf *conf,
26477ab3962dSSuanming Mou 			    const struct rte_flow_action *action,
26487ab3962dSSuanming Mou 			    struct rte_flow_error *err);
26497ab3962dSSuanming Mou struct rte_flow_action_handle *flow_dv_action_create(struct rte_eth_dev *dev,
26507ab3962dSSuanming Mou 		      const struct rte_flow_indir_action_conf *conf,
26517ab3962dSSuanming Mou 		      const struct rte_flow_action *action,
26527ab3962dSSuanming Mou 		      struct rte_flow_error *err);
26537ab3962dSSuanming Mou int flow_dv_action_destroy(struct rte_eth_dev *dev,
26547ab3962dSSuanming Mou 			   struct rte_flow_action_handle *handle,
26557ab3962dSSuanming Mou 			   struct rte_flow_error *error);
26567ab3962dSSuanming Mou int flow_dv_action_update(struct rte_eth_dev *dev,
26577ab3962dSSuanming Mou 			  struct rte_flow_action_handle *handle,
26587ab3962dSSuanming Mou 			  const void *update,
26597ab3962dSSuanming Mou 			  struct rte_flow_error *err);
26607ab3962dSSuanming Mou int flow_dv_action_query(struct rte_eth_dev *dev,
26617ab3962dSSuanming Mou 			 const struct rte_flow_action_handle *handle,
26627ab3962dSSuanming Mou 			 void *data,
26637ab3962dSSuanming Mou 			 struct rte_flow_error *error);
2664fe3620aaSSuanming Mou size_t flow_dv_get_item_hdr_len(const enum rte_flow_item_type item_type);
2665fe3620aaSSuanming Mou int flow_dv_convert_encap_data(const struct rte_flow_item *items, uint8_t *buf,
2666fe3620aaSSuanming Mou 			   size_t *size, struct rte_flow_error *error);
26670f4aa72bSSuanming Mou void mlx5_flow_field_id_to_modify_info
26680f4aa72bSSuanming Mou 		(const struct rte_flow_action_modify_data *data,
26690f4aa72bSSuanming Mou 		 struct field_modify_info *info, uint32_t *mask,
26700f4aa72bSSuanming Mou 		 uint32_t width, struct rte_eth_dev *dev,
26710f4aa72bSSuanming Mou 		 const struct rte_flow_attr *attr, struct rte_flow_error *error);
26720f4aa72bSSuanming Mou int flow_dv_convert_modify_action(struct rte_flow_item *item,
26730f4aa72bSSuanming Mou 			      struct field_modify_info *field,
26740f4aa72bSSuanming Mou 			      struct field_modify_info *dcopy,
26750f4aa72bSSuanming Mou 			      struct mlx5_flow_dv_modify_hdr_resource *resource,
26760f4aa72bSSuanming Mou 			      uint32_t type, struct rte_flow_error *error);
267768e9925cSShun Hao 
267868e9925cSShun Hao #define MLX5_PF_VPORT_ID 0
267968e9925cSShun Hao #define MLX5_ECPF_VPORT_ID 0xFFFE
268068e9925cSShun Hao 
268192b3c68eSShun Hao int16_t mlx5_flow_get_esw_manager_vport_id(struct rte_eth_dev *dev);
268292b3c68eSShun Hao int mlx5_flow_get_item_vport_id(struct rte_eth_dev *dev,
268392b3c68eSShun Hao 				const struct rte_flow_item *item,
268492b3c68eSShun Hao 				uint16_t *vport_id,
2685ca7e6051SShun Hao 				bool *all_ports,
268692b3c68eSShun Hao 				struct rte_flow_error *error);
268792b3c68eSShun Hao 
268875a00812SSuanming Mou int flow_dv_translate_items_hws(const struct rte_flow_item *items,
268975a00812SSuanming Mou 				struct mlx5_flow_attr *attr, void *key,
269075a00812SSuanming Mou 				uint32_t key_type, uint64_t *item_flags,
269175a00812SSuanming Mou 				uint8_t *match_criteria,
269275a00812SSuanming Mou 				struct rte_flow_error *error);
26931939eb6fSDariusz Sosnowski 
26941939eb6fSDariusz Sosnowski int mlx5_flow_pick_transfer_proxy(struct rte_eth_dev *dev,
26951939eb6fSDariusz Sosnowski 				  uint16_t *proxy_port_id,
26961939eb6fSDariusz Sosnowski 				  struct rte_flow_error *error);
2697c68bb7a6SAsaf Penso int flow_null_get_aged_flows(struct rte_eth_dev *dev,
2698c68bb7a6SAsaf Penso 		    void **context,
2699c68bb7a6SAsaf Penso 		    uint32_t nb_contexts,
2700c68bb7a6SAsaf Penso 		    struct rte_flow_error *error);
2701c68bb7a6SAsaf Penso uint32_t flow_null_counter_allocate(struct rte_eth_dev *dev);
2702c68bb7a6SAsaf Penso void flow_null_counter_free(struct rte_eth_dev *dev,
2703c68bb7a6SAsaf Penso 			uint32_t counter);
2704c68bb7a6SAsaf Penso int flow_null_counter_query(struct rte_eth_dev *dev,
2705c68bb7a6SAsaf Penso 			uint32_t counter,
2706c68bb7a6SAsaf Penso 			bool clear,
2707c68bb7a6SAsaf Penso 		    uint64_t *pkts,
2708c68bb7a6SAsaf Penso 			uint64_t *bytes,
2709c68bb7a6SAsaf Penso 			void **action);
27101939eb6fSDariusz Sosnowski 
27111939eb6fSDariusz Sosnowski int mlx5_flow_hw_flush_ctrl_flows(struct rte_eth_dev *dev);
27121939eb6fSDariusz Sosnowski 
27131939eb6fSDariusz Sosnowski int mlx5_flow_hw_esw_create_sq_miss_flow(struct rte_eth_dev *dev,
271426e1eaf2SDariusz Sosnowski 					 uint32_t sqn);
27151939eb6fSDariusz Sosnowski int mlx5_flow_hw_esw_create_default_jump_flow(struct rte_eth_dev *dev);
2716ddb68e47SBing Zhao int mlx5_flow_hw_create_tx_default_mreg_copy_flow(struct rte_eth_dev *dev);
2717483181f7SDariusz Sosnowski int mlx5_flow_hw_tx_repr_matching_flow(struct rte_eth_dev *dev, uint32_t sqn);
271824865366SAlexander Kozyrev int mlx5_flow_actions_validate(struct rte_eth_dev *dev,
271924865366SAlexander Kozyrev 		const struct rte_flow_actions_template_attr *attr,
272024865366SAlexander Kozyrev 		const struct rte_flow_action actions[],
272124865366SAlexander Kozyrev 		const struct rte_flow_action masks[],
272224865366SAlexander Kozyrev 		struct rte_flow_error *error);
272324865366SAlexander Kozyrev int mlx5_flow_pattern_validate(struct rte_eth_dev *dev,
272424865366SAlexander Kozyrev 		const struct rte_flow_pattern_template_attr *attr,
272524865366SAlexander Kozyrev 		const struct rte_flow_item items[],
272624865366SAlexander Kozyrev 		struct rte_flow_error *error);
2727f1fecffaSDariusz Sosnowski int flow_hw_table_update(struct rte_eth_dev *dev,
2728f1fecffaSDariusz Sosnowski 			 struct rte_flow_error *error);
2729773ca0e9SGregory Etelson int mlx5_flow_item_field_width(struct rte_eth_dev *dev,
2730773ca0e9SGregory Etelson 			   enum rte_flow_field_id field, int inherit,
2731773ca0e9SGregory Etelson 			   const struct rte_flow_attr *attr,
2732773ca0e9SGregory Etelson 			   struct rte_flow_error *error);
273300e57916SRongwei Liu 
273400e57916SRongwei Liu static __rte_always_inline int
273500e57916SRongwei Liu flow_hw_get_srh_flex_parser_byte_off_from_ctx(void *dr_ctx __rte_unused)
273600e57916SRongwei Liu {
273700e57916SRongwei Liu #ifdef HAVE_IBV_FLOW_DV_SUPPORT
273800e57916SRongwei Liu 	uint16_t port;
273900e57916SRongwei Liu 
274000e57916SRongwei Liu 	MLX5_ETH_FOREACH_DEV(port, NULL) {
274100e57916SRongwei Liu 		struct mlx5_priv *priv;
274200e57916SRongwei Liu 		struct mlx5_hca_flex_attr *attr;
2743bc0a9303SRongwei Liu 		struct mlx5_devx_match_sample_info_query_attr *info;
274400e57916SRongwei Liu 
274500e57916SRongwei Liu 		priv = rte_eth_devices[port].data->dev_private;
274600e57916SRongwei Liu 		attr = &priv->sh->cdev->config.hca_attr.flex;
2747bc0a9303SRongwei Liu 		if (priv->dr_ctx == dr_ctx && attr->query_match_sample_info) {
2748bc0a9303SRongwei Liu 			info = &priv->sh->srh_flex_parser.flex.devx_fp->sample_info[0];
2749bc0a9303SRongwei Liu 			if (priv->sh->srh_flex_parser.flex.mapnum)
2750bc0a9303SRongwei Liu 				return info->sample_dw_data * sizeof(uint32_t);
275100e57916SRongwei Liu 			else
275200e57916SRongwei Liu 				return UINT32_MAX;
275300e57916SRongwei Liu 		}
275400e57916SRongwei Liu 	}
275500e57916SRongwei Liu #endif
275600e57916SRongwei Liu 	return UINT32_MAX;
275700e57916SRongwei Liu }
275884c406e7SOri Kam #endif /* RTE_PMD_MLX5_FLOW_H_ */
2759