Witam!

Napisałem patcha na SVGATextmode, który rozszerza funckjonalność tego
programu na wiekszość kart nVidii. Wyciągnąłem kod z OpenSource'owego
sterownika nVidii w XFree86/X11R6.7.0 i dzięki zmianom powinny ruszyć
wszystke karty serii FX5600 i FX5700. Nie powinien on zmieniać
zachowania na kartach dotychczas obsługiwanych. Z tego co widziałem
w sterownikach X'owych wszystkie karty nVidii których pci_id dodaję
powinny być dobrze obsługiwane, przynajmniej nie widzę róznic w tej
części kodu która dotyczy zmiany pixel clock. Niestety w tej chwili
mam dostep tylko do FX 5600, więc prosiłbym o przetestowanie tego kodu
i ewentualne wrzucenie do cvs'u.

Patch na stm został połączony z patchem SVGATextmode-Geforce.patch, ale
zmieniłem mu nazwę, gdyż dotyczy on nie tylko GF, lecz ogólnie kart
nVidii. W załącznikach patch na speca, oraz dodatkowo rozszerzony patch
na llh (zmiany dotyczące includowania <asm/io.h>).

Patche już były raz przesyłane, ale jakoś przeszły bez echa. Mam
nadzieję, że teraz lepiej opisałem zmiany jakie zrobiłem, poprawiłem
również samego patcha więc myślę, że jest szansa na dodanie tego.

-- 
Pozdrawiam
Przemysław Białek
--- SVGATextMode.spec.orig      2004-05-25 18:43:20.038645408 +0200
+++ SVGATextMode.spec   2004-05-25 19:07:17.041187816 +0200
@@ -7,7 +7,7 @@
 Summary(uk):   őÔÉĚŚÔÁ ÄĚŃ ĐĎËŇÁÝĹÎÎŃ ÚĎ×ÎŚŰÎŘĎÇĎ ×ÉÇĚŃÄŐ ÔĹËÓÔĎ×ÉČ ËĎÎÓĎĚĹĘ
 Name:          SVGATextMode
 Version:       1.10
-Release:       17
+Release:       18
 License:       GPL
 Group:         Applications/System
 Source0:       
ftp://sunsite.unc.edu/pub/Linux/utils/console/%{name}-%{version}-src.tar.gz
@@ -19,7 +19,7 @@
 Patch4:                %{name}-set80.patch
 Patch5:                %{name}-Makefile-gcc.patch
 Patch6:                %{name}-cfgfile.y.patch
-Patch7:                %{name}-GeForce.patch
+Patch7:                %{name}-Nvidia.patch
 Patch8:                %{name}-voodoo.patch
 Patch9:                %{name}-alpha.patch
 Patch10:       %{name}-gcc33.patch
diff -ru SVGATextMode-1.10.orig/SVGATextMode.c SVGATextMode-1.10/SVGATextMode.c
--- SVGATextMode-1.10.orig/SVGATextMode.c       2000-09-03 01:27:19.000000000 +0200
+++ SVGATextMode-1.10/SVGATextMode.c    2004-05-25 18:50:33.888690176 +0200
@@ -35,7 +35,7 @@
 #include <fcntl.h>
 
 #ifndef DOS
-#  include "fs.h"
+#  include <linux/fs.h>
 #  include <sys/ioctl.h>
 #  include <sys/kd.h>
 #  include <ctype.h>
diff -ru SVGATextMode-1.10.orig/vga_prg.h SVGATextMode-1.10/vga_prg.h
--- SVGATextMode-1.10.orig/vga_prg.h    2000-09-03 00:03:07.000000000 +0200
+++ SVGATextMode-1.10/vga_prg.h 2004-05-25 18:55:36.558677344 +0200
@@ -40,14 +40,10 @@
 #  define ioperm(x,y,z) (0)
 #  define iopl(x) (0)
 #else
-extern int iopl(int);
-#  include <asm/io.h>
-#  ifdef __ALPHA_IO_H
-#    define _ASM_IO_H
-#  endif
+#  include <sys/io.h>
 #endif
 
-#ifndef _ASM_IO_H
+#ifndef _SYS_IO_H
 #  ifdef DJGPP
 #    include <pc.h>
 #    define outb(data,port) outportb(port,data)
