View Single Post
Old 05-26-04, 04:33 PM   #1
jimmor
Registered User
 
jimmor's Avatar
 
Join Date: Mar 2004
Location: Scotland
Posts: 568
Smile Basic FX59xxx bios changes

Guide to Modifying bios of Nvidia FX59xxx Series VGA Card.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This Guide is written in a way that should allow any layman with no bios design experience to make selected changes to a bios file, which can appreciably improve the performance of a 59xxx series vga card.

I will start with a simple cautionary warning to all who think that bios modding appears very straight forward and thus holds no threat to them.

The major, but least understood, problem with modifying a bios and flashing, is that going too extreme may stop your card posting during computer bootup. It may not be a bad bios, just a bad flashing of your card which stops it posting. But if it happens, then maybe only a professional with the right tools may be able to recover the situation and reflash your card to a working state.

Just a small warning to everybody wanting to play about with bios modding -----> Do something wrong, doesn't have to be more than a binary digit out of place or a bad flash and you could be looking for that professional bios fixer, or another card.

So be careful out there !!!

The FX5900nu, FX5900u and FX5950u cards are basically to same design and therefore bios's are generally interchangeable, and likewise any modified versions. The newer FX5900XT type (inc SE/LX/SP etc) however is somewhat different and cheaper design of card, and its bios, although interchangeable with other XT's, is not useable with the original 59xx cards. When proposing bios changes it is therefore considered best to treat them separately.

However a number of the performance inducing changes included in the guide, derive from using some of the beneficial parameters from a XT bios with those of higher card bios, and vice versa.

The Ray Adams X-Bios Editor v103.520 is recommended for all bios changes as it includes a good Hex Editor, and more importantly it will add a correct CRC bit to ensure a successful flash. For flashing, it is recommended that nvflash.exe v4.41 be used, as it is a program I have used with complete success hundreds of times.

For the purposes of this Guide, none of the ASUS 59xx bios's set to only run in 3D mode are considered applicable, as GPU and Memory initialisation and table structures are different from all others bios's.


1. FX5900nu, FX5900u and 5950u.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(a). SPEEDS.
~~~~~~~~~~~~
The first important thing about GPU and Memory speeds is to identify how to find and read them. All speeds are stored as 8 bit binary words which are derived from a hex conversion of the speed required.

Typical stock speeds of 300/400/850 mean,

2D speed is 300MHz.
3D speed is 400MHz.
Memory speed is 850MHz, (actually 425, only given as 850 for DDR Memory).

In simplistic terms, a binary word for speed is derived by multiplying the speed value by 100, converting to Hex, transposing the last and first two digits of Hex value and adding four zero's to the end.

2D speed = 300x100 = 30000 = 7530 Hex = 30750000 bin word (or 30 75 00 00)
3D speed = 400x100 = 40000 = 9C40 Hex = 409C0000 bin word (or 40 9C 00 00)
Mem speed = 425x100 = 42500 = A604 Hex = 04A60000 bin word (or 04 A6 00 00)

To find any GPU or Memory speed in a bios just look for the 8 bit binary word that represents it, ie for 300MHz look for "30 75 00 00", and change it to any other 8 bit binary word. It is important to look for the 8 bit binary value rather than just the front 4 bit word, as that particular 4 bit sequence may exist in a number of places as programming code, and could cause serious problems if changed.

The GPU and Memory speed tables are located near the end of the bios file and are structured as three closely located tables starting with 2D, then Throttling and finally 3D. Each table consists of nine 8 bit binary words, the first bin word being for GPU speed followed by eight 8 bit words for Memory speed. Throttling is set at 375MHz regardless of GPU 2D/3D speeds, And Memory speed is set the same for all Tables.

Using the above example of 300/400/850 shows,

2D Table (300/850),
~~~~~~~~~~~~~~~~~~~
30 75 00 00 04 A6 00 00 04 A6 00 00 04 A6 00 00
04 A6 00 00 04 A6 00 00 04 A6 00 00 04 A6 00 00
04 A6 00 00

Throttling Table (375/850),
~~~~~~~~~~~~~~~~~~~~~~~~~~~
7C 92 00 00 04 A6 00 00 04 A6 00 00 04 A6 00 00
04 A6 00 00 04 A6 00 00 04 A6 00 00 04 A6 00 00
04 A6 00 00

3D Table (400/850),
~~~~~~~~~~~~~~~~~~~
40 9C 00 00 04 A6 00 00 04 A6 00 00 04 A6 00 00
04 A6 00 00 04 A6 00 00 04 A6 00 00 04 A6 00 00
04 A6 00 00


