Package: powernowd Version: 0.97-1 Severity: wishlist Tags: patch Hi Bdale,
Ubuntu has some interesting changes to the powernowd package: http://people.ubuntu.com/~scott/patches/powernowd/powernowd_0.96-2ubuntu2_packaging.patch They add a script detecting the CPU type and automatically loading the right cpufreq_ module. This is the kind of changes that make Ubuntu "just work" that we should really integrate back. Please consider this. Cheers, -- System Information: Debian Release: testing/unstable APT prefers testing APT policy: (990, 'testing'), (500, 'unstable') Architecture: i386 (i686) Shell: /bin/sh linked to /bin/bash Kernel: Linux 2.6.15-1-686 Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8) Versions of packages powernowd depends on: ii libc6 2.3.6-7 GNU C Library: Shared libraries powernowd recommends no packages. -- no debconf information
diff -pruN powernowd_0.96-1/debian/control powernowd_0.96-2ubuntu2/debian/control --- powernowd_0.96-1/debian/control 2005-12-06 13:32:44.000000000 +0000 +++ powernowd_0.96-2ubuntu2/debian/control 2006-02-24 14:29:09.000000000 +0000 @@ -7,8 +7,7 @@ Package: powernowd Architecture: any -Depends: ${shlibs:Depends} -Conflicts: cpudyn, cpufreqd +Depends: ${shlibs:Depends}, lsb-base (>= 1.3-9ubuntu2), module-init-tools (>=3.1-rel-2ubuntu2), laptop-detect Description: control cpu speed and voltage using 2.6 kernel interface This simple client controls CPU speed and voltage using the sysfs interface to the CPUFreq driver in v2.6 Linux kernels. It does not depend on APM or diff -pruN powernowd_0.96-1/debian/cpufreq-detect.sh powernowd_0.96-2ubuntu2/debian/cpufreq-detect.sh --- powernowd_0.96-1/debian/cpufreq-detect.sh 1970-01-01 01:00:00.000000000 +0100 +++ powernowd_0.96-2ubuntu2/debian/cpufreq-detect.sh 2006-02-24 14:29:09.000000000 +0000 @@ -0,0 +1,94 @@ +#! /bin/bash + +if /usr/sbin/laptop-detect; then LAPTOP=1; fi +CPUINFO=/proc/cpuinfo +IOPORTS=/proc/ioports + +if [ ! -f $CPUINFO ] ; then + echo $CPUINFO not detected... >2 + exit 1 +fi + +MODEL_NAME=`grep '^model name' "$CPUINFO" | head -1 | sed -e 's/^.*: //;'` +CPU=`grep -E '^cpud[^:]+:' "$CPUINFO" | head -1 | sed -e 's/^.*: //;'` +VENDOR_ID=`grep -E '^vendor_id[^:]+:' "$CPUINFO" | head -1 | sed -e 's/^.*: //;'` +CPU_FAMILY=$(sed -e '/^cpu family/ {s/.*: //;p;Q};d' $CPUINFO) + +MODULE=none +MODULE_FALLBACK=acpi-cpufreq + +# Two modules for PIII-M depending the chipset. +# modprobe speedstep-ich$EXT || modprobe speestep-smi$EXT would be another way +if [ -f $IOPORTS ] && grep -q 'Intel .*ICH' $IOPORTS ; then + PIII_MODULE=speedstep-ich +else + PIII_MODULE=speedstep-smi +fi + +case "$VENDOR_ID" in + GenuineIntel*) + # If the CPU has the est flag, it supports enhanced speedstep and should + # use the speedstep-centrino driver + if [ "`grep est $CPUINFO`" ]; then + MODULE=speedstep-centrino; + elif [ $CPU_FAMILY = 15 ]; then + # Right. Check if it's a P4 without est. + # Could be speedstep-ich, or could be p4-clockmod. + MODULE=speedstep-ich; + # Disabled for now - the latency tends to be bad enough to make it + # fairly pointless. + # echo "FREQDRIVER=p4-clockmod" >/etc/default/powernowd + # to override this +# if [ $LAPTOP = "1" ]; then +# MODULE_FALLBACK=p4-clockmod; +# fi + else + # So it doesn't have Enhanced Speedstep, and it's not a P4. It could be + # a Speedstep PIII, or it may be unsupported. There's no terribly good + # programmatic way of telling. + case "$MODEL_NAME" in + Intel\(R\)\ Pentium\(R\)\ III\ Mobile\ CPU*) + MODULE=$PIII_MODULE ;; + + # JD: says this works with cpufreq_userspace + Mobile\ Intel\(R\)\ Pentium\(R\)\ III\ CPU\ -\ M*) + MODULE=$PIII_MODULE ;; + + # https://bugzilla.ubuntu.com/show_bug.cgi?id=4262 + # UNCONFIRMED + Pentium\ III\ \(Coppermine\)*) + MODULE=$PIII_MODULE + ;; + esac + fi + ;; + AuthenticAMD*) + # Hurrah. This is nice and easy. + case $CPU_FAMILY in + 5) + # K6 + MODULE=powernow-k6 + ;; + 6) + # K7 + MODULE=powernow-k7 + ;; + 15) + # K8 + MODULE=powernow-k8 + ;; + esac + ;; + CentaurHauls*) + # VIA + if [ $CPU_FAMILY == 6 ]; then + MODULE=longhaul; + fi + ;; + GenuineTMx86*) + # Transmeta + if [ "`grep longrun $CPUINFO`" ]; then + MODULE=longrun + fi + ;; +esac diff -pruN powernowd_0.96-1/debian/dirs powernowd_0.96-2ubuntu2/debian/dirs --- powernowd_0.96-1/debian/dirs 2005-12-06 13:32:44.000000000 +0000 +++ powernowd_0.96-2ubuntu2/debian/dirs 2006-02-24 14:29:09.000000000 +0000 @@ -1 +1,2 @@ usr/sbin +usr/share/powernowd diff -pruN powernowd_0.96-1/debian/init.d powernowd_0.96-2ubuntu2/debian/init.d --- powernowd_0.96-1/debian/init.d 2005-12-06 13:32:44.000000000 +0000 +++ powernowd_0.96-2ubuntu2/debian/init.d 2006-02-24 14:29:09.000000000 +0000 @@ -13,36 +13,122 @@ OPTIONS="-q" [ -f /etc/default/$NAME ] && . /etc/default/$NAME +# Get lsb functions +. /lib/lsb/init-functions +. /etc/default/rcS + +if [ "x$VERBOSE" = "xno" ]; then + MODPROBE_OPTIONS="$MODPROBE_OPTIONS -Q" + export MODPROBE_OPTIONS +fi + set -e -case "$1" in - start) - echo -n "Starting $DESC: " - if [ -f /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ] +load_modules() { + #stop the kernel printk'ing at all while we load. + PRINTK=`cat /proc/sys/kernel/printk` + [ "$VERBOSE" = no ] && echo "0 0 0 0" > /proc/sys/kernel/printk + + #build a list of current modules so we don't load a module twice + LIST=`/sbin/lsmod|awk '!/Module/ {print $1}'` + + #get list of available modules + LOC="/lib/modules/`uname -r`/kernel/drivers/cpufreq" + if [ -d $LOC ]; then + MODAVAIL=`( find $LOC -type f -name "*.o" -printf "basename %f .o\n"; \ + find $LOC -type f -name "*.ko" -printf "basename %f .ko\n" ) | /bin/sh` + else + MODAVAIL="" + fi + + + #echo "Loading cpufreq modules:" + for mod in $MODAVAIL; do + # echo " $mod" + echo $LIST| grep -q -w "$mod" || modprobe $mod >/dev/null || /bin/true + done + + #cpufreq is built in on powerpc; just return + if [ "`uname -m`" = "ppc" ]; then + return 0 + fi + + + #new style detection system + if [ ! "$FREQDRIVER" = "" ]; then + modprobe "$FREQDRIVER" + else + . /usr/share/powernowd/cpufreq-detect.sh + [ ! -z "$MODULE" ] && (modprobe "$MODULE"||modprobe "$MODULE_FALLBACK") + fi + + if [ "$USE_OLD_DETECT" = "fish" ]; then + # now lets load the driver + if [ ! $FREQDRIVER = "" ]; then + modprobe $FREQDRIVER||true + fi + if [ "`uname -m`" = "x86_64" ]; then + modprobe powernow-k8 >/dev/null 2>&1||true + fi + + if [ ! -f /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ]; then + modprobe acpi > /dev/null 2>&1|| true + fi + fi + echo "$PRINTK" > /proc/sys/kernel/printk +} + +check_kernel() { + CPUFREQ=/sys/devices/system/cpu/cpu0/cpufreq + + if [ -f "$CPUFREQ/scaling_governor" ] && \ + [ -f "$CPUFREQ/scaling_available_governors" ] && \ + grep -q userspace "$CPUFREQ/scaling_available_governors" + then + return 0 + else + return 1 + fi +} + +start() { + log_begin_msg "Starting $DESC... " + if check_kernel then - start-stop-daemon --start --quiet --oknodo --exec $DAEMON -- $OPTIONS + # echo "Starting $DESC: " + start-stop-daemon --start --quiet --oknodo --exec $DAEMON -- $OPTIONS >/dev/null 2>&1 || { + status=$? + log_end_msg $status + return $status + } else - echo "required sysfs objects not found!" - echo -e "\tRead /usr/share/doc/powernowd/README.Debian for more information." - exit 0 + log_success_msg "CPU frequency scaling not supported" + # echo "required sysfs objects not found!" + # echo -e "\tRead /usr/share/doc/powernowd/README.Debian for more information." fi - echo "$NAME." + log_end_msg 0 + return 0 +} + +case "$1" in + start) + [ "x$DO_MODULES" = "xyes" -a -f /proc/modules ] && load_modules + [ "x$DO_MODULES" = "xyes" ] || start ;; stop) - echo -n "Stopping $DESC: " + log_begin_msg "Stopping $DESC: " start-stop-daemon --stop --quiet --oknodo --exec $DAEMON - echo "$NAME." + log_end_msg $? ;; restart|force-reload) - echo -n "Restarting $DESC: " - start-stop-daemon --stop --quiet --oknodo --exec $DAEMON + $0 stop sleep 1 - start-stop-daemon --start --quiet --oknodo --exec $DAEMON -- $OPTIONS - echo "$NAME." + $0 start + #echo "$NAME." ;; *) N=/etc/init.d/$NAME - echo "Usage: $N {start|stop|restart|force-reload}" >&2 + log_success_msg "Usage: $N {start|stop|restart|force-reload}" >&2 exit 1 ;; esac diff -pruN powernowd_0.96-1/debian/init.d.early powernowd_0.96-2ubuntu2/debian/init.d.early --- powernowd_0.96-1/debian/init.d.early 1970-01-01 01:00:00.000000000 +0100 +++ powernowd_0.96-2ubuntu2/debian/init.d.early 2006-02-24 14:29:09.000000000 +0000 @@ -0,0 +1,7 @@ +#!/bin/sh + +# Set DO_MODULES to yes which will trigger the module loading part of the +# powernowd init script instead of the daemon part. + +DO_MODULES=yes +. /etc/init.d/powernowd diff -pruN powernowd_0.96-1/debian/postinst powernowd_0.96-2ubuntu2/debian/postinst --- powernowd_0.96-1/debian/postinst 1970-01-01 01:00:00.000000000 +0100 +++ powernowd_0.96-2ubuntu2/debian/postinst 2006-02-24 14:29:09.000000000 +0000 @@ -0,0 +1,12 @@ +#!/bin/sh + +if [ -x "/etc/init.d/powernowd.early" ]; then + update-rc.d powernowd.early start 10 2 . >/dev/null + if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then + invoke-rc.d powernowd.early start || exit 0 + else + /etc/init.d/powernowd.early start || exit 0 + fi +fi + +##DEBHELPER## diff -pruN powernowd_0.96-1/debian/postrm powernowd_0.96-2ubuntu2/debian/postrm --- powernowd_0.96-1/debian/postrm 1970-01-01 01:00:00.000000000 +0100 +++ powernowd_0.96-2ubuntu2/debian/postrm 2006-02-24 14:29:09.000000000 +0000 @@ -0,0 +1,10 @@ +#!/bin/sh +set -e + +if [ "$1" = "purge" ] ; then + update-rc.d powernowd.early remove >/dev/null || exit 0 +fi + +##DEBHELPER## + + diff -pruN powernowd_0.96-1/debian/rules powernowd_0.96-2ubuntu2/debian/rules --- powernowd_0.96-1/debian/rules 2005-12-06 13:32:44.000000000 +0000 +++ powernowd_0.96-2ubuntu2/debian/rules 2006-02-24 14:29:09.000000000 +0000 @@ -26,6 +26,12 @@ # Add here commands to install the package into debian/powernowd. install -o root -g root -m 0755 powernowd \ debian/powernowd/usr/sbin/powernowd + install -o root -g root -m 0755 debian/cpufreq-detect.sh \ + debian/powernowd/usr/share/powernowd/cpufreq-detect.sh + + mkdir -p debian/powernowd/etc/init.d + install -o root -g root -m 0755 debian/init.d.early \ + debian/powernowd/etc/init.d/powernowd.early # Build architecture-independent files here. binary-indep: build install