diff options
author | Borislav Petkov <bp@suse.de> | 2015-09-22 05:56:04 -0400 |
---|---|---|
committer | Borislav Petkov <bp@suse.de> | 2015-09-22 06:29:46 -0400 |
commit | 7ac8bf9bc9ba82aea763ef30671a34c6a2a39922 (patch) | |
tree | 7aa7d941e608c6376f5564e63b1042680e55fb92 /drivers/edac/debugfs.c | |
parent | 1f93e4a96c9109378204c147b3eec0d0e8100fde (diff) |
EDAC: Carve out debugfs functionality
... into a separate compilation unit and drop a couple of
CONFIG_EDAC_DEBUG ifdefferies. Rename edac_create_debug_nodes() to
edac_create_debugfs_nodes(), while at it.
No functionality change.
Cc: <linux-edac@vger.kernel.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Diffstat (limited to 'drivers/edac/debugfs.c')
-rw-r--r-- | drivers/edac/debugfs.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/drivers/edac/debugfs.c b/drivers/edac/debugfs.c new file mode 100644 index 000000000000..bcd558d5cb48 --- /dev/null +++ b/drivers/edac/debugfs.c | |||
@@ -0,0 +1,103 @@ | |||
1 | #include "edac_module.h" | ||
2 | |||
3 | static struct dentry *edac_debugfs; | ||
4 | |||
5 | static ssize_t edac_fake_inject_write(struct file *file, | ||
6 | const char __user *data, | ||
7 | size_t count, loff_t *ppos) | ||
8 | { | ||
9 | struct device *dev = file->private_data; | ||
10 | struct mem_ctl_info *mci = to_mci(dev); | ||
11 | static enum hw_event_mc_err_type type; | ||
12 | u16 errcount = mci->fake_inject_count; | ||
13 | |||
14 | if (!errcount) | ||
15 | errcount = 1; | ||
16 | |||
17 | type = mci->fake_inject_ue ? HW_EVENT_ERR_UNCORRECTED | ||
18 | : HW_EVENT_ERR_CORRECTED; | ||
19 | |||
20 | printk(KERN_DEBUG | ||
21 | "Generating %d %s fake error%s to %d.%d.%d to test core handling. NOTE: this won't test the driver-specific decoding logic.\n", | ||
22 | errcount, | ||
23 | (type == HW_EVENT_ERR_UNCORRECTED) ? "UE" : "CE", | ||
24 | errcount > 1 ? "s" : "", | ||
25 | mci->fake_inject_layer[0], | ||
26 | mci->fake_inject_layer[1], | ||
27 | mci->fake_inject_layer[2] | ||
28 | ); | ||
29 | edac_mc_handle_error(type, mci, errcount, 0, 0, 0, | ||
30 | mci->fake_inject_layer[0], | ||
31 | mci->fake_inject_layer[1], | ||
32 | mci->fake_inject_layer[2], | ||
33 | "FAKE ERROR", "for EDAC testing only"); | ||
34 | |||
35 | return count; | ||
36 | } | ||
37 | |||
38 | static const struct file_operations debug_fake_inject_fops = { | ||
39 | .open = simple_open, | ||
40 | .write = edac_fake_inject_write, | ||
41 | .llseek = generic_file_llseek, | ||
42 | }; | ||
43 | |||
44 | int __init edac_debugfs_init(void) | ||
45 | { | ||
46 | edac_debugfs = debugfs_create_dir("edac", NULL); | ||
47 | if (IS_ERR(edac_debugfs)) { | ||
48 | edac_debugfs = NULL; | ||
49 | return -ENOMEM; | ||
50 | } | ||
51 | return 0; | ||
52 | } | ||
53 | |||
54 | void edac_debugfs_exit(void) | ||
55 | { | ||
56 | debugfs_remove(edac_debugfs); | ||
57 | } | ||
58 | |||
59 | int edac_create_debugfs_nodes(struct mem_ctl_info *mci) | ||
60 | { | ||
61 | struct dentry *d, *parent; | ||
62 | char name[80]; | ||
63 | int i; | ||
64 | |||
65 | if (!edac_debugfs) | ||
66 | return -ENODEV; | ||
67 | |||
68 | d = debugfs_create_dir(mci->dev.kobj.name, edac_debugfs); | ||
69 | if (!d) | ||
70 | return -ENOMEM; | ||
71 | parent = d; | ||
72 | |||
73 | for (i = 0; i < mci->n_layers; i++) { | ||
74 | sprintf(name, "fake_inject_%s", | ||
75 | edac_layer_name[mci->layers[i].type]); | ||
76 | d = debugfs_create_u8(name, S_IRUGO | S_IWUSR, parent, | ||
77 | &mci->fake_inject_layer[i]); | ||
78 | if (!d) | ||
79 | goto nomem; | ||
80 | } | ||
81 | |||
82 | d = debugfs_create_bool("fake_inject_ue", S_IRUGO | S_IWUSR, parent, | ||
83 | &mci->fake_inject_ue); | ||
84 | if (!d) | ||
85 | goto nomem; | ||
86 | |||
87 | d = debugfs_create_u16("fake_inject_count", S_IRUGO | S_IWUSR, parent, | ||
88 | &mci->fake_inject_count); | ||
89 | if (!d) | ||
90 | goto nomem; | ||
91 | |||
92 | d = debugfs_create_file("fake_inject", S_IWUSR, parent, | ||
93 | &mci->dev, | ||
94 | &debug_fake_inject_fops); | ||
95 | if (!d) | ||
96 | goto nomem; | ||
97 | |||
98 | mci->debugfs = parent; | ||
99 | return 0; | ||
100 | nomem: | ||
101 | debugfs_remove(mci->debugfs); | ||
102 | return -ENOMEM; | ||
103 | } | ||