Use the version in cvs right now, or use the attatched patch against 4.2.0
nv driver.


ani

On Sat, 20 Apr 2002, Richard Chan wrote:

> Folks,
>
> Using XFree86 4.2 with nv driver on G4 PowerMAC with Nvidia GeForce2/MX card (VGA 
>and ADC)
> Debian Linux Woody, 2.4.18-newpmac kernel
>
> Everything works great with VGA out or text console on ADC and XFree86 on VGA - 
>however
> I just can't figure out how to get XFree86 appearing on the ADC output ( with an 
>Apple Studio
> Display 17" CRT - not the current  LCD display offerings).
>
> Is there some special nv Option or is this a "known problem" with Apple's 
>proprietary stuff.
>
> Thanks for any enlightenment.
>
> Richard
>
diff -uNr nv.orig/nv_cursor.c nv/nv_cursor.c
--- nv.orig/nv_cursor.c Mon Feb 25 22:54:49 2002
+++ nv/nv_cursor.c      Mon Feb 25 22:54:45 2002
@@ -109,7 +109,7 @@
     NVPtr pNv = NVPTR(pScrn);
 
     pNv->riva.ShowHideCursor(&pNv->riva, 0);
-    *(pNv->riva.CURSORPOS) = (x & 0xFFFF) | (y << 16);
+    pNv->riva.PRAMDAC[0x0000300/4] = (x & 0xFFFF) | (y << 16);
     pNv->riva.ShowHideCursor(&pNv->riva, 1);
 }
 
@@ -123,8 +123,10 @@
     back = ConvertToRGB555(bg);
 
 #if X_BYTE_ORDER == X_BIG_ENDIAN
-    fore = (fore << 8) | (fore >> 8);
-    back = (back << 8) | (back >> 8);
+    if((pNv->Chipset & 0x0ff0) == 0x0110) {
+       fore = (fore << 8) | (fore >> 8);
+       back = (back << 8) | (back >> 8);
+    }
 #endif
 
     if (pNv->curFg != fore || pNv->curBg != back) {
diff -uNr nv.orig/nv_dac.c nv/nv_dac.c
--- nv.orig/nv_dac.c    Mon Feb 25 22:54:49 2002
+++ nv/nv_dac.c Mon Feb 25 22:54:45 2002
@@ -71,6 +71,15 @@
     if(mode->Flags & V_INTERLACE) 
         vertTotal |= 1;
 
+    if(pNv->FlatPanel) {
+       vertStart = vertTotal - 3;  
+       vertEnd = vertTotal - 2;
+       vertBlankStart = vertStart;
+       horizStart = horizTotal - 3;
+       horizEnd = horizTotal - 2;   
+       horizBlankEnd = horizTotal + 4;    
+    }
+
     pVga->CRTC[0x0]  = Set8Bits(horizTotal);
     pVga->CRTC[0x1]  = Set8Bits(horizDisplay);
     pVga->CRTC[0x2]  = Set8Bits(horizBlankStart);
@@ -147,6 +156,8 @@
     if(pNv->riva.Architecture >= NV_ARCH_10)
        pNv->riva.CURSOR = (U032 *)(pNv->FbStart + pNv->riva.CursorStart);
 
+    pNv->riva.LockUnlock(&pNv->riva, 0);
+
     pNv->riva.CalcStateExt(&pNv->riva, 
                            nvReg,
                            i,
@@ -156,6 +167,24 @@
                            mode->Clock,
                           mode->Flags);
 
+    nvReg->scale = pNv->riva.PRAMDAC[0x00000848/4] & 0xfff000ff;
+    if(pNv->FlatPanel) {
+       nvReg->pixel |= (1 << 7);
+       nvReg->scale |= (1 << 8) ;
+    }
+    if(pNv->SecondCRTC) {
+       nvReg->head  = 0;
+       nvReg->head2 = 0x00001111;
+       nvReg->crtcOwner = 3;
+       nvReg->pllsel |= 0x20000800;
+       nvReg->vpll2 = nvReg->vpll;
+    } else {
+       nvReg->head  = 0x00001111;
+       nvReg->head2 = 0;
+       nvReg->crtcOwner = 0;
+       nvReg->vpll2 = pNv->riva.PRAMDAC0[0x00000520/4];
+    }
+
     return (TRUE);
 }
 
@@ -184,8 +213,17 @@
 {
     NVPtr pNv = NVPTR(pScrn);
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVDACSave\n"));
-    vgaHWSave(pScrn, vgaReg, VGA_SR_MODE | (saveFonts? VGA_SR_FONTS : 0));
+
+#if defined(__powerpc__)
+    saveFonts = FALSE;
+#endif
+
+    vgaHWSave(pScrn, vgaReg, VGA_SR_CMAP | VGA_SR_MODE | 
+                             (saveFonts? VGA_SR_FONTS : 0));
     pNv->riva.UnloadStateExt(&pNv->riva, nvReg);
+
+    if((pNv->Chipset & 0x0ff0) == 0x0110) 
+       nvReg->crtcOwner = ((pNv->Chipset & 0x0fff) == 0x0112) ? 3 : 0;
 }
 
 #define DEPTH_SHIFT(val, w) ((val << (8 - w)) | (val >> ((w << 1) - 8)))
diff -uNr nv.orig/nv_dga.c nv/nv_dga.c
--- nv.orig/nv_dga.c    Mon Feb 25 22:54:49 2002
+++ nv/nv_dga.c Mon Feb 25 22:54:45 2002
@@ -234,8 +234,8 @@
 
    NVAdjustFrame(pScrn->pScreen->myNum, x, y, flags);
 
-   while(pNv->riva.PCIO[0x3da] & 0x08);
-   while(!(pNv->riva.PCIO[0x3da] & 0x08));
+   while(VGA_RD08(pNv->riva.PCIO, 0x3da) & 0x08);
+   while(!(VGA_RD08(pNv->riva.PCIO, 0x3da) & 0x08));
 
    pNv->DGAViewportStatus = 0;  
 }
diff -uNr nv.orig/nv_driver.c nv/nv_driver.c
--- nv.orig/nv_driver.c Mon Feb 25 22:54:49 2002
+++ nv/nv_driver.c      Mon Feb 25 22:54:45 2002
@@ -179,13 +179,11 @@
     "vgaHWGetHWRec",
     "vgaHWGetIndex",
     "vgaHWInit",
-    "vgaHWLock",
     "vgaHWMapMem",
     "vgaHWProtect",
     "vgaHWRestore",
     "vgaHWSave",
     "vgaHWSaveScreen",
-    "vgaHWUnlock",
     "vgaHWddc1SetSpeed",
     NULL
 };
@@ -305,7 +303,8 @@
     OPTION_FBDEV,
     OPTION_ROTATE,
     OPTION_VIDEO_KEY,
-    OPTION_FLAT_PANEL
+    OPTION_FLAT_PANEL,
+    OPTION_CRTC_NUMBER
 } NVOpts;
 
 
@@ -319,6 +318,7 @@
     { OPTION_ROTATE,           "Rotate",       OPTV_ANYSTR,    {0}, FALSE },
     { OPTION_VIDEO_KEY,                "VideoKey",     OPTV_INTEGER,   {0}, FALSE },
     { OPTION_FLAT_PANEL,       "FlatPanel",    OPTV_BOOLEAN,   {0}, FALSE },
+    { OPTION_CRTC_NUMBER,      "CrtcNumber",   OPTV_INTEGER,   {0}, FALSE },
     { -1,                       NULL,           OPTV_NONE,      {0}, FALSE }
 };
 
@@ -565,13 +565,9 @@
 NVEnterVT(int scrnIndex, int flags)
 {
     ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
-    NVPtr pNv = NVPTR(pScrn);
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
 
     DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "NVEnterVT\n"));
 
