net/axgbe: add RSS reta/hash query and update
PATCH 1/1 net/axgbe: add RSS reta/hash query and update
From: Chandu Babu N <[email protected]>
add support for RSS ethdev_ops reta_update, reta_query rss_hash_update, rss_hash_conf_get
--- 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(-)
drivers/net/axgbe/axgbe_dev.c +3 -2
@@ -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 ))
drivers/net/axgbe/axgbe_ethdev.c +146 -0
164 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.h +3 -0
@@ -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_ */
Signature · 1 line
2.17.1
[AMD Public Use]
Quoted 225 lines
From: Chandu Babu N <[email protected]>
add support for RSS
ethdev_opsreta_update,reta_queryrss_hash_update,rss_hash_conf_getSigned-off-by Chandu Babu N <[email protected]>---
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(-)drivers/net/axgbe/axgbe_dev.c +1
-1@@ -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; }drivers/net/axgbe/axgbe_dev.c +1
-1-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;drivers/net/axgbe/axgbe_dev.c +1
-0@@ -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.cindex 867058845..f42bb7a0d 100644
drivers/net/axgbe/axgbe_ethdev.c +12
-0@@ -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); +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,drivers/net/axgbe/axgbe_ethdev.c +4
-0+ .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,drivers/net/axgbe/axgbe_ethdev.c +128
-0@@ -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 ) { +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 ) { +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) { +PMD_DRV_LOG (ERR ,"rss_conf value isn't valid\n" ); +return -EINVAL ; + } + +if (rss_conf->rss_key && + 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) +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) { +PMD_DRV_LOG (ERR ,"rss_conf value isn't valid\n" ); +return -EINVAL ; + } + +if (rss_conf->rss_key && + 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 --gita/drivers/net/axgbe/axgbe_ethdev.hb/drivers/net/axgbe/axgbe_ethdev.hindexf10ec4a40..cedce5af6100644drivers/net/axgbe/axgbe_ethdev.h +3
-1@@ -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_ */ --2.17.1
Quoted 4 lines · On 3/20/20 2:29 PM, [email protected] wrote:
From: Chandu Babu N <[email protected]>
add support for RSS
ethdev_opsreta_update,reta_queryrss_hash_update,rss_hash_conf_get
The patch should update doc/guides/nics/features/axgbe.ini to advertise corresponding features.
Quoted 44 lines
Signed-off-by Chandu Babu N <[email protected]>--- 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(-)drivers/net/axgbe/axgbe_dev.c +3
-2@@ -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 ))drivers/net/axgbe/axgbe_ethdev.c +0
-0@@ -60,6 +60,18 @@ axgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, · line 70
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +8
-0unsigned 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.
Quoted 27 lines
drivers/net/axgbe/axgbe_ethdev.c +13
-0+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) +{
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 483
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+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://doc.dpdk.org/guides/contributing/coding_style.html#c-statement-style-and-conventions
Quoted 21 lines
drivers/net/axgbe/axgbe_ethdev.c +21
-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)
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 514
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+{ +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
Quoted 17 lines
drivers/net/axgbe/axgbe_ethdev.c +17
-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 ; + 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)
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 541
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+{ +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.
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 546
Quoted 5 lines
drivers/net/axgbe/axgbe_ethdev.c +5
-0+PMD_DRV_LOG (ERR ,"rss_conf value isn't valid\n" ); +return -EINVAL ; + } + + if (rss_conf->rss_key &&
and here
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 552
Quoted 6 lines
drivers/net/axgbe/axgbe_ethdev.c +6
-0+ 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
Quoted 22 lines
drivers/net/axgbe/axgbe_ethdev.c +22
-0+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,
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 584
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+ 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
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 546
Quoted 5 lines
drivers/net/axgbe/axgbe_ethdev.c +5
-0+PMD_DRV_LOG (ERR ,"rss_conf value isn't valid\n" ); +return -EINVAL ; + } + + if (rss_conf->rss_key &&
and here
Quoted 33 lines
drivers/net/axgbe/axgbe_ethdev.c +9
-0+ 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) {drivers/net/axgbe/axgbe_ethdev.h +3
-0@@ -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_ */
[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 <[email protected]>
Sent: Tuesday, March 24, 2020 3:25 PM
To: Namburu, Chandu-babu <[email protected]>; [email protected]
Cc: Kumar, Ravi1 <[email protected]>; Somalapuram, Amaranath <[email protected]>
Subject: Re: [dpdk-dev] [PATCH v1] net/axgbe: add RSS reta/hash query and update
Quoted 4 lines · On 3/20/20 2:29 PM, [email protected] wrote:
From: Chandu Babu N <[email protected]>
add support for RSS
ethdev_opsreta_update,reta_queryrss_hash_update,rss_hash_conf_get
The patch should update doc/guides/nics/features/axgbe.ini to advertise corresponding features.
Quoted 44 lines
Signed-off-by Chandu Babu N <[email protected]>--- 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(-)(quoted diff) +0
-0
b/drivers/net/axgbe/axgbe_dev.cindex5f0f19592..af62eae3b100644drivers/net/axgbe/axgbe_dev.c +3
-3@@ -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.cb/drivers/net/axgbe/axgbe_ethdev.cindex 867058845..f42bb7a0d 100644drivers/net/axgbe/axgbe_ethdev.c +0
-0@@ -60,6 +60,18 @@ axgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, · line 70
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +8
-0unsigned 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.
Quoted 27 lines
drivers/net/axgbe/axgbe_ethdev.c +4
-0+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 intaxgbe_flow_ctrl_get(struct
rte_eth_dev*dev, @@ -201,6 +213,10 @@ static const structeth_dev_opsaxgbe_eth_dev_ops= {drivers/net/axgbe/axgbe_ethdev.c +9
-0.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) +{
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 483
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+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 !
Quoted 21 lines
drivers/net/axgbe/axgbe_ethdev.c +21
-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)
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 514
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+{ +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
Quoted 16 lines
drivers/net/axgbe/axgbe_ethdev.c +16
-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 ; + reta_conf[idx].reta[shift] = pdata->rss_table[i]; + } +return 0 ; +} + +static int +axgbe_dev_rss_hash_update(struct rte_eth_dev *dev,
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 541
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+ 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.
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 546
Quoted 5 lines
drivers/net/axgbe/axgbe_ethdev.c +5
-0+PMD_DRV_LOG (ERR ,"rss_conf value isn't valid\n" ); +return -EINVAL ; + } + + if (rss_conf->rss_key &&
and here
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 552
Quoted 6 lines
drivers/net/axgbe/axgbe_ethdev.c +6
-0+ 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
Quoted 21 lines
drivers/net/axgbe/axgbe_ethdev.c +21
-0+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
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 584
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+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
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 546
Quoted 5 lines
drivers/net/axgbe/axgbe_ethdev.c +5
-0+PMD_DRV_LOG (ERR ,"rss_conf value isn't valid\n" ); +return -EINVAL ; + } + + if (rss_conf->rss_key &&
and here
Quoted 34 lines
drivers/net/axgbe/axgbe_ethdev.c +9
-0+ 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) {drivers/net/axgbe/axgbe_ethdev.h +3
-0@@ -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_*/
Quoted 4 lines · Chandu-babu
[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 =
Quoted 273 lines
Regards,
Chandu
-----Original Message-----
From: Andrew Rybchenko <[email protected]>
Sent: Tuesday, March 24, 2020 3:25 PM
To: Namburu, Chandu-babu <[email protected]>; [email protected]
Cc: Kumar, Ravi1 <[email protected]>; Somalapuram, Amaranath <[email protected]>
Subject: Re: [dpdk-dev] [PATCH v1] net/axgbe: add RSS reta/hash query and updateQuoted 4 lines · On 3/20/20 2:29 PM, [email protected] wrote:
From: Chandu Babu N <[email protected]>
add support for RSS
ethdev_opsreta_update,reta_queryrss_hash_update,rss_hash_conf_getThe patch should update doc/guides/nics/features/axgbe.ini to advertise corresponding features.
Quoted 44 lines
Signed-off-by Chandu Babu N <[email protected]>--- 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(-)(quoted diff) +0
-0
b/drivers/net/axgbe/axgbe_dev.cindex5f0f19592..af62eae3b100644drivers/net/axgbe/axgbe_dev.c +3
-3@@ -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.cb/drivers/net/axgbe/axgbe_ethdev.cindex 867058845..f42bb7a0d 100644drivers/net/axgbe/axgbe_ethdev.c +0
-0@@ -60,6 +60,18 @@ axgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, const uint64_t *ids,drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, · line 70
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +8
-0unsigned 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.
Quoted 27 lines
drivers/net/axgbe/axgbe_ethdev.c +4
-0+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 intaxgbe_flow_ctrl_get(struct
rte_eth_dev*dev, @@ -201,6 +213,10 @@ static const structeth_dev_opsaxgbe_eth_dev_ops= {drivers/net/axgbe/axgbe_ethdev.c +9
-0.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) +{drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 483
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+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 !
Quoted 21 lines
drivers/net/axgbe/axgbe_ethdev.c +21
-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)drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 514
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+{ +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
Quoted 16 lines
drivers/net/axgbe/axgbe_ethdev.c +16
-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 ; + reta_conf[idx].reta[shift] = pdata->rss_table[i]; + } +return 0 ; +} + +static int +axgbe_dev_rss_hash_update(struct rte_eth_dev *dev,drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 541
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+ 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.
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 546
Quoted 5 lines
drivers/net/axgbe/axgbe_ethdev.c +5
-0+PMD_DRV_LOG (ERR ,"rss_conf value isn't valid\n" ); +return -EINVAL ; + } + + if (rss_conf->rss_key &&and here
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 552
Quoted 6 lines
drivers/net/axgbe/axgbe_ethdev.c +6
-0+ 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
Quoted 21 lines
drivers/net/axgbe/axgbe_ethdev.c +21
-0+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 intdrivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 584
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+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
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 546
Quoted 5 lines
drivers/net/axgbe/axgbe_ethdev.c +5
-0+PMD_DRV_LOG (ERR ,"rss_conf value isn't valid\n" ); +return -EINVAL ; + } + + if (rss_conf->rss_key &&and here
Quoted 34 lines
drivers/net/axgbe/axgbe_ethdev.c +9
-0+ 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) {drivers/net/axgbe/axgbe_ethdev.h +3
-0@@ -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_*/
[AMD Public Use]
Thank you Andrew, will update these in v2 patch.
-----Original Message-----
From: Andrew Rybchenko <[email protected]>
Sent: Tuesday, March 24, 2020 3:55 PM
To: Namburu, Chandu-babu <[email protected]>; [email protected]
Cc: Kumar, Ravi1 <[email protected]>; Somalapuram, Amaranath <[email protected]>
Subject: Re: [dpdk-dev] [PATCH v1] net/axgbe: add RSS reta/hash query and update
Quoted 4 lines · Chandu-babu
[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 =
Quoted 280 lines
Regards,
Chandu
-----Original Message-----
From: Andrew Rybchenko <[email protected]>
Sent: Tuesday, March 24, 2020 3:25 PM
To: Namburu, Chandu-babu <[email protected]>; [email protected]
Cc: Kumar, Ravi1 <[email protected]>; Somalapuram, Amaranath <[email protected]>
Subject: Re: [dpdk-dev] [PATCH v1] net/axgbe: add RSS reta/hash query and updateQuoted 4 lines · On 3/20/20 2:29 PM, [email protected] wrote:
From: Chandu Babu N <[email protected]>
add support for RSS
ethdev_opsreta_update,reta_queryrss_hash_update,rss_hash_conf_getThe patch should update doc/guides/nics/features/axgbe.ini to advertise corresponding features.
Quoted 44 lines
Signed-off-by Chandu Babu N <[email protected]>--- 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(-)(quoted diff) +0
-0
b/drivers/net/axgbe/axgbe_dev.cindex5f0f19592..af62eae3b100644drivers/net/axgbe/axgbe_dev.c +3
-3@@ -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.cb/drivers/net/axgbe/axgbe_ethdev.cindex 867058845..f42bb7a0d 100644drivers/net/axgbe/axgbe_ethdev.c +0
-0@@ -60,6 +60,18 @@ axgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, const uint64_t *ids,drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_xstats_get_names_by_id(struct rte_eth_dev *dev, · line 70
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +8
-0unsigned 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.
Quoted 27 lines
drivers/net/axgbe/axgbe_ethdev.c +4
-0+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 intaxgbe_flow_ctrl_get(struct
rte_eth_dev*dev, @@ -201,6 +213,10 @@ static const structeth_dev_opsaxgbe_eth_dev_ops= {drivers/net/axgbe/axgbe_ethdev.c +9
-0.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) +{drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 483
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+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&data=02%7C01%7Cchandu%40amd.com%7C91ae3be800694 09de13308d7cfdd91e0%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C63720 6422857685216&sdata=kr9UNBwAGI3ns4YB%2B5gJ4YUOuv%2FP6G6LmSfNH%2BYH uv0%3D&reserved=0Quoted 21 lines
drivers/net/axgbe/axgbe_ethdev.c +21
-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)drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 514
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+{ +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
Quoted 16 lines
drivers/net/axgbe/axgbe_ethdev.c +16
-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 ; + reta_conf[idx].reta[shift] = pdata->rss_table[i]; + } +return 0 ; +} + +static int +axgbe_dev_rss_hash_update(struct rte_eth_dev *dev,drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 541
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+ 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.
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 546
Quoted 5 lines
drivers/net/axgbe/axgbe_ethdev.c +5
-0+PMD_DRV_LOG (ERR ,"rss_conf value isn't valid\n" ); +return -EINVAL ; + } + + if (rss_conf->rss_key &&and here
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 552
Quoted 6 lines
drivers/net/axgbe/axgbe_ethdev.c +6
-0+ 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
Quoted 21 lines
drivers/net/axgbe/axgbe_ethdev.c +21
-0+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 intdrivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 584
Quoted 10 lines
drivers/net/axgbe/axgbe_ethdev.c +10
-0+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
drivers/net/axgbe/axgbe_ethdev.c axgbe_dev_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr, · line 546
Quoted 5 lines
drivers/net/axgbe/axgbe_ethdev.c +5
-0+PMD_DRV_LOG (ERR ,"rss_conf value isn't valid\n" ); +return -EINVAL ; + } + + if (rss_conf->rss_key &&and here
Quoted 34 lines
drivers/net/axgbe/axgbe_ethdev.c +9
-0+ 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.hb/drivers/net/axgbe/axgbe_ethdev.h
indexf10ec4a40..cedce5af6100644drivers/net/axgbe/axgbe_ethdev.h +3
-0@@ -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_*/
PATCH v2 1/1 net/axgbe: add RSS reta/hash query and update
In reply to [email protected]From: Chandu Babu N <[email protected]>
add support for RSS reta/hash query and update function
v2:
modification as per Andrew Rybchenko review comments
--- doc/guides/nics/features/axgbe.ini | 2 + drivers/net/axgbe/axgbe_dev.c | 5 +- drivers/net/axgbe/axgbe_ethdev.c | 144 +++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.h | 3 + 4 files changed, 152 insertions(+), 2 deletions(-)
doc/guides/nics/features/axgbe.ini +2 -0
@@ -11,6 +11,8 @@ Scattered Rx = Y Promiscuous mode = Y Allmulticast mode = Y RSS hash = Y +RSS key update = Y +RSS reta update = Y CRC offload = Y L3 checksum offload = Y L4 checksum offload = Y
drivers/net/axgbe/axgbe_dev.c +3 -2
@@ -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 ))
drivers/net/axgbe/axgbe_ethdev.c +144 -0
162 lines not on this page · raw message
drivers/net/axgbe/axgbe_ethdev.h +3 -0
@@ -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_ */
Signature · 1 line
2.17.1
[AMD Official Use Only - Internal Distribution Only]
For series,
-----Original Message-----
From: Namburu, Chandu-babu <[email protected]>
Sent: Friday, May 29, 2020 5:19 PM
To: [email protected]
Cc: Somalapuram, Amaranath <[email protected]>
Subject: [PATCH v2] net/axgbe: add RSS reta/hash query and update
From: Chandu Babu N <[email protected]>
add support for RSS reta/hash query and update function
v2:
modification as per Andrew Rybchenko review comments
--- doc/guides/nics/features/axgbe.ini | 2 + drivers/net/axgbe/axgbe_dev.c | 5 +- drivers/net/axgbe/axgbe_ethdev.c | 144 +++++++++++++++++++++++++++++ drivers/net/axgbe/axgbe_ethdev.h | 3 + 4 files changed, 152 insertions(+), 2 deletions(-)
doc/guides/nics/features/axgbe.ini +2 -0
@@ -11,6 +11,8 @@ Scattered Rx = Y Promiscuous mode = Y Allmulticast mode = Y RSS hash = Y +RSS key update = Y +RSS reta update = Y CRC offload = Y L3 checksum offload = Y L4 checksum offload = Y
drivers/net/axgbe/axgbe_dev.c +1 -1
@@ -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..619250fb0 100644
drivers/net/axgbe/axgbe_ethdev.c +10 -0
@@ -60,6 +60,16 @@ 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); +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 +211,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 +464,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 == 0 || reta_size > AXGBE_RSS_MAX_TABLE_SIZE) {
+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 == 0 || reta_size > AXGBE_RSS_MAX_TABLE_SIZE) {
+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 == NULL) {
+PMD_DRV_LOG(ERR, "rss_conf value isn't valid\n");
+return -EINVAL;
+}
+
+if (rss_conf->rss_key != NULL &&
+ 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 != 0)
+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 == NULL) {
+PMD_DRV_LOG(ERR, "rss_conf value isn't valid\n");
+return -EINVAL;
+}
+
+if (rss_conf->rss_key != NULL &&
+ 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
drivers/net/axgbe/axgbe_ethdev.h +3 -1
@@ -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_ */ --
2.17.1
Quoted 1 line · Amaranath
[AMD Official Use Only - Internal Distribution Only]
Is there a way to remove above header, public email list is definitely not internal distribution.
Quoted 4 lines
For series,
<...>
On 6/4/2020 6:27 AM, Somalapuram, Amaranath wrote:
<...>
Quoted 7 lines
-----Original Message-----
From: Namburu, Chandu-babu <[email protected]>
Sent: Friday, May 29, 2020 5:19 PM
To: [email protected]
Cc: Somalapuram, Amaranath <[email protected]>
Subject: [PATCH v2] net/axgbe: add RSS reta/hash query and update
Quoted 8 lines
From: Chandu Babu N <[email protected]>
add support for RSS reta/hash query and update function
v2:
modification as per Andrew Rybchenko review commentsSigned-off-by Chandu Babu N <[email protected]>
Applied to dpdk-next-net/master, thanks.