Beispielkonfiguration - AMD Geode NX 1750 M811 picoPSU
Inhaltsverzeichnis |
AMD Geode NX 1750 auf PC-Chips M811 mit picoPSU als stromsparender VDR
Die Kombination des stromsparenden Prozessors AMD Geode NX 1750 in Verbindung mit dem günstigen Mainboard PC-Chips M811 hat sich unter VDR Nutzern zu einem kleinen Geheimtipp entwickelt. Im VDR-Portal gibt es mittlerweile einige Threads zu diesem Thema. Wenn ich es recht überblicke, brachte fabo mit seinem Posting AMD Geode NX 1750 - Erste Erfahrungen den Stein ins Rollen.
Ich möchte an dieser Stelle einmal die wichtigsten Informationen in Form eines HOWTOs zusammenfassen, wobei das HOWTO im VDR Portal regelmäßiger aktualisiert wird. Der Schwerpunkt liegt auf den Stromsparmöglichkeiten dieses Systems.
Die Softwareanpassungen basieren auf einem Debian 3.1 mit jeweils aktuellem Kernel von kernel.org.
Vorab Danke an alle Beteiligten, die geholfen haben, dass dieses HOWTO erstellt werden konnte, und speziell an alex-zero für das Korrekturlesen.
CPU FSB und Vcore einstellen
Das M811 bietet per Jumper (JP2) und BIOS Einstellung die Möglichkeit, den Geode mit 100 oder 133MHz FSB zu betreiben. Der Multiplikator ist nicht einstellbar, was nicht weiter tragisch ist, da die Frequenz der CPU auch im laufenden Betrieb gesenkt werden kann. Dazu später mehr. In der Standardeinstellung läuft der Geode mit 10.5x133MHz=1400MHz. Mit FSB 100Mhz reduziert sich die Frequenz auf 1050MHz. Dieser Wert ist für einen VDR völlig ausreichend.
Von Haus aus besteht beim M811 keine Möglichkeit, die Vcore zu reduzieren so daß die CPU mit 1,425V statt normalerweise 1,250V betrieben wird. Die CPU liefert standardmäßig "10001" als VID-Code (VID[4:0]).
tomfy erarbeitete hier eine Möglichkeit, durch Auftrennung eines Pins des Spannungsregler ICs (RT9237) des M811, die Vcore auf 1,225V einzustellen. Dies reduziert sowohl die Stromaufnahme als auch die CPU Temperatur und ermöglicht eine passive Kühlung.
Durch die Manipulation am Mainboard erlischt die Gewährleistung. Auch sollte man Erfahrung im Umgang mit dem Lötkolben (z.B ERSA Tip 260, 16W) haben.
Vcore per Jumper oder DIP-Schalter
Durch tomfys Erfolg beflügelt, habe ich durch eine Modifikation des Mainboards die Vcore Einstellung auf beliebige Werte erreicht. Dazu wurden die fünf relevanten Pins des Spannungsregler ICs auf Jumper geführt. Damit läßt sich der Geode bei FSB 100MHz auch mit 1,1V Vcore stabil betreiben. Die Leistungsaufnahme gegenüber 1,425V sinkt um ca. 10W.
+--------------+ | | |. RT9237 | +--------------+ |||||||||||||| VVVVV IIIII DDDDD 43210 ||||| °°°°° <- Jumperblock °°°°° ||||| +++++---< GND
Der . markiert Pin1 und ist mit VID4 identisch. Im Datenblatt des RT9237 bedeutet eine 1 kein Jumper gesetzt und die 0 Jumper gesetzt.
Jumperstellung für Vcore 1,100V:
VID4 1 VID3 1 VID2 1 VID1 1 VID0 0 0 == GND (0V) 1 == offen
Es ist nur der Jumper für VID0 gesetzt.
Alternativ kann man auch DIP-Schalter benutzen (Vcore=1,100V):
o \ VID4--o o------| 1 DIP OFF | o | \ | VID3--o o------| 1 DIP OFF | o | \ | VDI2--o o------| 1 DIP OFF | o | \ | VID1--o o------| 1 DIP OFF | o | | VID0--o--o------| 0 DIP ON | ^ MASSE OFF == Schalter geöffnet ON == Schalter geschlossen
Vcore 1.125V per Pin ablöten
Eine Alternative, zu einer niedrigeren CPU Spannung zu kommen, ist es, zwei Pins des RT9237 abzulöten, d.h., auf logisch 1 zu setzen. Gucken wir uns dazu die VID Einstellung für die Original- und Alternativspannung an:
VID 4 | 3 | 2 | 1 | 0 Vcore ------+---+---+---+------------ 1 | 0 | 0 | 0 | 1 == 1.425V 1 | 1 | 1 | 0 | 1 == 1.125V
Daraus ist zu ersehen, daß durch Ablöten von VID3 (Pin 2) und VID2 (Pin 3) die CPU Spannung auf 1.125V eingestellt wird, da beide Eingänge von Potential 0 zu 1 wechseln.
zaphod:~$ sensors it87-isa-0290 Adapter: ISA adapter VCore 1: +1.12 V (min = +1.04 V, max = +1.57 V)
Die Praxis zeigt, daß es am einfachsten ist, wenn man zuerst noch Pin 1 (VID4) ablötet. An seinem Zustand (1) ändert sich dadurch nichts.
Zum Ablöten hält man eine Stecknadel bereit und schiebt diese unter das mit dem Lötkolben (mit Bleistiftspitze) erhitzte Anschlussbeinchen und hebelt dieses ggf. vorsichtig hoch. Ebenso verfährt man dann mit den Pins 2 und 3.
Zusammenfassung
- a. Freie Spannungswahl: Jumper oder DIP-Schalter einlöten
- b. 1.225V Vcore: Pin 2 (VID3) auftrennen
- c. 1.125V Vcore: Pin 2 (VID3) und Pin 3 (VID2) auftrennen
PowerNow! Support
Der AMD Geode NX 1750 unterstützt die Einstellung der Frequenz während des laufenden Betriebes. Somit ist es möglich, die CPU beim "nichts tun" herunterzutakten und im Bedarfsfalle (z.B. DVD erstellen) die volle Leistung abzurufen. alex-zero hat im VDR-Portal eruiert, wie PowerNow! mit dem Geode zu nutzen ist. Der Kernel kann die PowerNow! Möglichkeiten nicht nutzen, da das BIOS hierfür keine Informationen zur Verfügung stellt.
DSDT Patch
Durch eine Modifikation der DSDT erlaubt das Standard powernow-k7 Kernel Modul mit der Geode-CPU zu arbeiten. Das powernow-k7 Modul benutzt nur das control word der PSS Tabelle.
Short HOWTO:
cat /proc/acpi/dsdt > dsdt iasl -d dsdt # decompilieren vi dsdt.dsl # Hinzufügen _PCT & _PSS Tabelle siehe unten iasl -tc dsdt.dsl # Compilieren der dsdt erzeugt dsdt.hex
Kernel erneut compilieren mit "dsdt.hex" eingebunden. Siehe HOWTO Fix Common ACPI Problems [1] für weitere Hintergründe.
Durch hinzufügen einer _PSS Tabelle in der kann man P states in der DSDT definieren.
... Processor (\_PR.CPU0, 0x00, 0x00004010, 0x06) { Name(_PCT, Package () // Performance Control object { ResourceTemplate(){Register(FFixedHW, 0, 0, 0)}, // PERF_CTRL ResourceTemplate(){Register(FFixedHW, 0, 0, 0)} // PERF_STATUS }) /* CoreFreq core CPU operating frequency (in MHz). Power maximum power dissipation (in milliWatts). TransitionLatency worst-case latency in microseconds that the CPU BusMasterLatency worst-case latency in microseconds that Bus Masters. Control Value to be writen in (PERF_CTRL) reserved sgtc vid fid 31:30 29:10 9:5 4:0 Status Expected status value */ Name (_PSS, Package() { // freq power trl bml cntr status Package(){1400, 21500, 500, 300, 0x3222f, 0x00}, // P0 Package(){1200, 14900, 500, 300, 0x3226c, 0x00}, // P1 Package(){1133, 8200, 500, 300, 0x322ab, 0x00}, // P2 Package(){1067, 5000, 500, 300, 0x322ea, 0x00}, // P3 Package(){1000, 3000, 500, 300, 0x32329, 0x00}, // P4 Package(){ 800, 2200, 500, 300, 0x32326, 0x00}, // P5 }) } ...
MSR Patch
Durch einen Patch des Kernels werden die entsprechenden Daten dort eingebaut, so daß das powernow-k7 Modul damit arbeiten kann. Dieser Patch wird hier zur Verfügung gestellt. Im Anhang findet sich ein Patch für den jeweils aktuellen Kernel.
# Patch Datei laden gunzip powernow-k7-msr-2.6.16.1.patch.gz cd /usr/src/linux patch -p1 < ~/powernow-k7-msr-2.6.16.1.patch
Nun wird der Kernel mit folgenden Einstellungen neu übersetzt:
# # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_TABLE=y CONFIG_CPU_FREQ_DEBUG=y CONFIG_CPU_FREQ_STAT=y CONFIG_CPU_FREQ_STAT_DETAILS=y # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y # # CPUFreq processor drivers # # CONFIG_X86_ACPI_CPUFREQ is not set # CONFIG_X86_POWERNOW_K6 is not set CONFIG_X86_POWERNOW_K7=m CONFIG_X86_POWERNOW_K7_ACPI=y # CONFIG_X86_POWERNOW_K8 is not set # CONFIG_X86_GX_SUSPMOD is not set # CONFIG_X86_SPEEDSTEP_CENTRINO is not set # CONFIG_X86_SPEEDSTEP_ICH is not set # CONFIG_X86_SPEEDSTEP_SMI is not set # CONFIG_X86_P4_CLOCKMOD is not set # CONFIG_X86_CPUFREQ_NFORCE2 is not set # CONFIG_X86_LONGRUN is not set # CONFIG_X86_LONGHAUL is not set
Die Datei /etc/modules wird folgendermaßen modifiziert:
~# grep powernow_k7 /etc/modules powernow_k7 msr_force=1
damit das Modul automatisch geladen wird.
Nach dem Neustart des Kernel überprüft man die möglichen Varianten zur Frequenzeinstellung:
~# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors conservative ondemand powersave userspace performance
Nähere Informationen sind hier zu finden: /usr/src/linux/Documentation/cpu-freq/
Mittels dmesg oder in syslog sollte diese Meldung (mit FSB 100MHz) auftauchen:
powernow: PowerNOW! Technology present. Can scale: frequency and voltage. Detected 1048.423 MHz processor. powernow: Trying ACPI perflib powernow: ACPI perflib can not be used in this platform powernow: ACPI and legacy methods failed powernow: See http://www.codemonkey.org.uk/projects/cpufreq/powernow-k7.shtml powernow: Building frequency table from MSR info. powernow: Minimum speed 599 MHz. Maximum speed 1048 MHz.
Ich betreibe den Geode derzeit mit conservative. Damit dies beim Start aktiviert wird, habe ich folgendes in /etc/init.d/bootmisc.sh eingetragen:
echo conservative > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
Mittels
watch -n1 "cat /proc/cpuinfo|grep MHz"
kann man sich laufend die aktuelle Frequenz der CPU anzeigen lassen.
Manual Frequency Table Patch
Auf diesen Patch bin ich durch Elchi aufmerksam gemacht worden. Er beruht wohl auf einen Patch von Milan Enev: Linux 2.6.12.2 PowerNow! K7 Manual Frequency Table
Da der originale Patch bei mir nicht richtig funktionierte, habe ich aus Elchis und Enevs Versionen eine für Kernel 2.6.16.9 funktionierende Variante erstellt.
Der Kernel muß für diesen Patch genauso konfiguriert sein wie für den MSR Patch. Das Einspielen des Patches erfolgt analog.
~# "Patch Datei laden" ~# gunzip powernow-k7-manual-2.6.16.9_enev_kilroy.patch.gz ~# cd /usr/src/linux zaphod:/usr/src/linux# patch -p1 < ~/powernow-k7-manual-2.6.16.9_enev_kilroy.patch
Das Modul wird wieder per /etc/modules geladen:
~# grep powernow_k7 /etc/modules powernow_k7 overwrite_table=1 fsb=100000 multiplier=50,60,70,80,90,105
oder alternativ händisch per modprobe:
~# modprobe powernow_k7 overwrite_table=1 fsb=100000 multiplier=50,60,70,80,90,105
Die multiplier Parameter sind variierbar. Beispiel:
~# modprobe powernow_k7 overwrite_table=1 fsb=100000 multiplier=55,75,95,105 ~# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 550000 750000 950000 1050000
Beispielausgabe des syslog:
zaphod kernel: powernow: PowerNOW! Technology present. Can scale: frequency and voltage. zaphod kernel: powernow-k7: Current multiplier 10.5. CPU running at 1048MHz zaphod kernel: powernow-k7: FSB: 100MHz zaphod kernel: powernow: Overwriting PST table with manual settings zaphod kernel: powernow-k7: Settling Time: 200 microseconds. zaphod kernel: powernow-k7: FID: 0x4 (5.0x [500MHz])^IVID: 0x11 (1.250V) zaphod kernel: powernow-k7: FID: 0x6 (6.0x [600MHz])^IVID: 0x11 (1.250V) zaphod kernel: powernow-k7: FID: 0x8 (7.0x [700MHz])^IVID: 0x11 (1.250V) zaphod kernel: powernow-k7: FID: 0xa (8.0x [800MHz])^IVID: 0x11 (1.250V) zaphod kernel: powernow-k7: FID: 0xc (9.0x [900MHz])^IVID: 0x11 (1.250V) zaphod kernel: powernow-k7: FID: 0xf (10.5x [1050MHz])^IVID: 0x11 (1.250V) zaphod kernel: powernow: Minimum speed 500 MHz. Maximum speed 1050 MHz.
Arbeitet powernow erfolgreich, kann mach sich die möglichen Frequenzen anzeigen lassen:
~# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 500000 600000 700000 800000 900000 1050000
Zur automatischen Frequenzumstellung wird powernowd verwendet.
~# aptitude install powernowd
Der Start erfolgt mit folgenden Parametern:
~# cat /etc/default/powernowd OPTIONS="-v -n -m 0"
"-m 0" bewirkt, daß die Frequenzänderung einer Sinuskurve folgt. Siehe auch man powernowd.
~# /etc/init.d/powernowd restart
Hier die Ausgabe des powernowd Aufrufes:
Starting powernowd: powernowd: PowerNow Daemon v0.90, (c) 2003-2004 John Clemens powernowd: Settings: powernowd: verbosity: 1 powernowd: mode: 0 (SINE) powernowd: step: 100 MHz (100000 kHz) powernowd: lowwater: 20 % powernowd: highwater: 80 % powernowd: poll interval: 1000 ms powernowd: Found 1 cpu: powernowd: cpu0: 500Mhz - 1050Mhz powernowd.
Dieser Patch bietet grundsätzlich auch die Möglichkeit, die CPU Spannung anzupassen (Vcore), dieses funktioniert bei mir mit dem M811 Board jedoch nicht.
Wer den Geode mittels JP2 auf dem M811 mit FSB 133MHz laufen läßt, kann powernow-k7 folgendermaßen nutzen:
~# modprobe powernow_k7 overwrite_table=1 fsb=133333 multiplier=40,50,60,70,80,90,105
Das ergibt diese möglichen Frequenzen:
~# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 533332 666665 799998 933331 1066664 1199997 1399996
nvram-wakeup
Zuerst sollte man das nvram-wakeup im BIOS des M811 unter Power Management Setup aktivieren. Wakeup ist auf auf Enabled zu stellen und in der WakeupINT Tabelle muß der RTC interrupt eingeschaltet sein. Außerdem dürfen bei dem ersten Start von nvram-wakeup nicht die Werte Day 0, Hour 0, Min 0, Sek 0 im BIOS stehen, da daß Programm sonst mit einem Fehler beendet wird. Der Einfachheit halber trägt man für jeden Wert eine 1 ein.
Nun wird das Paket nvram-wakeup installiert:
~# aptitude install nvram-wakeup
Unter /etc wird die Datei nvram-wakeup.conf für das M811 erstellt:
################################################ ## Mainboard autodetection information: ## ## - Mainboard vendor: "" ## - Mainboard type: "VT8367-8235" ## - Mainboard revision: "" ## - BIOS vendor: "Phoenix Technologies, LTD" ## - BIOS version: "6.00 PG" ## - BIOS release: "10/20/2005" addr_stat = 0xD2 shift_stat = 5 addr_day = 0xD8 addr_hour = 0xD9 addr_min = 0xDA addr_sec = 0xDB upper_method = VT8235_37
In /etc/vdr/vdr-nvram-wakeup.conf ist der Parameter COMMANDLINE wie folgt anzupassen:
COMMANDLINE="--directisa --configfile /etc/nvram-wakeup.conf"
Nicht vergessen ENABLED="yes" zu setzen. Ein Reboot ist für nvram-wakeup beim M811 nicht nötig.
Um die korrekte Funktion zu überprüfen, sollte man nvram-wakeup jetzt einmal testen:
~# nvram-wakeup --directisa --configfile /etc/nvram-wakeup.conf --settime $((`date +%s` + 601)) ~# shutdown -h now
Die Aufwachzeit wird auf 601 Sekunden in die Zukunft gestellt, also bitte mindestens 10 Minuten warten. ;)
lm_sensors
Bei einer passiv gekühlten CPU erscheint es sinnvoll, die Temperatur zu überwachen. Dafür wird lm_sensors auf dem System installiert:
aptitude install libsysfs-dev wget http://www2.lm-sensors.nu/~lm78/archive/lm_sensors-2.10.0.tar.gz tar xzf lm_sensors-2.10.0.tar.gz -C /usr/local/src/ cd /usr/local/src/lm_sensors-2.10.0/ make user make user_install
Beim Start des Rechners sollte sensors -s ausgeführt werden:
~# grep -A2 sensors /etc/init.d/bootmisc.sh /usr/local/bin/sensors -s : exit 0
Der (2.6.) Kernel muß folgende Module zur Verfügung stellen oder integriert haben:
# # I2C support # CONFIG_I2C=y CONFIG_I2C_CHARDEV=y # # I2C Algorithms # CONFIG_I2C_ALGOBIT=y # # I2C Hardware Bus support # CONFIG_I2C_ISA=y # # Hardware Monitoring support # CONFIG_HWMON=y CONFIG_HWMON_VID=y CONFIG_SENSORS_IT87=y
Die passende /etc/sensors.conf habe ich unten angehängt. Die Ausgabe sieht dann folgendermaßen aus:
~# sensors it87-isa-0290 Adapter: ISA adapter VCore 1: +1.10 V (min = +1.04 V, max = +1.57 V) fan1: 831 RPM (min = 0 RPM, div = 8) CPU Temp: +39 C (low = +15 C, high = +50 C) sensor = thermistor
Stromversorgung mit picoPSU
Um die Effizienz bzgl. Stromverbrauch des Systems AMD Geode NX 1750 auf PC-Chips M811 als VDR weiter zu erhöhen, betreibe ich den Rechner jetzt mit der picoPSU und einem entsprechenden externen Schaltnetzteil.
Das System verbraucht im normalen Betrieb (mit einer FF- und drei Budget-Karten, diskless) 50W. Die CPU ist passiv gekühlt. Die Wärme wird von einem extrem leisen 120mm Lüfter (8,7dBA, 800rpm) aus dem Gehäuse befördert.
foobar42 hat berichtet, daß es die picoPSU inzwischen sowohl in einer 120W als auch 80W Version gibt.
UDMA-Problematik
Crue hat mit dem Thread M811 - Mainboard (Geode) StressThreat/ Sorgenkind IDE auf ein Problem des M811 aufmerksam gemacht, welches die Zusammenarbeit des (2.6.x) Kernels mit IDE Festplatten im UDMA Modus betrifft. Standardmäßig wird der höchstmögliche UDMA Modus (meist UDMA 5) eingestellt, welcher jedoch Probleme in Form von Datenübertragungsfehlern auslöst:
zaphod kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error } zaphod kernel: hda: dma_intr: error=0x84 { DriveStatusError BadCRC } zaphod kernel: ide: failed opcode was: unknown
Das Problem läßt sich erfahrungsgemäß dadurch lösen, daß der UDMA Modus auf 3 oder 4 herabgesetzt wird. Beispiel für UDMA 4 mit Festplatte hda
hdparm -X udma4 /dev/hda
Bei der Installation eines Linuxsystems von CD auf Festplatte oder Nutzung einer "Live-CD" mit Festplatte, sollte darauf geachtet werden, daß der UDMA Modus reduziert oder vorerst komplett abgeschaltet wird, sollte es zu den erwähnten Fehlermeldungen kommen. Zum Abschalten des DMA übergibt man dem Kernel folgenden Parameter:
ide=nodma
Das DMA wird dann beim Abarbeiten der Datei /etc/init.d/bootmisc.sh wieder reduziert aktiviert:
~# tail -n4 /etc/init.d/bootmisc.sh hdparm -d 1 -X udma4 /dev/hda : exit 0
Der Eintrag muß vor dem "exit 0" erfolgen.
BIOS-Update
ddgonzo hat auf den Thread Problem M811 und Geode aufmerksam gemacht. Dort wird geschildert, daß einige M811 Boards auch mit einem älteren BIOS als das vom 20.10.2005 ausgeliefert werden. Das neue BIOS erkennt den AMD Geode dann auch mit den korrekten Frequenzen. ddgonzo stellt dieses BIOS hier zum Download bereit.
Downloads
- sensors.conf.gz
- powernow-k7-msr-2.6.16.11.patch.gz
- powernow-k7-manual-2.6.16.11_enev_kilroy.patch.gz
- powernow-k7-manual-2.6.18_enev_kilroy.patch.gz
- powernow-k7-manual-2.6.19_enev_kilroy.patch.gz
Quellen
- AMD Geode NX 1750 - Erste Erfahrungen
- AMD Geode NX 1750 auf PC-Chips M811 mit picoPSU
- AMD Geode 1750 NX und Alternativen
- M811 - Mainboard (Geode) StressThread/ Sorgenkind IDE
- Geode NX Core Voltage
- Datasheet RT9237
- Linux 2.6.8.1 K7 PowerNow! MSR Support
- AMD Geode NX Processors
- Manual 120W picoPSU
- Manual 80W picoPSU
- patch-cpufreq-PST
- Alle Informationen über das PicoPSU