-    vgaHWUnlock(hwp);
-    pNv->riva.LockUnlock(&pNv->riva, 0);
     if (!NVModeInit(pScrn, pScrn->currentMode))
         return FALSE;
     NVAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
@@ -600,13 +596,11 @@
 {
     ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
     NVPtr pNv = NVPTR(pScrn);
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
 
     DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "NVLeaveVT\n"));
 
     NVRestore(pScrn);
     pNv->riva.LockUnlock(&pNv->riva, 1);
-    vgaHWLock(hwp);
 }
 
 
@@ -645,7 +639,6 @@
 NVCloseScreen(int scrnIndex, ScreenPtr pScreen)
 {
     ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
-    vgaHWPtr hwp = VGAHWPTR(pScrn);
     NVPtr pNv = NVPTR(pScrn);
 
     DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "NVCloseScreen\n"));
@@ -653,7 +646,6 @@
     if (pScrn->vtSema) {
         NVRestore(pScrn);
         pNv->riva.LockUnlock(&pNv->riva, 1);
-        vgaHWLock(hwp);
     }
 
     NVUnmapMem(pScrn);
@@ -782,12 +774,10 @@
 static xf86MonPtr
 NVdoDDC(ScrnInfoPtr pScrn)
 {
-    vgaHWPtr hwp;
     NVPtr pNv;
     NVRamdacPtr NVdac;
     xf86MonPtr MonInfo = NULL;
 
-    hwp = VGAHWPTR(pScrn);
     pNv = NVPTR(pScrn);
     NVdac = &pNv->Dac;
 
@@ -800,7 +790,6 @@
     /*    if ((MonInfo = nvDoDDCVBE(pScrn))) return MonInfo;      */
 
     /* Enable access to extended registers */
-    vgaHWUnlock(hwp);
     pNv->riva.LockUnlock(&pNv->riva, 0);
     /* Save the current state */
     NVSave(pScrn);
@@ -814,7 +803,6 @@
     /* Restore previous state */
     NVRestore(pScrn);
     pNv->riva.LockUnlock(&pNv->riva, 1);
-    vgaHWLock(hwp);
 
     return MonInfo;
 }
@@ -1141,10 +1129,22 @@
         (((pScrn->mask.blue >> pScrn->offset.blue) - 1) << pScrn->offset.blue); 
     }
 
+    /* Doesn't work */
     if (xf86ReturnOptValBool(pNv->Options, OPTION_FLAT_PANEL, FALSE)) {
        pNv->FlatPanel = TRUE;
        xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "using flat panel\n");
     }
+
+    if (xf86GetOptValInteger(pNv->Options, OPTION_CRTC_NUMBER, 
+                                &pNv->forceCRTC)) 
+    {
+       if((pNv->forceCRTC < 0) || (pNv->forceCRTC > 1)) {
+           pNv->forceCRTC = -1;
+           xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, 
+                      "Invalid CRTC number.  Must be 0 or 1\n");
+        }
+    } else pNv->forceCRTC = -1;
+
     
     if (pNv->pEnt->device->MemBase != 0) {
        /* Require that the config file value matches one of the PCI values. */
@@ -1318,6 +1318,7 @@
         case NV_ARCH_04:
         case NV_ARCH_10:
         case NV_ARCH_20:
+        default:
             pNv->FbUsableSize -= 128 * 1024;
             break;
     }
@@ -1344,6 +1345,11 @@
        clockRanges->interlaceAllowed = FALSE;
     clockRanges->doubleScanAllowed = TRUE;
 
+    if(pNv->FlatPanel) {
+       clockRanges->interlaceAllowed = FALSE;
+       clockRanges->doubleScanAllowed = FALSE;
+    }
+
     /*
      * xf86ValidateModes will check that the mode HTotal and VTotal values
      * don't exceed the chipset's limit if pScrn->maxHValue and
@@ -1538,9 +1544,7 @@
 
 
 /*
- * Initialise a new mode.  This is currently still using the old
- * "initialise struct, restore/write struct to HW" model.  That could
- * be changed.
+ * Initialise a new mode. 
  */
 
 static Bool
@@ -1558,18 +1562,15 @@
        return FALSE;
     pScrn->vtSema = TRUE;
 
-    if ( pNv->ModeInit ) {
-        if (!(*pNv->ModeInit)(pScrn, mode))
-            return FALSE;
-    }
+    if(!(*pNv->ModeInit)(pScrn, mode))
+        return FALSE;
 
     /* Program the registers */
     vgaHWProtect(pScrn, TRUE);
     vgaReg = &hwp->ModeReg;
     nvReg = &pNv->ModeReg;
 
-    if ( pNv->Restore )
-        (*pNv->Restore)(pScrn, vgaReg, nvReg, FALSE);
+    (*pNv->Restore)(pScrn, vgaReg, nvReg, FALSE);
 
 #if X_BYTE_ORDER == X_BIG_ENDIAN
     /* turn on LFB swapping */
@@ -1606,10 +1607,7 @@
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVRestore\n"));
     /* Only restore text mode fonts/text for the primary card */
     vgaHWProtect(pScrn, TRUE);
-    if (pNv->Primary)
-        (*pNv->Restore)(pScrn, vgaReg, nvReg, TRUE);
-    else
-        vgaHWRestore(pScrn, vgaReg, VGA_SR_MODE);
+    (*pNv->Restore)(pScrn, vgaReg, nvReg, pNv->Primary);
     vgaHWProtect(pScrn, FALSE);
 }
 
@@ -1666,7 +1664,6 @@
            return FALSE;
     } else {
        /* Save the current state */
-        vgaHWUnlock(hwp);
         pNv->riva.LockUnlock(&pNv->riva, 0);
        NVSave(pScrn);
        /* Initialise the first mode */
@@ -1897,12 +1894,6 @@
     vgaRegPtr vgaReg = &pVga->SavedReg;
 
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVSave\n"));
-#if defined(__powerpc__)
-    /* The console driver will have to save the fonts, we can't */
-    vgaHWSave(pScrn, vgaReg, VGA_SR_CMAP | VGA_SR_MODE);
-#else
-    vgaHWSave(pScrn, vgaReg, VGA_SR_CMAP | VGA_SR_MODE | VGA_SR_FONTS);
-#endif
-    pNv->riva.UnloadStateExt(&pNv->riva, nvReg);
+    (*pNv->Save)(pScrn, vgaReg, nvReg, pNv->Primary);
 }
 
diff -uNr nv.orig/nv_local.h nv/nv_local.h
--- nv.orig/nv_local.h  Mon Feb 25 22:54:49 2002
+++ nv/nv_local.h       Mon Feb 25 22:54:45 2002
@@ -36,40 +36,39 @@
 |*     those rights set forth herein.                                        *|
 |*                                                                           *|
  \***************************************************************************/
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/nv_local.h,v 1.6 2000/11/03 
18:46:12 eich Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/nv/nv_local.h,v 1.7 2002/01/25 
+21:56:06 tsi Exp $ */
 
 #ifndef __NV_LOCAL_H__
 #define __NV_LOCAL_H__
+
 /*
- * This file includes any environment or machine specific values to access the HW.
- * Put all affected includes, typdefs, etc. here so the riva_hw.* files can stay
- * generic in nature.
+ * This file includes any environment or machine specific values to access the
+ * HW.  Put all affected includes, typdefs, etc. here so the riva_hw.* files
+ * can stay generic in nature.
  */ 
 #include "xf86_ansic.h"
 #include "compiler.h"
+#include "xf86_OSproc.h"
+
 /*
  * Typedefs to force certain sized values.
  */
 typedef unsigned char  U008;
 typedef unsigned short U016;
 typedef unsigned int   U032;
+
 /*
- * HW access macros.
+ * HW access macros.  These assume memory-mapped I/O, and not normal I/O space.
  */
