xref: /linux/drivers/infiniband/hw/bnxt_re/debugfs.c (revision 60675d4ca1ef0857e44eba5849b74a3a998d0c0f)
1*d7d54769SKalesh AP // SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
2*d7d54769SKalesh AP /*
3*d7d54769SKalesh AP  * Copyright (c) 2024, Broadcom. All rights reserved.  The term
4*d7d54769SKalesh AP  * Broadcom refers to Broadcom Limited and/or its subsidiaries.
5*d7d54769SKalesh AP  *
6*d7d54769SKalesh AP  * Description: Debugfs component of the bnxt_re driver
7*d7d54769SKalesh AP  */
8*d7d54769SKalesh AP 
9*d7d54769SKalesh AP #include <linux/debugfs.h>
10*d7d54769SKalesh AP #include <linux/pci.h>
11*d7d54769SKalesh AP #include <rdma/ib_addr.h>
12*d7d54769SKalesh AP 
13*d7d54769SKalesh AP #include "bnxt_ulp.h"
14*d7d54769SKalesh AP #include "roce_hsi.h"
15*d7d54769SKalesh AP #include "qplib_res.h"
16*d7d54769SKalesh AP #include "qplib_sp.h"
17*d7d54769SKalesh AP #include "qplib_fp.h"
18*d7d54769SKalesh AP #include "qplib_rcfw.h"
19*d7d54769SKalesh AP #include "bnxt_re.h"
20*d7d54769SKalesh AP #include "ib_verbs.h"
21*d7d54769SKalesh AP #include "debugfs.h"
22*d7d54769SKalesh AP 
23*d7d54769SKalesh AP static struct dentry *bnxt_re_debugfs_root;
24*d7d54769SKalesh AP 
25*d7d54769SKalesh AP static inline const char *bnxt_re_qp_state_str(u8 state)
26*d7d54769SKalesh AP {
27*d7d54769SKalesh AP 	switch (state) {
28*d7d54769SKalesh AP 	case CMDQ_MODIFY_QP_NEW_STATE_RESET:
29*d7d54769SKalesh AP 		return "RST";
30*d7d54769SKalesh AP 	case CMDQ_MODIFY_QP_NEW_STATE_INIT:
31*d7d54769SKalesh AP 		return "INIT";
32*d7d54769SKalesh AP 	case CMDQ_MODIFY_QP_NEW_STATE_RTR:
33*d7d54769SKalesh AP 		return "RTR";
34*d7d54769SKalesh AP 	case CMDQ_MODIFY_QP_NEW_STATE_RTS:
35*d7d54769SKalesh AP 		return "RTS";
36*d7d54769SKalesh AP 	case CMDQ_MODIFY_QP_NEW_STATE_SQE:
37*d7d54769SKalesh AP 		return "SQER";
38*d7d54769SKalesh AP 	case CMDQ_MODIFY_QP_NEW_STATE_SQD:
39*d7d54769SKalesh AP 		return "SQD";
40*d7d54769SKalesh AP 	case CMDQ_MODIFY_QP_NEW_STATE_ERR:
41*d7d54769SKalesh AP 		return "ERR";
42*d7d54769SKalesh AP 	default:
43*d7d54769SKalesh AP 		return "Invalid QP state";
44*d7d54769SKalesh AP 	}
45*d7d54769SKalesh AP }
46*d7d54769SKalesh AP 
47*d7d54769SKalesh AP static inline const char *bnxt_re_qp_type_str(u8 type)
48*d7d54769SKalesh AP {
49*d7d54769SKalesh AP 	switch (type) {
50*d7d54769SKalesh AP 	case CMDQ_CREATE_QP1_TYPE_GSI: return "QP1";
51*d7d54769SKalesh AP 	case CMDQ_CREATE_QP_TYPE_GSI: return "QP1";
52*d7d54769SKalesh AP 	case CMDQ_CREATE_QP_TYPE_RC: return "RC";
53*d7d54769SKalesh AP 	case CMDQ_CREATE_QP_TYPE_UD: return "UD";
54*d7d54769SKalesh AP 	case CMDQ_CREATE_QP_TYPE_RAW_ETHERTYPE: return "RAW_ETHERTYPE";
55*d7d54769SKalesh AP 	default: return "Invalid transport type";
56*d7d54769SKalesh AP 	}
57*d7d54769SKalesh AP }
58*d7d54769SKalesh AP 
59*d7d54769SKalesh AP static ssize_t qp_info_read(struct file *filep,
60*d7d54769SKalesh AP 			    char __user *buffer,
61*d7d54769SKalesh AP 			    size_t count, loff_t *ppos)
62*d7d54769SKalesh AP {
63*d7d54769SKalesh AP 	struct bnxt_re_qp *qp = filep->private_data;
64*d7d54769SKalesh AP 	char *buf;
65*d7d54769SKalesh AP 	int len;
66*d7d54769SKalesh AP 
67*d7d54769SKalesh AP 	if (*ppos)
68*d7d54769SKalesh AP 		return 0;
69*d7d54769SKalesh AP 
70*d7d54769SKalesh AP 	buf = kasprintf(GFP_KERNEL,
71*d7d54769SKalesh AP 			"QPN\t\t: %d\n"
72*d7d54769SKalesh AP 			"transport\t: %s\n"
73*d7d54769SKalesh AP 			"state\t\t: %s\n"
74*d7d54769SKalesh AP 			"mtu\t\t: %d\n"
75*d7d54769SKalesh AP 			"timeout\t\t: %d\n"
76*d7d54769SKalesh AP 			"remote QPN\t: %d\n",
77*d7d54769SKalesh AP 			qp->qplib_qp.id,
78*d7d54769SKalesh AP 			bnxt_re_qp_type_str(qp->qplib_qp.type),
79*d7d54769SKalesh AP 			bnxt_re_qp_state_str(qp->qplib_qp.state),
80*d7d54769SKalesh AP 			qp->qplib_qp.mtu,
81*d7d54769SKalesh AP 			qp->qplib_qp.timeout,
82*d7d54769SKalesh AP 			qp->qplib_qp.dest_qpn);
83*d7d54769SKalesh AP 	if (!buf)
84*d7d54769SKalesh AP 		return -ENOMEM;
85*d7d54769SKalesh AP 	if (count < strlen(buf)) {
86*d7d54769SKalesh AP 		kfree(buf);
87*d7d54769SKalesh AP 		return -ENOSPC;
88*d7d54769SKalesh AP 	}
89*d7d54769SKalesh AP 	len = simple_read_from_buffer(buffer, count, ppos, buf, strlen(buf));
90*d7d54769SKalesh AP 	kfree(buf);
91*d7d54769SKalesh AP 	return len;
92*d7d54769SKalesh AP }
93*d7d54769SKalesh AP 
94*d7d54769SKalesh AP static const struct file_operations debugfs_qp_fops = {
95*d7d54769SKalesh AP 	.owner = THIS_MODULE,
96*d7d54769SKalesh AP 	.open = simple_open,
97*d7d54769SKalesh AP 	.read = qp_info_read,
98*d7d54769SKalesh AP };
99*d7d54769SKalesh AP 
100*d7d54769SKalesh AP void bnxt_re_debug_add_qpinfo(struct bnxt_re_dev *rdev, struct bnxt_re_qp *qp)
101*d7d54769SKalesh AP {
102*d7d54769SKalesh AP 	char resn[32];
103*d7d54769SKalesh AP 
104*d7d54769SKalesh AP 	sprintf(resn, "0x%x", qp->qplib_qp.id);
105*d7d54769SKalesh AP 	qp->dentry = debugfs_create_file(resn, 0400, rdev->qp_debugfs, qp, &debugfs_qp_fops);
106*d7d54769SKalesh AP }
107*d7d54769SKalesh AP 
108*d7d54769SKalesh AP void bnxt_re_debug_rem_qpinfo(struct bnxt_re_dev *rdev, struct bnxt_re_qp *qp)
109*d7d54769SKalesh AP {
110*d7d54769SKalesh AP 	debugfs_remove(qp->dentry);
111*d7d54769SKalesh AP }
112*d7d54769SKalesh AP 
113*d7d54769SKalesh AP void bnxt_re_debugfs_add_pdev(struct bnxt_re_dev *rdev)
114*d7d54769SKalesh AP {
115*d7d54769SKalesh AP 	struct pci_dev *pdev = rdev->en_dev->pdev;
116*d7d54769SKalesh AP 
117*d7d54769SKalesh AP 	rdev->dbg_root = debugfs_create_dir(dev_name(&pdev->dev), bnxt_re_debugfs_root);
118*d7d54769SKalesh AP 
119*d7d54769SKalesh AP 	rdev->qp_debugfs = debugfs_create_dir("QPs", rdev->dbg_root);
120*d7d54769SKalesh AP }
121*d7d54769SKalesh AP 
122*d7d54769SKalesh AP void bnxt_re_debugfs_rem_pdev(struct bnxt_re_dev *rdev)
123*d7d54769SKalesh AP {
124*d7d54769SKalesh AP 	debugfs_remove_recursive(rdev->qp_debugfs);
125*d7d54769SKalesh AP 
126*d7d54769SKalesh AP 	debugfs_remove_recursive(rdev->dbg_root);
127*d7d54769SKalesh AP 	rdev->dbg_root = NULL;
128*d7d54769SKalesh AP }
129*d7d54769SKalesh AP 
130*d7d54769SKalesh AP void bnxt_re_register_debugfs(void)
131*d7d54769SKalesh AP {
132*d7d54769SKalesh AP 	bnxt_re_debugfs_root = debugfs_create_dir("bnxt_re", NULL);
133*d7d54769SKalesh AP }
134*d7d54769SKalesh AP 
135*d7d54769SKalesh AP void bnxt_re_unregister_debugfs(void)
136*d7d54769SKalesh AP {
137*d7d54769SKalesh AP 	debugfs_remove(bnxt_re_debugfs_root);
138*d7d54769SKalesh AP }
139