Module Name: src
Committed By: jruoho
Date: Mon Apr 12 12:14:26 UTC 2010
Modified Files:
src/sys/dev/acpi: acpi.c acpi_debug.c acpi_wakedev.c acpivar.h
Log Message:
Rework the sysctl-support.
Changes:
hw.wake -> hw.acpi.wake
hw.acpi.debug_layer -> hw.acpi.debug.layer
hw.acpi.debug_level -> hw.acpi.debug.level
Additions:
hw.acpi.stat.gpe # Number of dispatched GPEs
hw.acpi.stat.sci # Number of SCI interrupts
hw.acpi.stat.fixed # Number of fixed events
hw.acpi.stat.method # Number of executed methods
ok jmcneill@
To generate a diff of this commit:
cvs rdiff -u -r1.164 -r1.165 src/sys/dev/acpi/acpi.c
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/acpi/acpi_debug.c
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/acpi/acpi_wakedev.c
cvs rdiff -u -r1.44 -r1.45 src/sys/dev/acpi/acpivar.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/acpi/acpi.c
diff -u src/sys/dev/acpi/acpi.c:1.164 src/sys/dev/acpi/acpi.c:1.165
--- src/sys/dev/acpi/acpi.c:1.164 Thu Apr 8 04:40:51 2010
+++ src/sys/dev/acpi/acpi.c Mon Apr 12 12:14:26 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi.c,v 1.164 2010/04/08 04:40:51 jruoho Exp $ */
+/* $NetBSD: acpi.c,v 1.165 2010/04/12 12:14:26 jruoho Exp $ */
/*-
* Copyright (c) 2003, 2007 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi.c,v 1.164 2010/04/08 04:40:51 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi.c,v 1.165 2010/04/12 12:14:26 jruoho Exp $");
#include "opt_acpi.h"
#include "opt_pcifixup.h"
@@ -133,6 +133,7 @@
static int acpi_print(void *aux, const char *);
+static int sysctl_hw_acpi_fixedstats(SYSCTLFN_ARGS);
static int sysctl_hw_acpi_sleepstate(SYSCTLFN_ARGS);
extern struct cfdriver acpi_cd;
@@ -1736,63 +1737,131 @@
SYSCTL_SETUP(sysctl_acpi_setup, "sysctl hw.acpi subtree setup")
{
- const struct sysctlnode *node;
- const struct sysctlnode *ssnode;
+ const struct sysctlnode *mnode, *rnode;
+ int err;
- if (sysctl_createv(clog, 0, NULL, NULL,
- CTLFLAG_PERMANENT,
- CTLTYPE_NODE, "hw", NULL,
- NULL, 0, NULL, 0,
- CTL_HW, CTL_EOL) != 0)
+ err = sysctl_createv(clog, 0, NULL, &rnode,
+ CTLFLAG_PERMANENT, CTLTYPE_NODE, "hw",
+ NULL, NULL, 0, NULL, 0,
+ CTL_HW, CTL_EOL);
+
+ if (err != 0)
return;
- if (sysctl_createv(clog, 0, NULL, &node,
- CTLFLAG_PERMANENT,
- CTLTYPE_NODE, "acpi", NULL,
+ err = sysctl_createv(clog, 0, &rnode, &rnode,
+ CTLFLAG_PERMANENT, CTLTYPE_NODE,
+ "acpi", SYSCTL_DESCR("ACPI subsystem parameters"),
NULL, 0, NULL, 0,
- CTL_HW, CTL_CREATE, CTL_EOL) != 0)
+ CTL_CREATE, CTL_EOL);
+
+ if (err != 0)
return;
- sysctl_createv(NULL, 0, NULL, NULL, CTLFLAG_READONLY,
- CTLTYPE_QUAD, "root",
- SYSCTL_DESCR("ACPI root pointer"),
+ (void)sysctl_createv(NULL, 0, &rnode, NULL,
+ CTLFLAG_PERMANENT | CTLFLAG_READONLY, CTLTYPE_QUAD,
+ "root", SYSCTL_DESCR("ACPI root pointer"),
NULL, 0, &acpi_root_pointer, sizeof(acpi_root_pointer),
- CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
- sysctl_createv(NULL, 0, NULL, NULL, CTLFLAG_READONLY,
- CTLTYPE_STRING, "supported_states",
- SYSCTL_DESCR("Supported ACPI system states"),
+ CTL_CREATE, CTL_EOL);
+
+ (void)sysctl_createv(NULL, 0, &rnode, NULL,
+ CTLFLAG_PERMANENT | CTLFLAG_READONLY, CTLTYPE_STRING,
+ "supported_states", SYSCTL_DESCR("Supported system states"),
NULL, 0, acpi_supported_states, 0,
- CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
+ CTL_CREATE, CTL_EOL);
- /* ACPI sleepstate sysctl */
- if (sysctl_createv(NULL, 0, NULL, &node,
- CTLFLAG_PERMANENT,
- CTLTYPE_NODE, "machdep", NULL,
- NULL, 0, NULL, 0, CTL_MACHDEP, CTL_EOL) != 0)
- return;
- if (sysctl_createv(NULL, 0, &node, &ssnode,
- CTLFLAG_READWRITE, CTLTYPE_INT, "sleep_state",
- NULL, sysctl_hw_acpi_sleepstate, 0, NULL, 0, CTL_CREATE,
- CTL_EOL) != 0)
+ err = sysctl_createv(NULL, 0, NULL, &mnode,
+ CTLFLAG_PERMANENT, CTLTYPE_NODE, "machdep",
+ NULL, NULL, 0, NULL, 0,
+ CTL_MACHDEP, CTL_EOL);
+
+ if (err == 0) {
+
+ (void)sysctl_createv(NULL, 0, &mnode, NULL,
+ CTLFLAG_PERMANENT | CTLFLAG_READWRITE, CTLTYPE_INT,
+ "sleep_state", SYSCTL_DESCR("System sleep state"),
+ sysctl_hw_acpi_sleepstate, 0, NULL, 0,
+ CTL_CREATE, CTL_EOL);
+ }
+
+ err = sysctl_createv(clog, 0, &rnode, &rnode,
+ CTLFLAG_PERMANENT, CTLTYPE_NODE,
+ "stat", SYSCTL_DESCR("ACPI statistics"),
+ NULL, 0, NULL, 0,
+ CTL_CREATE, CTL_EOL);
+
+ if (err != 0)
return;
+
+ (void)sysctl_createv(clog, 0, &rnode, NULL,
+ CTLFLAG_PERMANENT | CTLFLAG_READONLY, CTLTYPE_QUAD,
+ "gpe", SYSCTL_DESCR("Number of dispatched GPEs"),
+ NULL, 0, &AcpiGpeCount, sizeof(AcpiGpeCount),
+ CTL_CREATE, CTL_EOL);
+
+ (void)sysctl_createv(clog, 0, &rnode, NULL,
+ CTLFLAG_PERMANENT | CTLFLAG_READONLY, CTLTYPE_QUAD,
+ "sci", SYSCTL_DESCR("Number of SCI interrupts"),
+ NULL, 0, &AcpiSciCount, sizeof(AcpiSciCount),
+ CTL_CREATE, CTL_EOL);
+
+ (void)sysctl_createv(clog, 0, &rnode, NULL,
+ CTLFLAG_PERMANENT | CTLFLAG_READONLY, CTLTYPE_QUAD,
+ "fixed", SYSCTL_DESCR("Number of fixed events"),
+ sysctl_hw_acpi_fixedstats, 0, NULL, 0,
+ CTL_CREATE, CTL_EOL);
+
+ (void)sysctl_createv(clog, 0, &rnode, NULL,
+ CTLFLAG_PERMANENT | CTLFLAG_READONLY, CTLTYPE_QUAD,
+ "method", SYSCTL_DESCR("Number of methods executed"),
+ NULL, 0, &AcpiMethodCount, sizeof(AcpiMethodCount),
+ CTL_CREATE, CTL_EOL);
+
+ CTASSERT(sizeof(AcpiGpeCount) == sizeof(uint64_t));
+ CTASSERT(sizeof(AcpiSciCount) == sizeof(uint64_t));
+}
+
+static int
+sysctl_hw_acpi_fixedstats(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node;
+ uint64_t t;
+ int err, i;
+
+ for (i = t = 0; i < __arraycount(AcpiFixedEventCount); i++)
+ t += AcpiFixedEventCount[i];
+
+ node = *rnode;
+ node.sysctl_data = &t;
+
+ err = sysctl_lookup(SYSCTLFN_CALL(&node));
+
+ if (err || newp == NULL)
+ return err;
+
+ return 0;
}
static int
sysctl_hw_acpi_sleepstate(SYSCTLFN_ARGS)
{
- int error, t;
struct sysctlnode node;
+ int err, t;
node = *rnode;
t = acpi_sleepstate;
node.sysctl_data = &t;
- error = sysctl_lookup(SYSCTLFN_CALL(&node));
- if (error || newp == NULL)
- return error;
+
+ err = sysctl_lookup(SYSCTLFN_CALL(&node));
+
+ if (err || newp == NULL)
+ return err;
if (acpi_softc == NULL)
return ENOSYS;
+ if (t < ACPI_STATE_S0 || t > ACPI_STATE_S5)
+ return EINVAL;
+
acpi_enter_sleep_state(acpi_softc, t);
return 0;
Index: src/sys/dev/acpi/acpi_debug.c
diff -u src/sys/dev/acpi/acpi_debug.c:1.1 src/sys/dev/acpi/acpi_debug.c:1.2
--- src/sys/dev/acpi/acpi_debug.c:1.1 Sun Jan 31 11:26:20 2010
+++ src/sys/dev/acpi/acpi_debug.c Mon Apr 12 12:14:26 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_debug.c,v 1.1 2010/01/31 11:26:20 jruoho Exp $ */
+/* $NetBSD: acpi_debug.c,v 1.2 2010/04/12 12:14:26 jruoho Exp $ */
/*-
* Copyright (c) 2010 Jukka Ruohonen <[email protected]>
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_debug.c,v 1.1 2010/01/31 11:26:20 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_debug.c,v 1.2 2010/04/12 12:14:26 jruoho Exp $");
#include <sys/param.h>
#include <sys/sysctl.h>
@@ -65,9 +65,8 @@
void
acpi_debug_init(void)
{
- const struct sysctlnode *node;
- const char *layer;
- const char *level;
+ const struct sysctlnode *rnode;
+ const char *layer, *level;
int rv;
KASSERT(acpi_debug_layer_d == NULL);
@@ -78,34 +77,45 @@
if (rv != 0)
goto fail;
- rv = sysctl_createv(NULL, 0, NULL, NULL,
+ rv = sysctl_createv(NULL, 0, NULL, &rnode,
CTLFLAG_PERMANENT, CTLTYPE_NODE, "hw",
- NULL, NULL, 0, NULL, 0, CTL_HW, CTL_EOL);
+ NULL, NULL, 0, NULL, 0,
+ CTL_HW, CTL_EOL);
if (rv != 0)
goto fail;
- rv = sysctl_createv(NULL, 0, NULL, &node,
+ rv = sysctl_createv(NULL, 0, &rnode, &rnode,
CTLFLAG_PERMANENT, CTLTYPE_NODE, "acpi",
- NULL, NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL);
+ NULL, NULL, 0, NULL, 0,
+ CTL_CREATE, CTL_EOL);
if (rv != 0)
goto fail;
- rv = sysctl_createv(NULL, 0, NULL, NULL,
- CTLFLAG_READWRITE, CTLTYPE_STRING, "debug_layer",
+ rv = sysctl_createv(NULL, 0, &rnode, &rnode,
+ 0, CTLTYPE_NODE, "debug",
+ SYSCTL_DESCR("ACPI debug subtree"),
+ NULL, 0, NULL, 0,
+ CTL_CREATE, CTL_EOL);
+
+ if (rv != 0)
+ goto fail;
+
+ rv = sysctl_createv(NULL, 0, &rnode, NULL,
+ CTLFLAG_READWRITE, CTLTYPE_STRING, "layer",
SYSCTL_DESCR("ACPI debug layer"),
acpi_debug_sysctl_layer, 0, acpi_debug_layer_s, ACPI_DEBUG_MAX,
- CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
+ CTL_CREATE, CTL_EOL);
if (rv != 0)
goto fail;
- rv = sysctl_createv(NULL, 0, NULL, NULL,
- CTLFLAG_READWRITE, CTLTYPE_STRING, "debug_level",
+ rv = sysctl_createv(NULL, 0, &rnode, NULL,
+ CTLFLAG_READWRITE, CTLTYPE_STRING, "level",
SYSCTL_DESCR("ACPI debug level"),
acpi_debug_sysctl_level, 0, acpi_debug_level_s, ACPI_DEBUG_MAX,
- CTL_HW, node->sysctl_num, CTL_CREATE, CTL_EOL);
+ CTL_CREATE, CTL_EOL);
if (rv != 0)
goto fail;
Index: src/sys/dev/acpi/acpi_wakedev.c
diff -u src/sys/dev/acpi/acpi_wakedev.c:1.8 src/sys/dev/acpi/acpi_wakedev.c:1.9
--- src/sys/dev/acpi/acpi_wakedev.c:1.8 Tue Mar 16 07:18:55 2010
+++ src/sys/dev/acpi/acpi_wakedev.c Mon Apr 12 12:14:26 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_wakedev.c,v 1.8 2010/03/16 07:18:55 jruoho Exp $ */
+/* $NetBSD: acpi_wakedev.c,v 1.9 2010/04/12 12:14:26 jruoho Exp $ */
/*-
* Copyright (c) 2009 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_wakedev.c,v 1.8 2010/03/16 07:18:55 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_wakedev.c,v 1.9 2010/04/12 12:14:26 jruoho Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -41,8 +41,6 @@
#define _COMPONENT ACPI_BUS_COMPONENT
ACPI_MODULE_NAME ("acpi_wakedev")
-static int acpi_wakedev_node = -1;
-
static const char * const acpi_wakedev_default[] = {
"PNP0C0C", /* power button */
"PNP0C0E", /* sleep button */
@@ -51,27 +49,43 @@
NULL,
};
+static const struct sysctlnode *rnode = NULL;
+
static void acpi_wakedev_prepare(struct acpi_devnode *, int, int);
-SYSCTL_SETUP(sysctl_acpi_wakedev_setup, "sysctl hw.wake subtree setup")
+SYSCTL_SETUP(sysctl_acpi_wakedev_setup, "sysctl hw.acpi.wake subtree setup")
{
- const struct sysctlnode *rnode;
int err;
- err = sysctl_createv(NULL, 0, NULL, NULL,
- CTLFLAG_PERMANENT,
- CTLTYPE_NODE, "hw", NULL,
- NULL, 0, NULL, 0, CTL_HW, CTL_EOL);
- if (err)
- return;
err = sysctl_createv(NULL, 0, NULL, &rnode,
- CTLFLAG_PERMANENT,
- CTLTYPE_NODE, "wake", NULL,
+ CTLFLAG_PERMANENT, CTLTYPE_NODE, "hw",
+ NULL, NULL, 0, NULL, 0,
+ CTL_HW, CTL_EOL);
+
+ if (err != 0)
+ goto fail;
+
+ err = sysctl_createv(NULL, 0, &rnode, &rnode,
+ CTLFLAG_PERMANENT, CTLTYPE_NODE, "acpi",
+ NULL, NULL, 0, NULL, 0,
+ CTL_CREATE, CTL_EOL);
+
+ if (err != 0)
+ goto fail;
+
+ err = sysctl_createv(NULL, 0, &rnode, &rnode,
+ CTLFLAG_PERMANENT, CTLTYPE_NODE,
+ "wake", SYSCTL_DESCR("ACPI device wake-up"),
NULL, 0, NULL, 0,
- CTL_HW, CTL_CREATE, CTL_EOL);
- if (err)
- return;
- acpi_wakedev_node = rnode->sysctl_num;
+ CTL_CREATE, CTL_EOL);
+
+ if (err != 0)
+ goto fail;
+
+ return;
+
+fail:
+ rnode = NULL;
}
void
@@ -82,23 +96,22 @@
KASSERT(ad != NULL && ad->ad_parent != NULL);
KASSERT((ad->ad_flags & ACPI_DEVICE_WAKEUP) != 0);
- ad->ad_wake.wake_enabled = 0;
- ad->ad_wake.wake_sysctllog = NULL;
+ ad->ad_wake = 0;
if (acpi_match_hid(ad->ad_devinfo, acpi_wakedev_default))
- ad->ad_wake.wake_enabled = 1;
+ ad->ad_wake = 1;
- if (acpi_wakedev_node == -1)
+ if (rnode == NULL)
return;
- err = sysctl_createv(&ad->ad_wake.wake_sysctllog, 0, NULL, NULL,
- CTLFLAG_READWRITE, CTLTYPE_INT, ad->ad_name,
- NULL, NULL, 0, &ad->ad_wake.wake_enabled, 0,
- CTL_HW, acpi_wakedev_node, CTL_CREATE, CTL_EOL);
+ err = sysctl_createv(NULL, 0, &rnode, NULL,
+ CTLFLAG_READWRITE, CTLTYPE_BOOL, ad->ad_name,
+ NULL, NULL, 0, &ad->ad_wake, 0,
+ CTL_CREATE, CTL_EOL);
if (err != 0)
- aprint_error_dev(ad->ad_parent, "sysctl_createv(hw.wake.%s) "
- "failed (err %d)\n", ad->ad_name, err);
+ aprint_error_dev(ad->ad_parent, "sysctl_createv"
+ "(hw.acpi.wake.%s) failed (err %d)\n", ad->ad_name, err);
}
void
@@ -121,7 +134,7 @@
if ((ad->ad_flags & ACPI_DEVICE_WAKEUP) == 0)
continue;
- if (ad->ad_wake.wake_enabled == 0)
+ if (ad->ad_wake == 0)
acpi_clear_wake_gpe(ad->ad_handle);
else {
aprint_debug_dev(ad->ad_parent,
@@ -129,7 +142,7 @@
acpi_set_wake_gpe(ad->ad_handle);
}
- acpi_wakedev_prepare(ad, ad->ad_wake.wake_enabled, state);
+ acpi_wakedev_prepare(ad, ad->ad_wake, state);
}
}
Index: src/sys/dev/acpi/acpivar.h
diff -u src/sys/dev/acpi/acpivar.h:1.44 src/sys/dev/acpi/acpivar.h:1.45
--- src/sys/dev/acpi/acpivar.h:1.44 Tue Mar 16 05:48:43 2010
+++ src/sys/dev/acpi/acpivar.h Mon Apr 12 12:14:26 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: acpivar.h,v 1.44 2010/03/16 05:48:43 jruoho Exp $ */
+/* $NetBSD: acpivar.h,v 1.45 2010/04/12 12:14:26 jruoho Exp $ */
/*
* Copyright 2001 Wasabi Systems, Inc.
@@ -80,16 +80,6 @@
#define ACPI_DEVICE_WAKEUP __BIT(1)
/*
- * acpi_wake:
- *
- * ACPI device wake.
- */
-struct acpi_wake {
- struct sysctllog *wake_sysctllog;
- int wake_enabled;
-};
-
-/*
* acpi_devnode:
*
* An ACPI device node.
@@ -97,12 +87,12 @@
struct acpi_devnode {
device_t ad_device; /* Device */
device_t ad_parent; /* Backpointer to the parent */
- struct acpi_wake ad_wake; /* Device wakeup */
ACPI_DEVICE_INFO *ad_devinfo; /* Device info */
ACPI_HANDLE ad_handle; /* Device handle */
char ad_name[5]; /* Device name */
uint32_t ad_flags; /* Device flags */
uint32_t ad_type; /* Device type */
+ int ad_wake; /* Device wakeup */
SIMPLEQ_ENTRY(acpi_devnode) ad_list;
};