-#include "xf86_OSproc.h"
-/* these assume memory-mapped I/O, and not normal I/O space */
 #define NV_WR08(p,i,d)  MMIO_OUT8((volatile pointer)(p), (i), (d))
 #define NV_RD08(p,i)    MMIO_IN8((volatile pointer)(p), (i))
 #define NV_WR16(p,i,d)  MMIO_OUT16((volatile pointer)(p), (i), (d))
 #define NV_RD16(p,i)    MMIO_IN16((volatile pointer)(p), (i))
 #define NV_WR32(p,i,d)  MMIO_OUT32((volatile pointer)(p), (i), (d))
 #define NV_RD32(p,i)    MMIO_IN32((volatile pointer)(p), (i))
-#if 1
+
+/* VGA I/O is now always done through MMIO */
 #define VGA_WR08(p,i,d) NV_WR08(p,i,d)
 #define VGA_RD08(p,i)   NV_RD08(p,i)
-#else
-#define VGA_WR08(p,i,d) outb(i,d)
-#define VGA_RD08(p,i)   inb(i)
-#endif
-#endif /* __NV_LOCAL_H__ */
 
+#endif /* __NV_LOCAL_H__ */
diff -uNr nv.orig/nv_setup.c nv/nv_setup.c
--- nv.orig/nv_setup.c  Mon Feb 25 22:54:49 2002
+++ nv/nv_setup.c       Mon Feb 25 22:55:47 2002
@@ -155,6 +155,69 @@
     return (VGA_RD08(pNv->riva.PDIO, VGA_DAC_DATA));
 }
 
+static Bool 
+NVIsConnected (ScrnInfoPtr pScrn, Bool second)
+{
+    NVPtr pNv = NVPTR(pScrn);
+    volatile U032 *PRAMDAC = pNv->riva.PRAMDAC0;
+    CARD32 reg52C, reg608;
+    Bool present;
+
+    if(second) PRAMDAC += 0x800;
+
+    reg52C = PRAMDAC[0x052C/4];
+    reg608 = PRAMDAC[0x0608/4];
+
+    PRAMDAC[0x0608/4] = reg608 & ~0x00010000;
+
+    PRAMDAC[0x052C/4] = reg52C & 0x0000FEEE;
+    usleep(1000);
+    PRAMDAC[0x052C/4] |= 1;
+
+    pNv->riva.PRAMDAC0[0x0610/4] = 0x94050140;
+    pNv->riva.PRAMDAC0[0x0608/4] |= 0x00001000;
+
+    usleep(1000);
+
+    present = (PRAMDAC[0x0608/4] & (1 << 28)) ? TRUE : FALSE;
+
+    pNv->riva.PRAMDAC0[0x0608/4] &= 0x0000EFFF;
+
+    PRAMDAC[0x052C/4] = reg52C;
+    PRAMDAC[0x0608/4] = reg608;
+
+    return present;
+}
+
+static void
+NVIsSecond (ScrnInfoPtr pScrn)
+{
+    NVPtr pNv = NVPTR(pScrn);
+
+    if(NVIsConnected(pScrn, 0)) {
+       if(pNv->riva.PRAMDAC0[0x0000052C/4] & 0x100)
+          pNv->SecondCRTC = TRUE;
+       else
+          pNv->SecondCRTC = FALSE;
+    } else 
+    if (NVIsConnected(pScrn, 1)) {
+       if(pNv->riva.PRAMDAC0[0x0000252C/4] & 0x100)
+          pNv->SecondCRTC = TRUE;
+       else
+          pNv->SecondCRTC = FALSE;
+    } else /* default */
+       pNv->SecondCRTC = FALSE;
+
+    xf86DrvMsg(pScrn->scrnIndex, X_INFO, 
+               "Detected CRTC controller %i being used\n",
+               pNv->SecondCRTC ? 1 : 0);
+
+    if(pNv->forceCRTC != -1) {
+        xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+                   "Forcing usage of CRTC %i\n", pNv->forceCRTC);
+        pNv->SecondCRTC = pNv->forceCRTC;
+    }
+}
 
 static void
 NVCommonSetup(ScrnInfoPtr pScrn)
@@ -216,9 +279,9 @@
 
     mmioFlags = VIDMEM_MMIO | VIDMEM_READSIDEEFFECT;
 
-    pNv->riva.PRAMDAC = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, pNv->PciTag,
+    pNv->riva.PRAMDAC0 = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, pNv->PciTag,
                                       regBase+0x00680000, 0x00003000);
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- PRAMDAC %x\n", pNv->riva.PRAMDAC));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- PRAMDAC %x\n", 
+pNv->riva.PRAMDAC0));
     pNv->riva.PFB     = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, pNv->PciTag,
                                       regBase+0x00100000, 0x00001000);
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- PFB %x\n", pNv->riva.PFB));
@@ -245,21 +308,50 @@
      * These registers are read/write as 8 bit values.  Probably have to map
      * sparse on alpha.
      */
-    pNv->riva.PCIO = (U008 *)xf86MapPciMem(pScrn->scrnIndex, mmioFlags,
+    pNv->riva.PCIO0 = (U008 *)xf86MapPciMem(pScrn->scrnIndex, mmioFlags,
                                            pNv->PciTag, regBase+0x00601000,
-                                           0x00001000);
-    pNv->riva.PDIO = (U008 *)xf86MapPciMem(pScrn->scrnIndex, mmioFlags,
+                                           0x00003000);
+    pNv->riva.PDIO0 = (U008 *)xf86MapPciMem(pScrn->scrnIndex, mmioFlags,
                                            pNv->PciTag, regBase+0x00681000,
-                                           0x00001000);
+                                           0x00003000);
     pNv->riva.PVIO = (U008 *)xf86MapPciMem(pScrn->scrnIndex, mmioFlags,
                                            pNv->PciTag, regBase+0x000C0000,
                                            0x00001000);
-    
+
+    switch(pNv->Chipset & 0x0ff0) {
+    case 0x0110:
+        if((pNv->Chipset & 0x0fff) == 0x0112)
+            pNv->SecondCRTC = TRUE;
+        break;
+    case 0x0170:
+    case 0x0250:
+        NVIsSecond(pScrn);
+        break;
+    default:
+        break;
+    }
+
+#if defined(__powerpc__)
+    if(pNv->FlatPanel)
+       pNv->SecondCRTC = TRUE;
+#endif
+
+    if(pNv->SecondCRTC) {
+       pNv->riva.PCIO = pNv->riva.PCIO0 + 0x2000;
+       pNv->riva.PCRTC = pNv->riva.PCRTC0 + 0x800;
+       pNv->riva.PRAMDAC = pNv->riva.PRAMDAC0 + 0x800;
+       pNv->riva.PDIO = pNv->riva.PDIO0 + 0x2000;
+    } else {
+       pNv->riva.PCIO = pNv->riva.PCIO0;
+       pNv->riva.PCRTC = pNv->riva.PCRTC0;
+       pNv->riva.PRAMDAC = pNv->riva.PRAMDAC0;
+       pNv->riva.PDIO = pNv->riva.PDIO0;
+    }
+
     RivaGetConfig(pNv);
 
     pNv->Dac.maxPixelClock = pNv->riva.MaxVClockFreqKHz;
 
-    vgaHWUnlock(VGAHWPTR(pScrn));
     pNv->riva.LockUnlock(&pNv->riva, 0);
 }
 
@@ -289,6 +381,7 @@
                                      frameBase+0x00C00000, 0x00008000);
             
     NVCommonSetup(pScrn);
+    pNv->riva.PCRTC = pNv->riva.PCRTC0 = pNv->riva.PGRAPH;
 }
 
 void
@@ -307,11 +400,12 @@
     mmioFlags = VIDMEM_MMIO | VIDMEM_READSIDEEFFECT;
     pNv->riva.PRAMIN = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, pNv->PciTag,
                                      regBase+0x00710000, 0x00010000);
