summaryrefslogtreecommitdiffstats
path: root/etc/rc.d/power_profile
diff options
context:
space:
mode:
authornjl <njl@FreeBSD.org>2003-12-18 04:39:57 +0000
committernjl <njl@FreeBSD.org>2003-12-18 04:39:57 +0000
commit8bfbe55f94c2a9837f50cc74d5b44e4eb26f79e0 (patch)
tree35d5bfa9e44f237f3b47c628938cd6ba7d2622a4 /etc/rc.d/power_profile
parent1c08e0c3ab645a4b6ccd7b9bba66d235bd321c78 (diff)
downloadFreeBSD-src-8bfbe55f94c2a9837f50cc74d5b44e4eb26f79e0.zip
FreeBSD-src-8bfbe55f94c2a9837f50cc74d5b44e4eb26f79e0.tar.gz
Add power_profile, a script that changes the ACPI CPU Cx idle state and/or
the throttling state in response to line transitions. Future plans include adding support for CPU frequency changes. Add a devd.conf entry for calling this script. The default values for this are: performance_cx_lowest="HIGH" # Use HLT (C0) online performance_throttle_state="HIGH" # 100% (no throttling) economy_cx_lowest="LOW" # Use the lowest Cx state possible economy_throttle_state="HIGH" # 100% (no throttling)
Diffstat (limited to 'etc/rc.d/power_profile')
-rw-r--r--etc/rc.d/power_profile86
1 files changed, 86 insertions, 0 deletions
diff --git a/etc/rc.d/power_profile b/etc/rc.d/power_profile
new file mode 100644
index 0000000..52bc93d
--- /dev/null
+++ b/etc/rc.d/power_profile
@@ -0,0 +1,86 @@
+#!/bin/sh
+#
+# Modify the power profile based on AC line state. This script is
+# usually called from devd(8).
+#
+# Arguments: 0x00 (AC offline, economy) or 0x01 (AC online, performance)
+#
+# $FreeBSD$
+#
+
+# PROVIDE: power_profile
+# KEYWORD: FreeBSD nostart
+
+. /etc/rc.subr
+
+name="power_profile"
+LOGGER="logger -t power_profile -p daemon.notice"
+
+# Set a given sysctl node to a value.
+#
+# Variables:
+# $node: sysctl node to set with the new value
+# $value: HIGH for the highest performance value, LOW for the best
+# economy value, or the value itself.
+# $highest_value: maximum value for this sysctl, when $value is "HIGH"
+# $lowest_value: minimum value for this sysctl, when $value is "LOW"
+#
+sysctl_set ()
+{
+ # Check if the node exists
+ if [ -z "$(sysctl -n ${node} 2> /dev/null)" ]; then
+ return
+ fi
+
+ # Get the new value, checking for special types HIGH or LOW
+ case ${value} in
+ [Hh][Ii][Gg][Hh])
+ value=${highest_value}
+ ;;
+ [Ll][Oo][Ww])
+ value=${lowest_value}
+ ;;
+ *)
+ ;;
+ esac
+
+ # Set the desired value
+ [ -n "${value}" ] && sysctl ${node}=${value}
+}
+
+if [ $# -ne 1 ]; then
+ err 1 "Usage: $0 [0x00|0x01]"
+fi
+load_rc_config $name
+
+# Find the next state (performance or economy).
+state=$1
+case ${state} in
+0x01 | '')
+ ${LOGGER} "changed to 'performance'"
+ profile="performance"
+ ;;
+0x00)
+ ${LOGGER} "changed to 'economy'"
+ profile="economy"
+ ;;
+*)
+ echo "Usage: $0 [0x00|0x01]"
+ exit 1
+esac
+
+# Set the various sysctls based on the profile's values.
+node="hw.acpi.cpu.cx_lowest"
+highest_value=0
+lowest_value="$(sysctl -n hw.acpi.cpu.cx_supported | \
+ awk '{ print split($0, a) - 1 }' - 2> /dev/null)"
+eval value=\$${profile}_cx_lowest
+sysctl_set
+
+node="hw.acpi.cpu.throttle_state"
+highest_value="$(sysctl -n hw.acpi.cpu.throttle_max 2> /dev/null)"
+lowest_value="1"
+eval value=\$${profile}_throttle_state
+sysctl_set
+
+exit 0
OpenPOWER on IntegriCloud