From 78118d209b8e180364a2f1588086fa0e93968de2 Mon Sep 17 00:00:00 2001 From: wenglianfa Date: Thu, 3 Jul 2025 17:25:08 +0800 Subject: [PATCH 1/2] hikptool/roce: Support to print u64 reg_data Support to print u64 reg_data. Signed-off-by: wenglianfa --- .../roce_ext_common/hikp_roce_ext_common.c | 61 +++++++++++++------ .../roce_ext_common/hikp_roce_ext_common.h | 26 +++++++- 2 files changed, 66 insertions(+), 21 deletions(-) diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c index fda2cf8..c225ec8 100644 --- a/net/roce/roce_ext_common/hikp_roce_ext_common.c +++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c @@ -12,6 +12,7 @@ */ #include "hikp_roce_ext_common.h" +#include static void hikp_roce_ext_reg_data_free(struct reg_data *reg) { @@ -95,9 +96,11 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, struct roce_ext_res_param *roce_ext_res; struct reg_data *reg = &output->reg; struct hikp_cmd_ret *cmd_ret; + size_t reg_data_offset; uint32_t remain_block; - size_t reg_data_size; - size_t cur_size; + size_t offset_size; + size_t data_size; + void *dst_data; int ret; /* reg_array_length greater than or equal to 0 ensures that cmd_name @@ -117,6 +120,7 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, if (block_id == 0) { res_head->total_block_num = roce_ext_res->head.total_block_num; + res_head->flags = roce_ext_res->head.flags; if (!res_head->total_block_num) { printf("hikptool roce_%s total_block_num error!\n", cmd_name); @@ -124,10 +128,12 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, goto get_data_error; } reg->offset = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); - reg->data = (uint32_t *)calloc(res_head->total_block_num, sizeof(uint32_t)); + output->per_val_size = res_head->flags & ROCE_HIKP_DATA_U64_FLAG ? + sizeof(uint64_t) : sizeof(uint32_t); + reg->data = calloc(res_head->total_block_num, output->per_val_size); if ((reg->offset == NULL) || (reg->data == NULL)) { - printf("hikptool roce_%s alloc log memmory 0x%zx failed!\n", - cmd_name, res_head->total_block_num * sizeof(uint32_t)); + printf("hikptool roce_%s alloc log memmory failed!\n", + cmd_name); ret = -ENOMEM; hikp_roce_ext_reg_data_free(reg); goto get_data_error; @@ -144,20 +150,32 @@ static int hikp_roce_ext_get_res(enum roce_cmd_type cmd_type, goto get_data_error; } - cur_size = res_head->cur_block_num * sizeof(uint32_t); - /*calculates the size of reg_data in the roce_ext_res_param structure.*/ - reg_data_size = cmd_ret->rsp_data_num * sizeof(uint32_t) - sizeof(struct roce_ext_head); - if (cur_size + reg_array_length * sizeof(uint32_t) > reg_data_size) { - printf("hikptool roce_%s cur size error, cur_size: %zu, reg_data_size: %zu.\n", - cmd_name, cur_size, reg_data_size); + /* + * The data structure `roce_ext_res_param_u64` returned by the + * firmware is 8-byte aligned, so the offset of the `reg_data` + * member needs to be adjusted accordingly. + */ + if (res_head->flags & ROCE_HIKP_DATA_U64_FLAG) + reg_data_offset = offsetof(struct roce_ext_res_param_u64, reg_data); + else + reg_data_offset = offsetof(struct roce_ext_res_param, reg_data); + + offset_size = res_head->cur_block_num * sizeof(uint32_t); + data_size = res_head->cur_block_num * output->per_val_size; + dst_data = reg->data_u32 + block_id * output->per_val_size / sizeof(uint32_t); + /* Avoid memcpy out-of-bounds. */ + if ((reg_data_offset + data_size) / sizeof(uint32_t) + reg_array_length > cmd_ret->rsp_data_num) { + printf("hikptool roce_%s cur size error, data_size: %zu, rsp_data_num: %u.\n", + cmd_name, data_size, cmd_ret->rsp_data_num); ret = -EINVAL; hikp_roce_ext_reg_data_free(reg); goto get_data_error; } memcpy(reg->offset + block_id, - (uint32_t *)&roce_ext_res->reg_data, cur_size); - memcpy(reg->data + block_id, - (uint32_t *)&roce_ext_res->reg_data + reg_array_length, cur_size); + (uint32_t *)&roce_ext_res->head + reg_data_offset / sizeof(uint32_t), + offset_size); + memcpy(dst_data, (uint32_t *)&roce_ext_res->head + reg_data_offset + / sizeof(uint32_t) + reg_array_length, data_size); get_data_error: hikp_cmd_free(&cmd_ret); @@ -172,15 +190,20 @@ static void hikp_roce_ext_print(enum roce_cmd_type cmd_type, const char *cmd_name = get_cmd_name(cmd_type); uint8_t arr_len = output->reg_name.arr_len; uint32_t *offset = output->reg.offset; - uint32_t *data = output->reg.data; + struct reg_data *reg = &output->reg; + const char *name; uint32_t i; printf("**************%s INFO*************\n", cmd_name); printf("%-40s[addr_offset] : reg_data\n", "reg_name"); - for (i = 0; i < total_block_num; i++) - printf("%-40s[0x%08X] : 0x%08X\n", - i < arr_len ? reg_name[i] : "", - offset[i], data[i]); + for (i = 0; i < total_block_num; i++) { + name = i < arr_len ? reg_name[i] : ""; + printf("%-40s[0x%08X] : ", name, offset[i]); + if (output->res_head.flags & ROCE_HIKP_DATA_U64_FLAG) + printf("0x%016lX\n", reg->data_u64[i]); + else + printf("0x%08X\n", reg->data_u32[i]); + } printf("************************************\n"); } diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.h b/net/roce/roce_ext_common/hikp_roce_ext_common.h index 8568556..6f04024 100644 --- a/net/roce/roce_ext_common/hikp_roce_ext_common.h +++ b/net/roce/roce_ext_common/hikp_roce_ext_common.h @@ -17,6 +17,7 @@ #include "hikp_net_lib.h" #define ROCE_MAX_REG_NUM (NET_MAX_REQ_DATA_NUM - 1) +#define ROCE_MAX_U64_REG_NUM 18 #define ROCE_HIKP_CAEP_REG_NUM_EXT ROCE_MAX_REG_NUM #define ROCE_HIKP_GMV_REG_NUM_EXT ROCE_MAX_REG_NUM @@ -30,11 +31,15 @@ #define ROCE_HIKP_RST_REG_NUM ROCE_MAX_REG_NUM #define ROCE_HIKP_GLOBAL_CFG_REG_NUM ROCE_MAX_REG_NUM #define ROCE_HIKP_BOND_REG_NUM ROCE_MAX_REG_NUM +#define ROCE_HIKP_DFX_STA_NUM_EXT ROCE_MAX_U64_REG_NUM + +#define ROCE_HIKP_DATA_U64_FLAG 1 << 0 struct roce_ext_head { uint8_t total_block_num; uint8_t cur_block_num; - uint16_t reserved; + uint8_t flags; + uint8_t reserved; }; struct roce_ext_res_param { @@ -42,9 +47,25 @@ struct roce_ext_res_param { uint32_t reg_data[0]; }; +struct roce_ext_res_data_u64 { + uint32_t offset[ROCE_MAX_U64_REG_NUM]; + uint64_t data[ROCE_MAX_U64_REG_NUM]; + uint32_t rsv[4]; +}; + +struct roce_ext_res_param_u64 { + struct roce_ext_head head; + uint32_t rsv; + struct roce_ext_res_data_u64 reg_data; +}; + struct reg_data { uint32_t *offset; - uint32_t *data; + union { + void *data; + uint32_t *data_u32; + uint64_t *data_u64; + }; }; struct roce_ext_reg_name { @@ -55,6 +76,7 @@ struct roce_ext_reg_name { struct roce_ext_res_output { struct roce_ext_head res_head; struct reg_data reg; + uint32_t per_val_size; struct roce_ext_reg_name reg_name; }; -- Gitee From b55d9aee992ef2dc07e030f1ad08d5fbc5535738 Mon Sep 17 00:00:00 2001 From: wenglianfa Date: Wed, 2 Jul 2025 11:46:15 +0800 Subject: [PATCH 2/2] hikptool/roce: Add roce_dfx_sta cmd for RoCE DFX statistics Add roce_dfx_sta cmd for RoCE DFX statistics. Example: hikptool roce_dfx_sta -i eth1 Signed-off-by: wenglianfa --- info_collect/hikp_collect_roce.c | 22 ++++ net/hikp_net_lib.h | 1 + net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c | 107 ++++++++++++++++++ net/roce/roce_dfx_sta/hikp_roce_dfx_sta.h | 33 ++++++ .../roce_ext_common/hikp_roce_ext_common.c | 1 + 5 files changed, 164 insertions(+) create mode 100644 net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c create mode 100644 net/roce/roce_dfx_sta/hikp_roce_dfx_sta.h diff --git a/info_collect/hikp_collect_roce.c b/info_collect/hikp_collect_roce.c index fffceb1..e187de7 100644 --- a/info_collect/hikp_collect_roce.c +++ b/info_collect/hikp_collect_roce.c @@ -26,6 +26,7 @@ #include "hikp_roce_tsp.h" #include "hikp_roce_scc.h" #include "hikp_roce_gmv.h" +#include "hikp_roce_dfx_sta.h" static void collect_roce_devinfo_log(void) { @@ -125,6 +126,26 @@ static int collect_hikp_roce_gmv_log(void *nic_name) return 0; } +static int collect_hikp_roce_dfx_sta_log(void *nic_name) +{ + struct major_cmd_ctrl self = {0}; + struct hikp_cmd_type type = {0}; + int ret; + + self.cmd_ptr = &type; + ret = hikp_roce_set_dfx_sta_bdf((char *)nic_name); + if (ret) { + HIKP_ERROR_PRINT("failed to set roce_dfx_sta bdf for %s.\n", + (char *)nic_name); + return ret; + } + + printf("hikptool roce_dfx_sta -i %s\n", (char *)nic_name); + hikp_roce_dfx_sta_execute(&self); + + return 0; +} + static int collect_hikp_roce_scc_log(void *nic_name) { struct major_cmd_ctrl self = {0}; @@ -466,6 +487,7 @@ static int collect_one_roce_hikp_log(void *net_name) { "roce_tsp", collect_hikp_roce_tsp_log }, { "roce_scc", collect_hikp_roce_scc_log }, { "roce_gmv", collect_hikp_roce_gmv_log }, + { "roce_dfx_sta", collect_hikp_roce_dfx_sta_log }, }; size_t i; diff --git a/net/hikp_net_lib.h b/net/hikp_net_lib.h index 7ebabfa..aa700ab 100644 --- a/net/hikp_net_lib.h +++ b/net/hikp_net_lib.h @@ -103,6 +103,7 @@ enum roce_cmd_type { GET_ROCEE_RST_CMD, GET_ROCEE_GLOBAL_CFG_CMD, GET_ROCEE_BOND_CMD, + GET_ROCEE_DFX_STA_CMD, }; enum ub_cmd_type { diff --git a/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c b/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c new file mode 100644 index 0000000..b74507c --- /dev/null +++ b/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. + * Hikptool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * + * See the Mulan PSL v2 for more details. + */ + +#include "hikp_roce_dfx_sta.h" + +static struct cmd_roce_dfx_sta_param_t g_roce_dfx_sta_param_t = { 0 }; + +int hikp_roce_set_dfx_sta_bdf(char *nic_name) +{ + return tool_check_and_get_valid_bdf_id(nic_name, + &g_roce_dfx_sta_param_t.target); +} + +static int hikp_roce_dfx_sta_help(struct major_cmd_ctrl *self, const char *argv) +{ + HIKP_SET_USED(argv); + + printf("\n Usage: %s %s\n", self->cmd_ptr->name, "-i \n"); + printf("\n %s\n", self->cmd_ptr->help_info); + printf(" Options:\n\n"); + printf(" %s, %-25s %s\n", "-h", "--help", "display this help and exit"); + printf(" %s, %-25s %s\n", "-i", "--interface=", "device target, e.g. eth0"); + printf(" %s, %-25s %s\n", "-c", "--clear=", "clear param count registers"); + printf("\n"); + + return 0; +} + +static int hikp_roce_dfx_sta_target(struct major_cmd_ctrl *self, const char *argv) +{ + self->err_no = tool_check_and_get_valid_bdf_id(argv, &(g_roce_dfx_sta_param_t.target)); + if (self->err_no != 0) + snprintf(self->err_str, sizeof(self->err_str), "Unknown device %s.", argv); + + return self->err_no; +} + +static int hikp_roce_dfx_sta_clear_set(struct major_cmd_ctrl *self, const char *argv) +{ + HIKP_SET_USED(self); + HIKP_SET_USED(argv); + + g_roce_dfx_sta_param_t.reset_flag = 1; + return 0; +} + +/* DON'T change the order of this array or add entries between! */ +static const char *g_dfx_sta_reg_name[] = { + "PKT_RNR_STA", + "PKT_RTY_STA", + "MSN_RTY_STA", +}; + +static int hikp_roce_dfx_sta_get_data(struct hikp_cmd_ret **cmd_ret, + uint32_t block_id, + struct roce_ext_reg_name *reg_name) +{ + struct hikp_cmd_header req_header = { 0 }; + struct roce_dfx_sta_req_param req_data; + uint32_t req_size; + int ret; + + reg_name->reg_name = g_dfx_sta_reg_name; + reg_name->arr_len = HIKP_ARRAY_SIZE(g_dfx_sta_reg_name); + + req_data.reset_flag = g_roce_dfx_sta_param_t.reset_flag; + req_data.bdf = g_roce_dfx_sta_param_t.target.bdf; + req_data.block_id = block_id; + + req_size = sizeof(struct roce_dfx_sta_req_param); + hikp_cmd_init(&req_header, ROCE_MOD, GET_ROCEE_DFX_STA_CMD, 0); + *cmd_ret = hikp_cmd_alloc(&req_header, &req_data, req_size); + ret = hikp_rsp_normal_check(*cmd_ret); + if (ret) + printf("hikptool roce_dfx_sta get cmd data failed, ret: %d\n", ret); + + return ret; +} + +void hikp_roce_dfx_sta_execute(struct major_cmd_ctrl *self) +{ + hikp_roce_ext_execute(self, GET_ROCEE_DFX_STA_CMD, hikp_roce_dfx_sta_get_data); +} + +static void cmd_roce_dfx_sta_init(void) +{ + struct major_cmd_ctrl *major_cmd = get_major_cmd(); + + major_cmd->option_count = 0; + major_cmd->execute = hikp_roce_dfx_sta_execute; + + cmd_option_register("-h", "--help", false, hikp_roce_dfx_sta_help); + cmd_option_register("-i", "--interface", true, hikp_roce_dfx_sta_target); + cmd_option_register("-c", "--clear", false, hikp_roce_dfx_sta_clear_set); +} + +HIKP_CMD_DECLARE("roce_dfx_sta", "get or clear RoCE dfx statistics", cmd_roce_dfx_sta_init); diff --git a/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.h b/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.h new file mode 100644 index 0000000..b515356 --- /dev/null +++ b/net/roce/roce_dfx_sta/hikp_roce_dfx_sta.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2025 Hisilicon Technologies Co., Ltd. + * Hikptool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * + * See the Mulan PSL v2 for more details. + */ + +#ifndef HIKP_ROCE_DFX_STA_H +#define HIKP_ROCE_DFX_STA_H + +#include "hikp_roce_ext_common.h" + +struct cmd_roce_dfx_sta_param_t { + uint8_t reset_flag; + struct tool_target target; +}; + +struct roce_dfx_sta_req_param { + struct bdf_t bdf; + uint32_t block_id; + uint8_t reset_flag; +}; + +int hikp_roce_set_dfx_sta_bdf(char *nic_name); +void hikp_roce_dfx_sta_execute(struct major_cmd_ctrl *self); + +#endif /* HIKP_ROCE_DFX_STA_H */ diff --git a/net/roce/roce_ext_common/hikp_roce_ext_common.c b/net/roce/roce_ext_common/hikp_roce_ext_common.c index c225ec8..ac6c8fb 100644 --- a/net/roce/roce_ext_common/hikp_roce_ext_common.c +++ b/net/roce/roce_ext_common/hikp_roce_ext_common.c @@ -44,6 +44,7 @@ static const struct cmd_type_info { {GET_ROCEE_RST_CMD, "RST", ROCE_HIKP_RST_REG_NUM}, {GET_ROCEE_GLOBAL_CFG_CMD, "GLOBAL_CFG", ROCE_HIKP_GLOBAL_CFG_REG_NUM}, {GET_ROCEE_BOND_CMD, "BOND", ROCE_HIKP_BOND_REG_NUM}, + {GET_ROCEE_DFX_STA_CMD, "DFX_STA", ROCE_HIKP_DFX_STA_NUM_EXT}, }; static int get_cmd_info_table_idx(enum roce_cmd_type cmd_type) -- Gitee