DPDK patches and discussions
 help / color / mirror / Atom feed
From: Ferruh Yigit <ferruh.yigit@amd.com>
To: Damodharam Ammepalli <damodharam.ammepalli@broadcom.com>, dev@dpdk.org
Cc: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>,
	Ajit Khaparde <ajit.khaparde@broadcom.com>,
	Dengdui Huang <huangdengdui@huawei.com>
Subject: Re: [PATCH v2 2/4] testpmd: Add speed lanes to testpmd config and show command
Date: Wed, 12 Jun 2024 00:39:14 +0100	[thread overview]
Message-ID: <d5e15adc-1263-432c-af4f-642a04c69b32@amd.com> (raw)
In-Reply-To: <20240602024504.179506-3-damodharam.ammepalli@broadcom.com>

On 6/2/2024 3:45 AM, Damodharam Ammepalli wrote:
> Add speed lanes configuration and display commands support
> to testpmd. Also provide display the lanes info show device info.
> 
> testpmd>
> testpmd> port stop 0
> testpmd> port config 0 speed_lanes 4
> testpmd> port config 0 speed 200000 duplex full
> testpmd> port start 0
> testpmd> show port summary 0
> Number of available ports: 2
> Port MAC Address       Name         Driver         Status   Link     Lanes
> 0    14:23:F2:C3:BA:D2 0000:b1:00.0 net_bnxt       up       200 Gbps 4
> testpmd>
> 
> testpmd> show port info 0
> 
> ********************* Infos for port 0  *********************
> MAC address: 14:23:F2:C3:BA:D2
> Device name: 0000:b1:00.0
> Driver name: net_bnxt
> Firmware-version: 228.9.115.0
> Connect to socket: 2
> memory allocation on the socket: 2
> Link status: up
> Link speed: 200 Gbps
> Lanes: 4
> Link duplex: full-duplex
> Autoneg status: Off
> 
> Signed-off-by: Damodharam Ammepalli <damodharam.ammepalli@broadcom.com>
> Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
> Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
> ---
>  app/test-pmd/cmdline.c | 142 +++++++++++++++++++++++++++++++++++++++++
>  app/test-pmd/config.c  |  13 ++--
>  2 files changed, 151 insertions(+), 4 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> index b7759e38a8..785e5dd4de 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c
> @@ -1361,6 +1361,27 @@ struct cmd_config_speed_all {
>  	cmdline_fixed_string_t value2;
>  };
>  
> +static int
> +cmd_validate_lanes(portid_t pid, uint32_t *lanes)
> +{
> +	struct rte_eth_speed_lanes_capa spd_lanes = {0};
> +	int ret;
> +
> +	ret = rte_eth_speed_lanes_get(pid, &spd_lanes);
>

Wouldn't it be better to validate value with provided capabilities?

> +	/* if not supported default lanes to 0 */
> +	if (ret == -ENOTSUP) {
> +		*lanes = 0;
> +		return 0;
> +	}
> +
> +	if (*lanes > spd_lanes.max_lanes_cap) {
> +		fprintf(stderr, "Invalid lanes %d configuration\n", *lanes);
> +		return -1;
> +	}
> +
> +	return 0;
> +}
> +
>  static int
>  parse_and_check_speed_duplex(char *speedstr, char *duplexstr, uint32_t *speed)
>  {
> @@ -1676,6 +1697,125 @@ static cmdline_parse_inst_t cmd_config_loopback_specific = {
>  	},
>  };
>  
> +/* *** configure speed_lanes for all ports *** */
> +struct cmd_config_speed_lanes_all {
> +	cmdline_fixed_string_t port;
> +	cmdline_fixed_string_t keyword;
> +	cmdline_fixed_string_t all;
> +	cmdline_fixed_string_t item;
> +	uint32_t lanes;
> +};
> +
> +static void
> +cmd_config_speed_lanes_all_parsed(void *parsed_result,
> +				  __rte_unused struct cmdline *cl,
> +				  __rte_unused void *data)
> +{
> +	struct cmd_config_speed_lanes_all *res = parsed_result;
> +	portid_t pid;
> +
> +	if (!all_ports_stopped()) {
> +		fprintf(stderr, "Please stop all ports first\n");
> +		return;
> +	}
> +
> +	RTE_ETH_FOREACH_DEV(pid) {
> +		if (cmd_validate_lanes(pid, &res->lanes))
> +			return;
> +		rte_eth_speed_lanes_set(pid, res->lanes);
> +	}
> +
> +	cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
> +}
> +
> +static cmdline_parse_token_string_t cmd_config_speed_lanes_all_port =
> +	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_lanes_all, port, "port");
> +static cmdline_parse_token_string_t cmd_config_speed_lanes_all_keyword =
> +	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_lanes_all, keyword,
> +				 "config");
> +static cmdline_parse_token_string_t cmd_config_speed_lanes_all_all =
> +	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_lanes_all, all, "all");
> +static cmdline_parse_token_string_t cmd_config_speed_lanes_all_item =
> +	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_lanes_all, item,
> +				 "speed_lanes");
> +static cmdline_parse_token_num_t cmd_config_speed_lanes_all_lanes =
> +	TOKEN_NUM_INITIALIZER(struct cmd_config_speed_lanes_all, lanes, RTE_UINT32);
> +
> +static cmdline_parse_inst_t cmd_config_speed_lanes_all = {
> +	.f = cmd_config_speed_lanes_all_parsed,
> +	.data = NULL,
> +	.help_str = "port config all speed_lanes <value>",
> +	.tokens = {
> +		(void *)&cmd_config_speed_lanes_all_port,
> +		(void *)&cmd_config_speed_lanes_all_keyword,
> +		(void *)&cmd_config_speed_lanes_all_all,
> +		(void *)&cmd_config_speed_lanes_all_item,
> +		(void *)&cmd_config_speed_lanes_all_lanes,
> +		NULL,
> +	},
> +};
> +
> +/* *** configure speed_lanes for specific port *** */
> +struct cmd_config_speed_lanes_specific {
> +	cmdline_fixed_string_t port;
> +	cmdline_fixed_string_t keyword;
> +	uint16_t port_id;
> +	cmdline_fixed_string_t item;
> +	uint32_t lanes;
> +};
> +
> +static void
> +cmd_config_speed_lanes_specific_parsed(void *parsed_result,
> +				       __rte_unused struct cmdline *cl,
> +				       __rte_unused void *data)
> +{
> +	struct cmd_config_speed_lanes_specific *res = parsed_result;
> +
> +	if (port_id_is_invalid(res->port_id, ENABLED_WARN))
> +		return;
> +
> +	if (!port_is_stopped(res->port_id)) {
> +		fprintf(stderr, "Please stop port %u first\n", res->port_id);
> +		return;
> +	}
> +
> +	if (cmd_validate_lanes(res->port_id, &res->lanes))
> +		return;
> +	rte_eth_speed_lanes_set(res->port_id, res->lanes);
> +
> +	cmd_reconfig_device_queue(res->port_id, 1, 1);
> +}
> +
> +static cmdline_parse_token_string_t cmd_config_speed_lanes_specific_port =
> +	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_lanes_specific, port,
> +				 "port");
> +static cmdline_parse_token_string_t cmd_config_speed_lanes_specific_keyword =
> +	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_lanes_specific, keyword,
> +				 "config");
> +static cmdline_parse_token_num_t cmd_config_speed_lanes_specific_id =
> +	TOKEN_NUM_INITIALIZER(struct cmd_config_speed_lanes_specific, port_id,
> +			      RTE_UINT16);
> +static cmdline_parse_token_string_t cmd_config_speed_lanes_specific_item =
> +	TOKEN_STRING_INITIALIZER(struct cmd_config_speed_lanes_specific, item,
> +				 "speed_lanes");
> +static cmdline_parse_token_num_t cmd_config_speed_lanes_specific_lanes =
> +	TOKEN_NUM_INITIALIZER(struct cmd_config_speed_lanes_specific, lanes,
> +			      RTE_UINT32);
> +
> +static cmdline_parse_inst_t cmd_config_speed_lanes_specific = {
> +	.f = cmd_config_speed_lanes_specific_parsed,
> +	.data = NULL,
> +	.help_str = "port config <port_id> speed_lanes <value>",
> +	.tokens = {
> +		(void *)&cmd_config_speed_lanes_specific_port,
> +		(void *)&cmd_config_speed_lanes_specific_keyword,
> +		(void *)&cmd_config_speed_lanes_specific_id,
> +		(void *)&cmd_config_speed_lanes_specific_item,
> +		(void *)&cmd_config_speed_lanes_specific_lanes,
> +		NULL,
> +	},
> +};
> +

