From patchwork Thu Dec 14 01:56:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jie Hai X-Patchwork-Id: 135174 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id B4572436E8; Thu, 14 Dec 2023 03:00:38 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9F12A42F57; Thu, 14 Dec 2023 03:00:38 +0100 (CET) Received: from szxga06-in.huawei.com (szxga06-in.huawei.com [45.249.212.32]) by mails.dpdk.org (Postfix) with ESMTP id CA9CE40283 for ; Thu, 14 Dec 2023 03:00:36 +0100 (CET) Received: from mail.maildlp.com (unknown [172.19.88.214]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4SrFtQ3TJ9z2dMC7; Thu, 14 Dec 2023 10:00:30 +0800 (CST) Received: from kwepemd100004.china.huawei.com (unknown [7.221.188.31]) by mail.maildlp.com (Postfix) with ESMTPS id AE4F21A01D9; Thu, 14 Dec 2023 10:00:34 +0800 (CST) Received: from localhost.localdomain (10.67.165.2) by kwepemd100004.china.huawei.com (7.221.188.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.1258.28; Thu, 14 Dec 2023 10:00:34 +0800 From: Jie Hai To: , Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko CC: , , , Subject: [PATCH] ethdev: add dump regs for telemetry Date: Thu, 14 Dec 2023 09:56:49 +0800 Message-ID: <20231214015650.3738578-1-haijie1@huawei.com> X-Mailer: git-send-email 2.30.0 MIME-Version: 1.0 X-Originating-IP: [10.67.165.2] X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) To kwepemd100004.china.huawei.com (7.221.188.31) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The ethdev library now registers a telemetry command for dump regs. An example usage is shown below: --> /ethdev/regs,test { "/ethdev/regs": { "regs_offset": 0, "regs_length": 3192, "regs_width": 4, "device_version": "0x1080f00", "regs_file": "port_0_regs_test" } } Signed-off-by: Jie Hai --- lib/ethdev/rte_ethdev_telemetry.c | 93 +++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/lib/ethdev/rte_ethdev_telemetry.c b/lib/ethdev/rte_ethdev_telemetry.c index b01028ce9b60..33ec4739aa9b 100644 --- a/lib/ethdev/rte_ethdev_telemetry.c +++ b/lib/ethdev/rte_ethdev_telemetry.c @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -1395,6 +1396,96 @@ eth_dev_handle_port_tm_node_caps(const char *cmd __rte_unused, return ret; } +static int +eth_dev_get_port_regs(uint16_t port_id, struct rte_dev_reg_info *reg_info, + const char *file_name) +{ + uint64_t buf_size; + size_t nr_written; + void *data; + FILE *fp; + int ret; + + ret = rte_eth_dev_get_reg_info(port_id, reg_info); + if (ret != 0) { + RTE_ETHDEV_LOG(ERR, + "Error getting device reg info: %d\n", ret); + return ret; + } + + buf_size = reg_info->length * reg_info->width; + data = rte_zmalloc(NULL, buf_size, 0); + if (!data) { + RTE_ETHDEV_LOG(ERR, + "Error allocating %zu bytes buffer\n", buf_size); + return -ENOMEM; + } + + reg_info->data = data; + ret = rte_eth_dev_get_reg_info(port_id, reg_info); + if (ret != 0) { + RTE_ETHDEV_LOG(ERR, + "Error getting regs from device: %d\n", ret); + goto out; + } + + fp = fopen(file_name, "wb"); + if (fp == NULL) { + printf("Error during opening '%s' for writing: %s\n", + file_name, strerror(errno)); + ret = -EINVAL; + } else { + nr_written = fwrite(reg_info->data, 1, buf_size, fp); + if (nr_written != buf_size) + printf("Error during writing %s: %s\n", + file_name, strerror(errno)); + fclose(fp); + } + +out: + rte_free(data); + reg_info->data = NULL; + return ret; +} + +static int +eth_dev_handle_port_regs(const char *cmd __rte_unused, + const char *params, + struct rte_tel_data *d) +{ + struct rte_dev_reg_info reg_info = {0}; + char file_name[RTE_TEL_MAX_STRING_LEN]; + const char *suffix; + uint16_t port_id; + char *end_param; + int ret; + + ret = eth_dev_parse_port_params(params, &port_id, &end_param, true); + if (ret != 0) + return ret; + + suffix = strtok_r(end_param, ",", &end_param); + if (!suffix || strlen(suffix) == 0) { + RTE_ETHDEV_LOG(ERR, + "Please pass suffix parameters ethdev telemetry command\n"); + return -EINVAL; + } + snprintf(file_name, RTE_TEL_MAX_STRING_LEN, "port_%u_regs_%s", + port_id, suffix); + ret = eth_dev_get_port_regs(port_id, ®_info, file_name); + if (ret != 0) + return ret; + + rte_tel_data_start_dict(d); + rte_tel_data_add_dict_uint(d, "regs_offset", reg_info.offset); + rte_tel_data_add_dict_uint(d, "regs_length", reg_info.length); + rte_tel_data_add_dict_uint(d, "regs_width", reg_info.width); + rte_tel_data_add_dict_uint_hex(d, "device_version", reg_info.version, 0); + rte_tel_data_add_dict_string(d, "regs_file", file_name); + + return 0; +} + RTE_INIT(ethdev_init_telemetry) { rte_telemetry_register_cmd("/ethdev/list", eth_dev_handle_port_list, @@ -1436,4 +1527,6 @@ RTE_INIT(ethdev_init_telemetry) "Returns TM Level Capabilities info for a port. Parameters: int port_id, int level_id (see tm_capability for the max)"); rte_telemetry_register_cmd("/ethdev/tm_node_capability", eth_dev_handle_port_tm_node_caps, "Returns TM Node Capabilities info for a port. Parameters: int port_id, int node_id (see tm_capability for the max)"); + rte_telemetry_register_cmd("/ethdev/regs", eth_dev_handle_port_regs, + "Returns regs for a port. Parameters: int port_id, char *suffix"); }