Lotosdrache hat geschrieben:Disruptor hat geschrieben:Bei dem Board hat ein Kumpel von mir das BIOS so gepatcht, dass der IDE-Controller nun die volle Leistung im UDMA-Modus bringt; falls Interesse besteht...
Allerdings bin ich noch bei der Northbridge. Der IDE-Controller steckt ja üblicherweise in der Southbridge. Von daher habe ich schon Interesse daran, allerdings weniger an dem BIOS selbst, sondern eher daran, wie man es macht, also wie man die Southbridge adressiert, konfiguriert und das ganze dann im BIOS ausführt.
Ich bin derjenige Kumpel. Im Fall mit der IDE-Tabelle bin ich gar nicht bis in den Code eingedrungen. Es gibt im BIOS eine Chipsatz-Initisalisierungs-Tabelle. In dieser Tabelle ist die Nummer eines Chipsatz-Registers, eine Bitmaske, welche Bits initialisiert werden sollen und die neuen Bits enthalten. In alten BIOSen aus der 286/386/486(VL)-Zeit, war die Nummer des Chipsatz-Registers häufig ein 8-Bit-Wert, der für das Index-Register im "System Controller" verwendet wurde, mit PCI-Boards ist des jetzt häufig (und so auch beim K6XV3+/66) direkt ein 16-Bit-PCI-Adresse auf Bus 0. Das bedeutet, dass in den unteren 8 Bit der Offset im 256-Byte-Configuration-Space steht, und in den oberen 8 Bit "device number" und "function number" kodiert sind. Die function number kann 0 bis 7 sein, und ist in den unteren drei Bit, die device number kann 0 bis 31 sein, und ist in den oberen 5 Bit. Zusammen ist der 16-Bit-Wert in dieser Tabelle direkt das, was in die unteren 16 Bit des Port CF8 geschrieben werden muss, um auf das Konfigurationsregister zuzugreifen.
Auf dem K6VX3+ hat die Northbridge die device id 0 (das ist IIRC fest verdrahtet in der Northbridge), und die Southbridge hängt auf device id 7. Da unter die device id noch 3 bits für die function id kommen, beginnt die Southbridge also mit 38h im oberen byte. Der IDE-Controller liegt auf function id 1, also liegt er bei 39h.
Das schöne an der Tabelle ist, dass sich die Tabelle in Teilen mit modbin bearbeiten lässt: Die Registeradressen und die Maske ist in modbin nicht bearbeitbar, aber der Wert. Um dem IDE-Controller Beine zu machen, muss man im Konfigurationsregister 44h des IDE-Controllers (des VT82C596B) die Bits 5 und 6 löschen (sie sorgen für je 1WS bei Busmaster-Read und Busmaster-Write-Zugriffen), und in Register 45 des IDE-Controllers die Bits 2 und 3 setzen (sie schalten (bessere) Read Bursts und Write Bursts ein, genauer gesagt geht es um die PCI-Transaktionstypen "Memory Read Multiple" und "Memory Write and Invalidate", die dann auch Cacheline-übergreifend arbeiten). Die Bezeichnung "Memory Read and Invalidate" in meiner Ausgabe des VT82C596B-Datenblatts ist ein Druckfehler - einen solchen Transaktionstyp gibt es nicht).
Wenn man das aktuelle BIOS des K6XV3+/66 mit modbin öffnet, erscheint auf der Seite "Chipset Regs Default" unter anderem ein Eintrag für Register 3944 (und zwar "01101000"), der die beiden Waitstate-Bits setzt. Dieser kann einfach auf "00001000" geändert werden, und die Waitstates sind aus. Das Register 3945 wird in dieser Liste aber nicht aufgeführt, weil es im BIOS in der Initialisierungsliste nicht enthalten ist. Ich habe daher (mittel AWDHACK - ein Tools, was in den richtigen Umständen das tut, was es soll, aber von mir keine Empfehlung erhält) im BIOS-Code (also "original.tmp") nach dieser Tabelle gesucht, und einen "unnötigen" Eintrag umgebogen, so dass er das Register 3945 enthält. Als unnötigen Eintrag habe ich den Eintrag für 3946 identifiziert, da der Wert "11000000" dort genau den dokumentierten Power-On-Defaults entspricht. Dieser Tabelleneintrag ist also nur für einen Warmstart relevant, wenn das Betriebssystem das Register verstellt haben sollte (wofür es aber eigentlich keinen Grund gibt). Dann habe ich im BIOS einfach die 46 durch eine 45 ersetzt, und danach lässt dann mit modbin auch ein Wert für Register 3945 eintragen.
Nebenbei bin ich noch über das Problem gestolpert, dass die von mir verwendete modbin-Version (das müsste die 4.50.80C gewesen sein) offenbar nicht mit dem BIOS kompatibel ist, und eine Prüfsumme nicht neu berechnet. Das aktuelle BIOS des K6XV3+ prüft über die ersten 224KiB-1, also von Dateioffset 0 bis 37FFEh, und die Summe muss durch 256 teilbar sein. Es wirkt so, als ob das Byte an Adresse 37FFEh dazu angepasst wird. Dieses Byte liegt im Bereich des LHA-Dekompressors, der von 37000h bis 37FFFh geht, und ebenfalls eine 8-Bit-Prüfsumme mit dem Wert 0 haben muss. Dazu scheint im Original-BIOS das Byte 37FFF angepasst worden zu sein. Ich habe (nachdem ich zunächst im Recovery Mode gelandet war) diese beiden Bytes per Hand angepasst und neu geflasht, und damit das Ergebnis erzielt, was Disruptor oben erwähnt hat.