1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (c) 2021, Intel Corporation. */
3 
4 #ifndef _IAVF_ADV_RSS_H_
5 #define _IAVF_ADV_RSS_H_
6 
7 struct iavf_adapter;
8 
9 /* State of advanced RSS configuration */
10 enum iavf_adv_rss_state_t {
11 	IAVF_ADV_RSS_ADD_REQUEST,	/* User requests to add RSS */
12 	IAVF_ADV_RSS_ADD_PENDING,	/* RSS pending add by the PF */
13 	IAVF_ADV_RSS_DEL_REQUEST,	/* Driver requests to delete RSS */
14 	IAVF_ADV_RSS_DEL_PENDING,	/* RSS pending delete by the PF */
15 	IAVF_ADV_RSS_ACTIVE,		/* RSS configuration is active */
16 };
17 
18 enum iavf_adv_rss_flow_seg_hdr {
19 	IAVF_ADV_RSS_FLOW_SEG_HDR_NONE	= 0x00000000,
20 	IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4	= 0x00000001,
21 	IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6	= 0x00000002,
22 	IAVF_ADV_RSS_FLOW_SEG_HDR_TCP	= 0x00000004,
23 	IAVF_ADV_RSS_FLOW_SEG_HDR_UDP	= 0x00000008,
24 	IAVF_ADV_RSS_FLOW_SEG_HDR_SCTP	= 0x00000010,
25 };
26 
27 #define IAVF_ADV_RSS_FLOW_SEG_HDR_L3		\
28 	(IAVF_ADV_RSS_FLOW_SEG_HDR_IPV4	|	\
29 	 IAVF_ADV_RSS_FLOW_SEG_HDR_IPV6)
30 
31 #define IAVF_ADV_RSS_FLOW_SEG_HDR_L4		\
32 	(IAVF_ADV_RSS_FLOW_SEG_HDR_TCP |	\
33 	 IAVF_ADV_RSS_FLOW_SEG_HDR_UDP |	\
34 	 IAVF_ADV_RSS_FLOW_SEG_HDR_SCTP)
35 
36 enum iavf_adv_rss_flow_field {
37 	/* L3 */
38 	IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV4_SA,
39 	IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV4_DA,
40 	IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV6_SA,
41 	IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV6_DA,
42 	/* L4 */
43 	IAVF_ADV_RSS_FLOW_FIELD_IDX_TCP_SRC_PORT,
44 	IAVF_ADV_RSS_FLOW_FIELD_IDX_TCP_DST_PORT,
45 	IAVF_ADV_RSS_FLOW_FIELD_IDX_UDP_SRC_PORT,
46 	IAVF_ADV_RSS_FLOW_FIELD_IDX_UDP_DST_PORT,
47 	IAVF_ADV_RSS_FLOW_FIELD_IDX_SCTP_SRC_PORT,
48 	IAVF_ADV_RSS_FLOW_FIELD_IDX_SCTP_DST_PORT,
49 
50 	/* The total number of enums must not exceed 64 */
51 	IAVF_ADV_RSS_FLOW_FIELD_IDX_MAX
52 };
53 
54 #define IAVF_ADV_RSS_HASH_INVALID	0
55 #define IAVF_ADV_RSS_HASH_FLD_IPV4_SA	\
56 	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV4_SA)
57 #define IAVF_ADV_RSS_HASH_FLD_IPV6_SA	\
58 	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV6_SA)
59 #define IAVF_ADV_RSS_HASH_FLD_IPV4_DA	\
60 	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV4_DA)
61 #define IAVF_ADV_RSS_HASH_FLD_IPV6_DA	\
62 	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_IPV6_DA)
63 #define IAVF_ADV_RSS_HASH_FLD_TCP_SRC_PORT	\
64 	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_TCP_SRC_PORT)
65 #define IAVF_ADV_RSS_HASH_FLD_TCP_DST_PORT	\
66 	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_TCP_DST_PORT)
67 #define IAVF_ADV_RSS_HASH_FLD_UDP_SRC_PORT	\
68 	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_UDP_SRC_PORT)
69 #define IAVF_ADV_RSS_HASH_FLD_UDP_DST_PORT	\
70 	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_UDP_DST_PORT)
71 #define IAVF_ADV_RSS_HASH_FLD_SCTP_SRC_PORT	\
72 	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_SCTP_SRC_PORT)
73 #define IAVF_ADV_RSS_HASH_FLD_SCTP_DST_PORT	\
74 	BIT_ULL(IAVF_ADV_RSS_FLOW_FIELD_IDX_SCTP_DST_PORT)
75 
76 /* bookkeeping of advanced RSS configuration */
77 struct iavf_adv_rss {
78 	enum iavf_adv_rss_state_t state;
79 	struct list_head list;
80 
81 	u32 packet_hdrs;
82 	u64 hash_flds;
83 	bool symm;
84 
85 	struct virtchnl_rss_cfg cfg_msg;
86 };
87 
88 int
89 iavf_fill_adv_rss_cfg_msg(struct virtchnl_rss_cfg *rss_cfg,
90 			  u32 packet_hdrs, u64 hash_flds, bool symm);
91 struct iavf_adv_rss *
92 iavf_find_adv_rss_cfg_by_hdrs(struct iavf_adapter *adapter, u32 packet_hdrs);
93 void
94 iavf_print_adv_rss_cfg(struct iavf_adapter *adapter, struct iavf_adv_rss *rss,
95 		       const char *action, const char *result);
96 #endif /* _IAVF_ADV_RSS_H_ */
97