freebsd-skq/etc/rc.d/power_profile
Doug Barton d6209fadb2 REQUIRE: syslogd and BEFORE: NETWORKING are now antithetical,
and including both in this file had nasty side effects on the
ordering of syslogd, as well as producing an error when running
rcorder. Remove the more bogus of the two options, which restores
proper ordering and removes the error.

There is an open question as to whether scripts with the nostart
KEYWORD should even have REQUIRE/BEFORE lines, and indeed, whether
they should be in /etc/rc.d at all, but that's for another time.
2005-12-21 01:19:20 +00:00

93 lines
2.0 KiB
Bash

#!/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
# REQUIRE: mountcritlocal syslogd
# KEYWORD: nojail 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}
;;
[Nn][Oo][Nn][Ee])
return
;;
*)
;;
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="C1"
lowest_value="`(sysctl -n hw.acpi.cpu.cx_supported | \
awk '{ print "C" split($0, a) }' -) 2> /dev/null`"
eval value=\$${profile}_cx_lowest
sysctl_set
node="dev.cpu.0.freq"
highest_value="`(sysctl -n dev.cpu.0.freq_levels | \
awk '{ split($0, a, "[/ ]"); print a[1] }' -) 2> /dev/null`"
lowest_value="`(sysctl -n dev.cpu.0.freq_levels | \
awk '{ split($0, a, "[/ ]"); print a[length(a) - 1] }' -) 2> /dev/null`"
eval value=\$${profile}_cpu_freq
sysctl_set
exit 0