[home]

Linux

amd76x_pm: power management for AMD K7 SMP

This module has been written by Tony Lindgren in 2002. It enables C2/C3 powersaving mode on AMD K7 SMP systems. This is a very useful thing, as AMD K7 consumes a lot of energy. With this module you may save up to 70 – 90 W in idle mode compared to the default idle mode. See Tony's page http://www.muru.com/linux/amd-smp-idle/ for details.

Several people have been involved in developing, improving and testing this driver. Some of them are:

Tony Lindgren, Johnathan Hicks, Alan Cox, Pasi Savolainen

After some changes in the 2.6 kernel Tony's and Pasi's patches weren't usable any longer and I started to maintain a more recent version just for myself. By doing this I got more and more familiar with the code and started to play around a bit. My main motivation was the fact that I realized a bad influence from this module on the system clock. Some small changes showed an improvement and I asked at LKML if this modified module might be included in some standard kernel tree. I got some suggestions for further improvements from and started to rewrite the idle-loop. And here is the result.

Some people reported that this module works for them. For known issues see below. Just give it a try! All you need to do is apply the recent patch, enable “AMD76x Native Power Management support” in “Power management options” / “ACPI” and read Documentation/amd76x_pm.txt.

Known issues

Patch usage

Up to 2.6.15-2 the patches were split into two parts: Starting with 2.6.15-3 C3 idling has been (re-)introduced. This resulted in almost disjoint functionality in the "standard" and the "extra" patch. For this reason I gave up the "extra" patch. There is a frozen version available, that provides experimental support for "normal throttling" and "power on suspend".

Release Notes

I have added an atom feed for latest versions.

2.6.28-2
added support for cpuidle

2.6.28-1
adapted to changes in the kernel's idle loop
calculation of sleep_rate removed. (It was erroneous anyway.)
removed the lazy_idle loop
renamed spin_idle to max_poll. The behaviour has completely changed!
extended mode to C0-C3
introduced busy_mode
borrowed some code from processor_idle.c

2.6.24-1
trivial 2.6.24 port

2.6.23-1
trivial 2.6.23 port

2.6.22-1
2.6.22 port

2.6.21-2
removed "synchronized sleep", i.e. one CPU might enter Cx state if all other CPUs are idle but not nessecarily entering Cx state.
run "inner loop" with interrupts enabled
adopted some system clock related functionalities from processor_idle.c

2.6.21-1
sleep_rate calculation using 64bit arithmetics

2.6.20-1
workqueue API changes in 2.6.20

2.6.19-1
Trivial 2.6.19 port.

2.6.18-2
Trivial 2.6.18 port.

2.6.17-2
Removed some double-locking.
Code lifting.

2.6.17-1
Some changes concerning memory barriers.

2.6.16-1
Removed sleep_time in favor of sleep_rate, which gives a better idling measure.
C2/C3 mode now changeable at runtime. Note: syntax has changed.

2.6.15-6
Redesigned the idle function again. Now there shouldn't be any situations left where not all CPUs try to enter C2/C3.
Removed the (ugly) parsing of watch_irqs. Using two separate arrays watch_irqs and watch_limits now.
sleep_time calculation and sysfs entries added.
This patch isn't well tested yet.
Note: module parameter syntax has changed.

2.6.15-4
Major redesign of the idle loop again. Now there is a two-phase process to make sure all or no CPUs go into C3. In phase one each CPU waits for the other to become idle. In phase two all CPUs come to an agreement about going C3 or not. Now using spinlocks. Simplicity has gone :-(

2.6.15-3
Switched from C2 to C3 idling, inspired by processor_idle.c. C2 idling has just been replaced by C3 idling, there is no C2/C3 transition.
Restoring all touched northbridge and southbridge register bits to their original values on module unload.
Note: Please check lazy_idle and spin_idle values, the behaviour might have changed again.

2.6.15-2
Removed a race condition in the idle loop. Clock stability has improved now, maybe other issues also have gone.

2.6.15-1
Using percpu variables.
Note: Please check lazy_idle and spin_idle values, the behaviour might have changed.

2.6.14-2
Minor changes in memory layout.

2.6.14-1
No major changes from 2.6.13-1.

2.6.13-1
Mainly 2.6.13 API changes. No major changes from 2.6.12-jo4-1.

2.6.12-jo4-1
Introduced an "irq rate watcher". This task checks the interrupt rate of some interrupts and prevents entering C2 mode if any of them exceeds a certain limit. This improves the throughput of disk and network devices and gives a better system clock stability too. There are a lot of changes, please take a look at Documentation/amd76x_pm.txt for details.

2.6.12-jo3
The idle loop has been rewritten completely. The impact on the system clock has (hopefully) been reduced. Please check your settings for lazy_idle as the impact on cooling and clock stability may have changed. NTH and POS from the -extra patch are still untestet. C3 idling seems to work.

2.6.12-jo2
A first attempt to improve amd76x_pm.

Download

Here are some patches:

Version 20090301

amd76x_pm-2.6.28-2.patch

Version 20090225

amd76x_pm-2.6.28-1.patch

Version 20070724

amd76x_pm-2.6.24-1.patch
amd76x_pm-2.6.23-1.patch
amd76x_pm-2.6.22-1.patch

Version 20070526

amd76x_pm-2.6.21-2.patch

Version 20070406

amd76x_pm-2.6.21-1.patch

Version 20070209

amd76x_pm-2.6.20-1.patch

Version 20061210

amd76x_pm-2.6.19-1.patch

Version 20061010

amd76x_pm-2.6.18-2.patch

Version 20060719

amd76x_pm-2.6.17-2.patch

Version 20060624

amd76x_pm-2.6.17-1.patch

Version 20060409

amd76x_pm-2.6.16-1.patch

Version 20060214

amd76x_pm-2.6.15-6.patch

Version 20060129

amd76x_pm-2.6.15-4.patch

Version 20060121

amd76x_pm-2.6.15-3.patch

Version 20060110

amd76x_pm-2.6.15-2.patch

Version 20060110-extra

amd76x_pm-2.6.15-2-extra.patch

Version 20060108

amd76x_pm-2.6.15-1.patch

Version 20060108-extra

amd76x_pm-2.6.15-1-extra.patch

Version 20051128

amd76x_pm-2.6.14-2.patch

Version 20051129-extra

amd76x_pm-2.6.14-2-extra.1.patch

Version 20050906

amd76x_pm-2.6.14-1.patch

Version 20050906-extra

amd76x_pm-2.6.14-1-extra.patch

Version 20050830

amd76x_pm-2.6.13-1.patch

Version 20050830-extra

amd76x_pm-2.6.13-1-extra.patch

Version 20050821

amd76x_pm-2.6.12-jo4-1.patch

Version 20050821-extra

amd76x_pm-2.6.12-jo4-1-extra.patch

Version 20050812

amd76x_pm-2.6.12-jo3.patch

Version 20050621

amd76x_pm-2.6.12-jo2.patch

Version 20050621-extra

amd76x_pm-2.6.12-jo2-extra.patch


Have fun!

-jo