Difference between revisions of "Pentium M undervolting and underclocking"

From ThinkWiki
Jump to: navigation, search
(Linux kernel patch (example))
(Reorg + extra patch)
Line 11: Line 11:
 
{{NOTE|While under''volting'' has a clear measurable effect, it's not clear if under''clocking'' really works. <tt>/proc/cpuinfo</tt> reflects the underclocked frequency, but enabling debug output on <tt>cpufreq</tt> causes it to say things like "<tt>CPU frequency out of sync: cpufreq and timing core thinks of 533000, is 800000 kHz.</tt>" where the former is the chosen underclocked frequency and the latter is the documented minimum frequency. This discrepancy also causes [[Software Suspend 2]] to oops during suspend.}}
 
{{NOTE|While under''volting'' has a clear measurable effect, it's not clear if under''clocking'' really works. <tt>/proc/cpuinfo</tt> reflects the underclocked frequency, but enabling debug output on <tt>cpufreq</tt> causes it to say things like "<tt>CPU frequency out of sync: cpufreq and timing core thinks of 533000, is 800000 kHz.</tt>" where the former is the chosen underclocked frequency and the latter is the documented minimum frequency. This discrepancy also causes [[Software Suspend 2]] to oops during suspend.}}
  
== Instructions ==
+
There are several methods to control CPU voltage in Linux, and currently all of them require a patcher kernel.
 +
 
 +
== Alternative 1: patch with hard-coded voltages ==
 +
=== Instructions ===
  
 
# Determine the stable voltages for each frequency, using some overclocking/undervolting utility that has specific support for Pentium M ("Centrino") processors. It seems that no such utility exists for Linux. For windows, one good choice is [http://www.pbus-167.com/chc.htm Notebook Hardware Control (NHC)], which conveniently also includes a table of nominal frequencies and voltags (in its help file).<br> Ascertain that at the undervolted settings the CPU actually performs correct computation ([http://www.mersenne.org/freesoft.htm Prime95] in "Tortute Test" mode seems to be a good partial test emphasizing FPU and memory access).<br> Note that beside reducing voltages (undervolting), you can also try to add lower frequencies (underclocking).
 
# Determine the stable voltages for each frequency, using some overclocking/undervolting utility that has specific support for Pentium M ("Centrino") processors. It seems that no such utility exists for Linux. For windows, one good choice is [http://www.pbus-167.com/chc.htm Notebook Hardware Control (NHC)], which conveniently also includes a table of nominal frequencies and voltags (in its help file).<br> Ascertain that at the undervolted settings the CPU actually performs correct computation ([http://www.mersenne.org/freesoft.htm Prime95] in "Tortute Test" mode seems to be a good partial test emphasizing FPU and memory access).<br> Note that beside reducing voltages (undervolting), you can also try to add lower frequencies (underclocking).
Line 31: Line 34:
 
Please report your results (including voltages)!
 
Please report your results (including voltages)!
  
== Linux kernel patch (example) ==
+
=== Linux kernel patch (example) ===
  
 
The following example shows how to undervolt a Pentium M 750 (1.86GHz) on a ThinkPad {{T43}}. As discussed above, the parameters are specific to this one CPU. You will need to experimentally find the correct settings for your own CPU and adjust the patch accordingly.
 
The following example shows how to undervolt a Pentium M 750 (1.86GHz) on a ThinkPad {{T43}}. As discussed above, the parameters are specific to this one CPU. You will need to experimentally find the correct settings for your own CPU and adjust the patch accordingly.
Line 111: Line 114:
 
Don't forget to disable <tt>CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI</tt>.
 
Don't forget to disable <tt>CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI</tt>.
  
==Alternative patch with user-space control==
+
==Alternative 2: patch with user-space control==
There is an [http://gentoo-wiki.com/HOWTO_Undervolt_a_Pentium_M_CPU alternative patch], which allows voltages to be changed without reboot.
+
The [http://fabrice.bellamy.club.fr/bdz.undervolt.2005.10.22.a.patch bdz.undervolt.2005.10.22.a.patch] patch, written by Gentoo-Wiki user "Bdz", allows voltages to be changed without reboot.
  
 
It presents a userspace interface, as in the following example:
 
It presents a userspace interface, as in the following example:
Line 119: Line 122:
 
:{{cmdroot|echo "1084,1084,1084,1084,1084,1084,1084,988,908,860" >/sys/devices/system/cpu/cpu0/cpufreq/voltage_table}}
 
:{{cmdroot|echo "1084,1084,1084,1084,1084,1084,1084,988,908,860" >/sys/devices/system/cpu/cpu0/cpufreq/voltage_table}}
  
The same [http://gentoo-wiki.com/HOWTO_Undervolt_a_Pentium_M_CPU page] also gives some helpful hints and scripts for voltage adjustment.
+
The relevant [http://gentoo-wiki.com/HOWTO_Undervolt_a_Pentium_M_CPU page] on Gentoo-Wiki providues further information and some helpful hints and scripts for voltage adjustment.
  
 
Note that this approach only allows adjustment of the voltages for the normal clock speeds (as reported by the ACPI table in the BIOS). On some models (e.g., ThinkPad {{T43}}) this does not inlude all clock speeds supported by the processor.
 
Note that this approach only allows adjustment of the voltages for the normal clock speeds (as reported by the ACPI table in the BIOS). On some models (e.g., ThinkPad {{T43}}) this does not inlude all clock speeds supported by the processor.
 +
 +
==Alternative 3: another patch with user-space control==
 +
 +
The [http://avkrok.net/nw8240/centrino-voltages.diff centrino-voltages.diff] patch, written by Rickard Holmberg, also provides user-space control. See [http://avkrok.net/nw8240/ here] and [http://mailman.linux-thinkpad.org/pipermail/linux-thinkpad/2005-December/030772.html here] for usage.
  
 
==External Sources==
 
==External Sources==

Revision as of 16:00, 3 December 2005

Background

Intel Pentium M processors from the Dothan and Banias families can be instructed to operate at voltage and clock frequencies lower than the nominal ones recommended by Intel and used by ThinkPads by default. Experience shows that the processor may continue working correctly at lower-than-nominal voltages and frequencies, thereby reducing power consumption, heat and fan noise.

In the Pentium M, speed and voltage are controlled by software (through the MSR registers). It is up to the operating system to choose the right voltage for each frequency. Normally this is done according to tables published by Intel or according to ACPI tables. However, this can be overriden - in the case of Linux, by a kernel patch.

ATTENTION!
Following this instructions will operate your CPU under conditions it was not designed for. Even if your system seems stable, it may still suffer transient faults leading to arbitrary data corruption. In addition, errors in following these instructions (or changes between processor models) may operate the CPU above its nominal parameters, with effects up to and including laptop meltdown.

For an example of what may be achieved, on one ThinkPad T43 all voltages could be reduced by 20-30% and moreover, the minimal frequency reduced from 800MHz to 533MHz; this reduced stable CPU temperature by 7-10deg under both idle and burn-in conditions. Combined with an ACPI fan control script and/or the patch for controlling fan speed, this greatly reduced the problem with fan noise.

NOTE!
While undervolting has a clear measurable effect, it's not clear if underclocking really works. /proc/cpuinfo reflects the underclocked frequency, but enabling debug output on cpufreq causes it to say things like "CPU frequency out of sync: cpufreq and timing core thinks of 533000, is 800000 kHz." where the former is the chosen underclocked frequency and the latter is the documented minimum frequency. This discrepancy also causes Software Suspend 2 to oops during suspend.

There are several methods to control CPU voltage in Linux, and currently all of them require a patcher kernel.

Alternative 1: patch with hard-coded voltages

Instructions

  1. Determine the stable voltages for each frequency, using some overclocking/undervolting utility that has specific support for Pentium M ("Centrino") processors. It seems that no such utility exists for Linux. For windows, one good choice is Notebook Hardware Control (NHC), which conveniently also includes a table of nominal frequencies and voltags (in its help file).
    Ascertain that at the undervolted settings the CPU actually performs correct computation (Prime95 in "Tortute Test" mode seems to be a good partial test emphasizing FPU and memory access).
    Note that beside reducing voltages (undervolting), you can also try to add lower frequencies (underclocking).
  2. Determine the model name string reported by the CPU, e.g., via the "Model name" line in /proc/cpuinfo, and likewise the cpu_family, model and stepping.
  3. Grab a copy of the example patch below and update it to reflect the parameters, frequencies and voltages you found.
  4. Apply the patch to your kernel (tested with 2.6.13.1 and 2.6.14-rc2).
  5. To prevent the ACPI table from overriding your table, disable the CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI kernel option.
  6. Compile and install the new kernel.

The changes should be active now. If you want to see debug information attesting to thus, do the following:

  1. Reboot in single mode.
  2. # echo 2 > /sys/module/cpufreq/parameters/debug
  3. # modprobe speedstep-centrino
  4. # dmesg and check for the message "speedstep-centrino: found "Intel(R) Pentium(R) M processor ..."

If you don't see that message, you got the cpu_id or model_name parmaeters wrong. If your system crashes, re-test the voltages and adjust accordingly.

Please report your results (including voltages)!

Linux kernel patch (example)

The following example shows how to undervolt a Pentium M 750 (1.86GHz) on a ThinkPad T43. As discussed above, the parameters are specific to this one CPU. You will need to experimentally find the correct settings for your own CPU and adjust the patch accordingly.

Note that the Pentium M 750 has a 533MHz FSB (quad-pumped 133MHz), hence the use of OP133. If you have a Pentium M with 400MHz FSB (i.e., quad-pumped 100MHz, found in Banias and older Dothan) then in the voltage table change OP133 to OP.

--- linux-2.6.13.1-vanilla/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c	2005-09-10 05:42:58.000000000 +0300
+++ linux-2.6.13.1/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c	2005-10-18 04:46:01.000000000 +0200
@@ -54,6 +54,7 @@ enum {
 	CPU_DOTHAN_A1,
 	CPU_DOTHAN_A2,
 	CPU_DOTHAN_B0,
+	CPU_DOTHAN_C0,
 	CPU_MP4HT_D0,
 	CPU_MP4HT_E0,
 };
@@ -63,6 +64,8 @@ static const struct cpu_id cpu_ids[] = {
 	[CPU_DOTHAN_A1]	= { 6, 13, 1 },
 	[CPU_DOTHAN_A2]	= { 6, 13, 2 },
 	[CPU_DOTHAN_B0]	= { 6, 13, 6 },
+	[CPU_DOTHAN_C0]	= { 6, 13, 8 },
 	[CPU_MP4HT_D0]	= {15,  3, 4 },
 	[CPU_MP4HT_E0]	= {15,  4, 1 },
 };
@@ -94,6 +97,12 @@ static struct cpufreq_driver centrino_dr
 		.frequency = (mhz) * 1000,				\
 		.index = (((mhz)/100) << 8) | ((mv - 700) / 16)		\
 	}
+/* Likewise, for processors with 133MHz FSB. */
+#define OP133(mhz, mv)							\
+	{								\
+		.frequency = (mhz) * 1000,				\
+		.index = (((mhz)/133) << 8) | ((mv - 700) / 16)		\
+	}
 
 /*
  * These voltage tables were derived from the Intel Pentium M
@@ -202,7 +211,26 @@ static struct cpufreq_frequency_table ba
 	OP(1700, 1484),
 	{ .frequency = CPUFREQ_TABLE_END }
 };
+
+/* Intel Pentium M 750, drastically undervoltaged */
+static struct cpufreq_frequency_table pentium_m_750[] =
+{
+	    /* MHz   mV */
+	OP133( 800,  700),
+	OP133(1066,  780),
+	OP133(1200,  828),
+	OP133(1333,  876),
+	OP133(1466,  924),
+	OP133(1600,  972),
+	OP133(1733, 1020),
+	OP133(1866, 1068),
+	{ .frequency = CPUFREQ_TABLE_END }
+};
+
 #undef OP
+#undef OP133
 
 #define _BANIAS(cpuid, max, name)	\
 {	.cpu_id		= cpuid,	\
@@ -225,6 +253,12 @@ static struct cpu_model models[] =
 	BANIAS(1500),
 	BANIAS(1600),
 	BANIAS(1700),
+	{
+		.cpu_id     =  &cpu_ids[CPU_DOTHAN_C0],
+		.model_name = "Intel(R) Pentium(R) M processor 1.86GHz",
+		.max_freq   = 1866000,
+		.op_points  = pentium_m_750
+	},
 
 	/* NULL model_name is a wildcard */
 	{ &cpu_ids[CPU_DOTHAN_A1], NULL, 0, NULL },

Don't forget to disable CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI.

Alternative 2: patch with user-space control

The bdz.undervolt.2005.10.22.a.patch patch, written by Gentoo-Wiki user "Bdz", allows voltages to be changed without reboot.

It presents a userspace interface, as in the following example:

# cat /sys/devices/system/cpu/cpu0/cpufreq/voltage_table
1356,1356,1356,1356,1356,1356,1356,1244,1116,988
# echo "1084,1084,1084,1084,1084,1084,1084,988,908,860" >/sys/devices/system/cpu/cpu0/cpufreq/voltage_table

The relevant page on Gentoo-Wiki providues further information and some helpful hints and scripts for voltage adjustment.

Note that this approach only allows adjustment of the voltages for the normal clock speeds (as reported by the ACPI table in the BIOS). On some models (e.g., ThinkPad T43) this does not inlude all clock speeds supported by the processor.

Alternative 3: another patch with user-space control

The centrino-voltages.diff patch, written by Rickard Holmberg, also provides user-space control. See here and here for usage.

External Sources