Subject: AC adapter event
To: None <port-i386@netbsd.org>
From: Takayoshi Kochi <kochi@netbsd.org>
List: port-i386
Date: 05/02/2004 23:40:48
----Next_Part(Sun_May__2_23:40:48_2004_380)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Hi all,

I'd like to add ACPI AC adapter event support for powerd(8).
With recent commit of Enhanced SpeedStep stuff, it'll be useful
to change power-consumption status of CPU.  Patches to the kernel
and the powerd are attached.

Sample /etc/powerd/scripts/acadapter is also attached.

Please note that powerd(8) can only react against events _after_
it's executed, and it doesn't know the initial status at boot.

---
Takayoshi Kochi

----Next_Part(Sun_May__2_23:40:48_2004_380)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="pswitch-acad.diff"

Index: sys/dev/acpi/acpi_acad.c
===================================================================
RCS file: /cvsroot/src/sys/dev/acpi/acpi_acad.c,v
retrieving revision 1.15
diff -u -r1.15 acpi_acad.c
--- sys/dev/acpi/acpi_acad.c	1 May 2004 12:03:48 -0000	1.15
+++ sys/dev/acpi/acpi_acad.c	2 May 2004 14:29:43 -0000
@@ -68,6 +68,7 @@
 	int sc_flags;			/* see below */
 
 	struct sysmon_envsys sc_sysmon;
+	struct sysmon_pswitch sc_smpsw;	/* our sysmon glue */
 	struct envsys_basic_info sc_info[ACPIACAD_NSENSORS];
 	struct envsys_tre_data sc_data[ACPIACAD_NSENSORS];
 
@@ -163,6 +164,14 @@
 	sc->sc_node = aa->aa_node;
 	simple_lock_init(&sc->sc_lock);
 
+	sc->sc_smpsw.smpsw_name = sc->sc_dev.dv_xname;
+	sc->sc_smpsw.smpsw_type = PSWITCH_TYPE_ACADAPTER;
+	if (sysmon_pswitch_register(&sc->sc_smpsw) != 0) {
+		printf("%s: unable to register with sysmon\n",
+		       sc->sc_dev.dv_xname);
+		return;
+	}
+
 	rv = AcpiInstallNotifyHandler(sc->sc_node->ad_handle,
 	    ACPI_DEVICE_NOTIFY, acpiacad_notify_handler, sc);
 	if (ACPI_FAILURE(rv)) {
@@ -211,6 +220,14 @@
 	AACAD_SET(sc, AACAD_F_AVAILABLE);
 	AACAD_UNLOCK(sc, s);
 
+	/*
+	 * PSWITCH_EVENT_RELEASED : AC offline
+	 * PSWITCH_EVENT_PRESSED  : AC online
+	 */
+
+	sysmon_pswitch_event(&sc->sc_smpsw, status == 0 ?
+	    PSWITCH_EVENT_RELEASED : PSWITCH_EVENT_PRESSED);
+
 	if (AACAD_ISSET(sc, AACAD_F_VERBOSE))
 		printf("%s: AC adapter %sconnected\n",
 		    sc->sc_dev.dv_xname, status == 0 ? "not " : "");
Index: sys/dev/sysmon/sysmon_power.c
===================================================================
RCS file: /cvsroot/src/sys/dev/sysmon/sysmon_power.c,v
retrieving revision 1.8
diff -u -r1.8 sysmon_power.c
--- sys/dev/sysmon/sysmon_power.c	14 Jul 2003 15:47:28 -0000	1.8
+++ sys/dev/sysmon/sysmon_power.c	2 May 2004 14:29:45 -0000
@@ -494,6 +494,24 @@
 		}
 		break;
 
+	case PSWITCH_TYPE_ACADAPTER:
+		switch (event) {
+		case PSWITCH_EVENT_PRESSED:
+			/*
+			 * Try to enter a power-save state.
+			 */
+			printf("%s: AC adapter offline.\n", smpsw->smpsw_name);
+			break;
+
+		case PSWITCH_EVENT_RELEASED:
+			/*
+			 * Come out of power-save state.
+			 */
+			printf("%s: AC adapter online.\n", smpsw->smpsw_name);
+			break;
+		}
+		break;
+
 	default:
 		printf("%s: sysmon_pswitch_event can't handle me.\n",
 		    smpsw->smpsw_name);
Index: sys/sys/power.h
===================================================================
RCS file: /cvsroot/src/sys/sys/power.h,v
retrieving revision 1.2
diff -u -r1.2 power.h
--- sys/sys/power.h	20 Apr 2003 20:48:27 -0000	1.2
+++ sys/sys/power.h	2 May 2004 14:29:46 -0000
@@ -84,9 +84,12 @@
 #define	PSWITCH_TYPE_SLEEP	1	/* sleep button */
 #define	PSWITCH_TYPE_LID	2	/* lid switch */
 #define	PSWITCH_TYPE_RESET	3	/* reset button */
+#define	PSWITCH_TYPE_ACADAPTER	4	/* AC adapter presence */
 
-#define	PSWITCH_EVENT_PRESSED	0	/* button pressed */
-#define	PSWITCH_EVENT_RELEASED	1	/* button released */
+#define	PSWITCH_EVENT_PRESSED	0	/* button pressed, lid closed,
+					   AC adapter online */
+#define	PSWITCH_EVENT_RELEASED	1	/* button released, lid open,
+					   AC adapter offline */
 
 #define	PSWITCH_STATE_PRESSED	0	/* button pressed/lid closed */
 #define	PSWITCH_STATE_RELEASED	1	/* button released/lid open */

----Next_Part(Sun_May__2_23:40:48_2004_380)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="powerd.diff"

Index: usr.sbin/powerd/powerd.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/powerd/powerd.c,v
retrieving revision 1.3
diff -u -r1.3 powerd.c
--- usr.sbin/powerd/powerd.c	13 Jul 2003 12:19:45 -0000	1.3
+++ usr.sbin/powerd/powerd.c	2 May 2004 14:30:48 -0000
@@ -256,6 +256,9 @@
 	case PSWITCH_TYPE_RESET:
 		return ("reset_button");
 
+	case PSWITCH_TYPE_ACADAPTER:
+		return ("acadapter");
+
 	default:
 		return ("=unknown pswitch type=");
 	}

----Next_Part(Sun_May__2_23:40:48_2004_380)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename=acadapter

#!/bin/sh -

case "${2}" in
# AC online
pressed)
	/sbin/sysctl -w machdep.est.frequency.target=1400
	exit 0
	;;

# AC offline
released)
	/sbin/sysctl -w machdep.est.frequency.target=600	
	exit 0
	;;

*)
	logger -p warning "${0}: unsupported event ${2} on device ${1}" >&1
	exit 1
	;;
esac

----Next_Part(Sun_May__2_23:40:48_2004_380)----