# [POWERNOW-K7] utilisation optimale sous kernel 2.6 HOWTO

## rk187

Mise à Jour du How-To sur la gestion du PowerNow! 29/08/2004

la config à changé depuis, désormais on utilisera la nouvelle interface du repertoire /sys

Première chose, vous devez avoir un Mobile Athlon pour utiliser ce driver.

pour vérifier faites un grep name /proc/cpuinfo

```

model name      : mobile AMD Athlon(tm) XP 1600+

```

-Config du noyau :

 *Quote:*   

> 
> 
> [*] CPU Frequency scaling                                        
> 
> < >   /proc/cpufreq interface (deprecated)                       
> ...

 

-Config des modules :

ajouter dans /etc/modules.autoload.d/kernel-2.6

 *Quote:*   

> 
> 
> powernow-k7
> 
> cpufreq_powersave
> ...

 

-Rebootez

-Verification de l'état du driver

cherchez la sortie du driver powernow dans dmesg, voici le mien:

 *Quote:*   

> 
> 
> powernow: PowerNOW! Technology present. Can scale: frequency and voltage.
> 
> powernow: FSB: 100.046 MHz
> ...

 

-Maintenant jetez un coup d'oeil dans ce repertoire : /sys/devices/system/cpu/cpu0/cpufreq/

les noms de chaques éléments sont assez explicites, par exemple un cat cpuinfo_cur_freq vous donnera la fréquence actuelle du processeur.

-Gestion logicielle

emerge cpudyn	#ce soft basculera de min a max suivant la charge cpu, simple d'utilisation aucune config à faire.

emerge cpufreqd	#plus complet et paramètrable avec un fichier de config.

Je vous laisse consulter les man car leur config n'est pas le sujet de ce How-To.

-Gestion Manuelle

3 fichiers sont à considerer:

scaling_governor

scaling_max_freq

scaling_min_freq

par défaut pour mon proc min=500 et max=1400

pour basculer à min : echo powersave > scaling_governor

pour basculer à max : echo performance > scaling_governor

Vous pouvez modifier les fichiers scaling_max_freq et scaling_min_freq

par exemple :

echo 701000 > scaling_min_freq

echo 1001000 > scaling_max_freq

à present min=700 et max=1000

