Commit 94f2bb9b authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branch 'acpi-trace'

* acpi-trace:
  ACPI / Documentation: Update method tracing documentation.
  ACPI / sysfs: Add support to allow leading "\" missing in trace_method_name.
  ACPI / sysfs: Update method tracing facility.
  ACPI / sysfs: Add ACPI_LV_REPAIR debug level.
parents 20a20008 cb4ff766
This diff is collapsed.
...@@ -83,6 +83,7 @@ static void *acpi_irq_context; ...@@ -83,6 +83,7 @@ static void *acpi_irq_context;
static struct workqueue_struct *kacpid_wq; static struct workqueue_struct *kacpid_wq;
static struct workqueue_struct *kacpi_notify_wq; static struct workqueue_struct *kacpi_notify_wq;
static struct workqueue_struct *kacpi_hotplug_wq; static struct workqueue_struct *kacpi_hotplug_wq;
static bool acpi_os_initialized;
/* /*
* This list of permanent mappings is for memory that may be accessed from * This list of permanent mappings is for memory that may be accessed from
...@@ -1316,6 +1317,9 @@ acpi_status acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 timeout) ...@@ -1316,6 +1317,9 @@ acpi_status acpi_os_wait_semaphore(acpi_handle handle, u32 units, u16 timeout)
long jiffies; long jiffies;
int ret = 0; int ret = 0;
if (!acpi_os_initialized)
return AE_OK;
if (!sem || (units < 1)) if (!sem || (units < 1))
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
...@@ -1355,6 +1359,9 @@ acpi_status acpi_os_signal_semaphore(acpi_handle handle, u32 units) ...@@ -1355,6 +1359,9 @@ acpi_status acpi_os_signal_semaphore(acpi_handle handle, u32 units)
{ {
struct semaphore *sem = (struct semaphore *)handle; struct semaphore *sem = (struct semaphore *)handle;
if (!acpi_os_initialized)
return AE_OK;
if (!sem || (units < 1)) if (!sem || (units < 1))
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
...@@ -1863,6 +1870,7 @@ acpi_status __init acpi_os_initialize(void) ...@@ -1863,6 +1870,7 @@ acpi_status __init acpi_os_initialize(void)
rv = acpi_os_map_generic_address(&acpi_gbl_FADT.reset_register); rv = acpi_os_map_generic_address(&acpi_gbl_FADT.reset_register);
pr_debug(PREFIX "%s: map reset_reg status %d\n", __func__, rv); pr_debug(PREFIX "%s: map reset_reg status %d\n", __func__, rv);
} }
acpi_os_initialized = true;
return AE_OK; return AE_OK;
} }
......
...@@ -69,6 +69,8 @@ static const struct acpi_dlevel acpi_debug_levels[] = { ...@@ -69,6 +69,8 @@ static const struct acpi_dlevel acpi_debug_levels[] = {
ACPI_DEBUG_INIT(ACPI_LV_INIT), ACPI_DEBUG_INIT(ACPI_LV_INIT),
ACPI_DEBUG_INIT(ACPI_LV_DEBUG_OBJECT), ACPI_DEBUG_INIT(ACPI_LV_DEBUG_OBJECT),
ACPI_DEBUG_INIT(ACPI_LV_INFO), ACPI_DEBUG_INIT(ACPI_LV_INFO),
ACPI_DEBUG_INIT(ACPI_LV_REPAIR),
ACPI_DEBUG_INIT(ACPI_LV_TRACE_POINT),
ACPI_DEBUG_INIT(ACPI_LV_INIT_NAMES), ACPI_DEBUG_INIT(ACPI_LV_INIT_NAMES),
ACPI_DEBUG_INIT(ACPI_LV_PARSE), ACPI_DEBUG_INIT(ACPI_LV_PARSE),
...@@ -162,55 +164,116 @@ static const struct kernel_param_ops param_ops_debug_level = { ...@@ -162,55 +164,116 @@ static const struct kernel_param_ops param_ops_debug_level = {
module_param_cb(debug_layer, &param_ops_debug_layer, &acpi_dbg_layer, 0644); module_param_cb(debug_layer, &param_ops_debug_layer, &acpi_dbg_layer, 0644);
module_param_cb(debug_level, &param_ops_debug_level, &acpi_dbg_level, 0644); module_param_cb(debug_level, &param_ops_debug_level, &acpi_dbg_level, 0644);
static char trace_method_name[6]; static char trace_method_name[1024];
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 param_set_trace_method_name(const char *val, const struct kernel_param *kp)
{ {
int result = 0; u32 saved_flags = 0;
bool is_abs_path = true;
if (!strncmp(val, "enable", sizeof("enable") - 1)) { if (*val != '\\')
result = acpi_debug_trace(trace_method_name, trace_debug_level, is_abs_path = false;
trace_debug_layer, 0);
if (result)
result = -EBUSY;
goto exit;
}
if (!strncmp(val, "disable", sizeof("disable") - 1)) { if ((is_abs_path && strlen(val) > 1023) ||
int name = 0; (!is_abs_path && strlen(val) > 1022)) {
result = acpi_debug_trace((char *)&name, trace_debug_level, pr_err("%s: string parameter too long\n", kp->name);
trace_debug_layer, 0); return -ENOSPC;
if (result)
result = -EBUSY;
goto exit;
} }
if (!strncmp(val, "1", 1)) { /*
result = acpi_debug_trace(trace_method_name, trace_debug_level, * It's not safe to update acpi_gbl_trace_method_name without
trace_debug_layer, 1); * having the tracer stopped, so we save the original tracer
if (result) * state and disable it.
result = -EBUSY; */
goto exit; saved_flags = acpi_gbl_trace_flags;
(void)acpi_debug_trace(NULL,
acpi_gbl_trace_dbg_level,
acpi_gbl_trace_dbg_layer,
0);
/* This is a hack. We can't kmalloc in early boot. */
if (is_abs_path)
strcpy(trace_method_name, val);
else {
trace_method_name[0] = '\\';
strcpy(trace_method_name+1, val);
} }
result = -EINVAL; /* Restore the original tracer state */
exit: (void)acpi_debug_trace(trace_method_name,
return result; acpi_gbl_trace_dbg_level,
acpi_gbl_trace_dbg_layer,
saved_flags);
return 0;
}
static int param_get_trace_method_name(char *buffer, const struct kernel_param *kp)
{
return scnprintf(buffer, PAGE_SIZE, "%s", acpi_gbl_trace_method_name);
}
static const struct kernel_param_ops param_ops_trace_method = {
.set = param_set_trace_method_name,
.get = param_get_trace_method_name,
};
static const struct kernel_param_ops param_ops_trace_attrib = {
.set = param_set_uint,
.get = param_get_uint,
};
module_param_cb(trace_method_name, &param_ops_trace_method, &trace_method_name, 0644);
module_param_cb(trace_debug_layer, &param_ops_trace_attrib, &acpi_gbl_trace_dbg_layer, 0644);
module_param_cb(trace_debug_level, &param_ops_trace_attrib, &acpi_gbl_trace_dbg_level, 0644);
static int param_set_trace_state(const char *val, struct kernel_param *kp)
{
acpi_status status;
const char *method = trace_method_name;
u32 flags = 0;
/* So "xxx-once" comparison should go prior than "xxx" comparison */
#define acpi_compare_param(val, key) \
strncmp((val), (key), sizeof(key) - 1)
if (!acpi_compare_param(val, "enable")) {
method = NULL;
flags = ACPI_TRACE_ENABLED;
} else if (!acpi_compare_param(val, "disable"))
method = NULL;
else if (!acpi_compare_param(val, "method-once"))
flags = ACPI_TRACE_ENABLED | ACPI_TRACE_ONESHOT;
else if (!acpi_compare_param(val, "method"))
flags = ACPI_TRACE_ENABLED;
else if (!acpi_compare_param(val, "opcode-once"))
flags = ACPI_TRACE_ENABLED | ACPI_TRACE_ONESHOT | ACPI_TRACE_OPCODE;
else if (!acpi_compare_param(val, "opcode"))
flags = ACPI_TRACE_ENABLED | ACPI_TRACE_OPCODE;
else
return -EINVAL;
status = acpi_debug_trace(method,
acpi_gbl_trace_dbg_level,
acpi_gbl_trace_dbg_layer,
flags);
if (ACPI_FAILURE(status))
return -EBUSY;
return 0;
} }
static int param_get_trace_state(char *buffer, struct kernel_param *kp) static int param_get_trace_state(char *buffer, struct kernel_param *kp)
{ {
if (!acpi_gbl_trace_method_name) if (!(acpi_gbl_trace_flags & ACPI_TRACE_ENABLED))
return sprintf(buffer, "disable"); return sprintf(buffer, "disable");
else { else {
if (acpi_gbl_trace_flags & 1) if (acpi_gbl_trace_method_name) {
return sprintf(buffer, "1"); if (acpi_gbl_trace_flags & ACPI_TRACE_ONESHOT)
else return sprintf(buffer, "method-once");
else
return sprintf(buffer, "method");
} else
return sprintf(buffer, "enable"); return sprintf(buffer, "enable");
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment