0001
0002
0003
0004 #ifndef __HCLGE_COMM_RSS_H
0005 #define __HCLGE_COMM_RSS_H
0006 #include <linux/types.h>
0007
0008 #include "hnae3.h"
0009 #include "hclge_comm_cmd.h"
0010
0011 #define HCLGE_COMM_RSS_HASH_ALGO_TOEPLITZ 0
0012 #define HCLGE_COMM_RSS_HASH_ALGO_SIMPLE 1
0013 #define HCLGE_COMM_RSS_HASH_ALGO_SYMMETRIC 2
0014
0015 #define HCLGE_COMM_RSS_INPUT_TUPLE_OTHER GENMASK(3, 0)
0016 #define HCLGE_COMM_RSS_INPUT_TUPLE_SCTP GENMASK(4, 0)
0017
0018 #define HCLGE_COMM_D_PORT_BIT BIT(0)
0019 #define HCLGE_COMM_S_PORT_BIT BIT(1)
0020 #define HCLGE_COMM_D_IP_BIT BIT(2)
0021 #define HCLGE_COMM_S_IP_BIT BIT(3)
0022 #define HCLGE_COMM_V_TAG_BIT BIT(4)
0023 #define HCLGE_COMM_RSS_INPUT_TUPLE_SCTP_NO_PORT \
0024 (HCLGE_COMM_D_IP_BIT | HCLGE_COMM_S_IP_BIT | HCLGE_COMM_V_TAG_BIT)
0025 #define HCLGE_COMM_MAX_TC_NUM 8
0026
0027 #define HCLGE_COMM_RSS_TC_OFFSET_S 0
0028 #define HCLGE_COMM_RSS_TC_OFFSET_M GENMASK(10, 0)
0029 #define HCLGE_COMM_RSS_TC_SIZE_MSB_B 11
0030 #define HCLGE_COMM_RSS_TC_SIZE_S 12
0031 #define HCLGE_COMM_RSS_TC_SIZE_M GENMASK(14, 12)
0032 #define HCLGE_COMM_RSS_TC_VALID_B 15
0033 #define HCLGE_COMM_RSS_TC_SIZE_MSB_OFFSET 3
0034
0035 struct hclge_comm_rss_tuple_cfg {
0036 u8 ipv4_tcp_en;
0037 u8 ipv4_udp_en;
0038 u8 ipv4_sctp_en;
0039 u8 ipv4_fragment_en;
0040 u8 ipv6_tcp_en;
0041 u8 ipv6_udp_en;
0042 u8 ipv6_sctp_en;
0043 u8 ipv6_fragment_en;
0044 };
0045
0046 #define HCLGE_COMM_RSS_KEY_SIZE 40
0047 #define HCLGE_COMM_RSS_CFG_TBL_SIZE 16
0048 #define HCLGE_COMM_RSS_CFG_TBL_BW_H 2U
0049 #define HCLGE_COMM_RSS_CFG_TBL_BW_L 8U
0050 #define HCLGE_COMM_RSS_CFG_TBL_SIZE_H 4
0051 #define HCLGE_COMM_RSS_SET_BITMAP_MSK GENMASK(15, 0)
0052 #define HCLGE_COMM_RSS_HASH_ALGO_MASK GENMASK(3, 0)
0053 #define HCLGE_COMM_RSS_HASH_KEY_OFFSET_B 4
0054
0055 #define HCLGE_COMM_RSS_HASH_KEY_NUM 16
0056 struct hclge_comm_rss_config_cmd {
0057 u8 hash_config;
0058 u8 rsv[7];
0059 u8 hash_key[HCLGE_COMM_RSS_HASH_KEY_NUM];
0060 };
0061
0062 struct hclge_comm_rss_cfg {
0063 u8 rss_hash_key[HCLGE_COMM_RSS_KEY_SIZE];
0064
0065
0066 u16 *rss_indirection_tbl;
0067 u32 rss_algo;
0068
0069 struct hclge_comm_rss_tuple_cfg rss_tuple_sets;
0070 u32 rss_size;
0071 };
0072
0073 struct hclge_comm_rss_input_tuple_cmd {
0074 u8 ipv4_tcp_en;
0075 u8 ipv4_udp_en;
0076 u8 ipv4_sctp_en;
0077 u8 ipv4_fragment_en;
0078 u8 ipv6_tcp_en;
0079 u8 ipv6_udp_en;
0080 u8 ipv6_sctp_en;
0081 u8 ipv6_fragment_en;
0082 u8 rsv[16];
0083 };
0084
0085 struct hclge_comm_rss_ind_tbl_cmd {
0086 __le16 start_table_index;
0087 __le16 rss_set_bitmap;
0088 u8 rss_qid_h[HCLGE_COMM_RSS_CFG_TBL_SIZE_H];
0089 u8 rss_qid_l[HCLGE_COMM_RSS_CFG_TBL_SIZE];
0090 };
0091
0092 struct hclge_comm_rss_tc_mode_cmd {
0093 __le16 rss_tc_mode[HCLGE_COMM_MAX_TC_NUM];
0094 u8 rsv[8];
0095 };
0096
0097 u32 hclge_comm_get_rss_key_size(struct hnae3_handle *handle);
0098 void hclge_comm_get_rss_type(struct hnae3_handle *nic,
0099 struct hclge_comm_rss_tuple_cfg *rss_tuple_sets);
0100 void hclge_comm_rss_indir_init_cfg(struct hnae3_ae_dev *ae_dev,
0101 struct hclge_comm_rss_cfg *rss_cfg);
0102 int hclge_comm_get_rss_tuple(struct hclge_comm_rss_cfg *rss_cfg, int flow_type,
0103 u8 *tuple_sets);
0104 int hclge_comm_parse_rss_hfunc(struct hclge_comm_rss_cfg *rss_cfg,
0105 const u8 hfunc, u8 *hash_algo);
0106 void hclge_comm_get_rss_hash_info(struct hclge_comm_rss_cfg *rss_cfg, u8 *key,
0107 u8 *hfunc);
0108 void hclge_comm_get_rss_indir_tbl(struct hclge_comm_rss_cfg *rss_cfg,
0109 u32 *indir, u16 rss_ind_tbl_size);
0110 int hclge_comm_set_rss_algo_key(struct hclge_comm_hw *hw, const u8 hfunc,
0111 const u8 *key);
0112 int hclge_comm_init_rss_tuple_cmd(struct hclge_comm_rss_cfg *rss_cfg,
0113 struct ethtool_rxnfc *nfc,
0114 struct hnae3_ae_dev *ae_dev,
0115 struct hclge_comm_rss_input_tuple_cmd *req);
0116 u64 hclge_comm_convert_rss_tuple(u8 tuple_sets);
0117 int hclge_comm_set_rss_input_tuple(struct hnae3_handle *nic,
0118 struct hclge_comm_hw *hw, bool is_pf,
0119 struct hclge_comm_rss_cfg *rss_cfg);
0120 int hclge_comm_set_rss_indir_table(struct hnae3_ae_dev *ae_dev,
0121 struct hclge_comm_hw *hw, const u16 *indir);
0122 int hclge_comm_rss_init_cfg(struct hnae3_handle *nic,
0123 struct hnae3_ae_dev *ae_dev,
0124 struct hclge_comm_rss_cfg *rss_cfg);
0125 void hclge_comm_get_rss_tc_info(u16 rss_size, u8 hw_tc_map, u16 *tc_offset,
0126 u16 *tc_valid, u16 *tc_size);
0127 int hclge_comm_set_rss_tc_mode(struct hclge_comm_hw *hw, u16 *tc_offset,
0128 u16 *tc_valid, u16 *tc_size);
0129 int hclge_comm_set_rss_hash_key(struct hclge_comm_rss_cfg *rss_cfg,
0130 struct hclge_comm_hw *hw, const u8 *key,
0131 const u8 hfunc);
0132 int hclge_comm_set_rss_tuple(struct hnae3_ae_dev *ae_dev,
0133 struct hclge_comm_hw *hw,
0134 struct hclge_comm_rss_cfg *rss_cfg,
0135 struct ethtool_rxnfc *nfc);
0136 #endif