@@ -1383,18 +1383,21 @@ eth_dev_handle_port_tm_node_caps(const char *cmd __rte_unused,
13831383
13841384static void
13851385eth_dev_add_reg_data (struct rte_tel_data * d , struct rte_dev_reg_info * reg_info ,
1386- uint32_t idx )
1386+ uint32_t idx , bool hide_zero )
13871387{
1388+ uint64_t val ;
1389+
13881390 if (reg_info -> width == sizeof (uint32_t ))
1389- rte_tel_data_add_dict_uint_hex (d , reg_info -> names [idx ].name ,
1390- * ((uint32_t * )reg_info -> data + idx ), 0 );
1391+ val = * ((uint32_t * )reg_info -> data + idx );
13911392 else
1392- rte_tel_data_add_dict_uint_hex (d , reg_info -> names [idx ].name ,
1393- * ((uint64_t * )reg_info -> data + idx ), 0 );
1393+ val = * ((uint64_t * )reg_info -> data + idx );
1394+
1395+ if (!hide_zero || val > 0 )
1396+ rte_tel_data_add_dict_uint_hex (d , reg_info -> names [idx ].name , val , 0 );
13941397}
13951398
13961399static int
1397- eth_dev_store_regs (struct rte_tel_data * d , struct rte_dev_reg_info * reg_info )
1400+ eth_dev_store_regs (struct rte_tel_data * d , struct rte_dev_reg_info * reg_info , bool hide_zero )
13981401{
13991402 struct rte_tel_data * groups [RTE_TEL_MAX_DICT_ENTRIES ];
14001403 char group_name [RTE_TEL_MAX_STRING_LEN ] = {0 };
@@ -1419,7 +1422,7 @@ eth_dev_store_regs(struct rte_tel_data *d, struct rte_dev_reg_info *reg_info)
14191422
14201423 for (i = 0 ; i < reg_info -> length ; i ++ ) {
14211424 if (i % RTE_TEL_MAX_DICT_ENTRIES != 0 ) {
1422- eth_dev_add_reg_data (group , reg_info , i );
1425+ eth_dev_add_reg_data (group , reg_info , i , hide_zero );
14231426 continue ;
14241427 }
14251428
@@ -1431,7 +1434,7 @@ eth_dev_store_regs(struct rte_tel_data *d, struct rte_dev_reg_info *reg_info)
14311434 }
14321435 groups [grp_num ++ ] = group ;
14331436 rte_tel_data_start_dict (group );
1434- eth_dev_add_reg_data (group , reg_info , i );
1437+ eth_dev_add_reg_data (group , reg_info , i , hide_zero );
14351438 }
14361439
14371440 for (i = 0 ; i < grp_num ; i ++ ) {
@@ -1447,7 +1450,7 @@ eth_dev_store_regs(struct rte_tel_data *d, struct rte_dev_reg_info *reg_info)
14471450}
14481451
14491452static int
1450- eth_dev_get_port_regs (int port_id , struct rte_tel_data * d , char * filter )
1453+ eth_dev_get_port_regs (int port_id , struct rte_tel_data * d , char * filter , bool hide_zero )
14511454{
14521455 struct rte_dev_reg_info reg_info ;
14531456 int ret ;
@@ -1481,7 +1484,7 @@ eth_dev_get_port_regs(int port_id, struct rte_tel_data *d, char *filter)
14811484 goto out ;
14821485 }
14831486
1484- ret = eth_dev_store_regs (d , & reg_info );
1487+ ret = eth_dev_store_regs (d , & reg_info , hide_zero );
14851488out :
14861489 free (reg_info .data );
14871490 free (reg_info .names );
@@ -1494,19 +1497,36 @@ eth_dev_handle_port_regs(const char *cmd __rte_unused,
14941497 const char * params ,
14951498 struct rte_tel_data * d )
14961499{
1497- char * filter , * end_param ;
1500+ const char * const valid_keys [] = { "filter" , "hide_zero" , NULL };
1501+ struct rte_kvargs * kvlist = NULL ;
1502+ char * filter = NULL , * end_param ;
1503+ const char * filter_val ;
1504+ bool hide_zero = false;
14981505 uint16_t port_id ;
14991506 int ret ;
15001507
15011508 ret = eth_dev_parse_port_params (params , & port_id , & end_param , true);
15021509 if (ret != 0 )
15031510 return ret ;
15041511
1505- filter = strtok (end_param , "," );
1506- if (filter != NULL && strlen (filter ) == 0 )
1507- filter = NULL ;
1512+ if (* end_param != '\0' ) {
1513+ kvlist = rte_kvargs_parse (end_param , valid_keys );
1514+ filter_val = rte_kvargs_get (kvlist , "filter" );
1515+ ret = rte_kvargs_process (kvlist , "hide_zero" , eth_dev_parse_hide_zero , & hide_zero );
1516+ if (kvlist == NULL || (filter_val != NULL && strlen (filter_val ) == 0 ) || ret != 0 ) {
1517+ RTE_ETHDEV_LOG_LINE (NOTICE ,
1518+ "Unknown extra parameters passed to ethdev telemetry command, ignoring" );
1519+ } else {
1520+ filter = (filter_val != NULL ) ? strdup (filter_val ) : NULL ;
1521+ hide_zero = false;
1522+ }
1523+ rte_kvargs_free (kvlist );
1524+ }
1525+
1526+ ret = eth_dev_get_port_regs (port_id , d , filter , hide_zero );
1527+ free (filter );
15081528
1509- return eth_dev_get_port_regs ( port_id , d , filter ) ;
1529+ return ret ;
15101530}
15111531
15121532static int eth_dev_telemetry_do (const char * cmd , const char * params , void * arg ,
@@ -1582,5 +1602,5 @@ RTE_INIT(ethdev_init_telemetry)
15821602 eth_dev_telemetry_do , eth_dev_handle_port_tm_node_caps ,
15831603 "Returns TM Node Capabilities info for a port. Parameters: int port_id, int node_id (see tm_capability for the max)" );
15841604 rte_telemetry_register_cmd ("/ethdev/regs" , eth_dev_handle_port_regs ,
1585- "Returns all or filtered registers info for a port. Parameters: int port_id, string module_name (Optional if show all)" );
1605+ "Returns registers info for a port. Parameters: int port_id,filter=xxx (Optional if show all),hide_zero=true|false(Optional )" );
15861606}
0 commit comments