[dpdk-dev] [PATCH v3] net/mlx5: add 200G link speed

Slava Ovsiienko viacheslavo at mellanox.com
Wed May 6 15:43:10 CEST 2020


> -----Original Message-----
> From: Asaf Penso <asafp at mellanox.com>
> Sent: Wednesday, May 6, 2020 15:07
> To: Thomas Monjalon <thomas at monjalon.net>; ferruh.yigit at intel.com;
> arybchenko at solarflare.com; Slava Ovsiienko <viacheslavo at mellanox.com>;
> Matan Azrad <matan at mellanox.com>
> Cc: dev at dpdk.org
> Subject: [PATCH v3] net/mlx5: add 200G link speed
> 
> There is no way to report back a link speed of 200Gbps.
> 
> Adding 200G link speed.
> 
> Signed-off-by: Asaf Penso <asafp at mellanox.com>
For the mlx5-related part:
Acked-by: Viacheslav Ovsiienko <viacheslavo at mellanox.com>

> ---
>  app/test-pmd/cmdline.c                      | 12 +++++++-----
>  doc/guides/rel_notes/release_20_05.rst      |  2 ++
>  doc/guides/testpmd_app_ug/testpmd_funcs.rst |  2 +-
>  drivers/net/mlx5/mlx5_ethdev.c              | 22 +++++++++++++++++++++-
>  lib/librte_ethdev/rte_ethdev.c              |  2 ++
>  lib/librte_ethdev/rte_ethdev.h              |  2 ++
>  6 files changed, 35 insertions(+), 7 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> 1375f22..e6c6b68 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -769,7 +769,7 @@ static void cmd_help_long_parsed(void
> *parsed_result,
>  			"    Detach physical or virtual dev by port_id\n\n"
> 
>  			"port config (port_id|all)"
> -			" speed
> (10|100|1000|10000|25000|40000|50000|100000|auto)"
> +			" speed
> (10|100|1000|10000|25000|40000|50000|100000|200000|auto)"
>  			" duplex (half|full|auto)\n"
>  			"    Set speed and duplex for all ports or port_id\n\n"
> 
> @@ -1619,6 +1619,8 @@ parse_and_check_speed_duplex(char *speedstr,
> char *duplexstr, uint32_t *speed)
>  			*speed = ETH_LINK_SPEED_50G;
>  		} else if (!strcmp(speedstr, "100000")) {
>  			*speed = ETH_LINK_SPEED_100G;
> +		} else if (!strcmp(speedstr, "200000")) {
> +			*speed = ETH_LINK_SPEED_200G;
>  		} else if (!strcmp(speedstr, "auto")) {
>  			*speed = ETH_LINK_SPEED_AUTONEG;
>  		} else {
> @@ -1666,7 +1668,7 @@ cmdline_parse_token_string_t
> cmd_config_speed_all_item1 =
>  	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item1,
> "speed");  cmdline_parse_token_string_t cmd_config_speed_all_value1 =
>  	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, value1,
> -
> 	"10#100#1000#10000#25000#40000#50000#100000#auto");
> +
> 	"10#100#1000#10000#25000#40000#50000#100000#200000#auto")
> ;
>  cmdline_parse_token_string_t cmd_config_speed_all_item2 =
>  	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item2,
> "duplex");  cmdline_parse_token_string_t cmd_config_speed_all_value2 =
> @@ -1677,7 +1679,7 @@ cmdline_parse_inst_t cmd_config_speed_all = {
>  	.f = cmd_config_speed_all_parsed,
>  	.data = NULL,
>  	.help_str = "port config all speed "
> -		"10|100|1000|10000|25000|40000|50000|100000|auto
> duplex "
> +
> 	"10|100|1000|10000|25000|40000|50000|100000|200000|auto
> duplex "
>  							"half|full|auto",
>  	.tokens = {
>  		(void *)&cmd_config_speed_all_port,
> @@ -1741,7 +1743,7 @@ cmdline_parse_token_string_t
> cmd_config_speed_specific_item1 =
>  								"speed");
>  cmdline_parse_token_string_t cmd_config_speed_specific_value1 =
>  	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific,
> value1,
> -
> 	"10#100#1000#10000#25000#40000#50000#100000#auto");
> +
> 	"10#100#1000#10000#25000#40000#50000#100000#200000#auto")
> ;
>  cmdline_parse_token_string_t cmd_config_speed_specific_item2 =
>  	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific,
> item2,
>  								"duplex");
> @@ -1753,7 +1755,7 @@ cmdline_parse_inst_t cmd_config_speed_specific
> = {
>  	.f = cmd_config_speed_specific_parsed,
>  	.data = NULL,
>  	.help_str = "port config <port_id> speed "
> -		"10|100|1000|10000|25000|40000|50000|100000|auto
> duplex "
> +
> 	"10|100|1000|10000|25000|40000|50000|100000|200000|auto
> duplex "
>  							"half|full|auto",
>  	.tokens = {
>  		(void *)&cmd_config_speed_specific_port,
> diff --git a/doc/guides/rel_notes/release_20_05.rst
> b/doc/guides/rel_notes/release_20_05.rst
> index 777d36e..eb8a623 100644
> --- a/doc/guides/rel_notes/release_20_05.rst
> +++ b/doc/guides/rel_notes/release_20_05.rst
> @@ -66,6 +66,8 @@ New Features
>    Added tracepoints in ``EAL``, ``ethdev``, ``cryptodev``, ``eventdev`` and
>    ``mempool`` libraries for important functions.
> 
> +* **ethdev: Added a new value to link speed for 200Gbps **
> +
>  * **Added new API for rte_ring.**
> 
>    * New synchronization modes for rte_ring.
> diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> index a360ecc..a1cbb2e 100644
> --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
> @@ -2153,7 +2153,7 @@ port config - speed
> 
>  Set the speed and duplex mode for all ports or a specific port::
> 
> -   testpmd> port config (port_id|all) speed
> (10|100|1000|10000|25000|40000|50000|100000|auto) \
> +   testpmd> port config (port_id|all) speed
> + (10|100|1000|10000|25000|40000|50000|100000|200000|auto) \
>              duplex (half|full|auto)
> 
>  port config - queues/descriptors
> diff --git a/drivers/net/mlx5/mlx5_ethdev.c
> b/drivers/net/mlx5/mlx5_ethdev.c index d7d3bc7..47f11b9 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -86,6 +86,7 @@ struct ethtool_link_settings {
>  	uint32_t link_mode_masks[];
>  };
> 
> +/* The kernel values can be found in /include/uapi/linux/ethtool.h */
>  #define ETHTOOL_GLINKSETTINGS 0x0000004c  #define
> ETHTOOL_LINK_MODE_1000baseT_Full_BIT 5  #define
> ETHTOOL_LINK_MODE_Autoneg_BIT 6 @@ -119,6 +120,13 @@ struct
> ethtool_link_settings {  #define
> ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT 38  #define
> ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT 39  #endif
> +#ifndef HAVE_ETHTOOL_LINK_MODE_200G
> +#define ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT 62 #define
> +ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT 63 #define
> +ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT 0 /* 64 - 64 */
> +#define ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT 1 /* 65 - 64 */
> +#define ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT 2 /* 66 - 64 */
> #endif
> 
>  /**
>   * Get master interface name from private structure.
> @@ -537,7 +545,8 @@ mlx5_set_default_params(struct rte_eth_dev *dev,
> struct rte_eth_dev_info *info)
>  	info->default_txportconf.ring_size = 256;
>  	info->default_rxportconf.burst_size = MLX5_RX_DEFAULT_BURST;
>  	info->default_txportconf.burst_size = MLX5_TX_DEFAULT_BURST;
> -	if (priv->link_speed_capa & ETH_LINK_SPEED_100G) {
> +	if ((priv->link_speed_capa & ETH_LINK_SPEED_200G) |
> +		(priv->link_speed_capa & ETH_LINK_SPEED_100G)) {
>  		info->default_rxportconf.nb_queues = 16;
>  		info->default_txportconf.nb_queues = 16;
>  		if (dev->data->nb_rx_queues > 2 ||
> @@ -1028,6 +1037,17 @@ mlx5_link_update_unlocked_gs(struct
> rte_eth_dev *dev,
> 
> MLX5_BITSHIFT(ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT) |
> 
> MLX5_BITSHIFT(ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT)))
>  		priv->link_speed_capa |= ETH_LINK_SPEED_100G;
> +	if (sc &
> (MLX5_BITSHIFT(ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT) |
> +
> MLX5_BITSHIFT(ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT)))
> +		priv->link_speed_capa |= ETH_LINK_SPEED_200G;
> +
> +	sc = ecmd->link_mode_masks[2] |
> +		((uint64_t)ecmd->link_mode_masks[3] << 32);
> +	if (sc &
> (MLX5_BITSHIFT(ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT) |
> +		  MLX5_BITSHIFT(
> +
> 	ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT) |
> +
> MLX5_BITSHIFT(ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT)))
> +		priv->link_speed_capa |= ETH_LINK_SPEED_200G;
>  	dev_link.link_duplex = ((ecmd->duplex == DUPLEX_HALF) ?
>  				ETH_LINK_HALF_DUPLEX :
> ETH_LINK_FULL_DUPLEX);
>  	dev_link.link_autoneg = !(dev->data->dev_conf.link_speeds & diff --
> git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index
> 72aed59..a64df8f 100644
> --- a/lib/librte_ethdev/rte_ethdev.c
> +++ b/lib/librte_ethdev/rte_ethdev.c
> @@ -1099,6 +1099,8 @@ rte_eth_speed_bitflag(uint32_t speed, int duplex)
>  		return ETH_LINK_SPEED_56G;
>  	case ETH_SPEED_NUM_100G:
>  		return ETH_LINK_SPEED_100G;
> +	case ETH_SPEED_NUM_200G:
> +		return ETH_LINK_SPEED_200G;
>  	default:
>  		return 0;
>  	}
> diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h
> index 0f6d053..a49242b 100644
> --- a/lib/librte_ethdev/rte_ethdev.h
> +++ b/lib/librte_ethdev/rte_ethdev.h
> @@ -284,6 +284,7 @@ struct rte_eth_stats {
>  #define ETH_LINK_SPEED_50G      (1 << 12)  /**<  50 Gbps */
>  #define ETH_LINK_SPEED_56G      (1 << 13)  /**<  56 Gbps */
>  #define ETH_LINK_SPEED_100G     (1 << 14)  /**< 100 Gbps */
> +#define ETH_LINK_SPEED_200G     (1 << 15)  /**< 200 Gbps */
> 
>  /**
>   * Ethernet numeric link speeds in Mbps @@ -301,6 +302,7 @@ struct
> rte_eth_stats {
>  #define ETH_SPEED_NUM_50G      50000 /**<  50 Gbps */
>  #define ETH_SPEED_NUM_56G      56000 /**<  56 Gbps */
>  #define ETH_SPEED_NUM_100G    100000 /**< 100 Gbps */
> +#define ETH_SPEED_NUM_200G    200000 /**< 200 Gbps */
> 
>  /**
>   * A structure used to retrieve link-level information of an Ethernet port.
> --
> 2.7.4



More information about the dev mailing list