X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fhns3%2Fhns3_rss.c;h=858e31a234b11942b2ab6cbdbfd9589e8d719a68;hb=f191d5abda54c310696789752987c63c5337bff0;hp=5b515122d252020ce1651251c1e485019b776f7d;hpb=806f1d5ab0e3d8c8b25f77e657e5f7228bb90b20;p=dpdk.git diff --git a/drivers/net/hns3/hns3_rss.c b/drivers/net/hns3/hns3_rss.c index 5b515122d2..858e31a234 100644 --- a/drivers/net/hns3/hns3_rss.c +++ b/drivers/net/hns3/hns3_rss.c @@ -2,12 +2,9 @@ * Copyright(c) 2018-2019 Hisilicon Limited. */ -#include #include #include #include -#include -#include #include "hns3_ethdev.h" #include "hns3_logs.h" @@ -61,8 +58,10 @@ enum hns3_tuple_field { HNS3_RSS_FIELD_IPV6_UDP_EN_IP_D, HNS3_RSS_FIELD_IPV6_UDP_EN_IP_S, - /* IPV6_UDP ENABLE FIELD */ - HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D = 50, + /* IPV6_SCTP ENABLE FIELD */ + HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_D = 48, + HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_S, + HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D, HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S, HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER, @@ -133,6 +132,10 @@ static const struct { BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S) }, { ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L3_DST_ONLY, BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D) }, + { ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_SRC_ONLY, + BIT_ULL(HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_S) }, + { ETH_RSS_NONFRAG_IPV6_SCTP | ETH_RSS_L4_DST_ONLY, + BIT_ULL(HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_D) }, { ETH_RSS_NONFRAG_IPV6_OTHER | ETH_RSS_L3_SRC_ONLY, BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) }, { ETH_RSS_NONFRAG_IPV6_OTHER | ETH_RSS_L3_DST_ONLY, @@ -177,6 +180,8 @@ static const struct { BIT_ULL(HNS3_RSS_FIELD_IPV6_UDP_EN_UDP_D) }, { ETH_RSS_NONFRAG_IPV6_SCTP, BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_S) | BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_IP_D) | + BIT_ULL(HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_D) | + BIT_ULL(HNS3_RSS_FILED_IPV6_SCTP_EN_SCTP_S) | BIT_ULL(HNS3_RSS_FIELD_IPV6_SCTP_EN_SCTP_VER) }, { ETH_RSS_NONFRAG_IPV6_OTHER, BIT_ULL(HNS3_RSS_FIELD_IPV6_NONFRAG_IP_S) | @@ -188,7 +193,7 @@ static const struct { * Used to set algorithm, key_offset and hash key of rss. */ int -hns3_set_rss_algo_key(struct hns3_hw *hw, const uint8_t *key) +hns3_rss_set_algo_key(struct hns3_hw *hw, const uint8_t *key) { #define HNS3_KEY_OFFSET_MAX 3 #define HNS3_SET_HASH_KEY_BYTE_FOUR 2 @@ -240,7 +245,7 @@ hns3_set_rss_algo_key(struct hns3_hw *hw, const uint8_t *key) * Used to configure the tuple selection for RSS hash input. */ static int -hns3_set_rss_input_tuple(struct hns3_hw *hw) +hns3_rss_set_input_tuple(struct hns3_hw *hw) { struct hns3_rss_conf *rss_config = &hw->rss_info; struct hns3_rss_input_tuple_cmd *req; @@ -266,11 +271,15 @@ hns3_set_rss_input_tuple(struct hns3_hw *hw) * Used to configure the indirection table of rss. */ int -hns3_set_rss_indir_table(struct hns3_hw *hw, uint8_t *indir, uint16_t size) +hns3_set_rss_indir_table(struct hns3_hw *hw, uint16_t *indir, uint16_t size) { struct hns3_rss_indirection_table_cmd *req; struct hns3_cmd_desc desc; - int ret, i, j, num; + uint8_t qid_msb_off; + uint8_t qid_msb_val; + uint16_t q_id; + uint16_t i, j; + int ret; req = (struct hns3_rss_indirection_table_cmd *)desc.data; @@ -281,9 +290,17 @@ hns3_set_rss_indir_table(struct hns3_hw *hw, uint8_t *indir, uint16_t size) rte_cpu_to_le_16(i * HNS3_RSS_CFG_TBL_SIZE); req->rss_set_bitmap = rte_cpu_to_le_16(HNS3_RSS_SET_BITMAP_MSK); for (j = 0; j < HNS3_RSS_CFG_TBL_SIZE; j++) { - num = i * HNS3_RSS_CFG_TBL_SIZE + j; - req->rss_result[j] = indir[num]; + q_id = indir[i * HNS3_RSS_CFG_TBL_SIZE + j]; + req->rss_result_l[j] = q_id & 0xff; + + qid_msb_off = + j * HNS3_RSS_CFG_TBL_BW_H / HNS3_BITS_PER_BYTE; + qid_msb_val = (q_id >> HNS3_RSS_CFG_TBL_BW_L & 0x1) + << (j * HNS3_RSS_CFG_TBL_BW_H % + HNS3_BITS_PER_BYTE); + req->rss_result_h[qid_msb_off] |= qid_msb_val; } + ret = hns3_cmd_send(hw, &desc, 1); if (ret) { hns3_err(hw, @@ -294,7 +311,8 @@ hns3_set_rss_indir_table(struct hns3_hw *hw, uint8_t *indir, uint16_t size) } /* Update redirection table of hw */ - memcpy(hw->rss_info.rss_indirection_tbl, indir, HNS3_RSS_IND_TBL_SIZE); + memcpy(hw->rss_info.rss_indirection_tbl, indir, + sizeof(uint16_t) * size); return 0; } @@ -302,16 +320,17 @@ hns3_set_rss_indir_table(struct hns3_hw *hw, uint8_t *indir, uint16_t size) int hns3_rss_reset_indir_table(struct hns3_hw *hw) { - uint8_t *lut; + uint16_t *lut; int ret; - lut = rte_zmalloc("hns3_rss_lut", HNS3_RSS_IND_TBL_SIZE, 0); + lut = rte_zmalloc("hns3_rss_lut", + hw->rss_ind_tbl_size * sizeof(uint16_t), 0); if (lut == NULL) { hns3_err(hw, "No hns3_rss_lut memory can be allocated"); return -ENOMEM; } - ret = hns3_set_rss_indir_table(hw, lut, HNS3_RSS_IND_TBL_SIZE); + ret = hns3_set_rss_indir_table(hw, lut, hw->rss_ind_tbl_size); if (ret) hns3_err(hw, "RSS uninit indir table failed: %d", ret); rte_free(lut); @@ -409,7 +428,7 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, } else if (rss_hf && rss_cfg->conf.types == 0) { /* Enable RSS, restore indirection table by hw's config */ ret = hns3_set_rss_indir_table(hw, rss_cfg->rss_indirection_tbl, - HNS3_RSS_IND_TBL_SIZE); + hw->rss_ind_tbl_size); if (ret) goto conf_err; } @@ -424,7 +443,7 @@ hns3_dev_rss_hash_update(struct rte_eth_dev *dev, ret = -EINVAL; goto conf_err; } - ret = hns3_set_rss_algo_key(hw, key); + ret = hns3_rss_set_algo_key(hw, key); if (ret) goto conf_err; } @@ -486,30 +505,29 @@ hns3_dev_rss_reta_update(struct rte_eth_dev *dev, struct hns3_adapter *hns = dev->data->dev_private; struct hns3_hw *hw = &hns->hw; struct hns3_rss_conf *rss_cfg = &hw->rss_info; - uint16_t i, indir_size = HNS3_RSS_IND_TBL_SIZE; /* Table size is 512 */ - uint8_t indirection_tbl[HNS3_RSS_IND_TBL_SIZE]; - uint16_t idx, shift, allow_rss_queues; + uint16_t indirection_tbl[HNS3_RSS_IND_TBL_SIZE_MAX]; + uint16_t idx, shift; + uint16_t i; int ret; - if (reta_size != indir_size || reta_size > ETH_RSS_RETA_SIZE_512) { + if (reta_size != hw->rss_ind_tbl_size) { hns3_err(hw, "The size of hash lookup table configured (%u)" "doesn't match the number hardware can supported" - "(%u)", reta_size, indir_size); + "(%u)", reta_size, hw->rss_ind_tbl_size); return -EINVAL; } rte_spinlock_lock(&hw->lock); memcpy(indirection_tbl, rss_cfg->rss_indirection_tbl, - HNS3_RSS_IND_TBL_SIZE); - allow_rss_queues = RTE_MIN(dev->data->nb_rx_queues, hw->rss_size_max); + sizeof(rss_cfg->rss_indirection_tbl)); for (i = 0; i < reta_size; i++) { idx = i / RTE_RETA_GROUP_SIZE; shift = i % RTE_RETA_GROUP_SIZE; - if (reta_conf[idx].reta[shift] >= allow_rss_queues) { + if (reta_conf[idx].reta[shift] >= hw->alloc_rss_size) { rte_spinlock_unlock(&hw->lock); - hns3_err(hw, "Invalid queue id(%u) to be set in " - "redirection table, max number of rss " - "queues: %u", reta_conf[idx].reta[shift], - allow_rss_queues); + hns3_err(hw, "queue id(%u) set to redirection table " + "exceeds queue number(%u) allocated to a TC", + reta_conf[idx].reta[shift], + hw->alloc_rss_size); return -EINVAL; } @@ -518,7 +536,7 @@ hns3_dev_rss_reta_update(struct rte_eth_dev *dev, } ret = hns3_set_rss_indir_table(hw, indirection_tbl, - HNS3_RSS_IND_TBL_SIZE); + hw->rss_ind_tbl_size); rte_spinlock_unlock(&hw->lock); return ret; @@ -543,13 +561,13 @@ hns3_dev_rss_reta_query(struct rte_eth_dev *dev, struct hns3_adapter *hns = dev->data->dev_private; struct hns3_hw *hw = &hns->hw; struct hns3_rss_conf *rss_cfg = &hw->rss_info; - uint16_t i, indir_size = HNS3_RSS_IND_TBL_SIZE; /* Table size is 512 */ uint16_t idx, shift; + uint16_t i; - if (reta_size != indir_size || reta_size > ETH_RSS_RETA_SIZE_512) { + if (reta_size != hw->rss_ind_tbl_size) { hns3_err(hw, "The size of hash lookup table configured (%u)" " doesn't match the number hardware can supported" - "(%u)", reta_size, indir_size); + "(%u)", reta_size, hw->rss_ind_tbl_size); return -EINVAL; } rte_spinlock_lock(&hw->lock); @@ -598,6 +616,8 @@ hns3_set_rss_tc_mode(struct hns3_hw *hw) hns3_set_bit(mode, HNS3_RSS_TC_VALID_B, (tc_valid[i] & 0x1)); hns3_set_field(mode, HNS3_RSS_TC_SIZE_M, HNS3_RSS_TC_SIZE_S, tc_size[i]); + if (tc_size[i] >> HNS3_RSS_TC_SIZE_MSB_OFFSET > 0) + hns3_set_bit(mode, HNS3_RSS_TC_SIZE_MSB_S, 1); hns3_set_field(mode, HNS3_RSS_TC_OFFSET_M, HNS3_RSS_TC_OFFSET_S, tc_offset[i]); @@ -613,16 +633,11 @@ hns3_set_rss_tc_mode(struct hns3_hw *hw) static void hns3_rss_tuple_uninit(struct hns3_hw *hw) { - struct hns3_rss_input_tuple_cmd *req; struct hns3_cmd_desc desc; int ret; hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_RSS_INPUT_TUPLE, false); - req = (struct hns3_rss_input_tuple_cmd *)desc.data; - - memset(req, 0, sizeof(struct hns3_rss_tuple_cfg)); - ret = hns3_cmd_send(hw, &desc, 1); if (ret) { hns3_err(hw, "RSS uninit tuple failed %d", ret); @@ -634,7 +649,7 @@ hns3_rss_tuple_uninit(struct hns3_hw *hw) * Set the default rss configuration in the init of driver. */ void -hns3_set_default_rss_args(struct hns3_hw *hw) +hns3_rss_set_default_args(struct hns3_hw *hw) { struct hns3_rss_conf *rss_cfg = &hw->rss_info; uint16_t queue_num = hw->alloc_rss_size; @@ -647,7 +662,7 @@ hns3_set_default_rss_args(struct hns3_hw *hw) memcpy(rss_cfg->key, hns3_hash_key, HNS3_RSS_KEY_SIZE); /* Initialize RSS indirection table */ - for (i = 0; i < HNS3_RSS_IND_TBL_SIZE; i++) + for (i = 0; i < hw->rss_ind_tbl_size; i++) rss_cfg->rss_indirection_tbl[i] = i % queue_num; } @@ -681,12 +696,12 @@ hns3_config_rss(struct hns3_adapter *hns) hns3_rss_uninit(hns); /* Configure RSS hash algorithm and hash key offset */ - ret = hns3_set_rss_algo_key(hw, hash_key); + ret = hns3_rss_set_algo_key(hw, hash_key); if (ret) return ret; /* Configure the tuple selection for RSS hash input */ - ret = hns3_set_rss_input_tuple(hw); + ret = hns3_rss_set_input_tuple(hw); if (ret) return ret; @@ -696,7 +711,7 @@ hns3_config_rss(struct hns3_adapter *hns) */ if (((uint32_t)mq_mode & ETH_MQ_RX_RSS_FLAG)) { ret = hns3_set_rss_indir_table(hw, rss_cfg->rss_indirection_tbl, - HNS3_RSS_IND_TBL_SIZE); + hw->rss_ind_tbl_size); if (ret) goto rss_tuple_uninit; }