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)----