13c666b58Sliuzhongzhu // SPDX-License-Identifier: GPL-2.0+ 23c666b58Sliuzhongzhu /* Copyright (c) 2018-2019 Hisilicon Limited. */ 33c666b58Sliuzhongzhu 43c666b58Sliuzhongzhu #include <linux/device.h> 53c666b58Sliuzhongzhu 66fc22440Sliuzhongzhu #include "hclge_debugfs.h" 71a7ff828SJiaran Zhang #include "hclge_err.h" 83c666b58Sliuzhongzhu #include "hclge_main.h" 92849d4e7Sliuzhongzhu #include "hclge_tm.h" 103c666b58Sliuzhongzhu #include "hnae3.h" 113c666b58Sliuzhongzhu 12d658ff34SYufeng Mo static const char * const state_str[] = { "off", "on" }; 131556ea91SHuazhong Tan static const char * const hclge_mac_state_str[] = { 141556ea91SHuazhong Tan "TO_ADD", "TO_DEL", "ACTIVE" 151556ea91SHuazhong Tan }; 161556ea91SHuazhong Tan 17e4b91468SRikard Falkeborn static const struct hclge_dbg_reg_type_info hclge_dbg_reg_info[] = { 18*d96b0e59SYufeng Mo { .cmd = HNAE3_DBG_CMD_REG_BIOS_COMMON, 19a582b78dSZhongzhu Liu .dfx_msg = &hclge_dbg_bios_common_reg[0], 20a582b78dSZhongzhu Liu .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_bios_common_reg), 21a582b78dSZhongzhu Liu .offset = HCLGE_DBG_DFX_BIOS_OFFSET, 22a582b78dSZhongzhu Liu .cmd = HCLGE_OPC_DFX_BIOS_COMMON_REG } }, 23*d96b0e59SYufeng Mo { .cmd = HNAE3_DBG_CMD_REG_SSU, 24a582b78dSZhongzhu Liu .dfx_msg = &hclge_dbg_ssu_reg_0[0], 25a582b78dSZhongzhu Liu .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_ssu_reg_0), 26a582b78dSZhongzhu Liu .offset = HCLGE_DBG_DFX_SSU_0_OFFSET, 27a582b78dSZhongzhu Liu .cmd = HCLGE_OPC_DFX_SSU_REG_0 } }, 28*d96b0e59SYufeng Mo { .cmd = HNAE3_DBG_CMD_REG_SSU, 29a582b78dSZhongzhu Liu .dfx_msg = &hclge_dbg_ssu_reg_1[0], 30a582b78dSZhongzhu Liu .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_ssu_reg_1), 31a582b78dSZhongzhu Liu .offset = HCLGE_DBG_DFX_SSU_1_OFFSET, 32a582b78dSZhongzhu Liu .cmd = HCLGE_OPC_DFX_SSU_REG_1 } }, 33*d96b0e59SYufeng Mo { .cmd = HNAE3_DBG_CMD_REG_SSU, 34a582b78dSZhongzhu Liu .dfx_msg = &hclge_dbg_ssu_reg_2[0], 35a582b78dSZhongzhu Liu .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_ssu_reg_2), 36a582b78dSZhongzhu Liu .offset = HCLGE_DBG_DFX_SSU_2_OFFSET, 37a582b78dSZhongzhu Liu .cmd = HCLGE_OPC_DFX_SSU_REG_2 } }, 38*d96b0e59SYufeng Mo { .cmd = HNAE3_DBG_CMD_REG_IGU_EGU, 39a582b78dSZhongzhu Liu .dfx_msg = &hclge_dbg_igu_egu_reg[0], 40a582b78dSZhongzhu Liu .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_igu_egu_reg), 41a582b78dSZhongzhu Liu .offset = HCLGE_DBG_DFX_IGU_OFFSET, 42a582b78dSZhongzhu Liu .cmd = HCLGE_OPC_DFX_IGU_EGU_REG } }, 43*d96b0e59SYufeng Mo { .cmd = HNAE3_DBG_CMD_REG_RPU, 44a582b78dSZhongzhu Liu .dfx_msg = &hclge_dbg_rpu_reg_0[0], 45a582b78dSZhongzhu Liu .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_rpu_reg_0), 46a582b78dSZhongzhu Liu .offset = HCLGE_DBG_DFX_RPU_0_OFFSET, 47a582b78dSZhongzhu Liu .cmd = HCLGE_OPC_DFX_RPU_REG_0 } }, 48*d96b0e59SYufeng Mo { .cmd = HNAE3_DBG_CMD_REG_RPU, 49a582b78dSZhongzhu Liu .dfx_msg = &hclge_dbg_rpu_reg_1[0], 50a582b78dSZhongzhu Liu .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_rpu_reg_1), 51a582b78dSZhongzhu Liu .offset = HCLGE_DBG_DFX_RPU_1_OFFSET, 52a582b78dSZhongzhu Liu .cmd = HCLGE_OPC_DFX_RPU_REG_1 } }, 53*d96b0e59SYufeng Mo { .cmd = HNAE3_DBG_CMD_REG_NCSI, 54a582b78dSZhongzhu Liu .dfx_msg = &hclge_dbg_ncsi_reg[0], 55a582b78dSZhongzhu Liu .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_ncsi_reg), 56a582b78dSZhongzhu Liu .offset = HCLGE_DBG_DFX_NCSI_OFFSET, 57a582b78dSZhongzhu Liu .cmd = HCLGE_OPC_DFX_NCSI_REG } }, 58*d96b0e59SYufeng Mo { .cmd = HNAE3_DBG_CMD_REG_RTC, 59a582b78dSZhongzhu Liu .dfx_msg = &hclge_dbg_rtc_reg[0], 60a582b78dSZhongzhu Liu .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_rtc_reg), 61a582b78dSZhongzhu Liu .offset = HCLGE_DBG_DFX_RTC_OFFSET, 62a582b78dSZhongzhu Liu .cmd = HCLGE_OPC_DFX_RTC_REG } }, 63*d96b0e59SYufeng Mo { .cmd = HNAE3_DBG_CMD_REG_PPP, 64a582b78dSZhongzhu Liu .dfx_msg = &hclge_dbg_ppp_reg[0], 65a582b78dSZhongzhu Liu .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_ppp_reg), 66a582b78dSZhongzhu Liu .offset = HCLGE_DBG_DFX_PPP_OFFSET, 67a582b78dSZhongzhu Liu .cmd = HCLGE_OPC_DFX_PPP_REG } }, 68*d96b0e59SYufeng Mo { .cmd = HNAE3_DBG_CMD_REG_RCB, 69a582b78dSZhongzhu Liu .dfx_msg = &hclge_dbg_rcb_reg[0], 70a582b78dSZhongzhu Liu .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_rcb_reg), 71a582b78dSZhongzhu Liu .offset = HCLGE_DBG_DFX_RCB_OFFSET, 72a582b78dSZhongzhu Liu .cmd = HCLGE_OPC_DFX_RCB_REG } }, 73*d96b0e59SYufeng Mo { .cmd = HNAE3_DBG_CMD_REG_TQP, 74a582b78dSZhongzhu Liu .dfx_msg = &hclge_dbg_tqp_reg[0], 75a582b78dSZhongzhu Liu .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_tqp_reg), 76a582b78dSZhongzhu Liu .offset = HCLGE_DBG_DFX_TQP_OFFSET, 77a582b78dSZhongzhu Liu .cmd = HCLGE_OPC_DFX_TQP_REG } }, 78a582b78dSZhongzhu Liu }; 79a582b78dSZhongzhu Liu 801556ea91SHuazhong Tan static void hclge_dbg_fill_content(char *content, u16 len, 811556ea91SHuazhong Tan const struct hclge_dbg_item *items, 821556ea91SHuazhong Tan const char **result, u16 size) 831556ea91SHuazhong Tan { 841556ea91SHuazhong Tan char *pos = content; 851556ea91SHuazhong Tan u16 i; 861556ea91SHuazhong Tan 871556ea91SHuazhong Tan memset(content, ' ', len); 881556ea91SHuazhong Tan for (i = 0; i < size; i++) { 891556ea91SHuazhong Tan if (result) 901556ea91SHuazhong Tan strncpy(pos, result[i], strlen(result[i])); 911556ea91SHuazhong Tan else 921556ea91SHuazhong Tan strncpy(pos, items[i].name, strlen(items[i].name)); 931556ea91SHuazhong Tan pos += strlen(items[i].name) + items[i].interval; 941556ea91SHuazhong Tan } 951556ea91SHuazhong Tan *pos++ = '\n'; 961556ea91SHuazhong Tan *pos++ = '\0'; 971556ea91SHuazhong Tan } 981556ea91SHuazhong Tan 991556ea91SHuazhong Tan static char *hclge_dbg_get_func_id_str(char *buf, u8 id) 1001556ea91SHuazhong Tan { 1011556ea91SHuazhong Tan if (id) 1021556ea91SHuazhong Tan sprintf(buf, "vf%u", id - 1); 1031556ea91SHuazhong Tan else 1041556ea91SHuazhong Tan sprintf(buf, "pf"); 1051556ea91SHuazhong Tan 1061556ea91SHuazhong Tan return buf; 1071556ea91SHuazhong Tan } 1081556ea91SHuazhong Tan 109*d96b0e59SYufeng Mo static int hclge_dbg_get_dfx_bd_num(struct hclge_dev *hdev, int offset, 110*d96b0e59SYufeng Mo u32 *bd_num) 11127cf979aSliuzhongzhu { 112a582b78dSZhongzhu Liu struct hclge_desc desc[HCLGE_GET_DFX_REG_TYPE_CNT]; 113a582b78dSZhongzhu Liu int entries_per_desc; 114a582b78dSZhongzhu Liu int index; 11527cf979aSliuzhongzhu int ret; 11627cf979aSliuzhongzhu 117ddb54554SGuangbin Huang ret = hclge_query_bd_num_cmd_send(hdev, desc); 118ddb54554SGuangbin Huang if (ret) { 11927cf979aSliuzhongzhu dev_err(&hdev->pdev->dev, 120*d96b0e59SYufeng Mo "failed to get dfx bd_num, offset = %d, ret = %d\n", 121*d96b0e59SYufeng Mo offset, ret); 12227cf979aSliuzhongzhu return ret; 12327cf979aSliuzhongzhu } 12427cf979aSliuzhongzhu 125a582b78dSZhongzhu Liu entries_per_desc = ARRAY_SIZE(desc[0].data); 126a582b78dSZhongzhu Liu index = offset % entries_per_desc; 127*d96b0e59SYufeng Mo 128*d96b0e59SYufeng Mo *bd_num = le32_to_cpu(desc[offset / entries_per_desc].data[index]); 129*d96b0e59SYufeng Mo if (!(*bd_num)) { 130*d96b0e59SYufeng Mo dev_err(&hdev->pdev->dev, "The value of dfx bd_num is 0!\n"); 131*d96b0e59SYufeng Mo return -EINVAL; 132*d96b0e59SYufeng Mo } 133*d96b0e59SYufeng Mo 134*d96b0e59SYufeng Mo return 0; 13527cf979aSliuzhongzhu } 13627cf979aSliuzhongzhu 13727cf979aSliuzhongzhu static int hclge_dbg_cmd_send(struct hclge_dev *hdev, 13827cf979aSliuzhongzhu struct hclge_desc *desc_src, 13927cf979aSliuzhongzhu int index, int bd_num, 14027cf979aSliuzhongzhu enum hclge_opcode_type cmd) 14127cf979aSliuzhongzhu { 14227cf979aSliuzhongzhu struct hclge_desc *desc = desc_src; 14327cf979aSliuzhongzhu int ret, i; 14427cf979aSliuzhongzhu 14527cf979aSliuzhongzhu hclge_cmd_setup_basic_desc(desc, cmd, true); 14627cf979aSliuzhongzhu desc->data[0] = cpu_to_le32(index); 14727cf979aSliuzhongzhu 14827cf979aSliuzhongzhu for (i = 1; i < bd_num; i++) { 14927cf979aSliuzhongzhu desc->flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT); 15027cf979aSliuzhongzhu desc++; 15127cf979aSliuzhongzhu hclge_cmd_setup_basic_desc(desc, cmd, true); 15227cf979aSliuzhongzhu } 15327cf979aSliuzhongzhu 15427cf979aSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, desc_src, bd_num); 155ed5b255bSYufeng Mo if (ret) 15627cf979aSliuzhongzhu dev_err(&hdev->pdev->dev, 157ed5b255bSYufeng Mo "cmd(0x%x) send fail, ret = %d\n", cmd, ret); 15827cf979aSliuzhongzhu return ret; 15927cf979aSliuzhongzhu } 16027cf979aSliuzhongzhu 161*d96b0e59SYufeng Mo static int 162*d96b0e59SYufeng Mo hclge_dbg_dump_reg_tqp(struct hclge_dev *hdev, 163e4b91468SRikard Falkeborn const struct hclge_dbg_reg_type_info *reg_info, 164*d96b0e59SYufeng Mo char *buf, int len, int *pos) 16527cf979aSliuzhongzhu { 166e4b91468SRikard Falkeborn const struct hclge_dbg_dfx_message *dfx_message = reg_info->dfx_msg; 167e4b91468SRikard Falkeborn const struct hclge_dbg_reg_common_msg *reg_msg = ®_info->reg_msg; 16827cf979aSliuzhongzhu struct hclge_desc *desc_src; 169*d96b0e59SYufeng Mo u32 index, entry, i, cnt; 170*d96b0e59SYufeng Mo int bd_num, min_num, ret; 17127cf979aSliuzhongzhu struct hclge_desc *desc; 17227cf979aSliuzhongzhu 173*d96b0e59SYufeng Mo ret = hclge_dbg_get_dfx_bd_num(hdev, reg_msg->offset, &bd_num); 174*d96b0e59SYufeng Mo if (ret) 175*d96b0e59SYufeng Mo return ret; 17627cf979aSliuzhongzhu 177*d96b0e59SYufeng Mo desc_src = kcalloc(bd_num, sizeof(struct hclge_desc), GFP_KERNEL); 178fbdc4d79SYufeng Mo if (!desc_src) 179*d96b0e59SYufeng Mo return -ENOMEM; 18027cf979aSliuzhongzhu 181*d96b0e59SYufeng Mo min_num = min_t(int, bd_num * HCLGE_DESC_DATA_LEN, reg_msg->msg_num); 182*d96b0e59SYufeng Mo 183*d96b0e59SYufeng Mo for (i = 0, cnt = 0; i < min_num; i++, dfx_message++) 184*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "item%u = %s\n", 185*d96b0e59SYufeng Mo cnt++, dfx_message->message); 186*d96b0e59SYufeng Mo 187*d96b0e59SYufeng Mo for (i = 0; i < cnt; i++) 188*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "item%u\t", i); 189*d96b0e59SYufeng Mo 190*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "\n"); 191*d96b0e59SYufeng Mo 192*d96b0e59SYufeng Mo for (index = 0; index < hdev->vport[0].alloc_tqps; index++) { 193*d96b0e59SYufeng Mo dfx_message = reg_info->dfx_msg; 19427cf979aSliuzhongzhu desc = desc_src; 195*d96b0e59SYufeng Mo ret = hclge_dbg_cmd_send(hdev, desc, index, bd_num, 196*d96b0e59SYufeng Mo reg_msg->cmd); 197*d96b0e59SYufeng Mo if (ret) 198*d96b0e59SYufeng Mo break; 19927cf979aSliuzhongzhu 200*d96b0e59SYufeng Mo for (i = 0; i < min_num; i++, dfx_message++) { 201*d96b0e59SYufeng Mo entry = i % HCLGE_DESC_DATA_LEN; 202*d96b0e59SYufeng Mo if (i > 0 && !entry) 203a582b78dSZhongzhu Liu desc++; 20427cf979aSliuzhongzhu 205*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "%#x\t", 206*d96b0e59SYufeng Mo le32_to_cpu(desc->data[entry])); 207*d96b0e59SYufeng Mo } 208*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "\n"); 20927cf979aSliuzhongzhu } 21027cf979aSliuzhongzhu 21127cf979aSliuzhongzhu kfree(desc_src); 212*d96b0e59SYufeng Mo return ret; 21327cf979aSliuzhongzhu } 21427cf979aSliuzhongzhu 215*d96b0e59SYufeng Mo static int 216*d96b0e59SYufeng Mo hclge_dbg_dump_reg_common(struct hclge_dev *hdev, 217*d96b0e59SYufeng Mo const struct hclge_dbg_reg_type_info *reg_info, 218*d96b0e59SYufeng Mo char *buf, int len, int *pos) 219*d96b0e59SYufeng Mo { 220*d96b0e59SYufeng Mo const struct hclge_dbg_reg_common_msg *reg_msg = ®_info->reg_msg; 221*d96b0e59SYufeng Mo const struct hclge_dbg_dfx_message *dfx_message = reg_info->dfx_msg; 222*d96b0e59SYufeng Mo struct hclge_desc *desc_src; 223*d96b0e59SYufeng Mo int bd_num, min_num, ret; 224*d96b0e59SYufeng Mo struct hclge_desc *desc; 225*d96b0e59SYufeng Mo u32 entry, i; 226*d96b0e59SYufeng Mo 227*d96b0e59SYufeng Mo ret = hclge_dbg_get_dfx_bd_num(hdev, reg_msg->offset, &bd_num); 228*d96b0e59SYufeng Mo if (ret) 229*d96b0e59SYufeng Mo return ret; 230*d96b0e59SYufeng Mo 231*d96b0e59SYufeng Mo desc_src = kcalloc(bd_num, sizeof(struct hclge_desc), GFP_KERNEL); 232*d96b0e59SYufeng Mo if (!desc_src) 233*d96b0e59SYufeng Mo return -ENOMEM; 234*d96b0e59SYufeng Mo 235*d96b0e59SYufeng Mo desc = desc_src; 236*d96b0e59SYufeng Mo 237*d96b0e59SYufeng Mo ret = hclge_dbg_cmd_send(hdev, desc, 0, bd_num, reg_msg->cmd); 238*d96b0e59SYufeng Mo if (ret) { 239*d96b0e59SYufeng Mo kfree(desc); 240*d96b0e59SYufeng Mo return ret; 241*d96b0e59SYufeng Mo } 242*d96b0e59SYufeng Mo 243*d96b0e59SYufeng Mo min_num = min_t(int, bd_num * HCLGE_DESC_DATA_LEN, reg_msg->msg_num); 244*d96b0e59SYufeng Mo 245*d96b0e59SYufeng Mo for (i = 0; i < min_num; i++, dfx_message++) { 246*d96b0e59SYufeng Mo entry = i % HCLGE_DESC_DATA_LEN; 247*d96b0e59SYufeng Mo if (i > 0 && !entry) 248*d96b0e59SYufeng Mo desc++; 249*d96b0e59SYufeng Mo if (!dfx_message->flag) 250*d96b0e59SYufeng Mo continue; 251*d96b0e59SYufeng Mo 252*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "%s: %#x\n", 253*d96b0e59SYufeng Mo dfx_message->message, 254*d96b0e59SYufeng Mo le32_to_cpu(desc->data[entry])); 255*d96b0e59SYufeng Mo } 256*d96b0e59SYufeng Mo 257*d96b0e59SYufeng Mo kfree(desc_src); 258*d96b0e59SYufeng Mo return 0; 259*d96b0e59SYufeng Mo } 260*d96b0e59SYufeng Mo 261*d96b0e59SYufeng Mo static int hclge_dbg_dump_mac_enable_status(struct hclge_dev *hdev, char *buf, 262*d96b0e59SYufeng Mo int len, int *pos) 2635cb51cfeSYufeng Mo { 2645cb51cfeSYufeng Mo struct hclge_config_mac_mode_cmd *req; 2655cb51cfeSYufeng Mo struct hclge_desc desc; 2665cb51cfeSYufeng Mo u32 loop_en; 2675cb51cfeSYufeng Mo int ret; 2685cb51cfeSYufeng Mo 2695cb51cfeSYufeng Mo hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_MAC_MODE, true); 2705cb51cfeSYufeng Mo 2715cb51cfeSYufeng Mo ret = hclge_cmd_send(&hdev->hw, &desc, 1); 2725cb51cfeSYufeng Mo if (ret) { 2735cb51cfeSYufeng Mo dev_err(&hdev->pdev->dev, 2745cb51cfeSYufeng Mo "failed to dump mac enable status, ret = %d\n", ret); 275*d96b0e59SYufeng Mo return ret; 2765cb51cfeSYufeng Mo } 2775cb51cfeSYufeng Mo 2785cb51cfeSYufeng Mo req = (struct hclge_config_mac_mode_cmd *)desc.data; 2795cb51cfeSYufeng Mo loop_en = le32_to_cpu(req->txrx_pad_fcs_loop_en); 2805cb51cfeSYufeng Mo 281*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "mac_trans_en: %#x\n", 2825cb51cfeSYufeng Mo hnae3_get_bit(loop_en, HCLGE_MAC_TX_EN_B)); 283*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "mac_rcv_en: %#x\n", 2845cb51cfeSYufeng Mo hnae3_get_bit(loop_en, HCLGE_MAC_RX_EN_B)); 285*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "pad_trans_en: %#x\n", 2865cb51cfeSYufeng Mo hnae3_get_bit(loop_en, HCLGE_MAC_PAD_TX_B)); 287*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "pad_rcv_en: %#x\n", 2885cb51cfeSYufeng Mo hnae3_get_bit(loop_en, HCLGE_MAC_PAD_RX_B)); 289*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "1588_trans_en: %#x\n", 2905cb51cfeSYufeng Mo hnae3_get_bit(loop_en, HCLGE_MAC_1588_TX_B)); 291*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "1588_rcv_en: %#x\n", 2925cb51cfeSYufeng Mo hnae3_get_bit(loop_en, HCLGE_MAC_1588_RX_B)); 293*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "mac_app_loop_en: %#x\n", 2945cb51cfeSYufeng Mo hnae3_get_bit(loop_en, HCLGE_MAC_APP_LP_B)); 295*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "mac_line_loop_en: %#x\n", 2965cb51cfeSYufeng Mo hnae3_get_bit(loop_en, HCLGE_MAC_LINE_LP_B)); 297*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "mac_fcs_tx_en: %#x\n", 2985cb51cfeSYufeng Mo hnae3_get_bit(loop_en, HCLGE_MAC_FCS_TX_B)); 299*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, 300*d96b0e59SYufeng Mo "mac_rx_oversize_truncate_en: %#x\n", 301*d96b0e59SYufeng Mo hnae3_get_bit(loop_en, 302*d96b0e59SYufeng Mo HCLGE_MAC_RX_OVERSIZE_TRUNCATE_B)); 303*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "mac_rx_fcs_strip_en: %#x\n", 3045cb51cfeSYufeng Mo hnae3_get_bit(loop_en, HCLGE_MAC_RX_FCS_STRIP_B)); 305*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "mac_rx_fcs_en: %#x\n", 3065cb51cfeSYufeng Mo hnae3_get_bit(loop_en, HCLGE_MAC_RX_FCS_B)); 307*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, 308*d96b0e59SYufeng Mo "mac_tx_under_min_err_en: %#x\n", 3095cb51cfeSYufeng Mo hnae3_get_bit(loop_en, HCLGE_MAC_TX_UNDER_MIN_ERR_B)); 310*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, 311*d96b0e59SYufeng Mo "mac_tx_oversize_truncate_en: %#x\n", 312*d96b0e59SYufeng Mo hnae3_get_bit(loop_en, 313*d96b0e59SYufeng Mo HCLGE_MAC_TX_OVERSIZE_TRUNCATE_B)); 314*d96b0e59SYufeng Mo 315*d96b0e59SYufeng Mo return 0; 3165cb51cfeSYufeng Mo } 3175cb51cfeSYufeng Mo 318*d96b0e59SYufeng Mo static int hclge_dbg_dump_mac_frame_size(struct hclge_dev *hdev, char *buf, 319*d96b0e59SYufeng Mo int len, int *pos) 3205cb51cfeSYufeng Mo { 3215cb51cfeSYufeng Mo struct hclge_config_max_frm_size_cmd *req; 3225cb51cfeSYufeng Mo struct hclge_desc desc; 3235cb51cfeSYufeng Mo int ret; 3245cb51cfeSYufeng Mo 3255cb51cfeSYufeng Mo hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_MAX_FRM_SIZE, true); 3265cb51cfeSYufeng Mo 3275cb51cfeSYufeng Mo ret = hclge_cmd_send(&hdev->hw, &desc, 1); 3285cb51cfeSYufeng Mo if (ret) { 3295cb51cfeSYufeng Mo dev_err(&hdev->pdev->dev, 3305cb51cfeSYufeng Mo "failed to dump mac frame size, ret = %d\n", ret); 331*d96b0e59SYufeng Mo return ret; 3325cb51cfeSYufeng Mo } 3335cb51cfeSYufeng Mo 3345cb51cfeSYufeng Mo req = (struct hclge_config_max_frm_size_cmd *)desc.data; 3355cb51cfeSYufeng Mo 336*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "max_frame_size: %u\n", 3375cb51cfeSYufeng Mo le16_to_cpu(req->max_frm_size)); 338*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "min_frame_size: %u\n", 339*d96b0e59SYufeng Mo req->min_frm_size); 340*d96b0e59SYufeng Mo 341*d96b0e59SYufeng Mo return 0; 3425cb51cfeSYufeng Mo } 3435cb51cfeSYufeng Mo 344*d96b0e59SYufeng Mo static int hclge_dbg_dump_mac_speed_duplex(struct hclge_dev *hdev, char *buf, 345*d96b0e59SYufeng Mo int len, int *pos) 3465cb51cfeSYufeng Mo { 3475cb51cfeSYufeng Mo #define HCLGE_MAC_SPEED_SHIFT 0 3485cb51cfeSYufeng Mo #define HCLGE_MAC_SPEED_MASK GENMASK(5, 0) 3495cb51cfeSYufeng Mo #define HCLGE_MAC_DUPLEX_SHIFT 7 3505cb51cfeSYufeng Mo 3515cb51cfeSYufeng Mo struct hclge_config_mac_speed_dup_cmd *req; 3525cb51cfeSYufeng Mo struct hclge_desc desc; 3535cb51cfeSYufeng Mo int ret; 3545cb51cfeSYufeng Mo 3555cb51cfeSYufeng Mo hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_SPEED_DUP, true); 3565cb51cfeSYufeng Mo 3575cb51cfeSYufeng Mo ret = hclge_cmd_send(&hdev->hw, &desc, 1); 3585cb51cfeSYufeng Mo if (ret) { 3595cb51cfeSYufeng Mo dev_err(&hdev->pdev->dev, 3605cb51cfeSYufeng Mo "failed to dump mac speed duplex, ret = %d\n", ret); 361*d96b0e59SYufeng Mo return ret; 3625cb51cfeSYufeng Mo } 3635cb51cfeSYufeng Mo 3645cb51cfeSYufeng Mo req = (struct hclge_config_mac_speed_dup_cmd *)desc.data; 3655cb51cfeSYufeng Mo 366*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "speed: %#lx\n", 3675cb51cfeSYufeng Mo hnae3_get_field(req->speed_dup, HCLGE_MAC_SPEED_MASK, 3685cb51cfeSYufeng Mo HCLGE_MAC_SPEED_SHIFT)); 369*d96b0e59SYufeng Mo *pos += scnprintf(buf + *pos, len - *pos, "duplex: %#x\n", 370*d96b0e59SYufeng Mo hnae3_get_bit(req->speed_dup, 371*d96b0e59SYufeng Mo HCLGE_MAC_DUPLEX_SHIFT)); 372*d96b0e59SYufeng Mo return 0; 3735cb51cfeSYufeng Mo } 3745cb51cfeSYufeng Mo 375*d96b0e59SYufeng Mo static int hclge_dbg_dump_mac(struct hclge_dev *hdev, char *buf, int len) 3765cb51cfeSYufeng Mo { 377*d96b0e59SYufeng Mo int pos = 0; 378*d96b0e59SYufeng Mo int ret; 3795cb51cfeSYufeng Mo 380*d96b0e59SYufeng Mo ret = hclge_dbg_dump_mac_enable_status(hdev, buf, len, &pos); 381*d96b0e59SYufeng Mo if (ret) 382*d96b0e59SYufeng Mo return ret; 3835cb51cfeSYufeng Mo 384*d96b0e59SYufeng Mo ret = hclge_dbg_dump_mac_frame_size(hdev, buf, len, &pos); 385*d96b0e59SYufeng Mo if (ret) 386*d96b0e59SYufeng Mo return ret; 387*d96b0e59SYufeng Mo 388*d96b0e59SYufeng Mo return hclge_dbg_dump_mac_speed_duplex(hdev, buf, len, &pos); 3895cb51cfeSYufeng Mo } 3905cb51cfeSYufeng Mo 391ebaf1908SWeihang Li static void hclge_dbg_dump_dcb(struct hclge_dev *hdev, const char *cmd_buf) 392c0ebebb9Sliuzhongzhu { 393c0ebebb9Sliuzhongzhu struct device *dev = &hdev->pdev->dev; 394c0ebebb9Sliuzhongzhu struct hclge_dbg_bitmap_cmd *bitmap; 39577ba415dSYufeng Mo enum hclge_opcode_type cmd; 396c0ebebb9Sliuzhongzhu int rq_id, pri_id, qset_id; 397c0ebebb9Sliuzhongzhu int port_id, nq_id, pg_id; 398c0ebebb9Sliuzhongzhu struct hclge_desc desc[2]; 399c0ebebb9Sliuzhongzhu 400c0ebebb9Sliuzhongzhu int cnt, ret; 401c0ebebb9Sliuzhongzhu 402c0ebebb9Sliuzhongzhu cnt = sscanf(cmd_buf, "%i %i %i %i %i %i", 403c0ebebb9Sliuzhongzhu &port_id, &pri_id, &pg_id, &rq_id, &nq_id, &qset_id); 404c0ebebb9Sliuzhongzhu if (cnt != 6) { 405c0ebebb9Sliuzhongzhu dev_err(&hdev->pdev->dev, 406c0ebebb9Sliuzhongzhu "dump dcb: bad command parameter, cnt=%d\n", cnt); 407c0ebebb9Sliuzhongzhu return; 408c0ebebb9Sliuzhongzhu } 409c0ebebb9Sliuzhongzhu 41077ba415dSYufeng Mo cmd = HCLGE_OPC_QSET_DFX_STS; 41177ba415dSYufeng Mo ret = hclge_dbg_cmd_send(hdev, desc, qset_id, 1, cmd); 412c0ebebb9Sliuzhongzhu if (ret) 41377ba415dSYufeng Mo goto err_dcb_cmd_send; 414c0ebebb9Sliuzhongzhu 415c0ebebb9Sliuzhongzhu bitmap = (struct hclge_dbg_bitmap_cmd *)&desc[0].data[1]; 416c0ebebb9Sliuzhongzhu dev_info(dev, "roce_qset_mask: 0x%x\n", bitmap->bit0); 417c0ebebb9Sliuzhongzhu dev_info(dev, "nic_qs_mask: 0x%x\n", bitmap->bit1); 418c0ebebb9Sliuzhongzhu dev_info(dev, "qs_shaping_pass: 0x%x\n", bitmap->bit2); 419c0ebebb9Sliuzhongzhu dev_info(dev, "qs_bp_sts: 0x%x\n", bitmap->bit3); 420c0ebebb9Sliuzhongzhu 42177ba415dSYufeng Mo cmd = HCLGE_OPC_PRI_DFX_STS; 42277ba415dSYufeng Mo ret = hclge_dbg_cmd_send(hdev, desc, pri_id, 1, cmd); 423c0ebebb9Sliuzhongzhu if (ret) 42477ba415dSYufeng Mo goto err_dcb_cmd_send; 425c0ebebb9Sliuzhongzhu 426c0ebebb9Sliuzhongzhu bitmap = (struct hclge_dbg_bitmap_cmd *)&desc[0].data[1]; 427c0ebebb9Sliuzhongzhu dev_info(dev, "pri_mask: 0x%x\n", bitmap->bit0); 428c0ebebb9Sliuzhongzhu dev_info(dev, "pri_cshaping_pass: 0x%x\n", bitmap->bit1); 429c0ebebb9Sliuzhongzhu dev_info(dev, "pri_pshaping_pass: 0x%x\n", bitmap->bit2); 430c0ebebb9Sliuzhongzhu 43177ba415dSYufeng Mo cmd = HCLGE_OPC_PG_DFX_STS; 43277ba415dSYufeng Mo ret = hclge_dbg_cmd_send(hdev, desc, pg_id, 1, cmd); 433c0ebebb9Sliuzhongzhu if (ret) 43477ba415dSYufeng Mo goto err_dcb_cmd_send; 435c0ebebb9Sliuzhongzhu 436c0ebebb9Sliuzhongzhu bitmap = (struct hclge_dbg_bitmap_cmd *)&desc[0].data[1]; 437c0ebebb9Sliuzhongzhu dev_info(dev, "pg_mask: 0x%x\n", bitmap->bit0); 438c0ebebb9Sliuzhongzhu dev_info(dev, "pg_cshaping_pass: 0x%x\n", bitmap->bit1); 439c0ebebb9Sliuzhongzhu dev_info(dev, "pg_pshaping_pass: 0x%x\n", bitmap->bit2); 440c0ebebb9Sliuzhongzhu 44177ba415dSYufeng Mo cmd = HCLGE_OPC_PORT_DFX_STS; 44277ba415dSYufeng Mo ret = hclge_dbg_cmd_send(hdev, desc, port_id, 1, cmd); 443c0ebebb9Sliuzhongzhu if (ret) 44477ba415dSYufeng Mo goto err_dcb_cmd_send; 445c0ebebb9Sliuzhongzhu 446c0ebebb9Sliuzhongzhu bitmap = (struct hclge_dbg_bitmap_cmd *)&desc[0].data[1]; 447c0ebebb9Sliuzhongzhu dev_info(dev, "port_mask: 0x%x\n", bitmap->bit0); 448c0ebebb9Sliuzhongzhu dev_info(dev, "port_shaping_pass: 0x%x\n", bitmap->bit1); 449c0ebebb9Sliuzhongzhu 45077ba415dSYufeng Mo cmd = HCLGE_OPC_SCH_NQ_CNT; 45177ba415dSYufeng Mo ret = hclge_dbg_cmd_send(hdev, desc, nq_id, 1, cmd); 452c0ebebb9Sliuzhongzhu if (ret) 45377ba415dSYufeng Mo goto err_dcb_cmd_send; 454c0ebebb9Sliuzhongzhu 45539edaf24SGuojia Liao dev_info(dev, "sch_nq_cnt: 0x%x\n", le32_to_cpu(desc[0].data[1])); 456c0ebebb9Sliuzhongzhu 45777ba415dSYufeng Mo cmd = HCLGE_OPC_SCH_RQ_CNT; 45877ba415dSYufeng Mo ret = hclge_dbg_cmd_send(hdev, desc, nq_id, 1, cmd); 459c0ebebb9Sliuzhongzhu if (ret) 46077ba415dSYufeng Mo goto err_dcb_cmd_send; 461c0ebebb9Sliuzhongzhu 46239edaf24SGuojia Liao dev_info(dev, "sch_rq_cnt: 0x%x\n", le32_to_cpu(desc[0].data[1])); 463c0ebebb9Sliuzhongzhu 46477ba415dSYufeng Mo cmd = HCLGE_OPC_TM_INTERNAL_STS; 46577ba415dSYufeng Mo ret = hclge_dbg_cmd_send(hdev, desc, 0, 2, cmd); 466c0ebebb9Sliuzhongzhu if (ret) 46777ba415dSYufeng Mo goto err_dcb_cmd_send; 468c0ebebb9Sliuzhongzhu 46939edaf24SGuojia Liao dev_info(dev, "pri_bp: 0x%x\n", le32_to_cpu(desc[0].data[1])); 47039edaf24SGuojia Liao dev_info(dev, "fifo_dfx_info: 0x%x\n", le32_to_cpu(desc[0].data[2])); 47139edaf24SGuojia Liao dev_info(dev, "sch_roce_fifo_afull_gap: 0x%x\n", 47239edaf24SGuojia Liao le32_to_cpu(desc[0].data[3])); 47339edaf24SGuojia Liao dev_info(dev, "tx_private_waterline: 0x%x\n", 47439edaf24SGuojia Liao le32_to_cpu(desc[0].data[4])); 47539edaf24SGuojia Liao dev_info(dev, "tm_bypass_en: 0x%x\n", le32_to_cpu(desc[0].data[5])); 47639edaf24SGuojia Liao dev_info(dev, "SSU_TM_BYPASS_EN: 0x%x\n", le32_to_cpu(desc[1].data[0])); 47739edaf24SGuojia Liao dev_info(dev, "SSU_RESERVE_CFG: 0x%x\n", le32_to_cpu(desc[1].data[1])); 478c0ebebb9Sliuzhongzhu 47977ba415dSYufeng Mo cmd = HCLGE_OPC_TM_INTERNAL_CNT; 48077ba415dSYufeng Mo ret = hclge_dbg_cmd_send(hdev, desc, port_id, 1, cmd); 481c0ebebb9Sliuzhongzhu if (ret) 48277ba415dSYufeng Mo goto err_dcb_cmd_send; 483c0ebebb9Sliuzhongzhu 48439edaf24SGuojia Liao dev_info(dev, "SCH_NIC_NUM: 0x%x\n", le32_to_cpu(desc[0].data[1])); 48539edaf24SGuojia Liao dev_info(dev, "SCH_ROCE_NUM: 0x%x\n", le32_to_cpu(desc[0].data[2])); 486c0ebebb9Sliuzhongzhu 48777ba415dSYufeng Mo cmd = HCLGE_OPC_TM_INTERNAL_STS_1; 48877ba415dSYufeng Mo ret = hclge_dbg_cmd_send(hdev, desc, port_id, 1, cmd); 489c0ebebb9Sliuzhongzhu if (ret) 49077ba415dSYufeng Mo goto err_dcb_cmd_send; 491c0ebebb9Sliuzhongzhu 49239edaf24SGuojia Liao dev_info(dev, "TC_MAP_SEL: 0x%x\n", le32_to_cpu(desc[0].data[1])); 49339edaf24SGuojia Liao dev_info(dev, "IGU_PFC_PRI_EN: 0x%x\n", le32_to_cpu(desc[0].data[2])); 49439edaf24SGuojia Liao dev_info(dev, "MAC_PFC_PRI_EN: 0x%x\n", le32_to_cpu(desc[0].data[3])); 49539edaf24SGuojia Liao dev_info(dev, "IGU_PRI_MAP_TC_CFG: 0x%x\n", 49639edaf24SGuojia Liao le32_to_cpu(desc[0].data[4])); 49739edaf24SGuojia Liao dev_info(dev, "IGU_TX_PRI_MAP_TC_CFG: 0x%x\n", 49839edaf24SGuojia Liao le32_to_cpu(desc[0].data[5])); 49977ba415dSYufeng Mo return; 50077ba415dSYufeng Mo 50177ba415dSYufeng Mo err_dcb_cmd_send: 50277ba415dSYufeng Mo dev_err(&hdev->pdev->dev, 50377ba415dSYufeng Mo "failed to dump dcb dfx, cmd = %#x, ret = %d\n", 50477ba415dSYufeng Mo cmd, ret); 505c0ebebb9Sliuzhongzhu } 506c0ebebb9Sliuzhongzhu 507*d96b0e59SYufeng Mo static int hclge_dbg_dump_reg_cmd(struct hclge_dev *hdev, 508*d96b0e59SYufeng Mo enum hnae3_dbg_cmd cmd, char *buf, int len) 50927cf979aSliuzhongzhu { 510e4b91468SRikard Falkeborn const struct hclge_dbg_reg_type_info *reg_info; 511*d96b0e59SYufeng Mo int pos = 0, ret = 0; 512a582b78dSZhongzhu Liu int i; 51327cf979aSliuzhongzhu 514a582b78dSZhongzhu Liu for (i = 0; i < ARRAY_SIZE(hclge_dbg_reg_info); i++) { 515a582b78dSZhongzhu Liu reg_info = &hclge_dbg_reg_info[i]; 516*d96b0e59SYufeng Mo if (cmd == reg_info->cmd) { 517*d96b0e59SYufeng Mo if (cmd == HNAE3_DBG_CMD_REG_TQP) 518*d96b0e59SYufeng Mo return hclge_dbg_dump_reg_tqp(hdev, reg_info, 519*d96b0e59SYufeng Mo buf, len, &pos); 520*d96b0e59SYufeng Mo 521*d96b0e59SYufeng Mo ret = hclge_dbg_dump_reg_common(hdev, reg_info, buf, 522*d96b0e59SYufeng Mo len, &pos); 523*d96b0e59SYufeng Mo if (ret) 524*d96b0e59SYufeng Mo break; 525a582b78dSZhongzhu Liu } 526a582b78dSZhongzhu Liu } 52727cf979aSliuzhongzhu 528*d96b0e59SYufeng Mo return ret; 52927cf979aSliuzhongzhu } 53027cf979aSliuzhongzhu 53100577c8bSYufeng Mo static void hclge_print_tc_info(struct hclge_dev *hdev, bool flag, int index) 5322849d4e7Sliuzhongzhu { 5332849d4e7Sliuzhongzhu if (flag) 53400577c8bSYufeng Mo dev_info(&hdev->pdev->dev, "tc(%d): no sp mode weight: %u\n", 53500577c8bSYufeng Mo index, hdev->tm_info.pg_info[0].tc_dwrr[index]); 5362849d4e7Sliuzhongzhu else 53700577c8bSYufeng Mo dev_info(&hdev->pdev->dev, "tc(%d): sp mode\n", index); 5382849d4e7Sliuzhongzhu } 5392849d4e7Sliuzhongzhu 5402849d4e7Sliuzhongzhu static void hclge_dbg_dump_tc(struct hclge_dev *hdev) 5412849d4e7Sliuzhongzhu { 5422849d4e7Sliuzhongzhu struct hclge_ets_tc_weight_cmd *ets_weight; 5432849d4e7Sliuzhongzhu struct hclge_desc desc; 5442849d4e7Sliuzhongzhu int i, ret; 5452849d4e7Sliuzhongzhu 5463f0f3253SYufeng Mo if (!hnae3_dev_dcb_supported(hdev)) { 5473f0f3253SYufeng Mo dev_info(&hdev->pdev->dev, 5483f0f3253SYufeng Mo "Only DCB-supported dev supports tc\n"); 5493f0f3253SYufeng Mo return; 5503f0f3253SYufeng Mo } 5513f0f3253SYufeng Mo 5522849d4e7Sliuzhongzhu hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_ETS_TC_WEIGHT, true); 5532849d4e7Sliuzhongzhu 5542849d4e7Sliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 5552849d4e7Sliuzhongzhu if (ret) { 556ed5b255bSYufeng Mo dev_err(&hdev->pdev->dev, "dump tc fail, ret = %d\n", ret); 5572849d4e7Sliuzhongzhu return; 5582849d4e7Sliuzhongzhu } 5592849d4e7Sliuzhongzhu 5602849d4e7Sliuzhongzhu ets_weight = (struct hclge_ets_tc_weight_cmd *)desc.data; 5612849d4e7Sliuzhongzhu 562a8adbb8aSYonglong Liu dev_info(&hdev->pdev->dev, "dump tc: %u tc enabled\n", 563a8adbb8aSYonglong Liu hdev->tm_info.num_tc); 5642849d4e7Sliuzhongzhu dev_info(&hdev->pdev->dev, "weight_offset: %u\n", 5652849d4e7Sliuzhongzhu ets_weight->weight_offset); 5662849d4e7Sliuzhongzhu 5672849d4e7Sliuzhongzhu for (i = 0; i < HNAE3_MAX_TC; i++) 56800577c8bSYufeng Mo hclge_print_tc_info(hdev, ets_weight->tc_weight[i], i); 5692849d4e7Sliuzhongzhu } 5702849d4e7Sliuzhongzhu 57196227f4cSliuzhongzhu static void hclge_dbg_dump_tm_pg(struct hclge_dev *hdev) 57296227f4cSliuzhongzhu { 57396227f4cSliuzhongzhu struct hclge_port_shapping_cmd *port_shap_cfg_cmd; 57496227f4cSliuzhongzhu struct hclge_bp_to_qs_map_cmd *bp_to_qs_map_cmd; 57596227f4cSliuzhongzhu struct hclge_pg_shapping_cmd *pg_shap_cfg_cmd; 57696227f4cSliuzhongzhu enum hclge_opcode_type cmd; 57796227f4cSliuzhongzhu struct hclge_desc desc; 57896227f4cSliuzhongzhu int ret; 57996227f4cSliuzhongzhu 58096227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_PG_C_SHAPPING; 58196227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 58296227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 58396227f4cSliuzhongzhu if (ret) 58496227f4cSliuzhongzhu goto err_tm_pg_cmd_send; 58596227f4cSliuzhongzhu 58696227f4cSliuzhongzhu pg_shap_cfg_cmd = (struct hclge_pg_shapping_cmd *)desc.data; 58796227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PG_C pg_id: %u\n", pg_shap_cfg_cmd->pg_id); 58896227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PG_C pg_shapping: 0x%x\n", 58939edaf24SGuojia Liao le32_to_cpu(pg_shap_cfg_cmd->pg_shapping_para)); 59096227f4cSliuzhongzhu 59196227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_PG_P_SHAPPING; 59296227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 59396227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 59496227f4cSliuzhongzhu if (ret) 59596227f4cSliuzhongzhu goto err_tm_pg_cmd_send; 59696227f4cSliuzhongzhu 59796227f4cSliuzhongzhu pg_shap_cfg_cmd = (struct hclge_pg_shapping_cmd *)desc.data; 59896227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PG_P pg_id: %u\n", pg_shap_cfg_cmd->pg_id); 59996227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PG_P pg_shapping: 0x%x\n", 60039edaf24SGuojia Liao le32_to_cpu(pg_shap_cfg_cmd->pg_shapping_para)); 601c331ecf1SYonglong Liu dev_info(&hdev->pdev->dev, "PG_P flag: %#x\n", pg_shap_cfg_cmd->flag); 602c331ecf1SYonglong Liu dev_info(&hdev->pdev->dev, "PG_P pg_rate: %u(Mbps)\n", 603c331ecf1SYonglong Liu le32_to_cpu(pg_shap_cfg_cmd->pg_rate)); 60496227f4cSliuzhongzhu 60596227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_PORT_SHAPPING; 60696227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 60796227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 60896227f4cSliuzhongzhu if (ret) 60996227f4cSliuzhongzhu goto err_tm_pg_cmd_send; 61096227f4cSliuzhongzhu 61196227f4cSliuzhongzhu port_shap_cfg_cmd = (struct hclge_port_shapping_cmd *)desc.data; 61296227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PORT port_shapping: 0x%x\n", 61339edaf24SGuojia Liao le32_to_cpu(port_shap_cfg_cmd->port_shapping_para)); 614c331ecf1SYonglong Liu dev_info(&hdev->pdev->dev, "PORT flag: %#x\n", port_shap_cfg_cmd->flag); 615c331ecf1SYonglong Liu dev_info(&hdev->pdev->dev, "PORT port_rate: %u(Mbps)\n", 616c331ecf1SYonglong Liu le32_to_cpu(port_shap_cfg_cmd->port_rate)); 61796227f4cSliuzhongzhu 61896227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_PG_SCH_MODE_CFG; 61996227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 62096227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 62196227f4cSliuzhongzhu if (ret) 62296227f4cSliuzhongzhu goto err_tm_pg_cmd_send; 62396227f4cSliuzhongzhu 62439edaf24SGuojia Liao dev_info(&hdev->pdev->dev, "PG_SCH pg_id: %u\n", 62539edaf24SGuojia Liao le32_to_cpu(desc.data[0])); 62696227f4cSliuzhongzhu 62796227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_PRI_SCH_MODE_CFG; 62896227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 62996227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 63096227f4cSliuzhongzhu if (ret) 63196227f4cSliuzhongzhu goto err_tm_pg_cmd_send; 63296227f4cSliuzhongzhu 63339edaf24SGuojia Liao dev_info(&hdev->pdev->dev, "PRI_SCH pri_id: %u\n", 63439edaf24SGuojia Liao le32_to_cpu(desc.data[0])); 63596227f4cSliuzhongzhu 63696227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_QS_SCH_MODE_CFG; 63796227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 63896227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 63996227f4cSliuzhongzhu if (ret) 64096227f4cSliuzhongzhu goto err_tm_pg_cmd_send; 64196227f4cSliuzhongzhu 64239edaf24SGuojia Liao dev_info(&hdev->pdev->dev, "QS_SCH qs_id: %u\n", 64339edaf24SGuojia Liao le32_to_cpu(desc.data[0])); 64496227f4cSliuzhongzhu 6453f0f3253SYufeng Mo if (!hnae3_dev_dcb_supported(hdev)) { 6463f0f3253SYufeng Mo dev_info(&hdev->pdev->dev, 6473f0f3253SYufeng Mo "Only DCB-supported dev supports tm mapping\n"); 6483f0f3253SYufeng Mo return; 6493f0f3253SYufeng Mo } 6503f0f3253SYufeng Mo 65196227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_BP_TO_QSET_MAPPING; 65296227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 65396227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 65496227f4cSliuzhongzhu if (ret) 65596227f4cSliuzhongzhu goto err_tm_pg_cmd_send; 65696227f4cSliuzhongzhu 65796227f4cSliuzhongzhu bp_to_qs_map_cmd = (struct hclge_bp_to_qs_map_cmd *)desc.data; 6589b2f3477SWeihang Li dev_info(&hdev->pdev->dev, "BP_TO_QSET tc_id: %u\n", 65996227f4cSliuzhongzhu bp_to_qs_map_cmd->tc_id); 6609b2f3477SWeihang Li dev_info(&hdev->pdev->dev, "BP_TO_QSET qs_group_id: 0x%x\n", 66196227f4cSliuzhongzhu bp_to_qs_map_cmd->qs_group_id); 66296227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "BP_TO_QSET qs_bit_map: 0x%x\n", 66339edaf24SGuojia Liao le32_to_cpu(bp_to_qs_map_cmd->qs_bit_map)); 66496227f4cSliuzhongzhu return; 66596227f4cSliuzhongzhu 66696227f4cSliuzhongzhu err_tm_pg_cmd_send: 667ed5b255bSYufeng Mo dev_err(&hdev->pdev->dev, "dump tm_pg fail(0x%x), ret = %d\n", 66896227f4cSliuzhongzhu cmd, ret); 66996227f4cSliuzhongzhu } 67096227f4cSliuzhongzhu 67196227f4cSliuzhongzhu static void hclge_dbg_dump_tm(struct hclge_dev *hdev) 67296227f4cSliuzhongzhu { 67396227f4cSliuzhongzhu struct hclge_priority_weight_cmd *priority_weight; 67496227f4cSliuzhongzhu struct hclge_pg_to_pri_link_cmd *pg_to_pri_map; 67596227f4cSliuzhongzhu struct hclge_qs_to_pri_link_cmd *qs_to_pri_map; 67696227f4cSliuzhongzhu struct hclge_nq_to_qs_link_cmd *nq_to_qs_map; 67796227f4cSliuzhongzhu struct hclge_pri_shapping_cmd *shap_cfg_cmd; 67896227f4cSliuzhongzhu struct hclge_pg_weight_cmd *pg_weight; 67996227f4cSliuzhongzhu struct hclge_qs_weight_cmd *qs_weight; 68096227f4cSliuzhongzhu enum hclge_opcode_type cmd; 68196227f4cSliuzhongzhu struct hclge_desc desc; 68296227f4cSliuzhongzhu int ret; 68396227f4cSliuzhongzhu 68496227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_PG_TO_PRI_LINK; 68596227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 68696227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 68796227f4cSliuzhongzhu if (ret) 68896227f4cSliuzhongzhu goto err_tm_cmd_send; 68996227f4cSliuzhongzhu 69096227f4cSliuzhongzhu pg_to_pri_map = (struct hclge_pg_to_pri_link_cmd *)desc.data; 69196227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "dump tm\n"); 69296227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PG_TO_PRI gp_id: %u\n", 69396227f4cSliuzhongzhu pg_to_pri_map->pg_id); 69496227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PG_TO_PRI map: 0x%x\n", 69596227f4cSliuzhongzhu pg_to_pri_map->pri_bit_map); 69696227f4cSliuzhongzhu 69796227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_QS_TO_PRI_LINK; 69896227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 69996227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 70096227f4cSliuzhongzhu if (ret) 70196227f4cSliuzhongzhu goto err_tm_cmd_send; 70296227f4cSliuzhongzhu 70396227f4cSliuzhongzhu qs_to_pri_map = (struct hclge_qs_to_pri_link_cmd *)desc.data; 70496227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "QS_TO_PRI qs_id: %u\n", 70539edaf24SGuojia Liao le16_to_cpu(qs_to_pri_map->qs_id)); 70696227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "QS_TO_PRI priority: %u\n", 70796227f4cSliuzhongzhu qs_to_pri_map->priority); 70896227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "QS_TO_PRI link_vld: %u\n", 70996227f4cSliuzhongzhu qs_to_pri_map->link_vld); 71096227f4cSliuzhongzhu 71196227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_NQ_TO_QS_LINK; 71296227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 71396227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 71496227f4cSliuzhongzhu if (ret) 71596227f4cSliuzhongzhu goto err_tm_cmd_send; 71696227f4cSliuzhongzhu 71796227f4cSliuzhongzhu nq_to_qs_map = (struct hclge_nq_to_qs_link_cmd *)desc.data; 71839edaf24SGuojia Liao dev_info(&hdev->pdev->dev, "NQ_TO_QS nq_id: %u\n", 71939edaf24SGuojia Liao le16_to_cpu(nq_to_qs_map->nq_id)); 7209b2f3477SWeihang Li dev_info(&hdev->pdev->dev, "NQ_TO_QS qset_id: 0x%x\n", 72139edaf24SGuojia Liao le16_to_cpu(nq_to_qs_map->qset_id)); 72296227f4cSliuzhongzhu 72396227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_PG_WEIGHT; 72496227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 72596227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 72696227f4cSliuzhongzhu if (ret) 72796227f4cSliuzhongzhu goto err_tm_cmd_send; 72896227f4cSliuzhongzhu 72996227f4cSliuzhongzhu pg_weight = (struct hclge_pg_weight_cmd *)desc.data; 73096227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PG pg_id: %u\n", pg_weight->pg_id); 73196227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PG dwrr: %u\n", pg_weight->dwrr); 73296227f4cSliuzhongzhu 73396227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_QS_WEIGHT; 73496227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 73596227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 73696227f4cSliuzhongzhu if (ret) 73796227f4cSliuzhongzhu goto err_tm_cmd_send; 73896227f4cSliuzhongzhu 73996227f4cSliuzhongzhu qs_weight = (struct hclge_qs_weight_cmd *)desc.data; 74039edaf24SGuojia Liao dev_info(&hdev->pdev->dev, "QS qs_id: %u\n", 74139edaf24SGuojia Liao le16_to_cpu(qs_weight->qs_id)); 74296227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "QS dwrr: %u\n", qs_weight->dwrr); 74396227f4cSliuzhongzhu 74496227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_PRI_WEIGHT; 74596227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 74696227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 74796227f4cSliuzhongzhu if (ret) 74896227f4cSliuzhongzhu goto err_tm_cmd_send; 74996227f4cSliuzhongzhu 75096227f4cSliuzhongzhu priority_weight = (struct hclge_priority_weight_cmd *)desc.data; 75196227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PRI pri_id: %u\n", priority_weight->pri_id); 75296227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PRI dwrr: %u\n", priority_weight->dwrr); 75396227f4cSliuzhongzhu 75496227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_PRI_C_SHAPPING; 75596227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 75696227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 75796227f4cSliuzhongzhu if (ret) 75896227f4cSliuzhongzhu goto err_tm_cmd_send; 75996227f4cSliuzhongzhu 76096227f4cSliuzhongzhu shap_cfg_cmd = (struct hclge_pri_shapping_cmd *)desc.data; 76196227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PRI_C pri_id: %u\n", shap_cfg_cmd->pri_id); 76296227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PRI_C pri_shapping: 0x%x\n", 76339edaf24SGuojia Liao le32_to_cpu(shap_cfg_cmd->pri_shapping_para)); 764c331ecf1SYonglong Liu dev_info(&hdev->pdev->dev, "PRI_C flag: %#x\n", shap_cfg_cmd->flag); 765c331ecf1SYonglong Liu dev_info(&hdev->pdev->dev, "PRI_C pri_rate: %u(Mbps)\n", 766c331ecf1SYonglong Liu le32_to_cpu(shap_cfg_cmd->pri_rate)); 76796227f4cSliuzhongzhu 76896227f4cSliuzhongzhu cmd = HCLGE_OPC_TM_PRI_P_SHAPPING; 76996227f4cSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 77096227f4cSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 77196227f4cSliuzhongzhu if (ret) 77296227f4cSliuzhongzhu goto err_tm_cmd_send; 77396227f4cSliuzhongzhu 77496227f4cSliuzhongzhu shap_cfg_cmd = (struct hclge_pri_shapping_cmd *)desc.data; 77596227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PRI_P pri_id: %u\n", shap_cfg_cmd->pri_id); 77696227f4cSliuzhongzhu dev_info(&hdev->pdev->dev, "PRI_P pri_shapping: 0x%x\n", 77739edaf24SGuojia Liao le32_to_cpu(shap_cfg_cmd->pri_shapping_para)); 778c331ecf1SYonglong Liu dev_info(&hdev->pdev->dev, "PRI_P flag: %#x\n", shap_cfg_cmd->flag); 779c331ecf1SYonglong Liu dev_info(&hdev->pdev->dev, "PRI_P pri_rate: %u(Mbps)\n", 780c331ecf1SYonglong Liu le32_to_cpu(shap_cfg_cmd->pri_rate)); 78196227f4cSliuzhongzhu 78296227f4cSliuzhongzhu hclge_dbg_dump_tm_pg(hdev); 78396227f4cSliuzhongzhu 78496227f4cSliuzhongzhu return; 78596227f4cSliuzhongzhu 78696227f4cSliuzhongzhu err_tm_cmd_send: 787ed5b255bSYufeng Mo dev_err(&hdev->pdev->dev, "dump tm fail(0x%x), ret = %d\n", 78896227f4cSliuzhongzhu cmd, ret); 78996227f4cSliuzhongzhu } 79096227f4cSliuzhongzhu 791ebaf1908SWeihang Li static void hclge_dbg_dump_tm_map(struct hclge_dev *hdev, 792ebaf1908SWeihang Li const char *cmd_buf) 79382e00b86Sliuzhongzhu { 79482e00b86Sliuzhongzhu struct hclge_bp_to_qs_map_cmd *bp_to_qs_map_cmd; 79582e00b86Sliuzhongzhu struct hclge_nq_to_qs_link_cmd *nq_to_qs_map; 7969a5ef4aaSYonglong Liu u32 qset_mapping[HCLGE_BP_EXT_GRP_NUM]; 79782e00b86Sliuzhongzhu struct hclge_qs_to_pri_link_cmd *map; 79882e00b86Sliuzhongzhu struct hclge_tqp_tx_queue_tc_cmd *tc; 7990256844dSYonglong Liu u16 group_id, queue_id, qset_id; 80082e00b86Sliuzhongzhu enum hclge_opcode_type cmd; 8010256844dSYonglong Liu u8 grp_num, pri_id, tc_id; 80282e00b86Sliuzhongzhu struct hclge_desc desc; 8039a5ef4aaSYonglong Liu u16 qs_id_l; 8049a5ef4aaSYonglong Liu u16 qs_id_h; 8050256844dSYonglong Liu int ret; 80682e00b86Sliuzhongzhu u32 i; 80782e00b86Sliuzhongzhu 8080256844dSYonglong Liu ret = kstrtou16(cmd_buf, 0, &queue_id); 80982e00b86Sliuzhongzhu queue_id = (ret != 0) ? 0 : queue_id; 81082e00b86Sliuzhongzhu 81182e00b86Sliuzhongzhu cmd = HCLGE_OPC_TM_NQ_TO_QS_LINK; 81282e00b86Sliuzhongzhu nq_to_qs_map = (struct hclge_nq_to_qs_link_cmd *)desc.data; 81382e00b86Sliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 81482e00b86Sliuzhongzhu nq_to_qs_map->nq_id = cpu_to_le16(queue_id); 81582e00b86Sliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 81682e00b86Sliuzhongzhu if (ret) 81782e00b86Sliuzhongzhu goto err_tm_map_cmd_send; 8189a5ef4aaSYonglong Liu qset_id = le16_to_cpu(nq_to_qs_map->qset_id); 8199a5ef4aaSYonglong Liu 8209a5ef4aaSYonglong Liu /* convert qset_id to the following format, drop the vld bit 8219a5ef4aaSYonglong Liu * | qs_id_h | vld | qs_id_l | 8229a5ef4aaSYonglong Liu * qset_id: | 15 ~ 11 | 10 | 9 ~ 0 | 8239a5ef4aaSYonglong Liu * \ \ / / 8249a5ef4aaSYonglong Liu * \ \ / / 8259a5ef4aaSYonglong Liu * qset_id: | 15 | 14 ~ 10 | 9 ~ 0 | 8269a5ef4aaSYonglong Liu */ 8279a5ef4aaSYonglong Liu qs_id_l = hnae3_get_field(qset_id, HCLGE_TM_QS_ID_L_MSK, 8289a5ef4aaSYonglong Liu HCLGE_TM_QS_ID_L_S); 8299a5ef4aaSYonglong Liu qs_id_h = hnae3_get_field(qset_id, HCLGE_TM_QS_ID_H_EXT_MSK, 8309a5ef4aaSYonglong Liu HCLGE_TM_QS_ID_H_EXT_S); 8319a5ef4aaSYonglong Liu qset_id = 0; 8329a5ef4aaSYonglong Liu hnae3_set_field(qset_id, HCLGE_TM_QS_ID_L_MSK, HCLGE_TM_QS_ID_L_S, 8339a5ef4aaSYonglong Liu qs_id_l); 8349a5ef4aaSYonglong Liu hnae3_set_field(qset_id, HCLGE_TM_QS_ID_H_MSK, HCLGE_TM_QS_ID_H_S, 8359a5ef4aaSYonglong Liu qs_id_h); 83682e00b86Sliuzhongzhu 83782e00b86Sliuzhongzhu cmd = HCLGE_OPC_TM_QS_TO_PRI_LINK; 83882e00b86Sliuzhongzhu map = (struct hclge_qs_to_pri_link_cmd *)desc.data; 83982e00b86Sliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 84082e00b86Sliuzhongzhu map->qs_id = cpu_to_le16(qset_id); 84182e00b86Sliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 84282e00b86Sliuzhongzhu if (ret) 84382e00b86Sliuzhongzhu goto err_tm_map_cmd_send; 84482e00b86Sliuzhongzhu pri_id = map->priority; 84582e00b86Sliuzhongzhu 84682e00b86Sliuzhongzhu cmd = HCLGE_OPC_TQP_TX_QUEUE_TC; 84782e00b86Sliuzhongzhu tc = (struct hclge_tqp_tx_queue_tc_cmd *)desc.data; 84882e00b86Sliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 84982e00b86Sliuzhongzhu tc->queue_id = cpu_to_le16(queue_id); 85082e00b86Sliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 85182e00b86Sliuzhongzhu if (ret) 85282e00b86Sliuzhongzhu goto err_tm_map_cmd_send; 85382e00b86Sliuzhongzhu tc_id = tc->tc_id & 0x7; 85482e00b86Sliuzhongzhu 85582e00b86Sliuzhongzhu dev_info(&hdev->pdev->dev, "queue_id | qset_id | pri_id | tc_id\n"); 8560256844dSYonglong Liu dev_info(&hdev->pdev->dev, "%04u | %04u | %02u | %02u\n", 85782e00b86Sliuzhongzhu queue_id, qset_id, pri_id, tc_id); 85882e00b86Sliuzhongzhu 8593f0f3253SYufeng Mo if (!hnae3_dev_dcb_supported(hdev)) { 8603f0f3253SYufeng Mo dev_info(&hdev->pdev->dev, 8613f0f3253SYufeng Mo "Only DCB-supported dev supports tm mapping\n"); 8623f0f3253SYufeng Mo return; 8633f0f3253SYufeng Mo } 8643f0f3253SYufeng Mo 8659a5ef4aaSYonglong Liu grp_num = hdev->num_tqps <= HCLGE_TQP_MAX_SIZE_DEV_V2 ? 8669a5ef4aaSYonglong Liu HCLGE_BP_GRP_NUM : HCLGE_BP_EXT_GRP_NUM; 86782e00b86Sliuzhongzhu cmd = HCLGE_OPC_TM_BP_TO_QSET_MAPPING; 86882e00b86Sliuzhongzhu bp_to_qs_map_cmd = (struct hclge_bp_to_qs_map_cmd *)desc.data; 8699a5ef4aaSYonglong Liu for (group_id = 0; group_id < grp_num; group_id++) { 87082e00b86Sliuzhongzhu hclge_cmd_setup_basic_desc(&desc, cmd, true); 87182e00b86Sliuzhongzhu bp_to_qs_map_cmd->tc_id = tc_id; 87282e00b86Sliuzhongzhu bp_to_qs_map_cmd->qs_group_id = group_id; 87382e00b86Sliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 87482e00b86Sliuzhongzhu if (ret) 87582e00b86Sliuzhongzhu goto err_tm_map_cmd_send; 87682e00b86Sliuzhongzhu 87796b8e878SHuazhong Tan qset_mapping[group_id] = 87872fa4904SGuojia Liao le32_to_cpu(bp_to_qs_map_cmd->qs_bit_map); 87982e00b86Sliuzhongzhu } 88082e00b86Sliuzhongzhu 88182e00b86Sliuzhongzhu dev_info(&hdev->pdev->dev, "index | tm bp qset maping:\n"); 88282e00b86Sliuzhongzhu 88382e00b86Sliuzhongzhu i = 0; 8849a5ef4aaSYonglong Liu for (group_id = 0; group_id < grp_num / 8; group_id++) { 88582e00b86Sliuzhongzhu dev_info(&hdev->pdev->dev, 88682e00b86Sliuzhongzhu "%04d | %08x:%08x:%08x:%08x:%08x:%08x:%08x:%08x\n", 88796b8e878SHuazhong Tan group_id * 256, qset_mapping[(u32)(i + 7)], 88896b8e878SHuazhong Tan qset_mapping[(u32)(i + 6)], qset_mapping[(u32)(i + 5)], 88996b8e878SHuazhong Tan qset_mapping[(u32)(i + 4)], qset_mapping[(u32)(i + 3)], 89096b8e878SHuazhong Tan qset_mapping[(u32)(i + 2)], qset_mapping[(u32)(i + 1)], 89196b8e878SHuazhong Tan qset_mapping[i]); 89282e00b86Sliuzhongzhu i += 8; 89382e00b86Sliuzhongzhu } 89482e00b86Sliuzhongzhu 89582e00b86Sliuzhongzhu return; 89682e00b86Sliuzhongzhu 89782e00b86Sliuzhongzhu err_tm_map_cmd_send: 898ed5b255bSYufeng Mo dev_err(&hdev->pdev->dev, "dump tqp map fail(0x%x), ret = %d\n", 89982e00b86Sliuzhongzhu cmd, ret); 90082e00b86Sliuzhongzhu } 90182e00b86Sliuzhongzhu 90204987ca1SGuangbin Huang static int hclge_dbg_dump_tm_nodes(struct hclge_dev *hdev, char *buf, int len) 90304987ca1SGuangbin Huang { 90404987ca1SGuangbin Huang struct hclge_tm_nodes_cmd *nodes; 90504987ca1SGuangbin Huang struct hclge_desc desc; 90604987ca1SGuangbin Huang int pos = 0; 90704987ca1SGuangbin Huang int ret; 90804987ca1SGuangbin Huang 90904987ca1SGuangbin Huang hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_TM_NODES, true); 91004987ca1SGuangbin Huang ret = hclge_cmd_send(&hdev->hw, &desc, 1); 91104987ca1SGuangbin Huang if (ret) { 91204987ca1SGuangbin Huang dev_err(&hdev->pdev->dev, 91304987ca1SGuangbin Huang "failed to dump tm nodes, ret = %d\n", ret); 91404987ca1SGuangbin Huang return ret; 91504987ca1SGuangbin Huang } 91604987ca1SGuangbin Huang 91704987ca1SGuangbin Huang nodes = (struct hclge_tm_nodes_cmd *)desc.data; 91804987ca1SGuangbin Huang 91904987ca1SGuangbin Huang pos += scnprintf(buf + pos, len - pos, " BASE_ID MAX_NUM\n"); 92004987ca1SGuangbin Huang pos += scnprintf(buf + pos, len - pos, "PG %4u %4u\n", 92104987ca1SGuangbin Huang nodes->pg_base_id, nodes->pg_num); 92204987ca1SGuangbin Huang pos += scnprintf(buf + pos, len - pos, "PRI %4u %4u\n", 92304987ca1SGuangbin Huang nodes->pri_base_id, nodes->pri_num); 92404987ca1SGuangbin Huang pos += scnprintf(buf + pos, len - pos, "QSET %4u %4u\n", 92504987ca1SGuangbin Huang le16_to_cpu(nodes->qset_base_id), 92604987ca1SGuangbin Huang le16_to_cpu(nodes->qset_num)); 92704987ca1SGuangbin Huang pos += scnprintf(buf + pos, len - pos, "QUEUE %4u %4u\n", 92804987ca1SGuangbin Huang le16_to_cpu(nodes->queue_base_id), 92904987ca1SGuangbin Huang le16_to_cpu(nodes->queue_num)); 93004987ca1SGuangbin Huang 93104987ca1SGuangbin Huang return 0; 93204987ca1SGuangbin Huang } 93304987ca1SGuangbin Huang 93404987ca1SGuangbin Huang static int hclge_dbg_dump_tm_pri(struct hclge_dev *hdev, char *buf, int len) 93504987ca1SGuangbin Huang { 93604987ca1SGuangbin Huang struct hclge_pri_shaper_para c_shaper_para; 93704987ca1SGuangbin Huang struct hclge_pri_shaper_para p_shaper_para; 93804987ca1SGuangbin Huang u8 pri_num, sch_mode, weight; 93904987ca1SGuangbin Huang char *sch_mode_str; 94004987ca1SGuangbin Huang int pos = 0; 94104987ca1SGuangbin Huang int ret; 94204987ca1SGuangbin Huang u8 i; 94304987ca1SGuangbin Huang 94404987ca1SGuangbin Huang ret = hclge_tm_get_pri_num(hdev, &pri_num); 94504987ca1SGuangbin Huang if (ret) 94604987ca1SGuangbin Huang return ret; 94704987ca1SGuangbin Huang 94804987ca1SGuangbin Huang pos += scnprintf(buf + pos, len - pos, 94904987ca1SGuangbin Huang "ID MODE DWRR C_IR_B C_IR_U C_IR_S C_BS_B "); 95004987ca1SGuangbin Huang pos += scnprintf(buf + pos, len - pos, 95104987ca1SGuangbin Huang "C_BS_S C_FLAG C_RATE(Mbps) P_IR_B P_IR_U "); 95204987ca1SGuangbin Huang pos += scnprintf(buf + pos, len - pos, 95304987ca1SGuangbin Huang "P_IR_S P_BS_B P_BS_S P_FLAG P_RATE(Mbps)\n"); 95404987ca1SGuangbin Huang 95504987ca1SGuangbin Huang for (i = 0; i < pri_num; i++) { 95604987ca1SGuangbin Huang ret = hclge_tm_get_pri_sch_mode(hdev, i, &sch_mode); 95704987ca1SGuangbin Huang if (ret) 95804987ca1SGuangbin Huang return ret; 95904987ca1SGuangbin Huang 96004987ca1SGuangbin Huang ret = hclge_tm_get_pri_weight(hdev, i, &weight); 96104987ca1SGuangbin Huang if (ret) 96204987ca1SGuangbin Huang return ret; 96304987ca1SGuangbin Huang 96404987ca1SGuangbin Huang ret = hclge_tm_get_pri_shaper(hdev, i, 96504987ca1SGuangbin Huang HCLGE_OPC_TM_PRI_C_SHAPPING, 96604987ca1SGuangbin Huang &c_shaper_para); 96704987ca1SGuangbin Huang if (ret) 96804987ca1SGuangbin Huang return ret; 96904987ca1SGuangbin Huang 97004987ca1SGuangbin Huang ret = hclge_tm_get_pri_shaper(hdev, i, 97104987ca1SGuangbin Huang HCLGE_OPC_TM_PRI_P_SHAPPING, 97204987ca1SGuangbin Huang &p_shaper_para); 97304987ca1SGuangbin Huang if (ret) 97404987ca1SGuangbin Huang return ret; 97504987ca1SGuangbin Huang 97604987ca1SGuangbin Huang sch_mode_str = sch_mode & HCLGE_TM_TX_SCHD_DWRR_MSK ? "dwrr" : 97704987ca1SGuangbin Huang "sp"; 97804987ca1SGuangbin Huang 97904987ca1SGuangbin Huang pos += scnprintf(buf + pos, len - pos, 98004987ca1SGuangbin Huang "%04u %4s %3u %3u %3u %3u ", 98104987ca1SGuangbin Huang i, sch_mode_str, weight, c_shaper_para.ir_b, 98204987ca1SGuangbin Huang c_shaper_para.ir_u, c_shaper_para.ir_s); 98304987ca1SGuangbin Huang pos += scnprintf(buf + pos, len - pos, 98404987ca1SGuangbin Huang "%3u %3u %1u %6u ", 98504987ca1SGuangbin Huang c_shaper_para.bs_b, c_shaper_para.bs_s, 98604987ca1SGuangbin Huang c_shaper_para.flag, c_shaper_para.rate); 98704987ca1SGuangbin Huang pos += scnprintf(buf + pos, len - pos, 98804987ca1SGuangbin Huang "%3u %3u %3u %3u %3u ", 98904987ca1SGuangbin Huang p_shaper_para.ir_b, p_shaper_para.ir_u, 99004987ca1SGuangbin Huang p_shaper_para.ir_s, p_shaper_para.bs_b, 99104987ca1SGuangbin Huang p_shaper_para.bs_s); 99204987ca1SGuangbin Huang pos += scnprintf(buf + pos, len - pos, "%1u %6u\n", 99304987ca1SGuangbin Huang p_shaper_para.flag, p_shaper_para.rate); 99404987ca1SGuangbin Huang } 99504987ca1SGuangbin Huang 99604987ca1SGuangbin Huang return 0; 99704987ca1SGuangbin Huang } 99804987ca1SGuangbin Huang 99904987ca1SGuangbin Huang static int hclge_dbg_dump_tm_qset(struct hclge_dev *hdev, char *buf, int len) 100004987ca1SGuangbin Huang { 100104987ca1SGuangbin Huang u8 priority, link_vld, sch_mode, weight; 100204987ca1SGuangbin Huang char *sch_mode_str; 100304987ca1SGuangbin Huang int ret, pos; 100404987ca1SGuangbin Huang u16 qset_num; 100504987ca1SGuangbin Huang u16 i; 100604987ca1SGuangbin Huang 100704987ca1SGuangbin Huang ret = hclge_tm_get_qset_num(hdev, &qset_num); 100804987ca1SGuangbin Huang if (ret) 100904987ca1SGuangbin Huang return ret; 101004987ca1SGuangbin Huang 101104987ca1SGuangbin Huang pos = scnprintf(buf, len, "ID MAP_PRI LINK_VLD MODE DWRR\n"); 101204987ca1SGuangbin Huang 101304987ca1SGuangbin Huang for (i = 0; i < qset_num; i++) { 101404987ca1SGuangbin Huang ret = hclge_tm_get_qset_map_pri(hdev, i, &priority, &link_vld); 101504987ca1SGuangbin Huang if (ret) 101604987ca1SGuangbin Huang return ret; 101704987ca1SGuangbin Huang 101804987ca1SGuangbin Huang ret = hclge_tm_get_qset_sch_mode(hdev, i, &sch_mode); 101904987ca1SGuangbin Huang if (ret) 102004987ca1SGuangbin Huang return ret; 102104987ca1SGuangbin Huang 102204987ca1SGuangbin Huang ret = hclge_tm_get_qset_weight(hdev, i, &weight); 102304987ca1SGuangbin Huang if (ret) 102404987ca1SGuangbin Huang return ret; 102504987ca1SGuangbin Huang 102604987ca1SGuangbin Huang sch_mode_str = sch_mode & HCLGE_TM_TX_SCHD_DWRR_MSK ? "dwrr" : 102704987ca1SGuangbin Huang "sp"; 102804987ca1SGuangbin Huang pos += scnprintf(buf + pos, len - pos, 102904987ca1SGuangbin Huang "%04u %4u %1u %4s %3u\n", 103004987ca1SGuangbin Huang i, priority, link_vld, sch_mode_str, weight); 103104987ca1SGuangbin Huang } 103204987ca1SGuangbin Huang 103304987ca1SGuangbin Huang return 0; 103404987ca1SGuangbin Huang } 103504987ca1SGuangbin Huang 1036d958919dSliuzhongzhu static void hclge_dbg_dump_qos_pause_cfg(struct hclge_dev *hdev) 1037d958919dSliuzhongzhu { 1038d958919dSliuzhongzhu struct hclge_cfg_pause_param_cmd *pause_param; 1039d958919dSliuzhongzhu struct hclge_desc desc; 1040d958919dSliuzhongzhu int ret; 1041d958919dSliuzhongzhu 1042d958919dSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_MAC_PARA, true); 1043d958919dSliuzhongzhu 1044d958919dSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 1045d958919dSliuzhongzhu if (ret) { 1046ed5b255bSYufeng Mo dev_err(&hdev->pdev->dev, "dump checksum fail, ret = %d\n", 1047d958919dSliuzhongzhu ret); 1048d958919dSliuzhongzhu return; 1049d958919dSliuzhongzhu } 1050d958919dSliuzhongzhu 1051d958919dSliuzhongzhu pause_param = (struct hclge_cfg_pause_param_cmd *)desc.data; 1052d958919dSliuzhongzhu dev_info(&hdev->pdev->dev, "dump qos pause cfg\n"); 1053d958919dSliuzhongzhu dev_info(&hdev->pdev->dev, "pause_trans_gap: 0x%x\n", 1054d958919dSliuzhongzhu pause_param->pause_trans_gap); 1055d958919dSliuzhongzhu dev_info(&hdev->pdev->dev, "pause_trans_time: 0x%x\n", 105639edaf24SGuojia Liao le16_to_cpu(pause_param->pause_trans_time)); 1057d958919dSliuzhongzhu } 1058d958919dSliuzhongzhu 10596fc22440Sliuzhongzhu static void hclge_dbg_dump_qos_pri_map(struct hclge_dev *hdev) 10606fc22440Sliuzhongzhu { 10616fc22440Sliuzhongzhu struct hclge_qos_pri_map_cmd *pri_map; 10626fc22440Sliuzhongzhu struct hclge_desc desc; 10636fc22440Sliuzhongzhu int ret; 10646fc22440Sliuzhongzhu 10656fc22440Sliuzhongzhu hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_PRI_TO_TC_MAPPING, true); 10666fc22440Sliuzhongzhu 10676fc22440Sliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 10686fc22440Sliuzhongzhu if (ret) { 10696fc22440Sliuzhongzhu dev_err(&hdev->pdev->dev, 1070ed5b255bSYufeng Mo "dump qos pri map fail, ret = %d\n", ret); 10716fc22440Sliuzhongzhu return; 10726fc22440Sliuzhongzhu } 10736fc22440Sliuzhongzhu 10746fc22440Sliuzhongzhu pri_map = (struct hclge_qos_pri_map_cmd *)desc.data; 10756fc22440Sliuzhongzhu dev_info(&hdev->pdev->dev, "dump qos pri map\n"); 10766fc22440Sliuzhongzhu dev_info(&hdev->pdev->dev, "vlan_to_pri: 0x%x\n", pri_map->vlan_pri); 10776fc22440Sliuzhongzhu dev_info(&hdev->pdev->dev, "pri_0_to_tc: 0x%x\n", pri_map->pri0_tc); 10786fc22440Sliuzhongzhu dev_info(&hdev->pdev->dev, "pri_1_to_tc: 0x%x\n", pri_map->pri1_tc); 10796fc22440Sliuzhongzhu dev_info(&hdev->pdev->dev, "pri_2_to_tc: 0x%x\n", pri_map->pri2_tc); 10806fc22440Sliuzhongzhu dev_info(&hdev->pdev->dev, "pri_3_to_tc: 0x%x\n", pri_map->pri3_tc); 10816fc22440Sliuzhongzhu dev_info(&hdev->pdev->dev, "pri_4_to_tc: 0x%x\n", pri_map->pri4_tc); 10826fc22440Sliuzhongzhu dev_info(&hdev->pdev->dev, "pri_5_to_tc: 0x%x\n", pri_map->pri5_tc); 10836fc22440Sliuzhongzhu dev_info(&hdev->pdev->dev, "pri_6_to_tc: 0x%x\n", pri_map->pri6_tc); 10846fc22440Sliuzhongzhu dev_info(&hdev->pdev->dev, "pri_7_to_tc: 0x%x\n", pri_map->pri7_tc); 10856fc22440Sliuzhongzhu } 10866fc22440Sliuzhongzhu 1087b3712fa7SJian Shen static int hclge_dbg_dump_tx_buf_cfg(struct hclge_dev *hdev) 10887d9d7f88Sliuzhongzhu { 10897d9d7f88Sliuzhongzhu struct hclge_tx_buff_alloc_cmd *tx_buf_cmd; 1090b3712fa7SJian Shen struct hclge_desc desc; 10917d9d7f88Sliuzhongzhu int i, ret; 10927d9d7f88Sliuzhongzhu 1093b3712fa7SJian Shen hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_TX_BUFF_ALLOC, true); 1094b3712fa7SJian Shen ret = hclge_cmd_send(&hdev->hw, &desc, 1); 10957d9d7f88Sliuzhongzhu if (ret) 1096b3712fa7SJian Shen return ret; 10977d9d7f88Sliuzhongzhu 10987d9d7f88Sliuzhongzhu dev_info(&hdev->pdev->dev, "dump qos buf cfg\n"); 1099b3712fa7SJian Shen tx_buf_cmd = (struct hclge_tx_buff_alloc_cmd *)desc.data; 1100f9f07091Sliuzhongzhu for (i = 0; i < HCLGE_MAX_TC_NUM; i++) 11017d9d7f88Sliuzhongzhu dev_info(&hdev->pdev->dev, "tx_packet_buf_tc_%d: 0x%x\n", i, 110239edaf24SGuojia Liao le16_to_cpu(tx_buf_cmd->tx_pkt_buff[i])); 11037d9d7f88Sliuzhongzhu 1104b3712fa7SJian Shen return 0; 1105b3712fa7SJian Shen } 1106b3712fa7SJian Shen 1107b3712fa7SJian Shen static int hclge_dbg_dump_rx_priv_buf_cfg(struct hclge_dev *hdev) 1108b3712fa7SJian Shen { 1109b3712fa7SJian Shen struct hclge_rx_priv_buff_cmd *rx_buf_cmd; 1110b3712fa7SJian Shen struct hclge_desc desc; 1111b3712fa7SJian Shen int i, ret; 1112b3712fa7SJian Shen 1113b3712fa7SJian Shen hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RX_PRIV_BUFF_ALLOC, true); 1114b3712fa7SJian Shen ret = hclge_cmd_send(&hdev->hw, &desc, 1); 11157d9d7f88Sliuzhongzhu if (ret) 1116b3712fa7SJian Shen return ret; 11177d9d7f88Sliuzhongzhu 11187d9d7f88Sliuzhongzhu dev_info(&hdev->pdev->dev, "\n"); 1119b3712fa7SJian Shen rx_buf_cmd = (struct hclge_rx_priv_buff_cmd *)desc.data; 1120f9f07091Sliuzhongzhu for (i = 0; i < HCLGE_MAX_TC_NUM; i++) 11217d9d7f88Sliuzhongzhu dev_info(&hdev->pdev->dev, "rx_packet_buf_tc_%d: 0x%x\n", i, 112239edaf24SGuojia Liao le16_to_cpu(rx_buf_cmd->buf_num[i])); 11237d9d7f88Sliuzhongzhu 11247d9d7f88Sliuzhongzhu dev_info(&hdev->pdev->dev, "rx_share_buf: 0x%x\n", 112539edaf24SGuojia Liao le16_to_cpu(rx_buf_cmd->shared_buf)); 11267d9d7f88Sliuzhongzhu 1127b3712fa7SJian Shen return 0; 1128b3712fa7SJian Shen } 11293f0f3253SYufeng Mo 1130b3712fa7SJian Shen static int hclge_dbg_dump_rx_common_wl_cfg(struct hclge_dev *hdev) 1131b3712fa7SJian Shen { 1132b3712fa7SJian Shen struct hclge_rx_com_wl *rx_com_wl; 1133b3712fa7SJian Shen struct hclge_desc desc; 1134b3712fa7SJian Shen int ret; 1135b3712fa7SJian Shen 1136b3712fa7SJian Shen hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RX_COM_WL_ALLOC, true); 1137b3712fa7SJian Shen ret = hclge_cmd_send(&hdev->hw, &desc, 1); 1138b3712fa7SJian Shen if (ret) 1139b3712fa7SJian Shen return ret; 1140b3712fa7SJian Shen 1141b3712fa7SJian Shen rx_com_wl = (struct hclge_rx_com_wl *)desc.data; 11423f0f3253SYufeng Mo dev_info(&hdev->pdev->dev, "\n"); 11433f0f3253SYufeng Mo dev_info(&hdev->pdev->dev, "rx_com_wl: high: 0x%x, low: 0x%x\n", 114439edaf24SGuojia Liao le16_to_cpu(rx_com_wl->com_wl.high), 114539edaf24SGuojia Liao le16_to_cpu(rx_com_wl->com_wl.low)); 11463f0f3253SYufeng Mo 1147b3712fa7SJian Shen return 0; 1148b3712fa7SJian Shen } 11493f0f3253SYufeng Mo 1150b3712fa7SJian Shen static int hclge_dbg_dump_rx_global_pkt_cnt(struct hclge_dev *hdev) 1151b3712fa7SJian Shen { 1152b3712fa7SJian Shen struct hclge_rx_com_wl *rx_packet_cnt; 1153b3712fa7SJian Shen struct hclge_desc desc; 1154b3712fa7SJian Shen int ret; 1155b3712fa7SJian Shen 1156b3712fa7SJian Shen hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RX_GBL_PKT_CNT, true); 1157b3712fa7SJian Shen ret = hclge_cmd_send(&hdev->hw, &desc, 1); 1158b3712fa7SJian Shen if (ret) 1159b3712fa7SJian Shen return ret; 1160b3712fa7SJian Shen 1161b3712fa7SJian Shen rx_packet_cnt = (struct hclge_rx_com_wl *)desc.data; 11623f0f3253SYufeng Mo dev_info(&hdev->pdev->dev, 11633f0f3253SYufeng Mo "rx_global_packet_cnt: high: 0x%x, low: 0x%x\n", 116439edaf24SGuojia Liao le16_to_cpu(rx_packet_cnt->com_wl.high), 116539edaf24SGuojia Liao le16_to_cpu(rx_packet_cnt->com_wl.low)); 11663f0f3253SYufeng Mo 1167b3712fa7SJian Shen return 0; 11683f0f3253SYufeng Mo } 1169b3712fa7SJian Shen 1170b3712fa7SJian Shen static int hclge_dbg_dump_rx_priv_wl_buf_cfg(struct hclge_dev *hdev) 1171b3712fa7SJian Shen { 1172b3712fa7SJian Shen struct hclge_rx_priv_wl_buf *rx_priv_wl; 1173b3712fa7SJian Shen struct hclge_desc desc[2]; 1174b3712fa7SJian Shen int i, ret; 1175b3712fa7SJian Shen 1176b3712fa7SJian Shen hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_RX_PRIV_WL_ALLOC, true); 11777d9d7f88Sliuzhongzhu desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT); 1178b3712fa7SJian Shen hclge_cmd_setup_basic_desc(&desc[1], HCLGE_OPC_RX_PRIV_WL_ALLOC, true); 11797d9d7f88Sliuzhongzhu ret = hclge_cmd_send(&hdev->hw, desc, 2); 11807d9d7f88Sliuzhongzhu if (ret) 1181b3712fa7SJian Shen return ret; 11827d9d7f88Sliuzhongzhu 11837d9d7f88Sliuzhongzhu rx_priv_wl = (struct hclge_rx_priv_wl_buf *)desc[0].data; 11847d9d7f88Sliuzhongzhu for (i = 0; i < HCLGE_TC_NUM_ONE_DESC; i++) 11857d9d7f88Sliuzhongzhu dev_info(&hdev->pdev->dev, 11867d9d7f88Sliuzhongzhu "rx_priv_wl_tc_%d: high: 0x%x, low: 0x%x\n", i, 118739edaf24SGuojia Liao le16_to_cpu(rx_priv_wl->tc_wl[i].high), 118839edaf24SGuojia Liao le16_to_cpu(rx_priv_wl->tc_wl[i].low)); 11897d9d7f88Sliuzhongzhu 11907d9d7f88Sliuzhongzhu rx_priv_wl = (struct hclge_rx_priv_wl_buf *)desc[1].data; 11917d9d7f88Sliuzhongzhu for (i = 0; i < HCLGE_TC_NUM_ONE_DESC; i++) 11927d9d7f88Sliuzhongzhu dev_info(&hdev->pdev->dev, 11936f92bfd7SHuazhong Tan "rx_priv_wl_tc_%d: high: 0x%x, low: 0x%x\n", 11946f92bfd7SHuazhong Tan i + HCLGE_TC_NUM_ONE_DESC, 119539edaf24SGuojia Liao le16_to_cpu(rx_priv_wl->tc_wl[i].high), 119639edaf24SGuojia Liao le16_to_cpu(rx_priv_wl->tc_wl[i].low)); 11977d9d7f88Sliuzhongzhu 1198b3712fa7SJian Shen return 0; 1199b3712fa7SJian Shen } 1200b3712fa7SJian Shen 1201b3712fa7SJian Shen static int hclge_dbg_dump_rx_common_threshold_cfg(struct hclge_dev *hdev) 1202b3712fa7SJian Shen { 1203b3712fa7SJian Shen struct hclge_rx_com_thrd *rx_com_thrd; 1204b3712fa7SJian Shen struct hclge_desc desc[2]; 1205b3712fa7SJian Shen int i, ret; 1206b3712fa7SJian Shen 1207b3712fa7SJian Shen hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_RX_COM_THRD_ALLOC, true); 12087d9d7f88Sliuzhongzhu desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT); 1209b3712fa7SJian Shen hclge_cmd_setup_basic_desc(&desc[1], HCLGE_OPC_RX_COM_THRD_ALLOC, true); 12107d9d7f88Sliuzhongzhu ret = hclge_cmd_send(&hdev->hw, desc, 2); 12117d9d7f88Sliuzhongzhu if (ret) 1212b3712fa7SJian Shen return ret; 12137d9d7f88Sliuzhongzhu 12147d9d7f88Sliuzhongzhu dev_info(&hdev->pdev->dev, "\n"); 12157d9d7f88Sliuzhongzhu rx_com_thrd = (struct hclge_rx_com_thrd *)desc[0].data; 12167d9d7f88Sliuzhongzhu for (i = 0; i < HCLGE_TC_NUM_ONE_DESC; i++) 12177d9d7f88Sliuzhongzhu dev_info(&hdev->pdev->dev, 12187d9d7f88Sliuzhongzhu "rx_com_thrd_tc_%d: high: 0x%x, low: 0x%x\n", i, 121939edaf24SGuojia Liao le16_to_cpu(rx_com_thrd->com_thrd[i].high), 122039edaf24SGuojia Liao le16_to_cpu(rx_com_thrd->com_thrd[i].low)); 12217d9d7f88Sliuzhongzhu 12227d9d7f88Sliuzhongzhu rx_com_thrd = (struct hclge_rx_com_thrd *)desc[1].data; 12237d9d7f88Sliuzhongzhu for (i = 0; i < HCLGE_TC_NUM_ONE_DESC; i++) 12247d9d7f88Sliuzhongzhu dev_info(&hdev->pdev->dev, 12256f92bfd7SHuazhong Tan "rx_com_thrd_tc_%d: high: 0x%x, low: 0x%x\n", 12266f92bfd7SHuazhong Tan i + HCLGE_TC_NUM_ONE_DESC, 122739edaf24SGuojia Liao le16_to_cpu(rx_com_thrd->com_thrd[i].high), 122839edaf24SGuojia Liao le16_to_cpu(rx_com_thrd->com_thrd[i].low)); 1229b3712fa7SJian Shen 1230b3712fa7SJian Shen return 0; 1231b3712fa7SJian Shen } 1232b3712fa7SJian Shen 1233b3712fa7SJian Shen static void hclge_dbg_dump_qos_buf_cfg(struct hclge_dev *hdev) 1234b3712fa7SJian Shen { 1235b3712fa7SJian Shen enum hclge_opcode_type cmd; 1236b3712fa7SJian Shen int ret; 1237b3712fa7SJian Shen 1238b3712fa7SJian Shen cmd = HCLGE_OPC_TX_BUFF_ALLOC; 1239b3712fa7SJian Shen ret = hclge_dbg_dump_tx_buf_cfg(hdev); 1240b3712fa7SJian Shen if (ret) 1241b3712fa7SJian Shen goto err_qos_cmd_send; 1242b3712fa7SJian Shen 1243b3712fa7SJian Shen cmd = HCLGE_OPC_RX_PRIV_BUFF_ALLOC; 1244b3712fa7SJian Shen ret = hclge_dbg_dump_rx_priv_buf_cfg(hdev); 1245b3712fa7SJian Shen if (ret) 1246b3712fa7SJian Shen goto err_qos_cmd_send; 1247b3712fa7SJian Shen 1248b3712fa7SJian Shen cmd = HCLGE_OPC_RX_COM_WL_ALLOC; 1249b3712fa7SJian Shen ret = hclge_dbg_dump_rx_common_wl_cfg(hdev); 1250b3712fa7SJian Shen if (ret) 1251b3712fa7SJian Shen goto err_qos_cmd_send; 1252b3712fa7SJian Shen 1253b3712fa7SJian Shen cmd = HCLGE_OPC_RX_GBL_PKT_CNT; 1254b3712fa7SJian Shen ret = hclge_dbg_dump_rx_global_pkt_cnt(hdev); 1255b3712fa7SJian Shen if (ret) 1256b3712fa7SJian Shen goto err_qos_cmd_send; 1257b3712fa7SJian Shen 1258b3712fa7SJian Shen dev_info(&hdev->pdev->dev, "\n"); 1259b3712fa7SJian Shen if (!hnae3_dev_dcb_supported(hdev)) { 1260b3712fa7SJian Shen dev_info(&hdev->pdev->dev, 1261b3712fa7SJian Shen "Only DCB-supported dev supports rx priv wl\n"); 1262b3712fa7SJian Shen return; 1263b3712fa7SJian Shen } 1264b3712fa7SJian Shen 1265b3712fa7SJian Shen cmd = HCLGE_OPC_RX_PRIV_WL_ALLOC; 1266b3712fa7SJian Shen ret = hclge_dbg_dump_rx_priv_wl_buf_cfg(hdev); 1267b3712fa7SJian Shen if (ret) 1268b3712fa7SJian Shen goto err_qos_cmd_send; 1269b3712fa7SJian Shen 1270b3712fa7SJian Shen cmd = HCLGE_OPC_RX_COM_THRD_ALLOC; 1271b3712fa7SJian Shen ret = hclge_dbg_dump_rx_common_threshold_cfg(hdev); 1272b3712fa7SJian Shen if (ret) 1273b3712fa7SJian Shen goto err_qos_cmd_send; 1274b3712fa7SJian Shen 12757d9d7f88Sliuzhongzhu return; 12767d9d7f88Sliuzhongzhu 12777d9d7f88Sliuzhongzhu err_qos_cmd_send: 12787d9d7f88Sliuzhongzhu dev_err(&hdev->pdev->dev, 1279ed5b255bSYufeng Mo "dump qos buf cfg fail(0x%x), ret = %d\n", cmd, ret); 12807d9d7f88Sliuzhongzhu } 12817d9d7f88Sliuzhongzhu 12828ddfd9c4SYufeng Mo static int hclge_dbg_dump_mng_table(struct hclge_dev *hdev, char *buf, int len) 12837737f1fbSliuzhongzhu { 12847737f1fbSliuzhongzhu struct hclge_mac_ethertype_idx_rd_cmd *req0; 12857737f1fbSliuzhongzhu struct hclge_desc desc; 128672fa4904SGuojia Liao u32 msg_egress_port; 12878ddfd9c4SYufeng Mo int pos = 0; 12887737f1fbSliuzhongzhu int ret, i; 12897737f1fbSliuzhongzhu 12908ddfd9c4SYufeng Mo pos += scnprintf(buf + pos, len - pos, 12918ddfd9c4SYufeng Mo "entry mac_addr mask ether "); 12928ddfd9c4SYufeng Mo pos += scnprintf(buf + pos, len - pos, 12938ddfd9c4SYufeng Mo "mask vlan mask i_map i_dir e_type "); 12948ddfd9c4SYufeng Mo pos += scnprintf(buf + pos, len - pos, "pf_id vf_id q_id drop\n"); 12957737f1fbSliuzhongzhu 12967737f1fbSliuzhongzhu for (i = 0; i < HCLGE_DBG_MNG_TBL_MAX; i++) { 12977737f1fbSliuzhongzhu hclge_cmd_setup_basic_desc(&desc, HCLGE_MAC_ETHERTYPE_IDX_RD, 12987737f1fbSliuzhongzhu true); 12997737f1fbSliuzhongzhu req0 = (struct hclge_mac_ethertype_idx_rd_cmd *)&desc.data; 13007737f1fbSliuzhongzhu req0->index = cpu_to_le16(i); 13017737f1fbSliuzhongzhu 13027737f1fbSliuzhongzhu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 13037737f1fbSliuzhongzhu if (ret) { 13047737f1fbSliuzhongzhu dev_err(&hdev->pdev->dev, 13058ddfd9c4SYufeng Mo "failed to dump manage table, ret = %d\n", ret); 13068ddfd9c4SYufeng Mo return ret; 13077737f1fbSliuzhongzhu } 13087737f1fbSliuzhongzhu 13097737f1fbSliuzhongzhu if (!req0->resp_code) 13107737f1fbSliuzhongzhu continue; 13117737f1fbSliuzhongzhu 13128ddfd9c4SYufeng Mo pos += scnprintf(buf + pos, len - pos, "%02u %pM ", 13138ddfd9c4SYufeng Mo le16_to_cpu(req0->index), req0->mac_addr); 13147737f1fbSliuzhongzhu 13158ddfd9c4SYufeng Mo pos += scnprintf(buf + pos, len - pos, 13168ddfd9c4SYufeng Mo "%x %04x %x %04x ", 13177737f1fbSliuzhongzhu !!(req0->flags & HCLGE_DBG_MNG_MAC_MASK_B), 131872fa4904SGuojia Liao le16_to_cpu(req0->ethter_type), 13197737f1fbSliuzhongzhu !!(req0->flags & HCLGE_DBG_MNG_ETHER_MASK_B), 13208ddfd9c4SYufeng Mo le16_to_cpu(req0->vlan_tag) & 13218ddfd9c4SYufeng Mo HCLGE_DBG_MNG_VLAN_TAG); 13228ddfd9c4SYufeng Mo 13238ddfd9c4SYufeng Mo pos += scnprintf(buf + pos, len - pos, 13248ddfd9c4SYufeng Mo "%x %02x %02x ", 13257737f1fbSliuzhongzhu !!(req0->flags & HCLGE_DBG_MNG_VLAN_MASK_B), 13267737f1fbSliuzhongzhu req0->i_port_bitmap, req0->i_port_direction); 13277737f1fbSliuzhongzhu 132872fa4904SGuojia Liao msg_egress_port = le16_to_cpu(req0->egress_port); 13298ddfd9c4SYufeng Mo pos += scnprintf(buf + pos, len - pos, 13308ddfd9c4SYufeng Mo "%x %x %02x %04x %x\n", 133172fa4904SGuojia Liao !!(msg_egress_port & HCLGE_DBG_MNG_E_TYPE_B), 133272fa4904SGuojia Liao msg_egress_port & HCLGE_DBG_MNG_PF_ID, 133372fa4904SGuojia Liao (msg_egress_port >> 3) & HCLGE_DBG_MNG_VF_ID, 133472fa4904SGuojia Liao le16_to_cpu(req0->egress_queue), 133572fa4904SGuojia Liao !!(msg_egress_port & HCLGE_DBG_MNG_DROP_B)); 13367737f1fbSliuzhongzhu } 13378ddfd9c4SYufeng Mo 13388ddfd9c4SYufeng Mo return 0; 13397737f1fbSliuzhongzhu } 13407737f1fbSliuzhongzhu 134144b6b883SYufeng Mo static int hclge_dbg_fd_tcam_read(struct hclge_dev *hdev, u8 stage, 13423c666b58Sliuzhongzhu bool sel_x, u32 loc) 13433c666b58Sliuzhongzhu { 13443c666b58Sliuzhongzhu struct hclge_fd_tcam_config_1_cmd *req1; 13453c666b58Sliuzhongzhu struct hclge_fd_tcam_config_2_cmd *req2; 13463c666b58Sliuzhongzhu struct hclge_fd_tcam_config_3_cmd *req3; 13473c666b58Sliuzhongzhu struct hclge_desc desc[3]; 13483c666b58Sliuzhongzhu int ret, i; 13493c666b58Sliuzhongzhu u32 *req; 13503c666b58Sliuzhongzhu 13513c666b58Sliuzhongzhu hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_FD_TCAM_OP, true); 13523c666b58Sliuzhongzhu desc[0].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT); 13533c666b58Sliuzhongzhu hclge_cmd_setup_basic_desc(&desc[1], HCLGE_OPC_FD_TCAM_OP, true); 13543c666b58Sliuzhongzhu desc[1].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT); 13553c666b58Sliuzhongzhu hclge_cmd_setup_basic_desc(&desc[2], HCLGE_OPC_FD_TCAM_OP, true); 13563c666b58Sliuzhongzhu 13573c666b58Sliuzhongzhu req1 = (struct hclge_fd_tcam_config_1_cmd *)desc[0].data; 13583c666b58Sliuzhongzhu req2 = (struct hclge_fd_tcam_config_2_cmd *)desc[1].data; 13593c666b58Sliuzhongzhu req3 = (struct hclge_fd_tcam_config_3_cmd *)desc[2].data; 13603c666b58Sliuzhongzhu 13613c666b58Sliuzhongzhu req1->stage = stage; 13623c666b58Sliuzhongzhu req1->xy_sel = sel_x ? 1 : 0; 13633c666b58Sliuzhongzhu req1->index = cpu_to_le32(loc); 13643c666b58Sliuzhongzhu 13653c666b58Sliuzhongzhu ret = hclge_cmd_send(&hdev->hw, desc, 3); 13663c666b58Sliuzhongzhu if (ret) 136744b6b883SYufeng Mo return ret; 13683c666b58Sliuzhongzhu 13693c666b58Sliuzhongzhu dev_info(&hdev->pdev->dev, " read result tcam key %s(%u):\n", 13703c666b58Sliuzhongzhu sel_x ? "x" : "y", loc); 13713c666b58Sliuzhongzhu 137246ee7350SGuojia Liao /* tcam_data0 ~ tcam_data1 */ 13733c666b58Sliuzhongzhu req = (u32 *)req1->tcam_data; 13743c666b58Sliuzhongzhu for (i = 0; i < 2; i++) 13753c666b58Sliuzhongzhu dev_info(&hdev->pdev->dev, "%08x\n", *req++); 13763c666b58Sliuzhongzhu 137746ee7350SGuojia Liao /* tcam_data2 ~ tcam_data7 */ 13783c666b58Sliuzhongzhu req = (u32 *)req2->tcam_data; 13793c666b58Sliuzhongzhu for (i = 0; i < 6; i++) 13803c666b58Sliuzhongzhu dev_info(&hdev->pdev->dev, "%08x\n", *req++); 13813c666b58Sliuzhongzhu 138246ee7350SGuojia Liao /* tcam_data8 ~ tcam_data12 */ 13833c666b58Sliuzhongzhu req = (u32 *)req3->tcam_data; 13843c666b58Sliuzhongzhu for (i = 0; i < 5; i++) 13853c666b58Sliuzhongzhu dev_info(&hdev->pdev->dev, "%08x\n", *req++); 138644b6b883SYufeng Mo 138744b6b883SYufeng Mo return ret; 138844b6b883SYufeng Mo } 138944b6b883SYufeng Mo 139044b6b883SYufeng Mo static int hclge_dbg_get_rules_location(struct hclge_dev *hdev, u16 *rule_locs) 139144b6b883SYufeng Mo { 139244b6b883SYufeng Mo struct hclge_fd_rule *rule; 139344b6b883SYufeng Mo struct hlist_node *node; 139444b6b883SYufeng Mo int cnt = 0; 139544b6b883SYufeng Mo 139644b6b883SYufeng Mo spin_lock_bh(&hdev->fd_rule_lock); 139744b6b883SYufeng Mo hlist_for_each_entry_safe(rule, node, &hdev->fd_rule_list, rule_node) { 139844b6b883SYufeng Mo rule_locs[cnt] = rule->location; 139944b6b883SYufeng Mo cnt++; 140044b6b883SYufeng Mo } 140144b6b883SYufeng Mo spin_unlock_bh(&hdev->fd_rule_lock); 140244b6b883SYufeng Mo 140344b6b883SYufeng Mo if (cnt != hdev->hclge_fd_rule_num) 140444b6b883SYufeng Mo return -EINVAL; 140544b6b883SYufeng Mo 140644b6b883SYufeng Mo return cnt; 14073c666b58Sliuzhongzhu } 14083c666b58Sliuzhongzhu 14093c666b58Sliuzhongzhu static void hclge_dbg_fd_tcam(struct hclge_dev *hdev) 14103c666b58Sliuzhongzhu { 141144b6b883SYufeng Mo int i, ret, rule_cnt; 141244b6b883SYufeng Mo u16 *rule_locs; 14133c666b58Sliuzhongzhu 141444b6b883SYufeng Mo if (!hnae3_dev_fd_supported(hdev)) { 141544b6b883SYufeng Mo dev_err(&hdev->pdev->dev, 141644b6b883SYufeng Mo "Only FD-supported dev supports dump fd tcam\n"); 141744b6b883SYufeng Mo return; 14183c666b58Sliuzhongzhu } 141944b6b883SYufeng Mo 142044b6b883SYufeng Mo if (!hdev->hclge_fd_rule_num || 142144b6b883SYufeng Mo !hdev->fd_cfg.rule_num[HCLGE_FD_STAGE_1]) 142244b6b883SYufeng Mo return; 142344b6b883SYufeng Mo 142444b6b883SYufeng Mo rule_locs = kcalloc(hdev->fd_cfg.rule_num[HCLGE_FD_STAGE_1], 142544b6b883SYufeng Mo sizeof(u16), GFP_KERNEL); 142644b6b883SYufeng Mo if (!rule_locs) 142744b6b883SYufeng Mo return; 142844b6b883SYufeng Mo 142944b6b883SYufeng Mo rule_cnt = hclge_dbg_get_rules_location(hdev, rule_locs); 143044b6b883SYufeng Mo if (rule_cnt <= 0) { 143144b6b883SYufeng Mo dev_err(&hdev->pdev->dev, 143244b6b883SYufeng Mo "failed to get rule number, ret = %d\n", rule_cnt); 143344b6b883SYufeng Mo kfree(rule_locs); 143444b6b883SYufeng Mo return; 143544b6b883SYufeng Mo } 143644b6b883SYufeng Mo 143744b6b883SYufeng Mo for (i = 0; i < rule_cnt; i++) { 143844b6b883SYufeng Mo ret = hclge_dbg_fd_tcam_read(hdev, 0, true, rule_locs[i]); 143944b6b883SYufeng Mo if (ret) { 144044b6b883SYufeng Mo dev_err(&hdev->pdev->dev, 144144b6b883SYufeng Mo "failed to get fd tcam key x, ret = %d\n", ret); 144244b6b883SYufeng Mo kfree(rule_locs); 144344b6b883SYufeng Mo return; 144444b6b883SYufeng Mo } 144544b6b883SYufeng Mo 144644b6b883SYufeng Mo ret = hclge_dbg_fd_tcam_read(hdev, 0, false, rule_locs[i]); 144744b6b883SYufeng Mo if (ret) { 144844b6b883SYufeng Mo dev_err(&hdev->pdev->dev, 144944b6b883SYufeng Mo "failed to get fd tcam key y, ret = %d\n", ret); 145044b6b883SYufeng Mo kfree(rule_locs); 145144b6b883SYufeng Mo return; 145244b6b883SYufeng Mo } 145344b6b883SYufeng Mo } 145444b6b883SYufeng Mo 145544b6b883SYufeng Mo kfree(rule_locs); 14563c666b58Sliuzhongzhu } 14573c666b58Sliuzhongzhu 14581a7ff828SJiaran Zhang int hclge_dbg_dump_rst_info(struct hclge_dev *hdev, char *buf, int len) 1459f02eb82dSHuazhong Tan { 14601a7ff828SJiaran Zhang int pos = 0; 14611a7ff828SJiaran Zhang 14621a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "PF reset count: %u\n", 1463f02eb82dSHuazhong Tan hdev->rst_stats.pf_rst_cnt); 14641a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "FLR reset count: %u\n", 1465f02eb82dSHuazhong Tan hdev->rst_stats.flr_rst_cnt); 14661a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "GLOBAL reset count: %u\n", 1467f02eb82dSHuazhong Tan hdev->rst_stats.global_rst_cnt); 14681a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "IMP reset count: %u\n", 1469f02eb82dSHuazhong Tan hdev->rst_stats.imp_rst_cnt); 14701a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "reset done count: %u\n", 1471f02eb82dSHuazhong Tan hdev->rst_stats.reset_done_cnt); 14721a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "HW reset done count: %u\n", 1473f02eb82dSHuazhong Tan hdev->rst_stats.hw_reset_done_cnt); 14741a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "reset count: %u\n", 1475f02eb82dSHuazhong Tan hdev->rst_stats.reset_cnt); 14761a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "reset fail count: %u\n", 14770ecf1f7bSHuazhong Tan hdev->rst_stats.reset_fail_cnt); 14781a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, 14791a7ff828SJiaran Zhang "vector0 interrupt enable status: 0x%x\n", 14800ecf1f7bSHuazhong Tan hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_REG_BASE)); 14811a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "reset interrupt source: 0x%x\n", 14820ecf1f7bSHuazhong Tan hclge_read_dev(&hdev->hw, HCLGE_MISC_RESET_STS_REG)); 14831a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "reset interrupt status: 0x%x\n", 14840ecf1f7bSHuazhong Tan hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_INT_STS)); 14851a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "RAS interrupt status: 0x%x\n", 14861a7ff828SJiaran Zhang hclge_read_dev(&hdev->hw, 14871a7ff828SJiaran Zhang HCLGE_RAS_PF_OTHER_INT_STS_REG)); 14881a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "hardware reset status: 0x%x\n", 14890ecf1f7bSHuazhong Tan hclge_read_dev(&hdev->hw, HCLGE_GLOBAL_RESET_REG)); 14901a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "handshake status: 0x%x\n", 14910ecf1f7bSHuazhong Tan hclge_read_dev(&hdev->hw, HCLGE_NIC_CSQ_DEPTH_REG)); 14921a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "function reset status: 0x%x\n", 14930ecf1f7bSHuazhong Tan hclge_read_dev(&hdev->hw, HCLGE_FUN_RST_ING)); 14941a7ff828SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "hdev state: 0x%lx\n", 14951a7ff828SJiaran Zhang hdev->state); 14961a7ff828SJiaran Zhang 14971a7ff828SJiaran Zhang return 0; 1498f02eb82dSHuazhong Tan } 1499f02eb82dSHuazhong Tan 15001c6dfe6fSYunsheng Lin static void hclge_dbg_dump_serv_info(struct hclge_dev *hdev) 15011c6dfe6fSYunsheng Lin { 15021c6dfe6fSYunsheng Lin dev_info(&hdev->pdev->dev, "last_serv_processed: %lu\n", 15031c6dfe6fSYunsheng Lin hdev->last_serv_processed); 15041c6dfe6fSYunsheng Lin dev_info(&hdev->pdev->dev, "last_serv_cnt: %lu\n", 15051c6dfe6fSYunsheng Lin hdev->serv_processed_cnt); 15061c6dfe6fSYunsheng Lin } 15071c6dfe6fSYunsheng Lin 15089149ca0fSJiaran Zhang static int hclge_dbg_dump_interrupt(struct hclge_dev *hdev, char *buf, int len) 1509348775ebSYufeng Mo { 15109149ca0fSJiaran Zhang int pos = 0; 15119149ca0fSJiaran Zhang 15129149ca0fSJiaran Zhang pos += scnprintf(buf + pos, len - pos, "num_nic_msi: %u\n", 15139149ca0fSJiaran Zhang hdev->num_nic_msi); 15149149ca0fSJiaran Zhang pos += scnprintf(buf + pos, len - pos, "num_roce_msi: %u\n", 15159149ca0fSJiaran Zhang hdev->num_roce_msi); 15169149ca0fSJiaran Zhang pos += scnprintf(buf + pos, len - pos, "num_msi_used: %u\n", 15179149ca0fSJiaran Zhang hdev->num_msi_used); 15189149ca0fSJiaran Zhang pos += scnprintf(buf + pos, len - pos, "num_msi_left: %u\n", 15199149ca0fSJiaran Zhang hdev->num_msi_left); 15209149ca0fSJiaran Zhang 15219149ca0fSJiaran Zhang return 0; 1522348775ebSYufeng Mo } 1523348775ebSYufeng Mo 15240b198b0dSJiaran Zhang static void hclge_dbg_imp_info_data_print(struct hclge_desc *desc_src, 15250b198b0dSJiaran Zhang char *buf, int len, u32 bd_num) 152633a90e2fSZhongzhu Liu { 15270b198b0dSJiaran Zhang #define HCLGE_DBG_IMP_INFO_PRINT_OFFSET 0x2 15280b198b0dSJiaran Zhang 15290b198b0dSJiaran Zhang struct hclge_desc *desc_index = desc_src; 15300b198b0dSJiaran Zhang u32 offset = 0; 15310b198b0dSJiaran Zhang int pos = 0; 15320b198b0dSJiaran Zhang u32 i, j; 15330b198b0dSJiaran Zhang 15340b198b0dSJiaran Zhang pos += scnprintf(buf + pos, len - pos, "offset | data\n"); 15350b198b0dSJiaran Zhang 15360b198b0dSJiaran Zhang for (i = 0; i < bd_num; i++) { 15370b198b0dSJiaran Zhang j = 0; 15380b198b0dSJiaran Zhang while (j < HCLGE_DESC_DATA_LEN - 1) { 15390b198b0dSJiaran Zhang pos += scnprintf(buf + pos, len - pos, "0x%04x | ", 15400b198b0dSJiaran Zhang offset); 15410b198b0dSJiaran Zhang pos += scnprintf(buf + pos, len - pos, "0x%08x ", 15420b198b0dSJiaran Zhang le32_to_cpu(desc_index->data[j++])); 15430b198b0dSJiaran Zhang pos += scnprintf(buf + pos, len - pos, "0x%08x\n", 15440b198b0dSJiaran Zhang le32_to_cpu(desc_index->data[j++])); 15450b198b0dSJiaran Zhang offset += sizeof(u32) * HCLGE_DBG_IMP_INFO_PRINT_OFFSET; 15460b198b0dSJiaran Zhang } 15470b198b0dSJiaran Zhang desc_index++; 15480b198b0dSJiaran Zhang } 15490b198b0dSJiaran Zhang } 15500b198b0dSJiaran Zhang 15510b198b0dSJiaran Zhang static int 15520b198b0dSJiaran Zhang hclge_dbg_get_imp_stats_info(struct hclge_dev *hdev, char *buf, int len) 15530b198b0dSJiaran Zhang { 15540b198b0dSJiaran Zhang struct hclge_get_imp_bd_cmd *req; 15550b198b0dSJiaran Zhang struct hclge_desc *desc_src; 155633a90e2fSZhongzhu Liu struct hclge_desc desc; 15570b198b0dSJiaran Zhang u32 bd_num; 15580b198b0dSJiaran Zhang int ret; 155933a90e2fSZhongzhu Liu 15600b198b0dSJiaran Zhang hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_IMP_STATS_BD, true); 156133a90e2fSZhongzhu Liu 15620b198b0dSJiaran Zhang req = (struct hclge_get_imp_bd_cmd *)desc.data; 156333a90e2fSZhongzhu Liu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 156433a90e2fSZhongzhu Liu if (ret) { 156533a90e2fSZhongzhu Liu dev_err(&hdev->pdev->dev, 15660b198b0dSJiaran Zhang "failed to get imp statistics bd number, ret = %d\n", 156733a90e2fSZhongzhu Liu ret); 15680b198b0dSJiaran Zhang return ret; 156933a90e2fSZhongzhu Liu } 157033a90e2fSZhongzhu Liu 157133a90e2fSZhongzhu Liu bd_num = le32_to_cpu(req->bd_num); 157233a90e2fSZhongzhu Liu 15730b198b0dSJiaran Zhang desc_src = kcalloc(bd_num, sizeof(struct hclge_desc), GFP_KERNEL); 1574fbdc4d79SYufeng Mo if (!desc_src) 15750b198b0dSJiaran Zhang return -ENOMEM; 157633a90e2fSZhongzhu Liu 15770b198b0dSJiaran Zhang ret = hclge_dbg_cmd_send(hdev, desc_src, 0, bd_num, 15780b198b0dSJiaran Zhang HCLGE_OPC_IMP_STATS_INFO); 157933a90e2fSZhongzhu Liu if (ret) { 158033a90e2fSZhongzhu Liu kfree(desc_src); 158133a90e2fSZhongzhu Liu dev_err(&hdev->pdev->dev, 15820b198b0dSJiaran Zhang "failed to get imp statistics, ret = %d\n", ret); 15830b198b0dSJiaran Zhang return ret; 158433a90e2fSZhongzhu Liu } 158533a90e2fSZhongzhu Liu 15860b198b0dSJiaran Zhang hclge_dbg_imp_info_data_print(desc_src, buf, len, bd_num); 158733a90e2fSZhongzhu Liu 158833a90e2fSZhongzhu Liu kfree(desc_src); 15890b198b0dSJiaran Zhang 15900b198b0dSJiaran Zhang return 0; 159133a90e2fSZhongzhu Liu } 159233a90e2fSZhongzhu Liu 1593dec84660SYufeng Mo #define HCLGE_CMD_NCL_CONFIG_BD_NUM 5 1594e76e6886SJiaran Zhang #define HCLGE_MAX_NCL_CONFIG_LENGTH 16384 1595dec84660SYufeng Mo 1596e76e6886SJiaran Zhang static void hclge_ncl_config_data_print(struct hclge_desc *desc, int *index, 1597e76e6886SJiaran Zhang char *buf, int *len, int *pos) 1598dec84660SYufeng Mo { 1599dec84660SYufeng Mo #define HCLGE_CMD_DATA_NUM 6 1600dec84660SYufeng Mo 1601e76e6886SJiaran Zhang int offset = HCLGE_MAX_NCL_CONFIG_LENGTH - *index; 1602e76e6886SJiaran Zhang int i, j; 1603dec84660SYufeng Mo 1604dec84660SYufeng Mo for (i = 0; i < HCLGE_CMD_NCL_CONFIG_BD_NUM; i++) { 1605dec84660SYufeng Mo for (j = 0; j < HCLGE_CMD_DATA_NUM; j++) { 1606dec84660SYufeng Mo if (i == 0 && j == 0) 1607dec84660SYufeng Mo continue; 1608dec84660SYufeng Mo 1609e76e6886SJiaran Zhang *pos += scnprintf(buf + *pos, *len - *pos, 1610e76e6886SJiaran Zhang "0x%04x | 0x%08x\n", offset, 1611dec84660SYufeng Mo le32_to_cpu(desc[i].data[j])); 1612e76e6886SJiaran Zhang 1613e76e6886SJiaran Zhang offset += sizeof(u32); 1614e76e6886SJiaran Zhang *index -= sizeof(u32); 1615e76e6886SJiaran Zhang 1616e76e6886SJiaran Zhang if (*index <= 0) 1617dec84660SYufeng Mo return; 1618dec84660SYufeng Mo } 1619dec84660SYufeng Mo } 1620dec84660SYufeng Mo } 1621dec84660SYufeng Mo 1622e76e6886SJiaran Zhang static int 1623e76e6886SJiaran Zhang hclge_dbg_dump_ncl_config(struct hclge_dev *hdev, char *buf, int len) 1624ffd140e2SWeihang Li { 16254960cabfSYufeng Mo #define HCLGE_NCL_CONFIG_LENGTH_IN_EACH_CMD (20 + 24 * 4) 1626ffd140e2SWeihang Li 1627dec84660SYufeng Mo struct hclge_desc desc[HCLGE_CMD_NCL_CONFIG_BD_NUM]; 1628dec84660SYufeng Mo int bd_num = HCLGE_CMD_NCL_CONFIG_BD_NUM; 1629e76e6886SJiaran Zhang int index = HCLGE_MAX_NCL_CONFIG_LENGTH; 1630e76e6886SJiaran Zhang int pos = 0; 1631e76e6886SJiaran Zhang u32 data0; 1632ffd140e2SWeihang Li int ret; 1633ffd140e2SWeihang Li 1634e76e6886SJiaran Zhang pos += scnprintf(buf + pos, len - pos, "offset | data\n"); 1635b4401a04SYufeng Mo 1636e76e6886SJiaran Zhang while (index > 0) { 1637e76e6886SJiaran Zhang data0 = HCLGE_MAX_NCL_CONFIG_LENGTH - index; 1638e76e6886SJiaran Zhang if (index >= HCLGE_NCL_CONFIG_LENGTH_IN_EACH_CMD) 16394960cabfSYufeng Mo data0 |= HCLGE_NCL_CONFIG_LENGTH_IN_EACH_CMD << 16; 1640ffd140e2SWeihang Li else 1641e76e6886SJiaran Zhang data0 |= (u32)index << 16; 1642ffd140e2SWeihang Li ret = hclge_dbg_cmd_send(hdev, desc, data0, bd_num, 1643ffd140e2SWeihang Li HCLGE_OPC_QUERY_NCL_CONFIG); 1644ffd140e2SWeihang Li if (ret) 1645e76e6886SJiaran Zhang return ret; 1646ffd140e2SWeihang Li 1647e76e6886SJiaran Zhang hclge_ncl_config_data_print(desc, &index, buf, &len, &pos); 1648ffd140e2SWeihang Li } 1649e76e6886SJiaran Zhang 1650e76e6886SJiaran Zhang return 0; 1651ffd140e2SWeihang Li } 1652ffd140e2SWeihang Li 1653d658ff34SYufeng Mo static int hclge_dbg_dump_loopback(struct hclge_dev *hdev, char *buf, int len) 1654ded45d40SYufeng Mo { 1655ded45d40SYufeng Mo struct phy_device *phydev = hdev->hw.mac.phydev; 1656ded45d40SYufeng Mo struct hclge_config_mac_mode_cmd *req_app; 1657b47cfe1fSGuangbin Huang struct hclge_common_lb_cmd *req_common; 1658ded45d40SYufeng Mo struct hclge_desc desc; 1659ded45d40SYufeng Mo u8 loopback_en; 1660d658ff34SYufeng Mo int pos = 0; 1661ded45d40SYufeng Mo int ret; 1662ded45d40SYufeng Mo 1663ded45d40SYufeng Mo req_app = (struct hclge_config_mac_mode_cmd *)desc.data; 1664b47cfe1fSGuangbin Huang req_common = (struct hclge_common_lb_cmd *)desc.data; 1665ded45d40SYufeng Mo 1666d658ff34SYufeng Mo pos += scnprintf(buf + pos, len - pos, "mac id: %u\n", 1667d658ff34SYufeng Mo hdev->hw.mac.mac_id); 1668ded45d40SYufeng Mo 1669ded45d40SYufeng Mo hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_MAC_MODE, true); 1670ded45d40SYufeng Mo ret = hclge_cmd_send(&hdev->hw, &desc, 1); 1671ded45d40SYufeng Mo if (ret) { 1672ded45d40SYufeng Mo dev_err(&hdev->pdev->dev, 1673ded45d40SYufeng Mo "failed to dump app loopback status, ret = %d\n", ret); 1674d658ff34SYufeng Mo return ret; 1675ded45d40SYufeng Mo } 1676ded45d40SYufeng Mo 1677ded45d40SYufeng Mo loopback_en = hnae3_get_bit(le32_to_cpu(req_app->txrx_pad_fcs_loop_en), 1678ded45d40SYufeng Mo HCLGE_MAC_APP_LP_B); 1679d658ff34SYufeng Mo pos += scnprintf(buf + pos, len - pos, "app loopback: %s\n", 1680d658ff34SYufeng Mo state_str[loopback_en]); 1681ded45d40SYufeng Mo 1682b47cfe1fSGuangbin Huang hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_COMMON_LOOPBACK, true); 1683ded45d40SYufeng Mo ret = hclge_cmd_send(&hdev->hw, &desc, 1); 1684ded45d40SYufeng Mo if (ret) { 1685ded45d40SYufeng Mo dev_err(&hdev->pdev->dev, 1686b47cfe1fSGuangbin Huang "failed to dump common loopback status, ret = %d\n", 1687ded45d40SYufeng Mo ret); 1688d658ff34SYufeng Mo return ret; 1689ded45d40SYufeng Mo } 1690ded45d40SYufeng Mo 1691b47cfe1fSGuangbin Huang loopback_en = req_common->enable & HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B; 1692d658ff34SYufeng Mo pos += scnprintf(buf + pos, len - pos, "serdes serial loopback: %s\n", 1693d658ff34SYufeng Mo state_str[loopback_en]); 1694ded45d40SYufeng Mo 1695b47cfe1fSGuangbin Huang loopback_en = req_common->enable & 1696d658ff34SYufeng Mo HCLGE_CMD_SERDES_PARALLEL_INNER_LOOP_B ? 1 : 0; 1697d658ff34SYufeng Mo pos += scnprintf(buf + pos, len - pos, "serdes parallel loopback: %s\n", 1698d658ff34SYufeng Mo state_str[loopback_en]); 1699ded45d40SYufeng Mo 1700b47cfe1fSGuangbin Huang if (phydev) { 1701d658ff34SYufeng Mo loopback_en = phydev->loopback_enabled; 1702d658ff34SYufeng Mo pos += scnprintf(buf + pos, len - pos, "phy loopback: %s\n", 1703d658ff34SYufeng Mo state_str[loopback_en]); 1704b47cfe1fSGuangbin Huang } else if (hnae3_dev_phy_imp_supported(hdev)) { 1705b47cfe1fSGuangbin Huang loopback_en = req_common->enable & 1706b47cfe1fSGuangbin Huang HCLGE_CMD_GE_PHY_INNER_LOOP_B; 1707d658ff34SYufeng Mo pos += scnprintf(buf + pos, len - pos, "phy loopback: %s\n", 1708d658ff34SYufeng Mo state_str[loopback_en]); 1709b47cfe1fSGuangbin Huang } 1710d658ff34SYufeng Mo 1711d658ff34SYufeng Mo return 0; 1712ded45d40SYufeng Mo } 1713ded45d40SYufeng Mo 1714a6345787SWeihang Li /* hclge_dbg_dump_mac_tnl_status: print message about mac tnl interrupt 1715a6345787SWeihang Li * @hdev: pointer to struct hclge_dev 1716a6345787SWeihang Li */ 1717a6345787SWeihang Li static void hclge_dbg_dump_mac_tnl_status(struct hclge_dev *hdev) 1718a6345787SWeihang Li { 1719a6345787SWeihang Li #define HCLGE_BILLION_NANO_SECONDS 1000000000 1720a6345787SWeihang Li 1721a6345787SWeihang Li struct hclge_mac_tnl_stats stats; 1722a6345787SWeihang Li unsigned long rem_nsec; 1723a6345787SWeihang Li 1724a6345787SWeihang Li dev_info(&hdev->pdev->dev, "Recently generated mac tnl interruption:\n"); 1725a6345787SWeihang Li 1726a6345787SWeihang Li while (kfifo_get(&hdev->mac_tnl_log, &stats)) { 1727a6345787SWeihang Li rem_nsec = do_div(stats.time, HCLGE_BILLION_NANO_SECONDS); 1728a6345787SWeihang Li dev_info(&hdev->pdev->dev, "[%07lu.%03lu] status = 0x%x\n", 1729a6345787SWeihang Li (unsigned long)stats.time, rem_nsec / 1000, 1730a6345787SWeihang Li stats.status); 1731a6345787SWeihang Li } 1732a6345787SWeihang Li } 1733a6345787SWeihang Li 1734ee9e4424SYonglong Liu static void hclge_dbg_dump_qs_shaper_single(struct hclge_dev *hdev, u16 qsid) 1735ee9e4424SYonglong Liu { 1736ee9e4424SYonglong Liu struct hclge_qs_shapping_cmd *shap_cfg_cmd; 1737ee9e4424SYonglong Liu u8 ir_u, ir_b, ir_s, bs_b, bs_s; 1738ee9e4424SYonglong Liu struct hclge_desc desc; 1739ee9e4424SYonglong Liu u32 shapping_para; 1740c331ecf1SYonglong Liu u32 rate; 1741ee9e4424SYonglong Liu int ret; 1742ee9e4424SYonglong Liu 1743ee9e4424SYonglong Liu hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QCN_SHAPPING_CFG, true); 1744ee9e4424SYonglong Liu 1745ee9e4424SYonglong Liu shap_cfg_cmd = (struct hclge_qs_shapping_cmd *)desc.data; 1746ee9e4424SYonglong Liu shap_cfg_cmd->qs_id = cpu_to_le16(qsid); 1747ee9e4424SYonglong Liu 1748ee9e4424SYonglong Liu ret = hclge_cmd_send(&hdev->hw, &desc, 1); 1749ee9e4424SYonglong Liu if (ret) { 1750ee9e4424SYonglong Liu dev_err(&hdev->pdev->dev, 1751ee9e4424SYonglong Liu "qs%u failed to get tx_rate, ret=%d\n", 1752ee9e4424SYonglong Liu qsid, ret); 1753ee9e4424SYonglong Liu return; 1754ee9e4424SYonglong Liu } 1755ee9e4424SYonglong Liu 1756ee9e4424SYonglong Liu shapping_para = le32_to_cpu(shap_cfg_cmd->qs_shapping_para); 1757ee9e4424SYonglong Liu ir_b = hclge_tm_get_field(shapping_para, IR_B); 1758ee9e4424SYonglong Liu ir_u = hclge_tm_get_field(shapping_para, IR_U); 1759ee9e4424SYonglong Liu ir_s = hclge_tm_get_field(shapping_para, IR_S); 1760ee9e4424SYonglong Liu bs_b = hclge_tm_get_field(shapping_para, BS_B); 1761ee9e4424SYonglong Liu bs_s = hclge_tm_get_field(shapping_para, BS_S); 1762c331ecf1SYonglong Liu rate = le32_to_cpu(shap_cfg_cmd->qs_rate); 1763ee9e4424SYonglong Liu 1764ee9e4424SYonglong Liu dev_info(&hdev->pdev->dev, 1765c331ecf1SYonglong Liu "qs%u ir_b:%u, ir_u:%u, ir_s:%u, bs_b:%u, bs_s:%u, flag:%#x, rate:%u(Mbps)\n", 1766c331ecf1SYonglong Liu qsid, ir_b, ir_u, ir_s, bs_b, bs_s, shap_cfg_cmd->flag, rate); 1767ee9e4424SYonglong Liu } 1768ee9e4424SYonglong Liu 1769ee9e4424SYonglong Liu static void hclge_dbg_dump_qs_shaper_all(struct hclge_dev *hdev) 1770ee9e4424SYonglong Liu { 1771ee9e4424SYonglong Liu struct hnae3_knic_private_info *kinfo; 1772ee9e4424SYonglong Liu struct hclge_vport *vport; 1773ee9e4424SYonglong Liu int vport_id, i; 1774ee9e4424SYonglong Liu 1775ee9e4424SYonglong Liu for (vport_id = 0; vport_id <= pci_num_vf(hdev->pdev); vport_id++) { 1776ee9e4424SYonglong Liu vport = &hdev->vport[vport_id]; 1777ee9e4424SYonglong Liu kinfo = &vport->nic.kinfo; 1778ee9e4424SYonglong Liu 1779ee9e4424SYonglong Liu dev_info(&hdev->pdev->dev, "qs cfg of vport%d:\n", vport_id); 1780ee9e4424SYonglong Liu 178135244430SJian Shen for (i = 0; i < kinfo->tc_info.num_tc; i++) { 1782ee9e4424SYonglong Liu u16 qsid = vport->qs_offset + i; 1783ee9e4424SYonglong Liu 1784ee9e4424SYonglong Liu hclge_dbg_dump_qs_shaper_single(hdev, qsid); 1785ee9e4424SYonglong Liu } 1786ee9e4424SYonglong Liu } 1787ee9e4424SYonglong Liu } 1788ee9e4424SYonglong Liu 1789ee9e4424SYonglong Liu static void hclge_dbg_dump_qs_shaper(struct hclge_dev *hdev, 1790ee9e4424SYonglong Liu const char *cmd_buf) 1791ee9e4424SYonglong Liu { 1792ee9e4424SYonglong Liu u16 qsid; 1793ee9e4424SYonglong Liu int ret; 1794ee9e4424SYonglong Liu 1795ee9e4424SYonglong Liu ret = kstrtou16(cmd_buf, 0, &qsid); 1796ee9e4424SYonglong Liu if (ret) { 1797ee9e4424SYonglong Liu hclge_dbg_dump_qs_shaper_all(hdev); 1798ee9e4424SYonglong Liu return; 1799ee9e4424SYonglong Liu } 1800ee9e4424SYonglong Liu 18013f094bd1SGuangbin Huang if (qsid >= hdev->ae_dev->dev_specs.max_qset_num) { 18023f094bd1SGuangbin Huang dev_err(&hdev->pdev->dev, "qsid(%u) out of range[0-%u]\n", 18033f094bd1SGuangbin Huang qsid, hdev->ae_dev->dev_specs.max_qset_num - 1); 1804ee9e4424SYonglong Liu return; 1805ee9e4424SYonglong Liu } 1806ee9e4424SYonglong Liu 1807ee9e4424SYonglong Liu hclge_dbg_dump_qs_shaper_single(hdev, qsid); 1808ee9e4424SYonglong Liu } 1809ee9e4424SYonglong Liu 18101556ea91SHuazhong Tan static const struct hclge_dbg_item mac_list_items[] = { 18111556ea91SHuazhong Tan { "FUNC_ID", 2 }, 18121556ea91SHuazhong Tan { "MAC_ADDR", 12 }, 18131556ea91SHuazhong Tan { "STATE", 2 }, 18141556ea91SHuazhong Tan }; 18151556ea91SHuazhong Tan 18161556ea91SHuazhong Tan static void hclge_dbg_dump_mac_list(struct hclge_dev *hdev, char *buf, int len, 1817f671237aSJian Shen bool is_unicast) 1818f671237aSJian Shen { 18191556ea91SHuazhong Tan char data_str[ARRAY_SIZE(mac_list_items)][HCLGE_DBG_DATA_STR_LEN]; 18201556ea91SHuazhong Tan char content[HCLGE_DBG_INFO_LEN], str_id[HCLGE_DBG_ID_LEN]; 18211556ea91SHuazhong Tan char *result[ARRAY_SIZE(mac_list_items)]; 1822f671237aSJian Shen struct hclge_mac_node *mac_node, *tmp; 1823f671237aSJian Shen struct hclge_vport *vport; 1824f671237aSJian Shen struct list_head *list; 1825f671237aSJian Shen u32 func_id; 18261556ea91SHuazhong Tan int pos = 0; 18271556ea91SHuazhong Tan int i; 1828f671237aSJian Shen 18291556ea91SHuazhong Tan for (i = 0; i < ARRAY_SIZE(mac_list_items); i++) 18301556ea91SHuazhong Tan result[i] = &data_str[i][0]; 1831f671237aSJian Shen 18321556ea91SHuazhong Tan pos += scnprintf(buf + pos, len - pos, "%s MAC_LIST:\n", 18331556ea91SHuazhong Tan is_unicast ? "UC" : "MC"); 18341556ea91SHuazhong Tan hclge_dbg_fill_content(content, sizeof(content), mac_list_items, 18351556ea91SHuazhong Tan NULL, ARRAY_SIZE(mac_list_items)); 18361556ea91SHuazhong Tan pos += scnprintf(buf + pos, len - pos, "%s", content); 1837f671237aSJian Shen 18381556ea91SHuazhong Tan for (func_id = 0; func_id < hdev->num_alloc_vport; func_id++) { 1839f671237aSJian Shen vport = &hdev->vport[func_id]; 1840f671237aSJian Shen list = is_unicast ? &vport->uc_mac_list : &vport->mc_mac_list; 1841f671237aSJian Shen spin_lock_bh(&vport->mac_list_lock); 1842f671237aSJian Shen list_for_each_entry_safe(mac_node, tmp, list, node) { 18431556ea91SHuazhong Tan i = 0; 18441556ea91SHuazhong Tan result[i++] = hclge_dbg_get_func_id_str(str_id, 18451556ea91SHuazhong Tan func_id); 18461556ea91SHuazhong Tan sprintf(result[i++], "%pM", mac_node->mac_addr); 18471556ea91SHuazhong Tan sprintf(result[i++], "%5s", 18481556ea91SHuazhong Tan hclge_mac_state_str[mac_node->state]); 18491556ea91SHuazhong Tan hclge_dbg_fill_content(content, sizeof(content), 18501556ea91SHuazhong Tan mac_list_items, 18511556ea91SHuazhong Tan (const char **)result, 18521556ea91SHuazhong Tan ARRAY_SIZE(mac_list_items)); 18531556ea91SHuazhong Tan pos += scnprintf(buf + pos, len - pos, "%s", content); 18541556ea91SHuazhong Tan } 18551556ea91SHuazhong Tan spin_unlock_bh(&vport->mac_list_lock); 18561556ea91SHuazhong Tan } 1857f671237aSJian Shen } 1858f671237aSJian Shen 18591556ea91SHuazhong Tan static int hclge_dbg_dump_mac_uc(struct hclge_dev *hdev, char *buf, int len) 18601556ea91SHuazhong Tan { 18611556ea91SHuazhong Tan hclge_dbg_dump_mac_list(hdev, buf, len, true); 18621556ea91SHuazhong Tan 18631556ea91SHuazhong Tan return 0; 18641556ea91SHuazhong Tan } 18651556ea91SHuazhong Tan 18661556ea91SHuazhong Tan static int hclge_dbg_dump_mac_mc(struct hclge_dev *hdev, char *buf, int len) 18671556ea91SHuazhong Tan { 18681556ea91SHuazhong Tan hclge_dbg_dump_mac_list(hdev, buf, len, false); 1869f671237aSJian Shen 1870f671237aSJian Shen return 0; 1871f671237aSJian Shen } 1872f671237aSJian Shen 1873ebaf1908SWeihang Li int hclge_dbg_run_cmd(struct hnae3_handle *handle, const char *cmd_buf) 18743c666b58Sliuzhongzhu { 1875*d96b0e59SYufeng Mo #define DUMP_REG_DCB "dump reg dcb" 18766125b52dSHuazhong Tan #define DUMP_TM_MAP "dump tm map" 1877a582b78dSZhongzhu Liu 18783c666b58Sliuzhongzhu struct hclge_vport *vport = hclge_get_vport(handle); 18793c666b58Sliuzhongzhu struct hclge_dev *hdev = vport->back; 18803c666b58Sliuzhongzhu 18813c666b58Sliuzhongzhu if (strncmp(cmd_buf, "dump fd tcam", 12) == 0) { 18823c666b58Sliuzhongzhu hclge_dbg_fd_tcam(hdev); 18832849d4e7Sliuzhongzhu } else if (strncmp(cmd_buf, "dump tc", 7) == 0) { 18842849d4e7Sliuzhongzhu hclge_dbg_dump_tc(hdev); 18856125b52dSHuazhong Tan } else if (strncmp(cmd_buf, DUMP_TM_MAP, strlen(DUMP_TM_MAP)) == 0) { 18866125b52dSHuazhong Tan hclge_dbg_dump_tm_map(hdev, &cmd_buf[sizeof(DUMP_TM_MAP)]); 188796227f4cSliuzhongzhu } else if (strncmp(cmd_buf, "dump tm", 7) == 0) { 188896227f4cSliuzhongzhu hclge_dbg_dump_tm(hdev); 1889d958919dSliuzhongzhu } else if (strncmp(cmd_buf, "dump qos pause cfg", 18) == 0) { 1890d958919dSliuzhongzhu hclge_dbg_dump_qos_pause_cfg(hdev); 18916fc22440Sliuzhongzhu } else if (strncmp(cmd_buf, "dump qos pri map", 16) == 0) { 18926fc22440Sliuzhongzhu hclge_dbg_dump_qos_pri_map(hdev); 18937d9d7f88Sliuzhongzhu } else if (strncmp(cmd_buf, "dump qos buf cfg", 16) == 0) { 18947d9d7f88Sliuzhongzhu hclge_dbg_dump_qos_buf_cfg(hdev); 1895*d96b0e59SYufeng Mo } else if (strncmp(cmd_buf, DUMP_REG_DCB, strlen(DUMP_REG_DCB)) == 0) { 1896*d96b0e59SYufeng Mo hclge_dbg_dump_dcb(hdev, &cmd_buf[sizeof(DUMP_REG_DCB)]); 18971c6dfe6fSYunsheng Lin } else if (strncmp(cmd_buf, "dump serv info", 14) == 0) { 18981c6dfe6fSYunsheng Lin hclge_dbg_dump_serv_info(hdev); 1899a6345787SWeihang Li } else if (strncmp(cmd_buf, "dump mac tnl status", 19) == 0) { 1900a6345787SWeihang Li hclge_dbg_dump_mac_tnl_status(hdev); 1901ee9e4424SYonglong Liu } else if (strncmp(cmd_buf, "dump qs shaper", 14) == 0) { 1902ee9e4424SYonglong Liu hclge_dbg_dump_qs_shaper(hdev, 1903ee9e4424SYonglong Liu &cmd_buf[sizeof("dump qs shaper")]); 19043c666b58Sliuzhongzhu } else { 19053c666b58Sliuzhongzhu dev_info(&hdev->pdev->dev, "unknown command\n"); 19063c666b58Sliuzhongzhu return -EINVAL; 19073c666b58Sliuzhongzhu } 19083c666b58Sliuzhongzhu 19093c666b58Sliuzhongzhu return 0; 19103c666b58Sliuzhongzhu } 191104987ca1SGuangbin Huang 19125e69ea7eSYufeng Mo static const struct hclge_dbg_func hclge_dbg_cmd_func[] = { 19135e69ea7eSYufeng Mo { 19145e69ea7eSYufeng Mo .cmd = HNAE3_DBG_CMD_TM_NODES, 19155e69ea7eSYufeng Mo .dbg_dump = hclge_dbg_dump_tm_nodes, 19165e69ea7eSYufeng Mo }, 19175e69ea7eSYufeng Mo { 19185e69ea7eSYufeng Mo .cmd = HNAE3_DBG_CMD_TM_PRI, 19195e69ea7eSYufeng Mo .dbg_dump = hclge_dbg_dump_tm_pri, 19205e69ea7eSYufeng Mo }, 19215e69ea7eSYufeng Mo { 19225e69ea7eSYufeng Mo .cmd = HNAE3_DBG_CMD_TM_QSET, 19235e69ea7eSYufeng Mo .dbg_dump = hclge_dbg_dump_tm_qset, 19245e69ea7eSYufeng Mo }, 19251556ea91SHuazhong Tan { 19261556ea91SHuazhong Tan .cmd = HNAE3_DBG_CMD_MAC_UC, 19271556ea91SHuazhong Tan .dbg_dump = hclge_dbg_dump_mac_uc, 19281556ea91SHuazhong Tan }, 19291556ea91SHuazhong Tan { 19301556ea91SHuazhong Tan .cmd = HNAE3_DBG_CMD_MAC_MC, 19311556ea91SHuazhong Tan .dbg_dump = hclge_dbg_dump_mac_mc, 19321556ea91SHuazhong Tan }, 19338ddfd9c4SYufeng Mo { 19348ddfd9c4SYufeng Mo .cmd = HNAE3_DBG_CMD_MNG_TBL, 19358ddfd9c4SYufeng Mo .dbg_dump = hclge_dbg_dump_mng_table, 19368ddfd9c4SYufeng Mo }, 1937d658ff34SYufeng Mo { 1938d658ff34SYufeng Mo .cmd = HNAE3_DBG_CMD_LOOPBACK, 1939d658ff34SYufeng Mo .dbg_dump = hclge_dbg_dump_loopback, 1940d658ff34SYufeng Mo }, 19419149ca0fSJiaran Zhang { 19429149ca0fSJiaran Zhang .cmd = HNAE3_DBG_CMD_INTERRUPT_INFO, 19439149ca0fSJiaran Zhang .dbg_dump = hclge_dbg_dump_interrupt, 19449149ca0fSJiaran Zhang }, 19451a7ff828SJiaran Zhang { 19461a7ff828SJiaran Zhang .cmd = HNAE3_DBG_CMD_RESET_INFO, 19471a7ff828SJiaran Zhang .dbg_dump = hclge_dbg_dump_rst_info, 19481a7ff828SJiaran Zhang }, 19490b198b0dSJiaran Zhang { 19500b198b0dSJiaran Zhang .cmd = HNAE3_DBG_CMD_IMP_INFO, 19510b198b0dSJiaran Zhang .dbg_dump = hclge_dbg_get_imp_stats_info, 19520b198b0dSJiaran Zhang }, 1953e76e6886SJiaran Zhang { 1954e76e6886SJiaran Zhang .cmd = HNAE3_DBG_CMD_NCL_CONFIG, 1955e76e6886SJiaran Zhang .dbg_dump = hclge_dbg_dump_ncl_config, 1956e76e6886SJiaran Zhang }, 1957*d96b0e59SYufeng Mo { 1958*d96b0e59SYufeng Mo .cmd = HNAE3_DBG_CMD_REG_BIOS_COMMON, 1959*d96b0e59SYufeng Mo .dbg_dump_reg = hclge_dbg_dump_reg_cmd, 1960*d96b0e59SYufeng Mo }, 1961*d96b0e59SYufeng Mo { 1962*d96b0e59SYufeng Mo .cmd = HNAE3_DBG_CMD_REG_SSU, 1963*d96b0e59SYufeng Mo .dbg_dump_reg = hclge_dbg_dump_reg_cmd, 1964*d96b0e59SYufeng Mo }, 1965*d96b0e59SYufeng Mo { 1966*d96b0e59SYufeng Mo .cmd = HNAE3_DBG_CMD_REG_IGU_EGU, 1967*d96b0e59SYufeng Mo .dbg_dump_reg = hclge_dbg_dump_reg_cmd, 1968*d96b0e59SYufeng Mo }, 1969*d96b0e59SYufeng Mo { 1970*d96b0e59SYufeng Mo .cmd = HNAE3_DBG_CMD_REG_RPU, 1971*d96b0e59SYufeng Mo .dbg_dump_reg = hclge_dbg_dump_reg_cmd, 1972*d96b0e59SYufeng Mo }, 1973*d96b0e59SYufeng Mo { 1974*d96b0e59SYufeng Mo .cmd = HNAE3_DBG_CMD_REG_NCSI, 1975*d96b0e59SYufeng Mo .dbg_dump_reg = hclge_dbg_dump_reg_cmd, 1976*d96b0e59SYufeng Mo }, 1977*d96b0e59SYufeng Mo { 1978*d96b0e59SYufeng Mo .cmd = HNAE3_DBG_CMD_REG_RTC, 1979*d96b0e59SYufeng Mo .dbg_dump_reg = hclge_dbg_dump_reg_cmd, 1980*d96b0e59SYufeng Mo }, 1981*d96b0e59SYufeng Mo { 1982*d96b0e59SYufeng Mo .cmd = HNAE3_DBG_CMD_REG_PPP, 1983*d96b0e59SYufeng Mo .dbg_dump_reg = hclge_dbg_dump_reg_cmd, 1984*d96b0e59SYufeng Mo }, 1985*d96b0e59SYufeng Mo { 1986*d96b0e59SYufeng Mo .cmd = HNAE3_DBG_CMD_REG_RCB, 1987*d96b0e59SYufeng Mo .dbg_dump_reg = hclge_dbg_dump_reg_cmd, 1988*d96b0e59SYufeng Mo }, 1989*d96b0e59SYufeng Mo { 1990*d96b0e59SYufeng Mo .cmd = HNAE3_DBG_CMD_REG_TQP, 1991*d96b0e59SYufeng Mo .dbg_dump_reg = hclge_dbg_dump_reg_cmd, 1992*d96b0e59SYufeng Mo }, 1993*d96b0e59SYufeng Mo { 1994*d96b0e59SYufeng Mo .cmd = HNAE3_DBG_CMD_REG_MAC, 1995*d96b0e59SYufeng Mo .dbg_dump = hclge_dbg_dump_mac, 1996*d96b0e59SYufeng Mo }, 19975e69ea7eSYufeng Mo }; 19985e69ea7eSYufeng Mo 19995e69ea7eSYufeng Mo int hclge_dbg_read_cmd(struct hnae3_handle *handle, enum hnae3_dbg_cmd cmd, 200004987ca1SGuangbin Huang char *buf, int len) 200104987ca1SGuangbin Huang { 200204987ca1SGuangbin Huang struct hclge_vport *vport = hclge_get_vport(handle); 2003*d96b0e59SYufeng Mo const struct hclge_dbg_func *cmd_func; 200404987ca1SGuangbin Huang struct hclge_dev *hdev = vport->back; 20055e69ea7eSYufeng Mo u32 i; 200604987ca1SGuangbin Huang 20075e69ea7eSYufeng Mo for (i = 0; i < ARRAY_SIZE(hclge_dbg_cmd_func); i++) { 2008*d96b0e59SYufeng Mo if (cmd == hclge_dbg_cmd_func[i].cmd) { 2009*d96b0e59SYufeng Mo cmd_func = &hclge_dbg_cmd_func[i]; 2010*d96b0e59SYufeng Mo if (cmd_func->dbg_dump) 2011*d96b0e59SYufeng Mo return cmd_func->dbg_dump(hdev, buf, len); 2012*d96b0e59SYufeng Mo else 2013*d96b0e59SYufeng Mo return cmd_func->dbg_dump_reg(hdev, cmd, buf, 2014*d96b0e59SYufeng Mo len); 2015*d96b0e59SYufeng Mo } 20165e69ea7eSYufeng Mo } 201704987ca1SGuangbin Huang 20185e69ea7eSYufeng Mo dev_err(&hdev->pdev->dev, "invalid command(%d)\n", cmd); 201904987ca1SGuangbin Huang return -EINVAL; 202004987ca1SGuangbin Huang } 2021