File xf86-video-mga-1.4.9_36ae47b.diff of Package xorg-x11-driver-video

diff --git a/README b/README
new file mode 100644
index 0000000..b31b3c6
--- /dev/null
+++ b/README
@@ -0,0 +1,20 @@
+xf86-video-mga - Matrox video driver for the Xorg X server
+
+Please submit bugs & patches to the Xorg bugzilla:
+
+        https://bugs.freedesktop.org/enter_bug.cgi?product=xorg
+
+All questions regarding this software should be directed at the
+Xorg mailing list:
+
+        http://lists.freedesktop.org/mailman/listinfo/xorg
+
+The master development code repository can be found at:
+
+        git://anongit.freedesktop.org/git/xorg/driver/xf86-video-mga
+
+        http://cgit.freedesktop.org/xorg/driver/xf86-video-mga
+
+For more information on the git code manager, see:
+
+        http://wiki.x.org/wiki/GitPage
diff --git a/man/mga.man b/man/mga.man
index 64c54fd..3a7a9f8 100644
--- a/man/mga.man
+++ b/man/mga.man
@@ -170,7 +170,7 @@ option is primarily intended for testing purposes, but it could also
 be used on systems with a buggy or poorly function AGP implementation.
 Default: off.
 .SH "SEE ALSO"
-__xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), xorgconfig(__appmansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__)
+__xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__)
 .SH AUTHORS
 Authors include: Radoslaw Kapitan, Mark Vojkovich, and also David Dawes, Guy
 Desbief, Dirk Hohndel, Doug Merritt, Andrew E. Mileski, Andrew van der Stock,
diff --git a/src/mga_dacG.c b/src/mga_dacG.c
index af5d1d9..88a12cb 100644
--- a/src/mga_dacG.c
+++ b/src/mga_dacG.c
@@ -82,7 +82,7 @@ MGAG200IPComputePLLParam(ScrnInfoPtr pScrn, long lFo, int *M, int *N, int *P)
         ulTestNEnd      = 32;
         ulTestMStart    = 1;
         ulTestMEnd      = 32;
-    } else if (pMga->is_G200EV) {
+    } else { /* pMga->is_G200EV */
         ulVCOMax        = 550000;
         ulVCOMin        = 150000;
         ulPLLFreqRef    = 50000;
@@ -91,15 +91,6 @@ MGAG200IPComputePLLParam(ScrnInfoPtr pScrn, long lFo, int *M, int *N, int *P)
         ulTestNEnd      = 256;
         ulTestMStart    = 1;
         ulTestMEnd      = 16;
-    } else if (pMga->is_G200WB) {
-        ulVCOMax        = 680000;
-        ulVCOMin        = 150000;
-        ulPLLFreqRef    = 48000;
-        ulTestPStart    = 8;
-        ulTestNStart    = 1;
-        ulTestNEnd      = 512;
-        ulTestMStart    = 3;
-        ulTestMEnd      = 25;
     }
 
     ulFDelta = 0xFFFFFFFF;
