Loading Documentation/acpi/method-customizing.txt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,8 @@ Note: Only ACPI METHOD can be overridden, any other object types like "Device", "OperationRegion", are not recognized. "Device", "OperationRegion", are not recognized. Note: The same ACPI control method can be overridden for many times, Note: The same ACPI control method can be overridden for many times, and it's always the latest one that used by Linux/kernel. and it's always the latest one that used by Linux/kernel. Note: To get the ACPI debug object output (Store (AAAA, Debug)), please run "echo 1 > /sys/module/acpi/parameters/aml_debug_output". 1. override an existing method 1. override an existing method a) get the ACPI table via ACPI sysfs I/F. e.g. to get the DSDT, a) get the ACPI table via ACPI sysfs I/F. e.g. to get the DSDT, Loading drivers/acpi/Makefile +1 −0 Original line number Original line Diff line number Diff line Loading @@ -39,6 +39,7 @@ acpi-y += pci_root.o pci_link.o pci_irq.o pci_bind.o acpi-y += power.o acpi-y += power.o acpi-y += system.o event.o acpi-y += system.o event.o acpi-$(CONFIG_ACPI_DEBUG) += debug.o acpi-$(CONFIG_ACPI_DEBUG) += debug.o acpi-$(CONFIG_DEBUG_FS) += debugfs.o acpi-$(CONFIG_ACPI_NUMA) += numa.o acpi-$(CONFIG_ACPI_NUMA) += numa.o acpi-$(CONFIG_ACPI_PROCFS_POWER) += cm_sbs.o acpi-$(CONFIG_ACPI_PROCFS_POWER) += cm_sbs.o ifdef CONFIG_ACPI_VIDEO ifdef CONFIG_ACPI_VIDEO Loading drivers/acpi/acpica/acglobal.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -115,7 +115,7 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_use_default_register_widths, TRUE); /* /* * Optionally enable output from the AML Debug Object. * Optionally enable output from the AML Debug Object. */ */ u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE); u32 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE); /* /* * Optionally copy the entire DSDT to local memory (instead of simply * Optionally copy the entire DSDT to local memory (instead of simply Loading drivers/acpi/bus.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -1036,6 +1036,7 @@ static int __init acpi_init(void) acpi_power_init(); acpi_power_init(); acpi_system_init(); acpi_system_init(); acpi_debug_init(); acpi_debug_init(); acpi_debugfs_init(); acpi_sleep_proc_init(); acpi_sleep_proc_init(); acpi_wakeup_device_init(); acpi_wakeup_device_init(); return result; return result; Loading drivers/acpi/debug.c +0 −75 Original line number Original line Diff line number Diff line Loading @@ -197,80 +197,6 @@ static int param_get_trace_state(char *buffer, struct kernel_param *kp) module_param_call(trace_state, param_set_trace_state, param_get_trace_state, module_param_call(trace_state, param_set_trace_state, param_get_trace_state, NULL, 0644); NULL, 0644); /* -------------------------------------------------------------------------- DebugFS Interface -------------------------------------------------------------------------- */ static ssize_t cm_write(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) { static char *buf; static int uncopied_bytes; struct acpi_table_header table; acpi_status status; if (!(*ppos)) { /* parse the table header to get the table length */ if (count <= sizeof(struct acpi_table_header)) return -EINVAL; if (copy_from_user(&table, user_buf, sizeof(struct acpi_table_header))) return -EFAULT; uncopied_bytes = table.length; buf = kzalloc(uncopied_bytes, GFP_KERNEL); if (!buf) return -ENOMEM; } if (uncopied_bytes < count) { kfree(buf); return -EINVAL; } if (copy_from_user(buf + (*ppos), user_buf, count)) { kfree(buf); return -EFAULT; } uncopied_bytes -= count; *ppos += count; if (!uncopied_bytes) { status = acpi_install_method(buf); kfree(buf); if (ACPI_FAILURE(status)) return -EINVAL; add_taint(TAINT_OVERRIDDEN_ACPI_TABLE); } return count; } static const struct file_operations cm_fops = { .write = cm_write, }; static int acpi_debugfs_init(void) { struct dentry *acpi_dir, *cm_dentry; acpi_dir = debugfs_create_dir("acpi", NULL); if (!acpi_dir) goto err; cm_dentry = debugfs_create_file("custom_method", S_IWUGO, acpi_dir, NULL, &cm_fops); if (!cm_dentry) goto err; return 0; err: if (acpi_dir) debugfs_remove(acpi_dir); return -EINVAL; } /* -------------------------------------------------------------------------- /* -------------------------------------------------------------------------- FS Interface (/proc) FS Interface (/proc) -------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */ Loading Loading @@ -400,7 +326,6 @@ int __init acpi_procfs_init(void) int __init acpi_debug_init(void) int __init acpi_debug_init(void) { { acpi_debugfs_init(); acpi_procfs_init(); acpi_procfs_init(); return 0; return 0; } } Loading
Documentation/acpi/method-customizing.txt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,8 @@ Note: Only ACPI METHOD can be overridden, any other object types like "Device", "OperationRegion", are not recognized. "Device", "OperationRegion", are not recognized. Note: The same ACPI control method can be overridden for many times, Note: The same ACPI control method can be overridden for many times, and it's always the latest one that used by Linux/kernel. and it's always the latest one that used by Linux/kernel. Note: To get the ACPI debug object output (Store (AAAA, Debug)), please run "echo 1 > /sys/module/acpi/parameters/aml_debug_output". 1. override an existing method 1. override an existing method a) get the ACPI table via ACPI sysfs I/F. e.g. to get the DSDT, a) get the ACPI table via ACPI sysfs I/F. e.g. to get the DSDT, Loading
drivers/acpi/Makefile +1 −0 Original line number Original line Diff line number Diff line Loading @@ -39,6 +39,7 @@ acpi-y += pci_root.o pci_link.o pci_irq.o pci_bind.o acpi-y += power.o acpi-y += power.o acpi-y += system.o event.o acpi-y += system.o event.o acpi-$(CONFIG_ACPI_DEBUG) += debug.o acpi-$(CONFIG_ACPI_DEBUG) += debug.o acpi-$(CONFIG_DEBUG_FS) += debugfs.o acpi-$(CONFIG_ACPI_NUMA) += numa.o acpi-$(CONFIG_ACPI_NUMA) += numa.o acpi-$(CONFIG_ACPI_PROCFS_POWER) += cm_sbs.o acpi-$(CONFIG_ACPI_PROCFS_POWER) += cm_sbs.o ifdef CONFIG_ACPI_VIDEO ifdef CONFIG_ACPI_VIDEO Loading
drivers/acpi/acpica/acglobal.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -115,7 +115,7 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_use_default_register_widths, TRUE); /* /* * Optionally enable output from the AML Debug Object. * Optionally enable output from the AML Debug Object. */ */ u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE); u32 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE); /* /* * Optionally copy the entire DSDT to local memory (instead of simply * Optionally copy the entire DSDT to local memory (instead of simply Loading
drivers/acpi/bus.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -1036,6 +1036,7 @@ static int __init acpi_init(void) acpi_power_init(); acpi_power_init(); acpi_system_init(); acpi_system_init(); acpi_debug_init(); acpi_debug_init(); acpi_debugfs_init(); acpi_sleep_proc_init(); acpi_sleep_proc_init(); acpi_wakeup_device_init(); acpi_wakeup_device_init(); return result; return result; Loading
drivers/acpi/debug.c +0 −75 Original line number Original line Diff line number Diff line Loading @@ -197,80 +197,6 @@ static int param_get_trace_state(char *buffer, struct kernel_param *kp) module_param_call(trace_state, param_set_trace_state, param_get_trace_state, module_param_call(trace_state, param_set_trace_state, param_get_trace_state, NULL, 0644); NULL, 0644); /* -------------------------------------------------------------------------- DebugFS Interface -------------------------------------------------------------------------- */ static ssize_t cm_write(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) { static char *buf; static int uncopied_bytes; struct acpi_table_header table; acpi_status status; if (!(*ppos)) { /* parse the table header to get the table length */ if (count <= sizeof(struct acpi_table_header)) return -EINVAL; if (copy_from_user(&table, user_buf, sizeof(struct acpi_table_header))) return -EFAULT; uncopied_bytes = table.length; buf = kzalloc(uncopied_bytes, GFP_KERNEL); if (!buf) return -ENOMEM; } if (uncopied_bytes < count) { kfree(buf); return -EINVAL; } if (copy_from_user(buf + (*ppos), user_buf, count)) { kfree(buf); return -EFAULT; } uncopied_bytes -= count; *ppos += count; if (!uncopied_bytes) { status = acpi_install_method(buf); kfree(buf); if (ACPI_FAILURE(status)) return -EINVAL; add_taint(TAINT_OVERRIDDEN_ACPI_TABLE); } return count; } static const struct file_operations cm_fops = { .write = cm_write, }; static int acpi_debugfs_init(void) { struct dentry *acpi_dir, *cm_dentry; acpi_dir = debugfs_create_dir("acpi", NULL); if (!acpi_dir) goto err; cm_dentry = debugfs_create_file("custom_method", S_IWUGO, acpi_dir, NULL, &cm_fops); if (!cm_dentry) goto err; return 0; err: if (acpi_dir) debugfs_remove(acpi_dir); return -EINVAL; } /* -------------------------------------------------------------------------- /* -------------------------------------------------------------------------- FS Interface (/proc) FS Interface (/proc) -------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */ Loading Loading @@ -400,7 +326,6 @@ int __init acpi_procfs_init(void) int __init acpi_debug_init(void) int __init acpi_debug_init(void) { { acpi_debugfs_init(); acpi_procfs_init(); acpi_procfs_init(); return 0; return 0; } }