1/* SPDX-License-Identifier: GPL-2.0+ */
2// Copyright (c) 2021-2021 Hisilicon Limited.
3
4#ifndef __HCLGE_COMM_RSS_H
5#define __HCLGE_COMM_RSS_H
6#include <linux/types.h>
7
8#include "hnae3.h"
9#include "hclge_comm_cmd.h"
10
11#define HCLGE_COMM_RSS_HASH_ALGO_TOEPLITZ 0
12#define HCLGE_COMM_RSS_HASH_ALGO_SIMPLE 1
13#define HCLGE_COMM_RSS_HASH_ALGO_SYMMETRIC 2
14
15#define HCLGE_COMM_RSS_INPUT_TUPLE_OTHER GENMASK(3, 0)
16#define HCLGE_COMM_RSS_INPUT_TUPLE_SCTP GENMASK(4, 0)
17
18#define HCLGE_COMM_D_PORT_BIT BIT(0)
19#define HCLGE_COMM_S_PORT_BIT BIT(1)
20#define HCLGE_COMM_D_IP_BIT BIT(2)
21#define HCLGE_COMM_S_IP_BIT BIT(3)
22#define HCLGE_COMM_V_TAG_BIT BIT(4)
23#define HCLGE_COMM_RSS_INPUT_TUPLE_SCTP_NO_PORT \
24 (HCLGE_COMM_D_IP_BIT | HCLGE_COMM_S_IP_BIT | HCLGE_COMM_V_TAG_BIT)
25#define HCLGE_COMM_MAX_TC_NUM 8
26
27#define HCLGE_COMM_RSS_TC_OFFSET_S 0
28#define HCLGE_COMM_RSS_TC_OFFSET_M GENMASK(10, 0)
29#define HCLGE_COMM_RSS_TC_SIZE_MSB_B 11
30#define HCLGE_COMM_RSS_TC_SIZE_S 12
31#define HCLGE_COMM_RSS_TC_SIZE_M GENMASK(14, 12)
32#define HCLGE_COMM_RSS_TC_VALID_B 15
33#define HCLGE_COMM_RSS_TC_SIZE_MSB_OFFSET 3
34
35struct hclge_comm_rss_tuple_cfg {
36 u8 ipv4_tcp_en;
37 u8 ipv4_udp_en;
38 u8 ipv4_sctp_en;
39 u8 ipv4_fragment_en;
40 u8 ipv6_tcp_en;
41 u8 ipv6_udp_en;
42 u8 ipv6_sctp_en;
43 u8 ipv6_fragment_en;
44};
45
46#define HCLGE_COMM_RSS_KEY_SIZE 40
47#define HCLGE_COMM_RSS_CFG_TBL_SIZE 16
48#define HCLGE_COMM_RSS_CFG_TBL_BW_H 2U
49#define HCLGE_COMM_RSS_CFG_TBL_BW_L 8U
50#define HCLGE_COMM_RSS_CFG_TBL_SIZE_H 4
51#define HCLGE_COMM_RSS_SET_BITMAP_MSK GENMASK(15, 0)
52#define HCLGE_COMM_RSS_HASH_ALGO_MASK GENMASK(3, 0)
53#define HCLGE_COMM_RSS_HASH_KEY_OFFSET_B 4
54
55#define HCLGE_COMM_RSS_HASH_KEY_NUM 16
56struct hclge_comm_rss_config_cmd {
57 u8 hash_config;
58 u8 rsv[7];
59 u8 hash_key[HCLGE_COMM_RSS_HASH_KEY_NUM];
60};
61
62struct hclge_comm_rss_cfg {
63 u8 rss_hash_key[HCLGE_COMM_RSS_KEY_SIZE]; /* user configured hash keys */
64
65 /* shadow table */
66 u16 *rss_indirection_tbl;
67 u32 rss_algo;
68
69 struct hclge_comm_rss_tuple_cfg rss_tuple_sets;
70 u32 rss_size;
71};
72
73struct hclge_comm_rss_input_tuple_cmd {
74 u8 ipv4_tcp_en;
75 u8 ipv4_udp_en;
76 u8 ipv4_sctp_en;
77 u8 ipv4_fragment_en;
78 u8 ipv6_tcp_en;
79 u8 ipv6_udp_en;
80 u8 ipv6_sctp_en;
81 u8 ipv6_fragment_en;
82 u8 rsv[16];
83};
84
85struct hclge_comm_rss_ind_tbl_cmd {
86 __le16 start_table_index;
87 __le16 rss_set_bitmap;
88 u8 rss_qid_h[HCLGE_COMM_RSS_CFG_TBL_SIZE_H];
89 u8 rss_qid_l[HCLGE_COMM_RSS_CFG_TBL_SIZE];
90};
91
92struct hclge_comm_rss_tc_mode_cmd {
93 __le16 rss_tc_mode[HCLGE_COMM_MAX_TC_NUM];
94 u8 rsv[8];
95};
96
97u32 hclge_comm_get_rss_key_size(struct hnae3_handle *handle);
98void hclge_comm_rss_indir_init_cfg(struct hnae3_ae_dev *ae_dev,
99 struct hclge_comm_rss_cfg *rss_cfg);
100int hclge_comm_get_rss_tuple(struct hclge_comm_rss_cfg *rss_cfg, int flow_type,
101 u8 *tuple_sets);
102int hclge_comm_parse_rss_hfunc(struct hclge_comm_rss_cfg *rss_cfg,
103 const u8 hfunc, u8 *hash_algo);
104void hclge_comm_get_rss_hash_info(struct hclge_comm_rss_cfg *rss_cfg, u8 *key,
105 u8 *hfunc);
106void hclge_comm_get_rss_indir_tbl(struct hclge_comm_rss_cfg *rss_cfg,
107 u32 *indir, u16 rss_ind_tbl_size);
108int hclge_comm_set_rss_algo_key(struct hclge_comm_hw *hw, const u8 hfunc,
109 const u8 *key);
110int hclge_comm_init_rss_tuple_cmd(struct hclge_comm_rss_cfg *rss_cfg,
111 struct ethtool_rxnfc *nfc,
112 struct hnae3_ae_dev *ae_dev,
113 struct hclge_comm_rss_input_tuple_cmd *req);
114u64 hclge_comm_convert_rss_tuple(u8 tuple_sets);
115int hclge_comm_set_rss_input_tuple(struct hclge_comm_hw *hw,
116 struct hclge_comm_rss_cfg *rss_cfg);
117int hclge_comm_set_rss_indir_table(struct hnae3_ae_dev *ae_dev,
118 struct hclge_comm_hw *hw, const u16 *indir);
119int hclge_comm_rss_init_cfg(struct hnae3_handle *nic,
120 struct hnae3_ae_dev *ae_dev,
121 struct hclge_comm_rss_cfg *rss_cfg);
122void hclge_comm_get_rss_tc_info(u16 rss_size, u8 hw_tc_map, u16 *tc_offset,
123 u16 *tc_valid, u16 *tc_size);
124int hclge_comm_set_rss_tc_mode(struct hclge_comm_hw *hw, u16 *tc_offset,
125 u16 *tc_valid, u16 *tc_size);
126int hclge_comm_set_rss_hash_key(struct hclge_comm_rss_cfg *rss_cfg,
127 struct hclge_comm_hw *hw, const u8 *key,
128 const u8 hfunc);
129int hclge_comm_set_rss_tuple(struct hnae3_ae_dev *ae_dev,
130 struct hclge_comm_hw *hw,
131 struct hclge_comm_rss_cfg *rss_cfg,
132 struct ethtool_rxnfc *nfc);
133#endif
134

source code of linux/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_rss.h