From: "Namburu, Chandu-babu" <chandu@amd.com>
To: Andrew Rybchenko <arybchenko@solarflare.com>,
"dev@dpdk.org" <dev@dpdk.org>
Cc: "Kumar, Ravi1" <Ravi1.Kumar@amd.com>,
"Somalapuram, Amaranath" <Amaranath.Somalapuram@amd.com>
Subject: Re: [dpdk-dev] [PATCH v1] net/axgbe: add RSS reta/hash query and update
Date: Tue, 24 Mar 2020 10:17:53 +0000 [thread overview]
Message-ID: <MN2PR12MB3021608379CD0EC9027F4717C8F10@MN2PR12MB3021.namprd12.prod.outlook.com> (raw)
In-Reply-To: <7eb245ed-5920-5e05-cc1c-63a5e92c8a04@solarflare.com>
[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.
Regards,
Chandu
-----Original Message-----
From: Andrew Rybchenko <arybchenko@solarflare.com>
Sent: Tuesday, March 24, 2020 3:25 PM
To: Namburu, Chandu-babu <chandu@amd.com>; dev@dpdk.org
Cc: Kumar, Ravi1 <Ravi1.Kumar@amd.com>; Somalapuram, Amaranath <Amaranath.Somalapuram@amd.com>
Subject: Re: [dpdk-dev] [PATCH v1] net/axgbe: add RSS reta/hash query and update
On 3/20/20 2:29 PM, chandu@amd.com wrote:
> From: Chandu Babu N <chandu@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 <chandu@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-style-and-conventions&data=02%7C01%7Cchandu%40amd.com%7C9eb51750daa24b1703cf08d7cfd96a2b%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637206405006771688&sdata=LNbxA2nLRb3HaCoae%2B%2FBh1%2FK41ZJiC4tuLjiYOPYr2E%3D&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_ */
>
next prev parent reply other threads:[~2020-03-24 10:17 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-20 11:29 chandu
2020-03-21 11:40 ` Kumar, Ravi1
2020-03-24 9:54 ` Andrew Rybchenko
2020-03-24 10:17 ` Namburu, Chandu-babu [this message]
2020-03-24 10:24 ` Andrew Rybchenko
2020-03-25 3:25 ` Namburu, Chandu-babu
2020-05-29 11:49 ` [dpdk-dev] [PATCH v2] " chandu
2020-06-04 5:27 ` Somalapuram, Amaranath
2020-06-04 12:06 ` Ferruh Yigit
2020-06-05 14:49 ` Ferruh Yigit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=MN2PR12MB3021608379CD0EC9027F4717C8F10@MN2PR12MB3021.namprd12.prod.outlook.com \
--to=chandu@amd.com \
--cc=Amaranath.Somalapuram@amd.com \
--cc=Ravi1.Kumar@amd.com \
--cc=arybchenko@solarflare.com \
--cc=dev@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).