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