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 <jruoho...@iki.fi> @@ -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 <jmcne...@invisible.ca> @@ -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; };