The Throttling function is only applicable to 3D Mode and can thus be effectively disabled by setting speed to same as 3D. This is what was done by manufacturers of some FX5700u bios's I have checked. However, remember to also raise GPU throttling volts to cater for raising speed to that of 3D.

Another way of removing throttling, is to use a ASUS 5900u or 5950u bios as they operate in 3D all the time and appear to have no throttling mode. However, setting the "Force constant performance level" option of Rivatuner RC15 to "performance 3D" only runs a vga card in 3D and also disables Throttling.


(b). GPU VOLTS.
~~~~~~~~~~~~~~~
Closely following the three speed tables, is a Lookup Table for setting GPU volts of the 2D, Throttling and 3D modes. The main parts of the table are typically laid out as a 18 Bit binary string as follows,

03 00 07 78 04 82 05 8C 06

The first three 2 bit values of the string describe structure, where the "03" shows that the table has three choices, and the "07" indicates each choice can have a max of 00 to 07 (or 8) possible volts levels; in this instance equating to the range 0.8 to 1.5v in 0.1v steps.

The three 4 bit binary words following the "07" show the actual values set for this bios, where the first two bits of each 4 bit word is only an indicator of volts expected (found by converting to decimal/100), and the next two bits of each 4 bit word actually set the GPU volts level.

To select GPU volts, the driver compares a Performance Level Volts Indicator (PLVI) value, which is found immediately after the memory timing string for a given mode, with the first 2 bit part of each 4 bit binary word in the lookup table, and selects the first one which is EQUAL or GREATER in value. To ensure proper operation with the above example table, the PLVI values would be expected to be set at 78 for 2D, 82 for Throttling and 8C for 3D modes.

Using the above GPU volts table example,

(hex 78)/100 or 120/100 = 1.2 = volts level 04
(hex 82)/100 or 130/100 = 1.3 = volts level 05
(hex 8C)/100 or 140/100 = 1.4 = volts level 06

This shows that GPU volts in 2D as set by level 04 is 1.2V, and in Throttling mode as set by level 05 is 1.3V and finally 3D as set by level 06 is 1.4V. You can however interchange any of the 4 bit values, and thus set 2D GPU volts at 1.4V if desired.

The highest available 07 volts level is used in a 5950u bios, for setting GPU volts at 1.5v, in order to run at higher speeds. And when present, is represented by "96 07" in the "3D" position of the table. Although not normally used by either 5900nu,5900u bios's, there is no reason why either can't have the GPU volts set at the 1.5v level of a 5950u.

Therefore in total, a 5900nu, 5900u or 5950u bios can be modified to make GPU volts in 2D, Throttling and 3D modes anywhere from 0.8 to 1.5v (volts levels 00 to 07).

Also, the lookup table structure allows the scanned number of functional, or mode, choices to be increased or decreased by changing the first "03" value. Increasing it to "04", for example, enables a new GPU volts choice of 1.5v to be achieved by simply adding "96 07" into the table; or maybe a new 1.1v choice by adding a "6E 03".

However, because of how the Driver scanning and selection process works, it is necessary that the lowest volts choice be at the table start, and thereafter in ascending order up to the highest choice being at the end. And, not adhering to this rule can cause real problems. For example, if you set the low end of the table at the highest value of "96 07", then no matter what PLVI value is set in a bios, the driver will always select "96" and thus set GPU volts at 1.5 for all modes; simply because the Driver looks for first value that is equal or greater than PLVI.

And it is important that once the table structure is fixed, including number of choices and values offered, the PLVI value for each given mode must also be updated accordingly.


(c). MEMORY LATENCIES.
~~~~~~~~~~~~~~~~~~~~~~
Almost as an extension to each of the three speed tables, and for the sake of simplicity, is a 28 bit binary string for controlling memory timing. A typical sequence for a 5900nu bios is "040205150017000E000707030403", whereas a 5950u can be "04030517001A000F000808040503".

Changing this string to "040204110013000B000606030404", which is typical of the tighter timing control of a XT type bios, can give some performance improvement. The change must be done to the binary sequence which runs concurrent to each of the three speed tables. A byproduct of the tighter timing can be a reduction of up to 5% in the ability to overclock memory speed.

Nearer the end of a bios file is a table of memory latency values, made up of eight 8 bit binary words. Normal values for a 5900nu are "07 00 0F 43", where both 5900u and 5950u are "07 03 0F 43". Some trials have shown that improved performance can be got by reducing the 43 to 40. The change must be made to each of the eight binary words in the table.

For cards with 128Mb memory, some extra performance can be gained by changing every "07 03" sequence to "07 00". Making a final latency of "07 00 0F 40".



