[AMD Public Use]

Thank you Andrew, will update these in v2 patch. 

-----Original Message-----
From: Andrew Rybchenko <arybche...@solarflare.com> 
Sent: Tuesday, March 24, 2020 3:55 PM
To: Namburu, Chandu-babu <cha...@amd.com>; dev@dpdk.org
Cc: Kumar, Ravi1 <ravi1.ku...@amd.com>; Somalapuram, Amaranath 
<amaranath.somalapu...@amd.com>
Subject: Re: [dpdk-dev] [PATCH v1] net/axgbe: add RSS reta/hash query and update

On 3/24/20 1:17 PM, Namburu, Chandu-babu wrote:
> [AMD Official Use Only - Internal Distribution Only]
> 
> RSS functionality is already supported by AXGBE and it is updated in 
> doc/guides/nics/features/axgbe.ini accordingly. 
> This patch adds support to update RSS Hash key and RETA.

What about (see doc/guides/nics/features/default.ini)
RSS key update       =
RSS reta update      =

> Regards,
> Chandu
> -----Original Message-----
> From: Andrew Rybchenko <arybche...@solarflare.com>
> Sent: Tuesday, March 24, 2020 3:25 PM
> To: Namburu, Chandu-babu <cha...@amd.com>; dev@dpdk.org
> Cc: Kumar, Ravi1 <ravi1.ku...@amd.com>; Somalapuram, Amaranath 
> <amaranath.somalapu...@amd.com>
> Subject: Re: [dpdk-dev] [PATCH v1] net/axgbe: add RSS reta/hash query 
> and update
> 
> On 3/20/20 2:29 PM, cha...@amd.com wrote:
>> From: Chandu Babu N <cha...@amd.com>
>>
>> add support for RSS ethdev_ops reta_update, reta_query 
>> rss_hash_update, rss_hash_conf_get
> 
> The patch should update doc/guides/nics/features/axgbe.ini to advertise 
> corresponding features.
> 
>>
>> Signed-off-by: Chandu Babu N <cha...@amd.com>
>> ---
>>  drivers/net/axgbe/axgbe_dev.c    |   5 +-
>>  drivers/net/axgbe/axgbe_ethdev.c | 146 +++++++++++++++++++++++++++++++
>>  drivers/net/axgbe/axgbe_ethdev.h |   3 +
>>  3 files changed, 152 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/net/axgbe/axgbe_dev.c 
>> b/drivers/net/axgbe/axgbe_dev.c index 5f0f19592..af62eae3b 100644
>> --- a/drivers/net/axgbe/axgbe_dev.c
>> +++ b/drivers/net/axgbe/axgbe_dev.c
>> @@ -614,7 +614,7 @@ static int axgbe_write_rss_reg(struct axgbe_port *pdata, 
>> unsigned int type,
>>      return -EBUSY;
>>  }
>>  
>> -static int axgbe_write_rss_hash_key(struct axgbe_port *pdata)
>> +int axgbe_write_rss_hash_key(struct axgbe_port *pdata)
>>  {
>>      struct rte_eth_rss_conf *rss_conf;
>>      unsigned int key_regs = sizeof(pdata->rss_key) / sizeof(u32); @@
>> -638,7 +638,7 @@ static int axgbe_write_rss_hash_key(struct axgbe_port 
>> *pdata)
>>      return 0;
>>  }
>>  
>> -static int axgbe_write_rss_lookup_table(struct axgbe_port *pdata)
>> +int axgbe_write_rss_lookup_table(struct axgbe_port *pdata)
>>  {
>>      unsigned int i;
>>      int ret;
>> @@ -683,6 +683,7 @@ static void axgbe_rss_options(struct axgbe_port *pdata)
>>      uint64_t rss_hf;
>>  
>>      rss_conf = &pdata->eth_dev->data->dev_conf.rx_adv_conf.rss_conf;
>> +    pdata->rss_hf = rss_conf->rss_hf;
>>      rss_hf = rss_conf->rss_hf;
>>  
>>      if (rss_hf & (ETH_RSS_IPV4 | ETH_RSS_IPV6)) diff --git 
>> a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c
>> index 867058845..f42bb7a0d 100644
>> --- a/drivers/net/axgbe/axgbe_ethdev.c
>> +++ b/drivers/net/axgbe/axgbe_ethdev.c
>> @@ -60,6 +60,18 @@ axgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev,
>>                               const uint64_t *ids,
>>                               unsigned int size);
>>  static int axgbe_dev_xstats_reset(struct rte_eth_dev *dev);
>> +static int
>> +axgbe_dev_rss_reta_update(struct rte_eth_dev *dev,
>> +                      struct rte_eth_rss_reta_entry64 *reta_conf,
>> +                      uint16_t reta_size);
>> +static int
>> +axgbe_dev_rss_reta_query(struct rte_eth_dev *dev,
>> +                     struct rte_eth_rss_reta_entry64 *reta_conf,
>> +                     uint16_t reta_size);
> 
> It looks like style is inconsistent for above to declarations vs declarations 
> around.
> 
>> +static int axgbe_dev_rss_hash_update(struct rte_eth_dev *dev,
>> +                                 struct rte_eth_rss_conf *rss_conf); static 
>> int 
>> +axgbe_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
>> +                                   struct rte_eth_rss_conf *rss_conf);
>>  static int  axgbe_dev_info_get(struct rte_eth_dev *dev,
>>                             struct rte_eth_dev_info *dev_info);  static int 
>> axgbe_flow_ctrl_get(struct rte_eth_dev *dev, @@ -201,6 +213,10 @@ 
>> static const struct eth_dev_ops axgbe_eth_dev_ops = {
>>      .xstats_get_names     = axgbe_dev_xstats_get_names,
>>      .xstats_get_names_by_id = axgbe_dev_xstats_get_names_by_id,
>>      .xstats_get_by_id     = axgbe_dev_xstats_get_by_id,
>> +    .reta_update          = axgbe_dev_rss_reta_update,
>> +    .reta_query           = axgbe_dev_rss_reta_query,
>> +    .rss_hash_update      = axgbe_dev_rss_hash_update,
>> +    .rss_hash_conf_get    = axgbe_dev_rss_hash_conf_get,
>>      .dev_infos_get        = axgbe_dev_info_get,
>>      .rx_queue_setup       = axgbe_dev_rx_queue_setup,
>>      .rx_queue_release     = axgbe_dev_rx_queue_release,
>> @@ -450,6 +466,136 @@ axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct 
>> rte_ether_addr *mac_addr,
>>      return 0;
>>  }
>>  
>> +static int
>> +axgbe_dev_rss_reta_update(struct rte_eth_dev *dev,
>> +                      struct rte_eth_rss_reta_entry64 *reta_conf,
>> +                      uint16_t reta_size)
>> +{
>> +    struct axgbe_port *pdata = dev->data->dev_private;
>> +    unsigned int i, idx, shift;
>> +    int ret;
>> +
>> +    if (!pdata->rss_enable) {
>> +            PMD_DRV_LOG(ERR, "RSS not enabled\n");
>> +            return -ENOTSUP;
>> +    }
>> +
>> +    if (!reta_size || reta_size > AXGBE_RSS_MAX_TABLE_SIZE) {
> 
> DPDK style guide [1] says to use comparison to 0 instead of !
> 
> [1]
> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdoc.
> dpdk.org%2Fguides%2Fcontributing%2Fcoding_style.html%23c-statement-sty
> le-and-conventions&amp;data=02%7C01%7Cchandu%40amd.com%7C91ae3be800694
> 09de13308d7cfdd91e0%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C63720
> 6422857685216&amp;sdata=kr9UNBwAGI3ns4YB%2B5gJ4YUOuv%2FP6G6LmSfNH%2BYH
> uv0%3D&amp;reserved=0
> 
>> +            PMD_DRV_LOG(ERR, "reta_size %d is not supported\n", reta_size);
>> +            return -EINVAL;
>> +    }
>> +
>> +    for (i = 0; i < reta_size; i++) {
>> +            idx = i / RTE_RETA_GROUP_SIZE;
>> +            shift = i % RTE_RETA_GROUP_SIZE;
>> +            if ((reta_conf[idx].mask & (1ULL << shift)) == 0)
>> +                    continue;
>> +            pdata->rss_table[i] = reta_conf[idx].reta[shift];
>> +    }
>> +
>> +    /* Program the lookup table */
>> +    ret = axgbe_write_rss_lookup_table(pdata);
>> +    return ret;
>> +}
>> +
>> +static int
>> +axgbe_dev_rss_reta_query(struct rte_eth_dev *dev,
>> +                     struct rte_eth_rss_reta_entry64 *reta_conf,
>> +                     uint16_t reta_size)
>> +{
>> +    struct axgbe_port *pdata = dev->data->dev_private;
>> +    unsigned int i, idx, shift;
>> +
>> +    if (!pdata->rss_enable) {
>> +            PMD_DRV_LOG(ERR, "RSS not enabled\n");
>> +            return -ENOTSUP;
>> +    }
>> +
>> +    if (!reta_size || reta_size > AXGBE_RSS_MAX_TABLE_SIZE) {
> 
> Here too
> 
>> +            PMD_DRV_LOG(ERR, "reta_size %d is not supported\n", reta_size);
>> +            return -EINVAL;
>> +    }
>> +
>> +    for (i = 0; i < reta_size; i++) {
>> +            idx = i / RTE_RETA_GROUP_SIZE;
>> +            shift = i % RTE_RETA_GROUP_SIZE;
>> +            if ((reta_conf[idx].mask & (1ULL << shift)) == 0)
>> +                    continue;
>> +            reta_conf[idx].reta[shift] = pdata->rss_table[i];
>> +    }
>> +    return 0;
>> +}
>> +
>> +static int
>> +axgbe_dev_rss_hash_update(struct rte_eth_dev *dev,
>> +                      struct rte_eth_rss_conf *rss_conf) {
>> +    struct axgbe_port *pdata = dev->data->dev_private;
>> +    int ret;
>> +
>> +    if (!pdata->rss_enable) {
>> +            PMD_DRV_LOG(ERR, "RSS not enabled\n");
>> +            return -ENOTSUP;
>> +    }
>> +
>> +    if (!rss_conf) {
> 
> Here too. It should comparison vs NULL.
> 
>> +            PMD_DRV_LOG(ERR, "rss_conf value isn't valid\n");
>> +            return -EINVAL;
>> +    }
>> +
>> +    if (rss_conf->rss_key &&
> 
> and here
> 
>> +        rss_conf->rss_key_len == AXGBE_RSS_HASH_KEY_SIZE) {
>> +            rte_memcpy(pdata->rss_key, rss_conf->rss_key,
>> +                   AXGBE_RSS_HASH_KEY_SIZE);
>> +            /* Program the hash key */
>> +            ret = axgbe_write_rss_hash_key(pdata);
>> +            if (ret)
> 
> and here
> 
>> +                    return ret;
>> +    }
>> +
>> +    pdata->rss_hf = rss_conf->rss_hf & AXGBE_RSS_OFFLOAD;
>> +
>> +    if (pdata->rss_hf & (ETH_RSS_IPV4 | ETH_RSS_IPV6))
>> +            AXGMAC_SET_BITS(pdata->rss_options, MAC_RSSCR, IP2TE, 1);
>> +    if (pdata->rss_hf &
>> +        (ETH_RSS_NONFRAG_IPV4_TCP | ETH_RSS_NONFRAG_IPV6_TCP))
>> +            AXGMAC_SET_BITS(pdata->rss_options, MAC_RSSCR, TCP4TE, 1);
>> +    if (pdata->rss_hf &
>> +        (ETH_RSS_NONFRAG_IPV4_UDP | ETH_RSS_NONFRAG_IPV6_UDP))
>> +            AXGMAC_SET_BITS(pdata->rss_options, MAC_RSSCR, UDP4TE, 1);
>> +
>> +    /* Set the RSS options */
>> +    AXGMAC_IOWRITE(pdata, MAC_RSSCR, pdata->rss_options);
>> +
>> +    return 0;
>> +}
>> +
>> +static int
>> +axgbe_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
>> +                        struct rte_eth_rss_conf *rss_conf) {
>> +    struct axgbe_port *pdata = dev->data->dev_private;
>> +
>> +    if (!pdata->rss_enable) {
>> +            PMD_DRV_LOG(ERR, "RSS not enabled\n");
>> +            return -ENOTSUP;
>> +    }
>> +
>> +    if (!rss_conf) {
> 
> and here
> 
>> +            PMD_DRV_LOG(ERR, "rss_conf value isn't valid\n");
>> +            return -EINVAL;
>> +    }
>> +
>> +    if (rss_conf->rss_key &&
> 
> and here
> 
>> +        rss_conf->rss_key_len <= AXGBE_RSS_HASH_KEY_SIZE) {
>> +            rte_memcpy(rss_conf->rss_key, pdata->rss_key,
>> +                   AXGBE_RSS_HASH_KEY_SIZE);
>> +    }
>> +    rss_conf->rss_key_len = AXGBE_RSS_HASH_KEY_SIZE;
>> +    rss_conf->rss_hf = pdata->rss_hf;
>> +    return 0;
>> +}
>> +
>>  static void
>>  axgbe_dev_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index)  
>> { diff --git a/drivers/net/axgbe/axgbe_ethdev.h
>> b/drivers/net/axgbe/axgbe_ethdev.h
>> index f10ec4a40..cedce5af6 100644
>> --- a/drivers/net/axgbe/axgbe_ethdev.h
>> +++ b/drivers/net/axgbe/axgbe_ethdev.h
>> @@ -594,6 +594,7 @@ struct axgbe_port {
>>      uint32_t rss_table[AXGBE_RSS_MAX_TABLE_SIZE];
>>      uint32_t rss_options;
>>      int rss_enable;
>> +    uint64_t rss_hf;
>>  
>>      /* Hardware features of the device */
>>      struct axgbe_hw_features hw_feat;
>> @@ -653,5 +654,7 @@ void axgbe_init_function_ptrs_i2c(struct
>> axgbe_i2c_if *i2c_if);  void axgbe_set_mac_addn_addr(struct axgbe_port 
>> *pdata, u8 *addr,
>>                           uint32_t index);
>>  void axgbe_set_mac_hash_table(struct axgbe_port *pdata, u8 *addr, 
>> bool add);
>> +int axgbe_write_rss_lookup_table(struct axgbe_port *pdata); int 
>> +axgbe_write_rss_hash_key(struct axgbe_port *pdata);
>>  
>>  #endif /* RTE_ETH_AXGBE_H_ */
>>

Reply via email to