--- /dev/null
+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 );
+