1b2292360Sliuzhongzhu // SPDX-License-Identifier: GPL-2.0+
2b2292360Sliuzhongzhu /* Copyright (c) 2018-2019 Hisilicon Limited. */
3b2292360Sliuzhongzhu 
4b2292360Sliuzhongzhu #include <linux/debugfs.h>
5b2292360Sliuzhongzhu #include <linux/device.h>
6b2292360Sliuzhongzhu 
7b2292360Sliuzhongzhu #include "hnae3.h"
85e69ea7eSYufeng Mo #include "hns3_debugfs.h"
9b2292360Sliuzhongzhu #include "hns3_enet.h"
10b2292360Sliuzhongzhu 
11b2292360Sliuzhongzhu static struct dentry *hns3_dbgfs_root;
12b2292360Sliuzhongzhu 
135e69ea7eSYufeng Mo static struct hns3_dbg_dentry_info hns3_dbg_dentry[] = {
145e69ea7eSYufeng Mo 	{
155e69ea7eSYufeng Mo 		.name = "tm"
165e69ea7eSYufeng Mo 	},
1777e91848SHuazhong Tan 	{
1877e91848SHuazhong Tan 		.name = "tx_bd_info"
1977e91848SHuazhong Tan 	},
2077e91848SHuazhong Tan 	{
2177e91848SHuazhong Tan 		.name = "rx_bd_info"
2277e91848SHuazhong Tan 	},
231556ea91SHuazhong Tan 	{
241556ea91SHuazhong Tan 		.name = "mac_list"
251556ea91SHuazhong Tan 	},
26d96b0e59SYufeng Mo 	{
27d96b0e59SYufeng Mo 		.name = "reg"
28d96b0e59SYufeng Mo 	},
29*d2f737cfSHao Chen 	{
30*d2f737cfSHao Chen 		.name = "queue"
31*d2f737cfSHao Chen 	},
325e69ea7eSYufeng Mo 	/* keep common at the bottom and add new directory above */
335e69ea7eSYufeng Mo 	{
345e69ea7eSYufeng Mo 		.name = "common"
355e69ea7eSYufeng Mo 	},
365e69ea7eSYufeng Mo };
375e69ea7eSYufeng Mo 
3877e91848SHuazhong Tan static int hns3_dbg_bd_file_init(struct hnae3_handle *handle, unsigned int cmd);
395e69ea7eSYufeng Mo static int hns3_dbg_common_file_init(struct hnae3_handle *handle,
405e69ea7eSYufeng Mo 				     unsigned int cmd);
415e69ea7eSYufeng Mo 
425e69ea7eSYufeng Mo static struct hns3_dbg_cmd_info hns3_dbg_cmd[] = {
435e69ea7eSYufeng Mo 	{
445e69ea7eSYufeng Mo 		.name = "tm_nodes",
455e69ea7eSYufeng Mo 		.cmd = HNAE3_DBG_CMD_TM_NODES,
465e69ea7eSYufeng Mo 		.dentry = HNS3_DBG_DENTRY_TM,
475e69ea7eSYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
485e69ea7eSYufeng Mo 		.init = hns3_dbg_common_file_init,
495e69ea7eSYufeng Mo 	},
505e69ea7eSYufeng Mo 	{
515e69ea7eSYufeng Mo 		.name = "tm_priority",
525e69ea7eSYufeng Mo 		.cmd = HNAE3_DBG_CMD_TM_PRI,
535e69ea7eSYufeng Mo 		.dentry = HNS3_DBG_DENTRY_TM,
545e69ea7eSYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
555e69ea7eSYufeng Mo 		.init = hns3_dbg_common_file_init,
565e69ea7eSYufeng Mo 	},
575e69ea7eSYufeng Mo 	{
585e69ea7eSYufeng Mo 		.name = "tm_qset",
595e69ea7eSYufeng Mo 		.cmd = HNAE3_DBG_CMD_TM_QSET,
605e69ea7eSYufeng Mo 		.dentry = HNS3_DBG_DENTRY_TM,
615e69ea7eSYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
625e69ea7eSYufeng Mo 		.init = hns3_dbg_common_file_init,
635e69ea7eSYufeng Mo 	},
64c929bc2aSJiaran Zhang 	{
65c929bc2aSJiaran Zhang 		.name = "dev_info",
66c929bc2aSJiaran Zhang 		.cmd = HNAE3_DBG_CMD_DEV_INFO,
67c929bc2aSJiaran Zhang 		.dentry = HNS3_DBG_DENTRY_COMMON,
68c929bc2aSJiaran Zhang 		.buf_len = HNS3_DBG_READ_LEN,
69c929bc2aSJiaran Zhang 		.init = hns3_dbg_common_file_init,
70c929bc2aSJiaran Zhang 	},
7177e91848SHuazhong Tan 	{
7277e91848SHuazhong Tan 		.name = "tx_bd_queue",
7377e91848SHuazhong Tan 		.cmd = HNAE3_DBG_CMD_TX_BD,
7477e91848SHuazhong Tan 		.dentry = HNS3_DBG_DENTRY_TX_BD,
7577e91848SHuazhong Tan 		.buf_len = HNS3_DBG_READ_LEN_4MB,
7677e91848SHuazhong Tan 		.init = hns3_dbg_bd_file_init,
7777e91848SHuazhong Tan 	},
7877e91848SHuazhong Tan 	{
7977e91848SHuazhong Tan 		.name = "rx_bd_queue",
8077e91848SHuazhong Tan 		.cmd = HNAE3_DBG_CMD_RX_BD,
8177e91848SHuazhong Tan 		.dentry = HNS3_DBG_DENTRY_RX_BD,
8277e91848SHuazhong Tan 		.buf_len = HNS3_DBG_READ_LEN_4MB,
8377e91848SHuazhong Tan 		.init = hns3_dbg_bd_file_init,
8477e91848SHuazhong Tan 	},
851556ea91SHuazhong Tan 	{
861556ea91SHuazhong Tan 		.name = "uc",
871556ea91SHuazhong Tan 		.cmd = HNAE3_DBG_CMD_MAC_UC,
881556ea91SHuazhong Tan 		.dentry = HNS3_DBG_DENTRY_MAC,
891556ea91SHuazhong Tan 		.buf_len = HNS3_DBG_READ_LEN,
901556ea91SHuazhong Tan 		.init = hns3_dbg_common_file_init,
911556ea91SHuazhong Tan 	},
921556ea91SHuazhong Tan 	{
931556ea91SHuazhong Tan 		.name = "mc",
941556ea91SHuazhong Tan 		.cmd = HNAE3_DBG_CMD_MAC_MC,
951556ea91SHuazhong Tan 		.dentry = HNS3_DBG_DENTRY_MAC,
961556ea91SHuazhong Tan 		.buf_len = HNS3_DBG_READ_LEN,
971556ea91SHuazhong Tan 		.init = hns3_dbg_common_file_init,
981556ea91SHuazhong Tan 	},
998ddfd9c4SYufeng Mo 	{
1008ddfd9c4SYufeng Mo 		.name = "mng_tbl",
1018ddfd9c4SYufeng Mo 		.cmd = HNAE3_DBG_CMD_MNG_TBL,
1028ddfd9c4SYufeng Mo 		.dentry = HNS3_DBG_DENTRY_COMMON,
1038ddfd9c4SYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
1048ddfd9c4SYufeng Mo 		.init = hns3_dbg_common_file_init,
1058ddfd9c4SYufeng Mo 	},
106d658ff34SYufeng Mo 	{
107d658ff34SYufeng Mo 		.name = "loopback",
108d658ff34SYufeng Mo 		.cmd = HNAE3_DBG_CMD_LOOPBACK,
109d658ff34SYufeng Mo 		.dentry = HNS3_DBG_DENTRY_COMMON,
110d658ff34SYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
111d658ff34SYufeng Mo 		.init = hns3_dbg_common_file_init,
112d658ff34SYufeng Mo 	},
1139149ca0fSJiaran Zhang 	{
1149149ca0fSJiaran Zhang 		.name = "interrupt_info",
1159149ca0fSJiaran Zhang 		.cmd = HNAE3_DBG_CMD_INTERRUPT_INFO,
1169149ca0fSJiaran Zhang 		.dentry = HNS3_DBG_DENTRY_COMMON,
1179149ca0fSJiaran Zhang 		.buf_len = HNS3_DBG_READ_LEN,
1189149ca0fSJiaran Zhang 		.init = hns3_dbg_common_file_init,
1199149ca0fSJiaran Zhang 	},
1201a7ff828SJiaran Zhang 	{
1211a7ff828SJiaran Zhang 		.name = "reset_info",
1221a7ff828SJiaran Zhang 		.cmd = HNAE3_DBG_CMD_RESET_INFO,
1231a7ff828SJiaran Zhang 		.dentry = HNS3_DBG_DENTRY_COMMON,
1241a7ff828SJiaran Zhang 		.buf_len = HNS3_DBG_READ_LEN,
1251a7ff828SJiaran Zhang 		.init = hns3_dbg_common_file_init,
1261a7ff828SJiaran Zhang 	},
1270b198b0dSJiaran Zhang 	{
1280b198b0dSJiaran Zhang 		.name = "imp_info",
1290b198b0dSJiaran Zhang 		.cmd = HNAE3_DBG_CMD_IMP_INFO,
1300b198b0dSJiaran Zhang 		.dentry = HNS3_DBG_DENTRY_COMMON,
1310b198b0dSJiaran Zhang 		.buf_len = HNS3_DBG_READ_LEN,
1320b198b0dSJiaran Zhang 		.init = hns3_dbg_common_file_init,
1330b198b0dSJiaran Zhang 	},
134e76e6886SJiaran Zhang 	{
135e76e6886SJiaran Zhang 		.name = "ncl_config",
136e76e6886SJiaran Zhang 		.cmd = HNAE3_DBG_CMD_NCL_CONFIG,
137e76e6886SJiaran Zhang 		.dentry = HNS3_DBG_DENTRY_COMMON,
138e76e6886SJiaran Zhang 		.buf_len = HNS3_DBG_READ_LEN_128KB,
139e76e6886SJiaran Zhang 		.init = hns3_dbg_common_file_init,
140e76e6886SJiaran Zhang 	},
141d96b0e59SYufeng Mo 	{
142d96b0e59SYufeng Mo 		.name = "bios_common",
143d96b0e59SYufeng Mo 		.cmd = HNAE3_DBG_CMD_REG_BIOS_COMMON,
144d96b0e59SYufeng Mo 		.dentry = HNS3_DBG_DENTRY_REG,
145d96b0e59SYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
146d96b0e59SYufeng Mo 		.init = hns3_dbg_common_file_init,
147d96b0e59SYufeng Mo 	},
148d96b0e59SYufeng Mo 	{
149d96b0e59SYufeng Mo 		.name = "ssu",
150d96b0e59SYufeng Mo 		.cmd = HNAE3_DBG_CMD_REG_SSU,
151d96b0e59SYufeng Mo 		.dentry = HNS3_DBG_DENTRY_REG,
152d96b0e59SYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
153d96b0e59SYufeng Mo 		.init = hns3_dbg_common_file_init,
154d96b0e59SYufeng Mo 	},
155d96b0e59SYufeng Mo 	{
156d96b0e59SYufeng Mo 		.name = "igu_egu",
157d96b0e59SYufeng Mo 		.cmd = HNAE3_DBG_CMD_REG_IGU_EGU,
158d96b0e59SYufeng Mo 		.dentry = HNS3_DBG_DENTRY_REG,
159d96b0e59SYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
160d96b0e59SYufeng Mo 		.init = hns3_dbg_common_file_init,
161d96b0e59SYufeng Mo 	},
162d96b0e59SYufeng Mo 	{
163d96b0e59SYufeng Mo 		.name = "rpu",
164d96b0e59SYufeng Mo 		.cmd = HNAE3_DBG_CMD_REG_RPU,
165d96b0e59SYufeng Mo 		.dentry = HNS3_DBG_DENTRY_REG,
166d96b0e59SYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
167d96b0e59SYufeng Mo 		.init = hns3_dbg_common_file_init,
168d96b0e59SYufeng Mo 	},
169d96b0e59SYufeng Mo 	{
170d96b0e59SYufeng Mo 		.name = "ncsi",
171d96b0e59SYufeng Mo 		.cmd = HNAE3_DBG_CMD_REG_NCSI,
172d96b0e59SYufeng Mo 		.dentry = HNS3_DBG_DENTRY_REG,
173d96b0e59SYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
174d96b0e59SYufeng Mo 		.init = hns3_dbg_common_file_init,
175d96b0e59SYufeng Mo 	},
176d96b0e59SYufeng Mo 	{
177d96b0e59SYufeng Mo 		.name = "rtc",
178d96b0e59SYufeng Mo 		.cmd = HNAE3_DBG_CMD_REG_RTC,
179d96b0e59SYufeng Mo 		.dentry = HNS3_DBG_DENTRY_REG,
180d96b0e59SYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
181d96b0e59SYufeng Mo 		.init = hns3_dbg_common_file_init,
182d96b0e59SYufeng Mo 	},
183d96b0e59SYufeng Mo 	{
184d96b0e59SYufeng Mo 		.name = "ppp",
185d96b0e59SYufeng Mo 		.cmd = HNAE3_DBG_CMD_REG_PPP,
186d96b0e59SYufeng Mo 		.dentry = HNS3_DBG_DENTRY_REG,
187d96b0e59SYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
188d96b0e59SYufeng Mo 		.init = hns3_dbg_common_file_init,
189d96b0e59SYufeng Mo 	},
190d96b0e59SYufeng Mo 	{
191d96b0e59SYufeng Mo 		.name = "rcb",
192d96b0e59SYufeng Mo 		.cmd = HNAE3_DBG_CMD_REG_RCB,
193d96b0e59SYufeng Mo 		.dentry = HNS3_DBG_DENTRY_REG,
194d96b0e59SYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
195d96b0e59SYufeng Mo 		.init = hns3_dbg_common_file_init,
196d96b0e59SYufeng Mo 	},
197d96b0e59SYufeng Mo 	{
198d96b0e59SYufeng Mo 		.name = "tqp",
199d96b0e59SYufeng Mo 		.cmd = HNAE3_DBG_CMD_REG_TQP,
200d96b0e59SYufeng Mo 		.dentry = HNS3_DBG_DENTRY_REG,
201d96b0e59SYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
202d96b0e59SYufeng Mo 		.init = hns3_dbg_common_file_init,
203d96b0e59SYufeng Mo 	},
204d96b0e59SYufeng Mo 	{
205d96b0e59SYufeng Mo 		.name = "mac",
206d96b0e59SYufeng Mo 		.cmd = HNAE3_DBG_CMD_REG_MAC,
207d96b0e59SYufeng Mo 		.dentry = HNS3_DBG_DENTRY_REG,
208d96b0e59SYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
209d96b0e59SYufeng Mo 		.init = hns3_dbg_common_file_init,
210d96b0e59SYufeng Mo 	},
211365e860aSYufeng Mo 	{
212365e860aSYufeng Mo 		.name = "dcb",
213365e860aSYufeng Mo 		.cmd = HNAE3_DBG_CMD_REG_DCB,
214365e860aSYufeng Mo 		.dentry = HNS3_DBG_DENTRY_REG,
215365e860aSYufeng Mo 		.buf_len = HNS3_DBG_READ_LEN,
216365e860aSYufeng Mo 		.init = hns3_dbg_common_file_init,
217365e860aSYufeng Mo 	},
218*d2f737cfSHao Chen 	{
219*d2f737cfSHao Chen 		.name = "queue_map",
220*d2f737cfSHao Chen 		.cmd = HNAE3_DBG_CMD_QUEUE_MAP,
221*d2f737cfSHao Chen 		.dentry = HNS3_DBG_DENTRY_QUEUE,
222*d2f737cfSHao Chen 		.buf_len = HNS3_DBG_READ_LEN,
223*d2f737cfSHao Chen 		.init = hns3_dbg_common_file_init,
224*d2f737cfSHao Chen 	},
225c929bc2aSJiaran Zhang };
226c929bc2aSJiaran Zhang 
227c929bc2aSJiaran Zhang static struct hns3_dbg_cap_info hns3_dbg_cap[] = {
228c929bc2aSJiaran Zhang 	{
229c929bc2aSJiaran Zhang 		.name = "support FD",
230c929bc2aSJiaran Zhang 		.cap_bit = HNAE3_DEV_SUPPORT_FD_B,
231c929bc2aSJiaran Zhang 	}, {
232c929bc2aSJiaran Zhang 		.name = "support GRO",
233c929bc2aSJiaran Zhang 		.cap_bit = HNAE3_DEV_SUPPORT_GRO_B,
234c929bc2aSJiaran Zhang 	}, {
235c929bc2aSJiaran Zhang 		.name = "support FEC",
236c929bc2aSJiaran Zhang 		.cap_bit = HNAE3_DEV_SUPPORT_FEC_B,
237c929bc2aSJiaran Zhang 	}, {
238c929bc2aSJiaran Zhang 		.name = "support UDP GSO",
239c929bc2aSJiaran Zhang 		.cap_bit = HNAE3_DEV_SUPPORT_UDP_GSO_B,
240c929bc2aSJiaran Zhang 	}, {
241c929bc2aSJiaran Zhang 		.name = "support PTP",
242c929bc2aSJiaran Zhang 		.cap_bit = HNAE3_DEV_SUPPORT_PTP_B,
243c929bc2aSJiaran Zhang 	}, {
244c929bc2aSJiaran Zhang 		.name = "support INT QL",
245c929bc2aSJiaran Zhang 		.cap_bit = HNAE3_DEV_SUPPORT_INT_QL_B,
246c929bc2aSJiaran Zhang 	}, {
247c929bc2aSJiaran Zhang 		.name = "support HW TX csum",
248c929bc2aSJiaran Zhang 		.cap_bit = HNAE3_DEV_SUPPORT_HW_TX_CSUM_B,
249c929bc2aSJiaran Zhang 	}, {
250c929bc2aSJiaran Zhang 		.name = "support UDP tunnel csum",
251c929bc2aSJiaran Zhang 		.cap_bit = HNAE3_DEV_SUPPORT_UDP_TUNNEL_CSUM_B,
252c929bc2aSJiaran Zhang 	}, {
253c929bc2aSJiaran Zhang 		.name = "support TX push",
254c929bc2aSJiaran Zhang 		.cap_bit = HNAE3_DEV_SUPPORT_TX_PUSH_B,
255c929bc2aSJiaran Zhang 	}, {
256c929bc2aSJiaran Zhang 		.name = "support imp-controlled PHY",
257c929bc2aSJiaran Zhang 		.cap_bit = HNAE3_DEV_SUPPORT_PHY_IMP_B,
258c929bc2aSJiaran Zhang 	}, {
259c929bc2aSJiaran Zhang 		.name = "support rxd advanced layout",
260c929bc2aSJiaran Zhang 		.cap_bit = HNAE3_DEV_SUPPORT_RXD_ADV_LAYOUT_B,
261c929bc2aSJiaran Zhang 	},
2625e69ea7eSYufeng Mo };
2635e69ea7eSYufeng Mo 
26477e91848SHuazhong Tan static void hns3_dbg_fill_content(char *content, u16 len,
26577e91848SHuazhong Tan 				  const struct hns3_dbg_item *items,
26677e91848SHuazhong Tan 				  const char **result, u16 size)
26777e91848SHuazhong Tan {
26877e91848SHuazhong Tan 	char *pos = content;
26977e91848SHuazhong Tan 	u16 i;
27077e91848SHuazhong Tan 
27177e91848SHuazhong Tan 	memset(content, ' ', len);
27277e91848SHuazhong Tan 	for (i = 0; i < size; i++) {
27377e91848SHuazhong Tan 		if (result)
27477e91848SHuazhong Tan 			strncpy(pos, result[i], strlen(result[i]));
27577e91848SHuazhong Tan 		else
27677e91848SHuazhong Tan 			strncpy(pos, items[i].name, strlen(items[i].name));
27777e91848SHuazhong Tan 
27877e91848SHuazhong Tan 		pos += strlen(items[i].name) + items[i].interval;
27977e91848SHuazhong Tan 	}
28077e91848SHuazhong Tan 
28177e91848SHuazhong Tan 	*pos++ = '\n';
28277e91848SHuazhong Tan 	*pos++ = '\0';
28377e91848SHuazhong Tan }
28477e91848SHuazhong Tan 
285ebaf1908SWeihang Li static int hns3_dbg_queue_info(struct hnae3_handle *h,
286ebaf1908SWeihang Li 			       const char *cmd_buf)
28757ceee2cSliuzhongzhu {
288dbaae5bbSGuangbin Huang 	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
28957ceee2cSliuzhongzhu 	struct hns3_nic_priv *priv = h->priv;
29057ceee2cSliuzhongzhu 	struct hns3_enet_ring *ring;
29157ceee2cSliuzhongzhu 	u32 base_add_l, base_add_h;
29257ceee2cSliuzhongzhu 	u32 queue_num, queue_max;
2939d8d5a36SYufeng Mo 	u32 value, i;
29457ceee2cSliuzhongzhu 	int cnt;
29557ceee2cSliuzhongzhu 
2965f06b903SYunsheng Lin 	if (!priv->ring) {
2975f06b903SYunsheng Lin 		dev_err(&h->pdev->dev, "priv->ring is NULL\n");
29857ceee2cSliuzhongzhu 		return -EFAULT;
29957ceee2cSliuzhongzhu 	}
30057ceee2cSliuzhongzhu 
30157ceee2cSliuzhongzhu 	queue_max = h->kinfo.num_tqps;
30257ceee2cSliuzhongzhu 	cnt = kstrtouint(&cmd_buf[11], 0, &queue_num);
30357ceee2cSliuzhongzhu 	if (cnt)
30457ceee2cSliuzhongzhu 		queue_num = 0;
30557ceee2cSliuzhongzhu 	else
30657ceee2cSliuzhongzhu 		queue_max = queue_num + 1;
30757ceee2cSliuzhongzhu 
30857ceee2cSliuzhongzhu 	dev_info(&h->pdev->dev, "queue info\n");
30957ceee2cSliuzhongzhu 
31057ceee2cSliuzhongzhu 	if (queue_num >= h->kinfo.num_tqps) {
31157ceee2cSliuzhongzhu 		dev_err(&h->pdev->dev,
312ed5b255bSYufeng Mo 			"Queue number(%u) is out of range(0-%u)\n", queue_num,
31357ceee2cSliuzhongzhu 			h->kinfo.num_tqps - 1);
31457ceee2cSliuzhongzhu 		return -EINVAL;
31557ceee2cSliuzhongzhu 	}
31657ceee2cSliuzhongzhu 
31757ceee2cSliuzhongzhu 	for (i = queue_num; i < queue_max; i++) {
31857ceee2cSliuzhongzhu 		/* Each cycle needs to determine whether the instance is reset,
31957ceee2cSliuzhongzhu 		 * to prevent reference to invalid memory. And need to ensure
32057ceee2cSliuzhongzhu 		 * that the following code is executed within 100ms.
32157ceee2cSliuzhongzhu 		 */
3227737f1fbSliuzhongzhu 		if (!test_bit(HNS3_NIC_STATE_INITED, &priv->state) ||
32357ceee2cSliuzhongzhu 		    test_bit(HNS3_NIC_STATE_RESETTING, &priv->state))
32457ceee2cSliuzhongzhu 			return -EPERM;
32557ceee2cSliuzhongzhu 
3265f06b903SYunsheng Lin 		ring = &priv->ring[(u32)(i + h->kinfo.num_tqps)];
32757ceee2cSliuzhongzhu 		base_add_h = readl_relaxed(ring->tqp->io_base +
32857ceee2cSliuzhongzhu 					   HNS3_RING_RX_RING_BASEADDR_H_REG);
32957ceee2cSliuzhongzhu 		base_add_l = readl_relaxed(ring->tqp->io_base +
33057ceee2cSliuzhongzhu 					   HNS3_RING_RX_RING_BASEADDR_L_REG);
331adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "RX(%u) BASE ADD: 0x%08x%08x\n", i,
33257ceee2cSliuzhongzhu 			 base_add_h, base_add_l);
33357ceee2cSliuzhongzhu 
33457ceee2cSliuzhongzhu 		value = readl_relaxed(ring->tqp->io_base +
33557ceee2cSliuzhongzhu 				      HNS3_RING_RX_RING_BD_NUM_REG);
336adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "RX(%u) RING BD NUM: %u\n", i, value);
33757ceee2cSliuzhongzhu 
33857ceee2cSliuzhongzhu 		value = readl_relaxed(ring->tqp->io_base +
33957ceee2cSliuzhongzhu 				      HNS3_RING_RX_RING_BD_LEN_REG);
340adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "RX(%u) RING BD LEN: %u\n", i, value);
34157ceee2cSliuzhongzhu 
34257ceee2cSliuzhongzhu 		value = readl_relaxed(ring->tqp->io_base +
34357ceee2cSliuzhongzhu 				      HNS3_RING_RX_RING_TAIL_REG);
344adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "RX(%u) RING TAIL: %u\n", i, value);
34557ceee2cSliuzhongzhu 
34657ceee2cSliuzhongzhu 		value = readl_relaxed(ring->tqp->io_base +
34757ceee2cSliuzhongzhu 				      HNS3_RING_RX_RING_HEAD_REG);
348adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "RX(%u) RING HEAD: %u\n", i, value);
34957ceee2cSliuzhongzhu 
35057ceee2cSliuzhongzhu 		value = readl_relaxed(ring->tqp->io_base +
35157ceee2cSliuzhongzhu 				      HNS3_RING_RX_RING_FBDNUM_REG);
352adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "RX(%u) RING FBDNUM: %u\n", i, value);
35357ceee2cSliuzhongzhu 
35457ceee2cSliuzhongzhu 		value = readl_relaxed(ring->tqp->io_base +
35557ceee2cSliuzhongzhu 				      HNS3_RING_RX_RING_PKTNUM_RECORD_REG);
356adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "RX(%u) RING PKTNUM: %u\n", i, value);
35757ceee2cSliuzhongzhu 
3585f06b903SYunsheng Lin 		ring = &priv->ring[i];
35957ceee2cSliuzhongzhu 		base_add_h = readl_relaxed(ring->tqp->io_base +
36057ceee2cSliuzhongzhu 					   HNS3_RING_TX_RING_BASEADDR_H_REG);
36157ceee2cSliuzhongzhu 		base_add_l = readl_relaxed(ring->tqp->io_base +
36257ceee2cSliuzhongzhu 					   HNS3_RING_TX_RING_BASEADDR_L_REG);
363adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "TX(%u) BASE ADD: 0x%08x%08x\n", i,
36457ceee2cSliuzhongzhu 			 base_add_h, base_add_l);
36557ceee2cSliuzhongzhu 
36657ceee2cSliuzhongzhu 		value = readl_relaxed(ring->tqp->io_base +
36757ceee2cSliuzhongzhu 				      HNS3_RING_TX_RING_BD_NUM_REG);
368adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "TX(%u) RING BD NUM: %u\n", i, value);
36957ceee2cSliuzhongzhu 
37057ceee2cSliuzhongzhu 		value = readl_relaxed(ring->tqp->io_base +
37157ceee2cSliuzhongzhu 				      HNS3_RING_TX_RING_TC_REG);
372adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "TX(%u) RING TC: %u\n", i, value);
37357ceee2cSliuzhongzhu 
37457ceee2cSliuzhongzhu 		value = readl_relaxed(ring->tqp->io_base +
37557ceee2cSliuzhongzhu 				      HNS3_RING_TX_RING_TAIL_REG);
376adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "TX(%u) RING TAIL: %u\n", i, value);
37757ceee2cSliuzhongzhu 
37857ceee2cSliuzhongzhu 		value = readl_relaxed(ring->tqp->io_base +
37957ceee2cSliuzhongzhu 				      HNS3_RING_TX_RING_HEAD_REG);
380adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "TX(%u) RING HEAD: %u\n", i, value);
38157ceee2cSliuzhongzhu 
38257ceee2cSliuzhongzhu 		value = readl_relaxed(ring->tqp->io_base +
38357ceee2cSliuzhongzhu 				      HNS3_RING_TX_RING_FBDNUM_REG);
384adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "TX(%u) RING FBDNUM: %u\n", i, value);
38557ceee2cSliuzhongzhu 
38657ceee2cSliuzhongzhu 		value = readl_relaxed(ring->tqp->io_base +
38757ceee2cSliuzhongzhu 				      HNS3_RING_TX_RING_OFFSET_REG);
388adcf738bSGuojia Liao 		dev_info(&h->pdev->dev, "TX(%u) RING OFFSET: %u\n", i, value);
38957ceee2cSliuzhongzhu 
39057ceee2cSliuzhongzhu 		value = readl_relaxed(ring->tqp->io_base +
39157ceee2cSliuzhongzhu 				      HNS3_RING_TX_RING_PKTNUM_RECORD_REG);
392dbaae5bbSGuangbin Huang 		dev_info(&h->pdev->dev, "TX(%u) RING PKTNUM: %u\n", i, value);
393dbaae5bbSGuangbin Huang 
394dbaae5bbSGuangbin Huang 		value = readl_relaxed(ring->tqp->io_base + HNS3_RING_EN_REG);
395dbaae5bbSGuangbin Huang 		dev_info(&h->pdev->dev, "TX/RX(%u) RING EN: %s\n", i,
396dbaae5bbSGuangbin Huang 			 value ? "enable" : "disable");
397dbaae5bbSGuangbin Huang 
398dbaae5bbSGuangbin Huang 		if (hnae3_ae_dev_tqp_txrx_indep_supported(ae_dev)) {
399dbaae5bbSGuangbin Huang 			value = readl_relaxed(ring->tqp->io_base +
400dbaae5bbSGuangbin Huang 					      HNS3_RING_TX_EN_REG);
401dbaae5bbSGuangbin Huang 			dev_info(&h->pdev->dev, "TX(%u) RING EN: %s\n", i,
402dbaae5bbSGuangbin Huang 				 value ? "enable" : "disable");
403dbaae5bbSGuangbin Huang 
404dbaae5bbSGuangbin Huang 			value = readl_relaxed(ring->tqp->io_base +
405dbaae5bbSGuangbin Huang 					      HNS3_RING_RX_EN_REG);
406dbaae5bbSGuangbin Huang 			dev_info(&h->pdev->dev, "RX(%u) RING EN: %s\n", i,
407dbaae5bbSGuangbin Huang 				 value ? "enable" : "disable");
408dbaae5bbSGuangbin Huang 		}
409dbaae5bbSGuangbin Huang 
410dbaae5bbSGuangbin Huang 		dev_info(&h->pdev->dev, "\n");
41157ceee2cSliuzhongzhu 	}
41257ceee2cSliuzhongzhu 
41357ceee2cSliuzhongzhu 	return 0;
41457ceee2cSliuzhongzhu }
41557ceee2cSliuzhongzhu 
416*d2f737cfSHao Chen static const struct hns3_dbg_item queue_map_items[] = {
417*d2f737cfSHao Chen 	{ "local_queue_id", 2 },
418*d2f737cfSHao Chen 	{ "global_queue_id", 2 },
419*d2f737cfSHao Chen 	{ "vector_id", 2 },
420*d2f737cfSHao Chen };
421*d2f737cfSHao Chen 
422*d2f737cfSHao Chen static int hns3_dbg_queue_map(struct hnae3_handle *h, char *buf, int len)
4230c29d191Sliuzhongzhu {
424*d2f737cfSHao Chen 	char data_str[ARRAY_SIZE(queue_map_items)][HNS3_DBG_DATA_STR_LEN];
425*d2f737cfSHao Chen 	char *result[ARRAY_SIZE(queue_map_items)];
4260c29d191Sliuzhongzhu 	struct hns3_nic_priv *priv = h->priv;
427*d2f737cfSHao Chen 	char content[HNS3_DBG_INFO_LEN];
428*d2f737cfSHao Chen 	int pos = 0;
429*d2f737cfSHao Chen 	int j;
430*d2f737cfSHao Chen 	u32 i;
4310c29d191Sliuzhongzhu 
4320c29d191Sliuzhongzhu 	if (!h->ae_algo->ops->get_global_queue_id)
4330c29d191Sliuzhongzhu 		return -EOPNOTSUPP;
4340c29d191Sliuzhongzhu 
435*d2f737cfSHao Chen 	for (i = 0; i < ARRAY_SIZE(queue_map_items); i++)
436*d2f737cfSHao Chen 		result[i] = &data_str[i][0];
4370c29d191Sliuzhongzhu 
438*d2f737cfSHao Chen 	hns3_dbg_fill_content(content, sizeof(content), queue_map_items,
439*d2f737cfSHao Chen 			      NULL, ARRAY_SIZE(queue_map_items));
440*d2f737cfSHao Chen 	pos += scnprintf(buf + pos, len - pos, "%s", content);
441*d2f737cfSHao Chen 	for (i = 0; i < h->kinfo.num_tqps; i++) {
4425f06b903SYunsheng Lin 		if (!priv->ring || !priv->ring[i].tqp_vector)
4430c29d191Sliuzhongzhu 			continue;
444*d2f737cfSHao Chen 		j = 0;
445*d2f737cfSHao Chen 		sprintf(result[j++], "%u", i);
446*d2f737cfSHao Chen 		sprintf(result[j++], "%u",
447*d2f737cfSHao Chen 			h->ae_algo->ops->get_global_queue_id(h, i));
448*d2f737cfSHao Chen 		sprintf(result[j++], "%u",
449*d2f737cfSHao Chen 			priv->ring[i].tqp_vector->vector_irq);
450*d2f737cfSHao Chen 		hns3_dbg_fill_content(content, sizeof(content), queue_map_items,
451*d2f737cfSHao Chen 				      (const char **)result,
452*d2f737cfSHao Chen 				      ARRAY_SIZE(queue_map_items));
453*d2f737cfSHao Chen 		pos += scnprintf(buf + pos, len - pos, "%s", content);
4540c29d191Sliuzhongzhu 	}
4550c29d191Sliuzhongzhu 
4560c29d191Sliuzhongzhu 	return 0;
4570c29d191Sliuzhongzhu }
4580c29d191Sliuzhongzhu 
45977e91848SHuazhong Tan static const struct hns3_dbg_item rx_bd_info_items[] = {
46077e91848SHuazhong Tan 	{ "BD_IDX", 3 },
46177e91848SHuazhong Tan 	{ "L234_INFO", 2 },
46277e91848SHuazhong Tan 	{ "PKT_LEN", 3 },
46377e91848SHuazhong Tan 	{ "SIZE", 4 },
46477e91848SHuazhong Tan 	{ "RSS_HASH", 4 },
46577e91848SHuazhong Tan 	{ "FD_ID", 2 },
46677e91848SHuazhong Tan 	{ "VLAN_TAG", 2 },
46777e91848SHuazhong Tan 	{ "O_DM_VLAN_ID_FB", 2 },
46877e91848SHuazhong Tan 	{ "OT_VLAN_TAG", 2 },
46977e91848SHuazhong Tan 	{ "BD_BASE_INFO", 2 },
47077e91848SHuazhong Tan 	{ "PTYPE", 2 },
47177e91848SHuazhong Tan 	{ "HW_CSUM", 2 },
47277e91848SHuazhong Tan };
47377e91848SHuazhong Tan 
47477e91848SHuazhong Tan static void hns3_dump_rx_bd_info(struct hns3_nic_priv *priv,
47577e91848SHuazhong Tan 				 struct hns3_desc *desc, char **result, int idx)
476122bedc5Sliuzhongzhu {
47777e91848SHuazhong Tan 	unsigned int j = 0;
478122bedc5Sliuzhongzhu 
47977e91848SHuazhong Tan 	sprintf(result[j++], "%5d", idx);
48077e91848SHuazhong Tan 	sprintf(result[j++], "%#x", le32_to_cpu(desc->rx.l234_info));
48177e91848SHuazhong Tan 	sprintf(result[j++], "%7u", le16_to_cpu(desc->rx.pkt_len));
48277e91848SHuazhong Tan 	sprintf(result[j++], "%4u", le16_to_cpu(desc->rx.size));
48377e91848SHuazhong Tan 	sprintf(result[j++], "%#x", le32_to_cpu(desc->rx.rss_hash));
48477e91848SHuazhong Tan 	sprintf(result[j++], "%5u", le16_to_cpu(desc->rx.fd_id));
48577e91848SHuazhong Tan 	sprintf(result[j++], "%8u", le16_to_cpu(desc->rx.vlan_tag));
48677e91848SHuazhong Tan 	sprintf(result[j++], "%15u", le16_to_cpu(desc->rx.o_dm_vlan_id_fb));
48777e91848SHuazhong Tan 	sprintf(result[j++], "%11u", le16_to_cpu(desc->rx.ot_vlan_tag));
48877e91848SHuazhong Tan 	sprintf(result[j++], "%#x", le32_to_cpu(desc->rx.bd_base_info));
48977e91848SHuazhong Tan 	if (test_bit(HNS3_NIC_STATE_RXD_ADV_LAYOUT_ENABLE, &priv->state)) {
49077e91848SHuazhong Tan 		u32 ol_info = le32_to_cpu(desc->rx.ol_info);
491122bedc5Sliuzhongzhu 
49277e91848SHuazhong Tan 		sprintf(result[j++], "%5lu", hnae3_get_field(ol_info,
49377e91848SHuazhong Tan 							     HNS3_RXD_PTYPE_M,
49477e91848SHuazhong Tan 							     HNS3_RXD_PTYPE_S));
49577e91848SHuazhong Tan 		sprintf(result[j++], "%7u", le16_to_cpu(desc->csum));
496b1533adaSHuazhong Tan 	} else {
49777e91848SHuazhong Tan 		sprintf(result[j++], "NA");
49877e91848SHuazhong Tan 		sprintf(result[j++], "NA");
49977e91848SHuazhong Tan 	}
500b1533adaSHuazhong Tan }
501b1533adaSHuazhong Tan 
50277e91848SHuazhong Tan static int hns3_dbg_rx_bd_info(struct hns3_dbg_data *d, char *buf, int len)
50377e91848SHuazhong Tan {
50477e91848SHuazhong Tan 	char data_str[ARRAY_SIZE(rx_bd_info_items)][HNS3_DBG_DATA_STR_LEN];
50577e91848SHuazhong Tan 	struct hns3_nic_priv *priv = d->handle->priv;
50677e91848SHuazhong Tan 	char *result[ARRAY_SIZE(rx_bd_info_items)];
50777e91848SHuazhong Tan 	char content[HNS3_DBG_INFO_LEN];
50877e91848SHuazhong Tan 	struct hns3_enet_ring *ring;
50977e91848SHuazhong Tan 	struct hns3_desc *desc;
51077e91848SHuazhong Tan 	unsigned int i;
51177e91848SHuazhong Tan 	int pos = 0;
512122bedc5Sliuzhongzhu 
51377e91848SHuazhong Tan 	if (d->qid >= d->handle->kinfo.num_tqps) {
51477e91848SHuazhong Tan 		dev_err(&d->handle->pdev->dev,
51577e91848SHuazhong Tan 			"queue%u is not in use\n", d->qid);
51677e91848SHuazhong Tan 		return -EINVAL;
51777e91848SHuazhong Tan 	}
518122bedc5Sliuzhongzhu 
51977e91848SHuazhong Tan 	for (i = 0; i < ARRAY_SIZE(rx_bd_info_items); i++)
52077e91848SHuazhong Tan 		result[i] = &data_str[i][0];
521b1533adaSHuazhong Tan 
52277e91848SHuazhong Tan 	pos += scnprintf(buf + pos, len - pos,
52377e91848SHuazhong Tan 			  "Queue %u rx bd info:\n", d->qid);
52477e91848SHuazhong Tan 	hns3_dbg_fill_content(content, sizeof(content), rx_bd_info_items,
52577e91848SHuazhong Tan 			      NULL, ARRAY_SIZE(rx_bd_info_items));
52677e91848SHuazhong Tan 	pos += scnprintf(buf + pos, len - pos, "%s", content);
52777e91848SHuazhong Tan 
52877e91848SHuazhong Tan 	ring = &priv->ring[d->qid + d->handle->kinfo.num_tqps];
52977e91848SHuazhong Tan 	for (i = 0; i < ring->desc_num; i++) {
53077e91848SHuazhong Tan 		desc = &ring->desc[i];
53177e91848SHuazhong Tan 
53277e91848SHuazhong Tan 		hns3_dump_rx_bd_info(priv, desc, result, i);
53377e91848SHuazhong Tan 		hns3_dbg_fill_content(content, sizeof(content),
53477e91848SHuazhong Tan 				      rx_bd_info_items, (const char **)result,
53577e91848SHuazhong Tan 				      ARRAY_SIZE(rx_bd_info_items));
53677e91848SHuazhong Tan 		pos += scnprintf(buf + pos, len - pos, "%s", content);
53777e91848SHuazhong Tan 	}
53877e91848SHuazhong Tan 
53977e91848SHuazhong Tan 	return 0;
54077e91848SHuazhong Tan }
54177e91848SHuazhong Tan 
54277e91848SHuazhong Tan static const struct hns3_dbg_item tx_bd_info_items[] = {
54377e91848SHuazhong Tan 	{ "BD_IDX", 5 },
54477e91848SHuazhong Tan 	{ "ADDRESS", 2 },
54577e91848SHuazhong Tan 	{ "VLAN_TAG", 2 },
54677e91848SHuazhong Tan 	{ "SIZE", 2 },
54777e91848SHuazhong Tan 	{ "T_CS_VLAN_TSO", 2 },
54877e91848SHuazhong Tan 	{ "OT_VLAN_TAG", 3 },
54977e91848SHuazhong Tan 	{ "TV", 2 },
55077e91848SHuazhong Tan 	{ "OLT_VLAN_LEN", 2},
55177e91848SHuazhong Tan 	{ "PAYLEN_OL4CS", 2},
55277e91848SHuazhong Tan 	{ "BD_FE_SC_VLD", 2},
55377e91848SHuazhong Tan 	{ "MSS_HW_CSUM", 0},
55477e91848SHuazhong Tan };
55577e91848SHuazhong Tan 
55677e91848SHuazhong Tan static void hns3_dump_tx_bd_info(struct hns3_nic_priv *priv,
55777e91848SHuazhong Tan 				 struct hns3_desc *desc, char **result, int idx)
55877e91848SHuazhong Tan {
55977e91848SHuazhong Tan 	unsigned int j = 0;
56077e91848SHuazhong Tan 
56177e91848SHuazhong Tan 	sprintf(result[j++], "%6d", idx);
56277e91848SHuazhong Tan 	sprintf(result[j++], "%#llx", le64_to_cpu(desc->addr));
56377e91848SHuazhong Tan 	sprintf(result[j++], "%5u", le16_to_cpu(desc->tx.vlan_tag));
56477e91848SHuazhong Tan 	sprintf(result[j++], "%5u", le16_to_cpu(desc->tx.send_size));
56577e91848SHuazhong Tan 	sprintf(result[j++], "%#x",
56677e91848SHuazhong Tan 		le32_to_cpu(desc->tx.type_cs_vlan_tso_len));
56777e91848SHuazhong Tan 	sprintf(result[j++], "%5u", le16_to_cpu(desc->tx.outer_vlan_tag));
56877e91848SHuazhong Tan 	sprintf(result[j++], "%5u", le16_to_cpu(desc->tx.tv));
56977e91848SHuazhong Tan 	sprintf(result[j++], "%10u",
57077e91848SHuazhong Tan 		le32_to_cpu(desc->tx.ol_type_vlan_len_msec));
57177e91848SHuazhong Tan 	sprintf(result[j++], "%#x", le32_to_cpu(desc->tx.paylen_ol4cs));
57277e91848SHuazhong Tan 	sprintf(result[j++], "%#x", le16_to_cpu(desc->tx.bdtp_fe_sc_vld_ra_ri));
57377e91848SHuazhong Tan 	sprintf(result[j++], "%5u", le16_to_cpu(desc->tx.mss_hw_csum));
57477e91848SHuazhong Tan }
57577e91848SHuazhong Tan 
57677e91848SHuazhong Tan static int hns3_dbg_tx_bd_info(struct hns3_dbg_data *d, char *buf, int len)
57777e91848SHuazhong Tan {
57877e91848SHuazhong Tan 	char data_str[ARRAY_SIZE(tx_bd_info_items)][HNS3_DBG_DATA_STR_LEN];
57977e91848SHuazhong Tan 	struct hns3_nic_priv *priv = d->handle->priv;
58077e91848SHuazhong Tan 	char *result[ARRAY_SIZE(tx_bd_info_items)];
58177e91848SHuazhong Tan 	char content[HNS3_DBG_INFO_LEN];
58277e91848SHuazhong Tan 	struct hns3_enet_ring *ring;
58377e91848SHuazhong Tan 	struct hns3_desc *desc;
58477e91848SHuazhong Tan 	unsigned int i;
58577e91848SHuazhong Tan 	int pos = 0;
58677e91848SHuazhong Tan 
58777e91848SHuazhong Tan 	if (d->qid >= d->handle->kinfo.num_tqps) {
58877e91848SHuazhong Tan 		dev_err(&d->handle->pdev->dev,
58977e91848SHuazhong Tan 			"queue%u is not in use\n", d->qid);
59077e91848SHuazhong Tan 		return -EINVAL;
59177e91848SHuazhong Tan 	}
59277e91848SHuazhong Tan 
59377e91848SHuazhong Tan 	for (i = 0; i < ARRAY_SIZE(tx_bd_info_items); i++)
59477e91848SHuazhong Tan 		result[i] = &data_str[i][0];
59577e91848SHuazhong Tan 
59677e91848SHuazhong Tan 	pos += scnprintf(buf + pos, len - pos,
59777e91848SHuazhong Tan 			  "Queue %u tx bd info:\n", d->qid);
59877e91848SHuazhong Tan 	hns3_dbg_fill_content(content, sizeof(content), tx_bd_info_items,
59977e91848SHuazhong Tan 			      NULL, ARRAY_SIZE(tx_bd_info_items));
60077e91848SHuazhong Tan 	pos += scnprintf(buf + pos, len - pos, "%s", content);
60177e91848SHuazhong Tan 
60277e91848SHuazhong Tan 	ring = &priv->ring[d->qid];
60377e91848SHuazhong Tan 	for (i = 0; i < ring->desc_num; i++) {
60477e91848SHuazhong Tan 		desc = &ring->desc[i];
60577e91848SHuazhong Tan 
60677e91848SHuazhong Tan 		hns3_dump_tx_bd_info(priv, desc, result, i);
60777e91848SHuazhong Tan 		hns3_dbg_fill_content(content, sizeof(content),
60877e91848SHuazhong Tan 				      tx_bd_info_items, (const char **)result,
60977e91848SHuazhong Tan 				      ARRAY_SIZE(tx_bd_info_items));
61077e91848SHuazhong Tan 		pos += scnprintf(buf + pos, len - pos, "%s", content);
61177e91848SHuazhong Tan 	}
612122bedc5Sliuzhongzhu 
613122bedc5Sliuzhongzhu 	return 0;
614122bedc5Sliuzhongzhu }
615122bedc5Sliuzhongzhu 
616b2292360Sliuzhongzhu static void hns3_dbg_help(struct hnae3_handle *h)
617b2292360Sliuzhongzhu {
618b2292360Sliuzhongzhu 	dev_info(&h->pdev->dev, "available commands\n");
619ed5b255bSYufeng Mo 	dev_info(&h->pdev->dev, "queue info <number>\n");
62097afd47bSYufeng Mo 
62197afd47bSYufeng Mo 	if (!hns3_is_phys_func(h->pdev))
62297afd47bSYufeng Mo 		return;
62397afd47bSYufeng Mo 
624b2292360Sliuzhongzhu 	dev_info(&h->pdev->dev, "dump fd tcam\n");
6252849d4e7Sliuzhongzhu 	dev_info(&h->pdev->dev, "dump tc\n");
626ed5b255bSYufeng Mo 	dev_info(&h->pdev->dev, "dump tm map <q_num>\n");
62796227f4cSliuzhongzhu 	dev_info(&h->pdev->dev, "dump tm\n");
628d958919dSliuzhongzhu 	dev_info(&h->pdev->dev, "dump qos pause cfg\n");
6296fc22440Sliuzhongzhu 	dev_info(&h->pdev->dev, "dump qos pri map\n");
6307d9d7f88Sliuzhongzhu 	dev_info(&h->pdev->dev, "dump qos buf cfg\n");
631a6345787SWeihang Li 	dev_info(&h->pdev->dev, "dump mac tnl status\n");
63289ec9485SYonglong Liu 	dev_info(&h->pdev->dev, "dump qs shaper [qs id]\n");
633b2292360Sliuzhongzhu }
634b2292360Sliuzhongzhu 
635c929bc2aSJiaran Zhang static void
636c929bc2aSJiaran Zhang hns3_dbg_dev_caps(struct hnae3_handle *h, char *buf, int len, int *pos)
6379484e337SGuangbin Huang {
6389484e337SGuangbin Huang 	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
639c929bc2aSJiaran Zhang 	static const char * const str[] = {"no", "yes"};
640c929bc2aSJiaran Zhang 	unsigned long *caps = ae_dev->caps;
641c929bc2aSJiaran Zhang 	u32 i, state;
6429484e337SGuangbin Huang 
643c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "dev capability:\n");
6449484e337SGuangbin Huang 
645c929bc2aSJiaran Zhang 	for (i = 0; i < ARRAY_SIZE(hns3_dbg_cap); i++) {
646c929bc2aSJiaran Zhang 		state = test_bit(hns3_dbg_cap[i].cap_bit, caps);
647c929bc2aSJiaran Zhang 		*pos += scnprintf(buf + *pos, len - *pos, "%s: %s\n",
648c929bc2aSJiaran Zhang 				  hns3_dbg_cap[i].name, str[state]);
6499484e337SGuangbin Huang 	}
6509484e337SGuangbin Huang 
651c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "\n");
652c929bc2aSJiaran Zhang }
653c929bc2aSJiaran Zhang 
654c929bc2aSJiaran Zhang static void
655c929bc2aSJiaran Zhang hns3_dbg_dev_specs(struct hnae3_handle *h, char *buf, int len, int *pos)
656b4442ec5SGuangbin Huang {
657b4442ec5SGuangbin Huang 	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
658b4442ec5SGuangbin Huang 	struct hnae3_dev_specs *dev_specs = &ae_dev->dev_specs;
659b4442ec5SGuangbin Huang 	struct hnae3_knic_private_info *kinfo = &h->kinfo;
660b4442ec5SGuangbin Huang 
661c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "dev_spec:\n");
662c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "MAC entry num: %u\n",
663c929bc2aSJiaran Zhang 			  dev_specs->mac_entry_num);
664c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "MNG entry num: %u\n",
665c929bc2aSJiaran Zhang 			  dev_specs->mng_entry_num);
666c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "MAX non tso bd num: %u\n",
667b4442ec5SGuangbin Huang 			  dev_specs->max_non_tso_bd_num);
668c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "RSS ind tbl size: %u\n",
669b4442ec5SGuangbin Huang 			  dev_specs->rss_ind_tbl_size);
670c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "RSS key size: %u\n",
671c929bc2aSJiaran Zhang 			  dev_specs->rss_key_size);
672c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "RSS size: %u\n",
673c929bc2aSJiaran Zhang 			  kinfo->rss_size);
674c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "Allocated RSS size: %u\n",
675c929bc2aSJiaran Zhang 			  kinfo->req_rss_size);
676c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos,
677c929bc2aSJiaran Zhang 			  "Task queue pairs numbers: %u\n",
678c929bc2aSJiaran Zhang 			  kinfo->num_tqps);
679c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "RX buffer length: %u\n",
680c929bc2aSJiaran Zhang 			  kinfo->rx_buf_len);
681c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "Desc num per TX queue: %u\n",
682c929bc2aSJiaran Zhang 			  kinfo->num_tx_desc);
683c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "Desc num per RX queue: %u\n",
684c929bc2aSJiaran Zhang 			  kinfo->num_rx_desc);
685c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos,
686c929bc2aSJiaran Zhang 			  "Total number of enabled TCs: %u\n",
68735244430SJian Shen 			  kinfo->tc_info.num_tc);
688c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "MAX INT QL: %u\n",
689c929bc2aSJiaran Zhang 			  dev_specs->int_ql_max);
690c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "MAX INT GL: %u\n",
691c929bc2aSJiaran Zhang 			  dev_specs->max_int_gl);
692c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "MAX TM RATE: %u\n",
693c929bc2aSJiaran Zhang 			  dev_specs->max_tm_rate);
694c929bc2aSJiaran Zhang 	*pos += scnprintf(buf + *pos, len - *pos, "MAX QSET number: %u\n",
695c929bc2aSJiaran Zhang 			  dev_specs->max_qset_num);
696c929bc2aSJiaran Zhang }
697c929bc2aSJiaran Zhang 
698c929bc2aSJiaran Zhang static int hns3_dbg_dev_info(struct hnae3_handle *h, char *buf, int len)
699c929bc2aSJiaran Zhang {
700c929bc2aSJiaran Zhang 	int pos = 0;
701c929bc2aSJiaran Zhang 
702c929bc2aSJiaran Zhang 	hns3_dbg_dev_caps(h, buf, len, &pos);
703c929bc2aSJiaran Zhang 
704c929bc2aSJiaran Zhang 	hns3_dbg_dev_specs(h, buf, len, &pos);
705c929bc2aSJiaran Zhang 
706c929bc2aSJiaran Zhang 	return 0;
707b4442ec5SGuangbin Huang }
708b4442ec5SGuangbin Huang 
709b2292360Sliuzhongzhu static ssize_t hns3_dbg_cmd_read(struct file *filp, char __user *buffer,
710b2292360Sliuzhongzhu 				 size_t count, loff_t *ppos)
711b2292360Sliuzhongzhu {
712b2292360Sliuzhongzhu 	int uncopy_bytes;
713b2292360Sliuzhongzhu 	char *buf;
714b2292360Sliuzhongzhu 	int len;
715b2292360Sliuzhongzhu 
716b2292360Sliuzhongzhu 	if (*ppos != 0)
717b2292360Sliuzhongzhu 		return 0;
718b2292360Sliuzhongzhu 
719b2292360Sliuzhongzhu 	if (count < HNS3_DBG_READ_LEN)
720b2292360Sliuzhongzhu 		return -ENOSPC;
721b2292360Sliuzhongzhu 
722b2292360Sliuzhongzhu 	buf = kzalloc(HNS3_DBG_READ_LEN, GFP_KERNEL);
723b2292360Sliuzhongzhu 	if (!buf)
724b2292360Sliuzhongzhu 		return -ENOMEM;
725b2292360Sliuzhongzhu 
72649e211c0SChen Zhou 	len = scnprintf(buf, HNS3_DBG_READ_LEN, "%s\n",
727b2292360Sliuzhongzhu 			"Please echo help to cmd to get help information");
728b2292360Sliuzhongzhu 	uncopy_bytes = copy_to_user(buffer, buf, len);
729b2292360Sliuzhongzhu 
730b2292360Sliuzhongzhu 	kfree(buf);
731b2292360Sliuzhongzhu 
732b2292360Sliuzhongzhu 	if (uncopy_bytes)
733b2292360Sliuzhongzhu 		return -EFAULT;
734b2292360Sliuzhongzhu 
735b2292360Sliuzhongzhu 	return (*ppos = len);
736b2292360Sliuzhongzhu }
737b2292360Sliuzhongzhu 
738c318af3fSPeng Li static int hns3_dbg_check_cmd(struct hnae3_handle *handle, char *cmd_buf)
739c318af3fSPeng Li {
740c318af3fSPeng Li 	int ret = 0;
741c318af3fSPeng Li 
742c318af3fSPeng Li 	if (strncmp(cmd_buf, "help", 4) == 0)
743c318af3fSPeng Li 		hns3_dbg_help(handle);
744c318af3fSPeng Li 	else if (strncmp(cmd_buf, "queue info", 10) == 0)
745c318af3fSPeng Li 		ret = hns3_dbg_queue_info(handle, cmd_buf);
746c318af3fSPeng Li 	else if (handle->ae_algo->ops->dbg_run_cmd)
747c318af3fSPeng Li 		ret = handle->ae_algo->ops->dbg_run_cmd(handle, cmd_buf);
748c318af3fSPeng Li 	else
749c318af3fSPeng Li 		ret = -EOPNOTSUPP;
750c318af3fSPeng Li 
751c318af3fSPeng Li 	return ret;
752c318af3fSPeng Li }
753c318af3fSPeng Li 
754b2292360Sliuzhongzhu static ssize_t hns3_dbg_cmd_write(struct file *filp, const char __user *buffer,
755b2292360Sliuzhongzhu 				  size_t count, loff_t *ppos)
756b2292360Sliuzhongzhu {
757b2292360Sliuzhongzhu 	struct hnae3_handle *handle = filp->private_data;
75857ceee2cSliuzhongzhu 	struct hns3_nic_priv *priv  = handle->priv;
759b2292360Sliuzhongzhu 	char *cmd_buf, *cmd_buf_tmp;
760b2292360Sliuzhongzhu 	int uncopied_bytes;
761c318af3fSPeng Li 	int ret;
762b2292360Sliuzhongzhu 
763b2292360Sliuzhongzhu 	if (*ppos != 0)
764b2292360Sliuzhongzhu 		return 0;
765b2292360Sliuzhongzhu 
76657ceee2cSliuzhongzhu 	/* Judge if the instance is being reset. */
7677737f1fbSliuzhongzhu 	if (!test_bit(HNS3_NIC_STATE_INITED, &priv->state) ||
76857ceee2cSliuzhongzhu 	    test_bit(HNS3_NIC_STATE_RESETTING, &priv->state))
76957ceee2cSliuzhongzhu 		return 0;
77057ceee2cSliuzhongzhu 
7717ac243f9SYufeng Mo 	if (count > HNS3_DBG_WRITE_LEN)
7727ac243f9SYufeng Mo 		return -ENOSPC;
7737ac243f9SYufeng Mo 
774b2292360Sliuzhongzhu 	cmd_buf = kzalloc(count + 1, GFP_KERNEL);
775b2292360Sliuzhongzhu 	if (!cmd_buf)
776b2292360Sliuzhongzhu 		return count;
777b2292360Sliuzhongzhu 
778b2292360Sliuzhongzhu 	uncopied_bytes = copy_from_user(cmd_buf, buffer, count);
779b2292360Sliuzhongzhu 	if (uncopied_bytes) {
780b2292360Sliuzhongzhu 		kfree(cmd_buf);
781b2292360Sliuzhongzhu 		return -EFAULT;
782b2292360Sliuzhongzhu 	}
783b2292360Sliuzhongzhu 
784b2292360Sliuzhongzhu 	cmd_buf[count] = '\0';
785b2292360Sliuzhongzhu 
786b2292360Sliuzhongzhu 	cmd_buf_tmp = strchr(cmd_buf, '\n');
787b2292360Sliuzhongzhu 	if (cmd_buf_tmp) {
788b2292360Sliuzhongzhu 		*cmd_buf_tmp = '\0';
789b2292360Sliuzhongzhu 		count = cmd_buf_tmp - cmd_buf + 1;
790b2292360Sliuzhongzhu 	}
791b2292360Sliuzhongzhu 
792c318af3fSPeng Li 	ret = hns3_dbg_check_cmd(handle, cmd_buf);
793b2292360Sliuzhongzhu 	if (ret)
794b2292360Sliuzhongzhu 		hns3_dbg_help(handle);
795b2292360Sliuzhongzhu 
796b2292360Sliuzhongzhu 	kfree(cmd_buf);
797b2292360Sliuzhongzhu 	cmd_buf = NULL;
798b2292360Sliuzhongzhu 
799b2292360Sliuzhongzhu 	return count;
800b2292360Sliuzhongzhu }
801b2292360Sliuzhongzhu 
8025e69ea7eSYufeng Mo static int hns3_dbg_get_cmd_index(struct hnae3_handle *handle,
8035e69ea7eSYufeng Mo 				  const unsigned char *name, u32 *index)
8045e69ea7eSYufeng Mo {
8055e69ea7eSYufeng Mo 	u32 i;
8065e69ea7eSYufeng Mo 
8075e69ea7eSYufeng Mo 	for (i = 0; i < ARRAY_SIZE(hns3_dbg_cmd); i++) {
8085e69ea7eSYufeng Mo 		if (!strncmp(name, hns3_dbg_cmd[i].name,
8095e69ea7eSYufeng Mo 			     strlen(hns3_dbg_cmd[i].name))) {
8105e69ea7eSYufeng Mo 			*index = i;
8115e69ea7eSYufeng Mo 			return 0;
8125e69ea7eSYufeng Mo 		}
8135e69ea7eSYufeng Mo 	}
8145e69ea7eSYufeng Mo 
8155e69ea7eSYufeng Mo 	dev_err(&handle->pdev->dev, "unknown command(%s)\n", name);
8165e69ea7eSYufeng Mo 	return -EINVAL;
8175e69ea7eSYufeng Mo }
8185e69ea7eSYufeng Mo 
819c929bc2aSJiaran Zhang static const struct hns3_dbg_func hns3_dbg_cmd_func[] = {
820c929bc2aSJiaran Zhang 	{
821*d2f737cfSHao Chen 		.cmd = HNAE3_DBG_CMD_QUEUE_MAP,
822*d2f737cfSHao Chen 		.dbg_dump = hns3_dbg_queue_map,
823*d2f737cfSHao Chen 	},
824*d2f737cfSHao Chen 	{
825c929bc2aSJiaran Zhang 		.cmd = HNAE3_DBG_CMD_DEV_INFO,
826c929bc2aSJiaran Zhang 		.dbg_dump = hns3_dbg_dev_info,
827c929bc2aSJiaran Zhang 	},
82877e91848SHuazhong Tan 	{
82977e91848SHuazhong Tan 		.cmd = HNAE3_DBG_CMD_TX_BD,
83077e91848SHuazhong Tan 		.dbg_dump_bd = hns3_dbg_tx_bd_info,
83177e91848SHuazhong Tan 	},
83277e91848SHuazhong Tan 	{
83377e91848SHuazhong Tan 		.cmd = HNAE3_DBG_CMD_RX_BD,
83477e91848SHuazhong Tan 		.dbg_dump_bd = hns3_dbg_rx_bd_info,
83577e91848SHuazhong Tan 	},
836c929bc2aSJiaran Zhang };
837c929bc2aSJiaran Zhang 
83877e91848SHuazhong Tan static int hns3_dbg_read_cmd(struct hns3_dbg_data *dbg_data,
8395e69ea7eSYufeng Mo 			     enum hnae3_dbg_cmd cmd, char *buf, int len)
8405e69ea7eSYufeng Mo {
84177e91848SHuazhong Tan 	const struct hnae3_ae_ops *ops = dbg_data->handle->ae_algo->ops;
84277e91848SHuazhong Tan 	const struct hns3_dbg_func *cmd_func;
843c929bc2aSJiaran Zhang 	u32 i;
844c929bc2aSJiaran Zhang 
845c929bc2aSJiaran Zhang 	for (i = 0; i < ARRAY_SIZE(hns3_dbg_cmd_func); i++) {
84677e91848SHuazhong Tan 		if (cmd == hns3_dbg_cmd_func[i].cmd) {
84777e91848SHuazhong Tan 			cmd_func = &hns3_dbg_cmd_func[i];
84877e91848SHuazhong Tan 			if (cmd_func->dbg_dump)
84977e91848SHuazhong Tan 				return cmd_func->dbg_dump(dbg_data->handle, buf,
85077e91848SHuazhong Tan 							  len);
85177e91848SHuazhong Tan 			else
85277e91848SHuazhong Tan 				return cmd_func->dbg_dump_bd(dbg_data, buf,
85377e91848SHuazhong Tan 							     len);
85477e91848SHuazhong Tan 		}
855c929bc2aSJiaran Zhang 	}
8565e69ea7eSYufeng Mo 
8575e69ea7eSYufeng Mo 	if (!ops->dbg_read_cmd)
8585e69ea7eSYufeng Mo 		return -EOPNOTSUPP;
8595e69ea7eSYufeng Mo 
86077e91848SHuazhong Tan 	return ops->dbg_read_cmd(dbg_data->handle, cmd, buf, len);
8615e69ea7eSYufeng Mo }
8625e69ea7eSYufeng Mo 
86304987ca1SGuangbin Huang static ssize_t hns3_dbg_read(struct file *filp, char __user *buffer,
86404987ca1SGuangbin Huang 			     size_t count, loff_t *ppos)
86504987ca1SGuangbin Huang {
86677e91848SHuazhong Tan 	struct hns3_dbg_data *dbg_data = filp->private_data;
86777e91848SHuazhong Tan 	struct hnae3_handle *handle = dbg_data->handle;
86804987ca1SGuangbin Huang 	struct hns3_nic_priv *priv = handle->priv;
86904987ca1SGuangbin Huang 	ssize_t size = 0;
8705e69ea7eSYufeng Mo 	char **save_buf;
8715e69ea7eSYufeng Mo 	char *read_buf;
8725e69ea7eSYufeng Mo 	u32 index;
8735e69ea7eSYufeng Mo 	int ret;
87404987ca1SGuangbin Huang 
8755e69ea7eSYufeng Mo 	ret = hns3_dbg_get_cmd_index(handle, filp->f_path.dentry->d_iname,
8765e69ea7eSYufeng Mo 				     &index);
8775e69ea7eSYufeng Mo 	if (ret)
8785e69ea7eSYufeng Mo 		return ret;
8795e69ea7eSYufeng Mo 
8805e69ea7eSYufeng Mo 	save_buf = &hns3_dbg_cmd[index].buf;
8815e69ea7eSYufeng Mo 
8825e69ea7eSYufeng Mo 	if (!test_bit(HNS3_NIC_STATE_INITED, &priv->state) ||
8835e69ea7eSYufeng Mo 	    test_bit(HNS3_NIC_STATE_RESETTING, &priv->state)) {
8845e69ea7eSYufeng Mo 		ret = -EBUSY;
8855e69ea7eSYufeng Mo 		goto out;
8865e69ea7eSYufeng Mo 	}
8875e69ea7eSYufeng Mo 
8885e69ea7eSYufeng Mo 	if (*save_buf) {
8895e69ea7eSYufeng Mo 		read_buf = *save_buf;
8905e69ea7eSYufeng Mo 	} else {
8915e69ea7eSYufeng Mo 		read_buf = kvzalloc(hns3_dbg_cmd[index].buf_len, GFP_KERNEL);
89204987ca1SGuangbin Huang 		if (!read_buf)
89304987ca1SGuangbin Huang 			return -ENOMEM;
89404987ca1SGuangbin Huang 
8955e69ea7eSYufeng Mo 		/* save the buffer addr until the last read operation */
8965e69ea7eSYufeng Mo 		*save_buf = read_buf;
8975e69ea7eSYufeng Mo 	}
89804987ca1SGuangbin Huang 
8995e69ea7eSYufeng Mo 	/* get data ready for the first time to read */
9005e69ea7eSYufeng Mo 	if (!*ppos) {
90177e91848SHuazhong Tan 		ret = hns3_dbg_read_cmd(dbg_data, hns3_dbg_cmd[index].cmd,
9025e69ea7eSYufeng Mo 					read_buf, hns3_dbg_cmd[index].buf_len);
9035e69ea7eSYufeng Mo 		if (ret)
90404987ca1SGuangbin Huang 			goto out;
90504987ca1SGuangbin Huang 	}
90604987ca1SGuangbin Huang 
90704987ca1SGuangbin Huang 	size = simple_read_from_buffer(buffer, count, ppos, read_buf,
90804987ca1SGuangbin Huang 				       strlen(read_buf));
9095e69ea7eSYufeng Mo 	if (size > 0)
9105e69ea7eSYufeng Mo 		return size;
91104987ca1SGuangbin Huang 
91204987ca1SGuangbin Huang out:
9135e69ea7eSYufeng Mo 	/* free the buffer for the last read operation */
9145e69ea7eSYufeng Mo 	if (*save_buf) {
9155e69ea7eSYufeng Mo 		kvfree(*save_buf);
9165e69ea7eSYufeng Mo 		*save_buf = NULL;
9175e69ea7eSYufeng Mo 	}
9185e69ea7eSYufeng Mo 
9195e69ea7eSYufeng Mo 	return ret;
92004987ca1SGuangbin Huang }
92104987ca1SGuangbin Huang 
922b2292360Sliuzhongzhu static const struct file_operations hns3_dbg_cmd_fops = {
923b2292360Sliuzhongzhu 	.owner = THIS_MODULE,
924b2292360Sliuzhongzhu 	.open  = simple_open,
925b2292360Sliuzhongzhu 	.read  = hns3_dbg_cmd_read,
926b2292360Sliuzhongzhu 	.write = hns3_dbg_cmd_write,
927b2292360Sliuzhongzhu };
928b2292360Sliuzhongzhu 
92904987ca1SGuangbin Huang static const struct file_operations hns3_dbg_fops = {
93004987ca1SGuangbin Huang 	.owner = THIS_MODULE,
93104987ca1SGuangbin Huang 	.open  = simple_open,
93204987ca1SGuangbin Huang 	.read  = hns3_dbg_read,
93304987ca1SGuangbin Huang };
93404987ca1SGuangbin Huang 
93577e91848SHuazhong Tan static int hns3_dbg_bd_file_init(struct hnae3_handle *handle, u32 cmd)
93677e91848SHuazhong Tan {
93777e91848SHuazhong Tan 	struct dentry *entry_dir;
93877e91848SHuazhong Tan 	struct hns3_dbg_data *data;
93977e91848SHuazhong Tan 	u16 max_queue_num;
94077e91848SHuazhong Tan 	unsigned int i;
94177e91848SHuazhong Tan 
94277e91848SHuazhong Tan 	entry_dir = hns3_dbg_dentry[hns3_dbg_cmd[cmd].dentry].dentry;
94377e91848SHuazhong Tan 	max_queue_num = hns3_get_max_available_channels(handle);
94477e91848SHuazhong Tan 	data = devm_kzalloc(&handle->pdev->dev, max_queue_num * sizeof(*data),
94577e91848SHuazhong Tan 			    GFP_KERNEL);
94677e91848SHuazhong Tan 	if (!data)
94777e91848SHuazhong Tan 		return -ENOMEM;
94877e91848SHuazhong Tan 
94977e91848SHuazhong Tan 	for (i = 0; i < max_queue_num; i++) {
95077e91848SHuazhong Tan 		char name[HNS3_DBG_FILE_NAME_LEN];
95177e91848SHuazhong Tan 
95277e91848SHuazhong Tan 		data[i].handle = handle;
95377e91848SHuazhong Tan 		data[i].qid = i;
95477e91848SHuazhong Tan 		sprintf(name, "%s%u", hns3_dbg_cmd[cmd].name, i);
95577e91848SHuazhong Tan 		debugfs_create_file(name, 0400, entry_dir, &data[i],
95677e91848SHuazhong Tan 				    &hns3_dbg_fops);
95777e91848SHuazhong Tan 	}
95877e91848SHuazhong Tan 
95977e91848SHuazhong Tan 	return 0;
96077e91848SHuazhong Tan }
96177e91848SHuazhong Tan 
9625e69ea7eSYufeng Mo static int
9635e69ea7eSYufeng Mo hns3_dbg_common_file_init(struct hnae3_handle *handle, u32 cmd)
9645e69ea7eSYufeng Mo {
96577e91848SHuazhong Tan 	struct hns3_dbg_data *data;
9665e69ea7eSYufeng Mo 	struct dentry *entry_dir;
9675e69ea7eSYufeng Mo 
96877e91848SHuazhong Tan 	data = devm_kzalloc(&handle->pdev->dev, sizeof(*data), GFP_KERNEL);
96977e91848SHuazhong Tan 	if (!data)
97077e91848SHuazhong Tan 		return -ENOMEM;
97177e91848SHuazhong Tan 
97277e91848SHuazhong Tan 	data->handle = handle;
9735e69ea7eSYufeng Mo 	entry_dir = hns3_dbg_dentry[hns3_dbg_cmd[cmd].dentry].dentry;
9745e69ea7eSYufeng Mo 	debugfs_create_file(hns3_dbg_cmd[cmd].name, 0400, entry_dir,
97577e91848SHuazhong Tan 			    data, &hns3_dbg_fops);
9765e69ea7eSYufeng Mo 
9775e69ea7eSYufeng Mo 	return 0;
9785e69ea7eSYufeng Mo }
9795e69ea7eSYufeng Mo 
9805e69ea7eSYufeng Mo int hns3_dbg_init(struct hnae3_handle *handle)
981b2292360Sliuzhongzhu {
98204987ca1SGuangbin Huang 	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(handle->pdev);
983b2292360Sliuzhongzhu 	const char *name = pci_name(handle->pdev);
9845e69ea7eSYufeng Mo 	int ret;
9855e69ea7eSYufeng Mo 	u32 i;
986b2292360Sliuzhongzhu 
9875e69ea7eSYufeng Mo 	hns3_dbg_dentry[HNS3_DBG_DENTRY_COMMON].dentry =
9885e69ea7eSYufeng Mo 				debugfs_create_dir(name, hns3_dbgfs_root);
9895e69ea7eSYufeng Mo 	handle->hnae3_dbgfs = hns3_dbg_dentry[HNS3_DBG_DENTRY_COMMON].dentry;
990b2292360Sliuzhongzhu 
99111ab11e6SGreg Kroah-Hartman 	debugfs_create_file("cmd", 0600, handle->hnae3_dbgfs, handle,
992b2292360Sliuzhongzhu 			    &hns3_dbg_cmd_fops);
99304987ca1SGuangbin Huang 
9945e69ea7eSYufeng Mo 	for (i = 0; i < HNS3_DBG_DENTRY_COMMON; i++)
9955e69ea7eSYufeng Mo 		hns3_dbg_dentry[i].dentry =
9965e69ea7eSYufeng Mo 			debugfs_create_dir(hns3_dbg_dentry[i].name,
9975e69ea7eSYufeng Mo 					   handle->hnae3_dbgfs);
9985e69ea7eSYufeng Mo 
9995e69ea7eSYufeng Mo 	for (i = 0; i < ARRAY_SIZE(hns3_dbg_cmd); i++) {
10005e69ea7eSYufeng Mo 		if (hns3_dbg_cmd[i].cmd == HNAE3_DBG_CMD_TM_NODES &&
10015e69ea7eSYufeng Mo 		    ae_dev->dev_version <= HNAE3_DEVICE_VERSION_V2)
10025e69ea7eSYufeng Mo 			continue;
10035e69ea7eSYufeng Mo 
10045e69ea7eSYufeng Mo 		if (!hns3_dbg_cmd[i].init) {
10055e69ea7eSYufeng Mo 			dev_err(&handle->pdev->dev,
10065e69ea7eSYufeng Mo 				"cmd %s lack of init func\n",
10075e69ea7eSYufeng Mo 				hns3_dbg_cmd[i].name);
10085e69ea7eSYufeng Mo 			ret = -EINVAL;
10095e69ea7eSYufeng Mo 			goto out;
10105e69ea7eSYufeng Mo 		}
10115e69ea7eSYufeng Mo 
10125e69ea7eSYufeng Mo 		ret = hns3_dbg_cmd[i].init(handle, i);
10135e69ea7eSYufeng Mo 		if (ret) {
10145e69ea7eSYufeng Mo 			dev_err(&handle->pdev->dev, "failed to init cmd %s\n",
10155e69ea7eSYufeng Mo 				hns3_dbg_cmd[i].name);
10165e69ea7eSYufeng Mo 			goto out;
10175e69ea7eSYufeng Mo 		}
10185e69ea7eSYufeng Mo 	}
10195e69ea7eSYufeng Mo 
10205e69ea7eSYufeng Mo 	return 0;
10215e69ea7eSYufeng Mo 
10225e69ea7eSYufeng Mo out:
10235e69ea7eSYufeng Mo 	debugfs_remove_recursive(handle->hnae3_dbgfs);
10245e69ea7eSYufeng Mo 	handle->hnae3_dbgfs = NULL;
10255e69ea7eSYufeng Mo 	return ret;
1026b2292360Sliuzhongzhu }
1027b2292360Sliuzhongzhu 
1028b2292360Sliuzhongzhu void hns3_dbg_uninit(struct hnae3_handle *handle)
1029b2292360Sliuzhongzhu {
10305e69ea7eSYufeng Mo 	u32 i;
10315e69ea7eSYufeng Mo 
10325e69ea7eSYufeng Mo 	for (i = 0; i < ARRAY_SIZE(hns3_dbg_cmd); i++)
10335e69ea7eSYufeng Mo 		if (hns3_dbg_cmd[i].buf) {
10345e69ea7eSYufeng Mo 			kvfree(hns3_dbg_cmd[i].buf);
10355e69ea7eSYufeng Mo 			hns3_dbg_cmd[i].buf = NULL;
10365e69ea7eSYufeng Mo 		}
10375e69ea7eSYufeng Mo 
1038b2292360Sliuzhongzhu 	debugfs_remove_recursive(handle->hnae3_dbgfs);
1039b2292360Sliuzhongzhu 	handle->hnae3_dbgfs = NULL;
1040b2292360Sliuzhongzhu }
1041b2292360Sliuzhongzhu 
1042b2292360Sliuzhongzhu void hns3_dbg_register_debugfs(const char *debugfs_dir_name)
1043b2292360Sliuzhongzhu {
1044b2292360Sliuzhongzhu 	hns3_dbgfs_root = debugfs_create_dir(debugfs_dir_name, NULL);
1045b2292360Sliuzhongzhu }
1046b2292360Sliuzhongzhu 
1047b2292360Sliuzhongzhu void hns3_dbg_unregister_debugfs(void)
1048b2292360Sliuzhongzhu {
1049b2292360Sliuzhongzhu 	debugfs_remove_recursive(hns3_dbgfs_root);
1050b2292360Sliuzhongzhu 	hns3_dbgfs_root = NULL;
1051b2292360Sliuzhongzhu }
1052