A handy little program to change PCI settings — Bill Lane
This utility will allow the modification or display of the PCI latency timer of a PCI device if it’s PCI latency timer is located at offset D. Unfortunately I know of no way of finding out at what offset the PCI latency timer resides.
New to this version is the ability to specify the
device #, bus # and function # you wish to modify. It can now be used to modify most, if not all PCI latency timers. I’ve used it to modify the PCI latency timer of modems, VIA EIDE controllers and sound cards. Curiously I’m surprised a modem would be capable of bus-mastering at all — considering
how slow it is.
The first step is to look up the device #, bus # and function # of the device you wish to modify. This can be done by utilizing Sisoft Sandra and looking at the PCI, AGP, Cardbus buses then selecting the device
you’re interested in (thanks Sisoft!).
Sisoft reports numbers in hex so you might have to convert to decimal (where F=15, E=14, D=13, C=12, B=11, A=10) Probably the best use for this utility is in reducing the PCI latency timer for your AGP card — and reducing the PCI latency timer for your modem (Winmodems don’t seem to work well with a PCI latency timer of zero).
According to the PCI Latency How To, PCI latency timers should be less than 64 clks. You might be able to get better transfer rates to your hard drives by increasing its PCI latency timer. My Nvidia GEforce 2/GTS was running 248 clks, which I reduced to ~100 clks w/no loss in framerate.
This also eliminated the problems I had when loading Undying on my KT133 system. I would always get a BSOD w/the message “disk error writing to drive
x: data or files may be lost”. By reducing the PCI latency timer to around 100 clks for the GEForce 2/GTS this problem disappeared.
New to this version is the ability to specify a configuration file.
I’ve only tested my utility on two VIA MVP3 based systems, a VIA KT133, VIA KT133e, VIAK KT266a and a Soyo Vempro based system all under Windows 98.
This utlity should work for any PCI latency timer located at offset D. Furthermore, there appears to be no standard on the granularity of PCI latency timers. I assume a granularity of 8 clks so if the granularity
is more than this (say 16 clks) the reported value of the PCI latency timer will not agree w/what you try to set it to because the 3rd bit will be ignored.
The utility should be run from a DOS box while in Windows 95/98.
I would first check, re-check and write-down the current PCI latency timer setting of the device I plan to modify! Once again finding the device #, bus # and function # can be found by looking at Sissoft Sandra’s PCI, AGP, Cardbuses information and
checking the various devices therein.
Sisoft reports numbers in hex so you might have to convert to decimal (where F=15, E=14, D=13, C=12, B=11, A=10). It would be a good idea to first note the original value before changing it.
PCItimer will not work under Windows NT or Windows 2000. This may change in the near future.
The worst problem I’ve experienced using this utility is video corruption. However, if
one were to monkey w/the EIDE controller PCI latency by reducing it, it’s possible you could
corrupt the data on your hard drive(s). Shutting down and restarting windows restores your
PCI latency timer to it’s default value, so that would be a way to overcome this problem if it occurs.
Personally I’ve found I get greater stability on my KT133 system by reducing the AGP PCI
latency timer’s value to 128 or less (this is for a GeForce 2/GTS AGP) from 248 clks. If you do a
search on PCI latency How-To you’ll find that PCI latency timer values of over 64 clks aren’t
recommended. As a matter of fact I’ve experienced no reduction in performance when I reduced
my GeForce 2/GTS AGP PCI latency timer value to ~100 clks.
It’s possible not all PCI devices implement their PCI latency register at the same offset D. This
sucks because it seems like no manufacturers today publicly publish their data
sheets so there’s no way of knowing where they implement their PCI latency register. Also if a device
card doesn’t do bus-mastering (I know for a fact the PCI 3dfx Voodoo 3/2000 didn’t do bus-mastering)
there will be no latency timer to modify!
I added PCItimer to the startup taskbar and start menu as a DOS app and then check close-on-exit.
This is the way I’m using it on my KT133-based Gigabyte 7zx. Settings -> Taskbar and Start Menu -> Start Menu
Programs. On all three motherboards I’ve tested the AGP PCI latency timer value is reset to it’s default
value on reboot.
The configuration file must be located in the same directory as the utility and should specify each device
on a different line in the following format
The first line would be setting device 0, bus 0, function 0 to a PCI latency value of 0. The 2nd line would be
setting device 7, bus 0, function 1 to a PCI latency of 40 clks.
Recently I’ve used this utility to solve a strange problem I had with my S3 Savage4 AGP vid-card.
The drivers I’m using for this card apparently reset the PCI latency timer for this card to
248 clks regardless of BIOS settings. This caused Yuri’s Revenge to consistently crash to the
desktop (i.e. whenever it eventually cause a page swap to disk) and streaming video from certain games to exhibit choppy playback.
My solution for this was to increase the PCI latency timer for the EIDE controller to match
that of the video-card (i.e. 240 clks). Now the S3 Savage4 can’t hog the PCI bus for itself and must share with
the EIDE controller.
This program, which isn’t particularly user-friendly, will take 4
command line parameters. Three of the command-line parameters will
specify the device #, bus # and function # at which the PCI device
resides. The 4th parameter will consist of -vV followed by a
single number (unsigned char) or -C or -c. The -C or -c parameter
will report the current setting of the PCI latency timer for the PCI
device. The command-line parameters are:
PCItimer -dD (decimal value) -bB (decimal value) -fF (decimal value) -vV (decimal value)/-cC/-rR
will report back the current PCI
latency timer setting for device 0, bus 1, function 0
will modify the PCI latency timer
for device 5, bus 1, function 0 to 104 clks
will report back the current PCI
latency timer setting for device 4, bus 1, function 3
will read the settings for all
the devices listed in the text file set.txt and
set the latency timer for all devices so listed
(better make sure the parameters in the ASCII file
are correct, because I do NO error checking on file
The last command-line parameter (i.e. -vV<decimal value>) will set the PCI latency timer of a PCI device at the specified device #, bus # and function #) to (8 x this number). This utility can only set the PCI latency timer to the following range: 0 =< x <= 248
value command line
0 clks 0
8 clks 1
16 clks 2
24 clks 3
32 clks 4
40 clks 5
48 clks 6
56 clks 7
64 clks 8
72 clks 9
80 clks 10
88 clks 11
96 clks 12
104 clks 13
112 clks 14
120 clks 15
128 clks 16
136 clks 17
144 clks 18
152 clks 19
160 clks 20
168 clks 21
176 clks 22
DOWNLOAD PCITIMER.zip (13k)
If you’ve got any problems it’s best to send me the specs on your PCI device by using Sisoft Sandra.
What I’d like to know is what device #, bus # and function # your PCI device is using, it’s current
latency timer value and whether or not it’s bus-master capable (both found in Sisoft Sandra’s PCI, AGP,
Cardbus buses information, AGP). Also, I’d like to know what interfaces your PCI bus supports
(found in Sisoft Sandra PCI, AGP, Cardbuses information generic).
author of the original PCI latency utility: latency.exe.