From 5ea354a1f2cc40936db381d84c22f5fbc9dbc4fa Mon Sep 17 00:00:00 2001 From: Gowrishankar Muthukrishnan Date: Tue, 19 Oct 2021 16:57:27 +0530 Subject: [PATCH] net/cnxk: support telemetry Add telemetry endpoints to ethdev. Signed-off-by: Gowrishankar Muthukrishnan Reviewed-by: Harman Kalra Acked-by: Jerin Jacob --- drivers/net/cnxk/cnxk_ethdev_telemetry.c | 93 ++++++++++++++++++++++++ drivers/net/cnxk/meson.build | 1 + 2 files changed, 94 insertions(+) create mode 100644 drivers/net/cnxk/cnxk_ethdev_telemetry.c diff --git a/drivers/net/cnxk/cnxk_ethdev_telemetry.c b/drivers/net/cnxk/cnxk_ethdev_telemetry.c new file mode 100644 index 0000000000..83bc65848c --- /dev/null +++ b/drivers/net/cnxk/cnxk_ethdev_telemetry.c @@ -0,0 +1,93 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2021 Marvell International Ltd. + */ + +#include + +#include "cnxk_ethdev.h" + +/* Macro to count no of words in eth_info_s size */ +#define ETH_INFO_SZ \ + (RTE_ALIGN_CEIL(sizeof(struct eth_info_s), sizeof(uint64_t)) / \ + sizeof(uint64_t)) +#define MACADDR_LEN 18 + +static int +ethdev_tel_handle_info(const char *cmd __rte_unused, + const char *params __rte_unused, struct rte_tel_data *d) +{ + struct rte_eth_dev *eth_dev; + struct rte_tel_data *i_data; + struct cnxk_eth_dev *dev; + union eth_info_u { + struct eth_info_s { + /** PF/VF information */ + uint16_t pf_func; + uint8_t max_mac_entries; + bool dmac_filter_ena; + uint8_t dmac_filter_count; + uint8_t ptype_disable; + bool scalar_ena; + bool ptp_ena; + /* Platform specific offload flags */ + uint16_t rx_offload_flags; + uint16_t tx_offload_flags; + } info; + uint64_t val[ETH_INFO_SZ]; + } eth_info; + struct eth_info_s *info; + unsigned int i, j = 0; + int n_ports; + + n_ports = rte_eth_dev_count_avail(); + if (!n_ports) { + plt_err("No active ethernet ports found."); + return -1; + } + + rte_tel_data_start_dict(d); + rte_tel_data_add_dict_int(d, "n_ports", n_ports); + + i_data = rte_tel_data_alloc(); + rte_tel_data_start_array(i_data, RTE_TEL_U64_VAL); + + for (i = 0; i < RTE_MAX_ETHPORTS; i++) { + /* Skip if port is unused */ + if (!rte_eth_dev_is_valid_port(i)) + continue; + + eth_dev = &rte_eth_devices[i]; + if (eth_dev) { + memset(ð_info, 0, sizeof(eth_info)); + info = ð_info.info; + dev = cnxk_eth_pmd_priv(eth_dev); + if (dev) { + info->pf_func = roc_nix_get_pf_func(&dev->nix); + info->max_mac_entries = dev->max_mac_entries; + info->dmac_filter_ena = dev->dmac_filter_enable; + info->dmac_filter_count = + dev->dmac_filter_count; + info->ptype_disable = dev->ptype_disable; + info->scalar_ena = dev->scalar_ena; + info->ptp_ena = dev->ptp_en; + info->rx_offload_flags = dev->rx_offload_flags; + info->tx_offload_flags = dev->tx_offload_flags; + } + + for (j = 0; j < ETH_INFO_SZ; j++) + rte_tel_data_add_array_u64(i_data, + eth_info.val[j]); + + j++; + } + } + + rte_tel_data_add_dict_container(d, "info", i_data, 0); + return 0; +} + +RTE_INIT(cnxk_ethdev_init_telemetry) +{ + rte_telemetry_register_cmd("/cnxk/ethdev/info", ethdev_tel_handle_info, + "Returns ethdev device information"); +} diff --git a/drivers/net/cnxk/meson.build b/drivers/net/cnxk/meson.build index 5dac078b2c..7648ff5760 100644 --- a/drivers/net/cnxk/meson.build +++ b/drivers/net/cnxk/meson.build @@ -14,6 +14,7 @@ sources = files( 'cnxk_ethdev_mtr.c', 'cnxk_ethdev_ops.c', 'cnxk_ethdev_sec.c', + 'cnxk_ethdev_telemetry.c', 'cnxk_link.c', 'cnxk_lookup.c', 'cnxk_ptp.c', -- 2.20.1