These new commands are added between 'cmd_config_loopback_all' &
'cmd_config_loopback_specific' commands, please pay more attention where
to add new code.
Can you please add them just after 'cmd_config_speed_specific' to group
related functionality together?

>  /* *** configure txq/rxq, txd/rxd *** */
>  struct cmd_config_rx_tx {
>  	cmdline_fixed_string_t port;
> @@ -13381,6 +13521,8 @@ static cmdline_parse_ctx_t builtin_ctx[] = {
>  	(cmdline_parse_inst_t *)&cmd_show_port_cman_config,
>  	(cmdline_parse_inst_t *)&cmd_set_port_cman_config,
>  	(cmdline_parse_inst_t *)&cmd_config_tx_affinity_map,
> +	(cmdline_parse_inst_t *)&cmd_config_speed_lanes_all,
> +	(cmdline_parse_inst_t *)&cmd_config_speed_lanes_specific,
>

Can you please keep the same order where function implementations added
above?


>  	NULL,
>  };
>  
> diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
> index ba1007ace6..9f846c5e84 100644
> --- a/app/test-pmd/config.c
> +++ b/app/test-pmd/config.c
> @@ -779,6 +779,7 @@ port_infos_display(portid_t port_id)
>  	struct rte_ether_addr mac_addr;
>  	struct rte_eth_link link;
>  	struct rte_eth_dev_info dev_info;
> +	struct rte_eth_speed_lanes_capa spd_lanes = {0};
>  	int vlan_offload;
>  	struct rte_mempool * mp;
>  	static const char *info_border = "*********************";
> @@ -828,6 +829,8 @@ port_infos_display(portid_t port_id)
>  
>  	printf("\nLink status: %s\n", (link.link_status) ? ("up") : ("down"));
>  	printf("Link speed: %s\n", rte_eth_link_speed_to_str(link.link_speed));
> +	rte_eth_speed_lanes_get(port_id, &spd_lanes);
> +	printf("Lanes: %d\n", spd_lanes.active_lanes);
>

Please print only if getting lane number is supported.


>  	printf("Link duplex: %s\n", (link.link_duplex == RTE_ETH_LINK_FULL_DUPLEX) ?
>  	       ("full-duplex") : ("half-duplex"));
>  	printf("Autoneg status: %s\n", (link.link_autoneg == RTE_ETH_LINK_AUTONEG) ?
> @@ -962,8 +965,8 @@ port_summary_header_display(void)
>  
>  	port_number = rte_eth_dev_count_avail();
>  	printf("Number of available ports: %i\n", port_number);
> -	printf("%-4s %-17s %-12s %-14s %-8s %s\n", "Port", "MAC Address", "Name",
> -			"Driver", "Status", "Link");
> +	printf("%-4s %-17s %-12s %-14s %-8s %-8s %s\n", "Port", "MAC Address", "Name",
> +			"Driver", "Status", "Link", "Lanes");
>  }
>  
>  void
> @@ -972,6 +975,7 @@ port_summary_display(portid_t port_id)
>  	struct rte_ether_addr mac_addr;
>  	struct rte_eth_link link;
>  	struct rte_eth_dev_info dev_info;
> +	struct rte_eth_speed_lanes_capa spd_lanes = {0};
>  	char name[RTE_ETH_NAME_MAX_LEN];
>  	int ret;
>  
> @@ -993,10 +997,11 @@ port_summary_display(portid_t port_id)
>  	if (ret != 0)
>  		return;
>  
> -	printf("%-4d " RTE_ETHER_ADDR_PRT_FMT " %-12s %-14s %-8s %s\n",
> +	rte_eth_speed_lanes_get(port_id, &spd_lanes);
> +	printf("%-4d " RTE_ETHER_ADDR_PRT_FMT " %-12s %-14s %-8s %-8s %d\n",
>  		port_id, RTE_ETHER_ADDR_BYTES(&mac_addr), name,
>  		dev_info.driver_name, (link.link_status) ? ("up") : ("down"),
> -		rte_eth_link_speed_to_str(link.link_speed));
> +		rte_eth_link_speed_to_str(link.link_speed), spd_lanes.active_lanes);
>

This is summary info, lots of details already omitted, 'lanes'
information is not imported enough to list here, can you please drop
this change?


  reply	other threads:[~2024-06-11 23:39 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-22 22:25 [RFC 0/2] Add support for link speed lanes Damodharam Ammepalli
2024-03-22 22:25 ` [RFC 1/2] lib/ethdev: Add link_speed lanes support into rte lib Damodharam Ammepalli
2024-03-22 22:25 ` [RFC 2/2] testpmd: Add speed lanes to testpmd config and show command Damodharam Ammepalli
2024-05-22 20:59 ` [RFC 0/2] Add support for link speed lanes Ferruh Yigit
2024-05-28 21:19   ` Damodharam Ammepalli
2024-06-02  2:45     ` [PATCH v2 0/4] " Damodharam Ammepalli
2024-06-02  2:45       ` [PATCH v2 1/4] lib/ethdev: Add link_speed lanes support into rte lib Damodharam Ammepalli
2024-06-11 23:39         ` Ferruh Yigit
2024-06-14 18:27           ` Damodharam Ammepalli
2024-06-17 20:34             ` [PATCH v3] ethdev: Add link_speed lanes support Damodharam Ammepalli
2024-06-02  2:45       ` [PATCH v2 2/4] testpmd: Add speed lanes to testpmd config and show command Damodharam Ammepalli
2024-06-11 23:39         ` Ferruh Yigit [this message]
2024-06-02  2:45       ` [PATCH v2 3/4] lib/ethdev: add support for displaying lanes capability Damodharam Ammepalli
2024-06-11 23:39         ` Ferruh Yigit
2024-06-02  2:45       ` [PATCH v2 4/4] testpmd: " Damodharam Ammepalli
2024-06-11 23:39         ` Ferruh Yigit
2024-06-12 17:53           ` Damodharam Ammepalli
2024-06-12 20:57             ` Ferruh Yigit
2024-06-11 23:38       ` [PATCH v2 0/4] Add support for link speed lanes Ferruh Yigit
2024-06-12 17:46         ` Damodharam Ammepalli

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=d5e15adc-1263-432c-af4f-642a04c69b32@amd.com \
    --to=ferruh.yigit@amd.com \
    --cc=ajit.khaparde@broadcom.com \
    --cc=damodharam.ammepalli@broadcom.com \
    --cc=dev@dpdk.org \
    --cc=huangdengdui@huawei.com \
    --cc=kalesh-anakkur.purayil@broadcom.com \
    /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).