1dfe64dd3Smacallan/* Copyright (C) 2003-2006 by XGI Technology, Taiwan. 2dfe64dd3Smacallan * 3dfe64dd3Smacallan * All Rights Reserved. 4dfe64dd3Smacallan * 5dfe64dd3Smacallan * Permission is hereby granted, free of charge, to any person obtaining 6dfe64dd3Smacallan * a copy of this software and associated documentation files (the 7dfe64dd3Smacallan * "Software"), to deal in the Software without restriction, including 8dfe64dd3Smacallan * without limitation on the rights to use, copy, modify, merge, 9dfe64dd3Smacallan * publish, distribute, sublicense, and/or sell copies of the Software, 10dfe64dd3Smacallan * and to permit persons to whom the Software is furnished to do so, 11dfe64dd3Smacallan * subject to the following conditions: 12dfe64dd3Smacallan * 13dfe64dd3Smacallan * The above copyright notice and this permission notice (including the 14dfe64dd3Smacallan * next paragraph) shall be included in all copies or substantial 15dfe64dd3Smacallan * portions of the Software. 16dfe64dd3Smacallan * 17dfe64dd3Smacallan * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18dfe64dd3Smacallan * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19dfe64dd3Smacallan * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20dfe64dd3Smacallan * NON-INFRINGEMENT. IN NO EVENT SHALL XGI AND/OR 21dfe64dd3Smacallan * ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 22dfe64dd3Smacallan * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23dfe64dd3Smacallan * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 24dfe64dd3Smacallan * DEALINGS IN THE SOFTWARE. 25dfe64dd3Smacallan */ 26dfe64dd3Smacallan#ifdef HAVE_CONFIG_H 27dfe64dd3Smacallan#include "config.h" 28dfe64dd3Smacallan#endif 29dfe64dd3Smacallan 30dfe64dd3Smacallan#include "osdef.h" 31dfe64dd3Smacallan 32dfe64dd3Smacallan#ifdef LINUX_XF86 33dfe64dd3Smacallan#include "xf86.h" 34dfe64dd3Smacallan#include "xf86PciInfo.h" 35dfe64dd3Smacallan#include "xgi.h" 36dfe64dd3Smacallan#include "xgi_regs.h" 37dfe64dd3Smacallan#endif 38dfe64dd3Smacallan 39dfe64dd3Smacallan#ifdef LINUX_KERNEL 40dfe64dd3Smacallan#include <asm/io.h> 41dfe64dd3Smacallan#include <linux/types.h> 42dfe64dd3Smacallan#include <linux/version.h> 43dfe64dd3Smacallan#include "XGIfb.h" 44dfe64dd3Smacallan#endif 45dfe64dd3Smacallan 46dfe64dd3Smacallan#include "vb_def.h" 47dfe64dd3Smacallan#include "vgatypes.h" 48dfe64dd3Smacallan#include "vb_struct.h" 49dfe64dd3Smacallan#include "vb_table.h" 50dfe64dd3Smacallan#include "vb_setmode.h" 51dfe64dd3Smacallan 52dfe64dd3Smacallan#define IndexMask 0xff 53dfe64dd3Smacallan#ifndef XGI_MASK_DUAL_CHIP 54dfe64dd3Smacallan#define XGI_MASK_DUAL_CHIP 0x04 /* SR3A */ 55dfe64dd3Smacallan#endif 56dfe64dd3Smacallan 57dfe64dd3Smacallan 58dfe64dd3SmacallanBOOLEAN CheckDualChip(PVB_DEVICE_INFO pVBInfo); 59dfe64dd3Smacallanstatic BOOLEAN XGI_IsLCDDualLink(PVB_DEVICE_INFO pVBInfo); 60dfe64dd3SmacallanBOOLEAN XGI_SetCRT2Group301(USHORT ModeNo, 61dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 62dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 63dfe64dd3SmacallanBOOLEAN XGI_BacklightByDrv(PVB_DEVICE_INFO pVBInfo); 64dfe64dd3Smacallan 65dfe64dd3SmacallanBOOLEAN XGI_IsLCDON(PVB_DEVICE_INFO pVBInfo); 66dfe64dd3SmacallanBOOLEAN XGI_DisableChISLCD(PVB_DEVICE_INFO pVBInfo); 67dfe64dd3SmacallanBOOLEAN XGI_EnableChISLCD(PVB_DEVICE_INFO pVBInfo); 68dfe64dd3SmacallanBOOLEAN XGI_AjustCRT2Rate(USHORT ModeNo, USHORT ModeIdIndex, 69dfe64dd3Smacallan USHORT RefreshRateTableIndex, USHORT * i, 70dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 71dfe64dd3SmacallanBOOLEAN XGI_GetLCDInfo(USHORT ModeNo, USHORT ModeIdIndex, 72dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 73dfe64dd3SmacallanBOOLEAN XGI_BridgeIsOn(PVB_DEVICE_INFO pVBInfo); 74dfe64dd3SmacallanUSHORT XGI_GetOffset(USHORT ModeNo, USHORT ModeIdIndex, 75dfe64dd3Smacallan USHORT RefreshRateTableIndex, 76dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 77dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 78dfe64dd3SmacallanUSHORT XGI_GetRatePtrCRT2(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, USHORT ModeIdIndex, 79dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 80dfe64dd3SmacallanUSHORT XGI_GetResInfo(USHORT ModeNo, USHORT ModeIdIndex, 81dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 82dfe64dd3SmacallanUSHORT XGI_GetVGAHT2(PVB_DEVICE_INFO pVBInfo); 83dfe64dd3Smacallanstatic unsigned XGI_GetVCLK2Ptr(USHORT ModeNo, USHORT ModeIdIndex, 84dfe64dd3Smacallan USHORT RefreshRateTableIndex, 85dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 86dfe64dd3Smacallanvoid XGI_VBLongWait(PVB_DEVICE_INFO pVBInfo); 87dfe64dd3Smacallanvoid XGI_SaveCRT2Info(USHORT ModeNo, PVB_DEVICE_INFO pVBInfo); 88dfe64dd3Smacallanvoid XGI_GetCRT2Data(USHORT ModeNo, USHORT ModeIdIndex, 89dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 90dfe64dd3Smacallanvoid XGI_GetCRT2ResInfo(USHORT ModeNo, USHORT ModeIdIndex, 91dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 92dfe64dd3Smacallanvoid XGI_PreSetGroup1(USHORT ModeNo, USHORT ModeIdIndex, 93dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 94dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 95dfe64dd3Smacallanvoid XGI_SetGroup1(USHORT ModeNo, USHORT ModeIdIndex, 96dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 97dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 98dfe64dd3Smacallanvoid XGI_SetLockRegs(USHORT ModeNo, USHORT ModeIdIndex, 99dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 100dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 101dfe64dd3Smacallanvoid XGI_SetLCDRegs(USHORT ModeNo, USHORT ModeIdIndex, 102dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 103dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 104dfe64dd3Smacallanvoid XGI_SetGroup2(USHORT ModeNo, USHORT ModeIdIndex, 105dfe64dd3Smacallan USHORT RefreshRateTableIndex, 106dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 107dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 108dfe64dd3Smacallanvoid XGI_SetGroup3(USHORT ModeNo, USHORT ModeIdIndex, 109dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 110dfe64dd3Smacallanvoid XGI_SetGroup4(USHORT ModeNo, USHORT ModeIdIndex, 111dfe64dd3Smacallan USHORT RefreshRateTableIndex, 112dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 113dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 114dfe64dd3Smacallanvoid XGI_SetGroup5(USHORT ModeNo, USHORT ModeIdIndex, 115dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 116dfe64dd3Smacallanstatic const void *XGI_GetLcdPtr(USHORT BX, USHORT ModeNo, USHORT ModeIdIndex, 117dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 118dfe64dd3Smacallanstatic const void *XGI_GetTVPtr(USHORT BX, USHORT ModeNo, USHORT ModeIdIndex, 119dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 120dfe64dd3Smacallanvoid XGI_FirePWDEnable(PVB_DEVICE_INFO pVBInfo); 121dfe64dd3Smacallanvoid XGI_EnableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, 122dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 123dfe64dd3Smacallanvoid XGI_DisableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, 124dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 125dfe64dd3Smacallanvoid XGI_SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo); 126dfe64dd3Smacallanvoid XGI_SetPanelPower(USHORT tempah, USHORT tempbl, PVB_DEVICE_INFO pVBInfo); 127dfe64dd3Smacallanvoid XGI_EnablePWD(PVB_DEVICE_INFO pVBInfo); 128dfe64dd3Smacallanvoid XGI_DisablePWD(PVB_DEVICE_INFO pVBInfo); 129dfe64dd3Smacallanvoid XGI_AutoThreshold(PVB_DEVICE_INFO pVBInfo); 130dfe64dd3Smacallanvoid XGI_SetTap4Regs(PVB_DEVICE_INFO pVBInfo); 131dfe64dd3Smacallanvoid SetDualChipRegs(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); 132dfe64dd3Smacallanvoid XGI_DisplayOn(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo); 133dfe64dd3Smacallanvoid XGI_DisplayOff(PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo); 134dfe64dd3Smacallanvoid XGI_SetCRT1Group(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, 135dfe64dd3Smacallan USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); 136dfe64dd3Smacallan/* Jong 10/03/2007 */ 137dfe64dd3Smacallanvoid XGI_SetXG21CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 138dfe64dd3Smacallanvoid XGI_SetXG21LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo); 139dfe64dd3Smacallanvoid XGI_SetXG27CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 140dfe64dd3Smacallanvoid XGI_SetXG27LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo); 141dfe64dd3Smacallanvoid XGI_UpdateXG21CRTC(USHORT ModeNo, PVB_DEVICE_INFO pVBInfo, USHORT RefreshRateTableIndex); 142dfe64dd3Smacallan 143dfe64dd3Smacallanstatic void XGI_WaitDisplay(PVB_DEVICE_INFO pVBInfo); 144dfe64dd3Smacallanvoid XGI_SenseCRT1(PVB_DEVICE_INFO pVBInfo); 145dfe64dd3Smacallan 146dfe64dd3Smacallanvoid XGI_SetCRT1CRTC(USHORT ModeNo, USHORT ModeIdIndex, 147dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo, 148dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension); 149dfe64dd3Smacallanvoid XGI_SetCRT1Timing_H(PVB_DEVICE_INFO pVBInfo, 150dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension); 151dfe64dd3Smacallanvoid XGI_SetCRT1Timing_V(USHORT ModeIdIndex, USHORT ModeNo, 152dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 153dfe64dd3Smacallanvoid XGI_SetCRT1DE(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, 154dfe64dd3Smacallan USHORT ModeIdIndex, USHORT RefreshRateTableIndex, 155dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 156dfe64dd3Smacallanvoid XGI_SetCRT1VCLK(USHORT ModeNo, USHORT ModeIdIndex, 157dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 158dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 159dfe64dd3Smacallanvoid XGI_SetCRT1FIFO(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension, 160dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 161dfe64dd3Smacallanvoid XGI_SetCRT1ModeRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, 162dfe64dd3Smacallan USHORT ModeIdIndex, USHORT RefreshRateTableIndex, 163dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 164dfe64dd3Smacallanvoid XGI_SetVCLKState(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, 165dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 166dfe64dd3Smacallan 167dfe64dd3Smacallanvoid XGI_LoadDAC(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); 168dfe64dd3Smacallanvoid XGI_SetLCDAGroup(USHORT ModeNo, USHORT ModeIdIndex, 169dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 170dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 171dfe64dd3Smacallanvoid XGI_GetLVDSResInfo(USHORT ModeNo, USHORT ModeIdIndex, 172dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 173dfe64dd3Smacallanvoid XGI_GetLVDSData(USHORT ModeNo, USHORT ModeIdIndex, 174dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 175dfe64dd3Smacallanvoid XGI_ModCRT1Regs(USHORT ModeNo, USHORT ModeIdIndex, 176dfe64dd3Smacallan USHORT RefreshRateTableIndex, 177dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 178dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 179dfe64dd3Smacallanvoid XGI_SetLVDSRegs(USHORT ModeNo, USHORT ModeIdIndex, 180dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 181dfe64dd3Smacallanvoid XGI_UpdateModeInfo(PXGI_HW_DEVICE_INFO HwDeviceExtension, 182dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 183dfe64dd3Smacallanvoid XGI_GetVBType(PVB_DEVICE_INFO pVBInfo); 184dfe64dd3Smacallanvoid XGI_GetVBInfo(USHORT ModeNo, USHORT ModeIdIndex, 185dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 186dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 187dfe64dd3Smacallanvoid XGI_GetTVInfo(USHORT ModeNo, USHORT ModeIdIndex, 188dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 189dfe64dd3Smacallanvoid XGI_SetCRT2ECLK(USHORT ModeNo, USHORT ModeIdIndex, 190dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 191dfe64dd3Smacallanvoid InitTo330Pointer(UCHAR, PVB_DEVICE_INFO pVBInfo); 192098ad5bdSmacallanvoid XGI_GetLCDSync(ULONG * HSyncWidth, ULONG * VSyncWidth, 193dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 194dfe64dd3Smacallanvoid XGI_DisableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, 195dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 196dfe64dd3Smacallanvoid XGI_EnableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, 197dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 198dfe64dd3Smacallanvoid XGI_SetCRT2VCLK(USHORT ModeNo, USHORT ModeIdIndex, 199dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo); 200dfe64dd3Smacallanvoid XGI_OEM310Setting(USHORT ModeNo, USHORT ModeIdIndex, 201dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 202dfe64dd3Smacallanvoid XGI_SetDelayComp(PVB_DEVICE_INFO pVBInfo); 203dfe64dd3Smacallanvoid XGI_SetLCDCap(PVB_DEVICE_INFO pVBInfo); 204dfe64dd3Smacallanvoid XGI_SetLCDCap_A(USHORT tempcx, PVB_DEVICE_INFO pVBInfo); 205dfe64dd3Smacallanvoid XGI_SetLCDCap_B(USHORT tempcx, PVB_DEVICE_INFO pVBInfo); 206dfe64dd3Smacallanvoid SetSpectrum(PVB_DEVICE_INFO pVBInfo); 207dfe64dd3Smacallanvoid XGI_SetAntiFlicker(USHORT ModeNo, USHORT ModeIdIndex, 208dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 209dfe64dd3Smacallanvoid XGI_SetEdgeEnhance(USHORT ModeNo, USHORT ModeIdIndex, 210dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 211dfe64dd3Smacallanvoid XGI_SetPhaseIncr(PVB_DEVICE_INFO pVBInfo); 212dfe64dd3Smacallanvoid XGI_SetYFilter(USHORT ModeNo, USHORT ModeIdIndex, 213dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 214dfe64dd3Smacallanvoid XGI_GetTVPtrIndex2(USHORT * tempbx, UCHAR * tempcl, UCHAR * tempch, 215dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 216dfe64dd3SmacallanUSHORT XGI_GetTVPtrIndex(PVB_DEVICE_INFO pVBInfo); 217dfe64dd3Smacallanvoid XGI_SetCRT2ModeRegs(USHORT ModeNo, PXGI_HW_DEVICE_INFO, 218dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 219dfe64dd3Smacallanvoid XGI_GetRAMDAC2DATA(USHORT ModeNo, USHORT ModeIdIndex, 220dfe64dd3Smacallan USHORT RefreshRateTableIndex, 221dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 222dfe64dd3Smacallanvoid XGI_UnLockCRT2(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); 223dfe64dd3Smacallanvoid XGI_LockCRT2(PXGI_HW_DEVICE_INFO, PVB_DEVICE_INFO pVBInfo); 224dfe64dd3Smacallanvoid XGINew_EnableCRT2(PVB_DEVICE_INFO pVBInfo); 225dfe64dd3Smacallanvoid XGINew_LCD_Wait_Time(UCHAR DelayTime, PVB_DEVICE_INFO pVBInfo); 226dfe64dd3Smacallanvoid XGI_SetCRT1Offset(USHORT ModeNo, USHORT ModeIdIndex, 227dfe64dd3Smacallan USHORT RefreshRateTableIndex, 228dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 229dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 230dfe64dd3Smacallanstatic void XGI_GetLCDVCLKPtr(UCHAR *di, PVB_DEVICE_INFO pVBInfo); 231dfe64dd3Smacallanstatic unsigned XGI_GetVCLKPtr(USHORT RefreshRateTableIndex, USHORT ModeNo, 232dfe64dd3Smacallan USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo); 233dfe64dd3Smacallanstatic void XGI_GetVCLKLen(unsigned vclkindex, UCHAR *di, 234dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo); 235dfe64dd3SmacallanUSHORT XGI_GetLCDCapPtr(PVB_DEVICE_INFO pVBInfo); 236dfe64dd3SmacallanUSHORT XGI_GetLCDCapPtr1(PVB_DEVICE_INFO pVBInfo); 237dfe64dd3Smacallanstatic const XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(USHORT tempcx, PVB_DEVICE_INFO pVBInfo); 238dfe64dd3Smacallan 239dfe64dd3Smacallan/* Jong 10/03/2007 */ 240dfe64dd3Smacallanvoid XGI_SetXG21FPBits(PVB_DEVICE_INFO pVBInfo); 241dfe64dd3Smacallanvoid XGI_SetXG27FPBits(PVB_DEVICE_INFO pVBInfo); 242dfe64dd3SmacallanUCHAR XGI_XG21GetPSCValue(PVB_DEVICE_INFO pVBInfo); 243dfe64dd3SmacallanUCHAR XGI_XG27GetPSCValue(PVB_DEVICE_INFO pVBInfo); 244dfe64dd3Smacallanvoid XGI_XG21BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo); 245dfe64dd3Smacallanvoid XGI_XG27BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo); 246dfe64dd3Smacallanvoid XGI_XG21SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo); 247dfe64dd3SmacallanBOOLEAN XGI_XG21CheckLVDSMode(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ); 248dfe64dd3Smacallanvoid XGI_SetXG21LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ); 249dfe64dd3Smacallanvoid XGI_SetXG27LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ); 250dfe64dd3SmacallanUCHAR XGI_SetDefaultVCLK( PVB_DEVICE_INFO pVBInfo ); 251dfe64dd3Smacallan 252dfe64dd3Smacallanconst uint8_t XGI_MDA_DAC[] = { 253dfe64dd3Smacallan 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 254dfe64dd3Smacallan 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 255dfe64dd3Smacallan 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 256dfe64dd3Smacallan 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 257dfe64dd3Smacallan 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 258dfe64dd3Smacallan 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 259dfe64dd3Smacallan 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 260dfe64dd3Smacallan 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F 261dfe64dd3Smacallan}; 262dfe64dd3Smacallan 263dfe64dd3Smacallanconst uint8_t XGI_CGA_DAC[] = { 264dfe64dd3Smacallan 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15, 265dfe64dd3Smacallan 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15, 266dfe64dd3Smacallan 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F, 267dfe64dd3Smacallan 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F, 268dfe64dd3Smacallan 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15, 269dfe64dd3Smacallan 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15, 270dfe64dd3Smacallan 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F, 271dfe64dd3Smacallan 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F 272dfe64dd3Smacallan}; 273dfe64dd3Smacallan 274dfe64dd3Smacallanconst uint8_t XGI_EGA_DAC[] = { 275dfe64dd3Smacallan 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x05, 0x15, 276dfe64dd3Smacallan 0x20, 0x30, 0x24, 0x34, 0x21, 0x31, 0x25, 0x35, 277dfe64dd3Smacallan 0x08, 0x18, 0x0C, 0x1C, 0x09, 0x19, 0x0D, 0x1D, 278dfe64dd3Smacallan 0x28, 0x38, 0x2C, 0x3C, 0x29, 0x39, 0x2D, 0x3D, 279dfe64dd3Smacallan 0x02, 0x12, 0x06, 0x16, 0x03, 0x13, 0x07, 0x17, 280dfe64dd3Smacallan 0x22, 0x32, 0x26, 0x36, 0x23, 0x33, 0x27, 0x37, 281dfe64dd3Smacallan 0x0A, 0x1A, 0x0E, 0x1E, 0x0B, 0x1B, 0x0F, 0x1F, 282dfe64dd3Smacallan 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F 283dfe64dd3Smacallan}; 284dfe64dd3Smacallan 285dfe64dd3Smacallanconst uint8_t XGI_VGA_DAC[] = { 286dfe64dd3Smacallan 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15, 287dfe64dd3Smacallan 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F, 288dfe64dd3Smacallan 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18, 289dfe64dd3Smacallan 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F, 290dfe64dd3Smacallan 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F, 291dfe64dd3Smacallan 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00, 292dfe64dd3Smacallan 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18, 293dfe64dd3Smacallan 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04, 294dfe64dd3Smacallan 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10, 295dfe64dd3Smacallan 0x0B, 0x0C, 0x0D, 0x0F, 0x10 296dfe64dd3Smacallan}; 297dfe64dd3Smacallan 298dfe64dd3Smacallan 299dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 300dfe64dd3Smacallan/* Function : InitTo330Pointer */ 301dfe64dd3Smacallan/* Input : */ 302dfe64dd3Smacallan/* Output : */ 303dfe64dd3Smacallan/* Description : */ 304dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 305dfe64dd3Smacallanvoid 306dfe64dd3SmacallanInitTo330Pointer(UCHAR ChipType, PVB_DEVICE_INFO pVBInfo) 307dfe64dd3Smacallan{ 308dfe64dd3Smacallan pVBInfo->SModeIDTable = XGI330_SModeIDTable; 309dfe64dd3Smacallan pVBInfo->StandTable = XGI330_StandTable; 310dfe64dd3Smacallan pVBInfo->EModeIDTable = XGI330_EModeIDTable; 311dfe64dd3Smacallan pVBInfo->RefIndex = XGI330_RefIndex; 312dfe64dd3Smacallan pVBInfo->XGINEWUB_CRT1Table = XGI_CRT1Table; 313dfe64dd3Smacallan 314dfe64dd3Smacallan /* add for new UNIVGABIOS */ 315dfe64dd3Smacallan /* XGINew_UBLCDDataTable = (XGI_LCDDataTablStruct *) XGI_LCDDataTable ; */ 316dfe64dd3Smacallan /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable ; */ 317dfe64dd3Smacallan 318dfe64dd3Smacallan 319dfe64dd3Smacallan if (ChipType >= XG40) { 320dfe64dd3Smacallan (void) memcpy(pVBInfo->MCLKData, XGI340New_MCLKData, sizeof(XGI340New_MCLKData)); 321dfe64dd3Smacallan (void) memcpy(pVBInfo->ECLKData, XGI340_ECLKData, sizeof(XGI340_ECLKData)); 322dfe64dd3Smacallan } 323dfe64dd3Smacallan else { 324dfe64dd3Smacallan (void) memcpy(pVBInfo->MCLKData, XGI330New_MCLKData, sizeof(XGI330New_MCLKData)); 325dfe64dd3Smacallan (void) memcpy(pVBInfo->ECLKData, XGI330_ECLKData, sizeof(XGI330_ECLKData)); 326dfe64dd3Smacallan } 327dfe64dd3Smacallan 328098ad5bdSmacallan pVBInfo->VCLKData = (const XGI_VCLKDataStruct *)XGI_VCLKData; 329098ad5bdSmacallan pVBInfo->VBVCLKData = (const XGI_VBVCLKDataStruct *)XGI_VBVCLKData; 330dfe64dd3Smacallan pVBInfo->ScreenOffset = XGI330_ScreenOffset; 331dfe64dd3Smacallan pVBInfo->StResInfo = XGI330_StResInfo; 332dfe64dd3Smacallan pVBInfo->ModeResInfo = XGI330_ModeResInfo; 333dfe64dd3Smacallan 334dfe64dd3Smacallan pVBInfo->OutputSelect = XGI330_OutputSelect; 335dfe64dd3Smacallan pVBInfo->SoftSetting = XGI330_SoftSetting; 336dfe64dd3Smacallan pVBInfo->SR07 = XGI330_SR07; 337dfe64dd3Smacallan pVBInfo->LCDResInfo = 0; 338dfe64dd3Smacallan pVBInfo->LCDTypeInfo = 0; 339dfe64dd3Smacallan pVBInfo->LCDInfo = 0; 340dfe64dd3Smacallan pVBInfo->VBInfo = 0; 341dfe64dd3Smacallan pVBInfo->TVInfo = 0; 342dfe64dd3Smacallan 343dfe64dd3Smacallan 344dfe64dd3Smacallan (void) memcpy(pVBInfo->SR15, XGI340_SR13, sizeof(XGI340_SR13)); 345dfe64dd3Smacallan (void) memcpy(pVBInfo->CR40, XGI340_CR41, sizeof(XGI340_CR41)); 346dfe64dd3Smacallan (void) memcpy(pVBInfo->SR25, XGI330_SR25, sizeof(XGI330_SR25)); 347dfe64dd3Smacallan pVBInfo->SR31 = XGI330_SR31; 348dfe64dd3Smacallan pVBInfo->SR32 = XGI330_SR32; 349dfe64dd3Smacallan (void) memcpy(pVBInfo->CR6B, XGI340_CR6B, sizeof(XGI340_CR6B)); 350dfe64dd3Smacallan if (ChipType == XG45) { 351dfe64dd3Smacallan (void) memcpy(pVBInfo->XG45CR6E, XGI45_CR6E, sizeof(XGI45_CR6E)); 352dfe64dd3Smacallan (void) memcpy(pVBInfo->XG45CR6F, XGI45_CR6F, sizeof(XGI45_CR6F)); 353dfe64dd3Smacallan } 354dfe64dd3Smacallan else { 355dfe64dd3Smacallan (void) memcpy(pVBInfo->CR6E, XGI340_CR6E, sizeof(XGI340_CR6E)); 356dfe64dd3Smacallan (void) memcpy(pVBInfo->CR6F, XGI340_CR6F, sizeof(XGI340_CR6F)); 357dfe64dd3Smacallan } 358dfe64dd3Smacallan (void) memcpy(pVBInfo->CR89, XGI340_CR89, sizeof(XGI340_CR89)); 359dfe64dd3Smacallan (void) memcpy(pVBInfo->AGPReg, XGI340_AGPReg, sizeof(XGI340_AGPReg)); 360dfe64dd3Smacallan (void) memcpy(pVBInfo->SR16, XGI340_SR16, sizeof(XGI340_SR16)); 361dfe64dd3Smacallan pVBInfo->CRCF = XG40_CRCF; 362dfe64dd3Smacallan pVBInfo->DRAMTypeDefinition = XG40_DRAMTypeDefinition; 363dfe64dd3Smacallan 364dfe64dd3Smacallan 365dfe64dd3Smacallan (void) memcpy(pVBInfo->CR49, XGI330_CR49, sizeof(XGI330_CR49)); 366dfe64dd3Smacallan pVBInfo->SR1F = XGI330_SR1F; 367dfe64dd3Smacallan pVBInfo->SR21 = XGI330_SR21; 368dfe64dd3Smacallan pVBInfo->SR22 = XGI330_SR22; 369dfe64dd3Smacallan pVBInfo->SR23 = XGI330_SR23; 370dfe64dd3Smacallan pVBInfo->SR24 = XGI330_SR24; 371dfe64dd3Smacallan pVBInfo->SR33 = XGI330_SR33; 372dfe64dd3Smacallan 373dfe64dd3Smacallan 374dfe64dd3Smacallan 375dfe64dd3Smacallan pVBInfo->CRT2Data_1_2 = XGI330_CRT2Data_1_2; 376dfe64dd3Smacallan pVBInfo->CRT2Data_4_D = XGI330_CRT2Data_4_D; 377dfe64dd3Smacallan pVBInfo->CRT2Data_4_E = XGI330_CRT2Data_4_E; 378dfe64dd3Smacallan pVBInfo->CRT2Data_4_10 = XGI330_CRT2Data_4_10; 379dfe64dd3Smacallan pVBInfo->pRGBSenseData = &XGI330_RGBSenseData; 380dfe64dd3Smacallan pVBInfo->pVideoSenseData = &XGI330_VideoSenseData; 381dfe64dd3Smacallan pVBInfo->pYCSenseData = &XGI330_YCSenseData; 382dfe64dd3Smacallan pVBInfo->pRGBSenseData2 = &XGI330_RGBSenseData2; 383dfe64dd3Smacallan pVBInfo->pVideoSenseData2 = &XGI330_VideoSenseData2; 384dfe64dd3Smacallan pVBInfo->pYCSenseData2 = &XGI330_YCSenseData2; 385dfe64dd3Smacallan 386dfe64dd3Smacallan pVBInfo->NTSCTiming = XGI330_NTSCTiming; 387dfe64dd3Smacallan pVBInfo->PALTiming = XGI330_PALTiming; 388dfe64dd3Smacallan pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming; 389dfe64dd3Smacallan pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing; 390dfe64dd3Smacallan pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing; 391dfe64dd3Smacallan pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming; 392dfe64dd3Smacallan pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming; 393dfe64dd3Smacallan pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming; 394dfe64dd3Smacallan pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming; 395dfe64dd3Smacallan pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data; 396dfe64dd3Smacallan pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu; 397dfe64dd3Smacallan pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text; 398dfe64dd3Smacallan pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3; 399dfe64dd3Smacallan pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3; 400dfe64dd3Smacallan 401dfe64dd3Smacallan 402dfe64dd3Smacallan (void) memcpy(& pVBInfo->TimingH, XGI_TimingH, sizeof(XGI_TimingH)); 403dfe64dd3Smacallan (void) memcpy(& pVBInfo->TimingV, XGI_TimingV, sizeof(XGI_TimingV)); 404dfe64dd3Smacallan 405dfe64dd3Smacallan /* Jong 10/17/2007; merge code */ 406dfe64dd3Smacallan pVBInfo->UpdateCRT1 = (XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table ; 407dfe64dd3Smacallan 408dfe64dd3Smacallan pVBInfo->CHTVVCLKUNTSC = XGI330_CHTVVCLKUNTSC; 409dfe64dd3Smacallan pVBInfo->CHTVVCLKONTSC = XGI330_CHTVVCLKONTSC; 410dfe64dd3Smacallan pVBInfo->CHTVVCLKUPAL = XGI330_CHTVVCLKUPAL; 411dfe64dd3Smacallan pVBInfo->CHTVVCLKOPAL = XGI330_CHTVVCLKOPAL; 412dfe64dd3Smacallan 413dfe64dd3Smacallan /* 310 customization related */ 414dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType & VB_XGI302LV)) 415dfe64dd3Smacallan pVBInfo->LCDCapList = XGI_LCDDLCapList; 416dfe64dd3Smacallan else 417dfe64dd3Smacallan pVBInfo->LCDCapList = XGI_LCDCapList; 418dfe64dd3Smacallan 419dfe64dd3Smacallan /* Jong 10/03/2007 */ 420dfe64dd3Smacallan if ( ( ChipType == XG21 ) || ( ChipType == XG27 ) ) 421dfe64dd3Smacallan pVBInfo->XG21_LVDSCapList = XGI21_LCDCapList ; 422dfe64dd3Smacallan 423dfe64dd3Smacallan pVBInfo->XGI_TVDelayList = XGI301TVDelayList; 424dfe64dd3Smacallan pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2; 425dfe64dd3Smacallan 426dfe64dd3Smacallan 427dfe64dd3Smacallan pVBInfo->I2CDefinition = XG40_I2CDefinition; 428dfe64dd3Smacallan 429dfe64dd3Smacallan /* Jong 10/03/2007 */ 430dfe64dd3Smacallan if (ChipType >= XG20) 431dfe64dd3Smacallan pVBInfo->CR97 = XG20_CR97; 432dfe64dd3Smacallan 433dfe64dd3Smacallan 434dfe64dd3Smacallan /* Jong 10/03/2007 */ 435dfe64dd3Smacallan if ( ChipType == XG27 ) 436dfe64dd3Smacallan { 437dfe64dd3Smacallan /* pVBInfo->MCLKData = (XGI_MCLKDataStruct *) XGI27New_MCLKData ; */ 438dfe64dd3Smacallan (void) memcpy(pVBInfo->MCLKData, XGI27New_MCLKData, sizeof(XGI27New_MCLKData)); 439dfe64dd3Smacallan 440dfe64dd3Smacallan /* pVBInfo->CR40 = XGI27_cr41 ; */ 441dfe64dd3Smacallan (void) memcpy(pVBInfo->CR40, XGI27_cr41, sizeof(XGI27_cr41)); 442dfe64dd3Smacallan 443dfe64dd3Smacallan pVBInfo->CR97 = XG27_CR97 ; 444dfe64dd3Smacallan pVBInfo->pSR36 = &XG27_SR36 ; 445dfe64dd3Smacallan pVBInfo->pCR8F = &XG27_CR8F ; 446dfe64dd3Smacallan pVBInfo->pCRD0 = XG27_CRD0 ; 447dfe64dd3Smacallan pVBInfo->pCRDE = XG27_CRDE ; 448dfe64dd3Smacallan pVBInfo->pSR40 = &XG27_SR40 ; 449dfe64dd3Smacallan pVBInfo->pSR41 = &XG27_SR41 ; 450dfe64dd3Smacallan } 451dfe64dd3Smacallan 452dfe64dd3Smacallan if ( ChipType >= XG20 ) 453dfe64dd3Smacallan { 454dfe64dd3Smacallan pVBInfo->pDVOSetting = &XG21_DVOSetting ; 455dfe64dd3Smacallan pVBInfo->pCR2E = &XG21_CR2E ; 456dfe64dd3Smacallan pVBInfo->pCR2F = &XG21_CR2F ; 457dfe64dd3Smacallan pVBInfo->pCR46 = &XG21_CR46 ; 458dfe64dd3Smacallan pVBInfo->pCR47 = &XG21_CR47 ; 459dfe64dd3Smacallan } 460dfe64dd3Smacallan 461dfe64dd3Smacallan} 462dfe64dd3Smacallan 463dfe64dd3Smacallan 464dfe64dd3Smacallan 465dfe64dd3Smacallan 466dfe64dd3Smacallan 467dfe64dd3Smacallan 468dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 469dfe64dd3Smacallan/* Function : XGISetModeNew */ 470dfe64dd3Smacallan/* Input : */ 471dfe64dd3Smacallan/* Output : */ 472dfe64dd3Smacallan/* Description : */ 473dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 474dfe64dd3SmacallanBOOLEAN 475dfe64dd3SmacallanXGISetModeNew(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo, 476dfe64dd3Smacallan USHORT ModeNo) 477dfe64dd3Smacallan{ 478dfe64dd3Smacallan#ifndef LINUX_XF86 479dfe64dd3Smacallan ULONG temp; 480dfe64dd3Smacallan USHORT KeepLockReg; 481dfe64dd3Smacallan#endif 482dfe64dd3Smacallan USHORT ModeIdIndex; 483dfe64dd3Smacallan /* PUCHAR pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; */ 484dfe64dd3Smacallan USHORT temp_mode_no; 485dfe64dd3Smacallan 486dfe64dd3Smacallan pVBInfo->IF_DEF_LVDS = 0 ; 487dfe64dd3Smacallan pVBInfo->IF_DEF_VideoCapture = 1; 488dfe64dd3Smacallan pVBInfo->IF_DEF_ScaleLCD = 1; 489dfe64dd3Smacallan 490dfe64dd3Smacallan unsigned vga_info; /* Jong 11/28/2007 */ 491dfe64dd3Smacallan 492dfe64dd3Smacallan PDEBUG(ErrorF("XGISetModeNew()...begin\n")); 493dfe64dd3Smacallan 494dfe64dd3Smacallan /* Jong 10/03/2007 */ 495dfe64dd3Smacallan if ( HwDeviceExtension->jChipType == XG27 ) 496dfe64dd3Smacallan { 497dfe64dd3Smacallan if ( ( XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x38 ) & 0xE0 ) == 0xC0 ) 498dfe64dd3Smacallan { 499dfe64dd3Smacallan if ( XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x30 ) & 0x20 ) 500dfe64dd3Smacallan { 501dfe64dd3Smacallan pVBInfo->IF_DEF_LVDS = 1 ; 502dfe64dd3Smacallan } 503dfe64dd3Smacallan } 504dfe64dd3Smacallan } 505dfe64dd3Smacallan 506dfe64dd3Smacallan /* Jong 10/03/20007 */ 507dfe64dd3Smacallan if ( HwDeviceExtension->jChipType < XG20 ) /* kuku 2004/06/25 */ 508dfe64dd3Smacallan XGI_GetVBType( pVBInfo ) ; 509dfe64dd3Smacallan 510dfe64dd3Smacallan /* Jong 10/17/2007; merge code */ 511dfe64dd3Smacallan InitTo330Pointer( HwDeviceExtension->jChipType, pVBInfo ) ; 512dfe64dd3Smacallan 513dfe64dd3Smacallan PDEBUG(ErrorF("XGISetModeNew()...1\n")); 514dfe64dd3Smacallan 515dfe64dd3Smacallan if (ModeNo & 0x80) { 516dfe64dd3Smacallan ModeNo = ModeNo & 0x7F; 517dfe64dd3Smacallan } 518dfe64dd3Smacallan 519dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x05, 0x86); 520dfe64dd3Smacallan 521dfe64dd3Smacallan /* Jong 10/03/2007 */ 522dfe64dd3Smacallan if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 1.Openkey */ 523dfe64dd3Smacallan XGI_UnLockCRT2(HwDeviceExtension, pVBInfo); 524dfe64dd3Smacallan 525dfe64dd3Smacallan /* Jong 10/03/2007 */ 526dfe64dd3Smacallan HwDeviceExtension->SpecialMode = FALSE; 527dfe64dd3Smacallan 528dfe64dd3Smacallan/* Jong 11/27/2007 */ 529dfe64dd3Smacallan#if 0 /* can't get pScrn */ 530dfe64dd3Smacallan#if (defined(i386) || defined(__i386) || defined(__i386__) || defined(__AMD64__)) 531dfe64dd3Smacallan vga_info = XGI_GetSetBIOSScratch(pScrn, 0x489, 0xff); 532dfe64dd3Smacallan#else 533dfe64dd3Smacallan vga_info = 0x11; /* set default mode 3 */ 534dfe64dd3Smacallan#endif 535dfe64dd3Smacallan#endif 536dfe64dd3Smacallan 537dfe64dd3Smacallan PDEBUG(ErrorF("XGISetModeNew()...2\n")); 538dfe64dd3Smacallan 539dfe64dd3Smacallan if ( (!XGI_SearchModeID(pVBInfo->SModeIDTable, pVBInfo->EModeIDTable, 0x11, &ModeNo , &ModeIdIndex)) || 540dfe64dd3Smacallan (HwDeviceExtension->SpecifyTiming) ) 541dfe64dd3Smacallan { 542dfe64dd3Smacallan switch (HwDeviceExtension->BPP) 543dfe64dd3Smacallan { 544dfe64dd3Smacallan case 8: ModeNo = 0x2E; 545dfe64dd3Smacallan HwDeviceExtension->SpecialMode = TRUE; 546dfe64dd3Smacallan break; 547dfe64dd3Smacallan case 15: ModeNo = 0x43; 548dfe64dd3Smacallan HwDeviceExtension->SpecialMode = TRUE; 549dfe64dd3Smacallan break; 550dfe64dd3Smacallan case 16: ModeNo = 0x44; 551dfe64dd3Smacallan HwDeviceExtension->SpecialMode = TRUE; 552dfe64dd3Smacallan break; 553dfe64dd3Smacallan case 32: ModeNo = 0x62; 554dfe64dd3Smacallan HwDeviceExtension->SpecialMode = TRUE; 555dfe64dd3Smacallan break; 556dfe64dd3Smacallan default: 557dfe64dd3Smacallan return FALSE; 558dfe64dd3Smacallan break; 559dfe64dd3Smacallan } 560dfe64dd3Smacallan 561dfe64dd3Smacallan /* Jong 10/03/2007 */ 562dfe64dd3Smacallan if (HwDeviceExtension->SpecialMode) 563dfe64dd3Smacallan { 564dfe64dd3Smacallan 565dfe64dd3Smacallan /* Jong 11/28/2007; pVBInfo field is not matching VGAINFO argument */ 566dfe64dd3Smacallan /* XGI_SearchModeID( pVBInfo->SModeIDTable, pVBInfo->EModeIDTable, pVBInfo, &ModeNo , &ModeIdIndex ) ; */ 567dfe64dd3Smacallan XGI_SearchModeID( pVBInfo->SModeIDTable, pVBInfo->EModeIDTable, 0x11, &ModeNo , &ModeIdIndex ) ; 568dfe64dd3Smacallan if ( !(HwDeviceExtension->SpecifyTiming) ) 569dfe64dd3Smacallan { 570dfe64dd3Smacallan int i = 0; 571dfe64dd3Smacallan while ( SpecialModeTiming[i].Horizontal_ACTIVE != 0 ) 572dfe64dd3Smacallan { 573dfe64dd3Smacallan if ( ( SpecialModeTiming[i].Horizontal_ACTIVE==HwDeviceExtension->Horizontal_ACTIVE ) && 574dfe64dd3Smacallan ( (SpecialModeTiming[i].Vertical_ACTIVE<<(SpecialModeTiming[i].Interlace&0x1))==HwDeviceExtension->Vertical_ACTIVE ) ) 575dfe64dd3Smacallan { 576dfe64dd3Smacallan if ( ( ( SpecialModeTiming[i].FrameRate-HwDeviceExtension->Frequency ) < 2.0 ) || 577dfe64dd3Smacallan ( ( SpecialModeTiming[i].FrameRate-HwDeviceExtension->Frequency ) > -2.0 ) ) 578dfe64dd3Smacallan { 579dfe64dd3Smacallan HwDeviceExtension->Horizontal_FP = SpecialModeTiming[i].Horizontal_FP; 580dfe64dd3Smacallan HwDeviceExtension->Horizontal_SYNC = SpecialModeTiming[i].Horizontal_SYNC; 581dfe64dd3Smacallan HwDeviceExtension->Horizontal_BP = SpecialModeTiming[i].Horizontal_BP; 582dfe64dd3Smacallan HwDeviceExtension->Vertical_FP = SpecialModeTiming[i].Vertical_FP; 583dfe64dd3Smacallan HwDeviceExtension->Vertical_SYNC = SpecialModeTiming[i].Vertical_SYNC; 584dfe64dd3Smacallan HwDeviceExtension->Vertical_BP = SpecialModeTiming[i].Vertical_BP; 585dfe64dd3Smacallan HwDeviceExtension->DCLK = SpecialModeTiming[i].DCLK; 586dfe64dd3Smacallan HwDeviceExtension->Interlace = SpecialModeTiming[i].Interlace & 0x1; 587dfe64dd3Smacallan break; 588dfe64dd3Smacallan } 589dfe64dd3Smacallan } 590dfe64dd3Smacallan i++; 591dfe64dd3Smacallan } 592dfe64dd3Smacallan if ( SpecialModeTiming[i].Horizontal_ACTIVE == 0 ) 593dfe64dd3Smacallan { 594dfe64dd3Smacallan return FALSE; /* currently not support */ 595dfe64dd3Smacallan } 596dfe64dd3Smacallan } 597dfe64dd3Smacallan } 598dfe64dd3Smacallan } 599dfe64dd3Smacallan 600dfe64dd3Smacallan PDEBUG(ErrorF("XGISetModeNew()...3\n")); 601dfe64dd3Smacallan 602dfe64dd3Smacallan if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */ 603dfe64dd3Smacallan PDEBUG(ErrorF("XGI_GetVBInfo \n")); 604dfe64dd3Smacallan XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo); 605dfe64dd3Smacallan PDEBUG(ErrorF("XGI_GetTVInfo \n")); 606dfe64dd3Smacallan XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo); 607dfe64dd3Smacallan PDEBUG(ErrorF("XGI_GetLCDInfo \n")); 608dfe64dd3Smacallan XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo); 609dfe64dd3Smacallan PDEBUG(ErrorF("XGI_DisableBridge \n")); 610dfe64dd3Smacallan 611dfe64dd3Smacallan /* Jong 10/17/2007; merge code */ 612dfe64dd3Smacallan if ( pVBInfo->VBInfo & ( SetSimuScanMode | SwitchToCRT2 ) ) 613dfe64dd3Smacallan { 614dfe64dd3Smacallan if (HwDeviceExtension->SpecialMode) 615dfe64dd3Smacallan { 616dfe64dd3Smacallan return FALSE; 617dfe64dd3Smacallan } 618dfe64dd3Smacallan } 619dfe64dd3Smacallan 620dfe64dd3Smacallan XGI_DisableBridge(HwDeviceExtension, pVBInfo); 621dfe64dd3Smacallan 622dfe64dd3Smacallan 623dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToLCDA)) { 624dfe64dd3Smacallan XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex, pVBInfo); 625dfe64dd3Smacallan 626dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCDA) { 627dfe64dd3Smacallan XGI_SetLCDAGroup(ModeNo, ModeIdIndex, HwDeviceExtension, 628dfe64dd3Smacallan pVBInfo); 629dfe64dd3Smacallan } 630dfe64dd3Smacallan } 631dfe64dd3Smacallan else { 632dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SwitchToCRT2)) { 633dfe64dd3Smacallan XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex, 634dfe64dd3Smacallan pVBInfo); 635dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCDA) { 636dfe64dd3Smacallan XGI_SetLCDAGroup(ModeNo, ModeIdIndex, HwDeviceExtension, 637dfe64dd3Smacallan pVBInfo); 638dfe64dd3Smacallan } 639dfe64dd3Smacallan } 640dfe64dd3Smacallan } 641dfe64dd3Smacallan 642dfe64dd3Smacallan PDEBUG(ErrorF(" vb_setmode 474\n")); // yilin 643dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchToCRT2)) { 644dfe64dd3Smacallan switch (HwDeviceExtension->ujVBChipID) { 645dfe64dd3Smacallan case VB_CHIP_301: 646dfe64dd3Smacallan PDEBUG(ErrorF(" vb_setmode 301\n")); //yilin 647dfe64dd3Smacallan XGI_SetCRT2Group301(ModeNo, HwDeviceExtension, pVBInfo); /*add for CRT2 */ 648dfe64dd3Smacallan break; 649dfe64dd3Smacallan 650dfe64dd3Smacallan case VB_CHIP_302: 651dfe64dd3Smacallan XGI_SetCRT2Group301(ModeNo, HwDeviceExtension, pVBInfo); /*add for CRT2 */ 652dfe64dd3Smacallan break; 653dfe64dd3Smacallan 654dfe64dd3Smacallan default: 655dfe64dd3Smacallan break; 656dfe64dd3Smacallan } 657dfe64dd3Smacallan } 658dfe64dd3Smacallan ErrorF("492 Part2 0 = %x ", 659dfe64dd3Smacallan XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); 660dfe64dd3Smacallan XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo); 661dfe64dd3Smacallan XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212 */ 662dfe64dd3Smacallan XGI_EnableBridge(HwDeviceExtension, pVBInfo); 663dfe64dd3Smacallan ErrorF("497 Part2 0 = %x ", 664dfe64dd3Smacallan XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); 665dfe64dd3Smacallan } /* !XG20 */ 666dfe64dd3Smacallan else 667dfe64dd3Smacallan { 668dfe64dd3Smacallan PDEBUG(ErrorF("XGISetModeNew()...4\n")); 669dfe64dd3Smacallan 670dfe64dd3Smacallan /* Jong 10/04/2007 */ 671dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 1 ) 672dfe64dd3Smacallan { 673dfe64dd3Smacallan if ( !XGI_XG21CheckLVDSMode(ModeNo , ModeIdIndex, pVBInfo) ) 674dfe64dd3Smacallan { 675dfe64dd3Smacallan return FALSE; 676dfe64dd3Smacallan } 677dfe64dd3Smacallan } 678dfe64dd3Smacallan 679dfe64dd3Smacallan PDEBUG(ErrorF("XGISetModeNew()...5\n")); 680dfe64dd3Smacallan 681dfe64dd3Smacallan if (ModeNo <= 0x13) { 682dfe64dd3Smacallan pVBInfo->ModeType = 683dfe64dd3Smacallan pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag & ModeInfoFlag; 684dfe64dd3Smacallan } 685dfe64dd3Smacallan else { 686dfe64dd3Smacallan pVBInfo->ModeType = 687dfe64dd3Smacallan pVBInfo->EModeIDTable[ModeIdIndex]. 688dfe64dd3Smacallan Ext_ModeFlag & ModeInfoFlag; 689dfe64dd3Smacallan } 690dfe64dd3Smacallan 691dfe64dd3Smacallan pVBInfo->SetFlag = 0; 692dfe64dd3Smacallan if ( pVBInfo->IF_DEF_CH7007 != 1 ) 693dfe64dd3Smacallan { 694dfe64dd3Smacallan pVBInfo->VBInfo = DisableCRT2Display; 695dfe64dd3Smacallan } 696dfe64dd3Smacallan 697dfe64dd3Smacallan PDEBUG(ErrorF("XGISetModeNew()...6\n")); 698dfe64dd3Smacallan 699dfe64dd3Smacallan XGI_DisplayOff(HwDeviceExtension,pVBInfo); 700dfe64dd3Smacallan PDEBUG(ErrorF("XGISetModeNew()...7\n")); 701dfe64dd3Smacallan 702dfe64dd3Smacallan XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex, pVBInfo); 703dfe64dd3Smacallan 704dfe64dd3Smacallan PDEBUG(ErrorF("XGISetModeNew()...8\n")); 705dfe64dd3Smacallan 706dfe64dd3Smacallan XGI_DisplayOn(HwDeviceExtension, pVBInfo); 707dfe64dd3Smacallan 708dfe64dd3Smacallan PDEBUG(ErrorF("XGISetModeNew()...9\n")); 709dfe64dd3Smacallan } 710dfe64dd3Smacallan 711dfe64dd3Smacallan/* 712dfe64dd3Smacallan if ( ModeNo <= 0x13 ) 713dfe64dd3Smacallan { 714dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; 715dfe64dd3Smacallan } 716dfe64dd3Smacallan else 717dfe64dd3Smacallan { 718dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; 719dfe64dd3Smacallan } 720dfe64dd3Smacallan pVBInfo->ModeType = modeflag&ModeInfoFlag ; 721dfe64dd3Smacallan pVBInfo->SetFlag = 0x00 ; 722dfe64dd3Smacallan pVBInfo->VBInfo = DisableCRT2Display ; 723dfe64dd3Smacallan temp = XGINew_CheckMemorySize( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ; 724dfe64dd3Smacallan 725dfe64dd3Smacallan if ( temp == 0 ) 726dfe64dd3Smacallan return( 0 ) ; 727dfe64dd3Smacallan 728dfe64dd3Smacallan XGI_DisplayOff( HwDeviceExtension,pVBInfo) ; 729dfe64dd3Smacallan XGI_SetCRT1Group( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ; 730dfe64dd3Smacallan XGI_DisplayOn( HwDeviceExtension, pVBInfo) ; 731dfe64dd3Smacallan*/ 732dfe64dd3Smacallan ErrorF("Part2 0 = %x ", 733dfe64dd3Smacallan XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); 734dfe64dd3Smacallan XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo); 735dfe64dd3Smacallan 736dfe64dd3Smacallan /* Jong 10/04/2007 */ 737dfe64dd3Smacallan if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 */ 738dfe64dd3Smacallan XGI_LockCRT2(HwDeviceExtension, pVBInfo); 739dfe64dd3Smacallan 740dfe64dd3Smacallan PDEBUG(ErrorF("XGISetModeNew()...End\n")); 741dfe64dd3Smacallan 742dfe64dd3Smacallan return (TRUE); 743dfe64dd3Smacallan} 744dfe64dd3Smacallan 745dfe64dd3Smacallan#if 1 746dfe64dd3Smacallanvoid XGI_SetCRTVCLK(PVB_DEVICE_INFO pVBInfo, double dwPixelClock) 747dfe64dd3Smacallan{ 748dfe64dd3Smacallanstruct factor 749dfe64dd3Smacallan{ 750dfe64dd3Smacallan int sr2b7; 751dfe64dd3Smacallan int sr2c7; 752dfe64dd3Smacallan int sr2c6; 753dfe64dd3Smacallan int sr2c5; 754dfe64dd3Smacallan int dividend ; 755dfe64dd3Smacallan int divisor ; 756dfe64dd3Smacallan}; 757dfe64dd3Smacallan 758dfe64dd3Smacallanstruct factor kind[16]= 759dfe64dd3Smacallan{ 760dfe64dd3Smacallan {0,0,0,0,1,1}, 761dfe64dd3Smacallan {0,0,0,1,1,2}, 762dfe64dd3Smacallan {0,0,1,0,1,3}, 763dfe64dd3Smacallan {0,0,1,1,1,4}, 764dfe64dd3Smacallan {1,0,0,0,2,1}, 765dfe64dd3Smacallan {1,0,0,1,2,2}, 766dfe64dd3Smacallan {1,0,1,0,2,3}, 767dfe64dd3Smacallan {1,0,1,1,2,4}, 768dfe64dd3Smacallan {0,1,0,0,1,1}, 769dfe64dd3Smacallan {0,1,0,1,1,4}, 770dfe64dd3Smacallan {0,1,1,0,1,6}, 771dfe64dd3Smacallan {0,1,1,1,1,8}, 772dfe64dd3Smacallan {1,1,0,0,2,1}, 773dfe64dd3Smacallan {1,1,0,1,2,4}, 774dfe64dd3Smacallan {1,1,1,0,2,6}, 775dfe64dd3Smacallan {1,1,1,1,2,8} 776dfe64dd3Smacallan}; 777dfe64dd3Smacallan int ii,jj,kk,ll,sr2b,sr2c,Numerator,DeNumerator; 778dfe64dd3Smacallan double factor1,tempclock,vclk,temp1,min,clock; 779dfe64dd3Smacallan double min_tempclock=150.0; 780dfe64dd3Smacallan 781dfe64dd3Smacallan /* Alan 12/14/2007; support LVDS */ 782dfe64dd3Smacallan USHORT XGINew_P3cc = pVBInfo->P3cc; 783dfe64dd3Smacallan UCHAR b3CC; 784dfe64dd3Smacallan 785dfe64dd3Smacallan vclk=(double)dwPixelClock; 786dfe64dd3Smacallan min=99.0; 787dfe64dd3Smacallan while (min_tempclock>0.0) 788dfe64dd3Smacallan { 789dfe64dd3Smacallan for(ii=2;ii<=31;ii++) /* (DeNumerator1)It's value must >=2 */ 790dfe64dd3Smacallan { 791dfe64dd3Smacallan for(jj=0;jj<=127;jj++) /* (Numerator1) */ 792dfe64dd3Smacallan { 793dfe64dd3Smacallan for(kk=0;kk<=15;kk++) 794dfe64dd3Smacallan { 795dfe64dd3Smacallan tempclock=14.318*kind[kk].dividend*(jj+1)/(ii+1); 796dfe64dd3Smacallan if ( (tempclock >= min_tempclock ) && ( tempclock <= 380) ) 797dfe64dd3Smacallan { 798dfe64dd3Smacallan tempclock = tempclock / kind[kk].divisor ; 799dfe64dd3Smacallan temp1=fabs(vclk-tempclock); 800dfe64dd3Smacallan if(temp1<min) 801dfe64dd3Smacallan { 802dfe64dd3Smacallan clock=tempclock; 803dfe64dd3Smacallan DeNumerator=ii; 804dfe64dd3Smacallan Numerator=jj; 805dfe64dd3Smacallan min=temp1; 806dfe64dd3Smacallan factor1=(double) (kind[kk].dividend / kind[kk].divisor); 807dfe64dd3Smacallan ll=kk; 808dfe64dd3Smacallan } 809dfe64dd3Smacallan } 810dfe64dd3Smacallan } 811dfe64dd3Smacallan } 812dfe64dd3Smacallan } 813dfe64dd3Smacallan 814dfe64dd3Smacallan if ((min/vclk)<0.01) 815dfe64dd3Smacallan { 816dfe64dd3Smacallan break; 817dfe64dd3Smacallan } 818dfe64dd3Smacallan else 819dfe64dd3Smacallan { 820dfe64dd3Smacallan min_tempclock -= 50.0; 821dfe64dd3Smacallan } 822dfe64dd3Smacallan } 823dfe64dd3Smacallan 824dfe64dd3Smacallan sr2b=128*kind[ll].sr2b7+Numerator; 825dfe64dd3Smacallan sr2c=128*kind[ll].sr2c7+64*kind[ll].sr2c6+32*kind[ll].sr2c5+DeNumerator; 826dfe64dd3Smacallan 827dfe64dd3Smacallan if(pVBInfo->IF_DEF_LVDS == 1) 828dfe64dd3Smacallan { 829dfe64dd3Smacallan b3CC = (UCHAR)XGI_GetRegByte((XGIIOADDRESS) XGINew_P3cc) ; 830dfe64dd3Smacallan switch (b3CC & 0x0c ) 831dfe64dd3Smacallan { 832dfe64dd3Smacallan case 0x0 : XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x31, 0xCF, 0x10); 833dfe64dd3Smacallan break; 834dfe64dd3Smacallan case 0x4 : XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x31, 0xCF, 0x20); 835dfe64dd3Smacallan break; 836dfe64dd3Smacallan default : XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x31, 0xCF, 0x00); 837dfe64dd3Smacallan break; 838dfe64dd3Smacallan } 839dfe64dd3Smacallan } 840dfe64dd3Smacallan 841dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2B , (unsigned char) sr2b) ; 842dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x2C , (unsigned char) sr2c) ; 843dfe64dd3Smacallan} 844dfe64dd3Smacallan#else 845dfe64dd3Smacallan/* Jong 10/17/2007; merge code */ 846dfe64dd3Smacallanvoid XGI_SetCRTVCLK(PVB_DEVICE_INFO pVBInfo, double dwPixelClock) 847dfe64dd3Smacallan{ 848dfe64dd3Smacallanstruct factor 849dfe64dd3Smacallan{ 850dfe64dd3Smacallan int sr2b7; 851dfe64dd3Smacallan int sr2c7; 852dfe64dd3Smacallan int sr2c6; 853dfe64dd3Smacallan int sr2c5; 854dfe64dd3Smacallan int dividend ; 855dfe64dd3Smacallan int divisor ; 856dfe64dd3Smacallan}; 857dfe64dd3Smacallan 858dfe64dd3Smacallanstruct factor kind[16]= 859dfe64dd3Smacallan{ 860dfe64dd3Smacallan {0,0,0,0,1,1}, 861dfe64dd3Smacallan {0,0,0,1,1,2}, 862dfe64dd3Smacallan {0,0,1,0,1,3}, 863dfe64dd3Smacallan {0,0,1,1,1,4}, 864dfe64dd3Smacallan {1,0,0,0,2,1}, 865dfe64dd3Smacallan {1,0,0,1,2,2}, 866dfe64dd3Smacallan {1,0,1,0,2,3}, 867dfe64dd3Smacallan {1,0,1,1,2,4}, 868dfe64dd3Smacallan {0,1,0,0,1,1}, 869dfe64dd3Smacallan {0,1,0,1,1,4}, 870dfe64dd3Smacallan {0,1,1,0,1,6}, 871dfe64dd3Smacallan {0,1,1,1,1,8}, 872dfe64dd3Smacallan {1,1,0,0,2,1}, 873dfe64dd3Smacallan {1,1,0,1,2,4}, 874dfe64dd3Smacallan {1,1,1,0,2,6}, 875dfe64dd3Smacallan {1,1,1,1,2,8} 876dfe64dd3Smacallan}; 877dfe64dd3Smacallan int ii,jj,kk,ll,sr2b,sr2c,Numerator,DeNumerator; 878dfe64dd3Smacallan double factor1,tempclock,vclk,temp1,min,clock; 879dfe64dd3Smacallan 880dfe64dd3Smacallan 881dfe64dd3Smacallan vclk=(double)dwPixelClock; 882dfe64dd3Smacallan min=99.0; 883dfe64dd3Smacallan for(ii=2;ii<=31;ii++) /* (DeNumerator1)It's value must >=2 */ 884dfe64dd3Smacallan { 885dfe64dd3Smacallan for(jj=0;jj<=127;jj++) /* (Numerator1) */ 886dfe64dd3Smacallan { 887dfe64dd3Smacallan 888dfe64dd3Smacallan for(kk=0;kk<=15;kk++) 889dfe64dd3Smacallan { 890dfe64dd3Smacallan tempclock=14.318*kind[kk].dividend*(jj+1)/(ii+1); 891dfe64dd3Smacallan if ( (tempclock >= 150 ) && ( tempclock <= 380) ) 892dfe64dd3Smacallan { 893dfe64dd3Smacallan tempclock = tempclock / kind[kk].divisor ; 894dfe64dd3Smacallan temp1=fabs(vclk-tempclock); 895dfe64dd3Smacallan if(temp1<min) 896dfe64dd3Smacallan { 897dfe64dd3Smacallan clock=tempclock; 898dfe64dd3Smacallan DeNumerator=ii; 899dfe64dd3Smacallan Numerator=jj; 900dfe64dd3Smacallan min=temp1; 901dfe64dd3Smacallan factor1=(double) (kind[kk].dividend / kind[kk].divisor); 902dfe64dd3Smacallan ll=kk; 903dfe64dd3Smacallan } 904dfe64dd3Smacallan } 905dfe64dd3Smacallan } 906dfe64dd3Smacallan } 907dfe64dd3Smacallan } 908dfe64dd3Smacallan sr2b=128*kind[ll].sr2b7+Numerator; 909dfe64dd3Smacallan sr2c=128*kind[ll].sr2c7+64*kind[ll].sr2c6+32*kind[ll].sr2c5+DeNumerator; 910dfe64dd3Smacallan 911dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2B , (unsigned char) sr2b) ; 912dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2C , (unsigned char) sr2c) ; 913dfe64dd3Smacallan} 914dfe64dd3Smacallan#endif 915dfe64dd3Smacallan 916dfe64dd3Smacallan/* Jong 10/17/2007; merge code */ 917dfe64dd3Smacallanvoid XGI_SetCRTTiming( 918dfe64dd3Smacallan PXGI_HW_DEVICE_INFO pXGIHWDE, 919dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo 920dfe64dd3Smacallan ) 921dfe64dd3Smacallan{ 922dfe64dd3Smacallan int HT, VT, HDE, VDE, HRS, VRS, HRE, VRE, VGAHDE, VGAVDE, VGAHT, VGAVT; 923dfe64dd3Smacallan int HorizontalActivePixel, HorizontalFrontPorch, HorizontalSyncWidth, HorizontalBackPorch; 924dfe64dd3Smacallan int VerticalActivePixel, VerticalFrontPorch, VerticalSyncWidth, VerticalBackPorch; 925dfe64dd3Smacallan int temp1; 926dfe64dd3Smacallan UCHAR temp; 927dfe64dd3Smacallan 928dfe64dd3Smacallan HorizontalActivePixel = pXGIHWDE->Horizontal_ACTIVE; 929dfe64dd3Smacallan HorizontalFrontPorch = pXGIHWDE->Horizontal_FP; 930dfe64dd3Smacallan HorizontalSyncWidth = pXGIHWDE->Horizontal_SYNC; 931dfe64dd3Smacallan HorizontalBackPorch = pXGIHWDE->Horizontal_BP; 932dfe64dd3Smacallan VerticalActivePixel = pXGIHWDE->Vertical_ACTIVE >> (pXGIHWDE->Interlace & 0x1); 933dfe64dd3Smacallan VerticalFrontPorch = pXGIHWDE->Vertical_FP; 934dfe64dd3Smacallan VerticalSyncWidth = pXGIHWDE->Vertical_SYNC; 935dfe64dd3Smacallan VerticalBackPorch = pXGIHWDE->Vertical_BP; 936dfe64dd3Smacallan 937dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRTTiming()...\n")); 938dfe64dd3Smacallan PDEBUG(ErrorF("HorizontalActivePixel = %d...\n", HorizontalActivePixel)); 939dfe64dd3Smacallan PDEBUG(ErrorF("HorizontalFrontPorch = %d...\n", HorizontalFrontPorch)); 940dfe64dd3Smacallan PDEBUG(ErrorF("HorizontalSyncWidth = %d...\n", HorizontalSyncWidth)); 941dfe64dd3Smacallan PDEBUG(ErrorF("HorizontalBackPorch = %d...\n", HorizontalBackPorch)); 942dfe64dd3Smacallan PDEBUG(ErrorF("VerticalActivePixel = %d...\n", VerticalActivePixel)); 943dfe64dd3Smacallan PDEBUG(ErrorF("VerticalFrontPorch = %d...\n", VerticalFrontPorch)); 944dfe64dd3Smacallan PDEBUG(ErrorF("VerticalSyncWidth = %d...\n", VerticalSyncWidth)); 945dfe64dd3Smacallan PDEBUG(ErrorF("VerticalBackPorch = %d...\n", VerticalBackPorch)); 946dfe64dd3Smacallan 947dfe64dd3Smacallan HT = HorizontalActivePixel + HorizontalFrontPorch + HorizontalSyncWidth + HorizontalBackPorch; 948dfe64dd3Smacallan HDE = HorizontalActivePixel; 949dfe64dd3Smacallan HRS = HorizontalActivePixel + HorizontalFrontPorch; 950dfe64dd3Smacallan HRE = HorizontalActivePixel + HorizontalFrontPorch + HorizontalSyncWidth; 951dfe64dd3Smacallan HT = HT / 8; 952dfe64dd3Smacallan HDE = HDE / 8; 953dfe64dd3Smacallan HRS = HRS / 8; 954dfe64dd3Smacallan HRE = HRE / 8; 955dfe64dd3Smacallan VGAHT = HT - 5; 956dfe64dd3Smacallan VGAHDE = HDE - 1; 957dfe64dd3Smacallan HDE = HDE - 1; 958dfe64dd3Smacallan HT = HT - 1; 959dfe64dd3Smacallan HRS = HRS + 3; 960dfe64dd3Smacallan HRE = HRE + 3; 961dfe64dd3Smacallan 962dfe64dd3Smacallan /* 963dfe64dd3Smacallan HRS = HRS + 2; 964dfe64dd3Smacallan HRE = HRE + 2; 965dfe64dd3Smacallan */ 966dfe64dd3Smacallan 967dfe64dd3Smacallan VT = VerticalActivePixel + VerticalFrontPorch + VerticalSyncWidth + VerticalBackPorch; 968dfe64dd3Smacallan VDE = VerticalActivePixel; 969dfe64dd3Smacallan VRS = VerticalActivePixel + VerticalFrontPorch; 970dfe64dd3Smacallan VRE = VerticalActivePixel + VerticalFrontPorch + VerticalSyncWidth; 971dfe64dd3Smacallan VGAVT = VT - 2; 972dfe64dd3Smacallan VGAVDE = VDE - 1; 973dfe64dd3Smacallan VRS = VRS - 1; 974dfe64dd3Smacallan VRE = VRE - 1; 975dfe64dd3Smacallan VDE = VDE - 1; 976dfe64dd3Smacallan VT = VT - 1; 977dfe64dd3Smacallan 978dfe64dd3Smacallan 979dfe64dd3Smacallan temp = XGI_GetReg( pVBInfo->P3c4 , 0x06 ) ; 980dfe64dd3Smacallan 981dfe64dd3Smacallan temp = ((temp & 0x1c ) >> 2) * 8; 982dfe64dd3Smacallan if (temp == 0) 983dfe64dd3Smacallan temp = 8; 984dfe64dd3Smacallan temp1 = HorizontalActivePixel * temp / 8; 985dfe64dd3Smacallan temp1 = temp1 / 8; 986dfe64dd3Smacallan temp = temp1 / 8 + 1; 987dfe64dd3Smacallan 988dfe64dd3Smacallan if (pXGIHWDE->Interlace) 989dfe64dd3Smacallan { 990dfe64dd3Smacallan temp1 = temp1 << 1; 991dfe64dd3Smacallan } 992dfe64dd3Smacallan 993dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x05, 0x00, 0x86); 994dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x11, 0x7f, 0x00); 995dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x00, 0x00, (VGAHT & 0xff)); /* HT */ 996dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x01, 0x00, (VGAHDE & 0xff)); /* HDEE */ 997dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x02, 0x00, (HDE & 0xff)); /* HBS */ 998dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x03, 0xe0, (HT & 0x1f)); /* HBE */ 999dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x04, 0x00, (HRS & 0xff)); /* HRS */ 1000dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x05, 0x60, (((HT & 0x20) << 2) | (HRE & 0x1f))); /* HRE */ 1001dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x06, 0x00, (VGAVT & 0xff)); /* VT */ 1002dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x07, 0x00, (((VRS & 0x0200) >> 2) | ((VDE & 0x0200) >> 3) | ((VGAVT & 0x0200) >> 4)| ((VGAVDE & 0x0100) >> 5) | ((VRS & 0x0100) >> 6) | ((VDE & 0x0100) >> 7) | ((VGAVT & 0x0100) >> 8))); 1003dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x09, 0xdf, ((VGAVDE & 0x0200) >> 4)); 1004dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x10, 0x00, (VRS & 0xff)); /* VRS */ 1005dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x11, 0xf0, (VRE & 0x0f)); /* VRE */ 1006dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x12, 0x00, (VDE & 0xff)); /* VDEE */ 1007dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x13, 0x00, (temp1 & 0xff)); 1008dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x15, 0x00, (VGAVDE & 0xff)); /* VBS */ 1009dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x16, 0x00, (VT & 0xff)); /* VBE */ 1010dfe64dd3Smacallan 1011dfe64dd3Smacallan if ( pXGIHWDE->jChipType == XG21 ) 1012dfe64dd3Smacallan { 1013dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x2e, 0x00, ((HRS-1) & 0xff)); /* HRS */ 1014dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x2f, 0x00, (((HRE-1) & 0x3f)<<2) | (((HRS-1) & 0x0300) >> 8)); /* HRS */ 1015dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x33, 0xFE, (((VRS) & 0x01))); /* VRS */ 1016dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x34, 0x00, (((VRS) & 0x01FE)>>1)); /* VRS */ 1017dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x3F, 0x00, (((VRS) & 0x0600)>>9) | (((VRE) & 0x003F)<<2 )); /* VRS */ 1018dfe64dd3Smacallan 1019dfe64dd3Smacallan } 1020dfe64dd3Smacallan 1021dfe64dd3Smacallan if ( pXGIHWDE->jChipType == XG27 ) 1022dfe64dd3Smacallan { 1023dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x2e, 0x00, ((HRS-1) & 0xff)); /* HRS SR2E[7:0] */ 1024dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x2f, 0x00, (((HRE-1) & 0x3f)<<2) | (((HRS-1) & 0x0300) >> 8)); /* HRE SR2F[7:2] HRS SR2F[1:0] */ 1025dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x34, 0x00, ((VRS) & 0x0FF) ); /* VRS SR34[7:0] */ 1026dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x35, 0xF8, (((VRS) & 0x0700)>>8)); /* VRS SR35[2:0] */ 1027dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x3F, 0xFC, (((VRE) & 0x003F)<<2 )); /* VRE SR3F[7:2] */ 1028dfe64dd3Smacallan 1029dfe64dd3Smacallan } 1030dfe64dd3Smacallan 1031dfe64dd3Smacallan if (VerticalActivePixel > 1024) 1032dfe64dd3Smacallan { 1033dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0f, 0xf7, 0x08); 1034dfe64dd3Smacallan } 1035dfe64dd3Smacallan else 1036dfe64dd3Smacallan { 1037dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x07, 0xef, ((VGAVDE & 0x0100) >> 4)); 1038dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x09, 0xbf, ((VGAVDE & 0x0200) >> 3)); 1039dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x18, 0x00, (VGAVDE & 0x0ff)); 1040dfe64dd3Smacallan } 1041dfe64dd3Smacallan 1042dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x11, 0xff, 0x80); 1043dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0a, 0xc0, (((VRE & 0x10) << 1) | ((VT & 0x0100) >> 4) | ((VRS & 0x0400) >> 7) | ((VGAVDE & 0x0400) >> 8) | ((VDE & 0x0400) >> 9) | ((VGAVT & 0x0400) >> 10))); 1044dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0b, 0x00, (((VGAHT & 0xff00) >> 8) | ((VGAHDE & 0xff00) >> 6) | ((HDE & 0xff00) >> 4) | ((HRS & 0xff00) >> 2))); 1045dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0c, 0xf8, (((HRE & 0x20) >> 3) | ((HT & 0xc0) >> 6))); 1046dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0e, 0xf0, ((temp1 & 0xff00) >> 8)); 1047dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x10, 0x00, temp); 1048dfe64dd3Smacallan 1049dfe64dd3Smacallan XGI_SetCRTVCLK (pVBInfo, pXGIHWDE->DCLK/1000.0); 1050dfe64dd3Smacallan 1051dfe64dd3Smacallan if (pXGIHWDE->BPP==0x20) 1052dfe64dd3Smacallan { 1053dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x14, 0xE0, 0x0f); 1054dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3ce, 0x05, 0xBF, 0x0); 1055dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x06, 0xE3, 0x10); 1056dfe64dd3Smacallan temp = ((pXGIHWDE->Horizontal_ACTIVE / 8 * pXGIHWDE->BPP) / 64) + 1; 1057dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x10, temp); 1058dfe64dd3Smacallan } 1059dfe64dd3Smacallan if (pXGIHWDE->BPP==0x10) 1060dfe64dd3Smacallan { 1061dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x14, 0xE0, 0x0f); 1062dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3ce, 0x05, 0xBF, 0x0); 1063dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x06, 0xE3, 0x08); 1064dfe64dd3Smacallan temp = ((pXGIHWDE->Horizontal_ACTIVE / 8 * pXGIHWDE->BPP) / 64) + 1; 1065dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x10, temp); 1066dfe64dd3Smacallan } 1067dfe64dd3Smacallan if (pXGIHWDE->BPP==0x8) 1068dfe64dd3Smacallan { 1069dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x06, 0xE3, 0x00); 1070dfe64dd3Smacallan temp = ((pXGIHWDE->Horizontal_ACTIVE / 8 * pXGIHWDE->BPP) / 64) + 1; 1071dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x10, temp); 1072dfe64dd3Smacallan } 1073dfe64dd3Smacallan 1074dfe64dd3Smacallan} 1075dfe64dd3Smacallan 1076dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1077dfe64dd3Smacallan/* Function : XGI_SetCRT1Group */ 1078dfe64dd3Smacallan/* Input : */ 1079dfe64dd3Smacallan/* Output : */ 1080dfe64dd3Smacallan/* Description : */ 1081dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1082dfe64dd3Smacallanvoid 1083dfe64dd3SmacallanXGI_SetCRT1Group(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, 1084dfe64dd3Smacallan USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 1085dfe64dd3Smacallan{ 1086dfe64dd3Smacallan const USHORT StandTableIndex = XGI_GetModePtr(pVBInfo->SModeIDTable, 1087dfe64dd3Smacallan pVBInfo->ModeType, 1088dfe64dd3Smacallan ModeNo, ModeIdIndex); 1089dfe64dd3Smacallan USHORT RefreshRateTableIndex; 1090dfe64dd3Smacallan USHORT b3CC; 1091dfe64dd3Smacallan USHORT temp; 1092dfe64dd3Smacallan 1093dfe64dd3Smacallan USHORT XGINew_P3cc = pVBInfo->P3cc; 1094dfe64dd3Smacallan#ifndef LINUX_XF86 1095dfe64dd3Smacallan USHORT XGINew_P3c2 = pVBInfo->P3c2; 1096dfe64dd3Smacallan#endif 1097dfe64dd3Smacallan 1098dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRT1Group()...begin\n")); 1099dfe64dd3Smacallan 1100dfe64dd3Smacallan /* XGINew_CRT1Mode = ModeNo ; // SaveModeID */ 1101dfe64dd3Smacallan XGI_SetSeqRegs(StandTableIndex, pVBInfo); 1102dfe64dd3Smacallan XGI_SetMiscRegs(StandTableIndex, pVBInfo); 1103dfe64dd3Smacallan XGI_SetCRTCRegs(StandTableIndex, pVBInfo); 1104dfe64dd3Smacallan XGI_SetATTRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo); 1105dfe64dd3Smacallan XGI_SetGRCRegs(StandTableIndex, pVBInfo); 1106dfe64dd3Smacallan XGI_ClearExt1Regs(ModeNo, pVBInfo); 1107dfe64dd3Smacallan 1108dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRT1Group()...1\n")); 1109dfe64dd3Smacallan 1110dfe64dd3Smacallan /* Jong 10/19/2007; merge code */ 1111dfe64dd3Smacallan /* Jong 04/23/2008; All XG20,21,27 should do this */ 1112dfe64dd3Smacallan /* if ( HwDeviceExtension->jChipType == XG27 ) */ 1113dfe64dd3Smacallan if ( HwDeviceExtension->jChipType >= XG20 ) 1114dfe64dd3Smacallan { 1115dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 0 ) 1116dfe64dd3Smacallan { 1117dfe64dd3Smacallan XGI_SetDefaultVCLK( pVBInfo ) ; 1118dfe64dd3Smacallan } 1119dfe64dd3Smacallan } 1120dfe64dd3Smacallan 1121dfe64dd3Smacallan temp = ~ProgrammingCRT2; 1122dfe64dd3Smacallan pVBInfo->SetFlag &= temp; 1123dfe64dd3Smacallan pVBInfo->SelectCRT2Rate = 0; 1124dfe64dd3Smacallan 1125dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRT1Group()...2\n")); 1126dfe64dd3Smacallan 1127dfe64dd3Smacallan if (pVBInfo-> 1128dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 1129dfe64dd3Smacallan VB_XGI301C)) { 1130dfe64dd3Smacallan if (pVBInfo-> 1131dfe64dd3Smacallan VBInfo & (SetSimuScanMode | SetCRT2ToLCDA | SetInSlaveMode)) { 1132dfe64dd3Smacallan pVBInfo->SetFlag |= ProgrammingCRT2; 1133dfe64dd3Smacallan } 1134dfe64dd3Smacallan } 1135dfe64dd3Smacallan 1136dfe64dd3Smacallan /* Jong 10/05/2007; merge code */ 1137dfe64dd3Smacallan /* RefreshRateTableIndex = XGI_GetRatePtrCRT2( ModeNo, ModeIdIndex, pVBInfo); */ 1138dfe64dd3Smacallan RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo, ModeIdIndex, pVBInfo); 1139dfe64dd3Smacallan 1140dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRT1Group()...3\n")); 1141dfe64dd3Smacallan 1142dfe64dd3Smacallan if (RefreshRateTableIndex != 0xFFFF) { 1143dfe64dd3Smacallan XGI_SetSync(RefreshRateTableIndex, pVBInfo); 1144dfe64dd3Smacallan XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo, 1145dfe64dd3Smacallan HwDeviceExtension); 1146dfe64dd3Smacallan XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex, 1147dfe64dd3Smacallan RefreshRateTableIndex, pVBInfo); 1148dfe64dd3Smacallan XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex, 1149dfe64dd3Smacallan HwDeviceExtension, pVBInfo); 1150dfe64dd3Smacallan XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension, 1151dfe64dd3Smacallan RefreshRateTableIndex, pVBInfo); 1152dfe64dd3Smacallan } 1153dfe64dd3Smacallan 1154dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRT1Group()...4\n")); 1155dfe64dd3Smacallan 1156dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 1157dfe64dd3Smacallan /* if (HwDeviceExtension->jChipType == XG20) { */ 1158dfe64dd3Smacallan if ( ( HwDeviceExtension->jChipType >= XG20 ) && 1159dfe64dd3Smacallan ( HwDeviceExtension->jChipType < XG27 ) ) /* fix H/W DCLK/2 bug */ 1160dfe64dd3Smacallan { 1161dfe64dd3Smacallan if ((ModeNo == 0x00) | (ModeNo == 0x01)) { 1162dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, 0x4E); 1163dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, 0xE9); 1164dfe64dd3Smacallan b3CC = (UCHAR) XGI_GetRegByte((XGIIOADDRESS) XGINew_P3cc); 1165dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) XGINew_P3cc, (b3CC |= 0x0C)); 1166dfe64dd3Smacallan } 1167dfe64dd3Smacallan else if ((ModeNo == 0x04) | (ModeNo == 0x05) | (ModeNo == 0x0D)) { 1168dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, 0x1B); 1169dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, 0xE3); 1170dfe64dd3Smacallan b3CC = (UCHAR) XGI_GetRegByte((XGIIOADDRESS) XGINew_P3cc); 1171dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) XGINew_P3cc, (b3CC |= 0x0C)); 1172dfe64dd3Smacallan } 1173dfe64dd3Smacallan } 1174dfe64dd3Smacallan 1175dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 1176dfe64dd3Smacallan if ( HwDeviceExtension->jChipType >= XG21 ) 1177dfe64dd3Smacallan { 1178dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRT1Group()...4-1\n")); 1179dfe64dd3Smacallan 1180dfe64dd3Smacallan temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x38 ) ; 1181dfe64dd3Smacallan if ( temp & 0xA0 ) 1182dfe64dd3Smacallan { 1183dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRT1Group()...4-2\n")); 1184dfe64dd3Smacallan 1185dfe64dd3Smacallan /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x20 ) ;*/ /* Enable write GPIOF */ 1186dfe64dd3Smacallan /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x48 , ~0x20 ) ;*/ /* P. DWN */ 1187dfe64dd3Smacallan /* XG21 CRT1 Timing */ 1188dfe64dd3Smacallan if ( HwDeviceExtension->jChipType == XG27 ) 1189dfe64dd3Smacallan XGI_SetXG27CRTC( ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo ); 1190dfe64dd3Smacallan else 1191dfe64dd3Smacallan XGI_SetXG21CRTC( ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo ); 1192dfe64dd3Smacallan 1193dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRT1Group()...4-3\n")); 1194dfe64dd3Smacallan 1195dfe64dd3Smacallan XGI_UpdateXG21CRTC( ModeNo , pVBInfo , RefreshRateTableIndex) ; 1196dfe64dd3Smacallan 1197dfe64dd3Smacallan if ( HwDeviceExtension->jChipType == XG27 ) 1198dfe64dd3Smacallan XGI_SetXG27LCD( pVBInfo , RefreshRateTableIndex , ModeNo ); 1199dfe64dd3Smacallan else 1200dfe64dd3Smacallan XGI_SetXG21LCD( pVBInfo , RefreshRateTableIndex , ModeNo ); 1201dfe64dd3Smacallan 1202dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRT1Group()...4-4\n")); 1203dfe64dd3Smacallan 1204dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 1 ) 1205dfe64dd3Smacallan { 1206dfe64dd3Smacallan if ( HwDeviceExtension->jChipType == XG27 ) 1207dfe64dd3Smacallan XGI_SetXG27LVDSPara(ModeNo,ModeIdIndex, pVBInfo ); 1208dfe64dd3Smacallan else 1209dfe64dd3Smacallan XGI_SetXG21LVDSPara(ModeNo,ModeIdIndex, pVBInfo ); 1210dfe64dd3Smacallan } 1211dfe64dd3Smacallan 1212dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRT1Group()...4-5\n")); 1213dfe64dd3Smacallan /*XGINew_SetRegOR( pVBInfo->P3d4 , 0x48 , 0x20 ) ;*/ /* P. ON */ 1214dfe64dd3Smacallan } 1215dfe64dd3Smacallan } 1216dfe64dd3Smacallan 1217dfe64dd3Smacallan pVBInfo->SetFlag &= (~ProgrammingCRT2); 1218dfe64dd3Smacallan XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo); 1219dfe64dd3Smacallan XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex, 1220dfe64dd3Smacallan RefreshRateTableIndex, pVBInfo); 1221dfe64dd3Smacallan 1222dfe64dd3Smacallan if ( HwDeviceExtension->SpecialMode ) 1223dfe64dd3Smacallan { 1224dfe64dd3Smacallan XGI_SetCRTTiming( HwDeviceExtension, pVBInfo ); 1225dfe64dd3Smacallan } 1226dfe64dd3Smacallan 1227dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRT1Group()...5\n")); 1228dfe64dd3Smacallan 1229dfe64dd3Smacallan if (HwDeviceExtension->jChipType == XG40) { /* Copy reg settings to 2nd chip */ 1230dfe64dd3Smacallan if (CheckDualChip(pVBInfo)) 1231dfe64dd3Smacallan SetDualChipRegs(HwDeviceExtension, pVBInfo); 1232dfe64dd3Smacallan } 1233dfe64dd3Smacallan 1234dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRT1Group()...6\n")); 1235dfe64dd3Smacallan 1236dfe64dd3Smacallan /* XGI_LoadCharacter(); //dif ifdef TVFont */ 1237dfe64dd3Smacallan 1238dfe64dd3Smacallan XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo); 1239dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetCRT1Group()...End\n")); 1240dfe64dd3Smacallan} 1241dfe64dd3Smacallan 1242dfe64dd3Smacallan 1243dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1244dfe64dd3Smacallan/* Function : XGI_SetSeqRegs */ 1245dfe64dd3Smacallan/* Input : */ 1246dfe64dd3Smacallan/* Output : */ 1247dfe64dd3Smacallan/* Description : */ 1248dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1249dfe64dd3Smacallanvoid 1250dfe64dd3SmacallanXGI_SetSeqRegs(USHORT StandTableIndex, const VB_DEVICE_INFO *pVBInfo) 1251dfe64dd3Smacallan{ 1252dfe64dd3Smacallan unsigned SRdata; 1253dfe64dd3Smacallan unsigned i; 1254dfe64dd3Smacallan 1255dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */ 1256dfe64dd3Smacallan SRdata = pVBInfo->StandTable[StandTableIndex].SR[0]; 1257dfe64dd3Smacallan 1258dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCDA) { 1259dfe64dd3Smacallan SRdata |= 0x01; 1260dfe64dd3Smacallan } 1261dfe64dd3Smacallan else { 1262dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) { 1263dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) 1264dfe64dd3Smacallan SRdata |= 0x01; 1265dfe64dd3Smacallan } 1266dfe64dd3Smacallan } 1267dfe64dd3Smacallan 1268dfe64dd3Smacallan SRdata |= 0x20; /* screen off */ 1269dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01, SRdata); /* Set SR1 */ 1270dfe64dd3Smacallan 1271dfe64dd3Smacallan /* Get SR2, SR3, and SR4 from table and set in hardware. 1272dfe64dd3Smacallan */ 1273dfe64dd3Smacallan for (i = 2; i <= 4; i++) { 1274dfe64dd3Smacallan SRdata = pVBInfo->StandTable[StandTableIndex].SR[i - 1]; 1275dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, i, SRdata); 1276dfe64dd3Smacallan } 1277dfe64dd3Smacallan} 1278dfe64dd3Smacallan 1279dfe64dd3Smacallan 1280dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1281dfe64dd3Smacallan/* Function : XGI_SetMiscRegs */ 1282dfe64dd3Smacallan/* Input : */ 1283dfe64dd3Smacallan/* Output : */ 1284dfe64dd3Smacallan/* Description : */ 1285dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1286dfe64dd3Smacallanvoid 1287dfe64dd3SmacallanXGI_SetMiscRegs(USHORT StandTableIndex, const VB_DEVICE_INFO *pVBInfo) 1288dfe64dd3Smacallan{ 1289dfe64dd3Smacallan UCHAR Miscdata; 1290dfe64dd3Smacallan 1291dfe64dd3Smacallan Miscdata = pVBInfo->StandTable[StandTableIndex].MISC; /* Get Misc from file */ 1292dfe64dd3Smacallan/* 1293dfe64dd3Smacallan if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) 1294dfe64dd3Smacallan { 1295dfe64dd3Smacallan if ( pVBInfo->VBInfo & SetCRT2ToLCDA ) 1296dfe64dd3Smacallan { 1297dfe64dd3Smacallan Miscdata |= 0x0C ; 1298dfe64dd3Smacallan } 1299dfe64dd3Smacallan } 1300dfe64dd3Smacallan*/ 1301dfe64dd3Smacallan 1302dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c2, Miscdata); /* Set Misc(3c2) */ 1303dfe64dd3Smacallan} 1304dfe64dd3Smacallan 1305dfe64dd3Smacallan 1306dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1307dfe64dd3Smacallan/* Function : XGI_SetCRTCRegs */ 1308dfe64dd3Smacallan/* Input : */ 1309dfe64dd3Smacallan/* Output : */ 1310dfe64dd3Smacallan/* Description : */ 1311dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1312dfe64dd3Smacallanvoid 1313dfe64dd3SmacallanXGI_SetCRTCRegs(unsigned StandTableIndex, const VB_DEVICE_INFO *pVBInfo) 1314dfe64dd3Smacallan{ 1315dfe64dd3Smacallan unsigned i; 1316dfe64dd3Smacallan 1317dfe64dd3Smacallan /* Unlock CRTC */ 1318dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3d4, 0x11, 0x7f); 1319dfe64dd3Smacallan 1320dfe64dd3Smacallan for (i = 0; i <= 0x18; i++) { 1321dfe64dd3Smacallan /* Get CRTC from file */ 1322dfe64dd3Smacallan const unsigned CRTCdata = 1323dfe64dd3Smacallan pVBInfo->StandTable[StandTableIndex].CRTC[i]; 1324dfe64dd3Smacallan 1325dfe64dd3Smacallan /* Set CRTC( 3d4 ) */ 1326dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, i, CRTCdata); 1327dfe64dd3Smacallan } 1328dfe64dd3Smacallan} 1329dfe64dd3Smacallan 1330dfe64dd3Smacallan 1331dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1332dfe64dd3Smacallan/* Function : */ 1333dfe64dd3Smacallan/* Input : */ 1334dfe64dd3Smacallan/* Output : */ 1335dfe64dd3Smacallan/* Description : */ 1336dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1337dfe64dd3Smacallanvoid 1338dfe64dd3SmacallanXGI_SetATTRegs(unsigned ModeNo, unsigned StandTableIndex, unsigned ModeIdIndex, 1339dfe64dd3Smacallan const VB_DEVICE_INFO *pVBInfo) 1340dfe64dd3Smacallan{ 1341dfe64dd3Smacallan unsigned i; 1342dfe64dd3Smacallan const unsigned modeflag = (ModeNo <= 0x13) 1343dfe64dd3Smacallan ? pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag 1344dfe64dd3Smacallan : pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 1345dfe64dd3Smacallan 1346dfe64dd3Smacallan for (i = 0; i <= 0x13; i++) { 1347dfe64dd3Smacallan UCHAR ARdata = pVBInfo->StandTable[StandTableIndex].ATTR[i]; 1348dfe64dd3Smacallan 1349dfe64dd3Smacallan if (modeflag & Charx8Dot) { /* ifndef Dot9 */ 1350dfe64dd3Smacallan if (i == 0x13) { 1351dfe64dd3Smacallan /* Pixel shift. If screen on LCD or TV is shifted left or 1352dfe64dd3Smacallan * right, this might be the cause. 1353dfe64dd3Smacallan */ 1354dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCDA) 1355dfe64dd3Smacallan ARdata = 0; 1356dfe64dd3Smacallan else { 1357dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) { 1358dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) 1359dfe64dd3Smacallan ARdata = 0; 1360dfe64dd3Smacallan } 1361dfe64dd3Smacallan } 1362dfe64dd3Smacallan } 1363dfe64dd3Smacallan } 1364dfe64dd3Smacallan 1365dfe64dd3Smacallan XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da); /* reset 3da */ 1366dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, i); /* set index */ 1367dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, ARdata); /* set data */ 1368dfe64dd3Smacallan } 1369dfe64dd3Smacallan 1370dfe64dd3Smacallan XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da); /* reset 3da */ 1371dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, 0x14); /* set index */ 1372dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, 0x00); /* set data */ 1373dfe64dd3Smacallan 1374dfe64dd3Smacallan XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da); /* Enable Attribute */ 1375dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c0, 0x20); 1376dfe64dd3Smacallan XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da); 1377dfe64dd3Smacallan} 1378dfe64dd3Smacallan 1379dfe64dd3Smacallan 1380dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1381dfe64dd3Smacallan/* Function : XGI_SetGRCRegs */ 1382dfe64dd3Smacallan/* Input : */ 1383dfe64dd3Smacallan/* Output : */ 1384dfe64dd3Smacallan/* Description : */ 1385dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1386dfe64dd3Smacallanvoid 1387dfe64dd3SmacallanXGI_SetGRCRegs(unsigned StandTableIndex, const VB_DEVICE_INFO *pVBInfo) 1388dfe64dd3Smacallan{ 1389dfe64dd3Smacallan unsigned i; 1390dfe64dd3Smacallan 1391dfe64dd3Smacallan for (i = 0; i <= 8; i++) { 1392dfe64dd3Smacallan /* Get GR from file and set GR (3ce) 1393dfe64dd3Smacallan */ 1394dfe64dd3Smacallan const unsigned GRdata = pVBInfo->StandTable[StandTableIndex].GRC[i]; 1395dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3ce, i, GRdata); 1396dfe64dd3Smacallan } 1397dfe64dd3Smacallan 1398dfe64dd3Smacallan if (pVBInfo->ModeType > ModeVGA) { 1399dfe64dd3Smacallan /* 256 color disable */ 1400dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3ce, 0x05, 0xBF); 1401dfe64dd3Smacallan } 1402dfe64dd3Smacallan} 1403dfe64dd3Smacallan 1404dfe64dd3Smacallan 1405dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1406dfe64dd3Smacallan/* Function : XGI_ClearExt1Regs */ 1407dfe64dd3Smacallan/* Input : */ 1408dfe64dd3Smacallan/* Output : */ 1409dfe64dd3Smacallan/* Description : */ 1410dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1411dfe64dd3Smacallanvoid 1412dfe64dd3SmacallanXGI_ClearExt1Regs(unsigned ModeNo, const VB_DEVICE_INFO *pVBInfo) 1413dfe64dd3Smacallan{ 1414dfe64dd3Smacallan unsigned i; 1415dfe64dd3Smacallan 1416dfe64dd3Smacallan /* Clear SR0A-SR0E */ 1417dfe64dd3Smacallan for (i = 0x0A; i <= 0x0E; i++) { 1418dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, i, 0x00); 1419dfe64dd3Smacallan } 1420dfe64dd3Smacallan 1421dfe64dd3Smacallan /* This code came from the old XGI_New_ClearExt1Regs in init.c. Since 1422dfe64dd3Smacallan * it wasn't included in the newer code drop from XGI, I'm not sure if 1423dfe64dd3Smacallan * it's necessary on the Volari chips. I've included it here, ifdefed 1424dfe64dd3Smacallan * out, for future reference. 1425dfe64dd3Smacallan * - idr 1426dfe64dd3Smacallan */ 1427dfe64dd3Smacallan#if 0 1428dfe64dd3Smacallan XGI_SetRegAND(pVBInfo->P3c4, 0x37, 0xFE); 1429dfe64dd3Smacallan if ((ModeNo == 0x06) || ((ModeNo >= 0x0e) && (ModeNo <= 0x13))) { 1430dfe64dd3Smacallan XGI_SetReg(pVBInfo->P3c4, 0x0e, 0x20); 1431dfe64dd3Smacallan } 1432dfe64dd3Smacallan#else 1433dfe64dd3Smacallan (void) ModeNo; 1434dfe64dd3Smacallan#endif 1435dfe64dd3Smacallan} 1436dfe64dd3Smacallan 1437dfe64dd3Smacallan/* Jong 10/17/2007; merge code */ 1438dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1439dfe64dd3Smacallan/* Function : XGI_SetDefaultVCLK */ 1440dfe64dd3Smacallan/* Input : */ 1441dfe64dd3Smacallan/* Output : */ 1442dfe64dd3Smacallan/* Description : */ 1443dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1444dfe64dd3SmacallanUCHAR XGI_SetDefaultVCLK( PVB_DEVICE_INFO pVBInfo ) 1445dfe64dd3Smacallan{ 1446dfe64dd3Smacallan /* Jong 04/22/2008; XGINew_ -> XGI_*/ 1447dfe64dd3Smacallan /* Jong 04/23/2008; coding error: VCLKData[0]-> 0x10:25MHz; VCLKData[1]-> 0x20:28MHz */ 1448dfe64dd3Smacallan /* XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 , 0x20 ) ; */ 1449dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 , 0x10 ) ; 1450dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ 0 ].SR2B ) ; 1451dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ 0 ].SR2C ) ; 1452dfe64dd3Smacallan 1453dfe64dd3Smacallan /* XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 , 0x10 ) ; */ 1454dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 , 0x20 ) ; 1455dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ 1 ].SR2B ) ; 1456dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ 1 ].SR2C ) ; 1457dfe64dd3Smacallan 1458dfe64dd3Smacallan XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 ) ; 1459dfe64dd3Smacallan return( 0 ) ; 1460dfe64dd3Smacallan} 1461dfe64dd3Smacallan 1462dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1463dfe64dd3Smacallan/* Function : XGI_GetRatePtrCRT2 */ 1464dfe64dd3Smacallan/* Input : */ 1465dfe64dd3Smacallan/* Output : */ 1466dfe64dd3Smacallan/* Description : */ 1467dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1468dfe64dd3SmacallanUSHORT 1469dfe64dd3SmacallanXGI_GetRatePtrCRT2(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 1470dfe64dd3Smacallan{ 1471dfe64dd3Smacallan SHORT LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 } 1472dfe64dd3Smacallan , LCDARefreshIndex[] = { 1473dfe64dd3Smacallan 0x00, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01}; 1474dfe64dd3Smacallan 1475dfe64dd3Smacallan USHORT RefreshRateTableIndex, i, modeflag, index, temp; 1476dfe64dd3Smacallan 1477dfe64dd3Smacallan if (ModeNo <= 0x13) { 1478dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; 1479dfe64dd3Smacallan } 1480dfe64dd3Smacallan else { 1481dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 1482dfe64dd3Smacallan } 1483dfe64dd3Smacallan 1484dfe64dd3Smacallan if (ModeNo < 0x14) 1485dfe64dd3Smacallan return (0xFFFF); 1486dfe64dd3Smacallan 1487dfe64dd3Smacallan index = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x33); 1488dfe64dd3Smacallan index = index >> pVBInfo->SelectCRT2Rate; 1489dfe64dd3Smacallan index &= 0x0F; 1490dfe64dd3Smacallan 1491dfe64dd3Smacallan if (pVBInfo->LCDInfo & (LCDNonExpanding | EnableScalingLCD)) 1492dfe64dd3Smacallan index = 0; 1493dfe64dd3Smacallan 1494dfe64dd3Smacallan if (index > 0) 1495dfe64dd3Smacallan index--; 1496dfe64dd3Smacallan 1497dfe64dd3Smacallan if (pVBInfo->SetFlag & ProgrammingCRT2) { 1498dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { 1499dfe64dd3Smacallan 1500dfe64dd3Smacallan /* Jong 10/03/2007; merge code */ 1501dfe64dd3Smacallan if( pVBInfo->IF_DEF_LVDS == 0 ) 1502dfe64dd3Smacallan { 1503dfe64dd3Smacallan 1504dfe64dd3Smacallan if (pVBInfo-> 1505dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV 1506dfe64dd3Smacallan | VB_XGI301C)) 1507dfe64dd3Smacallan temp = LCDARefreshIndex[pVBInfo->LCDResInfo & 0x0F]; /* 301b */ 1508dfe64dd3Smacallan else 1509dfe64dd3Smacallan temp = LCDRefreshIndex[pVBInfo->LCDResInfo & 0x0F]; 1510dfe64dd3Smacallan 1511dfe64dd3Smacallan if (index > temp) { 1512dfe64dd3Smacallan index = temp; 1513dfe64dd3Smacallan } 1514dfe64dd3Smacallan } 1515dfe64dd3Smacallan else 1516dfe64dd3Smacallan { 1517dfe64dd3Smacallan index = 0 ; 1518dfe64dd3Smacallan } 1519dfe64dd3Smacallan } 1520dfe64dd3Smacallan } 1521dfe64dd3Smacallan 1522dfe64dd3Smacallan RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex; 1523dfe64dd3Smacallan ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID; 1524dfe64dd3Smacallan 1525dfe64dd3Smacallan /* Jong 10/03/2007; merge code */ 1526dfe64dd3Smacallan /* Do the similiar adjustment like XGISearchCRT1Rate() */ 1527dfe64dd3Smacallan if ( HwDeviceExtension->jChipType >= XG20 ) /* for XG20, XG21, XG27 */ 1528dfe64dd3Smacallan { 1529dfe64dd3Smacallan /* 1530dfe64dd3Smacallan if ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag & XG2xNotSupport ) 1531dfe64dd3Smacallan { 1532dfe64dd3Smacallan index++; 1533dfe64dd3Smacallan } 1534dfe64dd3Smacallan */ 1535dfe64dd3Smacallan 1536dfe64dd3Smacallan if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 800 ) && 1537dfe64dd3Smacallan ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 600 ) ) 1538dfe64dd3Smacallan { 1539dfe64dd3Smacallan index++; 1540dfe64dd3Smacallan } 1541dfe64dd3Smacallan if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1024 ) && 1542dfe64dd3Smacallan ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 768 ) ) 1543dfe64dd3Smacallan { 1544dfe64dd3Smacallan index++; 1545dfe64dd3Smacallan } 1546dfe64dd3Smacallan if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1280 ) && 1547dfe64dd3Smacallan ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 1024 ) ) 1548dfe64dd3Smacallan { 1549dfe64dd3Smacallan index++; 1550dfe64dd3Smacallan } 1551dfe64dd3Smacallan 1552dfe64dd3Smacallan /* Jong 11/29/2007; fix bugs of 1600x1200; set limitation to 60Hz */ 1553dfe64dd3Smacallan /* It should need to check refresh rate supporting of output device */ 1554dfe64dd3Smacallan if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1600 ) && 1555dfe64dd3Smacallan ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 1200 ) ) 1556dfe64dd3Smacallan { 1557dfe64dd3Smacallan index=0; 1558dfe64dd3Smacallan } 1559dfe64dd3Smacallan } 1560dfe64dd3Smacallan 1561dfe64dd3Smacallan /* Jong 11/29/2007; according to CR33(index) to update refresh table index */ 1562dfe64dd3Smacallan i = 0 ; 1563dfe64dd3Smacallan do 1564dfe64dd3Smacallan { 1565dfe64dd3Smacallan if (pVBInfo->RefIndex[RefreshRateTableIndex + i].ModeID != ModeNo) 1566dfe64dd3Smacallan break; 1567dfe64dd3Smacallan temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].Ext_InfoFlag; 1568dfe64dd3Smacallan temp &= ModeInfoFlag; 1569dfe64dd3Smacallan if (temp < pVBInfo->ModeType) 1570dfe64dd3Smacallan break; 1571dfe64dd3Smacallan 1572dfe64dd3Smacallan i++; 1573dfe64dd3Smacallan index--; 1574dfe64dd3Smacallan 1575dfe64dd3Smacallan } while (index != 0xFFFF); 1576dfe64dd3Smacallan 1577dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) { 1578dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) { 1579dfe64dd3Smacallan temp = 1580dfe64dd3Smacallan pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].Ext_InfoFlag; 1581dfe64dd3Smacallan if (temp & InterlaceMode) { 1582dfe64dd3Smacallan i++; 1583dfe64dd3Smacallan } 1584dfe64dd3Smacallan } 1585dfe64dd3Smacallan } 1586dfe64dd3Smacallan 1587dfe64dd3Smacallan i--; 1588dfe64dd3Smacallan if ((pVBInfo->SetFlag & ProgrammingCRT2)) { 1589dfe64dd3Smacallan temp = 1590dfe64dd3Smacallan XGI_AjustCRT2Rate(ModeNo, ModeIdIndex, RefreshRateTableIndex, &i, 1591dfe64dd3Smacallan pVBInfo); 1592dfe64dd3Smacallan } 1593dfe64dd3Smacallan 1594dfe64dd3Smacallan return (RefreshRateTableIndex + i); /*return(0x01|(temp1<<1)); */ 1595dfe64dd3Smacallan} 1596dfe64dd3Smacallan 1597dfe64dd3Smacallan 1598dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1599dfe64dd3Smacallan/* Function : XGI_AjustCRT2Rate */ 1600dfe64dd3Smacallan/* Input : */ 1601dfe64dd3Smacallan/* Output : */ 1602dfe64dd3Smacallan/* Description : */ 1603dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1604dfe64dd3SmacallanBOOLEAN 1605dfe64dd3SmacallanXGI_AjustCRT2Rate(USHORT ModeNo, USHORT ModeIdIndex, 1606dfe64dd3Smacallan USHORT RefreshRateTableIndex, USHORT * i, 1607dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 1608dfe64dd3Smacallan{ 1609dfe64dd3Smacallan USHORT tempax, tempbx, resinfo, modeflag, infoflag; 1610dfe64dd3Smacallan 1611dfe64dd3Smacallan if (ModeNo <= 0x13) { 1612dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ModeFlag */ 1613dfe64dd3Smacallan } 1614dfe64dd3Smacallan else { 1615dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 1616dfe64dd3Smacallan } 1617dfe64dd3Smacallan 1618dfe64dd3Smacallan resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; 1619dfe64dd3Smacallan tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID; 1620dfe64dd3Smacallan tempax = 0; 1621dfe64dd3Smacallan 1622dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 1623dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 0 ) 1624dfe64dd3Smacallan { 1625dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) { 1626dfe64dd3Smacallan tempax |= SupportRAMDAC2; 1627dfe64dd3Smacallan 1628dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301C) 1629dfe64dd3Smacallan tempax |= SupportCRT2in301C; 1630dfe64dd3Smacallan } 1631dfe64dd3Smacallan 1632dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { /* 301b */ 1633dfe64dd3Smacallan tempax |= SupportLCD; 1634dfe64dd3Smacallan 1635dfe64dd3Smacallan if (pVBInfo->LCDResInfo != Panel1280x1024) { 1636dfe64dd3Smacallan if (pVBInfo->LCDResInfo != Panel1280x960) { 1637dfe64dd3Smacallan if (pVBInfo->LCDInfo & LCDNonExpanding) { 1638dfe64dd3Smacallan if (resinfo >= 9) { 1639dfe64dd3Smacallan tempax = 0; 1640dfe64dd3Smacallan return (0); 1641dfe64dd3Smacallan } 1642dfe64dd3Smacallan } 1643dfe64dd3Smacallan } 1644dfe64dd3Smacallan } 1645dfe64dd3Smacallan } 1646dfe64dd3Smacallan 1647dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { /* for HiTV */ 1648dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI301LV) 1649dfe64dd3Smacallan && (pVBInfo->VBExtInfo == VB_YPbPr1080i)) { 1650dfe64dd3Smacallan tempax |= SupportYPbPr; 1651dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) { 1652dfe64dd3Smacallan if (resinfo == 4) 1653dfe64dd3Smacallan return (0); 1654dfe64dd3Smacallan 1655dfe64dd3Smacallan if (resinfo == 3) 1656dfe64dd3Smacallan return (0); 1657dfe64dd3Smacallan 1658dfe64dd3Smacallan if (resinfo > 7) 1659dfe64dd3Smacallan return (0); 1660dfe64dd3Smacallan } 1661dfe64dd3Smacallan } 1662dfe64dd3Smacallan else { 1663dfe64dd3Smacallan tempax |= SupportHiVisionTV; 1664dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) { 1665dfe64dd3Smacallan if (resinfo == 4) 1666dfe64dd3Smacallan return (0); 1667dfe64dd3Smacallan 1668dfe64dd3Smacallan if (resinfo == 3) { 1669dfe64dd3Smacallan if (pVBInfo->SetFlag & TVSimuMode) 1670dfe64dd3Smacallan return (0); 1671dfe64dd3Smacallan } 1672dfe64dd3Smacallan 1673dfe64dd3Smacallan if (resinfo > 7) 1674dfe64dd3Smacallan return (0); 1675dfe64dd3Smacallan } 1676dfe64dd3Smacallan } 1677dfe64dd3Smacallan } 1678dfe64dd3Smacallan else { 1679dfe64dd3Smacallan if (pVBInfo-> 1680dfe64dd3Smacallan VBInfo & (SetCRT2ToAVIDEO | SetCRT2ToSVIDEO | SetCRT2ToSCART | 1681dfe64dd3Smacallan SetCRT2ToYPbPr | SetCRT2ToHiVisionTV)) { 1682dfe64dd3Smacallan tempax |= SupportTV; 1683dfe64dd3Smacallan 1684dfe64dd3Smacallan if (pVBInfo-> 1685dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV 1686dfe64dd3Smacallan | VB_XGI301C)) { 1687dfe64dd3Smacallan tempax |= SupportTV1024; 1688dfe64dd3Smacallan } 1689dfe64dd3Smacallan 1690dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetPALTV)) { 1691dfe64dd3Smacallan if (modeflag & NoSupportSimuTV) { 1692dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) { 1693dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetNotSimuMode)) { 1694dfe64dd3Smacallan return (0); 1695dfe64dd3Smacallan } 1696dfe64dd3Smacallan } 1697dfe64dd3Smacallan } 1698dfe64dd3Smacallan } 1699dfe64dd3Smacallan } 1700dfe64dd3Smacallan } 1701dfe64dd3Smacallan } 1702dfe64dd3Smacallan else /* for LVDS */ 1703dfe64dd3Smacallan { 1704dfe64dd3Smacallan if ( pVBInfo->VBInfo & SetCRT2ToLCD ) 1705dfe64dd3Smacallan { 1706dfe64dd3Smacallan tempax |= SupportLCD ; 1707dfe64dd3Smacallan 1708dfe64dd3Smacallan if ( resinfo > 0x08 ) 1709dfe64dd3Smacallan return( 0 ) ; /* 1024x768 */ 1710dfe64dd3Smacallan 1711dfe64dd3Smacallan if ( pVBInfo->LCDResInfo < Panel1024x768 ) 1712dfe64dd3Smacallan { 1713dfe64dd3Smacallan if ( resinfo > 0x07 ) 1714dfe64dd3Smacallan return( 0 ) ; /* 800x600 */ 1715dfe64dd3Smacallan 1716dfe64dd3Smacallan if ( resinfo == 0x04 ) 1717dfe64dd3Smacallan return( 0 ) ; /* 512x384 */ 1718dfe64dd3Smacallan } 1719dfe64dd3Smacallan } 1720dfe64dd3Smacallan } 1721dfe64dd3Smacallan 1722dfe64dd3Smacallan for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID == tempbx; 1723dfe64dd3Smacallan (*i)--) { 1724dfe64dd3Smacallan infoflag = 1725dfe64dd3Smacallan pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag; 1726dfe64dd3Smacallan if (infoflag & tempax) { 1727dfe64dd3Smacallan return (1); 1728dfe64dd3Smacallan } 1729dfe64dd3Smacallan if ((*i) == 0) 1730dfe64dd3Smacallan break; 1731dfe64dd3Smacallan } 1732dfe64dd3Smacallan 1733dfe64dd3Smacallan for ((*i) = 0;; (*i)++) { 1734dfe64dd3Smacallan infoflag = 1735dfe64dd3Smacallan pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].Ext_InfoFlag; 1736dfe64dd3Smacallan if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID != tempbx) { 1737dfe64dd3Smacallan return (0); 1738dfe64dd3Smacallan } 1739dfe64dd3Smacallan 1740dfe64dd3Smacallan if (infoflag & tempax) { 1741dfe64dd3Smacallan return (1); 1742dfe64dd3Smacallan } 1743dfe64dd3Smacallan } 1744dfe64dd3Smacallan return (1); 1745dfe64dd3Smacallan} 1746dfe64dd3Smacallan 1747dfe64dd3Smacallan 1748dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1749dfe64dd3Smacallan/* Function : XGI_SetSync */ 1750dfe64dd3Smacallan/* Input : */ 1751dfe64dd3Smacallan/* Output : */ 1752dfe64dd3Smacallan/* Description : */ 1753dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1754dfe64dd3Smacallanvoid 1755dfe64dd3SmacallanXGI_SetSync(unsigned RefreshRateTableIndex, const VB_DEVICE_INFO *pVBInfo) 1756dfe64dd3Smacallan{ 1757dfe64dd3Smacallan const unsigned sync = 1758dfe64dd3Smacallan (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8) & 0xC0; 1759dfe64dd3Smacallan 1760dfe64dd3Smacallan /* Set Misc(3c2) */ 1761dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c2, sync | 0x2F); 1762dfe64dd3Smacallan} 1763dfe64dd3Smacallan 1764dfe64dd3Smacallan 1765dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1766dfe64dd3Smacallan/* Function : XGI_SetCRT1CRTC */ 1767dfe64dd3Smacallan/* Input : */ 1768dfe64dd3Smacallan/* Output : */ 1769dfe64dd3Smacallan/* Description : */ 1770dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1771dfe64dd3Smacallanvoid 1772dfe64dd3SmacallanXGI_SetCRT1CRTC(USHORT ModeNo, USHORT ModeIdIndex, 1773dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo, 1774dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension) 1775dfe64dd3Smacallan{ 1776dfe64dd3Smacallan UCHAR index, data; 1777dfe64dd3Smacallan#ifndef LINUX_XF86 1778dfe64dd3Smacallan USHORT temp, tempah, j, modeflag, ResInfo, DisplayType; 1779dfe64dd3Smacallan#endif 1780dfe64dd3Smacallan USHORT i; 1781dfe64dd3Smacallan 1782dfe64dd3Smacallan index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; /* Get index */ 1783dfe64dd3Smacallan index = index & IndexMask; 1784dfe64dd3Smacallan 1785dfe64dd3Smacallan data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11); 1786dfe64dd3Smacallan data &= 0x7F; 1787dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */ 1788dfe64dd3Smacallan 1789dfe64dd3Smacallan for (i = 0; i < 8; i++) 1790dfe64dd3Smacallan pVBInfo->TimingH.data[i] = 1791dfe64dd3Smacallan pVBInfo->XGINEWUB_CRT1Table[index].CR[i]; 1792dfe64dd3Smacallan 1793dfe64dd3Smacallan for (i = 0; i < 7; i++) 1794dfe64dd3Smacallan pVBInfo->TimingV.data[i] = 1795dfe64dd3Smacallan pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8]; 1796dfe64dd3Smacallan 1797dfe64dd3Smacallan XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension); 1798dfe64dd3Smacallan 1799dfe64dd3Smacallan 1800dfe64dd3Smacallan 1801dfe64dd3Smacallan XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo); 1802dfe64dd3Smacallan 1803dfe64dd3Smacallan 1804dfe64dd3Smacallan if (pVBInfo->ModeType > 0x03) 1805dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x14, 0x4F); 1806dfe64dd3Smacallan} 1807dfe64dd3Smacallan 1808dfe64dd3Smacallan 1809dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1810dfe64dd3Smacallan/* Function : XGI_SetCRT1Timing_H */ 1811dfe64dd3Smacallan/* Input : */ 1812dfe64dd3Smacallan/* Output : */ 1813dfe64dd3Smacallan/* Description : */ 1814dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1815dfe64dd3Smacallanvoid 1816dfe64dd3SmacallanXGI_SetCRT1Timing_H(PVB_DEVICE_INFO pVBInfo, 1817dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension) 1818dfe64dd3Smacallan{ 1819dfe64dd3Smacallan UCHAR data, data1, pushax; 1820dfe64dd3Smacallan USHORT i, j; 1821dfe64dd3Smacallan 1822dfe64dd3Smacallan /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x51 , 0 ) ; */ 1823dfe64dd3Smacallan /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x56 , 0 ) ; */ 1824dfe64dd3Smacallan /* XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4 ,0x11 , 0x7f , 0x00 ) ; */ 1825dfe64dd3Smacallan 1826dfe64dd3Smacallan data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11); /* unlock cr0-7 */ 1827dfe64dd3Smacallan data &= 0x7F; 1828dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, data); 1829dfe64dd3Smacallan 1830dfe64dd3Smacallan data = pVBInfo->TimingH.data[0]; 1831dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0, data); 1832dfe64dd3Smacallan 1833dfe64dd3Smacallan for (i = 0x01; i <= 0x04; i++) { 1834dfe64dd3Smacallan data = pVBInfo->TimingH.data[i]; 1835dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 1), data); 1836dfe64dd3Smacallan } 1837dfe64dd3Smacallan 1838dfe64dd3Smacallan for (i = 0x05; i <= 0x06; i++) { 1839dfe64dd3Smacallan data = pVBInfo->TimingH.data[i]; 1840dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, (USHORT) (i + 6), data); 1841dfe64dd3Smacallan } 1842dfe64dd3Smacallan 1843dfe64dd3Smacallan j = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0e); 1844dfe64dd3Smacallan j &= 0x1F; 1845dfe64dd3Smacallan data = pVBInfo->TimingH.data[7]; 1846dfe64dd3Smacallan data &= 0xE0; 1847dfe64dd3Smacallan data |= j; 1848dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0e, data); 1849dfe64dd3Smacallan 1850dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 1851dfe64dd3Smacallan if (HwDeviceExtension->jChipType >= XG20) { 1852dfe64dd3Smacallan data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x04); 1853dfe64dd3Smacallan data = data - 1; 1854dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x04, data); 1855dfe64dd3Smacallan data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x05); 1856dfe64dd3Smacallan data1 = data; 1857dfe64dd3Smacallan data1 &= 0xE0; 1858dfe64dd3Smacallan data &= 0x1F; 1859dfe64dd3Smacallan if (data == 0) { 1860dfe64dd3Smacallan pushax = data; 1861dfe64dd3Smacallan data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0c); 1862dfe64dd3Smacallan data &= 0xFB; 1863dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0c, data); 1864dfe64dd3Smacallan data = pushax; 1865dfe64dd3Smacallan } 1866dfe64dd3Smacallan data = data - 1; 1867dfe64dd3Smacallan data |= data1; 1868dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x05, data); 1869dfe64dd3Smacallan data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0e); 1870dfe64dd3Smacallan data = data >> 5; 1871dfe64dd3Smacallan data = data + 3; 1872dfe64dd3Smacallan if (data > 7) 1873dfe64dd3Smacallan data = data - 7; 1874dfe64dd3Smacallan data = data << 5; 1875dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0e, ~0xE0, data); 1876dfe64dd3Smacallan } 1877dfe64dd3Smacallan} 1878dfe64dd3Smacallan 1879dfe64dd3Smacallan 1880dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1881dfe64dd3Smacallan/* Function : XGI_SetCRT1Timing_V */ 1882dfe64dd3Smacallan/* Input : */ 1883dfe64dd3Smacallan/* Output : */ 1884dfe64dd3Smacallan/* Description : */ 1885dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1886dfe64dd3Smacallanvoid 1887dfe64dd3SmacallanXGI_SetCRT1Timing_V(USHORT ModeIdIndex, USHORT ModeNo, 1888dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 1889dfe64dd3Smacallan{ 1890dfe64dd3Smacallan UCHAR data; 1891dfe64dd3Smacallan USHORT i, j; 1892dfe64dd3Smacallan 1893dfe64dd3Smacallan /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x51 , 0 ) ; */ 1894dfe64dd3Smacallan /* XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x56 , 0 ) ; */ 1895dfe64dd3Smacallan /* XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4 , 0x11 , 0x7f , 0x00 ) ; */ 1896dfe64dd3Smacallan 1897dfe64dd3Smacallan for (i = 0x00; i <= 0x01; i++) { 1898dfe64dd3Smacallan data = pVBInfo->TimingV.data[i]; 1899dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 6), data); 1900dfe64dd3Smacallan } 1901dfe64dd3Smacallan 1902dfe64dd3Smacallan for (i = 0x02; i <= 0x03; i++) { 1903dfe64dd3Smacallan data = pVBInfo->TimingV.data[i]; 1904dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 0x0e), data); 1905dfe64dd3Smacallan } 1906dfe64dd3Smacallan 1907dfe64dd3Smacallan for (i = 0x04; i <= 0x05; i++) { 1908dfe64dd3Smacallan data = pVBInfo->TimingV.data[i]; 1909dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 0x11), data); 1910dfe64dd3Smacallan } 1911dfe64dd3Smacallan 1912dfe64dd3Smacallan j = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0a); 1913dfe64dd3Smacallan j &= 0xC0; 1914dfe64dd3Smacallan data = pVBInfo->TimingV.data[6]; 1915dfe64dd3Smacallan data &= 0x3F; 1916dfe64dd3Smacallan data |= j; 1917dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0a, data); 1918dfe64dd3Smacallan 1919dfe64dd3Smacallan data = pVBInfo->TimingV.data[6]; 1920dfe64dd3Smacallan data &= 0x80; 1921dfe64dd3Smacallan data = data >> 2; 1922dfe64dd3Smacallan 1923dfe64dd3Smacallan if (ModeNo <= 0x13) 1924dfe64dd3Smacallan i = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; 1925dfe64dd3Smacallan else 1926dfe64dd3Smacallan i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 1927dfe64dd3Smacallan 1928dfe64dd3Smacallan i &= DoubleScanMode; 1929dfe64dd3Smacallan if (i) 1930dfe64dd3Smacallan data |= 0x80; 1931dfe64dd3Smacallan 1932dfe64dd3Smacallan j = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x09); 1933dfe64dd3Smacallan j &= 0x5F; 1934dfe64dd3Smacallan data |= j; 1935dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x09, data); 1936dfe64dd3Smacallan} 1937dfe64dd3Smacallan 1938dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 1939dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1940dfe64dd3Smacallan/* Function : XGI_SetXG21CRTC */ 1941dfe64dd3Smacallan/* Input : Stand or enhance CRTC table */ 1942dfe64dd3Smacallan/* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */ 1943dfe64dd3Smacallan/* Description : Set LCD timing */ 1944dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 1945dfe64dd3Smacallanvoid XGI_SetXG21CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 1946dfe64dd3Smacallan{ 1947dfe64dd3Smacallan UCHAR StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx ; 1948dfe64dd3Smacallan USHORT Temp1, Temp2, Temp3 ; 1949dfe64dd3Smacallan 1950dfe64dd3Smacallan if ( ModeNo <= 0x13 ) 1951dfe64dd3Smacallan { 1952dfe64dd3Smacallan StandTableIndex = XGI_GetModePtr( pVBInfo->SModeIDTable, 1953dfe64dd3Smacallan pVBInfo->ModeType, 1954dfe64dd3Smacallan ModeNo, ModeIdIndex); 1955dfe64dd3Smacallan Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 4 ] ; /* CR04 HRS */ 1956dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2E , Tempax ) ; /* SR2E [7:0]->HRS */ 1957dfe64dd3Smacallan Tempbx = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 5 ] ; /* Tempbx: CR05 HRE */ 1958dfe64dd3Smacallan Tempbx &= 0x1F ; /* Tempbx: HRE[4:0] */ 1959dfe64dd3Smacallan Tempcx = Tempax ; 1960dfe64dd3Smacallan Tempcx &= 0xE0 ; /* Tempcx: HRS[7:5] */ 1961dfe64dd3Smacallan Tempdx = Tempcx | Tempbx ; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */ 1962dfe64dd3Smacallan if ( Tempbx < ( Tempax & 0x1F ) ) /* IF HRE < HRS */ 1963dfe64dd3Smacallan Tempdx |= 0x20 ; /* Tempdx: HRE = HRE + 0x20 */ 1964dfe64dd3Smacallan Tempdx <<= 2 ; /* Tempdx << 2 */ 1965dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , Tempdx ) ; /* SR2F [7:2]->HRE */ 1966dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ; 1967dfe64dd3Smacallan 1968dfe64dd3Smacallan Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 16 ] ; /* Tempax: CR16 VRS */ 1969dfe64dd3Smacallan Tempbx = Tempax ; /* Tempbx=Tempax */ 1970dfe64dd3Smacallan Tempax &= 0x01 ; /* Tempax: VRS[0] */ 1971dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x33 , Tempax ) ; /* SR33[0]->VRS */ 1972dfe64dd3Smacallan Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 7 ] ; /* Tempax: CR7 VRS */ 1973dfe64dd3Smacallan Tempdx = Tempbx >> 1 ; /* Tempdx: VRS[7:1] */ 1974dfe64dd3Smacallan Tempcx = Tempax & 0x04 ; /* Tempcx: CR7[2] */ 1975dfe64dd3Smacallan Tempcx <<= 5 ; /* Tempcx[7]: VRS[8] */ 1976dfe64dd3Smacallan Tempdx |= Tempcx ; /* Tempdx: VRS[8:1] */ 1977dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x34 , Tempdx ) ; /* SR34[7:0]: VRS[8:1] */ 1978dfe64dd3Smacallan 1979dfe64dd3Smacallan Temp1 = Tempcx << 1 ; /* Temp1[8]: VRS[8] UCHAR -> USHORT */ 1980dfe64dd3Smacallan Temp1 |= Tempbx ; /* Temp1[8:0]: VRS[8:0] */ 1981dfe64dd3Smacallan Tempax &= 0x80 ; /* Tempax[7]: CR7[7] */ 1982dfe64dd3Smacallan Temp2 = Tempax << 2 ; /* Temp2[9]: VRS[9] */ 1983dfe64dd3Smacallan Temp1 |= Temp2 ; /* Temp1[9:0]: VRS[9:0] */ 1984dfe64dd3Smacallan 1985dfe64dd3Smacallan Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 17 ] ; /* CR16 VRE */ 1986dfe64dd3Smacallan Tempax &= 0x0F ; /* Tempax[3:0]: VRE[3:0] */ 1987dfe64dd3Smacallan Temp2 = Temp1 & 0x3F0 ; /* Temp2[9:4]: VRS[9:4] */ 1988dfe64dd3Smacallan Temp2 |= Tempax ; /* Temp2[9:0]: VRE[9:0] */ 1989dfe64dd3Smacallan Temp3 = Temp1 & 0x0F ; /* Temp3[3:0]: VRS[3:0] */ 1990dfe64dd3Smacallan if ( Tempax < Temp3 ) /* VRE[3:0]<VRS[3:0] */ 1991dfe64dd3Smacallan Temp2 |= 0x10 ; /* Temp2: VRE + 0x10 */ 1992dfe64dd3Smacallan Temp2 &= 0xFF ; /* Temp2[7:0]: VRE[7:0] */ 1993dfe64dd3Smacallan Tempax = (UCHAR)Temp2 ; /* Tempax[7:0]: VRE[7:0] */ 1994dfe64dd3Smacallan Tempax <<= 2 ; /* Tempax << 2: VRE[5:0] */ 1995dfe64dd3Smacallan Temp1 &= 0x600 ; /* Temp1[10:9]: VRS[10:9] */ 1996dfe64dd3Smacallan Temp1 >>= 9 ; /* [10:9]->[1:0] */ 1997dfe64dd3Smacallan Tempbx = (UCHAR)Temp1 ; /* Tempbx[1:0]: VRS[10:9] */ 1998dfe64dd3Smacallan Tempax |= Tempbx ; /* VRE[5:0]VRS[10:9] */ 1999dfe64dd3Smacallan Tempax &= 0x7F ; 2000dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3F , Tempax ) ; /* SR3F D[7:2]->VRE D[1:0]->VRS */ 2001dfe64dd3Smacallan } 2002dfe64dd3Smacallan else 2003dfe64dd3Smacallan { 2004dfe64dd3Smacallan index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ; 2005dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ; /* Tempax: CR4 HRS */ 2006dfe64dd3Smacallan Tempcx = Tempax ; /* Tempcx: HRS */ 2007dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2E , Tempax ) ; /* SR2E[7:0]->HRS */ 2008dfe64dd3Smacallan 2009dfe64dd3Smacallan Tempdx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ; /* SRB */ 2010dfe64dd3Smacallan Tempdx &= 0xC0 ; /* Tempdx[7:6]: SRB[7:6] */ 2011dfe64dd3Smacallan Temp1 = Tempdx ; /* Temp1[7:6]: HRS[9:8] */ 2012dfe64dd3Smacallan Temp1 <<= 2 ; /* Temp1[9:8]: HRS[9:8] */ 2013dfe64dd3Smacallan Temp1 |= Tempax ; /* Temp1[9:0]: HRS[9:0] */ 2014dfe64dd3Smacallan 2015dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 4 ] ; /* CR5 HRE */ 2016dfe64dd3Smacallan Tempax &= 0x1F ; /* Tempax[4:0]: HRE[4:0] */ 2017dfe64dd3Smacallan 2018dfe64dd3Smacallan Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 6 ] ; /* SRC */ 2019dfe64dd3Smacallan Tempbx &= 0x04 ; /* Tempbx[2]: HRE[5] */ 2020dfe64dd3Smacallan Tempbx <<= 3 ; /* Tempbx[5]: HRE[5] */ 2021dfe64dd3Smacallan Tempax |= Tempbx ; /* Tempax[5:0]: HRE[5:0] */ 2022dfe64dd3Smacallan 2023dfe64dd3Smacallan Temp2 = Temp1 & 0x3C0 ; /* Temp2[9:6]: HRS[9:6] */ 2024dfe64dd3Smacallan Temp2 |= Tempax ; /* Temp2[9:0]: HRE[9:0] */ 2025dfe64dd3Smacallan 2026dfe64dd3Smacallan Tempcx &= 0x3F ; /* Tempcx[5:0]: HRS[5:0] */ 2027dfe64dd3Smacallan if( Tempax < Tempcx ) /* HRE < HRS */ 2028dfe64dd3Smacallan Temp2 |= 0x40 ; /* Temp2 + 0x40 */ 2029dfe64dd3Smacallan 2030dfe64dd3Smacallan Temp2 &= 0xFF ; 2031dfe64dd3Smacallan Tempax = (UCHAR)Temp2 ; /* Tempax: HRE[7:0] */ 2032dfe64dd3Smacallan Tempax <<= 2 ; /* Tempax[7:2]: HRE[5:0] */ 2033dfe64dd3Smacallan Tempdx >>= 6 ; /* Tempdx[7:6]->[1:0] HRS[9:8] */ 2034dfe64dd3Smacallan Tempax |= Tempdx ; /* HRE[5:0]HRS[9:8] */ 2035dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , Tempax ) ; /* SR2F D[7:2]->HRE, D[1:0]->HRS */ 2036dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ; 2037dfe64dd3Smacallan 2038dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 10 ] ; /* CR10 VRS */ 2039dfe64dd3Smacallan Tempbx = Tempax ; /* Tempbx: VRS */ 2040dfe64dd3Smacallan Tempax &= 0x01 ; /* Tempax[0]: VRS[0] */ 2041dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x33 , Tempax ) ; /* SR33[0]->VRS[0] */ 2042dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 9 ] ; /* CR7[2][7] VRE */ 2043dfe64dd3Smacallan Tempcx = Tempbx >> 1 ; /* Tempcx[6:0]: VRS[7:1] */ 2044dfe64dd3Smacallan Tempdx = Tempax & 0x04 ; /* Tempdx[2]: CR7[2] */ 2045dfe64dd3Smacallan Tempdx <<= 5 ; /* Tempdx[7]: VRS[8] */ 2046dfe64dd3Smacallan Tempcx |= Tempdx ; /* Tempcx[7:0]: VRS[8:1] */ 2047dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x34 , Tempcx ) ; /* SR34[8:1]->VRS */ 2048dfe64dd3Smacallan 2049dfe64dd3Smacallan Temp1 = Tempdx ; /* Temp1[7]: Tempdx[7] */ 2050dfe64dd3Smacallan Temp1 <<= 1 ; /* Temp1[8]: VRS[8] */ 2051dfe64dd3Smacallan Temp1 |= Tempbx ; /* Temp1[8:0]: VRS[8:0] */ 2052dfe64dd3Smacallan Tempax &= 0x80 ; 2053dfe64dd3Smacallan Temp2 = Tempax << 2 ; /* Temp2[9]: VRS[9] */ 2054dfe64dd3Smacallan Temp1 |= Temp2 ; /* Temp1[9:0]: VRS[9:0] */ 2055dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ; /* Tempax: SRA */ 2056dfe64dd3Smacallan Tempax &= 0x08 ; /* Tempax[3]: VRS[3] */ 2057dfe64dd3Smacallan Temp2 = Tempax ; 2058dfe64dd3Smacallan Temp2 <<= 7 ; /* Temp2[10]: VRS[10] */ 2059dfe64dd3Smacallan Temp1 |= Temp2 ; /* Temp1[10:0]: VRS[10:0] */ 2060dfe64dd3Smacallan 2061dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 11 ] ; /* Tempax: CR11 VRE */ 2062dfe64dd3Smacallan Tempax &= 0x0F ; /* Tempax[3:0]: VRE[3:0] */ 2063dfe64dd3Smacallan Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ; /* Tempbx: SRA */ 2064dfe64dd3Smacallan Tempbx &= 0x20 ; /* Tempbx[5]: VRE[5] */ 2065dfe64dd3Smacallan Tempbx >>= 1 ; /* Tempbx[4]: VRE[4] */ 2066dfe64dd3Smacallan Tempax |= Tempbx ; /* Tempax[4:0]: VRE[4:0] */ 2067dfe64dd3Smacallan Temp2 = Temp1 & 0x7E0 ; /* Temp2[10:5]: VRS[10:5] */ 2068dfe64dd3Smacallan Temp2 |= Tempax ; /* Temp2[10:5]: VRE[10:5] */ 2069dfe64dd3Smacallan 2070dfe64dd3Smacallan Temp3 = Temp1 & 0x1F ; /* Temp3[4:0]: VRS[4:0] */ 2071dfe64dd3Smacallan if ( Tempax < Temp3 ) /* VRE < VRS */ 2072dfe64dd3Smacallan Temp2 |= 0x20 ; /* VRE + 0x20 */ 2073dfe64dd3Smacallan 2074dfe64dd3Smacallan Temp2 &= 0xFF ; 2075dfe64dd3Smacallan Tempax = (UCHAR)Temp2 ; /* Tempax: VRE[7:0] */ 2076dfe64dd3Smacallan Tempax <<= 2 ; /* Tempax[7:0]; VRE[5:0]00 */ 2077dfe64dd3Smacallan Temp1 &= 0x600 ; /* Temp1[10:9]: VRS[10:9] */ 2078dfe64dd3Smacallan Temp1 >>= 9 ; /* Temp1[1:0]: VRS[10:9] */ 2079dfe64dd3Smacallan Tempbx = (UCHAR)Temp1 ; 2080dfe64dd3Smacallan Tempax |= Tempbx ; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */ 2081dfe64dd3Smacallan Tempax &= 0x7F ; 2082dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3F , Tempax ) ; /* SR3F D[7:2]->VRE D[1:0]->VRS */ 2083dfe64dd3Smacallan } 2084dfe64dd3Smacallan} 2085dfe64dd3Smacallan 2086dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 2087dfe64dd3Smacallanvoid XGI_SetXG27CRTC(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 2088dfe64dd3Smacallan{ 2089dfe64dd3Smacallan USHORT StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx ; 2090dfe64dd3Smacallan 2091dfe64dd3Smacallan if ( ModeNo <= 0x13 ) 2092dfe64dd3Smacallan { 2093dfe64dd3Smacallan /* Jong 10/05/2007; merge code */ 2094dfe64dd3Smacallan /* StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ; */ 2095dfe64dd3Smacallan StandTableIndex = XGI_GetModePtr( pVBInfo->SModeIDTable, 2096dfe64dd3Smacallan pVBInfo->ModeType, 2097dfe64dd3Smacallan ModeNo, ModeIdIndex); 2098dfe64dd3Smacallan 2099dfe64dd3Smacallan Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 4 ] ; /* CR04 HRS */ 2100dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2E , Tempax ) ; /* SR2E [7:0]->HRS */ 2101dfe64dd3Smacallan Tempbx = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 5 ] ; /* Tempbx: CR05 HRE */ 2102dfe64dd3Smacallan Tempbx &= 0x1F ; /* Tempbx: HRE[4:0] */ 2103dfe64dd3Smacallan Tempcx = Tempax ; 2104dfe64dd3Smacallan Tempcx &= 0xE0 ; /* Tempcx: HRS[7:5] */ 2105dfe64dd3Smacallan Tempdx = Tempcx | Tempbx ; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */ 2106dfe64dd3Smacallan if ( Tempbx < ( Tempax & 0x1F ) ) /* IF HRE < HRS */ 2107dfe64dd3Smacallan Tempdx |= 0x20 ; /* Tempdx: HRE = HRE + 0x20 */ 2108dfe64dd3Smacallan Tempdx <<= 2 ; /* Tempdx << 2 */ 2109dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , Tempdx ) ; /* SR2F [7:2]->HRE */ 2110dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ; 2111dfe64dd3Smacallan 2112dfe64dd3Smacallan Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 16 ] ; /* Tempax: CR10 VRS */ 2113dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x34 , Tempax ) ; /* SR34[7:0]->VRS */ 2114dfe64dd3Smacallan Tempcx = Tempax ; /* Tempcx=Tempax=VRS[7:0] */ 2115dfe64dd3Smacallan Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 7 ] ; /* Tempax[7][2]: CR7[7][2] VRS[9][8] */ 2116dfe64dd3Smacallan Tempbx = Tempax ; /* Tempbx=CR07 */ 2117dfe64dd3Smacallan Tempax &= 0x04 ; /* Tempax[2]: CR07[2] VRS[8] */ 2118dfe64dd3Smacallan Tempax >>= 2; 2119dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x01, Tempax ) ; /* SR35 D[0]->VRS D[8] */ 2120dfe64dd3Smacallan Tempcx |= (Tempax << 8) ; /* Tempcx[8] |= VRS[8] */ 2121dfe64dd3Smacallan Tempcx |= (Tempbx & 0x80)<<2; /* Tempcx[9] |= VRS[9] */ 2122dfe64dd3Smacallan 2123dfe64dd3Smacallan 2124dfe64dd3Smacallan Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 17 ] ; /* CR11 VRE */ 2125dfe64dd3Smacallan Tempax &= 0x0F ; /* Tempax: VRE[3:0] */ 2126dfe64dd3Smacallan Tempbx = Tempcx ; /* Tempbx=Tempcx=VRS[9:0] */ 2127dfe64dd3Smacallan Tempbx &= 0x3F0 ; /* Tempbx[9:4]: VRS[9:4] */ 2128dfe64dd3Smacallan Tempbx |= Tempax ; /* Tempbx[9:0]: VRE[9:0] */ 2129dfe64dd3Smacallan if ( Tempax <= (Tempcx & 0x0F) ) /* VRE[3:0]<=VRS[3:0] */ 2130dfe64dd3Smacallan Tempbx |= 0x10 ; /* Tempbx: VRE + 0x10 */ 2131dfe64dd3Smacallan Tempax = (UCHAR)Tempbx & 0xFF; /* Tempax[7:0]: VRE[7:0] */ 2132dfe64dd3Smacallan Tempax <<= 2 ; /* Tempax << 2: VRE[5:0] */ 2133dfe64dd3Smacallan Tempcx = (Tempcx&0x600)>>8; /* Tempcx VRS[10:9] */ 2134dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3F , ~0xFC, Tempax ) ; /* SR3F D[7:2]->VRE D[5:0] */ 2135dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x06, Tempcx ) ; /* SR35 D[2:1]->VRS[10:9] */ 2136dfe64dd3Smacallan } 2137dfe64dd3Smacallan else 2138dfe64dd3Smacallan { 2139dfe64dd3Smacallan index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ; 2140dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ; /* Tempax: CR4 HRS */ 2141dfe64dd3Smacallan Tempbx = Tempax ; /* Tempbx: HRS[7:0] */ 2142dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2E , Tempax ) ; /* SR2E[7:0]->HRS */ 2143dfe64dd3Smacallan 2144dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ; /* SR0B */ 2145dfe64dd3Smacallan Tempax &= 0xC0 ; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/ 2146dfe64dd3Smacallan Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */ 2147dfe64dd3Smacallan 2148dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 4 ] ; /* CR5 HRE */ 2149dfe64dd3Smacallan Tempax &= 0x1F ; /* Tempax[4:0]: HRE[4:0] */ 2150dfe64dd3Smacallan Tempcx = Tempax ; /* Tempcx: HRE[4:0] */ 2151dfe64dd3Smacallan 2152dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 6 ] ; /* SRC */ 2153dfe64dd3Smacallan Tempax &= 0x04 ; /* Tempax[2]: HRE[5] */ 2154dfe64dd3Smacallan Tempax <<= 3 ; /* Tempax[5]: HRE[5] */ 2155dfe64dd3Smacallan Tempcx |= Tempax ; /* Tempcx[5:0]: HRE[5:0] */ 2156dfe64dd3Smacallan 2157dfe64dd3Smacallan Tempbx = Tempbx & 0x3C0 ; /* Tempbx[9:6]: HRS[9:6] */ 2158dfe64dd3Smacallan Tempbx |= Tempcx ; /* Tempbx: HRS[9:6]HRE[5:0] */ 2159dfe64dd3Smacallan 2160dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ; /* Tempax: CR4 HRS */ 2161dfe64dd3Smacallan Tempax &= 0x3F ; /* Tempax: HRS[5:0] */ 2162dfe64dd3Smacallan if( Tempcx <= Tempax ) /* HRE[5:0] < HRS[5:0] */ 2163dfe64dd3Smacallan Tempbx += 0x40 ; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/ 2164dfe64dd3Smacallan 2165dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ; /* SR0B */ 2166dfe64dd3Smacallan Tempax &= 0xC0 ; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/ 2167dfe64dd3Smacallan Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/ 2168dfe64dd3Smacallan Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */ 2169dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , Tempax ) ; /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */ 2170dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ; 2171dfe64dd3Smacallan 2172dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 10 ] ; /* CR10 VRS */ 2173dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x34 , Tempax ) ; /* SR34[7:0]->VRS[7:0] */ 2174dfe64dd3Smacallan 2175dfe64dd3Smacallan Tempcx = Tempax ; /* Tempcx <= VRS[7:0] */ 2176dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 9 ] ; /* CR7[7][2] VRS[9][8] */ 2177dfe64dd3Smacallan Tempbx = Tempax ; /* Tempbx <= CR07[7:0] */ 2178dfe64dd3Smacallan Tempax = Tempax & 0x04 ; /* Tempax[2]: CR7[2]: VRS[8] */ 2179dfe64dd3Smacallan Tempax >>= 2 ; /* Tempax[0]: VRS[8] */ 2180dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x01 , Tempax ) ; /* SR35[0]: VRS[8] */ 2181dfe64dd3Smacallan Tempcx |= (Tempax<<8) ; /* Tempcx <= VRS[8:0] */ 2182dfe64dd3Smacallan Tempcx |= ((Tempbx&0x80)<<2) ; /* Tempcx <= VRS[9:0] */ 2183dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ; /* Tempax: SR0A */ 2184dfe64dd3Smacallan Tempax &= 0x08; /* SR0A[3] VRS[10] */ 2185dfe64dd3Smacallan Tempcx |= (Tempax<<7) ; /* Tempcx <= VRS[10:0] */ 2186dfe64dd3Smacallan 2187dfe64dd3Smacallan 2188dfe64dd3Smacallan Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 11 ] ; /* Tempax: CR11 VRE */ 2189dfe64dd3Smacallan Tempax &= 0x0F ; /* Tempax[3:0]: VRE[3:0] */ 2190dfe64dd3Smacallan Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ; /* Tempbx: SR0A */ 2191dfe64dd3Smacallan Tempbx &= 0x20 ; /* Tempbx[5]: SR0A[5]: VRE[4] */ 2192dfe64dd3Smacallan Tempbx >>= 1 ; /* Tempbx[4]: VRE[4] */ 2193dfe64dd3Smacallan Tempax |= Tempbx ; /* Tempax[4:0]: VRE[4:0] */ 2194dfe64dd3Smacallan Tempbx = Tempcx ; /* Tempbx: VRS[10:0] */ 2195dfe64dd3Smacallan Tempbx &= 0x7E0 ; /* Tempbx[10:5]: VRS[10:5] */ 2196dfe64dd3Smacallan Tempbx |= Tempax ; /* Tempbx: VRS[10:5]VRE[4:0] */ 2197dfe64dd3Smacallan 2198dfe64dd3Smacallan if ( Tempbx <= Tempcx ) /* VRE <= VRS */ 2199dfe64dd3Smacallan Tempbx |= 0x20 ; /* VRE + 0x20 */ 2200dfe64dd3Smacallan 2201dfe64dd3Smacallan Tempax = (Tempbx<<2) & 0xFF ; /* Tempax: Tempax[7:0]; VRE[5:0]00 */ 2202dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3F , ~0xFC , Tempax ) ; /* SR3F[7:2]:VRE[5:0] */ 2203dfe64dd3Smacallan Tempax = Tempcx >> 8; 2204dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x07 , Tempax ) ; /* SR35[2:0]:VRS[10:8] */ 2205dfe64dd3Smacallan } 2206dfe64dd3Smacallan} 2207dfe64dd3Smacallan 2208dfe64dd3Smacallan 2209dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 2210dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2211dfe64dd3Smacallan/* Function : XGI_SetXG21LCD */ 2212dfe64dd3Smacallan/* Input : */ 2213dfe64dd3Smacallan/* Output : FCLK duty cycle, FCLK delay compensation */ 2214dfe64dd3Smacallan/* Description : All values set zero */ 2215dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2216dfe64dd3Smacallanvoid XGI_SetXG21LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo) 2217dfe64dd3Smacallan{ 2218dfe64dd3Smacallan ULONG Data , Temp , b3CC ; 2219dfe64dd3Smacallan ULONG XGI_P3cc ; 2220dfe64dd3Smacallan 2221dfe64dd3Smacallan if ( ModeNo > 0x13 ) 2222dfe64dd3Smacallan Data = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ; 2223dfe64dd3Smacallan XGI_P3cc = pVBInfo->P3cc ; 2224dfe64dd3Smacallan 2225dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2E , 0x00 ) ; 2226dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2F , 0x00 ) ; 2227dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x46 , 0x00 ) ; 2228dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x47 , 0x00 ) ; 2229dfe64dd3Smacallan if ( ((*pVBInfo->pDVOSetting)&0xC0) == 0xC0 ) 2230dfe64dd3Smacallan { 2231dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2E , *pVBInfo->pCR2E ) ; 2232dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2F , *pVBInfo->pCR2F ) ; 2233dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x46 , *pVBInfo->pCR46 ) ; 2234dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x47 , *pVBInfo->pCR47 ) ; 2235dfe64dd3Smacallan } 2236dfe64dd3Smacallan 2237dfe64dd3Smacallan Temp = XGI_GetReg( pVBInfo->P3d4 , 0x37 ) ; 2238dfe64dd3Smacallan 2239dfe64dd3Smacallan if ( Temp & 0x01 ) 2240dfe64dd3Smacallan { 2241dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x06 , 0x40 ) ; /* 18 bits FP */ 2242dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x09 , 0x40 ) ; 2243dfe64dd3Smacallan } 2244dfe64dd3Smacallan 2245dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x1E , 0x01 ) ; /* Negative blank polarity */ 2246dfe64dd3Smacallan 2247dfe64dd3Smacallan XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , ~0x20 ) ; 2248dfe64dd3Smacallan XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x80 ) ; 2249dfe64dd3Smacallan 2250dfe64dd3Smacallan if ( ModeNo <= 0x13 ) 2251dfe64dd3Smacallan { 2252dfe64dd3Smacallan/* Jong 07/31/2009; might use XGINew_P3cc instead */ 2253dfe64dd3Smacallan#if 1 2254dfe64dd3Smacallan b3CC = (UCHAR) XGI_GetRegByte( (XGIIOADDRESS) XGI_P3cc ) ; 2255dfe64dd3Smacallan if ( b3CC & 0x40 ) 2256dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */ 2257dfe64dd3Smacallan if ( b3CC & 0x80 ) 2258dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */ 2259dfe64dd3Smacallan#endif 2260dfe64dd3Smacallan } 2261dfe64dd3Smacallan else 2262dfe64dd3Smacallan { 2263dfe64dd3Smacallan if ( Data & 0x4000 ) 2264dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */ 2265dfe64dd3Smacallan if ( Data & 0x8000 ) 2266dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */ 2267dfe64dd3Smacallan } 2268dfe64dd3Smacallan} 2269dfe64dd3Smacallan 2270dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 2271dfe64dd3Smacallanvoid XGI_SetXG27LCD(PVB_DEVICE_INFO pVBInfo,USHORT RefreshRateTableIndex,USHORT ModeNo) 2272dfe64dd3Smacallan{ 2273dfe64dd3Smacallan ULONG Data , Temp , b3CC ; 2274dfe64dd3Smacallan ULONG XGI_P3cc ; 2275dfe64dd3Smacallan 2276dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetXG27LCD()...begin\n")); 2277dfe64dd3Smacallan 2278dfe64dd3Smacallan if ( ModeNo > 0x13 ) 2279dfe64dd3Smacallan Data = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ; 2280dfe64dd3Smacallan 2281dfe64dd3Smacallan XGI_P3cc = pVBInfo->P3cc ; 2282dfe64dd3Smacallan 2283dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetXG27LCD()...1\n")); 2284dfe64dd3Smacallan 2285dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2E , 0x00 ) ; 2286dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2F , 0x00 ) ; 2287dfe64dd3Smacallan XGI_SetReg( pVBInfo->P3d4 , 0x46 , 0x00 ) ; 2288dfe64dd3Smacallan XGI_SetReg( pVBInfo->P3d4 , 0x47 , 0x00 ) ; 2289dfe64dd3Smacallan 2290dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetXG27LCD()...2\n")); 2291dfe64dd3Smacallan 2292dfe64dd3Smacallan Temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x37 ) ; 2293dfe64dd3Smacallan 2294dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetXG27LCD()...3\n")); 2295dfe64dd3Smacallan 2296dfe64dd3Smacallan if ( ( Temp & 0x03 ) == 0 ) /* dual 12 */ 2297dfe64dd3Smacallan { 2298dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x46 , 0x13 ) ; 2299dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x47 , 0x13 ) ; 2300dfe64dd3Smacallan } 2301dfe64dd3Smacallan 2302dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetXG27LCD()...4\n")); 2303dfe64dd3Smacallan 2304dfe64dd3Smacallan if ( ((*pVBInfo->pDVOSetting)&0xC0) == 0xC0 ) 2305dfe64dd3Smacallan { 2306dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2E , *pVBInfo->pCR2E ) ; 2307dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2F , *pVBInfo->pCR2F ) ; 2308dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x46 , *pVBInfo->pCR46 ) ; 2309dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x47 , *pVBInfo->pCR47 ) ; 2310dfe64dd3Smacallan } 2311dfe64dd3Smacallan 2312dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetXG27LCD()...5\n")); 2313dfe64dd3Smacallan 2314dfe64dd3Smacallan XGI_SetXG27FPBits(pVBInfo); 2315dfe64dd3Smacallan 2316dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetXG27LCD()...6\n")); 2317dfe64dd3Smacallan 2318dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x1E , 0x01 ) ; /* Negative blank polarity */ 2319dfe64dd3Smacallan 2320dfe64dd3Smacallan XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , ~0x20 ) ; /* Hsync polarity */ 2321dfe64dd3Smacallan XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x80 ) ; /* Vsync polarity */ 2322dfe64dd3Smacallan 2323dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetXG27LCD()...7\n")); 2324dfe64dd3Smacallan 2325dfe64dd3Smacallan if ( ModeNo <= 0x13 ) 2326dfe64dd3Smacallan { 2327dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetXG27LCD()...7-1-XGI_P3cc=%d\n", XGI_P3cc)); 2328dfe64dd3Smacallan 2329dfe64dd3Smacallan/* Jong 07/31/2009; might use XGINew_P3cc instead */ 2330dfe64dd3Smacallan#if 1 2331dfe64dd3Smacallan b3CC = (UCHAR) XGI_GetRegByte( (XGIIOADDRESS) XGI_P3cc ) ; 2332dfe64dd3Smacallan if ( b3CC & 0x40 ) 2333dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */ 2334dfe64dd3Smacallan if ( b3CC & 0x80 ) 2335dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */ 2336dfe64dd3Smacallan#endif 2337dfe64dd3Smacallan 2338dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetXG27LCD()...7-2\n")); 2339dfe64dd3Smacallan } 2340dfe64dd3Smacallan else 2341dfe64dd3Smacallan { 2342dfe64dd3Smacallan if ( Data & 0x4000 ) 2343dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */ 2344dfe64dd3Smacallan if ( Data & 0x8000 ) 2345dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */ 2346dfe64dd3Smacallan } 2347dfe64dd3Smacallan 2348dfe64dd3Smacallan PDEBUG(ErrorF("XGI_SetXG27LCD()...End\n")); 2349dfe64dd3Smacallan} 2350dfe64dd3Smacallan 2351dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 2352dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2353dfe64dd3Smacallan/* Function : XGI_UpdateXG21CRTC */ 2354dfe64dd3Smacallan/* Input : */ 2355dfe64dd3Smacallan/* Output : CRT1 CRTC */ 2356dfe64dd3Smacallan/* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */ 2357dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2358dfe64dd3Smacallanvoid XGI_UpdateXG21CRTC( USHORT ModeNo , PVB_DEVICE_INFO pVBInfo , USHORT RefreshRateTableIndex ) 2359dfe64dd3Smacallan{ 2360dfe64dd3Smacallan int i , index = -1; 2361dfe64dd3Smacallan 2362dfe64dd3Smacallan PDEBUG(ErrorF("XGI_UpdateXG21CRTC()...begin\n")); 2363dfe64dd3Smacallan 2364dfe64dd3Smacallan XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3d4 , 0x11 , 0x7F ) ; /* Unlock CR0~7 */ 2365dfe64dd3Smacallan 2366dfe64dd3Smacallan PDEBUG(ErrorF("XGI_UpdateXG21CRTC()...1\n")); 2367dfe64dd3Smacallan 2368dfe64dd3Smacallan if ( ModeNo <= 0x13 ) 2369dfe64dd3Smacallan { 2370dfe64dd3Smacallan for( i = 0 ; i < 12 ; i++ ) 2371dfe64dd3Smacallan { 2372dfe64dd3Smacallan if ( ModeNo == pVBInfo->UpdateCRT1[ i ].ModeID ) 2373dfe64dd3Smacallan index = i ; 2374dfe64dd3Smacallan } 2375dfe64dd3Smacallan } 2376dfe64dd3Smacallan else 2377dfe64dd3Smacallan { 2378dfe64dd3Smacallan if ( ModeNo == 0x2E && ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC == RES640x480x60 ) ) 2379dfe64dd3Smacallan index = 12 ; 2380dfe64dd3Smacallan else if ( ModeNo == 0x2E && ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC == RES640x480x72 ) ) 2381dfe64dd3Smacallan index = 13 ; 2382dfe64dd3Smacallan else if ( ModeNo == 0x2F ) 2383dfe64dd3Smacallan index = 14 ; 2384dfe64dd3Smacallan else if ( ModeNo == 0x50 ) 2385dfe64dd3Smacallan index = 15 ; 2386dfe64dd3Smacallan else if ( ModeNo == 0x59 ) 2387dfe64dd3Smacallan index = 16 ; 2388dfe64dd3Smacallan } 2389dfe64dd3Smacallan 2390dfe64dd3Smacallan PDEBUG(ErrorF("XGI_UpdateXG21CRTC()...2\n")); 2391dfe64dd3Smacallan 2392dfe64dd3Smacallan if( index != -1 ) 2393dfe64dd3Smacallan { 2394dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x02 , pVBInfo->UpdateCRT1[ index ].CR02 ) ; 2395dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x03 , pVBInfo->UpdateCRT1[ index ].CR03 ) ; 2396dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x15 , pVBInfo->UpdateCRT1[ index ].CR15 ) ; 2397dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x16 , pVBInfo->UpdateCRT1[ index ].CR16 ) ; 2398dfe64dd3Smacallan } 2399dfe64dd3Smacallan 2400dfe64dd3Smacallan PDEBUG(ErrorF("XGI_UpdateXG21CRTC()...End\n")); 2401dfe64dd3Smacallan} 2402dfe64dd3Smacallan 2403dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2404dfe64dd3Smacallan/* Function : XGI_SetCRT1DE */ 2405dfe64dd3Smacallan/* Input : */ 2406dfe64dd3Smacallan/* Output : */ 2407dfe64dd3Smacallan/* Description : */ 2408dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2409dfe64dd3Smacallanvoid 2410dfe64dd3SmacallanXGI_SetCRT1DE(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, 2411dfe64dd3Smacallan USHORT ModeIdIndex, USHORT RefreshRateTableIndex, 2412dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 2413dfe64dd3Smacallan{ 2414dfe64dd3Smacallan USHORT tempax, tempbx, tempcx, temp, modeflag; 2415dfe64dd3Smacallan UCHAR data; 2416dfe64dd3Smacallan const USHORT resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo); 2417dfe64dd3Smacallan 2418dfe64dd3Smacallan 2419dfe64dd3Smacallan if (ModeNo <= 0x13) { 2420dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; 2421dfe64dd3Smacallan tempax = pVBInfo->StResInfo[resindex].HTotal; 2422dfe64dd3Smacallan tempbx = pVBInfo->StResInfo[resindex].VTotal; 2423dfe64dd3Smacallan } 2424dfe64dd3Smacallan else { 2425dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 2426dfe64dd3Smacallan tempax = pVBInfo->ModeResInfo[resindex].HTotal; 2427dfe64dd3Smacallan tempbx = pVBInfo->ModeResInfo[resindex].VTotal; 2428dfe64dd3Smacallan } 2429dfe64dd3Smacallan 2430dfe64dd3Smacallan if (modeflag & HalfDCLK) 2431dfe64dd3Smacallan tempax = tempax >> 1; 2432dfe64dd3Smacallan 2433dfe64dd3Smacallan if (ModeNo > 0x13) { 2434dfe64dd3Smacallan if (modeflag & HalfDCLK) 2435dfe64dd3Smacallan tempax = tempax << 1; 2436dfe64dd3Smacallan 2437dfe64dd3Smacallan temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag; 2438dfe64dd3Smacallan 2439dfe64dd3Smacallan if (temp & InterlaceMode) 2440dfe64dd3Smacallan tempbx = tempbx >> 1; 2441dfe64dd3Smacallan 2442dfe64dd3Smacallan if (modeflag & DoubleScanMode) 2443dfe64dd3Smacallan tempbx = tempbx << 1; 2444dfe64dd3Smacallan } 2445dfe64dd3Smacallan 2446dfe64dd3Smacallan tempcx = 8; 2447dfe64dd3Smacallan 2448dfe64dd3Smacallan /* if ( !( modeflag & Charx8Dot ) ) */ 2449dfe64dd3Smacallan /* tempcx = 9 ; */ 2450dfe64dd3Smacallan 2451dfe64dd3Smacallan tempax /= tempcx; 2452dfe64dd3Smacallan tempax -= 1; 2453dfe64dd3Smacallan tempbx -= 1; 2454dfe64dd3Smacallan tempcx = tempax; 2455dfe64dd3Smacallan temp = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11); 2456dfe64dd3Smacallan data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11); 2457dfe64dd3Smacallan data &= 0x7F; 2458dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */ 2459dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x01, (USHORT) (tempcx & 0xff)); 2460dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x0b, ~0x0c, 2461dfe64dd3Smacallan (USHORT) ((tempcx & 0x0ff00) >> 10)); 2462dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x12, (USHORT) (tempbx & 0xff)); 2463dfe64dd3Smacallan tempax = 0; 2464dfe64dd3Smacallan tempbx = tempbx >> 8; 2465dfe64dd3Smacallan 2466dfe64dd3Smacallan if (tempbx & 0x01) 2467dfe64dd3Smacallan tempax |= 0x02; 2468dfe64dd3Smacallan 2469dfe64dd3Smacallan if (tempbx & 0x02) 2470dfe64dd3Smacallan tempax |= 0x40; 2471dfe64dd3Smacallan 2472dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x07, ~0x42, tempax); 2473dfe64dd3Smacallan data = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x07); 2474dfe64dd3Smacallan data &= 0xFF; 2475dfe64dd3Smacallan tempax = 0; 2476dfe64dd3Smacallan 2477dfe64dd3Smacallan if (tempbx & 0x04) 2478dfe64dd3Smacallan tempax |= 0x02; 2479dfe64dd3Smacallan 2480dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x0a, ~0x02, tempax); 2481dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, temp); 2482dfe64dd3Smacallan} 2483dfe64dd3Smacallan 2484dfe64dd3Smacallan 2485dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2486dfe64dd3Smacallan/* Function : XGI_GetResInfo */ 2487dfe64dd3Smacallan/* Input : */ 2488dfe64dd3Smacallan/* Output : */ 2489dfe64dd3Smacallan/* Description : */ 2490dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2491dfe64dd3SmacallanUSHORT 2492dfe64dd3SmacallanXGI_GetResInfo(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 2493dfe64dd3Smacallan{ 2494dfe64dd3Smacallan return (ModeNo <= 0x13) 2495dfe64dd3Smacallan ? pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo 2496dfe64dd3Smacallan : pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; 2497dfe64dd3Smacallan} 2498dfe64dd3Smacallan 2499dfe64dd3Smacallan 2500dfe64dd3Smacallanstatic void 2501dfe64dd3Smacallanget_mode_xres_yres(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo, 2502dfe64dd3Smacallan unsigned *width, unsigned *height) 2503dfe64dd3Smacallan{ 2504dfe64dd3Smacallan const USHORT resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo); 2505dfe64dd3Smacallan unsigned xres; 2506dfe64dd3Smacallan unsigned yres; 2507dfe64dd3Smacallan 2508dfe64dd3Smacallan 2509dfe64dd3Smacallan if (ModeNo <= 0x13) { 2510dfe64dd3Smacallan xres = pVBInfo->StResInfo[resindex].HTotal; 2511dfe64dd3Smacallan yres = pVBInfo->StResInfo[resindex].VTotal; 2512dfe64dd3Smacallan } 2513dfe64dd3Smacallan else { 2514dfe64dd3Smacallan const unsigned modeflag = 2515dfe64dd3Smacallan pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 2516dfe64dd3Smacallan 2517dfe64dd3Smacallan xres = pVBInfo->ModeResInfo[resindex].HTotal; 2518dfe64dd3Smacallan yres = pVBInfo->ModeResInfo[resindex].VTotal; 2519dfe64dd3Smacallan 2520dfe64dd3Smacallan if (modeflag & HalfDCLK) 2521dfe64dd3Smacallan xres *= 2; 2522dfe64dd3Smacallan 2523dfe64dd3Smacallan if (modeflag & DoubleScanMode) 2524dfe64dd3Smacallan yres *= 2; 2525dfe64dd3Smacallan } 2526dfe64dd3Smacallan 2527dfe64dd3Smacallan *width = xres; 2528dfe64dd3Smacallan *height = yres; 2529dfe64dd3Smacallan} 2530dfe64dd3Smacallan 2531dfe64dd3Smacallan 2532dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2533dfe64dd3Smacallan/* Function : XGI_SetCRT1Offset */ 2534dfe64dd3Smacallan/* Input : */ 2535dfe64dd3Smacallan/* Output : */ 2536dfe64dd3Smacallan/* Description : */ 2537dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2538dfe64dd3Smacallanvoid 2539dfe64dd3SmacallanXGI_SetCRT1Offset(USHORT ModeNo, USHORT ModeIdIndex, 2540dfe64dd3Smacallan USHORT RefreshRateTableIndex, 2541dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 2542dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 2543dfe64dd3Smacallan{ 2544dfe64dd3Smacallan USHORT temp, ah, al, temp2, i, DisplayUnit; 2545dfe64dd3Smacallan 2546dfe64dd3Smacallan /* GetOffset */ 2547dfe64dd3Smacallan temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo; 2548dfe64dd3Smacallan temp = temp >> 8; 2549dfe64dd3Smacallan temp = pVBInfo->ScreenOffset[temp]; 2550dfe64dd3Smacallan 2551dfe64dd3Smacallan temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag; 2552dfe64dd3Smacallan temp2 &= InterlaceMode; 2553dfe64dd3Smacallan 2554dfe64dd3Smacallan if (temp2) 2555dfe64dd3Smacallan temp = temp << 1; 2556dfe64dd3Smacallan 2557dfe64dd3Smacallan temp2 = pVBInfo->ModeType - ModeEGA; 2558dfe64dd3Smacallan 2559dfe64dd3Smacallan switch (temp2) { 2560dfe64dd3Smacallan case 0: 2561dfe64dd3Smacallan temp2 = 1; 2562dfe64dd3Smacallan break; 2563dfe64dd3Smacallan case 1: 2564dfe64dd3Smacallan temp2 = 2; 2565dfe64dd3Smacallan break; 2566dfe64dd3Smacallan case 2: 2567dfe64dd3Smacallan temp2 = 4; 2568dfe64dd3Smacallan break; 2569dfe64dd3Smacallan case 3: 2570dfe64dd3Smacallan temp2 = 4; 2571dfe64dd3Smacallan break; 2572dfe64dd3Smacallan case 4: 2573dfe64dd3Smacallan temp2 = 6; 2574dfe64dd3Smacallan break; 2575dfe64dd3Smacallan case 5: 2576dfe64dd3Smacallan temp2 = 8; 2577dfe64dd3Smacallan break; 2578dfe64dd3Smacallan default: 2579dfe64dd3Smacallan break; 2580dfe64dd3Smacallan } 2581dfe64dd3Smacallan 2582dfe64dd3Smacallan if ((ModeNo >= 0x26) && (ModeNo <= 0x28)) 2583dfe64dd3Smacallan temp = temp * temp2 + temp2 / 2; 2584dfe64dd3Smacallan else 2585dfe64dd3Smacallan temp *= temp2; 2586dfe64dd3Smacallan 2587dfe64dd3Smacallan /* SetOffset */ 2588dfe64dd3Smacallan DisplayUnit = temp; 2589dfe64dd3Smacallan temp2 = temp; 2590dfe64dd3Smacallan temp = temp >> 8; /* ah */ 2591dfe64dd3Smacallan temp &= 0x0F; 2592dfe64dd3Smacallan i = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0E); 2593dfe64dd3Smacallan i &= 0xF0; 2594dfe64dd3Smacallan i |= temp; 2595dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0E, i); 2596dfe64dd3Smacallan 2597dfe64dd3Smacallan temp = (UCHAR) temp2; 2598dfe64dd3Smacallan temp &= 0xFF; /* al */ 2599dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x13, temp); 2600dfe64dd3Smacallan 2601dfe64dd3Smacallan /* SetDisplayUnit */ 2602dfe64dd3Smacallan temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag; 2603dfe64dd3Smacallan temp2 &= InterlaceMode; 2604dfe64dd3Smacallan if (temp2) 2605dfe64dd3Smacallan DisplayUnit >>= 1; 2606dfe64dd3Smacallan 2607dfe64dd3Smacallan DisplayUnit = DisplayUnit << 5; 2608dfe64dd3Smacallan ah = (DisplayUnit & 0xff00) >> 8; 2609dfe64dd3Smacallan al = DisplayUnit & 0x00ff; 2610dfe64dd3Smacallan if (al == 0) 2611dfe64dd3Smacallan ah += 1; 2612dfe64dd3Smacallan else 2613dfe64dd3Smacallan ah += 2; 2614dfe64dd3Smacallan 2615dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 2616dfe64dd3Smacallan if (HwDeviceExtension->jChipType >= XG20) 2617dfe64dd3Smacallan if ((ModeNo == 0x4A) | (ModeNo == 0x49)) 2618dfe64dd3Smacallan ah -= 1; 2619dfe64dd3Smacallan 2620dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x10, ah); 2621dfe64dd3Smacallan} 2622dfe64dd3Smacallan 2623dfe64dd3Smacallan 2624dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2625dfe64dd3Smacallan/* Function : XGI_SetCRT1VCLK */ 2626dfe64dd3Smacallan/* Input : */ 2627dfe64dd3Smacallan/* Output : */ 2628dfe64dd3Smacallan/* Description : */ 2629dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2630dfe64dd3Smacallanvoid 2631dfe64dd3SmacallanXGI_SetCRT1VCLK(USHORT ModeNo, USHORT ModeIdIndex, 2632dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 2633dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 2634dfe64dd3Smacallan{ 2635dfe64dd3Smacallan unsigned index; 2636dfe64dd3Smacallan unsigned clka; 2637dfe64dd3Smacallan unsigned clkb; 2638dfe64dd3Smacallan unsigned data; /* Jong 10/04/2007; merge code */ 2639dfe64dd3Smacallan 2640dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 2641dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 1 ) 2642dfe64dd3Smacallan { 2643dfe64dd3Smacallan index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ; 2644dfe64dd3Smacallan clka = pVBInfo->VCLKData[ index ].SR2B; 2645dfe64dd3Smacallan clkb = pVBInfo->VCLKData[ index ].SR2C; 2646dfe64dd3Smacallan } 2647dfe64dd3Smacallan else if ((pVBInfo->VBType & VB_XGI301BLV302BLV) 2648dfe64dd3Smacallan && (pVBInfo->VBInfo & SetCRT2ToLCDA)) { 2649dfe64dd3Smacallan index = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex, RefreshRateTableIndex, 2650dfe64dd3Smacallan pVBInfo); 2651dfe64dd3Smacallan 2652dfe64dd3Smacallan clka = pVBInfo->VBVCLKData[index].Part4_A; 2653dfe64dd3Smacallan clkb = pVBInfo->VBVCLKData[index].Part4_B; 2654dfe64dd3Smacallan } 2655dfe64dd3Smacallan else { 2656dfe64dd3Smacallan index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK; 2657dfe64dd3Smacallan 2658dfe64dd3Smacallan clka = pVBInfo->VCLKData[index].SR2B; 2659dfe64dd3Smacallan clkb = pVBInfo->VCLKData[index].SR2C; 2660dfe64dd3Smacallan } 2661dfe64dd3Smacallan 2662dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3c4, 0x31, 0xCF); 2663dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, clka); 2664dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, clkb); 2665dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2D, 0x01); 2666dfe64dd3Smacallan 2667dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 2668dfe64dd3Smacallan if ((HwDeviceExtension->jChipType >= XG20) 2669dfe64dd3Smacallan && (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag & HalfDCLK)) { 2670dfe64dd3Smacallan UCHAR data; 2671dfe64dd3Smacallan 2672dfe64dd3Smacallan /* FIXME: Does this actually serve any purpose? This register is 2673dfe64dd3Smacallan * FIXME: already written above. 2674dfe64dd3Smacallan */ 2675dfe64dd3Smacallan data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B); 2676dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, data); 2677dfe64dd3Smacallan 2678dfe64dd3Smacallan /* FIXME: The logic here seems wrong. It looks like its possible 2679dfe64dd3Smacallan * FIXME: for the (data << 1) to cause a bit to creep into the index 2680dfe64dd3Smacallan * FIXME: part. THere's no documentation for this register, so I have 2681dfe64dd3Smacallan * FIXME: no way of knowing. :( 2682dfe64dd3Smacallan */ 2683dfe64dd3Smacallan data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C); 2684dfe64dd3Smacallan index = data; 2685dfe64dd3Smacallan index &= 0xE0; 2686dfe64dd3Smacallan data &= 0x1F; 2687dfe64dd3Smacallan data = data << 1; 2688dfe64dd3Smacallan data += 1; 2689dfe64dd3Smacallan data |= index; 2690dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, data); 2691dfe64dd3Smacallan } 2692dfe64dd3Smacallan} 2693dfe64dd3Smacallan 2694dfe64dd3Smacallan 2695dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2696dfe64dd3Smacallan/* Function : XGI_SetCRT1FIFO */ 2697dfe64dd3Smacallan/* Input : */ 2698dfe64dd3Smacallan/* Output : */ 2699dfe64dd3Smacallan/* Description : */ 2700dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2701dfe64dd3Smacallanvoid 2702dfe64dd3SmacallanXGI_SetCRT1FIFO(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension, 2703dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 2704dfe64dd3Smacallan{ 2705dfe64dd3Smacallan USHORT data; 2706dfe64dd3Smacallan 2707dfe64dd3Smacallan data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3D); 2708dfe64dd3Smacallan data &= 0xfe; 2709dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */ 2710dfe64dd3Smacallan 2711dfe64dd3Smacallan if (ModeNo > 0x13) { 2712dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x08, 0x34); 2713dfe64dd3Smacallan data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x09); 2714dfe64dd3Smacallan 2715dfe64dd3Smacallan /* Jong 02/06/2009; performance; add 10 for WinBench 99 */ 2716dfe64dd3Smacallan /* Jong 02/13/2009; might cause threshold noise of display; not sure */ 2717dfe64dd3Smacallan /* data &= 0xF0; 2718dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x09, data); */ 2719dfe64dd3Smacallan data &= 0xC0 ; 2720dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4 , 0x09 , data | 0x30) ; 2721dfe64dd3Smacallan 2722dfe64dd3Smacallan data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3D); 2723dfe64dd3Smacallan data |= 0x01; 2724dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3D, data); 2725dfe64dd3Smacallan } 2726dfe64dd3Smacallan else { 2727dfe64dd3Smacallan if (HwDeviceExtension->jChipType == XG27) 2728dfe64dd3Smacallan { 2729dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x08 , 0x0E ) ; 2730dfe64dd3Smacallan data = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x09 ) ; 2731dfe64dd3Smacallan data &= 0xC0 ; 2732dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x09 , data | 0x20 ) ; 2733dfe64dd3Smacallan } 2734dfe64dd3Smacallan else 2735dfe64dd3Smacallan { 2736dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x08, 0xAE); 2737dfe64dd3Smacallan data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x09); 2738dfe64dd3Smacallan data &= 0xF0; 2739dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x09, data); 2740dfe64dd3Smacallan } 2741dfe64dd3Smacallan } 2742dfe64dd3Smacallan 2743dfe64dd3Smacallan /* Jong 10/17/2007; merge code */ 2744dfe64dd3Smacallan if (HwDeviceExtension->jChipType == XG21) 2745dfe64dd3Smacallan { 2746dfe64dd3Smacallan XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */ 2747dfe64dd3Smacallan } 2748dfe64dd3Smacallan 2749dfe64dd3Smacallan} 2750dfe64dd3Smacallan 2751dfe64dd3Smacallan 2752dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2753dfe64dd3Smacallan/* Function : XGI_SetCRT1ModeRegs */ 2754dfe64dd3Smacallan/* Input : */ 2755dfe64dd3Smacallan/* Output : */ 2756dfe64dd3Smacallan/* Description : */ 2757dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2758dfe64dd3Smacallanvoid 2759dfe64dd3SmacallanXGI_SetCRT1ModeRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension, 2760dfe64dd3Smacallan USHORT ModeNo, USHORT ModeIdIndex, 2761dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 2762dfe64dd3Smacallan{ 2763dfe64dd3Smacallan USHORT data, data2, data3, infoflag = 0, modeflag, resindex, xres; 2764dfe64dd3Smacallan 2765dfe64dd3Smacallan if (ModeNo > 0x13) { 2766dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 2767dfe64dd3Smacallan infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag; 2768dfe64dd3Smacallan } 2769dfe64dd3Smacallan else 2770dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ModeFlag */ 2771dfe64dd3Smacallan 2772dfe64dd3Smacallan if (XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x31) & 0x01) 2773dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x1F, 0x3F, 0x00); 2774dfe64dd3Smacallan 2775dfe64dd3Smacallan if (ModeNo > 0x13) 2776dfe64dd3Smacallan data = infoflag; 2777dfe64dd3Smacallan else 2778dfe64dd3Smacallan data = 0; 2779dfe64dd3Smacallan 2780dfe64dd3Smacallan data2 = 0; 2781dfe64dd3Smacallan 2782dfe64dd3Smacallan if (ModeNo > 0x13) { 2783dfe64dd3Smacallan if (pVBInfo->ModeType > 0x02) { 2784dfe64dd3Smacallan data2 |= 0x02; 2785dfe64dd3Smacallan data3 = pVBInfo->ModeType - ModeVGA; 2786dfe64dd3Smacallan data3 = data3 << 2; 2787dfe64dd3Smacallan data2 |= data3; 2788dfe64dd3Smacallan } 2789dfe64dd3Smacallan } 2790dfe64dd3Smacallan 2791dfe64dd3Smacallan data &= InterlaceMode; 2792dfe64dd3Smacallan 2793dfe64dd3Smacallan if (data) 2794dfe64dd3Smacallan data2 |= 0x20; 2795dfe64dd3Smacallan 2796dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x06, ~0x3F, data2); 2797dfe64dd3Smacallan /* XGI_SetReg((XGIIOADDRESS)pVBInfo->P3c4,0x06,data2); */ 2798dfe64dd3Smacallan resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo); 2799dfe64dd3Smacallan if (ModeNo <= 0x13) 2800dfe64dd3Smacallan xres = pVBInfo->StResInfo[resindex].HTotal; 2801dfe64dd3Smacallan else 2802dfe64dd3Smacallan xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */ 2803dfe64dd3Smacallan 2804dfe64dd3Smacallan data = 0x0000; 2805dfe64dd3Smacallan if (infoflag & InterlaceMode) { 2806dfe64dd3Smacallan if (xres == 1024) 2807dfe64dd3Smacallan data = 0x0035; 2808dfe64dd3Smacallan else if (xres == 1280) 2809dfe64dd3Smacallan data = 0x0048; 2810dfe64dd3Smacallan } 2811dfe64dd3Smacallan 2812dfe64dd3Smacallan data2 = data & 0x00FF; 2813dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x19, 0xFF, data2); 2814dfe64dd3Smacallan data2 = (data & 0xFF00) >> 8; 2815dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x19, 0xFC, data2); 2816dfe64dd3Smacallan 2817dfe64dd3Smacallan if (modeflag & HalfDCLK) 2818dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x01, 0xF7, 0x08); 2819dfe64dd3Smacallan 2820dfe64dd3Smacallan data2 = 0; 2821dfe64dd3Smacallan 2822dfe64dd3Smacallan if (modeflag & LineCompareOff) 2823dfe64dd3Smacallan data2 |= 0x08; 2824dfe64dd3Smacallan 2825dfe64dd3Smacallan if (ModeNo > 0x13) { 2826dfe64dd3Smacallan if (pVBInfo->ModeType == ModeEGA) 2827dfe64dd3Smacallan data2 |= 0x40; 2828dfe64dd3Smacallan } 2829dfe64dd3Smacallan 2830dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x0F, ~0x48, data2); 2831dfe64dd3Smacallan data = 0x60; 2832dfe64dd3Smacallan if (pVBInfo->ModeType != ModeText) { 2833dfe64dd3Smacallan data = data ^ 0x60; 2834dfe64dd3Smacallan if (pVBInfo->ModeType != ModeEGA) { 2835dfe64dd3Smacallan data = data ^ 0xA0; 2836dfe64dd3Smacallan } 2837dfe64dd3Smacallan } 2838dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x21, 0x1F, data); 2839dfe64dd3Smacallan 2840dfe64dd3Smacallan XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex, 2841dfe64dd3Smacallan pVBInfo); 2842dfe64dd3Smacallan 2843dfe64dd3Smacallan data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x31); 2844dfe64dd3Smacallan 2845dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 2846dfe64dd3Smacallan if (HwDeviceExtension->jChipType == XG27 ) 2847dfe64dd3Smacallan { 2848dfe64dd3Smacallan if ( data & 0x40 ) 2849dfe64dd3Smacallan data = 0x2c ; 2850dfe64dd3Smacallan else 2851dfe64dd3Smacallan data = 0x6c ; 2852dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x52 , data ) ; 2853dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x51 , 0x10 ) ; 2854dfe64dd3Smacallan } 2855dfe64dd3Smacallan else if (HwDeviceExtension->jChipType >= XG20) 2856dfe64dd3Smacallan { 2857dfe64dd3Smacallan if (data & 0x40) 2858dfe64dd3Smacallan data = 0x33; 2859dfe64dd3Smacallan else 2860dfe64dd3Smacallan data = 0x73; 2861dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x52, data); 2862dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x51, 0x02); 2863dfe64dd3Smacallan } 2864dfe64dd3Smacallan else { 2865dfe64dd3Smacallan if (data & 0x40) 2866dfe64dd3Smacallan data = 0x2c; 2867dfe64dd3Smacallan else 2868dfe64dd3Smacallan data = 0x6c; 2869dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x52, data); 2870dfe64dd3Smacallan } 2871dfe64dd3Smacallan 2872dfe64dd3Smacallan} 2873dfe64dd3Smacallan 2874dfe64dd3Smacallan 2875dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2876dfe64dd3Smacallan/* Function : XGI_SetVCLKState */ 2877dfe64dd3Smacallan/* Input : */ 2878dfe64dd3Smacallan/* Output : */ 2879dfe64dd3Smacallan/* Description : */ 2880dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2881dfe64dd3Smacallanvoid 2882dfe64dd3SmacallanXGI_SetVCLKState(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, 2883dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 2884dfe64dd3Smacallan{ 2885dfe64dd3Smacallan USHORT data, data2 = 0; 2886dfe64dd3Smacallan SHORT VCLK; 2887dfe64dd3Smacallan 2888dfe64dd3Smacallan UCHAR index; 2889dfe64dd3Smacallan 2890dfe64dd3Smacallan if (ModeNo <= 0x13) 2891dfe64dd3Smacallan VCLK = 0; 2892dfe64dd3Smacallan else { 2893dfe64dd3Smacallan index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK; 2894dfe64dd3Smacallan index &= IndexMask; 2895dfe64dd3Smacallan VCLK = pVBInfo->VCLKData[index].CLOCK; 2896dfe64dd3Smacallan } 2897dfe64dd3Smacallan 2898dfe64dd3Smacallan data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32); 2899dfe64dd3Smacallan data &= 0xf3; 2900dfe64dd3Smacallan if (VCLK >= 200) 2901dfe64dd3Smacallan data |= 0x0c; /* VCLK > 200 */ 2902dfe64dd3Smacallan 2903dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 2904dfe64dd3Smacallan if (HwDeviceExtension->jChipType >= XG20) 2905dfe64dd3Smacallan data &= ~0x04; /* 2 pixel mode */ 2906dfe64dd3Smacallan 2907dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32, data); 2908dfe64dd3Smacallan 2909dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 2910dfe64dd3Smacallan if (HwDeviceExtension->jChipType < XG20) { 2911dfe64dd3Smacallan data = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x1F); 2912dfe64dd3Smacallan data &= 0xE7; 2913dfe64dd3Smacallan if (VCLK < 200) 2914dfe64dd3Smacallan data |= 0x10; 2915dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x1F, data); 2916dfe64dd3Smacallan } 2917dfe64dd3Smacallan 2918dfe64dd3Smacallan /* Jong for Adavantech LCD ripple issue 2919dfe64dd3Smacallan if ((VCLK >= 0) && (VCLK < 135)) 2920dfe64dd3Smacallan data2 = 0x03; 2921dfe64dd3Smacallan else if ((VCLK >= 135) && (VCLK < 160)) 2922dfe64dd3Smacallan data2 = 0x02; 2923dfe64dd3Smacallan else if ((VCLK >= 160) && (VCLK < 260)) 2924dfe64dd3Smacallan data2 = 0x01; 2925dfe64dd3Smacallan else if (VCLK > 260) 2926dfe64dd3Smacallan data2 = 0x00; */ 2927dfe64dd3Smacallan 2928dfe64dd3Smacallan data2 = 0x00 ; 2929dfe64dd3Smacallan 2930dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x07, 0xFC, data2); 2931dfe64dd3Smacallan 2932dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 2933dfe64dd3Smacallan if (HwDeviceExtension->jChipType >= XG27 ) 2934dfe64dd3Smacallan { 2935dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x40 , 0xFC , data2&0x03 ) ; 2936dfe64dd3Smacallan } 2937dfe64dd3Smacallan 2938dfe64dd3Smacallan} 2939dfe64dd3Smacallan 2940dfe64dd3Smacallan 2941dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2942dfe64dd3Smacallan/* Function : XGI_LoadDAC */ 2943dfe64dd3Smacallan/* Input : */ 2944dfe64dd3Smacallan/* Output : */ 2945dfe64dd3Smacallan/* Description : */ 2946dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 2947dfe64dd3Smacallanvoid 2948dfe64dd3SmacallanXGI_LoadDAC(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 2949dfe64dd3Smacallan{ 2950dfe64dd3Smacallan USHORT data, data2, time, i, j, k, m, n, o, si, di, bx, dl, al, ah, dh; 2951dfe64dd3Smacallan const uint8_t *table = NULL; 2952dfe64dd3Smacallan 2953dfe64dd3Smacallan if (ModeNo <= 0x13) 2954dfe64dd3Smacallan data = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; 2955dfe64dd3Smacallan else 2956dfe64dd3Smacallan data = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 2957dfe64dd3Smacallan 2958dfe64dd3Smacallan data &= DACInfoFlag; 2959dfe64dd3Smacallan time = 64; 2960dfe64dd3Smacallan 2961dfe64dd3Smacallan if (data == 0x00) 2962dfe64dd3Smacallan table = XGI_MDA_DAC; 2963dfe64dd3Smacallan else if (data == 0x08) 2964dfe64dd3Smacallan table = XGI_CGA_DAC; 2965dfe64dd3Smacallan else if (data == 0x10) 2966dfe64dd3Smacallan table = XGI_EGA_DAC; 2967dfe64dd3Smacallan else if (data == 0x18) { 2968dfe64dd3Smacallan time = 256; 2969dfe64dd3Smacallan table = XGI_VGA_DAC; 2970dfe64dd3Smacallan } 2971dfe64dd3Smacallan 2972dfe64dd3Smacallan if (time == 256) 2973dfe64dd3Smacallan j = 16; 2974dfe64dd3Smacallan else 2975dfe64dd3Smacallan j = time; 2976dfe64dd3Smacallan 2977dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c6, 0xFF); 2978dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c8, 0x00); 2979dfe64dd3Smacallan 2980dfe64dd3Smacallan for (i = 0; i < j; i++) { 2981dfe64dd3Smacallan data = table[i]; 2982dfe64dd3Smacallan 2983dfe64dd3Smacallan for (k = 0; k < 3; k++) { 2984dfe64dd3Smacallan data2 = 0; 2985dfe64dd3Smacallan 2986dfe64dd3Smacallan if (data & 0x01) 2987dfe64dd3Smacallan data2 = 0x2A; 2988dfe64dd3Smacallan 2989dfe64dd3Smacallan if (data & 0x02) 2990dfe64dd3Smacallan data2 += 0x15; 2991dfe64dd3Smacallan 2992dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c9, data2); 2993dfe64dd3Smacallan data = data >> 2; 2994dfe64dd3Smacallan } 2995dfe64dd3Smacallan } 2996dfe64dd3Smacallan 2997dfe64dd3Smacallan if (time == 256) { 2998dfe64dd3Smacallan for (i = 16; i < 32; i++) { 2999dfe64dd3Smacallan data = table[i]; 3000dfe64dd3Smacallan 3001dfe64dd3Smacallan for (k = 0; k < 3; k++) 3002dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c9, data); 3003dfe64dd3Smacallan } 3004dfe64dd3Smacallan 3005dfe64dd3Smacallan si = 32; 3006dfe64dd3Smacallan 3007dfe64dd3Smacallan for (m = 0; m < 9; m++) { 3008dfe64dd3Smacallan di = si; 3009dfe64dd3Smacallan bx = si + 0x04; 3010dfe64dd3Smacallan dl = 0; 3011dfe64dd3Smacallan 3012dfe64dd3Smacallan for (n = 0; n < 3; n++) { 3013dfe64dd3Smacallan for (o = 0; o < 5; o++) { 3014dfe64dd3Smacallan dh = table[si]; 3015dfe64dd3Smacallan ah = table[di]; 3016dfe64dd3Smacallan al = table[bx]; 3017dfe64dd3Smacallan si++; 3018dfe64dd3Smacallan XGI_WriteDAC((XGIIOADDRESS) pVBInfo->P3c9, 0, dl, 3019dfe64dd3Smacallan ah, al, dh); 3020dfe64dd3Smacallan } 3021dfe64dd3Smacallan 3022dfe64dd3Smacallan si -= 2; 3023dfe64dd3Smacallan 3024dfe64dd3Smacallan for (o = 0; o < 3; o++) { 3025dfe64dd3Smacallan dh = table[bx]; 3026dfe64dd3Smacallan ah = table[di]; 3027dfe64dd3Smacallan al = table[si]; 3028dfe64dd3Smacallan si--; 3029dfe64dd3Smacallan XGI_WriteDAC((XGIIOADDRESS) pVBInfo->P3c9, 0, dl, 3030dfe64dd3Smacallan ah, al, dh); 3031dfe64dd3Smacallan } 3032dfe64dd3Smacallan 3033dfe64dd3Smacallan dl++; 3034dfe64dd3Smacallan } 3035dfe64dd3Smacallan 3036dfe64dd3Smacallan si += 5; 3037dfe64dd3Smacallan } 3038dfe64dd3Smacallan } 3039dfe64dd3Smacallan} 3040dfe64dd3Smacallan 3041dfe64dd3Smacallan 3042dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3043dfe64dd3Smacallan/* Function : XGI_WriteDAC */ 3044dfe64dd3Smacallan/* Input : */ 3045dfe64dd3Smacallan/* Output : */ 3046dfe64dd3Smacallan/* Description : */ 3047dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3048dfe64dd3Smacallanvoid 3049dfe64dd3SmacallanXGI_WriteDAC(XGIIOADDRESS dac_data, unsigned shift, unsigned ordering, 3050dfe64dd3Smacallan uint8_t ah, uint8_t al, uint8_t dh) 3051dfe64dd3Smacallan{ 3052dfe64dd3Smacallan USHORT temp, bh, bl; 3053dfe64dd3Smacallan 3054dfe64dd3Smacallan if (shift) { 3055dfe64dd3Smacallan ah <<= 2; 3056dfe64dd3Smacallan al <<= 2; 3057dfe64dd3Smacallan dh <<= 2; 3058dfe64dd3Smacallan } 3059dfe64dd3Smacallan 3060dfe64dd3Smacallan bh = ah; 3061dfe64dd3Smacallan bl = al; 3062dfe64dd3Smacallan 3063dfe64dd3Smacallan if (ordering != 0) { 3064dfe64dd3Smacallan temp = bh; 3065dfe64dd3Smacallan bh = dh; 3066dfe64dd3Smacallan dh = temp; 3067dfe64dd3Smacallan if (ordering == 1) { 3068dfe64dd3Smacallan temp = bl; 3069dfe64dd3Smacallan bl = dh; 3070dfe64dd3Smacallan dh = temp; 3071dfe64dd3Smacallan } 3072dfe64dd3Smacallan else { 3073dfe64dd3Smacallan temp = bl; 3074dfe64dd3Smacallan bl = bh; 3075dfe64dd3Smacallan bh = temp; 3076dfe64dd3Smacallan } 3077dfe64dd3Smacallan } 3078dfe64dd3Smacallan XGI_SetRegByte(dac_data, dh); 3079dfe64dd3Smacallan XGI_SetRegByte(dac_data, bh); 3080dfe64dd3Smacallan XGI_SetRegByte(dac_data, bl); 3081dfe64dd3Smacallan} 3082dfe64dd3Smacallan 3083dfe64dd3Smacallan 3084dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3085dfe64dd3Smacallan/* Function : XGI_SetLCDAGroup */ 3086dfe64dd3Smacallan/* Input : */ 3087dfe64dd3Smacallan/* Output : */ 3088dfe64dd3Smacallan/* Description : */ 3089dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3090dfe64dd3Smacallanvoid 3091dfe64dd3SmacallanXGI_SetLCDAGroup(USHORT ModeNo, USHORT ModeIdIndex, 3092dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 3093dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 3094dfe64dd3Smacallan{ 3095dfe64dd3Smacallan USHORT RefreshRateTableIndex; 3096dfe64dd3Smacallan /* USHORT temp ; */ 3097dfe64dd3Smacallan 3098dfe64dd3Smacallan /* pVBInfo->SelectCRT2Rate = 0 ; */ 3099dfe64dd3Smacallan 3100dfe64dd3Smacallan pVBInfo->SetFlag |= ProgrammingCRT2; 3101dfe64dd3Smacallan RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo, ModeIdIndex, pVBInfo); 3102dfe64dd3Smacallan XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo); 3103dfe64dd3Smacallan XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo); 3104dfe64dd3Smacallan XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex, 3105dfe64dd3Smacallan HwDeviceExtension, pVBInfo); 3106dfe64dd3Smacallan XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo); 3107dfe64dd3Smacallan XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo); 3108dfe64dd3Smacallan} 3109dfe64dd3Smacallan 3110dfe64dd3Smacallan 3111dfe64dd3Smacallan/** 3112dfe64dd3Smacallan * Get LVDS resolution information. 3113dfe64dd3Smacallan */ 3114dfe64dd3Smacallanvoid 3115dfe64dd3SmacallanXGI_GetLVDSResInfo(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 3116dfe64dd3Smacallan{ 3117dfe64dd3Smacallan unsigned xres; 3118dfe64dd3Smacallan unsigned yres; 3119dfe64dd3Smacallan 3120dfe64dd3Smacallan 3121dfe64dd3Smacallan get_mode_xres_yres(ModeNo, ModeIdIndex, pVBInfo, &xres, &yres); 3122dfe64dd3Smacallan 3123dfe64dd3Smacallan if (xres == 720) 3124dfe64dd3Smacallan xres = 640; 3125dfe64dd3Smacallan 3126dfe64dd3Smacallan pVBInfo->VGAHDE = xres; 3127dfe64dd3Smacallan pVBInfo->HDE = xres; 3128dfe64dd3Smacallan pVBInfo->VGAVDE = yres; 3129dfe64dd3Smacallan pVBInfo->VDE = yres; 3130dfe64dd3Smacallan} 3131dfe64dd3Smacallan 3132dfe64dd3Smacallan 3133dfe64dd3Smacallanstatic void 3134098ad5bdSmacallanget_HDE_VDE(PVB_DEVICE_INFO pVBInfo, ULONG *HDE, ULONG *VDE) 3135dfe64dd3Smacallan{ 3136dfe64dd3Smacallan switch (pVBInfo->LCDResInfo) { 3137dfe64dd3Smacallan case Panel1024x768: 3138dfe64dd3Smacallan case Panel1024x768x75: 3139dfe64dd3Smacallan *HDE = 1024; 3140dfe64dd3Smacallan *VDE = 768; 3141dfe64dd3Smacallan break; 3142dfe64dd3Smacallan 3143dfe64dd3Smacallan case Panel1280x1024: 3144dfe64dd3Smacallan case Panel1280x1024x75: 3145dfe64dd3Smacallan *HDE = 1280; 3146dfe64dd3Smacallan *VDE = 1024; 3147dfe64dd3Smacallan break; 3148dfe64dd3Smacallan 3149dfe64dd3Smacallan case Panel1400x1050: 3150dfe64dd3Smacallan *HDE = 1400; 3151dfe64dd3Smacallan *VDE = 1050; 3152dfe64dd3Smacallan break; 3153dfe64dd3Smacallan 3154dfe64dd3Smacallan default: 3155dfe64dd3Smacallan *HDE = 1600; 3156dfe64dd3Smacallan *VDE = 1200; 3157dfe64dd3Smacallan break; 3158dfe64dd3Smacallan } 3159dfe64dd3Smacallan} 3160dfe64dd3Smacallan 3161dfe64dd3Smacallan 3162dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3163dfe64dd3Smacallan/* Function : XGI_GetLVDSData */ 3164dfe64dd3Smacallan/* Input : */ 3165dfe64dd3Smacallan/* Output : */ 3166dfe64dd3Smacallan/* Description : */ 3167dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3168dfe64dd3Smacallanvoid 3169dfe64dd3SmacallanXGI_GetLVDSData(USHORT ModeNo, USHORT ModeIdIndex, 3170dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 3171dfe64dd3Smacallan{ 3172dfe64dd3Smacallan USHORT tempbx; 3173dfe64dd3Smacallan XGI330_LVDSDataStruct *LCDPtr = NULL; 3174dfe64dd3Smacallan 3175dfe64dd3Smacallan tempbx = 2; 3176dfe64dd3Smacallan 3177dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { 3178dfe64dd3Smacallan LCDPtr = 3179dfe64dd3Smacallan (XGI330_LVDSDataStruct *) XGI_GetLcdPtr(tempbx, ModeNo, 3180dfe64dd3Smacallan ModeIdIndex, 3181dfe64dd3Smacallan RefreshRateTableIndex, 3182dfe64dd3Smacallan pVBInfo); 3183dfe64dd3Smacallan pVBInfo->VGAHT = LCDPtr->VGAHT; 3184dfe64dd3Smacallan pVBInfo->VGAVT = LCDPtr->VGAVT; 3185dfe64dd3Smacallan pVBInfo->HT = LCDPtr->LCDHT; 3186dfe64dd3Smacallan pVBInfo->VT = LCDPtr->LCDVT; 3187dfe64dd3Smacallan } 3188dfe64dd3Smacallan 3189dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { 3190dfe64dd3Smacallan if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding | EnableScalingLCD))) { 3191dfe64dd3Smacallan get_HDE_VDE(pVBInfo, & pVBInfo->HDE, & pVBInfo->VDE); 3192dfe64dd3Smacallan } 3193dfe64dd3Smacallan } 3194dfe64dd3Smacallan} 3195dfe64dd3Smacallan 3196dfe64dd3Smacallan 3197dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3198dfe64dd3Smacallan/* Function : XGI_ModCRT1Regs */ 3199dfe64dd3Smacallan/* Input : */ 3200dfe64dd3Smacallan/* Output : */ 3201dfe64dd3Smacallan/* Description : */ 3202dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3203dfe64dd3Smacallanvoid 3204dfe64dd3SmacallanXGI_ModCRT1Regs(USHORT ModeNo, USHORT ModeIdIndex, 3205dfe64dd3Smacallan USHORT RefreshRateTableIndex, 3206dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 3207dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 3208dfe64dd3Smacallan{ 3209dfe64dd3Smacallan UCHAR index; 3210dfe64dd3Smacallan USHORT tempbx, i; 3211dfe64dd3Smacallan XGI_LVDSCRT1HDataStruct *LCDPtr = NULL; 3212dfe64dd3Smacallan XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL; 3213dfe64dd3Smacallan /* XGI330_CHTVDataStruct *TVPtr = NULL ; */ 3214dfe64dd3Smacallan 3215dfe64dd3Smacallan if (ModeNo <= 0x13) 3216dfe64dd3Smacallan index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC; 3217dfe64dd3Smacallan else 3218dfe64dd3Smacallan index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC; 3219dfe64dd3Smacallan 3220dfe64dd3Smacallan index = index & IndexMask; 3221dfe64dd3Smacallan 3222dfe64dd3Smacallan if ((pVBInfo->IF_DEF_ScaleLCD == 0) 3223dfe64dd3Smacallan || ((pVBInfo->IF_DEF_ScaleLCD == 1) 3224dfe64dd3Smacallan && (!(pVBInfo->LCDInfo & EnableScalingLCD)))) { 3225dfe64dd3Smacallan tempbx = 0; 3226dfe64dd3Smacallan 3227dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { 3228dfe64dd3Smacallan LCDPtr = 3229dfe64dd3Smacallan (XGI_LVDSCRT1HDataStruct *) XGI_GetLcdPtr(tempbx, ModeNo, 3230dfe64dd3Smacallan ModeIdIndex, 3231dfe64dd3Smacallan RefreshRateTableIndex, 3232dfe64dd3Smacallan pVBInfo); 3233dfe64dd3Smacallan 3234dfe64dd3Smacallan for (i = 0; i < 8; i++) 3235dfe64dd3Smacallan pVBInfo->TimingH.data[i] = LCDPtr[0].Reg[i]; 3236dfe64dd3Smacallan } 3237dfe64dd3Smacallan 3238dfe64dd3Smacallan XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension); 3239dfe64dd3Smacallan 3240dfe64dd3Smacallan tempbx = 1; 3241dfe64dd3Smacallan 3242dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { 3243dfe64dd3Smacallan LCDPtr1 = 3244dfe64dd3Smacallan (XGI_LVDSCRT1VDataStruct *) XGI_GetLcdPtr(tempbx, ModeNo, 3245dfe64dd3Smacallan ModeIdIndex, 3246dfe64dd3Smacallan RefreshRateTableIndex, 3247dfe64dd3Smacallan pVBInfo); 3248dfe64dd3Smacallan for (i = 0; i < 7; i++) 3249dfe64dd3Smacallan pVBInfo->TimingV.data[i] = LCDPtr1[0].Reg[i]; 3250dfe64dd3Smacallan } 3251dfe64dd3Smacallan 3252dfe64dd3Smacallan XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo); 3253dfe64dd3Smacallan } 3254dfe64dd3Smacallan} 3255dfe64dd3Smacallan 3256dfe64dd3Smacallan 3257dfe64dd3Smacallan 3258dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3259dfe64dd3Smacallan/* Function : XGI_SetLVDSRegs */ 3260dfe64dd3Smacallan/* Input : */ 3261dfe64dd3Smacallan/* Output : */ 3262dfe64dd3Smacallan/* Description : */ 3263dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3264dfe64dd3Smacallanvoid 3265dfe64dd3SmacallanXGI_SetLVDSRegs(USHORT ModeNo, USHORT ModeIdIndex, 3266dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 3267dfe64dd3Smacallan{ 3268098ad5bdSmacallan ULONG tempbx, tempax, tempcx, tempdx, push1, push2, modeflag; 3269dfe64dd3Smacallan unsigned long temp, temp1, temp2, temp3, push3; 3270dfe64dd3Smacallan XGI330_LCDDataDesStruct *LCDPtr = NULL; 3271dfe64dd3Smacallan XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL; 3272dfe64dd3Smacallan 3273dfe64dd3Smacallan if (ModeNo > 0x13) 3274dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 3275dfe64dd3Smacallan else 3276dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; 3277dfe64dd3Smacallan 3278dfe64dd3Smacallan if (!(pVBInfo->SetFlag & Win9xDOSMode)) { 3279dfe64dd3Smacallan if (pVBInfo->IF_DEF_OEMUtil == 1) { 3280dfe64dd3Smacallan tempbx = 8; 3281dfe64dd3Smacallan LCDPtr = 3282dfe64dd3Smacallan (XGI330_LCDDataDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo, 3283dfe64dd3Smacallan ModeIdIndex, 3284dfe64dd3Smacallan RefreshRateTableIndex, 3285dfe64dd3Smacallan pVBInfo); 3286dfe64dd3Smacallan } 3287dfe64dd3Smacallan 3288dfe64dd3Smacallan if ((pVBInfo->IF_DEF_OEMUtil == 0) || (LCDPtr == 0)) { 3289dfe64dd3Smacallan tempbx = 3; 3290dfe64dd3Smacallan if (pVBInfo->LCDInfo & EnableScalingLCD) 3291dfe64dd3Smacallan LCDPtr1 = 3292dfe64dd3Smacallan (XGI330_LCDDataDesStruct2 *) XGI_GetLcdPtr(tempbx, ModeNo, 3293dfe64dd3Smacallan ModeIdIndex, 3294dfe64dd3Smacallan RefreshRateTableIndex, 3295dfe64dd3Smacallan pVBInfo); 3296dfe64dd3Smacallan else 3297dfe64dd3Smacallan LCDPtr = 3298dfe64dd3Smacallan (XGI330_LCDDataDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo, 3299dfe64dd3Smacallan ModeIdIndex, 3300dfe64dd3Smacallan RefreshRateTableIndex, 3301dfe64dd3Smacallan pVBInfo); 3302dfe64dd3Smacallan } 3303dfe64dd3Smacallan 3304dfe64dd3Smacallan XGI_GetLCDSync(&tempax, &tempbx, pVBInfo); 3305dfe64dd3Smacallan push1 = tempbx; 3306dfe64dd3Smacallan push2 = tempax; 3307dfe64dd3Smacallan 3308dfe64dd3Smacallan /* GetLCDResInfo */ 3309dfe64dd3Smacallan if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) { 3310dfe64dd3Smacallan get_HDE_VDE(pVBInfo, & pVBInfo->HDE, & pVBInfo->VDE); 3311dfe64dd3Smacallan 3312dfe64dd3Smacallan pVBInfo->VGAHDE = pVBInfo->HDE; 3313dfe64dd3Smacallan pVBInfo->VGAVDE = pVBInfo->VDE; 3314dfe64dd3Smacallan } 3315dfe64dd3Smacallan 3316dfe64dd3Smacallan tempax = pVBInfo->HT; 3317dfe64dd3Smacallan 3318dfe64dd3Smacallan tempbx = (pVBInfo->LCDInfo & EnableScalingLCD) 3319dfe64dd3Smacallan ? LCDPtr1->LCDHDES : LCDPtr->LCDHDES; 3320dfe64dd3Smacallan 3321dfe64dd3Smacallan tempcx = pVBInfo->HDE; 3322dfe64dd3Smacallan tempbx = tempbx & 0x0fff; 3323dfe64dd3Smacallan tempcx += tempbx; 3324dfe64dd3Smacallan 3325dfe64dd3Smacallan if (tempcx >= tempax) 3326dfe64dd3Smacallan tempcx -= tempax; 3327dfe64dd3Smacallan 3328dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1A, tempbx & 0x07); 3329dfe64dd3Smacallan 3330dfe64dd3Smacallan tempcx = tempcx >> 3; 3331dfe64dd3Smacallan tempbx = tempbx >> 3; 3332dfe64dd3Smacallan 3333dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x16, 3334dfe64dd3Smacallan (USHORT) (tempbx & 0xff)); 3335dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x17, 3336dfe64dd3Smacallan (USHORT) (tempcx & 0xff)); 3337dfe64dd3Smacallan 3338dfe64dd3Smacallan tempax = pVBInfo->HT; 3339dfe64dd3Smacallan 3340dfe64dd3Smacallan if (pVBInfo->LCDInfo & EnableScalingLCD) 3341dfe64dd3Smacallan tempbx = LCDPtr1->LCDHRS; 3342dfe64dd3Smacallan else 3343dfe64dd3Smacallan tempbx = LCDPtr->LCDHRS; 3344dfe64dd3Smacallan 3345dfe64dd3Smacallan tempcx = push2; 3346dfe64dd3Smacallan 3347dfe64dd3Smacallan if (pVBInfo->LCDInfo & EnableScalingLCD) 3348dfe64dd3Smacallan tempcx = LCDPtr1->LCDHSync; 3349dfe64dd3Smacallan 3350dfe64dd3Smacallan tempcx += tempbx; 3351dfe64dd3Smacallan 3352dfe64dd3Smacallan if (tempcx >= tempax) 3353dfe64dd3Smacallan tempcx -= tempax; 3354dfe64dd3Smacallan 3355dfe64dd3Smacallan /* FIXME: Won't this *always* set tempax to zero? */ 3356dfe64dd3Smacallan tempax = tempbx & 0x07; 3357dfe64dd3Smacallan tempax = tempax >> 5; 3358dfe64dd3Smacallan tempcx = tempcx >> 3; 3359dfe64dd3Smacallan tempbx = tempbx >> 3; 3360dfe64dd3Smacallan 3361dfe64dd3Smacallan tempcx &= 0x1f; 3362dfe64dd3Smacallan tempax |= tempcx; 3363dfe64dd3Smacallan 3364dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x15, tempax); 3365dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x14, 3366dfe64dd3Smacallan (USHORT) (tempbx & 0xff)); 3367dfe64dd3Smacallan 3368dfe64dd3Smacallan tempax = pVBInfo->VT; 3369dfe64dd3Smacallan if (pVBInfo->LCDInfo & EnableScalingLCD) 3370dfe64dd3Smacallan tempbx = LCDPtr1->LCDVDES; 3371dfe64dd3Smacallan else 3372dfe64dd3Smacallan tempbx = LCDPtr->LCDVDES; 3373dfe64dd3Smacallan tempcx = pVBInfo->VDE; 3374dfe64dd3Smacallan 3375dfe64dd3Smacallan tempbx = tempbx & 0x0fff; 3376dfe64dd3Smacallan tempcx += tempbx; 3377dfe64dd3Smacallan if (tempcx >= tempax) 3378dfe64dd3Smacallan tempcx -= tempax; 3379dfe64dd3Smacallan 3380dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1b, 3381dfe64dd3Smacallan (USHORT) (tempbx & 0xff)); 3382dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1c, 3383dfe64dd3Smacallan (USHORT) (tempcx & 0xff)); 3384dfe64dd3Smacallan 3385dfe64dd3Smacallan tempbx = (tempbx >> 8) & 0x07; 3386dfe64dd3Smacallan tempcx = (tempcx >> 8) & 0x07; 3387dfe64dd3Smacallan 3388dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1d, 3389dfe64dd3Smacallan (USHORT) ((tempcx << 3) | tempbx)); 3390dfe64dd3Smacallan 3391dfe64dd3Smacallan tempax = pVBInfo->VT; 3392dfe64dd3Smacallan if (pVBInfo->LCDInfo & EnableScalingLCD) 3393dfe64dd3Smacallan tempbx = LCDPtr1->LCDVRS; 3394dfe64dd3Smacallan else 3395dfe64dd3Smacallan tempbx = LCDPtr->LCDVRS; 3396dfe64dd3Smacallan 3397dfe64dd3Smacallan /* tempbx = tempbx >> 4 ; */ 3398dfe64dd3Smacallan tempcx = push1; 3399dfe64dd3Smacallan 3400dfe64dd3Smacallan if (pVBInfo->LCDInfo & EnableScalingLCD) 3401dfe64dd3Smacallan tempcx = LCDPtr1->LCDVSync; 3402dfe64dd3Smacallan 3403dfe64dd3Smacallan tempcx += tempbx; 3404dfe64dd3Smacallan if (tempcx >= tempax) 3405dfe64dd3Smacallan tempcx -= tempax; 3406dfe64dd3Smacallan 3407dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x18, 3408dfe64dd3Smacallan (USHORT) (tempbx & 0xff)); 3409dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x19, ~0x0f, 3410dfe64dd3Smacallan (USHORT) (tempcx & 0x0f)); 3411dfe64dd3Smacallan 3412dfe64dd3Smacallan tempax = ((tempbx >> 8) & 0x07) << 3; 3413dfe64dd3Smacallan 3414dfe64dd3Smacallan tempbx = pVBInfo->VGAVDE; 3415dfe64dd3Smacallan if (tempbx != pVBInfo->VDE) 3416dfe64dd3Smacallan tempax |= 0x40; 3417dfe64dd3Smacallan 3418dfe64dd3Smacallan if (pVBInfo->LCDInfo & EnableLVDSDDA) 3419dfe64dd3Smacallan tempax |= 0x40; 3420dfe64dd3Smacallan 3421dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x1a, 0x07, 3422dfe64dd3Smacallan tempax); 3423dfe64dd3Smacallan 3424dfe64dd3Smacallan tempcx = pVBInfo->VGAVT; 3425dfe64dd3Smacallan tempbx = pVBInfo->VDE; 3426dfe64dd3Smacallan tempax = pVBInfo->VGAVDE; 3427dfe64dd3Smacallan tempcx -= tempax; 3428dfe64dd3Smacallan 3429dfe64dd3Smacallan temp = tempax; /* 0430 ylshieh */ 3430dfe64dd3Smacallan temp1 = (temp << 18) / tempbx; 3431dfe64dd3Smacallan 3432dfe64dd3Smacallan tempdx = (USHORT) ((temp << 18) % tempbx); 3433dfe64dd3Smacallan 3434dfe64dd3Smacallan if (tempdx != 0) 3435dfe64dd3Smacallan temp1 += 1; 3436dfe64dd3Smacallan 3437dfe64dd3Smacallan temp2 = temp1; 3438dfe64dd3Smacallan push3 = temp2; 3439dfe64dd3Smacallan 3440dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x37, 3441dfe64dd3Smacallan (USHORT) (temp2 & 0xff)); 3442dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x36, 3443dfe64dd3Smacallan (USHORT) ((temp2 >> 8) & 0xff)); 3444dfe64dd3Smacallan 3445dfe64dd3Smacallan tempbx = (USHORT) (temp2 >> 16); 3446dfe64dd3Smacallan tempax = tempbx & 0x03; 3447dfe64dd3Smacallan 3448dfe64dd3Smacallan tempbx = pVBInfo->VGAVDE; 3449dfe64dd3Smacallan if (tempbx == pVBInfo->VDE) 3450dfe64dd3Smacallan tempax |= 0x04; 3451dfe64dd3Smacallan 3452dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x35, tempax); 3453dfe64dd3Smacallan 3454dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301C) { 3455dfe64dd3Smacallan temp2 = push3; 3456dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x3c, 3457dfe64dd3Smacallan (USHORT) (temp2 & 0xff)); 3458dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x3b, 3459dfe64dd3Smacallan (USHORT) ((temp2 >> 8) & 0xff)); 3460dfe64dd3Smacallan tempbx = (USHORT) (temp2 >> 16); 3461dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x3a, ~0xc0, 3462dfe64dd3Smacallan (USHORT) ((tempbx & 0xff) << 6)); 3463dfe64dd3Smacallan 3464dfe64dd3Smacallan tempcx = pVBInfo->VGAVDE; 3465dfe64dd3Smacallan if (tempcx == pVBInfo->VDE) 3466dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, 3467dfe64dd3Smacallan ~0x0c, 0x00); 3468dfe64dd3Smacallan else 3469dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, 3470dfe64dd3Smacallan ~0x0c, 0x08); 3471dfe64dd3Smacallan } 3472dfe64dd3Smacallan 3473dfe64dd3Smacallan tempcx = pVBInfo->VGAHDE; 3474dfe64dd3Smacallan tempbx = pVBInfo->HDE; 3475dfe64dd3Smacallan 3476dfe64dd3Smacallan temp1 = tempcx << 16; 3477dfe64dd3Smacallan 3478dfe64dd3Smacallan tempax = (USHORT) (temp1 / tempbx); 3479dfe64dd3Smacallan 3480dfe64dd3Smacallan if ((tempbx & 0xffff) == (tempcx & 0xffff)) 3481dfe64dd3Smacallan tempax = 65535; 3482dfe64dd3Smacallan 3483dfe64dd3Smacallan temp3 = tempax; 3484dfe64dd3Smacallan temp1 = pVBInfo->VGAHDE << 16; 3485dfe64dd3Smacallan 3486dfe64dd3Smacallan temp1 /= temp3; 3487dfe64dd3Smacallan temp3 = temp3 << 16; 3488dfe64dd3Smacallan temp1 -= 1; 3489dfe64dd3Smacallan 3490dfe64dd3Smacallan temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff); 3491dfe64dd3Smacallan 3492dfe64dd3Smacallan tempax = (USHORT) (temp3 & 0xff); 3493dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1f, tempax); 3494dfe64dd3Smacallan 3495dfe64dd3Smacallan temp1 = pVBInfo->VGAVDE << 18; 3496dfe64dd3Smacallan temp1 = temp1 / push3; 3497dfe64dd3Smacallan tempbx = (USHORT) (temp1 & 0xffff); 3498dfe64dd3Smacallan 3499dfe64dd3Smacallan if (pVBInfo->LCDResInfo == Panel1024x768) 3500dfe64dd3Smacallan tempbx -= 1; 3501dfe64dd3Smacallan 3502dfe64dd3Smacallan tempax = ((tempbx >> 8) & 0xff) << 3; 3503dfe64dd3Smacallan tempax |= (USHORT) ((temp3 >> 8) & 0x07); 3504dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x20, 3505dfe64dd3Smacallan (USHORT) (tempax & 0xff)); 3506dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x21, 3507dfe64dd3Smacallan (USHORT) (tempbx & 0xff)); 3508dfe64dd3Smacallan 3509dfe64dd3Smacallan temp3 = temp3 >> 16; 3510dfe64dd3Smacallan 3511dfe64dd3Smacallan if (modeflag & HalfDCLK) 3512dfe64dd3Smacallan temp3 = temp3 >> 1; 3513dfe64dd3Smacallan 3514dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x22, 3515dfe64dd3Smacallan (USHORT) ((temp3 >> 8) & 0xff)); 3516dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x23, 3517dfe64dd3Smacallan (USHORT) (temp3 & 0xff)); 3518dfe64dd3Smacallan } 3519dfe64dd3Smacallan} 3520dfe64dd3Smacallan 3521dfe64dd3Smacallan 3522dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3523dfe64dd3Smacallan/* Function : XGI_SetCRT2ECLK */ 3524dfe64dd3Smacallan/* Input : */ 3525dfe64dd3Smacallan/* Output : */ 3526dfe64dd3Smacallan/* Description : */ 3527dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3528dfe64dd3Smacallanvoid 3529dfe64dd3SmacallanXGI_SetCRT2ECLK(USHORT ModeNo, USHORT ModeIdIndex, 3530dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 3531dfe64dd3Smacallan{ 3532dfe64dd3Smacallan UCHAR di[2]; 3533dfe64dd3Smacallan int i; 3534dfe64dd3Smacallan const unsigned vclkindex = 3535dfe64dd3Smacallan XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex, pVBInfo); 3536dfe64dd3Smacallan 3537dfe64dd3Smacallan XGI_GetVCLKLen(vclkindex, di, pVBInfo); 3538dfe64dd3Smacallan XGI_GetLCDVCLKPtr(di, pVBInfo); 3539dfe64dd3Smacallan 3540dfe64dd3Smacallan for (i = 0; i < 4; i++) { 3541dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x31, ~0x30, 3542dfe64dd3Smacallan (USHORT) (0x10 * i)); 3543dfe64dd3Smacallan if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) 3544dfe64dd3Smacallan && (!(pVBInfo->VBInfo & SetInSlaveMode))) { 3545dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2e, di[0]); 3546dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2f, di[1]); 3547dfe64dd3Smacallan } 3548dfe64dd3Smacallan else { 3549dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2b, di[0]); 3550dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2c, di[1]); 3551dfe64dd3Smacallan } 3552dfe64dd3Smacallan } 3553dfe64dd3Smacallan} 3554dfe64dd3Smacallan 3555dfe64dd3Smacallan 3556dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3557dfe64dd3Smacallan/* Function : XGI_UpdateModeInfo */ 3558dfe64dd3Smacallan/* Input : */ 3559dfe64dd3Smacallan/* Output : */ 3560dfe64dd3Smacallan/* Description : */ 3561dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3562dfe64dd3Smacallanvoid 3563dfe64dd3SmacallanXGI_UpdateModeInfo(PXGI_HW_DEVICE_INFO HwDeviceExtension, 3564dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 3565dfe64dd3Smacallan{ 3566dfe64dd3Smacallan USHORT tempcl, tempch, temp, tempbl, tempax; 3567dfe64dd3Smacallan 3568dfe64dd3Smacallan if (pVBInfo-> 3569dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 3570dfe64dd3Smacallan VB_XGI301C)) { 3571dfe64dd3Smacallan tempcl = 0; 3572dfe64dd3Smacallan tempch = 0; 3573dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01); 3574dfe64dd3Smacallan 3575dfe64dd3Smacallan if (!(temp & 0x20)) { 3576dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x17); 3577dfe64dd3Smacallan if (temp & 0x80) { 3578dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 3579dfe64dd3Smacallan if ((HwDeviceExtension->jChipType >= XG20) 3580dfe64dd3Smacallan || (HwDeviceExtension->jChipType >= XG40)) 3581dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53); 3582dfe64dd3Smacallan else 3583dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x63); 3584dfe64dd3Smacallan 3585dfe64dd3Smacallan if (!(temp & 0x40)) 3586dfe64dd3Smacallan tempcl |= ActiveCRT1; 3587dfe64dd3Smacallan } 3588dfe64dd3Smacallan } 3589dfe64dd3Smacallan 3590dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2e); 3591dfe64dd3Smacallan temp &= 0x0f; 3592dfe64dd3Smacallan 3593dfe64dd3Smacallan if (!(temp == 0x08)) { 3594dfe64dd3Smacallan tempax = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x13); /* Check ChannelA by Part1_13 [2003/10/03] */ 3595dfe64dd3Smacallan if (tempax & 0x04) 3596dfe64dd3Smacallan tempcl = tempcl | ActiveLCD; 3597dfe64dd3Smacallan 3598dfe64dd3Smacallan temp &= 0x05; 3599dfe64dd3Smacallan 3600dfe64dd3Smacallan if (!(tempcl & ActiveLCD)) 3601dfe64dd3Smacallan if (temp == 0x01) 3602dfe64dd3Smacallan tempcl |= ActiveCRT2; 3603dfe64dd3Smacallan 3604dfe64dd3Smacallan if (temp == 0x04) 3605dfe64dd3Smacallan tempcl |= ActiveLCD; 3606dfe64dd3Smacallan 3607dfe64dd3Smacallan if (temp == 0x05) { 3608dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x00); 3609dfe64dd3Smacallan 3610dfe64dd3Smacallan if (!(temp & 0x08)) 3611dfe64dd3Smacallan tempch |= ActiveAVideo; 3612dfe64dd3Smacallan 3613dfe64dd3Smacallan if (!(temp & 0x04)) 3614dfe64dd3Smacallan tempch |= ActiveSVideo; 3615dfe64dd3Smacallan 3616dfe64dd3Smacallan if (temp & 0x02) 3617dfe64dd3Smacallan tempch |= ActiveSCART; 3618dfe64dd3Smacallan 3619dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 3620dfe64dd3Smacallan if (temp & 0x01) 3621dfe64dd3Smacallan tempch |= ActiveHiTV; 3622dfe64dd3Smacallan } 3623dfe64dd3Smacallan 3624dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToYPbPr) { 3625dfe64dd3Smacallan temp = 3626dfe64dd3Smacallan XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x4d); 3627dfe64dd3Smacallan 3628dfe64dd3Smacallan if (temp & 0x10) 3629dfe64dd3Smacallan tempch |= ActiveYPbPr; 3630dfe64dd3Smacallan } 3631dfe64dd3Smacallan 3632dfe64dd3Smacallan if (tempch != 0) 3633dfe64dd3Smacallan tempcl |= ActiveTV; 3634dfe64dd3Smacallan } 3635dfe64dd3Smacallan } 3636dfe64dd3Smacallan 3637dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x3d); 3638dfe64dd3Smacallan if (tempcl & ActiveLCD) { 3639dfe64dd3Smacallan if ((pVBInfo->SetFlag & ReserveTVOption)) { 3640dfe64dd3Smacallan if (temp & ActiveTV) 3641dfe64dd3Smacallan tempcl |= ActiveTV; 3642dfe64dd3Smacallan } 3643dfe64dd3Smacallan } 3644dfe64dd3Smacallan temp = tempcl; 3645dfe64dd3Smacallan tempbl = ~ModeSwitchStatus; 3646dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x3d, tempbl, temp); 3647dfe64dd3Smacallan 3648dfe64dd3Smacallan if (!(pVBInfo->SetFlag & ReserveTVOption)) 3649dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x3e, tempch); 3650dfe64dd3Smacallan } 3651dfe64dd3Smacallan else { 3652dfe64dd3Smacallan return; 3653dfe64dd3Smacallan } 3654dfe64dd3Smacallan} 3655dfe64dd3Smacallan 3656dfe64dd3Smacallan 3657dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3658dfe64dd3Smacallan/* Function : XGI_GetVBType */ 3659dfe64dd3Smacallan/* Input : */ 3660dfe64dd3Smacallan/* Output : */ 3661dfe64dd3Smacallan/* Description : */ 3662dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3663dfe64dd3Smacallanvoid 3664dfe64dd3SmacallanXGI_GetVBType(PVB_DEVICE_INFO pVBInfo) 3665dfe64dd3Smacallan{ 3666dfe64dd3Smacallan USHORT flag, tempbx, tempah; 3667dfe64dd3Smacallan 3668dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 3669dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 0 ) 3670dfe64dd3Smacallan { 3671dfe64dd3Smacallan tempbx = VB_XGI302B; 3672dfe64dd3Smacallan flag = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x00); 3673dfe64dd3Smacallan if (flag != 0x02) { 3674dfe64dd3Smacallan tempbx = VB_XGI301; 3675dfe64dd3Smacallan flag = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x01); 3676dfe64dd3Smacallan if (flag >= 0xB0) { 3677dfe64dd3Smacallan tempbx = VB_XGI301B; 3678dfe64dd3Smacallan if (flag >= 0xC0) { 3679dfe64dd3Smacallan tempbx = VB_XGI301C; 3680dfe64dd3Smacallan if (flag >= 0xD0) { 3681dfe64dd3Smacallan tempbx = VB_XGI301LV; 3682dfe64dd3Smacallan if (flag >= 0xE0) { 3683dfe64dd3Smacallan tempbx = VB_XGI302LV; 3684dfe64dd3Smacallan tempah = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part4Port, 3685dfe64dd3Smacallan 0x39); 3686dfe64dd3Smacallan if (tempah != 0xFF) 3687dfe64dd3Smacallan tempbx = VB_XGI301C; 3688dfe64dd3Smacallan } 3689dfe64dd3Smacallan } 3690dfe64dd3Smacallan } 3691dfe64dd3Smacallan 3692dfe64dd3Smacallan if (tempbx & (VB_XGI301B | VB_XGI302B)) { 3693dfe64dd3Smacallan flag = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x23); 3694dfe64dd3Smacallan 3695dfe64dd3Smacallan if (!(flag & 0x02)) 3696dfe64dd3Smacallan tempbx = tempbx | VB_NoLCD; 3697dfe64dd3Smacallan } 3698dfe64dd3Smacallan } 3699dfe64dd3Smacallan } 3700dfe64dd3Smacallan 3701dfe64dd3Smacallan pVBInfo->VBType = tempbx; 3702dfe64dd3Smacallan } 3703dfe64dd3Smacallan} 3704dfe64dd3Smacallan 3705dfe64dd3Smacallan 3706dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3707dfe64dd3Smacallan/* Function : XGI_GetVBInfo */ 3708dfe64dd3Smacallan/* Input : */ 3709dfe64dd3Smacallan/* Output : */ 3710dfe64dd3Smacallan/* Description : */ 3711dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3712dfe64dd3Smacallanvoid 3713dfe64dd3SmacallanXGI_GetVBInfo(USHORT ModeNo, USHORT ModeIdIndex, 3714dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) 3715dfe64dd3Smacallan{ 3716dfe64dd3Smacallan USHORT tempax, push, tempbx, temp, modeflag; 3717dfe64dd3Smacallan 3718dfe64dd3Smacallan if (ModeNo <= 0x13) { 3719dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; 3720dfe64dd3Smacallan } 3721dfe64dd3Smacallan else { 3722dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 3723dfe64dd3Smacallan } 3724dfe64dd3Smacallan 3725dfe64dd3Smacallan pVBInfo->SetFlag = 0; 3726dfe64dd3Smacallan pVBInfo->ModeType = modeflag & ModeInfoFlag; 3727dfe64dd3Smacallan tempbx = 0; 3728dfe64dd3Smacallan 3729dfe64dd3Smacallan if (pVBInfo->VBType & 0xFFFF) { 3730dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x30); /* Check Display Device */ 3731dfe64dd3Smacallan tempbx = tempbx | temp; 3732dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x31); 3733dfe64dd3Smacallan push = temp; 3734dfe64dd3Smacallan push = push << 8; 3735dfe64dd3Smacallan tempax = temp << 8; 3736dfe64dd3Smacallan tempbx = tempbx | tempax; 3737dfe64dd3Smacallan temp = 3738dfe64dd3Smacallan (SetCRT2ToDualEdge | SetCRT2ToYPbPr | SetCRT2ToLCDA | 3739dfe64dd3Smacallan SetInSlaveMode | DisableCRT2Display); 3740dfe64dd3Smacallan temp = 0xFFFF ^ temp; 3741dfe64dd3Smacallan tempbx &= temp; 3742dfe64dd3Smacallan 3743dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x38); 3744dfe64dd3Smacallan 3745dfe64dd3Smacallan if (pVBInfo->IF_DEF_LCDA == 1) { 3746dfe64dd3Smacallan /* if ( ( pVBInfo->VBType & VB_XGI302B ) || ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) ) */ 3747dfe64dd3Smacallan if (pVBInfo-> 3748dfe64dd3Smacallan VBType & (VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 3749dfe64dd3Smacallan VB_XGI301C)) { 3750dfe64dd3Smacallan if (temp & EnableDualEdge) { 3751dfe64dd3Smacallan tempbx |= SetCRT2ToDualEdge; 3752dfe64dd3Smacallan 3753dfe64dd3Smacallan if (temp & SetToLCDA) 3754dfe64dd3Smacallan tempbx |= SetCRT2ToLCDA; 3755dfe64dd3Smacallan } 3756dfe64dd3Smacallan } 3757dfe64dd3Smacallan } 3758dfe64dd3Smacallan 3759dfe64dd3Smacallan if (pVBInfo->IF_DEF_YPbPr == 1) { 3760dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI301LV) 3761dfe64dd3Smacallan || (pVBInfo->VBType & VB_XGI302LV) 3762dfe64dd3Smacallan || (pVBInfo->VBType & VB_XGI301C)) { 3763dfe64dd3Smacallan if (temp & SetYPbPr) { /* temp = CR38 */ 3764dfe64dd3Smacallan if (pVBInfo->IF_DEF_HiVision == 1) { 3765dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x35); /* shampoo add for new scratch */ 3766dfe64dd3Smacallan temp &= YPbPrMode; 3767dfe64dd3Smacallan tempbx |= SetCRT2ToHiVisionTV; 3768dfe64dd3Smacallan 3769dfe64dd3Smacallan if (temp != YPbPrMode1080i) { 3770dfe64dd3Smacallan tempbx &= (~SetCRT2ToHiVisionTV); 3771dfe64dd3Smacallan tempbx |= SetCRT2ToYPbPr; 3772dfe64dd3Smacallan } 3773dfe64dd3Smacallan } 3774dfe64dd3Smacallan 3775dfe64dd3Smacallan /* tempbx |= SetCRT2ToYPbPr ; */ 3776dfe64dd3Smacallan } 3777dfe64dd3Smacallan } 3778dfe64dd3Smacallan } 3779dfe64dd3Smacallan 3780dfe64dd3Smacallan tempax = push; /* restore CR31 */ 3781dfe64dd3Smacallan 3782dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 3783dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 0 ) 3784dfe64dd3Smacallan { 3785dfe64dd3Smacallan if (pVBInfo->IF_DEF_YPbPr == 1) { 3786dfe64dd3Smacallan if (pVBInfo->IF_DEF_HiVision == 1) 3787dfe64dd3Smacallan temp = 0x09FC; 3788dfe64dd3Smacallan else 3789dfe64dd3Smacallan temp = 0x097C; 3790dfe64dd3Smacallan } 3791dfe64dd3Smacallan else { 3792dfe64dd3Smacallan if (pVBInfo->IF_DEF_HiVision == 1) 3793dfe64dd3Smacallan temp = 0x01FC; 3794dfe64dd3Smacallan else 3795dfe64dd3Smacallan temp = 0x017C; 3796dfe64dd3Smacallan } 3797dfe64dd3Smacallan } 3798dfe64dd3Smacallan else /* 3nd party chip */ 3799dfe64dd3Smacallan { 3800dfe64dd3Smacallan if ( pVBInfo->IF_DEF_CH7017 == 1 ) 3801dfe64dd3Smacallan temp = ( SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA ) ; 3802dfe64dd3Smacallan else if ( pVBInfo->IF_DEF_CH7007 == 1 ) /* [Billy] 07/05/03 */ 3803dfe64dd3Smacallan { 3804dfe64dd3Smacallan temp = SetCRT2ToTV ; 3805dfe64dd3Smacallan } 3806dfe64dd3Smacallan else 3807dfe64dd3Smacallan temp = SetCRT2ToLCD ; 3808dfe64dd3Smacallan } 3809dfe64dd3Smacallan 3810dfe64dd3Smacallan 3811dfe64dd3Smacallan if (!(tempbx & temp)) { 3812dfe64dd3Smacallan tempax |= DisableCRT2Display; 3813dfe64dd3Smacallan tempbx = 0; 3814dfe64dd3Smacallan } 3815dfe64dd3Smacallan 3816dfe64dd3Smacallan if (pVBInfo->IF_DEF_LCDA == 1) { /* Select Display Device */ 3817dfe64dd3Smacallan if (!(pVBInfo->VBType & VB_NoLCD)) { 3818dfe64dd3Smacallan if (tempbx & SetCRT2ToLCDA) { 3819dfe64dd3Smacallan if (tempbx & SetSimuScanMode) 3820dfe64dd3Smacallan tempbx &= 3821dfe64dd3Smacallan (~ 3822dfe64dd3Smacallan (SetCRT2ToLCD | SetCRT2ToRAMDAC | SwitchToCRT2)); 3823dfe64dd3Smacallan else 3824dfe64dd3Smacallan tempbx &= 3825dfe64dd3Smacallan (~ 3826dfe64dd3Smacallan (SetCRT2ToLCD | SetCRT2ToRAMDAC | SetCRT2ToTV | 3827dfe64dd3Smacallan SwitchToCRT2)); 3828dfe64dd3Smacallan } 3829dfe64dd3Smacallan } 3830dfe64dd3Smacallan } 3831dfe64dd3Smacallan 3832dfe64dd3Smacallan /* shampoo add */ 3833dfe64dd3Smacallan if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode))) { /* for driver abnormal */ 3834dfe64dd3Smacallan if (pVBInfo->IF_DEF_CRT2Monitor == 1) { 3835dfe64dd3Smacallan if (tempbx & SetCRT2ToRAMDAC) { 3836dfe64dd3Smacallan tempbx &= 3837dfe64dd3Smacallan (0xFF00 | SetCRT2ToRAMDAC | SwitchToCRT2 | 3838dfe64dd3Smacallan SetSimuScanMode); 3839dfe64dd3Smacallan tempbx &= (0x00FF | (~SetCRT2ToYPbPr)); 3840dfe64dd3Smacallan } 3841dfe64dd3Smacallan } 3842dfe64dd3Smacallan else 3843dfe64dd3Smacallan tempbx &= (~(SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV)); 3844dfe64dd3Smacallan } 3845dfe64dd3Smacallan 3846dfe64dd3Smacallan if (!(pVBInfo->VBType & VB_NoLCD)) { 3847dfe64dd3Smacallan if (tempbx & SetCRT2ToLCD) { 3848dfe64dd3Smacallan tempbx &= 3849dfe64dd3Smacallan (0xFF00 | SetCRT2ToLCD | SwitchToCRT2 | SetSimuScanMode); 3850dfe64dd3Smacallan tempbx &= (0x00FF | (~SetCRT2ToYPbPr)); 3851dfe64dd3Smacallan } 3852dfe64dd3Smacallan } 3853dfe64dd3Smacallan 3854dfe64dd3Smacallan if (tempbx & SetCRT2ToSCART) { 3855dfe64dd3Smacallan tempbx &= 3856dfe64dd3Smacallan (0xFF00 | SetCRT2ToSCART | SwitchToCRT2 | SetSimuScanMode); 3857dfe64dd3Smacallan tempbx &= (0x00FF | (~SetCRT2ToYPbPr)); 3858dfe64dd3Smacallan } 3859dfe64dd3Smacallan 3860dfe64dd3Smacallan if (pVBInfo->IF_DEF_YPbPr == 1) { 3861dfe64dd3Smacallan if (tempbx & SetCRT2ToYPbPr) 3862dfe64dd3Smacallan tempbx &= (0xFF00 | SwitchToCRT2 | SetSimuScanMode); 3863dfe64dd3Smacallan } 3864dfe64dd3Smacallan 3865dfe64dd3Smacallan if (pVBInfo->IF_DEF_HiVision == 1) { 3866dfe64dd3Smacallan if (tempbx & SetCRT2ToHiVisionTV) 3867dfe64dd3Smacallan tempbx &= 3868dfe64dd3Smacallan (0xFF00 | SetCRT2ToHiVisionTV | SwitchToCRT2 | 3869dfe64dd3Smacallan SetSimuScanMode); 3870dfe64dd3Smacallan } 3871dfe64dd3Smacallan 3872dfe64dd3Smacallan if (tempax & DisableCRT2Display) { /* Set Display Device Info */ 3873dfe64dd3Smacallan if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode))) 3874dfe64dd3Smacallan tempbx = DisableCRT2Display; 3875dfe64dd3Smacallan } 3876dfe64dd3Smacallan 3877dfe64dd3Smacallan if (!(tempbx & DisableCRT2Display)) { 3878dfe64dd3Smacallan if ((!(tempbx & DriverMode)) || (!(modeflag & CRT2Mode))) { 3879dfe64dd3Smacallan if (pVBInfo->IF_DEF_LCDA == 1) { 3880dfe64dd3Smacallan if (!(tempbx & SetCRT2ToLCDA)) 3881dfe64dd3Smacallan tempbx |= (SetInSlaveMode | SetSimuScanMode); 3882dfe64dd3Smacallan } 3883dfe64dd3Smacallan 3884dfe64dd3Smacallan if (pVBInfo->IF_DEF_VideoCapture == 1) { 3885dfe64dd3Smacallan if ((HwDeviceExtension->jChipType >= XG40) 3886dfe64dd3Smacallan && (HwDeviceExtension->jChipType <= XG45)) { 3887dfe64dd3Smacallan if (ModeNo <= 13) { 3888dfe64dd3Smacallan /* CRT2 not need to support */ 3889dfe64dd3Smacallan if (!(tempbx & SetCRT2ToRAMDAC)) { 3890dfe64dd3Smacallan tempbx &= (0x00FF | (~SetInSlaveMode)); 3891dfe64dd3Smacallan pVBInfo->SetFlag |= EnableVCMode; 3892dfe64dd3Smacallan } 3893dfe64dd3Smacallan } 3894dfe64dd3Smacallan } 3895dfe64dd3Smacallan } 3896dfe64dd3Smacallan } 3897dfe64dd3Smacallan 3898dfe64dd3Smacallan /*LCD+TV can't support in slave mode (Force LCDA+TV->LCDB) */ 3899dfe64dd3Smacallan if ((tempbx & SetInSlaveMode) && (tempbx & SetCRT2ToLCDA)) { 3900dfe64dd3Smacallan tempbx ^= (SetCRT2ToLCD | SetCRT2ToLCDA | SetCRT2ToDualEdge); 3901dfe64dd3Smacallan pVBInfo->SetFlag |= ReserveTVOption; 3902dfe64dd3Smacallan } 3903dfe64dd3Smacallan } 3904dfe64dd3Smacallan } 3905dfe64dd3Smacallan 3906dfe64dd3Smacallan pVBInfo->VBInfo = tempbx; 3907dfe64dd3Smacallan} 3908dfe64dd3Smacallan 3909dfe64dd3Smacallan 3910dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3911dfe64dd3Smacallan/* Function : XGI_GetTVInfo */ 3912dfe64dd3Smacallan/* Input : */ 3913dfe64dd3Smacallan/* Output : */ 3914dfe64dd3Smacallan/* Description : */ 3915dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 3916dfe64dd3Smacallanvoid 3917dfe64dd3SmacallanXGI_GetTVInfo(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 3918dfe64dd3Smacallan{ 3919dfe64dd3Smacallan USHORT temp, tempbx = 0, resinfo = 0, modeflag, index1; 3920dfe64dd3Smacallan 3921dfe64dd3Smacallan tempbx = 0; 3922dfe64dd3Smacallan resinfo = 0; 3923dfe64dd3Smacallan 3924dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { 3925dfe64dd3Smacallan if (ModeNo <= 0x13) { 3926dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ModeFlag */ 3927dfe64dd3Smacallan resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo; /* si+St_ResInfo */ 3928dfe64dd3Smacallan } 3929dfe64dd3Smacallan else { 3930dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 3931dfe64dd3Smacallan resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; /* si+Ext_ResInfo */ 3932dfe64dd3Smacallan } 3933dfe64dd3Smacallan 3934dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { 3935dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x35); 3936dfe64dd3Smacallan tempbx = temp; 3937dfe64dd3Smacallan if (tempbx & SetPALTV) { 3938dfe64dd3Smacallan tempbx &= 3939dfe64dd3Smacallan (SetCHTVOverScan | SetPALMTV | SetPALNTV | SetPALTV); 3940dfe64dd3Smacallan if (tempbx & SetPALMTV) 3941dfe64dd3Smacallan tempbx &= ~SetPALTV; /* set to NTSC if PAL-M */ 3942dfe64dd3Smacallan } 3943dfe64dd3Smacallan else 3944dfe64dd3Smacallan tempbx &= (SetCHTVOverScan | SetNTSCJ | SetPALTV); 3945dfe64dd3Smacallan } 3946dfe64dd3Smacallan 3947dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 3948dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 0 ) 3949dfe64dd3Smacallan { 3950dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToSCART) 3951dfe64dd3Smacallan tempbx |= SetPALTV; 3952dfe64dd3Smacallan } 3953dfe64dd3Smacallan 3954dfe64dd3Smacallan if (pVBInfo->IF_DEF_YPbPr == 1) { 3955dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToYPbPr) { 3956dfe64dd3Smacallan index1 = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x35); 3957dfe64dd3Smacallan index1 &= YPbPrMode; 3958dfe64dd3Smacallan 3959dfe64dd3Smacallan if (index1 == YPbPrMode525i) 3960dfe64dd3Smacallan tempbx |= SetYPbPrMode525i; 3961dfe64dd3Smacallan 3962dfe64dd3Smacallan if (index1 == YPbPrMode525p) 3963dfe64dd3Smacallan tempbx = tempbx | SetYPbPrMode525p; 3964dfe64dd3Smacallan if (index1 == YPbPrMode750p) 3965dfe64dd3Smacallan tempbx = tempbx | SetYPbPrMode750p; 3966dfe64dd3Smacallan } 3967dfe64dd3Smacallan } 3968dfe64dd3Smacallan 3969dfe64dd3Smacallan if (pVBInfo->IF_DEF_HiVision == 1) { 3970dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 3971dfe64dd3Smacallan tempbx = tempbx | SetYPbPrMode1080i | SetPALTV; 3972dfe64dd3Smacallan } 3973dfe64dd3Smacallan } 3974dfe64dd3Smacallan 3975dfe64dd3Smacallan /* Jong 10/17/2007; merge code */ 3976dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 0 ) 3977dfe64dd3Smacallan { 3978dfe64dd3Smacallan if ((pVBInfo->VBInfo & SetInSlaveMode) 3979dfe64dd3Smacallan && (!(pVBInfo->VBInfo & SetNotSimuMode))) 3980dfe64dd3Smacallan tempbx |= TVSimuMode; 3981dfe64dd3Smacallan 3982dfe64dd3Smacallan if (!(tempbx & SetPALTV) && (modeflag > 13) && (resinfo == 8)) /* NTSC 1024x768, */ 3983dfe64dd3Smacallan tempbx |= NTSC1024x768; 3984dfe64dd3Smacallan 3985dfe64dd3Smacallan tempbx |= RPLLDIV2XO; 3986dfe64dd3Smacallan 3987dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 3988dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) 3989dfe64dd3Smacallan tempbx &= (~RPLLDIV2XO); 3990dfe64dd3Smacallan } 3991dfe64dd3Smacallan else { 3992dfe64dd3Smacallan if (tempbx & (SetYPbPrMode525p | SetYPbPrMode750p)) 3993dfe64dd3Smacallan tempbx &= (~RPLLDIV2XO); 3994dfe64dd3Smacallan else if (! 3995dfe64dd3Smacallan (pVBInfo-> 3996dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | 3997dfe64dd3Smacallan VB_XGI302LV | VB_XGI301C))) { 3998dfe64dd3Smacallan if (tempbx & TVSimuMode) 3999dfe64dd3Smacallan tempbx &= (~RPLLDIV2XO); 4000dfe64dd3Smacallan } 4001dfe64dd3Smacallan } 4002dfe64dd3Smacallan } 4003dfe64dd3Smacallan } 4004dfe64dd3Smacallan pVBInfo->TVInfo = tempbx; 4005dfe64dd3Smacallan} 4006dfe64dd3Smacallan 4007dfe64dd3Smacallan 4008dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4009dfe64dd3Smacallan/* Function : XGI_GetLCDInfo */ 4010dfe64dd3Smacallan/* Input : */ 4011dfe64dd3Smacallan/* Output : */ 4012dfe64dd3Smacallan/* Description : */ 4013dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4014dfe64dd3SmacallanBOOLEAN 4015dfe64dd3SmacallanXGI_GetLCDInfo(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 4016dfe64dd3Smacallan{ 4017dfe64dd3Smacallan USHORT temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex; 4018dfe64dd3Smacallan 4019dfe64dd3Smacallan pVBInfo->LCDResInfo = 0; 4020dfe64dd3Smacallan pVBInfo->LCDTypeInfo = 0; 4021dfe64dd3Smacallan pVBInfo->LCDInfo = 0; 4022dfe64dd3Smacallan 4023dfe64dd3Smacallan if (ModeNo <= 0x13) { 4024dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ModeFlag // */ 4025dfe64dd3Smacallan } 4026dfe64dd3Smacallan else { 4027dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 4028dfe64dd3Smacallan resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; /* si+Ext_ResInfo// */ 4029dfe64dd3Smacallan } 4030dfe64dd3Smacallan 4031dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */ 4032dfe64dd3Smacallan tempbx = temp & 0x0F; 4033dfe64dd3Smacallan 4034dfe64dd3Smacallan if (tempbx == 0) 4035dfe64dd3Smacallan tempbx = Panel1024x768; /* default */ 4036dfe64dd3Smacallan 4037dfe64dd3Smacallan /* LCD75 [2003/8/22] Vicent */ 4038dfe64dd3Smacallan if ((tempbx == Panel1024x768) || (tempbx == Panel1280x1024)) { 4039dfe64dd3Smacallan if (pVBInfo->VBInfo & DriverMode) { 4040dfe64dd3Smacallan tempax = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x33); 4041dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCDA) 4042dfe64dd3Smacallan tempax &= 0x0F; 4043dfe64dd3Smacallan else 4044dfe64dd3Smacallan tempax = tempax >> 4; 4045dfe64dd3Smacallan 4046dfe64dd3Smacallan if ((resinfo == 6) || (resinfo == 9)) { 4047dfe64dd3Smacallan if (tempax >= 3) 4048dfe64dd3Smacallan tempbx |= PanelRef75Hz; 4049dfe64dd3Smacallan } 4050dfe64dd3Smacallan else if ((resinfo == 7) || (resinfo == 8)) { 4051dfe64dd3Smacallan if (tempax >= 4) 4052dfe64dd3Smacallan tempbx |= PanelRef75Hz; 4053dfe64dd3Smacallan } 4054dfe64dd3Smacallan } 4055dfe64dd3Smacallan } 4056dfe64dd3Smacallan 4057dfe64dd3Smacallan pVBInfo->LCDResInfo = tempbx; 4058dfe64dd3Smacallan 4059dfe64dd3Smacallan /* End of LCD75 */ 4060dfe64dd3Smacallan 4061dfe64dd3Smacallan if (pVBInfo->IF_DEF_OEMUtil == 1) { 4062dfe64dd3Smacallan pVBInfo->LCDTypeInfo = (temp & 0xf0) >> 4; 4063dfe64dd3Smacallan } 4064dfe64dd3Smacallan 4065dfe64dd3Smacallan if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))) { 4066dfe64dd3Smacallan return 0; 4067dfe64dd3Smacallan } 4068dfe64dd3Smacallan 4069dfe64dd3Smacallan tempbx = 0; 4070dfe64dd3Smacallan 4071dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x37); 4072dfe64dd3Smacallan 4073dfe64dd3Smacallan temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable); 4074dfe64dd3Smacallan 4075dfe64dd3Smacallan if ((pVBInfo->IF_DEF_ScaleLCD == 1) && (temp & LCDNonExpanding)) 4076dfe64dd3Smacallan temp &= ~EnableScalingLCD; 4077dfe64dd3Smacallan 4078dfe64dd3Smacallan tempbx |= temp; 4079dfe64dd3Smacallan 4080dfe64dd3Smacallan LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo); 4081dfe64dd3Smacallan 4082dfe64dd3Smacallan tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability; 4083dfe64dd3Smacallan 4084dfe64dd3Smacallan /* Jong 10/17/2007; merge code */ 4085dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 0 ) /* shampoo */ 4086dfe64dd3Smacallan { 4087dfe64dd3Smacallan if (((pVBInfo->VBType & VB_XGI302LV) || (pVBInfo->VBType & VB_XGI301C)) 4088dfe64dd3Smacallan && (tempax & LCDDualLink)) { 4089dfe64dd3Smacallan tempbx |= SetLCDDualLink; 4090dfe64dd3Smacallan } 4091dfe64dd3Smacallan } 4092dfe64dd3Smacallan 4093dfe64dd3Smacallan /* Jong 10/17/1007; merge code */ 4094dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 0 ) 4095dfe64dd3Smacallan { 4096dfe64dd3Smacallan if ((pVBInfo->LCDResInfo == Panel1400x1050) 4097dfe64dd3Smacallan && (pVBInfo->VBInfo & SetCRT2ToLCD) && (ModeNo > 0x13) 4098dfe64dd3Smacallan && (resinfo == 9) && (!(tempbx & EnableScalingLCD))) 4099dfe64dd3Smacallan tempbx |= SetLCDtoNonExpanding; /* set to center in 1280x1024 LCDB for Panel1400x1050 */ 4100dfe64dd3Smacallan } 4101dfe64dd3Smacallan 4102dfe64dd3Smacallan/* 4103dfe64dd3Smacallan if ( tempax & LCDBToA ) 4104dfe64dd3Smacallan { 4105dfe64dd3Smacallan tempbx |= SetLCDBToA ; 4106dfe64dd3Smacallan } 4107dfe64dd3Smacallan*/ 4108dfe64dd3Smacallan 4109dfe64dd3Smacallan if (pVBInfo->IF_DEF_ExpLink == 1) { 4110dfe64dd3Smacallan if (modeflag & HalfDCLK) { 4111dfe64dd3Smacallan /* if ( !( pVBInfo->LCDInfo&LCDNonExpanding ) ) */ 4112dfe64dd3Smacallan if (!(tempbx & SetLCDtoNonExpanding)) { 4113dfe64dd3Smacallan tempbx |= EnableLVDSDDA; 4114dfe64dd3Smacallan } 4115dfe64dd3Smacallan else { 4116dfe64dd3Smacallan if (ModeNo > 0x13) { 4117dfe64dd3Smacallan if (pVBInfo->LCDResInfo == Panel1024x768) { 4118dfe64dd3Smacallan if (resinfo == 4) { /* 512x384 */ 4119dfe64dd3Smacallan tempbx |= EnableLVDSDDA; 4120dfe64dd3Smacallan } 4121dfe64dd3Smacallan } 4122dfe64dd3Smacallan } 4123dfe64dd3Smacallan } 4124dfe64dd3Smacallan } 4125dfe64dd3Smacallan } 4126dfe64dd3Smacallan 4127dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) { 4128dfe64dd3Smacallan if (pVBInfo->VBInfo & SetNotSimuMode) { 4129dfe64dd3Smacallan tempbx |= LCDVESATiming; 4130dfe64dd3Smacallan } 4131dfe64dd3Smacallan } 4132dfe64dd3Smacallan else { 4133dfe64dd3Smacallan tempbx |= LCDVESATiming; 4134dfe64dd3Smacallan } 4135dfe64dd3Smacallan 4136dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x39); 4137dfe64dd3Smacallan if (temp & ReduceTiming) { 4138dfe64dd3Smacallan tempbx |= EnableReduceTiming; 4139dfe64dd3Smacallan } 4140dfe64dd3Smacallan 4141dfe64dd3Smacallan pVBInfo->LCDInfo = tempbx; 4142dfe64dd3Smacallan 4143dfe64dd3Smacallan if (pVBInfo->IF_DEF_PWD == 1) { 4144dfe64dd3Smacallan if (pVBInfo->LCDInfo & SetPWDEnable) { 4145dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI302LV) 4146dfe64dd3Smacallan || (pVBInfo->VBType & VB_XGI301C)) { 4147dfe64dd3Smacallan if (!(tempax & PWDEnable)) { 4148dfe64dd3Smacallan pVBInfo->LCDInfo &= ~SetPWDEnable; 4149dfe64dd3Smacallan } 4150dfe64dd3Smacallan } 4151dfe64dd3Smacallan } 4152dfe64dd3Smacallan } 4153dfe64dd3Smacallan 4154dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 4155dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 0 ) 4156dfe64dd3Smacallan { 4157dfe64dd3Smacallan if (tempax & (LockLCDBToA | StLCDBToA)) { 4158dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) { 4159dfe64dd3Smacallan if (!(tempax & LockLCDBToA)) { 4160dfe64dd3Smacallan if (ModeNo <= 0x13) { 4161dfe64dd3Smacallan pVBInfo->VBInfo &= 4162dfe64dd3Smacallan ~(SetSimuScanMode | SetInSlaveMode | 4163dfe64dd3Smacallan SetCRT2ToLCD); 4164dfe64dd3Smacallan pVBInfo->VBInfo |= SetCRT2ToLCDA | SetCRT2ToDualEdge; 4165dfe64dd3Smacallan } 4166dfe64dd3Smacallan } 4167dfe64dd3Smacallan } 4168dfe64dd3Smacallan } 4169dfe64dd3Smacallan } 4170dfe64dd3Smacallan 4171dfe64dd3Smacallan return (1); 4172dfe64dd3Smacallan} 4173dfe64dd3Smacallan 4174dfe64dd3Smacallan/* Jong 10/04/2007; defined in init.c */ 4175dfe64dd3Smacallan/* Function : XGI_SearchModeID */ 4176dfe64dd3Smacallan/* Input : */ 4177dfe64dd3Smacallan/* Output : */ 4178dfe64dd3Smacallan/* Description : */ 4179dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4180dfe64dd3Smacallan 4181dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4182dfe64dd3Smacallan/* Function : */ 4183dfe64dd3Smacallan/* Input : */ 4184dfe64dd3Smacallan/* Output : */ 4185dfe64dd3Smacallan/* Description : */ 4186dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4187dfe64dd3SmacallanBOOLEAN 4188dfe64dd3SmacallanXGINew_CheckMemorySize(PXGI_HW_DEVICE_INFO HwDeviceExtension, USHORT ModeNo, 4189dfe64dd3Smacallan USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 4190dfe64dd3Smacallan{ 4191dfe64dd3Smacallan USHORT memorysize, modeflag, temp, temp1, tmp; 4192dfe64dd3Smacallan 4193dfe64dd3Smacallan if (ModeNo <= 0x13) { 4194dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; 4195dfe64dd3Smacallan } 4196dfe64dd3Smacallan else { 4197dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 4198dfe64dd3Smacallan } 4199dfe64dd3Smacallan 4200dfe64dd3Smacallan /* ModeType = modeflag&ModeInfoFlag ; // Get mode type */ 4201dfe64dd3Smacallan 4202dfe64dd3Smacallan memorysize = modeflag & MemoryInfoFlag; 4203dfe64dd3Smacallan memorysize = memorysize > MemorySizeShift; 4204dfe64dd3Smacallan memorysize++; /* Get memory size */ 4205dfe64dd3Smacallan 4206dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x14); /* Get DRAM Size */ 4207dfe64dd3Smacallan tmp = temp; 4208dfe64dd3Smacallan 4209dfe64dd3Smacallan if (HwDeviceExtension->jChipType == XG40) { 4210dfe64dd3Smacallan temp = 1 << ((temp & 0x0F0) >> 4); /* memory size per channel SR14[7:4] */ 4211dfe64dd3Smacallan if ((tmp & 0x0c) == 0x0C) { /* Qual channels */ 4212dfe64dd3Smacallan temp <<= 2; 4213dfe64dd3Smacallan } 4214dfe64dd3Smacallan else if ((tmp & 0x0c) == 0x08) { /* Dual channels */ 4215dfe64dd3Smacallan temp <<= 1; 4216dfe64dd3Smacallan } 4217dfe64dd3Smacallan } 4218dfe64dd3Smacallan else if (HwDeviceExtension->jChipType == XG42) { 4219dfe64dd3Smacallan temp = 1 << ((temp & 0x0F0) >> 4); /* memory size per channel SR14[7:4] */ 4220dfe64dd3Smacallan if ((tmp & 0x04) == 0x04) { /* Dual channels */ 4221dfe64dd3Smacallan temp <<= 1; 4222dfe64dd3Smacallan } 4223dfe64dd3Smacallan } 4224dfe64dd3Smacallan else if (HwDeviceExtension->jChipType == XG45) { 4225dfe64dd3Smacallan temp = 1 << ((temp & 0x0F0) >> 4); /* memory size per channel SR14[7:4] */ 4226dfe64dd3Smacallan if ((tmp & 0x0c) == 0x0C) { /* Qual channels */ 4227dfe64dd3Smacallan temp <<= 2; 4228dfe64dd3Smacallan } 4229dfe64dd3Smacallan else if ((tmp & 0x0c) == 0x08) { /* triple channels */ 4230dfe64dd3Smacallan temp1 = temp; 4231dfe64dd3Smacallan temp <<= 1; 4232dfe64dd3Smacallan temp += temp1; 4233dfe64dd3Smacallan } 4234dfe64dd3Smacallan else if ((tmp & 0x0c) == 0x04) { /* Dual channels */ 4235dfe64dd3Smacallan temp <<= 1; 4236dfe64dd3Smacallan } 4237dfe64dd3Smacallan } 4238dfe64dd3Smacallan if (temp < memorysize) 4239dfe64dd3Smacallan return (FALSE); 4240dfe64dd3Smacallan else 4241dfe64dd3Smacallan return (TRUE); 4242dfe64dd3Smacallan} 4243dfe64dd3Smacallan 4244dfe64dd3Smacallan 4245dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4246dfe64dd3Smacallan/* Function : XGI_DisplayOn */ 4247dfe64dd3Smacallan/* Input : */ 4248dfe64dd3Smacallan/* Output : */ 4249dfe64dd3Smacallan/* Description : */ 4250dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4251dfe64dd3Smacallanvoid 4252dfe64dd3SmacallanXGI_DisplayOn(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) 4253dfe64dd3Smacallan{ 4254dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x01, 0xDF, 0x00); 4255dfe64dd3Smacallan 4256dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 4257dfe64dd3Smacallan if ( HwDeviceExtension->jChipType == XG21 ) 4258dfe64dd3Smacallan { 4259dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 1 ) 4260dfe64dd3Smacallan { 4261dfe64dd3Smacallan if (!(XGI_XG21GetPSCValue( pVBInfo )&0x1)) 4262dfe64dd3Smacallan { 4263dfe64dd3Smacallan XGI_XG21BLSignalVDD( 0x01 , 0x01, pVBInfo ) ; /* LVDS VDD on */ 4264dfe64dd3Smacallan XGI_XG21SetPanelDelay( 2,pVBInfo ) ; 4265dfe64dd3Smacallan } 4266dfe64dd3Smacallan if (!(XGI_XG21GetPSCValue( pVBInfo )&0x20)) 4267dfe64dd3Smacallan { 4268dfe64dd3Smacallan XGI_XG21BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* LVDS signal on */ 4269dfe64dd3Smacallan } 4270dfe64dd3Smacallan XGI_XG21SetPanelDelay( 3,pVBInfo ) ; 4271dfe64dd3Smacallan XGI_XG21BLSignalVDD( 0x02 , 0x02, pVBInfo ) ; /* LVDS backlight on */ 4272dfe64dd3Smacallan } 4273dfe64dd3Smacallan else 4274dfe64dd3Smacallan { 4275dfe64dd3Smacallan XGI_XG21BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* DVO/DVI signal on */ 4276dfe64dd3Smacallan } 4277dfe64dd3Smacallan 4278dfe64dd3Smacallan } 4279dfe64dd3Smacallan 4280dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 4281dfe64dd3Smacallan if ( HwDeviceExtension->jChipType == XG27 ) 4282dfe64dd3Smacallan { 4283dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 1 ) 4284dfe64dd3Smacallan { 4285dfe64dd3Smacallan if (!(XGI_XG27GetPSCValue( pVBInfo )&0x1)) 4286dfe64dd3Smacallan { 4287dfe64dd3Smacallan XGI_XG27BLSignalVDD( 0x01 , 0x01, pVBInfo ) ; /* LVDS VDD on */ 4288dfe64dd3Smacallan XGI_XG21SetPanelDelay( 2,pVBInfo ) ; 4289dfe64dd3Smacallan } 4290dfe64dd3Smacallan if (!(XGI_XG27GetPSCValue( pVBInfo )&0x20)) 4291dfe64dd3Smacallan { 4292dfe64dd3Smacallan XGI_XG27BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* LVDS signal on */ 4293dfe64dd3Smacallan } 4294dfe64dd3Smacallan XGI_XG21SetPanelDelay( 3,pVBInfo ) ; 4295dfe64dd3Smacallan XGI_XG27BLSignalVDD( 0x02 , 0x02, pVBInfo ) ; /* LVDS backlight on */ 4296dfe64dd3Smacallan } 4297dfe64dd3Smacallan else 4298dfe64dd3Smacallan { 4299dfe64dd3Smacallan XGI_XG27BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* DVO/DVI signal on */ 4300dfe64dd3Smacallan } 4301dfe64dd3Smacallan } 4302dfe64dd3Smacallan 4303dfe64dd3Smacallan} 4304dfe64dd3Smacallan 4305dfe64dd3Smacallan 4306dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4307dfe64dd3Smacallan/* Function : XGI_DisplayOff */ 4308dfe64dd3Smacallan/* Input : */ 4309dfe64dd3Smacallan/* Output : */ 4310dfe64dd3Smacallan/* Description : */ 4311dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4312dfe64dd3Smacallanvoid 4313dfe64dd3SmacallanXGI_DisplayOff(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) 4314dfe64dd3Smacallan{ 4315dfe64dd3Smacallan PDEBUG(ErrorF("XGI_DisplayOff()...begin\n")); 4316dfe64dd3Smacallan 4317dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 4318dfe64dd3Smacallan if ( HwDeviceExtension->jChipType == XG21 ) 4319dfe64dd3Smacallan { 4320dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 1 ) 4321dfe64dd3Smacallan { 4322dfe64dd3Smacallan XGI_XG21BLSignalVDD( 0x02 , 0x00, pVBInfo ) ; /* LVDS backlight off */ 4323dfe64dd3Smacallan XGI_XG21SetPanelDelay( 3,pVBInfo ) ; 4324dfe64dd3Smacallan } 4325dfe64dd3Smacallan else 4326dfe64dd3Smacallan { 4327dfe64dd3Smacallan XGI_XG21BLSignalVDD( 0x20 , 0x00, pVBInfo ) ; /* DVO/DVI signal off */ 4328dfe64dd3Smacallan } 4329dfe64dd3Smacallan } 4330dfe64dd3Smacallan 4331dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 4332dfe64dd3Smacallan if ( HwDeviceExtension->jChipType == XG27 ) 4333dfe64dd3Smacallan { 4334dfe64dd3Smacallan PDEBUG(ErrorF("XG27\n")); 4335dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 0 ) 4336dfe64dd3Smacallan { 4337dfe64dd3Smacallan PDEBUG(ErrorF("pVBInfo->IF_DEF_LVDS == 0 ...\n")); 4338dfe64dd3Smacallan XGI_XG27BLSignalVDD( 0x20 , 0x00, pVBInfo ) ; /* DVO/DVI signal off */ 4339dfe64dd3Smacallan PDEBUG(ErrorF("After XGI_XG27BLSignalVDD() ...\n")); 4340dfe64dd3Smacallan } 4341dfe64dd3Smacallan else if ((XGI_XG27GetPSCValue( pVBInfo )&0x2)) /* Jong@09232009; bug fixing */ 4342dfe64dd3Smacallan { 4343dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27GetPSCValue( pVBInfo )&0x2 is true...\n")); 4344dfe64dd3Smacallan XGI_XG27BLSignalVDD( 0x02 , 0x00, pVBInfo ) ; /* LVDS backlight off */ 4345dfe64dd3Smacallan PDEBUG(ErrorF("After XGI_XG27BLSignalVDD()...\n")); 4346dfe64dd3Smacallan XGI_XG21SetPanelDelay( 3,pVBInfo ) ; 4347dfe64dd3Smacallan PDEBUG(ErrorF("After XGI_XG21SetPanelDelay()...\n")); 4348dfe64dd3Smacallan } 4349dfe64dd3Smacallan } 4350dfe64dd3Smacallan 4351dfe64dd3Smacallan PDEBUG(ErrorF("Before XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x01, 0xDF, 0x20) ...\n")); 4352dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x01, 0xDF, 0x20); 4353dfe64dd3Smacallan PDEBUG(ErrorF("Return from XGI_DisplayOff() ...\n")); 4354dfe64dd3Smacallan} 4355dfe64dd3Smacallan 4356dfe64dd3Smacallan 4357dfe64dd3Smacallan/** 4358dfe64dd3Smacallan * Wait for vertical or horizontal blanking period. 4359dfe64dd3Smacallan */ 4360dfe64dd3Smacallanvoid 4361dfe64dd3SmacallanXGI_WaitDisplay(PVB_DEVICE_INFO pVBInfo) 4362dfe64dd3Smacallan{ 4363dfe64dd3Smacallan while ((XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da) & 0x01)) 4364dfe64dd3Smacallan break; 4365dfe64dd3Smacallan 4366dfe64dd3Smacallan while (!(XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da) & 0x01)) 4367dfe64dd3Smacallan break; 4368dfe64dd3Smacallan} 4369dfe64dd3Smacallan 4370dfe64dd3Smacallan 4371dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4372dfe64dd3Smacallan/* Function : XGI_SenseCRT1 */ 4373dfe64dd3Smacallan/* Input : */ 4374dfe64dd3Smacallan/* Output : */ 4375dfe64dd3Smacallan/* Description : */ 4376dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4377dfe64dd3Smacallan 4378dfe64dd3Smacallanvoid 4379dfe64dd3SmacallanXGI_SenseCRT1(PVB_DEVICE_INFO pVBInfo) 4380dfe64dd3Smacallan{ 4381dfe64dd3Smacallan UCHAR CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81, 4382dfe64dd3Smacallan 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 4383dfe64dd3Smacallan 0x04, 0x00, 0x00, 0x05, 0x00 4384dfe64dd3Smacallan }; 4385dfe64dd3Smacallan 4386dfe64dd3Smacallan UCHAR SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0; 4387dfe64dd3Smacallan 4388dfe64dd3Smacallan UCHAR CR17, CR63, SR31; 4389dfe64dd3Smacallan USHORT temp; 4390dfe64dd3Smacallan UCHAR DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F }; 4391dfe64dd3Smacallan 4392dfe64dd3Smacallan int i; 4393dfe64dd3Smacallan#ifndef LINUX_XF86 4394dfe64dd3Smacallan int j; 4395dfe64dd3Smacallan#endif 4396dfe64dd3Smacallan 4397dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x05, 0x86); 4398dfe64dd3Smacallan 4399dfe64dd3Smacallan /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */ 4400dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x57, 0x4A); 4401dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53, 4402dfe64dd3Smacallan (UCHAR) (XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53) | 4403dfe64dd3Smacallan 0x02)); 4404dfe64dd3Smacallan 4405dfe64dd3Smacallan SR31 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x31); 4406dfe64dd3Smacallan CR63 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x63); 4407dfe64dd3Smacallan SR01 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01); 4408dfe64dd3Smacallan 4409dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01, (UCHAR) (SR01 & 0xDF)); 4410dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x63, (UCHAR) (CR63 & 0xBF)); 4411dfe64dd3Smacallan 4412dfe64dd3Smacallan CR17 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x17); 4413dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x17, (UCHAR) (CR17 | 0x80)); 4414dfe64dd3Smacallan 4415dfe64dd3Smacallan SR1F = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x1F); 4416dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x1F, (UCHAR) (SR1F | 0x04)); 4417dfe64dd3Smacallan 4418dfe64dd3Smacallan SR07 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x07); 4419dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x07, (UCHAR) (SR07 & 0xFB)); 4420dfe64dd3Smacallan SR06 = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x06); 4421dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x06, (UCHAR) (SR06 & 0xC3)); 4422dfe64dd3Smacallan 4423dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x11, 0x00); 4424dfe64dd3Smacallan 4425dfe64dd3Smacallan for (i = 0; i < 8; i++) 4426dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) i, CRTCData[i]); 4427dfe64dd3Smacallan 4428dfe64dd3Smacallan for (i = 8; i < 11; i++) 4429dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 8), 4430dfe64dd3Smacallan CRTCData[i]); 4431dfe64dd3Smacallan 4432dfe64dd3Smacallan for (i = 11; i < 13; i++) 4433dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, (USHORT) (i + 4), 4434dfe64dd3Smacallan CRTCData[i]); 4435dfe64dd3Smacallan 4436dfe64dd3Smacallan for (i = 13; i < 16; i++) 4437dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, (USHORT) (i - 3), 4438dfe64dd3Smacallan CRTCData[i]); 4439dfe64dd3Smacallan 4440dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x0E, 4441dfe64dd3Smacallan (UCHAR) (CRTCData[16] & 0xE0)); 4442dfe64dd3Smacallan 4443dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x31, 0x00); 4444dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2B, 0x1B); 4445dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x2C, 0xE1); 4446dfe64dd3Smacallan 4447dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c8, 0x00); 4448dfe64dd3Smacallan for (i = 0; i < 256; i++) { 4449dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), 4450dfe64dd3Smacallan (UCHAR) DAC_TEST_PARMS[0]); 4451dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), 4452dfe64dd3Smacallan (UCHAR) DAC_TEST_PARMS[1]); 4453dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), 4454dfe64dd3Smacallan (UCHAR) DAC_TEST_PARMS[2]); 4455dfe64dd3Smacallan } 4456dfe64dd3Smacallan 4457dfe64dd3Smacallan XGI_VBLongWait(pVBInfo); 4458dfe64dd3Smacallan XGI_VBLongWait(pVBInfo); 4459dfe64dd3Smacallan XGI_VBLongWait(pVBInfo); 4460dfe64dd3Smacallan 4461dfe64dd3Smacallan XGINew_LCD_Wait_Time(0x01, pVBInfo); 4462dfe64dd3Smacallan XGI_WaitDisplay(pVBInfo); 4463dfe64dd3Smacallan 4464dfe64dd3Smacallan temp = XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3c2); 4465dfe64dd3Smacallan if (temp & 0x10) { 4466dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x32, 0xDF, 0x20); 4467dfe64dd3Smacallan } 4468dfe64dd3Smacallan else { 4469dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x32, 0xDF, 0x00); 4470dfe64dd3Smacallan } 4471dfe64dd3Smacallan 4472dfe64dd3Smacallan /* alan, avoid display something, set BLACK DAC if not restore DAC */ 4473dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) pVBInfo->P3c8, 0x00); 4474dfe64dd3Smacallan 4475dfe64dd3Smacallan for (i = 0; i < 256; i++) { 4476dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), 0); 4477dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), 0); 4478dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) (USHORT) (pVBInfo->P3c8 + 1), 0); 4479dfe64dd3Smacallan } 4480dfe64dd3Smacallan 4481dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x01, SR01); 4482dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x63, CR63); 4483dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x31, SR31); 4484dfe64dd3Smacallan 4485dfe64dd3Smacallan /* [2004/05/11] Vicent */ 4486dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53, 4487dfe64dd3Smacallan (UCHAR) (XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x53) & 4488dfe64dd3Smacallan 0xFD)); 4489dfe64dd3Smacallan} 4490dfe64dd3Smacallan 4491dfe64dd3Smacallan 4492dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4493dfe64dd3Smacallan/* Function : */ 4494dfe64dd3Smacallan/* Input : */ 4495dfe64dd3Smacallan/* Output : */ 4496dfe64dd3Smacallan/* Description : */ 4497dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4498dfe64dd3SmacallanBOOLEAN 4499dfe64dd3SmacallanCheckDualChip(PVB_DEVICE_INFO pVBInfo) 4500dfe64dd3Smacallan{ 4501dfe64dd3Smacallan /* Check H/W trap that 2nd chip is present or not. */ 4502dfe64dd3Smacallan return ((BOOLEAN) 4503dfe64dd3Smacallan (XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x3A) & 4504dfe64dd3Smacallan XGI_MASK_DUAL_CHIP)); 4505dfe64dd3Smacallan} 4506dfe64dd3Smacallan 4507dfe64dd3Smacallan 4508dfe64dd3Smacallan 4509dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4510dfe64dd3Smacallan/* Function : SetDualChipRegs */ 4511dfe64dd3Smacallan/* Input : */ 4512dfe64dd3Smacallan/* Output : */ 4513dfe64dd3Smacallan/* Description : */ 4514dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4515dfe64dd3Smacallanvoid 4516dfe64dd3SmacallanSetDualChipRegs(PXGI_HW_DEVICE_INFO HwDeviceExtension, 4517dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 4518dfe64dd3Smacallan{ 4519dfe64dd3Smacallan 4520dfe64dd3Smacallan#ifdef LINUX_XF86 4521dfe64dd3Smacallan USHORT BaseAddr2nd = (USHORT) (ULONG) HwDeviceExtension->pj2ndIOAddress; 4522dfe64dd3Smacallan#else 4523dfe64dd3Smacallan USHORT BaseAddr2nd = (USHORT) HwDeviceExtension->pj2ndIOAddress; 4524dfe64dd3Smacallan#endif 4525dfe64dd3Smacallan USHORT XGINew_P3CC = pVBInfo->BaseAddr + MISC_OUTPUT_REG_READ_PORT; 4526dfe64dd3Smacallan USHORT XGINew_2ndP3CE = BaseAddr2nd + GRAPH_ADDRESS_PORT; 4527dfe64dd3Smacallan USHORT XGINew_2ndP3C4 = BaseAddr2nd + SEQ_ADDRESS_PORT; 4528dfe64dd3Smacallan USHORT XGINew_2ndP3C2 = BaseAddr2nd + MISC_OUTPUT_REG_WRITE_PORT; 4529dfe64dd3Smacallan UCHAR tempal, i; 4530dfe64dd3Smacallan pVBInfo->BaseAddr = (USHORT) HwDeviceExtension->pjIOAddress; 4531dfe64dd3Smacallan for (i = 0x00; i <= 0x04; i++) { /* SR0 - SR4 */ 4532dfe64dd3Smacallan tempal = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, i); 4533dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, i, tempal); 4534dfe64dd3Smacallan } 4535dfe64dd3Smacallan for (i = 0x00; i <= 0x08; i++) { /* GR0 - GR8 */ 4536dfe64dd3Smacallan tempal = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3ce, i); 4537dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3CE, i, tempal); 4538dfe64dd3Smacallan } 4539dfe64dd3Smacallan /* OpenKey in 2nd chip */ 4540dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, 0x05, 0x86); 4541dfe64dd3Smacallan 4542dfe64dd3Smacallan /* Copy SR06 to 2nd chip */ 4543dfe64dd3Smacallan tempal = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x06); 4544dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, 0x06, tempal); 4545dfe64dd3Smacallan 4546dfe64dd3Smacallan /* Copy SR21 to 2nd chip */ 4547dfe64dd3Smacallan tempal = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x21); 4548dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, 0x21, tempal); 4549dfe64dd3Smacallan 4550dfe64dd3Smacallan /* Miscellaneous reg(input port 3cch,output port 3c2h) */ 4551dfe64dd3Smacallan tempal = (UCHAR) XGI_GetRegByte((XGIIOADDRESS) XGINew_P3CC); /* 3cc */ 4552dfe64dd3Smacallan XGI_SetRegByte((XGIIOADDRESS) XGINew_2ndP3C2, tempal); 4553dfe64dd3Smacallan 4554dfe64dd3Smacallan /* Close key in 2nd chip */ 4555dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) XGINew_2ndP3C4, 0x05, 0x00); 4556dfe64dd3Smacallan} 4557dfe64dd3Smacallan 4558dfe64dd3Smacallan 4559dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4560dfe64dd3Smacallan/* Function : XGI_SetCRT2Group301 */ 4561dfe64dd3Smacallan/* Input : */ 4562dfe64dd3Smacallan/* Output : */ 4563dfe64dd3Smacallan/* Description : */ 4564dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4565dfe64dd3SmacallanBOOLEAN 4566dfe64dd3SmacallanXGI_SetCRT2Group301(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension, 4567dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 4568dfe64dd3Smacallan{ 4569dfe64dd3Smacallan USHORT tempbx, ModeIdIndex, RefreshRateTableIndex; 4570dfe64dd3Smacallan USHORT temp_mode_no; 4571dfe64dd3Smacallan 4572dfe64dd3Smacallan tempbx = pVBInfo->VBInfo; 4573dfe64dd3Smacallan pVBInfo->SetFlag |= ProgrammingCRT2; 4574dfe64dd3Smacallan 4575dfe64dd3Smacallan temp_mode_no = ModeNo; 4576dfe64dd3Smacallan XGI_SearchModeID(pVBInfo->SModeIDTable, pVBInfo->EModeIDTable, 0x11, 4577dfe64dd3Smacallan &temp_mode_no, &ModeIdIndex); 4578dfe64dd3Smacallan 4579dfe64dd3Smacallan 4580dfe64dd3Smacallan pVBInfo->SelectCRT2Rate = 4; 4581dfe64dd3Smacallan RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo, ModeIdIndex, pVBInfo); 4582dfe64dd3Smacallan XGI_SaveCRT2Info(ModeNo, pVBInfo); 4583dfe64dd3Smacallan XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo); 4584dfe64dd3Smacallan XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo); 4585dfe64dd3Smacallan XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension, 4586dfe64dd3Smacallan RefreshRateTableIndex, pVBInfo); 4587dfe64dd3Smacallan XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension, 4588dfe64dd3Smacallan RefreshRateTableIndex, pVBInfo); 4589dfe64dd3Smacallan XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension, 4590dfe64dd3Smacallan RefreshRateTableIndex, pVBInfo); 4591dfe64dd3Smacallan XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex, 4592dfe64dd3Smacallan HwDeviceExtension, pVBInfo); 4593dfe64dd3Smacallan XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension, 4594dfe64dd3Smacallan RefreshRateTableIndex, pVBInfo); 4595dfe64dd3Smacallan XGI_SetTap4Regs(pVBInfo); 4596dfe64dd3Smacallan XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo); 4597dfe64dd3Smacallan XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex, 4598dfe64dd3Smacallan HwDeviceExtension, pVBInfo); 4599dfe64dd3Smacallan XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo); 4600dfe64dd3Smacallan XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo); 4601dfe64dd3Smacallan XGI_AutoThreshold(pVBInfo); 4602dfe64dd3Smacallan return 1; 4603dfe64dd3Smacallan} 4604dfe64dd3Smacallan 4605dfe64dd3Smacallan 4606dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4607dfe64dd3Smacallan/* Function : XGI_AutoThreshold */ 4608dfe64dd3Smacallan/* Input : */ 4609dfe64dd3Smacallan/* Output : */ 4610dfe64dd3Smacallan/* Description : */ 4611dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4612dfe64dd3Smacallanvoid 4613dfe64dd3SmacallanXGI_AutoThreshold(PVB_DEVICE_INFO pVBInfo) 4614dfe64dd3Smacallan{ 4615dfe64dd3Smacallan if (!(pVBInfo->SetFlag & Win9xDOSMode)) 4616dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x01, 0x40); 4617dfe64dd3Smacallan} 4618dfe64dd3Smacallan 4619dfe64dd3Smacallan 4620dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4621dfe64dd3Smacallan/* Function : XGI_SaveCRT2Info */ 4622dfe64dd3Smacallan/* Input : */ 4623dfe64dd3Smacallan/* Output : */ 4624dfe64dd3Smacallan/* Description : */ 4625dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4626dfe64dd3Smacallanvoid 4627dfe64dd3SmacallanXGI_SaveCRT2Info(USHORT ModeNo, PVB_DEVICE_INFO pVBInfo) 4628dfe64dd3Smacallan{ 4629dfe64dd3Smacallan USHORT temp1, temp2; 4630dfe64dd3Smacallan 4631dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x34, ModeNo); /* reserve CR34 for CRT1 Mode No */ 4632dfe64dd3Smacallan temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8; 4633dfe64dd3Smacallan temp2 = ~(SetInSlaveMode >> 8); 4634dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x31, temp2, temp1); 4635dfe64dd3Smacallan} 4636dfe64dd3Smacallan 4637dfe64dd3Smacallan 4638dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4639dfe64dd3Smacallan/* Function : XGI_GetCRT2ResInfo */ 4640dfe64dd3Smacallan/* Input : */ 4641dfe64dd3Smacallan/* Output : */ 4642dfe64dd3Smacallan/* Description : */ 4643dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4644dfe64dd3Smacallanvoid 4645dfe64dd3SmacallanXGI_GetCRT2ResInfo(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 4646dfe64dd3Smacallan{ 4647dfe64dd3Smacallan unsigned xres; 4648dfe64dd3Smacallan unsigned yres; 4649dfe64dd3Smacallan 4650dfe64dd3Smacallan 4651dfe64dd3Smacallan get_mode_xres_yres(ModeNo, ModeIdIndex, pVBInfo, &xres, &yres); 4652dfe64dd3Smacallan 4653dfe64dd3Smacallan if ((pVBInfo->VBInfo & SetCRT2ToLCD) 4654dfe64dd3Smacallan && !(pVBInfo->LCDInfo & (EnableScalingLCD | LCDNonExpanding))) { 4655dfe64dd3Smacallan switch (pVBInfo->LCDResInfo) { 4656dfe64dd3Smacallan case Panel1600x1200: 4657dfe64dd3Smacallan if (!(pVBInfo->LCDInfo & LCDVESATiming) && (yres == 1024)) { 4658dfe64dd3Smacallan yres = 1056; 4659dfe64dd3Smacallan } 4660dfe64dd3Smacallan break; 4661dfe64dd3Smacallan 4662dfe64dd3Smacallan 4663dfe64dd3Smacallan case Panel1280x1024: 4664dfe64dd3Smacallan if (yres == 400) 4665dfe64dd3Smacallan yres = 405; 4666dfe64dd3Smacallan else if (yres == 350) 4667dfe64dd3Smacallan yres = 360; 4668dfe64dd3Smacallan else if ((pVBInfo->LCDInfo & LCDVESATiming) && (yres == 360)) { 4669dfe64dd3Smacallan yres = 375; 4670dfe64dd3Smacallan } 4671dfe64dd3Smacallan break; 4672dfe64dd3Smacallan 4673dfe64dd3Smacallan 4674dfe64dd3Smacallan case Panel1024x768: 4675dfe64dd3Smacallan if (!(pVBInfo->LCDInfo & (LCDVESATiming | LCDNonExpanding))) { 4676dfe64dd3Smacallan if (yres == 350) { 4677dfe64dd3Smacallan yres = 357; 4678dfe64dd3Smacallan } 4679dfe64dd3Smacallan else if (yres == 400) { 4680dfe64dd3Smacallan yres = 420; 4681dfe64dd3Smacallan } 4682dfe64dd3Smacallan else if (yres == 480) { 4683dfe64dd3Smacallan yres = 525; 4684dfe64dd3Smacallan } 4685dfe64dd3Smacallan } 4686dfe64dd3Smacallan 4687dfe64dd3Smacallan break; 4688dfe64dd3Smacallan } 4689dfe64dd3Smacallan 4690dfe64dd3Smacallan if (xres == 720) 4691dfe64dd3Smacallan xres = 640; 4692dfe64dd3Smacallan } 4693dfe64dd3Smacallan 4694dfe64dd3Smacallan pVBInfo->VGAHDE = xres; 4695dfe64dd3Smacallan pVBInfo->HDE = xres; 4696dfe64dd3Smacallan pVBInfo->VGAVDE = yres; 4697dfe64dd3Smacallan pVBInfo->VDE = yres; 4698dfe64dd3Smacallan} 4699dfe64dd3Smacallan 4700dfe64dd3Smacallan 4701dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4702dfe64dd3Smacallan/* Function : XGI_IsLCDDualLink */ 4703dfe64dd3Smacallan/* Input : */ 4704dfe64dd3Smacallan/* Output : */ 4705dfe64dd3Smacallan/* Description : */ 4706dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4707dfe64dd3SmacallanBOOLEAN 4708dfe64dd3SmacallanXGI_IsLCDDualLink(PVB_DEVICE_INFO pVBInfo) 4709dfe64dd3Smacallan{ 4710dfe64dd3Smacallan return (((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) != 0) 4711dfe64dd3Smacallan && ((pVBInfo->LCDInfo & SetLCDDualLink) != 0)); 4712dfe64dd3Smacallan} 4713dfe64dd3Smacallan 4714dfe64dd3Smacallan 4715dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4716dfe64dd3Smacallan/* Function : XGI_GetCRT2Data */ 4717dfe64dd3Smacallan/* Input : */ 4718dfe64dd3Smacallan/* Output : */ 4719dfe64dd3Smacallan/* Description : */ 4720dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4721dfe64dd3Smacallanvoid 4722dfe64dd3SmacallanXGI_GetCRT2Data(USHORT ModeNo, USHORT ModeIdIndex, 4723dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 4724dfe64dd3Smacallan{ 4725dfe64dd3Smacallan USHORT tempax = 0, tempbx, modeflag, resinfo; 4726dfe64dd3Smacallan#ifndef LINUX_XF86 4727dfe64dd3Smacallan USHORT CRT2Index, ResIndex; 4728dfe64dd3Smacallan#endif 4729dfe64dd3Smacallan 4730dfe64dd3Smacallan XGI_LCDDataStruct *LCDPtr = NULL; 4731dfe64dd3Smacallan XGI_TVDataStruct *TVPtr = NULL; 4732dfe64dd3Smacallan 4733dfe64dd3Smacallan if (ModeNo <= 0x13) { 4734dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */ 4735dfe64dd3Smacallan resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo; 4736dfe64dd3Smacallan } 4737dfe64dd3Smacallan else { 4738dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */ 4739dfe64dd3Smacallan resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; 4740dfe64dd3Smacallan } 4741dfe64dd3Smacallan 4742dfe64dd3Smacallan pVBInfo->NewFlickerMode = 0; 4743dfe64dd3Smacallan pVBInfo->RVBHRS = 50; 4744dfe64dd3Smacallan 4745dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) { 4746dfe64dd3Smacallan XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex, 4747dfe64dd3Smacallan pVBInfo); 4748dfe64dd3Smacallan return; 4749dfe64dd3Smacallan } 4750dfe64dd3Smacallan 4751dfe64dd3Smacallan tempbx = 4; 4752dfe64dd3Smacallan 4753dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { 4754dfe64dd3Smacallan LCDPtr = 4755dfe64dd3Smacallan (XGI_LCDDataStruct *) XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, 4756dfe64dd3Smacallan RefreshRateTableIndex, 4757dfe64dd3Smacallan pVBInfo); 4758dfe64dd3Smacallan 4759dfe64dd3Smacallan PDEBUG(ErrorF 4760dfe64dd3Smacallan ("C code setmode: ModeNo: 0x%08lX VGAHT:0x%081X \n", ModeNo, 4761dfe64dd3Smacallan LCDPtr->VGAHT)); 4762dfe64dd3Smacallan pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX; 4763dfe64dd3Smacallan pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT; 4764dfe64dd3Smacallan pVBInfo->VGAHT = LCDPtr->VGAHT; 4765dfe64dd3Smacallan pVBInfo->VGAVT = LCDPtr->VGAVT; 4766dfe64dd3Smacallan pVBInfo->HT = LCDPtr->LCDHT; 4767dfe64dd3Smacallan pVBInfo->VT = LCDPtr->LCDVT; 4768dfe64dd3Smacallan 4769dfe64dd3Smacallan if (pVBInfo->LCDResInfo == Panel1024x768) { 4770dfe64dd3Smacallan tempax = 1024; 4771dfe64dd3Smacallan tempbx = 768; 4772dfe64dd3Smacallan 4773dfe64dd3Smacallan if (!(pVBInfo->LCDInfo & LCDVESATiming)) { 4774dfe64dd3Smacallan if (pVBInfo->VGAVDE == 357) 4775dfe64dd3Smacallan tempbx = 527; 4776dfe64dd3Smacallan else if (pVBInfo->VGAVDE == 420) 4777dfe64dd3Smacallan tempbx = 620; 4778dfe64dd3Smacallan else if (pVBInfo->VGAVDE == 525) 4779dfe64dd3Smacallan tempbx = 775; 4780dfe64dd3Smacallan else if (pVBInfo->VGAVDE == 600) 4781dfe64dd3Smacallan tempbx = 775; 4782dfe64dd3Smacallan /* else if(pVBInfo->VGAVDE==350) tempbx=560; */ 4783dfe64dd3Smacallan /* else if(pVBInfo->VGAVDE==400) tempbx=640; */ 4784dfe64dd3Smacallan else 4785dfe64dd3Smacallan tempbx = 768; 4786dfe64dd3Smacallan } 4787dfe64dd3Smacallan else 4788dfe64dd3Smacallan tempbx = 768; 4789dfe64dd3Smacallan } 4790dfe64dd3Smacallan else if (pVBInfo->LCDResInfo == Panel1024x768x75) { 4791dfe64dd3Smacallan tempax = 1024; 4792dfe64dd3Smacallan tempbx = 768; 4793dfe64dd3Smacallan } 4794dfe64dd3Smacallan else if (pVBInfo->LCDResInfo == Panel1280x1024) { 4795dfe64dd3Smacallan tempax = 1280; 4796dfe64dd3Smacallan if (pVBInfo->VGAVDE == 360) 4797dfe64dd3Smacallan tempbx = 768; 4798dfe64dd3Smacallan else if (pVBInfo->VGAVDE == 375) 4799dfe64dd3Smacallan tempbx = 800; 4800dfe64dd3Smacallan else if (pVBInfo->VGAVDE == 405) 4801dfe64dd3Smacallan tempbx = 864; 4802dfe64dd3Smacallan else 4803dfe64dd3Smacallan tempbx = 1024; 4804dfe64dd3Smacallan } 4805dfe64dd3Smacallan else if (pVBInfo->LCDResInfo == Panel1280x1024x75) { 4806dfe64dd3Smacallan tempax = 1280; 4807dfe64dd3Smacallan tempbx = 1024; 4808dfe64dd3Smacallan } 4809dfe64dd3Smacallan else if (pVBInfo->LCDResInfo == Panel1280x960) { 4810dfe64dd3Smacallan tempax = 1280; 4811dfe64dd3Smacallan if (pVBInfo->VGAVDE == 350) 4812dfe64dd3Smacallan tempbx = 700; 4813dfe64dd3Smacallan else if (pVBInfo->VGAVDE == 400) 4814dfe64dd3Smacallan tempbx = 800; 4815dfe64dd3Smacallan else if (pVBInfo->VGAVDE == 1024) 4816dfe64dd3Smacallan tempbx = 960; 4817dfe64dd3Smacallan else 4818dfe64dd3Smacallan tempbx = 960; 4819dfe64dd3Smacallan } 4820dfe64dd3Smacallan else if (pVBInfo->LCDResInfo == Panel1400x1050) { 4821dfe64dd3Smacallan tempax = 1400; 4822dfe64dd3Smacallan tempbx = 1050; 4823dfe64dd3Smacallan 4824dfe64dd3Smacallan if (pVBInfo->VGAVDE == 1024) { 4825dfe64dd3Smacallan tempax = 1280; 4826dfe64dd3Smacallan tempbx = 1024; 4827dfe64dd3Smacallan } 4828dfe64dd3Smacallan } 4829dfe64dd3Smacallan else if (pVBInfo->LCDResInfo == Panel1600x1200) { 4830dfe64dd3Smacallan tempax = 1600; 4831dfe64dd3Smacallan tempbx = 1200; /* alan 10/14/2003 */ 4832dfe64dd3Smacallan if (!(pVBInfo->LCDInfo & LCDVESATiming)) { 4833dfe64dd3Smacallan if (pVBInfo->VGAVDE == 350) 4834dfe64dd3Smacallan tempbx = 875; 4835dfe64dd3Smacallan else if (pVBInfo->VGAVDE == 400) 4836dfe64dd3Smacallan tempbx = 1000; 4837dfe64dd3Smacallan } 4838dfe64dd3Smacallan } 4839dfe64dd3Smacallan 4840dfe64dd3Smacallan if (pVBInfo->LCDInfo & (LCDNonExpanding | EnableScalingLCD)) { 4841dfe64dd3Smacallan tempax = pVBInfo->VGAHDE; 4842dfe64dd3Smacallan tempbx = pVBInfo->VGAVDE; 4843dfe64dd3Smacallan } 4844dfe64dd3Smacallan 4845dfe64dd3Smacallan pVBInfo->HDE = tempax; 4846dfe64dd3Smacallan pVBInfo->VDE = tempbx; 4847dfe64dd3Smacallan return; 4848dfe64dd3Smacallan } 4849dfe64dd3Smacallan 4850dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToTV)) { 4851dfe64dd3Smacallan tempbx = 4; 4852dfe64dd3Smacallan TVPtr = 4853dfe64dd3Smacallan (XGI_TVDataStruct *) XGI_GetTVPtr(tempbx, ModeNo, ModeIdIndex, 4854dfe64dd3Smacallan RefreshRateTableIndex, pVBInfo); 4855dfe64dd3Smacallan pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX; 4856dfe64dd3Smacallan pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT; 4857dfe64dd3Smacallan pVBInfo->VGAHT = TVPtr->VGAHT; 4858dfe64dd3Smacallan pVBInfo->VGAVT = TVPtr->VGAVT; 4859dfe64dd3Smacallan pVBInfo->HDE = TVPtr->TVHDE; 4860dfe64dd3Smacallan pVBInfo->VDE = TVPtr->TVVDE; 4861dfe64dd3Smacallan pVBInfo->RVBHRS = TVPtr->RVBHRS; 4862dfe64dd3Smacallan pVBInfo->NewFlickerMode = TVPtr->FlickerMode; 4863dfe64dd3Smacallan 4864dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 4865dfe64dd3Smacallan if (resinfo == 0x08) 4866dfe64dd3Smacallan pVBInfo->NewFlickerMode = 0x40; 4867dfe64dd3Smacallan else if (resinfo == 0x09) 4868dfe64dd3Smacallan pVBInfo->NewFlickerMode = 0x40; 4869dfe64dd3Smacallan else if (resinfo == 0x12) 4870dfe64dd3Smacallan pVBInfo->NewFlickerMode = 0x40; 4871dfe64dd3Smacallan 4872dfe64dd3Smacallan if (pVBInfo->VGAVDE == 350) 4873dfe64dd3Smacallan pVBInfo->TVInfo |= TVSimuMode; 4874dfe64dd3Smacallan 4875dfe64dd3Smacallan tempax = ExtHiTVHT; 4876dfe64dd3Smacallan tempbx = ExtHiTVVT; 4877dfe64dd3Smacallan 4878dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) { 4879dfe64dd3Smacallan if (pVBInfo->TVInfo & TVSimuMode) { 4880dfe64dd3Smacallan tempax = StHiTVHT; 4881dfe64dd3Smacallan tempbx = StHiTVVT; 4882dfe64dd3Smacallan 4883dfe64dd3Smacallan if (!(modeflag & Charx8Dot)) { 4884dfe64dd3Smacallan tempax = StHiTextTVHT; 4885dfe64dd3Smacallan tempbx = StHiTextTVVT; 4886dfe64dd3Smacallan } 4887dfe64dd3Smacallan } 4888dfe64dd3Smacallan } 4889dfe64dd3Smacallan } 4890dfe64dd3Smacallan else if (pVBInfo->VBInfo & SetCRT2ToYPbPr) { 4891dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode750p) { 4892dfe64dd3Smacallan tempax = YPbPrTV750pHT; /* Ext750pTVHT */ 4893dfe64dd3Smacallan tempbx = YPbPrTV750pVT; /* Ext750pTVVT */ 4894dfe64dd3Smacallan } 4895dfe64dd3Smacallan 4896dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode525p) { 4897dfe64dd3Smacallan tempax = YPbPrTV525pHT; /* Ext525pTVHT */ 4898dfe64dd3Smacallan tempbx = YPbPrTV525pVT; /* Ext525pTVVT */ 4899dfe64dd3Smacallan } 4900dfe64dd3Smacallan else if (pVBInfo->TVInfo & SetYPbPrMode525i) { 4901dfe64dd3Smacallan tempax = YPbPrTV525iHT; /* Ext525iTVHT */ 4902dfe64dd3Smacallan tempbx = YPbPrTV525iVT; /* Ext525iTVVT */ 4903dfe64dd3Smacallan if (pVBInfo->TVInfo & NTSC1024x768) 4904dfe64dd3Smacallan tempax = NTSC1024x768HT; 4905dfe64dd3Smacallan } 4906dfe64dd3Smacallan } 4907dfe64dd3Smacallan else { 4908dfe64dd3Smacallan tempax = PALHT; 4909dfe64dd3Smacallan tempbx = PALVT; 4910dfe64dd3Smacallan if (!(pVBInfo->TVInfo & SetPALTV)) { 4911dfe64dd3Smacallan tempax = NTSCHT; 4912dfe64dd3Smacallan tempbx = NTSCVT; 4913dfe64dd3Smacallan if (pVBInfo->TVInfo & NTSC1024x768) 4914dfe64dd3Smacallan tempax = NTSC1024x768HT; 4915dfe64dd3Smacallan } 4916dfe64dd3Smacallan } 4917dfe64dd3Smacallan 4918dfe64dd3Smacallan pVBInfo->HT = tempax; 4919dfe64dd3Smacallan pVBInfo->VT = tempbx; 4920dfe64dd3Smacallan return; 4921dfe64dd3Smacallan } 4922dfe64dd3Smacallan} 4923dfe64dd3Smacallan 4924dfe64dd3Smacallan 4925dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4926dfe64dd3Smacallan/* Function : XGI_SetCRT2VCLK */ 4927dfe64dd3Smacallan/* Input : */ 4928dfe64dd3Smacallan/* Output : */ 4929dfe64dd3Smacallan/* Description : */ 4930dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4931dfe64dd3Smacallanvoid 4932dfe64dd3SmacallanXGI_SetCRT2VCLK(USHORT ModeNo, USHORT ModeIdIndex, 4933dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 4934dfe64dd3Smacallan{ 4935dfe64dd3Smacallan UCHAR di[2]; 4936dfe64dd3Smacallan const unsigned vclkindex = 4937dfe64dd3Smacallan XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex, pVBInfo); 4938dfe64dd3Smacallan 4939dfe64dd3Smacallan XGI_GetVCLKLen(vclkindex, di, pVBInfo); 4940dfe64dd3Smacallan XGI_GetLCDVCLKPtr(di, pVBInfo); 4941dfe64dd3Smacallan 4942dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301) { /* shampoo 0129 *//* 301 */ 4943dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0A, 0x10); 4944dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0B, di[1]); 4945dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0A, di[0]); 4946dfe64dd3Smacallan } 4947dfe64dd3Smacallan else { /* 301b/302b/301lv/302lv */ 4948dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0A, di[0]); 4949dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0B, di[1]); 4950dfe64dd3Smacallan } 4951dfe64dd3Smacallan 4952dfe64dd3Smacallan if ((pVBInfo->LCDInfo & EnableReduceTiming) 4953dfe64dd3Smacallan && (pVBInfo->LCDResInfo == Panel1600x1200)) { 4954dfe64dd3Smacallan if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO == 0x0A) { 4955dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0A, 0x5A); 4956dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0B, 0x24); 4957dfe64dd3Smacallan } 4958dfe64dd3Smacallan } 4959dfe64dd3Smacallan 4960dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x00, 0x12); 4961dfe64dd3Smacallan 4962dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) 4963dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x12, 0x28); 4964dfe64dd3Smacallan else 4965dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x12, 0x08); 4966dfe64dd3Smacallan} 4967dfe64dd3Smacallan 4968dfe64dd3Smacallan 4969dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4970dfe64dd3Smacallan/* Function : XGI_GETLCDVCLKPtr */ 4971dfe64dd3Smacallan/* Input : */ 4972dfe64dd3Smacallan/* Output : al -> VCLK Index */ 4973dfe64dd3Smacallan/* Description : */ 4974dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4975dfe64dd3Smacallanvoid 4976dfe64dd3SmacallanXGI_GetLCDVCLKPtr(UCHAR *di, PVB_DEVICE_INFO pVBInfo) 4977dfe64dd3Smacallan{ 4978dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { 4979dfe64dd3Smacallan if ((pVBInfo->IF_DEF_ScaleLCD != 1) 4980dfe64dd3Smacallan || !(pVBInfo->LCDInfo & EnableScalingLCD)) { 4981dfe64dd3Smacallan const unsigned index = XGI_GetLCDCapPtr1(pVBInfo); 4982dfe64dd3Smacallan 4983dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */ 4984dfe64dd3Smacallan di[0] = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1; 4985dfe64dd3Smacallan di[1] = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2; 4986dfe64dd3Smacallan } 4987dfe64dd3Smacallan else { /* LCDA */ 4988dfe64dd3Smacallan di[0] = pVBInfo->LCDCapList[index].LCDA_VCLKData1; 4989dfe64dd3Smacallan di[1] = pVBInfo->LCDCapList[index].LCDA_VCLKData2; 4990dfe64dd3Smacallan } 4991dfe64dd3Smacallan } 4992dfe64dd3Smacallan } 4993dfe64dd3Smacallan 4994dfe64dd3Smacallan return; 4995dfe64dd3Smacallan} 4996dfe64dd3Smacallan 4997dfe64dd3Smacallan 4998dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 4999dfe64dd3Smacallan/* Function : XGI_GetVCLKPtr */ 5000dfe64dd3Smacallan/* Input : */ 5001dfe64dd3Smacallan/* Output : */ 5002dfe64dd3Smacallan/* Description : */ 5003dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5004dfe64dd3Smacallanunsigned 5005dfe64dd3SmacallanXGI_GetVCLKPtr(USHORT RefreshRateTableIndex, USHORT ModeNo, 5006dfe64dd3Smacallan USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 5007dfe64dd3Smacallan{ 5008dfe64dd3Smacallan unsigned vclk; 5009dfe64dd3Smacallan const unsigned modeflag = (ModeNo <= 0x13) 5010dfe64dd3Smacallan ? pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag 5011dfe64dd3Smacallan : pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 5012dfe64dd3Smacallan 5013dfe64dd3Smacallan 5014dfe64dd3Smacallan if ((pVBInfo->SetFlag & ProgrammingCRT2) 5015dfe64dd3Smacallan && (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */ 5016dfe64dd3Smacallan const unsigned index = XGI_GetLCDCapPtr(pVBInfo); 5017dfe64dd3Smacallan vclk = pVBInfo->LCDCapList[index].LCD_VCLK; 5018dfe64dd3Smacallan 5019dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) 5020dfe64dd3Smacallan return vclk; 5021dfe64dd3Smacallan 5022dfe64dd3Smacallan /* {TV} */ 5023dfe64dd3Smacallan if (pVBInfo-> 5024dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 5025dfe64dd3Smacallan VB_XGI301C)) { 5026dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 5027dfe64dd3Smacallan if (pVBInfo->TVInfo & TVSimuMode) { 5028dfe64dd3Smacallan vclk = (modeflag & Charx8Dot) 5029dfe64dd3Smacallan ? HiTVSimuVCLK : HiTVTextVCLK; 5030dfe64dd3Smacallan } 5031dfe64dd3Smacallan else { 5032dfe64dd3Smacallan vclk = (pVBInfo->TVInfo & RPLLDIV2XO) 5033dfe64dd3Smacallan ? HiTVVCLKDIV2 : HiTVVCLK; 5034dfe64dd3Smacallan } 5035dfe64dd3Smacallan 5036dfe64dd3Smacallan return vclk; 5037dfe64dd3Smacallan } 5038dfe64dd3Smacallan else if (pVBInfo->TVInfo & SetYPbPrMode750p) { 5039dfe64dd3Smacallan return YPbPr750pVCLK; 5040dfe64dd3Smacallan } 5041dfe64dd3Smacallan else if (pVBInfo->TVInfo & SetYPbPrMode525p) { 5042dfe64dd3Smacallan return YPbPr525pVCLK; 5043dfe64dd3Smacallan } 5044dfe64dd3Smacallan 5045dfe64dd3Smacallan vclk = NTSC1024VCLK; 5046dfe64dd3Smacallan 5047dfe64dd3Smacallan if (!(pVBInfo->TVInfo & NTSC1024x768)) { 5048dfe64dd3Smacallan vclk = (pVBInfo->TVInfo & RPLLDIV2XO) 5049dfe64dd3Smacallan ? TVVCLKDIV2 : TVVCLK; 5050dfe64dd3Smacallan } 5051dfe64dd3Smacallan 5052dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) 5053dfe64dd3Smacallan return vclk; 5054dfe64dd3Smacallan } 5055dfe64dd3Smacallan } /* {End of VB} */ 5056dfe64dd3Smacallan 5057dfe64dd3Smacallan vclk = XGI_GetRegByte((XGIIOADDRESS) (pVBInfo->P3ca + 0x02)); 5058dfe64dd3Smacallan vclk = (vclk >> 2) & 0x03; 5059dfe64dd3Smacallan 5060dfe64dd3Smacallan /* for Dot8 Scaling LCD */ 5061dfe64dd3Smacallan if ((pVBInfo->LCDInfo & EnableScalingLCD) 5062dfe64dd3Smacallan && (modeflag & Charx8Dot) 5063dfe64dd3Smacallan && ((pVBInfo->IF_DEF_VideoCapture) == 1)) { 5064dfe64dd3Smacallan vclk = VCLK25_175; /* ; set to VCLK25MHz always */ 5065dfe64dd3Smacallan } 5066dfe64dd3Smacallan 5067dfe64dd3Smacallan if (ModeNo <= 0x13) 5068dfe64dd3Smacallan return vclk; 5069dfe64dd3Smacallan 5070dfe64dd3Smacallan return pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK; 5071dfe64dd3Smacallan} 5072dfe64dd3Smacallan 5073dfe64dd3Smacallan 5074dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5075dfe64dd3Smacallan/* Function : XGI_GetVCLKLen */ 5076dfe64dd3Smacallan/* Input : */ 5077dfe64dd3Smacallan/* Output : */ 5078dfe64dd3Smacallan/* Description : */ 5079dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5080dfe64dd3Smacallanvoid 5081dfe64dd3SmacallanXGI_GetVCLKLen(unsigned vclkindex, UCHAR *di, PVB_DEVICE_INFO pVBInfo) 5082dfe64dd3Smacallan{ 5083dfe64dd3Smacallan if (pVBInfo-> 5084dfe64dd3Smacallan VBType & (VB_XGI301 | VB_XGI301B | VB_XGI302B | VB_XGI301LV | 5085dfe64dd3Smacallan VB_XGI302LV | VB_XGI301C)) { 5086dfe64dd3Smacallan if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) 5087dfe64dd3Smacallan && (pVBInfo->SetFlag & ProgrammingCRT2)) { 5088dfe64dd3Smacallan di[0] = XGI_VBVCLKData[vclkindex].SR2B; 5089dfe64dd3Smacallan di[1] = XGI_VBVCLKData[vclkindex].SR2C; 5090dfe64dd3Smacallan } 5091dfe64dd3Smacallan } 5092dfe64dd3Smacallan else { 5093dfe64dd3Smacallan di[0] = XGI_VCLKData[vclkindex].SR2B; 5094dfe64dd3Smacallan di[1] = XGI_VCLKData[vclkindex].SR2C; 5095dfe64dd3Smacallan } 5096dfe64dd3Smacallan} 5097dfe64dd3Smacallan 5098dfe64dd3Smacallan 5099dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5100dfe64dd3Smacallan/* Function : XGI_SetCRT2Offset */ 5101dfe64dd3Smacallan/* Input : */ 5102dfe64dd3Smacallan/* Output : */ 5103dfe64dd3Smacallan/* Description : */ 5104dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5105dfe64dd3Smacallanvoid 5106dfe64dd3SmacallanXGI_SetCRT2Offset(USHORT ModeNo, 5107dfe64dd3Smacallan USHORT ModeIdIndex, USHORT RefreshRateTableIndex, 5108dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 5109dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 5110dfe64dd3Smacallan{ 5111dfe64dd3Smacallan USHORT offset; 5112dfe64dd3Smacallan UCHAR temp; 5113dfe64dd3Smacallan 5114dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) { 5115dfe64dd3Smacallan return; 5116dfe64dd3Smacallan } 5117dfe64dd3Smacallan 5118dfe64dd3Smacallan offset = 5119dfe64dd3Smacallan XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex, 5120dfe64dd3Smacallan HwDeviceExtension, pVBInfo); 5121dfe64dd3Smacallan temp = (UCHAR) (offset & 0xFF); 5122dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, temp); 5123dfe64dd3Smacallan temp = (UCHAR) ((offset & 0xFF00) >> 8); 5124dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x09, temp); 5125dfe64dd3Smacallan temp = (UCHAR) (((offset >> 3) & 0xFF) + 1); 5126dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x03, temp); 5127dfe64dd3Smacallan} 5128dfe64dd3Smacallan 5129dfe64dd3Smacallan 5130dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5131dfe64dd3Smacallan/* Function : XGI_GetOffset */ 5132dfe64dd3Smacallan/* Input : */ 5133dfe64dd3Smacallan/* Output : */ 5134dfe64dd3Smacallan/* Description : */ 5135dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5136dfe64dd3SmacallanUSHORT 5137dfe64dd3SmacallanXGI_GetOffset(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, 5138dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) 5139dfe64dd3Smacallan{ 5140dfe64dd3Smacallan USHORT temp, 5141dfe64dd3Smacallan colordepth, 5142dfe64dd3Smacallan modeinfo, index, infoflag, 5143dfe64dd3Smacallan ColorDepth[] = { 0x01 , 0x02 , 0x04 } ; 5144dfe64dd3Smacallan 5145dfe64dd3Smacallan modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo; 5146dfe64dd3Smacallan if (ModeNo <= 0x14) 5147dfe64dd3Smacallan infoflag = 0; 5148dfe64dd3Smacallan else 5149dfe64dd3Smacallan infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag; 5150dfe64dd3Smacallan 5151dfe64dd3Smacallan 5152dfe64dd3Smacallan index = (modeinfo >> 8) & 0xFF; 5153dfe64dd3Smacallan 5154dfe64dd3Smacallan temp = pVBInfo->ScreenOffset[index]; 5155dfe64dd3Smacallan 5156dfe64dd3Smacallan if (infoflag & InterlaceMode) { 5157dfe64dd3Smacallan temp = temp << 1; 5158dfe64dd3Smacallan } 5159dfe64dd3Smacallan 5160dfe64dd3Smacallan colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo); 5161dfe64dd3Smacallan 5162dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 5163dfe64dd3Smacallan if ( ( ModeNo >= 0x7C ) && ( ModeNo <= 0x7E ) ) 5164dfe64dd3Smacallan { 5165dfe64dd3Smacallan temp = ModeNo - 0x7C ; 5166dfe64dd3Smacallan colordepth = ColorDepth[ temp ] ; 5167dfe64dd3Smacallan temp = 0x6B ; 5168dfe64dd3Smacallan if ( infoflag & InterlaceMode ) 5169dfe64dd3Smacallan { 5170dfe64dd3Smacallan temp = temp << 1 ; 5171dfe64dd3Smacallan } 5172dfe64dd3Smacallan return( temp * colordepth ) ; 5173dfe64dd3Smacallan } 5174dfe64dd3Smacallan else 5175dfe64dd3Smacallan return( temp * colordepth ) ; 5176dfe64dd3Smacallan 5177dfe64dd3Smacallan /* 5178dfe64dd3Smacallan if ((ModeNo >= 0x26) && (ModeNo <= 0x28)) { 5179dfe64dd3Smacallan return (temp * colordepth + (colordepth >> 1)); 5180dfe64dd3Smacallan } 5181dfe64dd3Smacallan else 5182dfe64dd3Smacallan return (temp * colordepth); */ 5183dfe64dd3Smacallan} 5184dfe64dd3Smacallan 5185dfe64dd3Smacallan 5186dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5187dfe64dd3Smacallan/* Function : XGI_SetCRT2FIFO */ 5188dfe64dd3Smacallan/* Input : */ 5189dfe64dd3Smacallan/* Output : */ 5190dfe64dd3Smacallan/* Description : */ 5191dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5192dfe64dd3Smacallanvoid 5193dfe64dd3SmacallanXGI_SetCRT2FIFO(PVB_DEVICE_INFO pVBInfo) 5194dfe64dd3Smacallan{ 5195dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x01, 0x3B); /* threshold high ,disable auto threshold */ 5196dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04); /* threshold low default 04h */ 5197dfe64dd3Smacallan} 5198dfe64dd3Smacallan 5199dfe64dd3Smacallan 5200dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5201dfe64dd3Smacallan/* Function : XGI_PreSetGroup1 */ 5202dfe64dd3Smacallan/* Input : */ 5203dfe64dd3Smacallan/* Output : */ 5204dfe64dd3Smacallan/* Description : */ 5205dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5206dfe64dd3Smacallanvoid 5207dfe64dd3SmacallanXGI_PreSetGroup1(USHORT ModeNo, USHORT ModeIdIndex, 5208dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 5209dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 5210dfe64dd3Smacallan{ 5211dfe64dd3Smacallan USHORT tempcx = 0, CRT1Index = 0, resinfo = 0; 5212dfe64dd3Smacallan#ifndef LINUX_XF86 5213dfe64dd3Smacallan USHORT temp = 0, tempax = 0, tempbx = 0, pushbx = 0, modeflag; 5214dfe64dd3Smacallan#endif 5215dfe64dd3Smacallan 5216dfe64dd3Smacallan if (ModeNo > 0x13) { 5217dfe64dd3Smacallan CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; 5218dfe64dd3Smacallan CRT1Index &= IndexMask; 5219dfe64dd3Smacallan resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; 5220dfe64dd3Smacallan } 5221dfe64dd3Smacallan 5222dfe64dd3Smacallan XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex, 5223dfe64dd3Smacallan HwDeviceExtension, pVBInfo); 5224dfe64dd3Smacallan XGI_SetCRT2FIFO(pVBInfo); 5225dfe64dd3Smacallan /* XGI_SetCRT2Sync(ModeNo,RefreshRateTableIndex); */ 5226dfe64dd3Smacallan 5227dfe64dd3Smacallan for (tempcx = 4; tempcx < 7; tempcx++) { 5228dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, tempcx, 0x0); 5229dfe64dd3Smacallan } 5230dfe64dd3Smacallan 5231dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */ 5232dfe64dd3Smacallan} 5233dfe64dd3Smacallan 5234dfe64dd3Smacallan 5235dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5236dfe64dd3Smacallan/* Function : XGI_SetGroup1 */ 5237dfe64dd3Smacallan/* Input : */ 5238dfe64dd3Smacallan/* Output : */ 5239dfe64dd3Smacallan/* Description : */ 5240dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5241dfe64dd3Smacallanvoid 5242dfe64dd3SmacallanXGI_SetGroup1(USHORT ModeNo, USHORT ModeIdIndex, 5243dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 5244dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 5245dfe64dd3Smacallan{ 5246dfe64dd3Smacallan USHORT temp = 0, 5247dfe64dd3Smacallan tempax = 0, 5248dfe64dd3Smacallan tempbx = 0, 5249dfe64dd3Smacallan tempcx = 0, pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0; 5250dfe64dd3Smacallan 5251dfe64dd3Smacallan if (ModeNo > 0x13) { 5252dfe64dd3Smacallan CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; 5253dfe64dd3Smacallan CRT1Index &= IndexMask; 5254dfe64dd3Smacallan resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; 5255dfe64dd3Smacallan } 5256dfe64dd3Smacallan 5257dfe64dd3Smacallan if (ModeNo <= 0x13) { 5258dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; 5259dfe64dd3Smacallan } 5260dfe64dd3Smacallan else { 5261dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 5262dfe64dd3Smacallan } 5263dfe64dd3Smacallan 5264dfe64dd3Smacallan /* bainy change table name */ 5265dfe64dd3Smacallan if (modeflag & HalfDCLK) { 5266dfe64dd3Smacallan temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */ 5267dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, temp); 5268dfe64dd3Smacallan temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4; 5269dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x09, ~0x0F0, 5270dfe64dd3Smacallan temp); 5271dfe64dd3Smacallan temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */ 5272dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0A, temp); 5273dfe64dd3Smacallan tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2; 5274dfe64dd3Smacallan pushbx = pVBInfo->VGAHDE / 2 + 16; 5275dfe64dd3Smacallan tempcx = tempcx >> 1; 5276dfe64dd3Smacallan tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */ 5277dfe64dd3Smacallan tempcx += tempbx; 5278dfe64dd3Smacallan 5279dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) { 5280dfe64dd3Smacallan tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4]; 5281dfe64dd3Smacallan tempbx |= 5282dfe64dd3Smacallan ((pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] & 0xC0) << 2); 5283dfe64dd3Smacallan tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */ 5284dfe64dd3Smacallan tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5]; 5285dfe64dd3Smacallan tempcx &= 0x1F; 5286dfe64dd3Smacallan temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15]; 5287dfe64dd3Smacallan temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */ 5288dfe64dd3Smacallan tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */ 5289dfe64dd3Smacallan } 5290dfe64dd3Smacallan 5291dfe64dd3Smacallan tempbx += 4; 5292dfe64dd3Smacallan tempcx += 4; 5293dfe64dd3Smacallan 5294dfe64dd3Smacallan if (tempcx > (pVBInfo->VGAHT / 2)) 5295dfe64dd3Smacallan tempcx = pVBInfo->VGAHT / 2; 5296dfe64dd3Smacallan 5297dfe64dd3Smacallan temp = tempbx & 0x00FF; 5298dfe64dd3Smacallan 5299dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0B, temp); 5300dfe64dd3Smacallan } 5301dfe64dd3Smacallan else { 5302dfe64dd3Smacallan temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */ 5303dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, temp); 5304dfe64dd3Smacallan temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4; 5305dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x09, ~0x0F0, 5306dfe64dd3Smacallan temp); 5307dfe64dd3Smacallan temp = (pVBInfo->VGAHDE + 16) & 0x0FF; /* BTVGA2HDEE 0x0A,0x0C */ 5308dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0A, temp); 5309dfe64dd3Smacallan tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */ 5310dfe64dd3Smacallan pushbx = pVBInfo->VGAHDE + 16; 5311dfe64dd3Smacallan tempcx = tempcx >> 1; 5312dfe64dd3Smacallan tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */ 5313dfe64dd3Smacallan tempcx += tempbx; 5314dfe64dd3Smacallan 5315dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) { 5316dfe64dd3Smacallan tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3]; 5317dfe64dd3Smacallan tempbx |= 5318dfe64dd3Smacallan ((pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5] & 0xC0) << 2); 5319dfe64dd3Smacallan tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */ 5320dfe64dd3Smacallan tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4]; 5321dfe64dd3Smacallan tempcx &= 0x1F; 5322dfe64dd3Smacallan temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6]; 5323dfe64dd3Smacallan temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */ 5324dfe64dd3Smacallan tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */ 5325dfe64dd3Smacallan tempbx += 16; 5326dfe64dd3Smacallan tempcx += 16; 5327dfe64dd3Smacallan } 5328dfe64dd3Smacallan 5329dfe64dd3Smacallan if (tempcx > pVBInfo->VGAHT) 5330dfe64dd3Smacallan tempcx = pVBInfo->VGAHT; 5331dfe64dd3Smacallan 5332dfe64dd3Smacallan temp = tempbx & 0x00FF; 5333dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0B, temp); 5334dfe64dd3Smacallan } 5335dfe64dd3Smacallan 5336dfe64dd3Smacallan tempax = (tempax & 0x00FF) | (tempbx & 0xFF00); 5337dfe64dd3Smacallan tempbx = pushbx; 5338dfe64dd3Smacallan tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4); 5339dfe64dd3Smacallan tempax |= (tempbx & 0xFF00); 5340dfe64dd3Smacallan temp = (tempax & 0xFF00) >> 8; 5341dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0C, temp); 5342dfe64dd3Smacallan temp = tempcx & 0x00FF; 5343dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0D, temp); 5344dfe64dd3Smacallan tempcx = (pVBInfo->VGAVT - 1); 5345dfe64dd3Smacallan temp = tempcx & 0x00FF; 5346dfe64dd3Smacallan 5347dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0E, temp); 5348dfe64dd3Smacallan tempbx = pVBInfo->VGAVDE - 1; 5349dfe64dd3Smacallan temp = tempbx & 0x00FF; 5350dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0F, temp); 5351dfe64dd3Smacallan temp = ((tempbx & 0xFF00) << 3) >> 8; 5352dfe64dd3Smacallan temp |= ((tempcx & 0xFF00) >> 8); 5353dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x12, temp); 5354dfe64dd3Smacallan 5355dfe64dd3Smacallan tempax = pVBInfo->VGAVDE; 5356dfe64dd3Smacallan tempbx = pVBInfo->VGAVDE; 5357dfe64dd3Smacallan tempcx = pVBInfo->VGAVT; 5358dfe64dd3Smacallan tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1; /* BTVGA2VRS 0x10,0x11 */ 5359dfe64dd3Smacallan tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1; /* BTVGA2VRE 0x11 */ 5360dfe64dd3Smacallan 5361dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) { 5362dfe64dd3Smacallan tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10]; 5363dfe64dd3Smacallan temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9]; 5364dfe64dd3Smacallan 5365dfe64dd3Smacallan if (temp & 0x04) 5366dfe64dd3Smacallan tempbx |= 0x0100; 5367dfe64dd3Smacallan 5368dfe64dd3Smacallan if (temp & 0x080) 5369dfe64dd3Smacallan tempbx |= 0x0200; 5370dfe64dd3Smacallan 5371dfe64dd3Smacallan temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14]; 5372dfe64dd3Smacallan 5373dfe64dd3Smacallan if (temp & 0x08) 5374dfe64dd3Smacallan tempbx |= 0x0400; 5375dfe64dd3Smacallan 5376dfe64dd3Smacallan temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11]; 5377dfe64dd3Smacallan tempcx = (tempcx & 0xFF00) | (temp & 0x00FF); 5378dfe64dd3Smacallan } 5379dfe64dd3Smacallan 5380dfe64dd3Smacallan temp = tempbx & 0x00FF; 5381dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x10, temp); 5382dfe64dd3Smacallan temp = ((tempbx & 0xFF00) >> 8) << 4; 5383dfe64dd3Smacallan temp = ((tempcx & 0x000F) | (temp)); 5384dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x11, temp); 5385dfe64dd3Smacallan tempax = 0; 5386dfe64dd3Smacallan 5387dfe64dd3Smacallan if (modeflag & DoubleScanMode) 5388dfe64dd3Smacallan tempax |= 0x80; 5389dfe64dd3Smacallan 5390dfe64dd3Smacallan if (modeflag & HalfDCLK) 5391dfe64dd3Smacallan tempax |= 0x40; 5392dfe64dd3Smacallan 5393dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax); 5394dfe64dd3Smacallan} 5395dfe64dd3Smacallan 5396dfe64dd3Smacallan 5397dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5398dfe64dd3Smacallan/* Function : XGI_SetLockRegs */ 5399dfe64dd3Smacallan/* Input : */ 5400dfe64dd3Smacallan/* Output : */ 5401dfe64dd3Smacallan/* Description : */ 5402dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5403dfe64dd3Smacallanvoid 5404dfe64dd3SmacallanXGI_SetLockRegs(USHORT ModeNo, USHORT ModeIdIndex, 5405dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 5406dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 5407dfe64dd3Smacallan{ 5408dfe64dd3Smacallan USHORT push1, 5409dfe64dd3Smacallan push2, tempax, tempbx = 0, tempcx, temp, resinfo, modeflag, CRT1Index; 5410dfe64dd3Smacallan 5411dfe64dd3Smacallan if (ModeNo <= 0x13) { 5412dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */ 5413dfe64dd3Smacallan resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo; 5414dfe64dd3Smacallan } 5415dfe64dd3Smacallan else { 5416dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */ 5417dfe64dd3Smacallan resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; 5418dfe64dd3Smacallan CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; 5419dfe64dd3Smacallan CRT1Index &= IndexMask; 5420dfe64dd3Smacallan } 5421dfe64dd3Smacallan 5422dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetInSlaveMode)) { 5423dfe64dd3Smacallan return; 5424dfe64dd3Smacallan } 5425dfe64dd3Smacallan 5426dfe64dd3Smacallan temp = 0xFF; /* set MAX HT */ 5427dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x03, temp); 5428dfe64dd3Smacallan /* if ( modeflag & Charx8Dot ) tempcx = 0x08 ; */ 5429dfe64dd3Smacallan /* else */ 5430dfe64dd3Smacallan tempcx = 0x08; 5431dfe64dd3Smacallan 5432dfe64dd3Smacallan if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) 5433dfe64dd3Smacallan modeflag |= Charx8Dot; 5434dfe64dd3Smacallan 5435dfe64dd3Smacallan tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */ 5436dfe64dd3Smacallan 5437dfe64dd3Smacallan if (modeflag & HalfDCLK) 5438dfe64dd3Smacallan tempax = tempax >> 1; 5439dfe64dd3Smacallan 5440dfe64dd3Smacallan tempax = (tempax / tempcx) - 1; 5441dfe64dd3Smacallan tempbx |= ((tempax & 0x00FF) << 8); 5442dfe64dd3Smacallan temp = tempax & 0x00FF; 5443dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x04, temp); 5444dfe64dd3Smacallan 5445dfe64dd3Smacallan temp = (tempbx & 0xFF00) >> 8; 5446dfe64dd3Smacallan 5447dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { 5448dfe64dd3Smacallan if (! 5449dfe64dd3Smacallan (pVBInfo-> 5450dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 5451dfe64dd3Smacallan VB_XGI301C))) 5452dfe64dd3Smacallan temp += 2; 5453dfe64dd3Smacallan 5454dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 5455dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301LV) { 5456dfe64dd3Smacallan if (pVBInfo->VBExtInfo == VB_YPbPr1080i) { 5457dfe64dd3Smacallan if (resinfo == 7) 5458dfe64dd3Smacallan temp -= 2; 5459dfe64dd3Smacallan } 5460dfe64dd3Smacallan } 5461dfe64dd3Smacallan else if (resinfo == 7) 5462dfe64dd3Smacallan temp -= 2; 5463dfe64dd3Smacallan } 5464dfe64dd3Smacallan } 5465dfe64dd3Smacallan 5466dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x05, temp); /* 0x05 Horizontal Display Start */ 5467dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x06, 0x03); /* 0x06 Horizontal Blank end */ 5468dfe64dd3Smacallan 5469dfe64dd3Smacallan if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */ 5470dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) 5471dfe64dd3Smacallan tempax = pVBInfo->VGAHT; 5472dfe64dd3Smacallan else 5473dfe64dd3Smacallan tempax = XGI_GetVGAHT2(pVBInfo); 5474dfe64dd3Smacallan } 5475dfe64dd3Smacallan 5476dfe64dd3Smacallan if (tempax >= pVBInfo->VGAHT) { 5477dfe64dd3Smacallan tempax = pVBInfo->VGAHT; 5478dfe64dd3Smacallan } 5479dfe64dd3Smacallan 5480dfe64dd3Smacallan if (modeflag & HalfDCLK) { 5481dfe64dd3Smacallan tempax = tempax >> 1; 5482dfe64dd3Smacallan } 5483dfe64dd3Smacallan 5484dfe64dd3Smacallan tempax = (tempax / tempcx) - 5; 5485dfe64dd3Smacallan tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */ 5486dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 5487dfe64dd3Smacallan temp = (tempbx & 0x00FF) - 1; 5488dfe64dd3Smacallan if (!(modeflag & HalfDCLK)) { 5489dfe64dd3Smacallan temp -= 6; 5490dfe64dd3Smacallan if (pVBInfo->TVInfo & TVSimuMode) { 5491dfe64dd3Smacallan temp -= 4; 5492dfe64dd3Smacallan if (ModeNo > 0x13) 5493dfe64dd3Smacallan temp -= 10; 5494dfe64dd3Smacallan } 5495dfe64dd3Smacallan } 5496dfe64dd3Smacallan } 5497dfe64dd3Smacallan else { 5498dfe64dd3Smacallan /* tempcx = tempbx & 0x00FF ; */ 5499dfe64dd3Smacallan tempbx = (tempbx & 0xFF00) >> 8; 5500dfe64dd3Smacallan tempcx = (tempcx + tempbx) >> 1; 5501dfe64dd3Smacallan temp = (tempcx & 0x00FF) + 2; 5502dfe64dd3Smacallan 5503dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { 5504dfe64dd3Smacallan temp -= 1; 5505dfe64dd3Smacallan if (!(modeflag & HalfDCLK)) { 5506dfe64dd3Smacallan if ((modeflag & Charx8Dot)) { 5507dfe64dd3Smacallan temp += 4; 5508dfe64dd3Smacallan if (pVBInfo->VGAHDE >= 800) { 5509dfe64dd3Smacallan temp -= 6; 5510dfe64dd3Smacallan } 5511dfe64dd3Smacallan } 5512dfe64dd3Smacallan } 5513dfe64dd3Smacallan } 5514dfe64dd3Smacallan else { 5515dfe64dd3Smacallan if (!(modeflag & HalfDCLK)) { 5516dfe64dd3Smacallan temp -= 4; 5517dfe64dd3Smacallan if (pVBInfo->LCDResInfo != Panel1280x960) { 5518dfe64dd3Smacallan if (pVBInfo->VGAHDE >= 800) { 5519dfe64dd3Smacallan temp -= 7; 5520dfe64dd3Smacallan if (pVBInfo->ModeType == ModeEGA) { 5521dfe64dd3Smacallan if (pVBInfo->VGAVDE == 1024) { 5522dfe64dd3Smacallan temp += 15; 5523dfe64dd3Smacallan if (pVBInfo->LCDResInfo != Panel1280x1024) { 5524dfe64dd3Smacallan temp += 7; 5525dfe64dd3Smacallan } 5526dfe64dd3Smacallan } 5527dfe64dd3Smacallan } 5528dfe64dd3Smacallan 5529dfe64dd3Smacallan if (pVBInfo->VGAHDE >= 1280) { 5530dfe64dd3Smacallan if (pVBInfo->LCDResInfo != Panel1280x960) { 5531dfe64dd3Smacallan if (! 5532dfe64dd3Smacallan (pVBInfo-> 5533dfe64dd3Smacallan LCDInfo & (LCDNonExpanding | 5534dfe64dd3Smacallan EnableScalingLCD))) { 5535dfe64dd3Smacallan temp += 28; 5536dfe64dd3Smacallan } 5537dfe64dd3Smacallan } 5538dfe64dd3Smacallan } 5539dfe64dd3Smacallan } 5540dfe64dd3Smacallan } 5541dfe64dd3Smacallan } 5542dfe64dd3Smacallan } 5543dfe64dd3Smacallan } 5544dfe64dd3Smacallan 5545dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, temp); /* 0x07 Horizontal Retrace Start */ 5546dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0); /* 0x08 Horizontal Retrace End */ 5547dfe64dd3Smacallan 5548dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { 5549dfe64dd3Smacallan if (pVBInfo->TVInfo & TVSimuMode) { 5550dfe64dd3Smacallan if ((ModeNo == 0x06) || (ModeNo == 0x10) || (ModeNo == 0x11) 5551dfe64dd3Smacallan || (ModeNo == 0x13) || (ModeNo == 0x0F)) { 5552dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x5b); 5553dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x03); 5554dfe64dd3Smacallan } 5555dfe64dd3Smacallan 5556dfe64dd3Smacallan if ((ModeNo == 0x00) || (ModeNo == 0x01)) { 5557dfe64dd3Smacallan if (pVBInfo->TVInfo & SetNTSCTV) { 5558dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x2A); 5559dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x61); 5560dfe64dd3Smacallan } 5561dfe64dd3Smacallan else { 5562dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x2A); 5563dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x41); 5564dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0C, 0xF0); 5565dfe64dd3Smacallan } 5566dfe64dd3Smacallan } 5567dfe64dd3Smacallan 5568dfe64dd3Smacallan if ((ModeNo == 0x02) || (ModeNo == 0x03) || (ModeNo == 0x07)) { 5569dfe64dd3Smacallan if (pVBInfo->TVInfo & SetNTSCTV) { 5570dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x54); 5571dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x00); 5572dfe64dd3Smacallan } 5573dfe64dd3Smacallan else { 5574dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x55); 5575dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x00); 5576dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0C, 0xF0); 5577dfe64dd3Smacallan } 5578dfe64dd3Smacallan } 5579dfe64dd3Smacallan 5580dfe64dd3Smacallan if ((ModeNo == 0x04) || (ModeNo == 0x05) || (ModeNo == 0x0D) 5581dfe64dd3Smacallan || (ModeNo == 0x50)) { 5582dfe64dd3Smacallan if (pVBInfo->TVInfo & SetNTSCTV) { 5583dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x30); 5584dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x03); 5585dfe64dd3Smacallan } 5586dfe64dd3Smacallan else { 5587dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x07, 0x2f); 5588dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x08, 0x02); 5589dfe64dd3Smacallan } 5590dfe64dd3Smacallan } 5591dfe64dd3Smacallan } 5592dfe64dd3Smacallan } 5593dfe64dd3Smacallan 5594dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */ 5595dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x19, 0xF0, 0x00); 5596dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */ 5597dfe64dd3Smacallan 5598dfe64dd3Smacallan tempbx = pVBInfo->VGAVT; 5599dfe64dd3Smacallan push1 = tempbx; 5600dfe64dd3Smacallan tempcx = 0x121; 5601dfe64dd3Smacallan tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */ 5602dfe64dd3Smacallan 5603dfe64dd3Smacallan if (tempbx == 357) 5604dfe64dd3Smacallan tempbx = 350; 5605dfe64dd3Smacallan if (tempbx == 360) 5606dfe64dd3Smacallan tempbx = 350; 5607dfe64dd3Smacallan if (tempbx == 375) 5608dfe64dd3Smacallan tempbx = 350; 5609dfe64dd3Smacallan if (tempbx == 405) 5610dfe64dd3Smacallan tempbx = 400; 5611dfe64dd3Smacallan if (tempbx == 525) 5612dfe64dd3Smacallan tempbx = 480; 5613dfe64dd3Smacallan 5614dfe64dd3Smacallan push2 = tempbx; 5615dfe64dd3Smacallan 5616dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCD) { 5617dfe64dd3Smacallan if (pVBInfo->LCDResInfo == Panel1024x768) { 5618dfe64dd3Smacallan if (!(pVBInfo->LCDInfo & LCDVESATiming)) { 5619dfe64dd3Smacallan if (tempbx == 350) 5620dfe64dd3Smacallan tempbx += 5; 5621dfe64dd3Smacallan if (tempbx == 480) 5622dfe64dd3Smacallan tempbx += 5; 5623dfe64dd3Smacallan } 5624dfe64dd3Smacallan } 5625dfe64dd3Smacallan } 5626dfe64dd3Smacallan tempbx--; 5627dfe64dd3Smacallan temp = tempbx & 0x00FF; 5628dfe64dd3Smacallan tempbx--; 5629dfe64dd3Smacallan temp = tempbx & 0x00FF; 5630dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x10, temp); /* 0x10 vertical Blank Start */ 5631dfe64dd3Smacallan tempbx = push2; 5632dfe64dd3Smacallan tempbx--; 5633dfe64dd3Smacallan temp = tempbx & 0x00FF; 5634dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0E, temp); 5635dfe64dd3Smacallan 5636dfe64dd3Smacallan if (tempbx & 0x0100) { 5637dfe64dd3Smacallan tempcx |= 0x0002; 5638dfe64dd3Smacallan } 5639dfe64dd3Smacallan 5640dfe64dd3Smacallan tempax = 0x000B; 5641dfe64dd3Smacallan 5642dfe64dd3Smacallan if (modeflag & DoubleScanMode) { 5643dfe64dd3Smacallan tempax |= 0x08000; 5644dfe64dd3Smacallan } 5645dfe64dd3Smacallan 5646dfe64dd3Smacallan if (tempbx & 0x0200) { 5647dfe64dd3Smacallan tempcx |= 0x0040; 5648dfe64dd3Smacallan } 5649dfe64dd3Smacallan 5650dfe64dd3Smacallan temp = (tempax & 0xFF00) >> 8; 5651dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0B, temp); 5652dfe64dd3Smacallan 5653dfe64dd3Smacallan if (tempbx & 0x0400) { 5654dfe64dd3Smacallan tempcx |= 0x0600; 5655dfe64dd3Smacallan } 5656dfe64dd3Smacallan 5657dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x11, 0x00); /* 0x11 Vertival Blank End */ 5658dfe64dd3Smacallan 5659dfe64dd3Smacallan tempax = push1; 5660dfe64dd3Smacallan tempax -= tempbx; /* 0x0C Vertical Retrace Start */ 5661dfe64dd3Smacallan tempax = tempax >> 2; 5662dfe64dd3Smacallan push1 = tempax; /* push ax */ 5663dfe64dd3Smacallan 5664dfe64dd3Smacallan if (resinfo != 0x09) { 5665dfe64dd3Smacallan tempax = tempax << 1; 5666dfe64dd3Smacallan tempbx += tempax; 5667dfe64dd3Smacallan } 5668dfe64dd3Smacallan 5669dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 5670dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301LV) { 5671dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode1080i) 5672dfe64dd3Smacallan tempbx -= 10; 5673dfe64dd3Smacallan else { 5674dfe64dd3Smacallan if (pVBInfo->TVInfo & TVSimuMode) { 5675dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALTV) { 5676dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301LV) { 5677dfe64dd3Smacallan if (! 5678dfe64dd3Smacallan (pVBInfo-> 5679dfe64dd3Smacallan TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p 5680dfe64dd3Smacallan | SetYPbPrMode1080i))) 5681dfe64dd3Smacallan tempbx += 40; 5682dfe64dd3Smacallan } 5683dfe64dd3Smacallan else 5684dfe64dd3Smacallan tempbx += 40; 5685dfe64dd3Smacallan } 5686dfe64dd3Smacallan } 5687dfe64dd3Smacallan } 5688dfe64dd3Smacallan } 5689dfe64dd3Smacallan else 5690dfe64dd3Smacallan tempbx -= 10; 5691dfe64dd3Smacallan } 5692dfe64dd3Smacallan else { 5693dfe64dd3Smacallan if (pVBInfo->TVInfo & TVSimuMode) { 5694dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALTV) { 5695dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301LV) { 5696dfe64dd3Smacallan if (! 5697dfe64dd3Smacallan (pVBInfo-> 5698dfe64dd3Smacallan TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p | 5699dfe64dd3Smacallan SetYPbPrMode1080i))) 5700dfe64dd3Smacallan tempbx += 40; 5701dfe64dd3Smacallan } 5702dfe64dd3Smacallan else 5703dfe64dd3Smacallan tempbx += 40; 5704dfe64dd3Smacallan } 5705dfe64dd3Smacallan } 5706dfe64dd3Smacallan } 5707dfe64dd3Smacallan tempax = push1; 5708dfe64dd3Smacallan tempax = tempax >> 2; 5709dfe64dd3Smacallan tempax++; 5710dfe64dd3Smacallan tempax += tempbx; 5711dfe64dd3Smacallan push1 = tempax; /* push ax */ 5712dfe64dd3Smacallan 5713dfe64dd3Smacallan if ((pVBInfo->TVInfo & SetPALTV)) { 5714dfe64dd3Smacallan if (tempbx <= 513) { 5715dfe64dd3Smacallan if (tempax >= 513) { 5716dfe64dd3Smacallan tempbx = 513; 5717dfe64dd3Smacallan } 5718dfe64dd3Smacallan } 5719dfe64dd3Smacallan } 5720dfe64dd3Smacallan 5721dfe64dd3Smacallan temp = tempbx & 0x00FF; 5722dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0C, temp); 5723dfe64dd3Smacallan tempbx--; 5724dfe64dd3Smacallan temp = tempbx & 0x00FF; 5725dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x10, temp); 5726dfe64dd3Smacallan 5727dfe64dd3Smacallan if (tempbx & 0x0100) { 5728dfe64dd3Smacallan tempcx |= 0x0008; 5729dfe64dd3Smacallan } 5730dfe64dd3Smacallan 5731dfe64dd3Smacallan if (tempbx & 0x0200) { 5732dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20); 5733dfe64dd3Smacallan } 5734dfe64dd3Smacallan 5735dfe64dd3Smacallan tempbx++; 5736dfe64dd3Smacallan 5737dfe64dd3Smacallan if (tempbx & 0x0100) { 5738dfe64dd3Smacallan tempcx |= 0x0004; 5739dfe64dd3Smacallan } 5740dfe64dd3Smacallan 5741dfe64dd3Smacallan if (tempbx & 0x0200) { 5742dfe64dd3Smacallan tempcx |= 0x0080; 5743dfe64dd3Smacallan } 5744dfe64dd3Smacallan 5745dfe64dd3Smacallan if (tempbx & 0x0400) { 5746dfe64dd3Smacallan tempcx |= 0x0C00; 5747dfe64dd3Smacallan } 5748dfe64dd3Smacallan 5749dfe64dd3Smacallan tempbx = push1; /* pop ax */ 5750dfe64dd3Smacallan temp = tempbx & 0x00FF; 5751dfe64dd3Smacallan temp &= 0x0F; 5752dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0D, temp); /* 0x0D vertical Retrace End */ 5753dfe64dd3Smacallan 5754dfe64dd3Smacallan if (tempbx & 0x0010) { 5755dfe64dd3Smacallan tempcx |= 0x2000; 5756dfe64dd3Smacallan } 5757dfe64dd3Smacallan 5758dfe64dd3Smacallan temp = tempcx & 0x00FF; 5759dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */ 5760dfe64dd3Smacallan temp = (tempcx & 0x0FF00) >> 8; 5761dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */ 5762dfe64dd3Smacallan tempax = modeflag; 5763dfe64dd3Smacallan temp = (tempax & 0xFF00) >> 8; 5764dfe64dd3Smacallan 5765dfe64dd3Smacallan temp = (temp >> 1) & 0x09; 5766dfe64dd3Smacallan 5767dfe64dd3Smacallan if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) 5768dfe64dd3Smacallan temp |= 0x01; 5769dfe64dd3Smacallan 5770dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */ 5771dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */ 5772dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */ 5773dfe64dd3Smacallan 5774dfe64dd3Smacallan if (pVBInfo->LCDInfo & LCDRGB18Bit) 5775dfe64dd3Smacallan temp = 0x80; 5776dfe64dd3Smacallan else 5777dfe64dd3Smacallan temp = 0x00; 5778dfe64dd3Smacallan 5779dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */ 5780dfe64dd3Smacallan 5781dfe64dd3Smacallan return; 5782dfe64dd3Smacallan} 5783dfe64dd3Smacallan 5784dfe64dd3Smacallan 5785dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5786dfe64dd3Smacallan/* Function : XGI_SetGroup2 */ 5787dfe64dd3Smacallan/* Input : */ 5788dfe64dd3Smacallan/* Output : */ 5789dfe64dd3Smacallan/* Description : */ 5790dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 5791dfe64dd3Smacallanvoid 5792dfe64dd3SmacallanXGI_SetGroup2(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, 5793dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) 5794dfe64dd3Smacallan{ 5795dfe64dd3Smacallan USHORT i, 5796dfe64dd3Smacallan j, 5797dfe64dd3Smacallan tempax, 5798dfe64dd3Smacallan tempbx, tempcx, temp, push1, push2, modeflag, resinfo, crt2crtc; 5799dfe64dd3Smacallan#ifndef LINUX_XF86 5800dfe64dd3Smacallan USHORT temp1, temp3, resindex, xres; 5801dfe64dd3Smacallan#endif 5802dfe64dd3Smacallan/* XGINew_RY1COE = 0 , 5803dfe64dd3Smacallan XGINew_RY2COE = 0 , 5804dfe64dd3Smacallan XGINew_RY3COE = 0 , 5805dfe64dd3Smacallan XGINew_RY4COE = 0 , 5806dfe64dd3Smacallan XGINew_RY5COE = 0 , 5807dfe64dd3Smacallan XGINew_RY6COE = 0 , 5808dfe64dd3Smacallan XGINew_RY7COE = 0 ; 5809dfe64dd3Smacallan*/ 5810dfe64dd3Smacallan 5811dfe64dd3Smacallan#ifndef LINUX_XF86 5812dfe64dd3Smacallan UCHAR *PhasePoint; 5813dfe64dd3Smacallan#endif 5814dfe64dd3Smacallan const UCHAR *TimingPoint; 5815dfe64dd3Smacallan 5816dfe64dd3Smacallan ULONG longtemp, tempeax, tempebx, temp2, tempecx; 5817dfe64dd3Smacallan 5818dfe64dd3Smacallan if (ModeNo <= 0x13) { 5819dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */ 5820dfe64dd3Smacallan resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo; 5821dfe64dd3Smacallan crt2crtc = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC; 5822dfe64dd3Smacallan } 5823dfe64dd3Smacallan else { 5824dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */ 5825dfe64dd3Smacallan resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; 5826dfe64dd3Smacallan crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC; 5827dfe64dd3Smacallan } 5828dfe64dd3Smacallan 5829dfe64dd3Smacallan tempax = 0; 5830dfe64dd3Smacallan 5831dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO)) 5832dfe64dd3Smacallan tempax |= 0x0800; 5833dfe64dd3Smacallan 5834dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO)) 5835dfe64dd3Smacallan tempax |= 0x0400; 5836dfe64dd3Smacallan 5837dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToSCART) 5838dfe64dd3Smacallan tempax |= 0x0200; 5839dfe64dd3Smacallan 5840dfe64dd3Smacallan if (!(pVBInfo->TVInfo & SetPALTV)) 5841dfe64dd3Smacallan tempax |= 0x1000; 5842dfe64dd3Smacallan 5843dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) 5844dfe64dd3Smacallan tempax |= 0x0100; 5845dfe64dd3Smacallan 5846dfe64dd3Smacallan if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p)) 5847dfe64dd3Smacallan tempax &= 0xfe00; 5848dfe64dd3Smacallan 5849dfe64dd3Smacallan ErrorF("Part2 0 = %x ", 5850dfe64dd3Smacallan XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); 5851dfe64dd3Smacallan ErrorF(" pVBInfo->VBInfo =%x", pVBInfo->VBInfo); 5852dfe64dd3Smacallan 5853dfe64dd3Smacallan tempax = (tempax & 0xff00) >> 8; 5854dfe64dd3Smacallan ErrorF("tempax = %x ", tempax); 5855dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0, tempax); 5856dfe64dd3Smacallan TimingPoint = pVBInfo->NTSCTiming; 5857dfe64dd3Smacallan 5858dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALTV) { 5859dfe64dd3Smacallan TimingPoint = pVBInfo->PALTiming; 5860dfe64dd3Smacallan } 5861dfe64dd3Smacallan 5862dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 5863dfe64dd3Smacallan TimingPoint = pVBInfo->HiTVExtTiming; 5864dfe64dd3Smacallan 5865dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) 5866dfe64dd3Smacallan TimingPoint = pVBInfo->HiTVSt2Timing; 5867dfe64dd3Smacallan 5868dfe64dd3Smacallan if (pVBInfo->SetFlag & TVSimuMode) 5869dfe64dd3Smacallan TimingPoint = pVBInfo->HiTVSt1Timing; 5870dfe64dd3Smacallan 5871dfe64dd3Smacallan if (!(modeflag & Charx8Dot)) 5872dfe64dd3Smacallan TimingPoint = pVBInfo->HiTVTextTiming; 5873dfe64dd3Smacallan } 5874dfe64dd3Smacallan 5875dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToYPbPr) { 5876dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode525i) 5877dfe64dd3Smacallan TimingPoint = pVBInfo->YPbPr525iTiming; 5878dfe64dd3Smacallan 5879dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode525p) 5880dfe64dd3Smacallan TimingPoint = pVBInfo->YPbPr525pTiming; 5881dfe64dd3Smacallan 5882dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode750p) 5883dfe64dd3Smacallan TimingPoint = pVBInfo->YPbPr750pTiming; 5884dfe64dd3Smacallan } 5885dfe64dd3Smacallan 5886dfe64dd3Smacallan for (i = 0x01, j = 0; i <= 0x2D; i++, j++) { 5887dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, i, TimingPoint[j]); 5888dfe64dd3Smacallan } 5889dfe64dd3Smacallan 5890dfe64dd3Smacallan for (i = 0x39; i <= 0x45; i++, j++) { 5891dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, i, TimingPoint[j]); /* di->temp2[j] */ 5892dfe64dd3Smacallan } 5893dfe64dd3Smacallan 5894dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { 5895dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x3A, 0x1F, 0x00); 5896dfe64dd3Smacallan } 5897dfe64dd3Smacallan 5898dfe64dd3Smacallan temp = pVBInfo->NewFlickerMode; 5899dfe64dd3Smacallan temp &= 0x80; 5900dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x0A, 0xFF, temp); 5901dfe64dd3Smacallan 5902dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) 5903dfe64dd3Smacallan tempax = 950; 5904dfe64dd3Smacallan 5905dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALTV) 5906dfe64dd3Smacallan tempax = 520; 5907dfe64dd3Smacallan else 5908dfe64dd3Smacallan tempax = 440; 5909dfe64dd3Smacallan 5910dfe64dd3Smacallan if (pVBInfo->VDE <= tempax) { 5911dfe64dd3Smacallan tempax -= pVBInfo->VDE; 5912dfe64dd3Smacallan tempax = tempax >> 2; 5913dfe64dd3Smacallan tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8); 5914dfe64dd3Smacallan push1 = tempax; 5915dfe64dd3Smacallan temp = (tempax & 0xFF00) >> 8; 5916dfe64dd3Smacallan temp += (USHORT) TimingPoint[0]; 5917dfe64dd3Smacallan 5918dfe64dd3Smacallan if (pVBInfo-> 5919dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 5920dfe64dd3Smacallan VB_XGI301C)) { 5921dfe64dd3Smacallan if (pVBInfo-> 5922dfe64dd3Smacallan VBInfo & (SetCRT2ToAVIDEO | SetCRT2ToSVIDEO | SetCRT2ToSCART | 5923dfe64dd3Smacallan SetCRT2ToYPbPr)) { 5924dfe64dd3Smacallan tempcx = pVBInfo->VGAHDE; 5925dfe64dd3Smacallan if (tempcx >= 1024) { 5926dfe64dd3Smacallan temp = 0x17; /* NTSC */ 5927dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALTV) 5928dfe64dd3Smacallan temp = 0x19; /* PAL */ 5929dfe64dd3Smacallan } 5930dfe64dd3Smacallan } 5931dfe64dd3Smacallan } 5932dfe64dd3Smacallan 5933dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x01, temp); 5934dfe64dd3Smacallan tempax = push1; 5935dfe64dd3Smacallan temp = (tempax & 0xFF00) >> 8; 5936dfe64dd3Smacallan temp += TimingPoint[1]; 5937dfe64dd3Smacallan 5938dfe64dd3Smacallan if (pVBInfo-> 5939dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 5940dfe64dd3Smacallan VB_XGI301C)) { 5941dfe64dd3Smacallan if ((pVBInfo-> 5942dfe64dd3Smacallan VBInfo & (SetCRT2ToAVIDEO | SetCRT2ToSVIDEO | SetCRT2ToSCART 5943dfe64dd3Smacallan | SetCRT2ToYPbPr))) { 5944dfe64dd3Smacallan tempcx = pVBInfo->VGAHDE; 5945dfe64dd3Smacallan if (tempcx >= 1024) { 5946dfe64dd3Smacallan temp = 0x1D; /* NTSC */ 5947dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALTV) 5948dfe64dd3Smacallan temp = 0x52; /* PAL */ 5949dfe64dd3Smacallan } 5950dfe64dd3Smacallan } 5951dfe64dd3Smacallan } 5952dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x02, temp); 5953dfe64dd3Smacallan } 5954dfe64dd3Smacallan 5955dfe64dd3Smacallan /* 301b */ 5956dfe64dd3Smacallan tempcx = pVBInfo->HT; 5957dfe64dd3Smacallan 5958dfe64dd3Smacallan if (XGI_IsLCDDualLink(pVBInfo)) 5959dfe64dd3Smacallan tempcx = tempcx >> 1; 5960dfe64dd3Smacallan 5961dfe64dd3Smacallan tempcx -= 2; 5962dfe64dd3Smacallan temp = tempcx & 0x00FF; 5963dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x1B, temp); 5964dfe64dd3Smacallan 5965dfe64dd3Smacallan temp = (tempcx & 0xFF00) >> 8; 5966dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x1D, ~0x0F, temp); 5967dfe64dd3Smacallan 5968dfe64dd3Smacallan tempcx = pVBInfo->HT >> 1; 5969dfe64dd3Smacallan push1 = tempcx; /* push cx */ 5970dfe64dd3Smacallan tempcx += 7; 5971dfe64dd3Smacallan 5972dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 5973dfe64dd3Smacallan tempcx -= 4; 5974dfe64dd3Smacallan } 5975dfe64dd3Smacallan 5976dfe64dd3Smacallan temp = tempcx & 0x00FF; 5977dfe64dd3Smacallan temp = temp << 4; 5978dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x22, 0x0F, temp); 5979dfe64dd3Smacallan 5980dfe64dd3Smacallan tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8); 5981dfe64dd3Smacallan tempbx += tempcx; 5982dfe64dd3Smacallan push2 = tempbx; 5983dfe64dd3Smacallan temp = tempbx & 0x00FF; 5984dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x24, temp); 5985dfe64dd3Smacallan temp = (tempbx & 0xFF00) >> 8; 5986dfe64dd3Smacallan temp = temp << 4; 5987dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x25, 0x0F, temp); 5988dfe64dd3Smacallan 5989dfe64dd3Smacallan tempbx = push2; 5990dfe64dd3Smacallan tempbx = tempbx + 8; 5991dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 5992dfe64dd3Smacallan tempbx = tempbx - 4; 5993dfe64dd3Smacallan tempcx = tempbx; 5994dfe64dd3Smacallan } 5995dfe64dd3Smacallan 5996dfe64dd3Smacallan temp = (tempbx & 0x00FF) << 4; 5997dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x29, 0x0F, temp); 5998dfe64dd3Smacallan 5999dfe64dd3Smacallan j += 2; 6000dfe64dd3Smacallan tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8)); 6001dfe64dd3Smacallan temp = tempcx & 0x00FF; 6002dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x27, temp); 6003dfe64dd3Smacallan temp = ((tempcx & 0xFF00) >> 8) << 4; 6004dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x28, 0x0F, temp); 6005dfe64dd3Smacallan 6006dfe64dd3Smacallan tempcx += 8; 6007dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 6008dfe64dd3Smacallan tempcx -= 4; 6009dfe64dd3Smacallan } 6010dfe64dd3Smacallan 6011dfe64dd3Smacallan temp = tempcx & 0xFF; 6012dfe64dd3Smacallan temp = temp << 4; 6013dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x2A, 0x0F, temp); 6014dfe64dd3Smacallan 6015dfe64dd3Smacallan tempcx = push1; /* pop cx */ 6016dfe64dd3Smacallan j += 2; 6017dfe64dd3Smacallan temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8); 6018dfe64dd3Smacallan tempcx -= temp; 6019dfe64dd3Smacallan temp = tempcx & 0x00FF; 6020dfe64dd3Smacallan temp = temp << 4; 6021dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x2D, 0x0F, temp); 6022dfe64dd3Smacallan 6023dfe64dd3Smacallan tempcx -= 11; 6024dfe64dd3Smacallan 6025dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToTV)) { 6026dfe64dd3Smacallan tempax = XGI_GetVGAHT2(pVBInfo); 6027dfe64dd3Smacallan tempcx = tempax - 1; 6028dfe64dd3Smacallan } 6029dfe64dd3Smacallan temp = tempcx & 0x00FF; 6030dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x2E, temp); 6031dfe64dd3Smacallan 6032dfe64dd3Smacallan tempbx = pVBInfo->VDE; 6033dfe64dd3Smacallan 6034dfe64dd3Smacallan if (pVBInfo->VGAVDE == 360) 6035dfe64dd3Smacallan tempbx = 746; 6036dfe64dd3Smacallan if (pVBInfo->VGAVDE == 375) 6037dfe64dd3Smacallan tempbx = 746; 6038dfe64dd3Smacallan if (pVBInfo->VGAVDE == 405) 6039dfe64dd3Smacallan tempbx = 853; 6040dfe64dd3Smacallan 6041dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { 6042dfe64dd3Smacallan if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) { 6043dfe64dd3Smacallan if (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))) 6044dfe64dd3Smacallan tempbx = tempbx >> 1; 6045dfe64dd3Smacallan } 6046dfe64dd3Smacallan else 6047dfe64dd3Smacallan tempbx = tempbx >> 1; 6048dfe64dd3Smacallan } 6049dfe64dd3Smacallan 6050dfe64dd3Smacallan tempbx -= 2; 6051dfe64dd3Smacallan temp = tempbx & 0x00FF; 6052dfe64dd3Smacallan 6053dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 6054dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301LV) { 6055dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode1080i) { 6056dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) { 6057dfe64dd3Smacallan if (ModeNo == 0x2f) 6058dfe64dd3Smacallan temp += 1; 6059dfe64dd3Smacallan } 6060dfe64dd3Smacallan } 6061dfe64dd3Smacallan } 6062dfe64dd3Smacallan else { 6063dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) { 6064dfe64dd3Smacallan if (ModeNo == 0x2f) 6065dfe64dd3Smacallan temp += 1; 6066dfe64dd3Smacallan } 6067dfe64dd3Smacallan } 6068dfe64dd3Smacallan } 6069dfe64dd3Smacallan 6070dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x2F, temp); 6071dfe64dd3Smacallan 6072dfe64dd3Smacallan temp = (tempcx & 0xFF00) >> 8; 6073dfe64dd3Smacallan temp |= ((tempbx & 0xFF00) >> 8) << 6; 6074dfe64dd3Smacallan 6075dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)) { 6076dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301LV) { 6077dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode1080i) { 6078dfe64dd3Smacallan temp |= 0x10; 6079dfe64dd3Smacallan 6080dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO)) 6081dfe64dd3Smacallan temp |= 0x20; 6082dfe64dd3Smacallan } 6083dfe64dd3Smacallan } 6084dfe64dd3Smacallan else { 6085dfe64dd3Smacallan temp |= 0x10; 6086dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO)) 6087dfe64dd3Smacallan temp |= 0x20; 6088dfe64dd3Smacallan } 6089dfe64dd3Smacallan } 6090dfe64dd3Smacallan 6091dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x30, temp); 6092dfe64dd3Smacallan 6093dfe64dd3Smacallan if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) { /* TV gatingno */ 6094dfe64dd3Smacallan tempbx = pVBInfo->VDE; 6095dfe64dd3Smacallan tempcx = tempbx - 2; 6096dfe64dd3Smacallan 6097dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { 6098dfe64dd3Smacallan if (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))) 6099dfe64dd3Smacallan tempbx = tempbx >> 1; 6100dfe64dd3Smacallan } 6101dfe64dd3Smacallan 6102dfe64dd3Smacallan if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) { 6103dfe64dd3Smacallan temp = 0; 6104dfe64dd3Smacallan if (tempcx & 0x0400) 6105dfe64dd3Smacallan temp |= 0x20; 6106dfe64dd3Smacallan 6107dfe64dd3Smacallan if (tempbx & 0x0400) 6108dfe64dd3Smacallan temp |= 0x40; 6109dfe64dd3Smacallan 6110dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x10, temp); 6111dfe64dd3Smacallan } 6112dfe64dd3Smacallan 6113dfe64dd3Smacallan temp = (((tempbx - 3) & 0x0300) >> 8) << 5; 6114dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x46, temp); 6115dfe64dd3Smacallan temp = (tempbx - 3) & 0x00FF; 6116dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x47, temp); 6117dfe64dd3Smacallan } 6118dfe64dd3Smacallan 6119dfe64dd3Smacallan tempbx = tempbx & 0x00FF; 6120dfe64dd3Smacallan 6121dfe64dd3Smacallan if (!(modeflag & HalfDCLK)) { 6122dfe64dd3Smacallan tempcx = pVBInfo->VGAHDE; 6123dfe64dd3Smacallan if (tempcx >= pVBInfo->HDE) { 6124dfe64dd3Smacallan tempbx |= 0x2000; 6125dfe64dd3Smacallan tempax &= 0x00FF; 6126dfe64dd3Smacallan } 6127dfe64dd3Smacallan } 6128dfe64dd3Smacallan 6129dfe64dd3Smacallan tempcx = 0x0101; 6130dfe64dd3Smacallan 6131dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b */ 6132dfe64dd3Smacallan if (pVBInfo->VGAHDE >= 1024) { 6133dfe64dd3Smacallan tempcx = 0x1920; 6134dfe64dd3Smacallan if (pVBInfo->VGAHDE >= 1280) { 6135dfe64dd3Smacallan tempcx = 0x1420; 6136dfe64dd3Smacallan tempbx = tempbx & 0xDFFF; 6137dfe64dd3Smacallan } 6138dfe64dd3Smacallan } 6139dfe64dd3Smacallan } 6140dfe64dd3Smacallan 6141dfe64dd3Smacallan if (!(tempbx & 0x2000)) { 6142dfe64dd3Smacallan if (modeflag & HalfDCLK) { 6143dfe64dd3Smacallan tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1); 6144dfe64dd3Smacallan } 6145dfe64dd3Smacallan 6146dfe64dd3Smacallan push1 = tempbx; 6147dfe64dd3Smacallan tempeax = pVBInfo->VGAHDE; 6148dfe64dd3Smacallan tempebx = (tempcx & 0xFF00) >> 8; 6149dfe64dd3Smacallan longtemp = tempeax * tempebx; 6150dfe64dd3Smacallan tempecx = tempcx & 0x00FF; 6151dfe64dd3Smacallan longtemp = longtemp / tempecx; 6152dfe64dd3Smacallan 6153dfe64dd3Smacallan /* 301b */ 6154dfe64dd3Smacallan tempecx = 8 * 1024; 6155dfe64dd3Smacallan 6156dfe64dd3Smacallan if (pVBInfo-> 6157dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 6158dfe64dd3Smacallan VB_XGI301C)) { 6159dfe64dd3Smacallan tempecx = tempecx * 8; 6160dfe64dd3Smacallan } 6161dfe64dd3Smacallan 6162dfe64dd3Smacallan longtemp = longtemp * tempecx; 6163dfe64dd3Smacallan tempecx = pVBInfo->HDE; 6164dfe64dd3Smacallan temp2 = longtemp % tempecx; 6165dfe64dd3Smacallan tempeax = longtemp / tempecx; 6166dfe64dd3Smacallan if (temp2 != 0) { 6167dfe64dd3Smacallan tempeax += 1; 6168dfe64dd3Smacallan } 6169dfe64dd3Smacallan 6170dfe64dd3Smacallan tempax = (USHORT) tempeax; 6171dfe64dd3Smacallan 6172dfe64dd3Smacallan /* 301b */ 6173dfe64dd3Smacallan if (pVBInfo-> 6174dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 6175dfe64dd3Smacallan VB_XGI301C)) { 6176dfe64dd3Smacallan tempcx = ((tempax & 0xFF00) >> 5) >> 8; 6177dfe64dd3Smacallan } 6178dfe64dd3Smacallan /* end 301b */ 6179dfe64dd3Smacallan 6180dfe64dd3Smacallan tempbx = push1; 6181dfe64dd3Smacallan tempbx = 6182dfe64dd3Smacallan (USHORT) (((tempeax & 0x0000FF00) & 0x1F00) | (tempbx & 0x00FF)); 6183dfe64dd3Smacallan tempax = (USHORT) (((tempeax & 0x000000FF) << 8) | (tempax & 0x00FF)); 6184dfe64dd3Smacallan temp = (tempax & 0xFF00) >> 8; 6185dfe64dd3Smacallan } 6186dfe64dd3Smacallan else { 6187dfe64dd3Smacallan temp = (tempax & 0x00FF) >> 8; 6188dfe64dd3Smacallan } 6189dfe64dd3Smacallan 6190dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x44, temp); 6191dfe64dd3Smacallan temp = (tempbx & 0xFF00) >> 8; 6192dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x45, ~0x03F, temp); 6193dfe64dd3Smacallan temp = tempcx & 0x00FF; 6194dfe64dd3Smacallan 6195dfe64dd3Smacallan if (tempbx & 0x2000) 6196dfe64dd3Smacallan temp = 0; 6197dfe64dd3Smacallan 6198dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToLCD)) 6199dfe64dd3Smacallan temp |= 0x18; 6200dfe64dd3Smacallan 6201dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x46, ~0x1F, temp); 6202dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALTV) { 6203dfe64dd3Smacallan tempbx = 0x0382; 6204dfe64dd3Smacallan tempcx = 0x007e; 6205dfe64dd3Smacallan } 6206dfe64dd3Smacallan else { 6207dfe64dd3Smacallan tempbx = 0x0369; 6208dfe64dd3Smacallan tempcx = 0x0061; 6209dfe64dd3Smacallan } 6210dfe64dd3Smacallan 6211dfe64dd3Smacallan temp = tempbx & 0x00FF; 6212dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x4b, temp); 6213dfe64dd3Smacallan temp = tempcx & 0x00FF; 6214dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x4c, temp); 6215dfe64dd3Smacallan 6216dfe64dd3Smacallan temp = ((tempcx & 0xFF00) >> 8) & 0x03; 6217dfe64dd3Smacallan temp = temp << 2; 6218dfe64dd3Smacallan temp |= ((tempbx & 0xFF00) >> 8) & 0x03; 6219dfe64dd3Smacallan 6220dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToYPbPr) { 6221dfe64dd3Smacallan temp |= 0x10; 6222dfe64dd3Smacallan 6223dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode525p) 6224dfe64dd3Smacallan temp |= 0x20; 6225dfe64dd3Smacallan 6226dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode750p) 6227dfe64dd3Smacallan temp |= 0x60; 6228dfe64dd3Smacallan } 6229dfe64dd3Smacallan 6230dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x4d, temp); 6231dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x43); /* 301b change */ 6232dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x43, (USHORT) (temp - 3)); 6233dfe64dd3Smacallan 6234dfe64dd3Smacallan if (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))) { 6235dfe64dd3Smacallan if (pVBInfo->TVInfo & NTSC1024x768) { 6236dfe64dd3Smacallan TimingPoint = XGI_NTSC1024AdjTime; 6237dfe64dd3Smacallan for (i = 0x1c, j = 0; i <= 0x30; i++, j++) { 6238dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, i, 6239dfe64dd3Smacallan TimingPoint[j]); 6240dfe64dd3Smacallan } 6241dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x43, 0x72); 6242dfe64dd3Smacallan } 6243dfe64dd3Smacallan } 6244dfe64dd3Smacallan 6245dfe64dd3Smacallan /* [ycchen] 01/14/03 Modify for 301C PALM Support */ 6246dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301C) { 6247dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALMTV) 6248dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x4E, ~0x08, 0x08); /* PALM Mode */ 6249dfe64dd3Smacallan } 6250dfe64dd3Smacallan 6251dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALMTV) { 6252dfe64dd3Smacallan tempax = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x01); 6253dfe64dd3Smacallan tempax--; 6254dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part2Port, 0x01, tempax); 6255dfe64dd3Smacallan 6256dfe64dd3Smacallan /* if ( !( pVBInfo->VBType & VB_XGI301C ) ) */ 6257dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part2Port, 0x00, 0xEF); 6258dfe64dd3Smacallan } 6259dfe64dd3Smacallan 6260dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { 6261dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetInSlaveMode)) { 6262dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0B, 0x00); 6263dfe64dd3Smacallan } 6264dfe64dd3Smacallan } 6265dfe64dd3Smacallan 6266dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { 6267dfe64dd3Smacallan return; 6268dfe64dd3Smacallan } 6269dfe64dd3Smacallan ErrorF("5935 Part2 0 = %x ", 6270dfe64dd3Smacallan XGI_GetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0)); 6271dfe64dd3Smacallan} 6272dfe64dd3Smacallan 6273dfe64dd3Smacallan 6274dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6275dfe64dd3Smacallan/* Function : XGI_SetLCDRegs */ 6276dfe64dd3Smacallan/* Input : */ 6277dfe64dd3Smacallan/* Output : */ 6278dfe64dd3Smacallan/* Description : */ 6279dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6280dfe64dd3Smacallanvoid 6281dfe64dd3SmacallanXGI_SetLCDRegs(USHORT ModeNo, USHORT ModeIdIndex, 6282dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, 6283dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 6284dfe64dd3Smacallan{ 6285098ad5bdSmacallan ULONG push1, 6286dfe64dd3Smacallan push2, 6287dfe64dd3Smacallan pushbx, 6288dfe64dd3Smacallan tempax, 6289dfe64dd3Smacallan tempbx, 6290dfe64dd3Smacallan tempcx, temp, tempah, tempbh, tempch, resinfo, modeflag, CRT1Index; 6291dfe64dd3Smacallan 6292dfe64dd3Smacallan XGI_LCDDesStruct *LCDBDesPtr = NULL; 6293dfe64dd3Smacallan XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL; 6294dfe64dd3Smacallan 6295dfe64dd3Smacallan 6296dfe64dd3Smacallan if (ModeNo <= 0x13) { 6297dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */ 6298dfe64dd3Smacallan resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo; 6299dfe64dd3Smacallan } 6300dfe64dd3Smacallan else { 6301dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */ 6302dfe64dd3Smacallan resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO; 6303dfe64dd3Smacallan CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; 6304dfe64dd3Smacallan CRT1Index &= IndexMask; 6305dfe64dd3Smacallan } 6306dfe64dd3Smacallan 6307dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToLCD)) { 6308dfe64dd3Smacallan return; 6309dfe64dd3Smacallan } 6310dfe64dd3Smacallan 6311dfe64dd3Smacallan tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */ 6312dfe64dd3Smacallan 6313dfe64dd3Smacallan if (XGI_IsLCDDualLink(pVBInfo)) 6314dfe64dd3Smacallan tempbx = tempbx >> 1; 6315dfe64dd3Smacallan 6316dfe64dd3Smacallan tempbx -= 1; 6317dfe64dd3Smacallan temp = tempbx & 0x00FF; 6318dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x2C, temp); 6319dfe64dd3Smacallan temp = (tempbx & 0xFF00) >> 8; 6320dfe64dd3Smacallan temp = temp << 4; 6321dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x2B, 0x0F, temp); 6322dfe64dd3Smacallan temp = 0x01; 6323dfe64dd3Smacallan 6324dfe64dd3Smacallan if (pVBInfo->LCDResInfo == Panel1280x1024) { 6325dfe64dd3Smacallan if (pVBInfo->ModeType == ModeEGA) { 6326dfe64dd3Smacallan if (pVBInfo->VGAHDE >= 1024) { 6327dfe64dd3Smacallan temp = 0x02; 6328dfe64dd3Smacallan if (pVBInfo->LCDInfo & LCDVESATiming) 6329dfe64dd3Smacallan temp = 0x01; 6330dfe64dd3Smacallan } 6331dfe64dd3Smacallan } 6332dfe64dd3Smacallan } 6333dfe64dd3Smacallan 6334dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x0B, temp); 6335dfe64dd3Smacallan tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */ 6336dfe64dd3Smacallan push1 = tempbx; 6337dfe64dd3Smacallan tempbx--; 6338dfe64dd3Smacallan temp = tempbx & 0x00FF; 6339dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x03, temp); 6340dfe64dd3Smacallan temp = ((tempbx & 0xFF00) >> 8) & 0x07; 6341dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x0C, ~0x07, temp); 6342dfe64dd3Smacallan 6343dfe64dd3Smacallan tempcx = pVBInfo->VT - 1; 6344dfe64dd3Smacallan push2 = tempcx + 1; 6345dfe64dd3Smacallan temp = tempcx & 0x00FF; /* RVTVT=VT-1 */ 6346dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x19, temp); 6347dfe64dd3Smacallan temp = (tempcx & 0xFF00) >> 8; 6348dfe64dd3Smacallan temp = temp << 5; 6349dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x1A, temp); 6350dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x09, 0xF0, 0x00); 6351dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x0A, 0xF0, 0x00); 6352dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x17, 0xFB, 0x00); 6353dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x18, 0xDF, 0x00); 6354dfe64dd3Smacallan 6355dfe64dd3Smacallan /* Customized LCDB Des no add */ 6356dfe64dd3Smacallan LCDBDesPtr = (XGI_LCDDesStruct *) XGI_GetLcdPtr(5, ModeNo, ModeIdIndex, 6357dfe64dd3Smacallan RefreshRateTableIndex, 6358dfe64dd3Smacallan pVBInfo); 6359dfe64dd3Smacallan 6360dfe64dd3Smacallan if (pVBInfo->LCDInfo & EnableScalingLCD) { 6361dfe64dd3Smacallan tempbx = pVBInfo->HDE; 6362dfe64dd3Smacallan tempcx = pVBInfo->VDE; 6363dfe64dd3Smacallan } 6364dfe64dd3Smacallan else { 6365dfe64dd3Smacallan get_HDE_VDE(pVBInfo, & tempbx, & tempcx); 6366dfe64dd3Smacallan } 6367dfe64dd3Smacallan 6368dfe64dd3Smacallan pushbx = tempbx; 6369dfe64dd3Smacallan tempax = pVBInfo->VT; 6370dfe64dd3Smacallan pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES; 6371dfe64dd3Smacallan pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS; 6372dfe64dd3Smacallan pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES; 6373dfe64dd3Smacallan pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS; 6374dfe64dd3Smacallan tempbx = pVBInfo->LCDVDES; 6375dfe64dd3Smacallan tempcx += tempbx; 6376dfe64dd3Smacallan 6377dfe64dd3Smacallan if (tempcx >= tempax) 6378dfe64dd3Smacallan tempcx -= tempax; /* lcdvdes */ 6379dfe64dd3Smacallan 6380dfe64dd3Smacallan temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */ 6381dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x05, temp); 6382dfe64dd3Smacallan temp = tempcx & 0x00FF; 6383dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x06, temp); 6384dfe64dd3Smacallan tempch = ((tempcx & 0xFF00) >> 8) & 0x07; 6385dfe64dd3Smacallan tempbh = ((tempbx & 0xFF00) >> 8) & 0x07; 6386dfe64dd3Smacallan tempah = tempch; 6387dfe64dd3Smacallan tempah = tempah << 3; 6388dfe64dd3Smacallan tempah |= tempbh; 6389dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x02, tempah); 6390dfe64dd3Smacallan 6391dfe64dd3Smacallan /* getlcdsync() */ 6392dfe64dd3Smacallan XGI_GetLCDSync(&tempax, &tempbx, pVBInfo); 6393dfe64dd3Smacallan if (pVBInfo->LCDInfo & EnableScalingLCD) { 6394dfe64dd3Smacallan LCDPtr1 = 6395dfe64dd3Smacallan (XGI330_LCDDataDesStruct2 *) XGI_GetLcdPtr(4, ModeNo, ModeIdIndex, 6396dfe64dd3Smacallan RefreshRateTableIndex, 6397dfe64dd3Smacallan pVBInfo); 6398dfe64dd3Smacallan tempbx = LCDPtr1->LCDVSync; 6399dfe64dd3Smacallan } 6400dfe64dd3Smacallan tempcx = tempbx; 6401dfe64dd3Smacallan tempax = pVBInfo->VT; 6402dfe64dd3Smacallan tempbx = pVBInfo->LCDVRS; 6403dfe64dd3Smacallan 6404dfe64dd3Smacallan /* if ( SetLCD_Info & EnableScalingLCD ) */ 6405dfe64dd3Smacallan tempcx += tempbx; 6406dfe64dd3Smacallan if (tempcx >= tempax) 6407dfe64dd3Smacallan tempcx -= tempax; 6408dfe64dd3Smacallan 6409dfe64dd3Smacallan temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */ 6410dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x04, temp); 6411dfe64dd3Smacallan temp = (tempbx & 0xFF00) >> 8; 6412dfe64dd3Smacallan temp = temp << 4; 6413dfe64dd3Smacallan temp |= (tempcx & 0x000F); 6414dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x01, temp); 6415dfe64dd3Smacallan tempcx = pushbx; 6416dfe64dd3Smacallan tempax = pVBInfo->HT; 6417dfe64dd3Smacallan tempbx = pVBInfo->LCDHDES; 6418dfe64dd3Smacallan tempbx &= 0x0FFF; 6419dfe64dd3Smacallan 6420dfe64dd3Smacallan if (XGI_IsLCDDualLink(pVBInfo)) { 6421dfe64dd3Smacallan tempax = tempax >> 1; 6422dfe64dd3Smacallan tempbx = tempbx >> 1; 6423dfe64dd3Smacallan tempcx = tempcx >> 1; 6424dfe64dd3Smacallan } 6425dfe64dd3Smacallan 6426dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI302LV) 6427dfe64dd3Smacallan tempbx += 1; 6428dfe64dd3Smacallan 6429dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301C) /* tap4 */ 6430dfe64dd3Smacallan tempbx += 1; 6431dfe64dd3Smacallan 6432dfe64dd3Smacallan tempcx += tempbx; 6433dfe64dd3Smacallan 6434dfe64dd3Smacallan if (tempcx >= tempax) 6435dfe64dd3Smacallan tempcx -= tempax; 6436dfe64dd3Smacallan 6437dfe64dd3Smacallan temp = tempbx & 0x00FF; 6438dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */ 6439dfe64dd3Smacallan temp = ((tempbx & 0xFF00) >> 8) << 4; 6440dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x20, temp); 6441dfe64dd3Smacallan temp = tempcx & 0x00FF; 6442dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */ 6443dfe64dd3Smacallan temp = (tempcx & 0xFF00) >> 8; 6444dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x25, temp); 6445dfe64dd3Smacallan 6446dfe64dd3Smacallan /* getlcdsync() */ 6447dfe64dd3Smacallan XGI_GetLCDSync(&tempax, &tempbx, pVBInfo); 6448dfe64dd3Smacallan if (pVBInfo->LCDInfo & EnableScalingLCD) { 6449dfe64dd3Smacallan LCDPtr1 = 6450dfe64dd3Smacallan (XGI330_LCDDataDesStruct2 *) XGI_GetLcdPtr(4, ModeNo, ModeIdIndex, 6451dfe64dd3Smacallan RefreshRateTableIndex, 6452dfe64dd3Smacallan pVBInfo); 6453dfe64dd3Smacallan tempax = LCDPtr1->LCDHSync; 6454dfe64dd3Smacallan } 6455dfe64dd3Smacallan tempcx = tempax; 6456dfe64dd3Smacallan tempax = pVBInfo->HT; 6457dfe64dd3Smacallan tempbx = pVBInfo->LCDHRS; 6458dfe64dd3Smacallan /* if ( SetLCD_Info & EnableScalingLCD) */ 6459dfe64dd3Smacallan if (XGI_IsLCDDualLink(pVBInfo)) { 6460dfe64dd3Smacallan tempax = tempax >> 1; 6461dfe64dd3Smacallan tempbx = tempbx >> 1; 6462dfe64dd3Smacallan tempcx = tempcx >> 1; 6463dfe64dd3Smacallan } 6464dfe64dd3Smacallan 6465dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI302LV) 6466dfe64dd3Smacallan tempbx += 1; 6467dfe64dd3Smacallan 6468dfe64dd3Smacallan tempcx += tempbx; 6469dfe64dd3Smacallan 6470dfe64dd3Smacallan if (tempcx >= tempax) 6471dfe64dd3Smacallan tempcx -= tempax; 6472dfe64dd3Smacallan 6473dfe64dd3Smacallan temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */ 6474dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x1C, temp); 6475dfe64dd3Smacallan 6476dfe64dd3Smacallan temp = (tempbx & 0xFF00) >> 8; 6477dfe64dd3Smacallan temp = temp << 4; 6478dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x1D, ~0x0F0, temp); 6479dfe64dd3Smacallan temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */ 6480dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x21, temp); 6481dfe64dd3Smacallan 6482dfe64dd3Smacallan if (!(pVBInfo->LCDInfo & LCDVESATiming)) { 6483dfe64dd3Smacallan if (pVBInfo->VGAVDE == 525) { 6484dfe64dd3Smacallan if (pVBInfo-> 6485dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV 6486dfe64dd3Smacallan | VB_XGI301C)) { 6487dfe64dd3Smacallan temp = 0xC6; 6488dfe64dd3Smacallan } 6489dfe64dd3Smacallan else 6490dfe64dd3Smacallan temp = 0xC4; 6491dfe64dd3Smacallan 6492dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x2f, temp); 6493dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x30, 0xB3); 6494dfe64dd3Smacallan } 6495dfe64dd3Smacallan 6496dfe64dd3Smacallan if (pVBInfo->VGAVDE == 420) { 6497dfe64dd3Smacallan if (pVBInfo-> 6498dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV 6499dfe64dd3Smacallan | VB_XGI301C)) { 6500dfe64dd3Smacallan temp = 0x4F; 6501dfe64dd3Smacallan } 6502dfe64dd3Smacallan else 6503dfe64dd3Smacallan temp = 0x4E; 6504dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x2f, temp); 6505dfe64dd3Smacallan } 6506dfe64dd3Smacallan } 6507dfe64dd3Smacallan} 6508dfe64dd3Smacallan 6509dfe64dd3Smacallan 6510dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6511dfe64dd3Smacallan/* Function : XGI_GetTap4Ptr */ 6512dfe64dd3Smacallan/* Input : */ 6513dfe64dd3Smacallan/* Output : di -> Tap4 Reg. Setting Pointer */ 6514dfe64dd3Smacallan/* Description : */ 6515dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6516dfe64dd3Smacallanconst XGI301C_Tap4TimingStruct * 6517dfe64dd3SmacallanXGI_GetTap4Ptr(USHORT tempcx, PVB_DEVICE_INFO pVBInfo) 6518dfe64dd3Smacallan{ 6519dfe64dd3Smacallan USHORT tempax, tempbx, i; 6520dfe64dd3Smacallan 6521dfe64dd3Smacallan const XGI301C_Tap4TimingStruct *Tap4TimingPtr; 6522dfe64dd3Smacallan 6523dfe64dd3Smacallan if (tempcx == 0) { 6524dfe64dd3Smacallan tempax = pVBInfo->VGAHDE; 6525dfe64dd3Smacallan tempbx = pVBInfo->HDE; 6526dfe64dd3Smacallan } 6527dfe64dd3Smacallan else { 6528dfe64dd3Smacallan tempax = pVBInfo->VGAVDE; 6529dfe64dd3Smacallan tempbx = pVBInfo->VDE; 6530dfe64dd3Smacallan } 6531dfe64dd3Smacallan 6532dfe64dd3Smacallan if (tempax < tempbx) 6533dfe64dd3Smacallan return &EnlargeTap4Timing[0]; 6534dfe64dd3Smacallan else if (tempax == tempbx) 6535dfe64dd3Smacallan return &NoScaleTap4Timing[0]; /* 1:1 */ 6536dfe64dd3Smacallan else 6537dfe64dd3Smacallan Tap4TimingPtr = NTSCTap4Timing; /* NTSC */ 6538dfe64dd3Smacallan 6539dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALTV) 6540dfe64dd3Smacallan Tap4TimingPtr = PALTap4Timing; 6541dfe64dd3Smacallan 6542dfe64dd3Smacallan 6543dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToYPbPr) { 6544dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode525i) 6545dfe64dd3Smacallan Tap4TimingPtr = YPbPr525iTap4Timing; 6546dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode525p) 6547dfe64dd3Smacallan Tap4TimingPtr = YPbPr525pTap4Timing; 6548dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode750p) 6549dfe64dd3Smacallan Tap4TimingPtr = YPbPr750pTap4Timing; 6550dfe64dd3Smacallan } 6551dfe64dd3Smacallan 6552dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) 6553dfe64dd3Smacallan Tap4TimingPtr = HiTVTap4Timing; 6554dfe64dd3Smacallan 6555dfe64dd3Smacallan i = 0; 6556dfe64dd3Smacallan while (Tap4TimingPtr[i].DE != 0xFFFF) { 6557dfe64dd3Smacallan if (Tap4TimingPtr[i].DE == tempax) 6558dfe64dd3Smacallan break; 6559dfe64dd3Smacallan i++; 6560dfe64dd3Smacallan } 6561dfe64dd3Smacallan return &Tap4TimingPtr[i]; 6562dfe64dd3Smacallan} 6563dfe64dd3Smacallan 6564dfe64dd3Smacallan 6565dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6566dfe64dd3Smacallan/* Function : XGI_SetTap4Regs */ 6567dfe64dd3Smacallan/* Input : */ 6568dfe64dd3Smacallan/* Output : */ 6569dfe64dd3Smacallan/* Description : */ 6570dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6571dfe64dd3Smacallanvoid 6572dfe64dd3SmacallanXGI_SetTap4Regs(PVB_DEVICE_INFO pVBInfo) 6573dfe64dd3Smacallan{ 6574dfe64dd3Smacallan 6575dfe64dd3Smacallan#ifndef LINUX_XF86 6576dfe64dd3Smacallan USHORT tempcx; 6577dfe64dd3Smacallan#endif 6578dfe64dd3Smacallan USHORT i, j; 6579dfe64dd3Smacallan 6580dfe64dd3Smacallan const XGI301C_Tap4TimingStruct *Tap4TimingPtr; 6581dfe64dd3Smacallan 6582dfe64dd3Smacallan if (!(pVBInfo->VBType & VB_XGI301C)) 6583dfe64dd3Smacallan return; 6584dfe64dd3Smacallan 6585dfe64dd3Smacallan#ifndef Tap4 6586dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part2Port, 0x4E, 0xEB); /* Disable Tap4 */ 6587dfe64dd3Smacallan#else /* Tap4 Setting */ 6588dfe64dd3Smacallan 6589dfe64dd3Smacallan Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */ 6590dfe64dd3Smacallan for (i = 0x80, j = 0; i <= 0xBF; i++, j++) 6591dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, i, 6592dfe64dd3Smacallan Tap4TimingPtr->Reg[j]); 6593dfe64dd3Smacallan 6594dfe64dd3Smacallan if ((pVBInfo->VBInfo & SetCRT2ToTV) 6595dfe64dd3Smacallan && (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV))) { 6596dfe64dd3Smacallan Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo); /* Set Vertical Scaling */ 6597dfe64dd3Smacallan for (i = 0xC0, j = 0; i < 0xFF; i++, j++) 6598dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, i, 6599dfe64dd3Smacallan Tap4TimingPtr->Reg[j]); 6600dfe64dd3Smacallan } 6601dfe64dd3Smacallan 6602dfe64dd3Smacallan if ((pVBInfo->VBInfo & SetCRT2ToTV) 6603dfe64dd3Smacallan && (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV))) 6604dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x4E, ~0x14, 0x04); /* Enable V.Scaling */ 6605dfe64dd3Smacallan else 6606dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x4E, ~0x14, 0x10); /* Enable H.Scaling */ 6607dfe64dd3Smacallan#endif 6608dfe64dd3Smacallan} 6609dfe64dd3Smacallan 6610dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6611dfe64dd3Smacallan/* Function : XGI_SetGroup3 */ 6612dfe64dd3Smacallan/* Input : */ 6613dfe64dd3Smacallan/* Output : */ 6614dfe64dd3Smacallan/* Description : */ 6615dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6616dfe64dd3Smacallanvoid 6617dfe64dd3SmacallanXGI_SetGroup3(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 6618dfe64dd3Smacallan{ 6619dfe64dd3Smacallan USHORT i; 6620dfe64dd3Smacallan const UCHAR *tempdi; 6621dfe64dd3Smacallan USHORT modeflag; 6622dfe64dd3Smacallan 6623dfe64dd3Smacallan if (ModeNo <= 0x13) { 6624dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */ 6625dfe64dd3Smacallan } 6626dfe64dd3Smacallan else { 6627dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */ 6628dfe64dd3Smacallan } 6629dfe64dd3Smacallan 6630dfe64dd3Smacallan 6631dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x00, 0x00); 6632dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALTV) { 6633dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x13, 0xFA); 6634dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x14, 0xC8); 6635dfe64dd3Smacallan } 6636dfe64dd3Smacallan else { 6637dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x13, 0xF5); 6638dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x14, 0xB7); 6639dfe64dd3Smacallan } 6640dfe64dd3Smacallan 6641dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToTV)) { 6642dfe64dd3Smacallan return; 6643dfe64dd3Smacallan } 6644dfe64dd3Smacallan 6645dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALMTV) { 6646dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x13, 0xFA); 6647dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x14, 0xC8); 6648dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x3D, 0xA8); 6649dfe64dd3Smacallan } 6650dfe64dd3Smacallan 6651dfe64dd3Smacallan if ((pVBInfo->VBInfo & SetCRT2ToHiVisionTV) 6652dfe64dd3Smacallan || (pVBInfo->VBInfo & SetCRT2ToYPbPr)) { 6653dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode525i) { 6654dfe64dd3Smacallan return; 6655dfe64dd3Smacallan } 6656dfe64dd3Smacallan tempdi = pVBInfo->HiTVGroup3Data; 6657dfe64dd3Smacallan if (pVBInfo->SetFlag & TVSimuMode) { 6658dfe64dd3Smacallan tempdi = pVBInfo->HiTVGroup3Simu; 6659dfe64dd3Smacallan if (!(modeflag & Charx8Dot)) { 6660dfe64dd3Smacallan tempdi = pVBInfo->HiTVGroup3Text; 6661dfe64dd3Smacallan } 6662dfe64dd3Smacallan } 6663dfe64dd3Smacallan 6664dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode525p) { 6665dfe64dd3Smacallan tempdi = pVBInfo->Ren525pGroup3; 6666dfe64dd3Smacallan } 6667dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode750p) { 6668dfe64dd3Smacallan tempdi = pVBInfo->Ren750pGroup3; 6669dfe64dd3Smacallan } 6670dfe64dd3Smacallan 6671dfe64dd3Smacallan for (i = 0; i <= 0x3E; i++) { 6672dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, i, tempdi[i]); 6673dfe64dd3Smacallan } 6674dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */ 6675dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode525p) { 6676dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part3Port, 0x28, 0x3f); 6677dfe64dd3Smacallan } 6678dfe64dd3Smacallan } 6679dfe64dd3Smacallan } 6680dfe64dd3Smacallan return; 6681dfe64dd3Smacallan} /* {end of XGI_SetGroup3} */ 6682dfe64dd3Smacallan 6683dfe64dd3Smacallan 6684dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6685dfe64dd3Smacallan/* Function : XGI_SetGroup4 */ 6686dfe64dd3Smacallan/* Input : */ 6687dfe64dd3Smacallan/* Output : */ 6688dfe64dd3Smacallan/* Description : */ 6689dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6690dfe64dd3Smacallanvoid 6691dfe64dd3SmacallanXGI_SetGroup4(USHORT ModeNo, USHORT ModeIdIndex, USHORT RefreshRateTableIndex, 6692dfe64dd3Smacallan PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) 6693dfe64dd3Smacallan{ 6694dfe64dd3Smacallan USHORT tempax, tempcx, tempbx, modeflag, temp, temp2; 6695dfe64dd3Smacallan#ifndef LINUX_XF86 6696dfe64dd3Smacallan USHORT push1; 6697dfe64dd3Smacallan#endif 6698dfe64dd3Smacallan 6699dfe64dd3Smacallan ULONG tempebx, tempeax, templong; 6700dfe64dd3Smacallan 6701dfe64dd3Smacallan 6702dfe64dd3Smacallan if (ModeNo <= 0x13) { 6703dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */ 6704dfe64dd3Smacallan } 6705dfe64dd3Smacallan else { 6706dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */ 6707dfe64dd3Smacallan } 6708dfe64dd3Smacallan 6709dfe64dd3Smacallan temp = pVBInfo->RVBHCFACT; 6710dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x13, temp); 6711dfe64dd3Smacallan 6712dfe64dd3Smacallan tempbx = pVBInfo->RVBHCMAX; 6713dfe64dd3Smacallan temp = tempbx & 0x00FF; 6714dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x14, temp); 6715dfe64dd3Smacallan temp2 = ((tempbx & 0xFF00) >> 8) << 7; 6716dfe64dd3Smacallan tempcx = pVBInfo->VGAHT - 1; 6717dfe64dd3Smacallan temp = tempcx & 0x00FF; 6718dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x16, temp); 6719dfe64dd3Smacallan 6720dfe64dd3Smacallan temp = ((tempcx & 0xFF00) >> 8) << 3; 6721dfe64dd3Smacallan temp2 |= temp; 6722dfe64dd3Smacallan 6723dfe64dd3Smacallan tempcx = pVBInfo->VGAVT - 1; 6724dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToTV)) { 6725dfe64dd3Smacallan tempcx -= 5; 6726dfe64dd3Smacallan } 6727dfe64dd3Smacallan 6728dfe64dd3Smacallan temp = tempcx & 0x00FF; 6729dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x17, temp); 6730dfe64dd3Smacallan temp = temp2 | ((tempcx & 0xFF00) >> 8); 6731dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x15, temp); 6732dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x0D, 0x08); 6733dfe64dd3Smacallan tempcx = pVBInfo->VBInfo; 6734dfe64dd3Smacallan tempbx = pVBInfo->VGAHDE; 6735dfe64dd3Smacallan 6736dfe64dd3Smacallan if (modeflag & HalfDCLK) { 6737dfe64dd3Smacallan tempbx = tempbx >> 1; 6738dfe64dd3Smacallan } 6739dfe64dd3Smacallan 6740dfe64dd3Smacallan if (XGI_IsLCDDualLink(pVBInfo)) 6741dfe64dd3Smacallan tempbx = tempbx >> 1; 6742dfe64dd3Smacallan 6743dfe64dd3Smacallan if (tempcx & SetCRT2ToHiVisionTV) { 6744dfe64dd3Smacallan temp = 0; 6745dfe64dd3Smacallan if (tempbx <= 1024) 6746dfe64dd3Smacallan temp = 0xA0; 6747dfe64dd3Smacallan if (tempbx == 1280) 6748dfe64dd3Smacallan temp = 0xC0; 6749dfe64dd3Smacallan } 6750dfe64dd3Smacallan else if (tempcx & SetCRT2ToTV) { 6751dfe64dd3Smacallan temp = 0xA0; 6752dfe64dd3Smacallan if (tempbx <= 800) 6753dfe64dd3Smacallan temp = 0x80; 6754dfe64dd3Smacallan } 6755dfe64dd3Smacallan else { 6756dfe64dd3Smacallan temp = 0x80; 6757dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCD) { 6758dfe64dd3Smacallan temp = 0; 6759dfe64dd3Smacallan if (tempbx > 800) 6760dfe64dd3Smacallan temp = 0x60; 6761dfe64dd3Smacallan } 6762dfe64dd3Smacallan } 6763dfe64dd3Smacallan 6764dfe64dd3Smacallan if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p)) { 6765dfe64dd3Smacallan temp = 0x00; 6766dfe64dd3Smacallan if (pVBInfo->VGAHDE == 1280) 6767dfe64dd3Smacallan temp = 0x40; 6768dfe64dd3Smacallan if (pVBInfo->VGAHDE == 1024) 6769dfe64dd3Smacallan temp = 0x20; 6770dfe64dd3Smacallan } 6771dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x0E, ~0xEF, temp); 6772dfe64dd3Smacallan 6773dfe64dd3Smacallan tempebx = pVBInfo->VDE; 6774dfe64dd3Smacallan 6775dfe64dd3Smacallan if (tempcx & SetCRT2ToHiVisionTV) { 6776dfe64dd3Smacallan if (!(temp & 0xE000)) 6777dfe64dd3Smacallan tempbx = tempbx >> 1; 6778dfe64dd3Smacallan } 6779dfe64dd3Smacallan 6780dfe64dd3Smacallan tempcx = pVBInfo->RVBHRS; 6781dfe64dd3Smacallan temp = tempcx & 0x00FF; 6782dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x18, temp); 6783dfe64dd3Smacallan 6784dfe64dd3Smacallan tempeax = pVBInfo->VGAVDE; 6785dfe64dd3Smacallan tempcx |= 0x04000; 6786dfe64dd3Smacallan 6787dfe64dd3Smacallan 6788dfe64dd3Smacallan if (tempeax <= tempebx) { 6789dfe64dd3Smacallan tempcx = (tempcx & (~0x4000)); 6790dfe64dd3Smacallan tempeax = pVBInfo->VGAVDE; 6791dfe64dd3Smacallan } 6792dfe64dd3Smacallan else { 6793dfe64dd3Smacallan tempeax -= tempebx; 6794dfe64dd3Smacallan } 6795dfe64dd3Smacallan 6796dfe64dd3Smacallan 6797dfe64dd3Smacallan templong = (tempeax * 256 * 1024) % tempebx; 6798dfe64dd3Smacallan tempeax = (tempeax * 256 * 1024) / tempebx; 6799dfe64dd3Smacallan tempebx = tempeax; 6800dfe64dd3Smacallan 6801dfe64dd3Smacallan if (templong != 0) { 6802dfe64dd3Smacallan tempebx++; 6803dfe64dd3Smacallan } 6804dfe64dd3Smacallan 6805dfe64dd3Smacallan 6806dfe64dd3Smacallan temp = (USHORT) (tempebx & 0x000000FF); 6807dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x1B, temp); 6808dfe64dd3Smacallan 6809dfe64dd3Smacallan temp = (USHORT) ((tempebx & 0x0000FF00) >> 8); 6810dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x1A, temp); 6811dfe64dd3Smacallan tempbx = (USHORT) (tempebx >> 16); 6812dfe64dd3Smacallan temp = tempbx & 0x00FF; 6813dfe64dd3Smacallan temp = temp << 4; 6814dfe64dd3Smacallan temp |= ((tempcx & 0xFF00) >> 8); 6815dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x19, temp); 6816dfe64dd3Smacallan 6817dfe64dd3Smacallan /* 301b */ 6818dfe64dd3Smacallan if (pVBInfo-> 6819dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 6820dfe64dd3Smacallan VB_XGI301C)) { 6821dfe64dd3Smacallan temp = 0x0028; 6822dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x1C, temp); 6823dfe64dd3Smacallan tempax = pVBInfo->VGAHDE; 6824dfe64dd3Smacallan if (modeflag & HalfDCLK) { 6825dfe64dd3Smacallan tempax = tempax >> 1; 6826dfe64dd3Smacallan } 6827dfe64dd3Smacallan 6828dfe64dd3Smacallan if (XGI_IsLCDDualLink(pVBInfo)) 6829dfe64dd3Smacallan tempax = tempax >> 1; 6830dfe64dd3Smacallan 6831dfe64dd3Smacallan /* if((pVBInfo->VBInfo&(SetCRT2ToLCD))||((pVBInfo->TVInfo&SetYPbPrMode525p)||(pVBInfo->TVInfo&SetYPbPrMode750p))) { */ 6832dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCD) { 6833dfe64dd3Smacallan if (tempax > 800) 6834dfe64dd3Smacallan tempax -= 800; 6835dfe64dd3Smacallan } 6836dfe64dd3Smacallan else { 6837dfe64dd3Smacallan if (pVBInfo->VGAHDE > 800) { 6838dfe64dd3Smacallan if (pVBInfo->VGAHDE == 1024) 6839dfe64dd3Smacallan tempax = (tempax * 25 / 32) - 1; 6840dfe64dd3Smacallan else 6841dfe64dd3Smacallan tempax = (tempax * 20 / 32) - 1; 6842dfe64dd3Smacallan } 6843dfe64dd3Smacallan } 6844dfe64dd3Smacallan tempax -= 1; 6845dfe64dd3Smacallan 6846dfe64dd3Smacallan/* 6847dfe64dd3Smacallan if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToHiVisionTV ) ) 6848dfe64dd3Smacallan { 6849dfe64dd3Smacallan if ( pVBInfo->VBType & VB_XGI301LV ) 6850dfe64dd3Smacallan { 6851dfe64dd3Smacallan if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) ) 6852dfe64dd3Smacallan { 6853dfe64dd3Smacallan if ( pVBInfo->VGAHDE > 800 ) 6854dfe64dd3Smacallan { 6855dfe64dd3Smacallan if ( pVBInfo->VGAHDE == 1024 ) 6856dfe64dd3Smacallan tempax = ( tempax * 25 / 32 ) - 1 ; 6857dfe64dd3Smacallan else 6858dfe64dd3Smacallan tempax = ( tempax * 20 / 32 ) - 1 ; 6859dfe64dd3Smacallan } 6860dfe64dd3Smacallan } 6861dfe64dd3Smacallan } 6862dfe64dd3Smacallan else 6863dfe64dd3Smacallan { 6864dfe64dd3Smacallan if ( pVBInfo->VGAHDE > 800 ) 6865dfe64dd3Smacallan { 6866dfe64dd3Smacallan if ( pVBInfo->VGAHDE == 1024 ) 6867dfe64dd3Smacallan tempax = ( tempax * 25 / 32 ) - 1 ; 6868dfe64dd3Smacallan else 6869dfe64dd3Smacallan tempax = ( tempax * 20 / 32 ) - 1 ; 6870dfe64dd3Smacallan } 6871dfe64dd3Smacallan } 6872dfe64dd3Smacallan } 6873dfe64dd3Smacallan*/ 6874dfe64dd3Smacallan 6875dfe64dd3Smacallan temp = (tempax & 0xFF00) >> 8; 6876dfe64dd3Smacallan temp = ((temp & 0x0003) << 4); 6877dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x1E, temp); 6878dfe64dd3Smacallan temp = (tempax & 0x00FF); 6879dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x1D, temp); 6880dfe64dd3Smacallan 6881dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) { 6882dfe64dd3Smacallan if (pVBInfo->VGAHDE > 800) { 6883dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x1E, 0x08); 6884dfe64dd3Smacallan } 6885dfe64dd3Smacallan } 6886dfe64dd3Smacallan temp = 0x0036; 6887dfe64dd3Smacallan 6888dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { 6889dfe64dd3Smacallan if (! 6890dfe64dd3Smacallan (pVBInfo-> 6891dfe64dd3Smacallan TVInfo & (NTSC1024x768 | SetYPbPrMode525p | SetYPbPrMode750p 6892dfe64dd3Smacallan | SetYPbPrMode1080i))) { 6893dfe64dd3Smacallan temp |= 0x0001; 6894dfe64dd3Smacallan if ((pVBInfo->VBInfo & SetInSlaveMode) 6895dfe64dd3Smacallan && (!(pVBInfo->TVInfo & TVSimuMode))) 6896dfe64dd3Smacallan temp &= (~0x0001); 6897dfe64dd3Smacallan } 6898dfe64dd3Smacallan } 6899dfe64dd3Smacallan 6900dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x1F, 0x00C0, 6901dfe64dd3Smacallan temp); 6902dfe64dd3Smacallan tempbx = pVBInfo->HT; 6903dfe64dd3Smacallan if (XGI_IsLCDDualLink(pVBInfo)) 6904dfe64dd3Smacallan tempbx = tempbx >> 1; 6905dfe64dd3Smacallan tempbx = (tempbx >> 1) - 2; 6906dfe64dd3Smacallan temp = ((tempbx & 0x0700) >> 8) << 3; 6907dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x21, 0x00C0, 6908dfe64dd3Smacallan temp); 6909dfe64dd3Smacallan temp = tempbx & 0x00FF; 6910dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x22, temp); 6911dfe64dd3Smacallan } 6912dfe64dd3Smacallan /* end 301b */ 6913dfe64dd3Smacallan 6914dfe64dd3Smacallan if (pVBInfo->ISXPDOS == 0) 6915dfe64dd3Smacallan XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo); 6916dfe64dd3Smacallan} 6917dfe64dd3Smacallan 6918dfe64dd3Smacallan 6919dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6920dfe64dd3Smacallan/* Function : XGI_SetGroup5 */ 6921dfe64dd3Smacallan/* Input : */ 6922dfe64dd3Smacallan/* Output : */ 6923dfe64dd3Smacallan/* Description : */ 6924dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6925dfe64dd3Smacallanvoid 6926dfe64dd3SmacallanXGI_SetGroup5(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 6927dfe64dd3Smacallan{ 6928dfe64dd3Smacallan USHORT Pindex, Pdata; 6929dfe64dd3Smacallan 6930dfe64dd3Smacallan Pindex = pVBInfo->Part5Port; 6931dfe64dd3Smacallan Pdata = pVBInfo->Part5Port + 1; 6932dfe64dd3Smacallan if (pVBInfo->ModeType == ModeVGA) { 6933dfe64dd3Smacallan if (! 6934dfe64dd3Smacallan (pVBInfo-> 6935dfe64dd3Smacallan VBInfo & (SetInSlaveMode | LoadDACFlag | CRT2DisplayFlag))) { 6936dfe64dd3Smacallan XGINew_EnableCRT2(pVBInfo); 6937dfe64dd3Smacallan /* LoadDAC2(pVBInfo->Part5Port,ModeNo,ModeIdIndex); */ 6938dfe64dd3Smacallan } 6939dfe64dd3Smacallan } 6940dfe64dd3Smacallan return; 6941dfe64dd3Smacallan} 6942dfe64dd3Smacallan 6943dfe64dd3Smacallan 6944dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6945dfe64dd3Smacallan/* Function : XGI_GetLcdPtr */ 6946dfe64dd3Smacallan/* Input : */ 6947dfe64dd3Smacallan/* Output : */ 6948dfe64dd3Smacallan/* Description : */ 6949dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 6950dfe64dd3Smacallanconst void * 6951dfe64dd3SmacallanXGI_GetLcdPtr(USHORT BX, USHORT ModeNo, USHORT ModeIdIndex, 6952dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 6953dfe64dd3Smacallan{ 6954dfe64dd3Smacallan USHORT i, tempdx, tempcx, tempbx, tempal, modeflag, table; 6955dfe64dd3Smacallan 6956dfe64dd3Smacallan const XGI330_LCDDataTablStruct *tempdi = 0; 6957dfe64dd3Smacallan 6958dfe64dd3Smacallan 6959dfe64dd3Smacallan tempbx = BX; 6960dfe64dd3Smacallan 6961dfe64dd3Smacallan if (ModeNo <= 0x13) { 6962dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; 6963dfe64dd3Smacallan tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC; 6964dfe64dd3Smacallan } 6965dfe64dd3Smacallan else { 6966dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 6967dfe64dd3Smacallan tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC; 6968dfe64dd3Smacallan } 6969dfe64dd3Smacallan 6970dfe64dd3Smacallan if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */ 6971dfe64dd3Smacallan if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO == 0x14) { 6972dfe64dd3Smacallan tempal = 0x0A; 6973dfe64dd3Smacallan } 6974dfe64dd3Smacallan else if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO == 0x0F) { 6975dfe64dd3Smacallan tempal = 0x0B; 6976dfe64dd3Smacallan } 6977dfe64dd3Smacallan } 6978dfe64dd3Smacallan 6979dfe64dd3Smacallan tempal = tempal & 0x0f; 6980dfe64dd3Smacallan 6981dfe64dd3Smacallan if (tempbx <= 1) { /* ExpLink */ 6982dfe64dd3Smacallan if (ModeNo <= 0x13) { 6983dfe64dd3Smacallan tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC; /* find no Ext_CRT2CRTC2 */ 6984dfe64dd3Smacallan } 6985dfe64dd3Smacallan else { 6986dfe64dd3Smacallan tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC; 6987dfe64dd3Smacallan } 6988dfe64dd3Smacallan 6989dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCDA) { 6990dfe64dd3Smacallan if (ModeNo <= 0x13) 6991dfe64dd3Smacallan tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC2; 6992dfe64dd3Smacallan else 6993dfe64dd3Smacallan tempal = 6994dfe64dd3Smacallan pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC2; 6995dfe64dd3Smacallan } 6996dfe64dd3Smacallan 6997dfe64dd3Smacallan if (tempbx & 0x01) 6998dfe64dd3Smacallan tempal = (tempal >> 4); 6999dfe64dd3Smacallan 7000dfe64dd3Smacallan tempal = (tempal & 0x0f); 7001dfe64dd3Smacallan } 7002dfe64dd3Smacallan 7003dfe64dd3Smacallan tempcx = LCDLenList[tempbx]; /* mov cl,byte ptr cs:LCDLenList[bx] */ 7004dfe64dd3Smacallan 7005dfe64dd3Smacallan if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */ 7006dfe64dd3Smacallan if ((tempbx == 5) || (tempbx) == 7) 7007dfe64dd3Smacallan tempcx = LCDDesDataLen2; 7008dfe64dd3Smacallan else if ((tempbx == 3) || (tempbx == 8)) 7009dfe64dd3Smacallan tempcx = LVDSDesDataLen2; 7010dfe64dd3Smacallan } 7011dfe64dd3Smacallan /* mov di, word ptr cs:LCDDataList[bx] */ 7012dfe64dd3Smacallan /* tempdi=pVideoMemory[LCDDataList+tempbx*2]|(pVideoMemory[LCDDataList+tempbx*2+1]<<8); */ 7013dfe64dd3Smacallan 7014dfe64dd3Smacallan switch (tempbx) { 7015dfe64dd3Smacallan case 0: 7016dfe64dd3Smacallan tempdi = XGI_EPLLCDCRT1Ptr_H; 7017dfe64dd3Smacallan break; 7018dfe64dd3Smacallan case 1: 7019dfe64dd3Smacallan tempdi = XGI_EPLLCDCRT1Ptr_V; 7020dfe64dd3Smacallan break; 7021dfe64dd3Smacallan case 2: 7022dfe64dd3Smacallan tempdi = XGI_EPLLCDDataPtr; 7023dfe64dd3Smacallan break; 7024dfe64dd3Smacallan case 3: 7025dfe64dd3Smacallan tempdi = XGI_EPLLCDDesDataPtr; 7026dfe64dd3Smacallan break; 7027dfe64dd3Smacallan case 4: 7028dfe64dd3Smacallan tempdi = XGI_LCDDataTable; 7029dfe64dd3Smacallan break; 7030dfe64dd3Smacallan case 5: 7031dfe64dd3Smacallan tempdi = XGI_LCDDesDataTable; 7032dfe64dd3Smacallan break; 7033dfe64dd3Smacallan case 6: 7034dfe64dd3Smacallan tempdi = XGI_EPLCHLCDRegPtr; 7035dfe64dd3Smacallan break; 7036dfe64dd3Smacallan case 7: 7037dfe64dd3Smacallan case 8: 7038dfe64dd3Smacallan case 9: 7039dfe64dd3Smacallan tempdi = 0; 7040dfe64dd3Smacallan break; 7041dfe64dd3Smacallan default: 7042dfe64dd3Smacallan break; 7043dfe64dd3Smacallan } 7044dfe64dd3Smacallan 7045dfe64dd3Smacallan if (tempdi == 0x00) /* OEMUtil */ 7046dfe64dd3Smacallan return 0; 7047dfe64dd3Smacallan 7048dfe64dd3Smacallan table = tempbx; 7049dfe64dd3Smacallan i = 0; 7050dfe64dd3Smacallan 7051dfe64dd3Smacallan while (tempdi[i].PANELID != 0xff) { 7052dfe64dd3Smacallan tempdx = pVBInfo->LCDResInfo; 7053dfe64dd3Smacallan if (tempbx & 0x0080) { /* OEMUtil */ 7054dfe64dd3Smacallan tempbx &= (~0x0080); 7055dfe64dd3Smacallan tempdx = pVBInfo->LCDTypeInfo; 7056dfe64dd3Smacallan } 7057dfe64dd3Smacallan 7058dfe64dd3Smacallan if (pVBInfo->LCDInfo & EnableScalingLCD) { 7059dfe64dd3Smacallan if ((pVBInfo->LCDInfo & EnableReduceTiming) 7060dfe64dd3Smacallan && (pVBInfo->LCDResInfo == Panel1600x1200)) { 7061dfe64dd3Smacallan tempdx = Panel1600x1200_1; 7062dfe64dd3Smacallan } 7063dfe64dd3Smacallan else { 7064dfe64dd3Smacallan tempdx &= (~PanelResInfo); 7065dfe64dd3Smacallan } 7066dfe64dd3Smacallan } 7067dfe64dd3Smacallan if (tempdi[i].PANELID == tempdx) { 7068dfe64dd3Smacallan tempbx = tempdi[i].MASK; 7069dfe64dd3Smacallan tempdx = pVBInfo->LCDInfo; 7070dfe64dd3Smacallan 7071dfe64dd3Smacallan if (ModeNo <= 0x13) /* alan 09/10/2003 */ 7072dfe64dd3Smacallan tempdx |= SetLCDStdMode; 7073dfe64dd3Smacallan 7074dfe64dd3Smacallan if (modeflag & HalfDCLK) 7075dfe64dd3Smacallan tempdx |= SetLCDLowResolution; 7076dfe64dd3Smacallan 7077dfe64dd3Smacallan tempbx &= tempdx; 7078dfe64dd3Smacallan if (tempbx == tempdi[i].CAP) 7079dfe64dd3Smacallan break; 7080dfe64dd3Smacallan } 7081dfe64dd3Smacallan i++; 7082dfe64dd3Smacallan } 7083dfe64dd3Smacallan 7084dfe64dd3Smacallan if (table == 0) { 7085dfe64dd3Smacallan switch (tempdi[i].DATAPTR) { 7086dfe64dd3Smacallan case 0: 7087dfe64dd3Smacallan return &XGI_LVDSCRT11024x768_1_H[tempal]; 7088dfe64dd3Smacallan break; 7089dfe64dd3Smacallan case 1: 7090dfe64dd3Smacallan return &XGI_LVDSCRT11024x768_2_H[tempal]; 7091dfe64dd3Smacallan break; 7092dfe64dd3Smacallan case 2: 7093dfe64dd3Smacallan return &XGI_LVDSCRT11280x1024_1_H[tempal]; 7094dfe64dd3Smacallan break; 7095dfe64dd3Smacallan case 3: 7096dfe64dd3Smacallan return &XGI_LVDSCRT11280x1024_2_H[tempal]; 7097dfe64dd3Smacallan break; 7098dfe64dd3Smacallan case 4: 7099dfe64dd3Smacallan return &XGI_LVDSCRT11400x1050_1_H[tempal]; 7100dfe64dd3Smacallan break; 7101dfe64dd3Smacallan case 5: 7102dfe64dd3Smacallan return &XGI_LVDSCRT11400x1050_2_H[tempal]; 7103dfe64dd3Smacallan break; 7104dfe64dd3Smacallan case 6: 7105dfe64dd3Smacallan return &XGI_LVDSCRT11600x1200_1_H[tempal]; 7106dfe64dd3Smacallan break; 7107dfe64dd3Smacallan case 7: 7108dfe64dd3Smacallan return &XGI_LVDSCRT11024x768_1_Hx75[tempal]; 7109dfe64dd3Smacallan break; 7110dfe64dd3Smacallan case 8: 7111dfe64dd3Smacallan return &XGI_LVDSCRT11024x768_2_Hx75[tempal]; 7112dfe64dd3Smacallan break; 7113dfe64dd3Smacallan case 9: 7114dfe64dd3Smacallan return &XGI_LVDSCRT11280x1024_1_Hx75[tempal]; 7115dfe64dd3Smacallan break; 7116dfe64dd3Smacallan case 10: 7117dfe64dd3Smacallan return &XGI_LVDSCRT11280x1024_2_Hx75[tempal]; 7118dfe64dd3Smacallan break; 7119dfe64dd3Smacallan default: 7120dfe64dd3Smacallan break; 7121dfe64dd3Smacallan } 7122dfe64dd3Smacallan } 7123dfe64dd3Smacallan else if (table == 1) { 7124dfe64dd3Smacallan switch (tempdi[i].DATAPTR) { 7125dfe64dd3Smacallan case 0: 7126dfe64dd3Smacallan return &XGI_LVDSCRT11024x768_1_V[tempal]; 7127dfe64dd3Smacallan break; 7128dfe64dd3Smacallan case 1: 7129dfe64dd3Smacallan return &XGI_LVDSCRT11024x768_2_V[tempal]; 7130dfe64dd3Smacallan break; 7131dfe64dd3Smacallan case 2: 7132dfe64dd3Smacallan return &XGI_LVDSCRT11280x1024_1_V[tempal]; 7133dfe64dd3Smacallan break; 7134dfe64dd3Smacallan case 3: 7135dfe64dd3Smacallan return &XGI_LVDSCRT11280x1024_2_V[tempal]; 7136dfe64dd3Smacallan break; 7137dfe64dd3Smacallan case 4: 7138dfe64dd3Smacallan return &XGI_LVDSCRT11400x1050_1_V[tempal]; 7139dfe64dd3Smacallan break; 7140dfe64dd3Smacallan case 5: 7141dfe64dd3Smacallan return &XGI_LVDSCRT11400x1050_2_V[tempal]; 7142dfe64dd3Smacallan break; 7143dfe64dd3Smacallan case 6: 7144dfe64dd3Smacallan return &XGI_LVDSCRT11600x1200_1_V[tempal]; 7145dfe64dd3Smacallan break; 7146dfe64dd3Smacallan case 7: 7147dfe64dd3Smacallan return &XGI_LVDSCRT11024x768_1_Vx75[tempal]; 7148dfe64dd3Smacallan break; 7149dfe64dd3Smacallan case 8: 7150dfe64dd3Smacallan return &XGI_LVDSCRT11024x768_2_Vx75[tempal]; 7151dfe64dd3Smacallan break; 7152dfe64dd3Smacallan case 9: 7153dfe64dd3Smacallan return &XGI_LVDSCRT11280x1024_1_Vx75[tempal]; 7154dfe64dd3Smacallan break; 7155dfe64dd3Smacallan case 10: 7156dfe64dd3Smacallan return &XGI_LVDSCRT11280x1024_2_Vx75[tempal]; 7157dfe64dd3Smacallan break; 7158dfe64dd3Smacallan default: 7159dfe64dd3Smacallan break; 7160dfe64dd3Smacallan } 7161dfe64dd3Smacallan } 7162dfe64dd3Smacallan else if (table == 2) { 7163dfe64dd3Smacallan switch (tempdi[i].DATAPTR) { 7164dfe64dd3Smacallan case 0: 7165dfe64dd3Smacallan return &XGI_LVDS1024x768Data_1[tempal]; 7166dfe64dd3Smacallan break; 7167dfe64dd3Smacallan case 1: 7168dfe64dd3Smacallan return &XGI_LVDS1024x768Data_2[tempal]; 7169dfe64dd3Smacallan break; 7170dfe64dd3Smacallan case 2: 7171dfe64dd3Smacallan return &XGI_LVDS1280x1024Data_1[tempal]; 7172dfe64dd3Smacallan break; 7173dfe64dd3Smacallan case 3: 7174dfe64dd3Smacallan return &XGI_LVDS1280x1024Data_2[tempal]; 7175dfe64dd3Smacallan break; 7176dfe64dd3Smacallan case 4: 7177dfe64dd3Smacallan return &XGI_LVDS1400x1050Data_1[tempal]; 7178dfe64dd3Smacallan break; 7179dfe64dd3Smacallan case 5: 7180dfe64dd3Smacallan return &XGI_LVDS1400x1050Data_2[tempal]; 7181dfe64dd3Smacallan break; 7182dfe64dd3Smacallan case 6: 7183dfe64dd3Smacallan return &XGI_LVDS1600x1200Data_1[tempal]; 7184dfe64dd3Smacallan break; 7185dfe64dd3Smacallan case 7: 7186dfe64dd3Smacallan return &XGI_LVDSNoScalingData[tempal]; 7187dfe64dd3Smacallan break; 7188dfe64dd3Smacallan case 8: 7189dfe64dd3Smacallan return &XGI_LVDS1024x768Data_1x75[tempal]; 7190dfe64dd3Smacallan break; 7191dfe64dd3Smacallan case 9: 7192dfe64dd3Smacallan return &XGI_LVDS1024x768Data_2x75[tempal]; 7193dfe64dd3Smacallan break; 7194dfe64dd3Smacallan case 10: 7195dfe64dd3Smacallan return &XGI_LVDS1280x1024Data_1x75[tempal]; 7196dfe64dd3Smacallan break; 7197dfe64dd3Smacallan case 11: 7198dfe64dd3Smacallan return &XGI_LVDS1280x1024Data_2x75[tempal]; 7199dfe64dd3Smacallan break; 7200dfe64dd3Smacallan case 12: 7201dfe64dd3Smacallan return &XGI_LVDSNoScalingDatax75[tempal]; 7202dfe64dd3Smacallan break; 7203dfe64dd3Smacallan default: 7204dfe64dd3Smacallan break; 7205dfe64dd3Smacallan } 7206dfe64dd3Smacallan } 7207dfe64dd3Smacallan else if (table == 3) { 7208dfe64dd3Smacallan switch (tempdi[i].DATAPTR) { 7209dfe64dd3Smacallan case 0: 7210dfe64dd3Smacallan return &XGI_LVDS1024x768Des_1[tempal]; 7211dfe64dd3Smacallan break; 7212dfe64dd3Smacallan case 1: 7213dfe64dd3Smacallan return &XGI_LVDS1024x768Des_3[tempal]; 7214dfe64dd3Smacallan break; 7215dfe64dd3Smacallan case 2: 7216dfe64dd3Smacallan return &XGI_LVDS1024x768Des_2[tempal]; 7217dfe64dd3Smacallan break; 7218dfe64dd3Smacallan case 3: 7219dfe64dd3Smacallan return &XGI_LVDS1280x1024Des_1[tempal]; 7220dfe64dd3Smacallan break; 7221dfe64dd3Smacallan case 4: 7222dfe64dd3Smacallan return &XGI_LVDS1280x1024Des_2[tempal]; 7223dfe64dd3Smacallan break; 7224dfe64dd3Smacallan case 5: 7225dfe64dd3Smacallan return &XGI_LVDS1400x1050Des_1[tempal]; 7226dfe64dd3Smacallan break; 7227dfe64dd3Smacallan case 6: 7228dfe64dd3Smacallan return &XGI_LVDS1400x1050Des_2[tempal]; 7229dfe64dd3Smacallan break; 7230dfe64dd3Smacallan case 7: 7231dfe64dd3Smacallan return &XGI_LVDS1600x1200Des_1[tempal]; 7232dfe64dd3Smacallan break; 7233dfe64dd3Smacallan case 8: 7234dfe64dd3Smacallan return &XGI_LVDSNoScalingDesData[tempal]; 7235dfe64dd3Smacallan break; 7236dfe64dd3Smacallan case 9: 7237dfe64dd3Smacallan return &XGI_LVDS1024x768Des_1x75[tempal]; 7238dfe64dd3Smacallan break; 7239dfe64dd3Smacallan case 10: 7240dfe64dd3Smacallan return &XGI_LVDS1024x768Des_3x75[tempal]; 7241dfe64dd3Smacallan break; 7242dfe64dd3Smacallan case 11: 7243dfe64dd3Smacallan return &XGI_LVDS1024x768Des_2x75[tempal]; 7244dfe64dd3Smacallan break; 7245dfe64dd3Smacallan case 12: 7246dfe64dd3Smacallan return &XGI_LVDS1280x1024Des_1x75[tempal]; 7247dfe64dd3Smacallan break; 7248dfe64dd3Smacallan case 13: 7249dfe64dd3Smacallan return &XGI_LVDS1280x1024Des_2x75[tempal]; 7250dfe64dd3Smacallan break; 7251dfe64dd3Smacallan case 14: 7252dfe64dd3Smacallan return &XGI_LVDSNoScalingDesDatax75[tempal]; 7253dfe64dd3Smacallan break; 7254dfe64dd3Smacallan default: 7255dfe64dd3Smacallan break; 7256dfe64dd3Smacallan } 7257dfe64dd3Smacallan } 7258dfe64dd3Smacallan else if (table == 4) { 7259dfe64dd3Smacallan switch (tempdi[i].DATAPTR) { 7260dfe64dd3Smacallan case 0: 7261dfe64dd3Smacallan return &XGI_ExtLCD1024x768Data[tempal]; 7262dfe64dd3Smacallan break; 7263dfe64dd3Smacallan case 1: 7264dfe64dd3Smacallan return &XGI_StLCD1024x768Data[tempal]; 7265dfe64dd3Smacallan break; 7266dfe64dd3Smacallan case 2: 7267dfe64dd3Smacallan return &XGI_CetLCD1024x768Data[tempal]; 7268dfe64dd3Smacallan break; 7269dfe64dd3Smacallan case 3: 7270dfe64dd3Smacallan return &XGI_ExtLCD1280x1024Data[tempal]; 7271dfe64dd3Smacallan break; 7272dfe64dd3Smacallan case 4: 7273dfe64dd3Smacallan return &XGI_StLCD1280x1024Data[tempal]; 7274dfe64dd3Smacallan break; 7275dfe64dd3Smacallan case 5: 7276dfe64dd3Smacallan return &XGI_CetLCD1280x1024Data[tempal]; 7277dfe64dd3Smacallan break; 7278dfe64dd3Smacallan case 6: 7279dfe64dd3Smacallan return &XGI_ExtLCD1400x1050Data[tempal]; 7280dfe64dd3Smacallan break; 7281dfe64dd3Smacallan case 7: 7282dfe64dd3Smacallan return &XGI_StLCD1400x1050Data[tempal]; 7283dfe64dd3Smacallan break; 7284dfe64dd3Smacallan case 8: 7285dfe64dd3Smacallan return &XGI_CetLCD1400x1050Data[tempal]; 7286dfe64dd3Smacallan break; 7287dfe64dd3Smacallan case 9: 7288dfe64dd3Smacallan return &XGI_ExtLCD1600x1200Data[tempal]; 7289dfe64dd3Smacallan break; 7290dfe64dd3Smacallan case 10: 7291dfe64dd3Smacallan return &XGI_StLCD1600x1200Data[tempal]; 7292dfe64dd3Smacallan break; 7293dfe64dd3Smacallan case 11: 7294dfe64dd3Smacallan return &XGI_NoScalingData[tempal]; 7295dfe64dd3Smacallan break; 7296dfe64dd3Smacallan case 12: 7297dfe64dd3Smacallan return &XGI_ExtLCD1024x768x75Data[tempal]; 7298dfe64dd3Smacallan break; 7299dfe64dd3Smacallan case 13: 7300dfe64dd3Smacallan return &XGI_ExtLCD1024x768x75Data[tempal]; 7301dfe64dd3Smacallan break; 7302dfe64dd3Smacallan case 14: 7303dfe64dd3Smacallan return &XGI_CetLCD1024x768x75Data[tempal]; 7304dfe64dd3Smacallan break; 7305dfe64dd3Smacallan case 15: 7306dfe64dd3Smacallan return &XGI_ExtLCD1280x1024x75Data[tempal]; 7307dfe64dd3Smacallan break; 7308dfe64dd3Smacallan case 16: 7309dfe64dd3Smacallan return &XGI_StLCD1280x1024x75Data[tempal]; 7310dfe64dd3Smacallan break; 7311dfe64dd3Smacallan case 17: 7312dfe64dd3Smacallan return &XGI_CetLCD1280x1024x75Data[tempal]; 7313dfe64dd3Smacallan break; 7314dfe64dd3Smacallan case 18: 7315dfe64dd3Smacallan return &XGI_NoScalingDatax75[tempal]; 7316dfe64dd3Smacallan break; 7317dfe64dd3Smacallan case 19: 7318dfe64dd3Smacallan return &XGI_NoScalingData_1[tempal]; 7319dfe64dd3Smacallan break; 7320dfe64dd3Smacallan default: 7321dfe64dd3Smacallan break; 7322dfe64dd3Smacallan } 7323dfe64dd3Smacallan } 7324dfe64dd3Smacallan else if (table == 5) { 7325dfe64dd3Smacallan switch (tempdi[i].DATAPTR) { 7326dfe64dd3Smacallan case 0: 7327dfe64dd3Smacallan return &XGI_ExtLCDDes1024x768Data[tempal]; 7328dfe64dd3Smacallan break; 7329dfe64dd3Smacallan case 1: 7330dfe64dd3Smacallan return &XGI_StLCDDes1024x768Data[tempal]; 7331dfe64dd3Smacallan break; 7332dfe64dd3Smacallan case 2: 7333dfe64dd3Smacallan return &XGI_CetLCDDes1024x768Data[tempal]; 7334dfe64dd3Smacallan break; 7335dfe64dd3Smacallan case 3: 7336dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI301LV) 7337dfe64dd3Smacallan || (pVBInfo->VBType & VB_XGI302LV)) 7338dfe64dd3Smacallan return &XGI_ExtLCDDLDes1280x1024Data[tempal]; 7339dfe64dd3Smacallan else 7340dfe64dd3Smacallan return &XGI_ExtLCDDes1280x1024Data[tempal]; 7341dfe64dd3Smacallan break; 7342dfe64dd3Smacallan case 4: 7343dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI301LV) 7344dfe64dd3Smacallan || (pVBInfo->VBType & VB_XGI302LV)) 7345dfe64dd3Smacallan return &XGI_StLCDDLDes1280x1024Data[tempal]; 7346dfe64dd3Smacallan else 7347dfe64dd3Smacallan return &XGI_StLCDDes1280x1024Data[tempal]; 7348dfe64dd3Smacallan break; 7349dfe64dd3Smacallan case 5: 7350dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI301LV) 7351dfe64dd3Smacallan || (pVBInfo->VBType & VB_XGI302LV)) 7352dfe64dd3Smacallan return &XGI_CetLCDDLDes1280x1024Data[tempal]; 7353dfe64dd3Smacallan else 7354dfe64dd3Smacallan return &XGI_CetLCDDes1280x1024Data[tempal]; 7355dfe64dd3Smacallan break; 7356dfe64dd3Smacallan case 6: 7357dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI301LV) 7358dfe64dd3Smacallan || (pVBInfo->VBType & VB_XGI302LV)) 7359dfe64dd3Smacallan return &XGI_ExtLCDDLDes1400x1050Data[tempal]; 7360dfe64dd3Smacallan else 7361dfe64dd3Smacallan return &XGI_ExtLCDDes1400x1050Data[tempal]; 7362dfe64dd3Smacallan break; 7363dfe64dd3Smacallan case 7: 7364dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI301LV) 7365dfe64dd3Smacallan || (pVBInfo->VBType & VB_XGI302LV)) 7366dfe64dd3Smacallan return &XGI_StLCDDLDes1400x1050Data[tempal]; 7367dfe64dd3Smacallan else 7368dfe64dd3Smacallan return &XGI_StLCDDes1400x1050Data[tempal]; 7369dfe64dd3Smacallan break; 7370dfe64dd3Smacallan case 8: 7371dfe64dd3Smacallan return &XGI_CetLCDDes1400x1050Data[tempal]; 7372dfe64dd3Smacallan break; 7373dfe64dd3Smacallan case 9: 7374dfe64dd3Smacallan return &XGI_CetLCDDes1400x1050Data2[tempal]; 7375dfe64dd3Smacallan break; 7376dfe64dd3Smacallan case 10: 7377dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI301LV) 7378dfe64dd3Smacallan || (pVBInfo->VBType & VB_XGI302LV)) 7379dfe64dd3Smacallan return &XGI_ExtLCDDLDes1600x1200Data[tempal]; 7380dfe64dd3Smacallan else 7381dfe64dd3Smacallan return &XGI_ExtLCDDes1600x1200Data[tempal]; 7382dfe64dd3Smacallan break; 7383dfe64dd3Smacallan case 11: 7384dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI301LV) 7385dfe64dd3Smacallan || (pVBInfo->VBType & VB_XGI302LV)) 7386dfe64dd3Smacallan return &XGI_StLCDDLDes1600x1200Data[tempal]; 7387dfe64dd3Smacallan else 7388dfe64dd3Smacallan return &XGI_StLCDDes1600x1200Data[tempal]; 7389dfe64dd3Smacallan break; 7390dfe64dd3Smacallan case 12: 7391dfe64dd3Smacallan return &XGI_NoScalingDesData[tempal]; 7392dfe64dd3Smacallan break; 7393dfe64dd3Smacallan case 13: 7394dfe64dd3Smacallan return &XGI_ExtLCDDes1024x768x75Data[tempal]; 7395dfe64dd3Smacallan break; 7396dfe64dd3Smacallan case 14: 7397dfe64dd3Smacallan return &XGI_StLCDDes1024x768x75Data[tempal]; 7398dfe64dd3Smacallan break; 7399dfe64dd3Smacallan case 15: 7400dfe64dd3Smacallan return &XGI_CetLCDDes1024x768x75Data[tempal]; 7401dfe64dd3Smacallan break; 7402dfe64dd3Smacallan case 16: 7403dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI301LV) 7404dfe64dd3Smacallan || (pVBInfo->VBType & VB_XGI302LV)) 7405dfe64dd3Smacallan return &XGI_ExtLCDDLDes1280x1024x75Data[tempal]; 7406dfe64dd3Smacallan else 7407dfe64dd3Smacallan return &XGI_ExtLCDDes1280x1024x75Data[tempal]; 7408dfe64dd3Smacallan break; 7409dfe64dd3Smacallan case 17: 7410dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI301LV) 7411dfe64dd3Smacallan || (pVBInfo->VBType & VB_XGI302LV)) 7412dfe64dd3Smacallan return &XGI_StLCDDLDes1280x1024x75Data[tempal]; 7413dfe64dd3Smacallan else 7414dfe64dd3Smacallan return &XGI_StLCDDes1280x1024x75Data[tempal]; 7415dfe64dd3Smacallan break; 7416dfe64dd3Smacallan case 18: 7417dfe64dd3Smacallan if ((pVBInfo->VBType & VB_XGI301LV) 7418dfe64dd3Smacallan || (pVBInfo->VBType & VB_XGI302LV)) 7419dfe64dd3Smacallan return &XGI_CetLCDDLDes1280x1024x75Data[tempal]; 7420dfe64dd3Smacallan else 7421dfe64dd3Smacallan return &XGI_CetLCDDes1280x1024x75Data[tempal]; 7422dfe64dd3Smacallan break; 7423dfe64dd3Smacallan case 19: 7424dfe64dd3Smacallan return &XGI_NoScalingDesDatax75[tempal]; 7425dfe64dd3Smacallan break; 7426dfe64dd3Smacallan case 20: 7427dfe64dd3Smacallan return &XGI_NoScalingDesData_1[tempal]; 7428dfe64dd3Smacallan break; 7429dfe64dd3Smacallan default: 7430dfe64dd3Smacallan break; 7431dfe64dd3Smacallan } 7432dfe64dd3Smacallan } 7433dfe64dd3Smacallan else if (table == 6) { 7434dfe64dd3Smacallan switch (tempdi[i].DATAPTR) { 7435dfe64dd3Smacallan case 0: 7436dfe64dd3Smacallan return &XGI_CH7017LV1024x768[tempal]; 7437dfe64dd3Smacallan break; 7438dfe64dd3Smacallan case 1: 7439dfe64dd3Smacallan return &XGI_CH7017LV1400x1050[tempal]; 7440dfe64dd3Smacallan break; 7441dfe64dd3Smacallan default: 7442dfe64dd3Smacallan break; 7443dfe64dd3Smacallan } 7444dfe64dd3Smacallan } 7445dfe64dd3Smacallan return 0; 7446dfe64dd3Smacallan} 7447dfe64dd3Smacallan 7448dfe64dd3Smacallan 7449dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7450dfe64dd3Smacallan/* Function : XGI_GetTVPtr */ 7451dfe64dd3Smacallan/* Input : */ 7452dfe64dd3Smacallan/* Output : */ 7453dfe64dd3Smacallan/* Description : */ 7454dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7455dfe64dd3Smacallanconst void * 7456dfe64dd3SmacallanXGI_GetTVPtr(USHORT BX, USHORT ModeNo, USHORT ModeIdIndex, 7457dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 7458dfe64dd3Smacallan{ 7459dfe64dd3Smacallan USHORT i, tempdx, tempbx, tempal, modeflag, table; 7460dfe64dd3Smacallan const XGI330_TVDataTablStruct *tempdi = NULL; 7461dfe64dd3Smacallan 7462dfe64dd3Smacallan tempbx = BX; 7463dfe64dd3Smacallan 7464dfe64dd3Smacallan if (ModeNo <= 0x13) { 7465dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; 7466dfe64dd3Smacallan tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC; 7467dfe64dd3Smacallan } 7468dfe64dd3Smacallan else { 7469dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 7470dfe64dd3Smacallan tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC; 7471dfe64dd3Smacallan } 7472dfe64dd3Smacallan 7473dfe64dd3Smacallan tempal = tempal & 0x3f; 7474dfe64dd3Smacallan table = tempbx; 7475dfe64dd3Smacallan 7476dfe64dd3Smacallan switch (tempbx) { 7477dfe64dd3Smacallan case 0: 7478dfe64dd3Smacallan tempdi = 0; /*EPLCHTVCRT1Ptr_H; */ 7479dfe64dd3Smacallan break; 7480dfe64dd3Smacallan case 1: 7481dfe64dd3Smacallan tempdi = 0; /*EPLCHTVCRT1Ptr_V; */ 7482dfe64dd3Smacallan break; 7483dfe64dd3Smacallan case 2: 7484dfe64dd3Smacallan tempdi = XGI_EPLCHTVDataPtr; 7485dfe64dd3Smacallan break; 7486dfe64dd3Smacallan case 3: 7487dfe64dd3Smacallan tempdi = 0; 7488dfe64dd3Smacallan break; 7489dfe64dd3Smacallan case 4: 7490dfe64dd3Smacallan tempdi = XGI_TVDataTable; 7491dfe64dd3Smacallan break; 7492dfe64dd3Smacallan case 5: 7493dfe64dd3Smacallan tempdi = 0; 7494dfe64dd3Smacallan break; 7495dfe64dd3Smacallan case 6: 7496dfe64dd3Smacallan tempdi = XGI_EPLCHTVRegPtr; 7497dfe64dd3Smacallan break; 7498dfe64dd3Smacallan default: 7499dfe64dd3Smacallan break; 7500dfe64dd3Smacallan } 7501dfe64dd3Smacallan 7502dfe64dd3Smacallan if (tempdi == 0x00) /* OEMUtil */ 7503dfe64dd3Smacallan return (0); 7504dfe64dd3Smacallan 7505dfe64dd3Smacallan tempdx = pVBInfo->TVInfo; 7506dfe64dd3Smacallan 7507dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) 7508dfe64dd3Smacallan tempdx = tempdx | SetTVLockMode; 7509dfe64dd3Smacallan 7510dfe64dd3Smacallan if (modeflag & HalfDCLK) 7511dfe64dd3Smacallan tempdx = tempdx | SetTVLowResolution; 7512dfe64dd3Smacallan 7513dfe64dd3Smacallan i = 0; 7514dfe64dd3Smacallan 7515dfe64dd3Smacallan while (tempdi[i].MASK != 0xffff) { 7516dfe64dd3Smacallan if ((tempdx & tempdi[i].MASK) == tempdi[i].CAP) 7517dfe64dd3Smacallan break; 7518dfe64dd3Smacallan i++; 7519dfe64dd3Smacallan } 7520dfe64dd3Smacallan 7521dfe64dd3Smacallan if (table == 0x04) { 7522dfe64dd3Smacallan switch (tempdi[i].DATAPTR) { 7523dfe64dd3Smacallan case 0: 7524dfe64dd3Smacallan return &XGI_ExtPALData[tempal]; 7525dfe64dd3Smacallan break; 7526dfe64dd3Smacallan case 1: 7527dfe64dd3Smacallan return &XGI_ExtNTSCData[tempal]; 7528dfe64dd3Smacallan break; 7529dfe64dd3Smacallan case 2: 7530dfe64dd3Smacallan return &XGI_StPALData[tempal]; 7531dfe64dd3Smacallan break; 7532dfe64dd3Smacallan case 3: 7533dfe64dd3Smacallan return &XGI_StNTSCData[tempal]; 7534dfe64dd3Smacallan break; 7535dfe64dd3Smacallan case 4: 7536dfe64dd3Smacallan return &XGI_ExtHiTVData[tempal]; 7537dfe64dd3Smacallan break; 7538dfe64dd3Smacallan case 5: 7539dfe64dd3Smacallan return &XGI_St2HiTVData[tempal]; 7540dfe64dd3Smacallan break; 7541dfe64dd3Smacallan case 6: 7542dfe64dd3Smacallan return &XGI_ExtYPbPr525iData[tempal]; 7543dfe64dd3Smacallan break; 7544dfe64dd3Smacallan case 7: 7545dfe64dd3Smacallan return &XGI_ExtYPbPr525pData[tempal]; 7546dfe64dd3Smacallan break; 7547dfe64dd3Smacallan case 8: 7548dfe64dd3Smacallan return &XGI_ExtYPbPr750pData[tempal]; 7549dfe64dd3Smacallan break; 7550dfe64dd3Smacallan case 9: 7551dfe64dd3Smacallan return &XGI_StYPbPr525iData[tempal]; 7552dfe64dd3Smacallan break; 7553dfe64dd3Smacallan case 10: 7554dfe64dd3Smacallan return &XGI_StYPbPr525pData[tempal]; 7555dfe64dd3Smacallan break; 7556dfe64dd3Smacallan case 11: 7557dfe64dd3Smacallan return &XGI_StYPbPr750pData[tempal]; 7558dfe64dd3Smacallan break; 7559dfe64dd3Smacallan case 12: /* avoid system hang */ 7560dfe64dd3Smacallan return &XGI_ExtNTSCData[tempal]; 7561dfe64dd3Smacallan break; 7562dfe64dd3Smacallan case 13: 7563dfe64dd3Smacallan return &XGI_St1HiTVData[tempal]; 7564dfe64dd3Smacallan break; 7565dfe64dd3Smacallan default: 7566dfe64dd3Smacallan break; 7567dfe64dd3Smacallan } 7568dfe64dd3Smacallan } 7569dfe64dd3Smacallan else if (table == 0x02) { 7570dfe64dd3Smacallan switch (tempdi[i].DATAPTR) { 7571dfe64dd3Smacallan case 0: 7572dfe64dd3Smacallan return &XGI_CHTVUNTSCData[tempal]; 7573dfe64dd3Smacallan break; 7574dfe64dd3Smacallan case 1: 7575dfe64dd3Smacallan return &XGI_CHTVONTSCData[tempal]; 7576dfe64dd3Smacallan break; 7577dfe64dd3Smacallan case 2: 7578dfe64dd3Smacallan return &XGI_CHTVUPALData[tempal]; 7579dfe64dd3Smacallan break; 7580dfe64dd3Smacallan case 3: 7581dfe64dd3Smacallan return &XGI_CHTVOPALData[tempal]; 7582dfe64dd3Smacallan break; 7583dfe64dd3Smacallan default: 7584dfe64dd3Smacallan break; 7585dfe64dd3Smacallan } 7586dfe64dd3Smacallan } 7587dfe64dd3Smacallan else if (table == 0x06) { 7588dfe64dd3Smacallan switch (tempdi[i].DATAPTR) { 7589dfe64dd3Smacallan case 0: 7590dfe64dd3Smacallan return &XGI_CHTVRegUNTSC[tempal]; 7591dfe64dd3Smacallan break; 7592dfe64dd3Smacallan case 1: 7593dfe64dd3Smacallan return &XGI_CHTVRegONTSC[tempal]; 7594dfe64dd3Smacallan break; 7595dfe64dd3Smacallan case 2: 7596dfe64dd3Smacallan return &XGI_CHTVRegUPAL[tempal]; 7597dfe64dd3Smacallan break; 7598dfe64dd3Smacallan case 3: 7599dfe64dd3Smacallan return &XGI_CHTVRegOPAL[tempal]; 7600dfe64dd3Smacallan break; 7601dfe64dd3Smacallan default: 7602dfe64dd3Smacallan break; 7603dfe64dd3Smacallan } 7604dfe64dd3Smacallan } 7605dfe64dd3Smacallan return (0); 7606dfe64dd3Smacallan} 7607dfe64dd3Smacallan 7608dfe64dd3Smacallan 7609dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7610dfe64dd3Smacallan/* Function : XGI_BacklightByDrv */ 7611dfe64dd3Smacallan/* Input : */ 7612dfe64dd3Smacallan/* Output : TRUE -> Skip backlight control */ 7613dfe64dd3Smacallan/* Description : */ 7614dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7615dfe64dd3SmacallanBOOLEAN 7616dfe64dd3SmacallanXGI_BacklightByDrv(PVB_DEVICE_INFO pVBInfo) 7617dfe64dd3Smacallan{ 7618dfe64dd3Smacallan UCHAR tempah; 7619dfe64dd3Smacallan 7620dfe64dd3Smacallan tempah = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x3A); 7621dfe64dd3Smacallan if (tempah & BacklightControlBit) 7622dfe64dd3Smacallan return TRUE; 7623dfe64dd3Smacallan else 7624dfe64dd3Smacallan return FALSE; 7625dfe64dd3Smacallan} 7626dfe64dd3Smacallan 7627dfe64dd3Smacallan 7628dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7629dfe64dd3Smacallan/* Function : XGI_FirePWDDisable */ 7630dfe64dd3Smacallan/* Input : */ 7631dfe64dd3Smacallan/* Output : */ 7632dfe64dd3Smacallan/* Description : Turn off VDD & Backlight : Fire disable procedure */ 7633dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7634dfe64dd3Smacallan/* 7635dfe64dd3Smacallanvoid XGI_FirePWDDisable( PVB_DEVICE_INFO pVBInfo ) 7636dfe64dd3Smacallan{ 7637dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port , 0x26 , 0x00 , 0xFC ) ; 7638dfe64dd3Smacallan} 7639dfe64dd3Smacallan*/ 7640dfe64dd3Smacallan 7641dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7642dfe64dd3Smacallan/* Function : XGI_FirePWDEnable */ 7643dfe64dd3Smacallan/* Input : */ 7644dfe64dd3Smacallan/* Output : */ 7645dfe64dd3Smacallan/* Description : Turn on VDD & Backlight : Fire enable procedure */ 7646dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7647dfe64dd3Smacallanvoid 7648dfe64dd3SmacallanXGI_FirePWDEnable(PVB_DEVICE_INFO pVBInfo) 7649dfe64dd3Smacallan{ 7650dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x26, 0x03, 0xFC); 7651dfe64dd3Smacallan} 7652dfe64dd3Smacallan 7653dfe64dd3Smacallan 7654dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7655dfe64dd3Smacallan/* Function : XGI_EnableGatingCRT */ 7656dfe64dd3Smacallan/* Input : */ 7657dfe64dd3Smacallan/* Output : */ 7658dfe64dd3Smacallan/* Description : */ 7659dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7660dfe64dd3Smacallanvoid 7661dfe64dd3SmacallanXGI_EnableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, 7662dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 7663dfe64dd3Smacallan{ 7664dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x63, 0xBF, 0x40); 7665dfe64dd3Smacallan} 7666dfe64dd3Smacallan 7667dfe64dd3Smacallan 7668dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7669dfe64dd3Smacallan/* Function : XGI_DisableGatingCRT */ 7670dfe64dd3Smacallan/* Input : */ 7671dfe64dd3Smacallan/* Output : */ 7672dfe64dd3Smacallan/* Description : */ 7673dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7674dfe64dd3Smacallanvoid 7675dfe64dd3SmacallanXGI_DisableGatingCRT(PXGI_HW_DEVICE_INFO HwDeviceExtension, 7676dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 7677dfe64dd3Smacallan{ 7678dfe64dd3Smacallan 7679dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3d4, 0x63, 0xBF, 0x00); 7680dfe64dd3Smacallan} 7681dfe64dd3Smacallan 7682dfe64dd3Smacallan 7683dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7684dfe64dd3Smacallan/* Function : XGI_SetPanelDelay */ 7685dfe64dd3Smacallan/* Input : */ 7686dfe64dd3Smacallan/* Output : */ 7687dfe64dd3Smacallan/* Description : */ 7688dfe64dd3Smacallan/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */ 7689dfe64dd3Smacallan/* : bl : 2 ; T2 : the duration signal on and Vdd on */ 7690dfe64dd3Smacallan/* : bl : 3 ; T3 : the duration between CPL off and signal off */ 7691dfe64dd3Smacallan/* : bl : 4 ; T4 : the duration signal off and Vdd off */ 7692dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7693dfe64dd3Smacallanvoid 7694dfe64dd3SmacallanXGI_SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo) 7695dfe64dd3Smacallan{ 7696dfe64dd3Smacallan USHORT index; 7697dfe64dd3Smacallan#ifndef LINUX_XF86 7698dfe64dd3Smacallan USHORT temp; 7699dfe64dd3Smacallan#endif 7700dfe64dd3Smacallan 7701dfe64dd3Smacallan index = XGI_GetLCDCapPtr(pVBInfo); 7702dfe64dd3Smacallan 7703dfe64dd3Smacallan if (tempbl == 1) 7704dfe64dd3Smacallan XGINew_LCD_Wait_Time(pVBInfo->LCDCapList[index].PSC_S1, pVBInfo); 7705dfe64dd3Smacallan 7706dfe64dd3Smacallan if (tempbl == 2) 7707dfe64dd3Smacallan XGINew_LCD_Wait_Time(pVBInfo->LCDCapList[index].PSC_S2, pVBInfo); 7708dfe64dd3Smacallan 7709dfe64dd3Smacallan if (tempbl == 3) 7710dfe64dd3Smacallan XGINew_LCD_Wait_Time(pVBInfo->LCDCapList[index].PSC_S3, pVBInfo); 7711dfe64dd3Smacallan 7712dfe64dd3Smacallan if (tempbl == 4) 7713dfe64dd3Smacallan XGINew_LCD_Wait_Time(pVBInfo->LCDCapList[index].PSC_S4, pVBInfo); 7714dfe64dd3Smacallan} 7715dfe64dd3Smacallan 7716dfe64dd3Smacallan 7717dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7718dfe64dd3Smacallan/* Function : XGI_SetPanelPower */ 7719dfe64dd3Smacallan/* Input : */ 7720dfe64dd3Smacallan/* Output : */ 7721dfe64dd3Smacallan/* Description : */ 7722dfe64dd3Smacallan/* I/O : ah = 0011b = 03h ; Backlight on, Power on */ 7723dfe64dd3Smacallan/* = 0111b = 07h ; Backlight on, Power off */ 7724dfe64dd3Smacallan/* = 1011b = 0Bh ; Backlight off, Power on */ 7725dfe64dd3Smacallan/* = 1111b = 0Fh ; Backlight off, Power off */ 7726dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7727dfe64dd3Smacallanvoid 7728dfe64dd3SmacallanXGI_SetPanelPower(USHORT tempah, USHORT tempbl, PVB_DEVICE_INFO pVBInfo) 7729dfe64dd3Smacallan{ 7730dfe64dd3Smacallan if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) 7731dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x26, tempbl, 7732dfe64dd3Smacallan tempah); 7733dfe64dd3Smacallan else 7734dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->P3c4, 0x11, tempbl, tempah); 7735dfe64dd3Smacallan} 7736dfe64dd3Smacallan 7737dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 7738dfe64dd3SmacallanUCHAR XG21GPIODataTransfer(UCHAR ujDate) 7739dfe64dd3Smacallan{ 7740dfe64dd3Smacallan UCHAR ujRet = 0; 7741dfe64dd3Smacallan UCHAR i = 0; 7742dfe64dd3Smacallan 7743dfe64dd3Smacallan for (i=0; i<8; i++) 7744dfe64dd3Smacallan { 7745dfe64dd3Smacallan ujRet = ujRet << 1; 7746dfe64dd3Smacallan /* ujRet |= GETBITS(ujDate >> i, 0:0); */ 7747dfe64dd3Smacallan ujRet |= (ujDate >> i) & 1; 7748dfe64dd3Smacallan } 7749dfe64dd3Smacallan 7750dfe64dd3Smacallan return ujRet; 7751dfe64dd3Smacallan} 7752dfe64dd3Smacallan 7753dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 7754dfe64dd3Smacallan/*----------------------------------------------------------------------------*/ 7755dfe64dd3Smacallan/* output */ 7756dfe64dd3Smacallan/* bl[5] : LVDS signal */ 7757dfe64dd3Smacallan/* bl[1] : LVDS backlight */ 7758dfe64dd3Smacallan/* bl[0] : LVDS VDD */ 7759dfe64dd3Smacallan/*----------------------------------------------------------------------------*/ 7760dfe64dd3SmacallanUCHAR XGI_XG21GetPSCValue(PVB_DEVICE_INFO pVBInfo) 7761dfe64dd3Smacallan{ 7762dfe64dd3Smacallan UCHAR CR4A,temp; 7763dfe64dd3Smacallan 7764dfe64dd3Smacallan CR4A = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A ) ; 7765dfe64dd3Smacallan XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , ~0x23 ) ; /* enable GPIO write */ 7766dfe64dd3Smacallan 7767dfe64dd3Smacallan temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 ) ; 7768dfe64dd3Smacallan 7769dfe64dd3Smacallan temp = XG21GPIODataTransfer(temp); 7770dfe64dd3Smacallan temp &= 0x23; 7771dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , CR4A ) ; 7772dfe64dd3Smacallan return temp; 7773dfe64dd3Smacallan} 7774dfe64dd3Smacallan 7775dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 7776dfe64dd3Smacallan/*----------------------------------------------------------------------------*/ 7777dfe64dd3Smacallan/* output */ 7778dfe64dd3Smacallan/* bl[5] : LVDS signal */ 7779dfe64dd3Smacallan/* bl[1] : LVDS backlight */ 7780dfe64dd3Smacallan/* bl[0] : LVDS VDD */ 7781dfe64dd3Smacallan/*----------------------------------------------------------------------------*/ 7782dfe64dd3SmacallanUCHAR XGI_XG27GetPSCValue(PVB_DEVICE_INFO pVBInfo) 7783dfe64dd3Smacallan{ 7784dfe64dd3Smacallan UCHAR CR4A,CRB4,temp; 7785dfe64dd3Smacallan 7786dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27GetPSCValue()...begin\n")); 7787dfe64dd3Smacallan 7788dfe64dd3Smacallan CR4A = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A ) ; 7789dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27GetPSCValue()...1\n")); 7790dfe64dd3Smacallan XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , ~0x0C ) ; /* enable GPIO write */ 7791dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27GetPSCValue()...2\n")); 7792dfe64dd3Smacallan 7793dfe64dd3Smacallan temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 ) ; 7794dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27GetPSCValue()...3\n")); 7795dfe64dd3Smacallan 7796dfe64dd3Smacallan temp &= 0x0C; 7797dfe64dd3Smacallan temp >>= 2; 7798dfe64dd3Smacallan 7799dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , CR4A ) ; 7800dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27GetPSCValue()...4\n")); 7801dfe64dd3Smacallan 7802dfe64dd3Smacallan CRB4 = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0xB4 ) ; 7803dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27GetPSCValue()...5\n")); 7804dfe64dd3Smacallan 7805dfe64dd3Smacallan temp |= ((CRB4&0x04)<<3); 7806dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27GetPSCValue()...return\n")); 7807dfe64dd3Smacallan 7808dfe64dd3Smacallan return temp; 7809dfe64dd3Smacallan} 7810dfe64dd3Smacallan 7811dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 7812dfe64dd3Smacallan/*----------------------------------------------------------------------------*/ 7813dfe64dd3Smacallan/* input */ 7814dfe64dd3Smacallan/* bl[5] : 1;LVDS signal on */ 7815dfe64dd3Smacallan/* bl[1] : 1;LVDS backlight on */ 7816dfe64dd3Smacallan/* bl[0] : 1:LVDS VDD on */ 7817dfe64dd3Smacallan/* bh: 100000b : clear bit 5, to set bit5 */ 7818dfe64dd3Smacallan/* 000010b : clear bit 1, to set bit1 */ 7819dfe64dd3Smacallan/* 000001b : clear bit 0, to set bit0 */ 7820dfe64dd3Smacallan/*----------------------------------------------------------------------------*/ 7821dfe64dd3Smacallanvoid XGI_XG21BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo) 7822dfe64dd3Smacallan{ 7823dfe64dd3Smacallan UCHAR CR4A,temp; 7824dfe64dd3Smacallan 7825dfe64dd3Smacallan CR4A = XGI_GetReg( (XGIIOADDRESS)pVBInfo->P3d4 , 0x4A ) ; 7826dfe64dd3Smacallan tempbh &= 0x23; 7827dfe64dd3Smacallan tempbl &= 0x23; 7828dfe64dd3Smacallan XGI_SetRegAND( (XGIIOADDRESS)pVBInfo->P3d4 , 0x4A , ~tempbh ) ; /* enable GPIO write */ 7829dfe64dd3Smacallan 7830dfe64dd3Smacallan if (tempbh&0x20) 7831dfe64dd3Smacallan { 7832dfe64dd3Smacallan temp = (tempbl>>4)&0x02; 7833dfe64dd3Smacallan 7834dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS)pVBInfo->P3d4 , 0xB4 , ~0x02 , temp) ; /* CR B4[1] */ 7835dfe64dd3Smacallan 7836dfe64dd3Smacallan } 7837dfe64dd3Smacallan 7838dfe64dd3Smacallan temp = XGI_GetReg( (XGIIOADDRESS)pVBInfo->P3d4 , 0x48 ) ; 7839dfe64dd3Smacallan 7840dfe64dd3Smacallan temp = XG21GPIODataTransfer(temp); 7841dfe64dd3Smacallan 7842dfe64dd3Smacallan temp &= ~tempbh; 7843dfe64dd3Smacallan temp |= tempbl; 7844dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 , temp ) ; 7845dfe64dd3Smacallan} 7846dfe64dd3Smacallan 7847dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 7848dfe64dd3Smacallanvoid XGI_XG27BLSignalVDD(USHORT tempbh,USHORT tempbl, PVB_DEVICE_INFO pVBInfo) 7849dfe64dd3Smacallan{ 7850dfe64dd3Smacallan UCHAR CR4A,temp; 7851dfe64dd3Smacallan USHORT tempbh0,tempbl0; 7852dfe64dd3Smacallan 7853dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27BLSignalVDD()...begin\n")); 7854dfe64dd3Smacallan 7855dfe64dd3Smacallan tempbh0 = tempbh; 7856dfe64dd3Smacallan tempbl0 = tempbl; 7857dfe64dd3Smacallan tempbh0 &= 0x20; 7858dfe64dd3Smacallan tempbl0 &= 0x20; 7859dfe64dd3Smacallan tempbh0 >>= 3; 7860dfe64dd3Smacallan tempbl0 >>= 3; 7861dfe64dd3Smacallan 7862dfe64dd3Smacallan if (tempbh&0x20) 7863dfe64dd3Smacallan { 7864dfe64dd3Smacallan temp = (tempbl>>4)&0x02; 7865dfe64dd3Smacallan 7866dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27BLSignalVDD()...1\n")); 7867dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0xB4 , ~0x02 , temp) ; /* CR B4[1] */ 7868dfe64dd3Smacallan 7869dfe64dd3Smacallan } 7870dfe64dd3Smacallan 7871dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27BLSignalVDD()...2\n")); 7872dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0xB4 , ~tempbh0 , tempbl0 ) ; /* CR B4[0] if tempbh0 = 0x01 */ 7873dfe64dd3Smacallan 7874dfe64dd3Smacallan /* Enable related GPIO R/W */ 7875dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27BLSignalVDD()...3\n")); 7876dfe64dd3Smacallan CR4A = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A ) ; 7877dfe64dd3Smacallan tempbh &= 0x03; 7878dfe64dd3Smacallan tempbl &= 0x03; 7879dfe64dd3Smacallan tempbh <<= 2; 7880dfe64dd3Smacallan tempbl <<= 2; /* GPIOC,GPIOD */ 7881dfe64dd3Smacallan 7882dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27BLSignalVDD()...4\n")); 7883dfe64dd3Smacallan XGI_SetRegAND( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4A , ~tempbh ) ; /* enable GPIO write */ 7884dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27BLSignalVDD()...5\n")); 7885dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x48 , ~tempbh , tempbl ) ; 7886dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG27BLSignalVDD()...return\n")); 7887dfe64dd3Smacallan} 7888dfe64dd3Smacallan 7889dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 7890dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7891dfe64dd3SmacallanUSHORT XGI_GetLVDSOEMTableIndex(PVB_DEVICE_INFO pVBInfo) 7892dfe64dd3Smacallan{ 7893dfe64dd3Smacallan USHORT index ; 7894dfe64dd3Smacallan 7895dfe64dd3Smacallan PDEBUG(ErrorF("XGI_GetLVDSOEMTableIndex()...begin\n")); 7896dfe64dd3Smacallan index = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x36 ) ; 7897dfe64dd3Smacallan PDEBUG(ErrorF("XGI_GetLVDSOEMTableIndex()...1\n")); 7898dfe64dd3Smacallan if (index<sizeof(XGI21_LCDCapList)/sizeof(XGI21_LVDSCapStruct)) 7899dfe64dd3Smacallan { 7900dfe64dd3Smacallan PDEBUG(ErrorF("XGI_GetLVDSOEMTableIndex()...2-return\n")); 7901dfe64dd3Smacallan return index; 7902dfe64dd3Smacallan } 7903dfe64dd3Smacallan 7904dfe64dd3Smacallan PDEBUG(ErrorF("XGI_GetLVDSOEMTableIndex()...3-return\n")); 7905dfe64dd3Smacallan return 0; 7906dfe64dd3Smacallan} 7907dfe64dd3Smacallan 7908dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 7909dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7910dfe64dd3Smacallan/* Function : XGI_XG21SetPanelDelay */ 7911dfe64dd3Smacallan/* Input : */ 7912dfe64dd3Smacallan/* Output : */ 7913dfe64dd3Smacallan/* Description : */ 7914dfe64dd3Smacallan/* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */ 7915dfe64dd3Smacallan/* : bl : 2 ; T2 : the duration signal on and Vdd on */ 7916dfe64dd3Smacallan/* : bl : 3 ; T3 : the duration between CPL off and signal off */ 7917dfe64dd3Smacallan/* : bl : 4 ; T4 : the duration signal off and Vdd off */ 7918dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 7919dfe64dd3Smacallanvoid XGI_XG21SetPanelDelay(USHORT tempbl, PVB_DEVICE_INFO pVBInfo) 7920dfe64dd3Smacallan{ 7921dfe64dd3Smacallan USHORT index ; 7922dfe64dd3Smacallan 7923dfe64dd3Smacallan PDEBUG(ErrorF("XGI_XG21SetPanelDelay()...begin\n")); 7924dfe64dd3Smacallan 7925dfe64dd3Smacallan index = XGI_GetLVDSOEMTableIndex( pVBInfo ); 7926dfe64dd3Smacallan PDEBUG(ErrorF("After XGI_GetLVDSOEMTableIndex()\n")); 7927dfe64dd3Smacallan 7928dfe64dd3Smacallan if ( tempbl == 1 ) 7929dfe64dd3Smacallan { 7930dfe64dd3Smacallan PDEBUG(ErrorF("tempbl == 1\n")); 7931dfe64dd3Smacallan XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S1, pVBInfo ) ; 7932dfe64dd3Smacallan PDEBUG(ErrorF("After XGINew_LCD_Wait_Time()\n")); 7933dfe64dd3Smacallan } 7934dfe64dd3Smacallan 7935dfe64dd3Smacallan if ( tempbl == 2 ) 7936dfe64dd3Smacallan { 7937dfe64dd3Smacallan PDEBUG(ErrorF("tempbl == 2\n")); 7938dfe64dd3Smacallan XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S2, pVBInfo ) ; 7939dfe64dd3Smacallan PDEBUG(ErrorF("After XGINew_LCD_Wait_Time()\n")); 7940dfe64dd3Smacallan } 7941dfe64dd3Smacallan 7942dfe64dd3Smacallan if ( tempbl == 3 ) 7943dfe64dd3Smacallan { 7944dfe64dd3Smacallan PDEBUG(ErrorF("tempbl == 3\n")); 7945dfe64dd3Smacallan XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S3, pVBInfo ) ; 7946dfe64dd3Smacallan PDEBUG(ErrorF("After XGINew_LCD_Wait_Time()\n")); 7947dfe64dd3Smacallan } 7948dfe64dd3Smacallan 7949dfe64dd3Smacallan if ( tempbl == 4 ) 7950dfe64dd3Smacallan { 7951dfe64dd3Smacallan PDEBUG(ErrorF("tempbl == 4\n")); 7952dfe64dd3Smacallan XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S4, pVBInfo ) ; 7953dfe64dd3Smacallan PDEBUG(ErrorF("After XGINew_LCD_Wait_Time()\n")); 7954dfe64dd3Smacallan } 7955dfe64dd3Smacallan} 7956dfe64dd3Smacallan 7957dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 7958dfe64dd3SmacallanBOOLEAN XGI_XG21CheckLVDSMode(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) 7959dfe64dd3Smacallan{ 7960dfe64dd3Smacallan USHORT xres , 7961dfe64dd3Smacallan yres , 7962dfe64dd3Smacallan colordepth , 7963dfe64dd3Smacallan modeflag , 7964dfe64dd3Smacallan resindex , 7965dfe64dd3Smacallan lvdstableindex; 7966dfe64dd3Smacallan 7967dfe64dd3Smacallan resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ; 7968dfe64dd3Smacallan if ( ModeNo <= 0x13 ) 7969dfe64dd3Smacallan { 7970dfe64dd3Smacallan xres = pVBInfo->StResInfo[ resindex ].HTotal ; 7971dfe64dd3Smacallan yres = pVBInfo->StResInfo[ resindex ].VTotal ; 7972dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */ 7973dfe64dd3Smacallan } 7974dfe64dd3Smacallan else 7975dfe64dd3Smacallan { 7976dfe64dd3Smacallan xres = pVBInfo->ModeResInfo[ resindex ].HTotal ; /* xres->ax */ 7977dfe64dd3Smacallan yres = pVBInfo->ModeResInfo[ resindex ].VTotal ; /* yres->bx */ 7978dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ; /* si+St_ModeFlag */ 7979dfe64dd3Smacallan } 7980dfe64dd3Smacallan 7981dfe64dd3Smacallan if ( !( modeflag & Charx8Dot ) ) 7982dfe64dd3Smacallan { 7983dfe64dd3Smacallan xres /= 9; 7984dfe64dd3Smacallan xres *= 8; 7985dfe64dd3Smacallan } 7986dfe64dd3Smacallan 7987dfe64dd3Smacallan if ( ModeNo > 0x13 ) 7988dfe64dd3Smacallan { 7989dfe64dd3Smacallan if ( ( ModeNo>0x13 ) && ( modeflag & HalfDCLK ) ) 7990dfe64dd3Smacallan { 7991dfe64dd3Smacallan xres *= 2 ; 7992dfe64dd3Smacallan } 7993dfe64dd3Smacallan if ( ( ModeNo>0x13 ) && ( modeflag & DoubleScanMode ) ) 7994dfe64dd3Smacallan { 7995dfe64dd3Smacallan yres *= 2 ; 7996dfe64dd3Smacallan } 7997dfe64dd3Smacallan } 7998dfe64dd3Smacallan 7999dfe64dd3Smacallan lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo ); 8000dfe64dd3Smacallan if ( xres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE) ) 8001dfe64dd3Smacallan return FALSE; 8002dfe64dd3Smacallan 8003dfe64dd3Smacallan if ( yres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE) ) 8004dfe64dd3Smacallan return FALSE; 8005dfe64dd3Smacallan 8006dfe64dd3Smacallan if ( ModeNo > 0x13 ) 8007dfe64dd3Smacallan { 8008dfe64dd3Smacallan if ( ( xres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE) ) || 8009dfe64dd3Smacallan ( yres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE)) ) 8010dfe64dd3Smacallan { 8011dfe64dd3Smacallan colordepth = XGI_GetColorDepth( ModeNo , ModeIdIndex, pVBInfo ) ; 8012dfe64dd3Smacallan if ( colordepth > 2 ) 8013dfe64dd3Smacallan { 8014dfe64dd3Smacallan return FALSE; 8015dfe64dd3Smacallan } 8016dfe64dd3Smacallan } 8017dfe64dd3Smacallan } 8018dfe64dd3Smacallan return TRUE; 8019dfe64dd3Smacallan} 8020dfe64dd3Smacallan 8021dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 8022dfe64dd3Smacallanvoid XGI_SetXG21FPBits(PVB_DEVICE_INFO pVBInfo) 8023dfe64dd3Smacallan{ 8024dfe64dd3Smacallan UCHAR temp; 8025dfe64dd3Smacallan 8026dfe64dd3Smacallan temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x37 ) ; /* D[0] 1: 18bit */ 8027dfe64dd3Smacallan temp = ( temp & 1 ) << 6; 8028dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x06 , ~0x40 , temp ) ; /* SR06[6] 18bit Dither */ 8029dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x09 , ~0xc0 , temp | 0x80 ) ; /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */ 8030dfe64dd3Smacallan 8031dfe64dd3Smacallan} 8032dfe64dd3Smacallan 8033dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 8034dfe64dd3Smacallanvoid XGI_SetXG27FPBits(PVB_DEVICE_INFO pVBInfo) 8035dfe64dd3Smacallan{ 8036dfe64dd3Smacallan UCHAR temp; 8037dfe64dd3Smacallan 8038dfe64dd3Smacallan temp = XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x37 ) ; /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */ 8039dfe64dd3Smacallan temp = ( temp & 3 ) << 6; 8040dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x06 , ~0xc0 , temp & 0x80 ) ; /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */ 8041dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x09 , ~0xc0 , temp | 0x80 ) ; /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */ 8042dfe64dd3Smacallan 8043dfe64dd3Smacallan} 8044dfe64dd3Smacallan 8045dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 8046dfe64dd3Smacallanvoid XGI_SetXG21LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) 8047dfe64dd3Smacallan{ 8048dfe64dd3Smacallan UCHAR temp,Miscdata; 8049dfe64dd3Smacallan USHORT xres , 8050dfe64dd3Smacallan yres , 8051dfe64dd3Smacallan colordepth , 8052dfe64dd3Smacallan modeflag , 8053dfe64dd3Smacallan resindex , 8054dfe64dd3Smacallan lvdstableindex ; 8055dfe64dd3Smacallan USHORT LVDSHT,LVDSHBS,LVDSHRS,LVDSHRE,LVDSHBE; 8056dfe64dd3Smacallan USHORT LVDSVT,LVDSVBS,LVDSVRS,LVDSVRE,LVDSVBE; 8057dfe64dd3Smacallan USHORT value; 8058dfe64dd3Smacallan 8059dfe64dd3Smacallan lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo ); 8060dfe64dd3Smacallan 8061dfe64dd3Smacallan temp = (UCHAR) ( ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & (LCDPolarity << 8 ) ) >> 8 ); 8062dfe64dd3Smacallan temp &= LCDPolarity; 8063dfe64dd3Smacallan Miscdata =(UCHAR) XGI_GetRegByte(pVBInfo->P3cc) ; 8064dfe64dd3Smacallan 8065dfe64dd3Smacallan XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c2 , (Miscdata & 0x3F) | temp ) ; 8066dfe64dd3Smacallan 8067dfe64dd3Smacallan temp = (UCHAR) ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & LCDPolarity ) ; 8068dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x80 , temp&0x80 ) ; /* SR35[7] FP VSync polarity */ 8069dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , ~0x20 , (temp&0x40)>>1 ) ; /* SR30[5] FP HSync polarity */ 8070dfe64dd3Smacallan 8071dfe64dd3Smacallan XGI_SetXG21FPBits(pVBInfo); 8072dfe64dd3Smacallan resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ; 8073dfe64dd3Smacallan if ( ModeNo <= 0x13 ) 8074dfe64dd3Smacallan { 8075dfe64dd3Smacallan xres = pVBInfo->StResInfo[ resindex ].HTotal ; 8076dfe64dd3Smacallan yres = pVBInfo->StResInfo[ resindex ].VTotal ; 8077dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */ 8078dfe64dd3Smacallan } 8079dfe64dd3Smacallan else 8080dfe64dd3Smacallan { 8081dfe64dd3Smacallan xres = pVBInfo->ModeResInfo[ resindex ].HTotal ; /* xres->ax */ 8082dfe64dd3Smacallan yres = pVBInfo->ModeResInfo[ resindex ].VTotal ; /* yres->bx */ 8083dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ; /* si+St_ModeFlag */ 8084dfe64dd3Smacallan } 8085dfe64dd3Smacallan 8086dfe64dd3Smacallan if (!( modeflag & Charx8Dot )) 8087dfe64dd3Smacallan xres = xres * 8 / 9; 8088dfe64dd3Smacallan 8089dfe64dd3Smacallan LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT; 8090dfe64dd3Smacallan 8091dfe64dd3Smacallan LVDSHBS = xres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE - xres ) / 2 ; 8092dfe64dd3Smacallan if ( ( ModeNo<=0x13 ) && ( modeflag & HalfDCLK ) ) 8093dfe64dd3Smacallan { 8094dfe64dd3Smacallan LVDSHBS -= xres/4 ; 8095dfe64dd3Smacallan } 8096dfe64dd3Smacallan if (LVDSHBS > LVDSHT) LVDSHBS -= LVDSHT ; 8097dfe64dd3Smacallan 8098dfe64dd3Smacallan LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP ; 8099dfe64dd3Smacallan if (LVDSHRS > LVDSHT) LVDSHRS -= LVDSHT ; 8100dfe64dd3Smacallan 8101dfe64dd3Smacallan LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC ; 8102dfe64dd3Smacallan if (LVDSHRE > LVDSHT) LVDSHRE -= LVDSHT ; 8103dfe64dd3Smacallan 8104dfe64dd3Smacallan LVDSHBE = LVDSHBS + LVDSHT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE ; 8105dfe64dd3Smacallan 8106dfe64dd3Smacallan LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT; 8107dfe64dd3Smacallan 8108dfe64dd3Smacallan LVDSVBS = yres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE - yres ) / 2 ; 8109dfe64dd3Smacallan if ( ( ModeNo>0x13 ) && ( modeflag & DoubleScanMode ) ) 8110dfe64dd3Smacallan { 8111dfe64dd3Smacallan LVDSVBS += yres/2 ; 8112dfe64dd3Smacallan } 8113dfe64dd3Smacallan if (LVDSVBS > LVDSVT) LVDSVBS -= LVDSVT ; 8114dfe64dd3Smacallan 8115dfe64dd3Smacallan LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP ; 8116dfe64dd3Smacallan if (LVDSVRS > LVDSVT) LVDSVRS -= LVDSVT ; 8117dfe64dd3Smacallan 8118dfe64dd3Smacallan LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC ; 8119dfe64dd3Smacallan if (LVDSVRE > LVDSVT) LVDSVRE -= LVDSVT ; 8120dfe64dd3Smacallan 8121dfe64dd3Smacallan LVDSVBE = LVDSVBS + LVDSVT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE ; 8122dfe64dd3Smacallan 8123dfe64dd3Smacallan temp = ( UCHAR )XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x11 ) ; 8124dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x11 , temp & 0x7f ) ; /* Unlock CRTC */ 8125dfe64dd3Smacallan 8126dfe64dd3Smacallan if (!( modeflag & Charx8Dot )) 8127dfe64dd3Smacallan { 8128dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x1 , 0x1 ) ; 8129dfe64dd3Smacallan } 8130dfe64dd3Smacallan 8131dfe64dd3Smacallan /* HT SR0B[1:0] CR00 */ 8132dfe64dd3Smacallan value = ( LVDSHT >> 3 ) - 5; 8133dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0B , ~0x03 , ( value & 0x300 ) >> 8 ) ; 8134dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x0 , (value & 0xFF) ) ; 8135dfe64dd3Smacallan 8136dfe64dd3Smacallan /* HBS SR0B[5:4] CR02 */ 8137dfe64dd3Smacallan value = ( LVDSHBS >> 3 ) - 1; 8138dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0B , ~0x30 , ( value & 0x300 ) >> 4 ) ; 8139dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2 , (value & 0xFF) ) ; 8140dfe64dd3Smacallan 8141dfe64dd3Smacallan /* HBE SR0C[1:0] CR05[7] CR03[4:0] */ 8142dfe64dd3Smacallan value = ( LVDSHBE >> 3 ) - 1; 8143dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0C , ~0x03 , ( value & 0xC0 ) >> 6 ) ; 8144dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x05 , ~0x80 , ( value & 0x20 ) << 2 ) ; 8145dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x03 , ~0x1F , value & 0x1F ) ; 8146dfe64dd3Smacallan 8147dfe64dd3Smacallan /* HRS SR0B[7:6] CR04 */ 8148dfe64dd3Smacallan value = ( LVDSHRS >> 3 ) + 2; 8149dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0B , ~0xC0 , ( value & 0x300 ) >> 2 ) ; 8150dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4 , (value & 0xFF) ) ; 8151dfe64dd3Smacallan 8152dfe64dd3Smacallan /* Panel HRS SR2F[1:0] SR2E[7:0] */ 8153dfe64dd3Smacallan value--; 8154dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , ~0x03 , ( value & 0x300 ) >> 8 ) ; 8155dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2E , (value & 0xFF) ) ; 8156dfe64dd3Smacallan 8157dfe64dd3Smacallan /* HRE SR0C[2] CR05[4:0] */ 8158dfe64dd3Smacallan value = ( LVDSHRE >> 3 ) + 2; 8159dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0C , ~0x04 , ( value & 0x20 ) >> 3 ) ; 8160dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x05 , ~0x1F , value & 0x1F ) ; 8161dfe64dd3Smacallan 8162dfe64dd3Smacallan /* Panel HRE SR2F[7:2] */ 8163dfe64dd3Smacallan value--; 8164dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , ~0xFC , value << 2 ) ; 8165dfe64dd3Smacallan 8166dfe64dd3Smacallan /* VT SR0A[0] CR07[5][0] CR06 */ 8167dfe64dd3Smacallan value = LVDSVT - 2 ; 8168dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x01 , ( value & 0x400 ) >> 10 ) ; 8169dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x20 , ( value & 0x200 ) >> 4 ) ; 8170dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x01 , ( value & 0x100 ) >> 8 ) ; 8171dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x06 , (value & 0xFF) ) ; 8172dfe64dd3Smacallan 8173dfe64dd3Smacallan /* VBS SR0A[2] CR09[5] CR07[3] CR15 */ 8174dfe64dd3Smacallan value = LVDSVBS - 1 ; 8175dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x04 , ( value & 0x400 ) >> 8 ) ; 8176dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x09 , ~0x20 , ( value & 0x200 ) >> 4 ) ; 8177dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x08 , ( value & 0x100 ) >> 5 ) ; 8178dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x15 , (value & 0xFF) ) ; 8179dfe64dd3Smacallan 8180dfe64dd3Smacallan /* VBE SR0A[4] CR16 */ 8181dfe64dd3Smacallan value = LVDSVBE - 1; 8182dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x10 , ( value & 0x100 ) >> 4 ) ; 8183dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x16 , (value & 0xFF) ) ; 8184dfe64dd3Smacallan 8185dfe64dd3Smacallan /* VRS SR0A[3] CR7[7][2] CR10 */ 8186dfe64dd3Smacallan value = LVDSVRS - 1 ; 8187dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x08 , ( value & 0x400 ) >> 7 ) ; 8188dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x80 , ( value & 0x200 ) >> 2 ) ; 8189dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x04 , ( value & 0x100 ) >> 6 ) ; 8190dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x10 , (value & 0xFF) ) ; 8191dfe64dd3Smacallan 8192dfe64dd3Smacallan /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */ 8193dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3F , ~0x03 , ( value & 0x600 ) >> 9 ) ; 8194dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x34 , (value >> 1) & 0xFF ) ; 8195dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x33 , ~0x01 , value & 0x01 ) ; 8196dfe64dd3Smacallan 8197dfe64dd3Smacallan /* VRE SR0A[5] CR11[3:0] */ 8198dfe64dd3Smacallan value = LVDSVRE - 1; 8199dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x20 , ( value & 0x10 ) << 1 ) ; 8200dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x11 , ~0x0F , value & 0x0F ) ; 8201dfe64dd3Smacallan 8202dfe64dd3Smacallan /* Panel VRE SR3F[7:2] */ /* SR3F[7] has to be 0, h/w bug */ 8203dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3F , ~0xFC , ( value << 2 ) & 0x7C ) ; 8204dfe64dd3Smacallan 8205dfe64dd3Smacallan for ( temp=0, value = 0; temp < 3; temp++) 8206dfe64dd3Smacallan { 8207dfe64dd3Smacallan 8208dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 , value ) ; 8209dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2B , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData1) ; 8210dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2C , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData2) ; 8211dfe64dd3Smacallan value += 0x10; 8212dfe64dd3Smacallan } 8213dfe64dd3Smacallan 8214dfe64dd3Smacallan if (!( modeflag & Charx8Dot )) 8215dfe64dd3Smacallan { 8216dfe64dd3Smacallan XGI_GetRegByte( (XGIIOADDRESS) pVBInfo->P3da ) ; /* reset 3da */ 8217dfe64dd3Smacallan XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c0 , 0x13 ) ; /* set index */ 8218dfe64dd3Smacallan XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c0 , 0x00 ) ; /* set data, panning = 0, shift left 1 dot*/ 8219dfe64dd3Smacallan 8220dfe64dd3Smacallan XGI_GetRegByte( (XGIIOADDRESS) pVBInfo->P3da ) ; /* Enable Attribute */ 8221dfe64dd3Smacallan XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c0 , 0x20 ) ; 8222dfe64dd3Smacallan 8223dfe64dd3Smacallan XGI_GetRegByte( (XGIIOADDRESS) pVBInfo->P3da ) ; /* reset 3da */ 8224dfe64dd3Smacallan } 8225dfe64dd3Smacallan 8226dfe64dd3Smacallan 8227dfe64dd3Smacallan} 8228dfe64dd3Smacallan 8229dfe64dd3Smacallan/* Jong 10/04/2007; merge code */ 8230dfe64dd3Smacallan/* no shadow case */ 8231dfe64dd3Smacallanvoid XGI_SetXG27LVDSPara(USHORT ModeNo,USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo ) 8232dfe64dd3Smacallan{ 8233dfe64dd3Smacallan UCHAR temp,Miscdata; 8234dfe64dd3Smacallan USHORT xres , 8235dfe64dd3Smacallan yres , 8236dfe64dd3Smacallan colordepth , 8237dfe64dd3Smacallan modeflag , 8238dfe64dd3Smacallan resindex , 8239dfe64dd3Smacallan lvdstableindex ; 8240dfe64dd3Smacallan USHORT LVDSHT,LVDSHBS,LVDSHRS,LVDSHRE,LVDSHBE; 8241dfe64dd3Smacallan USHORT LVDSVT,LVDSVBS,LVDSVRS,LVDSVRE,LVDSVBE; 8242dfe64dd3Smacallan USHORT value; 8243dfe64dd3Smacallan 8244dfe64dd3Smacallan lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo ); 8245dfe64dd3Smacallan temp = (UCHAR) ( ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & (LCDPolarity << 8 ) ) >> 8 ); 8246dfe64dd3Smacallan temp &= LCDPolarity; 8247dfe64dd3Smacallan Miscdata =(UCHAR) XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3cc) ; 8248dfe64dd3Smacallan 8249dfe64dd3Smacallan XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c2 , (Miscdata & 0x3F) | temp ) ; 8250dfe64dd3Smacallan 8251dfe64dd3Smacallan temp = (UCHAR) ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & LCDPolarity ) ; 8252dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x80 , temp&0x80 ) ; /* SR35[7] FP VSync polarity */ 8253dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x30 , ~0x20 , (temp&0x40)>>1 ) ; /* SR30[5] FP HSync polarity */ 8254dfe64dd3Smacallan 8255dfe64dd3Smacallan XGI_SetXG27FPBits(pVBInfo); 8256dfe64dd3Smacallan resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ; 8257dfe64dd3Smacallan if ( ModeNo <= 0x13 ) 8258dfe64dd3Smacallan { 8259dfe64dd3Smacallan xres = pVBInfo->StResInfo[ resindex ].HTotal ; 8260dfe64dd3Smacallan yres = pVBInfo->StResInfo[ resindex ].VTotal ; 8261dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */ 8262dfe64dd3Smacallan } 8263dfe64dd3Smacallan else 8264dfe64dd3Smacallan { 8265dfe64dd3Smacallan xres = pVBInfo->ModeResInfo[ resindex ].HTotal ; /* xres->ax */ 8266dfe64dd3Smacallan yres = pVBInfo->ModeResInfo[ resindex ].VTotal ; /* yres->bx */ 8267dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ; /* si+St_ModeFlag */ 8268dfe64dd3Smacallan } 8269dfe64dd3Smacallan 8270dfe64dd3Smacallan if (!( modeflag & Charx8Dot )) 8271dfe64dd3Smacallan xres = xres * 8 / 9; 8272dfe64dd3Smacallan 8273dfe64dd3Smacallan LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT; 8274dfe64dd3Smacallan 8275dfe64dd3Smacallan LVDSHBS = xres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE - xres ) / 2 ; 8276dfe64dd3Smacallan if ( ( ModeNo<=0x13 ) && ( modeflag & HalfDCLK ) ) 8277dfe64dd3Smacallan { 8278dfe64dd3Smacallan LVDSHBS -= xres/4 ; 8279dfe64dd3Smacallan } 8280dfe64dd3Smacallan if (LVDSHBS > LVDSHT) LVDSHBS -= LVDSHT ; 8281dfe64dd3Smacallan 8282dfe64dd3Smacallan LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP ; 8283dfe64dd3Smacallan if (LVDSHRS > LVDSHT) LVDSHRS -= LVDSHT ; 8284dfe64dd3Smacallan 8285dfe64dd3Smacallan LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC ; 8286dfe64dd3Smacallan if (LVDSHRE > LVDSHT) LVDSHRE -= LVDSHT ; 8287dfe64dd3Smacallan 8288dfe64dd3Smacallan LVDSHBE = LVDSHBS + LVDSHT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE ; 8289dfe64dd3Smacallan 8290dfe64dd3Smacallan LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT; 8291dfe64dd3Smacallan 8292dfe64dd3Smacallan LVDSVBS = yres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE - yres ) / 2 ; 8293dfe64dd3Smacallan if ( ( ModeNo>0x13 ) && ( modeflag & DoubleScanMode ) ) 8294dfe64dd3Smacallan { 8295dfe64dd3Smacallan LVDSVBS += yres/2 ; 8296dfe64dd3Smacallan } 8297dfe64dd3Smacallan if (LVDSVBS > LVDSVT) LVDSVBS -= LVDSVT ; 8298dfe64dd3Smacallan 8299dfe64dd3Smacallan LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP ; 8300dfe64dd3Smacallan if (LVDSVRS > LVDSVT) LVDSVRS -= LVDSVT ; 8301dfe64dd3Smacallan 8302dfe64dd3Smacallan LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC ; 8303dfe64dd3Smacallan if (LVDSVRE > LVDSVT) LVDSVRE -= LVDSVT ; 8304dfe64dd3Smacallan 8305dfe64dd3Smacallan LVDSVBE = LVDSVBS + LVDSVT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE ; 8306dfe64dd3Smacallan 8307dfe64dd3Smacallan temp = ( UCHAR )XGI_GetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x11 ) ; 8308dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x11 , temp & 0x7f ) ; /* Unlock CRTC */ 8309dfe64dd3Smacallan 8310dfe64dd3Smacallan if (!( modeflag & Charx8Dot )) 8311dfe64dd3Smacallan { 8312dfe64dd3Smacallan XGI_SetRegOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x1 , 0x1 ) ; 8313dfe64dd3Smacallan } 8314dfe64dd3Smacallan 8315dfe64dd3Smacallan /* HT SR0B[1:0] CR00 */ 8316dfe64dd3Smacallan value = ( LVDSHT >> 3 ) - 5; 8317dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0B , ~0x03 , ( value & 0x300 ) >> 8 ) ; 8318dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x0 , (value & 0xFF) ) ; 8319dfe64dd3Smacallan 8320dfe64dd3Smacallan /* HBS SR0B[5:4] CR02 */ 8321dfe64dd3Smacallan value = ( LVDSHBS >> 3 ) - 1; 8322dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0B , ~0x30 , ( value & 0x300 ) >> 4 ) ; 8323dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x2 , (value & 0xFF) ) ; 8324dfe64dd3Smacallan 8325dfe64dd3Smacallan /* HBE SR0C[1:0] CR05[7] CR03[4:0] */ 8326dfe64dd3Smacallan value = ( LVDSHBE >> 3 ) - 1; 8327dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0C , ~0x03 , ( value & 0xC0 ) >> 6 ) ; 8328dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x05 , ~0x80 , ( value & 0x20 ) << 2 ) ; 8329dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x03 , ~0x1F , value & 0x1F ) ; 8330dfe64dd3Smacallan 8331dfe64dd3Smacallan /* HRS SR0B[7:6] CR04 */ 8332dfe64dd3Smacallan value = ( LVDSHRS >> 3 ) + 2; 8333dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0B , ~0xC0 , ( value & 0x300 ) >> 2 ) ; 8334dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x4 , (value & 0xFF) ) ; 8335dfe64dd3Smacallan 8336dfe64dd3Smacallan /* Panel HRS SR2F[1:0] SR2E[7:0] */ 8337dfe64dd3Smacallan value--; 8338dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , ~0x03 , ( value & 0x300 ) >> 8 ) ; 8339dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2E , (value & 0xFF) ) ; 8340dfe64dd3Smacallan 8341dfe64dd3Smacallan /* HRE SR0C[2] CR05[4:0] */ 8342dfe64dd3Smacallan value = ( LVDSHRE >> 3 ) + 2; 8343dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0C , ~0x04 , ( value & 0x20 ) >> 3 ) ; 8344dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x05 , ~0x1F , value & 0x1F ) ; 8345dfe64dd3Smacallan 8346dfe64dd3Smacallan /* Panel HRE SR2F[7:2] */ 8347dfe64dd3Smacallan value--; 8348dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2F , ~0xFC , value << 2 ) ; 8349dfe64dd3Smacallan 8350dfe64dd3Smacallan /* VT SR0A[0] CR07[5][0] CR06 */ 8351dfe64dd3Smacallan value = LVDSVT - 2 ; 8352dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x01 , ( value & 0x400 ) >> 10 ) ; 8353dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x20 , ( value & 0x200 ) >> 4 ) ; 8354dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x01 , ( value & 0x100 ) >> 8 ) ; 8355dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x06 , (value & 0xFF) ) ; 8356dfe64dd3Smacallan 8357dfe64dd3Smacallan /* VBS SR0A[2] CR09[5] CR07[3] CR15 */ 8358dfe64dd3Smacallan value = LVDSVBS - 1 ; 8359dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x04 , ( value & 0x400 ) >> 8 ) ; 8360dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x09 , ~0x20 , ( value & 0x200 ) >> 4 ) ; 8361dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x08 , ( value & 0x100 ) >> 5 ) ; 8362dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x15 , (value & 0xFF) ) ; 8363dfe64dd3Smacallan 8364dfe64dd3Smacallan /* VBE SR0A[4] CR16 */ 8365dfe64dd3Smacallan value = LVDSVBE - 1; 8366dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x10 , ( value & 0x100 ) >> 4 ) ; 8367dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x16 , (value & 0xFF) ) ; 8368dfe64dd3Smacallan 8369dfe64dd3Smacallan /* VRS SR0A[3] CR7[7][2] CR10 */ 8370dfe64dd3Smacallan value = LVDSVRS - 1 ; 8371dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x08 , ( value & 0x400 ) >> 7 ) ; 8372dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x80 , ( value & 0x200 ) >> 2 ) ; 8373dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x07 , ~0x04 , ( value & 0x100 ) >> 6 ) ; 8374dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3d4 , 0x10 , (value & 0xFF) ) ; 8375dfe64dd3Smacallan 8376dfe64dd3Smacallan /* Panel VRS SR35[2:0] SR34[7:0] */ 8377dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x35 , ~0x07 , ( value & 0x700 ) >> 8 ) ; 8378dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x34 , value & 0xFF ) ; 8379dfe64dd3Smacallan 8380dfe64dd3Smacallan /* VRE SR0A[5] CR11[3:0] */ 8381dfe64dd3Smacallan value = LVDSVRE - 1; 8382dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x0A , ~0x20 , ( value & 0x10 ) << 1 ) ; 8383dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3d4 , 0x11 , ~0x0F , value & 0x0F ) ; 8384dfe64dd3Smacallan 8385dfe64dd3Smacallan /* Panel VRE SR3F[7:2] */ 8386dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x3F , ~0xFC , ( value << 2 ) & 0xFC ) ; 8387dfe64dd3Smacallan 8388dfe64dd3Smacallan for ( temp=0, value = 0; temp < 3; temp++) 8389dfe64dd3Smacallan { 8390dfe64dd3Smacallan 8391dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->P3c4 , 0x31 , ~0x30 , value ) ; 8392dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2B , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData1) ; 8393dfe64dd3Smacallan XGI_SetReg( (XGIIOADDRESS) pVBInfo->P3c4 , 0x2C , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData2) ; 8394dfe64dd3Smacallan value += 0x10; 8395dfe64dd3Smacallan } 8396dfe64dd3Smacallan 8397dfe64dd3Smacallan if (!( modeflag & Charx8Dot )) 8398dfe64dd3Smacallan { 8399dfe64dd3Smacallan XGI_GetRegByte( (XGIIOADDRESS) pVBInfo->P3da ) ; /* reset 3da */ 8400dfe64dd3Smacallan XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c0 , 0x13 ) ; /* set index */ 8401dfe64dd3Smacallan XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c0 , 0x00 ) ; /* set data, panning = 0, shift left 1 dot*/ 8402dfe64dd3Smacallan 8403dfe64dd3Smacallan XGI_GetRegByte( (XGIIOADDRESS) pVBInfo->P3da ) ; /* Enable Attribute */ 8404dfe64dd3Smacallan XGI_SetRegByte( (XGIIOADDRESS) pVBInfo->P3c0 , 0x20 ) ; 8405dfe64dd3Smacallan 8406dfe64dd3Smacallan XGI_GetRegByte( (XGIIOADDRESS) pVBInfo->P3da ) ; /* reset 3da */ 8407dfe64dd3Smacallan } 8408dfe64dd3Smacallan} 8409dfe64dd3Smacallan 8410dfe64dd3Smacallan 8411dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8412dfe64dd3Smacallan/* Function : XGI_IsLCDON */ 8413dfe64dd3Smacallan/* Input : */ 8414dfe64dd3Smacallan/* Output : FALSE : Skip PSC Control */ 8415dfe64dd3Smacallan/* TRUE: Disable PSC */ 8416dfe64dd3Smacallan/* Description : */ 8417dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8418dfe64dd3SmacallanBOOLEAN 8419dfe64dd3SmacallanXGI_IsLCDON(PVB_DEVICE_INFO pVBInfo) 8420dfe64dd3Smacallan{ 8421dfe64dd3Smacallan USHORT tempax; 8422dfe64dd3Smacallan 8423dfe64dd3Smacallan tempax = pVBInfo->VBInfo; 8424dfe64dd3Smacallan if (tempax & SetCRT2ToDualEdge) 8425dfe64dd3Smacallan return FALSE; 8426dfe64dd3Smacallan else if (tempax & (DisableCRT2Display | SwitchToCRT2 | SetSimuScanMode)) 8427dfe64dd3Smacallan return TRUE; 8428dfe64dd3Smacallan 8429dfe64dd3Smacallan return FALSE; 8430dfe64dd3Smacallan} 8431dfe64dd3Smacallan 8432dfe64dd3Smacallan 8433dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8434dfe64dd3Smacallan/* Function : XGI_EnablePWD */ 8435dfe64dd3Smacallan/* Input : */ 8436dfe64dd3Smacallan/* Output : */ 8437dfe64dd3Smacallan/* Description : */ 8438dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8439dfe64dd3Smacallanvoid 8440dfe64dd3SmacallanXGI_EnablePWD(PVB_DEVICE_INFO pVBInfo) 8441dfe64dd3Smacallan{ 8442dfe64dd3Smacallan USHORT index, temp; 8443dfe64dd3Smacallan 8444dfe64dd3Smacallan index = XGI_GetLCDCapPtr(pVBInfo); 8445dfe64dd3Smacallan temp = pVBInfo->LCDCapList[index].PWD_2B; 8446dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2B, temp); 8447dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2C, 8448dfe64dd3Smacallan pVBInfo->LCDCapList[index].PWD_2C); 8449dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2D, 8450dfe64dd3Smacallan pVBInfo->LCDCapList[index].PWD_2D); 8451dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2E, 8452dfe64dd3Smacallan pVBInfo->LCDCapList[index].PWD_2E); 8453dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x2F, 8454dfe64dd3Smacallan pVBInfo->LCDCapList[index].PWD_2F); 8455dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x27, 0x80); /* enable PWD */ 8456dfe64dd3Smacallan} 8457dfe64dd3Smacallan 8458dfe64dd3Smacallan 8459dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8460dfe64dd3Smacallan/* Function : XGI_DisablePWD */ 8461dfe64dd3Smacallan/* Input : */ 8462dfe64dd3Smacallan/* Output : */ 8463dfe64dd3Smacallan/* Description : */ 8464dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8465dfe64dd3Smacallanvoid 8466dfe64dd3SmacallanXGI_DisablePWD(PVB_DEVICE_INFO pVBInfo) 8467dfe64dd3Smacallan{ 8468dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part4Port, 0x27, 0x7F); /* disable PWD */ 8469dfe64dd3Smacallan} 8470dfe64dd3Smacallan 8471dfe64dd3Smacallan 8472dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8473dfe64dd3Smacallan/* Function : XGI_DisableChISLCD */ 8474dfe64dd3Smacallan/* Input : */ 8475dfe64dd3Smacallan/* Output : FALSE -> Not LCD Mode */ 8476dfe64dd3Smacallan/* Description : */ 8477dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8478dfe64dd3SmacallanBOOLEAN 8479dfe64dd3SmacallanXGI_DisableChISLCD(PVB_DEVICE_INFO pVBInfo) 8480dfe64dd3Smacallan{ 8481dfe64dd3Smacallan USHORT tempbx, tempah; 8482dfe64dd3Smacallan 8483dfe64dd3Smacallan tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB); 8484dfe64dd3Smacallan tempah = ~((USHORT) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E)); 8485dfe64dd3Smacallan 8486dfe64dd3Smacallan if (tempbx & (EnableChA | DisableChA)) { 8487dfe64dd3Smacallan if (!(tempah & 0x08)) /* Chk LCDA Mode */ 8488dfe64dd3Smacallan return FALSE; 8489dfe64dd3Smacallan } 8490dfe64dd3Smacallan 8491dfe64dd3Smacallan if (!(tempbx & (EnableChB | DisableChB))) 8492dfe64dd3Smacallan return FALSE; 8493dfe64dd3Smacallan 8494dfe64dd3Smacallan if (tempah & 0x01) /* Chk LCDB Mode */ 8495dfe64dd3Smacallan return TRUE; 8496dfe64dd3Smacallan 8497dfe64dd3Smacallan return FALSE; 8498dfe64dd3Smacallan} 8499dfe64dd3Smacallan 8500dfe64dd3Smacallan 8501dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8502dfe64dd3Smacallan/* Function : XGI_EnableChISLCD */ 8503dfe64dd3Smacallan/* Input : */ 8504dfe64dd3Smacallan/* Output : 0 -> Not LCD mode */ 8505dfe64dd3Smacallan/* Description : */ 8506dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8507dfe64dd3SmacallanBOOLEAN 8508dfe64dd3SmacallanXGI_EnableChISLCD(PVB_DEVICE_INFO pVBInfo) 8509dfe64dd3Smacallan{ 8510dfe64dd3Smacallan USHORT tempbx, tempah; 8511dfe64dd3Smacallan 8512dfe64dd3Smacallan 8513dfe64dd3Smacallan tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB); 8514dfe64dd3Smacallan tempah = ~((USHORT) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E)); 8515dfe64dd3Smacallan 8516dfe64dd3Smacallan if (tempbx & (EnableChA | DisableChA)) { 8517dfe64dd3Smacallan if (!(tempah & 0x08)) /* Chk LCDA Mode */ 8518dfe64dd3Smacallan return FALSE; 8519dfe64dd3Smacallan } 8520dfe64dd3Smacallan 8521dfe64dd3Smacallan if (!(tempbx & (EnableChB | DisableChB))) 8522dfe64dd3Smacallan return FALSE; 8523dfe64dd3Smacallan 8524dfe64dd3Smacallan if (tempah & 0x01) /* Chk LCDB Mode */ 8525dfe64dd3Smacallan return TRUE; 8526dfe64dd3Smacallan 8527dfe64dd3Smacallan return FALSE; 8528dfe64dd3Smacallan} 8529dfe64dd3Smacallan 8530dfe64dd3Smacallan 8531dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8532dfe64dd3Smacallan/* Function : XGI_GetLCDCapPtr */ 8533dfe64dd3Smacallan/* Input : */ 8534dfe64dd3Smacallan/* Output : */ 8535dfe64dd3Smacallan/* Description : */ 8536dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8537dfe64dd3SmacallanUSHORT 8538dfe64dd3SmacallanXGI_GetLCDCapPtr(PVB_DEVICE_INFO pVBInfo) 8539dfe64dd3Smacallan{ 8540dfe64dd3Smacallan UCHAR tempal, tempah, tempbl, i; 8541dfe64dd3Smacallan 8542dfe64dd3Smacallan tempah = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x36); 8543dfe64dd3Smacallan tempal = tempah & 0x0F; 8544dfe64dd3Smacallan tempah = tempah & 0xF0; 8545dfe64dd3Smacallan i = 0; 8546dfe64dd3Smacallan tempbl = pVBInfo->LCDCapList[i].LCD_ID; 8547dfe64dd3Smacallan 8548dfe64dd3Smacallan while (tempbl != 0xFF) { 8549dfe64dd3Smacallan if (tempbl & 0x80) { /* OEMUtil */ 8550dfe64dd3Smacallan tempal = tempah; 8551dfe64dd3Smacallan tempbl = tempbl & ~(0x80); 8552dfe64dd3Smacallan } 8553dfe64dd3Smacallan 8554dfe64dd3Smacallan if (tempal == tempbl) 8555dfe64dd3Smacallan break; 8556dfe64dd3Smacallan 8557dfe64dd3Smacallan i++; 8558dfe64dd3Smacallan 8559dfe64dd3Smacallan tempbl = pVBInfo->LCDCapList[i].LCD_ID; 8560dfe64dd3Smacallan } 8561dfe64dd3Smacallan 8562dfe64dd3Smacallan return i; 8563dfe64dd3Smacallan} 8564dfe64dd3Smacallan 8565dfe64dd3Smacallan 8566dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8567dfe64dd3Smacallan/* Function : XGI_GetLCDCapPtr1 */ 8568dfe64dd3Smacallan/* Input : */ 8569dfe64dd3Smacallan/* Output : */ 8570dfe64dd3Smacallan/* Description : */ 8571dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8572dfe64dd3SmacallanUSHORT 8573dfe64dd3SmacallanXGI_GetLCDCapPtr1(PVB_DEVICE_INFO pVBInfo) 8574dfe64dd3Smacallan{ 8575dfe64dd3Smacallan USHORT tempah, tempal, tempbl, i; 8576dfe64dd3Smacallan 8577dfe64dd3Smacallan tempal = pVBInfo->LCDResInfo; 8578dfe64dd3Smacallan tempah = pVBInfo->LCDTypeInfo; 8579dfe64dd3Smacallan 8580dfe64dd3Smacallan i = 0; 8581dfe64dd3Smacallan tempbl = pVBInfo->LCDCapList[i].LCD_ID; 8582dfe64dd3Smacallan 8583dfe64dd3Smacallan while (tempbl != 0xFF) { 8584dfe64dd3Smacallan if ((tempbl & 0x80) && (tempbl != 0x80)) { 8585dfe64dd3Smacallan tempal = tempah; 8586dfe64dd3Smacallan tempbl &= ~0x80; 8587dfe64dd3Smacallan } 8588dfe64dd3Smacallan 8589dfe64dd3Smacallan if (tempal == tempbl) 8590dfe64dd3Smacallan break; 8591dfe64dd3Smacallan 8592dfe64dd3Smacallan i++; 8593dfe64dd3Smacallan tempbl = pVBInfo->LCDCapList[i].LCD_ID; 8594dfe64dd3Smacallan } 8595dfe64dd3Smacallan 8596dfe64dd3Smacallan if (tempbl == 0xFF) { 8597dfe64dd3Smacallan pVBInfo->LCDResInfo = Panel1024x768; 8598dfe64dd3Smacallan pVBInfo->LCDTypeInfo = 0; 8599dfe64dd3Smacallan i = 0; 8600dfe64dd3Smacallan } 8601dfe64dd3Smacallan 8602dfe64dd3Smacallan return i; 8603dfe64dd3Smacallan} 8604dfe64dd3Smacallan 8605dfe64dd3Smacallan 8606dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8607dfe64dd3Smacallan/* Function : XGI_GetLCDSync */ 8608dfe64dd3Smacallan/* Input : */ 8609dfe64dd3Smacallan/* Output : */ 8610dfe64dd3Smacallan/* Description : */ 8611dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8612dfe64dd3Smacallanvoid 8613098ad5bdSmacallanXGI_GetLCDSync(ULONG * HSyncWidth, ULONG * VSyncWidth, 8614dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 8615dfe64dd3Smacallan{ 8616dfe64dd3Smacallan USHORT Index; 8617dfe64dd3Smacallan 8618dfe64dd3Smacallan Index = XGI_GetLCDCapPtr(pVBInfo); 8619dfe64dd3Smacallan *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth; 8620dfe64dd3Smacallan *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth; 8621dfe64dd3Smacallan 8622dfe64dd3Smacallan return; 8623dfe64dd3Smacallan} 8624dfe64dd3Smacallan 8625dfe64dd3Smacallan 8626dfe64dd3Smacallan 8627dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8628dfe64dd3Smacallan/* Function : XGI_EnableBridge */ 8629dfe64dd3Smacallan/* Input : */ 8630dfe64dd3Smacallan/* Output : */ 8631dfe64dd3Smacallan/* Description : */ 8632dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8633dfe64dd3Smacallanvoid 8634dfe64dd3SmacallanXGI_EnableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, 8635dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 8636dfe64dd3Smacallan{ 8637dfe64dd3Smacallan#ifndef LINUX_XF86 8638dfe64dd3Smacallan USHORT tempax; 8639dfe64dd3Smacallan#endif 8640dfe64dd3Smacallan USHORT tempbl, tempah; 8641dfe64dd3Smacallan 8642dfe64dd3Smacallan if (pVBInfo->SetFlag == Win9xDOSMode) { 8643dfe64dd3Smacallan if (pVBInfo-> 8644dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 8645dfe64dd3Smacallan VB_XGI301C)) { 8646dfe64dd3Smacallan XGI_DisplayOn(HwDeviceExtension, pVBInfo); 8647dfe64dd3Smacallan return; 8648dfe64dd3Smacallan } 8649dfe64dd3Smacallan else /* LVDS or CH7017 */ 8650dfe64dd3Smacallan return; 8651dfe64dd3Smacallan } 8652dfe64dd3Smacallan 8653dfe64dd3Smacallan 8654dfe64dd3Smacallan if (HwDeviceExtension->jChipType < XG40) { 8655dfe64dd3Smacallan if (!XGI_DisableChISLCD(pVBInfo)) { 8656dfe64dd3Smacallan if ((XGI_EnableChISLCD(pVBInfo)) 8657dfe64dd3Smacallan || (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))) { 8658dfe64dd3Smacallan if (pVBInfo->LCDInfo & SetPWDEnable) { 8659dfe64dd3Smacallan XGI_EnablePWD(pVBInfo); 8660dfe64dd3Smacallan } 8661dfe64dd3Smacallan else { 8662dfe64dd3Smacallan pVBInfo->LCDInfo &= (~SetPWDEnable); 8663dfe64dd3Smacallan if (pVBInfo-> 8664dfe64dd3Smacallan VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) { 8665dfe64dd3Smacallan tempbl = 0xFD; 8666dfe64dd3Smacallan tempah = 0x02; 8667dfe64dd3Smacallan } 8668dfe64dd3Smacallan else { 8669dfe64dd3Smacallan tempbl = 0xFB; 8670dfe64dd3Smacallan tempah = 0x00; 8671dfe64dd3Smacallan } 8672dfe64dd3Smacallan 8673dfe64dd3Smacallan XGI_SetPanelPower(tempah, tempbl, pVBInfo); 8674dfe64dd3Smacallan XGI_SetPanelDelay(1, pVBInfo); 8675dfe64dd3Smacallan } 8676dfe64dd3Smacallan } 8677dfe64dd3Smacallan } 8678dfe64dd3Smacallan } /* Not 340 */ 8679dfe64dd3Smacallan 8680dfe64dd3Smacallan 8681dfe64dd3Smacallan 8682dfe64dd3Smacallan if (pVBInfo-> 8683dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 8684dfe64dd3Smacallan VB_XGI301C)) { 8685dfe64dd3Smacallan if (!(pVBInfo->SetFlag & DisableChA)) { 8686dfe64dd3Smacallan if (pVBInfo->SetFlag & EnableChA) { 8687dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0x20); /* Power on */ 8688dfe64dd3Smacallan } 8689dfe64dd3Smacallan else { 8690dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToDualEdge) { /* SetCRT2ToLCDA ) */ 8691dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0x20); /* Power on */ 8692dfe64dd3Smacallan } 8693dfe64dd3Smacallan } 8694dfe64dd3Smacallan } 8695dfe64dd3Smacallan 8696dfe64dd3Smacallan if (!(pVBInfo->SetFlag & DisableChB)) { 8697dfe64dd3Smacallan if ((pVBInfo->SetFlag & EnableChB) 8698dfe64dd3Smacallan || (pVBInfo-> 8699dfe64dd3Smacallan VBInfo & (SetCRT2ToLCD | SetCRT2ToTV | SetCRT2ToRAMDAC))) 8700dfe64dd3Smacallan { 8701dfe64dd3Smacallan tempah = 8702dfe64dd3Smacallan (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32); 8703dfe64dd3Smacallan tempah &= 0xDF; 8704dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) { 8705dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) 8706dfe64dd3Smacallan tempah |= 0x20; 8707dfe64dd3Smacallan } 8708dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x32, tempah); 8709dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->P3c4, 0x1E, 8710dfe64dd3Smacallan SR1E_ENABLE_CRT2); 8711dfe64dd3Smacallan 8712dfe64dd3Smacallan 8713dfe64dd3Smacallan tempah = 8714dfe64dd3Smacallan (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 8715dfe64dd3Smacallan 0x2E); 8716dfe64dd3Smacallan 8717dfe64dd3Smacallan if (!(tempah & 0x80)) 8718dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E, 0x80); /* BVBDOENABLE = 1 */ 8719dfe64dd3Smacallan 8720dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x7F); /* BScreenOFF = 0 */ 8721dfe64dd3Smacallan } 8722dfe64dd3Smacallan } 8723dfe64dd3Smacallan 8724dfe64dd3Smacallan if ((pVBInfo->SetFlag & (EnableChA | EnableChB)) 8725dfe64dd3Smacallan || (!(pVBInfo->VBInfo & DisableCRT2Display))) { 8726dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x00, ~0xE0, 0x20); /* shampoo 0129 */ 8727dfe64dd3Smacallan if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) { 8728dfe64dd3Smacallan if (!XGI_DisableChISLCD(pVBInfo)) { 8729dfe64dd3Smacallan if (XGI_EnableChISLCD(pVBInfo) 8730dfe64dd3Smacallan || (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))) 8731dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part4Port, 0x2A, 0x7F); /* LVDS PLL power on */ 8732dfe64dd3Smacallan } 8733dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, 0x7F); /* LVDS Driver power on */ 8734dfe64dd3Smacallan } 8735dfe64dd3Smacallan } 8736dfe64dd3Smacallan 8737dfe64dd3Smacallan tempah = 0x00; 8738dfe64dd3Smacallan 8739dfe64dd3Smacallan if (!(pVBInfo->VBInfo & DisableCRT2Display)) { 8740dfe64dd3Smacallan tempah = 0xc0; 8741dfe64dd3Smacallan 8742dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetSimuScanMode)) { 8743dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCDA) { 8744dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToDualEdge) { 8745dfe64dd3Smacallan tempah = tempah & 0x40; 8746dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCDA) 8747dfe64dd3Smacallan tempah = tempah ^ 0xC0; 8748dfe64dd3Smacallan 8749dfe64dd3Smacallan if (pVBInfo->SetFlag & DisableChB) 8750dfe64dd3Smacallan tempah &= 0xBF; 8751dfe64dd3Smacallan 8752dfe64dd3Smacallan if (pVBInfo->SetFlag & DisableChA) 8753dfe64dd3Smacallan tempah &= 0x7F; 8754dfe64dd3Smacallan 8755dfe64dd3Smacallan if (pVBInfo->SetFlag & EnableChB) 8756dfe64dd3Smacallan tempah |= 0x40; 8757dfe64dd3Smacallan 8758dfe64dd3Smacallan if (pVBInfo->SetFlag & EnableChA) 8759dfe64dd3Smacallan tempah |= 0x80; 8760dfe64dd3Smacallan } 8761dfe64dd3Smacallan } 8762dfe64dd3Smacallan } 8763dfe64dd3Smacallan } 8764dfe64dd3Smacallan 8765dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x1F, tempah); /* EnablePart4_1F */ 8766dfe64dd3Smacallan 8767dfe64dd3Smacallan if (pVBInfo->SetFlag & Win9xDOSMode) { 8768dfe64dd3Smacallan XGI_DisplayOn(HwDeviceExtension, pVBInfo); 8769dfe64dd3Smacallan return; 8770dfe64dd3Smacallan } 8771dfe64dd3Smacallan 8772dfe64dd3Smacallan if (!(pVBInfo->SetFlag & DisableChA)) { 8773dfe64dd3Smacallan XGI_VBLongWait(pVBInfo); 8774dfe64dd3Smacallan if (!(pVBInfo->SetFlag & GatingCRT)) { 8775dfe64dd3Smacallan XGI_DisableGatingCRT(HwDeviceExtension, pVBInfo); 8776dfe64dd3Smacallan XGI_DisplayOn(HwDeviceExtension, pVBInfo); 8777dfe64dd3Smacallan XGI_VBLongWait(pVBInfo); 8778dfe64dd3Smacallan } 8779dfe64dd3Smacallan } 8780dfe64dd3Smacallan } /* 301 */ 8781dfe64dd3Smacallan else { /* LVDS */ 8782dfe64dd3Smacallan 8783dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA)) 8784dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0x20); /* enable CRT2 */ 8785dfe64dd3Smacallan 8786dfe64dd3Smacallan 8787dfe64dd3Smacallan 8788dfe64dd3Smacallan tempah = (UCHAR) XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E); 8789dfe64dd3Smacallan if (!(tempah & 0x80)) 8790dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2E, 0x80); /* BVBDOENABLE = 1 */ 8791dfe64dd3Smacallan 8792dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x7F); 8793dfe64dd3Smacallan XGI_DisplayOn(HwDeviceExtension, pVBInfo); 8794dfe64dd3Smacallan } /* End of VB */ 8795dfe64dd3Smacallan 8796dfe64dd3Smacallan 8797dfe64dd3Smacallan if (HwDeviceExtension->jChipType < XG40) { 8798dfe64dd3Smacallan if (!XGI_EnableChISLCD(pVBInfo)) { 8799dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { 8800dfe64dd3Smacallan if (XGI_BacklightByDrv(pVBInfo)) 8801dfe64dd3Smacallan return; 8802dfe64dd3Smacallan } 8803dfe64dd3Smacallan else 8804dfe64dd3Smacallan return; 8805dfe64dd3Smacallan } 8806dfe64dd3Smacallan 8807dfe64dd3Smacallan if (pVBInfo->LCDInfo & SetPWDEnable) { 8808dfe64dd3Smacallan XGI_FirePWDEnable(pVBInfo); 8809dfe64dd3Smacallan return; 8810dfe64dd3Smacallan } 8811dfe64dd3Smacallan 8812dfe64dd3Smacallan XGI_SetPanelDelay(2, pVBInfo); 8813dfe64dd3Smacallan 8814dfe64dd3Smacallan if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) { 8815dfe64dd3Smacallan tempah = 0x01; 8816dfe64dd3Smacallan tempbl = 0xFE; /* turn on backlght */ 8817dfe64dd3Smacallan } 8818dfe64dd3Smacallan else { 8819dfe64dd3Smacallan tempbl = 0xF7; 8820dfe64dd3Smacallan tempah = 0x00; 8821dfe64dd3Smacallan } 8822dfe64dd3Smacallan XGI_SetPanelPower(tempah, tempbl, pVBInfo); 8823dfe64dd3Smacallan } 8824dfe64dd3Smacallan} 8825dfe64dd3Smacallan 8826dfe64dd3Smacallan 8827dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8828dfe64dd3Smacallan/* Function : XGI_DisableBridge */ 8829dfe64dd3Smacallan/* Input : */ 8830dfe64dd3Smacallan/* Output : */ 8831dfe64dd3Smacallan/* Description : */ 8832dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8833dfe64dd3Smacallanvoid 8834dfe64dd3SmacallanXGI_DisableBridge(PXGI_HW_DEVICE_INFO HwDeviceExtension, 8835dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 8836dfe64dd3Smacallan{ 8837dfe64dd3Smacallan USHORT tempax, tempbx, tempah = 0, tempbl = 0; 8838dfe64dd3Smacallan 8839dfe64dd3Smacallan if (pVBInfo->SetFlag == Win9xDOSMode) 8840dfe64dd3Smacallan return; 8841dfe64dd3Smacallan 8842dfe64dd3Smacallan 8843dfe64dd3Smacallan if (HwDeviceExtension->jChipType < XG40) { 8844dfe64dd3Smacallan if ((!(pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))) 8845dfe64dd3Smacallan || (XGI_DisableChISLCD(pVBInfo))) { 8846dfe64dd3Smacallan if (!XGI_IsLCDON(pVBInfo)) { 8847dfe64dd3Smacallan if (pVBInfo->LCDInfo & SetPWDEnable) 8848dfe64dd3Smacallan XGI_EnablePWD(pVBInfo); 8849dfe64dd3Smacallan else { 8850dfe64dd3Smacallan pVBInfo->LCDInfo &= ~SetPWDEnable; 8851dfe64dd3Smacallan XGI_DisablePWD(pVBInfo); 8852dfe64dd3Smacallan if (pVBInfo-> 8853dfe64dd3Smacallan VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) { 8854dfe64dd3Smacallan tempbx = 0xFE; /* not 01h */ 8855dfe64dd3Smacallan tempax = 0; 8856dfe64dd3Smacallan } 8857dfe64dd3Smacallan else { 8858dfe64dd3Smacallan tempbx = 0xF7; /* not 08h */ 8859dfe64dd3Smacallan tempax = 0x08; 8860dfe64dd3Smacallan } 8861dfe64dd3Smacallan XGI_SetPanelPower(tempax, tempbx, pVBInfo); 8862dfe64dd3Smacallan XGI_SetPanelDelay(3, pVBInfo); 8863dfe64dd3Smacallan } 8864dfe64dd3Smacallan } /* end if(!XGI_IsLCDON(pVBInfo)) */ 8865dfe64dd3Smacallan } 8866dfe64dd3Smacallan } 8867dfe64dd3Smacallan 8868dfe64dd3Smacallan 8869dfe64dd3Smacallan if (pVBInfo-> 8870dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 8871dfe64dd3Smacallan VB_XGI301C)) { 8872dfe64dd3Smacallan tempah = 0x3F; 8873dfe64dd3Smacallan if (!(pVBInfo->VBInfo & (DisableCRT2Display | SetSimuScanMode))) { 8874dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCDA) { 8875dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToDualEdge) { 8876dfe64dd3Smacallan tempah = 0x7F; /* Disable Channel A */ 8877dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) 8878dfe64dd3Smacallan tempah = 0xBF; /* Disable Channel B */ 8879dfe64dd3Smacallan 8880dfe64dd3Smacallan if (pVBInfo->SetFlag & DisableChB) 8881dfe64dd3Smacallan tempah &= 0xBF; /* force to disable Cahnnel */ 8882dfe64dd3Smacallan 8883dfe64dd3Smacallan if (pVBInfo->SetFlag & DisableChA) 8884dfe64dd3Smacallan tempah &= 0x7F; /* Force to disable Channel B */ 8885dfe64dd3Smacallan } 8886dfe64dd3Smacallan } 8887dfe64dd3Smacallan } 8888dfe64dd3Smacallan 8889dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part4Port, 0x1F, tempah); /* disable part4_1f */ 8890dfe64dd3Smacallan 8891dfe64dd3Smacallan if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) { 8892dfe64dd3Smacallan if (((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))) 8893dfe64dd3Smacallan || (XGI_DisableChISLCD(pVBInfo)) || (XGI_IsLCDON(pVBInfo))) 8894dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, 0x80); /* LVDS Driver power down */ 8895dfe64dd3Smacallan } 8896dfe64dd3Smacallan 8897dfe64dd3Smacallan if ((pVBInfo->SetFlag & DisableChA) 8898dfe64dd3Smacallan || (pVBInfo-> 8899dfe64dd3Smacallan VBInfo & (DisableCRT2Display | SetCRT2ToLCDA | 8900dfe64dd3Smacallan SetSimuScanMode))) { 8901dfe64dd3Smacallan if (pVBInfo->SetFlag & GatingCRT) 8902dfe64dd3Smacallan XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo); 8903dfe64dd3Smacallan XGI_DisplayOff(HwDeviceExtension, pVBInfo); 8904dfe64dd3Smacallan } 8905dfe64dd3Smacallan 8906dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCDA) { 8907dfe64dd3Smacallan if ((pVBInfo->SetFlag & DisableChA) 8908dfe64dd3Smacallan || (pVBInfo->VBInfo & SetCRT2ToLCDA)) 8909dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x1e, 0xdf); /* Power down */ 8910dfe64dd3Smacallan } 8911dfe64dd3Smacallan 8912dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3c4, 0x32, 0xdf); /* disable TV as primary VGA swap */ 8913dfe64dd3Smacallan 8914dfe64dd3Smacallan if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge))) 8915dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part2Port, 0x00, 0xdf); 8916dfe64dd3Smacallan 8917dfe64dd3Smacallan if ((pVBInfo->SetFlag & DisableChB) 8918dfe64dd3Smacallan || (pVBInfo->VBInfo & (DisableCRT2Display | SetSimuScanMode)) 8919dfe64dd3Smacallan || ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) 8920dfe64dd3Smacallan && (pVBInfo-> 8921dfe64dd3Smacallan VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV)))) 8922dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x80); /* BScreenOff=1 */ 8923dfe64dd3Smacallan 8924dfe64dd3Smacallan if ((pVBInfo->SetFlag & DisableChB) 8925dfe64dd3Smacallan || (pVBInfo->VBInfo & (DisableCRT2Display | SetSimuScanMode)) 8926dfe64dd3Smacallan || (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) 8927dfe64dd3Smacallan || (pVBInfo-> 8928dfe64dd3Smacallan VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) { 8929dfe64dd3Smacallan tempah = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x00); /* save Part1 index 0 */ 8930dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x10); /* BTDAC = 1, avoid VB reset */ 8931dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0xDF); /* disable CRT2 */ 8932dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, tempah); /* restore Part1 index 0 */ 8933dfe64dd3Smacallan } 8934dfe64dd3Smacallan } 8935dfe64dd3Smacallan else { /* {301} */ 8936dfe64dd3Smacallan 8937dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) { 8938dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, 0x80); /* BScreenOff=1 */ 8939dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part1Port, 0x1E, 0xDF); /* Disable CRT2 */ 8940dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->P3c4, 0x32, 0xDF); /* Disable TV asPrimary VGA swap */ 8941dfe64dd3Smacallan } 8942dfe64dd3Smacallan 8943dfe64dd3Smacallan if (pVBInfo-> 8944dfe64dd3Smacallan VBInfo & (DisableCRT2Display | SetCRT2ToLCDA | SetSimuScanMode)) 8945dfe64dd3Smacallan XGI_DisplayOff(HwDeviceExtension,pVBInfo); 8946dfe64dd3Smacallan } 8947dfe64dd3Smacallan 8948dfe64dd3Smacallan 8949dfe64dd3Smacallan 8950dfe64dd3Smacallan 8951dfe64dd3Smacallan if (HwDeviceExtension->jChipType < XG40) { 8952dfe64dd3Smacallan if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) 8953dfe64dd3Smacallan || (XGI_DisableChISLCD(pVBInfo)) || (XGI_IsLCDON(pVBInfo))) { 8954dfe64dd3Smacallan if (pVBInfo->LCDInfo & SetPWDEnable) { 8955dfe64dd3Smacallan if (pVBInfo->LCDInfo & SetPWDEnable) 8956dfe64dd3Smacallan XGI_BacklightByDrv(pVBInfo); 8957dfe64dd3Smacallan else { 8958dfe64dd3Smacallan XGI_SetPanelDelay(4, pVBInfo); 8959dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301LV) { 8960dfe64dd3Smacallan tempbl = 0xFD; 8961dfe64dd3Smacallan tempah = 0x00; 8962dfe64dd3Smacallan } 8963dfe64dd3Smacallan else { 8964dfe64dd3Smacallan tempbl = 0xFB; 8965dfe64dd3Smacallan tempah = 0x04; 8966dfe64dd3Smacallan } 8967dfe64dd3Smacallan } 8968dfe64dd3Smacallan } 8969dfe64dd3Smacallan XGI_SetPanelPower(tempah, tempbl, pVBInfo); 8970dfe64dd3Smacallan } 8971dfe64dd3Smacallan } 8972dfe64dd3Smacallan} 8973dfe64dd3Smacallan 8974dfe64dd3Smacallan 8975dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8976dfe64dd3Smacallan/* Function : XGI_GetTVPtrIndex */ 8977dfe64dd3Smacallan/* Input : */ 8978dfe64dd3Smacallan/* Output : */ 8979dfe64dd3Smacallan/* Description : bx 0 : ExtNTSC */ 8980dfe64dd3Smacallan/* 1 : StNTSC */ 8981dfe64dd3Smacallan/* 2 : ExtPAL */ 8982dfe64dd3Smacallan/* 3 : StPAL */ 8983dfe64dd3Smacallan/* 4 : ExtHiTV */ 8984dfe64dd3Smacallan/* 5 : StHiTV */ 8985dfe64dd3Smacallan/* 6 : Ext525i */ 8986dfe64dd3Smacallan/* 7 : St525i */ 8987dfe64dd3Smacallan/* 8 : Ext525p */ 8988dfe64dd3Smacallan/* 9 : St525p */ 8989dfe64dd3Smacallan/* A : Ext750p */ 8990dfe64dd3Smacallan/* B : St750p */ 8991dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 8992dfe64dd3SmacallanUSHORT 8993dfe64dd3SmacallanXGI_GetTVPtrIndex(PVB_DEVICE_INFO pVBInfo) 8994dfe64dd3Smacallan{ 8995dfe64dd3Smacallan USHORT tempbx = 0; 8996dfe64dd3Smacallan 8997dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALTV) 8998dfe64dd3Smacallan tempbx = 2; 8999dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode1080i) 9000dfe64dd3Smacallan tempbx = 4; 9001dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode525i) 9002dfe64dd3Smacallan tempbx = 6; 9003dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode525p) 9004dfe64dd3Smacallan tempbx = 8; 9005dfe64dd3Smacallan if (pVBInfo->TVInfo & SetYPbPrMode750p) 9006dfe64dd3Smacallan tempbx = 10; 9007dfe64dd3Smacallan if (pVBInfo->TVInfo & TVSimuMode) 9008dfe64dd3Smacallan tempbx++; 9009dfe64dd3Smacallan 9010dfe64dd3Smacallan return tempbx; 9011dfe64dd3Smacallan} 9012dfe64dd3Smacallan 9013dfe64dd3Smacallan 9014dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9015dfe64dd3Smacallan/* Function : XGI_OEM310Setting */ 9016dfe64dd3Smacallan/* Input : */ 9017dfe64dd3Smacallan/* Output : */ 9018dfe64dd3Smacallan/* Description : Customized Param. for 301 */ 9019dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9020dfe64dd3Smacallanvoid 9021dfe64dd3SmacallanXGI_OEM310Setting(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 9022dfe64dd3Smacallan{ 9023dfe64dd3Smacallan if (pVBInfo->SetFlag & Win9xDOSMode) 9024dfe64dd3Smacallan return; 9025dfe64dd3Smacallan 9026dfe64dd3Smacallan /* GetPart1IO(); */ 9027dfe64dd3Smacallan XGI_SetDelayComp(pVBInfo); 9028dfe64dd3Smacallan 9029dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) 9030dfe64dd3Smacallan XGI_SetLCDCap(pVBInfo); 9031dfe64dd3Smacallan 9032dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { 9033dfe64dd3Smacallan /* GetPart2IO() */ 9034dfe64dd3Smacallan XGI_SetPhaseIncr(pVBInfo); 9035dfe64dd3Smacallan XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo); 9036dfe64dd3Smacallan XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo); 9037dfe64dd3Smacallan 9038dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301) 9039dfe64dd3Smacallan XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo); 9040dfe64dd3Smacallan } 9041dfe64dd3Smacallan} 9042dfe64dd3Smacallan 9043dfe64dd3Smacallan 9044dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9045dfe64dd3Smacallan/* Function : XGI_SetDelayComp */ 9046dfe64dd3Smacallan/* Input : */ 9047dfe64dd3Smacallan/* Output : */ 9048dfe64dd3Smacallan/* Description : */ 9049dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9050dfe64dd3Smacallanvoid 9051dfe64dd3SmacallanXGI_SetDelayComp(PVB_DEVICE_INFO pVBInfo) 9052dfe64dd3Smacallan{ 9053dfe64dd3Smacallan USHORT index; 9054dfe64dd3Smacallan 9055dfe64dd3Smacallan UCHAR tempah, tempbl, tempbh; 9056dfe64dd3Smacallan#ifndef LINUX_XF86 9057dfe64dd3Smacallan UCHAR temp; 9058dfe64dd3Smacallan#endif 9059dfe64dd3Smacallan 9060dfe64dd3Smacallan if (pVBInfo-> 9061dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 9062dfe64dd3Smacallan VB_XGI301C)) { 9063dfe64dd3Smacallan if (pVBInfo-> 9064dfe64dd3Smacallan VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA | SetCRT2ToTV | 9065dfe64dd3Smacallan SetCRT2ToRAMDAC)) { 9066dfe64dd3Smacallan tempbl = 0; 9067dfe64dd3Smacallan tempbh = 0; 9068dfe64dd3Smacallan 9069dfe64dd3Smacallan index = XGI_GetTVPtrIndex(pVBInfo); /* Get TV Delay */ 9070dfe64dd3Smacallan tempbl = pVBInfo->XGI_TVDelayList[index]; 9071dfe64dd3Smacallan 9072dfe64dd3Smacallan if (pVBInfo-> 9073dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV 9074dfe64dd3Smacallan | VB_XGI301C)) 9075dfe64dd3Smacallan tempbl = pVBInfo->XGI_TVDelayList2[index]; 9076dfe64dd3Smacallan 9077dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToDualEdge) 9078dfe64dd3Smacallan tempbl = tempbl >> 4; 9079dfe64dd3Smacallan/* 9080dfe64dd3Smacallan if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) 9081dfe64dd3Smacallan tempbl = CRT2Delay1 ; // Get CRT2 Delay 9082dfe64dd3Smacallan 9083dfe64dd3Smacallan if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) 9084dfe64dd3Smacallan tempbl = CRT2Delay2 ; 9085dfe64dd3Smacallan*/ 9086dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { 9087dfe64dd3Smacallan index = XGI_GetLCDCapPtr(pVBInfo); /* Get LCD Delay */ 9088dfe64dd3Smacallan tempbh = pVBInfo->LCDCapList[index].LCD_DelayCompensation; 9089dfe64dd3Smacallan 9090dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) 9091dfe64dd3Smacallan tempbl = tempbh; 9092dfe64dd3Smacallan } 9093dfe64dd3Smacallan 9094dfe64dd3Smacallan tempbl &= 0x0F; 9095dfe64dd3Smacallan tempbh &= 0xF0; 9096dfe64dd3Smacallan tempah = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2D); 9097dfe64dd3Smacallan 9098dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV)) { /* Channel B */ 9099dfe64dd3Smacallan tempah &= 0xF0; 9100dfe64dd3Smacallan tempah |= tempbl; 9101dfe64dd3Smacallan } 9102dfe64dd3Smacallan 9103dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCDA) { /* Channel A */ 9104dfe64dd3Smacallan tempah &= 0x0F; 9105dfe64dd3Smacallan tempah |= tempbh; 9106dfe64dd3Smacallan } 9107dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x2D, tempah); 9108dfe64dd3Smacallan } 9109dfe64dd3Smacallan } 9110dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 9111dfe64dd3Smacallan else if ( pVBInfo->IF_DEF_LVDS == 1 ) 9112dfe64dd3Smacallan { 9113dfe64dd3Smacallan tempbl = 0; 9114dfe64dd3Smacallan tempbh = 0; 9115dfe64dd3Smacallan if ( pVBInfo->VBInfo & SetCRT2ToLCD ) 9116dfe64dd3Smacallan { 9117dfe64dd3Smacallan tempah = pVBInfo->LCDCapList[ XGI_GetLCDCapPtr(pVBInfo) ].LCD_DelayCompensation ; /* / Get LCD Delay */ 9118dfe64dd3Smacallan tempah &= 0x0f ; 9119dfe64dd3Smacallan tempah = tempah << 4 ; 9120dfe64dd3Smacallan XGI_SetRegANDOR( (XGIIOADDRESS) pVBInfo->Part1Port , 0x2D , 0x0f , tempah ) ; 9121dfe64dd3Smacallan } 9122dfe64dd3Smacallan } 9123dfe64dd3Smacallan 9124dfe64dd3Smacallan} 9125dfe64dd3Smacallan 9126dfe64dd3Smacallan 9127dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9128dfe64dd3Smacallan/* Function : XGI_SetLCDCap */ 9129dfe64dd3Smacallan/* Input : */ 9130dfe64dd3Smacallan/* Output : */ 9131dfe64dd3Smacallan/* Description : */ 9132dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9133dfe64dd3Smacallanvoid 9134dfe64dd3SmacallanXGI_SetLCDCap(PVB_DEVICE_INFO pVBInfo) 9135dfe64dd3Smacallan{ 9136dfe64dd3Smacallan USHORT tempcx; 9137dfe64dd3Smacallan 9138dfe64dd3Smacallan tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability; 9139dfe64dd3Smacallan 9140dfe64dd3Smacallan if (pVBInfo-> 9141dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 9142dfe64dd3Smacallan VB_XGI301C)) { 9143dfe64dd3Smacallan if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) { /* 301LV/302LV only */ 9144dfe64dd3Smacallan /* Set 301LV Capability */ 9145dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x24, 9146dfe64dd3Smacallan (UCHAR) (tempcx & 0x1F)); 9147dfe64dd3Smacallan } 9148dfe64dd3Smacallan /* VB Driving */ 9149dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x0D, 9150dfe64dd3Smacallan ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8), 9151dfe64dd3Smacallan (USHORT) ((tempcx & 9152dfe64dd3Smacallan (EnableVBCLKDRVLOW | EnablePLLSPLOW)) >> 9153dfe64dd3Smacallan 8)); 9154dfe64dd3Smacallan } 9155dfe64dd3Smacallan 9156dfe64dd3Smacallan if (pVBInfo-> 9157dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 9158dfe64dd3Smacallan VB_XGI301C)) { 9159dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCD) 9160dfe64dd3Smacallan XGI_SetLCDCap_B(tempcx, pVBInfo); 9161dfe64dd3Smacallan else if (pVBInfo->VBInfo & SetCRT2ToLCDA) 9162dfe64dd3Smacallan XGI_SetLCDCap_A(tempcx, pVBInfo); 9163dfe64dd3Smacallan 9164dfe64dd3Smacallan if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) { 9165dfe64dd3Smacallan if (tempcx & EnableSpectrum) 9166dfe64dd3Smacallan SetSpectrum(pVBInfo); 9167dfe64dd3Smacallan } 9168dfe64dd3Smacallan } 9169dfe64dd3Smacallan else /* LVDS,CH7017 */ 9170dfe64dd3Smacallan XGI_SetLCDCap_A(tempcx, pVBInfo); 9171dfe64dd3Smacallan} 9172dfe64dd3Smacallan 9173dfe64dd3Smacallan 9174dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9175dfe64dd3Smacallan/* Function : XGI_SetLCDCap_A */ 9176dfe64dd3Smacallan/* Input : */ 9177dfe64dd3Smacallan/* Output : */ 9178dfe64dd3Smacallan/* Description : */ 9179dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9180dfe64dd3Smacallanvoid 9181dfe64dd3SmacallanXGI_SetLCDCap_A(USHORT tempcx, PVB_DEVICE_INFO pVBInfo) 9182dfe64dd3Smacallan{ 9183dfe64dd3Smacallan USHORT temp; 9184dfe64dd3Smacallan 9185dfe64dd3Smacallan temp = XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x37); 9186dfe64dd3Smacallan 9187dfe64dd3Smacallan if (temp & LCDRGB18Bit) { 9188dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x19, 0x0F, (USHORT) (0x20 | (tempcx & 0x00C0))); /* Enable Dither */ 9189dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x1A, 0x7F, 0x80); 9190dfe64dd3Smacallan } 9191dfe64dd3Smacallan else { 9192dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x19, 0x0F, 9193dfe64dd3Smacallan (USHORT) (0x30 | (tempcx & 0x00C0))); 9194dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x1A, 0x7F, 0x00); 9195dfe64dd3Smacallan } 9196dfe64dd3Smacallan 9197dfe64dd3Smacallan/* 9198dfe64dd3Smacallan if ( tempcx & EnableLCD24bpp ) // 24bits 9199dfe64dd3Smacallan { 9200dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS)pVBInfo->Part1Port,0x19, 0x0F,(USHORT)(0x30|(tempcx&0x00C0)) ); 9201dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS)pVBInfo->Part1Port,0x1A,0x7F,0x00); 9202dfe64dd3Smacallan } 9203dfe64dd3Smacallan else 9204dfe64dd3Smacallan { 9205dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS)pVBInfo->Part1Port,0x19, 0x0F,(USHORT)(0x20|(tempcx&0x00C0)) );//Enable Dither 9206dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS)pVBInfo->Part1Port,0x1A,0x7F,0x80); 9207dfe64dd3Smacallan } 9208dfe64dd3Smacallan*/ 9209dfe64dd3Smacallan} 9210dfe64dd3Smacallan 9211dfe64dd3Smacallan 9212dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9213dfe64dd3Smacallan/* Function : XGI_SetLCDCap_B */ 9214dfe64dd3Smacallan/* Input : cx -> LCD Capability */ 9215dfe64dd3Smacallan/* Output : */ 9216dfe64dd3Smacallan/* Description : */ 9217dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9218dfe64dd3Smacallanvoid 9219dfe64dd3SmacallanXGI_SetLCDCap_B(USHORT tempcx, PVB_DEVICE_INFO pVBInfo) 9220dfe64dd3Smacallan{ 9221dfe64dd3Smacallan if (tempcx & EnableLCD24bpp) /* 24bits */ 9222dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x1A, 0xE0, 9223dfe64dd3Smacallan (USHORT) (((tempcx & 0x00ff) >> 6) | 0x0c)); 9224dfe64dd3Smacallan else 9225dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x1A, 0xE0, (USHORT) (((tempcx & 0x00ff) >> 6) | 0x18)); /* Enable Dither */ 9226dfe64dd3Smacallan} 9227dfe64dd3Smacallan 9228dfe64dd3Smacallan 9229dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9230dfe64dd3Smacallan/* Function : SetSpectrum */ 9231dfe64dd3Smacallan/* Input : */ 9232dfe64dd3Smacallan/* Output : */ 9233dfe64dd3Smacallan/* Description : */ 9234dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9235dfe64dd3Smacallanvoid 9236dfe64dd3SmacallanSetSpectrum(PVB_DEVICE_INFO pVBInfo) 9237dfe64dd3Smacallan{ 9238dfe64dd3Smacallan USHORT index; 9239dfe64dd3Smacallan 9240dfe64dd3Smacallan index = XGI_GetLCDCapPtr(pVBInfo); 9241dfe64dd3Smacallan 9242dfe64dd3Smacallan XGI_SetRegAND((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, 0x8F); /* disable down spectrum D[4] */ 9243dfe64dd3Smacallan XGI_WaitEndRetrace(pVBInfo->RelIO); 9244dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */ 9245dfe64dd3Smacallan XGI_WaitEndRetrace(pVBInfo->RelIO); 9246dfe64dd3Smacallan 9247dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x31, 9248dfe64dd3Smacallan pVBInfo->LCDCapList[index].Spectrum_31); 9249dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x32, 9250dfe64dd3Smacallan pVBInfo->LCDCapList[index].Spectrum_32); 9251dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x33, 9252dfe64dd3Smacallan pVBInfo->LCDCapList[index].Spectrum_33); 9253dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x34, 9254dfe64dd3Smacallan pVBInfo->LCDCapList[index].Spectrum_34); 9255dfe64dd3Smacallan XGI_WaitEndRetrace(pVBInfo->RelIO); 9256dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */ 9257dfe64dd3Smacallan} 9258dfe64dd3Smacallan 9259dfe64dd3Smacallan 9260dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9261dfe64dd3Smacallan/* Function : XGI_SetAntiFlicker */ 9262dfe64dd3Smacallan/* Input : */ 9263dfe64dd3Smacallan/* Output : */ 9264dfe64dd3Smacallan/* Description : Set TV Customized Param. */ 9265dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9266dfe64dd3Smacallanvoid 9267dfe64dd3SmacallanXGI_SetAntiFlicker(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 9268dfe64dd3Smacallan{ 9269dfe64dd3Smacallan USHORT tempbx, index; 9270dfe64dd3Smacallan 9271dfe64dd3Smacallan UCHAR tempah; 9272dfe64dd3Smacallan 9273dfe64dd3Smacallan if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p)) 9274dfe64dd3Smacallan return; 9275dfe64dd3Smacallan 9276dfe64dd3Smacallan tempbx = XGI_GetTVPtrIndex(pVBInfo); 9277dfe64dd3Smacallan tempbx &= 0xFE; 9278dfe64dd3Smacallan 9279dfe64dd3Smacallan if (ModeNo <= 0x13) { 9280dfe64dd3Smacallan index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVFlickerIndex; 9281dfe64dd3Smacallan } 9282dfe64dd3Smacallan else { 9283dfe64dd3Smacallan index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVFlickerIndex; 9284dfe64dd3Smacallan } 9285dfe64dd3Smacallan 9286dfe64dd3Smacallan tempbx += index; 9287dfe64dd3Smacallan tempah = TVAntiFlickList[tempbx]; 9288dfe64dd3Smacallan tempah = tempah << 4; 9289dfe64dd3Smacallan 9290dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x0A, 0x8F, tempah); 9291dfe64dd3Smacallan} 9292dfe64dd3Smacallan 9293dfe64dd3Smacallan 9294dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9295dfe64dd3Smacallan/* Function : XGI_SetEdgeEnhance */ 9296dfe64dd3Smacallan/* Input : */ 9297dfe64dd3Smacallan/* Output : */ 9298dfe64dd3Smacallan/* Description : */ 9299dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9300dfe64dd3Smacallanvoid 9301dfe64dd3SmacallanXGI_SetEdgeEnhance(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 9302dfe64dd3Smacallan{ 9303dfe64dd3Smacallan USHORT tempbx, index; 9304dfe64dd3Smacallan 9305dfe64dd3Smacallan UCHAR tempah; 9306dfe64dd3Smacallan 9307dfe64dd3Smacallan 9308dfe64dd3Smacallan tempbx = XGI_GetTVPtrIndex(pVBInfo); 9309dfe64dd3Smacallan tempbx &= 0xFE; 9310dfe64dd3Smacallan 9311dfe64dd3Smacallan if (ModeNo <= 0x13) { 9312dfe64dd3Smacallan index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVEdgeIndex; 9313dfe64dd3Smacallan } 9314dfe64dd3Smacallan else { 9315dfe64dd3Smacallan index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVEdgeIndex; 9316dfe64dd3Smacallan } 9317dfe64dd3Smacallan 9318dfe64dd3Smacallan tempbx += index; 9319dfe64dd3Smacallan tempah = TVEdgeList[tempbx]; 9320dfe64dd3Smacallan tempah = tempah << 5; 9321dfe64dd3Smacallan 9322dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part2Port, 0x3A, 0x1F, tempah); 9323dfe64dd3Smacallan} 9324dfe64dd3Smacallan 9325dfe64dd3Smacallan 9326dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9327dfe64dd3Smacallan/* Function : XGI_SetPhaseIncr */ 9328dfe64dd3Smacallan/* Input : */ 9329dfe64dd3Smacallan/* Output : */ 9330dfe64dd3Smacallan/* Description : */ 9331dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9332dfe64dd3Smacallanvoid 9333dfe64dd3SmacallanXGI_SetPhaseIncr(PVB_DEVICE_INFO pVBInfo) 9334dfe64dd3Smacallan{ 9335dfe64dd3Smacallan USHORT tempbx; 9336dfe64dd3Smacallan 9337dfe64dd3Smacallan UCHAR tempcl, tempch; 9338dfe64dd3Smacallan 9339dfe64dd3Smacallan ULONG tempData; 9340dfe64dd3Smacallan 9341dfe64dd3Smacallan XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */ 9342dfe64dd3Smacallan tempData = TVPhaseList[tempbx]; 9343dfe64dd3Smacallan 9344dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x31, 9345dfe64dd3Smacallan (USHORT) (tempData & 0x000000FF)); 9346dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x32, 9347dfe64dd3Smacallan (USHORT) ((tempData & 0x0000FF00) >> 8)); 9348dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x33, 9349dfe64dd3Smacallan (USHORT) ((tempData & 0x00FF0000) >> 16)); 9350dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x34, 9351dfe64dd3Smacallan (USHORT) ((tempData & 0xFF000000) >> 24)); 9352dfe64dd3Smacallan} 9353dfe64dd3Smacallan 9354dfe64dd3Smacallan 9355dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9356dfe64dd3Smacallan/* Function : XGI_SetYFilter */ 9357dfe64dd3Smacallan/* Input : */ 9358dfe64dd3Smacallan/* Output : */ 9359dfe64dd3Smacallan/* Description : */ 9360dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9361dfe64dd3Smacallanvoid 9362dfe64dd3SmacallanXGI_SetYFilter(USHORT ModeNo, USHORT ModeIdIndex, PVB_DEVICE_INFO pVBInfo) 9363dfe64dd3Smacallan{ 9364dfe64dd3Smacallan USHORT tempbx, index; 9365dfe64dd3Smacallan 9366dfe64dd3Smacallan UCHAR tempcl, tempch, tempal; 9367dfe64dd3Smacallan const UCHAR *filterPtr; 9368dfe64dd3Smacallan 9369dfe64dd3Smacallan XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */ 9370dfe64dd3Smacallan 9371dfe64dd3Smacallan switch (tempbx) { 9372dfe64dd3Smacallan case 0x00: 9373dfe64dd3Smacallan case 0x04: 9374dfe64dd3Smacallan filterPtr = NTSCYFilter1; 9375dfe64dd3Smacallan break; 9376dfe64dd3Smacallan 9377dfe64dd3Smacallan case 0x01: 9378dfe64dd3Smacallan filterPtr = PALYFilter1; 9379dfe64dd3Smacallan break; 9380dfe64dd3Smacallan 9381dfe64dd3Smacallan case 0x02: 9382dfe64dd3Smacallan case 0x05: 9383dfe64dd3Smacallan case 0x0D: 9384dfe64dd3Smacallan filterPtr = PALMYFilter1; 9385dfe64dd3Smacallan break; 9386dfe64dd3Smacallan 9387dfe64dd3Smacallan case 0x03: 9388dfe64dd3Smacallan filterPtr = PALNYFilter1; 9389dfe64dd3Smacallan break; 9390dfe64dd3Smacallan 9391dfe64dd3Smacallan case 0x08: 9392dfe64dd3Smacallan case 0x0C: 9393dfe64dd3Smacallan filterPtr = NTSCYFilter2; 9394dfe64dd3Smacallan break; 9395dfe64dd3Smacallan 9396dfe64dd3Smacallan case 0x0A: 9397dfe64dd3Smacallan filterPtr = PALMYFilter2; 9398dfe64dd3Smacallan break; 9399dfe64dd3Smacallan 9400dfe64dd3Smacallan case 0x0B: 9401dfe64dd3Smacallan filterPtr = PALNYFilter2; 9402dfe64dd3Smacallan break; 9403dfe64dd3Smacallan 9404dfe64dd3Smacallan case 0x09: 9405dfe64dd3Smacallan filterPtr = PALYFilter2; 9406dfe64dd3Smacallan break; 9407dfe64dd3Smacallan 9408dfe64dd3Smacallan default: 9409dfe64dd3Smacallan return; 9410dfe64dd3Smacallan } 9411dfe64dd3Smacallan 9412dfe64dd3Smacallan if (ModeNo <= 0x13) 9413dfe64dd3Smacallan tempal = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVYFilterIndex; 9414dfe64dd3Smacallan else 9415dfe64dd3Smacallan tempal = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex; 9416dfe64dd3Smacallan 9417dfe64dd3Smacallan if (tempcl == 0) 9418dfe64dd3Smacallan index = tempal * 4; 9419dfe64dd3Smacallan else 9420dfe64dd3Smacallan index = tempal * 7; 9421dfe64dd3Smacallan 9422dfe64dd3Smacallan if ((tempcl == 0) && (tempch == 1)) { 9423dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x35, 0); 9424dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x36, 0); 9425dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x37, 0); 9426dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x38, 9427dfe64dd3Smacallan filterPtr[index++]); 9428dfe64dd3Smacallan } 9429dfe64dd3Smacallan else { 9430dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x35, 9431dfe64dd3Smacallan filterPtr[index++]); 9432dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x36, 9433dfe64dd3Smacallan filterPtr[index++]); 9434dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x37, 9435dfe64dd3Smacallan filterPtr[index++]); 9436dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x38, 9437dfe64dd3Smacallan filterPtr[index++]); 9438dfe64dd3Smacallan } 9439dfe64dd3Smacallan 9440dfe64dd3Smacallan if (pVBInfo-> 9441dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 9442dfe64dd3Smacallan VB_XGI301C)) { 9443dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x48, 9444dfe64dd3Smacallan filterPtr[index++]); 9445dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x49, 9446dfe64dd3Smacallan filterPtr[index++]); 9447dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part2Port, 0x4A, 9448dfe64dd3Smacallan filterPtr[index++]); 9449dfe64dd3Smacallan } 9450dfe64dd3Smacallan} 9451dfe64dd3Smacallan 9452dfe64dd3Smacallan 9453dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9454dfe64dd3Smacallan/* Function : XGI_GetTVPtrIndex2 */ 9455dfe64dd3Smacallan/* Input : */ 9456dfe64dd3Smacallan/* Output : bx 0 : NTSC */ 9457dfe64dd3Smacallan/* 1 : PAL */ 9458dfe64dd3Smacallan/* 2 : PALM */ 9459dfe64dd3Smacallan/* 3 : PALN */ 9460dfe64dd3Smacallan/* 4 : NTSC1024x768 */ 9461dfe64dd3Smacallan/* 5 : PAL-M 1024x768 */ 9462dfe64dd3Smacallan/* 6-7: reserved */ 9463dfe64dd3Smacallan/* cl 0 : YFilter1 */ 9464dfe64dd3Smacallan/* 1 : YFilter2 */ 9465dfe64dd3Smacallan/* ch 0 : 301A */ 9466dfe64dd3Smacallan/* 1 : 301B/302B/301LV/302LV */ 9467dfe64dd3Smacallan/* Description : */ 9468dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9469dfe64dd3Smacallanvoid 9470dfe64dd3SmacallanXGI_GetTVPtrIndex2(USHORT * tempbx, UCHAR * tempcl, UCHAR * tempch, 9471dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 9472dfe64dd3Smacallan{ 9473dfe64dd3Smacallan *tempbx = 0; 9474dfe64dd3Smacallan *tempcl = 0; 9475dfe64dd3Smacallan *tempch = 0; 9476dfe64dd3Smacallan 9477dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALTV) 9478dfe64dd3Smacallan *tempbx = 1; 9479dfe64dd3Smacallan 9480dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALMTV) 9481dfe64dd3Smacallan *tempbx = 2; 9482dfe64dd3Smacallan 9483dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALNTV) 9484dfe64dd3Smacallan *tempbx = 3; 9485dfe64dd3Smacallan 9486dfe64dd3Smacallan if (pVBInfo->TVInfo & NTSC1024x768) { 9487dfe64dd3Smacallan *tempbx = 4; 9488dfe64dd3Smacallan if (pVBInfo->TVInfo & SetPALMTV) 9489dfe64dd3Smacallan *tempbx = 5; 9490dfe64dd3Smacallan } 9491dfe64dd3Smacallan 9492dfe64dd3Smacallan if (pVBInfo-> 9493dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 9494dfe64dd3Smacallan VB_XGI301C)) { 9495dfe64dd3Smacallan if ((!(pVBInfo->VBInfo & SetInSlaveMode)) 9496dfe64dd3Smacallan || (pVBInfo->TVInfo & TVSimuMode)) { 9497dfe64dd3Smacallan *tempbx += 8; 9498dfe64dd3Smacallan *tempcl += 1; 9499dfe64dd3Smacallan } 9500dfe64dd3Smacallan } 9501dfe64dd3Smacallan 9502dfe64dd3Smacallan if (pVBInfo-> 9503dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 9504dfe64dd3Smacallan VB_XGI301C)) 950591817726Sapb (*tempch)++; 9506dfe64dd3Smacallan} 9507dfe64dd3Smacallan 9508dfe64dd3Smacallan 9509dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9510dfe64dd3Smacallan/* Function : XGI_SetCRT2ModeRegs */ 9511dfe64dd3Smacallan/* Input : */ 9512dfe64dd3Smacallan/* Output : */ 9513dfe64dd3Smacallan/* Description : Origin code for crt2group */ 9514dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9515dfe64dd3Smacallanvoid 9516dfe64dd3SmacallanXGI_SetCRT2ModeRegs(USHORT ModeNo, PXGI_HW_DEVICE_INFO HwDeviceExtension, 9517dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 9518dfe64dd3Smacallan{ 9519dfe64dd3Smacallan#ifndef LINUX_XF86 9520dfe64dd3Smacallan USHORT i, j; 9521dfe64dd3Smacallan#endif 9522dfe64dd3Smacallan USHORT tempbl; 9523dfe64dd3Smacallan SHORT tempcl; 9524dfe64dd3Smacallan 9525dfe64dd3Smacallan UCHAR tempah; 9526dfe64dd3Smacallan 9527dfe64dd3Smacallan /* XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port , 0x03 , 0x00 ) ; // fix write part1 index 0 BTDRAM bit Bug */ 9528dfe64dd3Smacallan tempah = 0; 9529dfe64dd3Smacallan if (!(pVBInfo->VBInfo & DisableCRT2Display)) { 9530dfe64dd3Smacallan tempah = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x00); 9531dfe64dd3Smacallan tempah &= ~0x10; /* BTRAMDAC */ 9532dfe64dd3Smacallan tempah |= 0x40; /* BTRAM */ 9533dfe64dd3Smacallan 9534dfe64dd3Smacallan if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)) { 9535dfe64dd3Smacallan tempah = 0x40; /* BTDRAM */ 9536dfe64dd3Smacallan if (ModeNo > 0x13) { 9537dfe64dd3Smacallan tempcl = pVBInfo->ModeType; 9538dfe64dd3Smacallan tempcl -= ModeVGA; 9539dfe64dd3Smacallan if (tempcl >= 0) { 9540dfe64dd3Smacallan tempah = (0x008 >> tempcl); /* BT Color */ 9541dfe64dd3Smacallan if (tempah == 0) 9542dfe64dd3Smacallan tempah = 1; 9543dfe64dd3Smacallan tempah |= 0x040; 9544dfe64dd3Smacallan } 9545dfe64dd3Smacallan } 9546dfe64dd3Smacallan if (pVBInfo->VBInfo & SetInSlaveMode) 9547dfe64dd3Smacallan tempah ^= 0x50; /* BTDAC */ 9548dfe64dd3Smacallan } 9549dfe64dd3Smacallan } 9550dfe64dd3Smacallan 9551dfe64dd3Smacallan/* 0210 shampoo 9552dfe64dd3Smacallan if ( pVBInfo->VBInfo & DisableCRT2Display ) 9553dfe64dd3Smacallan { 9554dfe64dd3Smacallan tempah = 0 ; 9555dfe64dd3Smacallan } 9556dfe64dd3Smacallan 9557dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port , 0x00 , tempah ) ; 9558dfe64dd3Smacallan if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD ) ) 9559dfe64dd3Smacallan { 9560dfe64dd3Smacallan tempcl = pVBInfo->ModeType ; 9561dfe64dd3Smacallan if ( ModeNo > 0x13 ) 9562dfe64dd3Smacallan { 9563dfe64dd3Smacallan tempcl -= ModeVGA ; 9564dfe64dd3Smacallan if ( ( tempcl > 0 ) || ( tempcl == 0 ) ) 9565dfe64dd3Smacallan { 9566dfe64dd3Smacallan tempah=(0x008>>tempcl) ; 9567dfe64dd3Smacallan if ( tempah == 0 ) 9568dfe64dd3Smacallan tempah = 1 ; 9569dfe64dd3Smacallan tempah |= 0x040; 9570dfe64dd3Smacallan } 9571dfe64dd3Smacallan } 9572dfe64dd3Smacallan else 9573dfe64dd3Smacallan { 9574dfe64dd3Smacallan tempah = 0x040 ; 9575dfe64dd3Smacallan } 9576dfe64dd3Smacallan 9577dfe64dd3Smacallan if ( pVBInfo->VBInfo & SetInSlaveMode ) 9578dfe64dd3Smacallan { 9579dfe64dd3Smacallan tempah = ( tempah ^ 0x050 ) ; 9580dfe64dd3Smacallan } 9581dfe64dd3Smacallan } 9582dfe64dd3Smacallan*/ 9583dfe64dd3Smacallan 9584dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part1Port, 0x00, tempah); 9585dfe64dd3Smacallan tempah = 0x08; 9586dfe64dd3Smacallan tempbl = 0xf0; 9587dfe64dd3Smacallan 9588dfe64dd3Smacallan if (pVBInfo->VBInfo & DisableCRT2Display) 9589dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2e, tempbl, 9590dfe64dd3Smacallan tempah); 9591dfe64dd3Smacallan else { 9592dfe64dd3Smacallan tempah = 0x00; 9593dfe64dd3Smacallan tempbl = 0xff; 9594dfe64dd3Smacallan 9595dfe64dd3Smacallan if (pVBInfo-> 9596dfe64dd3Smacallan VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD | 9597dfe64dd3Smacallan SetCRT2ToLCDA)) { 9598dfe64dd3Smacallan if ((pVBInfo->VBInfo & SetCRT2ToLCDA) 9599dfe64dd3Smacallan && (!(pVBInfo->VBInfo & SetSimuScanMode))) { 9600dfe64dd3Smacallan tempbl &= 0xf7; 9601dfe64dd3Smacallan tempah |= 0x01; 9602dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2e, 9603dfe64dd3Smacallan tempbl, tempah); 9604dfe64dd3Smacallan } 9605dfe64dd3Smacallan else { 9606dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCDA) { 9607dfe64dd3Smacallan tempbl &= 0xf7; 9608dfe64dd3Smacallan tempah |= 0x01; 9609dfe64dd3Smacallan } 9610dfe64dd3Smacallan 9611dfe64dd3Smacallan if (pVBInfo-> 9612dfe64dd3Smacallan VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)) { 9613dfe64dd3Smacallan tempbl &= 0xf8; 9614dfe64dd3Smacallan tempah = 0x01; 9615dfe64dd3Smacallan 9616dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetInSlaveMode)) 9617dfe64dd3Smacallan tempah |= 0x02; 9618dfe64dd3Smacallan 9619dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) { 9620dfe64dd3Smacallan tempah = tempah ^ 0x05; 9621dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToLCD)) 9622dfe64dd3Smacallan tempah = tempah ^ 0x01; 9623dfe64dd3Smacallan } 9624dfe64dd3Smacallan 9625dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge)) 9626dfe64dd3Smacallan tempah |= 0x08; 9627dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2e, 9628dfe64dd3Smacallan tempbl, tempah); 9629dfe64dd3Smacallan } 9630dfe64dd3Smacallan else 9631dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2e, 9632dfe64dd3Smacallan tempbl, tempah); 9633dfe64dd3Smacallan } 9634dfe64dd3Smacallan } 9635dfe64dd3Smacallan else 9636dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2e, tempbl, 9637dfe64dd3Smacallan tempah); 9638dfe64dd3Smacallan } 9639dfe64dd3Smacallan 9640dfe64dd3Smacallan if (pVBInfo-> 9641dfe64dd3Smacallan VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD | 9642dfe64dd3Smacallan SetCRT2ToLCDA)) { 9643dfe64dd3Smacallan tempah &= (~0x08); 9644dfe64dd3Smacallan if ((pVBInfo->ModeType == ModeVGA) 9645dfe64dd3Smacallan && (!(pVBInfo->VBInfo & SetInSlaveMode))) { 9646dfe64dd3Smacallan tempah |= 0x010; 9647dfe64dd3Smacallan } 9648dfe64dd3Smacallan tempah |= 0x080; 9649dfe64dd3Smacallan 9650dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { 9651dfe64dd3Smacallan /* if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) ) */ 9652dfe64dd3Smacallan /* { */ 9653dfe64dd3Smacallan tempah |= 0x020; 9654dfe64dd3Smacallan if (ModeNo > 0x13) { 9655dfe64dd3Smacallan if (pVBInfo->VBInfo & DriverMode) 9656dfe64dd3Smacallan tempah = tempah ^ 0x20; 9657dfe64dd3Smacallan } 9658dfe64dd3Smacallan /* } */ 9659dfe64dd3Smacallan } 9660dfe64dd3Smacallan 9661dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x0D, ~0x0BF, 9662dfe64dd3Smacallan tempah); 9663dfe64dd3Smacallan tempah = 0; 9664dfe64dd3Smacallan 9665dfe64dd3Smacallan if (pVBInfo->LCDInfo & SetLCDDualLink) 9666dfe64dd3Smacallan tempah |= 0x40; 9667dfe64dd3Smacallan 9668dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) { 9669dfe64dd3Smacallan /* if ( ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) ) && ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) ) ) */ 9670dfe64dd3Smacallan /* { */ 9671dfe64dd3Smacallan if (pVBInfo->TVInfo & RPLLDIV2XO) 9672dfe64dd3Smacallan tempah |= 0x40; 9673dfe64dd3Smacallan /* } */ 9674dfe64dd3Smacallan } 9675dfe64dd3Smacallan 9676dfe64dd3Smacallan if ((pVBInfo->LCDResInfo == Panel1280x1024) 9677dfe64dd3Smacallan || (pVBInfo->LCDResInfo == Panel1280x1024x75)) 9678dfe64dd3Smacallan tempah |= 0x80; 9679dfe64dd3Smacallan 9680dfe64dd3Smacallan if (pVBInfo->LCDResInfo == Panel1280x960) 9681dfe64dd3Smacallan tempah |= 0x80; 9682dfe64dd3Smacallan 9683dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x0C, tempah); 9684dfe64dd3Smacallan } 9685dfe64dd3Smacallan 9686dfe64dd3Smacallan if (pVBInfo-> 9687dfe64dd3Smacallan VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | 9688dfe64dd3Smacallan VB_XGI301C)) { 9689dfe64dd3Smacallan tempah = 0; 9690dfe64dd3Smacallan tempbl = 0xfb; 9691dfe64dd3Smacallan 9692dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToDualEdge) { 9693dfe64dd3Smacallan tempbl = 0xff; 9694dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToLCDA) 9695dfe64dd3Smacallan tempah |= 0x04; /* shampoo 0129 */ 9696dfe64dd3Smacallan } 9697dfe64dd3Smacallan 9698dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x13, tempbl, 9699dfe64dd3Smacallan tempah); 9700dfe64dd3Smacallan tempah = 0x00; 9701dfe64dd3Smacallan tempbl = 0xcf; 9702dfe64dd3Smacallan if (!(pVBInfo->VBInfo & DisableCRT2Display)) { 9703dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToDualEdge) 9704dfe64dd3Smacallan tempah |= 0x30; 9705dfe64dd3Smacallan } 9706dfe64dd3Smacallan 9707dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2c, tempbl, 9708dfe64dd3Smacallan tempah); 9709dfe64dd3Smacallan tempah = 0; 9710dfe64dd3Smacallan tempbl = 0x3f; 9711dfe64dd3Smacallan 9712dfe64dd3Smacallan if (!(pVBInfo->VBInfo & DisableCRT2Display)) { 9713dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToDualEdge) 9714dfe64dd3Smacallan tempah |= 0xc0; 9715dfe64dd3Smacallan } 9716dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x21, tempbl, 9717dfe64dd3Smacallan tempah); 9718dfe64dd3Smacallan } 9719dfe64dd3Smacallan 9720dfe64dd3Smacallan tempah = 0; 9721dfe64dd3Smacallan tempbl = 0x7f; 9722dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) { 9723dfe64dd3Smacallan tempbl = 0xff; 9724dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge)) 9725dfe64dd3Smacallan tempah |= 0x80; 9726dfe64dd3Smacallan } 9727dfe64dd3Smacallan 9728dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x23, tempbl, tempah); 9729dfe64dd3Smacallan 9730dfe64dd3Smacallan if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) { 9731dfe64dd3Smacallan if (pVBInfo->LCDInfo & SetLCDDualLink) { 9732dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x27, 0x20); 9733dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->Part4Port, 0x34, 0x10); 9734dfe64dd3Smacallan } 9735dfe64dd3Smacallan } 9736dfe64dd3Smacallan} 9737dfe64dd3Smacallan 9738dfe64dd3Smacallan 9739dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9740dfe64dd3Smacallan/* Function : XGI_GetRAMDAC2DATA */ 9741dfe64dd3Smacallan/* Input : */ 9742dfe64dd3Smacallan/* Output : */ 9743dfe64dd3Smacallan/* Description : */ 9744dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9745dfe64dd3Smacallanvoid 9746dfe64dd3SmacallanXGI_GetRAMDAC2DATA(USHORT ModeNo, USHORT ModeIdIndex, 9747dfe64dd3Smacallan USHORT RefreshRateTableIndex, PVB_DEVICE_INFO pVBInfo) 9748dfe64dd3Smacallan{ 9749dfe64dd3Smacallan USHORT tempax, tempbx, temp1, temp2, modeflag = 0, tempcx, CRT1Index; 9750dfe64dd3Smacallan#ifndef LINUX_XF86 9751dfe64dd3Smacallan USHORT temp, ResInfo, DisplayType; 9752dfe64dd3Smacallan#endif 9753dfe64dd3Smacallan 9754dfe64dd3Smacallan pVBInfo->RVBHCMAX = 1; 9755dfe64dd3Smacallan pVBInfo->RVBHCFACT = 1; 9756dfe64dd3Smacallan 9757dfe64dd3Smacallan if (ModeNo <= 0x13) { 9758dfe64dd3Smacallan const USHORT StandTableIndex = XGI_GetModePtr(pVBInfo->SModeIDTable, 9759dfe64dd3Smacallan pVBInfo->ModeType, 9760dfe64dd3Smacallan ModeNo, ModeIdIndex); 9761dfe64dd3Smacallan 9762dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; 9763dfe64dd3Smacallan tempax = pVBInfo->StandTable[StandTableIndex].CRTC[0]; 9764dfe64dd3Smacallan tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[6]; 9765dfe64dd3Smacallan temp1 = pVBInfo->StandTable[StandTableIndex].CRTC[7]; 9766dfe64dd3Smacallan } 9767dfe64dd3Smacallan else { 9768dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 9769dfe64dd3Smacallan CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC; 9770dfe64dd3Smacallan CRT1Index &= IndexMask; 9771dfe64dd3Smacallan temp1 = (USHORT) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0]; 9772dfe64dd3Smacallan temp2 = (USHORT) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5]; 9773dfe64dd3Smacallan tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8); 9774dfe64dd3Smacallan tempbx = (USHORT) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8]; 9775dfe64dd3Smacallan tempcx = (USHORT) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8; 9776dfe64dd3Smacallan tempcx &= 0x0100; 9777dfe64dd3Smacallan tempcx = tempcx << 2; 9778dfe64dd3Smacallan tempbx |= tempcx; 9779dfe64dd3Smacallan temp1 = (USHORT) pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9]; 9780dfe64dd3Smacallan } 9781dfe64dd3Smacallan 9782dfe64dd3Smacallan if (temp1 & 0x01) 9783dfe64dd3Smacallan tempbx |= 0x0100; 9784dfe64dd3Smacallan 9785dfe64dd3Smacallan if (temp1 & 0x20) 9786dfe64dd3Smacallan tempbx |= 0x0200; 9787dfe64dd3Smacallan tempax += 5; 9788dfe64dd3Smacallan 9789dfe64dd3Smacallan if (modeflag & Charx8Dot) 9790dfe64dd3Smacallan tempax *= 8; 9791dfe64dd3Smacallan else 9792dfe64dd3Smacallan tempax *= 9; 9793dfe64dd3Smacallan 9794dfe64dd3Smacallan pVBInfo->VGAHT = tempax; 9795dfe64dd3Smacallan pVBInfo->HT = tempax; 9796dfe64dd3Smacallan tempbx++; 9797dfe64dd3Smacallan pVBInfo->VGAVT = tempbx; 9798dfe64dd3Smacallan pVBInfo->VT = tempbx; 9799dfe64dd3Smacallan} 9800dfe64dd3Smacallan 9801dfe64dd3Smacallan 9802dfe64dd3Smacallan 9803dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9804dfe64dd3Smacallan/* Function : XGI_GetColorDepth */ 9805dfe64dd3Smacallan/* Input : */ 9806dfe64dd3Smacallan/* Output : */ 9807dfe64dd3Smacallan/* Description : */ 9808dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9809dfe64dd3SmacallanUSHORT 9810dfe64dd3SmacallanXGI_GetColorDepth(USHORT ModeNo, USHORT ModeIdIndex, 9811dfe64dd3Smacallan const VB_DEVICE_INFO *pVBInfo) 9812dfe64dd3Smacallan{ 9813dfe64dd3Smacallan USHORT ColorDepth[6] = { 1, 2, 4, 4, 6, 8 }; 9814dfe64dd3Smacallan SHORT index; 9815dfe64dd3Smacallan USHORT modeflag; 9816dfe64dd3Smacallan 9817dfe64dd3Smacallan if (ModeNo <= 0x13) { 9818dfe64dd3Smacallan modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; 9819dfe64dd3Smacallan } 9820dfe64dd3Smacallan else { 9821dfe64dd3Smacallan modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 9822dfe64dd3Smacallan } 9823dfe64dd3Smacallan 9824dfe64dd3Smacallan index = (modeflag & ModeInfoFlag) - ModeEGA; 9825dfe64dd3Smacallan 9826dfe64dd3Smacallan if (index < 0) 9827dfe64dd3Smacallan index = 0; 9828dfe64dd3Smacallan 9829dfe64dd3Smacallan return (ColorDepth[index]); 9830dfe64dd3Smacallan} 9831dfe64dd3Smacallan 9832dfe64dd3Smacallan 9833dfe64dd3Smacallan 9834dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9835dfe64dd3Smacallan/* Function : XGI_UnLockCRT2 */ 9836dfe64dd3Smacallan/* Input : */ 9837dfe64dd3Smacallan/* Output : */ 9838dfe64dd3Smacallan/* Description : */ 9839dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9840dfe64dd3Smacallanvoid 9841dfe64dd3SmacallanXGI_UnLockCRT2(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) 9842dfe64dd3Smacallan{ 9843dfe64dd3Smacallan 9844dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2f, 0xFF, 0x01); 9845dfe64dd3Smacallan 9846dfe64dd3Smacallan} 9847dfe64dd3Smacallan 9848dfe64dd3Smacallan 9849dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9850dfe64dd3Smacallan/* Function : XGI_LockCRT2 */ 9851dfe64dd3Smacallan/* Input : */ 9852dfe64dd3Smacallan/* Output : */ 9853dfe64dd3Smacallan/* Description : */ 9854dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9855dfe64dd3Smacallanvoid 9856dfe64dd3SmacallanXGI_LockCRT2(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) 9857dfe64dd3Smacallan{ 9858dfe64dd3Smacallan XGI_SetRegANDOR((XGIIOADDRESS) pVBInfo->Part1Port, 0x2F, 0xFE, 0x00); 9859dfe64dd3Smacallan} 9860dfe64dd3Smacallan 9861dfe64dd3Smacallan 9862dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9863dfe64dd3Smacallan/* Function : XGINew_EnableCRT2 */ 9864dfe64dd3Smacallan/* Input : */ 9865dfe64dd3Smacallan/* Output : */ 9866dfe64dd3Smacallan/* Description : */ 9867dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9868dfe64dd3Smacallanvoid 9869dfe64dd3SmacallanXGINew_EnableCRT2(PVB_DEVICE_INFO pVBInfo) 9870dfe64dd3Smacallan{ 9871dfe64dd3Smacallan XGI_SetRegOR((XGIIOADDRESS) pVBInfo->P3c4, 0x1E, SR1E_ENABLE_CRT2); 9872dfe64dd3Smacallan} 9873dfe64dd3Smacallan 9874dfe64dd3Smacallan 9875dfe64dd3Smacallan 9876dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9877dfe64dd3Smacallan/* Function : */ 9878dfe64dd3Smacallan/* Input : */ 9879dfe64dd3Smacallan/* Output : */ 9880dfe64dd3Smacallan/* Description : */ 9881dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9882dfe64dd3Smacallanvoid 9883dfe64dd3SmacallanXGINew_LCD_Wait_Time(UCHAR DelayTime, PVB_DEVICE_INFO pVBInfo) 9884dfe64dd3Smacallan{ 9885dfe64dd3Smacallan USHORT i, j; 9886dfe64dd3Smacallan 9887dfe64dd3Smacallan ULONG temp, flag; 9888dfe64dd3Smacallan 9889dfe64dd3Smacallan flag = 0; 9890dfe64dd3Smacallan 9891dfe64dd3Smacallan PDEBUG(ErrorF("XGINew_LCD_Wait_Time()...begin\n")); 9892dfe64dd3Smacallan 9893dfe64dd3Smacallan for (i = 0; i < DelayTime; i++) { 9894dfe64dd3Smacallan for (j = 0; j < 66; j++) { 9895dfe64dd3Smacallan 9896dfe64dd3Smacallan PDEBUG(ErrorF("i=%d, j=%d\n", i, j)); 9897dfe64dd3Smacallan temp = XGI_GetRegLong((XGIIOADDRESS) 0x61); 9898dfe64dd3Smacallan temp &= 0x10; 9899dfe64dd3Smacallan 9900dfe64dd3Smacallan if (temp == flag) 9901dfe64dd3Smacallan continue; 9902dfe64dd3Smacallan 9903dfe64dd3Smacallan flag = temp; 9904dfe64dd3Smacallan } 9905dfe64dd3Smacallan } 9906dfe64dd3Smacallan 9907dfe64dd3Smacallan PDEBUG(ErrorF("XGINew_LCD_Wait_Time()...end\n")); 9908dfe64dd3Smacallan} 9909dfe64dd3Smacallan 9910dfe64dd3Smacallan 9911dfe64dd3Smacallan 9912dfe64dd3Smacallan 9913dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9914dfe64dd3Smacallan/* Function : XGI_BridgeIsOn */ 9915dfe64dd3Smacallan/* Input : */ 9916dfe64dd3Smacallan/* Output : */ 9917dfe64dd3Smacallan/* Description : */ 9918dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9919dfe64dd3SmacallanBOOLEAN 9920dfe64dd3SmacallanXGI_BridgeIsOn(PVB_DEVICE_INFO pVBInfo) 9921dfe64dd3Smacallan{ 9922dfe64dd3Smacallan USHORT flag; 9923dfe64dd3Smacallan 9924dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 9925dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 1 ) 9926dfe64dd3Smacallan { 9927dfe64dd3Smacallan return( 1 ) ; 9928dfe64dd3Smacallan } 9929dfe64dd3Smacallan else 9930dfe64dd3Smacallan { 9931dfe64dd3Smacallan flag = XGI_GetReg((XGIIOADDRESS) pVBInfo->Part4Port, 0x00); 9932dfe64dd3Smacallan if ((flag == 1) || (flag == 2)) 9933dfe64dd3Smacallan return (1); /* 301b */ 9934dfe64dd3Smacallan else 9935dfe64dd3Smacallan return (0); 9936dfe64dd3Smacallan } 9937dfe64dd3Smacallan} 9938dfe64dd3Smacallan 9939dfe64dd3Smacallan 9940dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9941dfe64dd3Smacallan/* Function : XGI_VBLongWait */ 9942dfe64dd3Smacallan/* Input : */ 9943dfe64dd3Smacallan/* Output : */ 9944dfe64dd3Smacallan/* Description : */ 9945dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9946dfe64dd3Smacallanvoid 9947dfe64dd3SmacallanXGI_VBLongWait(PVB_DEVICE_INFO pVBInfo) 9948dfe64dd3Smacallan{ 9949dfe64dd3Smacallan USHORT tempal, temp, i, j; 9950dfe64dd3Smacallan 9951dfe64dd3Smacallan if (!(pVBInfo->VBInfo & SetCRT2ToTV)) { 9952dfe64dd3Smacallan temp = 0; 9953dfe64dd3Smacallan for (i = 0; i < 3; i++) { 9954dfe64dd3Smacallan for (j = 0; j < 100; j++) { 9955dfe64dd3Smacallan tempal = XGI_GetRegByte((XGIIOADDRESS) pVBInfo->P3da); 9956dfe64dd3Smacallan if (temp & 0x01) { /* VBWaitMode2 */ 9957dfe64dd3Smacallan if ((tempal & 0x08)) { 9958dfe64dd3Smacallan continue; 9959dfe64dd3Smacallan } 9960dfe64dd3Smacallan 9961dfe64dd3Smacallan if (!(tempal & 0x08)) { 9962dfe64dd3Smacallan break; 9963dfe64dd3Smacallan } 9964dfe64dd3Smacallan } 9965dfe64dd3Smacallan else { /* VBWaitMode1 */ 9966dfe64dd3Smacallan if (!(tempal & 0x08)) { 9967dfe64dd3Smacallan continue; 9968dfe64dd3Smacallan } 9969dfe64dd3Smacallan 9970dfe64dd3Smacallan if ((tempal & 0x08)) { 9971dfe64dd3Smacallan break; 9972dfe64dd3Smacallan } 9973dfe64dd3Smacallan } 9974dfe64dd3Smacallan } 9975dfe64dd3Smacallan temp = temp ^ 0x01; 9976dfe64dd3Smacallan } 9977dfe64dd3Smacallan } 9978dfe64dd3Smacallan else { 9979dfe64dd3Smacallan XGI_WaitEndRetrace(pVBInfo->RelIO); 9980dfe64dd3Smacallan } 9981dfe64dd3Smacallan return; 9982dfe64dd3Smacallan} 9983dfe64dd3Smacallan 9984dfe64dd3Smacallan 9985dfe64dd3Smacallan 9986dfe64dd3Smacallan 9987dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9988dfe64dd3Smacallan/* Function : XGI_GetVGAHT2 */ 9989dfe64dd3Smacallan/* Input : */ 9990dfe64dd3Smacallan/* Output : */ 9991dfe64dd3Smacallan/* Description : */ 9992dfe64dd3Smacallan/* --------------------------------------------------------------------- */ 9993dfe64dd3SmacallanUSHORT 9994dfe64dd3SmacallanXGI_GetVGAHT2(PVB_DEVICE_INFO pVBInfo) 9995dfe64dd3Smacallan{ 9996dfe64dd3Smacallan ULONG tempax, tempbx; 9997dfe64dd3Smacallan 9998dfe64dd3Smacallan tempbx = 9999dfe64dd3Smacallan ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX) & 0xFFFF; 10000dfe64dd3Smacallan tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT; 10001dfe64dd3Smacallan tempax = (tempax * pVBInfo->HT) / tempbx; 10002dfe64dd3Smacallan 10003dfe64dd3Smacallan return ((USHORT) tempax); 10004dfe64dd3Smacallan} 10005dfe64dd3Smacallan 10006dfe64dd3Smacallan 10007dfe64dd3Smacallan/** 10008dfe64dd3Smacallan * Get magic index into clock table. 10009dfe64dd3Smacallan * 10010dfe64dd3Smacallan * \bugs 10011dfe64dd3Smacallan * I'm pretty sure the first if-statement is wrong. It will \b always 10012dfe64dd3Smacallan * evaluate to true. 10013dfe64dd3Smacallan */ 10014dfe64dd3Smacallanunsigned 10015dfe64dd3SmacallanXGI_GetVCLK2Ptr(USHORT ModeNo, USHORT ModeIdIndex, 10016dfe64dd3Smacallan USHORT RefreshRateTableIndex, 10017dfe64dd3Smacallan PVB_DEVICE_INFO pVBInfo) 10018dfe64dd3Smacallan{ 10019dfe64dd3Smacallan /* Jong 10/08/2007; merge code */ 10020dfe64dd3Smacallan USHORT tempbx ; 10021098ad5bdSmacallan const UCHAR *CHTVVCLKPtr = NULL ; 10022dfe64dd3Smacallan 10023dfe64dd3Smacallan unsigned VCLKIndex; 10024dfe64dd3Smacallan USHORT CRT2Index; 10025dfe64dd3Smacallan 10026dfe64dd3Smacallan /* Jong 10/08/2007; merge code */ 10027dfe64dd3Smacallan USHORT LCDXlat1VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ; 10028dfe64dd3Smacallan USHORT LCDXlat2VCLK[ 4 ] = { VCLK108_2 + 5 , VCLK108_2 + 5 , VCLK108_2 + 5 , VCLK108_2 + 5 } ; 10029dfe64dd3Smacallan USHORT LVDSXlat1VCLK[ 4 ] = { VCLK40 , VCLK40 , VCLK40 , VCLK40 } ; 10030dfe64dd3Smacallan USHORT LVDSXlat2VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ; 10031dfe64dd3Smacallan USHORT LVDSXlat3VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ; 10032dfe64dd3Smacallan 10033dfe64dd3Smacallan const unsigned modeflag = (ModeNo <= 0x13) 10034dfe64dd3Smacallan ? pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag 10035dfe64dd3Smacallan : pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; 10036dfe64dd3Smacallan 10037dfe64dd3Smacallan /* Jong 10/04/2007; merge code */ 10038dfe64dd3Smacallan if ( pVBInfo->IF_DEF_LVDS == 0 ) 10039dfe64dd3Smacallan { 10040dfe64dd3Smacallan CRT2Index = CRT2Index >> 6 ; /* for LCD */ 10041dfe64dd3Smacallan 10042dfe64dd3Smacallan if (((pVBInfo->VBInfo & SetCRT2ToLCD) | SetCRT2ToLCDA)) { /*301b */ 10043dfe64dd3Smacallan VCLKIndex = (pVBInfo->LCDResInfo != Panel1024x768) 10044dfe64dd3Smacallan ? (VCLK108_2 + 5) : (VCLK65 + 2); 10045dfe64dd3Smacallan } 10046dfe64dd3Smacallan else 10047dfe64dd3Smacallan { 10048dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToTV) /* for TV */ 10049dfe64dd3Smacallan { 10050dfe64dd3Smacallan if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) 10051dfe64dd3Smacallan { 10052dfe64dd3Smacallan VCLKIndex = (pVBInfo->SetFlag & RPLLDIV2XO) 10053dfe64dd3Smacallan ? HiTVVCLKDIV2 : HiTVVCLK; 10054dfe64dd3Smacallan 10055dfe64dd3Smacallan VCLKIndex += 25; 10056dfe64dd3Smacallan 10057dfe64dd3Smacallan if (pVBInfo->SetFlag & TVSimuMode) { 10058dfe64dd3Smacallan VCLKIndex = (modeflag & Charx8Dot) 10059dfe64dd3Smacallan ? HiTVSimuVCLK : HiTVTextVCLK; 10060dfe64dd3Smacallan 10061dfe64dd3Smacallan VCLKIndex += 25; 10062dfe64dd3Smacallan } 10063dfe64dd3Smacallan 10064dfe64dd3Smacallan if (pVBInfo->VBType & VB_XGI301LV) { 10065dfe64dd3Smacallan switch (pVBInfo->VBExtInfo) { 10066dfe64dd3Smacallan case VB_YPbPr1080i: 10067dfe64dd3Smacallan /* VCLKIndex already set to correct value? */ 10068dfe64dd3Smacallan break; 10069dfe64dd3Smacallan case VB_YPbPr750p: 10070dfe64dd3Smacallan VCLKIndex = YPbPr750pVCLK; 10071dfe64dd3Smacallan break; 10072dfe64dd3Smacallan case VB_YPbPr525p: 10073dfe64dd3Smacallan VCLKIndex = YPbPr525pVCLK; 10074dfe64dd3Smacallan break; 10075dfe64dd3Smacallan case VB_YPbPr525i: 10076dfe64dd3Smacallan VCLKIndex = (pVBInfo->SetFlag & RPLLDIV2XO) 10077dfe64dd3Smacallan ? YPbPr525iVCLK_2 : YPbPr525iVCLK; 10078dfe64dd3Smacallan break; 10079dfe64dd3Smacallan } 10080dfe64dd3Smacallan } 10081dfe64dd3Smacallan } 10082dfe64dd3Smacallan else { 10083dfe64dd3Smacallan VCLKIndex = (pVBInfo->SetFlag & RPLLDIV2XO) 10084dfe64dd3Smacallan ? TVVCLKDIV2 : TVVCLK; 10085dfe64dd3Smacallan 10086dfe64dd3Smacallan VCLKIndex += 25; 10087dfe64dd3Smacallan } 10088dfe64dd3Smacallan } 10089dfe64dd3Smacallan else /* for CRT2 */ 10090dfe64dd3Smacallan { 10091dfe64dd3Smacallan VCLKIndex = XGI_GetRegByte((XGIIOADDRESS) (pVBInfo->P3ca + 0x02)); 10092dfe64dd3Smacallan VCLKIndex = ((VCLKIndex >> 2) & 0x03); 10093dfe64dd3Smacallan if (ModeNo > 0x13) { 10094dfe64dd3Smacallan VCLKIndex = 10095dfe64dd3Smacallan (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK 10096dfe64dd3Smacallan & IndexMask); 10097dfe64dd3Smacallan } 10098dfe64dd3Smacallan } 10099dfe64dd3Smacallan } 10100dfe64dd3Smacallan } 10101dfe64dd3Smacallan else /* Jong 10/04/2007; merge code */ 10102dfe64dd3Smacallan { /* LVDS */ 10103dfe64dd3Smacallan if ( ModeNo <= 0x13 ) 10104dfe64dd3Smacallan VCLKIndex = CRT2Index ; 10105dfe64dd3Smacallan else 10106dfe64dd3Smacallan VCLKIndex = CRT2Index ; 10107dfe64dd3Smacallan 10108dfe64dd3Smacallan if ( pVBInfo->IF_DEF_CH7005 == 1 ) 10109dfe64dd3Smacallan { 10110dfe64dd3Smacallan if ( !( pVBInfo->VBInfo & SetCRT2ToLCD ) ) 10111dfe64dd3Smacallan { 10112dfe64dd3Smacallan VCLKIndex &= 0x1f ; 10113dfe64dd3Smacallan tempbx = 0 ; 10114dfe64dd3Smacallan 10115dfe64dd3Smacallan if ( pVBInfo->VBInfo & SetPALTV ) 10116dfe64dd3Smacallan tempbx += 2 ; 10117dfe64dd3Smacallan 10118dfe64dd3Smacallan if ( pVBInfo->VBInfo & SetCHTVOverScan ) 10119dfe64dd3Smacallan tempbx += 1 ; 10120dfe64dd3Smacallan 10121dfe64dd3Smacallan switch( tempbx ) 10122dfe64dd3Smacallan { 10123dfe64dd3Smacallan case 0: 10124dfe64dd3Smacallan CHTVVCLKPtr = pVBInfo->CHTVVCLKUNTSC ; 10125dfe64dd3Smacallan break ; 10126dfe64dd3Smacallan case 1: 10127dfe64dd3Smacallan CHTVVCLKPtr = pVBInfo->CHTVVCLKONTSC ; 10128dfe64dd3Smacallan break; 10129dfe64dd3Smacallan case 2: 10130dfe64dd3Smacallan CHTVVCLKPtr = pVBInfo->CHTVVCLKUPAL ; 10131dfe64dd3Smacallan break ; 10132dfe64dd3Smacallan case 3: 10133dfe64dd3Smacallan CHTVVCLKPtr = pVBInfo->CHTVVCLKOPAL ; 10134dfe64dd3Smacallan break ; 10135dfe64dd3Smacallan default: 10136dfe64dd3Smacallan break ; 10137dfe64dd3Smacallan } 10138dfe64dd3Smacallan 10139dfe64dd3Smacallan VCLKIndex = CHTVVCLKPtr[ VCLKIndex ] ; 10140dfe64dd3Smacallan } 10141dfe64dd3Smacallan } 10142dfe64dd3Smacallan else 10143dfe64dd3Smacallan { 10144dfe64dd3Smacallan VCLKIndex = VCLKIndex >> 6 ; 10145dfe64dd3Smacallan if ( ( pVBInfo->LCDResInfo == Panel800x600 ) || ( pVBInfo->LCDResInfo == Panel320x480 ) ) 10146dfe64dd3Smacallan VCLKIndex = LVDSXlat1VCLK[ VCLKIndex ] ; 10147dfe64dd3Smacallan else if ( ( pVBInfo->LCDResInfo == Panel1024x768 ) || ( pVBInfo->LCDResInfo == Panel1024x768x75 ) ) 10148dfe64dd3Smacallan VCLKIndex = LVDSXlat2VCLK[ VCLKIndex ] ; 10149dfe64dd3Smacallan else 10150dfe64dd3Smacallan VCLKIndex = LVDSXlat3VCLK[ VCLKIndex ] ; 10151dfe64dd3Smacallan } 10152dfe64dd3Smacallan } 10153dfe64dd3Smacallan 10154dfe64dd3Smacallan return VCLKIndex; 10155dfe64dd3Smacallan} 10156dfe64dd3Smacallan 10157dfe64dd3Smacallan/* Jong@08212009 */ 10158dfe64dd3Smacallanvoid XGIInitMiscVBInfo(PXGI_HW_DEVICE_INFO HwDeviceExtension, PVB_DEVICE_INFO pVBInfo) 10159dfe64dd3Smacallan{ 10160dfe64dd3Smacallan PDEBUG(ErrorF("XGIInitMiscVBInfo()...Begin\n")); 10161dfe64dd3Smacallan pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ; 10162dfe64dd3Smacallan pVBInfo->BaseAddr = ( ULONG )HwDeviceExtension->pjIOAddress ; 10163dfe64dd3Smacallan 10164dfe64dd3Smacallan pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14 ; 10165dfe64dd3Smacallan pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24 ; 10166dfe64dd3Smacallan pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10 ; 10167dfe64dd3Smacallan pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e ; 10168dfe64dd3Smacallan pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12 ; 10169dfe64dd3Smacallan pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C ; 10170dfe64dd3Smacallan pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a ; 10171dfe64dd3Smacallan pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16 ; 10172dfe64dd3Smacallan pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17 ; 10173dfe64dd3Smacallan pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18 ; 10174dfe64dd3Smacallan pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19 ; 10175dfe64dd3Smacallan pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A ; 10176dfe64dd3Smacallan 10177dfe64dd3Smacallan pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00 ; 10178dfe64dd3Smacallan pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04 ; 10179dfe64dd3Smacallan pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10 ; 10180dfe64dd3Smacallan pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12 ; 10181dfe64dd3Smacallan pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 ; 10182dfe64dd3Smacallan pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2 ; 10183dfe64dd3Smacallan 10184dfe64dd3Smacallan pVBInfo->IF_DEF_LVDS = 0 ; 10185dfe64dd3Smacallan pVBInfo->IF_DEF_CH7005 = 0 ; 10186dfe64dd3Smacallan pVBInfo->IF_DEF_LCDA = 1 ; 10187dfe64dd3Smacallan pVBInfo->IF_DEF_CH7017 = 0 ; 10188dfe64dd3Smacallan pVBInfo->IF_DEF_CH7007 = 0 ; /* [Billy] 2007/05/14 */ 10189dfe64dd3Smacallan pVBInfo->IF_DEF_VideoCapture = 0 ; 10190dfe64dd3Smacallan pVBInfo->IF_DEF_ScaleLCD = 0 ; 10191dfe64dd3Smacallan pVBInfo->IF_DEF_OEMUtil = 0 ; 10192dfe64dd3Smacallan pVBInfo->IF_DEF_PWD = 0 ; 10193dfe64dd3Smacallan 10194dfe64dd3Smacallan 10195dfe64dd3Smacallan if ( HwDeviceExtension->jChipType >= XG20 ) /* kuku 2004/06/25 */ 10196dfe64dd3Smacallan { 10197dfe64dd3Smacallan pVBInfo->IF_DEF_YPbPr = 0 ; 10198dfe64dd3Smacallan pVBInfo->IF_DEF_HiVision = 0 ; 10199dfe64dd3Smacallan pVBInfo->IF_DEF_CRT2Monitor = 0 ; 10200dfe64dd3Smacallan } 10201dfe64dd3Smacallan else if ( HwDeviceExtension->jChipType >= XG40 ) 10202dfe64dd3Smacallan { 10203dfe64dd3Smacallan pVBInfo->IF_DEF_YPbPr = 1 ; 10204dfe64dd3Smacallan pVBInfo->IF_DEF_HiVision = 1 ; 10205dfe64dd3Smacallan pVBInfo->IF_DEF_CRT2Monitor = 1 ; 10206dfe64dd3Smacallan } 10207dfe64dd3Smacallan else 10208dfe64dd3Smacallan { 10209dfe64dd3Smacallan pVBInfo->IF_DEF_YPbPr = 1 ; 10210dfe64dd3Smacallan pVBInfo->IF_DEF_HiVision = 1 ; 10211dfe64dd3Smacallan pVBInfo->IF_DEF_CRT2Monitor = 0 ; 10212dfe64dd3Smacallan } 10213dfe64dd3Smacallan 10214dfe64dd3Smacallan if ( HwDeviceExtension->jChipType == XG21 ) /* for x86 Linux, XG21 LVDS */ 10215dfe64dd3Smacallan { 10216dfe64dd3Smacallan if ( ( XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x38 ) & 0xE0 ) == 0xC0 ) 10217dfe64dd3Smacallan { 10218dfe64dd3Smacallan pVBInfo->IF_DEF_LVDS = 1 ; 10219dfe64dd3Smacallan } 10220dfe64dd3Smacallan 10221dfe64dd3Smacallan if ( (XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4, 0x38) >> 5 & 0x07) == 0x03 ) /*CH7007 CR38 D[7-5]=011b*/ 10222dfe64dd3Smacallan { 10223dfe64dd3Smacallan pVBInfo->IF_DEF_CH7007 = 1 ; 10224dfe64dd3Smacallan /* HwDeviceExtension->bCH7007 = 1; */ 10225dfe64dd3Smacallan XGI_SetReg((XGIIOADDRESS) pVBInfo->P3c4, 0x30, 0x09); /* For if (pHWDE->bVGAEnabled)== 0 */ 10226dfe64dd3Smacallan/* if( HwDeviceExtension->pDevice == NULL ) */ 10227dfe64dd3Smacallan 10228dfe64dd3Smacallan HwDeviceExtension->pDevice= HwDeviceExtension; 10229dfe64dd3Smacallan 10230dfe64dd3Smacallan } 10231dfe64dd3Smacallan } 10232dfe64dd3Smacallan 10233dfe64dd3Smacallan if ( HwDeviceExtension->jChipType == XG27 ) 10234dfe64dd3Smacallan { 10235dfe64dd3Smacallan if ( ( XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x38 ) & 0xE0 ) == 0xC0 ) 10236dfe64dd3Smacallan { 10237dfe64dd3Smacallan if ( XGI_GetReg((XGIIOADDRESS) pVBInfo->P3d4 , 0x30 ) & 0x20 ) 10238dfe64dd3Smacallan { 10239dfe64dd3Smacallan pVBInfo->IF_DEF_LVDS = 1 ; 10240dfe64dd3Smacallan } 10241dfe64dd3Smacallan } 10242dfe64dd3Smacallan } 10243dfe64dd3Smacallan 10244dfe64dd3Smacallan PDEBUG(ErrorF("XGIInitMiscVBInfo()...End\n")); 1024591817726Sapb} 10246