diff -ru SVGATextMode-1.10.orig/XFREE/riva128_clock.c 
SVGATextMode-1.10/XFREE/riva128_clock.c
--- SVGATextMode-1.10.orig/XFREE/riva128_clock.c        2000-07-18 04:47:15.000000000 
+0200
+++ SVGATextMode-1.10/XFREE/riva128_clock.c     2004-05-25 20:45:25.594991568 +0200
@@ -80,9 +80,96 @@
 #define PCI_DEVICE_ID_NVIDIA_TNT       0x0020
 #define PCI_DEVICE_ID_NVIDIA_TNT2      0x0028
 #define PCI_DEVICE_ID_NVIDIA_UTNT2     0x0029
+#define PCI_DEVICE_ID_NVIDIA_UNKNOWN_TNT2      0x002A
 #define PCI_DEVICE_ID_NVIDIA_VTNT2     0x002C
 #define PCI_DEVICE_ID_NVIDIA_UVTNT2    0x002D
 #define PCI_DEVICE_ID_NVIDIA_ITNT2     0x00A0
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_SDR        0x0100
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_DDR        0x0101
+#define PCI_DEVICE_ID_NVIDIA_QUADRO            0x0103
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX400     0x0110
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX200     0x0111
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE2_GO       0x0112
+#define PCI_DEVICE_ID_NVIDIA_QUADRO2_MXR       0x0113
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS       0x0150
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS2      0x0151
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE2_ULTRA     0x0152
+#define PCI_DEVICE_ID_NVIDIA_QUADRO2_PRO       0x0153
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_460   0x0170
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440   0x0171
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_420   0x0172
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX440SE  0x0173
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO   0x0174
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO   0x0175
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO32 0x0176
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_460GO    0x0177
+#define PCI_DEVICE_ID_NVIDIA_QUADRO4_500XGL    0x0178
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_460_GO64 0x0179
+#define PCI_DEVICE_ID_NVIDIA_QUADRO4_200       0x017A
+#define PCI_DEVICE_ID_NVIDIA_QUADRO4_550XGL    0x017B
+#define PCI_DEVICE_ID_NVIDIA_QUADRO4_500_GOGL  0x017C
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_410_GO16 0x017D
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX440_AGP8x      0x0181
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX440SE_AGP8x    0x0182
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX420_AGP8x      0x0183
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_448_GO   0x0186
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_488_GO   0x0187
+#define PCI_DEVICE_ID_NVIDIA_QUADRO4_580_XGL   0x0188
+#define PCI_DEVICE_ID_NVIDIA_QUADRO4_280_NVS   0x018A
+#define PCI_DEVICE_ID_NVIDIA_QUADRO4_380_XGL   0x018B
+#define PCI_DEVICE_ID_NVIDIA_IGEFORCE2         0x01a0
+#define PCI_DEVICE_ID_NVIDIA_IGEFORCE4_MX      0x01F0
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE3          0x0200
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE3_TI200    0x0201
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE3_TI500    0x0202
+#define PCI_DEVICE_ID_NVIDIA_QUADRO_DCC                0x0203
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI4600   0x0250
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI4400   0x0251
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI4200   0x0253
+#define PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL    0x0258
+#define PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL    0x0259
+#define PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL    0x025B
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI4800   0x0280
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI4200_AGP8x     0x0281
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI4800SE 0x0282
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE4_4200GO   0x0286
+#define PCI_DEVICE_ID_NVIDIA_QUADRO4_700GOGL   0x028C
+#define PCI_DEVICE_ID_NVIDIA_QUADRO4_980XGL    0x0288
+#define PCI_DEVICE_ID_NVIDIA_QUADRO4_780XGL    0x0289
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5800U  0x0301
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5800   0x0302
+#define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_2000    0x0308
+#define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1000    0x0309
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600U  0x0311
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600   0x0312
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600SE 0x0314
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5600 0x031A
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5650 0x031B
+#define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO700   0x031C
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200   0x0320
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200U  0x0321
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200_U 0x0322
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200SE 0x0323
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5200 0x0324
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5250 0x0325
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5200_32M_64M 0x0328
+#define PCI_DEVICE_ID_NVIDIA_QUADRO_NVS_280_PCI                0x032A
+#define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_500     0x032B
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5300 0x032C
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5100 0x032D
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900U  0x0330
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900   0x0331
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900XT 0x0332
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5950U  0x0333
+#define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_3000    0x0338
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700U  0x0341
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700   0x0342
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700LE 0x0343
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700VE 0x0344
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700 0x0347
+#define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_        0x0348
+#define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO1000  0x034C
+#define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100    0x034E
 
 vgaPCIInformation *vgaPCIInfo;
 
