xref: /dpdk/drivers/net/hns3/hns3_rss.h (revision bb1f4717636f5b7d27f4f2fe30469b69d8910bd0)
1c37ca66fSWei Hu (Xavier) /* SPDX-License-Identifier: BSD-3-Clause
253e6f86cSMin Hu (Connor)  * Copyright(c) 2018-2021 HiSilicon Limited.
3c37ca66fSWei Hu (Xavier)  */
4c37ca66fSWei Hu (Xavier) 
52ad146efSChengwen Feng #ifndef HNS3_RSS_H
62ad146efSChengwen Feng #define HNS3_RSS_H
71c757dd5SChengwen Feng 
8c37ca66fSWei Hu (Xavier) #include <rte_ethdev.h>
9c37ca66fSWei Hu (Xavier) #include <rte_flow.h>
10c37ca66fSWei Hu (Xavier) 
11e3069658SHuisong Li #define HNS3_RSS_SUPPORT_L3_SRC_DST	(RTE_ETH_RSS_L3_SRC_ONLY | \
12e3069658SHuisong Li 					 RTE_ETH_RSS_L3_DST_ONLY)
13e3069658SHuisong Li #define HNS3_RSS_SUPPORT_L4_SRC_DST	(RTE_ETH_RSS_L4_SRC_ONLY | \
14e3069658SHuisong Li 					 RTE_ETH_RSS_L4_DST_ONLY)
15e3069658SHuisong Li #define HNS3_RSS_SUPPORT_L3L4		(HNS3_RSS_SUPPORT_L3_SRC_DST | \
16e3069658SHuisong Li 					 HNS3_RSS_SUPPORT_L4_SRC_DST)
17e3069658SHuisong Li 
18e3069658SHuisong Li #define HNS3_RSS_SUPPORT_FLOW_TYPE	(RTE_ETH_RSS_IPV4 | \
19295968d1SFerruh Yigit 					 RTE_ETH_RSS_FRAG_IPV4 | \
20295968d1SFerruh Yigit 					 RTE_ETH_RSS_NONFRAG_IPV4_TCP | \
21295968d1SFerruh Yigit 					 RTE_ETH_RSS_NONFRAG_IPV4_UDP | \
22295968d1SFerruh Yigit 					 RTE_ETH_RSS_NONFRAG_IPV4_SCTP | \
23295968d1SFerruh Yigit 					 RTE_ETH_RSS_NONFRAG_IPV4_OTHER | \
24c56a1956SHuisong Li 					 RTE_ETH_RSS_IPV6 | \
25295968d1SFerruh Yigit 					 RTE_ETH_RSS_FRAG_IPV6 | \
26295968d1SFerruh Yigit 					 RTE_ETH_RSS_NONFRAG_IPV6_TCP | \
27295968d1SFerruh Yigit 					 RTE_ETH_RSS_NONFRAG_IPV6_UDP | \
28295968d1SFerruh Yigit 					 RTE_ETH_RSS_NONFRAG_IPV6_SCTP | \
29e3069658SHuisong Li 					 RTE_ETH_RSS_NONFRAG_IPV6_OTHER)
30e3069658SHuisong Li 
31e3069658SHuisong Li #define HNS3_ETH_RSS_SUPPORT		(HNS3_RSS_SUPPORT_FLOW_TYPE | \
32e3069658SHuisong Li 					 HNS3_RSS_SUPPORT_L3L4)
33e3069658SHuisong Li 
34e3069658SHuisong Li enum hns3_tuple_field {
35e3069658SHuisong Li 	/* IPV4_TCP ENABLE FIELD */
36e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_D = 0,
37e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_TCP_EN_TCP_S,
38e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_TCP_EN_IP_D,
39e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_TCP_EN_IP_S,
40e3069658SHuisong Li 
41e3069658SHuisong Li 	/* IPV4_UDP ENABLE FIELD */
42e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_D = 8,
43e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_UDP_EN_UDP_S,
44e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_UDP_EN_IP_D,
45e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_UDP_EN_IP_S,
46e3069658SHuisong Li 
47e3069658SHuisong Li 	/* IPV4_SCTP ENABLE FIELD */
48e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_D = 16,
49e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_SCTP_EN_SCTP_S,
50e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_D,
51e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_SCTP_EN_IP_S,
52e3069658SHuisong Li 
53e3069658SHuisong Li 	/* IPV4 ENABLE FIELD */
54e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_D = 24,
55e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_EN_NONFRAG_IP_S,
56e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_D,
57e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV4_EN_FRAG_IP_S,
58e3069658SHuisong Li 
59e3069658SHuisong Li 	/* IPV6_TCP ENABLE FIELD */
60e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_D = 32,
61e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_TCP_EN_TCP_S,
62e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_TCP_EN_IP_D,
63e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_TCP_EN_IP_S,
64e3069658SHuisong Li 
65e3069658SHuisong Li 	/* IPV6_UDP ENABLE FIELD */
66e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D = 40,
67e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_S,
68e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D,
69e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S,
70e3069658SHuisong Li 
71e3069658SHuisong Li 	/* IPV6_SCTP ENABLE FIELD */
72e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_D = 48,
73e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_S,
74e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D,
75e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S,
76e3069658SHuisong Li 
77e3069658SHuisong Li 	/* IPV6 ENABLE FIELD */
78e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_NONFRAG_IP_D = 56,
79e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S,
80e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_FRAG_IP_D,
81e3069658SHuisong Li 	HNS3_RSS_FIELD_IPV6_FRAG_IP_S
82e3069658SHuisong Li };
83e3069658SHuisong Li 
84e3069658SHuisong Li #define HNS3_RSS_PCTYPE_IPV4_TCP	BIT_ULL(0)
85e3069658SHuisong Li #define HNS3_RSS_PCTYPE_IPV4_UDP	BIT_ULL(8)
86e3069658SHuisong Li #define HNS3_RSS_PCTYPE_IPV4_SCTP	BIT_ULL(16)
87e3069658SHuisong Li #define HNS3_RSS_PCTYPE_IPV4_NONF	BIT_ULL(24)
88e3069658SHuisong Li #define HNS3_RSS_PCTYPE_IPV4_FLAG	BIT_ULL(26)
89e3069658SHuisong Li #define HNS3_RSS_PCTYPE_IPV6_TCP	BIT_ULL(32)
90e3069658SHuisong Li #define HNS3_RSS_PCTYPE_IPV6_UDP	BIT_ULL(40)
91e3069658SHuisong Li #define HNS3_RSS_PCTYPE_IPV6_SCTP	BIT_ULL(48)
92e3069658SHuisong Li #define HNS3_RSS_PCTYPE_IPV6_NONF	BIT_ULL(56)
93e3069658SHuisong Li #define HNS3_RSS_PCTYPE_IPV6_FLAG	BIT_ULL(58)
94e3069658SHuisong Li 
95e3069658SHuisong Li #define HNS3_RSS_TUPLE_IPV4_TCP_M	GENMASK(3, 0)
96e3069658SHuisong Li #define HNS3_RSS_TUPLE_IPV4_UDP_M	GENMASK(11, 8)
97*bb1f4717SJie Hai #define HNS3_RSS_TUPLE_IPV4_SCTP_M	GENMASK(19, 16)
98e3069658SHuisong Li #define HNS3_RSS_TUPLE_IPV4_NONF_M	GENMASK(25, 24)
99e3069658SHuisong Li #define HNS3_RSS_TUPLE_IPV4_FLAG_M	GENMASK(27, 26)
100e3069658SHuisong Li #define HNS3_RSS_TUPLE_IPV6_TCP_M	GENMASK(35, 32)
101e3069658SHuisong Li #define HNS3_RSS_TUPLE_IPV6_UDP_M	GENMASK(43, 40)
102*bb1f4717SJie Hai #define HNS3_RSS_TUPLE_IPV6_SCTP_M	GENMASK(51, 48)
103e3069658SHuisong Li #define HNS3_RSS_TUPLE_IPV6_NONF_M	GENMASK(57, 56)
104e3069658SHuisong Li #define HNS3_RSS_TUPLE_IPV6_FLAG_M	GENMASK(59, 58)
105c37ca66fSWei Hu (Xavier) 
106c37ca66fSWei Hu (Xavier) #define HNS3_RSS_IND_TBL_SIZE	512 /* The size of hash lookup table */
1070fce2c46SLijun Ou #define HNS3_RSS_IND_TBL_SIZE_MAX 2048
108c37ca66fSWei Hu (Xavier) #define HNS3_RSS_KEY_SIZE	40
1095172f9c4SHuisong Li #define HNS3_RSS_KEY_SIZE_MAX	128
110c37ca66fSWei Hu (Xavier) #define HNS3_RSS_SET_BITMAP_MSK	0xffff
111c37ca66fSWei Hu (Xavier) 
112c37ca66fSWei Hu (Xavier) #define HNS3_RSS_HASH_ALGO_TOEPLITZ	0
113c37ca66fSWei Hu (Xavier) #define HNS3_RSS_HASH_ALGO_SIMPLE	1
11478b37190SLijun Ou #define HNS3_RSS_HASH_ALGO_SYMMETRIC_TOEP 2
115c37ca66fSWei Hu (Xavier) #define HNS3_RSS_HASH_ALGO_MASK		0xf
116c37ca66fSWei Hu (Xavier) 
1178095bf3eSHuisong Li /* Same as the Max queue num under TC */
1188095bf3eSHuisong Li #define HNS3_RSS_QUEUES_BUFFER_NUM	512
119c37ca66fSWei Hu (Xavier) struct hns3_rss_conf {
120791e5693SHuisong Li 	uint64_t rss_hf;
1217be78d02SJosh Soref 	uint8_t hash_algo; /* hash function type defined by hardware */
1225172f9c4SHuisong Li 	uint8_t key[HNS3_RSS_KEY_SIZE_MAX];  /* Hash key */
1230fce2c46SLijun Ou 	uint16_t rss_indirection_tbl[HNS3_RSS_IND_TBL_SIZE_MAX];
1241bc633c3SLijun Ou 	/*
1251bc633c3SLijun Ou 	 * For IPv6 SCTP packets type, check whether the NIC hardware support
1261bc633c3SLijun Ou 	 * RSS hash using the src/dst port as the input tuple. For Kunpeng920
1271bc633c3SLijun Ou 	 * NIC hardware, it is not supported
1281bc633c3SLijun Ou 	 */
1291bc633c3SLijun Ou 	bool ipv6_sctp_offload_supported;
130c37ca66fSWei Hu (Xavier) };
131c37ca66fSWei Hu (Xavier) 
132c37ca66fSWei Hu (Xavier) #ifndef ilog2
rss_ilog2(uint32_t x)133c37ca66fSWei Hu (Xavier) static inline int rss_ilog2(uint32_t x)
134c37ca66fSWei Hu (Xavier) {
135c37ca66fSWei Hu (Xavier) 	int log = 0;
136c37ca66fSWei Hu (Xavier) 	x >>= 1;
137c37ca66fSWei Hu (Xavier) 
138c37ca66fSWei Hu (Xavier) 	while (x) {
139c37ca66fSWei Hu (Xavier) 		log++;
140c37ca66fSWei Hu (Xavier) 		x >>= 1;
141c37ca66fSWei Hu (Xavier) 	}
142c37ca66fSWei Hu (Xavier) 	return log;
143c37ca66fSWei Hu (Xavier) }
144c37ca66fSWei Hu (Xavier) #define ilog2(x) rss_ilog2(x)
145c37ca66fSWei Hu (Xavier) #endif
146c37ca66fSWei Hu (Xavier) 
fls(uint32_t x)147c37ca66fSWei Hu (Xavier) static inline uint32_t fls(uint32_t x)
148c37ca66fSWei Hu (Xavier) {
149c37ca66fSWei Hu (Xavier) 	uint32_t position;
150c37ca66fSWei Hu (Xavier) 	uint32_t i;
151c37ca66fSWei Hu (Xavier) 
152c37ca66fSWei Hu (Xavier) 	if (x == 0)
153c37ca66fSWei Hu (Xavier) 		return 0;
154c37ca66fSWei Hu (Xavier) 
155c37ca66fSWei Hu (Xavier) 	for (i = (x >> 1), position = 0; i != 0; ++position)
156c37ca66fSWei Hu (Xavier) 		i >>= 1;
157c37ca66fSWei Hu (Xavier) 
158c37ca66fSWei Hu (Xavier) 	return position + 1;
159c37ca66fSWei Hu (Xavier) }
160c37ca66fSWei Hu (Xavier) 
roundup_pow_of_two(uint32_t x)161c37ca66fSWei Hu (Xavier) static inline uint32_t roundup_pow_of_two(uint32_t x)
162c37ca66fSWei Hu (Xavier) {
163c37ca66fSWei Hu (Xavier) 	return 1UL << fls(x - 1);
164c37ca66fSWei Hu (Xavier) }
165c37ca66fSWei Hu (Xavier) 
16682c2ca6dSMin Hu (Connor) extern const uint8_t hns3_hash_key[HNS3_RSS_KEY_SIZE];
167d7050da8SHuisong Li 
168c37ca66fSWei Hu (Xavier) struct hns3_adapter;
1691c757dd5SChengwen Feng struct hns3_hw;
170c37ca66fSWei Hu (Xavier) 
171c37ca66fSWei Hu (Xavier) int hns3_dev_rss_hash_update(struct rte_eth_dev *dev,
172c37ca66fSWei Hu (Xavier) 			     struct rte_eth_rss_conf *rss_conf);
173c37ca66fSWei Hu (Xavier) int hns3_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
174c37ca66fSWei Hu (Xavier) 			       struct rte_eth_rss_conf *rss_conf);
175c37ca66fSWei Hu (Xavier) int hns3_dev_rss_reta_update(struct rte_eth_dev *dev,
176c37ca66fSWei Hu (Xavier) 			     struct rte_eth_rss_reta_entry64 *reta_conf,
177c37ca66fSWei Hu (Xavier) 			     uint16_t reta_size);
178c37ca66fSWei Hu (Xavier) int hns3_dev_rss_reta_query(struct rte_eth_dev *dev,
179c37ca66fSWei Hu (Xavier) 			    struct rte_eth_rss_reta_entry64 *reta_conf,
180c37ca66fSWei Hu (Xavier) 			    uint16_t reta_size);
181a39e67ffSLijun Ou void hns3_rss_set_default_args(struct hns3_hw *hw);
1829a7d3af2SHuisong Li int hns3_set_rss_indir_table(struct hns3_hw *hw, uint16_t *indir,
1839a7d3af2SHuisong Li 			     uint16_t size);
184c37ca66fSWei Hu (Xavier) int hns3_rss_reset_indir_table(struct hns3_hw *hw);
185c37ca66fSWei Hu (Xavier) int hns3_config_rss(struct hns3_adapter *hns);
186c37ca66fSWei Hu (Xavier) void hns3_rss_uninit(struct hns3_adapter *hns);
187eb3ef9e0SHuisong Li bool hns3_check_rss_types_valid(struct hns3_hw *hw, uint64_t types);
188bfd0b54dSHuisong Li int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, uint64_t rss_hf);
189e3069658SHuisong Li int hns3_set_rss_tuple_field(struct hns3_hw *hw, uint64_t tuple_fields);
190406b25c7SHuisong Li int hns3_get_rss_tuple_field(struct hns3_hw *hw, uint64_t *tuple_fields);
191eb3ef9e0SHuisong Li uint64_t hns3_rss_calc_tuple_filed(uint64_t rss_hf);
192e3069658SHuisong Li int hns3_update_rss_algo_key(struct hns3_hw *hw, uint8_t hash_algo,
193e3069658SHuisong Li 			     uint8_t *key, uint8_t key_len);
194920be799SLijun Ou 
1952ad146efSChengwen Feng #endif /* HNS3_RSS_H */
196