xf86-video-nv: 3 commits - man/nv.man src/g80_dac.c src/g80_output.c src/g80_type.h src/nv_driver.c

Aaron Plattner aplattner at kemper.freedesktop.org
Thu Jan 24 21:02:33 PST 2008


 man/nv.man       |    2 +-
 src/g80_dac.c    |    9 ++++-----
 src/g80_output.c |   38 ++++++++++++++++++++++++++++++++++++++
 src/g80_type.h   |    1 +
 src/nv_driver.c  |    6 +++++-
 5 files changed, 49 insertions(+), 7 deletions(-)

New commits:
commit 3449da7a7baf7365c247caa9b4344316a961ec41
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Thu Jan 24 20:51:29 2008 -0800

    Update know card list date and add G92 to the manpage.

diff --git a/man/nv.man b/man/nv.man
index 7b9d946..7a08823 100644
--- a/man/nv.man
+++ b/man/nv.man
@@ -60,7 +60,7 @@ NV40, NV41, NV43, NV44, NV45, C51
 G70, G71, G72, G73
 .TP 22
 .B GeForce 8XXX
-G80, G84, G86
+G80, G84, G86, G92
 
 .SH CONFIGURATION DETAILS
 Please refer to __xconfigfile__(__filemansuffix__) for general configuration
diff --git a/src/nv_driver.c b/src/nv_driver.c
index 64b4ebd..fa6259d 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -113,7 +113,7 @@ _X_EXPORT DriverRec NV = {
 #endif
 };
 
-/* Known cards as of 2007/07/24 */
+/* Known cards as of 2008/01/24 */
 
 static SymTabRec NVKnownChipsets[] =
 {
commit 62ff129257161db99dc4056cf16aa196ccfbc921
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Wed Jan 23 21:32:51 2008 -0800

    Fix more load detection false positives.

diff --git a/src/g80_dac.c b/src/g80_dac.c
index 282436b..0d72d9d 100644
--- a/src/g80_dac.c
+++ b/src/g80_dac.c
@@ -136,23 +136,22 @@ G80DacLoadDetect(xf86OutputPtr output)
     const int scrnIndex = pScrn->scrnIndex;
     const int dacOff = 2048 * pPriv->or;
     int sigstate;
-    CARD32 load, tmp, tmp2;
+    CARD32 load, tmp;
 
     xf86DrvMsg(scrnIndex, X_PROBED, "Trying load detection on VGA%i ... ",
             pPriv->or);
 
     pNv->reg[(0x0061A010+dacOff)/4] = 0x00000001;
-    tmp2 = pNv->reg[(0x0061A004+dacOff)/4];
+    tmp = pNv->reg[(0x0061A004+dacOff)/4];
     pNv->reg[(0x0061A004+dacOff)/4] = 0x80150000;
     while(pNv->reg[(0x0061A004+dacOff)/4] & 0x80000000);
-    tmp = pNv->architecture == 0x50 ? 420 : 340;
-    pNv->reg[(0x0061A00C+dacOff)/4] = tmp | 0x100000;
+    pNv->reg[(0x0061A00C+dacOff)/4] = pNv->loadVal | 0x100000;
     sigstate = xf86BlockSIGIO();
     usleep(45000);
     xf86UnblockSIGIO(sigstate);
     load = pNv->reg[(0x0061A00C+dacOff)/4];
     pNv->reg[(0x0061A00C+dacOff)/4] = 0;
-    pNv->reg[(0x0061A004+dacOff)/4] = 0x80000000 | tmp2;
+    pNv->reg[(0x0061A004+dacOff)/4] = 0x80000000 | tmp;
 
     // Use this DAC if all three channels show load.
     if((load & 0x38000000) == 0x38000000) {
diff --git a/src/g80_output.c b/src/g80_output.c
index 1ec6a89..53c0954 100644
--- a/src/g80_output.c
+++ b/src/g80_output.c
@@ -32,6 +32,41 @@
 #include "g80_display.h"
 #include "g80_output.h"
 
+static CARD32 G80FindLoadVal(const unsigned char *table1)
+{
+    const unsigned char *p = table1;
+    int count;
+    const CARD32 def = 340;
+
+    for(p = table1; *(CARD16*)p != 0xb8ff && p < table1 + 64000; p += 2);
+    if(p == table1 + 64000)
+        return def;
+    p += 2;
+    if(*(CARD32*)p != 0x544942)
+        return def;
+    p += 4;
+    if(*(CARD16*)p != 0x100)
+        return def;
+    p += 2;
+    if(*p != 12)
+        return def;
+    p++;
+    if(*p != 6)
+        return def;
+    p++;
+    count = *p;
+    p += 2;
+    for(; *p != 'A' && count >= 0; count--, p += 6);
+    if(count == -1)
+        return def;
+    p += 4;
+    p = table1 + *(CARD16*)p;
+    p = table1 + *(CARD16*)p;
+    if(p[0] != 0x10 || p[1] != 4 || p[2] != 4 || p[3] != 2)
+        return def;
+    return *(CARD32*)(p + 4) & 0x3ff;
+}
+
 static Bool G80ReadPortMapping(int scrnIndex, G80Ptr pNv)
 {
     unsigned char *table2;
@@ -110,6 +145,9 @@ static Bool G80ReadPortMapping(int scrnIndex, G80Ptr pNv)
             xf86DrvMsg(scrnIndex, X_PROBED, "  Bus %i -> SOR%i\n", i, pNv->i2cMap[i].sor);
     }
 
+    pNv->loadVal = G80FindLoadVal(pNv->table1);
+    xf86DrvMsg(scrnIndex, X_PROBED, "Load detection: %d\n", pNv->loadVal);
+
     return TRUE;
 
 fail:
diff --git a/src/g80_type.h b/src/g80_type.h
index 41f170b..fc31085 100644
--- a/src/g80_type.h
+++ b/src/g80_type.h
@@ -56,6 +56,7 @@ typedef struct G80Rec {
         Bool            present;
         ORNum           or;
     } lvds;
+    CARD32              loadVal;
 
     xf86Int10InfoPtr    int10;
     int                 int10Mode; /* Console mode to restore */
commit 28f34db87cefdc6b327a98db43da5b4fefe3bdd8
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Wed Jan 23 20:23:32 2008 -0800

    New chips.

diff --git a/src/nv_driver.c b/src/nv_driver.c
index 4bcc391..64b4ebd 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -384,6 +384,7 @@ static SymTabRec NVKnownChipsets[] =
   { 0x10DE042D, "Quadro FX 360M" },
   { 0x10DE042F, "Quadro NVS 290" },
   { 0x10DE0611, "GeForce 8800 GT" },
+  { 0x10DE061A, "Quadro FX 3700" },
 
   {-1, NULL}
 };
@@ -750,6 +751,9 @@ NVIsG80(int chipType)
         case 0x0400:
         case 0x0420:
         case 0x0610:
+        case 0x0620:
+        case 0x0630:
+        case 0x0640:
             return TRUE;
     }
 


More information about the xorg-commit mailing list