3235 lines · c
1// SPDX-License-Identifier: GPL-2.0+2/* Copyright (c) 2018-2019 Hisilicon Limited. */3 4#include <linux/device.h>5#include <linux/sched/clock.h>6 7#include "hclge_debugfs.h"8#include "hclge_err.h"9#include "hclge_main.h"10#include "hclge_regs.h"11#include "hclge_tm.h"12#include "hnae3.h"13 14static const char * const state_str[] = { "off", "on" };15static const char * const hclge_mac_state_str[] = {16 "TO_ADD", "TO_DEL", "ACTIVE"17};18 19static const char * const tc_map_mode_str[] = { "PRIO", "DSCP" };20 21static const struct hclge_dbg_dfx_message hclge_dbg_bios_common_reg[] = {22 {false, "Reserved"},23 {true, "BP_CPU_STATE"},24 {true, "DFX_MSIX_INFO_NIC_0"},25 {true, "DFX_MSIX_INFO_NIC_1"},26 {true, "DFX_MSIX_INFO_NIC_2"},27 {true, "DFX_MSIX_INFO_NIC_3"},28 29 {true, "DFX_MSIX_INFO_ROC_0"},30 {true, "DFX_MSIX_INFO_ROC_1"},31 {true, "DFX_MSIX_INFO_ROC_2"},32 {true, "DFX_MSIX_INFO_ROC_3"},33 {false, "Reserved"},34 {false, "Reserved"},35};36 37static const struct hclge_dbg_dfx_message hclge_dbg_ssu_reg_0[] = {38 {false, "Reserved"},39 {true, "SSU_ETS_PORT_STATUS"},40 {true, "SSU_ETS_TCG_STATUS"},41 {false, "Reserved"},42 {false, "Reserved"},43 {true, "SSU_BP_STATUS_0"},44 45 {true, "SSU_BP_STATUS_1"},46 {true, "SSU_BP_STATUS_2"},47 {true, "SSU_BP_STATUS_3"},48 {true, "SSU_BP_STATUS_4"},49 {true, "SSU_BP_STATUS_5"},50 {true, "SSU_MAC_TX_PFC_IND"},51 52 {true, "MAC_SSU_RX_PFC_IND"},53 {true, "BTMP_AGEING_ST_B0"},54 {true, "BTMP_AGEING_ST_B1"},55 {true, "BTMP_AGEING_ST_B2"},56 {false, "Reserved"},57 {false, "Reserved"},58 59 {true, "FULL_DROP_NUM"},60 {true, "PART_DROP_NUM"},61 {true, "PPP_KEY_DROP_NUM"},62 {true, "PPP_RLT_DROP_NUM"},63 {true, "LO_PRI_UNICAST_RLT_DROP_NUM"},64 {true, "HI_PRI_MULTICAST_RLT_DROP_NUM"},65 66 {true, "LO_PRI_MULTICAST_RLT_DROP_NUM"},67 {true, "NCSI_PACKET_CURR_BUFFER_CNT"},68 {true, "BTMP_AGEING_RLS_CNT_BANK0"},69 {true, "BTMP_AGEING_RLS_CNT_BANK1"},70 {true, "BTMP_AGEING_RLS_CNT_BANK2"},71 {true, "SSU_MB_RD_RLT_DROP_CNT"},72 73 {true, "SSU_PPP_MAC_KEY_NUM_L"},74 {true, "SSU_PPP_MAC_KEY_NUM_H"},75 {true, "SSU_PPP_HOST_KEY_NUM_L"},76 {true, "SSU_PPP_HOST_KEY_NUM_H"},77 {true, "PPP_SSU_MAC_RLT_NUM_L"},78 {true, "PPP_SSU_MAC_RLT_NUM_H"},79 80 {true, "PPP_SSU_HOST_RLT_NUM_L"},81 {true, "PPP_SSU_HOST_RLT_NUM_H"},82 {true, "NCSI_RX_PACKET_IN_CNT_L"},83 {true, "NCSI_RX_PACKET_IN_CNT_H"},84 {true, "NCSI_TX_PACKET_OUT_CNT_L"},85 {true, "NCSI_TX_PACKET_OUT_CNT_H"},86 87 {true, "SSU_KEY_DROP_NUM"},88 {true, "MB_UNCOPY_NUM"},89 {true, "RX_OQ_DROP_PKT_CNT"},90 {true, "TX_OQ_DROP_PKT_CNT"},91 {true, "BANK_UNBALANCE_DROP_CNT"},92 {true, "BANK_UNBALANCE_RX_DROP_CNT"},93 94 {true, "NIC_L2_ERR_DROP_PKT_CNT"},95 {true, "ROC_L2_ERR_DROP_PKT_CNT"},96 {true, "NIC_L2_ERR_DROP_PKT_CNT_RX"},97 {true, "ROC_L2_ERR_DROP_PKT_CNT_RX"},98 {true, "RX_OQ_GLB_DROP_PKT_CNT"},99 {false, "Reserved"},100 101 {true, "LO_PRI_UNICAST_CUR_CNT"},102 {true, "HI_PRI_MULTICAST_CUR_CNT"},103 {true, "LO_PRI_MULTICAST_CUR_CNT"},104 {false, "Reserved"},105 {false, "Reserved"},106 {false, "Reserved"},107};108 109static const struct hclge_dbg_dfx_message hclge_dbg_ssu_reg_1[] = {110 {true, "prt_id"},111 {true, "PACKET_TC_CURR_BUFFER_CNT_0"},112 {true, "PACKET_TC_CURR_BUFFER_CNT_1"},113 {true, "PACKET_TC_CURR_BUFFER_CNT_2"},114 {true, "PACKET_TC_CURR_BUFFER_CNT_3"},115 {true, "PACKET_TC_CURR_BUFFER_CNT_4"},116 117 {true, "PACKET_TC_CURR_BUFFER_CNT_5"},118 {true, "PACKET_TC_CURR_BUFFER_CNT_6"},119 {true, "PACKET_TC_CURR_BUFFER_CNT_7"},120 {true, "PACKET_CURR_BUFFER_CNT"},121 {false, "Reserved"},122 {false, "Reserved"},123 124 {true, "RX_PACKET_IN_CNT_L"},125 {true, "RX_PACKET_IN_CNT_H"},126 {true, "RX_PACKET_OUT_CNT_L"},127 {true, "RX_PACKET_OUT_CNT_H"},128 {true, "TX_PACKET_IN_CNT_L"},129 {true, "TX_PACKET_IN_CNT_H"},130 131 {true, "TX_PACKET_OUT_CNT_L"},132 {true, "TX_PACKET_OUT_CNT_H"},133 {true, "ROC_RX_PACKET_IN_CNT_L"},134 {true, "ROC_RX_PACKET_IN_CNT_H"},135 {true, "ROC_TX_PACKET_OUT_CNT_L"},136 {true, "ROC_TX_PACKET_OUT_CNT_H"},137 138 {true, "RX_PACKET_TC_IN_CNT_0_L"},139 {true, "RX_PACKET_TC_IN_CNT_0_H"},140 {true, "RX_PACKET_TC_IN_CNT_1_L"},141 {true, "RX_PACKET_TC_IN_CNT_1_H"},142 {true, "RX_PACKET_TC_IN_CNT_2_L"},143 {true, "RX_PACKET_TC_IN_CNT_2_H"},144 145 {true, "RX_PACKET_TC_IN_CNT_3_L"},146 {true, "RX_PACKET_TC_IN_CNT_3_H"},147 {true, "RX_PACKET_TC_IN_CNT_4_L"},148 {true, "RX_PACKET_TC_IN_CNT_4_H"},149 {true, "RX_PACKET_TC_IN_CNT_5_L"},150 {true, "RX_PACKET_TC_IN_CNT_5_H"},151 152 {true, "RX_PACKET_TC_IN_CNT_6_L"},153 {true, "RX_PACKET_TC_IN_CNT_6_H"},154 {true, "RX_PACKET_TC_IN_CNT_7_L"},155 {true, "RX_PACKET_TC_IN_CNT_7_H"},156 {true, "RX_PACKET_TC_OUT_CNT_0_L"},157 {true, "RX_PACKET_TC_OUT_CNT_0_H"},158 159 {true, "RX_PACKET_TC_OUT_CNT_1_L"},160 {true, "RX_PACKET_TC_OUT_CNT_1_H"},161 {true, "RX_PACKET_TC_OUT_CNT_2_L"},162 {true, "RX_PACKET_TC_OUT_CNT_2_H"},163 {true, "RX_PACKET_TC_OUT_CNT_3_L"},164 {true, "RX_PACKET_TC_OUT_CNT_3_H"},165 166 {true, "RX_PACKET_TC_OUT_CNT_4_L"},167 {true, "RX_PACKET_TC_OUT_CNT_4_H"},168 {true, "RX_PACKET_TC_OUT_CNT_5_L"},169 {true, "RX_PACKET_TC_OUT_CNT_5_H"},170 {true, "RX_PACKET_TC_OUT_CNT_6_L"},171 {true, "RX_PACKET_TC_OUT_CNT_6_H"},172 173 {true, "RX_PACKET_TC_OUT_CNT_7_L"},174 {true, "RX_PACKET_TC_OUT_CNT_7_H"},175 {true, "TX_PACKET_TC_IN_CNT_0_L"},176 {true, "TX_PACKET_TC_IN_CNT_0_H"},177 {true, "TX_PACKET_TC_IN_CNT_1_L"},178 {true, "TX_PACKET_TC_IN_CNT_1_H"},179 180 {true, "TX_PACKET_TC_IN_CNT_2_L"},181 {true, "TX_PACKET_TC_IN_CNT_2_H"},182 {true, "TX_PACKET_TC_IN_CNT_3_L"},183 {true, "TX_PACKET_TC_IN_CNT_3_H"},184 {true, "TX_PACKET_TC_IN_CNT_4_L"},185 {true, "TX_PACKET_TC_IN_CNT_4_H"},186 187 {true, "TX_PACKET_TC_IN_CNT_5_L"},188 {true, "TX_PACKET_TC_IN_CNT_5_H"},189 {true, "TX_PACKET_TC_IN_CNT_6_L"},190 {true, "TX_PACKET_TC_IN_CNT_6_H"},191 {true, "TX_PACKET_TC_IN_CNT_7_L"},192 {true, "TX_PACKET_TC_IN_CNT_7_H"},193 194 {true, "TX_PACKET_TC_OUT_CNT_0_L"},195 {true, "TX_PACKET_TC_OUT_CNT_0_H"},196 {true, "TX_PACKET_TC_OUT_CNT_1_L"},197 {true, "TX_PACKET_TC_OUT_CNT_1_H"},198 {true, "TX_PACKET_TC_OUT_CNT_2_L"},199 {true, "TX_PACKET_TC_OUT_CNT_2_H"},200 201 {true, "TX_PACKET_TC_OUT_CNT_3_L"},202 {true, "TX_PACKET_TC_OUT_CNT_3_H"},203 {true, "TX_PACKET_TC_OUT_CNT_4_L"},204 {true, "TX_PACKET_TC_OUT_CNT_4_H"},205 {true, "TX_PACKET_TC_OUT_CNT_5_L"},206 {true, "TX_PACKET_TC_OUT_CNT_5_H"},207 208 {true, "TX_PACKET_TC_OUT_CNT_6_L"},209 {true, "TX_PACKET_TC_OUT_CNT_6_H"},210 {true, "TX_PACKET_TC_OUT_CNT_7_L"},211 {true, "TX_PACKET_TC_OUT_CNT_7_H"},212 {false, "Reserved"},213 {false, "Reserved"},214};215 216static const struct hclge_dbg_dfx_message hclge_dbg_ssu_reg_2[] = {217 {true, "OQ_INDEX"},218 {true, "QUEUE_CNT"},219 {false, "Reserved"},220 {false, "Reserved"},221 {false, "Reserved"},222 {false, "Reserved"},223};224 225static const struct hclge_dbg_dfx_message hclge_dbg_igu_egu_reg[] = {226 {true, "prt_id"},227 {true, "IGU_RX_ERR_PKT"},228 {true, "IGU_RX_NO_SOF_PKT"},229 {true, "EGU_TX_1588_SHORT_PKT"},230 {true, "EGU_TX_1588_PKT"},231 {true, "EGU_TX_ERR_PKT"},232 233 {true, "IGU_RX_OUT_L2_PKT"},234 {true, "IGU_RX_OUT_L3_PKT"},235 {true, "IGU_RX_OUT_L4_PKT"},236 {true, "IGU_RX_IN_L2_PKT"},237 {true, "IGU_RX_IN_L3_PKT"},238 {true, "IGU_RX_IN_L4_PKT"},239 240 {true, "IGU_RX_EL3E_PKT"},241 {true, "IGU_RX_EL4E_PKT"},242 {true, "IGU_RX_L3E_PKT"},243 {true, "IGU_RX_L4E_PKT"},244 {true, "IGU_RX_ROCEE_PKT"},245 {true, "IGU_RX_OUT_UDP0_PKT"},246 247 {true, "IGU_RX_IN_UDP0_PKT"},248 {true, "IGU_MC_CAR_DROP_PKT_L"},249 {true, "IGU_MC_CAR_DROP_PKT_H"},250 {true, "IGU_BC_CAR_DROP_PKT_L"},251 {true, "IGU_BC_CAR_DROP_PKT_H"},252 {false, "Reserved"},253 254 {true, "IGU_RX_OVERSIZE_PKT_L"},255 {true, "IGU_RX_OVERSIZE_PKT_H"},256 {true, "IGU_RX_UNDERSIZE_PKT_L"},257 {true, "IGU_RX_UNDERSIZE_PKT_H"},258 {true, "IGU_RX_OUT_ALL_PKT_L"},259 {true, "IGU_RX_OUT_ALL_PKT_H"},260 261 {true, "IGU_TX_OUT_ALL_PKT_L"},262 {true, "IGU_TX_OUT_ALL_PKT_H"},263 {true, "IGU_RX_UNI_PKT_L"},264 {true, "IGU_RX_UNI_PKT_H"},265 {true, "IGU_RX_MULTI_PKT_L"},266 {true, "IGU_RX_MULTI_PKT_H"},267 268 {true, "IGU_RX_BROAD_PKT_L"},269 {true, "IGU_RX_BROAD_PKT_H"},270 {true, "EGU_TX_OUT_ALL_PKT_L"},271 {true, "EGU_TX_OUT_ALL_PKT_H"},272 {true, "EGU_TX_UNI_PKT_L"},273 {true, "EGU_TX_UNI_PKT_H"},274 275 {true, "EGU_TX_MULTI_PKT_L"},276 {true, "EGU_TX_MULTI_PKT_H"},277 {true, "EGU_TX_BROAD_PKT_L"},278 {true, "EGU_TX_BROAD_PKT_H"},279 {true, "IGU_TX_KEY_NUM_L"},280 {true, "IGU_TX_KEY_NUM_H"},281 282 {true, "IGU_RX_NON_TUN_PKT_L"},283 {true, "IGU_RX_NON_TUN_PKT_H"},284 {true, "IGU_RX_TUN_PKT_L"},285 {true, "IGU_RX_TUN_PKT_H"},286 {false, "Reserved"},287 {false, "Reserved"},288};289 290static const struct hclge_dbg_dfx_message hclge_dbg_rpu_reg_0[] = {291 {true, "tc_queue_num"},292 {true, "FSM_DFX_ST0"},293 {true, "FSM_DFX_ST1"},294 {true, "RPU_RX_PKT_DROP_CNT"},295 {true, "BUF_WAIT_TIMEOUT"},296 {true, "BUF_WAIT_TIMEOUT_QID"},297};298 299static const struct hclge_dbg_dfx_message hclge_dbg_rpu_reg_1[] = {300 {false, "Reserved"},301 {true, "FIFO_DFX_ST0"},302 {true, "FIFO_DFX_ST1"},303 {true, "FIFO_DFX_ST2"},304 {true, "FIFO_DFX_ST3"},305 {true, "FIFO_DFX_ST4"},306 307 {true, "FIFO_DFX_ST5"},308 {false, "Reserved"},309 {false, "Reserved"},310 {false, "Reserved"},311 {false, "Reserved"},312 {false, "Reserved"},313};314 315static const struct hclge_dbg_dfx_message hclge_dbg_ncsi_reg[] = {316 {false, "Reserved"},317 {true, "NCSI_EGU_TX_FIFO_STS"},318 {true, "NCSI_PAUSE_STATUS"},319 {true, "NCSI_RX_CTRL_DMAC_ERR_CNT"},320 {true, "NCSI_RX_CTRL_SMAC_ERR_CNT"},321 {true, "NCSI_RX_CTRL_CKS_ERR_CNT"},322 323 {true, "NCSI_RX_CTRL_PKT_CNT"},324 {true, "NCSI_RX_PT_DMAC_ERR_CNT"},325 {true, "NCSI_RX_PT_SMAC_ERR_CNT"},326 {true, "NCSI_RX_PT_PKT_CNT"},327 {true, "NCSI_RX_FCS_ERR_CNT"},328 {true, "NCSI_TX_CTRL_DMAC_ERR_CNT"},329 330 {true, "NCSI_TX_CTRL_SMAC_ERR_CNT"},331 {true, "NCSI_TX_CTRL_PKT_CNT"},332 {true, "NCSI_TX_PT_DMAC_ERR_CNT"},333 {true, "NCSI_TX_PT_SMAC_ERR_CNT"},334 {true, "NCSI_TX_PT_PKT_CNT"},335 {true, "NCSI_TX_PT_PKT_TRUNC_CNT"},336 337 {true, "NCSI_TX_PT_PKT_ERR_CNT"},338 {true, "NCSI_TX_CTRL_PKT_ERR_CNT"},339 {true, "NCSI_RX_CTRL_PKT_TRUNC_CNT"},340 {true, "NCSI_RX_CTRL_PKT_CFLIT_CNT"},341 {false, "Reserved"},342 {false, "Reserved"},343 344 {true, "NCSI_MAC_RX_OCTETS_OK"},345 {true, "NCSI_MAC_RX_OCTETS_BAD"},346 {true, "NCSI_MAC_RX_UC_PKTS"},347 {true, "NCSI_MAC_RX_MC_PKTS"},348 {true, "NCSI_MAC_RX_BC_PKTS"},349 {true, "NCSI_MAC_RX_PKTS_64OCTETS"},350 351 {true, "NCSI_MAC_RX_PKTS_65TO127OCTETS"},352 {true, "NCSI_MAC_RX_PKTS_128TO255OCTETS"},353 {true, "NCSI_MAC_RX_PKTS_255TO511OCTETS"},354 {true, "NCSI_MAC_RX_PKTS_512TO1023OCTETS"},355 {true, "NCSI_MAC_RX_PKTS_1024TO1518OCTETS"},356 {true, "NCSI_MAC_RX_PKTS_1519TOMAXOCTETS"},357 358 {true, "NCSI_MAC_RX_FCS_ERRORS"},359 {true, "NCSI_MAC_RX_LONG_ERRORS"},360 {true, "NCSI_MAC_RX_JABBER_ERRORS"},361 {true, "NCSI_MAC_RX_RUNT_ERR_CNT"},362 {true, "NCSI_MAC_RX_SHORT_ERR_CNT"},363 {true, "NCSI_MAC_RX_FILT_PKT_CNT"},364 365 {true, "NCSI_MAC_RX_OCTETS_TOTAL_FILT"},366 {true, "NCSI_MAC_TX_OCTETS_OK"},367 {true, "NCSI_MAC_TX_OCTETS_BAD"},368 {true, "NCSI_MAC_TX_UC_PKTS"},369 {true, "NCSI_MAC_TX_MC_PKTS"},370 {true, "NCSI_MAC_TX_BC_PKTS"},371 372 {true, "NCSI_MAC_TX_PKTS_64OCTETS"},373 {true, "NCSI_MAC_TX_PKTS_65TO127OCTETS"},374 {true, "NCSI_MAC_TX_PKTS_128TO255OCTETS"},375 {true, "NCSI_MAC_TX_PKTS_256TO511OCTETS"},376 {true, "NCSI_MAC_TX_PKTS_512TO1023OCTETS"},377 {true, "NCSI_MAC_TX_PKTS_1024TO1518OCTETS"},378 379 {true, "NCSI_MAC_TX_PKTS_1519TOMAXOCTETS"},380 {true, "NCSI_MAC_TX_UNDERRUN"},381 {true, "NCSI_MAC_TX_CRC_ERROR"},382 {true, "NCSI_MAC_TX_PAUSE_FRAMES"},383 {true, "NCSI_MAC_RX_PAD_PKTS"},384 {true, "NCSI_MAC_RX_PAUSE_FRAMES"},385};386 387static const struct hclge_dbg_dfx_message hclge_dbg_rtc_reg[] = {388 {false, "Reserved"},389 {true, "LGE_IGU_AFIFO_DFX_0"},390 {true, "LGE_IGU_AFIFO_DFX_1"},391 {true, "LGE_IGU_AFIFO_DFX_2"},392 {true, "LGE_IGU_AFIFO_DFX_3"},393 {true, "LGE_IGU_AFIFO_DFX_4"},394 395 {true, "LGE_IGU_AFIFO_DFX_5"},396 {true, "LGE_IGU_AFIFO_DFX_6"},397 {true, "LGE_IGU_AFIFO_DFX_7"},398 {true, "LGE_EGU_AFIFO_DFX_0"},399 {true, "LGE_EGU_AFIFO_DFX_1"},400 {true, "LGE_EGU_AFIFO_DFX_2"},401 402 {true, "LGE_EGU_AFIFO_DFX_3"},403 {true, "LGE_EGU_AFIFO_DFX_4"},404 {true, "LGE_EGU_AFIFO_DFX_5"},405 {true, "LGE_EGU_AFIFO_DFX_6"},406 {true, "LGE_EGU_AFIFO_DFX_7"},407 {true, "CGE_IGU_AFIFO_DFX_0"},408 409 {true, "CGE_IGU_AFIFO_DFX_1"},410 {true, "CGE_EGU_AFIFO_DFX_0"},411 {true, "CGE_EGU_AFIFO_DFX_1"},412 {false, "Reserved"},413 {false, "Reserved"},414 {false, "Reserved"},415};416 417static const struct hclge_dbg_dfx_message hclge_dbg_ppp_reg[] = {418 {false, "Reserved"},419 {true, "DROP_FROM_PRT_PKT_CNT"},420 {true, "DROP_FROM_HOST_PKT_CNT"},421 {true, "DROP_TX_VLAN_PROC_CNT"},422 {true, "DROP_MNG_CNT"},423 {true, "DROP_FD_CNT"},424 425 {true, "DROP_NO_DST_CNT"},426 {true, "DROP_MC_MBID_FULL_CNT"},427 {true, "DROP_SC_FILTERED"},428 {true, "PPP_MC_DROP_PKT_CNT"},429 {true, "DROP_PT_CNT"},430 {true, "DROP_MAC_ANTI_SPOOF_CNT"},431 432 {true, "DROP_IG_VFV_CNT"},433 {true, "DROP_IG_PRTV_CNT"},434 {true, "DROP_CNM_PFC_PAUSE_CNT"},435 {true, "DROP_TORUS_TC_CNT"},436 {true, "DROP_TORUS_LPBK_CNT"},437 {true, "PPP_HFS_STS"},438 439 {true, "PPP_MC_RSLT_STS"},440 {true, "PPP_P3U_STS"},441 {true, "PPP_RSLT_DESCR_STS"},442 {true, "PPP_UMV_STS_0"},443 {true, "PPP_UMV_STS_1"},444 {true, "PPP_VFV_STS"},445 446 {true, "PPP_GRO_KEY_CNT"},447 {true, "PPP_GRO_INFO_CNT"},448 {true, "PPP_GRO_DROP_CNT"},449 {true, "PPP_GRO_OUT_CNT"},450 {true, "PPP_GRO_KEY_MATCH_DATA_CNT"},451 {true, "PPP_GRO_KEY_MATCH_TCAM_CNT"},452 453 {true, "PPP_GRO_INFO_MATCH_CNT"},454 {true, "PPP_GRO_FREE_ENTRY_CNT"},455 {true, "PPP_GRO_INNER_DFX_SIGNAL"},456 {false, "Reserved"},457 {false, "Reserved"},458 {false, "Reserved"},459 460 {true, "GET_RX_PKT_CNT_L"},461 {true, "GET_RX_PKT_CNT_H"},462 {true, "GET_TX_PKT_CNT_L"},463 {true, "GET_TX_PKT_CNT_H"},464 {true, "SEND_UC_PRT2HOST_PKT_CNT_L"},465 {true, "SEND_UC_PRT2HOST_PKT_CNT_H"},466 467 {true, "SEND_UC_PRT2PRT_PKT_CNT_L"},468 {true, "SEND_UC_PRT2PRT_PKT_CNT_H"},469 {true, "SEND_UC_HOST2HOST_PKT_CNT_L"},470 {true, "SEND_UC_HOST2HOST_PKT_CNT_H"},471 {true, "SEND_UC_HOST2PRT_PKT_CNT_L"},472 {true, "SEND_UC_HOST2PRT_PKT_CNT_H"},473 474 {true, "SEND_MC_FROM_PRT_CNT_L"},475 {true, "SEND_MC_FROM_PRT_CNT_H"},476 {true, "SEND_MC_FROM_HOST_CNT_L"},477 {true, "SEND_MC_FROM_HOST_CNT_H"},478 {true, "SSU_MC_RD_CNT_L"},479 {true, "SSU_MC_RD_CNT_H"},480 481 {true, "SSU_MC_DROP_CNT_L"},482 {true, "SSU_MC_DROP_CNT_H"},483 {true, "SSU_MC_RD_PKT_CNT_L"},484 {true, "SSU_MC_RD_PKT_CNT_H"},485 {true, "PPP_MC_2HOST_PKT_CNT_L"},486 {true, "PPP_MC_2HOST_PKT_CNT_H"},487 488 {true, "PPP_MC_2PRT_PKT_CNT_L"},489 {true, "PPP_MC_2PRT_PKT_CNT_H"},490 {true, "NTSNOS_PKT_CNT_L"},491 {true, "NTSNOS_PKT_CNT_H"},492 {true, "NTUP_PKT_CNT_L"},493 {true, "NTUP_PKT_CNT_H"},494 495 {true, "NTLCL_PKT_CNT_L"},496 {true, "NTLCL_PKT_CNT_H"},497 {true, "NTTGT_PKT_CNT_L"},498 {true, "NTTGT_PKT_CNT_H"},499 {true, "RTNS_PKT_CNT_L"},500 {true, "RTNS_PKT_CNT_H"},501 502 {true, "RTLPBK_PKT_CNT_L"},503 {true, "RTLPBK_PKT_CNT_H"},504 {true, "NR_PKT_CNT_L"},505 {true, "NR_PKT_CNT_H"},506 {true, "RR_PKT_CNT_L"},507 {true, "RR_PKT_CNT_H"},508 509 {true, "MNG_TBL_HIT_CNT_L"},510 {true, "MNG_TBL_HIT_CNT_H"},511 {true, "FD_TBL_HIT_CNT_L"},512 {true, "FD_TBL_HIT_CNT_H"},513 {true, "FD_LKUP_CNT_L"},514 {true, "FD_LKUP_CNT_H"},515 516 {true, "BC_HIT_CNT_L"},517 {true, "BC_HIT_CNT_H"},518 {true, "UM_TBL_UC_HIT_CNT_L"},519 {true, "UM_TBL_UC_HIT_CNT_H"},520 {true, "UM_TBL_MC_HIT_CNT_L"},521 {true, "UM_TBL_MC_HIT_CNT_H"},522 523 {true, "UM_TBL_VMDQ1_HIT_CNT_L"},524 {true, "UM_TBL_VMDQ1_HIT_CNT_H"},525 {true, "MTA_TBL_HIT_CNT_L"},526 {true, "MTA_TBL_HIT_CNT_H"},527 {true, "FWD_BONDING_HIT_CNT_L"},528 {true, "FWD_BONDING_HIT_CNT_H"},529 530 {true, "PROMIS_TBL_HIT_CNT_L"},531 {true, "PROMIS_TBL_HIT_CNT_H"},532 {true, "GET_TUNL_PKT_CNT_L"},533 {true, "GET_TUNL_PKT_CNT_H"},534 {true, "GET_BMC_PKT_CNT_L"},535 {true, "GET_BMC_PKT_CNT_H"},536 537 {true, "SEND_UC_PRT2BMC_PKT_CNT_L"},538 {true, "SEND_UC_PRT2BMC_PKT_CNT_H"},539 {true, "SEND_UC_HOST2BMC_PKT_CNT_L"},540 {true, "SEND_UC_HOST2BMC_PKT_CNT_H"},541 {true, "SEND_UC_BMC2HOST_PKT_CNT_L"},542 {true, "SEND_UC_BMC2HOST_PKT_CNT_H"},543 544 {true, "SEND_UC_BMC2PRT_PKT_CNT_L"},545 {true, "SEND_UC_BMC2PRT_PKT_CNT_H"},546 {true, "PPP_MC_2BMC_PKT_CNT_L"},547 {true, "PPP_MC_2BMC_PKT_CNT_H"},548 {true, "VLAN_MIRR_CNT_L"},549 {true, "VLAN_MIRR_CNT_H"},550 551 {true, "IG_MIRR_CNT_L"},552 {true, "IG_MIRR_CNT_H"},553 {true, "EG_MIRR_CNT_L"},554 {true, "EG_MIRR_CNT_H"},555 {true, "RX_DEFAULT_HOST_HIT_CNT_L"},556 {true, "RX_DEFAULT_HOST_HIT_CNT_H"},557 558 {true, "LAN_PAIR_CNT_L"},559 {true, "LAN_PAIR_CNT_H"},560 {true, "UM_TBL_MC_HIT_PKT_CNT_L"},561 {true, "UM_TBL_MC_HIT_PKT_CNT_H"},562 {true, "MTA_TBL_HIT_PKT_CNT_L"},563 {true, "MTA_TBL_HIT_PKT_CNT_H"},564 565 {true, "PROMIS_TBL_HIT_PKT_CNT_L"},566 {true, "PROMIS_TBL_HIT_PKT_CNT_H"},567 {false, "Reserved"},568 {false, "Reserved"},569 {false, "Reserved"},570 {false, "Reserved"},571};572 573static const struct hclge_dbg_dfx_message hclge_dbg_rcb_reg[] = {574 {false, "Reserved"},575 {true, "FSM_DFX_ST0"},576 {true, "FSM_DFX_ST1"},577 {true, "FSM_DFX_ST2"},578 {true, "FIFO_DFX_ST0"},579 {true, "FIFO_DFX_ST1"},580 581 {true, "FIFO_DFX_ST2"},582 {true, "FIFO_DFX_ST3"},583 {true, "FIFO_DFX_ST4"},584 {true, "FIFO_DFX_ST5"},585 {true, "FIFO_DFX_ST6"},586 {true, "FIFO_DFX_ST7"},587 588 {true, "FIFO_DFX_ST8"},589 {true, "FIFO_DFX_ST9"},590 {true, "FIFO_DFX_ST10"},591 {true, "FIFO_DFX_ST11"},592 {true, "Q_CREDIT_VLD_0"},593 {true, "Q_CREDIT_VLD_1"},594 595 {true, "Q_CREDIT_VLD_2"},596 {true, "Q_CREDIT_VLD_3"},597 {true, "Q_CREDIT_VLD_4"},598 {true, "Q_CREDIT_VLD_5"},599 {true, "Q_CREDIT_VLD_6"},600 {true, "Q_CREDIT_VLD_7"},601 602 {true, "Q_CREDIT_VLD_8"},603 {true, "Q_CREDIT_VLD_9"},604 {true, "Q_CREDIT_VLD_10"},605 {true, "Q_CREDIT_VLD_11"},606 {true, "Q_CREDIT_VLD_12"},607 {true, "Q_CREDIT_VLD_13"},608 609 {true, "Q_CREDIT_VLD_14"},610 {true, "Q_CREDIT_VLD_15"},611 {true, "Q_CREDIT_VLD_16"},612 {true, "Q_CREDIT_VLD_17"},613 {true, "Q_CREDIT_VLD_18"},614 {true, "Q_CREDIT_VLD_19"},615 616 {true, "Q_CREDIT_VLD_20"},617 {true, "Q_CREDIT_VLD_21"},618 {true, "Q_CREDIT_VLD_22"},619 {true, "Q_CREDIT_VLD_23"},620 {true, "Q_CREDIT_VLD_24"},621 {true, "Q_CREDIT_VLD_25"},622 623 {true, "Q_CREDIT_VLD_26"},624 {true, "Q_CREDIT_VLD_27"},625 {true, "Q_CREDIT_VLD_28"},626 {true, "Q_CREDIT_VLD_29"},627 {true, "Q_CREDIT_VLD_30"},628 {true, "Q_CREDIT_VLD_31"},629 630 {true, "GRO_BD_SERR_CNT"},631 {true, "GRO_CONTEXT_SERR_CNT"},632 {true, "RX_STASH_CFG_SERR_CNT"},633 {true, "AXI_RD_FBD_SERR_CNT"},634 {true, "GRO_BD_MERR_CNT"},635 {true, "GRO_CONTEXT_MERR_CNT"},636 637 {true, "RX_STASH_CFG_MERR_CNT"},638 {true, "AXI_RD_FBD_MERR_CNT"},639 {false, "Reserved"},640 {false, "Reserved"},641 {false, "Reserved"},642 {false, "Reserved"},643};644 645static const struct hclge_dbg_dfx_message hclge_dbg_tqp_reg[] = {646 {true, "q_num"},647 {true, "RCB_CFG_RX_RING_TAIL"},648 {true, "RCB_CFG_RX_RING_HEAD"},649 {true, "RCB_CFG_RX_RING_FBDNUM"},650 {true, "RCB_CFG_RX_RING_OFFSET"},651 {true, "RCB_CFG_RX_RING_FBDOFFSET"},652 653 {true, "RCB_CFG_RX_RING_PKTNUM_RECORD"},654 {true, "RCB_CFG_TX_RING_TAIL"},655 {true, "RCB_CFG_TX_RING_HEAD"},656 {true, "RCB_CFG_TX_RING_FBDNUM"},657 {true, "RCB_CFG_TX_RING_OFFSET"},658 {true, "RCB_CFG_TX_RING_EBDNUM"},659};660 661static const struct hclge_dbg_reg_type_info hclge_dbg_reg_info[] = {662 { .cmd = HNAE3_DBG_CMD_REG_BIOS_COMMON,663 .dfx_msg = &hclge_dbg_bios_common_reg[0],664 .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_bios_common_reg),665 .offset = HCLGE_DBG_DFX_BIOS_OFFSET,666 .cmd = HCLGE_OPC_DFX_BIOS_COMMON_REG } },667 { .cmd = HNAE3_DBG_CMD_REG_SSU,668 .dfx_msg = &hclge_dbg_ssu_reg_0[0],669 .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_ssu_reg_0),670 .offset = HCLGE_DBG_DFX_SSU_0_OFFSET,671 .cmd = HCLGE_OPC_DFX_SSU_REG_0 } },672 { .cmd = HNAE3_DBG_CMD_REG_SSU,673 .dfx_msg = &hclge_dbg_ssu_reg_1[0],674 .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_ssu_reg_1),675 .offset = HCLGE_DBG_DFX_SSU_1_OFFSET,676 .cmd = HCLGE_OPC_DFX_SSU_REG_1 } },677 { .cmd = HNAE3_DBG_CMD_REG_SSU,678 .dfx_msg = &hclge_dbg_ssu_reg_2[0],679 .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_ssu_reg_2),680 .offset = HCLGE_DBG_DFX_SSU_2_OFFSET,681 .cmd = HCLGE_OPC_DFX_SSU_REG_2 } },682 { .cmd = HNAE3_DBG_CMD_REG_IGU_EGU,683 .dfx_msg = &hclge_dbg_igu_egu_reg[0],684 .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_igu_egu_reg),685 .offset = HCLGE_DBG_DFX_IGU_OFFSET,686 .cmd = HCLGE_OPC_DFX_IGU_EGU_REG } },687 { .cmd = HNAE3_DBG_CMD_REG_RPU,688 .dfx_msg = &hclge_dbg_rpu_reg_0[0],689 .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_rpu_reg_0),690 .offset = HCLGE_DBG_DFX_RPU_0_OFFSET,691 .cmd = HCLGE_OPC_DFX_RPU_REG_0 } },692 { .cmd = HNAE3_DBG_CMD_REG_RPU,693 .dfx_msg = &hclge_dbg_rpu_reg_1[0],694 .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_rpu_reg_1),695 .offset = HCLGE_DBG_DFX_RPU_1_OFFSET,696 .cmd = HCLGE_OPC_DFX_RPU_REG_1 } },697 { .cmd = HNAE3_DBG_CMD_REG_NCSI,698 .dfx_msg = &hclge_dbg_ncsi_reg[0],699 .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_ncsi_reg),700 .offset = HCLGE_DBG_DFX_NCSI_OFFSET,701 .cmd = HCLGE_OPC_DFX_NCSI_REG } },702 { .cmd = HNAE3_DBG_CMD_REG_RTC,703 .dfx_msg = &hclge_dbg_rtc_reg[0],704 .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_rtc_reg),705 .offset = HCLGE_DBG_DFX_RTC_OFFSET,706 .cmd = HCLGE_OPC_DFX_RTC_REG } },707 { .cmd = HNAE3_DBG_CMD_REG_PPP,708 .dfx_msg = &hclge_dbg_ppp_reg[0],709 .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_ppp_reg),710 .offset = HCLGE_DBG_DFX_PPP_OFFSET,711 .cmd = HCLGE_OPC_DFX_PPP_REG } },712 { .cmd = HNAE3_DBG_CMD_REG_RCB,713 .dfx_msg = &hclge_dbg_rcb_reg[0],714 .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_rcb_reg),715 .offset = HCLGE_DBG_DFX_RCB_OFFSET,716 .cmd = HCLGE_OPC_DFX_RCB_REG } },717 { .cmd = HNAE3_DBG_CMD_REG_TQP,718 .dfx_msg = &hclge_dbg_tqp_reg[0],719 .reg_msg = { .msg_num = ARRAY_SIZE(hclge_dbg_tqp_reg),720 .offset = HCLGE_DBG_DFX_TQP_OFFSET,721 .cmd = HCLGE_OPC_DFX_TQP_REG } },722};723 724/* make sure: len(name) + interval >= maxlen(item data) + 2,725 * for example, name = "pkt_num"(len: 7), the prototype of item data is u32,726 * and print as "%u"(maxlen: 10), so the interval should be at least 5.727 */728static void hclge_dbg_fill_content(char *content, u16 len,729 const struct hclge_dbg_item *items,730 const char **result, u16 size)731{732#define HCLGE_DBG_LINE_END_LEN 2733 char *pos = content;734 u16 item_len;735 u16 i;736 737 if (!len) {738 return;739 } else if (len <= HCLGE_DBG_LINE_END_LEN) {740 *pos++ = '\0';741 return;742 }743 744 memset(content, ' ', len);745 len -= HCLGE_DBG_LINE_END_LEN;746 747 for (i = 0; i < size; i++) {748 item_len = strlen(items[i].name) + items[i].interval;749 if (len < item_len)750 break;751 752 if (result) {753 if (item_len < strlen(result[i]))754 break;755 memcpy(pos, result[i], strlen(result[i]));756 } else {757 memcpy(pos, items[i].name, strlen(items[i].name));758 }759 pos += item_len;760 len -= item_len;761 }762 *pos++ = '\n';763 *pos++ = '\0';764}765 766static char *hclge_dbg_get_func_id_str(char *buf, u8 id)767{768 if (id)769 sprintf(buf, "vf%u", id - 1U);770 else771 sprintf(buf, "pf");772 773 return buf;774}775 776static int hclge_dbg_get_dfx_bd_num(struct hclge_dev *hdev, int offset,777 u32 *bd_num)778{779 struct hclge_desc desc[HCLGE_GET_DFX_REG_TYPE_CNT];780 int entries_per_desc;781 int index;782 int ret;783 784 ret = hclge_query_bd_num_cmd_send(hdev, desc);785 if (ret) {786 dev_err(&hdev->pdev->dev,787 "failed to get dfx bd_num, offset = %d, ret = %d\n",788 offset, ret);789 return ret;790 }791 792 entries_per_desc = ARRAY_SIZE(desc[0].data);793 index = offset % entries_per_desc;794 795 *bd_num = le32_to_cpu(desc[offset / entries_per_desc].data[index]);796 if (!(*bd_num)) {797 dev_err(&hdev->pdev->dev, "The value of dfx bd_num is 0!\n");798 return -EINVAL;799 }800 801 return 0;802}803 804int hclge_dbg_cmd_send(struct hclge_dev *hdev, struct hclge_desc *desc_src,805 int index, int bd_num, enum hclge_opcode_type cmd)806{807 struct hclge_desc *desc = desc_src;808 int ret, i;809 810 hclge_cmd_setup_basic_desc(desc, cmd, true);811 desc->data[0] = cpu_to_le32(index);812 813 for (i = 1; i < bd_num; i++) {814 desc->flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT);815 desc++;816 hclge_cmd_setup_basic_desc(desc, cmd, true);817 }818 819 ret = hclge_cmd_send(&hdev->hw, desc_src, bd_num);820 if (ret)821 dev_err(&hdev->pdev->dev,822 "cmd(0x%x) send fail, ret = %d\n", cmd, ret);823 return ret;824}825 826static int827hclge_dbg_dump_reg_tqp(struct hclge_dev *hdev,828 const struct hclge_dbg_reg_type_info *reg_info,829 char *buf, int len, int *pos)830{831 const struct hclge_dbg_dfx_message *dfx_message = reg_info->dfx_msg;832 const struct hclge_dbg_reg_common_msg *reg_msg = ®_info->reg_msg;833 struct hclge_desc *desc_src;834 u32 index, entry, i, cnt;835 int bd_num, min_num, ret;836 struct hclge_desc *desc;837 838 ret = hclge_dbg_get_dfx_bd_num(hdev, reg_msg->offset, &bd_num);839 if (ret)840 return ret;841 842 desc_src = kcalloc(bd_num, sizeof(struct hclge_desc), GFP_KERNEL);843 if (!desc_src)844 return -ENOMEM;845 846 min_num = min_t(int, bd_num * HCLGE_DESC_DATA_LEN, reg_msg->msg_num);847 848 for (i = 0, cnt = 0; i < min_num; i++, dfx_message++)849 *pos += scnprintf(buf + *pos, len - *pos, "item%u = %s\n",850 cnt++, dfx_message->message);851 852 for (i = 0; i < cnt; i++)853 *pos += scnprintf(buf + *pos, len - *pos, "item%u\t", i);854 855 *pos += scnprintf(buf + *pos, len - *pos, "\n");856 857 for (index = 0; index < hdev->vport[0].alloc_tqps; index++) {858 dfx_message = reg_info->dfx_msg;859 desc = desc_src;860 ret = hclge_dbg_cmd_send(hdev, desc, index, bd_num,861 reg_msg->cmd);862 if (ret)863 break;864 865 for (i = 0; i < min_num; i++, dfx_message++) {866 entry = i % HCLGE_DESC_DATA_LEN;867 if (i > 0 && !entry)868 desc++;869 870 *pos += scnprintf(buf + *pos, len - *pos, "%#x\t",871 le32_to_cpu(desc->data[entry]));872 }873 *pos += scnprintf(buf + *pos, len - *pos, "\n");874 }875 876 kfree(desc_src);877 return ret;878}879 880static int881hclge_dbg_dump_reg_common(struct hclge_dev *hdev,882 const struct hclge_dbg_reg_type_info *reg_info,883 char *buf, int len, int *pos)884{885 const struct hclge_dbg_reg_common_msg *reg_msg = ®_info->reg_msg;886 const struct hclge_dbg_dfx_message *dfx_message = reg_info->dfx_msg;887 struct hclge_desc *desc_src;888 int bd_num, min_num, ret;889 struct hclge_desc *desc;890 u32 entry, i;891 892 ret = hclge_dbg_get_dfx_bd_num(hdev, reg_msg->offset, &bd_num);893 if (ret)894 return ret;895 896 desc_src = kcalloc(bd_num, sizeof(struct hclge_desc), GFP_KERNEL);897 if (!desc_src)898 return -ENOMEM;899 900 desc = desc_src;901 902 ret = hclge_dbg_cmd_send(hdev, desc, 0, bd_num, reg_msg->cmd);903 if (ret) {904 kfree(desc);905 return ret;906 }907 908 min_num = min_t(int, bd_num * HCLGE_DESC_DATA_LEN, reg_msg->msg_num);909 910 for (i = 0; i < min_num; i++, dfx_message++) {911 entry = i % HCLGE_DESC_DATA_LEN;912 if (i > 0 && !entry)913 desc++;914 if (!dfx_message->flag)915 continue;916 917 *pos += scnprintf(buf + *pos, len - *pos, "%s: %#x\n",918 dfx_message->message,919 le32_to_cpu(desc->data[entry]));920 }921 922 kfree(desc_src);923 return 0;924}925 926static const struct hclge_dbg_status_dfx_info hclge_dbg_mac_en_status[] = {927 {HCLGE_MAC_TX_EN_B, "mac_trans_en"},928 {HCLGE_MAC_RX_EN_B, "mac_rcv_en"},929 {HCLGE_MAC_PAD_TX_B, "pad_trans_en"},930 {HCLGE_MAC_PAD_RX_B, "pad_rcv_en"},931 {HCLGE_MAC_1588_TX_B, "1588_trans_en"},932 {HCLGE_MAC_1588_RX_B, "1588_rcv_en"},933 {HCLGE_MAC_APP_LP_B, "mac_app_loop_en"},934 {HCLGE_MAC_LINE_LP_B, "mac_line_loop_en"},935 {HCLGE_MAC_FCS_TX_B, "mac_fcs_tx_en"},936 {HCLGE_MAC_RX_OVERSIZE_TRUNCATE_B, "mac_rx_oversize_truncate_en"},937 {HCLGE_MAC_RX_FCS_STRIP_B, "mac_rx_fcs_strip_en"},938 {HCLGE_MAC_RX_FCS_B, "mac_rx_fcs_en"},939 {HCLGE_MAC_TX_UNDER_MIN_ERR_B, "mac_tx_under_min_err_en"},940 {HCLGE_MAC_TX_OVERSIZE_TRUNCATE_B, "mac_tx_oversize_truncate_en"}941};942 943static int hclge_dbg_dump_mac_enable_status(struct hclge_dev *hdev, char *buf,944 int len, int *pos)945{946 struct hclge_config_mac_mode_cmd *req;947 struct hclge_desc desc;948 u32 loop_en, i, offset;949 int ret;950 951 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_MAC_MODE, true);952 953 ret = hclge_cmd_send(&hdev->hw, &desc, 1);954 if (ret) {955 dev_err(&hdev->pdev->dev,956 "failed to dump mac enable status, ret = %d\n", ret);957 return ret;958 }959 960 req = (struct hclge_config_mac_mode_cmd *)desc.data;961 loop_en = le32_to_cpu(req->txrx_pad_fcs_loop_en);962 963 for (i = 0; i < ARRAY_SIZE(hclge_dbg_mac_en_status); i++) {964 offset = hclge_dbg_mac_en_status[i].offset;965 *pos += scnprintf(buf + *pos, len - *pos, "%s: %#x\n",966 hclge_dbg_mac_en_status[i].message,967 hnae3_get_bit(loop_en, offset));968 }969 970 return 0;971}972 973static int hclge_dbg_dump_mac_frame_size(struct hclge_dev *hdev, char *buf,974 int len, int *pos)975{976 struct hclge_config_max_frm_size_cmd *req;977 struct hclge_desc desc;978 int ret;979 980 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_MAX_FRM_SIZE, true);981 982 ret = hclge_cmd_send(&hdev->hw, &desc, 1);983 if (ret) {984 dev_err(&hdev->pdev->dev,985 "failed to dump mac frame size, ret = %d\n", ret);986 return ret;987 }988 989 req = (struct hclge_config_max_frm_size_cmd *)desc.data;990 991 *pos += scnprintf(buf + *pos, len - *pos, "max_frame_size: %u\n",992 le16_to_cpu(req->max_frm_size));993 *pos += scnprintf(buf + *pos, len - *pos, "min_frame_size: %u\n",994 req->min_frm_size);995 996 return 0;997}998 999static int hclge_dbg_dump_mac_speed_duplex(struct hclge_dev *hdev, char *buf,1000 int len, int *pos)1001{1002#define HCLGE_MAC_SPEED_SHIFT 01003#define HCLGE_MAC_SPEED_MASK GENMASK(5, 0)1004#define HCLGE_MAC_DUPLEX_SHIFT 71005 1006 struct hclge_config_mac_speed_dup_cmd *req;1007 struct hclge_desc desc;1008 int ret;1009 1010 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_SPEED_DUP, true);1011 1012 ret = hclge_cmd_send(&hdev->hw, &desc, 1);1013 if (ret) {1014 dev_err(&hdev->pdev->dev,1015 "failed to dump mac speed duplex, ret = %d\n", ret);1016 return ret;1017 }1018 1019 req = (struct hclge_config_mac_speed_dup_cmd *)desc.data;1020 1021 *pos += scnprintf(buf + *pos, len - *pos, "speed: %#lx\n",1022 hnae3_get_field(req->speed_dup, HCLGE_MAC_SPEED_MASK,1023 HCLGE_MAC_SPEED_SHIFT));1024 *pos += scnprintf(buf + *pos, len - *pos, "duplex: %#x\n",1025 hnae3_get_bit(req->speed_dup,1026 HCLGE_MAC_DUPLEX_SHIFT));1027 return 0;1028}1029 1030static int hclge_dbg_dump_mac(struct hclge_dev *hdev, char *buf, int len)1031{1032 int pos = 0;1033 int ret;1034 1035 ret = hclge_dbg_dump_mac_enable_status(hdev, buf, len, &pos);1036 if (ret)1037 return ret;1038 1039 ret = hclge_dbg_dump_mac_frame_size(hdev, buf, len, &pos);1040 if (ret)1041 return ret;1042 1043 return hclge_dbg_dump_mac_speed_duplex(hdev, buf, len, &pos);1044}1045 1046static int hclge_dbg_dump_dcb_qset(struct hclge_dev *hdev, char *buf, int len,1047 int *pos)1048{1049 struct hclge_dbg_bitmap_cmd req;1050 struct hclge_desc desc;1051 u16 qset_id, qset_num;1052 int ret;1053 1054 ret = hclge_tm_get_qset_num(hdev, &qset_num);1055 if (ret)1056 return ret;1057 1058 *pos += scnprintf(buf + *pos, len - *pos,1059 "qset_id roce_qset_mask nic_qset_mask qset_shaping_pass qset_bp_status\n");1060 for (qset_id = 0; qset_id < qset_num; qset_id++) {1061 ret = hclge_dbg_cmd_send(hdev, &desc, qset_id, 1,1062 HCLGE_OPC_QSET_DFX_STS);1063 if (ret)1064 return ret;1065 1066 req.bitmap = (u8)le32_to_cpu(desc.data[1]);1067 1068 *pos += scnprintf(buf + *pos, len - *pos,1069 "%04u %#x %#x %#x %#x\n",1070 qset_id, req.bit0, req.bit1, req.bit2,1071 req.bit3);1072 }1073 1074 return 0;1075}1076 1077static int hclge_dbg_dump_dcb_pri(struct hclge_dev *hdev, char *buf, int len,1078 int *pos)1079{1080 struct hclge_dbg_bitmap_cmd req;1081 struct hclge_desc desc;1082 u8 pri_id, pri_num;1083 int ret;1084 1085 ret = hclge_tm_get_pri_num(hdev, &pri_num);1086 if (ret)1087 return ret;1088 1089 *pos += scnprintf(buf + *pos, len - *pos,1090 "pri_id pri_mask pri_cshaping_pass pri_pshaping_pass\n");1091 for (pri_id = 0; pri_id < pri_num; pri_id++) {1092 ret = hclge_dbg_cmd_send(hdev, &desc, pri_id, 1,1093 HCLGE_OPC_PRI_DFX_STS);1094 if (ret)1095 return ret;1096 1097 req.bitmap = (u8)le32_to_cpu(desc.data[1]);1098 1099 *pos += scnprintf(buf + *pos, len - *pos,1100 "%03u %#x %#x %#x\n",1101 pri_id, req.bit0, req.bit1, req.bit2);1102 }1103 1104 return 0;1105}1106 1107static int hclge_dbg_dump_dcb_pg(struct hclge_dev *hdev, char *buf, int len,1108 int *pos)1109{1110 struct hclge_dbg_bitmap_cmd req;1111 struct hclge_desc desc;1112 u8 pg_id;1113 int ret;1114 1115 *pos += scnprintf(buf + *pos, len - *pos,1116 "pg_id pg_mask pg_cshaping_pass pg_pshaping_pass\n");1117 for (pg_id = 0; pg_id < hdev->tm_info.num_pg; pg_id++) {1118 ret = hclge_dbg_cmd_send(hdev, &desc, pg_id, 1,1119 HCLGE_OPC_PG_DFX_STS);1120 if (ret)1121 return ret;1122 1123 req.bitmap = (u8)le32_to_cpu(desc.data[1]);1124 1125 *pos += scnprintf(buf + *pos, len - *pos,1126 "%03u %#x %#x %#x\n",1127 pg_id, req.bit0, req.bit1, req.bit2);1128 }1129 1130 return 0;1131}1132 1133static int hclge_dbg_dump_dcb_queue(struct hclge_dev *hdev, char *buf, int len,1134 int *pos)1135{1136 struct hclge_desc desc;1137 u16 nq_id;1138 int ret;1139 1140 *pos += scnprintf(buf + *pos, len - *pos,1141 "nq_id sch_nic_queue_cnt sch_roce_queue_cnt\n");1142 for (nq_id = 0; nq_id < hdev->num_tqps; nq_id++) {1143 ret = hclge_dbg_cmd_send(hdev, &desc, nq_id, 1,1144 HCLGE_OPC_SCH_NQ_CNT);1145 if (ret)1146 return ret;1147 1148 *pos += scnprintf(buf + *pos, len - *pos, "%04u %#x",1149 nq_id, le32_to_cpu(desc.data[1]));1150 1151 ret = hclge_dbg_cmd_send(hdev, &desc, nq_id, 1,1152 HCLGE_OPC_SCH_RQ_CNT);1153 if (ret)1154 return ret;1155 1156 *pos += scnprintf(buf + *pos, len - *pos,1157 " %#x\n",1158 le32_to_cpu(desc.data[1]));1159 }1160 1161 return 0;1162}1163 1164static int hclge_dbg_dump_dcb_port(struct hclge_dev *hdev, char *buf, int len,1165 int *pos)1166{1167 struct hclge_dbg_bitmap_cmd req;1168 struct hclge_desc desc;1169 u8 port_id = 0;1170 int ret;1171 1172 ret = hclge_dbg_cmd_send(hdev, &desc, port_id, 1,1173 HCLGE_OPC_PORT_DFX_STS);1174 if (ret)1175 return ret;1176 1177 req.bitmap = (u8)le32_to_cpu(desc.data[1]);1178 1179 *pos += scnprintf(buf + *pos, len - *pos, "port_mask: %#x\n",1180 req.bit0);1181 *pos += scnprintf(buf + *pos, len - *pos, "port_shaping_pass: %#x\n",1182 req.bit1);1183 1184 return 0;1185}1186 1187static int hclge_dbg_dump_dcb_tm(struct hclge_dev *hdev, char *buf, int len,1188 int *pos)1189{1190 struct hclge_desc desc[2];1191 u8 port_id = 0;1192 int ret;1193 1194 ret = hclge_dbg_cmd_send(hdev, desc, port_id, 1,1195 HCLGE_OPC_TM_INTERNAL_CNT);1196 if (ret)1197 return ret;1198 1199 *pos += scnprintf(buf + *pos, len - *pos, "SCH_NIC_NUM: %#x\n",1200 le32_to_cpu(desc[0].data[1]));1201 *pos += scnprintf(buf + *pos, len - *pos, "SCH_ROCE_NUM: %#x\n",1202 le32_to_cpu(desc[0].data[2]));1203 1204 ret = hclge_dbg_cmd_send(hdev, desc, port_id, 2,1205 HCLGE_OPC_TM_INTERNAL_STS);1206 if (ret)1207 return ret;1208 1209 *pos += scnprintf(buf + *pos, len - *pos, "pri_bp: %#x\n",1210 le32_to_cpu(desc[0].data[1]));1211 *pos += scnprintf(buf + *pos, len - *pos, "fifo_dfx_info: %#x\n",1212 le32_to_cpu(desc[0].data[2]));1213 *pos += scnprintf(buf + *pos, len - *pos,1214 "sch_roce_fifo_afull_gap: %#x\n",1215 le32_to_cpu(desc[0].data[3]));1216 *pos += scnprintf(buf + *pos, len - *pos,1217 "tx_private_waterline: %#x\n",1218 le32_to_cpu(desc[0].data[4]));1219 *pos += scnprintf(buf + *pos, len - *pos, "tm_bypass_en: %#x\n",1220 le32_to_cpu(desc[0].data[5]));1221 *pos += scnprintf(buf + *pos, len - *pos, "SSU_TM_BYPASS_EN: %#x\n",1222 le32_to_cpu(desc[1].data[0]));1223 *pos += scnprintf(buf + *pos, len - *pos, "SSU_RESERVE_CFG: %#x\n",1224 le32_to_cpu(desc[1].data[1]));1225 1226 if (hdev->hw.mac.media_type == HNAE3_MEDIA_TYPE_COPPER)1227 return 0;1228 1229 ret = hclge_dbg_cmd_send(hdev, desc, port_id, 1,1230 HCLGE_OPC_TM_INTERNAL_STS_1);1231 if (ret)1232 return ret;1233 1234 *pos += scnprintf(buf + *pos, len - *pos, "TC_MAP_SEL: %#x\n",1235 le32_to_cpu(desc[0].data[1]));1236 *pos += scnprintf(buf + *pos, len - *pos, "IGU_PFC_PRI_EN: %#x\n",1237 le32_to_cpu(desc[0].data[2]));1238 *pos += scnprintf(buf + *pos, len - *pos, "MAC_PFC_PRI_EN: %#x\n",1239 le32_to_cpu(desc[0].data[3]));1240 *pos += scnprintf(buf + *pos, len - *pos, "IGU_PRI_MAP_TC_CFG: %#x\n",1241 le32_to_cpu(desc[0].data[4]));1242 *pos += scnprintf(buf + *pos, len - *pos,1243 "IGU_TX_PRI_MAP_TC_CFG: %#x\n",1244 le32_to_cpu(desc[0].data[5]));1245 1246 return 0;1247}1248 1249static int hclge_dbg_dump_dcb(struct hclge_dev *hdev, char *buf, int len)1250{1251 int pos = 0;1252 int ret;1253 1254 ret = hclge_dbg_dump_dcb_qset(hdev, buf, len, &pos);1255 if (ret)1256 return ret;1257 1258 ret = hclge_dbg_dump_dcb_pri(hdev, buf, len, &pos);1259 if (ret)1260 return ret;1261 1262 ret = hclge_dbg_dump_dcb_pg(hdev, buf, len, &pos);1263 if (ret)1264 return ret;1265 1266 ret = hclge_dbg_dump_dcb_queue(hdev, buf, len, &pos);1267 if (ret)1268 return ret;1269 1270 ret = hclge_dbg_dump_dcb_port(hdev, buf, len, &pos);1271 if (ret)1272 return ret;1273 1274 return hclge_dbg_dump_dcb_tm(hdev, buf, len, &pos);1275}1276 1277static int hclge_dbg_dump_reg_cmd(struct hclge_dev *hdev,1278 enum hnae3_dbg_cmd cmd, char *buf, int len)1279{1280 const struct hclge_dbg_reg_type_info *reg_info;1281 int pos = 0, ret = 0;1282 int i;1283 1284 for (i = 0; i < ARRAY_SIZE(hclge_dbg_reg_info); i++) {1285 reg_info = &hclge_dbg_reg_info[i];1286 if (cmd == reg_info->cmd) {1287 if (cmd == HNAE3_DBG_CMD_REG_TQP)1288 return hclge_dbg_dump_reg_tqp(hdev, reg_info,1289 buf, len, &pos);1290 1291 ret = hclge_dbg_dump_reg_common(hdev, reg_info, buf,1292 len, &pos);1293 if (ret)1294 break;1295 }1296 }1297 1298 return ret;1299}1300 1301static int hclge_dbg_dump_tc(struct hclge_dev *hdev, char *buf, int len)1302{1303 struct hclge_ets_tc_weight_cmd *ets_weight;1304 struct hclge_desc desc;1305 char *sch_mode_str;1306 int pos = 0;1307 int ret;1308 u8 i;1309 1310 if (!hnae3_dev_dcb_supported(hdev)) {1311 dev_err(&hdev->pdev->dev,1312 "Only DCB-supported dev supports tc\n");1313 return -EOPNOTSUPP;1314 }1315 1316 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_ETS_TC_WEIGHT, true);1317 ret = hclge_cmd_send(&hdev->hw, &desc, 1);1318 if (ret) {1319 dev_err(&hdev->pdev->dev, "failed to get tc weight, ret = %d\n",1320 ret);1321 return ret;1322 }1323 1324 ets_weight = (struct hclge_ets_tc_weight_cmd *)desc.data;1325 1326 pos += scnprintf(buf + pos, len - pos, "enabled tc number: %u\n",1327 hdev->tm_info.num_tc);1328 pos += scnprintf(buf + pos, len - pos, "weight_offset: %u\n",1329 ets_weight->weight_offset);1330 1331 pos += scnprintf(buf + pos, len - pos, "TC MODE WEIGHT\n");1332 for (i = 0; i < HNAE3_MAX_TC; i++) {1333 sch_mode_str = ets_weight->tc_weight[i] ? "dwrr" : "sp";1334 pos += scnprintf(buf + pos, len - pos, "%u %4s %3u\n",1335 i, sch_mode_str, ets_weight->tc_weight[i]);1336 }1337 1338 return 0;1339}1340 1341static const struct hclge_dbg_item tm_pg_items[] = {1342 { "ID", 2 },1343 { "PRI_MAP", 2 },1344 { "MODE", 2 },1345 { "DWRR", 2 },1346 { "C_IR_B", 2 },1347 { "C_IR_U", 2 },1348 { "C_IR_S", 2 },1349 { "C_BS_B", 2 },1350 { "C_BS_S", 2 },1351 { "C_FLAG", 2 },1352 { "C_RATE(Mbps)", 2 },1353 { "P_IR_B", 2 },1354 { "P_IR_U", 2 },1355 { "P_IR_S", 2 },1356 { "P_BS_B", 2 },1357 { "P_BS_S", 2 },1358 { "P_FLAG", 2 },1359 { "P_RATE(Mbps)", 0 }1360};1361 1362static void hclge_dbg_fill_shaper_content(struct hclge_tm_shaper_para *para,1363 char **result, u8 *index)1364{1365 sprintf(result[(*index)++], "%3u", para->ir_b);1366 sprintf(result[(*index)++], "%3u", para->ir_u);1367 sprintf(result[(*index)++], "%3u", para->ir_s);1368 sprintf(result[(*index)++], "%3u", para->bs_b);1369 sprintf(result[(*index)++], "%3u", para->bs_s);1370 sprintf(result[(*index)++], "%3u", para->flag);1371 sprintf(result[(*index)++], "%6u", para->rate);1372}1373 1374static int __hclge_dbg_dump_tm_pg(struct hclge_dev *hdev, char *data_str,1375 char *buf, int len)1376{1377 struct hclge_tm_shaper_para c_shaper_para, p_shaper_para;1378 char *result[ARRAY_SIZE(tm_pg_items)], *sch_mode_str;1379 u8 pg_id, sch_mode, weight, pri_bit_map, i, j;1380 char content[HCLGE_DBG_TM_INFO_LEN];1381 int pos = 0;1382 int ret;1383 1384 for (i = 0; i < ARRAY_SIZE(tm_pg_items); i++) {1385 result[i] = data_str;1386 data_str += HCLGE_DBG_DATA_STR_LEN;1387 }1388 1389 hclge_dbg_fill_content(content, sizeof(content), tm_pg_items,1390 NULL, ARRAY_SIZE(tm_pg_items));1391 pos += scnprintf(buf + pos, len - pos, "%s", content);1392 1393 for (pg_id = 0; pg_id < hdev->tm_info.num_pg; pg_id++) {1394 ret = hclge_tm_get_pg_to_pri_map(hdev, pg_id, &pri_bit_map);1395 if (ret)1396 return ret;1397 1398 ret = hclge_tm_get_pg_sch_mode(hdev, pg_id, &sch_mode);1399 if (ret)1400 return ret;1401 1402 ret = hclge_tm_get_pg_weight(hdev, pg_id, &weight);1403 if (ret)1404 return ret;1405 1406 ret = hclge_tm_get_pg_shaper(hdev, pg_id,1407 HCLGE_OPC_TM_PG_C_SHAPPING,1408 &c_shaper_para);1409 if (ret)1410 return ret;1411 1412 ret = hclge_tm_get_pg_shaper(hdev, pg_id,1413 HCLGE_OPC_TM_PG_P_SHAPPING,1414 &p_shaper_para);1415 if (ret)1416 return ret;1417 1418 sch_mode_str = sch_mode & HCLGE_TM_TX_SCHD_DWRR_MSK ? "dwrr" :1419 "sp";1420 1421 j = 0;1422 sprintf(result[j++], "%02u", pg_id);1423 sprintf(result[j++], "0x%02x", pri_bit_map);1424 sprintf(result[j++], "%4s", sch_mode_str);1425 sprintf(result[j++], "%3u", weight);1426 hclge_dbg_fill_shaper_content(&c_shaper_para, result, &j);1427 hclge_dbg_fill_shaper_content(&p_shaper_para, result, &j);1428 1429 hclge_dbg_fill_content(content, sizeof(content), tm_pg_items,1430 (const char **)result,1431 ARRAY_SIZE(tm_pg_items));1432 pos += scnprintf(buf + pos, len - pos, "%s", content);1433 }1434 1435 return 0;1436}1437 1438static int hclge_dbg_dump_tm_pg(struct hclge_dev *hdev, char *buf, int len)1439{1440 char *data_str;1441 int ret;1442 1443 data_str = kcalloc(ARRAY_SIZE(tm_pg_items),1444 HCLGE_DBG_DATA_STR_LEN, GFP_KERNEL);1445 if (!data_str)1446 return -ENOMEM;1447 1448 ret = __hclge_dbg_dump_tm_pg(hdev, data_str, buf, len);1449 1450 kfree(data_str);1451 1452 return ret;1453}1454 1455static int hclge_dbg_dump_tm_port(struct hclge_dev *hdev, char *buf, int len)1456{1457 struct hclge_tm_shaper_para shaper_para;1458 int pos = 0;1459 int ret;1460 1461 ret = hclge_tm_get_port_shaper(hdev, &shaper_para);1462 if (ret)1463 return ret;1464 1465 pos += scnprintf(buf + pos, len - pos,1466 "IR_B IR_U IR_S BS_B BS_S FLAG RATE(Mbps)\n");1467 pos += scnprintf(buf + pos, len - pos,1468 "%3u %3u %3u %3u %3u %1u %6u\n",1469 shaper_para.ir_b, shaper_para.ir_u, shaper_para.ir_s,1470 shaper_para.bs_b, shaper_para.bs_s, shaper_para.flag,1471 shaper_para.rate);1472 1473 return 0;1474}1475 1476static int hclge_dbg_dump_tm_bp_qset_map(struct hclge_dev *hdev, u8 tc_id,1477 char *buf, int len)1478{1479 u32 qset_mapping[HCLGE_BP_EXT_GRP_NUM];1480 struct hclge_bp_to_qs_map_cmd *map;1481 struct hclge_desc desc;1482 int pos = 0;1483 u8 group_id;1484 u8 grp_num;1485 u16 i = 0;1486 int ret;1487 1488 grp_num = hdev->num_tqps <= HCLGE_TQP_MAX_SIZE_DEV_V2 ?1489 HCLGE_BP_GRP_NUM : HCLGE_BP_EXT_GRP_NUM;1490 map = (struct hclge_bp_to_qs_map_cmd *)desc.data;1491 for (group_id = 0; group_id < grp_num; group_id++) {1492 hclge_cmd_setup_basic_desc(&desc,1493 HCLGE_OPC_TM_BP_TO_QSET_MAPPING,1494 true);1495 map->tc_id = tc_id;1496 map->qs_group_id = group_id;1497 ret = hclge_cmd_send(&hdev->hw, &desc, 1);1498 if (ret) {1499 dev_err(&hdev->pdev->dev,1500 "failed to get bp to qset map, ret = %d\n",1501 ret);1502 return ret;1503 }1504 1505 qset_mapping[group_id] = le32_to_cpu(map->qs_bit_map);1506 }1507 1508 pos += scnprintf(buf + pos, len - pos, "INDEX | TM BP QSET MAPPING:\n");1509 for (group_id = 0; group_id < grp_num / 8; group_id++) {1510 pos += scnprintf(buf + pos, len - pos,1511 "%04d | %08x:%08x:%08x:%08x:%08x:%08x:%08x:%08x\n",1512 group_id * 256, qset_mapping[i + 7],1513 qset_mapping[i + 6], qset_mapping[i + 5],1514 qset_mapping[i + 4], qset_mapping[i + 3],1515 qset_mapping[i + 2], qset_mapping[i + 1],1516 qset_mapping[i]);1517 i += 8;1518 }1519 1520 return pos;1521}1522 1523static int hclge_dbg_dump_tm_map(struct hclge_dev *hdev, char *buf, int len)1524{1525 u16 queue_id;1526 u16 qset_id;1527 u8 link_vld;1528 int pos = 0;1529 u8 pri_id;1530 u8 tc_id;1531 int ret;1532 1533 for (queue_id = 0; queue_id < hdev->num_tqps; queue_id++) {1534 ret = hclge_tm_get_q_to_qs_map(hdev, queue_id, &qset_id);1535 if (ret)1536 return ret;1537 1538 ret = hclge_tm_get_qset_map_pri(hdev, qset_id, &pri_id,1539 &link_vld);1540 if (ret)1541 return ret;1542 1543 ret = hclge_tm_get_q_to_tc(hdev, queue_id, &tc_id);1544 if (ret)1545 return ret;1546 1547 pos += scnprintf(buf + pos, len - pos,1548 "QUEUE_ID QSET_ID PRI_ID TC_ID\n");1549 pos += scnprintf(buf + pos, len - pos,1550 "%04u %4u %3u %2u\n",1551 queue_id, qset_id, pri_id, tc_id);1552 1553 if (!hnae3_dev_dcb_supported(hdev))1554 continue;1555 1556 ret = hclge_dbg_dump_tm_bp_qset_map(hdev, tc_id, buf + pos,1557 len - pos);1558 if (ret < 0)1559 return ret;1560 pos += ret;1561 1562 pos += scnprintf(buf + pos, len - pos, "\n");1563 }1564 1565 return 0;1566}1567 1568static int hclge_dbg_dump_tm_nodes(struct hclge_dev *hdev, char *buf, int len)1569{1570 struct hclge_tm_nodes_cmd *nodes;1571 struct hclge_desc desc;1572 int pos = 0;1573 int ret;1574 1575 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_TM_NODES, true);1576 ret = hclge_cmd_send(&hdev->hw, &desc, 1);1577 if (ret) {1578 dev_err(&hdev->pdev->dev,1579 "failed to dump tm nodes, ret = %d\n", ret);1580 return ret;1581 }1582 1583 nodes = (struct hclge_tm_nodes_cmd *)desc.data;1584 1585 pos += scnprintf(buf + pos, len - pos, " BASE_ID MAX_NUM\n");1586 pos += scnprintf(buf + pos, len - pos, "PG %4u %4u\n",1587 nodes->pg_base_id, nodes->pg_num);1588 pos += scnprintf(buf + pos, len - pos, "PRI %4u %4u\n",1589 nodes->pri_base_id, nodes->pri_num);1590 pos += scnprintf(buf + pos, len - pos, "QSET %4u %4u\n",1591 le16_to_cpu(nodes->qset_base_id),1592 le16_to_cpu(nodes->qset_num));1593 pos += scnprintf(buf + pos, len - pos, "QUEUE %4u %4u\n",1594 le16_to_cpu(nodes->queue_base_id),1595 le16_to_cpu(nodes->queue_num));1596 1597 return 0;1598}1599 1600static const struct hclge_dbg_item tm_pri_items[] = {1601 { "ID", 4 },1602 { "MODE", 2 },1603 { "DWRR", 2 },1604 { "C_IR_B", 2 },1605 { "C_IR_U", 2 },1606 { "C_IR_S", 2 },1607 { "C_BS_B", 2 },1608 { "C_BS_S", 2 },1609 { "C_FLAG", 2 },1610 { "C_RATE(Mbps)", 2 },1611 { "P_IR_B", 2 },1612 { "P_IR_U", 2 },1613 { "P_IR_S", 2 },1614 { "P_BS_B", 2 },1615 { "P_BS_S", 2 },1616 { "P_FLAG", 2 },1617 { "P_RATE(Mbps)", 0 }1618};1619 1620static int hclge_dbg_dump_tm_pri(struct hclge_dev *hdev, char *buf, int len)1621{1622 struct hclge_tm_shaper_para c_shaper_para, p_shaper_para;1623 char *result[ARRAY_SIZE(tm_pri_items)], *sch_mode_str;1624 char content[HCLGE_DBG_TM_INFO_LEN];1625 u8 pri_num, sch_mode, weight, i, j;1626 char *data_str;1627 int pos, ret;1628 1629 ret = hclge_tm_get_pri_num(hdev, &pri_num);1630 if (ret)1631 return ret;1632 1633 data_str = kcalloc(ARRAY_SIZE(tm_pri_items), HCLGE_DBG_DATA_STR_LEN,1634 GFP_KERNEL);1635 if (!data_str)1636 return -ENOMEM;1637 1638 for (i = 0; i < ARRAY_SIZE(tm_pri_items); i++)1639 result[i] = &data_str[i * HCLGE_DBG_DATA_STR_LEN];1640 1641 hclge_dbg_fill_content(content, sizeof(content), tm_pri_items,1642 NULL, ARRAY_SIZE(tm_pri_items));1643 pos = scnprintf(buf, len, "%s", content);1644 1645 for (i = 0; i < pri_num; i++) {1646 ret = hclge_tm_get_pri_sch_mode(hdev, i, &sch_mode);1647 if (ret)1648 goto out;1649 1650 ret = hclge_tm_get_pri_weight(hdev, i, &weight);1651 if (ret)1652 goto out;1653 1654 ret = hclge_tm_get_pri_shaper(hdev, i,1655 HCLGE_OPC_TM_PRI_C_SHAPPING,1656 &c_shaper_para);1657 if (ret)1658 goto out;1659 1660 ret = hclge_tm_get_pri_shaper(hdev, i,1661 HCLGE_OPC_TM_PRI_P_SHAPPING,1662 &p_shaper_para);1663 if (ret)1664 goto out;1665 1666 sch_mode_str = sch_mode & HCLGE_TM_TX_SCHD_DWRR_MSK ? "dwrr" :1667 "sp";1668 1669 j = 0;1670 sprintf(result[j++], "%04u", i);1671 sprintf(result[j++], "%4s", sch_mode_str);1672 sprintf(result[j++], "%3u", weight);1673 hclge_dbg_fill_shaper_content(&c_shaper_para, result, &j);1674 hclge_dbg_fill_shaper_content(&p_shaper_para, result, &j);1675 hclge_dbg_fill_content(content, sizeof(content), tm_pri_items,1676 (const char **)result,1677 ARRAY_SIZE(tm_pri_items));1678 pos += scnprintf(buf + pos, len - pos, "%s", content);1679 }1680 1681out:1682 kfree(data_str);1683 return ret;1684}1685 1686static const struct hclge_dbg_item tm_qset_items[] = {1687 { "ID", 4 },1688 { "MAP_PRI", 2 },1689 { "LINK_VLD", 2 },1690 { "MODE", 2 },1691 { "DWRR", 2 },1692 { "IR_B", 2 },1693 { "IR_U", 2 },1694 { "IR_S", 2 },1695 { "BS_B", 2 },1696 { "BS_S", 2 },1697 { "FLAG", 2 },1698 { "RATE(Mbps)", 0 }1699};1700 1701static int hclge_dbg_dump_tm_qset(struct hclge_dev *hdev, char *buf, int len)1702{1703 char data_str[ARRAY_SIZE(tm_qset_items)][HCLGE_DBG_DATA_STR_LEN];1704 char *result[ARRAY_SIZE(tm_qset_items)], *sch_mode_str;1705 u8 priority, link_vld, sch_mode, weight;1706 struct hclge_tm_shaper_para shaper_para;1707 char content[HCLGE_DBG_TM_INFO_LEN];1708 u16 qset_num, i;1709 int ret, pos;1710 u8 j;1711 1712 ret = hclge_tm_get_qset_num(hdev, &qset_num);1713 if (ret)1714 return ret;1715 1716 for (i = 0; i < ARRAY_SIZE(tm_qset_items); i++)1717 result[i] = &data_str[i][0];1718 1719 hclge_dbg_fill_content(content, sizeof(content), tm_qset_items,1720 NULL, ARRAY_SIZE(tm_qset_items));1721 pos = scnprintf(buf, len, "%s", content);1722 1723 for (i = 0; i < qset_num; i++) {1724 ret = hclge_tm_get_qset_map_pri(hdev, i, &priority, &link_vld);1725 if (ret)1726 return ret;1727 1728 ret = hclge_tm_get_qset_sch_mode(hdev, i, &sch_mode);1729 if (ret)1730 return ret;1731 1732 ret = hclge_tm_get_qset_weight(hdev, i, &weight);1733 if (ret)1734 return ret;1735 1736 ret = hclge_tm_get_qset_shaper(hdev, i, &shaper_para);1737 if (ret)1738 return ret;1739 1740 sch_mode_str = sch_mode & HCLGE_TM_TX_SCHD_DWRR_MSK ? "dwrr" :1741 "sp";1742 1743 j = 0;1744 sprintf(result[j++], "%04u", i);1745 sprintf(result[j++], "%4u", priority);1746 sprintf(result[j++], "%4u", link_vld);1747 sprintf(result[j++], "%4s", sch_mode_str);1748 sprintf(result[j++], "%3u", weight);1749 hclge_dbg_fill_shaper_content(&shaper_para, result, &j);1750 1751 hclge_dbg_fill_content(content, sizeof(content), tm_qset_items,1752 (const char **)result,1753 ARRAY_SIZE(tm_qset_items));1754 pos += scnprintf(buf + pos, len - pos, "%s", content);1755 }1756 1757 return 0;1758}1759 1760static int hclge_dbg_dump_qos_pause_cfg(struct hclge_dev *hdev, char *buf,1761 int len)1762{1763 struct hclge_cfg_pause_param_cmd *pause_param;1764 struct hclge_desc desc;1765 int pos = 0;1766 int ret;1767 1768 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_MAC_PARA, true);1769 ret = hclge_cmd_send(&hdev->hw, &desc, 1);1770 if (ret) {1771 dev_err(&hdev->pdev->dev,1772 "failed to dump qos pause, ret = %d\n", ret);1773 return ret;1774 }1775 1776 pause_param = (struct hclge_cfg_pause_param_cmd *)desc.data;1777 1778 pos += scnprintf(buf + pos, len - pos, "pause_trans_gap: 0x%x\n",1779 pause_param->pause_trans_gap);1780 pos += scnprintf(buf + pos, len - pos, "pause_trans_time: 0x%x\n",1781 le16_to_cpu(pause_param->pause_trans_time));1782 return 0;1783}1784 1785#define HCLGE_DBG_TC_MASK 0x0F1786 1787static int hclge_dbg_dump_qos_pri_map(struct hclge_dev *hdev, char *buf,1788 int len)1789{1790#define HCLGE_DBG_TC_BIT_WIDTH 41791 1792 struct hclge_qos_pri_map_cmd *pri_map;1793 struct hclge_desc desc;1794 int pos = 0;1795 u8 *pri_tc;1796 u8 tc, i;1797 int ret;1798 1799 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_PRI_TO_TC_MAPPING, true);1800 ret = hclge_cmd_send(&hdev->hw, &desc, 1);1801 if (ret) {1802 dev_err(&hdev->pdev->dev,1803 "failed to dump qos pri map, ret = %d\n", ret);1804 return ret;1805 }1806 1807 pri_map = (struct hclge_qos_pri_map_cmd *)desc.data;1808 1809 pos += scnprintf(buf + pos, len - pos, "vlan_to_pri: 0x%x\n",1810 pri_map->vlan_pri);1811 pos += scnprintf(buf + pos, len - pos, "PRI TC\n");1812 1813 pri_tc = (u8 *)pri_map;1814 for (i = 0; i < HNAE3_MAX_TC; i++) {1815 tc = pri_tc[i >> 1] >> ((i & 1) * HCLGE_DBG_TC_BIT_WIDTH);1816 tc &= HCLGE_DBG_TC_MASK;1817 pos += scnprintf(buf + pos, len - pos, "%u %u\n", i, tc);1818 }1819 1820 return 0;1821}1822 1823static int hclge_dbg_dump_qos_dscp_map(struct hclge_dev *hdev, char *buf,1824 int len)1825{1826 struct hnae3_knic_private_info *kinfo = &hdev->vport[0].nic.kinfo;1827 struct hclge_desc desc[HCLGE_DSCP_MAP_TC_BD_NUM];1828 u8 *req0 = (u8 *)desc[0].data;1829 u8 *req1 = (u8 *)desc[1].data;1830 u8 dscp_tc[HNAE3_MAX_DSCP];1831 int pos, ret;1832 u8 i, j;1833 1834 pos = scnprintf(buf, len, "tc map mode: %s\n",1835 tc_map_mode_str[kinfo->tc_map_mode]);1836 1837 if (kinfo->tc_map_mode != HNAE3_TC_MAP_MODE_DSCP)1838 return 0;1839 1840 hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_QOS_MAP, true);1841 desc[0].flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT);1842 hclge_cmd_setup_basic_desc(&desc[1], HCLGE_OPC_QOS_MAP, true);1843 ret = hclge_cmd_send(&hdev->hw, desc, HCLGE_DSCP_MAP_TC_BD_NUM);1844 if (ret) {1845 dev_err(&hdev->pdev->dev,1846 "failed to dump qos dscp map, ret = %d\n", ret);1847 return ret;1848 }1849 1850 pos += scnprintf(buf + pos, len - pos, "\nDSCP PRIO TC\n");1851 1852 /* The low 32 dscp setting use bd0, high 32 dscp setting use bd1 */1853 for (i = 0; i < HNAE3_MAX_DSCP / HCLGE_DSCP_MAP_TC_BD_NUM; i++) {1854 j = i + HNAE3_MAX_DSCP / HCLGE_DSCP_MAP_TC_BD_NUM;1855 /* Each dscp setting has 4 bits, so each byte saves two dscp1856 * setting1857 */1858 dscp_tc[i] = req0[i >> 1] >> HCLGE_DSCP_TC_SHIFT(i);1859 dscp_tc[j] = req1[i >> 1] >> HCLGE_DSCP_TC_SHIFT(i);1860 dscp_tc[i] &= HCLGE_DBG_TC_MASK;1861 dscp_tc[j] &= HCLGE_DBG_TC_MASK;1862 }1863 1864 for (i = 0; i < HNAE3_MAX_DSCP; i++) {1865 if (kinfo->dscp_prio[i] == HNAE3_PRIO_ID_INVALID)1866 continue;1867 1868 pos += scnprintf(buf + pos, len - pos, " %2u %u %u\n",1869 i, kinfo->dscp_prio[i], dscp_tc[i]);1870 }1871 1872 return 0;1873}1874 1875static int hclge_dbg_dump_tx_buf_cfg(struct hclge_dev *hdev, char *buf, int len)1876{1877 struct hclge_tx_buff_alloc_cmd *tx_buf_cmd;1878 struct hclge_desc desc;1879 int pos = 0;1880 int i, ret;1881 1882 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_TX_BUFF_ALLOC, true);1883 ret = hclge_cmd_send(&hdev->hw, &desc, 1);1884 if (ret) {1885 dev_err(&hdev->pdev->dev,1886 "failed to dump tx buf, ret = %d\n", ret);1887 return ret;1888 }1889 1890 tx_buf_cmd = (struct hclge_tx_buff_alloc_cmd *)desc.data;1891 for (i = 0; i < HCLGE_MAX_TC_NUM; i++)1892 pos += scnprintf(buf + pos, len - pos,1893 "tx_packet_buf_tc_%d: 0x%x\n", i,1894 le16_to_cpu(tx_buf_cmd->tx_pkt_buff[i]));1895 1896 return pos;1897}1898 1899static int hclge_dbg_dump_rx_priv_buf_cfg(struct hclge_dev *hdev, char *buf,1900 int len)1901{1902 struct hclge_rx_priv_buff_cmd *rx_buf_cmd;1903 struct hclge_desc desc;1904 int pos = 0;1905 int i, ret;1906 1907 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RX_PRIV_BUFF_ALLOC, true);1908 ret = hclge_cmd_send(&hdev->hw, &desc, 1);1909 if (ret) {1910 dev_err(&hdev->pdev->dev,1911 "failed to dump rx priv buf, ret = %d\n", ret);1912 return ret;1913 }1914 1915 pos += scnprintf(buf + pos, len - pos, "\n");1916 1917 rx_buf_cmd = (struct hclge_rx_priv_buff_cmd *)desc.data;1918 for (i = 0; i < HCLGE_MAX_TC_NUM; i++)1919 pos += scnprintf(buf + pos, len - pos,1920 "rx_packet_buf_tc_%d: 0x%x\n", i,1921 le16_to_cpu(rx_buf_cmd->buf_num[i]));1922 1923 pos += scnprintf(buf + pos, len - pos, "rx_share_buf: 0x%x\n",1924 le16_to_cpu(rx_buf_cmd->shared_buf));1925 1926 return pos;1927}1928 1929static int hclge_dbg_dump_rx_common_wl_cfg(struct hclge_dev *hdev, char *buf,1930 int len)1931{1932 struct hclge_rx_com_wl *rx_com_wl;1933 struct hclge_desc desc;1934 int pos = 0;1935 int ret;1936 1937 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RX_COM_WL_ALLOC, true);1938 ret = hclge_cmd_send(&hdev->hw, &desc, 1);1939 if (ret) {1940 dev_err(&hdev->pdev->dev,1941 "failed to dump rx common wl, ret = %d\n", ret);1942 return ret;1943 }1944 1945 rx_com_wl = (struct hclge_rx_com_wl *)desc.data;1946 pos += scnprintf(buf + pos, len - pos, "\n");1947 pos += scnprintf(buf + pos, len - pos,1948 "rx_com_wl: high: 0x%x, low: 0x%x\n",1949 le16_to_cpu(rx_com_wl->com_wl.high),1950 le16_to_cpu(rx_com_wl->com_wl.low));1951 1952 return pos;1953}1954 1955static int hclge_dbg_dump_rx_global_pkt_cnt(struct hclge_dev *hdev, char *buf,1956 int len)1957{1958 struct hclge_rx_com_wl *rx_packet_cnt;1959 struct hclge_desc desc;1960 int pos = 0;1961 int ret;1962 1963 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_RX_GBL_PKT_CNT, true);1964 ret = hclge_cmd_send(&hdev->hw, &desc, 1);1965 if (ret) {1966 dev_err(&hdev->pdev->dev,1967 "failed to dump rx global pkt cnt, ret = %d\n", ret);1968 return ret;1969 }1970 1971 rx_packet_cnt = (struct hclge_rx_com_wl *)desc.data;1972 pos += scnprintf(buf + pos, len - pos,1973 "rx_global_packet_cnt: high: 0x%x, low: 0x%x\n",1974 le16_to_cpu(rx_packet_cnt->com_wl.high),1975 le16_to_cpu(rx_packet_cnt->com_wl.low));1976 1977 return pos;1978}1979 1980static int hclge_dbg_dump_rx_priv_wl_buf_cfg(struct hclge_dev *hdev, char *buf,1981 int len)1982{1983 struct hclge_rx_priv_wl_buf *rx_priv_wl;1984 struct hclge_desc desc[2];1985 int pos = 0;1986 int i, ret;1987 1988 hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_RX_PRIV_WL_ALLOC, true);1989 desc[0].flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT);1990 hclge_cmd_setup_basic_desc(&desc[1], HCLGE_OPC_RX_PRIV_WL_ALLOC, true);1991 ret = hclge_cmd_send(&hdev->hw, desc, 2);1992 if (ret) {1993 dev_err(&hdev->pdev->dev,1994 "failed to dump rx priv wl buf, ret = %d\n", ret);1995 return ret;1996 }1997 1998 rx_priv_wl = (struct hclge_rx_priv_wl_buf *)desc[0].data;1999 for (i = 0; i < HCLGE_TC_NUM_ONE_DESC; i++)2000 pos += scnprintf(buf + pos, len - pos,2001 "rx_priv_wl_tc_%d: high: 0x%x, low: 0x%x\n", i,2002 le16_to_cpu(rx_priv_wl->tc_wl[i].high),2003 le16_to_cpu(rx_priv_wl->tc_wl[i].low));2004 2005 rx_priv_wl = (struct hclge_rx_priv_wl_buf *)desc[1].data;2006 for (i = 0; i < HCLGE_TC_NUM_ONE_DESC; i++)2007 pos += scnprintf(buf + pos, len - pos,2008 "rx_priv_wl_tc_%d: high: 0x%x, low: 0x%x\n",2009 i + HCLGE_TC_NUM_ONE_DESC,2010 le16_to_cpu(rx_priv_wl->tc_wl[i].high),2011 le16_to_cpu(rx_priv_wl->tc_wl[i].low));2012 2013 return pos;2014}2015 2016static int hclge_dbg_dump_rx_common_threshold_cfg(struct hclge_dev *hdev,2017 char *buf, int len)2018{2019 struct hclge_rx_com_thrd *rx_com_thrd;2020 struct hclge_desc desc[2];2021 int pos = 0;2022 int i, ret;2023 2024 hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_RX_COM_THRD_ALLOC, true);2025 desc[0].flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT);2026 hclge_cmd_setup_basic_desc(&desc[1], HCLGE_OPC_RX_COM_THRD_ALLOC, true);2027 ret = hclge_cmd_send(&hdev->hw, desc, 2);2028 if (ret) {2029 dev_err(&hdev->pdev->dev,2030 "failed to dump rx common threshold, ret = %d\n", ret);2031 return ret;2032 }2033 2034 pos += scnprintf(buf + pos, len - pos, "\n");2035 rx_com_thrd = (struct hclge_rx_com_thrd *)desc[0].data;2036 for (i = 0; i < HCLGE_TC_NUM_ONE_DESC; i++)2037 pos += scnprintf(buf + pos, len - pos,2038 "rx_com_thrd_tc_%d: high: 0x%x, low: 0x%x\n", i,2039 le16_to_cpu(rx_com_thrd->com_thrd[i].high),2040 le16_to_cpu(rx_com_thrd->com_thrd[i].low));2041 2042 rx_com_thrd = (struct hclge_rx_com_thrd *)desc[1].data;2043 for (i = 0; i < HCLGE_TC_NUM_ONE_DESC; i++)2044 pos += scnprintf(buf + pos, len - pos,2045 "rx_com_thrd_tc_%d: high: 0x%x, low: 0x%x\n",2046 i + HCLGE_TC_NUM_ONE_DESC,2047 le16_to_cpu(rx_com_thrd->com_thrd[i].high),2048 le16_to_cpu(rx_com_thrd->com_thrd[i].low));2049 2050 return pos;2051}2052 2053static int hclge_dbg_dump_qos_buf_cfg(struct hclge_dev *hdev, char *buf,2054 int len)2055{2056 int pos = 0;2057 int ret;2058 2059 ret = hclge_dbg_dump_tx_buf_cfg(hdev, buf + pos, len - pos);2060 if (ret < 0)2061 return ret;2062 pos += ret;2063 2064 ret = hclge_dbg_dump_rx_priv_buf_cfg(hdev, buf + pos, len - pos);2065 if (ret < 0)2066 return ret;2067 pos += ret;2068 2069 ret = hclge_dbg_dump_rx_common_wl_cfg(hdev, buf + pos, len - pos);2070 if (ret < 0)2071 return ret;2072 pos += ret;2073 2074 ret = hclge_dbg_dump_rx_global_pkt_cnt(hdev, buf + pos, len - pos);2075 if (ret < 0)2076 return ret;2077 pos += ret;2078 2079 pos += scnprintf(buf + pos, len - pos, "\n");2080 if (!hnae3_dev_dcb_supported(hdev))2081 return 0;2082 2083 ret = hclge_dbg_dump_rx_priv_wl_buf_cfg(hdev, buf + pos, len - pos);2084 if (ret < 0)2085 return ret;2086 pos += ret;2087 2088 ret = hclge_dbg_dump_rx_common_threshold_cfg(hdev, buf + pos,2089 len - pos);2090 if (ret < 0)2091 return ret;2092 2093 return 0;2094}2095 2096static int hclge_dbg_dump_mng_table(struct hclge_dev *hdev, char *buf, int len)2097{2098 struct hclge_mac_ethertype_idx_rd_cmd *req0;2099 struct hclge_desc desc;2100 u32 msg_egress_port;2101 int pos = 0;2102 int ret, i;2103 2104 pos += scnprintf(buf + pos, len - pos,2105 "entry mac_addr mask ether ");2106 pos += scnprintf(buf + pos, len - pos,2107 "mask vlan mask i_map i_dir e_type ");2108 pos += scnprintf(buf + pos, len - pos, "pf_id vf_id q_id drop\n");2109 2110 for (i = 0; i < HCLGE_DBG_MNG_TBL_MAX; i++) {2111 hclge_cmd_setup_basic_desc(&desc, HCLGE_MAC_ETHERTYPE_IDX_RD,2112 true);2113 req0 = (struct hclge_mac_ethertype_idx_rd_cmd *)&desc.data;2114 req0->index = cpu_to_le16(i);2115 2116 ret = hclge_cmd_send(&hdev->hw, &desc, 1);2117 if (ret) {2118 dev_err(&hdev->pdev->dev,2119 "failed to dump manage table, ret = %d\n", ret);2120 return ret;2121 }2122 2123 if (!req0->resp_code)2124 continue;2125 2126 pos += scnprintf(buf + pos, len - pos, "%02u %pM ",2127 le16_to_cpu(req0->index), req0->mac_addr);2128 2129 pos += scnprintf(buf + pos, len - pos,2130 "%x %04x %x %04x ",2131 !!(req0->flags & HCLGE_DBG_MNG_MAC_MASK_B),2132 le16_to_cpu(req0->ethter_type),2133 !!(req0->flags & HCLGE_DBG_MNG_ETHER_MASK_B),2134 le16_to_cpu(req0->vlan_tag) &2135 HCLGE_DBG_MNG_VLAN_TAG);2136 2137 pos += scnprintf(buf + pos, len - pos,2138 "%x %02x %02x ",2139 !!(req0->flags & HCLGE_DBG_MNG_VLAN_MASK_B),2140 req0->i_port_bitmap, req0->i_port_direction);2141 2142 msg_egress_port = le16_to_cpu(req0->egress_port);2143 pos += scnprintf(buf + pos, len - pos,2144 "%x %x %02x %04x %x\n",2145 !!(msg_egress_port & HCLGE_DBG_MNG_E_TYPE_B),2146 msg_egress_port & HCLGE_DBG_MNG_PF_ID,2147 (msg_egress_port >> 3) & HCLGE_DBG_MNG_VF_ID,2148 le16_to_cpu(req0->egress_queue),2149 !!(msg_egress_port & HCLGE_DBG_MNG_DROP_B));2150 }2151 2152 return 0;2153}2154 2155#define HCLGE_DBG_TCAM_BUF_SIZE 2562156 2157static int hclge_dbg_fd_tcam_read(struct hclge_dev *hdev, bool sel_x,2158 char *tcam_buf,2159 struct hclge_dbg_tcam_msg tcam_msg)2160{2161 struct hclge_fd_tcam_config_1_cmd *req1;2162 struct hclge_fd_tcam_config_2_cmd *req2;2163 struct hclge_fd_tcam_config_3_cmd *req3;2164 struct hclge_desc desc[3];2165 int pos = 0;2166 int ret, i;2167 __le32 *req;2168 2169 hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_FD_TCAM_OP, true);2170 desc[0].flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT);2171 hclge_cmd_setup_basic_desc(&desc[1], HCLGE_OPC_FD_TCAM_OP, true);2172 desc[1].flag |= cpu_to_le16(HCLGE_COMM_CMD_FLAG_NEXT);2173 hclge_cmd_setup_basic_desc(&desc[2], HCLGE_OPC_FD_TCAM_OP, true);2174 2175 req1 = (struct hclge_fd_tcam_config_1_cmd *)desc[0].data;2176 req2 = (struct hclge_fd_tcam_config_2_cmd *)desc[1].data;2177 req3 = (struct hclge_fd_tcam_config_3_cmd *)desc[2].data;2178 2179 req1->stage = tcam_msg.stage;2180 req1->xy_sel = sel_x ? 1 : 0;2181 req1->index = cpu_to_le32(tcam_msg.loc);2182 2183 ret = hclge_cmd_send(&hdev->hw, desc, 3);2184 if (ret)2185 return ret;2186 2187 pos += scnprintf(tcam_buf + pos, HCLGE_DBG_TCAM_BUF_SIZE - pos,2188 "read result tcam key %s(%u):\n", sel_x ? "x" : "y",2189 tcam_msg.loc);2190 2191 /* tcam_data0 ~ tcam_data1 */2192 req = (__le32 *)req1->tcam_data;2193 for (i = 0; i < 2; i++)2194 pos += scnprintf(tcam_buf + pos, HCLGE_DBG_TCAM_BUF_SIZE - pos,2195 "%08x\n", le32_to_cpu(*req++));2196 2197 /* tcam_data2 ~ tcam_data7 */2198 req = (__le32 *)req2->tcam_data;2199 for (i = 0; i < 6; i++)2200 pos += scnprintf(tcam_buf + pos, HCLGE_DBG_TCAM_BUF_SIZE - pos,2201 "%08x\n", le32_to_cpu(*req++));2202 2203 /* tcam_data8 ~ tcam_data12 */2204 req = (__le32 *)req3->tcam_data;2205 for (i = 0; i < 5; i++)2206 pos += scnprintf(tcam_buf + pos, HCLGE_DBG_TCAM_BUF_SIZE - pos,2207 "%08x\n", le32_to_cpu(*req++));2208 2209 return ret;2210}2211 2212static int hclge_dbg_get_rules_location(struct hclge_dev *hdev, u16 *rule_locs)2213{2214 struct hclge_fd_rule *rule;2215 struct hlist_node *node;2216 int cnt = 0;2217 2218 spin_lock_bh(&hdev->fd_rule_lock);2219 hlist_for_each_entry_safe(rule, node, &hdev->fd_rule_list, rule_node) {2220 rule_locs[cnt] = rule->location;2221 cnt++;2222 }2223 spin_unlock_bh(&hdev->fd_rule_lock);2224 2225 if (cnt != hdev->hclge_fd_rule_num || cnt == 0)2226 return -EINVAL;2227 2228 return cnt;2229}2230 2231static int hclge_dbg_dump_fd_tcam(struct hclge_dev *hdev, char *buf, int len)2232{2233 u32 rule_num = hdev->fd_cfg.rule_num[HCLGE_FD_STAGE_1];2234 struct hclge_dbg_tcam_msg tcam_msg;2235 int i, ret, rule_cnt;2236 u16 *rule_locs;2237 char *tcam_buf;2238 int pos = 0;2239 2240 if (!hnae3_ae_dev_fd_supported(hdev->ae_dev)) {2241 dev_err(&hdev->pdev->dev,2242 "Only FD-supported dev supports dump fd tcam\n");2243 return -EOPNOTSUPP;2244 }2245 2246 if (!hdev->hclge_fd_rule_num || !rule_num)2247 return 0;2248 2249 rule_locs = kcalloc(rule_num, sizeof(u16), GFP_KERNEL);2250 if (!rule_locs)2251 return -ENOMEM;2252 2253 tcam_buf = kzalloc(HCLGE_DBG_TCAM_BUF_SIZE, GFP_KERNEL);2254 if (!tcam_buf) {2255 kfree(rule_locs);2256 return -ENOMEM;2257 }2258 2259 rule_cnt = hclge_dbg_get_rules_location(hdev, rule_locs);2260 if (rule_cnt < 0) {2261 ret = rule_cnt;2262 dev_err(&hdev->pdev->dev,2263 "failed to get rule number, ret = %d\n", ret);2264 goto out;2265 }2266 2267 ret = 0;2268 for (i = 0; i < rule_cnt; i++) {2269 tcam_msg.stage = HCLGE_FD_STAGE_1;2270 tcam_msg.loc = rule_locs[i];2271 2272 ret = hclge_dbg_fd_tcam_read(hdev, true, tcam_buf, tcam_msg);2273 if (ret) {2274 dev_err(&hdev->pdev->dev,2275 "failed to get fd tcam key x, ret = %d\n", ret);2276 goto out;2277 }2278 2279 pos += scnprintf(buf + pos, len - pos, "%s", tcam_buf);2280 2281 ret = hclge_dbg_fd_tcam_read(hdev, false, tcam_buf, tcam_msg);2282 if (ret) {2283 dev_err(&hdev->pdev->dev,2284 "failed to get fd tcam key y, ret = %d\n", ret);2285 goto out;2286 }2287 2288 pos += scnprintf(buf + pos, len - pos, "%s", tcam_buf);2289 }2290 2291out:2292 kfree(tcam_buf);2293 kfree(rule_locs);2294 return ret;2295}2296 2297static int hclge_dbg_dump_fd_counter(struct hclge_dev *hdev, char *buf, int len)2298{2299 u8 func_num = pci_num_vf(hdev->pdev) + 1; /* pf and enabled vf num */2300 struct hclge_fd_ad_cnt_read_cmd *req;2301 char str_id[HCLGE_DBG_ID_LEN];2302 struct hclge_desc desc;2303 int pos = 0;2304 int ret;2305 u64 cnt;2306 u8 i;2307 2308 if (!hnae3_ae_dev_fd_supported(hdev->ae_dev))2309 return -EOPNOTSUPP;2310 2311 pos += scnprintf(buf + pos, len - pos,2312 "func_id\thit_times\n");2313 2314 for (i = 0; i < func_num; i++) {2315 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_FD_CNT_OP, true);2316 req = (struct hclge_fd_ad_cnt_read_cmd *)desc.data;2317 req->index = cpu_to_le16(i);2318 ret = hclge_cmd_send(&hdev->hw, &desc, 1);2319 if (ret) {2320 dev_err(&hdev->pdev->dev, "failed to get fd counter, ret = %d\n",2321 ret);2322 return ret;2323 }2324 cnt = le64_to_cpu(req->cnt);2325 hclge_dbg_get_func_id_str(str_id, i);2326 pos += scnprintf(buf + pos, len - pos,2327 "%s\t%llu\n", str_id, cnt);2328 }2329 2330 return 0;2331}2332 2333static const struct hclge_dbg_status_dfx_info hclge_dbg_rst_info[] = {2334 {HCLGE_MISC_VECTOR_REG_BASE, "vector0 interrupt enable status"},2335 {HCLGE_MISC_RESET_STS_REG, "reset interrupt source"},2336 {HCLGE_MISC_VECTOR_INT_STS, "reset interrupt status"},2337 {HCLGE_RAS_PF_OTHER_INT_STS_REG, "RAS interrupt status"},2338 {HCLGE_GLOBAL_RESET_REG, "hardware reset status"},2339 {HCLGE_NIC_CSQ_DEPTH_REG, "handshake status"},2340 {HCLGE_FUN_RST_ING, "function reset status"}2341};2342 2343int hclge_dbg_dump_rst_info(struct hclge_dev *hdev, char *buf, int len)2344{2345 u32 i, offset;2346 int pos = 0;2347 2348 pos += scnprintf(buf + pos, len - pos, "PF reset count: %u\n",2349 hdev->rst_stats.pf_rst_cnt);2350 pos += scnprintf(buf + pos, len - pos, "FLR reset count: %u\n",2351 hdev->rst_stats.flr_rst_cnt);2352 pos += scnprintf(buf + pos, len - pos, "GLOBAL reset count: %u\n",2353 hdev->rst_stats.global_rst_cnt);2354 pos += scnprintf(buf + pos, len - pos, "IMP reset count: %u\n",2355 hdev->rst_stats.imp_rst_cnt);2356 pos += scnprintf(buf + pos, len - pos, "reset done count: %u\n",2357 hdev->rst_stats.reset_done_cnt);2358 pos += scnprintf(buf + pos, len - pos, "HW reset done count: %u\n",2359 hdev->rst_stats.hw_reset_done_cnt);2360 pos += scnprintf(buf + pos, len - pos, "reset count: %u\n",2361 hdev->rst_stats.reset_cnt);2362 pos += scnprintf(buf + pos, len - pos, "reset fail count: %u\n",2363 hdev->rst_stats.reset_fail_cnt);2364 2365 for (i = 0; i < ARRAY_SIZE(hclge_dbg_rst_info); i++) {2366 offset = hclge_dbg_rst_info[i].offset;2367 pos += scnprintf(buf + pos, len - pos, "%s: 0x%x\n",2368 hclge_dbg_rst_info[i].message,2369 hclge_read_dev(&hdev->hw, offset));2370 }2371 2372 pos += scnprintf(buf + pos, len - pos, "hdev state: 0x%lx\n",2373 hdev->state);2374 2375 return 0;2376}2377 2378static int hclge_dbg_dump_serv_info(struct hclge_dev *hdev, char *buf, int len)2379{2380 unsigned long rem_nsec;2381 int pos = 0;2382 u64 lc;2383 2384 lc = local_clock();2385 rem_nsec = do_div(lc, HCLGE_BILLION_NANO_SECONDS);2386 2387 pos += scnprintf(buf + pos, len - pos, "local_clock: [%5lu.%06lu]\n",2388 (unsigned long)lc, rem_nsec / 1000);2389 pos += scnprintf(buf + pos, len - pos, "delta: %u(ms)\n",2390 jiffies_to_msecs(jiffies - hdev->last_serv_processed));2391 pos += scnprintf(buf + pos, len - pos,2392 "last_service_task_processed: %lu(jiffies)\n",2393 hdev->last_serv_processed);2394 pos += scnprintf(buf + pos, len - pos, "last_service_task_cnt: %lu\n",2395 hdev->serv_processed_cnt);2396 2397 return 0;2398}2399 2400static int hclge_dbg_dump_interrupt(struct hclge_dev *hdev, char *buf, int len)2401{2402 int pos = 0;2403 2404 pos += scnprintf(buf + pos, len - pos, "num_nic_msi: %u\n",2405 hdev->num_nic_msi);2406 pos += scnprintf(buf + pos, len - pos, "num_roce_msi: %u\n",2407 hdev->num_roce_msi);2408 pos += scnprintf(buf + pos, len - pos, "num_msi_used: %u\n",2409 hdev->num_msi_used);2410 pos += scnprintf(buf + pos, len - pos, "num_msi_left: %u\n",2411 hdev->num_msi_left);2412 2413 return 0;2414}2415 2416static void hclge_dbg_imp_info_data_print(struct hclge_desc *desc_src,2417 char *buf, int len, u32 bd_num)2418{2419#define HCLGE_DBG_IMP_INFO_PRINT_OFFSET 0x22420 2421 struct hclge_desc *desc_index = desc_src;2422 u32 offset = 0;2423 int pos = 0;2424 u32 i, j;2425 2426 pos += scnprintf(buf + pos, len - pos, "offset | data\n");2427 2428 for (i = 0; i < bd_num; i++) {2429 j = 0;2430 while (j < HCLGE_DESC_DATA_LEN - 1) {2431 pos += scnprintf(buf + pos, len - pos, "0x%04x | ",2432 offset);2433 pos += scnprintf(buf + pos, len - pos, "0x%08x ",2434 le32_to_cpu(desc_index->data[j++]));2435 pos += scnprintf(buf + pos, len - pos, "0x%08x\n",2436 le32_to_cpu(desc_index->data[j++]));2437 offset += sizeof(u32) * HCLGE_DBG_IMP_INFO_PRINT_OFFSET;2438 }2439 desc_index++;2440 }2441}2442 2443static int2444hclge_dbg_get_imp_stats_info(struct hclge_dev *hdev, char *buf, int len)2445{2446 struct hclge_get_imp_bd_cmd *req;2447 struct hclge_desc *desc_src;2448 struct hclge_desc desc;2449 u32 bd_num;2450 int ret;2451 2452 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_IMP_STATS_BD, true);2453 2454 req = (struct hclge_get_imp_bd_cmd *)desc.data;2455 ret = hclge_cmd_send(&hdev->hw, &desc, 1);2456 if (ret) {2457 dev_err(&hdev->pdev->dev,2458 "failed to get imp statistics bd number, ret = %d\n",2459 ret);2460 return ret;2461 }2462 2463 bd_num = le32_to_cpu(req->bd_num);2464 if (!bd_num) {2465 dev_err(&hdev->pdev->dev, "imp statistics bd number is 0!\n");2466 return -EINVAL;2467 }2468 2469 desc_src = kcalloc(bd_num, sizeof(struct hclge_desc), GFP_KERNEL);2470 if (!desc_src)2471 return -ENOMEM;2472 2473 ret = hclge_dbg_cmd_send(hdev, desc_src, 0, bd_num,2474 HCLGE_OPC_IMP_STATS_INFO);2475 if (ret) {2476 kfree(desc_src);2477 dev_err(&hdev->pdev->dev,2478 "failed to get imp statistics, ret = %d\n", ret);2479 return ret;2480 }2481 2482 hclge_dbg_imp_info_data_print(desc_src, buf, len, bd_num);2483 2484 kfree(desc_src);2485 2486 return 0;2487}2488 2489#define HCLGE_CMD_NCL_CONFIG_BD_NUM 52490#define HCLGE_MAX_NCL_CONFIG_LENGTH 163842491 2492static void hclge_ncl_config_data_print(struct hclge_desc *desc, int *index,2493 char *buf, int len, int *pos)2494{2495#define HCLGE_CMD_DATA_NUM 62496 2497 int offset = HCLGE_MAX_NCL_CONFIG_LENGTH - *index;2498 int i, j;2499 2500 for (i = 0; i < HCLGE_CMD_NCL_CONFIG_BD_NUM; i++) {2501 for (j = 0; j < HCLGE_CMD_DATA_NUM; j++) {2502 if (i == 0 && j == 0)2503 continue;2504 2505 *pos += scnprintf(buf + *pos, len - *pos,2506 "0x%04x | 0x%08x\n", offset,2507 le32_to_cpu(desc[i].data[j]));2508 2509 offset += sizeof(u32);2510 *index -= sizeof(u32);2511 2512 if (*index <= 0)2513 return;2514 }2515 }2516}2517 2518static int2519hclge_dbg_dump_ncl_config(struct hclge_dev *hdev, char *buf, int len)2520{2521#define HCLGE_NCL_CONFIG_LENGTH_IN_EACH_CMD (20 + 24 * 4)2522 2523 struct hclge_desc desc[HCLGE_CMD_NCL_CONFIG_BD_NUM];2524 int bd_num = HCLGE_CMD_NCL_CONFIG_BD_NUM;2525 int index = HCLGE_MAX_NCL_CONFIG_LENGTH;2526 int pos = 0;2527 u32 data0;2528 int ret;2529 2530 pos += scnprintf(buf + pos, len - pos, "offset | data\n");2531 2532 while (index > 0) {2533 data0 = HCLGE_MAX_NCL_CONFIG_LENGTH - index;2534 if (index >= HCLGE_NCL_CONFIG_LENGTH_IN_EACH_CMD)2535 data0 |= HCLGE_NCL_CONFIG_LENGTH_IN_EACH_CMD << 16;2536 else2537 data0 |= (u32)index << 16;2538 ret = hclge_dbg_cmd_send(hdev, desc, data0, bd_num,2539 HCLGE_OPC_QUERY_NCL_CONFIG);2540 if (ret)2541 return ret;2542 2543 hclge_ncl_config_data_print(desc, &index, buf, len, &pos);2544 }2545 2546 return 0;2547}2548 2549static int hclge_dbg_dump_loopback(struct hclge_dev *hdev, char *buf, int len)2550{2551 struct phy_device *phydev = hdev->hw.mac.phydev;2552 struct hclge_config_mac_mode_cmd *req_app;2553 struct hclge_common_lb_cmd *req_common;2554 struct hclge_desc desc;2555 u8 loopback_en;2556 int pos = 0;2557 int ret;2558 2559 req_app = (struct hclge_config_mac_mode_cmd *)desc.data;2560 req_common = (struct hclge_common_lb_cmd *)desc.data;2561 2562 pos += scnprintf(buf + pos, len - pos, "mac id: %u\n",2563 hdev->hw.mac.mac_id);2564 2565 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_MAC_MODE, true);2566 ret = hclge_cmd_send(&hdev->hw, &desc, 1);2567 if (ret) {2568 dev_err(&hdev->pdev->dev,2569 "failed to dump app loopback status, ret = %d\n", ret);2570 return ret;2571 }2572 2573 loopback_en = hnae3_get_bit(le32_to_cpu(req_app->txrx_pad_fcs_loop_en),2574 HCLGE_MAC_APP_LP_B);2575 pos += scnprintf(buf + pos, len - pos, "app loopback: %s\n",2576 state_str[loopback_en]);2577 2578 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_COMMON_LOOPBACK, true);2579 ret = hclge_cmd_send(&hdev->hw, &desc, 1);2580 if (ret) {2581 dev_err(&hdev->pdev->dev,2582 "failed to dump common loopback status, ret = %d\n",2583 ret);2584 return ret;2585 }2586 2587 loopback_en = req_common->enable & HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B;2588 pos += scnprintf(buf + pos, len - pos, "serdes serial loopback: %s\n",2589 state_str[loopback_en]);2590 2591 loopback_en = req_common->enable &2592 HCLGE_CMD_SERDES_PARALLEL_INNER_LOOP_B ? 1 : 0;2593 pos += scnprintf(buf + pos, len - pos, "serdes parallel loopback: %s\n",2594 state_str[loopback_en]);2595 2596 if (phydev) {2597 loopback_en = phydev->loopback_enabled;2598 pos += scnprintf(buf + pos, len - pos, "phy loopback: %s\n",2599 state_str[loopback_en]);2600 } else if (hnae3_dev_phy_imp_supported(hdev)) {2601 loopback_en = req_common->enable &2602 HCLGE_CMD_GE_PHY_INNER_LOOP_B;2603 pos += scnprintf(buf + pos, len - pos, "phy loopback: %s\n",2604 state_str[loopback_en]);2605 }2606 2607 return 0;2608}2609 2610/* hclge_dbg_dump_mac_tnl_status: print message about mac tnl interrupt2611 * @hdev: pointer to struct hclge_dev2612 */2613static int2614hclge_dbg_dump_mac_tnl_status(struct hclge_dev *hdev, char *buf, int len)2615{2616 struct hclge_mac_tnl_stats stats;2617 unsigned long rem_nsec;2618 int pos = 0;2619 2620 pos += scnprintf(buf + pos, len - pos,2621 "Recently generated mac tnl interruption:\n");2622 2623 while (kfifo_get(&hdev->mac_tnl_log, &stats)) {2624 rem_nsec = do_div(stats.time, HCLGE_BILLION_NANO_SECONDS);2625 2626 pos += scnprintf(buf + pos, len - pos,2627 "[%07lu.%03lu] status = 0x%x\n",2628 (unsigned long)stats.time, rem_nsec / 1000,2629 stats.status);2630 }2631 2632 return 0;2633}2634 2635 2636static const struct hclge_dbg_item mac_list_items[] = {2637 { "FUNC_ID", 2 },2638 { "MAC_ADDR", 12 },2639 { "STATE", 2 },2640};2641 2642static void hclge_dbg_dump_mac_list(struct hclge_dev *hdev, char *buf, int len,2643 bool is_unicast)2644{2645 char data_str[ARRAY_SIZE(mac_list_items)][HCLGE_DBG_DATA_STR_LEN];2646 char content[HCLGE_DBG_INFO_LEN], str_id[HCLGE_DBG_ID_LEN];2647 char *result[ARRAY_SIZE(mac_list_items)];2648 struct hclge_mac_node *mac_node, *tmp;2649 struct hclge_vport *vport;2650 struct list_head *list;2651 u32 func_id;2652 int pos = 0;2653 int i;2654 2655 for (i = 0; i < ARRAY_SIZE(mac_list_items); i++)2656 result[i] = &data_str[i][0];2657 2658 pos += scnprintf(buf + pos, len - pos, "%s MAC_LIST:\n",2659 is_unicast ? "UC" : "MC");2660 hclge_dbg_fill_content(content, sizeof(content), mac_list_items,2661 NULL, ARRAY_SIZE(mac_list_items));2662 pos += scnprintf(buf + pos, len - pos, "%s", content);2663 2664 for (func_id = 0; func_id < hdev->num_alloc_vport; func_id++) {2665 vport = &hdev->vport[func_id];2666 list = is_unicast ? &vport->uc_mac_list : &vport->mc_mac_list;2667 spin_lock_bh(&vport->mac_list_lock);2668 list_for_each_entry_safe(mac_node, tmp, list, node) {2669 i = 0;2670 result[i++] = hclge_dbg_get_func_id_str(str_id,2671 func_id);2672 sprintf(result[i++], "%pM", mac_node->mac_addr);2673 sprintf(result[i++], "%5s",2674 hclge_mac_state_str[mac_node->state]);2675 hclge_dbg_fill_content(content, sizeof(content),2676 mac_list_items,2677 (const char **)result,2678 ARRAY_SIZE(mac_list_items));2679 pos += scnprintf(buf + pos, len - pos, "%s", content);2680 }2681 spin_unlock_bh(&vport->mac_list_lock);2682 }2683}2684 2685static int hclge_dbg_dump_umv_info(struct hclge_dev *hdev, char *buf, int len)2686{2687 u8 func_num = pci_num_vf(hdev->pdev) + 1;2688 struct hclge_vport *vport;2689 int pos = 0;2690 u8 i;2691 2692 pos += scnprintf(buf, len, "num_alloc_vport : %u\n",2693 hdev->num_alloc_vport);2694 pos += scnprintf(buf + pos, len - pos, "max_umv_size : %u\n",2695 hdev->max_umv_size);2696 pos += scnprintf(buf + pos, len - pos, "wanted_umv_size : %u\n",2697 hdev->wanted_umv_size);2698 pos += scnprintf(buf + pos, len - pos, "priv_umv_size : %u\n",2699 hdev->priv_umv_size);2700 2701 mutex_lock(&hdev->vport_lock);2702 pos += scnprintf(buf + pos, len - pos, "share_umv_size : %u\n",2703 hdev->share_umv_size);2704 for (i = 0; i < func_num; i++) {2705 vport = &hdev->vport[i];2706 pos += scnprintf(buf + pos, len - pos,2707 "vport(%u) used_umv_num : %u\n",2708 i, vport->used_umv_num);2709 }2710 mutex_unlock(&hdev->vport_lock);2711 2712 pos += scnprintf(buf + pos, len - pos, "used_mc_mac_num : %u\n",2713 hdev->used_mc_mac_num);2714 2715 return 0;2716}2717 2718static int hclge_get_vlan_rx_offload_cfg(struct hclge_dev *hdev, u8 vf_id,2719 struct hclge_dbg_vlan_cfg *vlan_cfg)2720{2721 struct hclge_vport_vtag_rx_cfg_cmd *req;2722 struct hclge_desc desc;2723 u16 bmap_index;2724 u8 rx_cfg;2725 int ret;2726 2727 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_VLAN_PORT_RX_CFG, true);2728 2729 req = (struct hclge_vport_vtag_rx_cfg_cmd *)desc.data;2730 req->vf_offset = vf_id / HCLGE_VF_NUM_PER_CMD;2731 bmap_index = vf_id % HCLGE_VF_NUM_PER_CMD / HCLGE_VF_NUM_PER_BYTE;2732 req->vf_bitmap[bmap_index] = 1U << (vf_id % HCLGE_VF_NUM_PER_BYTE);2733 2734 ret = hclge_cmd_send(&hdev->hw, &desc, 1);2735 if (ret) {2736 dev_err(&hdev->pdev->dev,2737 "failed to get vport%u rxvlan cfg, ret = %d\n",2738 vf_id, ret);2739 return ret;2740 }2741 2742 rx_cfg = req->vport_vlan_cfg;2743 vlan_cfg->strip_tag1 = hnae3_get_bit(rx_cfg, HCLGE_REM_TAG1_EN_B);2744 vlan_cfg->strip_tag2 = hnae3_get_bit(rx_cfg, HCLGE_REM_TAG2_EN_B);2745 vlan_cfg->drop_tag1 = hnae3_get_bit(rx_cfg, HCLGE_DISCARD_TAG1_EN_B);2746 vlan_cfg->drop_tag2 = hnae3_get_bit(rx_cfg, HCLGE_DISCARD_TAG2_EN_B);2747 vlan_cfg->pri_only1 = hnae3_get_bit(rx_cfg, HCLGE_SHOW_TAG1_EN_B);2748 vlan_cfg->pri_only2 = hnae3_get_bit(rx_cfg, HCLGE_SHOW_TAG2_EN_B);2749 2750 return 0;2751}2752 2753static int hclge_get_vlan_tx_offload_cfg(struct hclge_dev *hdev, u8 vf_id,2754 struct hclge_dbg_vlan_cfg *vlan_cfg)2755{2756 struct hclge_vport_vtag_tx_cfg_cmd *req;2757 struct hclge_desc desc;2758 u16 bmap_index;2759 u8 tx_cfg;2760 int ret;2761 2762 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_VLAN_PORT_TX_CFG, true);2763 req = (struct hclge_vport_vtag_tx_cfg_cmd *)desc.data;2764 req->vf_offset = vf_id / HCLGE_VF_NUM_PER_CMD;2765 bmap_index = vf_id % HCLGE_VF_NUM_PER_CMD / HCLGE_VF_NUM_PER_BYTE;2766 req->vf_bitmap[bmap_index] = 1U << (vf_id % HCLGE_VF_NUM_PER_BYTE);2767 2768 ret = hclge_cmd_send(&hdev->hw, &desc, 1);2769 if (ret) {2770 dev_err(&hdev->pdev->dev,2771 "failed to get vport%u txvlan cfg, ret = %d\n",2772 vf_id, ret);2773 return ret;2774 }2775 2776 tx_cfg = req->vport_vlan_cfg;2777 vlan_cfg->pvid = le16_to_cpu(req->def_vlan_tag1);2778 2779 vlan_cfg->accept_tag1 = hnae3_get_bit(tx_cfg, HCLGE_ACCEPT_TAG1_B);2780 vlan_cfg->accept_tag2 = hnae3_get_bit(tx_cfg, HCLGE_ACCEPT_TAG2_B);2781 vlan_cfg->accept_untag1 = hnae3_get_bit(tx_cfg, HCLGE_ACCEPT_UNTAG1_B);2782 vlan_cfg->accept_untag2 = hnae3_get_bit(tx_cfg, HCLGE_ACCEPT_UNTAG2_B);2783 vlan_cfg->insert_tag1 = hnae3_get_bit(tx_cfg, HCLGE_PORT_INS_TAG1_EN_B);2784 vlan_cfg->insert_tag2 = hnae3_get_bit(tx_cfg, HCLGE_PORT_INS_TAG2_EN_B);2785 vlan_cfg->shift_tag = hnae3_get_bit(tx_cfg, HCLGE_TAG_SHIFT_MODE_EN_B);2786 2787 return 0;2788}2789 2790static int hclge_get_vlan_filter_config_cmd(struct hclge_dev *hdev,2791 u8 vlan_type, u8 vf_id,2792 struct hclge_desc *desc)2793{2794 struct hclge_vlan_filter_ctrl_cmd *req;2795 int ret;2796 2797 hclge_cmd_setup_basic_desc(desc, HCLGE_OPC_VLAN_FILTER_CTRL, true);2798 req = (struct hclge_vlan_filter_ctrl_cmd *)desc->data;2799 req->vlan_type = vlan_type;2800 req->vf_id = vf_id;2801 2802 ret = hclge_cmd_send(&hdev->hw, desc, 1);2803 if (ret)2804 dev_err(&hdev->pdev->dev,2805 "failed to get vport%u vlan filter config, ret = %d.\n",2806 vf_id, ret);2807 2808 return ret;2809}2810 2811static int hclge_get_vlan_filter_state(struct hclge_dev *hdev, u8 vlan_type,2812 u8 vf_id, u8 *vlan_fe)2813{2814 struct hclge_vlan_filter_ctrl_cmd *req;2815 struct hclge_desc desc;2816 int ret;2817 2818 ret = hclge_get_vlan_filter_config_cmd(hdev, vlan_type, vf_id, &desc);2819 if (ret)2820 return ret;2821 2822 req = (struct hclge_vlan_filter_ctrl_cmd *)desc.data;2823 *vlan_fe = req->vlan_fe;2824 2825 return 0;2826}2827 2828static int hclge_get_port_vlan_filter_bypass_state(struct hclge_dev *hdev,2829 u8 vf_id, u8 *bypass_en)2830{2831 struct hclge_port_vlan_filter_bypass_cmd *req;2832 struct hclge_desc desc;2833 int ret;2834 2835 if (!test_bit(HNAE3_DEV_SUPPORT_PORT_VLAN_BYPASS_B, hdev->ae_dev->caps))2836 return 0;2837 2838 hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_PORT_VLAN_BYPASS, true);2839 req = (struct hclge_port_vlan_filter_bypass_cmd *)desc.data;2840 req->vf_id = vf_id;2841 2842 ret = hclge_cmd_send(&hdev->hw, &desc, 1);2843 if (ret) {2844 dev_err(&hdev->pdev->dev,2845 "failed to get vport%u port vlan filter bypass state, ret = %d.\n",2846 vf_id, ret);2847 return ret;2848 }2849 2850 *bypass_en = hnae3_get_bit(req->bypass_state, HCLGE_INGRESS_BYPASS_B);2851 2852 return 0;2853}2854 2855static const struct hclge_dbg_item vlan_filter_items[] = {2856 { "FUNC_ID", 2 },2857 { "I_VF_VLAN_FILTER", 2 },2858 { "E_VF_VLAN_FILTER", 2 },2859 { "PORT_VLAN_FILTER_BYPASS", 0 }2860};2861 2862static const struct hclge_dbg_item vlan_offload_items[] = {2863 { "FUNC_ID", 2 },2864 { "PVID", 4 },2865 { "ACCEPT_TAG1", 2 },2866 { "ACCEPT_TAG2", 2 },2867 { "ACCEPT_UNTAG1", 2 },2868 { "ACCEPT_UNTAG2", 2 },2869 { "INSERT_TAG1", 2 },2870 { "INSERT_TAG2", 2 },2871 { "SHIFT_TAG", 2 },2872 { "STRIP_TAG1", 2 },2873 { "STRIP_TAG2", 2 },2874 { "DROP_TAG1", 2 },2875 { "DROP_TAG2", 2 },2876 { "PRI_ONLY_TAG1", 2 },2877 { "PRI_ONLY_TAG2", 0 }2878};2879 2880static int hclge_dbg_dump_vlan_filter_config(struct hclge_dev *hdev, char *buf,2881 int len, int *pos)2882{2883 char content[HCLGE_DBG_VLAN_FLTR_INFO_LEN], str_id[HCLGE_DBG_ID_LEN];2884 const char *result[ARRAY_SIZE(vlan_filter_items)];2885 u8 i, j, vlan_fe, bypass, ingress, egress;2886 u8 func_num = pci_num_vf(hdev->pdev) + 1; /* pf and enabled vf num */2887 int ret;2888 2889 ret = hclge_get_vlan_filter_state(hdev, HCLGE_FILTER_TYPE_PORT, 0,2890 &vlan_fe);2891 if (ret)2892 return ret;2893 ingress = vlan_fe & HCLGE_FILTER_FE_NIC_INGRESS_B;2894 egress = vlan_fe & HCLGE_FILTER_FE_NIC_EGRESS_B ? 1 : 0;2895 2896 *pos += scnprintf(buf, len, "I_PORT_VLAN_FILTER: %s\n",2897 state_str[ingress]);2898 *pos += scnprintf(buf + *pos, len - *pos, "E_PORT_VLAN_FILTER: %s\n",2899 state_str[egress]);2900 2901 hclge_dbg_fill_content(content, sizeof(content), vlan_filter_items,2902 NULL, ARRAY_SIZE(vlan_filter_items));2903 *pos += scnprintf(buf + *pos, len - *pos, "%s", content);2904 2905 for (i = 0; i < func_num; i++) {2906 ret = hclge_get_vlan_filter_state(hdev, HCLGE_FILTER_TYPE_VF, i,2907 &vlan_fe);2908 if (ret)2909 return ret;2910 2911 ingress = vlan_fe & HCLGE_FILTER_FE_NIC_INGRESS_B;2912 egress = vlan_fe & HCLGE_FILTER_FE_NIC_EGRESS_B ? 1 : 0;2913 ret = hclge_get_port_vlan_filter_bypass_state(hdev, i, &bypass);2914 if (ret)2915 return ret;2916 j = 0;2917 result[j++] = hclge_dbg_get_func_id_str(str_id, i);2918 result[j++] = state_str[ingress];2919 result[j++] = state_str[egress];2920 result[j++] =2921 test_bit(HNAE3_DEV_SUPPORT_PORT_VLAN_BYPASS_B,2922 hdev->ae_dev->caps) ? state_str[bypass] : "NA";2923 hclge_dbg_fill_content(content, sizeof(content),2924 vlan_filter_items, result,2925 ARRAY_SIZE(vlan_filter_items));2926 *pos += scnprintf(buf + *pos, len - *pos, "%s", content);2927 }2928 *pos += scnprintf(buf + *pos, len - *pos, "\n");2929 2930 return 0;2931}2932 2933static int hclge_dbg_dump_vlan_offload_config(struct hclge_dev *hdev, char *buf,2934 int len, int *pos)2935{2936 char str_id[HCLGE_DBG_ID_LEN], str_pvid[HCLGE_DBG_ID_LEN];2937 const char *result[ARRAY_SIZE(vlan_offload_items)];2938 char content[HCLGE_DBG_VLAN_OFFLOAD_INFO_LEN];2939 u8 func_num = pci_num_vf(hdev->pdev) + 1; /* pf and enabled vf num */2940 struct hclge_dbg_vlan_cfg vlan_cfg;2941 int ret;2942 u8 i, j;2943 2944 hclge_dbg_fill_content(content, sizeof(content), vlan_offload_items,2945 NULL, ARRAY_SIZE(vlan_offload_items));2946 *pos += scnprintf(buf + *pos, len - *pos, "%s", content);2947 2948 for (i = 0; i < func_num; i++) {2949 ret = hclge_get_vlan_tx_offload_cfg(hdev, i, &vlan_cfg);2950 if (ret)2951 return ret;2952 2953 ret = hclge_get_vlan_rx_offload_cfg(hdev, i, &vlan_cfg);2954 if (ret)2955 return ret;2956 2957 sprintf(str_pvid, "%u", vlan_cfg.pvid);2958 j = 0;2959 result[j++] = hclge_dbg_get_func_id_str(str_id, i);2960 result[j++] = str_pvid;2961 result[j++] = state_str[vlan_cfg.accept_tag1];2962 result[j++] = state_str[vlan_cfg.accept_tag2];2963 result[j++] = state_str[vlan_cfg.accept_untag1];2964 result[j++] = state_str[vlan_cfg.accept_untag2];2965 result[j++] = state_str[vlan_cfg.insert_tag1];2966 result[j++] = state_str[vlan_cfg.insert_tag2];2967 result[j++] = state_str[vlan_cfg.shift_tag];2968 result[j++] = state_str[vlan_cfg.strip_tag1];2969 result[j++] = state_str[vlan_cfg.strip_tag2];2970 result[j++] = state_str[vlan_cfg.drop_tag1];2971 result[j++] = state_str[vlan_cfg.drop_tag2];2972 result[j++] = state_str[vlan_cfg.pri_only1];2973 result[j++] = state_str[vlan_cfg.pri_only2];2974 2975 hclge_dbg_fill_content(content, sizeof(content),2976 vlan_offload_items, result,2977 ARRAY_SIZE(vlan_offload_items));2978 *pos += scnprintf(buf + *pos, len - *pos, "%s", content);2979 }2980 2981 return 0;2982}2983 2984static int hclge_dbg_dump_vlan_config(struct hclge_dev *hdev, char *buf,2985 int len)2986{2987 int pos = 0;2988 int ret;2989 2990 ret = hclge_dbg_dump_vlan_filter_config(hdev, buf, len, &pos);2991 if (ret)2992 return ret;2993 2994 return hclge_dbg_dump_vlan_offload_config(hdev, buf, len, &pos);2995}2996 2997static int hclge_dbg_dump_ptp_info(struct hclge_dev *hdev, char *buf, int len)2998{2999 struct hclge_ptp *ptp = hdev->ptp;3000 u32 sw_cfg = ptp->ptp_cfg;3001 unsigned int tx_start;3002 unsigned int last_rx;3003 int pos = 0;3004 u32 hw_cfg;3005 int ret;3006 3007 pos += scnprintf(buf + pos, len - pos, "phc %s's debug info:\n",3008 ptp->info.name);3009 pos += scnprintf(buf + pos, len - pos, "ptp enable: %s\n",3010 test_bit(HCLGE_PTP_FLAG_EN, &ptp->flags) ?3011 "yes" : "no");3012 pos += scnprintf(buf + pos, len - pos, "ptp tx enable: %s\n",3013 test_bit(HCLGE_PTP_FLAG_TX_EN, &ptp->flags) ?3014 "yes" : "no");3015 pos += scnprintf(buf + pos, len - pos, "ptp rx enable: %s\n",3016 test_bit(HCLGE_PTP_FLAG_RX_EN, &ptp->flags) ?3017 "yes" : "no");3018 3019 last_rx = jiffies_to_msecs(ptp->last_rx);3020 pos += scnprintf(buf + pos, len - pos, "last rx time: %lu.%lu\n",3021 last_rx / MSEC_PER_SEC, last_rx % MSEC_PER_SEC);3022 pos += scnprintf(buf + pos, len - pos, "rx count: %lu\n", ptp->rx_cnt);3023 3024 tx_start = jiffies_to_msecs(ptp->tx_start);3025 pos += scnprintf(buf + pos, len - pos, "last tx start time: %lu.%lu\n",3026 tx_start / MSEC_PER_SEC, tx_start % MSEC_PER_SEC);3027 pos += scnprintf(buf + pos, len - pos, "tx count: %lu\n", ptp->tx_cnt);3028 pos += scnprintf(buf + pos, len - pos, "tx skipped count: %lu\n",3029 ptp->tx_skipped);3030 pos += scnprintf(buf + pos, len - pos, "tx timeout count: %lu\n",3031 ptp->tx_timeout);3032 pos += scnprintf(buf + pos, len - pos, "last tx seqid: %u\n",3033 ptp->last_tx_seqid);3034 3035 ret = hclge_ptp_cfg_qry(hdev, &hw_cfg);3036 if (ret)3037 return ret;3038 3039 pos += scnprintf(buf + pos, len - pos, "sw_cfg: %#x, hw_cfg: %#x\n",3040 sw_cfg, hw_cfg);3041 3042 pos += scnprintf(buf + pos, len - pos, "tx type: %d, rx filter: %d\n",3043 ptp->ts_cfg.tx_type, ptp->ts_cfg.rx_filter);3044 3045 return 0;3046}3047 3048static int hclge_dbg_dump_mac_uc(struct hclge_dev *hdev, char *buf, int len)3049{3050 hclge_dbg_dump_mac_list(hdev, buf, len, true);3051 3052 return 0;3053}3054 3055static int hclge_dbg_dump_mac_mc(struct hclge_dev *hdev, char *buf, int len)3056{3057 hclge_dbg_dump_mac_list(hdev, buf, len, false);3058 3059 return 0;3060}3061 3062static const struct hclge_dbg_func hclge_dbg_cmd_func[] = {3063 {3064 .cmd = HNAE3_DBG_CMD_TM_NODES,3065 .dbg_dump = hclge_dbg_dump_tm_nodes,3066 },3067 {3068 .cmd = HNAE3_DBG_CMD_TM_PRI,3069 .dbg_dump = hclge_dbg_dump_tm_pri,3070 },3071 {3072 .cmd = HNAE3_DBG_CMD_TM_QSET,3073 .dbg_dump = hclge_dbg_dump_tm_qset,3074 },3075 {3076 .cmd = HNAE3_DBG_CMD_TM_MAP,3077 .dbg_dump = hclge_dbg_dump_tm_map,3078 },3079 {3080 .cmd = HNAE3_DBG_CMD_TM_PG,3081 .dbg_dump = hclge_dbg_dump_tm_pg,3082 },3083 {3084 .cmd = HNAE3_DBG_CMD_TM_PORT,3085 .dbg_dump = hclge_dbg_dump_tm_port,3086 },3087 {3088 .cmd = HNAE3_DBG_CMD_TC_SCH_INFO,3089 .dbg_dump = hclge_dbg_dump_tc,3090 },3091 {3092 .cmd = HNAE3_DBG_CMD_QOS_PAUSE_CFG,3093 .dbg_dump = hclge_dbg_dump_qos_pause_cfg,3094 },3095 {3096 .cmd = HNAE3_DBG_CMD_QOS_PRI_MAP,3097 .dbg_dump = hclge_dbg_dump_qos_pri_map,3098 },3099 {3100 .cmd = HNAE3_DBG_CMD_QOS_DSCP_MAP,3101 .dbg_dump = hclge_dbg_dump_qos_dscp_map,3102 },3103 {3104 .cmd = HNAE3_DBG_CMD_QOS_BUF_CFG,3105 .dbg_dump = hclge_dbg_dump_qos_buf_cfg,3106 },3107 {3108 .cmd = HNAE3_DBG_CMD_MAC_UC,3109 .dbg_dump = hclge_dbg_dump_mac_uc,3110 },3111 {3112 .cmd = HNAE3_DBG_CMD_MAC_MC,3113 .dbg_dump = hclge_dbg_dump_mac_mc,3114 },3115 {3116 .cmd = HNAE3_DBG_CMD_MNG_TBL,3117 .dbg_dump = hclge_dbg_dump_mng_table,3118 },3119 {3120 .cmd = HNAE3_DBG_CMD_LOOPBACK,3121 .dbg_dump = hclge_dbg_dump_loopback,3122 },3123 {3124 .cmd = HNAE3_DBG_CMD_PTP_INFO,3125 .dbg_dump = hclge_dbg_dump_ptp_info,3126 },3127 {3128 .cmd = HNAE3_DBG_CMD_INTERRUPT_INFO,3129 .dbg_dump = hclge_dbg_dump_interrupt,3130 },3131 {3132 .cmd = HNAE3_DBG_CMD_RESET_INFO,3133 .dbg_dump = hclge_dbg_dump_rst_info,3134 },3135 {3136 .cmd = HNAE3_DBG_CMD_IMP_INFO,3137 .dbg_dump = hclge_dbg_get_imp_stats_info,3138 },3139 {3140 .cmd = HNAE3_DBG_CMD_NCL_CONFIG,3141 .dbg_dump = hclge_dbg_dump_ncl_config,3142 },3143 {3144 .cmd = HNAE3_DBG_CMD_REG_BIOS_COMMON,3145 .dbg_dump_reg = hclge_dbg_dump_reg_cmd,3146 },3147 {3148 .cmd = HNAE3_DBG_CMD_REG_SSU,3149 .dbg_dump_reg = hclge_dbg_dump_reg_cmd,3150 },3151 {3152 .cmd = HNAE3_DBG_CMD_REG_IGU_EGU,3153 .dbg_dump_reg = hclge_dbg_dump_reg_cmd,3154 },3155 {3156 .cmd = HNAE3_DBG_CMD_REG_RPU,3157 .dbg_dump_reg = hclge_dbg_dump_reg_cmd,3158 },3159 {3160 .cmd = HNAE3_DBG_CMD_REG_NCSI,3161 .dbg_dump_reg = hclge_dbg_dump_reg_cmd,3162 },3163 {3164 .cmd = HNAE3_DBG_CMD_REG_RTC,3165 .dbg_dump_reg = hclge_dbg_dump_reg_cmd,3166 },3167 {3168 .cmd = HNAE3_DBG_CMD_REG_PPP,3169 .dbg_dump_reg = hclge_dbg_dump_reg_cmd,3170 },3171 {3172 .cmd = HNAE3_DBG_CMD_REG_RCB,3173 .dbg_dump_reg = hclge_dbg_dump_reg_cmd,3174 },3175 {3176 .cmd = HNAE3_DBG_CMD_REG_TQP,3177 .dbg_dump_reg = hclge_dbg_dump_reg_cmd,3178 },3179 {3180 .cmd = HNAE3_DBG_CMD_REG_MAC,3181 .dbg_dump = hclge_dbg_dump_mac,3182 },3183 {3184 .cmd = HNAE3_DBG_CMD_REG_DCB,3185 .dbg_dump = hclge_dbg_dump_dcb,3186 },3187 {3188 .cmd = HNAE3_DBG_CMD_FD_TCAM,3189 .dbg_dump = hclge_dbg_dump_fd_tcam,3190 },3191 {3192 .cmd = HNAE3_DBG_CMD_MAC_TNL_STATUS,3193 .dbg_dump = hclge_dbg_dump_mac_tnl_status,3194 },3195 {3196 .cmd = HNAE3_DBG_CMD_SERV_INFO,3197 .dbg_dump = hclge_dbg_dump_serv_info,3198 },3199 {3200 .cmd = HNAE3_DBG_CMD_VLAN_CONFIG,3201 .dbg_dump = hclge_dbg_dump_vlan_config,3202 },3203 {3204 .cmd = HNAE3_DBG_CMD_FD_COUNTER,3205 .dbg_dump = hclge_dbg_dump_fd_counter,3206 },3207 {3208 .cmd = HNAE3_DBG_CMD_UMV_INFO,3209 .dbg_dump = hclge_dbg_dump_umv_info,3210 },3211};3212 3213int hclge_dbg_read_cmd(struct hnae3_handle *handle, enum hnae3_dbg_cmd cmd,3214 char *buf, int len)3215{3216 struct hclge_vport *vport = hclge_get_vport(handle);3217 const struct hclge_dbg_func *cmd_func;3218 struct hclge_dev *hdev = vport->back;3219 u32 i;3220 3221 for (i = 0; i < ARRAY_SIZE(hclge_dbg_cmd_func); i++) {3222 if (cmd == hclge_dbg_cmd_func[i].cmd) {3223 cmd_func = &hclge_dbg_cmd_func[i];3224 if (cmd_func->dbg_dump)3225 return cmd_func->dbg_dump(hdev, buf, len);3226 else3227 return cmd_func->dbg_dump_reg(hdev, cmd, buf,3228 len);3229 }3230 }3231 3232 dev_err(&hdev->pdev->dev, "invalid command(%d)\n", cmd);3233 return -EINVAL;3234}3235