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