]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
1 | /* SPDX-License-Identifier: BSD-3-Clause |
2 | * Copyright(c) 2018-2019 Hisilicon Limited. | |
3 | */ | |
4 | ||
5 | #ifndef _HNS3_RSS_H_ | |
6 | #define _HNS3_RSS_H_ | |
7 | #include <rte_ethdev.h> | |
8 | #include <rte_flow.h> | |
9 | ||
10 | #define HNS3_ETH_RSS_SUPPORT ( \ | |
11 | ETH_RSS_FRAG_IPV4 | \ | |
12 | ETH_RSS_NONFRAG_IPV4_TCP | \ | |
13 | ETH_RSS_NONFRAG_IPV4_UDP | \ | |
14 | ETH_RSS_NONFRAG_IPV4_SCTP | \ | |
15 | ETH_RSS_NONFRAG_IPV4_OTHER | \ | |
16 | ETH_RSS_FRAG_IPV6 | \ | |
17 | ETH_RSS_NONFRAG_IPV6_TCP | \ | |
18 | ETH_RSS_NONFRAG_IPV6_UDP | \ | |
19 | ETH_RSS_NONFRAG_IPV6_SCTP | \ | |
20 | ETH_RSS_NONFRAG_IPV6_OTHER) | |
21 | ||
22 | #define HNS3_RSS_IND_TBL_SIZE 512 /* The size of hash lookup table */ | |
23 | #define HNS3_RSS_KEY_SIZE 40 | |
24 | #define HNS3_RSS_CFG_TBL_NUM \ | |
25 | (HNS3_RSS_IND_TBL_SIZE / HNS3_RSS_CFG_TBL_SIZE) | |
26 | #define HNS3_RSS_SET_BITMAP_MSK 0xffff | |
27 | ||
28 | #define HNS3_RSS_HASH_ALGO_TOEPLITZ 0 | |
29 | #define HNS3_RSS_HASH_ALGO_SIMPLE 1 | |
30 | #define HNS3_RSS_HASH_ALGO_MASK 0xf | |
31 | ||
32 | #define HNS3_RSS_INPUT_TUPLE_OTHER GENMASK(3, 0) | |
33 | #define HNS3_RSS_INPUT_TUPLE_SCTP GENMASK(4, 0) | |
34 | #define HNS3_IP_FRAG_BIT_MASK GENMASK(3, 2) | |
35 | #define HNS3_IP_OTHER_BIT_MASK GENMASK(1, 0) | |
36 | ||
37 | struct hns3_rss_tuple_cfg { | |
38 | uint8_t ipv4_tcp_en; /* Bit8.0~8.3 */ | |
39 | uint8_t ipv4_udp_en; /* Bit9.0~9.3 */ | |
40 | uint8_t ipv4_sctp_en; /* Bit10.0~10.4 */ | |
41 | uint8_t ipv4_fragment_en; /* Bit11.0~11.3 */ | |
42 | uint8_t ipv6_tcp_en; /* Bit12.0~12.3 */ | |
43 | uint8_t ipv6_udp_en; /* Bit13.0~13.3 */ | |
44 | uint8_t ipv6_sctp_en; /* Bit14.0~14.4 */ | |
45 | uint8_t ipv6_fragment_en; /* Bit15.0~15.3 */ | |
46 | }; | |
47 | ||
48 | #define HNS3_RSS_QUEUES_BUFFER_NUM 64 /* Same as the Max rx/tx queue num */ | |
49 | struct hns3_rss_conf { | |
50 | /* RSS parameters :algorithm, flow_types, key, queue */ | |
51 | struct rte_flow_action_rss conf; | |
52 | uint8_t key[HNS3_RSS_KEY_SIZE]; /* Hash key */ | |
53 | struct hns3_rss_tuple_cfg rss_tuple_sets; | |
54 | uint8_t rss_indirection_tbl[HNS3_RSS_IND_TBL_SIZE]; /* Shadow table */ | |
55 | uint16_t queue[HNS3_RSS_QUEUES_BUFFER_NUM]; /* Queues indices to use */ | |
56 | }; | |
57 | ||
58 | #ifndef ilog2 | |
59 | static inline int rss_ilog2(uint32_t x) | |
60 | { | |
61 | int log = 0; | |
62 | x >>= 1; | |
63 | ||
64 | while (x) { | |
65 | log++; | |
66 | x >>= 1; | |
67 | } | |
68 | return log; | |
69 | } | |
70 | #define ilog2(x) rss_ilog2(x) | |
71 | #endif | |
72 | ||
73 | static inline uint32_t fls(uint32_t x) | |
74 | { | |
75 | uint32_t position; | |
76 | uint32_t i; | |
77 | ||
78 | if (x == 0) | |
79 | return 0; | |
80 | ||
81 | for (i = (x >> 1), position = 0; i != 0; ++position) | |
82 | i >>= 1; | |
83 | ||
84 | return position + 1; | |
85 | } | |
86 | ||
87 | static inline uint32_t roundup_pow_of_two(uint32_t x) | |
88 | { | |
89 | return 1UL << fls(x - 1); | |
90 | } | |
91 | ||
92 | struct hns3_adapter; | |
93 | ||
94 | int hns3_dev_rss_hash_update(struct rte_eth_dev *dev, | |
95 | struct rte_eth_rss_conf *rss_conf); | |
96 | int hns3_dev_rss_hash_conf_get(struct rte_eth_dev *dev, | |
97 | struct rte_eth_rss_conf *rss_conf); | |
98 | int hns3_dev_rss_reta_update(struct rte_eth_dev *dev, | |
99 | struct rte_eth_rss_reta_entry64 *reta_conf, | |
100 | uint16_t reta_size); | |
101 | int hns3_dev_rss_reta_query(struct rte_eth_dev *dev, | |
102 | struct rte_eth_rss_reta_entry64 *reta_conf, | |
103 | uint16_t reta_size); | |
104 | void hns3_set_default_rss_args(struct hns3_hw *hw); | |
105 | int hns3_set_rss_indir_table(struct hns3_hw *hw, uint8_t *indir, uint16_t size); | |
106 | int hns3_rss_reset_indir_table(struct hns3_hw *hw); | |
107 | int hns3_config_rss(struct hns3_adapter *hns); | |
108 | void hns3_rss_uninit(struct hns3_adapter *hns); | |
109 | int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw, | |
110 | struct hns3_rss_tuple_cfg *tuple, | |
111 | uint64_t rss_hf); | |
112 | int hns3_set_rss_algo_key(struct hns3_hw *hw, uint8_t hash_algo, | |
113 | const uint8_t *key); | |
114 | int hns3_restore_rss_filter(struct rte_eth_dev *dev); | |
115 | ||
116 | #endif /* _HNS3_RSS_H_ */ |