(vous remarquerez que je mets 701000 et non 700000, car la fréquence n'est jamais de 700 tout rond donc en mettant 700000 vous obtiendrez 500MHz)

en général on laisse min à 500 car le but de powersave est de consommer le moins.

Pour mieux comprendre voici ma config d'alias:

```

alias performance = 'echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'

alias powersave = 'echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'

alias 700 = 'echo 701000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq'

alias 1000 = 'echo 1001000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq'

alias 1200 = 'echo 1201000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq'

alias 1400 = 'echo 1401000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq'

```

en mode performance le fait de taper 1000 changera dynamiquement la fréquence, en mode powersave le cpu restera toujours à 500.

J'ai utilisé cpudyn et cpufreqd mais a la longue je préfere gérer moi meme la fréquence.

voici quelques exemples d'utilisation:

utilisation im/chat/etc :  500

utilisation bureautique :  700

utilisation multimedia  : 1000

compilation emerge      : 1400

sur batterie le fait de rester toujours en powersave me donne environ 2h d'autonomie. :Wink: 

sinon mon super record de consomation est de 27 minutes (cpu à 1400 + lecture DVD). :Laughing: 

[howto obsolète]

Voici la methode pour utiliser la technologie Powernow de façon "Power-On-Demand"

tout d'abord la config du kernel 2.6

Dans power management activer CPU Frequency scaling

activer en module

- /proc/cpufreq interface

- 'powersave' governor 

- CPU frequency table helper

- AMD Mobile Athlon/Duron PowerNow!

ensuite dans /etc/module.autoload/kernel-2.6

ajouter:

powernow-k7

proc_intf

cpufreq_powersave

et pour terminer emergez le package cpudyn

lancez le par 

```
/etc/init.d/cpudyn start
```

 et mettez le au demarrage : 

```
rc-update add cpudyn default
```

Vous pouvez tester en lancant un film ou une compil par exemple, tapez cat /proc/cpuinfo et regardez la ligne "cpu MHz" ensuite virer le film et reconsulter la frequence elle sera au minimum.

dans mon cas j'ai un XP1600+ au minimum il tourne à 500MHz et 1400MHz au maximum, si l'application ne demande pas de puissance il reste à 500, exemple pendant la lecture d'un mp3 avec xmms. 

voila j'espere que ça pourra vous servir, j'utilisais depuis longtemps le powernow mais je ne connaissais pas le programme "cpudyn" il doit etre recent.

 :Cool: Last edited by rk187 on Sun Aug 29, 2004 9:18 am; edited 2 times in total

----------

## Zidge

bon, voila, fallait bien commencer par qqn ...

donc voila, moi j'ai un pb ...

j'ai bien suivi ton tutos

jusqu'au point: inserer dans votre modules.autoload ...

la, j'ai plutot tente de lancer les modules a la main

un petit modprobe ... et vlan, lors du

modprobe powernow-k7

FATAL: Error inserting powernow_k7 (/lib/modules/2.6.0-test11-gentoo-r1/kernel/arch/i386/kernel/cpu/cpufreq/powernow-k7.ko): No such device

va comprendre charles, pourtant j'ai bien mis en module athlon/duron

d'ailleurs il y a bien un fichier powernow-k7.ko dans le rep en question ...

any idea ?

----------

## rk187

heu oui c un peu bizarre, peux tu poster le resultat de ton cat /proc/cpuinfo

j'utilises les dev-sources mais je ne penses pas que ca vienne de tes gentoo-sources. tu as quand meme rebooté j'espere car le CPU freq scaling est compilé en dur.

----------

## Zidge

 *Quote:*   

> processor       : 0
> 
> vendor_id       : AuthenticAMD
> 
> cpu family      : 6
> ...

 

vi vi j'avais bien reboote pas de souci la dessus :p

----------

## rk187

voici le mien:  *Quote:*   

> processor	: 0
> 
> vendor_id	: AuthenticAMD
> 
> cpu family	: 6
> ...

 

il faut croire que ça ne fonctionne pas sur un Athlon XP non-mobile. pourtant il porte la marque Powernow aussi il me semble ?

si quelqu'un d'autre a une idée...   :Rolling Eyes: 

----------

## rk187

bon bah mon tuto concerne tout de suite moins de monde... voici la reponse tirée du site d'AMD :  *Quote:*   

> AMD PowerNow! technology is an innovative solution available on all AMD mobile processor-based notebooks

 

http://www.amd.com/us-en/Processors/ProductInformation/0,,30_118_1276_807%5E964,00.html

----------

## SnowBear

Salut,

j'ai un XP mobile monté sur un pc de bureau. 

J'ai voulu suivre cette how-to et j'en ai conclu la chose suivante : ça ne fonctionne que sur les portables, je m'en doutais un peu mais bon...

mon dmesg

```
powernow: PowerNOW! Technology present. Can scale: frequency and voltage.

powernow: Trying ACPI perflib

powernow: ACPI perflib can not be used in this platform

powernow: ACPI and legacy methods failed

powernow: See http://www.codemonkey.org.uk/projects/cpufreq/powernow-k7.shtml
```

Un cat /proc/cpuinfo

```
processor       : 0

vendor_id       : AuthenticAMD

cpu family      : 6

model           : 10

model name      : AMD Athlon XP-M

stepping        : 0

cpu MHz         : 3537.138

cache size      : 512 KB

fdiv_bug        : no

hlt_bug         : no

f00f_bug        : no

coma_bug        : no

fpu             : yes

fpu_exception   : yes

cpuid level     : 1

wp              : yes

flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse syscall mp mmxext 3dnowext 3dnow

bogomips        : 7083.37
```

Au passage la fréquence est les bogomips ont buggé... en vérité c'est 1800 mHz et dans les 3/4000 bogomips

----------

## chipsterjulien

A un moment tu mets :

 *Quote:*   

> │ Default CPUFreq governor (performance) --->
> 
> --- 'performance' governor 

 

Personnellement si tu veux avoir des bonnes performances sur un pc sur une batterie il faut mettre userspace et utiliser par exemple powernowd. Ceci permet d'éviter d'avoir le ventilateur qui tourne sans arrêt. Cependant sur un pc non portable il vaut mieux mettre performance car la réactivité de userspace est légèrement moins bonne

----------

## Zanfib

Pour info l'AMD64 dispose du powernow, donc ce howto marche très bien avec les pc basés sur ce processeur.   :Idea: 

----------

## TGL

 *chipsterjulien wrote:*   

> Personnellement si tu veux avoir des bonnes performances sur un pc sur une batterie il faut mettre userspace et utiliser par exemple powernowd. Ceci permet d'éviter d'avoir le ventilateur qui tourne sans arrêt. Cependant sur un pc non portable il vaut mieux mettre performance car la réactivité de userspace est légèrement moins bonne

 

Quant à moi, j'ai arrêté d'utiliser "userspace + démon qui va qui bien" depuis un certain temps, et je suis passé au governor "ondemand", qui fait en gros la même chose mais dans le noyau. Niveau réactivité, je ne fais vraiment pas la différence avec "performance" : quand il n'y a rien d'autre à faire que de rafraichir une GUI, une basse fréquence suffit bien, et quand il y a du boulot derrière en plus, bah la fréquence monte, donc bref pour moi ça marche nickel. Je reste comme ça y compris quand je suis sur secteur du coup. Par contre il faut bien penser à activer l'option pour qu'il prenne en compte les processus nicés, parceque sinon ça se met évidemment à ramer dès que je fais un emerge par exemple.

Bon maintenant, je ne suis pas sur AMD mais sur Pentium M, je ne sais pas si ça change qqch à l'affaire.

----------

## chipsterjulien

 *TGL wrote:*   

>  *chipsterjulien wrote:*   Personnellement si tu veux avoir des bonnes performances sur un pc sur une batterie il faut mettre userspace et utiliser par exemple powernowd. Ceci permet d'éviter d'avoir le ventilateur qui tourne sans arrêt. Cependant sur un pc non portable il vaut mieux mettre performance car la réactivité de userspace est légèrement moins bonne 
> 
> Quant à moi, j'ai arrêté d'utiliser "userspace + démon qui va qui bien" depuis un certain temps, et je suis passé au governor "ondemand", qui fait en gros la même chose mais dans le noyau. Niveau réactivité, je ne fais vraiment pas la différence avec "performance" : quand il n'y a rien d'autre à faire que de rafraichir une GUI, une basse fréquence suffit bien, et quand il y a du boulot derrière en plus, bah la fréquence monte, donc bref pour moi ça marche nickel. Je reste comme ça y compris quand je suis sur secteur du coup. Par contre il faut bien penser à activer l'option pour qu'il prenne en compte les processus nicés, parceque sinon ça se met évidemment à ramer dès que je fais un emerge par exemple.
> 
> Bon maintenant, je ne suis pas sur AMD mais sur Pentium M, je ne sais pas si ça change qqch à l'affaire.

 

Personnellement, j'ai mis ondemand et les autres en modules mais je ne les ai pas charger car je n'ai ai pas vu l'utilité comme ce que j'avais fait fonctionnait bien. Il faut simplement virer le script et charger le(s) module(s) je parie (je pense que ca doit etre qu'un seul en fonction de ce que l'on veut) et le tour est joué

----------

## TGL

 *chipsterjulien wrote:*   

> Il faut simplement virer le script et charger le(s) module(s) je parie (je pense que ca doit etre qu'un seul en fonction de ce que l'on veut)

 

Tu peux avoir autant de gouverneurs que tu veux de chargés en modules ou de compilés en dur. Après, la sélection se fait via le fichier /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor. Évidemment, comme c'est un chemin un peu long, il y a des petits utilitaires qui permettent de simplifier ça :

```
* sys-power/cpufrequtils

     Available versions:  0.3-r1 0.4

     Installed:           none

     Homepage:            http://www.kernel.org/pub/linux/utils/kernel/cpufreq/cpufrequtils.html

     Description:         Userspace utilities for the Linux kernel cpufreq subsystem
```

 

```
% cpufreq-selector --help

Usage:

  cpufreq-selector [OPTION...] - CPUFreq Selector

Help Options:

  -?, --help          Show help options

Application Options:

  -c, --cpu           CPU Number

  -g, --governor      Governor

  -f, --frequency     Frequency in KHz
```

Enfin en fait, perso ce cpufreq-selector je ne l'utilise pas, parceque je m'étais déjà fait un petit bout de Bash avant de découvrir son existence. 

```
% alias cpufreq

alias cpufreq='sudo /usr/local/sbin/cpufreq'
```

 

```
% cat /usr/local/sbin/cpufreq

#!/bin/bash

CONF_FILE="/etc/cpufreq.conf"

die() { echo "${*}" >&2 ; exit 1 ; }

[[ $UID -eq 0 ]] || die "Must be root."

[[ -n "${1}" ]] || die "Usage: cpufreq <governor>"

for cpu in /sys/devices/system/cpu/cpu[0-9] ; do

   avail_gov=" $(<${cpu}/cpufreq/scaling_available_governors) "

   [[ ${avail_gov} == *" ${1} "* ]] \

      || die "Governor ${1} is not valid for ${cpu##*/}."

   echo "${1}" > ${cpu}/cpufreq/scaling_governor

   [[ -f "${CONF_FILE}" ]] || continue

   sleep 1  # not sure this is needed

   sed -n '/^[ \t]*[a-zA-Z_/]\+[ \t]\+\w\+[ \t]*$/p' "${CONF_FILE}" \

   | while read opt_name opt_value ; do

      opt_file=${cpu}/cpufreq/${opt_name}

      [[ -f "${opt_file}" ]] \

         && echo "${opt_value}" > ${opt_file}

   done

done
```

 

```
% cat /etc/bash_completion.d/cpufreq

# Completion function for /usr/local/sbin/cpufreq

_cpufreq_governor()

{

   local avail_gov="$(</sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors)"

   cur=${COMP_WORDS[COMP_CWORD]}

   COMPREPLY=( $( compgen -W "$avail_gov" -- $cur ) )

   return 0

}

complete -F _cpufreq_governor cpufreq
```

 

```
% cat /etc/cpufreq.conf

# Include niced jobs (kernel <=2.6.15: weird semantics)

ondemand/ignore_nice      1

# Include niced jobs (kernel >=2.6.16: new name and semantics)

ondemand/ignore_nice_load   0
```

Avec ça, je peux faire "cpufreq performance" pour passer en mode performance, refaire "cpufreq ondemand" pour repasser en mode régulé (en plaçant au passage l'option qui va bien pour prendre en compte les jobs nicés), etc. Et j'ai aussi un "/usr/local/sbin/cpufreq ondemand" dans mon /etc/conf.d/local.start pour régler ça une première fois au boot.

 *Quote:*   

> je n'ai ai pas vu l'utilité comme ce que j'avais fait fonctionnait bien.

 

C'est clair qu'il y a plusieurs solutions. Perso je trouve ondemand plus simple (parceque pas de démon à configurer et lancer), mais c'est vraiment une affaire de goût.

EDIT : le cpufreq-selector ci dessus, c'est de gnome-base/gnome-applets qu'il vient en fait. Quant à sys-power/cpufrequtils, il installe bien un utilitaire très similaire, mais qui s'appelle lui cpufreq-set.

----------

## chipsterjulien

Oui, il y a plusieurs solutions mais merci pour les informations supplémentaires, elles peuvent être d'une grande aide pour une personne ne souhaitant pas mettre de daemon en fond et que ca soit plutôt géré par le kernel lui même  :Wink: 

----------