-    pNv->riva.PCRTC  = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, pNv->PciTag,
+    pNv->riva.PCRTC0 = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, pNv->PciTag,
                                      regBase+0x00600000, 0x00001000);
 
     NVCommonSetup(pScrn);
 }
+
 void
 NV10Setup(ScrnInfoPtr pScrn)
 {
@@ -322,14 +416,11 @@
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NV10Setup\n"));
 
     pNv->riva.Architecture = 0x10;
-    /*
-     * Map chip-specific memory-mapped registers. This MUST be done in the OS 
specific driver code.
-     */
     mmioFlags = VIDMEM_MMIO | VIDMEM_READSIDEEFFECT;
     pNv->riva.PRAMIN = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, pNv->PciTag,
                                      regBase+0x00710000, 0x00010000);
-    pNv->riva.PCRTC  = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, pNv->PciTag,
-                                     regBase+0x00600000, 0x00001000);
+    pNv->riva.PCRTC0 = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, pNv->PciTag,
+                                     regBase+0x00600000, 0x00003000);
 
     NVCommonSetup(pScrn);
 }
@@ -341,18 +432,14 @@
     CARD32 regBase = pNv->IOAddress;
     int mmioFlags;
 
-    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NV10Setup\n"));
+    DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NV20Setup\n"));
 
     pNv->riva.Architecture = 0x20;
-    /*
-     * Map chip-specific memory-mapped registers. This MUST be done in the OS sp
-ecific driver code.
-     */
     mmioFlags = VIDMEM_MMIO | VIDMEM_READSIDEEFFECT;
     pNv->riva.PRAMIN = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, pNv->PciTag,
                                      regBase+0x00710000, 0x00010000);
-    pNv->riva.PCRTC  = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, pNv->PciTag,
-                                     regBase+0x00600000, 0x00001000);
+    pNv->riva.PCRTC0 = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, pNv->PciTag,
+                                     regBase+0x00600000, 0x00003000);
 
     NVCommonSetup(pScrn);
 }
diff -uNr nv.orig/nv_type.h nv/nv_type.h
--- nv.orig/nv_type.h   Mon Feb 25 22:54:49 2002
+++ nv/nv_type.h        Mon Feb 25 22:54:45 2002
@@ -114,6 +114,8 @@
     XF86VideoAdaptorPtr        overlayAdaptor;
     int                        videoKey;
     Bool               FlatPanel;
+    Bool               SecondCRTC;
+    int                        forceCRTC;
     OptionInfoPtr      Options;
 } NVRec, *NVPtr;
 