@@ -92,14 +179,16 @@
 #define PRAMDAC_PLL_COEFF  0x00000508
 #define PRAMDAC_PLL_COEFF_SELECT   0x0000050C
 
+
+#define PEXTDEV_BASE   0x00101000
+
 #define NV3_MIN_CLOCK_IN_KHZ  25000    // Not sure about this, but it seems reasonable
 #define NV3_MAX_CLOCK_IN_KHZ 230000
 #define NV4_MAX_CLOCK_IN_KHZ 350000
 
 static int max_clock, is_nv3, pll_coeff;
 
-/* NTSC cards have approx 14.3Mhz. Need to detect, but leave for now*/
-#define PLL_INPUT_FREQ 13500 
+static int PLL_INPUT_FREQ;
 #define M_MIN 7
 #define M_MAX 13
 
@@ -107,79 +196,102 @@
 #define P_MAX 4 /* Not sure about this. Could be 4 */
 
 //=== Function section ===
-// From xc/programs/Xserver/hw/xfree86/vga256/drivers/nv/riva_hw.c in XFree86 3.3.6
+// From xc/programs/Xserver/hw/xfree86/drivers/nv/nv_hw.c in X11R6.7.0
 /*
  * Calculate the Video Clock parameters for the PLL.
  */
-static int CalcVClock
-(
+static void CalcVClock (
     int           clockIn,
-    int           double_scan,
     int          *clockOut,
-    int          *mOut,
-    int          *nOut,
-    int          *pOut/*,
-    RIVA_HW_INST *chip*/
+    unsigned int *pllOut
 )
 {
-    unsigned lowM, highM, highP;
+    unsigned lowM, highM;
     unsigned DeltaNew, DeltaOld;
     unsigned VClk, Freq;
     unsigned M, N, P;
-
+    
     DeltaOld = 0xFFFFFFFF;
 
-    VClk     = (unsigned)clockIn;
-    if (double_scan)
-        VClk *= 2;
-
-    if (/*chip->CrystalFreqKHz*/PLL_INPUT_FREQ == 14318)
-    {
-        lowM  = 8;
-        highM = 14 - (/*chip->Architecture == NV_ARCH_03*/is_nv3);
-    }
-    else
-    {
+    VClk = (unsigned)clockIn;
+    
+    if (/*pNv->CrystalFreqKHz*/ PLL_INPUT_FREQ == 13500) {
         lowM  = 7;
         highM = 13 - (/*chip->Architecture == NV_ARCH_03*/is_nv3);
+    } else {
+        lowM  = 8;
+        highM = 14 - (/*chip->Architecture == NV_ARCH_03*/is_nv3);
     }
 
-    highP = 4 - (/*chip->Architecture == NV_ARCH_03*/is_nv3);
-    for (P = 0; P <= highP; P ++)
-    {
+    for (P = 0; P <= 4 - is_nv3; P++) {
         Freq = VClk << P;
-        if ((Freq >= 128000) && (Freq <= /*chip->MaxVClockFreqKHz*/max_clock))
-        {
-            for (M = lowM; M <= highM; M++)
-            {
-                N    = (VClk * M / /*chip->CrystalFreqKHz*/PLL_INPUT_FREQ) << P;
-                Freq = (/*chip->CrystalFreqKHz*/PLL_INPUT_FREQ * N / M) >> P;
-                if (Freq > VClk)
-                    DeltaNew = Freq - VClk;
-                else
-                    DeltaNew = VClk - Freq;
-                if (DeltaNew < DeltaOld)
-                {
-                    *mOut     = M;
-                    *nOut     = N;
-                    *pOut     = P;
-                    *clockOut = Freq;
-                    DeltaOld  = DeltaNew;
+        if ((Freq >= 128000) && (Freq <= max_clock)) {
+            for (M = lowM; M <= highM; M++) {
+                N = ((VClk << P) * M) / /* pNv->CrystalFreqKHz */ PLL_INPUT_FREQ;
+                if(N <= 255) {
+                    Freq = ((/*pNv->CrystalFreqKHz*/ PLL_INPUT_FREQ * N) / M) >> P;
+                    if (Freq > VClk)
+                        DeltaNew = Freq - VClk;
+                    else
+                        DeltaNew = VClk - Freq;
+                    if (DeltaNew < DeltaOld) {
+                        *pllOut   = (P << 16) | (N << 8) | M;
+                        *clockOut = Freq;
+                        DeltaOld  = DeltaNew;
+                    }
                 }
             }
         }
     }
-    return (DeltaOld != 0xFFFFFFFF);
+}
+
+static void CalcVClock2Stage (
+    int           clockIn,
+    int          *clockOut,
+    unsigned int *pllOut,
+    unsigned int *pllBOut
+)
+{
+    unsigned DeltaNew, DeltaOld;
+    unsigned VClk, Freq;
+    unsigned M, N, P;
+
+    DeltaOld = 0xFFFFFFFF;
+
+    *pllBOut = 0x80000401;  /* fixed at x4 for now */
+
+    VClk = (unsigned)clockIn;
 
+    for (P = 0; P <= 6; P++) {
+        Freq = VClk << P;
+        if ((Freq >= 400000) && (Freq <= 1000000)) {
+            for (M = 1; M <= 13; M++) {
+                N = ((VClk << P) * M) / (PLL_INPUT_FREQ << 2);
+                if((N >= 5) && (N <= 255)) {
+                    Freq = (((PLL_INPUT_FREQ << 2) * N) / M) >> P;
+                    if (Freq > VClk)
+                        DeltaNew = Freq - VClk;
+                    else
+                        DeltaNew = VClk - Freq;
+                    if (DeltaNew < DeltaOld) {
+                        *pllOut   = (P << 16) | (N << 8) | M;
+                        *clockOut = Freq;
+                        DeltaOld  = DeltaNew;
+                    }
+                }
+            }
+        }
+    }
 }
            
 // Set the clock to the given speed (in KHz)
 Bool RIVA128ClockSelect( int clockspeed )
 {
-  int *ptr;
+  int *ptr, *ptr2;
+  int implementation = 0;
 
-  int out;
-  int m, n, p, value;
+  int clockout;
+  int pll, pllB;
   int i = 0;
   pciConfigPtr pcr = NULL;
   int fd;
@@ -203,13 +315,101 @@
                        if (pcr->_device == PCI_DEVICE_ID_NVIDIA_TNT ||
                                pcr->_device == PCI_DEVICE_ID_NVIDIA_TNT2 ||
                                pcr->_device == PCI_DEVICE_ID_NVIDIA_UTNT2 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_UNKNOWN_TNT2 ||
                                pcr->_device == PCI_DEVICE_ID_NVIDIA_VTNT2 ||
                                pcr->_device == PCI_DEVICE_ID_NVIDIA_UVTNT2 ||
-                               pcr->_device == PCI_DEVICE_ID_NVIDIA_ITNT2)
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_ITNT2 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_SDR ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_DDR ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX400 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE2_MX200 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE2_GO ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO2_MXR ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE2_GTS2 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE2_ULTRA ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO2_PRO ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_460 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_440 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX_420 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX440SE 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_440_GO ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_420_GO32 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_460GO ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO4_500XGL ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_460_GO64 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO4_200 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO4_550XGL ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO4_500_GOGL 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_410_GO16 
||
+                               pcr->_device == 
PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX440_AGP8x ||
+                               pcr->_device == 
PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX440SE_AGP8x ||
+                               pcr->_device == 
PCI_DEVICE_ID_NVIDIA_GEFORCE4_MX420_AGP8x ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_448_GO ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_488_GO ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO4_580_XGL ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO4_280_NVS ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO4_380_XGL ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_IGEFORCE2 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_IGEFORCE4_MX ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE3 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE3_TI200 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE3_TI500 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO_DCC ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI4600 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI4400 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI4200 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO4_900XGL ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO4_750XGL ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO4_700XGL ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI4800 ||
+                               pcr->_device == 
PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI4200_AGP8x ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI4800SE 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE4_4200GO ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO4_700GOGL ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO4_980XGL ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO4_780XGL ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5800U 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5800 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO_FX_2000 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1000 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600U 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5600SE 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5600 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5650 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO700 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200U 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5200SE 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5200 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5250 
||
+                               pcr->_device == 
PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5200_32M_64M ||
+                               pcr->_device == 
PCI_DEVICE_ID_NVIDIA_QUADRO_NVS_280_PCI ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO_FX_500 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5300 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5100 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900U 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5900XT 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5950U 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO_FX_3000 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700U 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700 ||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700LE 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_5700VE 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO1000 
||
+                               pcr->_device == PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100)
                        {
                                is_nv3 = 0;
                                pll_coeff = 0x00010700;
                                max_clock = NV4_MAX_CLOCK_IN_KHZ;
+                               implementation = pcr->_device & 0x0ff0;
                                 break;
                        }
 
@@ -249,6 +449,33 @@
     return FALSE;
   }
     
+  ptr2 = (int*)mmap(0, 0x1000,PROT_READ|PROT_WRITE,MAP_SHARED, fd, 
(off_t)(pcr->_base0) + PEXTDEV_BASE);
+
+  if( ptr2 == (int*)-1 )
+  {
+    PERROR(( "Error mmap'ing /dev/mem" ));
+    return FALSE;
+  }
+
+  if(is_nv3)
+  {
+    PLL_INPUT_FREQ = (ptr2[0x00000000/4]&0x20) ? 13500 : 14318;
+  }
+  else
+  {
+    PLL_INPUT_FREQ = (ptr2[0x00000000/4]&0x40) ? 14318 : 13500;
+  }
+
+  if((implementation == 0x0170) ||
+      (implementation == 0x0180) ||
+      (implementation == 0x01F0) ||
+      (implementation >= 0x0250))
+  {
+    if(ptr2[0x00000000/4] & (1 << 22)) PLL_INPUT_FREQ = 27000;
+  }
+
+  munmap(ptr2, 0x1000);
+    
   close( fd );
 #else
   ptr=(int*) malloc(0x4000);
@@ -261,13 +488,15 @@
 
   // Calculate the clock  
   //NV3ClockSelect( (float)clockspeed, &out, &m, &n, &p );
-  CalcVClock ((float) clockspeed, 0, &out, &m, &n, &p);
-    
-  value = (m) + (n<<8) + (p<<16);
+  if ((implementation == 0x0310) || (implementation == 0x0340)) {
+    CalcVClock2Stage ((float) clockspeed, &clockout, &pll, &pllB);
+  } else {
+    CalcVClock ((float) clockspeed, &clockout, &pll);
+  }
   
   // But of debug info
-  PDEBUG(( "Wanted %dkHz, got %dkHz (m=%d, n=%d, p=%d, value=0x%08X)\n",
-    clockspeed, (int)out, m, n, p, value ));
+  PDEBUG(( "Wanted %dkHz, got %dkHz (pll=0x%08X)\n",
+    clockspeed, (int)clockout, pll));
     
   // Default value is 0x00000100 (NV3)
   // X uses 0x10010100 (NV3) or 0x10000700 (NV4)
@@ -275,8 +504,10 @@
   ptr[PRAMDAC_PLL_COEFF_SELECT/4] = pll_coeff;  // could use |=
 
   // Divide by 4 because we're dealing with integers
-  ptr[PRAMDAC_PLL_COEFF/4] = value;
-  
+  ptr[PRAMDAC_PLL_COEFF/4] = pll;
+  if ((implementation == 0x0310) || (implementation == 0x0340)) {
+       ptr[0x00000578/4] = pllB;
+  }  
 #ifndef DOS
   // Unmap memory
   munmap( ptr, 0x1000 );

_______________________________________________________
z�ota zasada - kto si� nie zna, niech si� nie wypowiada

Odpowiedź listem elektroniczym