xref: /freebsd/libexec/rc/rc.d/power_profile (revision f99f0ee14e3af81c23150a6a340259ca8a33d01a)
10696600cSBjoern A. Zeeb#!/bin/sh
20696600cSBjoern A. Zeeb#
30696600cSBjoern A. Zeeb# Modify the power profile based on AC line state.  This script is
40696600cSBjoern A. Zeeb# usually called from devd(8).
50696600cSBjoern A. Zeeb#
60696600cSBjoern A. Zeeb# Arguments: 0x00 (AC offline, economy) or 0x01 (AC online, performance)
70696600cSBjoern A. Zeeb#
80696600cSBjoern A. Zeeb#
90696600cSBjoern A. Zeeb
100696600cSBjoern A. Zeeb# PROVIDE: power_profile
110696600cSBjoern A. Zeeb# REQUIRE: FILESYSTEMS syslogd
120696600cSBjoern A. Zeeb# KEYWORD: nojail nostart
130696600cSBjoern A. Zeeb
140696600cSBjoern A. Zeeb. /etc/rc.subr
150696600cSBjoern A. Zeeb
160696600cSBjoern A. Zeebname="power_profile"
170696600cSBjoern A. Zeebdesc="Modify the power profile based on AC line state"
180696600cSBjoern A. Zeebstop_cmd=':'
190696600cSBjoern A. ZeebLOGGER="logger -t power_profile -p daemon.notice"
200696600cSBjoern A. Zeeb
210696600cSBjoern A. Zeeb# Set a given sysctl node to a value.
220696600cSBjoern A. Zeeb#
230696600cSBjoern A. Zeeb# Variables:
240696600cSBjoern A. Zeeb# $node: sysctl node to set with the new value
250696600cSBjoern A. Zeeb# $value: HIGH for the highest performance value, LOW for the best
260696600cSBjoern A. Zeeb#	  economy value, or the value itself.
270696600cSBjoern A. Zeeb# $highest_value: maximum value for this sysctl, when $value is "HIGH"
280696600cSBjoern A. Zeeb# $lowest_value: minimum value for this sysctl, when $value is "LOW"
290696600cSBjoern A. Zeeb#
300696600cSBjoern A. Zeebsysctl_set()
310696600cSBjoern A. Zeeb{
320696600cSBjoern A. Zeeb	# Check if the node exists
330696600cSBjoern A. Zeeb	if [ -z "$(sysctl -n ${node} 2> /dev/null)" ]; then
340696600cSBjoern A. Zeeb		return
350696600cSBjoern A. Zeeb	fi
360696600cSBjoern A. Zeeb
370696600cSBjoern A. Zeeb	# Get the new value, checking for special types HIGH or LOW
380696600cSBjoern A. Zeeb	case ${value} in
390696600cSBjoern A. Zeeb	[Hh][Ii][Gg][Hh])
400696600cSBjoern A. Zeeb		value=${highest_value}
410696600cSBjoern A. Zeeb		;;
420696600cSBjoern A. Zeeb	[Ll][Oo][Ww])
430696600cSBjoern A. Zeeb		value=${lowest_value}
440696600cSBjoern A. Zeeb		;;
450696600cSBjoern A. Zeeb	[Nn][Oo][Nn][Ee])
460696600cSBjoern A. Zeeb		return
470696600cSBjoern A. Zeeb		;;
480696600cSBjoern A. Zeeb	*)
490696600cSBjoern A. Zeeb		;;
500696600cSBjoern A. Zeeb	esac
510696600cSBjoern A. Zeeb
520696600cSBjoern A. Zeeb	# Set the desired value
530696600cSBjoern A. Zeeb	if [ -n "${value}" ]; then
540696600cSBjoern A. Zeeb		if ! sysctl ${node}=${value} > /dev/null 2>&1; then
550696600cSBjoern A. Zeeb			warn "unable to set ${node}=${value}"
560696600cSBjoern A. Zeeb		fi
570696600cSBjoern A. Zeeb	fi
580696600cSBjoern A. Zeeb}
590696600cSBjoern A. Zeeb
600696600cSBjoern A. Zeebif [ $# -ne 1 ]; then
610696600cSBjoern A. Zeeb	err 1 "Usage: $0 [0x00|0x01]"
620696600cSBjoern A. Zeebfi
630696600cSBjoern A. Zeebload_rc_config $name
640696600cSBjoern A. Zeeb
65*f99f0ee1SAlexander Leidinger# doesn't make sense to run in a svcj: privileged operations
66*f99f0ee1SAlexander Leidingerpower_profile_svcj="NO"
67*f99f0ee1SAlexander Leidinger
680696600cSBjoern A. Zeeb# Find the next state (performance or economy).
690696600cSBjoern A. Zeebstate=$1
700696600cSBjoern A. Zeebcase ${state} in
710696600cSBjoern A. Zeeb0x01 | '')
720696600cSBjoern A. Zeeb	${LOGGER} "changed to 'performance'"
730696600cSBjoern A. Zeeb	profile="performance"
740696600cSBjoern A. Zeeb	;;
750696600cSBjoern A. Zeeb0x00)
760696600cSBjoern A. Zeeb	${LOGGER} "changed to 'economy'"
770696600cSBjoern A. Zeeb	profile="economy"
780696600cSBjoern A. Zeeb	;;
790696600cSBjoern A. Zeeb*)
800696600cSBjoern A. Zeeb	echo "Usage: $0 [0x00|0x01]"
810696600cSBjoern A. Zeeb	exit 1
820696600cSBjoern A. Zeebesac
830696600cSBjoern A. Zeeb
840696600cSBjoern A. Zeeb# Set the various sysctls based on the profile's values.
850696600cSBjoern A. Zeebnode="hw.acpi.cpu.cx_lowest"
860696600cSBjoern A. Zeebhighest_value="C1"
870696600cSBjoern A. Zeeblowest_value="Cmax"
880696600cSBjoern A. Zeebeval value=\$${profile}_cx_lowest
890696600cSBjoern A. Zeebsysctl_set
900696600cSBjoern A. Zeeb
910696600cSBjoern A. Zeebnode="dev.cpu.0.freq"
920696600cSBjoern A. Zeebhighest_value="`(sysctl -n dev.cpu.0.freq_levels | \
930696600cSBjoern A. Zeeb	awk '{ split($0, a, "[/ ]"); print a[1] }' -) 2> /dev/null`"
940696600cSBjoern A. Zeeblowest_value="`(sysctl -n dev.cpu.0.freq_levels | \
950696600cSBjoern A. Zeeb	awk '{ split($0, a, "[/ ]"); print a[length(a) - 1] }' -) 2> /dev/null`"
960696600cSBjoern A. Zeebeval value=\$${profile}_cpu_freq
970696600cSBjoern A. Zeebsysctl_set
980696600cSBjoern A. Zeeb
990696600cSBjoern A. Zeebexit 0
100