Beispielkonfiguration - AMD Geode NX 1750 M811 picoPSU

Aus VDR Wiki
Wechseln zu: Navigation, Suche

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.

Warnung
Warnung

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:

Datei
/etc/nvram-wakeup.conf
################################################
##  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.

vdr_komplett.jpg

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

  1. sensors.conf.gz
  2. powernow-k7-msr-2.6.16.11.patch.gz
  3. powernow-k7-manual-2.6.16.11_enev_kilroy.patch.gz
  4. powernow-k7-manual-2.6.18_enev_kilroy.patch.gz
  5. powernow-k7-manual-2.6.19_enev_kilroy.patch.gz

Quellen

  1. AMD Geode NX 1750 - Erste Erfahrungen
  2. AMD Geode NX 1750 auf PC-Chips M811 mit picoPSU
  3. AMD Geode 1750 NX und Alternativen
  4. M811 - Mainboard (Geode) StressThread/ Sorgenkind IDE
  5. Geode NX Core Voltage
  6. Datasheet RT9237
  7. Linux 2.6.8.1 K7 PowerNow! MSR Support
  8. AMD Geode NX Processors
  9. Manual 120W picoPSU
  10. Manual 80W picoPSU
  11. patch-cpufreq-PST
  12. Alle Informationen über das PicoPSU