|
@@ -1,51 +1,218 @@
|
|
|
/*
|
|
|
- * acpi_system.c - ACPI System Driver ($Revision: 63 $)
|
|
|
- *
|
|
|
- * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
|
|
|
- * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
|
|
|
- *
|
|
|
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
- *
|
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
|
- * it under the terms of the GNU General Public License as published by
|
|
|
- * the Free Software Foundation; either version 2 of the License, or (at
|
|
|
- * your option) any later version.
|
|
|
- *
|
|
|
- * This program is distributed in the hope that it will be useful, but
|
|
|
- * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
- * General Public License for more details.
|
|
|
- *
|
|
|
- * You should have received a copy of the GNU General Public License along
|
|
|
- * with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
- * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
|
|
- *
|
|
|
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
+ * sysfs.c - ACPI sysfs interface to userspace.
|
|
|
*/
|
|
|
|
|
|
-#include <linux/proc_fs.h>
|
|
|
-#include <linux/seq_file.h>
|
|
|
-#include <linux/slab.h>
|
|
|
#include <linux/init.h>
|
|
|
-#include <linux/string.h>
|
|
|
-#include <asm/uaccess.h>
|
|
|
-
|
|
|
+#include <linux/kernel.h>
|
|
|
+#include <linux/moduleparam.h>
|
|
|
#include <acpi/acpi_drivers.h>
|
|
|
|
|
|
-#define PREFIX "ACPI: "
|
|
|
-
|
|
|
#define _COMPONENT ACPI_SYSTEM_COMPONENT
|
|
|
-ACPI_MODULE_NAME("system");
|
|
|
-
|
|
|
-#define ACPI_SYSTEM_CLASS "system"
|
|
|
-#define ACPI_SYSTEM_DEVICE_NAME "System"
|
|
|
+ACPI_MODULE_NAME("sysfs");
|
|
|
|
|
|
-u32 acpi_irq_handled;
|
|
|
-u32 acpi_irq_not_handled;
|
|
|
+#define PREFIX "ACPI: "
|
|
|
|
|
|
+#ifdef CONFIG_ACPI_DEBUG
|
|
|
/*
|
|
|
- * Make ACPICA version work as module param
|
|
|
+ * ACPI debug sysfs I/F, including:
|
|
|
+ * /sys/modules/acpi/parameters/debug_layer
|
|
|
+ * /sys/modules/acpi/parameters/debug_level
|
|
|
+ * /sys/modules/acpi/parameters/trace_method_name
|
|
|
+ * /sys/modules/acpi/parameters/trace_state
|
|
|
+ * /sys/modules/acpi/parameters/trace_debug_layer
|
|
|
+ * /sys/modules/acpi/parameters/trace_debug_level
|
|
|
*/
|
|
|
+
|
|
|
+struct acpi_dlayer {
|
|
|
+ const char *name;
|
|
|
+ unsigned long value;
|
|
|
+};
|
|
|
+struct acpi_dlevel {
|
|
|
+ const char *name;
|
|
|
+ unsigned long value;
|
|
|
+};
|
|
|
+#define ACPI_DEBUG_INIT(v) { .name = #v, .value = v }
|
|
|
+
|
|
|
+static const struct acpi_dlayer acpi_debug_layers[] = {
|
|
|
+ ACPI_DEBUG_INIT(ACPI_UTILITIES),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_HARDWARE),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_EVENTS),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_TABLES),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_NAMESPACE),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_PARSER),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_DISPATCHER),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_EXECUTER),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_RESOURCES),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_CA_DEBUGGER),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_OS_SERVICES),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_CA_DISASSEMBLER),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_COMPILER),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_TOOLS),
|
|
|
+
|
|
|
+ ACPI_DEBUG_INIT(ACPI_BUS_COMPONENT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_AC_COMPONENT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_BATTERY_COMPONENT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_BUTTON_COMPONENT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_SBS_COMPONENT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_FAN_COMPONENT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_PCI_COMPONENT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_POWER_COMPONENT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_CONTAINER_COMPONENT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_SYSTEM_COMPONENT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_THERMAL_COMPONENT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_MEMORY_DEVICE_COMPONENT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_VIDEO_COMPONENT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_PROCESSOR_COMPONENT),
|
|
|
+};
|
|
|
+
|
|
|
+static const struct acpi_dlevel acpi_debug_levels[] = {
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_INIT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_DEBUG_OBJECT),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_INFO),
|
|
|
+
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_INIT_NAMES),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_PARSE),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_LOAD),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_DISPATCH),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_EXEC),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_NAMES),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_OPREGION),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_BFIELD),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_TABLES),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_VALUES),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_OBJECTS),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_RESOURCES),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_USER_REQUESTS),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_PACKAGE),
|
|
|
+
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_ALLOCATIONS),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_FUNCTIONS),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_OPTIMIZATIONS),
|
|
|
+
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_MUTEX),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_THREADS),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_IO),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_INTERRUPTS),
|
|
|
+
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_AML_DISASSEMBLE),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_VERBOSE_INFO),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_FULL_TABLES),
|
|
|
+ ACPI_DEBUG_INIT(ACPI_LV_EVENTS),
|
|
|
+};
|
|
|
+
|
|
|
+static int param_get_debug_layer(char *buffer, struct kernel_param *kp)
|
|
|
+{
|
|
|
+ int result = 0;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ result = sprintf(buffer, "%-25s\tHex SET\n", "Description");
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(acpi_debug_layers); i++) {
|
|
|
+ result += sprintf(buffer + result, "%-25s\t0x%08lX [%c]\n",
|
|
|
+ acpi_debug_layers[i].name,
|
|
|
+ acpi_debug_layers[i].value,
|
|
|
+ (acpi_dbg_layer & acpi_debug_layers[i].value)
|
|
|
+ ? '*' : ' ');
|
|
|
+ }
|
|
|
+ result +=
|
|
|
+ sprintf(buffer + result, "%-25s\t0x%08X [%c]\n", "ACPI_ALL_DRIVERS",
|
|
|
+ ACPI_ALL_DRIVERS,
|
|
|
+ (acpi_dbg_layer & ACPI_ALL_DRIVERS) ==
|
|
|
+ ACPI_ALL_DRIVERS ? '*' : (acpi_dbg_layer & ACPI_ALL_DRIVERS)
|
|
|
+ == 0 ? ' ' : '-');
|
|
|
+ result +=
|
|
|
+ sprintf(buffer + result,
|
|
|
+ "--\ndebug_layer = 0x%08X ( * = enabled)\n",
|
|
|
+ acpi_dbg_layer);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+static int param_get_debug_level(char *buffer, struct kernel_param *kp)
|
|
|
+{
|
|
|
+ int result = 0;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ result = sprintf(buffer, "%-25s\tHex SET\n", "Description");
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(acpi_debug_levels); i++) {
|
|
|
+ result += sprintf(buffer + result, "%-25s\t0x%08lX [%c]\n",
|
|
|
+ acpi_debug_levels[i].name,
|
|
|
+ acpi_debug_levels[i].value,
|
|
|
+ (acpi_dbg_level & acpi_debug_levels[i].value)
|
|
|
+ ? '*' : ' ');
|
|
|
+ }
|
|
|
+ result +=
|
|
|
+ sprintf(buffer + result, "--\ndebug_level = 0x%08X (* = enabled)\n",
|
|
|
+ acpi_dbg_level);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+module_param_call(debug_layer, param_set_uint, param_get_debug_layer,
|
|
|
+ &acpi_dbg_layer, 0644);
|
|
|
+module_param_call(debug_level, param_set_uint, param_get_debug_level,
|
|
|
+ &acpi_dbg_level, 0644);
|
|
|
+
|
|
|
+static char trace_method_name[6];
|
|
|
+module_param_string(trace_method_name, trace_method_name, 6, 0644);
|
|
|
+static unsigned int trace_debug_layer;
|
|
|
+module_param(trace_debug_layer, uint, 0644);
|
|
|
+static unsigned int trace_debug_level;
|
|
|
+module_param(trace_debug_level, uint, 0644);
|
|
|
+
|
|
|
+static int param_set_trace_state(const char *val, struct kernel_param *kp)
|
|
|
+{
|
|
|
+ int result = 0;
|
|
|
+
|
|
|
+ if (!strncmp(val, "enable", strlen("enable") - 1)) {
|
|
|
+ result = acpi_debug_trace(trace_method_name, trace_debug_level,
|
|
|
+ trace_debug_layer, 0);
|
|
|
+ if (result)
|
|
|
+ result = -EBUSY;
|
|
|
+ goto exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!strncmp(val, "disable", strlen("disable") - 1)) {
|
|
|
+ int name = 0;
|
|
|
+ result = acpi_debug_trace((char *)&name, trace_debug_level,
|
|
|
+ trace_debug_layer, 0);
|
|
|
+ if (result)
|
|
|
+ result = -EBUSY;
|
|
|
+ goto exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!strncmp(val, "1", 1)) {
|
|
|
+ result = acpi_debug_trace(trace_method_name, trace_debug_level,
|
|
|
+ trace_debug_layer, 1);
|
|
|
+ if (result)
|
|
|
+ result = -EBUSY;
|
|
|
+ goto exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ result = -EINVAL;
|
|
|
+exit:
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+static int param_get_trace_state(char *buffer, struct kernel_param *kp)
|
|
|
+{
|
|
|
+ if (!acpi_gbl_trace_method_name)
|
|
|
+ return sprintf(buffer, "disable");
|
|
|
+ else {
|
|
|
+ if (acpi_gbl_trace_flags & 1)
|
|
|
+ return sprintf(buffer, "1");
|
|
|
+ else
|
|
|
+ return sprintf(buffer, "enable");
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+module_param_call(trace_state, param_set_trace_state, param_get_trace_state,
|
|
|
+ NULL, 0644);
|
|
|
+#endif /* CONFIG_ACPI_DEBUG */
|
|
|
+
|
|
|
+/* /sys/module/acpi/parameters/acpica_version */
|
|
|
static int param_get_acpica_version(char *buffer, struct kernel_param *kp)
|
|
|
{
|
|
|
int result;
|
|
@@ -57,9 +224,12 @@ static int param_get_acpica_version(char *buffer, struct kernel_param *kp)
|
|
|
|
|
|
module_param_call(acpica_version, NULL, param_get_acpica_version, NULL, 0444);
|
|
|
|
|
|
-/* --------------------------------------------------------------------------
|
|
|
- FS Interface (/sys)
|
|
|
- -------------------------------------------------------------------------- */
|
|
|
+/*
|
|
|
+ * ACPI table sysfs I/F:
|
|
|
+ * /sys/firmware/acpi/tables/
|
|
|
+ * /sys/firmware/acpi/tables/dynamic/
|
|
|
+ */
|
|
|
+
|
|
|
static LIST_HEAD(acpi_table_attr_list);
|
|
|
static struct kobject *tables_kobj;
|
|
|
static struct kobject *dynamic_tables_kobj;
|
|
@@ -86,14 +256,12 @@ static ssize_t acpi_table_show(struct file *filp, struct kobject *kobj,
|
|
|
else
|
|
|
memcpy(name, "\0\0\0\0", 4);
|
|
|
|
|
|
- status =
|
|
|
- acpi_get_table(name, table_attr->instance,
|
|
|
- &table_header);
|
|
|
+ status = acpi_get_table(name, table_attr->instance, &table_header);
|
|
|
if (ACPI_FAILURE(status))
|
|
|
return -ENODEV;
|
|
|
|
|
|
return memory_read_from_buffer(buf, count, &offset,
|
|
|
- table_header, table_header->length);
|
|
|
+ table_header, table_header->length);
|
|
|
}
|
|
|
|
|
|
static void acpi_table_attr_init(struct acpi_table_attr *table_attr,
|
|
@@ -105,7 +273,7 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr,
|
|
|
sysfs_attr_init(&table_attr->attr.attr);
|
|
|
if (table_header->signature[0] != '\0')
|
|
|
memcpy(table_attr->name, table_header->signature,
|
|
|
- ACPI_NAME_SIZE);
|
|
|
+ ACPI_NAME_SIZE);
|
|
|
else
|
|
|
memcpy(table_attr->name, "NULL", 4);
|
|
|
|
|
@@ -117,8 +285,8 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr,
|
|
|
table_attr->instance++;
|
|
|
|
|
|
if (table_attr->instance > 1 || (table_attr->instance == 1 &&
|
|
|
- !acpi_get_table
|
|
|
- (table_header->signature, 2, &header)))
|
|
|
+ !acpi_get_table
|
|
|
+ (table_header->signature, 2, &header)))
|
|
|
sprintf(table_attr->name + ACPI_NAME_SIZE, "%d",
|
|
|
table_attr->instance);
|
|
|
|
|
@@ -138,18 +306,17 @@ acpi_sysfs_table_handler(u32 event, void *table, void *context)
|
|
|
switch (event) {
|
|
|
case ACPI_TABLE_EVENT_LOAD:
|
|
|
table_attr =
|
|
|
- kzalloc(sizeof(struct acpi_table_attr), GFP_KERNEL);
|
|
|
+ kzalloc(sizeof(struct acpi_table_attr), GFP_KERNEL);
|
|
|
if (!table_attr)
|
|
|
return AE_NO_MEMORY;
|
|
|
|
|
|
acpi_table_attr_init(table_attr, table);
|
|
|
if (sysfs_create_bin_file(dynamic_tables_kobj,
|
|
|
- &table_attr->attr)) {
|
|
|
+ &table_attr->attr)) {
|
|
|
kfree(table_attr);
|
|
|
return AE_ERROR;
|
|
|
} else
|
|
|
- list_add_tail(&table_attr->node,
|
|
|
- &acpi_table_attr_list);
|
|
|
+ list_add_tail(&table_attr->node, &acpi_table_attr_list);
|
|
|
break;
|
|
|
case ACPI_TABLE_EVENT_UNLOAD:
|
|
|
/*
|
|
@@ -164,7 +331,7 @@ acpi_sysfs_table_handler(u32 event, void *table, void *context)
|
|
|
return AE_OK;
|
|
|
}
|
|
|
|
|
|
-static int acpi_system_sysfs_init(void)
|
|
|
+static int acpi_tables_sysfs_init(void)
|
|
|
{
|
|
|
struct acpi_table_attr *table_attr;
|
|
|
struct acpi_table_header *table_header = NULL;
|
|
@@ -213,14 +380,17 @@ err:
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Detailed ACPI IRQ counters in /sys/firmware/acpi/interrupts/
|
|
|
- * See Documentation/ABI/testing/sysfs-firmware-acpi
|
|
|
+ * Detailed ACPI IRQ counters:
|
|
|
+ * /sys/firmware/acpi/interrupts/
|
|
|
*/
|
|
|
|
|
|
+u32 acpi_irq_handled;
|
|
|
+u32 acpi_irq_not_handled;
|
|
|
+
|
|
|
#define COUNT_GPE 0
|
|
|
-#define COUNT_SCI 1 /* acpi_irq_handled */
|
|
|
-#define COUNT_SCI_NOT 2 /* acpi_irq_not_handled */
|
|
|
-#define COUNT_ERROR 3 /* other */
|
|
|
+#define COUNT_SCI 1 /* acpi_irq_handled */
|
|
|
+#define COUNT_SCI_NOT 2 /* acpi_irq_not_handled */
|
|
|
+#define COUNT_ERROR 3 /* other */
|
|
|
#define NUM_COUNTERS_EXTRA 4
|
|
|
|
|
|
struct event_counter {
|
|
@@ -237,6 +407,7 @@ static u32 acpi_gpe_count;
|
|
|
static struct attribute_group interrupt_stats_attr_group = {
|
|
|
.name = "interrupts",
|
|
|
};
|
|
|
+
|
|
|
static struct kobj_attribute *counter_attrs;
|
|
|
|
|
|
static void delete_gpe_attr_array(void)
|
|
@@ -269,8 +440,8 @@ void acpi_os_gpe_count(u32 gpe_number)
|
|
|
if (gpe_number < num_gpes)
|
|
|
all_counters[gpe_number].count++;
|
|
|
else
|
|
|
- all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_ERROR].
|
|
|
- count++;
|
|
|
+ all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS +
|
|
|
+ COUNT_ERROR].count++;
|
|
|
|
|
|
return;
|
|
|
}
|
|
@@ -283,13 +454,14 @@ void acpi_os_fixed_event_count(u32 event_number)
|
|
|
if (event_number < ACPI_NUM_FIXED_EVENTS)
|
|
|
all_counters[num_gpes + event_number].count++;
|
|
|
else
|
|
|
- all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_ERROR].
|
|
|
- count++;
|
|
|
+ all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS +
|
|
|
+ COUNT_ERROR].count++;
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
-static int get_status(u32 index, acpi_event_status *status, acpi_handle *handle)
|
|
|
+static int get_status(u32 index, acpi_event_status *status,
|
|
|
+ acpi_handle *handle)
|
|
|
{
|
|
|
int result = 0;
|
|
|
|
|
@@ -300,7 +472,7 @@ static int get_status(u32 index, acpi_event_status *status, acpi_handle *handle)
|
|
|
result = acpi_get_gpe_device(index, handle);
|
|
|
if (result) {
|
|
|
ACPI_EXCEPTION((AE_INFO, AE_NOT_FOUND,
|
|
|
- "Invalid GPE 0x%x\n", index));
|
|
|
+ "Invalid GPE 0x%x\n", index));
|
|
|
goto end;
|
|
|
}
|
|
|
result = acpi_get_gpe_status(*handle, index, status);
|
|
@@ -312,7 +484,7 @@ end:
|
|
|
}
|
|
|
|
|
|
static ssize_t counter_show(struct kobject *kobj,
|
|
|
- struct kobj_attribute *attr, char *buf)
|
|
|
+ struct kobj_attribute *attr, char *buf)
|
|
|
{
|
|
|
int index = attr - counter_attrs;
|
|
|
int size;
|
|
@@ -321,12 +493,11 @@ static ssize_t counter_show(struct kobject *kobj,
|
|
|
int result = 0;
|
|
|
|
|
|
all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI].count =
|
|
|
- acpi_irq_handled;
|
|
|
+ acpi_irq_handled;
|
|
|
all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_SCI_NOT].count =
|
|
|
- acpi_irq_not_handled;
|
|
|
+ acpi_irq_not_handled;
|
|
|
all_counters[num_gpes + ACPI_NUM_FIXED_EVENTS + COUNT_GPE].count =
|
|
|
- acpi_gpe_count;
|
|
|
-
|
|
|
+ acpi_gpe_count;
|
|
|
size = sprintf(buf, "%8d", all_counters[index].count);
|
|
|
|
|
|
/* "gpe_all" or "sci" */
|
|
@@ -338,13 +509,13 @@ static ssize_t counter_show(struct kobject *kobj,
|
|
|
goto end;
|
|
|
|
|
|
if (!(status & ACPI_EVENT_FLAG_HANDLE))
|
|
|
- size += sprintf(buf + size, " invalid");
|
|
|
+ size += sprintf(buf + size, " invalid");
|
|
|
else if (status & ACPI_EVENT_FLAG_ENABLED)
|
|
|
- size += sprintf(buf + size, " enabled");
|
|
|
+ size += sprintf(buf + size, " enabled");
|
|
|
else if (status & ACPI_EVENT_FLAG_WAKE_ENABLED)
|
|
|
- size += sprintf(buf + size, " wake_enabled");
|
|
|
+ size += sprintf(buf + size, " wake_enabled");
|
|
|
else
|
|
|
- size += sprintf(buf + size, " disabled");
|
|
|
+ size += sprintf(buf + size, " disabled");
|
|
|
|
|
|
end:
|
|
|
size += sprintf(buf + size, "\n");
|
|
@@ -357,7 +528,8 @@ end:
|
|
|
* enable/disable/clear a gpe/fixed event in user space.
|
|
|
*/
|
|
|
static ssize_t counter_set(struct kobject *kobj,
|
|
|
- struct kobj_attribute *attr, const char *buf, size_t size)
|
|
|
+ struct kobj_attribute *attr, const char *buf,
|
|
|
+ size_t size)
|
|
|
{
|
|
|
int index = attr - counter_attrs;
|
|
|
acpi_event_status status;
|
|
@@ -381,32 +553,32 @@ static ssize_t counter_set(struct kobject *kobj,
|
|
|
|
|
|
if (!(status & ACPI_EVENT_FLAG_HANDLE)) {
|
|
|
printk(KERN_WARNING PREFIX
|
|
|
- "Can not change Invalid GPE/Fixed Event status\n");
|
|
|
+ "Can not change Invalid GPE/Fixed Event status\n");
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
if (index < num_gpes) {
|
|
|
if (!strcmp(buf, "disable\n") &&
|
|
|
- (status & ACPI_EVENT_FLAG_ENABLED))
|
|
|
+ (status & ACPI_EVENT_FLAG_ENABLED))
|
|
|
result = acpi_disable_gpe(handle, index);
|
|
|
else if (!strcmp(buf, "enable\n") &&
|
|
|
- !(status & ACPI_EVENT_FLAG_ENABLED))
|
|
|
+ !(status & ACPI_EVENT_FLAG_ENABLED))
|
|
|
result = acpi_enable_gpe(handle, index);
|
|
|
else if (!strcmp(buf, "clear\n") &&
|
|
|
- (status & ACPI_EVENT_FLAG_SET))
|
|
|
+ (status & ACPI_EVENT_FLAG_SET))
|
|
|
result = acpi_clear_gpe(handle, index);
|
|
|
else
|
|
|
all_counters[index].count = strtoul(buf, NULL, 0);
|
|
|
} else if (index < num_gpes + ACPI_NUM_FIXED_EVENTS) {
|
|
|
int event = index - num_gpes;
|
|
|
if (!strcmp(buf, "disable\n") &&
|
|
|
- (status & ACPI_EVENT_FLAG_ENABLED))
|
|
|
+ (status & ACPI_EVENT_FLAG_ENABLED))
|
|
|
result = acpi_disable_event(event, ACPI_NOT_ISR);
|
|
|
else if (!strcmp(buf, "enable\n") &&
|
|
|
- !(status & ACPI_EVENT_FLAG_ENABLED))
|
|
|
+ !(status & ACPI_EVENT_FLAG_ENABLED))
|
|
|
result = acpi_enable_event(event, ACPI_NOT_ISR);
|
|
|
else if (!strcmp(buf, "clear\n") &&
|
|
|
- (status & ACPI_EVENT_FLAG_SET))
|
|
|
+ (status & ACPI_EVENT_FLAG_SET))
|
|
|
result = acpi_clear_event(event);
|
|
|
else
|
|
|
all_counters[index].count = strtoul(buf, NULL, 0);
|
|
@@ -430,17 +602,17 @@ void acpi_irq_stats_init(void)
|
|
|
num_counters = num_gpes + ACPI_NUM_FIXED_EVENTS + NUM_COUNTERS_EXTRA;
|
|
|
|
|
|
all_attrs = kzalloc(sizeof(struct attribute *) * (num_counters + 1),
|
|
|
- GFP_KERNEL);
|
|
|
+ GFP_KERNEL);
|
|
|
if (all_attrs == NULL)
|
|
|
return;
|
|
|
|
|
|
all_counters = kzalloc(sizeof(struct event_counter) * (num_counters),
|
|
|
- GFP_KERNEL);
|
|
|
+ GFP_KERNEL);
|
|
|
if (all_counters == NULL)
|
|
|
goto fail;
|
|
|
|
|
|
counter_attrs = kzalloc(sizeof(struct kobj_attribute) * (num_counters),
|
|
|
- GFP_KERNEL);
|
|
|
+ GFP_KERNEL);
|
|
|
if (counter_attrs == NULL)
|
|
|
goto fail;
|
|
|
|
|
@@ -503,135 +675,11 @@ static void __exit interrupt_stats_exit(void)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
-/* --------------------------------------------------------------------------
|
|
|
- FS Interface (/proc)
|
|
|
- -------------------------------------------------------------------------- */
|
|
|
-#ifdef CONFIG_ACPI_PROCFS
|
|
|
-#define ACPI_SYSTEM_FILE_INFO "info"
|
|
|
-#define ACPI_SYSTEM_FILE_EVENT "event"
|
|
|
-#define ACPI_SYSTEM_FILE_DSDT "dsdt"
|
|
|
-#define ACPI_SYSTEM_FILE_FADT "fadt"
|
|
|
-
|
|
|
-static int acpi_system_read_info(struct seq_file *seq, void *offset)
|
|
|
-{
|
|
|
-
|
|
|
- seq_printf(seq, "version: %x\n", ACPI_CA_VERSION);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int acpi_system_info_open_fs(struct inode *inode, struct file *file)
|
|
|
-{
|
|
|
- return single_open(file, acpi_system_read_info, PDE(inode)->data);
|
|
|
-}
|
|
|
-
|
|
|
-static const struct file_operations acpi_system_info_ops = {
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .open = acpi_system_info_open_fs,
|
|
|
- .read = seq_read,
|
|
|
- .llseek = seq_lseek,
|
|
|
- .release = single_release,
|
|
|
-};
|
|
|
-
|
|
|
-static ssize_t acpi_system_read_dsdt(struct file *, char __user *, size_t,
|
|
|
- loff_t *);
|
|
|
-
|
|
|
-static const struct file_operations acpi_system_dsdt_ops = {
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .read = acpi_system_read_dsdt,
|
|
|
-};
|
|
|
-
|
|
|
-static ssize_t
|
|
|
-acpi_system_read_dsdt(struct file *file,
|
|
|
- char __user * buffer, size_t count, loff_t * ppos)
|
|
|
-{
|
|
|
- acpi_status status = AE_OK;
|
|
|
- struct acpi_table_header *dsdt = NULL;
|
|
|
- ssize_t res;
|
|
|
-
|
|
|
- status = acpi_get_table(ACPI_SIG_DSDT, 1, &dsdt);
|
|
|
- if (ACPI_FAILURE(status))
|
|
|
- return -ENODEV;
|
|
|
-
|
|
|
- res = simple_read_from_buffer(buffer, count, ppos, dsdt, dsdt->length);
|
|
|
-
|
|
|
- return res;
|
|
|
-}
|
|
|
-
|
|
|
-static ssize_t acpi_system_read_fadt(struct file *, char __user *, size_t,
|
|
|
- loff_t *);
|
|
|
-
|
|
|
-static const struct file_operations acpi_system_fadt_ops = {
|
|
|
- .owner = THIS_MODULE,
|
|
|
- .read = acpi_system_read_fadt,
|
|
|
-};
|
|
|
-
|
|
|
-static ssize_t
|
|
|
-acpi_system_read_fadt(struct file *file,
|
|
|
- char __user * buffer, size_t count, loff_t * ppos)
|
|
|
-{
|
|
|
- acpi_status status = AE_OK;
|
|
|
- struct acpi_table_header *fadt = NULL;
|
|
|
- ssize_t res;
|
|
|
-
|
|
|
- status = acpi_get_table(ACPI_SIG_FADT, 1, &fadt);
|
|
|
- if (ACPI_FAILURE(status))
|
|
|
- return -ENODEV;
|
|
|
-
|
|
|
- res = simple_read_from_buffer(buffer, count, ppos, fadt, fadt->length);
|
|
|
-
|
|
|
- return res;
|
|
|
-}
|
|
|
-
|
|
|
-static int acpi_system_procfs_init(void)
|
|
|
-{
|
|
|
- struct proc_dir_entry *entry;
|
|
|
- int error = 0;
|
|
|
-
|
|
|
- /* 'info' [R] */
|
|
|
- entry = proc_create(ACPI_SYSTEM_FILE_INFO, S_IRUGO, acpi_root_dir,
|
|
|
- &acpi_system_info_ops);
|
|
|
- if (!entry)
|
|
|
- goto Error;
|
|
|
-
|
|
|
- /* 'dsdt' [R] */
|
|
|
- entry = proc_create(ACPI_SYSTEM_FILE_DSDT, S_IRUSR, acpi_root_dir,
|
|
|
- &acpi_system_dsdt_ops);
|
|
|
- if (!entry)
|
|
|
- goto Error;
|
|
|
-
|
|
|
- /* 'fadt' [R] */
|
|
|
- entry = proc_create(ACPI_SYSTEM_FILE_FADT, S_IRUSR, acpi_root_dir,
|
|
|
- &acpi_system_fadt_ops);
|
|
|
- if (!entry)
|
|
|
- goto Error;
|
|
|
-
|
|
|
- Done:
|
|
|
- return error;
|
|
|
-
|
|
|
- Error:
|
|
|
- remove_proc_entry(ACPI_SYSTEM_FILE_FADT, acpi_root_dir);
|
|
|
- remove_proc_entry(ACPI_SYSTEM_FILE_DSDT, acpi_root_dir);
|
|
|
- remove_proc_entry(ACPI_SYSTEM_FILE_INFO, acpi_root_dir);
|
|
|
-
|
|
|
- error = -EFAULT;
|
|
|
- goto Done;
|
|
|
-}
|
|
|
-#else
|
|
|
-static int acpi_system_procfs_init(void)
|
|
|
-{
|
|
|
- return 0;
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
-int __init acpi_system_init(void)
|
|
|
+int __init acpi_sysfs_init(void)
|
|
|
{
|
|
|
int result;
|
|
|
|
|
|
- result = acpi_system_procfs_init();
|
|
|
- if (result)
|
|
|
- return result;
|
|
|
-
|
|
|
- result = acpi_system_sysfs_init();
|
|
|
+ result = acpi_tables_sysfs_init();
|
|
|
|
|
|
return result;
|
|
|
}
|