From b7d753ce71e03c3c2279953b63f87342f1f0ba18 Mon Sep 17 00:00:00 2001 From: tanner Date: Sun, 2 May 2010 15:22:06 +0200 Subject: [PATCH] minor fix for kernel, new power-settings package --- kernel-power-settings/config/default | 14 +- kernel-power-settings/debian/changelog | 9 + kernel-power-settings/debian/control | 8 +- .../debian/kernel-power-settings.install | 5 + .../debian/kernel-power-settings.postinst | 4 + .../debian/kernel-power-settings.postrm | 10 + kernel-power-settings/kernel-config | 277 ++++++++++++++++++++ kernel-power-settings/kernel-load | 17 +- kernel-power-settings/kernel-modules | 11 + kernel-power-settings/kernel-power | 35 ++- kernel-power-settings/kernel-power.conf | 10 + kernel-power-settings/kernel-power.sudoers | 1 + kernel-power-settings/pre-mount | 51 ++++ 13 files changed, 422 insertions(+), 30 deletions(-) create mode 100644 kernel-power-settings/debian/kernel-power-settings.postrm create mode 100755 kernel-power-settings/kernel-config create mode 100644 kernel-power-settings/kernel-modules create mode 100644 kernel-power-settings/kernel-power.conf create mode 100644 kernel-power-settings/kernel-power.sudoers create mode 100755 kernel-power-settings/pre-mount diff --git a/kernel-power-settings/config/default b/kernel-power-settings/config/default index fc52b35..c121b94 100644 --- a/kernel-power-settings/config/default +++ b/kernel-power-settings/config/default @@ -1,8 +1,14 @@ +# DO NOT EDIT THIS FILE - CREATE A COPY OF IT FOR CUSTOMIZATION +MIN_FREQ=250 +MAX_FREQ=600 +FREQS="0:30,90 125:30,90 250:38,180 500:48,360 550:54,400 600:60,430 700:60,430 750:60,430 805:60,430 850:60,500 900:60,500 950:60,500 1000:60,500 1100:72,520 1150:72,520" #UP_THRESHOLD=75 #SAMPLING_RATE=150000 -VDD1_OPPS_VSEL="30 30 38 48 54 48 60 60 60 60 60 60 60 72 72" -DSP_OPPS_RATE="90 90 180 360 400 430 430 430 430 500 500 500 500 520 520" -MIN_FREQ=250000 -MAX_FREQ=599000 SMARTREFLEX_VDD1=0 SMARTREFLEX_VDD2=0 +IGNORE_NICE_LOAD=0 +# start USB networking and sshd early during boot +EARLYSSH=0 +# fsck of /home partition before mounting? +# 1=if necessary, force=always check +FSCK_HOME=0 \ No newline at end of file diff --git a/kernel-power-settings/debian/changelog b/kernel-power-settings/debian/changelog index e6fcc91..590266e 100644 --- a/kernel-power-settings/debian/changelog +++ b/kernel-power-settings/debian/changelog @@ -1,3 +1,12 @@ +kernel-power-settings (0.4) fremantle; urgency=low + + * new general script kernel-config: new FREQS. IGNORE_NICE_LOAD fields + * load /etc/modules on boot + * add pre-mount hook to /etc/default/mount-opts to optionally + perform fsck /home and to run /etc/kernel-power/pre-mount.once + + -- Thomas Tanner Sun, 2 May 2010 00:00:00 +0100 + kernel-power-settings (0.3) fremantle; urgency=low * postinst: exit 0 diff --git a/kernel-power-settings/debian/control b/kernel-power-settings/debian/control index 17a4d14..3640071 100644 --- a/kernel-power-settings/debian/control +++ b/kernel-power-settings/debian/control @@ -2,15 +2,17 @@ Source: kernel-power-settings Section: utils Priority: optional Maintainer: Thomas Tanner -XSBC-Bugtracker: http://talk.maemo.org/showthread.php?t=43420 +XSBC-Bugtracker: https://garage.maemo.org/tracker/?group_id=1528 Build-Depends: debhelper (>= 4.0.0) Standards-Version: 3.8.0 Package: kernel-power-settings Section: user/system Architecture: armel -Depends: kernel-power-flasher -Description: Customization of kernel settings for the enhanced Maemo 5 kernel 2.6.28.10 +Depends: kernel-power-flasher, sudo +Description: Tools for the customization of kernel settings + of the enhanced Maemo 5 kernel 2.6.28.10. + XB-Maemo-Icon-26: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0 d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAACYtJREFUeNrUWkurZUcVXvXY diff --git a/kernel-power-settings/debian/kernel-power-settings.install b/kernel-power-settings/debian/kernel-power-settings.install index 7748615..b7608a5 100644 --- a/kernel-power-settings/debian/kernel-power-settings.install +++ b/kernel-power-settings/debian/kernel-power-settings.install @@ -1,3 +1,8 @@ kernel-load /usr/sbin +kernel-config /usr/sbin +pre-mount /etc/kernel-power kernel-power /etc/event.d +kernel-modules /etc/event.d +kernel-power.sudoers /etc/sudoers.d +kernel-power.conf /etc/osso-backup/applications config/* /usr/share/kernel-power-settings diff --git a/kernel-power-settings/debian/kernel-power-settings.postinst b/kernel-power-settings/debian/kernel-power-settings.postinst index 19974f1..9700228 100644 --- a/kernel-power-settings/debian/kernel-power-settings.postinst +++ b/kernel-power-settings/debian/kernel-power-settings.postinst @@ -8,6 +8,10 @@ cd /etc test -f lastboot && rm lastboot test -f lastreboot && rm lastreboot +if ! grep "# KERNEL-POWER-HOOK" /etc/default/mount-opts; then + echo "test -x /etc/kernel-power/pre-mount && /etc/kernel-power/pre-mount # KERNEL-POWER-HOOK" >> /etc/default/mount-opts +fi + #DEBHELPER# exit 0 diff --git a/kernel-power-settings/debian/kernel-power-settings.postrm b/kernel-power-settings/debian/kernel-power-settings.postrm new file mode 100644 index 0000000..e3792be --- /dev/null +++ b/kernel-power-settings/debian/kernel-power-settings.postrm @@ -0,0 +1,10 @@ +#!/bin/sh + +if grep "# KERNEL-POWER-HOOK" /etc/default/mount-opts; then + grep -v "# KERNEL-POWER-HOOK" /etc/default/mount-opts > /etc/default/mount-opts.tmp + mv /etc/default/mount-opts.tmp /etc/default/mount-opts +fi + +#DEBHELPER# + +exit 0 diff --git a/kernel-power-settings/kernel-config b/kernel-power-settings/kernel-config new file mode 100755 index 0000000..b2d0887 --- /dev/null +++ b/kernel-power-settings/kernel-config @@ -0,0 +1,277 @@ +#!/bin/sh +# kernel configuration script for power user kernel +# (c) Copyright 2010 by Thomas Tanner +# licensed under GPLv3 +# version 0.1 (2. May 2010) + +if test $# -eq 0; then + echo "$0 command [options]" + echo "commands:" + echo " show - show current settings" + echo " load - load settings from file" + echo " save - save settings to file (abs. path or filename in /home/user/.kernel, none=defaults)" + echo " setdefault - set file as default settings" + echo " lock [freq [volt] [dsp]] - un/lock CPU at frequency with specific settings" + echo "filenames: absolute path or filename in search path or none=defaults" + echo "search path: .,/home/user/.kernel,/usr/share/kernel-power-settings/" + exit 1 +fi +if test "`id -u`" -ne 0; then + sudo $0 $* # run as root + exit $? +fi + +cfr=/sys/devices/system/cpu/cpu0/cpufreq +cfd=$cfr/ondemand +pwr=/sys/power/ + +echo ondemand > $cfr/scaling_governor +if test -f $cfd/avoid_frequencies -a -f $pwr/vdd1_opps_vsel -a -f $pwr/dsp_opps_rate; then : +else + echo This kernel version `uname -r` is not supported + exit 1 +fi + +allfreq= +for f in `cat $cfr/scaling_available_frequencies`; do + allfreq="$f $allfreq" +done +vsel=`cat $pwr/vdd1_opps_vsel` +rate=`cat $pwr/dsp_opps_rate` + +cmd=$1 +arg= +shift +if test "$cmd" = lock && test -z "$1"; then + echo 'unlocking frequency. reset to defaults' + cmd=loaddef + arg= +fi + +popvsel() { curvsel=$1; shift; vsel="$*"; } +poprate() { currate=$1; shift; rate="$*"; } + +case $cmd in +show|save) + minfreq=$((`cat $cfr/scaling_min_freq`/1000)) + maxfreq=$((`cat $cfr/scaling_max_freq`/1000)) + test $maxfreq = 599 && maxfreq=600 + avoid=`cat $cfd/avoid_frequencies` + freqs= + for f in $allfreq; do + popvsel $vsel + poprate $rate + case " $avoid " in *" $f "*) ;; + *) freqs="$freqs$((f/1000)):$curvsel,$currate " + esac + done + if test $cmd = show; then + echo "current kernel configuration:" + echo "current frequency:" $((`cat $cfr/scaling_cur_freq`/1000)) + echo -n "supported frequencies: " + for f in $allfreq; do echo -n "$((f/1000)) "; done + echo + echo "min. frequency:" $minfreq + echo "max. frequency:" $maxfreq + echo -n "avoid frequencies: " + for f in $avoid; do echo -n "$((f/1000)) "; done + echo + echo "active frequencies: $freqs" + echo "SmartReflex" "VDD1=`cat $pwr/sr_vdd1_autocomp`, VDD2=`cat $pwr/sr_vdd2_autocomp`" + echo -n "ondemand: ignore nice load=" `cat $cfd/ignore_nice_load` + echo -n ", up threshold=" `cat $cfd/up_threshold` + echo ", sampling rate=" `cat $cfd/sampling_rate` + else + arg=$1 + test -z "$arg" && arg=/etc/default/kernel-power + test `basename $arg` = $arg && arg=/home/user/.kernel/$arg + test $arg = /etc/default/kernel-power && test -L $arg && rm -f $arg + echo "saving to $arg" + echo "# kernel configuration file generated by $0" > $arg + echo "MINFREQ=$minfreq" >> $arg + echo "MAXFREQ=$maxfreq" >> $arg + echo "FREQS=$freqs" >> $arg + echo "SMARTREFLEX_VDD1=`cat $pwr/sr_vdd1_autocomp`" >> $arg + echo "SMARTREFLEX_VDD2=`cat $pwr/sr_vdd2_autocomp`" >> $arg + echo "IGNORE_NICE_LOAD=`cat $cfd/ignore_nice_load`" >> $arg + echo "UP_THRESHOLD=`cat $cfd/up_threshold`" >> $arg + echo "SAMPLING_RATE=`cat $cfd/sampling_rate`" >> $arg + fi + ;; +load|loaddef) + test $cmd = loaddef || arg=$1 + if test -z "$arg"; then + arg=/etc/default/kernel-power + test -f $arg || arg=/usr/share/kernel-power-settings/default + fi + if test `basename $arg` = $arg; then # not absolute + for p in . /home/user/.kernel /usr/share/kernel-power-settings; do + test -f $p/$arg && arg=$p/$arg && break + done + fi + if test ! -f "$arg"; then + echo "file not found $arg" + exit 1 + fi + echo "loading $arg" + source $arg + if test -n "$VDD1_OPPS_VSEL" -o -n "$DSP_OPPS_RATE"; then + echo "warning: old configuration format detected. ignoring" + exit 1 + fi + #echo $allfreq + #echo $vsel + #echo $rate + active= + minfreq= + maxfreq= + #echo $FREQS + for f in $FREQS; do + #echo processing $f + freq=`echo $f | cut -d: -f1` + f=`echo $f | cut -d: -f2` + volt=`echo $f | cut -d, -f1` + dsp=`echo $f | cut -d, -f2` + #echo freq $freq volt $volt dsp $dsp + if test ! $freq = 0; then + test -z "$minfreq" -o "$freq" -lt "$minfreq" && minfreq=$freq + test -z "$maxfreq" -o "$freq" -gt "$maxfreq" && maxfreq=$freq + freq=$((freq*1000)) + case " $allfreq " in *" $freq "*) ;; + *) echo warning: $freq not supported; continue ;; + esac + active="$active $freq" + fi + test -z "$volt" && test -z "$dsp" && continue + tvsel= + trate= + cpvsel() { tvsel="$tvsel $1"; } + cprate() { trate="$trate $1"; } + for fr in 0 $allfreq; do + if test $fr = $freq; then + popvsel $vsel + poprate $rate + test -z "$volt" && volt=$curvsel + test -z "$dsp" && dsp=$currate + tvsel="$tvsel $volt $vsel" + trate="$trate $dsp $rate" + break + fi + popvsel $vsel + tvsel="$tvsel $curvsel" + poprate $rate + trate="$trate $currate" + done + vsel=$tvsel + rate=$trate + #echo $vsel + done + #echo vsel $vsel + #echo rate $rate + test -n "$MIN_FREQ" && minfreq=$MIN_FREQ + test -n "$MAX_FREQ" && maxfreq=$MAX_FREQ + test "$minfreq" -gt 100000 && minfreq=$((minfreq/1000)) + test "$maxfreq" -gt 100000 && maxfreq=$((maxfreq/1000)) + #echo $minfreq $maxfreq + avoid= + for f in $allfreq; do + if test "$f" -lt $((minfreq*1000)); then + avoid="$avoid $f" + continue + fi + case " $active " in *" $f "*) ;; + *) avoid="$avoid $f" ;; + esac + done + #echo $avoid + echo $avoid > $cdf/avoid_frequencies + echo $vsel > $pwr/vdd1_opps_vsel + echo $rates > $pwr/dsp_opps_rate + test $maxfreq = 600 && maxfreq=599 + echo $((minfreq*1000)) > $cfr/scaling_min_freq + echo $((maxfreq*1000)) > $cfr/scaling_max_freq + test -n "$SMARTREFLEX_VDD1" && echo $SMARTREFLEX_VDD1 > $pwr/sr_vdd1_autocomp + test -n "$SMARTREFLEX_VDD2" && echo $SMARTREFLEX_VDD2 > $pwr/sr_vdd2_autocomp + test -n "$IGNORE_NICE_LOAD" && echo $IGNORE_NICE_LOAD > $cfd/ignore_nice_load + test -n "$UP_THRESHOLD" && echo $UP_THRESHOLD > $cfd/up_threshold + test -n "$SAMPLING_RATE" && echo $SAMPLING_RATE > $cfd/sampling_rate + echo "successfully loaded." + ;; +setdefault) + arg=$1 + if test -z "$arg"; then + echo "filename missing" + exit 1 + fi + if test `basename $arg` = $arg; then # not absolute + for p in . /home/user/.kernel /usr/share/kernel-power-settings; do + test -f $p/$arg && arg=$p/$arg && break + done + fi + def=/etc/default/kernel-power + case $arg in + /usr/share/kernel-power-settings/*) ln -s $arg $def ;; + *) cp $arg $def ;; + esac + echo "defaults set to $arg" + ;; +lock) + arg=$1 + altfreq= + for f in $allfreq; do + test "$f" = "$arg" && continue + altfreq=$f + break + done + vsel= + dsp= + freq=$((arg*1000)) + ifreq= + i=0 + allfreq="0 $allfreq" + for f in $allfreq; do + i=$((i+1)) + test $f = $freq || continue + ifreq=$i + break + done + if test -z "ifreq"; then + echo invalid frequency $freq + exit 1 + fi + echo $ifreq $altfreq + test -f $cfd/avoid_frequencies && echo > $cfd/avoid_frequencies # enable all freqs + echo userspace > $cfr/scaling_governor + echo $altfreq > $cfr/scaling_setspeed # temporarily set alternative frequencies + volt=$2 + if test -n "$volt"; then + i=0 + vsel= + for v in `cat $pwr/vdd1_opps_vsel`; do + i=$((i+1)) + test $i = $ifreq && v=$volt + vsel="$vsel $v" + done + echo $vsel + echo $vsel > $pwr/vdd1_opps_vsel + fi + dsp=$3 + if test -n "$dsp"; then + i=0 + dsp= + for r in `cat $pwr/dsp_opps_rate`; do + i=$((i+1)) + test $i = $ifreq && r=$dsp + dsp="$dsp $r" + done + echo $dsp + echo $dsp > $pwr/dsp_opps_rate + fi + echo locking frequency $freq + echo $freq > $cfr/scaling_setspeed + ;; +*) + echo "invalid command $cmd" + exit 1 +esac +exit 0 diff --git a/kernel-power-settings/kernel-load b/kernel-power-settings/kernel-load index 9c44d15..d17095d 100755 --- a/kernel-power-settings/kernel-load +++ b/kernel-power-settings/kernel-load @@ -1,15 +1,4 @@ #!/bin/sh - -f="$1" -test $# -eq 0 && f=/etc/default/kernel-power -test -f "$f" || exit 1 -source "$f" -test -n "$UP_THRESHOLD" && echo $UP_THRESHOLD > /sys/devices/system/cpu/cpu0/cpufreq/ondemand/up_threshold -test -n "$SAMPLING_RATE" && echo $SAMPLING_RATE > /sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate -test -n "$MIN_FREQ" && echo $MIN_FREQ > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq -test -n "$MAX_FREQ" && echo $MAX_FREQ > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq -test -n "$VDD1_OPPS_VSEL" && echo $VDD1_OPPS_VSEL > /sys/power/vdd1_opps_vsel -test -n "$DSP_OPPS_RATE" && echo $DSP_OPPS_RATE > /sys/power/dsp_opps_rate -test -n "$SMARTREFLEX_VDD1" && echo $SMARTREFLEX_VDD1 > /sys/power/sr_vdd1_autocomp -test -n "$SMARTREFLEX_VDD2" && echo $SMARTREFLEX_VDD2 > /sys/power/sr_vdd2_autocomp -exit 0 +echo "warning: this script is obsolete. calling kernel-config" +/usr/sbin/kernel-config load $1 +exit $? diff --git a/kernel-power-settings/kernel-modules b/kernel-power-settings/kernel-modules new file mode 100644 index 0000000..ef128bd --- /dev/null +++ b/kernel-power-settings/kernel-modules @@ -0,0 +1,11 @@ +description "load modules from /etc/modules" +start on started hildon-desktop +console none +script + grep '^[^#]' /etc/modules | + while read module args + do + [ "$module" ] || continue + modprobe $module $args || : + done +end script diff --git a/kernel-power-settings/kernel-power b/kernel-power-settings/kernel-power index 16b78e3..1bed8d4 100644 --- a/kernel-power-settings/kernel-power +++ b/kernel-power-settings/kernel-power @@ -3,13 +3,30 @@ stop on starting shutdown service console none script - test -f /etc/lastboot && TDIFF=$(expr $(date +%s) - $(stat -t /etc/lastboot |awk '{print $14}')) - if test -z "$TDIFF" || test "$TDIFF" -gt 300; then - touch /etc/lastboot - test -x /usr/sbin/kernel-load || exit 1 - /usr/sbin/kernel-load - exit 0 - else - exit 1 - fi + mkdir -p /etc/kernel-power + if test -f /etc/kernel-power/.loaded; then + # rebooted w/o clean shutdown, continue + rm -f /etc/kernel-power/.loaded + touch /etc/kernel-power/.notloaded + exit 1 + fi + test -f /etc/default/kernel-power || exit 1 + STATE=`/sbin/getbootstate` + if test $STATE = USER; then + source /etc/default/kernel-power + if test "$EARLYSSH" = 1 && test -x /etc/init.d/ssh; then + /sbin/modprobe g_nokia + /sbin/ifup usb0 + /etc/init.d/ssh start + fi + fi + test -x /usr/sbin/kernel-config || exit 1 + touch /etc/kernel-power/.loaded + /usr/sbin/kernel-config defaults + exit 0 +end script + +post-stop script + rm -f /etc/kernel-power/.loaded + rm -f /etc/kernel-power/.notloaded end script diff --git a/kernel-power-settings/kernel-power.conf b/kernel-power-settings/kernel-power.conf new file mode 100644 index 0000000..def4acf --- /dev/null +++ b/kernel-power-settings/kernel-power.conf @@ -0,0 +1,10 @@ + + + + /home/user/.kernel + + + /etc/default/kernel-power + + + diff --git a/kernel-power-settings/kernel-power.sudoers b/kernel-power-settings/kernel-power.sudoers new file mode 100644 index 0000000..3388d64 --- /dev/null +++ b/kernel-power-settings/kernel-power.sudoers @@ -0,0 +1 @@ +user ALL = NOPASSWD: /usr/sbin/kernel-config * diff --git a/kernel-power-settings/pre-mount b/kernel-power-settings/pre-mount new file mode 100755 index 0000000..fb4c146 --- /dev/null +++ b/kernel-power-settings/pre-mount @@ -0,0 +1,51 @@ +#!/bin/sh +# pre-mounting script +# called by /etc/default/mount-opts sourced by /etc/event.d/rcS-late +# (c) Copyright 2010 by Thomas Tanner +# licensed under GPLv3 +# version 0.1 (2. May 2010) + +if test -f /etc/kernel-power/pre-mount.once; then + # execute pre-mount script once + mv /etc/kernel-power/pre-mount.once /etc/kernel-power/pre-mount.done + date >> /etc/kernel-power/pre-mount.log + sh /etc/kernel-power/pre-mount.done >> /etc/kernel-power/pre-mount.log +fi + +fforce=/etc/kernel-power/force_fsck +#temporary overwrite0=off, 1=on +force= +if test -f $fforce; then + force=`cat $fforce` + if test ! "$force" = 1; + rm $fforce # disabled + exit 0 + fi +else + cfg=/etc/default/kernel-power + test -f $cfg || exit 0 + FSCK_HOME=0 + source $cfg + if test "$FSCK_HOME" = 1; then + force= + elif test "$FSCK_HOME" = force; then + force=1 + else + exit 0 # disabled + fi +fi + +part=sfdisk -l /dev/mmcblk0 | awk '$6 == 83 { print $1; exit }' +test -z "$part" && exit 0 + +mkdir -p /etc/kernel-power/ +date >> /etc/kernel-power/pre-mount.log + +# dont continue if reboot during fsck +echo 0 > $fforce +test $force = 1 && force="-f" +fsck -y $force -t ext3 $part >> /etc/kernel-power/pre-mount.log + +rm $fforce # use defaults + +exit 0 -- 1.7.9.5