Skip to content

Commit 1bfd668

Browse files
Jie Wangdavem330
authored andcommitted
net: hns3: create new set of common rss get APIs for PF and VF rss module
The PF and VF rss get APIs are almost the same espect the suffixes of API names. These same impementions bring double development and bugfix work. So this patch creates new common rss get APIs for PF and VF rss module. Subfunctions called by rss query process are also created(e.g. rss tuple conversion APIs). These new common rss get APIs will be used to replace PF and VF old rss APIs in next patches. Signed-off-by: Jie Wang <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9970308 commit 1bfd668

File tree

3 files changed

+197
-2
lines changed

3 files changed

+197
-2
lines changed

drivers/net/ethernet/hisilicon/hns3/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ hns3-$(CONFIG_HNS3_DCB) += hns3_dcbnl.o
1818
obj-$(CONFIG_HNS3_HCLGEVF) += hclgevf.o
1919

2020
hclgevf-objs = hns3vf/hclgevf_main.o hns3vf/hclgevf_mbx.o hns3vf/hclgevf_devlink.o \
21-
hns3_common/hclge_comm_cmd.o
21+
hns3_common/hclge_comm_cmd.o hns3_common/hclge_comm_rss.o
2222

2323
obj-$(CONFIG_HNS3_HCLGE) += hclge.o
2424
hclge-objs = hns3pf/hclge_main.o hns3pf/hclge_mdio.o hns3pf/hclge_tm.o \
2525
hns3pf/hclge_mbx.o hns3pf/hclge_err.o hns3pf/hclge_debugfs.o hns3pf/hclge_ptp.o hns3pf/hclge_devlink.o \
26-
hns3_common/hclge_comm_cmd.o
26+
hns3_common/hclge_comm_cmd.o hns3_common/hclge_comm_rss.o
2727

