1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun // Copyright (C) 2020 Intel Corporation
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #include <linux/debugfs.h>
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include "ufs-debugfs.h"
7*4882a593Smuzhiyun #include "ufshcd.h"
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun static struct dentry *ufs_debugfs_root;
10*4882a593Smuzhiyun
ufs_debugfs_init(void)11*4882a593Smuzhiyun void __init ufs_debugfs_init(void)
12*4882a593Smuzhiyun {
13*4882a593Smuzhiyun ufs_debugfs_root = debugfs_create_dir("ufshcd", NULL);
14*4882a593Smuzhiyun }
15*4882a593Smuzhiyun
ufs_debugfs_exit(void)16*4882a593Smuzhiyun void __exit ufs_debugfs_exit(void)
17*4882a593Smuzhiyun {
18*4882a593Smuzhiyun debugfs_remove_recursive(ufs_debugfs_root);
19*4882a593Smuzhiyun }
20*4882a593Smuzhiyun
ufs_debugfs_stats_show(struct seq_file * s,void * data)21*4882a593Smuzhiyun static int ufs_debugfs_stats_show(struct seq_file *s, void *data)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun struct ufs_hba *hba = s->private;
24*4882a593Smuzhiyun struct ufs_event_hist *e = hba->ufs_stats.event;
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun #define PRT(fmt, typ) \
27*4882a593Smuzhiyun seq_printf(s, fmt, e[UFS_EVT_ ## typ].cnt)
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun PRT("PHY Adapter Layer errors (except LINERESET): %llu\n", PA_ERR);
30*4882a593Smuzhiyun PRT("Data Link Layer errors: %llu\n", DL_ERR);
31*4882a593Smuzhiyun PRT("Network Layer errors: %llu\n", NL_ERR);
32*4882a593Smuzhiyun PRT("Transport Layer errors: %llu\n", TL_ERR);
33*4882a593Smuzhiyun PRT("Generic DME errors: %llu\n", DME_ERR);
34*4882a593Smuzhiyun PRT("Auto-hibernate errors: %llu\n", AUTO_HIBERN8_ERR);
35*4882a593Smuzhiyun PRT("IS Fatal errors (CEFES, SBFES, HCFES, DFES): %llu\n", FATAL_ERR);
36*4882a593Smuzhiyun PRT("DME Link Startup errors: %llu\n", LINK_STARTUP_FAIL);
37*4882a593Smuzhiyun PRT("PM Resume errors: %llu\n", RESUME_ERR);
38*4882a593Smuzhiyun PRT("PM Suspend errors : %llu\n", SUSPEND_ERR);
39*4882a593Smuzhiyun PRT("Logical Unit Resets: %llu\n", DEV_RESET);
40*4882a593Smuzhiyun PRT("Host Resets: %llu\n", HOST_RESET);
41*4882a593Smuzhiyun PRT("SCSI command aborts: %llu\n", ABORT);
42*4882a593Smuzhiyun #undef PRT
43*4882a593Smuzhiyun return 0;
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(ufs_debugfs_stats);
46*4882a593Smuzhiyun
ufs_debugfs_hba_init(struct ufs_hba * hba)47*4882a593Smuzhiyun void ufs_debugfs_hba_init(struct ufs_hba *hba)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun hba->debugfs_root = debugfs_create_dir(dev_name(hba->dev), ufs_debugfs_root);
50*4882a593Smuzhiyun debugfs_create_file("stats", 0400, hba->debugfs_root, hba, &ufs_debugfs_stats_fops);
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun
ufs_debugfs_hba_exit(struct ufs_hba * hba)53*4882a593Smuzhiyun void ufs_debugfs_hba_exit(struct ufs_hba *hba)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun debugfs_remove_recursive(hba->debugfs_root);
56*4882a593Smuzhiyun }
57