diff -uNr nv.orig/nvreg.h nv/nvreg.h
--- nv.orig/nvreg.h     Mon Feb 25 22:54:49 2002
+++ nv/nvreg.h  Mon Feb 25 22:54:45 2002
@@ -164,18 +164,9 @@
   (PDAC_Write(INDEX_HI,((NV_PDAC_EXT_##reg) >> 8) & 0xff)),\
   (PDAC_Write(INDEX_DATA,(value))))
 
-#define CRTC_Write(index,value) outb(0x3d4,(index));outb(0x3d5,value)
-#define CRTC_Read(index) (outb(0x3d4,index),inb(0x3d5))
-
-#define PCRTC_Write(index,value) CRTC_Write(NV_PCRTC_##index,value)
-#define PCRTC_Read(index) CRTC_Read(NV_PCRTC_##index)
-
 #define PCRTC_Def(mask,value)          DEVICE_DEF(PCRTC,mask,value)
 #define PCRTC_Val(mask,value)          DEVICE_VALUE(PCRTC,mask,value)
 #define PCRTC_Mask(mask)               DEVICE_MASK(PCRTC,mask)
-
-#define SR_Write(index,value) outb(0x3c4,(index));outb(0x3c5,value)
-#define SR_Read(index) (outb(0x3c4,index),inb(0x3c5))
 
 
 /* These are the variables which actually point at the register blocks */
diff -uNr nv.orig/riva_hw.c nv/riva_hw.c
--- nv.orig/riva_hw.c   Mon Feb 25 22:54:49 2002
+++ nv/riva_hw.c        Mon Feb 25 22:54:45 2002
@@ -70,34 +70,40 @@
 {
     return ((chip->Rop->FifoFree < chip->FifoEmptyCount) || 
(chip->PGRAPH[0x00000700/4] & 0x01));
 }
-static void nv3LockUnlock
+static void vgaLockUnlock
 (
     RIVA_HW_INST *chip,
-    int           LockUnlock
+    Bool           Lock
 )
 {
-    VGA_WR08(chip->PVIO, 0x3C4, 0x06);
-    VGA_WR08(chip->PVIO, 0x3C5, LockUnlock ? 0x99 : 0x57);
+    CARD8 cr11;
+    VGA_WR08(chip->PCIO, 0x3D4, 0x11);
+    cr11 = VGA_RD08(chip->PCIO, 0x3D5);
+    if(Lock) cr11 |= 0x80;
+    else cr11 &= ~0x80;
+    VGA_WR08(chip->PCIO, 0x3D5, cr11);
 }
-static void nv4LockUnlock
+
+static void nv3LockUnlock
 (
     RIVA_HW_INST *chip,
-    int           LockUnlock
+    Bool           Lock
 )
 {
-    VGA_WR08(chip->PCIO, 0x3D4, 0x1F);
-    VGA_WR08(chip->PCIO, 0x3D5, LockUnlock ? 0x99 : 0x57);
+    VGA_WR08(chip->PVIO, 0x3C4, 0x06);
+    VGA_WR08(chip->PVIO, 0x3C5, Lock ? 0x99 : 0x57);
+    vgaLockUnlock(chip, Lock);
 }
-static void nv10LockUnlock
+static void nv4LockUnlock
 (
     RIVA_HW_INST *chip,
-    int           LockUnlock
+    Bool           Lock
 )
 {
     VGA_WR08(chip->PCIO, 0x3D4, 0x1F);
-    VGA_WR08(chip->PCIO, 0x3D5, LockUnlock ? 0x99 : 0x57);
+    VGA_WR08(chip->PCIO, 0x3D5, Lock ? 0x99 : 0x57);
+    vgaLockUnlock(chip, Lock);
 }
-
 static int ShowHideCursor
 (
     RIVA_HW_INST *chip,
@@ -601,7 +607,7 @@
     nv3_sim_state sim_data;
     unsigned int M, N, P, pll, MClk;
     
-    pll = chip->PRAMDAC[0x00000504/4];
+    pll = chip->PRAMDAC0[0x00000504/4];
     M = (pll >> 0) & 0xFF; N = (pll >> 8) & 0xFF; P = (pll >> 16) & 0x0F;
     MClk = (N * chip->CrystalFreqKHz / M) >> P;
     sim_data.pix_bpp        = (char)pixelDepth;
@@ -788,10 +794,10 @@
     nv4_sim_state sim_data;
     unsigned int M, N, P, pll, MClk, NVClk, cfg1;
 
-    pll = chip->PRAMDAC[0x00000504/4];
+    pll = chip->PRAMDAC0[0x00000504/4];
     M = (pll >> 0)  & 0xFF; N = (pll >> 8)  & 0xFF; P = (pll >> 16) & 0x0F;
     MClk  = (N * chip->CrystalFreqKHz / M) >> P;
-    pll = chip->PRAMDAC[0x00000500/4];
+    pll = chip->PRAMDAC0[0x00000500/4];
     M = (pll >> 0)  & 0xFF; N = (pll >> 8)  & 0xFF; P = (pll >> 16) & 0x0F;
     NVClk  = (N * chip->CrystalFreqKHz / M) >> P;
     cfg1 = chip->PFB[0x00000204/4];
@@ -1049,10 +1055,10 @@
     nv10_sim_state sim_data;
     unsigned int M, N, P, pll, MClk, NVClk, cfg1;
 
-    pll = chip->PRAMDAC[0x00000504/4];
+    pll = chip->PRAMDAC0[0x00000504/4];
     M = (pll >> 0)  & 0xFF; N = (pll >> 8)  & 0xFF; P = (pll >> 16) & 0x0F;
     MClk  = (N * chip->CrystalFreqKHz / M) >> P;
-    pll = chip->PRAMDAC[0x00000500/4];
+    pll = chip->PRAMDAC0[0x00000500/4];
     M = (pll >> 0)  & 0xFF; N = (pll >> 8)  & 0xFF; P = (pll >> 16) & 0x0F;
     NVClk  = (N * chip->CrystalFreqKHz / M) >> P;
     cfg1 = chip->PFB[0x00000204/4];
@@ -1272,18 +1278,10 @@
     {
         case NV_ARCH_04:
             LOAD_FIXED_STATE(nv4,FIFO);
-            chip->Tri03 = 0L;
-            chip->Tri05 = (RivaTexturedTriangle05 *)&(chip->FIFO[0x0000E000/4]);
             break;
         case NV_ARCH_10:
         case NV_ARCH_20:
-            /*
-             * Initialize state for the RivaTriangle3D05 routines.
-             */
-            LOAD_FIXED_STATE(nv10tri05,PGRAPH);
             LOAD_FIXED_STATE(nv10,FIFO);
-            chip->Tri03 = 0L;
-            chip->Tri05 = (RivaTexturedTriangle05 *)&(chip->FIFO[0x0000E000/4]);
             break;
     }
 }
@@ -1316,19 +1314,16 @@
                 case 16:
                     LOAD_FIXED_STATE_15BPP(nv3,PRAMIN);
                     LOAD_FIXED_STATE_15BPP(nv3,PGRAPH);
-                    chip->Tri03 = (RivaTexturedTriangle03  
*)&(chip->FIFO[0x0000E000/4]);
                     break;
                 case 24:
                 case 32:
                     LOAD_FIXED_STATE_32BPP(nv3,PRAMIN);
                     LOAD_FIXED_STATE_32BPP(nv3,PGRAPH);
-                    chip->Tri03 = 0L;
                     break;
                 case 8:
                 default:
                     LOAD_FIXED_STATE_8BPP(nv3,PRAMIN);
                     LOAD_FIXED_STATE_8BPP(nv3,PGRAPH);
-                    chip->Tri03 = 0L;
                     break;
             }
             for (i = 0x00000; i < 0x00800; i++)
@@ -1355,24 +1350,20 @@
                 case 15:
                     LOAD_FIXED_STATE_15BPP(nv4,PRAMIN);
                     LOAD_FIXED_STATE_15BPP(nv4,PGRAPH);
-                    chip->Tri03 = (RivaTexturedTriangle03  
*)&(chip->FIFO[0x0000E000/4]);
                     break;
                 case 16:
                     LOAD_FIXED_STATE_16BPP(nv4,PRAMIN);
                     LOAD_FIXED_STATE_16BPP(nv4,PGRAPH);
-                    chip->Tri03 = (RivaTexturedTriangle03  
*)&(chip->FIFO[0x0000E000/4]);
                     break;
                 case 24:
                 case 32:
                     LOAD_FIXED_STATE_32BPP(nv4,PRAMIN);
                     LOAD_FIXED_STATE_32BPP(nv4,PGRAPH);
-                    chip->Tri03 = 0L;
                     break;
                 case 8:
                 default:
                     LOAD_FIXED_STATE_8BPP(nv4,PRAMIN);
                     LOAD_FIXED_STATE_8BPP(nv4,PGRAPH);
-                    chip->Tri03 = 0L;
                     break;
             }
             chip->PGRAPH[0x00000640/4] = state->offset0;
@@ -1386,6 +1377,12 @@
             break;
         case NV_ARCH_10:
         case NV_ARCH_20:
+            if(chip->twoHeads) {
+               VGA_WR08(chip->PCIO, 0x03D4, 0x44);
+               VGA_WR08(chip->PCIO, 0x03D5, state->crtcOwner);
+               chip->LockUnlock(chip, 0);
+            }
+
             LOAD_FIXED_STATE(nv10,PFIFO);
             LOAD_FIXED_STATE(nv10,PRAMIN);
             LOAD_FIXED_STATE(nv10,PGRAPH);
@@ -1394,24 +1391,20 @@
                 case 15:
                     LOAD_FIXED_STATE_15BPP(nv10,PRAMIN);
                     LOAD_FIXED_STATE_15BPP(nv10,PGRAPH);
-                    chip->Tri03 = (RivaTexturedTriangle03  
*)&(chip->FIFO[0x0000E000/4]);
                     break;
                 case 16:
                     LOAD_FIXED_STATE_16BPP(nv10,PRAMIN);
                     LOAD_FIXED_STATE_16BPP(nv10,PGRAPH);
-                    chip->Tri03 = (RivaTexturedTriangle03  
*)&(chip->FIFO[0x0000E000/4]);
                     break;
                 case 24:
                 case 32:
                     LOAD_FIXED_STATE_32BPP(nv10,PRAMIN);
                     LOAD_FIXED_STATE_32BPP(nv10,PGRAPH);
-                    chip->Tri03 = 0L;
                     break;
                 case 8:
                 default:
                     LOAD_FIXED_STATE_8BPP(nv10,PRAMIN);
                     LOAD_FIXED_STATE_8BPP(nv10,PGRAPH);
-                    chip->Tri03 = 0L;
                     break;
             }
 
@@ -1438,11 +1431,12 @@
                 chip->PGRAPH[0x00000864/4] = state->pitch3;
                 chip->PGRAPH[0x000009A4/4] = chip->PFB[0x00000200/4]; 
                 chip->PGRAPH[0x000009A8/4] = chip->PFB[0x00000204/4];
-                chip->PRAMDAC[0x0000052C/4] = 0x00000101;
-                chip->PRAMDAC[0x0000252C/4] = 0x00000001;
            }
+            if(chip->twoHeads) {
+               chip->PCRTC0[0x00000860/4] = state->head;
+               chip->PCRTC0[0x00002860/4] = state->head2;
+            }
             chip->PRAMDAC[0x00000404/4] |= (1 << 25);
-            chip->PRAMDAC[0x00002404/4] |= (1 << 25);
 
            chip->PMC[0x00008704/4] = 1;
            chip->PMC[0x00008140/4] = 0;
@@ -1450,6 +1444,7 @@
            chip->PMC[0x00008924/4] = 0;
            chip->PMC[0x00008908/4] = 0x01ffffff;
            chip->PMC[0x0000890C/4] = 0x01ffffff;
+            chip->PMC[0x00001588/4] = 0;
 
             chip->PFB[0x00000240/4] = 0;
             chip->PFB[0x00000244/4] = 0;
@@ -1533,14 +1528,24 @@
             chip->PGRAPH[0x00000F50/4] = 0x00000040;
             for (i = 0; i < 4; i++)
                 chip->PGRAPH[0x00000F54/4] = 0x00000000;
+
+            if(chip->flatPanel) {
+               VGA_WR08(chip->PCIO, 0x03D4, 0x53);
+               VGA_WR08(chip->PCIO, 0x03D5, 0);
+               VGA_WR08(chip->PCIO, 0x03D4, 0x54);
+               VGA_WR08(chip->PCIO, 0x03D5, 0);
+               VGA_WR08(chip->PCIO, 0x03D4, 0x21);
+               VGA_WR08(chip->PCIO, 0x03D5, 0xfa);
+            }
             break;
     }
+
     LOAD_FIXED_STATE(Riva,FIFO);
     UpdateFifoState(chip);
