From patchwork Tue Oct 18 06:13:59 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Yang X-Patchwork-Id: 118351 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 842A3A0560; Tue, 18 Oct 2022 08:24:45 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3A3E0410E8; Tue, 18 Oct 2022 08:24:27 +0200 (CEST) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by mails.dpdk.org (Postfix) with ESMTP id 6CBF840143 for ; Tue, 18 Oct 2022 08:24:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1666074265; x=1697610265; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=BXg5Q//gdndVv83CLPeMc7+lAKSrFv3w1kCrXr4g94M=; b=lQeYi7rvDemQUvJO8aS7+MDw69xVI0ognBNiy+St4sS26rExYq62rK74 1EYTIFBnLXZ73YgyqKnV8KIhdHpM8q/d/zDkGaw/jqUIjrj3CChh5BV66 YZDQ5Usqw8HWJeOAKK7U7ZEFWsu03fm5C0vTRLQHJfENCKpPLmRY/XyZ1 Bf3pKkBCrYDgTBHNi+pjEgBt1wMC8q9OhT7ak75nsylyp5m0UJFwazVAL XESEN6liTU+OWePrrFVgZi6NmFieJdIItGC0s6C5Kgq2Do1HzdinM+YNd rf9jypCLMX9GRVNQy2bTP5So9VQaQJSlvnXkaLLLW5buwmvidM6ISh34t Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10503"; a="304749631" X-IronPort-AV: E=Sophos;i="5.95,193,1661842800"; d="scan'208";a="304749631" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Oct 2022 23:24:24 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10503"; a="717786664" X-IronPort-AV: E=Sophos;i="5.95,193,1661842800"; d="scan'208";a="717786664" Received: from intel-cd-odc-steve.cd.intel.com ([10.240.178.206]) by fmsmga003-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Oct 2022 23:24:23 -0700 From: Steve Yang To: dev@dpdk.org Cc: qiming.yang@intel.com, qi.z.zhang@intel.com, Steve Yang Subject: [PATCH v1] net/ice: support ddp dump switch rule binary Date: Tue, 18 Oct 2022 06:13:59 +0000 Message-Id: <20221018061359.1554604-1-stevex.yang@intel.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 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 Dump ICE ddp runtime switch rule binary via following command: testpmd> ddp dump switch You can covert the binary file to readable texture via dpdt tool. Signed-off-by: Steve Yang --- drivers/net/ice/ice_ddp_package.c | 93 +++++++++++++++++++++++++++++++ drivers/net/ice/ice_testpmd.c | 80 +++++++++++++++++++++++++- drivers/net/ice/rte_pmd_ice.h | 3 + drivers/net/ice/version.map | 1 + 4 files changed, 175 insertions(+), 2 deletions(-) diff --git a/drivers/net/ice/ice_ddp_package.c b/drivers/net/ice/ice_ddp_package.c index c7b5dc7ee7..db6e6e955a 100644 --- a/drivers/net/ice/ice_ddp_package.c +++ b/drivers/net/ice/ice_ddp_package.c @@ -1,6 +1,8 @@ /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2022 Intel Corporation */ +#include +#include #include #include @@ -9,6 +11,7 @@ #include "ice_ethdev.h" #include "rte_pmd_ice.h" +#define ICE_BLK_MAX_COUNT 512 #define ICE_BUFF_SEG_HEADER_FLAG 0x1 #define ICE_PKG_HDR_HEADR_PART1 1 #define ICE_PKG_HDR_HEADR_PART2 2 @@ -416,3 +419,93 @@ int rte_pmd_ice_dump_package(uint16_t port, uint8_t **buff, uint32_t *size) return ice_dump_pkg(dev, buff, size); } + +static uint16_t +covert_byte_to_hex(uint8_t **outbuf, const uint8_t *inbuf, uint32_t inbuf_size) +{ + uint32_t i; + uint8_t *buffer = *outbuf; + for (i = 0; i < inbuf_size; ++i) + sprintf((char *)(buffer + i * 2), "%02X", inbuf[i]); + + return inbuf_size * 2; +} + +static int +ice_dump_switch(struct rte_eth_dev *dev, uint8_t **buff2, uint32_t *size) +{ + struct ice_hw *hw; + int i = 0; + uint16_t tbl_id = 0; + uint32_t tbl_idx = 0; + int tbl_cnt = 0; + uint8_t *buffer = *buff2; + + hw = ICE_DEV_PRIVATE_TO_HW(dev->data->dev_private); + + /* table index string format: "0000:" */ + #define TBL_IDX_STR_SIZE 6 + for (i = 0; i < ICE_BLK_MAX_COUNT; i++) { + int res; + uint16_t buff_size; + uint8_t *buff; + uint32_t offset = 0; + + buff = malloc(ICE_PKG_BUF_SIZE); + if (!buff) + return ICE_ERR_NO_MEMORY; + + if (tbl_idx == 0) { + char tbl_idx_str[TBL_IDX_STR_SIZE]; + memset(tbl_idx_str, 0, sizeof(tbl_idx_str)); + sprintf(tbl_idx_str, "%d:", tbl_id); + memcpy(buffer, tbl_idx_str, strlen(tbl_idx_str)); + offset = strlen(tbl_idx_str); + buffer += offset; + } + + res = ice_aq_get_internal_data(hw, + ICE_AQC_DBG_DUMP_CLUSTER_ID_SW, + tbl_id, tbl_idx, buff, + ICE_PKG_BUF_SIZE, + &buff_size, &tbl_id, &tbl_idx, NULL); + + if (res) { + free(buff); + return res; + } + + offset = covert_byte_to_hex(&buffer, buff, buff_size); + buffer += offset; + + free(buff); + + tbl_cnt++; + if (tbl_idx == 0xffffffff) { + tbl_idx = 0; + tbl_cnt = 0; + memset(buffer, '\n', sizeof(char)); + buffer++; + offset = 0; + } + + if (tbl_id == 0xff) + break; + } + + *size = buffer - *buff2; + return 0; +} + +int rte_pmd_ice_dump_switch(uint16_t port, uint8_t **buff, uint32_t *size) +{ + struct rte_eth_dev *dev; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port, -ENODEV); + + dev = &rte_eth_devices[port]; + if (!is_ice_supported(dev)) + return -ENOTSUP; + + return ice_dump_switch(dev, buff, size); +} diff --git a/drivers/net/ice/ice_testpmd.c b/drivers/net/ice/ice_testpmd.c index 2de9b36503..34fdc7458e 100644 --- a/drivers/net/ice/ice_testpmd.c +++ b/drivers/net/ice/ice_testpmd.c @@ -11,11 +11,12 @@ /* Fixed size for ICE ddp runtime configure */ #define ICE_BUFF_SIZE 0x000c9000 +#define ICE_SWITCH_BUFF_SIZE (4 * 1024 * 1024) /* Dump device ddp package, only for ice PF */ struct cmd_ddp_dump_result { cmdline_fixed_string_t ddp; - cmdline_fixed_string_t add; + cmdline_fixed_string_t dump; portid_t port_id; char filepath[]; }; @@ -23,7 +24,7 @@ struct cmd_ddp_dump_result { cmdline_parse_token_string_t cmd_ddp_dump_ddp = TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_result, ddp, "ddp"); cmdline_parse_token_string_t cmd_ddp_dump_dump = - TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_result, add, "dump"); + TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_result, dump, "dump"); cmdline_parse_token_num_t cmd_ddp_dump_port_id = TOKEN_NUM_INITIALIZER(struct cmd_ddp_dump_result, port_id, RTE_UINT16); cmdline_parse_token_string_t cmd_ddp_dump_filepath = @@ -77,6 +78,75 @@ cmdline_parse_inst_t cmd_ddp_dump = { }, }; +struct cmd_ddp_dump_switch_result { + cmdline_fixed_string_t ddp; + cmdline_fixed_string_t dump; + cmdline_fixed_string_t swt; + portid_t port_id; + char filepath[]; +}; + +cmdline_parse_token_string_t cmd_ddp_dump_swt_ddp = + TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_switch_result, ddp, "ddp"); +cmdline_parse_token_string_t cmd_ddp_dump_swt_dump = + TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_switch_result, dump, "dump"); +cmdline_parse_token_string_t cmd_ddp_dump_swt_switch = + TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_switch_result, swt, "switch"); +cmdline_parse_token_num_t cmd_ddp_dump_swt_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_ddp_dump_switch_result, port_id, RTE_UINT16); +cmdline_parse_token_string_t cmd_ddp_dump_swt_filepath = + TOKEN_STRING_INITIALIZER(struct cmd_ddp_dump_switch_result, filepath, NULL); + +static void +cmd_ddp_dump_switch_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + __rte_unused void *data) +{ + struct cmd_ddp_dump_switch_result *res = parsed_result; + uint8_t *buff; + uint32_t size; + int ret = -ENOTSUP; + + size = ICE_SWITCH_BUFF_SIZE; + buff = malloc(size); + if (buff) { + ret = rte_pmd_ice_dump_switch(res->port_id, &buff, &size); + switch (ret) { + case 0: + save_file(res->filepath, buff, size); + break; + case -EINVAL: + fprintf(stderr, "Invalid buffer size\n"); + break; + case -ENOTSUP: + fprintf(stderr, + "Device doesn't support " + "dump DDP switch runtime configure.\n"); + break; + default: + fprintf(stderr, + "Failed to dump DDP switch runtime configure," + " error: (%s)\n", strerror(-ret)); + } + } + free(buff); +} + + +cmdline_parse_inst_t cmd_ddp_dump_switch = { + .f = cmd_ddp_dump_switch_parsed, + .data = NULL, + .help_str = "ddp dump switch ", + .tokens = { + (void *)&cmd_ddp_dump_swt_ddp, + (void *)&cmd_ddp_dump_swt_dump, + (void *)&cmd_ddp_dump_swt_switch, + (void *)&cmd_ddp_dump_swt_port_id, + (void *)&cmd_ddp_dump_swt_filepath, + NULL, + }, +}; + static struct testpmd_driver_commands ice_cmds = { .commands = { { @@ -84,6 +154,12 @@ static struct testpmd_driver_commands ice_cmds = { "ddp dump (port_id) (config_path)\n" " Dump a runtime configure on a port\n\n", + }, + { + &cmd_ddp_dump_switch, + "ddp dump switch (port_id) (config_path)\n" + " Dump a runtime switch configure on a port\n\n", + }, { NULL, NULL }, }, diff --git a/drivers/net/ice/rte_pmd_ice.h b/drivers/net/ice/rte_pmd_ice.h index 53c81ccf4e..6a7efc6ce4 100644 --- a/drivers/net/ice/rte_pmd_ice.h +++ b/drivers/net/ice/rte_pmd_ice.h @@ -240,6 +240,9 @@ rte_net_ice_dump_proto_xtr_metadata(struct rte_mbuf *m) __rte_experimental int rte_pmd_ice_dump_package(uint16_t port, uint8_t **buff, uint32_t *size); +__rte_experimental +int rte_pmd_ice_dump_switch(uint16_t port, uint8_t **buff, uint32_t *size); + #ifdef __cplusplus } #endif diff --git a/drivers/net/ice/version.map b/drivers/net/ice/version.map index 60a3f17393..e77e27c95f 100644 --- a/drivers/net/ice/version.map +++ b/drivers/net/ice/version.map @@ -14,4 +14,5 @@ EXPERIMENTAL { rte_net_ice_dynflag_proto_xtr_tcp_mask; rte_net_ice_dynflag_proto_xtr_ip_offset_mask; rte_pmd_ice_dump_package; + rte_pmd_ice_dump_switch; };