[PATCH mga] xf86-video-mga: Add support for a new G200eH3 device
Dave Airlie
airlied at gmail.com
Mon Feb 13 02:12:48 UTC 2017
On 8 February 2017 at 02:12, <mathieu.larouche at matrox.com> wrote:
> From: Mathieu Larouche <mathieu.larouche at matrox.com>
>
> - Added support for the new deviceID for G200eH3
> - Added PLL algorithm for the G200eH3
> - Removed the bandwidth limitation for the G200eH3
>
> Signed-off-by: Mathieu Larouche <mathieu.larouche at matrox.com>
Reviewed-by: Dave Airlie <airlied at redhat.com>
> ---
> src/mga.h | 4 +++-
> src/mga_dacG.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> src/mga_driver.c | 36 +++++++++++++++++++++++++++++++++---
> src/mga_merge.c | 2 ++
> src/mga_storm.c | 1 +
> 5 files changed, 94 insertions(+), 5 deletions(-)
>
> diff --git a/src/mga.h b/src/mga.h
> index 04f6bfd..0df16e9 100644
> --- a/src/mga.h
> +++ b/src/mga.h
> @@ -150,7 +150,9 @@ void MGAdbg_outreg32(ScrnInfoPtr, int,int, char*);
> #define PCI_CHIP_MGAG200_EW3_PCI 0x0536
> #endif
>
> -
> +#ifndef PCI_CHIP_MGAG200_EH3_PCI
> +#define PCI_CHIP_MGAG200_EH3_PCI 0x0538
> +#endif
>
> /*
> * Read/write to the DAC via MMIO
> diff --git a/src/mga_dacG.c b/src/mga_dacG.c
> index 73d0d9d..7ff030e 100644
> --- a/src/mga_dacG.c
> +++ b/src/mga_dacG.c
> @@ -393,6 +393,52 @@ MGAG200EHComputePLLParam(ScrnInfoPtr pScrn, long lFo, int *M, int *N, int *P)
> }
> }
>
> +void
> +MGAG200EH3ComputePLLParam(ScrnInfoPtr pScrn, long lFo, int *M, int *N, int *P)
> +{
> + unsigned int ulComputedFo;
> + unsigned int ulFDelta;
> + unsigned int ulFPermitedDelta;
> + unsigned int ulFTmpDelta;
> + unsigned int ulTestP;
> + unsigned int ulTestM;
> + unsigned int ulTestN;
> + unsigned int ulVCOMax;
> + unsigned int ulVCOMin;
> + unsigned int ulPLLFreqRef;
> +
> + ulVCOMax = 3000000;
> + ulVCOMin = 1500000;
> + ulPLLFreqRef = 25000;
> +
> + ulTestP = 0;
> +
> + 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 (ulTestM = 150; ulTestM >= 6; ulTestM--) {
> + if ((lFo * ulTestM) > ulVCOMax) continue;
> + if ((lFo * ulTestM) < ulVCOMin) continue;
> +
> + for (ulTestN = 120; ulTestN >= 60; ulTestN--) {
> + ulComputedFo = (ulPLLFreqRef * ulTestN) / ulTestM;
> + if (ulComputedFo > lFo)
> + ulFTmpDelta = ulComputedFo - lFo;
> + else
> + ulFTmpDelta = lFo - ulComputedFo;
> +
> + if (ulFTmpDelta < ulFDelta) {
> + ulFDelta = ulFTmpDelta;
> + *M = (CARD8)(ulTestM);
> + *N = (CARD8)(ulTestN);
> + *P = (CARD8)(ulTestP);
> + }
> + }
> + }
> +}
> +
> static void
> MGAG200EVPIXPLLSET(ScrnInfoPtr pScrn, MGARegPtr mgaReg)
> {
> @@ -1056,7 +1102,14 @@ MGAGSetPCLK( ScrnInfoPtr pScrn, long f_out )
> pReg->PllN = n;
> pReg->PllP = p;
> } else if (pMga->is_G200EH) {
> - MGAG200EHComputePLLParam(pScrn, f_out, &m, &n, &p);
> + if (pMga->Chipset == PCI_CHIP_MGAG200_EH3_PCI)
> + {
> + MGAG200EH3ComputePLLParam(pScrn, f_out, &m, &n, &p);
> + }
> + else
> + {
> + MGAG200EHComputePLLParam(pScrn, f_out, &m, &n, &p);
> + }
>
> pReg->PllM = m;
> pReg->PllN = n;
> @@ -1263,6 +1316,7 @@ MGAGInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
> break;
>
> case PCI_CHIP_MGAG200_EH_PCI:
> + case PCI_CHIP_MGAG200_EH3_PCI:
> pReg->DacRegs[MGA1064_MISC_CTL] =
> MGA1064_MISC_CTL_VGA8 |
> MGA1064_MISC_CTL_DAC_RAM_CS;
> diff --git a/src/mga_driver.c b/src/mga_driver.c
> index 7b46561..3b4d01e 100644
> --- a/src/mga_driver.c
> +++ b/src/mga_driver.c
> @@ -424,6 +424,21 @@ static const struct mga_device_attributes attribs[] = {
> },
>
> 16384, 0x4000, /* Memory probe size & offset values */
> + },
> +
> + [17] = { 0, 1, 0, 0, 1, 0, 0, new_BARs,
> + (TRANSC_SOLID_FILL | TWO_PASS_COLOR_EXPAND | USE_LINEAR_EXPANSION),
> + {
> + { 50000, 230000 }, /* System VCO frequencies */
> + { 50000, 203400 }, /* Pixel VCO frequencies */
> + { 0, 0 }, /* Video VCO frequencies */
> + 45000, /* Memory clock */
> + 27050, /* PLL reference frequency */
> + 0, /* Supports fast bitblt? */
> + MGA_HOST_PCI /* Host interface */
> + },
> +
> + 16384, 0x4000, /* Memory probe size & offset values */
> }
> };
>
> @@ -458,6 +473,8 @@ static const struct pci_id_match mga_device_match[] = {
>
> MGA_DEVICE_MATCH( PCI_CHIP_MGAG200_EW3_PCI, 16 ),
>
> + MGA_DEVICE_MATCH( PCI_CHIP_MGAG200_EH3_PCI, 17 ),
> +
> { 0, 0, 0 },
> };
> #endif
> @@ -479,6 +496,7 @@ static SymTabRec MGAChipsets[] = {
> { PCI_CHIP_MGAG200_WINBOND_PCI, "mgag200 eW Nuvoton" },
> { PCI_CHIP_MGAG200_EW3_PCI, "mgag200 eW3 Nuvoton" },
> { PCI_CHIP_MGAG200_EH_PCI, "mgag200eH" },
> + { PCI_CHIP_MGAG200_EH3_PCI, "mgag200eH3" },
> { PCI_CHIP_MGAG400, "mgag400" },
> { PCI_CHIP_MGAG550, "mgag550" },
> {-1, NULL }
> @@ -507,6 +525,8 @@ static PciChipsets MGAPciChipsets[] = {
> RES_SHARED_VGA },
> { PCI_CHIP_MGAG200_EH_PCI, PCI_CHIP_MGAG200_EH_PCI,
> RES_SHARED_VGA },
> + { PCI_CHIP_MGAG200_EH3_PCI, PCI_CHIP_MGAG200_EH3_PCI,
> + RES_SHARED_VGA },
> { PCI_CHIP_MGAG400, PCI_CHIP_MGAG400, RES_SHARED_VGA },
> { PCI_CHIP_MGAG550, PCI_CHIP_MGAG550, RES_SHARED_VGA },
> { -1, -1, RES_UNDEFINED }
> @@ -693,6 +713,7 @@ MGAPciProbe(DriverPtr drv, int entity_num, struct pci_device * dev,
> case PCI_CHIP_MGAG200_ER_PCI:
> case PCI_CHIP_MGAG200_WINBOND_PCI:
> case PCI_CHIP_MGAG200_EH_PCI:
> + case PCI_CHIP_MGAG200_EH3_PCI:
> xf86DrvMsg(0, X_ERROR,
> "mga: The PCI device 0x%x at %2.2d@%2.2d:%2.2d:%1.1d has a kernel module claiming it.\n",
> dev->device_id, dev->bus, dev->domain, dev->dev, dev->func);
> @@ -948,6 +969,10 @@ MGAProbe(DriverPtr drv, int flags)
> attrib_no = 16;
> break;
>
> + case PCI_CHIP_MGAG200_EH3_PCI:
> + attrib_no = 17;
> + break;
> +
> default:
> return FALSE;
> }
> @@ -1567,7 +1592,8 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags)
> pMga->is_G200EV = (pMga->Chipset == PCI_CHIP_MGAG200_EV_PCI);
> pMga->is_G200WB = (pMga->Chipset == PCI_CHIP_MGAG200_WINBOND_PCI)
> || (pMga->Chipset == PCI_CHIP_MGAG200_EW3_PCI);
> - pMga->is_G200EH = (pMga->Chipset == PCI_CHIP_MGAG200_EH_PCI);
> + pMga->is_G200EH = (pMga->Chipset == PCI_CHIP_MGAG200_EH_PCI)
> + || (pMga->Chipset == PCI_CHIP_MGAG200_EH3_PCI);
> pMga->is_G200ER = (pMga->Chipset == PCI_CHIP_MGAG200_ER_PCI);
>
> pMga->DualHeadEnabled = FALSE;
> @@ -1594,6 +1620,7 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags)
> case PCI_CHIP_MGAG200_ER_PCI:
> case PCI_CHIP_MGAG200_WINBOND_PCI:
> case PCI_CHIP_MGAG200_EH_PCI:
> + case PCI_CHIP_MGAG200_EH3_PCI:
> pMga->HWCursor = FALSE;
> xf86DrvMsg(pScrn->scrnIndex, X_INFO,
> "HW cursor is not supported with video redirection on"
> @@ -2078,6 +2105,7 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags)
> case PCI_CHIP_MGAG200_EV_PCI:
> case PCI_CHIP_MGAG200_EH_PCI:
> case PCI_CHIP_MGAG200_ER_PCI:
> + case PCI_CHIP_MGAG200_EH3_PCI:
> case PCI_CHIP_MGAG400:
> case PCI_CHIP_MGAG550:
> MGAGSetupFuncs(pScrn);
> @@ -2192,6 +2220,7 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags)
> case PCI_CHIP_MGAG200_EW3_PCI:
> case PCI_CHIP_MGAG200_EV_PCI:
> case PCI_CHIP_MGAG200_EH_PCI:
> + case PCI_CHIP_MGAG200_EH3_PCI:
> case PCI_CHIP_MGAG200_ER_PCI:
> pMga->SrcOrg = 0;
> pMga->DstOrg = 0;
> @@ -2376,7 +2405,8 @@ MGAPreInit(ScrnInfoPtr pScrn, int flags)
> case PCI_CHIP_MGAG200_WINBOND_PCI:
> case PCI_CHIP_MGAG200_EW3_PCI:
> case PCI_CHIP_MGAG200_EV_PCI:
> - case PCI_CHIP_MGAG200_EH_PCI:
> + case PCI_CHIP_MGAG200_EH_PCI:
> + case PCI_CHIP_MGAG200_EH3_PCI:
> case PCI_CHIP_MGAG200_ER_PCI:
> case PCI_CHIP_MGAG400:
> case PCI_CHIP_MGAG550:
> @@ -3878,7 +3908,7 @@ MGAValidMode(SCRN_ARG_TYPE arg, DisplayModePtr mode, Bool verbose, int flags)
> } else if (pMga->is_G200EV
> && (xf86ModeBandwidth(mode, pScrn->bitsPerPixel) > 327)) {
> return MODE_BANDWIDTH;
> - } else if (pMga->is_G200EH
> + } else if (pMga->is_G200EH && (pMga->Chipset != PCI_CHIP_MGAG200_EH3_PCI)
> && (xf86ModeBandwidth(mode, pScrn->bitsPerPixel) > 375)) {
> return MODE_BANDWIDTH;
> } else if (pMga->is_G200ER
> diff --git a/src/mga_merge.c b/src/mga_merge.c
> index a257306..faa9277 100644
> --- a/src/mga_merge.c
> +++ b/src/mga_merge.c
> @@ -357,6 +357,7 @@ MGAPreInitMergedFB(ScrnInfoPtr pScrn1, int flags)
> case PCI_CHIP_MGAG200_EV_PCI:
> case PCI_CHIP_MGAG200_EH_PCI:
> case PCI_CHIP_MGAG200_ER_PCI:
> + case PCI_CHIP_MGAG200_EH3_PCI:
> case PCI_CHIP_MGAG400:
> case PCI_CHIP_MGAG550:
> MGAGSetupFuncs(pScrn);
> @@ -510,6 +511,7 @@ MGAPreInitMergedFB(ScrnInfoPtr pScrn1, int flags)
> case PCI_CHIP_MGAG200_EV_PCI:
> case PCI_CHIP_MGAG200_EH_PCI:
> case PCI_CHIP_MGAG200_ER_PCI:
> + case PCI_CHIP_MGAG200_EH3_PCI:
> case PCI_CHIP_MGAG400:
> case PCI_CHIP_MGAG550:
> maxPitch = 4096;
> diff --git a/src/mga_storm.c b/src/mga_storm.c
> index 4ef655b..c945971 100644
> --- a/src/mga_storm.c
> +++ b/src/mga_storm.c
> @@ -1152,6 +1152,7 @@ void MGAStormEngineInit( ScrnInfoPtr pScrn )
> case PCI_CHIP_MGAG200_EV_PCI:
> case PCI_CHIP_MGAG200_EH_PCI:
> case PCI_CHIP_MGAG200_ER_PCI:
> + case PCI_CHIP_MGAG200_EH3_PCI:
> pMga->SrcOrg = 0;
> OUTREG(MGAREG_SRCORG, pMga->realSrcOrg);
> OUTREG(MGAREG_DSTORG, pMga->DstOrg);
> --
> 1.8.3.1
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel
More information about the xorg-devel
mailing list