2. The Different Approaches

In the following section I present different approaches to achieve the same goal: power-saving on your Athlon-based system. My recommended approach at the moment is to use the "command-line hack," because the kernel patch is outdated and will not be developed any further, and the LVCool patch supports only one chipset family. The athcool program sounds good, but I haven't tested it myself.

All these approaches will set the "Disconnect eable when STPGNT detected" bit in the north bridge of the chipset. Nothing more and nothing less than that. All other work is done by the ACPI subsystem of the kernel which sends a STPGNT signal to the processor, when it enters the acpi-c2 idle mode. (Only the LVCool solution takes a different way ...)

If you haven't already got a kernel with ACPI support, you have to enable it in the kernel setup and then recompile the new kernel. You'll find the ACPI-options under General Setup+Power Management Setup->ACPI. You must have at least the following options: ACPI Bus Manager, System and Processor.

2.1. The Command-line Hack

To use the command-line hack you have to enable ACPI in the kernel. How you can do this is described in Section 2.4. If you already have a kernel with ACPI-processor support, you can enable/disable the power-saving right from the command-line without any need for rebooting.

on KT133/133A, KX133, KL/KLE133, KM/KN133, ...:

enable: setpci -v -H1 -s 0:0.0 52=$(printf %x $((0x$(setpci -H1 -s 0:0.0 52) | 0x80)))

disable: setpci -v -H1 -s 0:0.0 52=$(printf %x $((0x$(setpci -H1 -s 0:0.0 52) & 0x7f)))

on KT266/266A/333, KM266/333, ...:

enable:

setpci -v -H1 -s 0:0.0 92=$(printf %x $((0x$(setpci -H1 -s 0:0.0 92) | 0x80)))

setpci -v -H1 -s 0:0.0 95=$(printf %x $((0x$(setpci -H1 -s 0:0.0 95) | 0x02)))

disable:

setpci -v -H1 -s 0:0.0 92=$(printf %x $((0x$(setpci -H1 -s 0:0.0 92) & 0x7f)))

setpci -v -H1 -s 0:0.0 95=$(printf %x $((0x$(setpci -H1 -s 0:0.0 95) & 0xfd)))

on KT400: (experimental! plz report, whether it works)

enable:

setpci -v -H1 -s 0:0.0 D2=$(printf %x $((0x$(setpci -H1 -s 0:0.0 D2) | 0x80)))

setpci -v -H1 -s 0:0.0 D5=$(printf %x $((0x$(setpci -H1 -s 0:0.0 D5) | 0x02)))

disable:

setpci -v -H1 -s 0:0.0 D2=$(printf %x $((0x$(setpci -H1 -s 0:0.0 D2) & 0x7f)))

setpci -v -H1 -s 0:0.0 D5=$(printf %x $((0x$(setpci -H1 -s 0:0.0 D5) & 0xfd)))

on SIS730/733: (experimental! plz report, whether it works)

enable: setpci -v -H1 -s 0:0.0 6B=$(printf %x $((0x$(setpci -H1 -s 0:0.0 6B) | 0x01)))

disable: setpci -v -H1 -s 0:0.0 6B=$(printf %x $((0x$(setpci -H1 -s 0:0.0 6B) & 0xfe)))

on SIS735/740/745/746/755:

enable: setpci -v -H1 -s 0:0.0 6A=$(printf %x $((0x$(setpci -H1 -s 0:0.0 6A) | 0x0001)))

disable: setpci -v -H1 -s 0:0.0 6A=$(printf %x $((0x$(setpci -H1 -s 0:0.0 6A) & 0xfffe)))

on Nforce:

enable:

setpci -v -H1 -s 0:0.0 E7=$(printf %x $((0x$(setpci -H1 -s 0:0.0 E7) | 0x06)))

setpci -v -H1 -s 0:0.0 6D=$(printf %x $((0x$(setpci -H1 -s 0:0.0 6D) | 0x80)))

disable:

setpci -v -H1 -s 0:0.0 E4=$(printf %x $((0x$(setpci -H1 -s 0:0.0 E7) & 0xf9)))

on Nforce2:

enable: setpci -v -H1 -s 0:0.0 6F=$(printf %x $((0x$(setpci -H1 -s 0:0.0 6F) | 0x10)))

disable: setpci -v -H1 -s 0:0.0 6F=$(printf %x $((0x$(setpci -H1 -s 0:0.0 6F) & 0xef)))

on AMD751 and AMD760/761:(works without acpi enabled)

enable: setpci -v -s 0:0.0 0x62=$(printf %x $((0x$(setpci -H1 -s 0:0.0 62) | 0x06)))

disable: setpci -v -s 0:0.0 0x62=$(printf %x $((0x$(setpci -H1 -s 0:0.0 62) & 0xf9)))

2.2. The Athcool Program

Athcool is a small program which performs the same task as the setpci commands above. It supports the same chipsets and detects what chipset you have, issuing the right settings in the chipset to get the power-saving to work.

You can read more about it (and download it) here.

2.3. BIOS updates

On some newer boards the manufacturer provides a BIOS update which sets the needed bit/bits in the chipset of the board (or let you choose in the BIOS-setup whether it should be enabled). Refer to the homepage of your motherboard manufacturer to see if such a BIOS-update is available.

2.4. My Kernel Patch

My patch is based on another patch (from Jan Niehusmann) I found on the Newsnet. I modified the patch to also support the KT266/266A chipset. By the way, my patch does the same as the command-line hack, except from within the kernel. This is why I recommend using the command-line hack, which is really simple to use.

Ok... now step by step, here's how to apply the patch:

  1. First you have to download the patch: Kernel Patch for 2.4.17

  2. Login as root

  3. cd /usr/src

  4. Apply the patch: cat $path-to-patch/amd_cool.diff | patch -p0

  5. cd linux

  6. Make the new kernel

  7. Reboot, and at the kernel boot-prompt, enter the statement amd_disconnect=yes . This is because there are known bugs within the Athlon processor, which could cause problems on several boards. You should test the patch, and if it works, you can append the statement amd_disconnect=yes to the file /etc/lilo.conf.

2.5. The LVCool Solution

LVCool is a small port of the Windows programm VCool. It only supports the KT133/133A and KX133 chipset and I can provide no support for it. You can download it here. This is the only solution which does not use the ACPI system of the Linux kernel.