+
     /*
      * Load HW mode state.
      */
-
     VGA_WR08(chip->PCIO, 0x03D4, 0x19);
     VGA_WR08(chip->PCIO, 0x03D5, state->repaint0);
     VGA_WR08(chip->PCIO, 0x03D4, 0x1A);
@@ -1565,14 +1570,21 @@
     VGA_WR08(chip->PCIO, 0x03D5, state->interlace);
     VGA_WR08(chip->PCIO, 0x03D4, 0x41);
     VGA_WR08(chip->PCIO, 0x03D5, state->extra);
-    chip->PRAMDAC[0x00000508/4]  = state->vpll;
-    chip->PRAMDAC[0x0000050C/4]  = state->pllsel;
+
+    if(!chip->flatPanel) {
+       chip->PRAMDAC0[0x00000508/4] = state->vpll;
+       chip->PRAMDAC0[0x00000520/4] = state->vpll2;
+       chip->PRAMDAC0[0x0000050C/4] = state->pllsel;
+    } else {
+       chip->PRAMDAC[0x00000848/4]  = state->scale;
+    }
     chip->PRAMDAC[0x00000600/4]  = state->general;
+
     /*
      * Turn off VBlank enable and reset.
      */
-    *(chip->VBLANKENABLE) = 0;
-    *(chip->VBLANK)       = chip->VBlankBit;
+    chip->PCRTC[0x00000140/4] = 0;
+    chip->PCRTC[0x00000100/4] = chip->VBlankBit;
     /*
      * Set interrupt enable.
      */    
@@ -1588,6 +1600,7 @@
     /* Free count from first subchannel */
     chip->FifoEmptyCount = chip->Rop->FifoFree; 
 }
+
 static void UnloadStateExt
 (
     RIVA_HW_INST  *chip,
@@ -1621,10 +1634,13 @@
     state->interlace    = VGA_RD08(chip->PCIO, 0x03D5);
     VGA_WR08(chip->PCIO, 0x03D4, 0x41);
     state->extra        = VGA_RD08(chip->PCIO, 0x03D5);
-    state->vpll         = chip->PRAMDAC[0x00000508/4];
-    state->pllsel       = chip->PRAMDAC[0x0000050C/4];
+    state->vpll         = chip->PRAMDAC0[0x00000508/4];
+    state->vpll2        = chip->PRAMDAC0[0x00000520/4];
+    state->pllsel       = chip->PRAMDAC0[0x0000050C/4];
     state->general      = chip->PRAMDAC[0x00000600/4];
+    state->scale        = chip->PRAMDAC[0x00000848/4];
     state->config       = chip->PFB[0x00000200/4];
+
     switch (chip->Architecture)
     {
         case NV_ARCH_03:
@@ -1657,6 +1673,13 @@
             state->pitch1   = chip->PGRAPH[0x00000674/4];
             state->pitch2   = chip->PGRAPH[0x00000678/4];
             state->pitch3   = chip->PGRAPH[0x0000067C/4];
+            if(chip->twoHeads) {
+               state->head     = chip->PCRTC0[0x00000860/4];
+               state->head2    = chip->PCRTC0[0x00002860/4];
+               VGA_WR08(chip->PCIO, 0x03D4, 0x44);
+               state->crtcOwner = VGA_RD08(chip->PCIO, 0x03D5);
+            }
+
             break;
     }
 }
@@ -1666,6 +1689,15 @@
     unsigned      start
 )
 {
+    chip->PCRTC[0x800/4] = start;
+}
+
+static void SetStartAddress3
+(
+    RIVA_HW_INST *chip,
+    unsigned      start
+)
+{
     int offset = start >> 2;
     int pan    = (start & 3) << 1;
     unsigned char tmp;
@@ -1692,99 +1724,6 @@
     VGA_WR08(chip->PCIO, 0x3C0, 0x13);
     VGA_WR08(chip->PCIO, 0x3C0, pan);
 }
-static void nv3SetSurfaces2D
-(
-    RIVA_HW_INST *chip,
-    unsigned     surf0,
-    unsigned     surf1
-)
-{
-    RivaSurface *Surface = (RivaSurface *)&(chip->FIFO[0x0000E000/4]);
-
-    RIVA_FIFO_FREE(*chip,Tri03,5);
-    chip->FIFO[0x00003800] = 0x80000003;
-    Surface->Offset        = surf0;
-    chip->FIFO[0x00003800] = 0x80000004;
-    Surface->Offset        = surf1;
-    chip->FIFO[0x00003800] = 0x80000013;
-}
-static void nv4SetSurfaces2D
-(
-    RIVA_HW_INST *chip,
-    unsigned     surf0,
-    unsigned     surf1
-)
-{
-    RivaSurface *Surface = (RivaSurface *)&(chip->FIFO[0x0000E000/4]);
-
-    chip->FIFO[0x00003800] = 0x80000003;
-    Surface->Offset        = surf0;
-    chip->FIFO[0x00003800] = 0x80000004;
-    Surface->Offset        = surf1;
-    chip->FIFO[0x00003800] = 0x80000014;
-}
-static void nv10SetSurfaces2D
-(
-    RIVA_HW_INST *chip,
-    unsigned     surf0,
-    unsigned     surf1
-)
-{
-    RivaSurface *Surface = (RivaSurface *)&(chip->FIFO[0x0000E000/4]);
-
-    chip->FIFO[0x00003800] = 0x80000003;
-    Surface->Offset        = surf0;
-    chip->FIFO[0x00003800] = 0x80000004;
-    Surface->Offset        = surf1;
-    chip->FIFO[0x00003800] = 0x80000014;
-}
-static void nv3SetSurfaces3D
-(
-    RIVA_HW_INST *chip,
-    unsigned     surf0,
-    unsigned     surf1
-)
-{
-    RivaSurface *Surface = (RivaSurface *)&(chip->FIFO[0x0000E000/4]);
-
-    RIVA_FIFO_FREE(*chip,Tri03,5);
-    chip->FIFO[0x00003800] = 0x80000005;
-    Surface->Offset        = surf0;
-    chip->FIFO[0x00003800] = 0x80000006;
-    Surface->Offset        = surf1;
-    chip->FIFO[0x00003800] = 0x80000013;
-}
-static void nv4SetSurfaces3D
-(
-    RIVA_HW_INST *chip,
-    unsigned     surf0,
-    unsigned     surf1
-)
-{
-    RivaSurface *Surface = (RivaSurface *)&(chip->FIFO[0x0000E000/4]);
-
-    chip->FIFO[0x00003800] = 0x80000005;
-    Surface->Offset        = surf0;
-    chip->FIFO[0x00003800] = 0x80000006;
-    Surface->Offset        = surf1;
-    chip->FIFO[0x00003800] = 0x80000014;
-}
-static void nv10SetSurfaces3D
-(
-    RIVA_HW_INST *chip,
-    unsigned     surf0,
-    unsigned     surf1
-)
-{
-    RivaSurface3D *Surfaces3D = (RivaSurface3D *)&(chip->FIFO[0x0000E000/4]);
-
-    RIVA_FIFO_FREE(*chip,Tri03,4);
-    chip->FIFO[0x00003800]         = 0x80000007;
-    Surfaces3D->RenderBufferOffset = surf0;
-    Surfaces3D->ZBufferOffset      = surf1;
-    chip->FIFO[0x00003800]         = 0x80000014;
-}
-
 /****************************************************************************\
 *                                                                            *
 *                      Probe RIVA Chip Configuration                         *
@@ -1848,9 +1787,6 @@
     }        
     chip->CrystalFreqKHz   = (chip->PEXTDEV[0x00000000/4] & 0x00000040) ? 14318 : 
13500;
     chip->CURSOR           = &(chip->PRAMIN[0x00008000/4 - 0x0800/4]);
-    chip->CURSORPOS        = &(chip->PRAMDAC[0x0300/4]);
-    chip->VBLANKENABLE     = &(chip->PGRAPH[0x0140/4]);
-    chip->VBLANK           = &(chip->PGRAPH[0x0100/4]);
     chip->VBlankBit        = 0x00000100;
     chip->MaxVClockFreqKHz = 256000;
     /*
@@ -1861,9 +1797,7 @@
     chip->CalcStateExt    = CalcStateExt;
     chip->LoadStateExt    = LoadStateExt;
     chip->UnloadStateExt  = UnloadStateExt;
-    chip->SetStartAddress = SetStartAddress;
-    chip->SetSurfaces2D   = nv3SetSurfaces2D;
-    chip->SetSurfaces3D   = nv3SetSurfaces3D;
+    chip->SetStartAddress = SetStartAddress3;
     chip->LockUnlock      = nv3LockUnlock;
 }
 static void nv4GetConfig
@@ -1909,9 +1843,6 @@
     }
     chip->CrystalFreqKHz   = (chip->PEXTDEV[0x00000000/4] & 0x00000040) ? 14318 : 
13500;
     chip->CURSOR           = &(chip->PRAMIN[0x00010000/4 - 0x0800/4]);
-    chip->CURSORPOS        = &(chip->PRAMDAC[0x0300/4]);
-    chip->VBLANKENABLE     = &(chip->PCRTC[0x0140/4]);
-    chip->VBLANK           = &(chip->PCRTC[0x0100/4]);
     chip->VBlankBit        = 0x00000001;
     chip->MaxVClockFreqKHz = 350000;
     /*
@@ -1923,8 +1854,6 @@
     chip->LoadStateExt    = LoadStateExt;
     chip->UnloadStateExt  = UnloadStateExt;
     chip->SetStartAddress = SetStartAddress;
-    chip->SetSurfaces2D   = nv4SetSurfaces2D;
-    chip->SetSurfaces3D   = nv4SetSurfaces3D;
     chip->LockUnlock      = nv4LockUnlock;
 }
 static void nv10GetConfig
@@ -1989,9 +1918,6 @@
                                                                      13500;
     chip->CursorStart      = (chip->RamAmountKBytes - 128) * 1024;
     chip->CURSOR           = NULL;  /* can't set this here */