2828
hclge-$(CONFIG_HNS3_DCB) += hns3pf/hclge_dcb.o
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
// SPDX-License-Identifier: GPL-2.0+
2+
// Copyright (c) 2021-2021 Hisilicon Limited.
3+
#include <linux/skbuff.h>
4+
5+
#include "hnae3.h"
6+
#include "hclge_comm_rss.h"
7+
8+
u32 hclge_comm_get_rss_key_size(struct hnae3_handle *handle)
9+
{
10+
return HCLGE_COMM_RSS_KEY_SIZE;
11+
}
12+
13+
void hclge_comm_get_rss_type(struct hnae3_handle *nic,
14+
struct hclge_comm_rss_tuple_cfg *rss_tuple_sets)
15+
{
16+
if (rss_tuple_sets->ipv4_tcp_en ||
17+
rss_tuple_sets->ipv4_udp_en ||
18+
rss_tuple_sets->ipv4_sctp_en ||
19+
rss_tuple_sets->ipv6_tcp_en ||
20+
rss_tuple_sets->ipv6_udp_en ||
21+
rss_tuple_sets->ipv6_sctp_en)
22+
nic->kinfo.rss_type = PKT_HASH_TYPE_L4;
23+
else if (rss_tuple_sets->ipv4_fragment_en ||
24+
rss_tuple_sets->ipv6_fragment_en)
25+
nic->kinfo.rss_type = PKT_HASH_TYPE_L3;
26+
else
27+
nic->kinfo.rss_type = PKT_HASH_TYPE_NONE;
28+
}
29+
30+
int hclge_comm_parse_rss_hfunc(struct hclge_comm_rss_cfg *rss_cfg,
31+
const u8 hfunc, u8 *hash_algo)
32+
{
33+
switch (hfunc) {
34+
case ETH_RSS_HASH_TOP:
35+
*hash_algo = HCLGE_COMM_RSS_HASH_ALGO_TOEPLITZ;
36+
return 0;
37+
case ETH_RSS_HASH_XOR:
38+
*hash_algo = HCLGE_COMM_RSS_HASH_ALGO_SIMPLE;
39+
return 0;
40+
case ETH_RSS_HASH_NO_CHANGE:
41+
*hash_algo = rss_cfg->rss_algo;
42+
return 0;
43+
default:
44+
return -EINVAL;
45+
}
46+
}
47+
48+
void hclge_comm_rss_indir_init_cfg(struct hnae3_ae_dev *ae_dev,
49+
struct hclge_comm_rss_cfg *rss_cfg)
50+
{
51+
u16 i;
52+
/* Initialize RSS indirect table */
53+
for (i = 0; i < ae_dev->dev_specs.rss_ind_tbl_size; i++)
54+
rss_cfg->rss_indirection_tbl[i] = i % rss_cfg->rss_size;
55+
}
56+
57+
int hclge_comm_get_rss_tuple(struct hclge_comm_rss_cfg *rss_cfg, int flow_type,
58+
u8 *tuple_sets)
59+
{
60+
switch (flow_type) {
61+
case TCP_V4_FLOW:
62+
*tuple_sets = rss_cfg->rss_tuple_sets.ipv4_tcp_en;
63+
break;
64+
case UDP_V4_FLOW:
65+
*tuple_sets = rss_cfg->rss_tuple_sets.ipv4_udp_en;
66+
break;
67+
case TCP_V6_FLOW:
68+
*tuple_sets = rss_cfg->rss_tuple_sets.ipv6_tcp_en;
69+
break;
70+
case UDP_V6_FLOW:
71+
*tuple_sets = rss_cfg->rss_tuple_sets.ipv6_udp_en;
72+
break;
73+
case SCTP_V4_FLOW:
74+
*tuple_sets = rss_cfg->rss_tuple_sets.ipv4_sctp_en;
75+
break;
76+
case SCTP_V6_FLOW:
77+
*tuple_sets = rss_cfg->rss_tuple_sets.ipv6_sctp_en;
78+
break;
79+
case IPV4_FLOW:
80+
case IPV6_FLOW:
81+
*tuple_sets = HCLGE_COMM_S_IP_BIT | HCLGE_COMM_D_IP_BIT;
82+
break;
83+
default:
84+
return -EINVAL;
85+
}
86+
87+
return 0;
88+
}
89+
90+
void hclge_comm_get_rss_hash_info(struct hclge_comm_rss_cfg *rss_cfg, u8 *key,
91+
u8 *hfunc)
92+
{
93+
/* Get hash algorithm */
94+
if (hfunc) {
95+
switch (rss_cfg->rss_algo) {
96+
case HCLGE_COMM_RSS_HASH_ALGO_TOEPLITZ:
97+
*hfunc = ETH_RSS_HASH_TOP;
98+
break;
99+
case HCLGE_COMM_RSS_HASH_ALGO_SIMPLE:
100+
*hfunc = ETH_RSS_HASH_XOR;
101+
break;
102+
default:
103+
*hfunc = ETH_RSS_HASH_UNKNOWN;
104+
break;
105+
}
106+
}
107+
108+
/* Get the RSS Key required by the user */
109+
if (key)
110+
memcpy(key, rss_cfg->rss_hash_key, HCLGE_COMM_RSS_KEY_SIZE);
111+
}
112+
113+
void hclge_comm_get_rss_indir_tbl(struct hclge_comm_rss_cfg *rss_cfg,
114+
u32 *indir, u16 rss_ind_tbl_size)
115+
{
116+
u16 i;
117+
118+
if (!indir)
119+
return;
120+
121+
for (i = 0; i < rss_ind_tbl_size; i++)
122+
indir[i] = rss_cfg->rss_indirection_tbl[i];
123+
}
124+
125+
u8 hclge_comm_get_rss_hash_bits(struct ethtool_rxnfc *nfc)
126+
{
127+
u8 hash_sets = nfc->data & RXH_L4_B_0_1 ? HCLGE_COMM_S_PORT_BIT : 0;
128+
129+
if (nfc->data & RXH_L4_B_2_3)
130+
hash_sets |= HCLGE_COMM_D_PORT_BIT;
131+
else
132+
hash_sets &= ~HCLGE_COMM_D_PORT_BIT;
133+
134+
if (nfc->data & RXH_IP_SRC)
135+
hash_sets |= HCLGE_COMM_S_IP_BIT;
136+
else
137+
hash_sets &= ~HCLGE_COMM_S_IP_BIT;
138+
139+
if (nfc->data & RXH_IP_DST)
140+
hash_sets |= HCLGE_COMM_D_IP_BIT;
141+
else
142+
hash_sets &= ~HCLGE_COMM_D_IP_BIT;
143+
144+
if (nfc->flow_type == SCTP_V4_FLOW || nfc->flow_type == SCTP_V6_FLOW)
145+
hash_sets |= HCLGE_COMM_V_TAG_BIT;
146+
147+
return hash_sets;
148+
}
149+
150+
u64 hclge_comm_convert_rss_tuple(u8 tuple_sets)
151+
{
152+
u64 tuple_data = 0;
153+
154+
if (tuple_sets & HCLGE_COMM_D_PORT_BIT)
155+
tuple_data |= RXH_L4_B_2_3;
156+
if (tuple_sets & HCLGE_COMM_S_PORT_BIT)
157+
tuple_data |= RXH_L4_B_0_1;
158+
if (tuple_sets & HCLGE_COMM_D_IP_BIT)
159+
tuple_data |= RXH_IP_DST;
160+
if (tuple_sets & HCLGE_COMM_S_IP_BIT)
161+
tuple_data |= RXH_IP_SRC;
162+
163+
return tuple_data;
164+
}

drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_rss.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,21 @@
77

88
#include "hnae3.h"
99

10+
#define HCLGE_COMM_RSS_HASH_ALGO_TOEPLITZ 0
11+
#define HCLGE_COMM_RSS_HASH_ALGO_SIMPLE 1
12+
#define HCLGE_COMM_RSS_HASH_ALGO_SYMMETRIC 2
13+
14+
#define HCLGE_COMM_RSS_INPUT_TUPLE_OTHER GENMASK(3, 0)
15+
#define HCLGE_COMM_RSS_INPUT_TUPLE_SCTP GENMASK(4, 0)
16+
17+
#define HCLGE_COMM_D_PORT_BIT BIT(0)
18+
#define HCLGE_COMM_S_PORT_BIT BIT(1)
19+
#define HCLGE_COMM_D_IP_BIT BIT(2)
20+
#define HCLGE_COMM_S_IP_BIT BIT(3)
21+
#define HCLGE_COMM_V_TAG_BIT BIT(4)
22+
#define HCLGE_COMM_RSS_INPUT_TUPLE_SCTP_NO_PORT \
23+
(HCLGE_COMM_D_IP_BIT | HCLGE_COMM_S_IP_BIT | HCLGE_COMM_V_TAG_BIT)
24+
1025
struct hclge_comm_rss_tuple_cfg {
1126
u8 ipv4_tcp_en;
1227
u8 ipv4_udp_en;
@@ -31,4 +46,20 @@ struct hclge_comm_rss_cfg {
3146
u32 rss_size;
3247
};
3348

49+
u32 hclge_comm_get_rss_key_size(struct hnae3_handle *handle);
50+
void hclge_comm_get_rss_type(struct hnae3_handle *nic,
51+
struct hclge_comm_rss_tuple_cfg *rss_tuple_sets);
52+
void hclge_comm_rss_indir_init_cfg(struct hnae3_ae_dev *ae_dev,
53+
struct hclge_comm_rss_cfg *rss_cfg);
54+
int hclge_comm_get_rss_tuple(struct hclge_comm_rss_cfg *rss_cfg, int flow_type,
55+
u8 *tuple_sets);
56+
int hclge_comm_parse_rss_hfunc(struct hclge_comm_rss_cfg *rss_cfg,
57+
const u8 hfunc, u8 *hash_algo);
58+
void hclge_comm_get_rss_hash_info(struct hclge_comm_rss_cfg *rss_cfg, u8 *key,
59+
u8 *hfunc);
60+
void hclge_comm_get_rss_indir_tbl(struct hclge_comm_rss_cfg *rss_cfg,
61+
u32 *indir, u16 rss_ind_tbl_size);
62+
u8 hclge_comm_get_rss_hash_bits(struct ethtool_rxnfc *nfc);
63+
u64 hclge_comm_convert_rss_tuple(u8 tuple_sets);
64+
3465
#endif

0 commit comments

Comments
 (0)