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