[PATCH video-mga 2/2] xf86-video-mga: Add support for the new G200e chipset -- V2

walter harms wharms at bfs.de
Thu Jul 21 07:48:56 UTC 2016



Am 20.07.2016 15:18, schrieb mathieu.larouche at matrox.com:
> From: Mathieu Larouche <mathieu.larouche at matrox.com>
> 
> - Added PLL algorithm for a new rev of G200e
> - Removed the bandwidth limitation for the new G200e
> 
> Fixes : https://bugs.freedesktop.org/show_bug.cgi?id=92540
> 
> Change from V1 :
> - Make sure we don't cause issue on previous chips. (Dave Airlie review)
> 
> Signed-off-by: Mathieu Larouche <mathieu.larouche at matrox.com>
> ---
>  src/mga_dacG.c   | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  src/mga_driver.c |  6 ++---
>  2 files changed, 83 insertions(+), 5 deletions(-)
> 
> diff --git a/src/mga_dacG.c b/src/mga_dacG.c
> index 2be0bb7..7286be7 100644
> --- a/src/mga_dacG.c
> +++ b/src/mga_dacG.c
> @@ -51,6 +51,75 @@ static Bool MGAGInit(ScrnInfoPtr, DisplayModePtr);
>  static void MGAGLoadPalette(ScrnInfoPtr, int, int*, LOCO*, VisualPtr);
>  static Bool MGAG_i2cInit(ScrnInfoPtr pScrn);
>  
> +#define P_ARRAY_SIZE 9
> +
> +void
> +MGAG200E4ComputePLLParam(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 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++)


you can use sizeof(pulPValues)/sizeof(pulPValues[0]) here and avoid using
P_ARRAY_SIZE al together.



> +    {
> +        ulTestP = pulPValues[i];
> +
> +        if ((ulFoInternal * ulTestP) > ulVCOMax) continue;
> +        if ((ulFoInternal * ulTestP) < ulVCOMin) continue;

I do not know the source of lFo. can this overflow ?


> +
> +        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;
> +

I guess you can use ABS() here.

just my 2 cents.

re,
 wh

> +                if (ulFTmpDelta < ulFDelta) {
> +                    ulFDelta = ulFTmpDelta;
> +                    *M = ulTestM - 1;
> +                    *N = ulTestN - 1;
> +                    *P = ulTestP - 1;
> +                }
> +            }
> +        }
> +    }
> +                                                                                                                    
> +    ulVCO = ulPLLFreqRef * ((*N)+1) / ((*M)+1);
> +    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)
>  {
> @@ -958,7 +1027,11 @@ MGAGSetPCLK( ScrnInfoPtr pScrn, long f_out )
>  	}
>  
>  	if (pMga->is_G200SE) {
> -	    MGAG200SEComputePLLParam(pScrn, f_out, &m, &n, &p);
> +            if (pMga->reg_1e24 >= 0x04) {
> +                MGAG200E4ComputePLLParam(pScrn, f_out, &m, &n, &p);
> +            } else {
> +                MGAG200SEComputePLLParam(pScrn, f_out, &m, &n, &p);
> +            }
>  
>  	    pReg->DacRegs[ MGA1064_PIX_PLLC_M ] = m;
>  	    pReg->DacRegs[ MGA1064_PIX_PLLC_N ] = n;
> @@ -1557,7 +1630,12 @@ MGA_NOT_HAL(
>          {
>  			outMGAdac(0x90, mgaReg->Dac_Index90);
>          }
> -   
> +           if (pMga->is_G200SE && (pMga->reg_1e24 >= 0x04)) {
> +              outMGAdac( 0x1a, 0x09);
> +              usleep(500);
> +              outMGAdac( 0x1a, 0x01);
> +           }
> +    
>  	   if (!MGAISGx50(pMga)) {
>  	       /* restore pci_option register */
>  #ifdef XSERVER_LIBPCIACCESS
> diff --git a/src/mga_driver.c b/src/mga_driver.c
> index 96d1d7a..7b46561 100644
> --- a/src/mga_driver.c
> +++ b/src/mga_driver.c
> @@ -315,7 +315,7 @@ static const struct mga_device_attributes attribs[] = {
>      },
>  
>      /* G200SE A PCI */
> -    [10] = { 0, 1, 0, 0, 1, 0, 0, 1, new_BARs,
> +    [10] = { 0, 1, 0, 0, 1, 0, 0, 0, new_BARs,
>              (TRANSC_SOLID_FILL | TWO_PASS_COLOR_EXPAND | USE_LINEAR_EXPANSION),
>  	{
>  	    { 50000, 230000 }, /* System VCO frequencies */
> @@ -331,7 +331,7 @@ static const struct mga_device_attributes attribs[] = {
>      },
>  
>      /* G200SE B PCI */
> -    [11] = { 0, 1, 0, 0, 1, 0, 0, 1, new_BARs,
> +    [11] = { 0, 1, 0, 0, 1, 0, 0, 0, new_BARs,
>              (TRANSC_SOLID_FILL | TWO_PASS_COLOR_EXPAND | USE_LINEAR_EXPANSION),
>  	{
>  	    { 50000, 114000 }, /* System VCO frequencies */
> @@ -3854,7 +3854,7 @@ MGAValidMode(SCRN_ARG_TYPE arg, DisplayModePtr mode, Bool verbose, int flags)
>  	        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)


More information about the xorg-devel mailing list