xref: /dpdk/drivers/net/mlx5/mlx5_flow.h (revision 45633c460c223a67dd1a7cc084c3eceb5e17687c)
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"
20f5bf91deSMoti Haimovsky 
2170d84dc7SOri Kam /* Private rte flow items. */
2270d84dc7SOri Kam enum mlx5_rte_flow_item_type {
2370d84dc7SOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_END = INT_MIN,
2470d84dc7SOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_TAG,
253c84f34eSOri Kam 	MLX5_RTE_FLOW_ITEM_TYPE_TX_QUEUE,
2650f576d6SSuanming Mou 	MLX5_RTE_FLOW_ITEM_TYPE_VLAN,
274ec6360dSGregory Etelson 	MLX5_RTE_FLOW_ITEM_TYPE_TUNNEL,
2870d84dc7SOri Kam };
2970d84dc7SOri Kam 
30baf516beSViacheslav Ovsiienko /* Private (internal) rte flow actions. */
3170d84dc7SOri Kam enum mlx5_rte_flow_action_type {
3270d84dc7SOri Kam 	MLX5_RTE_FLOW_ACTION_TYPE_END = INT_MIN,
3370d84dc7SOri Kam 	MLX5_RTE_FLOW_ACTION_TYPE_TAG,
34dd3c774fSViacheslav Ovsiienko 	MLX5_RTE_FLOW_ACTION_TYPE_MARK,
35baf516beSViacheslav Ovsiienko 	MLX5_RTE_FLOW_ACTION_TYPE_COPY_MREG,
363c78124fSShiri Kuzin 	MLX5_RTE_FLOW_ACTION_TYPE_DEFAULT_MISS,
374ec6360dSGregory Etelson 	MLX5_RTE_FLOW_ACTION_TYPE_TUNNEL_SET,
3881073e1fSMatan Azrad 	MLX5_RTE_FLOW_ACTION_TYPE_AGE,
3951ec04dcSShun Hao 	MLX5_RTE_FLOW_ACTION_TYPE_COUNT,
40f3191849SMichael Baum 	MLX5_RTE_FLOW_ACTION_TYPE_JUMP,
4170d84dc7SOri Kam };
4270d84dc7SOri Kam 
434b61b877SBing Zhao #define MLX5_INDIRECT_ACTION_TYPE_OFFSET 30
444a42ac1fSMatan Azrad 
454a42ac1fSMatan Azrad enum {
464b61b877SBing Zhao 	MLX5_INDIRECT_ACTION_TYPE_RSS,
474b61b877SBing Zhao 	MLX5_INDIRECT_ACTION_TYPE_AGE,
48f3191849SMichael Baum 	MLX5_INDIRECT_ACTION_TYPE_COUNT,
492db75e8bSBing Zhao 	MLX5_INDIRECT_ACTION_TYPE_CT,
504a42ac1fSMatan Azrad };
514a42ac1fSMatan Azrad 
524f74cb68SBing Zhao /* Now, the maximal ports will be supported is 256, action number is 4M. */
534f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_MAX_PORT 0x100
544f74cb68SBing Zhao 
554f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_OWNER_SHIFT 22
564f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_OWNER_MASK (MLX5_INDIRECT_ACT_CT_MAX_PORT - 1)
574f74cb68SBing Zhao 
584f74cb68SBing Zhao /* 30-31: type, 22-29: owner port, 0-21: index. */
594f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_GEN_IDX(owner, index) \
604f74cb68SBing Zhao 	((MLX5_INDIRECT_ACTION_TYPE_CT << MLX5_INDIRECT_ACTION_TYPE_OFFSET) | \
614f74cb68SBing Zhao 	 (((owner) & MLX5_INDIRECT_ACT_CT_OWNER_MASK) << \
624f74cb68SBing Zhao 	  MLX5_INDIRECT_ACT_CT_OWNER_SHIFT) | (index))
634f74cb68SBing Zhao 
644f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_GET_OWNER(index) \
654f74cb68SBing Zhao 	(((index) >> MLX5_INDIRECT_ACT_CT_OWNER_SHIFT) & \
664f74cb68SBing Zhao 	 MLX5_INDIRECT_ACT_CT_OWNER_MASK)
674f74cb68SBing Zhao 
684f74cb68SBing Zhao #define MLX5_INDIRECT_ACT_CT_GET_IDX(index) \
694f74cb68SBing Zhao 	((index) & ((1 << MLX5_INDIRECT_ACT_CT_OWNER_SHIFT) - 1))
704f74cb68SBing Zhao 
7170d84dc7SOri Kam /* Matches on selected register. */
7270d84dc7SOri Kam struct mlx5_rte_flow_item_tag {
73baf516beSViacheslav Ovsiienko 	enum modify_reg id;
74cff811c7SViacheslav Ovsiienko 	uint32_t data;
7570d84dc7SOri Kam };
7670d84dc7SOri Kam 
7770d84dc7SOri Kam /* Modify selected register. */
7870d84dc7SOri Kam struct mlx5_rte_flow_action_set_tag {
79baf516beSViacheslav Ovsiienko 	enum modify_reg id;
80a597ef33SShun Hao 	uint8_t offset;
81a597ef33SShun Hao 	uint8_t length;
82cff811c7SViacheslav Ovsiienko 	uint32_t data;
8370d84dc7SOri Kam };
8470d84dc7SOri Kam 
85baf516beSViacheslav Ovsiienko struct mlx5_flow_action_copy_mreg {
86baf516beSViacheslav Ovsiienko 	enum modify_reg dst;
87baf516beSViacheslav Ovsiienko 	enum modify_reg src;
88baf516beSViacheslav Ovsiienko };
89baf516beSViacheslav Ovsiienko 
903c84f34eSOri Kam /* Matches on source queue. */
913c84f34eSOri Kam struct mlx5_rte_flow_item_tx_queue {
923c84f34eSOri Kam 	uint32_t queue;
933c84f34eSOri Kam };
943c84f34eSOri Kam 
953e8edd0eSViacheslav Ovsiienko /* Feature name to allocate metadata register. */
963e8edd0eSViacheslav Ovsiienko enum mlx5_feature_name {
973e8edd0eSViacheslav Ovsiienko 	MLX5_HAIRPIN_RX,
983e8edd0eSViacheslav Ovsiienko 	MLX5_HAIRPIN_TX,
993e8edd0eSViacheslav Ovsiienko 	MLX5_METADATA_RX,
1003e8edd0eSViacheslav Ovsiienko 	MLX5_METADATA_TX,
1013e8edd0eSViacheslav Ovsiienko 	MLX5_METADATA_FDB,
1023e8edd0eSViacheslav Ovsiienko 	MLX5_FLOW_MARK,
1033e8edd0eSViacheslav Ovsiienko 	MLX5_APP_TAG,
1043e8edd0eSViacheslav Ovsiienko 	MLX5_COPY_MARK,
10527efd5deSSuanming Mou 	MLX5_MTR_COLOR,
10683306d6cSShun Hao 	MLX5_MTR_ID,
10731ef2982SDekel Peled 	MLX5_ASO_FLOW_HIT,
1088ebbc01fSBing Zhao 	MLX5_ASO_CONNTRACK,
1093e8edd0eSViacheslav Ovsiienko };
1103e8edd0eSViacheslav Ovsiienko 
1118bb81f26SXueming Li /* Default queue number. */
1128bb81f26SXueming Li #define MLX5_RSSQ_DEFAULT_NUM 16
1138bb81f26SXueming Li 
11484c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L2 (1u << 0)
11584c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3_IPV4 (1u << 1)
11684c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3_IPV6 (1u << 2)
11784c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4_UDP (1u << 3)
11884c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4_TCP (1u << 4)
11984c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_VLAN (1u << 5)
12084c406e7SOri Kam 
12184c406e7SOri Kam /* Pattern inner Layer bits. */
12284c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L2 (1u << 6)
12384c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3_IPV4 (1u << 7)
12484c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3_IPV6 (1u << 8)
12584c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4_UDP (1u << 9)
12684c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4_TCP (1u << 10)
12784c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_VLAN (1u << 11)
12884c406e7SOri Kam 
12984c406e7SOri Kam /* Pattern tunnel Layer bits. */
13084c406e7SOri Kam #define MLX5_FLOW_LAYER_VXLAN (1u << 12)
13184c406e7SOri Kam #define MLX5_FLOW_LAYER_VXLAN_GPE (1u << 13)
13284c406e7SOri Kam #define MLX5_FLOW_LAYER_GRE (1u << 14)
13384c406e7SOri Kam #define MLX5_FLOW_LAYER_MPLS (1u << 15)
134ea81c1b8SDekel Peled /* List of tunnel Layer bits continued below. */
13584c406e7SOri Kam 
1366bd7fbd0SDekel Peled /* General pattern items bits. */
1376bd7fbd0SDekel Peled #define MLX5_FLOW_ITEM_METADATA (1u << 16)
1382e4c987aSOri Kam #define MLX5_FLOW_ITEM_PORT_ID (1u << 17)
13970d84dc7SOri Kam #define MLX5_FLOW_ITEM_TAG (1u << 18)
14055deee17SViacheslav Ovsiienko #define MLX5_FLOW_ITEM_MARK (1u << 19)
1416bd7fbd0SDekel Peled 
142d53aa89aSXiaoyu Min /* Pattern MISC bits. */
14320ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_ICMP (1u << 20)
14420ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_ICMP6 (1u << 21)
14520ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_GRE_KEY (1u << 22)
146d53aa89aSXiaoyu Min 
147ea81c1b8SDekel Peled /* Pattern tunnel Layer bits (continued). */
14820ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_IPIP (1u << 23)
14920ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_IPV6_ENCAP (1u << 24)
15020ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_NVGRE (1u << 25)
15120ac7966SXiaoyu Min #define MLX5_FLOW_LAYER_GENEVE (1u << 26)
1525e33bebdSXiaoyu Min 
1533c84f34eSOri Kam /* Queue items. */
15420ac7966SXiaoyu Min #define MLX5_FLOW_ITEM_TX_QUEUE (1u << 27)
1553c84f34eSOri Kam 
156f31d7a01SDekel Peled /* Pattern tunnel Layer bits (continued). */
157f31d7a01SDekel Peled #define MLX5_FLOW_LAYER_GTP (1u << 28)
158f31d7a01SDekel Peled 
159c7eca236SBing Zhao /* Pattern eCPRI Layer bit. */
160c7eca236SBing Zhao #define MLX5_FLOW_LAYER_ECPRI (UINT64_C(1) << 29)
161c7eca236SBing Zhao 
1620e5a0d8fSDekel Peled /* IPv6 Fragment Extension Header bit. */
1630e5a0d8fSDekel Peled #define MLX5_FLOW_LAYER_OUTER_L3_IPV6_FRAG_EXT (1u << 30)
1640e5a0d8fSDekel Peled #define MLX5_FLOW_LAYER_INNER_L3_IPV6_FRAG_EXT (1u << 31)
1650e5a0d8fSDekel Peled 
1662c9f9617SShiri Kuzin /* Pattern tunnel Layer bits (continued). */
167f7239fceSShiri Kuzin #define MLX5_FLOW_LAYER_GENEVE_OPT (UINT64_C(1) << 32)
1682c9f9617SShiri Kuzin #define MLX5_FLOW_LAYER_GTP_PSC (UINT64_C(1) << 33)
1692c9f9617SShiri Kuzin 
17079f89527SGregory Etelson /* INTEGRITY item bit */
17179f89527SGregory Etelson #define MLX5_FLOW_ITEM_INTEGRITY (UINT64_C(1) << 34)
17279f89527SGregory Etelson 
173aca19061SBing Zhao /* Conntrack item. */
174aca19061SBing Zhao #define MLX5_FLOW_LAYER_ASO_CT (UINT64_C(1) << 35)
175aca19061SBing Zhao 
17684c406e7SOri Kam /* Outer Masks. */
17784c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L3 \
17884c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_OUTER_L3_IPV6)
17984c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER_L4 \
18084c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L4_UDP | MLX5_FLOW_LAYER_OUTER_L4_TCP)
18184c406e7SOri Kam #define MLX5_FLOW_LAYER_OUTER \
18284c406e7SOri Kam 	(MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_OUTER_L3 | \
18384c406e7SOri Kam 	 MLX5_FLOW_LAYER_OUTER_L4)
18484c406e7SOri Kam 
18584c406e7SOri Kam /* Tunnel Masks. */
18684c406e7SOri Kam #define MLX5_FLOW_LAYER_TUNNEL \
18784c406e7SOri Kam 	(MLX5_FLOW_LAYER_VXLAN | MLX5_FLOW_LAYER_VXLAN_GPE | \
188ea81c1b8SDekel Peled 	 MLX5_FLOW_LAYER_GRE | MLX5_FLOW_LAYER_NVGRE | MLX5_FLOW_LAYER_MPLS | \
189e59a5dbcSMoti Haimovsky 	 MLX5_FLOW_LAYER_IPIP | MLX5_FLOW_LAYER_IPV6_ENCAP | \
190f31d7a01SDekel Peled 	 MLX5_FLOW_LAYER_GENEVE | MLX5_FLOW_LAYER_GTP)
19184c406e7SOri Kam 
19284c406e7SOri Kam /* Inner Masks. */
19384c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L3 \
19484c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV6)
19584c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER_L4 \
19684c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L4_UDP | MLX5_FLOW_LAYER_INNER_L4_TCP)
19784c406e7SOri Kam #define MLX5_FLOW_LAYER_INNER \
19884c406e7SOri Kam 	(MLX5_FLOW_LAYER_INNER_L2 | MLX5_FLOW_LAYER_INNER_L3 | \
19984c406e7SOri Kam 	 MLX5_FLOW_LAYER_INNER_L4)
20084c406e7SOri Kam 
2014bb14c83SDekel Peled /* Layer Masks. */
2024bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L2 \
2034bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L2 | MLX5_FLOW_LAYER_INNER_L2)
2044bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV4 \
2054bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_INNER_L3_IPV4)
2064bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3_IPV6 \
2074bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L3_IPV6 | MLX5_FLOW_LAYER_INNER_L3_IPV6)
2084bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L3 \
2094bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_L3_IPV4 | MLX5_FLOW_LAYER_L3_IPV6)
2104bb14c83SDekel Peled #define MLX5_FLOW_LAYER_L4 \
2114bb14c83SDekel Peled 	(MLX5_FLOW_LAYER_OUTER_L4 | MLX5_FLOW_LAYER_INNER_L4)
2124bb14c83SDekel Peled 
21384c406e7SOri Kam /* Actions */
21484c406e7SOri Kam #define MLX5_FLOW_ACTION_DROP (1u << 0)
21584c406e7SOri Kam #define MLX5_FLOW_ACTION_QUEUE (1u << 1)
21684c406e7SOri Kam #define MLX5_FLOW_ACTION_RSS (1u << 2)
21784c406e7SOri Kam #define MLX5_FLOW_ACTION_FLAG (1u << 3)
21884c406e7SOri Kam #define MLX5_FLOW_ACTION_MARK (1u << 4)
21984c406e7SOri Kam #define MLX5_FLOW_ACTION_COUNT (1u << 5)
22057123c00SYongseok Koh #define MLX5_FLOW_ACTION_PORT_ID (1u << 6)
22157123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_POP_VLAN (1u << 7)
22257123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_PUSH_VLAN (1u << 8)
22357123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_SET_VLAN_VID (1u << 9)
22457123c00SYongseok Koh #define MLX5_FLOW_ACTION_OF_SET_VLAN_PCP (1u << 10)
2252ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV4_SRC (1u << 11)
2262ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV4_DST (1u << 12)
2272ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV6_SRC (1u << 13)
2282ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_IPV6_DST (1u << 14)
2292ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TP_SRC (1u << 15)
2302ed2fe5fSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TP_DST (1u << 16)
23131fda518SYongseok Koh #define MLX5_FLOW_ACTION_JUMP (1u << 17)
232a7cb5bcdSXiaoyu Min #define MLX5_FLOW_ACTION_SET_TTL (1u << 18)
233a7cb5bcdSXiaoyu Min #define MLX5_FLOW_ACTION_DEC_TTL (1u << 19)
23476046778SXiaoyu Min #define MLX5_FLOW_ACTION_SET_MAC_SRC (1u << 20)
23576046778SXiaoyu Min #define MLX5_FLOW_ACTION_SET_MAC_DST (1u << 21)
23606387be8SMatan Azrad #define MLX5_FLOW_ACTION_ENCAP (1u << 22)
23706387be8SMatan Azrad #define MLX5_FLOW_ACTION_DECAP (1u << 23)
23806387be8SMatan Azrad #define MLX5_FLOW_ACTION_INC_TCP_SEQ (1u << 24)
23906387be8SMatan Azrad #define MLX5_FLOW_ACTION_DEC_TCP_SEQ (1u << 25)
24006387be8SMatan Azrad #define MLX5_FLOW_ACTION_INC_TCP_ACK (1u << 26)
24106387be8SMatan Azrad #define MLX5_FLOW_ACTION_DEC_TCP_ACK (1u << 27)
24206387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_TAG (1ull << 28)
24306387be8SMatan Azrad #define MLX5_FLOW_ACTION_MARK_EXT (1ull << 29)
24406387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_META (1ull << 30)
24506387be8SMatan Azrad #define MLX5_FLOW_ACTION_METER (1ull << 31)
24606387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_IPV4_DSCP (1ull << 32)
24706387be8SMatan Azrad #define MLX5_FLOW_ACTION_SET_IPV6_DSCP (1ull << 33)
248fa2d01c8SDong Zhou #define MLX5_FLOW_ACTION_AGE (1ull << 34)
2493c78124fSShiri Kuzin #define MLX5_FLOW_ACTION_DEFAULT_MISS (1ull << 35)
25096b1f027SJiawei Wang #define MLX5_FLOW_ACTION_SAMPLE (1ull << 36)
2514ec6360dSGregory Etelson #define MLX5_FLOW_ACTION_TUNNEL_SET (1ull << 37)
2524ec6360dSGregory Etelson #define MLX5_FLOW_ACTION_TUNNEL_MATCH (1ull << 38)
253641dbe4fSAlexander Kozyrev #define MLX5_FLOW_ACTION_MODIFY_FIELD (1ull << 39)
25444432018SLi Zhang #define MLX5_FLOW_ACTION_METER_WITH_TERMINATED_POLICY (1ull << 40)
2552d084f69SBing Zhao #define MLX5_FLOW_ACTION_CT (1ull << 41)
25684c406e7SOri Kam 
25784c406e7SOri Kam #define MLX5_FLOW_FATE_ACTIONS \
258684b9a1bSOri Kam 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_QUEUE | \
2593c78124fSShiri Kuzin 	 MLX5_FLOW_ACTION_RSS | MLX5_FLOW_ACTION_JUMP | \
26044432018SLi Zhang 	 MLX5_FLOW_ACTION_DEFAULT_MISS | \
26144432018SLi Zhang 	 MLX5_FLOW_ACTION_METER_WITH_TERMINATED_POLICY)
26284c406e7SOri Kam 
2632e4c987aSOri Kam #define MLX5_FLOW_FATE_ESWITCH_ACTIONS \
2642e4c987aSOri Kam 	(MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_PORT_ID | \
26544432018SLi Zhang 	 MLX5_FLOW_ACTION_JUMP | MLX5_FLOW_ACTION_METER_WITH_TERMINATED_POLICY)
2664b8727f0SDekel Peled 
2674bb14c83SDekel Peled #define MLX5_FLOW_MODIFY_HDR_ACTIONS (MLX5_FLOW_ACTION_SET_IPV4_SRC | \
2684bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV4_DST | \
2694bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV6_SRC | \
2704bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_IPV6_DST | \
2714bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TP_SRC | \
2724bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TP_DST | \
2734bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_TTL | \
2744bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_DEC_TTL | \
2754bb14c83SDekel Peled 				      MLX5_FLOW_ACTION_SET_MAC_SRC | \
276585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_SET_MAC_DST | \
277585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_INC_TCP_SEQ | \
278585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_DEC_TCP_SEQ | \
279585b99fbSDekel Peled 				      MLX5_FLOW_ACTION_INC_TCP_ACK | \
2805f163d52SMoti Haimovsky 				      MLX5_FLOW_ACTION_DEC_TCP_ACK | \
28170d84dc7SOri Kam 				      MLX5_FLOW_ACTION_OF_SET_VLAN_VID | \
28255deee17SViacheslav Ovsiienko 				      MLX5_FLOW_ACTION_SET_TAG | \
283fcc8d2f7SViacheslav Ovsiienko 				      MLX5_FLOW_ACTION_MARK_EXT | \
2846f26e604SSuanming Mou 				      MLX5_FLOW_ACTION_SET_META | \
2856f26e604SSuanming Mou 				      MLX5_FLOW_ACTION_SET_IPV4_DSCP | \
286641dbe4fSAlexander Kozyrev 				      MLX5_FLOW_ACTION_SET_IPV6_DSCP | \
287641dbe4fSAlexander Kozyrev 				      MLX5_FLOW_ACTION_MODIFY_FIELD)
2884bb14c83SDekel Peled 
2899aee7a84SMoti Haimovsky #define MLX5_FLOW_VLAN_ACTIONS (MLX5_FLOW_ACTION_OF_POP_VLAN | \
2909aee7a84SMoti Haimovsky 				MLX5_FLOW_ACTION_OF_PUSH_VLAN)
29106387be8SMatan Azrad 
29206387be8SMatan Azrad #define MLX5_FLOW_XCAP_ACTIONS (MLX5_FLOW_ACTION_ENCAP | MLX5_FLOW_ACTION_DECAP)
29306387be8SMatan Azrad 
29484c406e7SOri Kam #ifndef IPPROTO_MPLS
29584c406e7SOri Kam #define IPPROTO_MPLS 137
29684c406e7SOri Kam #endif
29784c406e7SOri Kam 
298d1abe664SDekel Peled /* UDP port number for MPLS */
299d1abe664SDekel Peled #define MLX5_UDP_PORT_MPLS 6635
300d1abe664SDekel Peled 
301fc2c498cSOri Kam /* UDP port numbers for VxLAN. */
302fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN 4789
303fc2c498cSOri Kam #define MLX5_UDP_PORT_VXLAN_GPE 4790
304fc2c498cSOri Kam 
305e59a5dbcSMoti Haimovsky /* UDP port numbers for GENEVE. */
306e59a5dbcSMoti Haimovsky #define MLX5_UDP_PORT_GENEVE 6081
307e59a5dbcSMoti Haimovsky 
3085f8ae44dSDong Zhou /* Lowest priority indicator. */
3095f8ae44dSDong Zhou #define MLX5_FLOW_LOWEST_PRIO_INDICATOR ((uint32_t)-1)
3105f8ae44dSDong Zhou 
3115f8ae44dSDong Zhou /*
3125f8ae44dSDong Zhou  * Max priority for ingress\egress flow groups
3135f8ae44dSDong Zhou  * greater than 0 and for any transfer flow group.
3145f8ae44dSDong Zhou  * From user configation: 0 - 21843.
3155f8ae44dSDong Zhou  */
3165f8ae44dSDong Zhou #define MLX5_NON_ROOT_FLOW_MAX_PRIO	(21843 + 1)
31784c406e7SOri Kam 
31884c406e7SOri Kam /*
31984c406e7SOri Kam  * Number of sub priorities.
32084c406e7SOri Kam  * For each kind of pattern matching i.e. L2, L3, L4 to have a correct
32184c406e7SOri Kam  * matching on the NIC (firmware dependent) L4 most have the higher priority
32284c406e7SOri Kam  * followed by L3 and ending with L2.
32384c406e7SOri Kam  */
32484c406e7SOri Kam #define MLX5_PRIORITY_MAP_L2 2
32584c406e7SOri Kam #define MLX5_PRIORITY_MAP_L3 1
32684c406e7SOri Kam #define MLX5_PRIORITY_MAP_L4 0
32784c406e7SOri Kam #define MLX5_PRIORITY_MAP_MAX 3
32884c406e7SOri Kam 
329fc2c498cSOri Kam /* Valid layer type for IPV4 RSS. */
330fc2c498cSOri Kam #define MLX5_IPV4_LAYER_TYPES \
331fc2c498cSOri Kam 	(ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | \
332fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV4_UDP | \
333fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV4_OTHER)
334fc2c498cSOri Kam 
335fc2c498cSOri Kam /* IBV hash source bits  for IPV4. */
336fc2c498cSOri Kam #define MLX5_IPV4_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4)
337fc2c498cSOri Kam 
338fc2c498cSOri Kam /* Valid layer type for IPV6 RSS. */
339fc2c498cSOri Kam #define MLX5_IPV6_LAYER_TYPES \
340fc2c498cSOri Kam 	(ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | ETH_RSS_NONFRAG_IPV6_TCP | \
341fc2c498cSOri Kam 	 ETH_RSS_NONFRAG_IPV6_UDP | ETH_RSS_IPV6_EX  | ETH_RSS_IPV6_TCP_EX | \
342fc2c498cSOri Kam 	 ETH_RSS_IPV6_UDP_EX | ETH_RSS_NONFRAG_IPV6_OTHER)
343fc2c498cSOri Kam 
344fc2c498cSOri Kam /* IBV hash source bits  for IPV6. */
345fc2c498cSOri Kam #define MLX5_IPV6_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6)
346fc2c498cSOri Kam 
347c3e33304SDekel Peled /* IBV hash bits for L3 SRC. */
348c3e33304SDekel Peled #define MLX5_L3_SRC_IBV_RX_HASH (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_SRC_IPV6)
349c3e33304SDekel Peled 
350c3e33304SDekel Peled /* IBV hash bits for L3 DST. */
351c3e33304SDekel Peled #define MLX5_L3_DST_IBV_RX_HASH (IBV_RX_HASH_DST_IPV4 | IBV_RX_HASH_DST_IPV6)
352c3e33304SDekel Peled 
353c3e33304SDekel Peled /* IBV hash bits for TCP. */
354c3e33304SDekel Peled #define MLX5_TCP_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_TCP | \
355c3e33304SDekel Peled 			      IBV_RX_HASH_DST_PORT_TCP)
356c3e33304SDekel Peled 
357c3e33304SDekel Peled /* IBV hash bits for UDP. */
358c3e33304SDekel Peled #define MLX5_UDP_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_UDP | \
359c3e33304SDekel Peled 			      IBV_RX_HASH_DST_PORT_UDP)
360c3e33304SDekel Peled 
361c3e33304SDekel Peled /* IBV hash bits for L4 SRC. */
362c3e33304SDekel Peled #define MLX5_L4_SRC_IBV_RX_HASH (IBV_RX_HASH_SRC_PORT_TCP | \
363c3e33304SDekel Peled 				 IBV_RX_HASH_SRC_PORT_UDP)
364c3e33304SDekel Peled 
365c3e33304SDekel Peled /* IBV hash bits for L4 DST. */
366c3e33304SDekel Peled #define MLX5_L4_DST_IBV_RX_HASH (IBV_RX_HASH_DST_PORT_TCP | \
367c3e33304SDekel Peled 				 IBV_RX_HASH_DST_PORT_UDP)
368e59a5dbcSMoti Haimovsky 
369e59a5dbcSMoti Haimovsky /* Geneve header first 16Bit */
370e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_MASK 0x3
371e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_SHIFT 14
372e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_VER_VAL(a) \
373e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_VER_SHIFT)) & (MLX5_GENEVE_VER_MASK))
374e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_MASK 0x3F
375e440d6cfSShiri Kuzin #define MLX5_GENEVE_OPTLEN_SHIFT 8
376e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPTLEN_VAL(a) \
377e59a5dbcSMoti Haimovsky 	    (((a) >> (MLX5_GENEVE_OPTLEN_SHIFT)) & (MLX5_GENEVE_OPTLEN_MASK))
378e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_MASK 0x1
379e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_SHIFT 7
380e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OAMF_VAL(a) \
381e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_OAMF_SHIFT)) & (MLX5_GENEVE_OAMF_MASK))
382e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_MASK 0x1
383e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_SHIFT 6
384e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_CRITO_VAL(a) \
385e59a5dbcSMoti Haimovsky 		(((a) >> (MLX5_GENEVE_CRITO_SHIFT)) & (MLX5_GENEVE_CRITO_MASK))
386e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_MASK 0x3F
387e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_RSVD_VAL(a) ((a) & (MLX5_GENEVE_RSVD_MASK))
388e59a5dbcSMoti Haimovsky /*
389e59a5dbcSMoti Haimovsky  * The length of the Geneve options fields, expressed in four byte multiples,
390e59a5dbcSMoti Haimovsky  * not including the eight byte fixed tunnel.
391e59a5dbcSMoti Haimovsky  */
392e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_0 14
393e59a5dbcSMoti Haimovsky #define MLX5_GENEVE_OPT_LEN_1 63
394e59a5dbcSMoti Haimovsky 
395f9210259SViacheslav Ovsiienko #define MLX5_ENCAPSULATION_DECISION_SIZE (sizeof(struct rte_ether_hdr) + \
396f9210259SViacheslav Ovsiienko 					  sizeof(struct rte_ipv4_hdr))
3972c9f9617SShiri Kuzin /* GTP extension header flag. */
3982c9f9617SShiri Kuzin #define MLX5_GTP_EXT_HEADER_FLAG 4
3992c9f9617SShiri Kuzin 
4002c9f9617SShiri Kuzin /* GTP extension header max PDU type value. */
4012c9f9617SShiri Kuzin #define MLX5_GTP_EXT_MAX_PDU_TYPE 15
40250f576d6SSuanming Mou 
40306cd4cf6SShiri Kuzin /* GTP extension header PDU type shift. */
40406cd4cf6SShiri Kuzin #define MLX5_GTP_PDU_TYPE_SHIFT(a) ((a) << 4)
40506cd4cf6SShiri Kuzin 
4066859e67eSDekel Peled /* IPv4 fragment_offset field contains relevant data in bits 2 to 15. */
4076859e67eSDekel Peled #define MLX5_IPV4_FRAG_OFFSET_MASK \
4086859e67eSDekel Peled 		(RTE_IPV4_HDR_OFFSET_MASK | RTE_IPV4_HDR_MF_FLAG)
4096859e67eSDekel Peled 
4106859e67eSDekel Peled /* Specific item's fields can accept a range of values (using spec and last). */
4116859e67eSDekel Peled #define MLX5_ITEM_RANGE_NOT_ACCEPTED	false
4126859e67eSDekel Peled #define MLX5_ITEM_RANGE_ACCEPTED	true
4136859e67eSDekel Peled 
41472a944dbSBing Zhao /* Software header modify action numbers of a flow. */
41572a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_IPV4		1
41672a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_IPV6		4
41772a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_MAC		2
41872a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_VID		1
41972a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_PORT		2
42072a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_TTL		1
42172a944dbSBing Zhao #define MLX5_ACT_NUM_DEC_TTL		MLX5_ACT_NUM_MDF_TTL
42272a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_TCPSEQ		1
42372a944dbSBing Zhao #define MLX5_ACT_NUM_MDF_TCPACK		1
42472a944dbSBing Zhao #define MLX5_ACT_NUM_SET_REG		1
42572a944dbSBing Zhao #define MLX5_ACT_NUM_SET_TAG		1
42672a944dbSBing Zhao #define MLX5_ACT_NUM_CPY_MREG		MLX5_ACT_NUM_SET_TAG
42772a944dbSBing Zhao #define MLX5_ACT_NUM_SET_MARK		MLX5_ACT_NUM_SET_TAG
42872a944dbSBing Zhao #define MLX5_ACT_NUM_SET_META		MLX5_ACT_NUM_SET_TAG
42972a944dbSBing Zhao #define MLX5_ACT_NUM_SET_DSCP		1
43072a944dbSBing Zhao 
431641dbe4fSAlexander Kozyrev /* Maximum number of fields to modify in MODIFY_FIELD */
432641dbe4fSAlexander Kozyrev #define MLX5_ACT_MAX_MOD_FIELDS 5
433641dbe4fSAlexander Kozyrev 
4345cac1a5cSBing Zhao /* Syndrome bits definition for connection tracking. */
4355cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_VALID		(0x0 << 6)
4365cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_INVALID	(0x1 << 6)
4375cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_TRAP		(0x2 << 6)
4385cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_STATE_CHANGE	(0x1 << 1)
4395cac1a5cSBing Zhao #define MLX5_CT_SYNDROME_BAD_PACKET	(0x1 << 0)
4405cac1a5cSBing Zhao 
4410c76d1c9SYongseok Koh enum mlx5_flow_drv_type {
4420c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_MIN,
4430c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_DV,
4440c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_VERBS,
4450c76d1c9SYongseok Koh 	MLX5_FLOW_TYPE_MAX,
4460c76d1c9SYongseok Koh };
4470c76d1c9SYongseok Koh 
448488d13abSSuanming Mou /* Fate action type. */
449488d13abSSuanming Mou enum mlx5_flow_fate_type {
450488d13abSSuanming Mou 	MLX5_FLOW_FATE_NONE, /* Egress flow. */
451488d13abSSuanming Mou 	MLX5_FLOW_FATE_QUEUE,
452488d13abSSuanming Mou 	MLX5_FLOW_FATE_JUMP,
453488d13abSSuanming Mou 	MLX5_FLOW_FATE_PORT_ID,
454488d13abSSuanming Mou 	MLX5_FLOW_FATE_DROP,
4553c78124fSShiri Kuzin 	MLX5_FLOW_FATE_DEFAULT_MISS,
456fabf8a37SSuanming Mou 	MLX5_FLOW_FATE_SHARED_RSS,
45750cc92ddSShun Hao 	MLX5_FLOW_FATE_MTR,
458488d13abSSuanming Mou 	MLX5_FLOW_FATE_MAX,
459488d13abSSuanming Mou };
460488d13abSSuanming Mou 
461865a0c15SOri Kam /* Matcher PRM representation */
462865a0c15SOri Kam struct mlx5_flow_dv_match_params {
463865a0c15SOri Kam 	size_t size;
464865a0c15SOri Kam 	/**< Size of match value. Do NOT split size and key! */
465865a0c15SOri Kam 	uint32_t buf[MLX5_ST_SZ_DW(fte_match_param)];
466865a0c15SOri Kam 	/**< Matcher value. This value is used as the mask or as a key. */
467865a0c15SOri Kam };
468865a0c15SOri Kam 
469865a0c15SOri Kam /* Matcher structure. */
470865a0c15SOri Kam struct mlx5_flow_dv_matcher {
471e78e5408SMatan Azrad 	struct mlx5_list_entry entry; /**< Pointer to the next element. */
472e9e36e52SBing Zhao 	struct mlx5_flow_tbl_resource *tbl;
473e9e36e52SBing Zhao 	/**< Pointer to the table(group) the matcher associated with. */
474865a0c15SOri Kam 	void *matcher_object; /**< Pointer to DV matcher */
475865a0c15SOri Kam 	uint16_t crc; /**< CRC of key. */
476865a0c15SOri Kam 	uint16_t priority; /**< Priority of matcher. */
477865a0c15SOri Kam 	struct mlx5_flow_dv_match_params mask; /**< Matcher mask. */
478865a0c15SOri Kam };
479865a0c15SOri Kam 
4804bb14c83SDekel Peled #define MLX5_ENCAP_MAX_LEN 132
4814bb14c83SDekel Peled 
482c513f05cSDekel Peled /* Encap/decap resource structure. */
483c513f05cSDekel Peled struct mlx5_flow_dv_encap_decap_resource {
484961b6774SMatan Azrad 	struct mlx5_list_entry entry;
485c513f05cSDekel Peled 	/* Pointer to next element. */
486cf7d1995SAlexander Kozyrev 	uint32_t refcnt; /**< Reference counter. */
4876ad7cfaaSDekel Peled 	void *action;
4886ad7cfaaSDekel Peled 	/**< Encap/decap action object. */
489c513f05cSDekel Peled 	uint8_t buf[MLX5_ENCAP_MAX_LEN];
490c513f05cSDekel Peled 	size_t size;
491c513f05cSDekel Peled 	uint8_t reformat_type;
492c513f05cSDekel Peled 	uint8_t ft_type;
4934f84a197SOri Kam 	uint64_t flags; /**< Flags for RDMA API. */
494bf615b07SSuanming Mou 	uint32_t idx; /**< Index for the index memory pool. */
495c513f05cSDekel Peled };
496c513f05cSDekel Peled 
497cbb66daaSOri Kam /* Tag resource structure. */
498cbb66daaSOri Kam struct mlx5_flow_dv_tag_resource {
499961b6774SMatan Azrad 	struct mlx5_list_entry entry;
500e484e403SBing Zhao 	/**< hash list entry for tag resource, tag value as the key. */
501cbb66daaSOri Kam 	void *action;
5026ad7cfaaSDekel Peled 	/**< Tag action object. */
503cf7d1995SAlexander Kozyrev 	uint32_t refcnt; /**< Reference counter. */
5045f114269SSuanming Mou 	uint32_t idx; /**< Index for the index memory pool. */
505f5b0aed2SSuanming Mou 	uint32_t tag_id; /**< Tag ID. */
506cbb66daaSOri Kam };
507cbb66daaSOri Kam 
5084bb14c83SDekel Peled /* Modify resource structure */
5094bb14c83SDekel Peled struct mlx5_flow_dv_modify_hdr_resource {
510961b6774SMatan Azrad 	struct mlx5_list_entry entry;
51116a7dbc4SXueming Li 	void *action; /**< Modify header action object. */
5124f3d8d0eSMatan Azrad 	uint32_t idx;
51316a7dbc4SXueming Li 	/* Key area for hash list matching: */
5144bb14c83SDekel Peled 	uint8_t ft_type; /**< Flow table type, Rx or Tx. */
515e681eb05SMatan Azrad 	uint8_t actions_num; /**< Number of modification actions. */
516e681eb05SMatan Azrad 	bool root; /**< Whether action is in root table. */
517024e9575SBing Zhao 	struct mlx5_modification_cmd actions[];
518024e9575SBing Zhao 	/**< Modification actions. */
519e681eb05SMatan Azrad } __rte_packed;
5204bb14c83SDekel Peled 
5213fe88961SSuanming Mou /* Modify resource key of the hash organization. */
5223fe88961SSuanming Mou union mlx5_flow_modify_hdr_key {
5233fe88961SSuanming Mou 	struct {
5243fe88961SSuanming Mou 		uint32_t ft_type:8;	/**< Flow table type, Rx or Tx. */
5253fe88961SSuanming Mou 		uint32_t actions_num:5;	/**< Number of modification actions. */
5263fe88961SSuanming Mou 		uint32_t group:19;	/**< Flow group id. */
5273fe88961SSuanming Mou 		uint32_t cksum;		/**< Actions check sum. */
5283fe88961SSuanming Mou 	};
5293fe88961SSuanming Mou 	uint64_t v64;			/**< full 64bits value of key */
5303fe88961SSuanming Mou };
5313fe88961SSuanming Mou 
532684b9a1bSOri Kam /* Jump action resource structure. */
533684b9a1bSOri Kam struct mlx5_flow_dv_jump_tbl_resource {
5346c1d9a64SBing Zhao 	void *action; /**< Pointer to the rdma core action. */
535684b9a1bSOri Kam };
536684b9a1bSOri Kam 
537c269b517SOri Kam /* Port ID resource structure. */
538c269b517SOri Kam struct mlx5_flow_dv_port_id_action_resource {
539e78e5408SMatan Azrad 	struct mlx5_list_entry entry;
5400fd5f82aSXueming Li 	void *action; /**< Action object. */
541c269b517SOri Kam 	uint32_t port_id; /**< Port ID value. */
5420fd5f82aSXueming Li 	uint32_t idx; /**< Indexed pool memory index. */
543c269b517SOri Kam };
544c269b517SOri Kam 
5459aee7a84SMoti Haimovsky /* Push VLAN action resource structure */
5469aee7a84SMoti Haimovsky struct mlx5_flow_dv_push_vlan_action_resource {
547e78e5408SMatan Azrad 	struct mlx5_list_entry entry; /* Cache entry. */
5486ad7cfaaSDekel Peled 	void *action; /**< Action object. */
5499aee7a84SMoti Haimovsky 	uint8_t ft_type; /**< Flow table type, Rx, Tx or FDB. */
5509aee7a84SMoti Haimovsky 	rte_be32_t vlan_tag; /**< VLAN tag value. */
5513422af2aSXueming Li 	uint32_t idx; /**< Indexed pool memory index. */
5529aee7a84SMoti Haimovsky };
5539aee7a84SMoti Haimovsky 
554dd3c774fSViacheslav Ovsiienko /* Metadata register copy table entry. */
555dd3c774fSViacheslav Ovsiienko struct mlx5_flow_mreg_copy_resource {
556dd3c774fSViacheslav Ovsiienko 	/*
557dd3c774fSViacheslav Ovsiienko 	 * Hash list entry for copy table.
558dd3c774fSViacheslav Ovsiienko 	 *  - Key is 32/64-bit MARK action ID.
559dd3c774fSViacheslav Ovsiienko 	 *  - MUST be the first entry.
560dd3c774fSViacheslav Ovsiienko 	 */
561961b6774SMatan Azrad 	struct mlx5_list_entry hlist_ent;
562dd3c774fSViacheslav Ovsiienko 	LIST_ENTRY(mlx5_flow_mreg_copy_resource) next;
563dd3c774fSViacheslav Ovsiienko 	/* List entry for device flows. */
56490e6053aSSuanming Mou 	uint32_t idx;
565ab612adcSSuanming Mou 	uint32_t rix_flow; /* Built flow for copy. */
566f5b0aed2SSuanming Mou 	uint32_t mark_id;
567dd3c774fSViacheslav Ovsiienko };
568dd3c774fSViacheslav Ovsiienko 
569afd7a625SXueming Li /* Table tunnel parameter. */
570afd7a625SXueming Li struct mlx5_flow_tbl_tunnel_prm {
571afd7a625SXueming Li 	const struct mlx5_flow_tunnel *tunnel;
572afd7a625SXueming Li 	uint32_t group_id;
573afd7a625SXueming Li 	bool external;
574afd7a625SXueming Li };
575afd7a625SXueming Li 
576860897d2SBing Zhao /* Table data structure of the hash organization. */
577860897d2SBing Zhao struct mlx5_flow_tbl_data_entry {
578961b6774SMatan Azrad 	struct mlx5_list_entry entry;
579e9e36e52SBing Zhao 	/**< hash list entry, 64-bits key inside. */
580860897d2SBing Zhao 	struct mlx5_flow_tbl_resource tbl;
581e9e36e52SBing Zhao 	/**< flow table resource. */
582679f46c7SMatan Azrad 	struct mlx5_list *matchers;
583e9e36e52SBing Zhao 	/**< matchers' header associated with the flow table. */
5846c1d9a64SBing Zhao 	struct mlx5_flow_dv_jump_tbl_resource jump;
5856c1d9a64SBing Zhao 	/**< jump resource, at most one for each table created. */
5867ac99475SSuanming Mou 	uint32_t idx; /**< index for the indexed mempool. */
5874ec6360dSGregory Etelson 	/**< tunnel offload */
5884ec6360dSGregory Etelson 	const struct mlx5_flow_tunnel *tunnel;
5894ec6360dSGregory Etelson 	uint32_t group_id;
590f5b0aed2SSuanming Mou 	uint32_t external:1;
591f5b0aed2SSuanming Mou 	uint32_t tunnel_offload:1; /* Tunnel offlod table or not. */
592f5b0aed2SSuanming Mou 	uint32_t is_egress:1; /**< Egress table. */
593f5b0aed2SSuanming Mou 	uint32_t is_transfer:1; /**< Transfer table. */
594f5b0aed2SSuanming Mou 	uint32_t dummy:1; /**<  DR table. */
5952d2cef5dSLi Zhang 	uint32_t id:22; /**< Table ID. */
5962d2cef5dSLi Zhang 	uint32_t reserve:5; /**< Reserved to future using. */
5972d2cef5dSLi Zhang 	uint32_t level; /**< Table level. */
598860897d2SBing Zhao };
599860897d2SBing Zhao 
600b4c0ddbfSJiawei Wang /* Sub rdma-core actions list. */
601b4c0ddbfSJiawei Wang struct mlx5_flow_sub_actions_list {
602b4c0ddbfSJiawei Wang 	uint32_t actions_num; /**< Number of sample actions. */
603b4c0ddbfSJiawei Wang 	uint64_t action_flags;
604b4c0ddbfSJiawei Wang 	void *dr_queue_action;
605b4c0ddbfSJiawei Wang 	void *dr_tag_action;
606b4c0ddbfSJiawei Wang 	void *dr_cnt_action;
60700c10c22SJiawei Wang 	void *dr_port_id_action;
60800c10c22SJiawei Wang 	void *dr_encap_action;
6096a951567SJiawei Wang 	void *dr_jump_action;
610b4c0ddbfSJiawei Wang };
611b4c0ddbfSJiawei Wang 
612b4c0ddbfSJiawei Wang /* Sample sub-actions resource list. */
613b4c0ddbfSJiawei Wang struct mlx5_flow_sub_actions_idx {
614b4c0ddbfSJiawei Wang 	uint32_t rix_hrxq; /**< Hash Rx queue object index. */
615b4c0ddbfSJiawei Wang 	uint32_t rix_tag; /**< Index to the tag action. */
61600c10c22SJiawei Wang 	uint32_t rix_port_id_action; /**< Index to port ID action resource. */
61700c10c22SJiawei Wang 	uint32_t rix_encap_decap; /**< Index to encap/decap resource. */
6186a951567SJiawei Wang 	uint32_t rix_jump; /**< Index to the jump action resource. */
619b4c0ddbfSJiawei Wang };
620b4c0ddbfSJiawei Wang 
621b4c0ddbfSJiawei Wang /* Sample action resource structure. */
622b4c0ddbfSJiawei Wang struct mlx5_flow_dv_sample_resource {
623e78e5408SMatan Azrad 	struct mlx5_list_entry entry; /**< Cache entry. */
62419784141SSuanming Mou 	union {
625b4c0ddbfSJiawei Wang 		void *verbs_action; /**< Verbs sample action object. */
62619784141SSuanming Mou 		void **sub_actions; /**< Sample sub-action array. */
62719784141SSuanming Mou 	};
62801c05ee0SSuanming Mou 	struct rte_eth_dev *dev; /**< Device registers the action. */
62919784141SSuanming Mou 	uint32_t idx; /** Sample object index. */
630b4c0ddbfSJiawei Wang 	uint8_t ft_type; /** Flow Table Type */
631b4c0ddbfSJiawei Wang 	uint32_t ft_id; /** Flow Table Level */
632b4c0ddbfSJiawei Wang 	uint32_t ratio;   /** Sample Ratio */
633b4c0ddbfSJiawei Wang 	uint64_t set_action; /** Restore reg_c0 value */
634b4c0ddbfSJiawei Wang 	void *normal_path_tbl; /** Flow Table pointer */
635b4c0ddbfSJiawei Wang 	struct mlx5_flow_sub_actions_idx sample_idx;
636b4c0ddbfSJiawei Wang 	/**< Action index resources. */
637b4c0ddbfSJiawei Wang 	struct mlx5_flow_sub_actions_list sample_act;
638b4c0ddbfSJiawei Wang 	/**< Action resources. */
639b4c0ddbfSJiawei Wang };
640b4c0ddbfSJiawei Wang 
64100c10c22SJiawei Wang #define MLX5_MAX_DEST_NUM	2
64200c10c22SJiawei Wang 
64300c10c22SJiawei Wang /* Destination array action resource structure. */
64400c10c22SJiawei Wang struct mlx5_flow_dv_dest_array_resource {
645e78e5408SMatan Azrad 	struct mlx5_list_entry entry; /**< Cache entry. */
64619784141SSuanming Mou 	uint32_t idx; /** Destination array action object index. */
64700c10c22SJiawei Wang 	uint8_t ft_type; /** Flow Table Type */
64800c10c22SJiawei Wang 	uint8_t num_of_dest; /**< Number of destination actions. */
64901c05ee0SSuanming Mou 	struct rte_eth_dev *dev; /**< Device registers the action. */
65000c10c22SJiawei Wang 	void *action; /**< Pointer to the rdma core action. */
65100c10c22SJiawei Wang 	struct mlx5_flow_sub_actions_idx sample_idx[MLX5_MAX_DEST_NUM];
65200c10c22SJiawei Wang 	/**< Action index resources. */
65300c10c22SJiawei Wang 	struct mlx5_flow_sub_actions_list sample_act[MLX5_MAX_DEST_NUM];
65400c10c22SJiawei Wang 	/**< Action resources. */
65500c10c22SJiawei Wang };
65600c10c22SJiawei Wang 
657750ff30aSGregory Etelson /* PMD flow priority for tunnel */
658750ff30aSGregory Etelson #define MLX5_TUNNEL_PRIO_GET(rss_desc) \
659750ff30aSGregory Etelson 	((rss_desc)->level >= 2 ? MLX5_PRIORITY_MAP_L2 : MLX5_PRIORITY_MAP_L4)
660750ff30aSGregory Etelson 
661e745f900SSuanming Mou 
662c42f44bdSBing Zhao /** Device flow handle structure for DV mode only. */
663c42f44bdSBing Zhao struct mlx5_flow_handle_dv {
664c42f44bdSBing Zhao 	/* Flow DV api: */
665c42f44bdSBing Zhao 	struct mlx5_flow_dv_matcher *matcher; /**< Cache to matcher. */
666c42f44bdSBing Zhao 	struct mlx5_flow_dv_modify_hdr_resource *modify_hdr;
667c42f44bdSBing Zhao 	/**< Pointer to modify header resource in cache. */
66877749adaSSuanming Mou 	uint32_t rix_encap_decap;
66977749adaSSuanming Mou 	/**< Index to encap/decap resource in cache. */
67077749adaSSuanming Mou 	uint32_t rix_push_vlan;
6718acf8ac9SSuanming Mou 	/**< Index to push VLAN action resource in cache. */
67277749adaSSuanming Mou 	uint32_t rix_tag;
6735f114269SSuanming Mou 	/**< Index to the tag action. */
674b4c0ddbfSJiawei Wang 	uint32_t rix_sample;
675b4c0ddbfSJiawei Wang 	/**< Index to sample action resource in cache. */
67600c10c22SJiawei Wang 	uint32_t rix_dest_array;
67700c10c22SJiawei Wang 	/**< Index to destination array resource in cache. */
67877749adaSSuanming Mou } __rte_packed;
679c42f44bdSBing Zhao 
680c42f44bdSBing Zhao /** Device flow handle structure: used both for creating & destroying. */
681c42f44bdSBing Zhao struct mlx5_flow_handle {
682b88341caSSuanming Mou 	SILIST_ENTRY(uint32_t)next;
68377749adaSSuanming Mou 	struct mlx5_vf_vlan vf_vlan; /**< Structure for VF VLAN workaround. */
684b88341caSSuanming Mou 	/**< Index to next device flow handle. */
6850ddd1143SYongseok Koh 	uint64_t layers;
68624663641SYongseok Koh 	/**< Bit-fields of present layers, see MLX5_FLOW_LAYER_*. */
687341c8941SDekel Peled 	void *drv_flow; /**< pointer to driver flow object. */
68883306d6cSShun Hao 	uint32_t split_flow_id:27; /**< Sub flow unique match flow id. */
68983306d6cSShun Hao 	uint32_t is_meter_flow_id:1; /**< Indate if flow_id is for meter. */
690488d13abSSuanming Mou 	uint32_t mark:1; /**< Metadate rxq mark flag. */
691488d13abSSuanming Mou 	uint32_t fate_action:3; /**< Fate action type. */
6926fc18392SSuanming Mou 	union {
69377749adaSSuanming Mou 		uint32_t rix_hrxq; /**< Hash Rx queue object index. */
69477749adaSSuanming Mou 		uint32_t rix_jump; /**< Index to the jump action resource. */
69577749adaSSuanming Mou 		uint32_t rix_port_id_action;
6966fc18392SSuanming Mou 		/**< Index to port ID action resource. */
69777749adaSSuanming Mou 		uint32_t rix_fate;
698488d13abSSuanming Mou 		/**< Generic value indicates the fate action. */
6993c78124fSShiri Kuzin 		uint32_t rix_default_fate;
7003c78124fSShiri Kuzin 		/**< Indicates default miss fate action. */
701fabf8a37SSuanming Mou 		uint32_t rix_srss;
702fabf8a37SSuanming Mou 		/**< Indicates shared RSS fate action. */
7036fc18392SSuanming Mou 	};
704f1ae0b35SOphir Munk #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H)
705c42f44bdSBing Zhao 	struct mlx5_flow_handle_dv dvh;
706c42f44bdSBing Zhao #endif
70777749adaSSuanming Mou } __rte_packed;
708c42f44bdSBing Zhao 
709c42f44bdSBing Zhao /*
710e7bfa359SBing Zhao  * Size for Verbs device flow handle structure only. Do not use the DV only
711e7bfa359SBing Zhao  * structure in Verbs. No DV flows attributes will be accessed.
712e7bfa359SBing Zhao  * Macro offsetof() could also be used here.
713e7bfa359SBing Zhao  */
714f1ae0b35SOphir Munk #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H)
715e7bfa359SBing Zhao #define MLX5_FLOW_HANDLE_VERBS_SIZE \
716e7bfa359SBing Zhao 	(sizeof(struct mlx5_flow_handle) - sizeof(struct mlx5_flow_handle_dv))
717e7bfa359SBing Zhao #else
718e7bfa359SBing Zhao #define MLX5_FLOW_HANDLE_VERBS_SIZE (sizeof(struct mlx5_flow_handle))
719e7bfa359SBing Zhao #endif
720e7bfa359SBing Zhao 
721c42f44bdSBing Zhao /** Device flow structure only for DV flow creation. */
722e7bfa359SBing Zhao struct mlx5_flow_dv_workspace {
723c42f44bdSBing Zhao 	uint32_t group; /**< The group index. */
7242d2cef5dSLi Zhang 	uint32_t table_id; /**< Flow table identifier. */
725c42f44bdSBing Zhao 	uint8_t transfer; /**< 1 if the flow is E-Switch flow. */
726c42f44bdSBing Zhao 	int actions_n; /**< number of actions. */
727c42f44bdSBing Zhao 	void *actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS]; /**< Action list. */
728014d1cbeSSuanming Mou 	struct mlx5_flow_dv_encap_decap_resource *encap_decap;
729014d1cbeSSuanming Mou 	/**< Pointer to encap/decap resource in cache. */
7308acf8ac9SSuanming Mou 	struct mlx5_flow_dv_push_vlan_action_resource *push_vlan_res;
7318acf8ac9SSuanming Mou 	/**< Pointer to push VLAN action resource in cache. */
7325f114269SSuanming Mou 	struct mlx5_flow_dv_tag_resource *tag_resource;
7337ac99475SSuanming Mou 	/**< pointer to the tag action. */
734f3faf9eaSSuanming Mou 	struct mlx5_flow_dv_port_id_action_resource *port_id_action;
735f3faf9eaSSuanming Mou 	/**< Pointer to port ID action resource. */
7367ac99475SSuanming Mou 	struct mlx5_flow_dv_jump_tbl_resource *jump;
7377ac99475SSuanming Mou 	/**< Pointer to the jump action resource. */
738c42f44bdSBing Zhao 	struct mlx5_flow_dv_match_params value;
739c42f44bdSBing Zhao 	/**< Holds the value that the packet is compared to. */
740b4c0ddbfSJiawei Wang 	struct mlx5_flow_dv_sample_resource *sample_res;
741b4c0ddbfSJiawei Wang 	/**< Pointer to the sample action resource. */
74200c10c22SJiawei Wang 	struct mlx5_flow_dv_dest_array_resource *dest_array_res;
74300c10c22SJiawei Wang 	/**< Pointer to the destination array resource. */
744c42f44bdSBing Zhao };
745c42f44bdSBing Zhao 
746f1ae0b35SOphir Munk #ifdef HAVE_INFINIBAND_VERBS_H
747e7bfa359SBing Zhao /*
748e7bfa359SBing Zhao  * Maximal Verbs flow specifications & actions size.
749e7bfa359SBing Zhao  * Some elements are mutually exclusive, but enough space should be allocated.
750e7bfa359SBing Zhao  * Tunnel cases: 1. Max 2 Ethernet + IP(v6 len > v4 len) + TCP/UDP headers.
751e7bfa359SBing Zhao  *               2. One tunnel header (exception: GRE + MPLS),
752e7bfa359SBing Zhao  *                  SPEC length: GRE == tunnel.
753e7bfa359SBing Zhao  * Actions: 1. 1 Mark OR Flag.
754e7bfa359SBing Zhao  *          2. 1 Drop (if any).
755e7bfa359SBing Zhao  *          3. No limitation for counters, but it makes no sense to support too
756e7bfa359SBing Zhao  *             many counters in a single device flow.
757e7bfa359SBing Zhao  */
758e7bfa359SBing Zhao #ifdef HAVE_IBV_DEVICE_MPLS_SUPPORT
759e7bfa359SBing Zhao #define MLX5_VERBS_MAX_SPEC_SIZE \
760e7bfa359SBing Zhao 		( \
761e7bfa359SBing Zhao 			(2 * (sizeof(struct ibv_flow_spec_eth) + \
762e7bfa359SBing Zhao 			      sizeof(struct ibv_flow_spec_ipv6) + \
763e7bfa359SBing Zhao 			      sizeof(struct ibv_flow_spec_tcp_udp)) + \
764e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_gre) + \
765e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_mpls)) \
766e7bfa359SBing Zhao 		)
767e7bfa359SBing Zhao #else
768e7bfa359SBing Zhao #define MLX5_VERBS_MAX_SPEC_SIZE \
769e7bfa359SBing Zhao 		( \
770e7bfa359SBing Zhao 			(2 * (sizeof(struct ibv_flow_spec_eth) + \
771e7bfa359SBing Zhao 			      sizeof(struct ibv_flow_spec_ipv6) + \
772e7bfa359SBing Zhao 			      sizeof(struct ibv_flow_spec_tcp_udp)) + \
773e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_tunnel)) \
774e7bfa359SBing Zhao 		)
775e7bfa359SBing Zhao #endif
776e7bfa359SBing Zhao 
777e7bfa359SBing Zhao #if defined(HAVE_IBV_DEVICE_COUNTERS_SET_V42) || \
778e7bfa359SBing Zhao 	defined(HAVE_IBV_DEVICE_COUNTERS_SET_V45)
779e7bfa359SBing Zhao #define MLX5_VERBS_MAX_ACT_SIZE \
780e7bfa359SBing Zhao 		( \
781e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_action_tag) + \
782e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_action_drop) + \
783e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_counter_action) * 4 \
784e7bfa359SBing Zhao 		)
785e7bfa359SBing Zhao #else
786e7bfa359SBing Zhao #define MLX5_VERBS_MAX_ACT_SIZE \
787e7bfa359SBing Zhao 		( \
788e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_action_tag) + \
789e7bfa359SBing Zhao 			sizeof(struct ibv_flow_spec_action_drop) \
790e7bfa359SBing Zhao 		)
791e7bfa359SBing Zhao #endif
792e7bfa359SBing Zhao 
793e7bfa359SBing Zhao #define MLX5_VERBS_MAX_SPEC_ACT_SIZE \
794e7bfa359SBing Zhao 		(MLX5_VERBS_MAX_SPEC_SIZE + MLX5_VERBS_MAX_ACT_SIZE)
795e7bfa359SBing Zhao 
796c42f44bdSBing Zhao /** Device flow structure only for Verbs flow creation. */
797e7bfa359SBing Zhao struct mlx5_flow_verbs_workspace {
798c42f44bdSBing Zhao 	unsigned int size; /**< Size of the attribute. */
799e7bfa359SBing Zhao 	struct ibv_flow_attr attr; /**< Verbs flow attribute buffer. */
800e7bfa359SBing Zhao 	uint8_t specs[MLX5_VERBS_MAX_SPEC_ACT_SIZE];
801e7bfa359SBing Zhao 	/**< Specifications & actions buffer of verbs flow. */
802c42f44bdSBing Zhao };
803f1ae0b35SOphir Munk #endif /* HAVE_INFINIBAND_VERBS_H */
804c42f44bdSBing Zhao 
805ae2927cdSJiawei Wang #define MLX5_SCALE_FLOW_GROUP_BIT 0
806ae2927cdSJiawei Wang #define MLX5_SCALE_JUMP_FLOW_GROUP_BIT 1
807ae2927cdSJiawei Wang 
808e7bfa359SBing Zhao /** Maximal number of device sub-flows supported. */
809e7bfa359SBing Zhao #define MLX5_NUM_MAX_DEV_FLOWS 32
810e7bfa359SBing Zhao 
8118c5a231bSGregory Etelson /**
8128c5a231bSGregory Etelson  * tunnel offload rules type
8138c5a231bSGregory Etelson  */
8148c5a231bSGregory Etelson enum mlx5_tof_rule_type {
8158c5a231bSGregory Etelson 	MLX5_TUNNEL_OFFLOAD_NONE = 0,
8168c5a231bSGregory Etelson 	MLX5_TUNNEL_OFFLOAD_SET_RULE,
8178c5a231bSGregory Etelson 	MLX5_TUNNEL_OFFLOAD_MATCH_RULE,
8188c5a231bSGregory Etelson 	MLX5_TUNNEL_OFFLOAD_MISS_RULE,
8198c5a231bSGregory Etelson };
8208c5a231bSGregory Etelson 
821c42f44bdSBing Zhao /** Device flow structure. */
8229ade91dfSJiawei Wang __extension__
823c42f44bdSBing Zhao struct mlx5_flow {
824c42f44bdSBing Zhao 	struct rte_flow *flow; /**< Pointer to the main flow. */
825fa2d01c8SDong Zhou 	uint32_t flow_idx; /**< The memory pool index to the main flow. */
8266ad7cfaaSDekel Peled 	uint64_t hash_fields; /**< Hash Rx queue hash fields. */
827488d13abSSuanming Mou 	uint64_t act_flags;
828488d13abSSuanming Mou 	/**< Bit-fields of detected actions, see MLX5_FLOW_ACTION_*. */
829b67b4ecbSDekel Peled 	bool external; /**< true if the flow is created external to PMD. */
8309ade91dfSJiawei Wang 	uint8_t ingress:1; /**< 1 if the flow is ingress. */
831ae2927cdSJiawei Wang 	uint8_t skip_scale:2;
832ae2927cdSJiawei Wang 	/**
833ae2927cdSJiawei Wang 	 * Each Bit be set to 1 if Skip the scale the flow group with factor.
834ae2927cdSJiawei Wang 	 * If bit0 be set to 1, then skip the scale the original flow group;
835ae2927cdSJiawei Wang 	 * If bit1 be set to 1, then skip the scale the jump flow group if
836ae2927cdSJiawei Wang 	 * having jump action.
837ae2927cdSJiawei Wang 	 * 00: Enable scale in a flow, default value.
838ae2927cdSJiawei Wang 	 * 01: Skip scale the flow group with factor, enable scale the group
839ae2927cdSJiawei Wang 	 * of jump action.
840ae2927cdSJiawei Wang 	 * 10: Enable scale the group with factor, skip scale the group of
841ae2927cdSJiawei Wang 	 * jump action.
842ae2927cdSJiawei Wang 	 * 11: Skip scale the table with factor both for flow group and jump
843ae2927cdSJiawei Wang 	 * group.
844ae2927cdSJiawei Wang 	 */
845c42f44bdSBing Zhao 	union {
846f1ae0b35SOphir Munk #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H)
847e7bfa359SBing Zhao 		struct mlx5_flow_dv_workspace dv;
848c42f44bdSBing Zhao #endif
849f1ae0b35SOphir Munk #ifdef HAVE_INFINIBAND_VERBS_H
850e7bfa359SBing Zhao 		struct mlx5_flow_verbs_workspace verbs;
851f1ae0b35SOphir Munk #endif
852c42f44bdSBing Zhao 	};
853e7bfa359SBing Zhao 	struct mlx5_flow_handle *handle;
854b88341caSSuanming Mou 	uint32_t handle_idx; /* Index of the mlx5 flow handle memory. */
8554ec6360dSGregory Etelson 	const struct mlx5_flow_tunnel *tunnel;
8568c5a231bSGregory Etelson 	enum mlx5_tof_rule_type tof_type;
85784c406e7SOri Kam };
85884c406e7SOri Kam 
85933e01809SSuanming Mou /* Flow meter state. */
86033e01809SSuanming Mou #define MLX5_FLOW_METER_DISABLE 0
86133e01809SSuanming Mou #define MLX5_FLOW_METER_ENABLE 1
86233e01809SSuanming Mou 
86329efa63aSLi Zhang #define MLX5_ASO_WQE_CQE_RESPONSE_DELAY 10u
86429efa63aSLi Zhang #define MLX5_MTR_POLL_WQE_CQE_TIMES 100000u
865e6100c7bSLi Zhang 
866ebaf1b31SBing Zhao #define MLX5_CT_POLL_WQE_CQE_TIMES MLX5_MTR_POLL_WQE_CQE_TIMES
867ebaf1b31SBing Zhao 
8683bd26b23SSuanming Mou #define MLX5_MAN_WIDTH 8
869e6100c7bSLi Zhang /* Legacy Meter parameter structure. */
870e6100c7bSLi Zhang struct mlx5_legacy_flow_meter {
871e6100c7bSLi Zhang 	struct mlx5_flow_meter_info fm;
872e6100c7bSLi Zhang 	/* Must be the first in struct. */
873e6100c7bSLi Zhang 	TAILQ_ENTRY(mlx5_legacy_flow_meter) next;
8743f373f35SSuanming Mou 	/**< Pointer to the next flow meter structure. */
87544432018SLi Zhang 	uint32_t idx;
87644432018SLi Zhang 	/* Index to meter object. */
8773bd26b23SSuanming Mou };
8783bd26b23SSuanming Mou 
8794ec6360dSGregory Etelson #define MLX5_MAX_TUNNELS 256
8804ec6360dSGregory Etelson #define MLX5_TNL_MISS_RULE_PRIORITY 3
8814ec6360dSGregory Etelson #define MLX5_TNL_MISS_FDB_JUMP_GRP  0x1234faac
8824ec6360dSGregory Etelson 
8834ec6360dSGregory Etelson /*
8844ec6360dSGregory Etelson  * When tunnel offload is active, all JUMP group ids are converted
8854ec6360dSGregory Etelson  * using the same method. That conversion is applied both to tunnel and
8864ec6360dSGregory Etelson  * regular rule types.
8874ec6360dSGregory Etelson  * Group ids used in tunnel rules are relative to it's tunnel (!).
8884ec6360dSGregory Etelson  * Application can create number of steer rules, using the same
8894ec6360dSGregory Etelson  * tunnel, with different group id in each rule.
8904ec6360dSGregory Etelson  * Each tunnel stores its groups internally in PMD tunnel object.
8914ec6360dSGregory Etelson  * Groups used in regular rules do not belong to any tunnel and are stored
8924ec6360dSGregory Etelson  * in tunnel hub.
8934ec6360dSGregory Etelson  */
8944ec6360dSGregory Etelson 
8954ec6360dSGregory Etelson struct mlx5_flow_tunnel {
8964ec6360dSGregory Etelson 	LIST_ENTRY(mlx5_flow_tunnel) chain;
8974ec6360dSGregory Etelson 	struct rte_flow_tunnel app_tunnel;	/** app tunnel copy */
8984ec6360dSGregory Etelson 	uint32_t tunnel_id;			/** unique tunnel ID */
8994ec6360dSGregory Etelson 	uint32_t refctn;
9004ec6360dSGregory Etelson 	struct rte_flow_action action;
9014ec6360dSGregory Etelson 	struct rte_flow_item item;
9024ec6360dSGregory Etelson 	struct mlx5_hlist *groups;		/** tunnel groups */
9034ec6360dSGregory Etelson };
9044ec6360dSGregory Etelson 
9054ec6360dSGregory Etelson /** PMD tunnel related context */
9064ec6360dSGregory Etelson struct mlx5_flow_tunnel_hub {
907868d2e34SGregory Etelson 	/* Tunnels list
908868d2e34SGregory Etelson 	 * Access to the list MUST be MT protected
909868d2e34SGregory Etelson 	 */
9104ec6360dSGregory Etelson 	LIST_HEAD(, mlx5_flow_tunnel) tunnels;
911868d2e34SGregory Etelson 	 /* protect access to the tunnels list */
912868d2e34SGregory Etelson 	rte_spinlock_t sl;
9134ec6360dSGregory Etelson 	struct mlx5_hlist *groups;		/** non tunnel groups */
9144ec6360dSGregory Etelson };
9154ec6360dSGregory Etelson 
9164ec6360dSGregory Etelson /* convert jump group to flow table ID in tunnel rules */
9174ec6360dSGregory Etelson struct tunnel_tbl_entry {
918961b6774SMatan Azrad 	struct mlx5_list_entry hash;
9194ec6360dSGregory Etelson 	uint32_t flow_table;
920f5b0aed2SSuanming Mou 	uint32_t tunnel_id;
921f5b0aed2SSuanming Mou 	uint32_t group;
9224ec6360dSGregory Etelson };
9234ec6360dSGregory Etelson 
9244ec6360dSGregory Etelson static inline uint32_t
9254ec6360dSGregory Etelson tunnel_id_to_flow_tbl(uint32_t id)
9264ec6360dSGregory Etelson {
9274ec6360dSGregory Etelson 	return id | (1u << 16);
9284ec6360dSGregory Etelson }
9294ec6360dSGregory Etelson 
9304ec6360dSGregory Etelson static inline uint32_t
9314ec6360dSGregory Etelson tunnel_flow_tbl_to_id(uint32_t flow_tbl)
9324ec6360dSGregory Etelson {
9334ec6360dSGregory Etelson 	return flow_tbl & ~(1u << 16);
9344ec6360dSGregory Etelson }
9354ec6360dSGregory Etelson 
9364ec6360dSGregory Etelson union tunnel_tbl_key {
9374ec6360dSGregory Etelson 	uint64_t val;
9384ec6360dSGregory Etelson 	struct {
9394ec6360dSGregory Etelson 		uint32_t tunnel_id;
9404ec6360dSGregory Etelson 		uint32_t group;
9414ec6360dSGregory Etelson 	};
9424ec6360dSGregory Etelson };
9434ec6360dSGregory Etelson 
9444ec6360dSGregory Etelson static inline struct mlx5_flow_tunnel_hub *
9454ec6360dSGregory Etelson mlx5_tunnel_hub(struct rte_eth_dev *dev)
9464ec6360dSGregory Etelson {
9474ec6360dSGregory Etelson 	struct mlx5_priv *priv = dev->data->dev_private;
9484ec6360dSGregory Etelson 	return priv->sh->tunnel_hub;
9494ec6360dSGregory Etelson }
9504ec6360dSGregory Etelson 
9514ec6360dSGregory Etelson static inline bool
9528c5a231bSGregory Etelson is_tunnel_offload_active(const struct rte_eth_dev *dev)
9534ec6360dSGregory Etelson {
954bc1d90a3SGregory Etelson #ifdef HAVE_IBV_FLOW_DV_SUPPORT
9558c5a231bSGregory Etelson 	const struct mlx5_priv *priv = dev->data->dev_private;
9564ec6360dSGregory Etelson 	return !!priv->config.dv_miss_info;
957bc1d90a3SGregory Etelson #else
958bc1d90a3SGregory Etelson 	RTE_SET_USED(dev);
959bc1d90a3SGregory Etelson 	return false;
960bc1d90a3SGregory Etelson #endif
9614ec6360dSGregory Etelson }
9624ec6360dSGregory Etelson 
9634ec6360dSGregory Etelson static inline bool
9648c5a231bSGregory Etelson is_flow_tunnel_match_rule(enum mlx5_tof_rule_type tof_rule_type)
9654ec6360dSGregory Etelson {
9668c5a231bSGregory Etelson 	return tof_rule_type == MLX5_TUNNEL_OFFLOAD_MATCH_RULE;
9674ec6360dSGregory Etelson }
9684ec6360dSGregory Etelson 
9694ec6360dSGregory Etelson static inline bool
9708c5a231bSGregory Etelson is_flow_tunnel_steer_rule(enum mlx5_tof_rule_type tof_rule_type)
9714ec6360dSGregory Etelson {
9728c5a231bSGregory Etelson 	return tof_rule_type == MLX5_TUNNEL_OFFLOAD_SET_RULE;
9734ec6360dSGregory Etelson }
9744ec6360dSGregory Etelson 
9754ec6360dSGregory Etelson static inline const struct mlx5_flow_tunnel *
9764ec6360dSGregory Etelson flow_actions_to_tunnel(const struct rte_flow_action actions[])
9774ec6360dSGregory Etelson {
9784ec6360dSGregory Etelson 	return actions[0].conf;
9794ec6360dSGregory Etelson }
9804ec6360dSGregory Etelson 
9814ec6360dSGregory Etelson static inline const struct mlx5_flow_tunnel *
9824ec6360dSGregory Etelson flow_items_to_tunnel(const struct rte_flow_item items[])
9834ec6360dSGregory Etelson {
9844ec6360dSGregory Etelson 	return items[0].spec;
9854ec6360dSGregory Etelson }
9864ec6360dSGregory Etelson 
98784c406e7SOri Kam /* Flow structure. */
98884c406e7SOri Kam struct rte_flow {
989b88341caSSuanming Mou 	uint32_t dev_handles;
990e7bfa359SBing Zhao 	/**< Device flow handles that are part of the flow. */
991b4edeaf3SSuanming Mou 	uint32_t type:2;
9920136df99SSuanming Mou 	uint32_t drv_type:2; /**< Driver type. */
9934ec6360dSGregory Etelson 	uint32_t tunnel:1;
994e6100c7bSLi Zhang 	uint32_t meter:24; /**< Holds flow meter id. */
9952d084f69SBing Zhao 	uint32_t indirect_type:2; /**< Indirect action type. */
9960136df99SSuanming Mou 	uint32_t rix_mreg_copy;
9970136df99SSuanming Mou 	/**< Index to metadata register copy table resource. */
9980136df99SSuanming Mou 	uint32_t counter; /**< Holds flow counter. */
9994ec6360dSGregory Etelson 	uint32_t tunnel_id;  /**< Tunnel id */
10002d084f69SBing Zhao 	union {
1001f935ed4bSDekel Peled 		uint32_t age; /**< Holds ASO age bit index. */
10022d084f69SBing Zhao 		uint32_t ct; /**< Holds ASO CT index. */
10032d084f69SBing Zhao 	};
1004f15f0c38SShiri Kuzin 	uint32_t geneve_tlv_option; /**< Holds Geneve TLV option id. > */
10050136df99SSuanming Mou } __rte_packed;
10062720f833SYongseok Koh 
1007d7cfcdddSAndrey Vesnovaty /*
1008d7cfcdddSAndrey Vesnovaty  * Define list of valid combinations of RX Hash fields
1009d7cfcdddSAndrey Vesnovaty  * (see enum ibv_rx_hash_fields).
1010d7cfcdddSAndrey Vesnovaty  */
1011d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV4 (IBV_RX_HASH_SRC_IPV4 | IBV_RX_HASH_DST_IPV4)
1012d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV4_TCP \
1013d7cfcdddSAndrey Vesnovaty 	(MLX5_RSS_HASH_IPV4 | \
1014c83456cdSDekel Peled 	 IBV_RX_HASH_SRC_PORT_TCP | IBV_RX_HASH_DST_PORT_TCP)
1015d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV4_UDP \
1016d7cfcdddSAndrey Vesnovaty 	(MLX5_RSS_HASH_IPV4 | \
1017c83456cdSDekel Peled 	 IBV_RX_HASH_SRC_PORT_UDP | IBV_RX_HASH_DST_PORT_UDP)
1018d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV6 (IBV_RX_HASH_SRC_IPV6 | IBV_RX_HASH_DST_IPV6)
1019d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV6_TCP \
1020d7cfcdddSAndrey Vesnovaty 	(MLX5_RSS_HASH_IPV6 | \
1021c83456cdSDekel Peled 	 IBV_RX_HASH_SRC_PORT_TCP | IBV_RX_HASH_DST_PORT_TCP)
1022d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_IPV6_UDP \
1023d7cfcdddSAndrey Vesnovaty 	(MLX5_RSS_HASH_IPV6 | \
1024c83456cdSDekel Peled 	 IBV_RX_HASH_SRC_PORT_UDP | IBV_RX_HASH_DST_PORT_UDP)
1025212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_SRC_ONLY IBV_RX_HASH_SRC_IPV4
1026212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_DST_ONLY IBV_RX_HASH_DST_IPV4
1027212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_SRC_ONLY IBV_RX_HASH_SRC_IPV6
1028212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_DST_ONLY IBV_RX_HASH_DST_IPV6
1029212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_UDP_SRC_ONLY \
1030212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV4 | IBV_RX_HASH_SRC_PORT_UDP)
1031212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_UDP_DST_ONLY \
1032212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV4 | IBV_RX_HASH_DST_PORT_UDP)
1033212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_UDP_SRC_ONLY \
1034212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV6 | IBV_RX_HASH_SRC_PORT_UDP)
1035212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_UDP_DST_ONLY \
1036212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV6 | IBV_RX_HASH_DST_PORT_UDP)
1037212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_TCP_SRC_ONLY \
1038212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV4 | IBV_RX_HASH_SRC_PORT_TCP)
1039212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV4_TCP_DST_ONLY \
1040212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV4 | IBV_RX_HASH_DST_PORT_TCP)
1041212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_TCP_SRC_ONLY \
1042212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV6 | IBV_RX_HASH_SRC_PORT_TCP)
1043212d17b6SXiaoyu Min #define MLX5_RSS_HASH_IPV6_TCP_DST_ONLY \
1044212d17b6SXiaoyu Min 	(MLX5_RSS_HASH_IPV6 | IBV_RX_HASH_DST_PORT_TCP)
1045d7cfcdddSAndrey Vesnovaty #define MLX5_RSS_HASH_NONE 0ULL
1046d7cfcdddSAndrey Vesnovaty 
104779f89527SGregory Etelson 
104879f89527SGregory Etelson /* extract next protocol type from Ethernet & VLAN headers */
104979f89527SGregory Etelson #define MLX5_ETHER_TYPE_FROM_HEADER(_s, _m, _itm, _prt) do { \
105079f89527SGregory Etelson 	(_prt) = ((const struct _s *)(_itm)->mask)->_m;       \
105179f89527SGregory Etelson 	(_prt) &= ((const struct _s *)(_itm)->spec)->_m;      \
105279f89527SGregory Etelson 	(_prt) = rte_be_to_cpu_16((_prt));                    \
105379f89527SGregory Etelson } while (0)
105479f89527SGregory Etelson 
1055d7cfcdddSAndrey Vesnovaty /* array of valid combinations of RX Hash fields for RSS */
1056d7cfcdddSAndrey Vesnovaty static const uint64_t mlx5_rss_hash_fields[] = {
1057d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_IPV4,
1058d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_IPV4_TCP,
1059d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_IPV4_UDP,
1060d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_IPV6,
1061d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_IPV6_TCP,
1062d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_IPV6_UDP,
1063d7cfcdddSAndrey Vesnovaty 	MLX5_RSS_HASH_NONE,
1064d7cfcdddSAndrey Vesnovaty };
1065d7cfcdddSAndrey Vesnovaty 
1066d7cfcdddSAndrey Vesnovaty /* Shared RSS action structure */
1067d7cfcdddSAndrey Vesnovaty struct mlx5_shared_action_rss {
10684a42ac1fSMatan Azrad 	ILIST_ENTRY(uint32_t)next; /**< Index to the next RSS structure. */
10694a42ac1fSMatan Azrad 	uint32_t refcnt; /**< Atomically accessed refcnt. */
1070d7cfcdddSAndrey Vesnovaty 	struct rte_flow_action_rss origin; /**< Original rte RSS action. */
1071d7cfcdddSAndrey Vesnovaty 	uint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */
1072fa7ad49eSAndrey Vesnovaty 	struct mlx5_ind_table_obj *ind_tbl;
1073fa7ad49eSAndrey Vesnovaty 	/**< Hash RX queues (hrxq, hrxq_tunnel fields) indirection table. */
1074d7cfcdddSAndrey Vesnovaty 	uint32_t hrxq[MLX5_RSS_HASH_FIELDS_LEN];
1075d7cfcdddSAndrey Vesnovaty 	/**< Hash RX queue indexes mapped to mlx5_rss_hash_fields */
1076fa7ad49eSAndrey Vesnovaty 	rte_spinlock_t action_rss_sl; /**< Shared RSS action spinlock. */
1077d7cfcdddSAndrey Vesnovaty };
1078d7cfcdddSAndrey Vesnovaty 
10794b61b877SBing Zhao struct rte_flow_action_handle {
10804a42ac1fSMatan Azrad 	uint32_t id;
1081d7cfcdddSAndrey Vesnovaty };
1082d7cfcdddSAndrey Vesnovaty 
10838bb81f26SXueming Li /* Thread specific flow workspace intermediate data. */
10848bb81f26SXueming Li struct mlx5_flow_workspace {
10850064bf43SXueming Li 	/* If creating another flow in same thread, push new as stack. */
10860064bf43SXueming Li 	struct mlx5_flow_workspace *prev;
10870064bf43SXueming Li 	struct mlx5_flow_workspace *next;
10880064bf43SXueming Li 	uint32_t inuse; /* can't create new flow with current. */
10898bb81f26SXueming Li 	struct mlx5_flow flows[MLX5_NUM_MAX_DEV_FLOWS];
10900064bf43SXueming Li 	struct mlx5_flow_rss_desc rss_desc;
10910064bf43SXueming Li 	uint32_t rssq_num; /* Allocated queue num in rss_desc. */
109238c6dc20SXueming Li 	uint32_t flow_idx; /* Intermediate device flow index. */
1093e6100c7bSLi Zhang 	struct mlx5_flow_meter_info *fm; /* Pointer to the meter in flow. */
109450cc92ddSShun Hao 	struct mlx5_flow_meter_policy *policy;
109550cc92ddSShun Hao 	/* The meter policy used by meter in flow. */
109650cc92ddSShun Hao 	struct mlx5_flow_meter_policy *final_policy;
109750cc92ddSShun Hao 	/* The final policy when meter policy is hierarchy. */
109851ec04dcSShun Hao 	uint32_t skip_matcher_reg:1;
109951ec04dcSShun Hao 	/* Indicates if need to skip matcher register in translate. */
11008bb81f26SXueming Li };
11018bb81f26SXueming Li 
11029ade91dfSJiawei Wang struct mlx5_flow_split_info {
11039ade91dfSJiawei Wang 	bool external;
11049ade91dfSJiawei Wang 	/**< True if flow is created by request external to PMD. */
11059ade91dfSJiawei Wang 	uint8_t skip_scale; /**< Skip the scale the table with factor. */
11069ade91dfSJiawei Wang 	uint32_t flow_idx; /**< This memory pool index to the flow. */
11079ade91dfSJiawei Wang 	uint32_t prefix_mark; /**< Prefix subflow mark flag. */
11089ade91dfSJiawei Wang 	uint64_t prefix_layers; /**< Prefix subflow layers. */
11092d2cef5dSLi Zhang 	uint32_t table_id; /**< Flow table identifier. */
11109ade91dfSJiawei Wang };
11119ade91dfSJiawei Wang 
111284c406e7SOri Kam typedef int (*mlx5_flow_validate_t)(struct rte_eth_dev *dev,
111384c406e7SOri Kam 				    const struct rte_flow_attr *attr,
111484c406e7SOri Kam 				    const struct rte_flow_item items[],
111584c406e7SOri Kam 				    const struct rte_flow_action actions[],
1116b67b4ecbSDekel Peled 				    bool external,
111772a944dbSBing Zhao 				    int hairpin,
111884c406e7SOri Kam 				    struct rte_flow_error *error);
111984c406e7SOri Kam typedef struct mlx5_flow *(*mlx5_flow_prepare_t)
1120e7bfa359SBing Zhao 	(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
1121e7bfa359SBing Zhao 	 const struct rte_flow_item items[],
1122c1cfb132SYongseok Koh 	 const struct rte_flow_action actions[], struct rte_flow_error *error);
112384c406e7SOri Kam typedef int (*mlx5_flow_translate_t)(struct rte_eth_dev *dev,
112484c406e7SOri Kam 				     struct mlx5_flow *dev_flow,
112584c406e7SOri Kam 				     const struct rte_flow_attr *attr,
112684c406e7SOri Kam 				     const struct rte_flow_item items[],
112784c406e7SOri Kam 				     const struct rte_flow_action actions[],
112884c406e7SOri Kam 				     struct rte_flow_error *error);
112984c406e7SOri Kam typedef int (*mlx5_flow_apply_t)(struct rte_eth_dev *dev, struct rte_flow *flow,
113084c406e7SOri Kam 				 struct rte_flow_error *error);
113184c406e7SOri Kam typedef void (*mlx5_flow_remove_t)(struct rte_eth_dev *dev,
113284c406e7SOri Kam 				   struct rte_flow *flow);
113384c406e7SOri Kam typedef void (*mlx5_flow_destroy_t)(struct rte_eth_dev *dev,
113484c406e7SOri Kam 				    struct rte_flow *flow);
1135684dafe7SMoti Haimovsky typedef int (*mlx5_flow_query_t)(struct rte_eth_dev *dev,
1136684dafe7SMoti Haimovsky 				 struct rte_flow *flow,
1137684dafe7SMoti Haimovsky 				 const struct rte_flow_action *actions,
1138684dafe7SMoti Haimovsky 				 void *data,
1139684dafe7SMoti Haimovsky 				 struct rte_flow_error *error);
114044432018SLi Zhang typedef int (*mlx5_flow_create_mtr_tbls_t)(struct rte_eth_dev *dev,
114144432018SLi Zhang 					struct mlx5_flow_meter_info *fm,
114244432018SLi Zhang 					uint32_t mtr_idx,
114344432018SLi Zhang 					uint8_t domain_bitmap);
114444432018SLi Zhang typedef void (*mlx5_flow_destroy_mtr_tbls_t)(struct rte_eth_dev *dev,
114544432018SLi Zhang 				struct mlx5_flow_meter_info *fm);
1146afb4aa4fSLi Zhang typedef void (*mlx5_flow_destroy_mtr_drop_tbls_t)(struct rte_eth_dev *dev);
1147fc6ce56bSLi Zhang typedef struct mlx5_flow_meter_sub_policy *
1148fc6ce56bSLi Zhang 	(*mlx5_flow_meter_sub_policy_rss_prepare_t)
1149fc6ce56bSLi Zhang 		(struct rte_eth_dev *dev,
1150fc6ce56bSLi Zhang 		struct mlx5_flow_meter_policy *mtr_policy,
1151fc6ce56bSLi Zhang 		struct mlx5_flow_rss_desc *rss_desc[MLX5_MTR_RTE_COLORS]);
11528e5c9feaSShun Hao typedef int (*mlx5_flow_meter_hierarchy_rule_create_t)
11538e5c9feaSShun Hao 		(struct rte_eth_dev *dev,
11548e5c9feaSShun Hao 		struct mlx5_flow_meter_info *fm,
11558e5c9feaSShun Hao 		int32_t src_port,
11568e5c9feaSShun Hao 		const struct rte_flow_item *item,
11578e5c9feaSShun Hao 		struct rte_flow_error *error);
1158ec962badSLi Zhang typedef void (*mlx5_flow_destroy_sub_policy_with_rxq_t)
1159ec962badSLi Zhang 	(struct rte_eth_dev *dev,
1160ec962badSLi Zhang 	struct mlx5_flow_meter_policy *mtr_policy);
1161e6100c7bSLi Zhang typedef uint32_t (*mlx5_flow_mtr_alloc_t)
1162e6100c7bSLi Zhang 					    (struct rte_eth_dev *dev);
1163e6100c7bSLi Zhang typedef void (*mlx5_flow_mtr_free_t)(struct rte_eth_dev *dev,
1164e6100c7bSLi Zhang 						uint32_t mtr_idx);
1165956d5c74SSuanming Mou typedef uint32_t (*mlx5_flow_counter_alloc_t)
1166e189f55cSSuanming Mou 				   (struct rte_eth_dev *dev);
1167e189f55cSSuanming Mou typedef void (*mlx5_flow_counter_free_t)(struct rte_eth_dev *dev,
1168956d5c74SSuanming Mou 					 uint32_t cnt);
1169e189f55cSSuanming Mou typedef int (*mlx5_flow_counter_query_t)(struct rte_eth_dev *dev,
1170956d5c74SSuanming Mou 					 uint32_t cnt,
1171e189f55cSSuanming Mou 					 bool clear, uint64_t *pkts,
1172e189f55cSSuanming Mou 					 uint64_t *bytes);
1173fa2d01c8SDong Zhou typedef int (*mlx5_flow_get_aged_flows_t)
1174fa2d01c8SDong Zhou 					(struct rte_eth_dev *dev,
1175fa2d01c8SDong Zhou 					 void **context,
1176fa2d01c8SDong Zhou 					 uint32_t nb_contexts,
1177fa2d01c8SDong Zhou 					 struct rte_flow_error *error);
1178d7cfcdddSAndrey Vesnovaty typedef int (*mlx5_flow_action_validate_t)
1179d7cfcdddSAndrey Vesnovaty 				(struct rte_eth_dev *dev,
11804b61b877SBing Zhao 				 const struct rte_flow_indir_action_conf *conf,
1181d7cfcdddSAndrey Vesnovaty 				 const struct rte_flow_action *action,
1182d7cfcdddSAndrey Vesnovaty 				 struct rte_flow_error *error);
11834b61b877SBing Zhao typedef struct rte_flow_action_handle *(*mlx5_flow_action_create_t)
1184d7cfcdddSAndrey Vesnovaty 				(struct rte_eth_dev *dev,
11854b61b877SBing Zhao 				 const struct rte_flow_indir_action_conf *conf,
1186d7cfcdddSAndrey Vesnovaty 				 const struct rte_flow_action *action,
1187d7cfcdddSAndrey Vesnovaty 				 struct rte_flow_error *error);
1188d7cfcdddSAndrey Vesnovaty typedef int (*mlx5_flow_action_destroy_t)
1189d7cfcdddSAndrey Vesnovaty 				(struct rte_eth_dev *dev,
11904b61b877SBing Zhao 				 struct rte_flow_action_handle *action,
1191d7cfcdddSAndrey Vesnovaty 				 struct rte_flow_error *error);
1192d7cfcdddSAndrey Vesnovaty typedef int (*mlx5_flow_action_update_t)
1193d7cfcdddSAndrey Vesnovaty 			(struct rte_eth_dev *dev,
11944b61b877SBing Zhao 			 struct rte_flow_action_handle *action,
11954b61b877SBing Zhao 			 const void *update,
1196d7cfcdddSAndrey Vesnovaty 			 struct rte_flow_error *error);
119781073e1fSMatan Azrad typedef int (*mlx5_flow_action_query_t)
119881073e1fSMatan Azrad 			(struct rte_eth_dev *dev,
11994b61b877SBing Zhao 			 const struct rte_flow_action_handle *action,
120081073e1fSMatan Azrad 			 void *data,
120181073e1fSMatan Azrad 			 struct rte_flow_error *error);
120223f627e0SBing Zhao typedef int (*mlx5_flow_sync_domain_t)
120323f627e0SBing Zhao 			(struct rte_eth_dev *dev,
120423f627e0SBing Zhao 			 uint32_t domains,
120523f627e0SBing Zhao 			 uint32_t flags);
1206afb4aa4fSLi Zhang typedef int (*mlx5_flow_validate_mtr_acts_t)
1207afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev,
1208afb4aa4fSLi Zhang 			 const struct rte_flow_action *actions[RTE_COLORS],
1209afb4aa4fSLi Zhang 			 struct rte_flow_attr *attr,
1210afb4aa4fSLi Zhang 			 bool *is_rss,
1211afb4aa4fSLi Zhang 			 uint8_t *domain_bitmap,
12124b7bf3ffSBing Zhao 			 uint8_t *policy_mode,
1213afb4aa4fSLi Zhang 			 struct rte_mtr_error *error);
1214afb4aa4fSLi Zhang typedef int (*mlx5_flow_create_mtr_acts_t)
1215afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev,
1216afb4aa4fSLi Zhang 		      struct mlx5_flow_meter_policy *mtr_policy,
1217afb4aa4fSLi Zhang 		      const struct rte_flow_action *actions[RTE_COLORS],
1218afb4aa4fSLi Zhang 		      struct rte_mtr_error *error);
1219afb4aa4fSLi Zhang typedef void (*mlx5_flow_destroy_mtr_acts_t)
1220afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev,
1221afb4aa4fSLi Zhang 		      struct mlx5_flow_meter_policy *mtr_policy);
1222afb4aa4fSLi Zhang typedef int (*mlx5_flow_create_policy_rules_t)
1223afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev,
1224afb4aa4fSLi Zhang 			  struct mlx5_flow_meter_policy *mtr_policy);
1225afb4aa4fSLi Zhang typedef void (*mlx5_flow_destroy_policy_rules_t)
1226afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev,
1227afb4aa4fSLi Zhang 			  struct mlx5_flow_meter_policy *mtr_policy);
1228afb4aa4fSLi Zhang typedef int (*mlx5_flow_create_def_policy_t)
1229afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev);
1230afb4aa4fSLi Zhang typedef void (*mlx5_flow_destroy_def_policy_t)
1231afb4aa4fSLi Zhang 			(struct rte_eth_dev *dev);
123281073e1fSMatan Azrad 
123384c406e7SOri Kam struct mlx5_flow_driver_ops {
123484c406e7SOri Kam 	mlx5_flow_validate_t validate;
123584c406e7SOri Kam 	mlx5_flow_prepare_t prepare;
123684c406e7SOri Kam 	mlx5_flow_translate_t translate;
123784c406e7SOri Kam 	mlx5_flow_apply_t apply;
123884c406e7SOri Kam 	mlx5_flow_remove_t remove;
123984c406e7SOri Kam 	mlx5_flow_destroy_t destroy;
1240684dafe7SMoti Haimovsky 	mlx5_flow_query_t query;
124146a5e6bcSSuanming Mou 	mlx5_flow_create_mtr_tbls_t create_mtr_tbls;
124246a5e6bcSSuanming Mou 	mlx5_flow_destroy_mtr_tbls_t destroy_mtr_tbls;
1243afb4aa4fSLi Zhang 	mlx5_flow_destroy_mtr_drop_tbls_t destroy_mtr_drop_tbls;
1244e6100c7bSLi Zhang 	mlx5_flow_mtr_alloc_t create_meter;
1245e6100c7bSLi Zhang 	mlx5_flow_mtr_free_t free_meter;
1246afb4aa4fSLi Zhang 	mlx5_flow_validate_mtr_acts_t validate_mtr_acts;
1247afb4aa4fSLi Zhang 	mlx5_flow_create_mtr_acts_t create_mtr_acts;
1248afb4aa4fSLi Zhang 	mlx5_flow_destroy_mtr_acts_t destroy_mtr_acts;
1249afb4aa4fSLi Zhang 	mlx5_flow_create_policy_rules_t create_policy_rules;
1250afb4aa4fSLi Zhang 	mlx5_flow_destroy_policy_rules_t destroy_policy_rules;
1251afb4aa4fSLi Zhang 	mlx5_flow_create_def_policy_t create_def_policy;
1252afb4aa4fSLi Zhang 	mlx5_flow_destroy_def_policy_t destroy_def_policy;
1253fc6ce56bSLi Zhang 	mlx5_flow_meter_sub_policy_rss_prepare_t meter_sub_policy_rss_prepare;
12548e5c9feaSShun Hao 	mlx5_flow_meter_hierarchy_rule_create_t meter_hierarchy_rule_create;
1255ec962badSLi Zhang 	mlx5_flow_destroy_sub_policy_with_rxq_t destroy_sub_policy_with_rxq;
1256e189f55cSSuanming Mou 	mlx5_flow_counter_alloc_t counter_alloc;
1257e189f55cSSuanming Mou 	mlx5_flow_counter_free_t counter_free;
1258e189f55cSSuanming Mou 	mlx5_flow_counter_query_t counter_query;
1259fa2d01c8SDong Zhou 	mlx5_flow_get_aged_flows_t get_aged_flows;
1260d7cfcdddSAndrey Vesnovaty 	mlx5_flow_action_validate_t action_validate;
1261d7cfcdddSAndrey Vesnovaty 	mlx5_flow_action_create_t action_create;
1262d7cfcdddSAndrey Vesnovaty 	mlx5_flow_action_destroy_t action_destroy;
1263d7cfcdddSAndrey Vesnovaty 	mlx5_flow_action_update_t action_update;
126481073e1fSMatan Azrad 	mlx5_flow_action_query_t action_query;
126523f627e0SBing Zhao 	mlx5_flow_sync_domain_t sync_domain;
126684c406e7SOri Kam };
126784c406e7SOri Kam 
126884c406e7SOri Kam /* mlx5_flow.c */
126984c406e7SOri Kam 
12708bb81f26SXueming Li struct mlx5_flow_workspace *mlx5_flow_get_thread_workspace(void);
12714ec6360dSGregory Etelson __extension__
12724ec6360dSGregory Etelson struct flow_grp_info {
12734ec6360dSGregory Etelson 	uint64_t external:1;
12744ec6360dSGregory Etelson 	uint64_t transfer:1;
12754ec6360dSGregory Etelson 	uint64_t fdb_def_rule:1;
12764ec6360dSGregory Etelson 	/* force standard group translation */
12774ec6360dSGregory Etelson 	uint64_t std_tbl_fix:1;
1278ae2927cdSJiawei Wang 	uint64_t skip_scale:2;
12794ec6360dSGregory Etelson };
12804ec6360dSGregory Etelson 
12814ec6360dSGregory Etelson static inline bool
12824ec6360dSGregory Etelson tunnel_use_standard_attr_group_translate
12838c5a231bSGregory Etelson 		    (const struct rte_eth_dev *dev,
12844ec6360dSGregory Etelson 		     const struct rte_flow_attr *attr,
12858c5a231bSGregory Etelson 		     const struct mlx5_flow_tunnel *tunnel,
12868c5a231bSGregory Etelson 		     enum mlx5_tof_rule_type tof_rule_type)
12874ec6360dSGregory Etelson {
12884ec6360dSGregory Etelson 	bool verdict;
12894ec6360dSGregory Etelson 
12904ec6360dSGregory Etelson 	if (!is_tunnel_offload_active(dev))
12914ec6360dSGregory Etelson 		/* no tunnel offload API */
12924ec6360dSGregory Etelson 		verdict = true;
12934ec6360dSGregory Etelson 	else if (tunnel) {
12944ec6360dSGregory Etelson 		/*
12954ec6360dSGregory Etelson 		 * OvS will use jump to group 0 in tunnel steer rule.
12964ec6360dSGregory Etelson 		 * If tunnel steer rule starts from group 0 (attr.group == 0)
12974ec6360dSGregory Etelson 		 * that 0 group must be translated with standard method.
12984ec6360dSGregory Etelson 		 * attr.group == 0 in tunnel match rule translated with tunnel
12994ec6360dSGregory Etelson 		 * method
13004ec6360dSGregory Etelson 		 */
13014ec6360dSGregory Etelson 		verdict = !attr->group &&
13028c5a231bSGregory Etelson 			  is_flow_tunnel_steer_rule(tof_rule_type);
13034ec6360dSGregory Etelson 	} else {
13044ec6360dSGregory Etelson 		/*
13054ec6360dSGregory Etelson 		 * non-tunnel group translation uses standard method for
13064ec6360dSGregory Etelson 		 * root group only: attr.group == 0
13074ec6360dSGregory Etelson 		 */
13084ec6360dSGregory Etelson 		verdict = !attr->group;
13094ec6360dSGregory Etelson 	}
13104ec6360dSGregory Etelson 
13114ec6360dSGregory Etelson 	return verdict;
13124ec6360dSGregory Etelson }
13134ec6360dSGregory Etelson 
1314e6100c7bSLi Zhang /**
1315e6100c7bSLi Zhang  * Get DV flow aso meter by index.
1316e6100c7bSLi Zhang  *
1317e6100c7bSLi Zhang  * @param[in] dev
1318e6100c7bSLi Zhang  *   Pointer to the Ethernet device structure.
1319e6100c7bSLi Zhang  * @param[in] idx
1320e6100c7bSLi Zhang  *   mlx5 flow aso meter index in the container.
1321e6100c7bSLi Zhang  * @param[out] ppool
1322e6100c7bSLi Zhang  *   mlx5 flow aso meter pool in the container,
1323e6100c7bSLi Zhang  *
1324e6100c7bSLi Zhang  * @return
1325e6100c7bSLi Zhang  *   Pointer to the aso meter, NULL otherwise.
1326e6100c7bSLi Zhang  */
1327e6100c7bSLi Zhang static inline struct mlx5_aso_mtr *
1328e6100c7bSLi Zhang mlx5_aso_meter_by_idx(struct mlx5_priv *priv, uint32_t idx)
1329e6100c7bSLi Zhang {
1330e6100c7bSLi Zhang 	struct mlx5_aso_mtr_pool *pool;
1331afb4aa4fSLi Zhang 	struct mlx5_aso_mtr_pools_mng *pools_mng =
1332afb4aa4fSLi Zhang 				&priv->sh->mtrmng->pools_mng;
1333e6100c7bSLi Zhang 
1334e6100c7bSLi Zhang 	/* Decrease to original index. */
1335e6100c7bSLi Zhang 	idx--;
1336afb4aa4fSLi Zhang 	MLX5_ASSERT(idx / MLX5_ASO_MTRS_PER_POOL < pools_mng->n);
1337afb4aa4fSLi Zhang 	pool = pools_mng->pools[idx / MLX5_ASO_MTRS_PER_POOL];
1338e6100c7bSLi Zhang 	return &pool->mtrs[idx % MLX5_ASO_MTRS_PER_POOL];
1339e6100c7bSLi Zhang }
1340e6100c7bSLi Zhang 
134179f89527SGregory Etelson static __rte_always_inline const struct rte_flow_item *
134279f89527SGregory Etelson mlx5_find_end_item(const struct rte_flow_item *item)
134379f89527SGregory Etelson {
134479f89527SGregory Etelson 	for (; item->type != RTE_FLOW_ITEM_TYPE_END; item++);
134579f89527SGregory Etelson 	return item;
134679f89527SGregory Etelson }
134779f89527SGregory Etelson 
134879f89527SGregory Etelson static __rte_always_inline bool
134979f89527SGregory Etelson mlx5_validate_integrity_item(const struct rte_flow_item_integrity *item)
135079f89527SGregory Etelson {
135179f89527SGregory Etelson 	struct rte_flow_item_integrity test = *item;
135279f89527SGregory Etelson 	test.l3_ok = 0;
135379f89527SGregory Etelson 	test.l4_ok = 0;
135479f89527SGregory Etelson 	test.ipv4_csum_ok = 0;
135579f89527SGregory Etelson 	test.l4_csum_ok = 0;
135679f89527SGregory Etelson 	return (test.value == 0);
135779f89527SGregory Etelson }
135879f89527SGregory Etelson 
13592db75e8bSBing Zhao /*
13604f74cb68SBing Zhao  * Get ASO CT action by device and index.
13612db75e8bSBing Zhao  *
13622db75e8bSBing Zhao  * @param[in] dev
13632db75e8bSBing Zhao  *   Pointer to the Ethernet device structure.
13642db75e8bSBing Zhao  * @param[in] idx
13652db75e8bSBing Zhao  *   Index to the ASO CT action.
13662db75e8bSBing Zhao  *
13672db75e8bSBing Zhao  * @return
13682db75e8bSBing Zhao  *   The specified ASO CT action pointer.
13692db75e8bSBing Zhao  */
13702db75e8bSBing Zhao static inline struct mlx5_aso_ct_action *
13714f74cb68SBing Zhao flow_aso_ct_get_by_dev_idx(struct rte_eth_dev *dev, uint32_t idx)
13722db75e8bSBing Zhao {
13732db75e8bSBing Zhao 	struct mlx5_priv *priv = dev->data->dev_private;
13742db75e8bSBing Zhao 	struct mlx5_aso_ct_pools_mng *mng = priv->sh->ct_mng;
13752db75e8bSBing Zhao 	struct mlx5_aso_ct_pool *pool;
13762db75e8bSBing Zhao 
13772db75e8bSBing Zhao 	idx--;
13782db75e8bSBing Zhao 	MLX5_ASSERT((idx / MLX5_ASO_CT_ACTIONS_PER_POOL) < mng->n);
13792db75e8bSBing Zhao 	/* Bit operation AND could be used. */
13802db75e8bSBing Zhao 	rte_rwlock_read_lock(&mng->resize_rwl);
13812db75e8bSBing Zhao 	pool = mng->pools[idx / MLX5_ASO_CT_ACTIONS_PER_POOL];
13822db75e8bSBing Zhao 	rte_rwlock_read_unlock(&mng->resize_rwl);
13832db75e8bSBing Zhao 	return &pool->actions[idx % MLX5_ASO_CT_ACTIONS_PER_POOL];
13842db75e8bSBing Zhao }
13852db75e8bSBing Zhao 
13864f74cb68SBing Zhao /*
13874f74cb68SBing Zhao  * Get ASO CT action by owner & index.
13884f74cb68SBing Zhao  *
13894f74cb68SBing Zhao  * @param[in] dev
13904f74cb68SBing Zhao  *   Pointer to the Ethernet device structure.
13914f74cb68SBing Zhao  * @param[in] idx
13924f74cb68SBing Zhao  *   Index to the ASO CT action and owner port combination.
13934f74cb68SBing Zhao  *
13944f74cb68SBing Zhao  * @return
13954f74cb68SBing Zhao  *   The specified ASO CT action pointer.
13964f74cb68SBing Zhao  */
13974f74cb68SBing Zhao static inline struct mlx5_aso_ct_action *
13984f74cb68SBing Zhao flow_aso_ct_get_by_idx(struct rte_eth_dev *dev, uint32_t own_idx)
13994f74cb68SBing Zhao {
14004f74cb68SBing Zhao 	struct mlx5_priv *priv = dev->data->dev_private;
14014f74cb68SBing Zhao 	struct mlx5_aso_ct_action *ct;
14024f74cb68SBing Zhao 	uint16_t owner = (uint16_t)MLX5_INDIRECT_ACT_CT_GET_OWNER(own_idx);
14034f74cb68SBing Zhao 	uint32_t idx = MLX5_INDIRECT_ACT_CT_GET_IDX(own_idx);
14044f74cb68SBing Zhao 
14054f74cb68SBing Zhao 	if (owner == PORT_ID(priv)) {
14064f74cb68SBing Zhao 		ct = flow_aso_ct_get_by_dev_idx(dev, idx);
14074f74cb68SBing Zhao 	} else {
14084f74cb68SBing Zhao 		struct rte_eth_dev *owndev = &rte_eth_devices[owner];
14094f74cb68SBing Zhao 
14104f74cb68SBing Zhao 		MLX5_ASSERT(owner < RTE_MAX_ETHPORTS);
14114f74cb68SBing Zhao 		if (dev->data->dev_started != 1)
14124f74cb68SBing Zhao 			return NULL;
14134f74cb68SBing Zhao 		ct = flow_aso_ct_get_by_dev_idx(owndev, idx);
14144f74cb68SBing Zhao 		if (ct->peer != PORT_ID(priv))
14154f74cb68SBing Zhao 			return NULL;
14164f74cb68SBing Zhao 	}
14174f74cb68SBing Zhao 	return ct;
14184f74cb68SBing Zhao }
14194f74cb68SBing Zhao 
14204ec6360dSGregory Etelson int mlx5_flow_group_to_table(struct rte_eth_dev *dev,
14214ec6360dSGregory Etelson 			     const struct mlx5_flow_tunnel *tunnel,
14224ec6360dSGregory Etelson 			     uint32_t group, uint32_t *table,
1423eab3ca48SGregory Etelson 			     const struct flow_grp_info *flags,
14244ec6360dSGregory Etelson 			     struct rte_flow_error *error);
1425e745f900SSuanming Mou uint64_t mlx5_flow_hashfields_adjust(struct mlx5_flow_rss_desc *rss_desc,
1426e745f900SSuanming Mou 				     int tunnel, uint64_t layer_types,
1427fc2c498cSOri Kam 				     uint64_t hash_fields);
14283eca5f8aSOphir Munk int mlx5_flow_discover_priorities(struct rte_eth_dev *dev);
142984c406e7SOri Kam uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
143084c406e7SOri Kam 				   uint32_t subpriority);
14315f8ae44dSDong Zhou uint32_t mlx5_get_lowest_priority(struct rte_eth_dev *dev,
14325f8ae44dSDong Zhou 					const struct rte_flow_attr *attr);
14335f8ae44dSDong Zhou uint16_t mlx5_get_matcher_priority(struct rte_eth_dev *dev,
14345f8ae44dSDong Zhou 				     const struct rte_flow_attr *attr,
14355f8ae44dSDong Zhou 				     uint32_t subpriority);
143699d49f47SMatan Azrad int mlx5_flow_get_reg_id(struct rte_eth_dev *dev,
14373e8edd0eSViacheslav Ovsiienko 				     enum mlx5_feature_name feature,
14383e8edd0eSViacheslav Ovsiienko 				     uint32_t id,
14393e8edd0eSViacheslav Ovsiienko 				     struct rte_flow_error *error);
1440e4fcdcd6SMoti Haimovsky const struct rte_flow_action *mlx5_flow_find_action
1441e4fcdcd6SMoti Haimovsky 					(const struct rte_flow_action *actions,
1442e4fcdcd6SMoti Haimovsky 					 enum rte_flow_action_type action);
1443d7cfcdddSAndrey Vesnovaty int mlx5_validate_action_rss(struct rte_eth_dev *dev,
1444d7cfcdddSAndrey Vesnovaty 			     const struct rte_flow_action *action,
1445d7cfcdddSAndrey Vesnovaty 			     struct rte_flow_error *error);
144684c406e7SOri Kam int mlx5_flow_validate_action_count(struct rte_eth_dev *dev,
14473e9fa079SDekel Peled 				    const struct rte_flow_attr *attr,
144884c406e7SOri Kam 				    struct rte_flow_error *error);
144984c406e7SOri Kam int mlx5_flow_validate_action_drop(uint64_t action_flags,
14503e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
145184c406e7SOri Kam 				   struct rte_flow_error *error);
145284c406e7SOri Kam int mlx5_flow_validate_action_flag(uint64_t action_flags,
14533e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
145484c406e7SOri Kam 				   struct rte_flow_error *error);
145584c406e7SOri Kam int mlx5_flow_validate_action_mark(const struct rte_flow_action *action,
145684c406e7SOri Kam 				   uint64_t action_flags,
14573e9fa079SDekel Peled 				   const struct rte_flow_attr *attr,
145884c406e7SOri Kam 				   struct rte_flow_error *error);
145984c406e7SOri Kam int mlx5_flow_validate_action_queue(const struct rte_flow_action *action,
146084c406e7SOri Kam 				    uint64_t action_flags,
146184c406e7SOri Kam 				    struct rte_eth_dev *dev,
14623e9fa079SDekel Peled 				    const struct rte_flow_attr *attr,
146384c406e7SOri Kam 				    struct rte_flow_error *error);
146484c406e7SOri Kam int mlx5_flow_validate_action_rss(const struct rte_flow_action *action,
146584c406e7SOri Kam 				  uint64_t action_flags,
146684c406e7SOri Kam 				  struct rte_eth_dev *dev,
14673e9fa079SDekel Peled 				  const struct rte_flow_attr *attr,
14681183f12fSOri Kam 				  uint64_t item_flags,
146984c406e7SOri Kam 				  struct rte_flow_error *error);
14703c78124fSShiri Kuzin int mlx5_flow_validate_action_default_miss(uint64_t action_flags,
14713c78124fSShiri Kuzin 				const struct rte_flow_attr *attr,
14723c78124fSShiri Kuzin 				struct rte_flow_error *error);
147384c406e7SOri Kam int mlx5_flow_validate_attributes(struct rte_eth_dev *dev,
147484c406e7SOri Kam 				  const struct rte_flow_attr *attributes,
147584c406e7SOri Kam 				  struct rte_flow_error *error);
14766bd7fbd0SDekel Peled int mlx5_flow_item_acceptable(const struct rte_flow_item *item,
14776bd7fbd0SDekel Peled 			      const uint8_t *mask,
14786bd7fbd0SDekel Peled 			      const uint8_t *nic_mask,
14796bd7fbd0SDekel Peled 			      unsigned int size,
14806859e67eSDekel Peled 			      bool range_accepted,
14816bd7fbd0SDekel Peled 			      struct rte_flow_error *error);
148284c406e7SOri Kam int mlx5_flow_validate_item_eth(const struct rte_flow_item *item,
148386b59a1aSMatan Azrad 				uint64_t item_flags, bool ext_vlan_sup,
148484c406e7SOri Kam 				struct rte_flow_error *error);
148584c406e7SOri Kam int mlx5_flow_validate_item_gre(const struct rte_flow_item *item,
148684c406e7SOri Kam 				uint64_t item_flags,
148784c406e7SOri Kam 				uint8_t target_protocol,
148884c406e7SOri Kam 				struct rte_flow_error *error);
1489a7a03655SXiaoyu Min int mlx5_flow_validate_item_gre_key(const struct rte_flow_item *item,
1490a7a03655SXiaoyu Min 				    uint64_t item_flags,
1491a7a03655SXiaoyu Min 				    const struct rte_flow_item *gre_item,
1492a7a03655SXiaoyu Min 				    struct rte_flow_error *error);
149384c406e7SOri Kam int mlx5_flow_validate_item_ipv4(const struct rte_flow_item *item,
1494ed4c5247SShahaf Shuler 				 uint64_t item_flags,
1495fba32130SXiaoyu Min 				 uint64_t last_item,
1496fba32130SXiaoyu Min 				 uint16_t ether_type,
149755c61fa7SViacheslav Ovsiienko 				 const struct rte_flow_item_ipv4 *acc_mask,
14986859e67eSDekel Peled 				 bool range_accepted,
149984c406e7SOri Kam 				 struct rte_flow_error *error);
150084c406e7SOri Kam int mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item,
150184c406e7SOri Kam 				 uint64_t item_flags,
1502fba32130SXiaoyu Min 				 uint64_t last_item,
1503fba32130SXiaoyu Min 				 uint16_t ether_type,
150455c61fa7SViacheslav Ovsiienko 				 const struct rte_flow_item_ipv6 *acc_mask,
150584c406e7SOri Kam 				 struct rte_flow_error *error);
150638f7efaaSDekel Peled int mlx5_flow_validate_item_mpls(struct rte_eth_dev *dev,
150738f7efaaSDekel Peled 				 const struct rte_flow_item *item,
150884c406e7SOri Kam 				 uint64_t item_flags,
150938f7efaaSDekel Peled 				 uint64_t prev_layer,
151084c406e7SOri Kam 				 struct rte_flow_error *error);
151184c406e7SOri Kam int mlx5_flow_validate_item_tcp(const struct rte_flow_item *item,
151284c406e7SOri Kam 				uint64_t item_flags,
151384c406e7SOri Kam 				uint8_t target_protocol,
151492378c2bSMoti Haimovsky 				const struct rte_flow_item_tcp *flow_mask,
151584c406e7SOri Kam 				struct rte_flow_error *error);
151684c406e7SOri Kam int mlx5_flow_validate_item_udp(const struct rte_flow_item *item,
151784c406e7SOri Kam 				uint64_t item_flags,
151884c406e7SOri Kam 				uint8_t target_protocol,
151984c406e7SOri Kam 				struct rte_flow_error *error);
152084c406e7SOri Kam int mlx5_flow_validate_item_vlan(const struct rte_flow_item *item,
1521ed4c5247SShahaf Shuler 				 uint64_t item_flags,
1522dfedf3e3SViacheslav Ovsiienko 				 struct rte_eth_dev *dev,
152384c406e7SOri Kam 				 struct rte_flow_error *error);
1524630a587bSRongwei Liu int mlx5_flow_validate_item_vxlan(struct rte_eth_dev *dev,
1525a1fd0c82SRongwei Liu 				  uint16_t udp_dport,
1526630a587bSRongwei Liu 				  const struct rte_flow_item *item,
152784c406e7SOri Kam 				  uint64_t item_flags,
1528630a587bSRongwei Liu 				  const struct rte_flow_attr *attr,
152984c406e7SOri Kam 				  struct rte_flow_error *error);
153084c406e7SOri Kam int mlx5_flow_validate_item_vxlan_gpe(const struct rte_flow_item *item,
153184c406e7SOri Kam 				      uint64_t item_flags,
153284c406e7SOri Kam 				      struct rte_eth_dev *dev,
153384c406e7SOri Kam 				      struct rte_flow_error *error);
1534d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp(const struct rte_flow_item *item,
1535d53aa89aSXiaoyu Min 				 uint64_t item_flags,
1536d53aa89aSXiaoyu Min 				 uint8_t target_protocol,
1537d53aa89aSXiaoyu Min 				 struct rte_flow_error *error);
1538d53aa89aSXiaoyu Min int mlx5_flow_validate_item_icmp6(const struct rte_flow_item *item,
1539d53aa89aSXiaoyu Min 				   uint64_t item_flags,
1540d53aa89aSXiaoyu Min 				   uint8_t target_protocol,
1541d53aa89aSXiaoyu Min 				   struct rte_flow_error *error);
1542ea81c1b8SDekel Peled int mlx5_flow_validate_item_nvgre(const struct rte_flow_item *item,
1543ea81c1b8SDekel Peled 				  uint64_t item_flags,
1544ea81c1b8SDekel Peled 				  uint8_t target_protocol,
1545ea81c1b8SDekel Peled 				  struct rte_flow_error *error);
1546e59a5dbcSMoti Haimovsky int mlx5_flow_validate_item_geneve(const struct rte_flow_item *item,
1547e59a5dbcSMoti Haimovsky 				   uint64_t item_flags,
1548e59a5dbcSMoti Haimovsky 				   struct rte_eth_dev *dev,
1549e59a5dbcSMoti Haimovsky 				   struct rte_flow_error *error);
1550f7239fceSShiri Kuzin int mlx5_flow_validate_item_geneve_opt(const struct rte_flow_item *item,
1551f7239fceSShiri Kuzin 				   uint64_t last_item,
1552f7239fceSShiri Kuzin 				   const struct rte_flow_item *geneve_item,
1553f7239fceSShiri Kuzin 				   struct rte_eth_dev *dev,
1554f7239fceSShiri Kuzin 				   struct rte_flow_error *error);
1555c7eca236SBing Zhao int mlx5_flow_validate_item_ecpri(const struct rte_flow_item *item,
1556c7eca236SBing Zhao 				  uint64_t item_flags,
1557c7eca236SBing Zhao 				  uint64_t last_item,
1558c7eca236SBing Zhao 				  uint16_t ether_type,
1559c7eca236SBing Zhao 				  const struct rte_flow_item_ecpri *acc_mask,
1560c7eca236SBing Zhao 				  struct rte_flow_error *error);
156144432018SLi Zhang int mlx5_flow_create_mtr_tbls(struct rte_eth_dev *dev,
156244432018SLi Zhang 			      struct mlx5_flow_meter_info *fm,
156344432018SLi Zhang 			      uint32_t mtr_idx,
156444432018SLi Zhang 			      uint8_t domain_bitmap);
156544432018SLi Zhang void mlx5_flow_destroy_mtr_tbls(struct rte_eth_dev *dev,
156644432018SLi Zhang 			       struct mlx5_flow_meter_info *fm);
1567afb4aa4fSLi Zhang void mlx5_flow_destroy_mtr_drop_tbls(struct rte_eth_dev *dev);
1568fc6ce56bSLi Zhang struct mlx5_flow_meter_sub_policy *mlx5_flow_meter_sub_policy_rss_prepare
1569fc6ce56bSLi Zhang 		(struct rte_eth_dev *dev,
1570fc6ce56bSLi Zhang 		struct mlx5_flow_meter_policy *mtr_policy,
1571fc6ce56bSLi Zhang 		struct mlx5_flow_rss_desc *rss_desc[MLX5_MTR_RTE_COLORS]);
1572ec962badSLi Zhang void mlx5_flow_destroy_sub_policy_with_rxq(struct rte_eth_dev *dev,
1573ec962badSLi Zhang 		struct mlx5_flow_meter_policy *mtr_policy);
1574994829e6SSuanming Mou int mlx5_flow_dv_discover_counter_offset_support(struct rte_eth_dev *dev);
1575*45633c46SSuanming Mou int mlx5_flow_discover_dr_action_support(struct rte_eth_dev *dev);
15764b61b877SBing Zhao int mlx5_action_handle_flush(struct rte_eth_dev *dev);
15774ec6360dSGregory Etelson void mlx5_release_tunnel_hub(struct mlx5_dev_ctx_shared *sh, uint16_t port_id);
15784ec6360dSGregory Etelson int mlx5_alloc_tunnel_hub(struct mlx5_dev_ctx_shared *sh);
1579afd7a625SXueming Li 
1580961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_tbl_create_cb(void *tool_ctx, void *entry_ctx);
1581961b6774SMatan Azrad int flow_dv_tbl_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
1582f5b0aed2SSuanming Mou 			 void *cb_ctx);
1583961b6774SMatan Azrad void flow_dv_tbl_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
1584961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_tbl_clone_cb(void *tool_ctx,
1585961b6774SMatan Azrad 					     struct mlx5_list_entry *oentry,
1586961b6774SMatan Azrad 					     void *entry_ctx);
1587961b6774SMatan Azrad void flow_dv_tbl_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry);
1588afd7a625SXueming Li struct mlx5_flow_tbl_resource *flow_dv_tbl_resource_get(struct rte_eth_dev *dev,
15892d2cef5dSLi Zhang 		uint32_t table_level, uint8_t egress, uint8_t transfer,
1590afd7a625SXueming Li 		bool external, const struct mlx5_flow_tunnel *tunnel,
15912d2cef5dSLi Zhang 		uint32_t group_id, uint8_t dummy,
15922d2cef5dSLi Zhang 		uint32_t table_id, struct rte_flow_error *error);
1593afd7a625SXueming Li 
1594961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_tag_create_cb(void *tool_ctx, void *cb_ctx);
1595961b6774SMatan Azrad int flow_dv_tag_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
1596f5b0aed2SSuanming Mou 			 void *cb_ctx);
1597961b6774SMatan Azrad void flow_dv_tag_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
1598961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_tag_clone_cb(void *tool_ctx,
1599961b6774SMatan Azrad 					     struct mlx5_list_entry *oentry,
1600f5b0aed2SSuanming Mou 					     void *cb_ctx);
1601961b6774SMatan Azrad void flow_dv_tag_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry);
1602f7f73ac1SXueming Li 
1603961b6774SMatan Azrad int flow_dv_modify_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
1604961b6774SMatan Azrad 			    void *cb_ctx);
1605961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_modify_create_cb(void *tool_ctx, void *ctx);
1606961b6774SMatan Azrad void flow_dv_modify_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
1607961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_modify_clone_cb(void *tool_ctx,
1608961b6774SMatan Azrad 						struct mlx5_list_entry *oentry,
1609961b6774SMatan Azrad 						void *ctx);
1610961b6774SMatan Azrad void flow_dv_modify_clone_free_cb(void *tool_ctx,
1611961b6774SMatan Azrad 				  struct mlx5_list_entry *entry);
1612961b6774SMatan Azrad 
1613961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_mreg_create_cb(void *tool_ctx, void *ctx);
1614961b6774SMatan Azrad int flow_dv_mreg_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
1615961b6774SMatan Azrad 			  void *cb_ctx);
1616961b6774SMatan Azrad void flow_dv_mreg_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
1617961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_mreg_clone_cb(void *tool_ctx,
1618961b6774SMatan Azrad 					      struct mlx5_list_entry *entry,
1619961b6774SMatan Azrad 					      void *ctx);
1620961b6774SMatan Azrad void flow_dv_mreg_clone_free_cb(void *tool_ctx, struct mlx5_list_entry *entry);
1621961b6774SMatan Azrad 
1622961b6774SMatan Azrad int flow_dv_encap_decap_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
1623961b6774SMatan Azrad 				 void *cb_ctx);
1624961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_encap_decap_create_cb(void *tool_ctx,
1625961b6774SMatan Azrad 						      void *cb_ctx);
1626961b6774SMatan Azrad void flow_dv_encap_decap_remove_cb(void *tool_ctx,
1627961b6774SMatan Azrad 				   struct mlx5_list_entry *entry);
1628961b6774SMatan Azrad struct mlx5_list_entry *flow_dv_encap_decap_clone_cb(void *tool_ctx,
1629961b6774SMatan Azrad 						  struct mlx5_list_entry *entry,
1630961b6774SMatan Azrad 						  void *cb_ctx);
1631961b6774SMatan Azrad void flow_dv_encap_decap_clone_free_cb(void *tool_ctx,
1632961b6774SMatan Azrad 				       struct mlx5_list_entry *entry);
163318726355SXueming Li 
16346507c9f5SSuanming Mou int flow_dv_matcher_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
1635e78e5408SMatan Azrad 			     void *ctx);
16366507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_matcher_create_cb(void *tool_ctx, void *ctx);
16376507c9f5SSuanming Mou void flow_dv_matcher_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
16386507c9f5SSuanming Mou 
16396507c9f5SSuanming Mou int flow_dv_port_id_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
16406507c9f5SSuanming Mou 			     void *cb_ctx);
16416507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_port_id_create_cb(void *tool_ctx, void *cb_ctx);
16426507c9f5SSuanming Mou void flow_dv_port_id_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
16436507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_port_id_clone_cb(void *tool_ctx,
16446507c9f5SSuanming Mou 				struct mlx5_list_entry *entry, void *cb_ctx);
16456507c9f5SSuanming Mou void flow_dv_port_id_clone_free_cb(void *tool_ctx,
1646e78e5408SMatan Azrad 				   struct mlx5_list_entry *entry);
164718726355SXueming Li 
16486507c9f5SSuanming Mou int flow_dv_push_vlan_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
1649e78e5408SMatan Azrad 			       void *cb_ctx);
16506507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_push_vlan_create_cb(void *tool_ctx,
1651491b7137SMatan Azrad 						    void *cb_ctx);
16526507c9f5SSuanming Mou void flow_dv_push_vlan_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
16536507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_push_vlan_clone_cb(void *tool_ctx,
1654e78e5408SMatan Azrad 				 struct mlx5_list_entry *entry, void *cb_ctx);
16556507c9f5SSuanming Mou void flow_dv_push_vlan_clone_free_cb(void *tool_ctx,
1656491b7137SMatan Azrad 				     struct mlx5_list_entry *entry);
16573422af2aSXueming Li 
16586507c9f5SSuanming Mou int flow_dv_sample_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
1659e78e5408SMatan Azrad 			    void *cb_ctx);
16606507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_sample_create_cb(void *tool_ctx, void *cb_ctx);
16616507c9f5SSuanming Mou void flow_dv_sample_remove_cb(void *tool_ctx, struct mlx5_list_entry *entry);
16626507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_sample_clone_cb(void *tool_ctx,
1663491b7137SMatan Azrad 				 struct mlx5_list_entry *entry, void *cb_ctx);
16646507c9f5SSuanming Mou void flow_dv_sample_clone_free_cb(void *tool_ctx,
1665491b7137SMatan Azrad 				  struct mlx5_list_entry *entry);
166619784141SSuanming Mou 
16676507c9f5SSuanming Mou int flow_dv_dest_array_match_cb(void *tool_ctx, struct mlx5_list_entry *entry,
1668e78e5408SMatan Azrad 				void *cb_ctx);
16696507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_dest_array_create_cb(void *tool_ctx,
16706507c9f5SSuanming Mou 						     void *cb_ctx);
16716507c9f5SSuanming Mou void flow_dv_dest_array_remove_cb(void *tool_ctx,
1672e78e5408SMatan Azrad 				  struct mlx5_list_entry *entry);
16736507c9f5SSuanming Mou struct mlx5_list_entry *flow_dv_dest_array_clone_cb(void *tool_ctx,
1674491b7137SMatan Azrad 				   struct mlx5_list_entry *entry, void *cb_ctx);
16756507c9f5SSuanming Mou void flow_dv_dest_array_clone_free_cb(void *tool_ctx,
1676491b7137SMatan Azrad 				      struct mlx5_list_entry *entry);
16776507c9f5SSuanming Mou 
167881073e1fSMatan Azrad struct mlx5_aso_age_action *flow_aso_age_get_by_idx(struct rte_eth_dev *dev,
167981073e1fSMatan Azrad 						    uint32_t age_idx);
1680f15f0c38SShiri Kuzin int flow_dev_geneve_tlv_option_resource_register(struct rte_eth_dev *dev,
1681f15f0c38SShiri Kuzin 					     const struct rte_flow_item *item,
1682f15f0c38SShiri Kuzin 					     struct rte_flow_error *error);
16835d55a494STal Shnaiderman void flow_release_workspace(void *data);
16845d55a494STal Shnaiderman int mlx5_flow_os_init_workspace_once(void);
16855d55a494STal Shnaiderman void *mlx5_flow_os_get_specific_workspace(void);
16865d55a494STal Shnaiderman int mlx5_flow_os_set_specific_workspace(struct mlx5_flow_workspace *data);
16875d55a494STal Shnaiderman void mlx5_flow_os_release_workspace(void);
1688e6100c7bSLi Zhang uint32_t mlx5_flow_mtr_alloc(struct rte_eth_dev *dev);
1689e6100c7bSLi Zhang void mlx5_flow_mtr_free(struct rte_eth_dev *dev, uint32_t mtr_idx);
1690afb4aa4fSLi Zhang int mlx5_flow_validate_mtr_acts(struct rte_eth_dev *dev,
1691afb4aa4fSLi Zhang 			const struct rte_flow_action *actions[RTE_COLORS],
1692afb4aa4fSLi Zhang 			struct rte_flow_attr *attr,
1693afb4aa4fSLi Zhang 			bool *is_rss,
1694afb4aa4fSLi Zhang 			uint8_t *domain_bitmap,
16954b7bf3ffSBing Zhao 			uint8_t *policy_mode,
1696afb4aa4fSLi Zhang 			struct rte_mtr_error *error);
1697afb4aa4fSLi Zhang void mlx5_flow_destroy_mtr_acts(struct rte_eth_dev *dev,
1698afb4aa4fSLi Zhang 		      struct mlx5_flow_meter_policy *mtr_policy);
1699afb4aa4fSLi Zhang int mlx5_flow_create_mtr_acts(struct rte_eth_dev *dev,
1700afb4aa4fSLi Zhang 		      struct mlx5_flow_meter_policy *mtr_policy,
1701afb4aa4fSLi Zhang 		      const struct rte_flow_action *actions[RTE_COLORS],
1702afb4aa4fSLi Zhang 		      struct rte_mtr_error *error);
1703afb4aa4fSLi Zhang int mlx5_flow_create_policy_rules(struct rte_eth_dev *dev,
1704afb4aa4fSLi Zhang 			     struct mlx5_flow_meter_policy *mtr_policy);
1705afb4aa4fSLi Zhang void mlx5_flow_destroy_policy_rules(struct rte_eth_dev *dev,
1706afb4aa4fSLi Zhang 			     struct mlx5_flow_meter_policy *mtr_policy);
1707afb4aa4fSLi Zhang int mlx5_flow_create_def_policy(struct rte_eth_dev *dev);
1708afb4aa4fSLi Zhang void mlx5_flow_destroy_def_policy(struct rte_eth_dev *dev);
1709afb4aa4fSLi Zhang void flow_drv_rxq_flags_set(struct rte_eth_dev *dev,
1710afb4aa4fSLi Zhang 		       struct mlx5_flow_handle *dev_handle);
17118c5a231bSGregory Etelson const struct mlx5_flow_tunnel *
17128c5a231bSGregory Etelson mlx5_get_tof(const struct rte_flow_item *items,
17138c5a231bSGregory Etelson 	     const struct rte_flow_action *actions,
17148c5a231bSGregory Etelson 	     enum mlx5_tof_rule_type *rule_type);
17158c5a231bSGregory Etelson 
17168c5a231bSGregory Etelson 
171784c406e7SOri Kam #endif /* RTE_PMD_MLX5_FLOW_H_ */
1718