dpdk/drivers/net/hns3/hns3_rss.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(c) 2018-2021 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        ETH_RSS_L3_SRC_ONLY | \
  22        ETH_RSS_L3_DST_ONLY | \
  23        ETH_RSS_L4_SRC_ONLY | \
  24        ETH_RSS_L4_DST_ONLY)
  25
  26#define HNS3_RSS_IND_TBL_SIZE   512 /* The size of hash lookup table */
  27#define HNS3_RSS_IND_TBL_SIZE_MAX 2048
  28#define HNS3_RSS_KEY_SIZE       40
  29#define HNS3_RSS_SET_BITMAP_MSK 0xffff
  30
  31#define HNS3_RSS_HASH_ALGO_TOEPLITZ     0
  32#define HNS3_RSS_HASH_ALGO_SIMPLE       1
  33#define HNS3_RSS_HASH_ALGO_SYMMETRIC_TOEP 2
  34#define HNS3_RSS_HASH_ALGO_MASK         0xf
  35
  36struct hns3_rss_tuple_cfg {
  37        uint64_t rss_tuple_fields;
  38};
  39
  40#define HNS3_RSS_QUEUES_BUFFER_NUM      64 /* Same as the Max rx/tx queue num */
  41struct hns3_rss_conf {
  42        /* RSS parameters :algorithm, flow_types,  key, queue */
  43        struct rte_flow_action_rss conf;
  44        uint8_t hash_algo; /* hash function type definited by hardware */
  45        uint8_t key[HNS3_RSS_KEY_SIZE];  /* Hash key */
  46        struct hns3_rss_tuple_cfg rss_tuple_sets;
  47        uint16_t rss_indirection_tbl[HNS3_RSS_IND_TBL_SIZE_MAX];
  48        uint16_t queue[HNS3_RSS_QUEUES_BUFFER_NUM]; /* Queues indices to use */
  49        bool valid; /* check if RSS rule is valid */
  50        /*
  51         * For IPv6 SCTP packets type, check whether the NIC hardware support
  52         * RSS hash using the src/dst port as the input tuple. For Kunpeng920
  53         * NIC hardware, it is not supported
  54         */
  55        bool ipv6_sctp_offload_supported;
  56};
  57
  58#ifndef ilog2
  59static 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
  73static 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
  87static inline uint32_t roundup_pow_of_two(uint32_t x)
  88{
  89        return 1UL << fls(x - 1);
  90}
  91
  92struct hns3_adapter;
  93
  94int hns3_dev_rss_hash_update(struct rte_eth_dev *dev,
  95                             struct rte_eth_rss_conf *rss_conf);
  96int hns3_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
  97                               struct rte_eth_rss_conf *rss_conf);
  98int hns3_dev_rss_reta_update(struct rte_eth_dev *dev,
  99                             struct rte_eth_rss_reta_entry64 *reta_conf,
 100                             uint16_t reta_size);
 101int hns3_dev_rss_reta_query(struct rte_eth_dev *dev,
 102                            struct rte_eth_rss_reta_entry64 *reta_conf,
 103                            uint16_t reta_size);
 104void hns3_rss_set_default_args(struct hns3_hw *hw);
 105int hns3_set_rss_indir_table(struct hns3_hw *hw, uint16_t *indir,
 106                             uint16_t size);
 107int hns3_rss_reset_indir_table(struct hns3_hw *hw);
 108int hns3_config_rss(struct hns3_adapter *hns);
 109void hns3_rss_uninit(struct hns3_adapter *hns);
 110int hns3_set_rss_tuple_by_rss_hf(struct hns3_hw *hw,
 111                                 struct hns3_rss_tuple_cfg *tuple,
 112                                 uint64_t rss_hf);
 113int hns3_rss_set_algo_key(struct hns3_hw *hw, const uint8_t *key);
 114int hns3_restore_rss_filter(struct rte_eth_dev *dev);
 115
 116#endif /* _HNS3_RSS_H_ */
 117