Hast du alles korrekt erkannt. Vdd ist wirkungslos (und war es auch schon immer), da hilft nur ein Hardmod.
Wo genau klemmts denn mit der Tref? Gehts darum wie der Wert zustande kommt oder wie er gesetzt wird? Du hast den kompilierten Code als ISA Option Rom ans Ende des Bios angefügt?
----
Mein aktueller Tref Code ist entweder in meinem letzten Bios drin, ich meine sogar als Sourcecode, oder du findest ihn hier:
A7N8X-E Deluxe as an alternative for socket 462 - Page 10 - Mainboards - HWBOT Community Forums
Generell läuft das setzen so:
1. wir lesen das Cmos register
2. vergleichen ob 00 (Auto) bzw. welcher Wert gesetzt ist
3. schreiben eines Tref werts, passend zum Cmos Wert
Das wars schon... Was es auf den ersten Blick etwas kompliziert macht ist die Tatsache das man nicht direkt in Register schreibt, sondern das man die Adresse die geschrieben werden soll in einem speziellen Register hinterlegen muss. Register lesen läuft analog ab... Quasi:
1. Adresse in Adressregister hinterlegen
2. Daten in Datenregister hinterlegen
3. Anweisung geben das alles geschrieben werden soll
Und um das Ganze noch komplizierter zu machen, kann man nicht einzelne PCI Register lesen und schreiben (z.B. Bus 0 Device 0 Function 2 Register 61h), sondern man bekommt immer nur 4 Register (32bit) auf einen Schwung. Und zwar immer zusammenhängende Register. Also 60h bis 63h, 64h bis 67h, 68h bis 6B und 6C bis 6F, alles dazwischen wie 62h bis 65h geht nicht. Deshalb muss man die Daten erst aus den Registern auslesen, damit man den Inhalt der anderen Register kennt. Wenn man Beispielsweise 60h und 61h ändern will, so bekommt man 60h bis 63h und muss folglich die Daten aus 62h und 63h "behalten", während 60h und 61h überschrieben werden. Das ist das was wir mit "mask data" im Code meinen. Dort werden Teile der 32bit geleert und dann mit dem Wunschwert neu befüllt.
Um nun redundanten Code zu reduzieren haben wir uns Makros gebastelt. Sprich wir rufen nur noch das Makro auf und übergeben die Daten ans Makro, das Makro schreibt dann alles so wie wir wollen. Zusätzlich dazu gebe ich die "Maske" mit ins Makro rein, die bestimmte Daten löscht und andere erhält. So kommts dann zu:
Code:
writetref 080000160h, 000000308h, 0FFFF0000h ; Tref 776c = 308h
Das Makro selbst heisst "writetref". Das erste ist die Adresse (müsste B0 Device 0 Function 1 und Register 60h bis 63h sein), Das zweite sind die Daten die geschrieben werden sollen (Achtung, kleinstes Register ist rechts!), Also 08h in Reg 60h und 03h in Reg 61h, 00h in 62h und 63h. Der dritte Block ist die Maske, die 60+61h leert und 62h+63h behält.