@@ -121,13 +112,69 @@ MGAG200IPComputePLLParam(ScrnInfoPtr pScrn, long lFo, int *M, int *N, int *P)
 
 		if (ulFTmpDelta < ulFDelta) {
 			ulFDelta = ulFTmpDelta;
-			if (pMga->is_G200WB) {
-				*M = (ulTestM - 1) | (((ulTestN -1) >> 1) & 0x80);
-			} else {
-				*M = ulTestM - 1;
-			}
-		    *N = ulTestN - 1;
-		    *P = ulTestP - 1;
+			*M = ulTestM - 1;
+			*N = (CARD8)(ulTestN - 1);
+			*P = (CARD8)(ulTestP - 1);
+		}
+	    }
+	}
+    }
+#if DEBUG
+	xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+		   "lFo=%ld n=0x%x m=0x%x p=0x%x \n",
+		   lFo, *N, *M, *P );
+#endif
+}
+
+static void
+MGAG200WBComputePLLParam(ScrnInfoPtr pScrn, long lFo, int *M, int *N, int *P)
+{
+    unsigned int ulComputedFo;
+    unsigned int ulFDelta;
+    unsigned int ulFPermitedDelta;
+    unsigned int ulFTmpDelta;
+    unsigned int ulVCOMax, ulVCOMin;
+    unsigned int ulTestP;
+    unsigned int ulTestM;
+    unsigned int ulTestN;
+    unsigned int ulPLLFreqRef;
+    unsigned int ulTestPStart;
+    unsigned int ulTestNStart;
+    unsigned int ulTestNEnd;
+    unsigned int ulTestMStart;
+    unsigned int ulTestMEnd;
+
+    ulVCOMax        = 550000;
+    ulVCOMin        = 150000;
+    ulPLLFreqRef    = 48000;
+    ulTestPStart    = 1;
+    ulTestNStart    = 1;
+    ulTestNEnd      = 150;
+    ulTestMStart    = 1;
+    ulTestMEnd      = 16;
+
+    ulFDelta = 0xFFFFFFFF;
+    /* Permited delta is 0.5% as VESA Specification */
+    ulFPermitedDelta = lFo * 5 / 1000;
+
+    /* Then we need to minimize the M while staying within 0.5% */
+    for (ulTestP = ulTestPStart; ulTestP < 9; ulTestP++) {
+	if ((lFo * ulTestP) > ulVCOMax) continue;
+	if ((lFo * ulTestP) < ulVCOMin) continue;
+
+        for (ulTestM = ulTestMStart; ulTestM <= ulTestMEnd; ulTestM++) {
+	   for (ulTestN = ulTestNStart; ulTestN <= ulTestNEnd; ulTestN++) {
+		ulComputedFo = (ulPLLFreqRef * ulTestN) / (ulTestM * ulTestP);
+		if (ulComputedFo > lFo)
+			ulFTmpDelta = ulComputedFo - lFo;
+		else
+			ulFTmpDelta = lFo - ulComputedFo;
+
+		if (ulFTmpDelta < ulFDelta) {
+			ulFDelta = ulFTmpDelta;
+        		*M = (CARD8)(ulTestM - 1) | (CARD8)(((ulTestN -1) >> 1) & 0x80);
+			*N = (CARD8)(ulTestN - 1);
+			*P = (CARD8)(ulTestP - 1);
 		}
 	    }
 	}
@@ -144,12 +191,7 @@ MGAG200EVPIXPLLSET(ScrnInfoPtr pScrn, MGARegPtr mgaReg)
 {
     MGAPtr pMga = MGAPTR(pScrn);
 
-    unsigned long ulFallBackCounter;
     unsigned char ucTempByte, ucPixCtrl;
-    unsigned char ucM;
-    unsigned char ucN;
-    unsigned char ucP;
-    unsigned char ucS;
 
     // Set pixclkdis to 1
     ucPixCtrl = inMGAdac(MGA1064_PIX_CLK_CTL);
@@ -157,9 +199,9 @@ MGAG200EVPIXPLLSET(ScrnInfoPtr pScrn, MGARegPtr mgaReg)
     outMGAdac(MGA1064_PIX_CLK_CTL, ucPixCtrl);
 
     // Select PLL Set C
-    ucTempByte = INREG8(MGAREG_MISC_READ);
+    ucTempByte = INREG8(MGAREG_MEM_MISC_READ);
     ucTempByte |= 0x3<<2; //select MGA pixel clock
-    OUTREG8(MGAREG_MISC_WRITE, ucTempByte);
+    OUTREG8(MGAREG_MEM_MISC_WRITE, ucTempByte);
 
     // Set pixlock to 0
     ucTempByte = inMGAdac(MGA1064_PIX_PLL_STAT);
@@ -214,99 +256,133 @@ MGAG200WBPIXPLLSET(ScrnInfoPtr pScrn, MGARegPtr mgaReg)
 {
     MGAPtr pMga = MGAPTR(pScrn);
 
-    unsigned long ulFallBackCounter;
-    unsigned char ucTempByte, ucPixCtrl;
-    unsigned char ucM;
-    unsigned char ucN;
-    unsigned char ucP;
-    unsigned char ucS;
+    unsigned long ulLoopCount, ulLockCheckIterations = 0, ulTempCount, ulVCount;
+    unsigned char ucTempByte, ucPixCtrl, ucPLLLocked = FALSE;
 
-    // Set pixclkdis to 1
-    ucPixCtrl = inMGAdac(MGA1064_PIX_CLK_CTL);
-    ucPixCtrl |= MGA1064_PIX_CLK_CTL_CLK_DIS;
-    outMGAdac(MGA1064_PIX_CLK_CTL, ucPixCtrl);
+    while(ulLockCheckIterations <= 32 && ucPLLLocked == FALSE)
+    {
+        if(ulLockCheckIterations > 0)
+        {
+            OUTREG8(MGAREG_CRTCEXT_INDEX, 0x1E);
+            ucTempByte = INREG8(MGAREG_CRTCEXT_DATA);
+            if(ucTempByte < 0xFF)
+            {
+                OUTREG8(MGAREG_CRTCEXT_DATA, ucTempByte+1);
+            }
+        }
 
-    ucTempByte = inMGAdac(MGA1064_REMHEADCTL);
-    ucTempByte |= MGA1064_REMHEADCTL_CLKDIS;
-    outMGAdac(MGA1064_REMHEADCTL, ucTempByte);
+        // Set pixclkdis to 1
+        ucPixCtrl = inMGAdac(MGA1064_PIX_CLK_CTL);
+        ucPixCtrl |= MGA1064_PIX_CLK_CTL_CLK_DIS;
+        outMGAdac(MGA1064_PIX_CLK_CTL, ucPixCtrl);
 
-    // Select PLL Set C
-    ucTempByte = INREG8(MGAREG_MISC_READ);
-    ucTempByte |= 0x3<<2; //select MGA pixel clock
-    OUTREG8(MGAREG_MISC_WRITE, ucTempByte);
+        ucTempByte = inMGAdac(MGA1064_REMHEADCTL);
+        ucTempByte |= MGA1064_REMHEADCTL_CLKDIS;
+        outMGAdac(MGA1064_REMHEADCTL, ucTempByte);
 
-    // Set pixlock to 0
-    ucTempByte = inMGAdac(MGA1064_PIX_PLL_STAT);
-    outMGAdac(MGA1064_PIX_PLL_STAT, ucTempByte & ~0x40);
+        // Select PLL Set C
+        ucTempByte = INREG8(MGAREG_MEM_MISC_READ);
+        ucTempByte |= 0x3<<2; //select MGA pixel clock
+        OUTREG8(MGAREG_MEM_MISC_WRITE, ucTempByte);
 
-    ucPixCtrl |= MGA1064_PIX_CLK_CTL_CLK_POW_DOWN | 0x80;
-    outMGAdac(MGA1064_PIX_CLK_CTL, ucPixCtrl);
+        // Set pixlock to 0
+        ucTempByte = inMGAdac(MGA1064_PIX_PLL_STAT);
+        outMGAdac(MGA1064_PIX_PLL_STAT, ucTempByte & ~0x40);
 
-    // Wait 500 us
-    usleep(500);
+        ucPixCtrl |= MGA1064_PIX_CLK_CTL_CLK_POW_DOWN | 0x80;
+        outMGAdac(MGA1064_PIX_CLK_CTL, ucPixCtrl);
 
-    // Reset the PLL
-    //   When we are varying the output frequency by more than 
-    //   10%, we must reset the PLL. However to be prudent, we
-    //   will reset it each time that we are changing it.
-    ucTempByte = inMGAdac(MGA1064_VREF_CTL);
-    ucTempByte &= ~0x04;
-    outMGAdac(MGA1064_VREF_CTL, ucTempByte );
+        // Wait 500 us
+        usleep(500);
 
-    // Wait 50 us
-    usleep(50);
+        // Reset the PLL
+        //   When we are varying the output frequency by more than 
+        //   10%, we must reset the PLL. However to be prudent, we
+        //   will reset it each time that we are changing it.
+        ucTempByte = inMGAdac(MGA1064_VREF_CTL);
+        ucTempByte &= ~0x04;
+        outMGAdac(MGA1064_VREF_CTL, ucTempByte );
 
-    // Program the Pixel PLL Register
-    outMGAdac(MGA1064_WB_PIX_PLLC_M, mgaReg->PllM);
-    outMGAdac(MGA1064_WB_PIX_PLLC_N, mgaReg->PllN);
-    outMGAdac(MGA1064_WB_PIX_PLLC_P, mgaReg->PllP);
+        // Wait 50 us
+        usleep(50);
 
-    // Wait 50 us
-    usleep(50);
+        // Program the Pixel PLL Register
+        outMGAdac(MGA1064_WB_PIX_PLLC_M, mgaReg->PllM);
+        outMGAdac(MGA1064_WB_PIX_PLLC_N, mgaReg->PllN);
+        outMGAdac(MGA1064_WB_PIX_PLLC_P, mgaReg->PllP);
 
-    ucTempByte = INREG8(MGAREG_MISC_READ);
-    OUTREG8(MGAREG_MISC_WRITE, ucTempByte & ~0x08);
+        // Wait 50 us
+        usleep(50);
 
-    // Wait 50 us
-    usleep(50);
+        ucTempByte = INREG8(MGAREG_MEM_MISC_READ);
+        OUTREG8(MGAREG_MEM_MISC_WRITE, ucTempByte);
 
-    OUTREG8(MGAREG_MISC_WRITE, ucTempByte);
+        // Wait 50 us
+        usleep(50);
 
-    // Wait 500 us
-    usleep(500);
+        OUTREG8(MGAREG_MEM_MISC_WRITE, ucTempByte);
 
-    // Turning the PLL on
-    ucTempByte = inMGAdac(MGA1064_VREF_CTL);
-    ucTempByte |= 0x04;
-    outMGAdac(MGA1064_VREF_CTL, ucTempByte );
+        // Wait 500 us
+        usleep(500);
 
-    // Wait 500 us
-    usleep(500);
+        // Turning the PLL on
+        ucTempByte = inMGAdac(MGA1064_VREF_CTL);
+        ucTempByte |= 0x04;
+        outMGAdac(MGA1064_VREF_CTL, ucTempByte );
 
-    // Select the pixel PLL by setting pixclksel to 1
-    ucTempByte = inMGAdac(MGA1064_PIX_CLK_CTL);
-    ucTempByte &= ~MGA1064_PIX_CLK_CTL_SEL_MSK;
-    ucTempByte |= MGA1064_PIX_CLK_CTL_SEL_PLL;
-    outMGAdac(MGA1064_PIX_CLK_CTL, ucTempByte);
+        // Wait 500 us
+        usleep(500);
 
-    ucTempByte = inMGAdac(MGA1064_REMHEADCTL);
-    ucTempByte &= ~MGA1064_REMHEADCTL_CLKSL_MSK;
-    ucTempByte |= MGA1064_REMHEADCTL_CLKSL_PLL;
-    outMGAdac(MGA1064_REMHEADCTL, ucTempByte);
+        // Select the pixel PLL by setting pixclksel to 1
+        ucTempByte = inMGAdac(MGA1064_PIX_CLK_CTL);
+        ucTempByte &= ~MGA1064_PIX_CLK_CTL_SEL_MSK;
+        ucTempByte |= MGA1064_PIX_CLK_CTL_SEL_PLL;
+        outMGAdac(MGA1064_PIX_CLK_CTL, ucTempByte);
 
-    // Set pixlock to 1
-    ucTempByte = inMGAdac(MGA1064_PIX_PLL_STAT);
-    outMGAdac(MGA1064_PIX_PLL_STAT, ucTempByte | 0x40);
+        ucTempByte = inMGAdac(MGA1064_REMHEADCTL);
+        ucTempByte &= ~MGA1064_REMHEADCTL_CLKSL_MSK;
+        ucTempByte |= MGA1064_REMHEADCTL_CLKSL_PLL;
+        outMGAdac(MGA1064_REMHEADCTL, ucTempByte);
 
-    // Reset dotclock rate bit.
-    OUTREG8(MGAREG_SEQ_INDEX, 1);
-    ucTempByte = INREG8(MGAREG_SEQ_DATA);
-    OUTREG8(MGAREG_SEQ_DATA, ucTempByte & ~0x8);
+        // Set pixlock to 1
+        ucTempByte = inMGAdac(MGA1064_PIX_PLL_STAT);
+        outMGAdac(MGA1064_PIX_PLL_STAT, ucTempByte | 0x40);
 
-    // Set pixclkdis to 0
-    ucTempByte = inMGAdac(MGA1064_PIX_CLK_CTL);
-    ucTempByte &= ~MGA1064_PIX_CLK_CTL_CLK_DIS;
-    outMGAdac(MGA1064_PIX_CLK_CTL, ucTempByte);
+        // Reset dotclock rate bit.
+        OUTREG8(MGAREG_SEQ_INDEX, 1);
+        ucTempByte = INREG8(MGAREG_SEQ_DATA);
+        OUTREG8(MGAREG_SEQ_DATA, ucTempByte & ~0x8);
+
+        // Set pixclkdis to 0
+        ucTempByte = inMGAdac(MGA1064_PIX_CLK_CTL);
+        ucTempByte &= ~MGA1064_PIX_CLK_CTL_CLK_DIS;
+        outMGAdac(MGA1064_PIX_CLK_CTL, ucTempByte);
+
+        // Poll VCount. If it increments twice inside 150us, 
+        // we assume that the PLL has locked.
+        ulLoopCount = 0;
+        ulVCount = INREG(MGAREG_VCOUNT);
+
+        while(ulLoopCount < 30 && ucPLLLocked == FALSE)
+        {
+            ulTempCount = INREG(MGAREG_VCOUNT);
+
+            if(ulTempCount < ulVCount)
+            {
+                ulVCount = 0;
+            }
+            if ((ucTempByte - ulVCount) > 2)
+            {
+                ucPLLLocked = TRUE;
+            }
+            else
+            {
+                usleep(5);
+            }
+            ulLoopCount++;
+        }
+        ulLockCheckIterations++;
+    }
 
     // Set remclkdis to 0
     ucTempByte = inMGAdac(MGA1064_REMHEADCTL);
@@ -537,12 +613,19 @@ MGAGSetPCLK( ScrnInfoPtr pScrn, long f_out )
 	    pReg->DacRegs[ MGA1064_PIX_PLLC_M ] = m;
 	    pReg->DacRegs[ MGA1064_PIX_PLLC_N ] = n;
 	    pReg->DacRegs[ MGA1064_PIX_PLLC_P ] = p;
-	} else if (pMga->is_G200EV || pMga->is_G200WB) {
+	} else if (pMga->is_G200EV) {
 	    MGAG200IPComputePLLParam(pScrn, f_out, &m, &n, &p);
+
 	    pReg->PllM = m;
 	    pReg->PllN = n;
 	    pReg->PllP = p;
-	} else {
+	} else if (pMga->is_G200WB) {
+	    MGAG200WBComputePLLParam(pScrn, f_out, &m, &n, &p);
+
+	    pReg->PllM = m;
+	    pReg->PllN = n;
+	    pReg->PllP = p;
+        } else {
 	    /* Do the calculations for m, n, p and s */
 	    MGAGCalcClock( pScrn, f_out, &m, &n, &p, &s );
 
@@ -1503,9 +1586,17 @@ MGAG_ddc1Read(ScrnInfoPtr pScrn)
 {
   MGAPtr pMga = MGAPTR(pScrn);
   unsigned char val;
-  
+  int i2c_index;
+
+  if (pMga->is_G200SE || pMga->is_G200WB || pMga->is_G200EV)
+    i2c_index = 3;
+  else
+    i2c_index = 0;
+
+  const struct mgag_i2c_private *p = & i2c_priv[i2c_index];
+ 
   /* Define the SDA as an input */
-  outMGAdacmsk(MGA1064_GEN_IO_CTL, ~(DDC_P1_SCL_MASK | DDC_P1_SDA_MASK), 0);
+  outMGAdacmsk(MGA1064_GEN_IO_CTL, ~(p->scl_mask | p->sda_mask), 0);
 
   /* wait for Vsync */
   if (pMga->is_G200SE) {
@@ -1516,7 +1607,7 @@ MGAG_ddc1Read(ScrnInfoPtr pScrn)
   }
 
   /* Get the result */
-  val = (inMGAdac(MGA1064_GEN_IO_DATA) & DDC_P1_SDA_MASK);
+  val = (inMGAdac(MGA1064_GEN_IO_DATA) & p->sda_mask);
   return val;
 }
 
@@ -1592,7 +1683,6 @@ Bool
 MGAG_i2cInit(ScrnInfoPtr pScrn)
 {
     MGAPtr pMga = MGAPTR(pScrn);
-    I2CBusPtr I2CPtr;
 
     if (pMga->SecondCrtc == FALSE) {
         int i2c_index;
diff --git a/src/mga_dh.c b/src/mga_dh.c
index 6ba2945..d9c0d34 100644
--- a/src/mga_dh.c
+++ b/src/mga_dh.c
@@ -251,9 +251,9 @@ void MGAEnableSecondOutPut(ScrnInfoPtr pScrn, xMODEINFO *pModeInfo)
     
     
     /* We don't use MISC synch pol, must be 0*/
-    ucByte = inMGAdreg( MGAREG_MISC_READ);
+    ucByte = INREG8( MGAREG_MEM_MISC_READ);
     
-    OUTREG8(MGAREG_MISC_WRITE, (CARD8)(ucByte & ~(HSYNCPOL| VSYNCPOL) ));
+    OUTREG8(MGAREG_MEM_MISC_WRITE, (CARD8)(ucByte & ~(HSYNCPOL| VSYNCPOL) ));
 
     
 
diff --git a/src/mga_driver.c b/src/mga_driver.c
index 6f55e63..b363437 100644
--- a/src/mga_driver.c
+++ b/src/mga_driver.c
@@ -427,8 +427,8 @@ static SymTabRec MGAChipsets[] = {
     { PCI_CHIP_MGAG200_PCI,	"mgag200 PCI" },
     { PCI_CHIP_MGAG200_SE_A_PCI,	"mgag200 SE A PCI" },
     { PCI_CHIP_MGAG200_SE_B_PCI,	"mgag200 SE B PCI" },
-    { PCI_CHIP_MGAG200_EV_PCI,	"mgag200 Maxim" },
-    { PCI_CHIP_MGAG200_WINBOND_PCI,	"mgag200 Winbond" },
+    { PCI_CHIP_MGAG200_EV_PCI,	"mgag200 EV Maxim" },
+    { PCI_CHIP_MGAG200_WINBOND_PCI,	"mgag200 eW Nuvoton" },
     { PCI_CHIP_MGAG400,		"mgag400" },
     { PCI_CHIP_MGAG550,		"mgag550" },
     {-1,			NULL }
@@ -2492,6 +2492,9 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags)
 
     /* Set the min pixel clock */
     pMga->MinClock = 17750;
+    if (pMga->is_G200WB){
+	pMga->MinClock = 18750;
+    }
     xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, "Min pixel clock is %d MHz\n",
 	       pMga->MinClock / 1000);
     /*
@@ -4505,11 +4508,13 @@ MGAValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags)
 	    xf86ModeBandwidth(mode, pScrn->bitsPerPixel) > 256)
 	    return MODE_BANDWIDTH;
     } else if (pMga->is_G200WB){
+        if (mode->Flags & V_DBLSCAN)
+            return MODE_NO_DBLESCAN;
 	if (pMga->KVM && mode->HDisplay > 1280)
 	    return MODE_VIRTUAL_X;
 	if (pMga->KVM && mode->VDisplay > 1024)
 	    return MODE_VIRTUAL_Y;
-	if (xf86ModeBandwidth(mode, pScrn->bitsPerPixel) > 315)
+	if (xf86ModeBandwidth(mode, pScrn->bitsPerPixel) > 318.77)
 	    return MODE_BANDWIDTH;
     } else if (pMga->is_G200EV
 	       && (xf86ModeBandwidth(mode, pScrn->bitsPerPixel) > 327)) {
diff --git a/src/mga_exa.c b/src/mga_exa.c
index 9321452..f292327 100644
--- a/src/mga_exa.c
+++ b/src/mga_exa.c
@@ -332,6 +332,11 @@ mgaCheckSourceTexture(int tmu, PicturePtr pPict)
         return FALSE;
     }
 
+    if (pPict->repeatType != RepeatNormal) {
+        DEBUG_MSG(("Unsupported repeat type %d\n", pPict->repeatType));
+        return FALSE;
+    }
+
     if (pPict->repeat && ((w & (w - 1)) != 0 || (h & (h - 1)) != 0)) {
         DEBUG_MSG(("NPOT repeat unsupported (%dx%d)\n", w, h));
         return FALSE;
diff --git a/src/mga_storm.c b/src/mga_storm.c
index aa6ad82..0d04c63 100644
--- a/src/mga_storm.c
+++ b/src/mga_storm.c
@@ -1138,6 +1138,20 @@ void MGAStormEngineInit( ScrnInfoPtr pScrn )
 	break;
     }
 
+    if (pMga->is_G200WB)
+    {
+        CARD32 dwgctl = MGADWG_RSTR | 0x00060000 | MGADWG_SHIFTZERO |
+			MGADWG_BITBLT | MGADWG_BFCOL;
+        WAITFIFO(7);
+        OUTREG(MGAREG_DWGCTL, dwgctl);
+        OUTREG(MGAREG_SGN, 0);
+        OUTREG(MGAREG_AR5, 1);
+        OUTREG(MGAREG_AR0, 1);
+        OUTREG(MGAREG_AR3, 0);
+        OUTREG(MGAREG_FXBNDRY, (1 << 16) | (1 & 0xffff));
+        OUTREG(MGAREG_YDSTLEN + MGAREG_EXEC, (1 << 16) | 1);
+    }
+
     xf86SetLastScrnFlag(pScrn->entityList[0], pScrn->scrnIndex);
 }
 
openSUSE Build Service is sponsored by