submit to programming reddit
 
(Written around 2002 and posted on alt.comp.periphs.mainboard.giga-byte)

I have recently bought a GIGABYTE 7VTXE+ motherboard and an Athlon XP 1600+. This is the first system I ever had with a temperature high enough to make me worry. With a room temperature of 20C, my motherboard after a couple of hours was at 36C and my CPU at 53C. During the summer, my room temperature will go to 35C. Will my CPU melt? And this was in more or less idle conditions!

Fortunately, I can report that using free software-only methods, I am now operating at motherboard:27C and CPU:28C. This is of course, a difference big enough to justify this text. I hope some other soul will find this description helpful (GIGABYTE, put this in your web site!). I'm also very pleased to report that this works for Windows 2000, Windows 98 AND LINUX.

Simple Minds

Non-technical folk, just buy CpuIdle and make sure you check the 'Optimize CPU/Chipset' checkbox. Your temperature will immediately start to drop.

ACPI

Software cooling is not as simple as it used to be (an idle thread issuing HLT commands). Read the superb description inside VCool's help file (http://naggelgames.de/vcool/ or http://mpet.multiservers.com/VCool.html) To summarize, the simplest way to software (passive) cooling, is to have a system with ACPI, and inform the Northbridge to disconnect the bus before going to sleep (when a HLT command is executed).

So, before doing anything else, make sure that both your BIOS and your OS have ACPI enabled (for 7VTXE+ owners, the BIOS is fine).

OK, I have ACPI, then what?

Well, now you must tell your KT266 to "detect the HLT command". Read the VCool help file for more details. The summary is that inside the PCI Configuration space of your KT266, you must set the "HLT command detect" bit, in register 0x95. In pseudocode:
Read byte 0x95 from the configuration space of
        PCI device 1106:3099 (KT266)
Set bit 1 (2nd from the right) to 1
Write the new value to the same register in the
        configuration space

Windows:

Well, Windows Users, it's time to download WPCREDIT. Search it in google, it will show up everywhere. After installing and running it, you select device 1106:3099 (that is, your KT266) and modify register 0x95. My system had a default value of 0x18, i.e. 00011000. I changed it to 0x1A, i.e. 00011010, and presto, the temperature started to drop. When you verify that it works, download WPCRSET to make the change automatically when the system boots up.

Linux:

You 're in luck. I did all the hard work for you :‑) (actually Martin Peters did, I just climbed on his shoulders). Copy the following src, compile it with gcc, and run it as root. You can use lm_sensors to see your temperature drop in leaps. In case you don't know it, GA 7VTXE+ has an it87 sensor, so add to your rc.local something like this:
        /sbin/modprobe i2c-isa
        /sbin/modprobe it87 temp_type=0x38
        /usr/local/bin/sensors -s
and run
        sensors
to see your cooled CPUs temperature.

Hope these help your feverish 7VTXE+.

/********************************************************
    begin      : Fri Jul  6 10:13:24 CEST 2001
    copyright  : (C) 2001 by Martin Peters
    email      : m...@bigfoot.de
    URL        : http://mpet.freeservers.com/VCool.html

    Mon Mar 18 2002:
    Changes performed by Thanassis Tsiodras for GIGABYTE 
    7VTXE+ motherboards running under ACPI kernels.
 ********************************************************/
/********************************************************
    This program is free software; you can redistribute
    it and/or modify it under the terms of the GNU General
    Public License as published by the Free Software
    Foundation; either version 2 of the License, or
    (at your option) any later version.
 ********************************************************/

#include <stdlib.h>
#include <sys/io.h>
#include <unistd.h>
#include <stdio.h>

#define DWORD unsigned long

int nb_b = 0, nb_d = 0, nb_f = 0;
DWORD PCIRead(int reg, int fn, int dev, int bus)
{
    DWORD r = 0x80000000;
    DWORD ret, org;
    int port = 0xcf8;

    r |= ((bus & 0xff) << 16);
    r |= ((dev & 0x1f) << 11);
    r |= ((fn & 0x7) << 8);
    r |= ((reg & 0xfc));
    org = inl(port);
    outl(r, port);
    ret = inl(port + 4);
    outl(org, port);
    return ret;

}

void PCIWrite(DWORD val, int reg, int fn, int dev, int bus)
{
    DWORD r = 0x80000000;
    DWORD org;
    int port = 0xcf8;

    r |= ((bus & 0xff) << 16);
    r |= ((dev & 0x1f) << 11);
    r |= ((fn & 0x7) << 8);
    r |= ((reg & 0xfc));
    org = inl(port);
    outl(r, port);
    outl(val, port + 4);
    outl(org, port);

}

void InitPCI()                  // Search for KT266 chipset
{
    DWORD res;
    int bus, dev, fun;
    int found = 0;

    for (bus = 0; bus < 255; bus++) {
        for (dev = 0; dev < 32; dev++) {
            for (fun = 0; fun < 7; fun++) {
                res = PCIRead(0, fun, dev, bus);
                if (res == 0xffffffff)
                    continue;

                if (res == 0x30991106) {
                    nb_b = bus;
                    nb_d = dev;
                    nb_f = fun;
                    found = 1;
                    goto adios;
                }
            }
        }
    }
  adios:
    if (!found)
        perror("KT266 Chipset not found");

    res = PCIRead(0x95, nb_f, nb_d, nb_b);
//  printf("Old: %x\n", res);
    res |= 0x00000200;
//  printf("New: %x\n", res);
    printf("Enabling HALT Command Detect on KT266\n");
    PCIWrite(res, 0x95, nb_f, nb_d, nb_b);
}

int main(int argc, char *argv[])
{
    if (iopl(3) < 0)
        perror("must run as root");
    InitPCI();
    return EXIT_SUCCESS;
}

Caveat

Some kind souls on the newsgroups were misinterpreting this work to be enough to forego on hardware cooling (fans, etc). Obviously, this is a VERY BAD idea. Software cooling helps (a lot) when the CPU is idle, but eventually you will put your CPU to work (play a game, encode a video, etc). You need hardware cooling no matter what; what I've described just saves energy (and extends your CPU life) for those large periods of time during which you don't stress your CPU (e.g. when working with Word/Excel documents, writing code with VI, etc).

profile for ttsiodras at Stack Overflow, Q&A for professional and enthusiast programmers
GitHub member ttsiodras
Back to index  My CV  About meLast update on: Sat Mar 8 22:58:16 2014 (Valid HTML)

The comments on this website require the use of JavaScript. Perhaps your browser isn't JavaScript capable or the script is not being run for another reason. If you're interested in reading the comments or leaving a comment behind please try again with a different browser or from a different connection.