Only in xf86-video-mga2/src/: e4.patch Only in xf86-video-mga2/src/: ew3.patch Only in xf86-video-mga2/src/: Makefile.in diff -up xf86-video-mga/src/mga_dacG.c xf86-video-mga2/src/mga_dacG.c --- xf86-video-mga/src/mga_dacG.c 2015-08-17 16:27:12.993383004 -0400 +++ xf86-video-mga2/src/mga_dacG.c 2015-08-17 16:26:16.881380457 -0400 @@ -51,6 +51,75 @@ static Bool MGAGInit(ScrnInfoPtr, Displa static void MGAGLoadPalette(ScrnInfoPtr, int, int*, LOCO*, VisualPtr); static Bool MGAG_i2cInit(ScrnInfoPtr pScrn); +#define P_ARRAY_SIZE 9 + +void +MGAG200E4ComputePLLParam(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 = 1; + unsigned int ulTestM = 1; + unsigned int ulTestN = 50; + unsigned int ulFoInternal; + unsigned int ulPLLFreqRef; + unsigned int pulPValues[P_ARRAY_SIZE] = {16, 14, 12, 10, 8, 6, 4, 2, 1}; + unsigned int i; + unsigned int ulVCO; + unsigned int ulFVV; + + ulVCOMax = 1600000; + ulVCOMin = 800000; + ulPLLFreqRef = 25000; + + if(lFo < 25000) + lFo = 25000; + + ulFoInternal = lFo * 2; + + ulFDelta = 0xFFFFFFFF; + /* Permited delta is 0.5% as VESA Specification */ + ulFPermitedDelta = ulFoInternal * 5 / 1000; + + for (i = 0 ; i < P_ARRAY_SIZE ; i++) + { + ulTestP = pulPValues[i]; + + if ((ulFoInternal * ulTestP) > ulVCOMax) continue; + if ((ulFoInternal * ulTestP) < ulVCOMin) continue; + + for (ulTestN = 50; ulTestN <= 256; ulTestN++) { + for (ulTestM = 1; ulTestM <= 32; ulTestM++) { + ulComputedFo = (ulPLLFreqRef * ulTestN) / (ulTestM * ulTestP); + if (ulComputedFo > ulFoInternal) + ulFTmpDelta = ulComputedFo - ulFoInternal; + else + ulFTmpDelta = ulFoInternal - ulComputedFo; + + if (ulFTmpDelta < ulFDelta) { + ulFDelta = ulFTmpDelta; + *M = ulTestM - 1; + *N = ulTestN - 1; + *P = ulTestP - 1; + } + } + } + } + + ulVCO = ulPLLFreqRef * ulTestN / ulTestM; + ulFVV = (ulVCO - 800000) / 50000; + + if (ulFVV > 15) + ulFVV = 15; + + *P |= (ulFVV << 4); + + *M |= 0x80; +} + static void MGAG200SEComputePLLParam(ScrnInfoPtr pScrn, long lFo, int *M, int *N, int *P) { @@ -890,7 +959,11 @@ MGAGSetPCLK( ScrnInfoPtr pScrn, long f_o } if (pMga->is_G200SE) { - MGAG200SEComputePLLParam(pScrn, f_out, &m, &n, &p); + if (pMga->reg_1e24 >= 0x04) { + MGAG200E4ComputePLLParam(f_out, &m, &n, &p); + } else { + MGAG200SEComputePLLParam(f_out, &m, &n, &p); + } pReg->DacRegs[ MGA1064_PIX_PLLC_M ] = m; pReg->DacRegs[ MGA1064_PIX_PLLC_N ] = n; Only in xf86-video-mga2/src/: mga_dacG.c.orig diff -up xf86-video-mga/src/mga_driver.c xf86-video-mga2/src/mga_driver.c --- xf86-video-mga/src/mga_driver.c 2015-08-17 16:27:12.995383004 -0400 +++ xf86-video-mga2/src/mga_driver.c 2015-08-17 16:26:14.819380363 -0400 @@ -3826,7 +3826,7 @@ MGAValidMode(SCRN_ARG_TYPE arg, DisplayM if (xf86ModeBandwidth(mode, pScrn->bitsPerPixel) > 244) return MODE_BANDWIDTH; } else { - if (pMga->reg_1e24 >= 0x02) { + if (pMga->reg_1e24 == 0x02) { if (mode->HDisplay > 1920) return MODE_VIRTUAL_X; if (mode->VDisplay > 1200)