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;
 };

Reply via email to