How to make use of Dynamic Frequency Scaling
Contents
General
Linux supports dynamic frequency scaling for systems with the following processors:
- Mobile Pentium III
- Pentium 4
- Pentium M
- Mobile Athlon
- AMD64
- Opteron
Debian notes
Instead of compiling your own kernel, you can use the Debian "stock" kernel. In Unstable/SID the 2.6.12 kernel image with an /etc/modules file that includes:
battery ac thermal processor acpi-cpufreq cpufreq-userspace
With the powernowd package and you should be setup.
Configuring the Kernel
2.4 Kernels
There were various frequency scaling implementations in the 2.4 series of kernels. They all were preliminary and a standard was rised with the introduction of the sysfs filesystem in 2.6 kernels. It is recommended to use a 2.6 kernel, if possible.
2.6 Kernels
You need to enable the cpu frequency scaling for your kernel (usually your distros kernel will have this enabled):
- <*> (CONFIG_CPU_FREQ)
You need to enable governors, if not already done in your distros default kernel:
- <*> (CONFIG_CPU_FREQ_GOV_PERFORMANCE)
- <*> (CONFIG_CPU_FREQ_GOV_POWERSAVE)
- <*> (CONFIG_CPU_FREQ_GOV_USERSPACE)
Since 2.6.10 there is the ondemand governor that does cpu frequency scaling in kernel so you dont need userspace programs like powernowd etc. It can be enabled with:
- <*> (CONFIG_CPU_FREQ_GOV_ONDEMAND)
Since 2.6.12 there is the conservative governor that works like the ondemand governor, but is recommended for laptops and AMD64:
- <*> (CONFIG_CPU_FREQ_GOV_CONSERVATIVE)
Using the Sys Interface
The files in /sys/devices/system/cpu/cpu0/cpufreq/ provide information and a means of controlling the frequency scaling subsystem. Seed values are given in Khz. You need to be root to access the /sys filesystem.
Your max speed is at /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq.
# cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
700000
Your min speed is at /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq.
# cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq
500000
If you are using the userspace governor, you can write to /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed to change the current speed.
# echo 700000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
# cat /proc/cpuinfo
cpu MHz : 697.252
# echo 900000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
# cat /proc/cpuinfo
cpu MHz : 976.152
Using Frequency Scaling Governors
You can compile the scaling governors into your kernel or compile it as module. You'll find the governors with 'make menuconfig' here:
- Power management options (ACPI, APM) → CPU Frequency scaling →
After booting the new kernel you can get a list of available governors with (as root):
# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
conservative ondemand powersave userspace performance
A Short Overview over the available governors:
- ondemand
- This driver is a dynamic cpufreq policy governor. It changes frequency based on the processor load and may not work on older laptops without Enhanced SpeedStep.
- conservative
- New since 2.6.12. Similar to ondemand. Optimized for battery powered environments and AMD64. Again, this governor may not work on older ThinkPads like the T21.
- powersave
- Like the name says, your battery would choose this one ;). It sets the Frequency always to the lowest available.
- userspace
- You have to choose this one, if a frequency scaling daemon should manage your CPU frequency or you want to do it manually.
- performance
- This governor sets your Frequency always to the highest available.
Now we set our governor: What is our current governor?
# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
userspace
Set new governor and watch if it has changed
# echo conservative > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
conservative
Congrats! Your governor is active.
You may set the governor in your rc.local, to make it used on every boot.
Debian has no rc.local, so read this and this.
A better alternative for Debian than modifying bootscripts, is to install the sysfsutils package. Then edit /etc/sysfs.conf (as root), where you can setup values to sysfs entries that you want to be modified automatically on boot.
Using Frequency Scaling Daemons
Don't forget to enable the userspace governor to have a userspace daemon do the frequency scaling. If it is built as module, load it as cpufreq-userspace.
There are plenty of userspace frequency scaling daemons available:
Troubleshooting
- If you have a Coppermine-piix-smi based Thinkpads like from the A2x, X2x and T2x series you need to enable the speedstep-smi driver in the kernel and load it if it's built as module. You might want to look at this page.
- If you have a p4-class celeron based Thinkpad like the R40e you might want to look at this page