2. FX5900XT/SE/LE/LX/SP etc.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(a). SPEEDS.
~~~~~~~~~~~~
Changing speeds in a XT types bios is the same as above for 5900nu, 5900u and 5950u bios's.


(b). GPU VOLTS.
~~~~~~~~~~~~~~~
Closely following the three speed tables, is a Lookup Table for setting GPU volts of the 2D, Throttling and 3D modes. The main parts of the table are typically laid out as a 18 Bit binary string as follows,

03 00 03 78 01 82 02 8C 03

The first three 2 bit values of the string describe structure, where the first "03" shows that the table has three choices, and the second '03' indicates each choice can have a max of 00 to 03 (or 4) possible volts levels; in this instance equating to the range 1.1 to 1.4v in 0.1v steps.

The three 4 bit binary words following the second '03' show the actual values set for this bios, where the first two bits of each 4 bit word is only an indicator of volts expected (found by converting to decimal/100), and the next two bits of each 4 bit word actually set the GPU volts level.

To select GPU volts, the driver compares a Performance Level Volts Indicator (PLVI) value, which is found immediately after the memory timing string for a given mode, with the first 2 bit part of each 4 bit binary word in the lookup table, and selects the first one which is EQUAL or GREATER in value. To ensure proper operation with the above example table, the PLVI values would be expected to be set at 78 for 2D, 82 for Throttling and 8C for 3D modes.

Using the above GPU volts table example,

(hex 78)/100 or 120/100 = 1.2 = volts level 01
(hex 82)/100 or 130/100 = 1.3 = volts level 02
(hex 8C)/100 or 140/100 = 1.4 = volts level 03

This shows that GPU volts in 2D as set by level 04 is 1.2V, and in Throttling mode as set by level 05 is 1.3V and finally 3D as set by level 06 is 1.4V. You can however interchange any of the 4 bit values, and thus set 2D GPU volts at 1.4V if desired.

Other than some manufacturers initial entry XT cards based on a 5900nu, there is no direct readaccross to a 5950u GPU 1.5v option. A simple check could be that if the lookup table sequence in a original XT type bios indicates 07 volts levels, then it may be 1.5v capable, whereas if it only shows 03 levels it is not.

A XT type bios can still however be modified to set GPU volts in 2D, Throttling and 3D modes anywhere from 1.1v to 1.4v (volts levels 00 to 03).

Also, the lookup table structure allows the scanned number of functional, or mode, choices to be increased or decreased by changing the first "03" value. Increasing it to "04", for example, could enable a new GPU volts choice of 1.1v to be achieved by simply adding "6E 03" into the table.

However, because of how the Driver scanning and selection process works, it is necessary that the lowest volts choice be at the table start, and thereafter in ascending order up to the highest choice being at the end. And, not adhering to this rule can cause real problems. For example, if you set the low end of the table at the highest value of "8C 06", then no matter what PLVI value is set in a bios, the driver will always select "8C" and thus set GPU volts at 1.4 for all modes; simply because the Driver looks for first value that is equal or greater than PLVI.

And it is important that once the table structure is fixed, including number of choices and values offered, the PLVI value for each given mode must also be updated accordingly.


(c). MEMORY LATENCIES.
~~~~~~~~~~~~~~~~~~~~~~
Almost as an extension to each of the three speed tables, and for the sake of simplicity, is a 28 bit binary string for controlling memory timing. A typical sequence for a 5900XT bios is "040205110013000B000606030404".

Changing the sequence to "0301040C000F0009000505020303" has shown to give some performance improvement. This particular string was found using a Prolink FX5900XT GL. The change must be done to the binary sequence which runs concurrent to each of the three speed tables. A byproduct of this tighter timing can be a reduction of up to 3% in the ability to overclock memory speed.

With the exception that memory latency in a XT bios may be at "07 03 0F 03", changes are the same as for the 5900nu, 5900u and 5950u above. So, in this case the last "03" in each of the binary words would be changed to "40"

For cards with 128Mb memory, some extra performance can be gained by changing every "07 03" sequence to "07 00". Making a final latency of "07 00 0F 40".




@ jimmor v2.3c
__________________
The more I know, the more I know I don't know

Intel P4 3.2 @ 3.85GHz (ASUS P4C800E-Deluxe)
BFG 6800GS (16x1,6vp) @ 300/430/1200.

Driver, 82.12 :-
Aquamark3, 75039
Codecreatures1, 90.8
3Dmark05 v120, 6195
3Dmark03 v360, 14334
3Dmark06 v102, 2949
3Dmark2001se v330, 23793.

Last edited by jimmor; 10-26-04 at 06:43 AM.
jimmor is offline   Reply With Quote