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.
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.
Here are some patches:
Version 20090301 |
|
Version 20090225 |
|
Version 20070724 |
amd76x_pm-2.6.24-1.patch
|
Version 20070526 |
|
Version 20070406 |
|
Version 20070209 |
|
Version 20061210 |
|
Version 20061010 |
|
Version 20060719 |
|
Version 20060624 |
|
Version 20060409 |
|
Version 20060214 |
|
Version 20060129 |
|
Version 20060121 |
|
Version 20060110 |
|
Version 20060110-extra |
|
Version 20060108 |
|
Version 20060108-extra |
|
Version 20051128 |
|
Version 20051129-extra |
|
Version 20050906 |
|
Version 20050906-extra |
|
Version 20050830 |
|
Version 20050830-extra |
|
Version 20050821 |
|
Version 20050821-extra |
|
Version 20050812 |
|
Version 20050621 |
|
Version 20050621-extra |
Have fun!
-jo