From patchwork Tue Oct 18 06:47:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Yang X-Patchwork-Id: 118353 X-Patchwork-Delegate: qi.z.zhang@intel.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 8FCCAA0560; Tue, 18 Oct 2022 08:58:06 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 34B4A4021D; Tue, 18 Oct 2022 08:58:05 +0200 (CEST) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by mails.dpdk.org (Postfix) with ESMTP id D9D6040143 for ; Tue, 18 Oct 2022 08:58:03 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1666076284; x=1697612284; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=RIyjWLeOiREhg3F4XSiNCjaVIL1EKD2l4xzIXV2coqo=; b=C2XlrKlwiTUGpi8Gc0QGL/u00eOUTEDw+W9N86WyMNYdVyuKnW2Pg4UQ tgvcqCmttquo7/PY+2St/9G5QzxSpXUtXPXCrhdMB8c9InIJjmOdlZ/AU Cd/mg8VKx9V1NIz/ew9E9Y+T8T6CSj7A1fBporf8OX9WDprp1IGGPVgRu XBjOVaKcOk4oE/mzaIq+s8WLRkf1nSjZanfau9mgjJ+U7S2YqNX6eREcK rWjjS7PggNl+nbYGYEID143X5ne1t0pkirDiZvuwg3jbFa0MmeG93LUWY mvtUAUcVX5hsmBiFL+CKplrZGhbp2PPO70c+i2Omwpc0jHLXKXaCiQ8xT g==; X-IronPort-AV: E=McAfee;i="6500,9779,10503"; a="304756215" X-IronPort-AV: E=Sophos;i="5.95,193,1661842800"; d="scan'208";a="304756215" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Oct 2022 23:58:02 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10503"; a="771071220" X-IronPort-AV: E=Sophos;i="5.95,193,1661842800"; d="scan'208";a="771071220" Received: from intel-cd-odc-steve.cd.intel.com ([10.240.178.206]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Oct 2022 23:58:01 -0700 From: Steve Yang To: dev@dpdk.org Cc: qiming.yang@intel.com, qi.z.zhang@intel.com, Steve Yang Subject: [PATCH v2] net/ice: support ddp dump switch rule binary Date: Tue, 18 Oct 2022 06:47:36 +0000 Message-Id: <20221018064736.1727193-1-stevex.yang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221018061359.1554604-1-stevex.yang@intel.com> References: <20221018061359.1554604-1-stevex.yang@intel.com> 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 Acked-by: Qi Zhang --- drivers/net/ice/ice_ddp_package.c | 93 +++++++++++++++++++++++++++++++ drivers/net/ice/ice_ethdev.h | 2 + drivers/net/ice/ice_testpmd.c | 80 +++++++++++++++++++++++++- drivers/net/ice/version.map | 1 + 4 files changed, 174 insertions(+), 2 deletions(-) diff --git a/drivers/net/ice/ice_ddp_package.c b/drivers/net/ice/ice_ddp_package.c index a5b42c57d9..b881fa3ded 100644 --- a/drivers/net/ice/ice_ddp_package.c +++ b/drivers/net/ice/ice_ddp_package.c @@ -3,6 +3,8 @@ */ #include +#include +#include #include #include @@ -10,6 +12,7 @@ #include "ice_ethdev.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 @@ -417,3 +420,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_ethdev.h b/drivers/net/ice/ice_ethdev.h index a4b8ce2956..487a331117 100644 --- a/drivers/net/ice/ice_ethdev.h +++ b/drivers/net/ice/ice_ethdev.h @@ -734,4 +734,6 @@ ice_align_floor(int n) __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); #endif /* _ICE_ETHDEV_H_ */ diff --git a/drivers/net/ice/ice_testpmd.c b/drivers/net/ice/ice_testpmd.c index e292b5c4df..a7a8d0c53c 100644 --- a/drivers/net/ice/ice_testpmd.c +++ b/drivers/net/ice/ice_testpmd.c @@ -12,11 +12,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[]; }; @@ -24,7 +25,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 = @@ -78,6 +79,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 = { { @@ -85,6 +155,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/version.map b/drivers/net/ice/version.map index 67b7ec6e80..d70c250e9a 100644 --- a/drivers/net/ice/version.map +++ b/drivers/net/ice/version.map @@ -7,4 +7,5 @@ EXPERIMENTAL { # added in 19.11 rte_pmd_ice_dump_package; + rte_pmd_ice_dump_switch; };