diff options
Diffstat (limited to 'src/ativalid.c')
-rw-r--r-- | src/ativalid.c | 235 |
1 files changed, 0 insertions, 235 deletions
diff --git a/src/ativalid.c b/src/ativalid.c deleted file mode 100644 index 7c798883..00000000 --- a/src/ativalid.c +++ /dev/null @@ -1,235 +0,0 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/ativalid.c,v 1.16 2003/04/23 21:51:31 tsi Exp $ */ -/* - * Copyright 1997 through 2003 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting documentation, and - * that the name of Marc Aurele La France not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. Marc Aurele La France makes no representations - * about the suitability of this software for any purpose. It is provided - * "as-is" without express or implied warranty. - * - * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO - * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -#include "atiadapter.h" -#include "atichip.h" -#include "aticrtc.h" -#include "atistruct.h" -#include "ativalid.h" - -#include "xf86.h" - -/* - * ATIValidMode -- - * - * This checks for hardware-related limits on mode timings. - */ -int -ATIValidMode -( - int iScreen, - DisplayModePtr pMode, - Bool Verbose, - int flags -) -{ - ScrnInfoPtr pScreenInfo = xf86Screens[iScreen]; - ATIPtr pATI = ATIPTR(pScreenInfo); - Bool InterlacedSeen; - int HBlankWidth, HAdjust, VScan, VInterlace; - -#ifndef AVOID_CPIO - - int VDisplay, VTotal; - -#endif /* AVOID_CPIO */ - - if (flags & MODECHECK_FINAL) - { - /* - * This is the final check before the common layer accepts a mode. - * pScreenInfo->displayWidth is set to the proposed virtual pitch - * should the mode be accepted. The only check needed here is for - * 18800's and 28800's, which don't support interlaced modes if the - * pitch is over half the chipset's maximum pitch. - */ - if (pATI->MaximumInterlacedPitch) - { - /* - * Ensure no interlaced modes have a scanline pitch larger than the - * limit. - */ - if (pMode->Flags & V_INTERLACE) - InterlacedSeen = TRUE; - else - InterlacedSeen = pATI->InterlacedSeen; - - if (InterlacedSeen && - (pScreenInfo->displayWidth > pATI->MaximumInterlacedPitch)) - return MODE_INTERLACE_WIDTH; - - pATI->InterlacedSeen = InterlacedSeen; - } - - return MODE_OK; - } - - /* - * The following is done for every mode in the monitor section that - * survives the common layer's basic checks. - */ - if (pMode->VScan <= 1) - VScan = 1; - else - VScan = pMode->VScan; - - if (pMode->Flags & V_DBLSCAN) - VScan <<= 1; - - if (pATI->OptionPanelDisplay && (pATI->LCDPanelID >= 0)) - { - if ((pMode->CrtcHDisplay > pATI->LCDHorizontal) || - (pMode->CrtcVDisplay > pATI->LCDVertical)) - return MODE_PANEL; - - if (!pATI->OptionLCDSync || (pMode->type & M_T_BUILTIN)) - { - if ((pMode->HDisplay > pATI->LCDHorizontal) || - (pMode->VDisplay > pATI->LCDVertical)) - return MODE_PANEL; - - return MODE_OK; - } - - /* - * Adjust effective timings for monitor checks. Here the modeline - * clock is ignored. Horizontal timings are scaled by the stretch - * ratio used for the displayed area. The vertical porch is scaled by - * the native resolution's aspect ratio. This seems rather arbitrary, - * and it is, but it does make all applicable VESA modes sync on a - * panel after stretching. This has the unfortunate, but necessary, - * side-effect of changing the mode's horizontal sync and vertical - * refresh rates. With some exceptions, this tends to increase the - * mode's horizontal sync rate, and decrease its vertical refresh rate. - */ - pMode->SynthClock = pATI->LCDClock; - - pMode->CrtcHTotal = pMode->CrtcHBlankEnd = - ATIDivide(pMode->CrtcHTotal * pATI->LCDHorizontal, - pMode->CrtcHDisplay, -3, 1) << 3; - pMode->CrtcHSyncEnd = - ATIDivide(pMode->CrtcHSyncEnd * pATI->LCDHorizontal, - pMode->CrtcHDisplay, -3, 1) << 3; - pMode->CrtcHSyncStart = - ATIDivide(pMode->CrtcHSyncStart * pATI->LCDHorizontal, - pMode->CrtcHDisplay, -3, -1) << 3; - pMode->CrtcHDisplay = pMode->CrtcHBlankStart = pATI->LCDHorizontal; - - pMode->CrtcVTotal = pMode->CrtcVBlankEnd = - ATIDivide((pMode->CrtcVTotal - pMode->CrtcVDisplay) * - pATI->LCDVertical, pATI->LCDHorizontal, 0, 1) + - pATI->LCDVertical; - pMode->CrtcVSyncEnd = - ATIDivide((pMode->CrtcVSyncEnd - pMode->CrtcVDisplay) * - pATI->LCDVertical, pATI->LCDHorizontal, 0, 1) + - pATI->LCDVertical; - pMode->CrtcVSyncStart = - ATIDivide((pMode->CrtcVSyncStart - pMode->CrtcVDisplay) * - pATI->LCDVertical, pATI->LCDHorizontal, 0, -1) + - pATI->LCDVertical; - pMode->CrtcVDisplay = pMode->CrtcVBlankStart = pATI->LCDVertical; - - /* - * The CRTC only stretches the mode's displayed area, not its porches. - * Reverse-engineer the mode's timings back into the user specified - * values so that the stretched mode is produced when the CRTC is - * eventually programmed. The reverse-engineered mode is then checked - * against CRTC limits below. - */ - pMode->Clock = pATI->LCDClock; - - HAdjust = pATI->LCDHorizontal - pMode->HDisplay; -# define ATIReverseHorizontal(_x) \ - (pMode->_x - HAdjust) - - pMode->HSyncStart = ATIReverseHorizontal(CrtcHSyncStart); - pMode->HSyncEnd = ATIReverseHorizontal(CrtcHSyncEnd); - pMode->HTotal = ATIReverseHorizontal(CrtcHTotal); - - VInterlace = GetBits(pMode->Flags, V_INTERLACE) + 1; -# define ATIReverseVertical(_y) \ - ((((pMode->_y - pATI->LCDVertical) * VInterlace) / VScan) + \ - pMode->VDisplay) - - pMode->VSyncStart = ATIReverseVertical(CrtcVSyncStart); - pMode->VSyncEnd = ATIReverseVertical(CrtcVSyncEnd); - pMode->VTotal = ATIReverseVertical(CrtcVTotal); - -# undef ATIReverseHorizontal -# undef ATIReverseVertical - } - - HBlankWidth = (pMode->HTotal >> 3) - (pMode->HDisplay >> 3); - if (!HBlankWidth) - return MODE_HBLANK_NARROW; - - switch (pATI->NewHW.crtc) - { - -#ifndef AVOID_CPIO - - case ATI_CRTC_VGA: - /* Prevent overscans */ - if (HBlankWidth > 63) - return MODE_HBLANK_WIDE; - - if (pMode->HDisplay > 2048) - return MODE_BAD_HVALUE; - - if (VScan > 64) - return MODE_BAD_VSCAN; - - VDisplay = pMode->VDisplay * VScan; - VTotal = pMode->VTotal * VScan; - - if ((pMode->Flags & V_INTERLACE) && (pATI->Chip < ATI_CHIP_264CT)) - { - VDisplay >>= 1; - VTotal >>= 1; - } - - if ((VDisplay > 2048) || (VTotal > 2050)) - return MODE_BAD_VVALUE; - - if (pATI->Adapter != ATI_ADAPTER_VGA) - break; - - if ((VDisplay > 1024) || (VTotal > 1025)) - return MODE_BAD_VVALUE; - - break; - -#endif /* AVOID_CPIO */ - - case ATI_CRTC_MACH64: - if (VScan > 2) - return MODE_NO_VSCAN; - - break; - - default: - break; - } - - return MODE_OK; -} |