-    chip->CURSORPOS        = &(chip->PRAMDAC[0x0300/4]);
-    chip->VBLANKENABLE     = &(chip->PCRTC[0x0140/4]);
-    chip->VBLANK           = &(chip->PCRTC[0x0100/4]);
     chip->VBlankBit        = 0x00000001;
     chip->MaxVClockFreqKHz = 350000;
     /*
@@ -2003,9 +1929,18 @@
     chip->LoadStateExt    = LoadStateExt;
     chip->UnloadStateExt  = UnloadStateExt;
     chip->SetStartAddress = SetStartAddress;
-    chip->SetSurfaces2D   = nv10SetSurfaces2D;
-    chip->SetSurfaces3D   = nv10SetSurfaces3D;
-    chip->LockUnlock      = nv10LockUnlock;
+    chip->LockUnlock      = nv4LockUnlock;
+
+    switch(pNv->Chipset & 0x0ff0) {
+    case 0x0110:
+    case 0x0170:
+    case 0x0250:
+        chip->twoHeads = TRUE;
+        break;
+    default:
+        chip->twoHeads = FALSE;
+        break;
+    }
 }
 int RivaGetConfig
 (
@@ -2035,6 +1970,7 @@
         default:
             return (-1);
     }
+    chip->flatPanel = pNv->FlatPanel;
     /*
      * Fill in FIFO pointers.
      */
@@ -2045,7 +1981,6 @@
     chip->Blt    = (RivaScreenBlt           *)&(chip->FIFO[0x00008000/4]);
     chip->Bitmap = (RivaBitmap              *)&(chip->FIFO[0x0000A000/4]);
     chip->Line   = (RivaLine                *)&(chip->FIFO[0x0000C000/4]);
-    chip->Tri03  = (RivaTexturedTriangle03  *)&(chip->FIFO[0x0000E000/4]);
     return (0);
 }
 
diff -uNr nv.orig/riva_hw.h nv/riva_hw.h
--- nv.orig/riva_hw.h   Mon Feb 25 22:54:49 2002
+++ nv/riva_hw.h        Mon Feb 25 22:54:45 2002
@@ -225,74 +225,6 @@
     U032 MonochromeData01E;
 } RivaBitmap;
 /*
- * 3D textured, Z buffered triangle.
- */
-typedef volatile struct
-{
-    U032 reserved00[4];
-#if X_BYTE_ORDER == X_BIG_ENDIAN
-    U032 FifoFree;
-#else
-    U016 FifoFree;
-    U016 Nop;
-#endif
-    U032 reserved01[0x0BC];
-    U032 TextureOffset;
-    U032 TextureFormat;
-    U032 TextureFilter;
-    U032 FogColor;
-/* This is a problem on LynxOS */
-#ifdef Control
-#undef Control
-#endif
-    U032 Control;
-    U032 AlphaTest;
-    U032 reserved02[0x339];
-    U032 FogAndIndex;
-    U032 Color;
-    float ScreenX;
-    float ScreenY;
-    float ScreenZ;
-    float EyeM;
-    float TextureS;
-    float TextureT;
-} RivaTexturedTriangle03;
-typedef volatile struct
-{
-    U032 reserved00[4];
-#if X_BYTE_ORDER == X_BIG_ENDIAN
-    U032 FifoFree;
-#else
-    U016 FifoFree;
-    U016 Nop;
-#endif
-    U032 reserved01[0x0BB];
-    U032 ColorKey;
-    U032 TextureOffset;
-    U032 TextureFormat;
-    U032 TextureFilter;
-    U032 Blend;
-/* This is a problem on LynxOS */
-#ifdef Control
-#undef Control
-#endif
-    U032 Control;
-    U032 FogColor;
-    U032 reserved02[0x39];
-    struct
-    {
-        float ScreenX;
-        float ScreenY;
-        float ScreenZ;
-        float EyeM;
-        U032 Color;
-        U032 Specular;
-        float TextureS;
-        float TextureT;
-    } Vertex[16];
-    U032 DrawTriangle3D;
-} RivaTexturedTriangle05;
-/*
  * 2D line.
  */
 typedef volatile struct
@@ -385,11 +317,14 @@
     U032 FifoFreeCount;
     U032 FifoEmptyCount;
     U032 CursorStart;
+    Bool flatPanel;
+    Bool twoHeads;
     /*
      * Non-FIFO registers.
      */
+    volatile U032 *PCRTC0;
     volatile U032 *PCRTC;
-    volatile U032 *PRAMDAC;
+    volatile U032 *PRAMDAC0;
     volatile U032 *PFB;
     volatile U032 *PFIFO;
     volatile U032 *PGRAPH;
@@ -399,12 +334,12 @@
     volatile U032 *PRAMIN;
     volatile U032 *FIFO;
     volatile U032 *CURSOR;
-    volatile U032 *CURSORPOS;
-    volatile U032 *VBLANKENABLE;
-    volatile U032 *VBLANK;
+    volatile U008 *PCIO0;
     volatile U008 *PCIO;
     volatile U008 *PVIO;
+    volatile U008 *PDIO0;
     volatile U008 *PDIO;
+    volatile U032 *PRAMDAC;
     /*
      * Common chip functions.
      */
@@ -413,8 +348,6 @@
     void (*LoadStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *);
     void (*UnloadStateExt)(struct _riva_hw_inst *,struct _riva_hw_state *);
     void (*SetStartAddress)(struct _riva_hw_inst *,U032);
