aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/debugfs.c
diff options
context:
space:
mode:
authorZhang Rui <rui.zhang@intel.com>2010-07-14 22:46:15 -0400
committerLen Brown <len.brown@intel.com>2010-08-14 23:02:00 -0400
commita25ee9200eef07377e1703697afbb5d81f89e500 (patch)
treeefecbc42b6a600ee17c81951834d88f1ad0566e3 /drivers/acpi/debugfs.c
parent9fe6206f400646a2322096b56c59891d530e8d51 (diff)
ACPI: introduce drivers/acpi/debugfs.c
Introduce drivers/acpi/debugfs.c. Code for ACPI debugfs I/F, i.e. /sys/kernel/debug/acpi/custom_method, is moved to this file. And make ACPI debugfs always built in, even if CONFIG_ACPI_DEBUG is cleared. BTW:this adds about 400bytes code to ACPI, when CONFIG_ACPI_DEBUG is cleared. [uaccess.h build fix from Andrew Morton <akpm@linux-foundation.org>] Signed-off-by: Zhang Rui <rui.zhang@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/debugfs.c')
-rw-r--r--drivers/acpi/debugfs.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/drivers/acpi/debugfs.c b/drivers/acpi/debugfs.c
new file mode 100644
index 000000000000..abfcf9f6e766
--- /dev/null
+++ b/drivers/acpi/debugfs.c
@@ -0,0 +1,85 @@
1/*
2 * debugfs.c - ACPI debugfs interface to userspace.
3 */
4
5#include <linux/init.h>
6#include <linux/module.h>
7#include <linux/kernel.h>
8#include <linux/uaccess.h>
9#include <linux/debugfs.h>
10#include <acpi/acpi_drivers.h>
11
12#define _COMPONENT ACPI_SYSTEM_COMPONENT
13ACPI_MODULE_NAME("debugfs");
14
15/* /sys/kernel/debug/acpi/custom_method */
16
17static ssize_t cm_write(struct file *file, const char __user * user_buf,
18 size_t count, loff_t *ppos)
19{
20 static char *buf;
21 static int uncopied_bytes;
22 struct acpi_table_header table;
23 acpi_status status;
24
25 if (!(*ppos)) {
26 /* parse the table header to get the table length */
27 if (count <= sizeof(struct acpi_table_header))
28 return -EINVAL;
29 if (copy_from_user(&table, user_buf,
30 sizeof(struct acpi_table_header)))
31 return -EFAULT;
32 uncopied_bytes = table.length;
33 buf = kzalloc(uncopied_bytes, GFP_KERNEL);
34 if (!buf)
35 return -ENOMEM;
36 }
37
38 if (uncopied_bytes < count) {
39 kfree(buf);
40 return -EINVAL;
41 }
42
43 if (copy_from_user(buf + (*ppos), user_buf, count)) {
44 kfree(buf);
45 return -EFAULT;
46 }
47
48 uncopied_bytes -= count;
49 *ppos += count;
50
51 if (!uncopied_bytes) {
52 status = acpi_install_method(buf);
53 kfree(buf);
54 if (ACPI_FAILURE(status))
55 return -EINVAL;
56 add_taint(TAINT_OVERRIDDEN_ACPI_TABLE);
57 }
58
59 return count;
60}
61
62static const struct file_operations cm_fops = {
63 .write = cm_write,
64};
65
66int __init acpi_debugfs_init(void)
67{
68 struct dentry *acpi_dir, *cm_dentry;
69
70 acpi_dir = debugfs_create_dir("acpi", NULL);
71 if (!acpi_dir)
72 goto err;
73
74 cm_dentry = debugfs_create_file("custom_method", S_IWUGO,
75 acpi_dir, NULL, &cm_fops);
76 if (!cm_dentry)
77 goto err;
78
79 return 0;
80
81err:
82 if (acpi_dir)
83 debugfs_remove(acpi_dir);
84 return -EINVAL;
85}