so, ich habe mich einmal extremst informiert und weiß nun auch, warum es bei meinem Ipox nicht funktioniert! Deswegen soll dieser Thread hier einmal alle Informationen zum Thema Speedstep sammeln. Hier einmal der erste Teil, weitere werden folgen.
Zunächst einmal hängt der Speedstep des Pentium-M im Gegensatz zum z.B. Pentium-4M oder AMD Cool'n'Quiet nicht vom BIOS-Support des Boards ab! Es ist völlig unabhängig. Die EIST (Enhanced Intel Speedstep Technology) wird von jedem Centrino Pentium-M Prozessor unterstützt. Ob diese dann vom BIOS, vom Betriebssystem oder was auch immer geregelt wird, ist zunächst völlig egal.
Unter Linux wird das ganze vom ACPI-Management und dem Modul speedstep-centrino.ko geregelt. Hier nun liegt das Problem meines Ipox-Boards, dazu später mehr. Zunächst einmal meine CPUID:
Hier sieht man anhand meines 1.6 GHz Banias Prozessors die CPU Infos. Der "model name" ist allerdings nicht korrekt. Beim Laden des Moduls speedstep-centrino.ko kommt dann folgende Fehlermeldung:processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 9
model name : Mobile Genuine Intel(R) processor 1600MHz
stepping : 5
cpu MHz : 1594.975
cache size : 1024 KB
Ich habe dann einmal ein wenig im Source-Code speedstep-centrino.c gewühlt:speedstep-centrino: no support for CPU model "Mobile Genuine Intel(R) processor 1600MHz": send /proc/cpuinfo to Jeremy Fitzhardinge <jeremy@goop.org>
#define _BANIAS(cpuid, max, name) \
{ .cpu_id = cpuid, \
.model_name = "Intel(R) Pentium(R) M processor " name "MHz", \
.max_freq = (max)*1000, \
.op_points = banias_##max, \
}
Es liegt also an einer falschen "model name", dass auf meinem Ipox-Board kein Speedstep unterstützt wird!if (model->cpu_id == NULL) {
/* No match at all */
printk(KERN_INFO PFX "no support for CPU model "%s": "
"send /proc/cpuinfo to " MAINTAINER "\n",
cpu->x86_model_id);
return -ENOENT;
}
Das ganze liegt mit hoher Wahrscheinlichkeit an einem zu alten oder fehlerhaften microcode, der ins BIOS integriert wurde. Mit einem korrekten Microcode würde er die CPU als "Intel(R) Pentium(R) M processor 1600MHz" ausgeben und es gäbe keine Probleme mit dem Speedstep-Modul.
Unter Windows hat man natürlich keine Chance, das nachzuvollziehen. Um dieses Problem unter Linux zu beheben, bitte folgendermaßen vorgehen:
In /usr/src/linux/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c folgendes anpassen:
Code: Select all
.model_name = "Intel(R) Pentium(R) M processor " name "MHz", \
in
.model_name = "Mobile Genuine Intel(R) processor " name "MHz", \
Wichtig: Unbedingt die Leerstellen (7 an der Zahl) hinter processor einhalten!
Danach die kompletten Kernelmodule neu kompilieren und das neue Modul nach /lib/modules/<kernel-version>/kernel/arch/i386/kernel/cpu/cpufreq/ kopieren. Mit modprobe oder insmod Modul laden und mit dmesg kontrollieren, dass es hierbei keine Probleme gab.
/edit: Das Problem liegt jetzt definitiv nicht am Board oder Microcode sondern an der CPU selber. Nach intensivem Chat mit The Mad von x86-secret, sieht es folgendermaßen aus:
Fazit: Der "model name" wird direkt aus den Registern der CPU gelesen. Ist diese falsch, so funktioniert das Speedstep nicht oder nicht richtig (je nach Software, die die unterschiedlichen Strings unterstützt). Es scheint, als ob es CPUs auf dem Markt gibt, die "Mobile Genuine Intel(R) processor 1600MHz" anstatt "Intel(R) Pentium(R) M processor 1600MHz" als model name tragen.A: There is, again, *NO* relation between microcode and the name displayed !
Q: Ah, I didn't know. I thought the string is extracted from microcode? So, the name displayed depends on what?
A: Returned directly by the CPU.
Q: Ah, but isn't the microcode designed to update such specs and registers on each boot up (e.g. erratas)?
A: Microcode is a patch able to change the instruction path inside the pipeline or TLB settings. It can't do miracle.
Q: Did you know that some Pentium-M has been sold as "Mobile Genuine Intel(R) processor 1600MHz" instead of "Intel(R) Pentium(R) M processor 1600MHz"?
A: That's not a problem. All CPUs have differents string. I have Pentium M with "Pentium M", Celeron with "Genuine Intel", ...etc.
The fault is located in the software that was not able to support these PNS (Processor Name String)
/edit 2: Ich habe dem Maintainer des Speedstep-Linux-Treibers einmal geschrieben und hier seine Antwort:
Das BIOS spielt also wie in meinen ersten Vermutungen eine Rolle bei der Vergabe der Strings.The BIOS does seem to have a role in setting that brand string, though
its unclear exactly what. People have reported updating their BIOS will
"fix" the string to what the kernel expects. Maybe Ipox have an updated
BIOS for your machine.
/edit 3: Ich habe noch ein wenig mit dem Linux-Treiber-Entwickler geplaudert:
Beim Speedstep ist es also nicht möglich, nur die Frequenz zu ändern. Ein Frequenz-/Spannungspaar ist ein sogenannter Operation Point (OP) und diese sind immer fix miteinander gekoppelt. Hier ein Beispiel:Well, it really is implicit. The driver writes a value into a CPU MSR
which sets the CPU's operating point; an operating point is a
voltage/frequency pair - by design, you can't really change one without
the other. The tables in the driver look like this (this is the 1.1GHz
part - there's one for each CPU speed grade):
static struct cpufreq_frequency_table banias_1100[] =
{
OP( 600, 956),
OP( 800, 1020),
OP( 900, 1100),
OP(1000, 1164),
OP(1100, 1180),
{ .frequency = CPUFREQ_TABLE_END }
};
which means:
600MHz .956v
800MHz 1.02v
900MHz 1.1v
etc
Apart from getting a meter and actually measuring the voltage, the
frequency has a 1:1 relationship with voltage.
After all, changing the frequency doesn't give you any useful power
savings; its all in the voltage change.
Code: Select all
static struct cpufreq_frequency_table banias_1600[] =
{
OP( 600, 956),
OP( 800, 1036),
OP(1000, 1164),
OP(1200, 1276),
OP(1400, 1420),
OP(1600, 1484),
{ .frequency = CPUFREQ_TABLE_END }
};
Ich konnte dies bei mir nun nachvollziehen:Intel wrote:The top and bottom modes are commonly known as high frequency mode (HFM) and low frequency mode
(LFM). These frequency and voltage operating points are stored within a read-only processor model
specific register (MSR). This MSR ensures BIOS will not allow transitions to invalid states above the HFM
maximum or below the LFM minimum. The other four operating points are stored within BIOS code, as a
drop in voltage table provided by Intel to BIOS vendors.
Grußlinux:/etc/init.d # powersave -l
Speed set to minimum.
linux:/etc/init.d # powersave -r
598.057556 MHz
VCore 2: +0.91 V (min = +0.00 V, max = +0.00 V)
temp1: +30°C (high = +4°C, hyst = +2°C) sensor = thermistor
temp2: +37.5°C (high = +100°C, hyst = +95°C) sensor = PII/Celeron diod
linux:/etc/init.d # powersave -f
Speed set to maximum
linux:/etc/init.d # powersave -r
1594.810547 MHz
VCore 2: +1.44 V (min = +0.00 V, max = +0.00 V)
temp1: +31°C (high = +4°C, hyst = +2°C) sensor = thermistor
temp2: +41.5°C (high = +100°C, hyst = +95°C) sensor = PII/Celeron diode