-    void (*SetSurfaces2D)(struct _riva_hw_inst *,U032,U032);
-    void (*SetSurfaces3D)(struct _riva_hw_inst *,U032,U032);
     int  (*ShowHideCursor)(struct _riva_hw_inst *,int);
     void (*LockUnlock)(struct _riva_hw_inst *, int);
     /*
@@ -431,8 +364,6 @@
     RivaScreenBlt           *Blt;
     RivaBitmap              *Bitmap;
     RivaLine                *Line;
-    RivaTexturedTriangle03  *Tri03;
-    RivaTexturedTriangle05  *Tri05;
 } RIVA_HW_INST;
 /*
  * Extended mode state information.
@@ -446,14 +377,19 @@
     U032 repaint0;
     U032 repaint1;
     U032 screen;
+    U032 scale;
     U032 extra;
     U032 pixel;
     U032 horiz;
     U032 arbitration0;
     U032 arbitration1;
     U032 vpll;
+    U032 vpll2;
     U032 pllsel;
     U032 general;
+    U032 crtcOwner;
+    U032 head; 
+    U032 head2; 
     U032 config;
     U032 cursor0;
     U032 cursor1;
diff -uNr nv.orig/riva_tbl.h nv/riva_tbl.h
--- nv.orig/riva_tbl.h  Mon Feb 25 22:54:49 2002
+++ nv/riva_tbl.h       Mon Feb 25 22:54:45 2002
@@ -633,180 +633,6 @@
     {0x000001C9, 0x0077D777},
     {0x00000186, 0x000070E5},
     {0x0000020C, 0x0E0D0D0D}
-};
-static unsigned nv10tri05TablePGRAPH[][2] =
-{
-    {(0x00000E00/4), 0x00000000},
-    {(0x00000E04/4), 0x00000000},
-    {(0x00000E08/4), 0x00000000},
-    {(0x00000E0C/4), 0x00000000},
-    {(0x00000E10/4), 0x00001000},
-    {(0x00000E14/4), 0x00001000},
-    {(0x00000E18/4), 0x4003ff80},
-    {(0x00000E1C/4), 0x00000000},
-    {(0x00000E20/4), 0x00000000},
-    {(0x00000E24/4), 0x00000000},
-    {(0x00000E28/4), 0x00000000},
-    {(0x00000E2C/4), 0x00000000},
-    {(0x00000E30/4), 0x00080008},
-    {(0x00000E34/4), 0x00080008},
-    {(0x00000E38/4), 0x00000000},
-    {(0x00000E3C/4), 0x00000000},
-    {(0x00000E40/4), 0x00000000},
-    {(0x00000E44/4), 0x00000000},
-    {(0x00000E48/4), 0x00000000},
-    {(0x00000E4C/4), 0x00000000},
-    {(0x00000E50/4), 0x00000000},
-    {(0x00000E54/4), 0x00000000},
-    {(0x00000E58/4), 0x00000000},
-    {(0x00000E5C/4), 0x00000000},
-    {(0x00000E60/4), 0x00000000},
-    {(0x00000E64/4), 0x10000000},
-    {(0x00000E68/4), 0x00000000},
-    {(0x00000E6C/4), 0x00000000},
-    {(0x00000E70/4), 0x00000000},
-    {(0x00000E74/4), 0x00000000},
-    {(0x00000E78/4), 0x00000000},
-    {(0x00000E7C/4), 0x00000000},
-    {(0x00000E80/4), 0x00000000},
-    {(0x00000E84/4), 0x00000000},
-    {(0x00000E88/4), 0x08000000},
-    {(0x00000E8C/4), 0x00000000},
-    {(0x00000E90/4), 0x00000000},
-    {(0x00000E94/4), 0x00000000},
-    {(0x00000E98/4), 0x00000000},
-    {(0x00000E9C/4), 0x4B7FFFFF},
-    {(0x00000EA0/4), 0x00000000},
-    {(0x00000EA4/4), 0x00000000},
-    {(0x00000EA8/4), 0x00000000},
-    {(0x00000F00/4), 0x07FF0800},
-    {(0x00000F04/4), 0x07FF0800},
-    {(0x00000F08/4), 0x07FF0800},
-    {(0x00000F0C/4), 0x07FF0800},
-    {(0x00000F10/4), 0x07FF0800},
-    {(0x00000F14/4), 0x07FF0800},
-    {(0x00000F18/4), 0x07FF0800},
-    {(0x00000F1C/4), 0x07FF0800},
-    {(0x00000F20/4), 0x07FF0800},
-    {(0x00000F24/4), 0x07FF0800},
-    {(0x00000F28/4), 0x07FF0800},
-    {(0x00000F2C/4), 0x07FF0800},
-    {(0x00000F30/4), 0x07FF0800},
-    {(0x00000F34/4), 0x07FF0800},
-    {(0x00000F38/4), 0x07FF0800},
-    {(0x00000F3C/4), 0x07FF0800},
-    {(0x00000F40/4), 0x10000000},
-    {(0x00000F44/4), 0x00000000},
-    {(0x00000F50/4), 0x00006740},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F50/4), 0x00006750},
-    {(0x00000F54/4), 0x40000000},
-    {(0x00000F54/4), 0x40000000},
-    {(0x00000F54/4), 0x40000000},
-    {(0x00000F54/4), 0x40000000},
-    {(0x00000F50/4), 0x00006760},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F50/4), 0x00006770},
-    {(0x00000F54/4), 0xC5000000},
-    {(0x00000F54/4), 0xC5000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F50/4), 0x00006780},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F50/4), 0x000067A0},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F50/4), 0x00006AB0},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F50/4), 0x00006AC0},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F50/4), 0x00006C10},
-    {(0x00000F54/4), 0xBF800000},
-    {(0x00000F50/4), 0x00007030},
-    {(0x00000F54/4), 0x7149F2CA},
-    {(0x00000F50/4), 0x00007040},
-    {(0x00000F54/4), 0x7149F2CA},
-    {(0x00000F50/4), 0x00007050},
-    {(0x00000F54/4), 0x7149F2CA},
-    {(0x00000F50/4), 0x00007060},
-    {(0x00000F54/4), 0x7149F2CA},
-    {(0x00000F50/4), 0x00007070},
-    {(0x00000F54/4), 0x7149F2CA},
-    {(0x00000F50/4), 0x00007080},
-    {(0x00000F54/4), 0x7149F2CA},
-    {(0x00000F50/4), 0x00007090},
-    {(0x00000F54/4), 0x7149F2CA},
-    {(0x00000F50/4), 0x000070A0},
-    {(0x00000F54/4), 0x7149F2CA},
-    {(0x00000F50/4), 0x00006A80},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F50/4), 0x00006AA0},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F50/4), 0x00000040},
-    {(0x00000F54/4), 0x00000005},
-    {(0x00000F50/4), 0x00006400},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F54/4), 0x4B7FFFFF},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F50/4), 0x00006410},
-    {(0x00000F54/4), 0xC5000000},
-    {(0x00000F54/4), 0xC5000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F50/4), 0x00006420},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F50/4), 0x00006430},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F50/4), 0x000064C0},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F54/4), 0x477FFFFF},
-    {(0x00000F54/4), 0x3F800000},
-    {(0x00000F50/4), 0x000064D0},
-    {(0x00000F54/4), 0xC5000000},
-    {(0x00000F54/4), 0xC5000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F50/4), 0x000064E0},
-    {(0x00000F54/4), 0xC4FFF000},
-    {(0x00000F54/4), 0xC4FFF000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F50/4), 0x000064F0},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F54/4), 0x00000000},
-    {(0x00000F40/4), 0x30000000},
-    {(0x00000F44/4), 0x00000004},
-    {(0x00000F48/4), 0x10000000},
-    {(0x00000F4C/4), 0x00000000}
 };
 static unsigned nv10TablePRAMIN[][2] =
 {

Reply via email to