On 6/2/2024 3:45 AM, Damodharam Ammepalli wrote: > Add a new api support that displays the speeds and bitmap of > supported lanes configuration by the ethernet controller. > This patch adds support in the testpmd cli chain. > > Signed-off-by: Damodharam Ammepalli <damodharam.ammepa...@broadcom.com> > --- > app/test-pmd/cmdline.c | 128 +++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 128 insertions(+) > > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c > index 785e5dd4de..8b0a85f632 100644 > --- a/app/test-pmd/cmdline.c > +++ b/app/test-pmd/cmdline.c > @@ -1637,6 +1637,133 @@ static cmdline_parse_inst_t cmd_config_loopback_all = > { > }, > }; > > +/* *** display speed lanes per port capabilities *** */ > +struct cmd_show_speed_lanes_result { > + cmdline_fixed_string_t cmd_show; > + cmdline_fixed_string_t cmd_port; > + cmdline_fixed_string_t cmd_keyword; > + portid_t cmd_pid; > +}; > + > +static const char* > +get_device_infos_display_speeds(uint32_t speed_capa) > +{ > + if (speed_capa & RTE_ETH_LINK_SPEED_10M_HD) > + return(" 10 Mbps half-duplex "); > + if (speed_capa & RTE_ETH_LINK_SPEED_10M) > + return(" 10 Mbps full-duplex "); > + if (speed_capa & RTE_ETH_LINK_SPEED_100M_HD) > + return(" 100 Mbps half-duplex "); > + if (speed_capa & RTE_ETH_LINK_SPEED_100M) > + return(" 100 Mbps full-duplex "); > + if (speed_capa & RTE_ETH_LINK_SPEED_1G) > + return(" 1 Gbps "); > + if (speed_capa & RTE_ETH_LINK_SPEED_2_5G) > + return(" 2.5 Gbps "); > + if (speed_capa & RTE_ETH_LINK_SPEED_5G) > + return(" 5 Gbps "); > + if (speed_capa & RTE_ETH_LINK_SPEED_10G) > + return(" 10 Gbps "); > + if (speed_capa & RTE_ETH_LINK_SPEED_20G) > + return(" 20 Gbps "); > + if (speed_capa & RTE_ETH_LINK_SPEED_25G) > + return(" 25 Gbps "); > + if (speed_capa & RTE_ETH_LINK_SPEED_40G) > + return(" 40 Gbps "); > + if (speed_capa & RTE_ETH_LINK_SPEED_50G) > + return(" 50 Gbps "); > + if (speed_capa & RTE_ETH_LINK_SPEED_56G) > + return(" 56 Gbps "); > + if (speed_capa & RTE_ETH_LINK_SPEED_100G) > + return(" 100 Gbps "); > + if (speed_capa & RTE_ETH_LINK_SPEED_200G) > + return(" 200 Gbps "); > + if (speed_capa & RTE_ETH_LINK_SPEED_400G) > + return(" 400 Gbps "); > + > + return("Unkown"); > +} >
As far as I remember, there was already a function to convert speed to string, can you please double check? > + > +static void > +cmd_show_speed_lanes_parsed(void *parsed_result, > + __rte_unused struct cmdline *cl, > + __rte_unused void *data) > +{ > + struct cmd_show_speed_lanes_result *res = parsed_result; > + uint32_t speed_lanes_bmap[RTE_ETH_LINK_SPEED_MAX_BIT] = {0}; > + struct rte_eth_speed_lanes_capa spd_lanes = {0}; > I think this function will change completely because of previous comments, but as a generic comment, can you please prefer full 'speed' wording instead of 'spd'. > + struct rte_eth_dev_info dev_info; > + //char lanes_speed_str[128] = {0}; > + bool skip_spd_chk = false; > + int ret, i; > + uint32_t j; > + > + if (!rte_eth_dev_is_valid_port(res->cmd_pid)) { > + fprintf(stderr, "Invalid port id %u\n", res->cmd_pid); > + return; > + } > + > + /* get max lanes this nic supports */ > + ret = rte_eth_speed_lanes_get(res->cmd_pid, &spd_lanes); > + if (ret == -ENOTSUP) > + return; > + > + /* Pull out capability if nic supports */ > + ret = rte_eth_speed_lanes_get_capa(res->cmd_pid, speed_lanes_bmap); > + if (ret == -ENOTSUP) > + return; > + > + ret = eth_dev_info_get_print_err(res->cmd_pid, &dev_info); > + /* when link is down, PHY does not report any speeds */ > + if (ret == 0) > + skip_spd_chk = true; > + > + printf("\n%-25s %-10s", " Supported speeds", "Valid lanes"); > + printf("\n-----------------------------------"); > + for (i = 1; i <= RTE_ETH_LINK_SPEED_MAX_BIT; i++) { > + if ((dev_info.speed_capa & RTE_BIT32(i) || skip_spd_chk) && > + (speed_lanes_bmap[i])) { > + printf("\n%-25s ", > + get_device_infos_display_speeds(RTE_BIT32(i))) ; > + for (j = 0; j <= spd_lanes.max_lanes_cap; j++) { > + if (RTE_BIT32(j) & speed_lanes_bmap[i]) > + printf("%-2d", j); > + } > + } > + } > + printf("\n"); > +} > + > +static cmdline_parse_token_string_t cmd_show_speed_lanes_show = > + TOKEN_STRING_INITIALIZER(struct cmd_show_speed_lanes_result, > + cmd_show, "show"); > +static cmdline_parse_token_string_t cmd_show_speed_lanes_port = > + TOKEN_STRING_INITIALIZER(struct cmd_show_speed_lanes_result, > + cmd_port, "port"); > +static cmdline_parse_token_num_t cmd_show_speed_lanes_pid = > + TOKEN_NUM_INITIALIZER(struct cmd_show_speed_lanes_result, > + cmd_pid, RTE_UINT16); > +static cmdline_parse_token_string_t cmd_show_speed_lanes_keyword = > + TOKEN_STRING_INITIALIZER(struct cmd_show_speed_lanes_result, > + cmd_keyword, "speed_lanes"); > +static cmdline_parse_token_string_t cmd_show_speed_lanes_cap_keyword = > + TOKEN_STRING_INITIALIZER(struct cmd_show_speed_lanes_result, > + cmd_keyword, "capabilities"); > + > +static cmdline_parse_inst_t cmd_show_speed_lanes = { > + .f = cmd_show_speed_lanes_parsed, > + .data = NULL, > + .help_str = "show port <port_id> speed_lanes capabilities", > + .tokens = { > + (void *)&cmd_show_speed_lanes_show, > + (void *)&cmd_show_speed_lanes_port, > + (void *)&cmd_show_speed_lanes_pid, > + (void *)&cmd_show_speed_lanes_keyword, > + (void *)&cmd_show_speed_lanes_cap_keyword, > + NULL, > + }, > +}; > + > /* *** configure loopback for specific port *** */ > struct cmd_config_loopback_specific { > cmdline_fixed_string_t port; > @@ -13523,6 +13650,7 @@ static cmdline_parse_ctx_t builtin_ctx[] = { > (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, > + (cmdline_parse_inst_t *)&cmd_show_speed_lanes, > NULL, > }; >