Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux...
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / xgifb / vb_setmode.c
1
2 #include <asm/io.h>
3 #include <linux/types.h>
4 #include <linux/version.h>
5 #include "XGIfb.h"
6
7
8 #include "vb_def.h"
9 #include "vgatypes.h"
10 #include "vb_struct.h"
11 #include "vb_util.h"
12 #include "vb_table.h"
13
14
15
16 #define IndexMask 0xff
17 #ifndef XGI_MASK_DUAL_CHIP
18 #define XGI_MASK_DUAL_CHIP 0x04 /* SR3A */
19 #endif
20
21
22
23 unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo);
24 unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
25 struct xgi_hw_device_info *HwDeviceExtension,
26 struct vb_device_info *pVBInfo);
27 unsigned char XGI_BacklightByDrv(struct vb_device_info *pVBInfo);
28
29 unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo);
30 unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo);
31 unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo);
32 unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
33 unsigned short ModeIdIndex,
34 unsigned short RefreshRateTableIndex,
35 unsigned short *i, struct vb_device_info *pVBInfo);
36 unsigned char XGI_SearchModeID(unsigned short ModeNo,
37 unsigned short *ModeIdIndex,
38 struct vb_device_info *pVBInfo);
39 unsigned char XGI_GetLCDInfo(unsigned short ModeNo,
40 unsigned short ModeIdIndex,
41 struct vb_device_info *pVBInfo);
42 unsigned char XGISetModeNew(struct xgi_hw_device_info *HwDeviceExtension,
43 unsigned short ModeNo);
44 unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo);
45 unsigned char XGI_GetModePtr(unsigned short ModeNo,
46 unsigned short ModeIdIndex,
47 struct vb_device_info *pVBInfo);
48 unsigned short XGI_GetOffset(unsigned short ModeNo,
49 unsigned short ModeIdIndex,
50 unsigned short RefreshRateTableIndex,
51 struct xgi_hw_device_info *HwDeviceExtension,
52 struct vb_device_info *pVBInfo);
53 unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
54 unsigned short ModeNo,
55 unsigned short ModeIdIndex,
56 struct vb_device_info *pVBInfo);
57 unsigned short XGI_GetResInfo(unsigned short ModeNo,
58 unsigned short ModeIdIndex,
59 struct vb_device_info *pVBInfo);
60 unsigned short XGI_GetColorDepth(unsigned short ModeNo,
61 unsigned short ModeIdIndex,
62 struct vb_device_info *pVBInfo);
63 unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo);
64 unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
65 unsigned short ModeIdIndex,
66 unsigned short RefreshRateTableIndex,
67 struct xgi_hw_device_info *HwDeviceExtension,
68 struct vb_device_info *pVBInfo);
69 void XGI_VBLongWait(struct vb_device_info *pVBInfo);
70 void XGI_SaveCRT2Info(unsigned short ModeNo, struct vb_device_info *pVBInfo);
71 void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
72 void XGI_GetCRT2ResInfo(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
73 void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
74 void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
75 void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
76 void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
77 void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
78 void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
79 void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
80 void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
81 void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
82 void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
83 void XGI_FirePWDEnable(struct vb_device_info *pVBInfo);
84 void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
85 void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
86 void XGI_SetPanelDelay(unsigned short tempbl, struct vb_device_info *pVBInfo);
87 void XGI_SetPanelPower(unsigned short tempah, unsigned short tempbl, struct vb_device_info *pVBInfo);
88 void XGI_EnablePWD(struct vb_device_info *pVBInfo);
89 void XGI_DisablePWD(struct vb_device_info *pVBInfo);
90 void XGI_AutoThreshold(struct vb_device_info *pVBInfo);
91 void XGI_SetTap4Regs(struct vb_device_info *pVBInfo);
92
93 void XGI_DisplayOn(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
94 void XGI_DisplayOff(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
95 void XGI_SetCRT1Group(struct xgi_hw_device_info *HwDeviceExtension, unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
96 void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
97 void XGI_SetXG21LCD(struct vb_device_info *pVBInfo, unsigned short RefreshRateTableIndex, unsigned short ModeNo);
98 void XGI_SetXG27CRTC(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
99 void XGI_SetXG27LCD(struct vb_device_info *pVBInfo, unsigned short RefreshRateTableIndex, unsigned short ModeNo);
100 void XGI_UpdateXG21CRTC(unsigned short ModeNo, struct vb_device_info *pVBInfo, unsigned short RefreshRateTableIndex);
101 void XGI_WaitDisply(struct vb_device_info *pVBInfo);
102 void XGI_SenseCRT1(struct vb_device_info *pVBInfo);
103 void XGI_SetSeqRegs(unsigned short ModeNo, unsigned short StandTableIndex, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
104 void XGI_SetMiscRegs(unsigned short StandTableIndex, struct vb_device_info *pVBInfo);
105 void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension, unsigned short StandTableIndex, struct vb_device_info *pVBInfo);
106 void XGI_SetATTRegs(unsigned short ModeNo, unsigned short StandTableIndex, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
107 void XGI_SetGRCRegs(unsigned short StandTableIndex, struct vb_device_info *pVBInfo);
108 void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo);
109
110 void XGI_SetSync(unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
111 void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo, struct xgi_hw_device_info *HwDeviceExtension);
112 void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo, struct xgi_hw_device_info *HwDeviceExtension);
113 void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex, unsigned short ModeNo, struct vb_device_info *pVBInfo);
114 void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension, unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
115 void XGI_SetCRT1VCLK(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
116 void XGI_SetCRT1FIFO(unsigned short ModeNo, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
117 void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension, unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
118 void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension, unsigned short ModeNo, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
119
120 void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
121 void XGI_WriteDAC(unsigned short dl, unsigned short ah, unsigned short al, unsigned short dh, struct vb_device_info *pVBInfo);
122 /*void XGI_ClearBuffer(struct xgi_hw_device_info *HwDeviceExtension, unsigned short ModeNo, struct vb_device_info *pVBInfo);*/
123 void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
124 void XGI_GetLVDSResInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
125 struct vb_device_info *pVBInfo);
126 void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
127 void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
128 unsigned short RefreshRateTableIndex,
129 struct xgi_hw_device_info *HwDeviceExtension,
130 struct vb_device_info *pVBInfo);
131 void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
132 void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
133 void XGI_GetVGAType(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
134 void XGI_GetVBType(struct vb_device_info *pVBInfo);
135 void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
136 void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
137 void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
138 void InitTo330Pointer(unsigned char, struct vb_device_info *pVBInfo);
139 void XGI_GetLCDSync(unsigned short *HSyncWidth, unsigned short *VSyncWidth, struct vb_device_info *pVBInfo);
140 void XGI_DisableBridge(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
141 void XGI_EnableBridge(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
142 void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
143 void XGI_OEM310Setting(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
144 void XGI_SetDelayComp(struct vb_device_info *pVBInfo);
145 void XGI_SetLCDCap(struct vb_device_info *pVBInfo);
146 void XGI_SetLCDCap_A(unsigned short tempcx, struct vb_device_info *pVBInfo);
147 void XGI_SetLCDCap_B(unsigned short tempcx, struct vb_device_info *pVBInfo);
148 void SetSpectrum(struct vb_device_info *pVBInfo);
149 void XGI_SetAntiFlicker(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
150 void XGI_SetEdgeEnhance(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
151 void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo);
152 void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
153 void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char* tempcl,
154 unsigned char *tempch, struct vb_device_info *pVBInfo);
155 unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo);
156 void XGI_SetCRT2ModeRegs(unsigned short ModeNo, struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
157 void XGI_CloseCRTC(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
158 void XGI_OpenCRTC(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
159 void XGI_GetRAMDAC2DATA(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo);
160 void XGI_UnLockCRT2(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
161 void XGI_LockCRT2(struct xgi_hw_device_info *, struct vb_device_info *pVBInfo);
162 void XGINew_EnableCRT2(struct vb_device_info *pVBInfo);
163 void XGINew_LCD_Wait_Time(unsigned char DelayTime, struct vb_device_info *pVBInfo);
164 void XGI_LongWait(struct vb_device_info *pVBInfo);
165 void XGI_SetCRT1Offset(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo);
166 void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
167 struct vb_device_info *pVBInfo);
168 unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
169 unsigned short ModeNo,
170 unsigned short ModeIdIndex,
171 struct vb_device_info *pVBInfo);
172 void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
173 unsigned char *di_1, struct vb_device_info *pVBInfo);
174 unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo);
175 unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo);
176 struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx, struct vb_device_info *pVBInfo);
177 void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo);
178 void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo);
179 unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo);
180 unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo);
181 void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl, struct vb_device_info *pVBInfo);
182 void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl, struct vb_device_info *pVBInfo);
183 void XGI_XG21SetPanelDelay(unsigned short tempbl, struct vb_device_info *pVBInfo);
184 unsigned char XGI_XG21CheckLVDSMode(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
185 void XGI_SetXG21LVDSPara(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
186 void XGI_SetXG27LVDSPara(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo);
187 unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo);
188
189 extern void ReadVBIOSTablData(unsigned char ChipType, struct vb_device_info *pVBInfo);
190
191 /* unsigned short XGINew_flag_clearbuffer; 0: no clear frame buffer 1:clear frame buffer */
192
193
194 unsigned short XGINew_MDA_DAC[] = {
195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
197 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
198 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
200 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
201 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
202 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F};
203
204 unsigned short XGINew_CGA_DAC[] = {
205 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
206 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
207 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
208 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
209 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
210 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
211 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
212 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
213
214 unsigned short XGINew_EGA_DAC[] = {
215 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x05, 0x15,
216 0x20, 0x30, 0x24, 0x34, 0x21, 0x31, 0x25, 0x35,
217 0x08, 0x18, 0x0C, 0x1C, 0x09, 0x19, 0x0D, 0x1D,
218 0x28, 0x38, 0x2C, 0x3C, 0x29, 0x39, 0x2D, 0x3D,
219 0x02, 0x12, 0x06, 0x16, 0x03, 0x13, 0x07, 0x17,
220 0x22, 0x32, 0x26, 0x36, 0x23, 0x33, 0x27, 0x37,
221 0x0A, 0x1A, 0x0E, 0x1E, 0x0B, 0x1B, 0x0F, 0x1F,
222 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
223
224 unsigned short XGINew_VGA_DAC[] = {
225 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
226 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
227 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
228 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
229 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
230 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
231 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
232 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
233 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
234 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
235
236
237 /* --------------------------------------------------------------------- */
238 /* Function : InitTo330Pointer */
239 /* Input : */
240 /* Output : */
241 /* Description : */
242 /* --------------------------------------------------------------------- */
243 void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
244 {
245 pVBInfo->SModeIDTable = (struct XGI_StStruct *) XGI330_SModeIDTable ;
246 pVBInfo->StandTable = (struct XGI_StandTableStruct *) XGI330_StandTable ;
247 pVBInfo->EModeIDTable = (struct XGI_ExtStruct *) XGI330_EModeIDTable ;
248 pVBInfo->RefIndex = (struct XGI_Ext2Struct *) XGI330_RefIndex ;
249 pVBInfo->XGINEWUB_CRT1Table = (struct XGI_CRT1TableStruct *) XGI_CRT1Table ;
250
251 /* add for new UNIVGABIOS */
252 /* XGINew_UBLCDDataTable = (struct XGI_LCDDataTablStruct *) XGI_LCDDataTable ; */
253 /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable ; */
254
255
256 if ( ChipType >= XG40 )
257 {
258 pVBInfo->MCLKData = (struct XGI_MCLKDataStruct *) XGI340New_MCLKData;
259 pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI340_ECLKData;
260 }
261 else
262 {
263 pVBInfo->MCLKData = (struct XGI_MCLKDataStruct *) XGI330New_MCLKData;
264 pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI330_ECLKData;
265 }
266
267 pVBInfo->VCLKData = (struct XGI_VCLKDataStruct *) XGI_VCLKData ;
268 pVBInfo->VBVCLKData = (struct XGI_VBVCLKDataStruct *) XGI_VBVCLKData ;
269 pVBInfo->ScreenOffset = XGI330_ScreenOffset ;
270 pVBInfo->StResInfo = (struct XGI_StResInfoStruct *) XGI330_StResInfo ;
271 pVBInfo->ModeResInfo = (struct XGI_ModeResInfoStruct *) XGI330_ModeResInfo ;
272
273 pVBInfo->pOutputSelect = &XGI330_OutputSelect ;
274 pVBInfo->pSoftSetting = &XGI330_SoftSetting ;
275 pVBInfo->pSR07 = &XGI330_SR07 ;
276 pVBInfo->LCDResInfo = 0 ;
277 pVBInfo->LCDTypeInfo = 0 ;
278 pVBInfo->LCDInfo = 0 ;
279 pVBInfo->VBInfo = 0 ;
280 pVBInfo->TVInfo = 0;
281
282
283 pVBInfo->SR15 = XGI340_SR13 ;
284 pVBInfo->CR40 = XGI340_cr41 ;
285 pVBInfo->SR25 = XGI330_sr25 ;
286 pVBInfo->pSR31 = &XGI330_sr31 ;
287 pVBInfo->pSR32 = &XGI330_sr32 ;
288 pVBInfo->CR6B = XGI340_CR6B ;
289 pVBInfo->CR6E = XGI340_CR6E ;
290 pVBInfo->CR6F = XGI340_CR6F ;
291 pVBInfo->CR89 = XGI340_CR89 ;
292 pVBInfo->AGPReg = XGI340_AGPReg ;
293 pVBInfo->SR16 = XGI340_SR16 ;
294 pVBInfo->pCRCF = &XG40_CRCF ;
295 pVBInfo->pXGINew_DRAMTypeDefinition = &XG40_DRAMTypeDefinition ;
296
297
298 pVBInfo->CR49 = XGI330_CR49 ;
299 pVBInfo->pSR1F = &XGI330_SR1F ;
300 pVBInfo->pSR21 = &XGI330_SR21 ;
301 pVBInfo->pSR22 = &XGI330_SR22 ;
302 pVBInfo->pSR23 = &XGI330_SR23 ;
303 pVBInfo->pSR24 = &XGI330_SR24 ;
304 pVBInfo->pSR33 = &XGI330_SR33 ;
305
306
307
308 pVBInfo->pCRT2Data_1_2 = &XGI330_CRT2Data_1_2 ;
309 pVBInfo->pCRT2Data_4_D = &XGI330_CRT2Data_4_D ;
310 pVBInfo->pCRT2Data_4_E = &XGI330_CRT2Data_4_E ;
311 pVBInfo->pCRT2Data_4_10 = &XGI330_CRT2Data_4_10 ;
312 pVBInfo->pRGBSenseData = &XGI330_RGBSenseData ;
313 pVBInfo->pVideoSenseData = &XGI330_VideoSenseData ;
314 pVBInfo->pYCSenseData = &XGI330_YCSenseData ;
315 pVBInfo->pRGBSenseData2 = &XGI330_RGBSenseData2 ;
316 pVBInfo->pVideoSenseData2 = &XGI330_VideoSenseData2 ;
317 pVBInfo->pYCSenseData2 = &XGI330_YCSenseData2 ;
318
319 pVBInfo->NTSCTiming = XGI330_NTSCTiming ;
320 pVBInfo->PALTiming = XGI330_PALTiming ;
321 pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming ;
322 pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing ;
323 pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing ;
324 pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming ;
325 pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming ;
326 pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming ;
327 pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming ;
328 pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data ;
329 pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu ;
330 pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text ;
331 pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3 ;
332 pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3 ;
333
334
335 pVBInfo->TimingH = (struct XGI_TimingHStruct *) XGI_TimingH ;
336 pVBInfo->TimingV = (struct XGI_TimingVStruct *) XGI_TimingV ;
337 pVBInfo->UpdateCRT1 = (struct XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table ;
338
339 pVBInfo->CHTVVCLKUNTSC = XGI330_CHTVVCLKUNTSC ;
340 pVBInfo->CHTVVCLKONTSC = XGI330_CHTVVCLKONTSC ;
341 pVBInfo->CHTVVCLKUPAL = XGI330_CHTVVCLKUPAL ;
342 pVBInfo->CHTVVCLKOPAL = XGI330_CHTVVCLKOPAL ;
343
344 /* 310 customization related */
345 if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
346 pVBInfo->LCDCapList = XGI_LCDDLCapList ;
347 else
348 pVBInfo->LCDCapList = XGI_LCDCapList ;
349
350 if ( ( ChipType == XG21 ) || ( ChipType == XG27 ) )
351 pVBInfo->XG21_LVDSCapList = XGI21_LCDCapList ;
352
353 pVBInfo->XGI_TVDelayList = XGI301TVDelayList ;
354 pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2 ;
355
356
357 pVBInfo->pXGINew_I2CDefinition = &XG40_I2CDefinition ;
358
359 if ( ChipType >= XG20 )
360 pVBInfo->pXGINew_CR97 = &XG20_CR97 ;
361
362 if ( ChipType == XG27 )
363 {
364 pVBInfo->MCLKData = (struct XGI_MCLKDataStruct *) XGI27New_MCLKData;
365 pVBInfo->CR40 = XGI27_cr41 ;
366 pVBInfo->pXGINew_CR97 = &XG27_CR97 ;
367 pVBInfo->pSR36 = &XG27_SR36 ;
368 pVBInfo->pCR8F = &XG27_CR8F ;
369 pVBInfo->pCRD0 = XG27_CRD0 ;
370 pVBInfo->pCRDE = XG27_CRDE ;
371 pVBInfo->pSR40 = &XG27_SR40 ;
372 pVBInfo->pSR41 = &XG27_SR41 ;
373
374 }
375
376 if ( ChipType >= XG20 )
377 {
378 pVBInfo->pDVOSetting = &XG21_DVOSetting ;
379 pVBInfo->pCR2E = &XG21_CR2E ;
380 pVBInfo->pCR2F = &XG21_CR2F ;
381 pVBInfo->pCR46 = &XG21_CR46 ;
382 pVBInfo->pCR47 = &XG21_CR47 ;
383 }
384
385 }
386
387
388
389
390
391
392 /* --------------------------------------------------------------------- */
393 /* Function : XGISetModeNew */
394 /* Input : */
395 /* Output : */
396 /* Description : */
397 /* --------------------------------------------------------------------- */
398 unsigned char XGISetModeNew(struct xgi_hw_device_info *HwDeviceExtension,
399 unsigned short ModeNo)
400 {
401 unsigned short ModeIdIndex ;
402 /* unsigned char *pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ; */
403 struct vb_device_info VBINF;
404 struct vb_device_info *pVBInfo = &VBINF;
405 pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ;
406 pVBInfo->BaseAddr = (unsigned long)HwDeviceExtension->pjIOAddress ;
407 pVBInfo->IF_DEF_LVDS = 0 ;
408 pVBInfo->IF_DEF_CH7005 = 0 ;
409 pVBInfo->IF_DEF_LCDA = 1 ;
410 pVBInfo->IF_DEF_CH7017 = 0 ;
411 pVBInfo->IF_DEF_CH7007 = 0 ; /* [Billy] 2007/05/14 */
412 pVBInfo->IF_DEF_VideoCapture = 0 ;
413 pVBInfo->IF_DEF_ScaleLCD = 0 ;
414 pVBInfo->IF_DEF_OEMUtil = 0 ;
415 pVBInfo->IF_DEF_PWD = 0 ;
416
417
418 if ( HwDeviceExtension->jChipType >= XG20 ) /* kuku 2004/06/25 */
419 {
420 pVBInfo->IF_DEF_YPbPr = 0 ;
421 pVBInfo->IF_DEF_HiVision = 0 ;
422 pVBInfo->IF_DEF_CRT2Monitor = 0 ;
423 pVBInfo->VBType = 0 ; /*set VBType default 0*/
424 }
425 else if ( HwDeviceExtension->jChipType >= XG40 )
426 {
427 pVBInfo->IF_DEF_YPbPr = 1 ;
428 pVBInfo->IF_DEF_HiVision = 1 ;
429 pVBInfo->IF_DEF_CRT2Monitor = 1 ;
430 }
431 else
432 {
433 pVBInfo->IF_DEF_YPbPr = 1 ;
434 pVBInfo->IF_DEF_HiVision = 1 ;
435 pVBInfo->IF_DEF_CRT2Monitor = 0 ;
436 }
437
438 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14 ;
439 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24 ;
440 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10 ;
441 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e ;
442 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12 ;
443 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C ;
444 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a ;
445 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16 ;
446 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17 ;
447 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18 ;
448 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19 ;
449 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A ;
450 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00 ;
451 pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04 ;
452 pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10 ;
453 pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12 ;
454 pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 ;
455 pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2 ;
456
457 if ( HwDeviceExtension->jChipType == XG21 ) /* for x86 Linux, XG21 LVDS */
458 {
459 if ( ( XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) & 0xE0 ) == 0xC0 )
460 {
461 pVBInfo->IF_DEF_LVDS = 1 ;
462 }
463 }
464 if ( HwDeviceExtension->jChipType == XG27 )
465 {
466 if ( ( XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) & 0xE0 ) == 0xC0 )
467 {
468 if ( XGINew_GetReg1( pVBInfo->P3d4 , 0x30 ) & 0x20 )
469 {
470 pVBInfo->IF_DEF_LVDS = 1 ;
471 }
472 }
473 }
474
475 if ( HwDeviceExtension->jChipType < XG20 ) /* kuku 2004/06/25 */
476 XGI_GetVBType( pVBInfo ) ;
477
478 InitTo330Pointer( HwDeviceExtension->jChipType, pVBInfo ) ;
479 if ( ModeNo & 0x80 )
480 {
481 ModeNo = ModeNo & 0x7F ;
482 /* XGINew_flag_clearbuffer = 0 ; */
483 }
484 /* else
485 {
486 XGINew_flag_clearbuffer = 1 ;
487 }
488 */
489 XGINew_SetReg1( pVBInfo->P3c4 , 0x05 , 0x86 ) ;
490
491 if ( HwDeviceExtension->jChipType < XG20 ) /* kuku 2004/06/25 1.Openkey */
492 XGI_UnLockCRT2( HwDeviceExtension , pVBInfo ) ;
493
494 XGI_SearchModeID( ModeNo , &ModeIdIndex, pVBInfo ) ;
495
496 XGI_GetVGAType(HwDeviceExtension, pVBInfo) ;
497
498 if ( HwDeviceExtension->jChipType < XG20 ) /* kuku 2004/06/25 */
499 {
500 XGI_GetVBInfo(ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ;
501 XGI_GetTVInfo(ModeNo , ModeIdIndex, pVBInfo ) ;
502 XGI_GetLCDInfo(ModeNo , ModeIdIndex, pVBInfo ) ;
503 XGI_DisableBridge( HwDeviceExtension,pVBInfo ) ;
504 /* XGI_OpenCRTC( HwDeviceExtension, pVBInfo ) ; */
505
506 if ( pVBInfo->VBInfo & ( SetSimuScanMode | SetCRT2ToLCDA ) )
507 {
508 XGI_SetCRT1Group(HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;
509
510 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
511 {
512 XGI_SetLCDAGroup(ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ;
513 }
514 }
515 else
516 {
517 if ( !( pVBInfo->VBInfo & SwitchToCRT2) )
518 {
519 XGI_SetCRT1Group( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;
520 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
521 {
522 XGI_SetLCDAGroup( ModeNo , ModeIdIndex , HwDeviceExtension, pVBInfo ) ;
523 }
524 }
525 }
526
527 if ( pVBInfo->VBInfo & ( SetSimuScanMode | SwitchToCRT2 ) )
528 {
529 switch( HwDeviceExtension->ujVBChipID )
530 {
531 case VB_CHIP_301:
532 XGI_SetCRT2Group301( ModeNo , HwDeviceExtension, pVBInfo ) ; /*add for CRT2 */
533 break ;
534
535 case VB_CHIP_302:
536 XGI_SetCRT2Group301(ModeNo , HwDeviceExtension, pVBInfo ) ; /*add for CRT2 */
537 break ;
538
539 default:
540 break ;
541 }
542 }
543
544 XGI_SetCRT2ModeRegs( ModeNo, HwDeviceExtension,pVBInfo ) ;
545 XGI_OEM310Setting( ModeNo, ModeIdIndex,pVBInfo ) ; /*0212*/
546 XGI_CloseCRTC( HwDeviceExtension, pVBInfo ) ;
547 XGI_EnableBridge( HwDeviceExtension ,pVBInfo) ;
548 } /* !XG20 */
549 else
550 {
551 if (pVBInfo->IF_DEF_LVDS == 1)
552 if (!XGI_XG21CheckLVDSMode(ModeNo , ModeIdIndex, pVBInfo))
553 return 0;
554
555 if ( ModeNo <= 0x13 )
556 {
557 pVBInfo->ModeType = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag & ModeInfoFlag;
558 }
559 else
560 {
561 pVBInfo->ModeType = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag & ModeInfoFlag;
562 }
563
564 pVBInfo->SetFlag = 0 ;
565 if ( pVBInfo->IF_DEF_CH7007 != 1 )
566 {
567 pVBInfo->VBInfo = DisableCRT2Display ;
568 }
569
570
571 XGI_DisplayOff(HwDeviceExtension, pVBInfo) ;
572
573 XGI_SetCRT1Group(HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;
574
575 XGI_DisplayOn( HwDeviceExtension, pVBInfo ) ;
576 /*
577 if( HwDeviceExtension->jChipType == XG21 )
578 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x09 , ~0x80 , 0x80 ) ;
579 */
580 }
581
582
583 /*
584 if ( ModeNo <= 0x13 )
585 {
586 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
587 }
588 else
589 {
590 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
591 }
592 pVBInfo->ModeType = modeflag&ModeInfoFlag ;
593 pVBInfo->SetFlag = 0x00 ;
594 pVBInfo->VBInfo = DisableCRT2Display ;
595 temp = XGINew_CheckMemorySize( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;
596
597 if ( temp == 0 )
598 return( 0 ) ;
599
600 XGI_DisplayOff( HwDeviceExtension, pVBInfo) ;
601 XGI_SetCRT1Group( HwDeviceExtension , ModeNo , ModeIdIndex, pVBInfo ) ;
602 XGI_DisplayOn( HwDeviceExtension, pVBInfo) ;
603 */
604
605 XGI_UpdateModeInfo( HwDeviceExtension, pVBInfo ) ;
606
607 if ( HwDeviceExtension->jChipType < XG20 ) /* kuku 2004/06/25 */
608 {
609 XGI_LockCRT2( HwDeviceExtension, pVBInfo ) ;
610 }
611
612 return 1;
613 }
614
615
616 /* --------------------------------------------------------------------- */
617 /* Function : XGI_SetCRT1Group */
618 /* Input : */
619 /* Output : */
620 /* Description : */
621 /* --------------------------------------------------------------------- */
622 void XGI_SetCRT1Group(struct xgi_hw_device_info *HwDeviceExtension,
623 unsigned short ModeNo,
624 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
625 {
626 unsigned short StandTableIndex ,
627 RefreshRateTableIndex ,
628 b3CC ,
629 temp ;
630
631 unsigned short XGINew_P3cc = pVBInfo->P3cc;
632
633 /* XGINew_CRT1Mode = ModeNo ; // SaveModeID */
634 StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ;
635 /* XGI_SetBIOSData(ModeNo , ModeIdIndex ) ; */
636 /* XGI_ClearBankRegs( ModeNo , ModeIdIndex ) ; */
637 XGI_SetSeqRegs( ModeNo , StandTableIndex , ModeIdIndex, pVBInfo ) ;
638 XGI_SetMiscRegs( StandTableIndex, pVBInfo ) ;
639 XGI_SetCRTCRegs( HwDeviceExtension , StandTableIndex, pVBInfo) ;
640 XGI_SetATTRegs( ModeNo , StandTableIndex , ModeIdIndex, pVBInfo ) ;
641 XGI_SetGRCRegs( StandTableIndex, pVBInfo ) ;
642 XGI_ClearExt1Regs(pVBInfo) ;
643
644 /* if ( pVBInfo->IF_DEF_ExpLink ) */
645 if ( HwDeviceExtension->jChipType == XG27 )
646 {
647 if ( pVBInfo->IF_DEF_LVDS == 0 )
648 {
649 XGI_SetDefaultVCLK( pVBInfo ) ;
650 }
651 }
652
653 temp = ~ProgrammingCRT2 ;
654 pVBInfo->SetFlag &= temp ;
655 pVBInfo->SelectCRT2Rate = 0 ;
656
657 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
658 {
659 if ( pVBInfo->VBInfo & ( SetSimuScanMode | SetCRT2ToLCDA | SetInSlaveMode ) )
660 {
661 pVBInfo->SetFlag |= ProgrammingCRT2 ;
662 }
663 }
664
665 RefreshRateTableIndex = XGI_GetRatePtrCRT2( HwDeviceExtension, ModeNo , ModeIdIndex, pVBInfo ) ;
666 if ( RefreshRateTableIndex != 0xFFFF )
667 {
668 XGI_SetSync( RefreshRateTableIndex, pVBInfo ) ;
669 XGI_SetCRT1CRTC( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo, HwDeviceExtension ) ;
670 XGI_SetCRT1DE( HwDeviceExtension , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
671 XGI_SetCRT1Offset( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
672 XGI_SetCRT1VCLK( ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
673 }
674
675 if ( ( HwDeviceExtension->jChipType >= XG20 )&&
676 ( HwDeviceExtension->jChipType < XG27 ) ) /* fix H/W DCLK/2 bug */
677 {
678 if ( ( ModeNo == 0x00 ) | (ModeNo == 0x01) )
679 {
680 XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , 0x4E) ;
681 XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , 0xE9) ;
682 b3CC = (unsigned char) XGINew_GetReg2(XGINew_P3cc) ;
683 XGINew_SetReg3(XGINew_P3cc , (b3CC |= 0x0C) ) ;
684 }
685 else if ( ( ModeNo == 0x04) | ( ModeNo == 0x05) | ( ModeNo == 0x0D) )
686 {
687 XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , 0x1B) ;
688 XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , 0xE3) ;
689 b3CC = (unsigned char)XGINew_GetReg2(XGINew_P3cc) ;
690 XGINew_SetReg3(XGINew_P3cc , (b3CC |= 0x0C) ) ;
691 }
692 }
693
694 if ( HwDeviceExtension->jChipType >= XG21 )
695 {
696 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ;
697 if ( temp & 0xA0 )
698 {
699
700 /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x20 ) ;*/ /* Enable write GPIOF */
701 /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x48 , ~0x20 ) ;*/ /* P. DWN */
702 /* XG21 CRT1 Timing */
703 if ( HwDeviceExtension->jChipType == XG27 )
704 XGI_SetXG27CRTC( ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo );
705 else
706 XGI_SetXG21CRTC( ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo );
707
708 XGI_UpdateXG21CRTC( ModeNo , pVBInfo , RefreshRateTableIndex) ;
709
710 if ( HwDeviceExtension->jChipType == XG27 )
711 XGI_SetXG27LCD( pVBInfo , RefreshRateTableIndex , ModeNo );
712 else
713 XGI_SetXG21LCD( pVBInfo , RefreshRateTableIndex , ModeNo );
714
715 if ( pVBInfo->IF_DEF_LVDS == 1 )
716 {
717 if ( HwDeviceExtension->jChipType == XG27 )
718 XGI_SetXG27LVDSPara(ModeNo,ModeIdIndex, pVBInfo );
719 else
720 XGI_SetXG21LVDSPara(ModeNo,ModeIdIndex, pVBInfo );
721 }
722 /*XGINew_SetRegOR( pVBInfo->P3d4 , 0x48 , 0x20 ) ;*/ /* P. ON */
723 }
724 }
725
726 pVBInfo->SetFlag &= ( ~ProgrammingCRT2 ) ;
727 XGI_SetCRT1FIFO( ModeNo , HwDeviceExtension, pVBInfo ) ;
728 XGI_SetCRT1ModeRegs( HwDeviceExtension , ModeNo , ModeIdIndex , RefreshRateTableIndex , pVBInfo) ;
729
730
731 /* XGI_LoadCharacter(); //dif ifdef TVFont */
732
733 XGI_LoadDAC( ModeNo , ModeIdIndex, pVBInfo ) ;
734 /* XGI_ClearBuffer( HwDeviceExtension , ModeNo, pVBInfo ) ; */
735 }
736
737
738 /* --------------------------------------------------------------------- */
739 /* Function : XGI_GetModePtr */
740 /* Input : */
741 /* Output : */
742 /* Description : */
743 /* --------------------------------------------------------------------- */
744 unsigned char XGI_GetModePtr(unsigned short ModeNo, unsigned short ModeIdIndex,
745 struct vb_device_info *pVBInfo)
746 {
747 unsigned char index ;
748
749 if ( ModeNo <= 0x13 )
750 index = pVBInfo->SModeIDTable[ ModeIdIndex ].St_StTableIndex ;
751 else
752 {
753 if ( pVBInfo->ModeType <= 0x02 )
754 index = 0x1B ; /* 02 -> ModeEGA */
755 else
756 index = 0x0F ;
757 }
758 return( index ) ; /* Get pVBInfo->StandTable index */
759 }
760
761
762 /* --------------------------------------------------------------------- */
763 /* Function : XGI_SetBIOSData */
764 /* Input : */
765 /* Output : */
766 /* Description : */
767 /* --------------------------------------------------------------------- */
768 /*unsigned char XGI_SetBIOSData(unsigned short ModeNo, unsigned short ModeIdIndex)
769 {
770 return( 0 ) ;
771 }
772 */
773
774 /* --------------------------------------------------------------------- */
775 /* Function : XGI_ClearBankRegs */
776 /* Input : */
777 /* Output : */
778 /* Description : */
779 /* --------------------------------------------------------------------- */
780 /*unsigned char XGI_ClearBankRegs(unsigned short ModeNo, unsigned short ModeIdIndex)
781 {
782 return( 0 ) ;
783 }
784 */
785
786 /* --------------------------------------------------------------------- */
787 /* Function : XGI_SetSeqRegs */
788 /* Input : */
789 /* Output : */
790 /* Description : */
791 /* --------------------------------------------------------------------- */
792 void XGI_SetSeqRegs(unsigned short ModeNo, unsigned short StandTableIndex,
793 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
794 {
795 unsigned char tempah ,
796 SRdata ;
797
798 unsigned short i ,
799 modeflag ;
800
801 if ( ModeNo <= 0x13 )
802 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
803 else
804 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
805
806 XGINew_SetReg1( pVBInfo->P3c4 , 0x00 , 0x03 ) ; /* Set SR0 */
807 tempah=pVBInfo->StandTable[ StandTableIndex ].SR[ 0 ] ;
808
809 i = SetCRT2ToLCDA ;
810 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
811 {
812 tempah |= 0x01 ;
813 }
814 else
815 {
816 if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToLCD ) )
817 {
818 if ( pVBInfo->VBInfo & SetInSlaveMode )
819 tempah |= 0x01 ;
820 }
821 }
822
823 tempah |= 0x20 ; /* screen off */
824 XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , tempah ) ; /* Set SR1 */
825
826 for( i = 02 ; i <= 04 ; i++ )
827 {
828 SRdata = pVBInfo->StandTable[ StandTableIndex ].SR[ i - 1 ] ; /* Get SR2,3,4 from file */
829 XGINew_SetReg1( pVBInfo->P3c4 , i , SRdata ) ; /* Set SR2 3 4 */
830 }
831 }
832
833
834 /* --------------------------------------------------------------------- */
835 /* Function : XGI_SetMiscRegs */
836 /* Input : */
837 /* Output : */
838 /* Description : */
839 /* --------------------------------------------------------------------- */
840 void XGI_SetMiscRegs(unsigned short StandTableIndex, struct vb_device_info *pVBInfo)
841 {
842 unsigned char Miscdata ;
843
844 Miscdata = pVBInfo->StandTable[ StandTableIndex ].MISC ; /* Get Misc from file */
845 /*
846 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
847 {
848 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
849 {
850 Miscdata |= 0x0C ;
851 }
852 }
853 */
854
855 XGINew_SetReg3( pVBInfo->P3c2 , Miscdata ) ; /* Set Misc(3c2) */
856 }
857
858
859 /* --------------------------------------------------------------------- */
860 /* Function : XGI_SetCRTCRegs */
861 /* Input : */
862 /* Output : */
863 /* Description : */
864 /* --------------------------------------------------------------------- */
865 void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
866 unsigned short StandTableIndex, struct vb_device_info *pVBInfo)
867 {
868 unsigned char CRTCdata ;
869 unsigned short i ;
870
871 CRTCdata = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11);
872 CRTCdata &= 0x7f ;
873 XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , CRTCdata ) ; /* Unlock CRTC */
874
875 for( i = 0 ; i <= 0x18 ; i++ )
876 {
877 CRTCdata = pVBInfo->StandTable[ StandTableIndex ].CRTC[ i ] ; /* Get CRTC from file */
878 XGINew_SetReg1( pVBInfo->P3d4 , i , CRTCdata ) ; /* Set CRTC( 3d4 ) */
879 }
880 /*
881 if ( ( HwDeviceExtension->jChipType == XGI_630 )&& ( HwDeviceExtension->jChipRevision == 0x30 ) )
882 {
883 if ( pVBInfo->VBInfo & SetInSlaveMode )
884 {
885 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToTV ) )
886 {
887 XGINew_SetReg1( pVBInfo->P3d4 , 0x18 , 0xFE ) ;
888 }
889 }
890 }
891 */
892 }
893
894
895 /* --------------------------------------------------------------------- */
896 /* Function : */
897 /* Input : */
898 /* Output : */
899 /* Description : */
900 /* --------------------------------------------------------------------- */
901 void XGI_SetATTRegs(unsigned short ModeNo, unsigned short StandTableIndex,
902 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
903 {
904 unsigned char ARdata ;
905 unsigned short i, modeflag;
906
907 if ( ModeNo <= 0x13 )
908 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
909 else
910 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
911
912 for( i = 0 ; i <= 0x13 ; i++ )
913 {
914 ARdata = pVBInfo->StandTable[ StandTableIndex ].ATTR[ i ] ;
915 if ( modeflag & Charx8Dot ) /* ifndef Dot9 */
916 {
917 if ( i == 0x13 )
918 {
919 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
920 ARdata = 0 ;
921 else
922 {
923 if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToLCD ) )
924 {
925 if ( pVBInfo->VBInfo & SetInSlaveMode )
926 ARdata = 0 ;
927 }
928 }
929 }
930 }
931
932 XGINew_GetReg2( pVBInfo->P3da ) ; /* reset 3da */
933 XGINew_SetReg3( pVBInfo->P3c0 , i ) ; /* set index */
934 XGINew_SetReg3( pVBInfo->P3c0 , ARdata ) ; /* set data */
935 }
936
937 XGINew_GetReg2( pVBInfo->P3da ) ; /* reset 3da */
938 XGINew_SetReg3( pVBInfo->P3c0 , 0x14 ) ; /* set index */
939 XGINew_SetReg3( pVBInfo->P3c0 , 0x00 ) ; /* set data */
940 XGINew_GetReg2( pVBInfo->P3da ) ; /* Enable Attribute */
941 XGINew_SetReg3( pVBInfo->P3c0 , 0x20 ) ;
942 }
943
944
945 /* --------------------------------------------------------------------- */
946 /* Function : XGI_SetGRCRegs */
947 /* Input : */
948 /* Output : */
949 /* Description : */
950 /* --------------------------------------------------------------------- */
951 void XGI_SetGRCRegs(unsigned short StandTableIndex, struct vb_device_info *pVBInfo)
952 {
953 unsigned char GRdata ;
954 unsigned short i ;
955
956 for( i = 0 ; i <= 0x08 ; i++ )
957 {
958 GRdata = pVBInfo->StandTable[ StandTableIndex ].GRC[ i ] ; /* Get GR from file */
959 XGINew_SetReg1( pVBInfo->P3ce , i , GRdata ) ; /* Set GR(3ce) */
960 }
961
962 if ( pVBInfo->ModeType > ModeVGA )
963 {
964 GRdata = (unsigned char)XGINew_GetReg1(pVBInfo->P3ce, 0x05);
965 GRdata &= 0xBF ; /* 256 color disable */
966 XGINew_SetReg1( pVBInfo->P3ce , 0x05 , GRdata ) ;
967 }
968 }
969
970
971 /* --------------------------------------------------------------------- */
972 /* Function : XGI_ClearExt1Regs */
973 /* Input : */
974 /* Output : */
975 /* Description : */
976 /* --------------------------------------------------------------------- */
977 void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
978 {
979 unsigned short i ;
980
981 for( i = 0x0A ; i <= 0x0E ; i++ )
982 XGINew_SetReg1( pVBInfo->P3c4 , i , 0x00 ) ; /* Clear SR0A-SR0E */
983 }
984
985
986 /* --------------------------------------------------------------------- */
987 /* Function : XGI_SetDefaultVCLK */
988 /* Input : */
989 /* Output : */
990 /* Description : */
991 /* --------------------------------------------------------------------- */
992 unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
993 {
994
995 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , 0x20 ) ;
996 XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ 0 ].SR2B ) ;
997 XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ 0 ].SR2C ) ;
998
999 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , 0x10 ) ;
1000 XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ 1 ].SR2B ) ;
1001 XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ 1 ].SR2C ) ;
1002
1003 XGINew_SetRegAND( pVBInfo->P3c4 , 0x31 , ~0x30 ) ;
1004 return( 0 ) ;
1005 }
1006
1007
1008 /* --------------------------------------------------------------------- */
1009 /* Function : XGI_GetRatePtrCRT2 */
1010 /* Input : */
1011 /* Output : */
1012 /* Description : */
1013 /* --------------------------------------------------------------------- */
1014 unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
1015 unsigned short ModeNo,
1016 unsigned short ModeIdIndex,
1017 struct vb_device_info *pVBInfo)
1018 {
1019 short LCDRefreshIndex[] = { 0x00 , 0x00 , 0x03 , 0x01 } ,
1020 LCDARefreshIndex[] = { 0x00 , 0x00 , 0x03 , 0x01 , 0x01 , 0x01 , 0x01 } ;
1021
1022 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
1023
1024 if ( ModeNo <= 0x13 )
1025 {
1026 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
1027 }
1028 else
1029 {
1030 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
1031 }
1032
1033 if ( pVBInfo->IF_DEF_CH7005 == 1 )
1034 {
1035 if ( pVBInfo->VBInfo & SetCRT2ToTV )
1036 {
1037 if ( modeflag & HalfDCLK )
1038 return( 0 ) ;
1039 }
1040 }
1041
1042 if ( ModeNo < 0x14 )
1043 return( 0xFFFF ) ;
1044
1045 index = XGINew_GetReg1( pVBInfo->P3d4 , 0x33 ) ;
1046 index = index >> pVBInfo->SelectCRT2Rate ;
1047 index &= 0x0F ;
1048
1049 if ( pVBInfo->LCDInfo & LCDNonExpanding )
1050 index = 0 ;
1051
1052 if ( index > 0 )
1053 index-- ;
1054
1055 if ( pVBInfo->SetFlag & ProgrammingCRT2 )
1056 {
1057 if ( pVBInfo->IF_DEF_CH7005 == 1 )
1058 {
1059 if ( pVBInfo->VBInfo & SetCRT2ToTV )
1060 {
1061 index = 0 ;
1062 }
1063 }
1064
1065 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
1066 {
1067 if( pVBInfo->IF_DEF_LVDS == 0 )
1068 {
1069 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
1070 temp = LCDARefreshIndex[ pVBInfo->LCDResInfo & 0x0F ] ; /* 301b */
1071 else
1072 temp = LCDRefreshIndex[ pVBInfo->LCDResInfo & 0x0F ] ;
1073
1074 if ( index > temp )
1075 {
1076 index = temp ;
1077 }
1078 }
1079 else
1080 {
1081 index = 0 ;
1082 }
1083 }
1084 }
1085
1086 RefreshRateTableIndex = pVBInfo->EModeIDTable[ ModeIdIndex ].REFindex ;
1087 ModeNo = pVBInfo->RefIndex[ RefreshRateTableIndex ].ModeID ;
1088 if ( pXGIHWDE->jChipType >= XG20 ) /* for XG20, XG21, XG27 */
1089 {
1090 /*
1091 if ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag & XG2xNotSupport )
1092 {
1093 index++;
1094 }
1095 */
1096 if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 800 ) &&
1097 ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 600 ) )
1098 {
1099 index++;
1100 }
1101 /* Alan 10/19/2007; do the similiar adjustment like XGISearchCRT1Rate() */
1102 if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1024 ) &&
1103 ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 768 ) )
1104 {
1105 index++;
1106 }
1107 if ( ( pVBInfo->RefIndex[ RefreshRateTableIndex ].XRes == 1280 ) &&
1108 ( pVBInfo->RefIndex[ RefreshRateTableIndex ].YRes == 1024 ) )
1109 {
1110 index++;
1111 }
1112 }
1113
1114 i = 0 ;
1115 do
1116 {
1117 if ( pVBInfo->RefIndex[ RefreshRateTableIndex + i ].ModeID != ModeNo )
1118 break ;
1119 temp = pVBInfo->RefIndex[ RefreshRateTableIndex + i ].Ext_InfoFlag ;
1120 temp &= ModeInfoFlag ;
1121 if ( temp < pVBInfo->ModeType )
1122 break ;
1123 i++ ;
1124 index-- ;
1125
1126 } while( index != 0xFFFF ) ;
1127 if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) )
1128 {
1129 if ( pVBInfo->VBInfo & SetInSlaveMode )
1130 {
1131 temp = pVBInfo->RefIndex[ RefreshRateTableIndex + i - 1 ].Ext_InfoFlag ;
1132 if ( temp & InterlaceMode )
1133 {
1134 i++ ;
1135 }
1136 }
1137 }
1138 i-- ;
1139 if ( ( pVBInfo->SetFlag & ProgrammingCRT2 ) )
1140 {
1141 temp = XGI_AjustCRT2Rate( ModeNo , ModeIdIndex , RefreshRateTableIndex , &i, pVBInfo) ;
1142 }
1143 return( RefreshRateTableIndex + i ) ; /*return(0x01|(temp1<<1)); */
1144 }
1145
1146
1147 /* --------------------------------------------------------------------- */
1148 /* Function : XGI_AjustCRT2Rate */
1149 /* Input : */
1150 /* Output : */
1151 /* Description : */
1152 /* --------------------------------------------------------------------- */
1153 unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo, unsigned short ModeIdIndex,
1154 unsigned short RefreshRateTableIndex,
1155 unsigned short *i, struct vb_device_info *pVBInfo)
1156 {
1157 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
1158
1159 if ( ModeNo <= 0x13 )
1160 {
1161 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; /* si+St_ModeFlag */
1162 }
1163 else
1164 {
1165 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
1166 }
1167
1168 resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
1169 tempbx = pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].ModeID ;
1170 tempax = 0 ;
1171
1172 if ( pVBInfo->IF_DEF_LVDS == 0 )
1173 {
1174 if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
1175 {
1176 tempax |= SupportRAMDAC2 ;
1177
1178 if ( pVBInfo->VBType & VB_XGI301C )
1179 tempax |= SupportCRT2in301C ;
1180 }
1181
1182 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) /* 301b */
1183 {
1184 tempax |= SupportLCD ;
1185
1186 if ( pVBInfo->LCDResInfo != Panel1280x1024 )
1187 {
1188 if ( pVBInfo->LCDResInfo != Panel1280x960 )
1189 {
1190 if ( pVBInfo->LCDInfo & LCDNonExpanding )
1191 {
1192 if ( resinfo >= 9 )
1193 {
1194 tempax = 0 ;
1195 return( 0 ) ;
1196 }
1197 }
1198 }
1199 }
1200 }
1201
1202 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) /* for HiTV */
1203 {
1204 if ( ( pVBInfo->VBType & VB_XGI301LV ) && ( pVBInfo->VBExtInfo == VB_YPbPr1080i ) )
1205 {
1206 tempax |= SupportYPbPr ;
1207 if ( pVBInfo->VBInfo & SetInSlaveMode )
1208 {
1209 if ( resinfo == 4 )
1210 return( 0 ) ;
1211
1212 if ( resinfo == 3 )
1213 return( 0 ) ;
1214
1215 if ( resinfo > 7 )
1216 return( 0 ) ;
1217 }
1218 }
1219 else
1220 {
1221 tempax |= SupportHiVisionTV ;
1222 if ( pVBInfo->VBInfo & SetInSlaveMode )
1223 {
1224 if ( resinfo == 4 )
1225 return( 0 ) ;
1226
1227 if ( resinfo == 3 )
1228 {
1229 if ( pVBInfo->SetFlag & TVSimuMode )
1230 return( 0 ) ;
1231 }
1232
1233 if ( resinfo > 7 )
1234 return( 0 ) ;
1235 }
1236 }
1237 }
1238 else
1239 {
1240 if ( pVBInfo->VBInfo & ( SetCRT2ToAVIDEO | SetCRT2ToSVIDEO | SetCRT2ToSCART | SetCRT2ToYPbPr | SetCRT2ToHiVisionTV ) )
1241 {
1242 tempax |= SupportTV ;
1243
1244 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
1245 {
1246 tempax |= SupportTV1024 ;
1247 }
1248
1249 if ( !( pVBInfo->VBInfo & SetPALTV ) )
1250 {
1251 if ( modeflag & NoSupportSimuTV )
1252 {
1253 if ( pVBInfo->VBInfo & SetInSlaveMode )
1254 {
1255 if ( !( pVBInfo->VBInfo & SetNotSimuMode ) )
1256 {
1257 return( 0 ) ;
1258 }
1259 }
1260 }
1261 }
1262 }
1263 }
1264 }
1265 else /* for LVDS */
1266 {
1267 if ( pVBInfo->IF_DEF_CH7005 == 1 )
1268 {
1269 if ( pVBInfo->VBInfo & SetCRT2ToTV )
1270 {
1271 tempax |= SupportCHTV ;
1272 }
1273 }
1274
1275 if ( pVBInfo->VBInfo & SetCRT2ToLCD )
1276 {
1277 tempax |= SupportLCD ;
1278
1279 if ( resinfo > 0x08 )
1280 return( 0 ) ; /* 1024x768 */
1281
1282 if ( pVBInfo->LCDResInfo < Panel1024x768 )
1283 {
1284 if ( resinfo > 0x07 )
1285 return( 0 ) ; /* 800x600 */
1286
1287 if ( resinfo == 0x04 )
1288 return( 0 ) ; /* 512x384 */
1289 }
1290 }
1291 }
1292
1293 for( ; pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].ModeID == tempbx ; ( *i )-- )
1294 {
1295 infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].Ext_InfoFlag ;
1296 if ( infoflag & tempax )
1297 {
1298 return( 1 ) ;
1299 }
1300 if ( ( *i ) == 0 )
1301 break ;
1302 }
1303
1304 for( ( *i ) = 0 ; ; ( *i )++ )
1305 {
1306 infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].Ext_InfoFlag ;
1307 if ( pVBInfo->RefIndex[ RefreshRateTableIndex + ( *i ) ].ModeID != tempbx )
1308 {
1309 return( 0 ) ;
1310 }
1311
1312 if ( infoflag & tempax )
1313 {
1314 return( 1 ) ;
1315 }
1316 }
1317 return( 1 ) ;
1318 }
1319
1320
1321 /* --------------------------------------------------------------------- */
1322 /* Function : XGI_SetSync */
1323 /* Input : */
1324 /* Output : */
1325 /* Description : */
1326 /* --------------------------------------------------------------------- */
1327 void XGI_SetSync(unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo)
1328 {
1329 unsigned short sync ,
1330 temp ;
1331
1332 sync = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag >> 8 ; /* di+0x00 */
1333 sync &= 0xC0 ;
1334 temp = 0x2F ;
1335 temp |= sync ;
1336 XGINew_SetReg3( pVBInfo->P3c2 , temp ) ; /* Set Misc(3c2) */
1337 }
1338
1339
1340 /* --------------------------------------------------------------------- */
1341 /* Function : XGI_SetCRT1CRTC */
1342 /* Input : */
1343 /* Output : */
1344 /* Description : */
1345 /* --------------------------------------------------------------------- */
1346 void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
1347 unsigned short RefreshRateTableIndex,
1348 struct vb_device_info *pVBInfo,
1349 struct xgi_hw_device_info *HwDeviceExtension)
1350 {
1351 unsigned char index, data;
1352 unsigned short i;
1353
1354 index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ; /* Get index */
1355 index = index&IndexMask ;
1356
1357 data = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11);
1358 data &= 0x7F ;
1359 XGINew_SetReg1(pVBInfo->P3d4,0x11,data); /* Unlock CRTC */
1360
1361 for( i = 0 ; i < 8 ; i++ )
1362 pVBInfo->TimingH[ 0 ].data[ i ] = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ i ] ;
1363
1364 for( i = 0 ; i < 7 ; i++ )
1365 pVBInfo->TimingV[ 0 ].data[ i ] = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ i + 8 ] ;
1366
1367 XGI_SetCRT1Timing_H( pVBInfo, HwDeviceExtension ) ;
1368
1369
1370
1371 XGI_SetCRT1Timing_V( ModeIdIndex , ModeNo, pVBInfo ) ;
1372
1373
1374 if( pVBInfo->ModeType > 0x03 )
1375 XGINew_SetReg1( pVBInfo->P3d4 , 0x14 , 0x4F ) ;
1376 }
1377
1378
1379 /* --------------------------------------------------------------------- */
1380 /* Function : XGI_SetCRT1Timing_H */
1381 /* Input : */
1382 /* Output : */
1383 /* Description : */
1384 /* --------------------------------------------------------------------- */
1385 void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo, struct xgi_hw_device_info *HwDeviceExtension)
1386 {
1387 unsigned char data, data1, pushax;
1388 unsigned short i, j;
1389
1390 /* XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0 ) ; */
1391 /* XGINew_SetReg1( pVBInfo->P3d4 , 0x56 , 0 ) ; */
1392 /* XGINew_SetRegANDOR( pVBInfo->P3d4 ,0x11 , 0x7f , 0x00 ) ; */
1393
1394 data = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11); /* unlock cr0-7 */
1395 data &= 0x7F ;
1396 XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , data ) ;
1397
1398 data = pVBInfo->TimingH[ 0 ].data[ 0 ] ;
1399 XGINew_SetReg1( pVBInfo->P3d4 , 0 , data ) ;
1400
1401 for( i = 0x01 ; i <= 0x04 ; i++ )
1402 {
1403 data = pVBInfo->TimingH[ 0 ].data[ i ] ;
1404 XGINew_SetReg1( pVBInfo->P3d4, (unsigned short)(i + 1), data);
1405 }
1406
1407 for( i = 0x05 ; i <= 0x06 ; i++ )
1408 {
1409 data = pVBInfo->TimingH[ 0 ].data[ i ];
1410 XGINew_SetReg1(pVBInfo->P3c4, (unsigned short)(i + 6), data);
1411 }
1412
1413 j = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x0e);
1414 j &= 0x1F ;
1415 data = pVBInfo->TimingH[ 0 ].data[ 7 ] ;
1416 data &= 0xE0 ;
1417 data |= j ;
1418 XGINew_SetReg1( pVBInfo->P3c4 , 0x0e , data ) ;
1419
1420 if ( HwDeviceExtension->jChipType >= XG20 )
1421 {
1422 data = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x04);
1423 data = data - 1 ;
1424 XGINew_SetReg1( pVBInfo->P3d4 , 0x04 , data ) ;
1425 data = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x05);
1426 data1 = data ;
1427 data1 &= 0xE0 ;
1428 data &= 0x1F ;
1429 if ( data == 0 )
1430 {
1431 pushax = data ;
1432 data = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x0c);
1433 data &= 0xFB ;
1434 XGINew_SetReg1( pVBInfo->P3c4 , 0x0c , data ) ;
1435 data = pushax ;
1436 }
1437 data = data - 1 ;
1438 data |= data1 ;
1439 XGINew_SetReg1( pVBInfo->P3d4 , 0x05 , data ) ;
1440 data = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x0e);
1441 data = data >> 5 ;
1442 data = data + 3 ;
1443 if ( data > 7 )
1444 data = data - 7 ;
1445 data = data << 5 ;
1446 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0e , ~0xE0 , data ) ;
1447 }
1448 }
1449
1450
1451 /* --------------------------------------------------------------------- */
1452 /* Function : XGI_SetCRT1Timing_V */
1453 /* Input : */
1454 /* Output : */
1455 /* Description : */
1456 /* --------------------------------------------------------------------- */
1457 void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
1458 unsigned short ModeNo,
1459 struct vb_device_info *pVBInfo)
1460 {
1461 unsigned char data;
1462 unsigned short i, j;
1463
1464 /* XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0 ) ; */
1465 /* XGINew_SetReg1( pVBInfo->P3d4 , 0x56 , 0 ) ; */
1466 /* XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x11 , 0x7f , 0x00 ) ; */
1467
1468 for( i = 0x00 ; i <= 0x01 ; i++ )
1469 {
1470 data = pVBInfo->TimingV[ 0 ].data[ i ] ;
1471 XGINew_SetReg1(pVBInfo->P3d4, (unsigned short)(i + 6), data);
1472 }
1473
1474 for( i = 0x02 ; i <= 0x03 ; i++ )
1475 {
1476 data = pVBInfo->TimingV[ 0 ].data[ i ] ;
1477 XGINew_SetReg1(pVBInfo->P3d4, (unsigned short)(i + 0x0e), data);
1478 }
1479
1480 for( i = 0x04 ; i <= 0x05 ; i++ )
1481 {
1482 data = pVBInfo->TimingV[ 0 ].data[ i ] ;
1483 XGINew_SetReg1(pVBInfo->P3d4, (unsigned short)(i + 0x11), data);
1484 }
1485
1486 j = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x0a);
1487 j &= 0xC0 ;
1488 data = pVBInfo->TimingV[ 0 ].data[ 6 ] ;
1489 data &= 0x3F ;
1490 data |= j ;
1491 XGINew_SetReg1( pVBInfo->P3c4 , 0x0a , data ) ;
1492
1493 data = pVBInfo->TimingV[ 0 ].data[ 6 ] ;
1494 data &= 0x80 ;
1495 data = data >> 2 ;
1496
1497 if ( ModeNo <= 0x13 )
1498 i = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
1499 else
1500 i = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
1501
1502 i &= DoubleScanMode ;
1503 if ( i )
1504 data |= 0x80 ;
1505
1506 j = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x09);
1507 j &= 0x5F ;
1508 data |= j ;
1509 XGINew_SetReg1( pVBInfo->P3d4 , 0x09 , data ) ;
1510 }
1511
1512
1513 /* --------------------------------------------------------------------- */
1514 /* Function : XGI_SetXG21CRTC */
1515 /* Input : Stand or enhance CRTC table */
1516 /* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
1517 /* Description : Set LCD timing */
1518 /* --------------------------------------------------------------------- */
1519 void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
1520 unsigned short RefreshRateTableIndex,
1521 struct vb_device_info *pVBInfo)
1522 {
1523 unsigned char StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
1524 unsigned short Temp1, Temp2, Temp3;
1525
1526 if ( ModeNo <= 0x13 )
1527 {
1528 StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ;
1529 Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 4 ] ; /* CR04 HRS */
1530 XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ; /* SR2E [7:0]->HRS */
1531 Tempbx = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 5 ] ; /* Tempbx: CR05 HRE */
1532 Tempbx &= 0x1F ; /* Tempbx: HRE[4:0] */
1533 Tempcx = Tempax ;
1534 Tempcx &= 0xE0 ; /* Tempcx: HRS[7:5] */
1535 Tempdx = Tempcx | Tempbx ; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
1536 if ( Tempbx < ( Tempax & 0x1F ) ) /* IF HRE < HRS */
1537 Tempdx |= 0x20 ; /* Tempdx: HRE = HRE + 0x20 */
1538 Tempdx <<= 2 ; /* Tempdx << 2 */
1539 XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempdx ) ; /* SR2F [7:2]->HRE */
1540 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ;
1541
1542 Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 16 ] ; /* Tempax: CR16 VRS */
1543 Tempbx = Tempax ; /* Tempbx=Tempax */
1544 Tempax &= 0x01 ; /* Tempax: VRS[0] */
1545 XGINew_SetRegOR( pVBInfo->P3c4 , 0x33 , Tempax ) ; /* SR33[0]->VRS */
1546 Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 7 ] ; /* Tempax: CR7 VRS */
1547 Tempdx = Tempbx >> 1 ; /* Tempdx: VRS[7:1] */
1548 Tempcx = Tempax & 0x04 ; /* Tempcx: CR7[2] */
1549 Tempcx <<= 5 ; /* Tempcx[7]: VRS[8] */
1550 Tempdx |= Tempcx ; /* Tempdx: VRS[8:1] */
1551 XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempdx ) ; /* SR34[7:0]: VRS[8:1] */
1552
1553 Temp1 = Tempcx << 1 ; /* Temp1[8]: VRS[8] unsigned char -> unsigned short */
1554 Temp1 |= Tempbx ; /* Temp1[8:0]: VRS[8:0] */
1555 Tempax &= 0x80 ; /* Tempax[7]: CR7[7] */
1556 Temp2 = Tempax << 2 ; /* Temp2[9]: VRS[9] */
1557 Temp1 |= Temp2 ; /* Temp1[9:0]: VRS[9:0] */
1558
1559 Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 17 ] ; /* CR16 VRE */
1560 Tempax &= 0x0F ; /* Tempax[3:0]: VRE[3:0] */
1561 Temp2 = Temp1 & 0x3F0 ; /* Temp2[9:4]: VRS[9:4] */
1562 Temp2 |= Tempax ; /* Temp2[9:0]: VRE[9:0] */
1563 Temp3 = Temp1 & 0x0F ; /* Temp3[3:0]: VRS[3:0] */
1564 if ( Tempax < Temp3 ) /* VRE[3:0]<VRS[3:0] */
1565 Temp2 |= 0x10 ; /* Temp2: VRE + 0x10 */
1566 Temp2 &= 0xFF ; /* Temp2[7:0]: VRE[7:0] */
1567 Tempax = (unsigned char)Temp2; /* Tempax[7:0]: VRE[7:0] */
1568 Tempax <<= 2 ; /* Tempax << 2: VRE[5:0] */
1569 Temp1 &= 0x600 ; /* Temp1[10:9]: VRS[10:9] */
1570 Temp1 >>= 9 ; /* [10:9]->[1:0] */
1571 Tempbx = (unsigned char)Temp1; /* Tempbx[1:0]: VRS[10:9] */
1572 Tempax |= Tempbx ; /* VRE[5:0]VRS[10:9] */
1573 Tempax &= 0x7F ;
1574 XGINew_SetReg1( pVBInfo->P3c4 , 0x3F , Tempax ) ; /* SR3F D[7:2]->VRE D[1:0]->VRS */
1575 }
1576 else
1577 {
1578 index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
1579 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ; /* Tempax: CR4 HRS */
1580 Tempcx = Tempax ; /* Tempcx: HRS */
1581 XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ; /* SR2E[7:0]->HRS */
1582
1583 Tempdx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ; /* SRB */
1584 Tempdx &= 0xC0 ; /* Tempdx[7:6]: SRB[7:6] */
1585 Temp1 = Tempdx ; /* Temp1[7:6]: HRS[9:8] */
1586 Temp1 <<= 2 ; /* Temp1[9:8]: HRS[9:8] */
1587 Temp1 |= Tempax ; /* Temp1[9:0]: HRS[9:0] */
1588
1589 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 4 ] ; /* CR5 HRE */
1590 Tempax &= 0x1F ; /* Tempax[4:0]: HRE[4:0] */
1591
1592 Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 6 ] ; /* SRC */
1593 Tempbx &= 0x04 ; /* Tempbx[2]: HRE[5] */
1594 Tempbx <<= 3 ; /* Tempbx[5]: HRE[5] */
1595 Tempax |= Tempbx ; /* Tempax[5:0]: HRE[5:0] */
1596
1597 Temp2 = Temp1 & 0x3C0 ; /* Temp2[9:6]: HRS[9:6] */
1598 Temp2 |= Tempax ; /* Temp2[9:0]: HRE[9:0] */
1599
1600 Tempcx &= 0x3F ; /* Tempcx[5:0]: HRS[5:0] */
1601 if( Tempax < Tempcx ) /* HRE < HRS */
1602 Temp2 |= 0x40 ; /* Temp2 + 0x40 */
1603
1604 Temp2 &= 0xFF ;
1605 Tempax = (unsigned char)Temp2; /* Tempax: HRE[7:0] */
1606 Tempax <<= 2 ; /* Tempax[7:2]: HRE[5:0] */
1607 Tempdx >>= 6 ; /* Tempdx[7:6]->[1:0] HRS[9:8] */
1608 Tempax |= Tempdx ; /* HRE[5:0]HRS[9:8] */
1609 XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempax ) ; /* SR2F D[7:2]->HRE, D[1:0]->HRS */
1610 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ;
1611
1612 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 10 ] ; /* CR10 VRS */
1613 Tempbx = Tempax ; /* Tempbx: VRS */
1614 Tempax &= 0x01 ; /* Tempax[0]: VRS[0] */
1615 XGINew_SetRegOR( pVBInfo->P3c4 , 0x33 , Tempax ) ; /* SR33[0]->VRS[0] */
1616 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 9 ] ; /* CR7[2][7] VRE */
1617 Tempcx = Tempbx >> 1 ; /* Tempcx[6:0]: VRS[7:1] */
1618 Tempdx = Tempax & 0x04 ; /* Tempdx[2]: CR7[2] */
1619 Tempdx <<= 5 ; /* Tempdx[7]: VRS[8] */
1620 Tempcx |= Tempdx ; /* Tempcx[7:0]: VRS[8:1] */
1621 XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempcx ) ; /* SR34[8:1]->VRS */
1622
1623 Temp1 = Tempdx ; /* Temp1[7]: Tempdx[7] */
1624 Temp1 <<= 1 ; /* Temp1[8]: VRS[8] */
1625 Temp1 |= Tempbx ; /* Temp1[8:0]: VRS[8:0] */
1626 Tempax &= 0x80 ;
1627 Temp2 = Tempax << 2 ; /* Temp2[9]: VRS[9] */
1628 Temp1 |= Temp2 ; /* Temp1[9:0]: VRS[9:0] */
1629 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ; /* Tempax: SRA */
1630 Tempax &= 0x08 ; /* Tempax[3]: VRS[3] */
1631 Temp2 = Tempax ;
1632 Temp2 <<= 7 ; /* Temp2[10]: VRS[10] */
1633 Temp1 |= Temp2 ; /* Temp1[10:0]: VRS[10:0] */
1634
1635 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 11 ] ; /* Tempax: CR11 VRE */
1636 Tempax &= 0x0F ; /* Tempax[3:0]: VRE[3:0] */
1637 Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ; /* Tempbx: SRA */
1638 Tempbx &= 0x20 ; /* Tempbx[5]: VRE[5] */
1639 Tempbx >>= 1 ; /* Tempbx[4]: VRE[4] */
1640 Tempax |= Tempbx ; /* Tempax[4:0]: VRE[4:0] */
1641 Temp2 = Temp1 & 0x7E0 ; /* Temp2[10:5]: VRS[10:5] */
1642 Temp2 |= Tempax ; /* Temp2[10:5]: VRE[10:5] */
1643
1644 Temp3 = Temp1 & 0x1F ; /* Temp3[4:0]: VRS[4:0] */
1645 if ( Tempax < Temp3 ) /* VRE < VRS */
1646 Temp2 |= 0x20 ; /* VRE + 0x20 */
1647
1648 Temp2 &= 0xFF ;
1649 Tempax = (unsigned char)Temp2; /* Tempax: VRE[7:0] */
1650 Tempax <<= 2 ; /* Tempax[7:0]; VRE[5:0]00 */
1651 Temp1 &= 0x600 ; /* Temp1[10:9]: VRS[10:9] */
1652 Temp1 >>= 9 ; /* Temp1[1:0]: VRS[10:9] */
1653 Tempbx = (unsigned char)Temp1;
1654 Tempax |= Tempbx ; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
1655 Tempax &= 0x7F ;
1656 XGINew_SetReg1( pVBInfo->P3c4 , 0x3F , Tempax ) ; /* SR3F D[7:2]->VRE D[1:0]->VRS */
1657 }
1658 }
1659
1660 void XGI_SetXG27CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
1661 unsigned short RefreshRateTableIndex,
1662 struct vb_device_info *pVBInfo)
1663 {
1664 unsigned short StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
1665
1666 if ( ModeNo <= 0x13 )
1667 {
1668 StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ;
1669 Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 4 ] ; /* CR04 HRS */
1670 XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ; /* SR2E [7:0]->HRS */
1671 Tempbx = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 5 ] ; /* Tempbx: CR05 HRE */
1672 Tempbx &= 0x1F ; /* Tempbx: HRE[4:0] */
1673 Tempcx = Tempax ;
1674 Tempcx &= 0xE0 ; /* Tempcx: HRS[7:5] */
1675 Tempdx = Tempcx | Tempbx ; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
1676 if ( Tempbx < ( Tempax & 0x1F ) ) /* IF HRE < HRS */
1677 Tempdx |= 0x20 ; /* Tempdx: HRE = HRE + 0x20 */
1678 Tempdx <<= 2 ; /* Tempdx << 2 */
1679 XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempdx ) ; /* SR2F [7:2]->HRE */
1680 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ;
1681
1682 Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 16 ] ; /* Tempax: CR10 VRS */
1683 XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempax ) ; /* SR34[7:0]->VRS */
1684 Tempcx = Tempax ; /* Tempcx=Tempax=VRS[7:0] */
1685 Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 7 ] ; /* Tempax[7][2]: CR7[7][2] VRS[9][8] */
1686 Tempbx = Tempax ; /* Tempbx=CR07 */
1687 Tempax &= 0x04 ; /* Tempax[2]: CR07[2] VRS[8] */
1688 Tempax >>= 2;
1689 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x01, Tempax ) ; /* SR35 D[0]->VRS D[8] */
1690 Tempcx |= (Tempax << 8) ; /* Tempcx[8] |= VRS[8] */
1691 Tempcx |= (Tempbx & 0x80)<<2; /* Tempcx[9] |= VRS[9] */
1692
1693
1694 Tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 17 ] ; /* CR11 VRE */
1695 Tempax &= 0x0F ; /* Tempax: VRE[3:0] */
1696 Tempbx = Tempcx ; /* Tempbx=Tempcx=VRS[9:0] */
1697 Tempbx &= 0x3F0 ; /* Tempbx[9:4]: VRS[9:4] */
1698 Tempbx |= Tempax ; /* Tempbx[9:0]: VRE[9:0] */
1699 if ( Tempax <= (Tempcx & 0x0F) ) /* VRE[3:0]<=VRS[3:0] */
1700 Tempbx |= 0x10 ; /* Tempbx: VRE + 0x10 */
1701 Tempax = (unsigned char)Tempbx & 0xFF; /* Tempax[7:0]: VRE[7:0] */
1702 Tempax <<= 2 ; /* Tempax << 2: VRE[5:0] */
1703 Tempcx = (Tempcx&0x600)>>8; /* Tempcx VRS[10:9] */
1704 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC, Tempax ) ; /* SR3F D[7:2]->VRE D[5:0] */
1705 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x06, Tempcx ) ; /* SR35 D[2:1]->VRS[10:9] */
1706 }
1707 else
1708 {
1709 index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
1710 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ; /* Tempax: CR4 HRS */
1711 Tempbx = Tempax ; /* Tempbx: HRS[7:0] */
1712 XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , Tempax ) ; /* SR2E[7:0]->HRS */
1713
1714 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ; /* SR0B */
1715 Tempax &= 0xC0 ; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
1716 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
1717
1718 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 4 ] ; /* CR5 HRE */
1719 Tempax &= 0x1F ; /* Tempax[4:0]: HRE[4:0] */
1720 Tempcx = Tempax ; /* Tempcx: HRE[4:0] */
1721
1722 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 6 ] ; /* SRC */
1723 Tempax &= 0x04 ; /* Tempax[2]: HRE[5] */
1724 Tempax <<= 3 ; /* Tempax[5]: HRE[5] */
1725 Tempcx |= Tempax ; /* Tempcx[5:0]: HRE[5:0] */
1726
1727 Tempbx = Tempbx & 0x3C0 ; /* Tempbx[9:6]: HRS[9:6] */
1728 Tempbx |= Tempcx ; /* Tempbx: HRS[9:6]HRE[5:0] */
1729
1730 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 3 ] ; /* Tempax: CR4 HRS */
1731 Tempax &= 0x3F ; /* Tempax: HRS[5:0] */
1732 if( Tempcx <= Tempax ) /* HRE[5:0] < HRS[5:0] */
1733 Tempbx += 0x40 ; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
1734
1735 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 5 ] ; /* SR0B */
1736 Tempax &= 0xC0 ; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
1737 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
1738 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
1739 XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , Tempax ) ; /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
1740 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , 0xE3 , 00 ) ;
1741
1742 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 10 ] ; /* CR10 VRS */
1743 XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , Tempax ) ; /* SR34[7:0]->VRS[7:0] */
1744
1745 Tempcx = Tempax ; /* Tempcx <= VRS[7:0] */
1746 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 9 ] ; /* CR7[7][2] VRS[9][8] */
1747 Tempbx = Tempax ; /* Tempbx <= CR07[7:0] */
1748 Tempax = Tempax & 0x04 ; /* Tempax[2]: CR7[2]: VRS[8] */
1749 Tempax >>= 2 ; /* Tempax[0]: VRS[8] */
1750 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x01 , Tempax ) ; /* SR35[0]: VRS[8] */
1751 Tempcx |= (Tempax<<8) ; /* Tempcx <= VRS[8:0] */
1752 Tempcx |= ((Tempbx&0x80)<<2) ; /* Tempcx <= VRS[9:0] */
1753 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ; /* Tempax: SR0A */
1754 Tempax &= 0x08; /* SR0A[3] VRS[10] */
1755 Tempcx |= (Tempax<<7) ; /* Tempcx <= VRS[10:0] */
1756
1757
1758 Tempax = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 11 ] ; /* Tempax: CR11 VRE */
1759 Tempax &= 0x0F ; /* Tempax[3:0]: VRE[3:0] */
1760 Tempbx = pVBInfo->XGINEWUB_CRT1Table[ index ].CR[ 14 ] ; /* Tempbx: SR0A */
1761 Tempbx &= 0x20 ; /* Tempbx[5]: SR0A[5]: VRE[4] */
1762 Tempbx >>= 1 ; /* Tempbx[4]: VRE[4] */
1763 Tempax |= Tempbx ; /* Tempax[4:0]: VRE[4:0] */
1764 Tempbx = Tempcx ; /* Tempbx: VRS[10:0] */
1765 Tempbx &= 0x7E0 ; /* Tempbx[10:5]: VRS[10:5] */
1766 Tempbx |= Tempax ; /* Tempbx: VRS[10:5]VRE[4:0] */
1767
1768 if ( Tempbx <= Tempcx ) /* VRE <= VRS */
1769 Tempbx |= 0x20 ; /* VRE + 0x20 */
1770
1771 Tempax = (Tempbx<<2) & 0xFF ; /* Tempax: Tempax[7:0]; VRE[5:0]00 */
1772 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC , Tempax ) ; /* SR3F[7:2]:VRE[5:0] */
1773 Tempax = Tempcx >> 8;
1774 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x07 , Tempax ) ; /* SR35[2:0]:VRS[10:8] */
1775 }
1776 }
1777
1778
1779 /* --------------------------------------------------------------------- */
1780 /* Function : XGI_SetXG21LCD */
1781 /* Input : */
1782 /* Output : FCLK duty cycle, FCLK delay compensation */
1783 /* Description : All values set zero */
1784 /* --------------------------------------------------------------------- */
1785 void XGI_SetXG21LCD(struct vb_device_info *pVBInfo,
1786 unsigned short RefreshRateTableIndex,
1787 unsigned short ModeNo)
1788 {
1789 unsigned short Data, Temp, b3CC;
1790 unsigned short XGI_P3cc;
1791
1792 XGI_P3cc = pVBInfo->P3cc ;
1793
1794 XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , 0x00 ) ;
1795 XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , 0x00 ) ;
1796 XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , 0x00 ) ;
1797 XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , 0x00 ) ;
1798 if ( ((*pVBInfo->pDVOSetting)&0xC0) == 0xC0 )
1799 {
1800 XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , *pVBInfo->pCR2E ) ;
1801 XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , *pVBInfo->pCR2F ) ;
1802 XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , *pVBInfo->pCR46 ) ;
1803 XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , *pVBInfo->pCR47 ) ;
1804 }
1805
1806 Temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ;
1807
1808 if ( Temp & 0x01 )
1809 {
1810 XGINew_SetRegOR( pVBInfo->P3c4 , 0x06 , 0x40 ) ; /* 18 bits FP */
1811 XGINew_SetRegOR( pVBInfo->P3c4 , 0x09 , 0x40 ) ;
1812 }
1813
1814 XGINew_SetRegOR( pVBInfo->P3c4 , 0x1E , 0x01 ) ; /* Negative blank polarity */
1815
1816 XGINew_SetRegAND( pVBInfo->P3c4 , 0x30 , ~0x20 ) ;
1817 XGINew_SetRegAND( pVBInfo->P3c4 , 0x35 , ~0x80 ) ;
1818
1819 if ( ModeNo <= 0x13 )
1820 {
1821 b3CC = (unsigned char) XGINew_GetReg2(XGI_P3cc);
1822 if ( b3CC & 0x40 )
1823 XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */
1824 if ( b3CC & 0x80 )
1825 XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */
1826 }
1827 else
1828 {
1829 Data = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
1830 if ( Data & 0x4000 )
1831 XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */
1832 if ( Data & 0x8000 )
1833 XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */
1834 }
1835 }
1836
1837 void XGI_SetXG27LCD(struct vb_device_info *pVBInfo,
1838 unsigned short RefreshRateTableIndex,
1839 unsigned short ModeNo)
1840 {
1841 unsigned short Data , Temp , b3CC ;
1842 unsigned short XGI_P3cc ;
1843
1844 XGI_P3cc = pVBInfo->P3cc ;
1845
1846 XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , 0x00 ) ;
1847 XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , 0x00 ) ;
1848 XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , 0x00 ) ;
1849 XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , 0x00 ) ;
1850
1851 Temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ;
1852 if ( ( Temp & 0x03 ) == 0 ) /* dual 12 */
1853 {
1854 XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , 0x13 ) ;
1855 XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , 0x13 ) ;
1856 }
1857
1858 if ( ((*pVBInfo->pDVOSetting)&0xC0) == 0xC0 )
1859 {
1860 XGINew_SetReg1( pVBInfo->P3d4 , 0x2E , *pVBInfo->pCR2E ) ;
1861 XGINew_SetReg1( pVBInfo->P3d4 , 0x2F , *pVBInfo->pCR2F ) ;
1862 XGINew_SetReg1( pVBInfo->P3d4 , 0x46 , *pVBInfo->pCR46 ) ;
1863 XGINew_SetReg1( pVBInfo->P3d4 , 0x47 , *pVBInfo->pCR47 ) ;
1864 }
1865
1866 XGI_SetXG27FPBits(pVBInfo);
1867
1868 XGINew_SetRegOR( pVBInfo->P3c4 , 0x1E , 0x01 ) ; /* Negative blank polarity */
1869
1870 XGINew_SetRegAND( pVBInfo->P3c4 , 0x30 , ~0x20 ) ; /* Hsync polarity */
1871 XGINew_SetRegAND( pVBInfo->P3c4 , 0x35 , ~0x80 ) ; /* Vsync polarity */
1872
1873 if ( ModeNo <= 0x13 )
1874 {
1875 b3CC = (unsigned char) XGINew_GetReg2(XGI_P3cc);
1876 if ( b3CC & 0x40 )
1877 XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */
1878 if ( b3CC & 0x80 )
1879 XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */
1880 }
1881 else
1882 {
1883 Data = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
1884 if ( Data & 0x4000 )
1885 XGINew_SetRegOR( pVBInfo->P3c4 , 0x30 , 0x20 ) ; /* Hsync polarity */
1886 if ( Data & 0x8000 )
1887 XGINew_SetRegOR( pVBInfo->P3c4 , 0x35 , 0x80 ) ; /* Vsync polarity */
1888 }
1889 }
1890
1891 /* --------------------------------------------------------------------- */
1892 /* Function : XGI_UpdateXG21CRTC */
1893 /* Input : */
1894 /* Output : CRT1 CRTC */
1895 /* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
1896 /* --------------------------------------------------------------------- */
1897 void XGI_UpdateXG21CRTC(unsigned short ModeNo,
1898 struct vb_device_info *pVBInfo,
1899 unsigned short RefreshRateTableIndex)
1900 {
1901 int i , index = -1;
1902
1903 XGINew_SetRegAND( pVBInfo->P3d4 , 0x11 , 0x7F ) ; /* Unlock CR0~7 */
1904 if ( ModeNo <= 0x13 )
1905 {
1906 for( i = 0 ; i < 12 ; i++ )
1907 {
1908 if ( ModeNo == pVBInfo->UpdateCRT1[ i ].ModeID )
1909 index = i ;
1910 }
1911 }
1912 else
1913 {
1914 if ( ModeNo == 0x2E && ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC == RES640x480x60 ) )
1915 index = 12 ;
1916 else if ( ModeNo == 0x2E && ( pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC == RES640x480x72 ) )
1917 index = 13 ;
1918 else if ( ModeNo == 0x2F )
1919 index = 14 ;
1920 else if ( ModeNo == 0x50 )
1921 index = 15 ;
1922 else if ( ModeNo == 0x59 )
1923 index = 16 ;
1924 }
1925
1926 if( index != -1 )
1927 {
1928 XGINew_SetReg1( pVBInfo->P3d4 , 0x02 , pVBInfo->UpdateCRT1[ index ].CR02 ) ;
1929 XGINew_SetReg1( pVBInfo->P3d4 , 0x03 , pVBInfo->UpdateCRT1[ index ].CR03 ) ;
1930 XGINew_SetReg1( pVBInfo->P3d4 , 0x15 , pVBInfo->UpdateCRT1[ index ].CR15 ) ;
1931 XGINew_SetReg1( pVBInfo->P3d4 , 0x16 , pVBInfo->UpdateCRT1[ index ].CR16 ) ;
1932 }
1933 }
1934
1935
1936 /* --------------------------------------------------------------------- */
1937 /* Function : XGI_SetCRT1DE */
1938 /* Input : */
1939 /* Output : */
1940 /* Description : */
1941 /* --------------------------------------------------------------------- */
1942 void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
1943 unsigned short ModeNo,
1944 unsigned short ModeIdIndex,
1945 unsigned short RefreshRateTableIndex,
1946 struct vb_device_info *pVBInfo)
1947 {
1948 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
1949
1950 unsigned char data;
1951
1952 resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
1953
1954 if ( ModeNo <= 0x13 )
1955 {
1956 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
1957 tempax = pVBInfo->StResInfo[ resindex ].HTotal ;
1958 tempbx = pVBInfo->StResInfo[ resindex ].VTotal ;
1959 }
1960 else
1961 {
1962 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
1963 tempax = pVBInfo->ModeResInfo[ resindex ].HTotal ;
1964 tempbx = pVBInfo->ModeResInfo[ resindex ].VTotal ;
1965 }
1966
1967 if ( modeflag & HalfDCLK )
1968 tempax = tempax >> 1 ;
1969
1970 if ( ModeNo > 0x13 )
1971 {
1972 if ( modeflag & HalfDCLK )
1973 tempax = tempax << 1 ;
1974
1975 temp = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
1976
1977 if ( temp & InterlaceMode )
1978 tempbx = tempbx >> 1 ;
1979
1980 if ( modeflag & DoubleScanMode )
1981 tempbx = tempbx << 1 ;
1982 }
1983
1984 tempcx = 8 ;
1985
1986 /* if ( !( modeflag & Charx8Dot ) ) */
1987 /* tempcx = 9 ; */
1988
1989 tempax /= tempcx ;
1990 tempax -= 1 ;
1991 tempbx -= 1 ;
1992 tempcx = tempax ;
1993 temp = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11);
1994 data = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11);
1995 data &= 0x7F ;
1996 XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , data ) ; /* Unlock CRTC */
1997 XGINew_SetReg1(pVBInfo->P3d4, 0x01, (unsigned short)(tempcx & 0xff));
1998 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x0b, ~0x0c, (unsigned short)((tempcx & 0x0ff00) >> 10));
1999 XGINew_SetReg1(pVBInfo->P3d4, 0x12, (unsigned short)(tempbx & 0xff));
2000 tempax = 0 ;
2001 tempbx = tempbx >> 8 ;
2002
2003 if ( tempbx & 0x01 )
2004 tempax |= 0x02 ;
2005
2006 if ( tempbx & 0x02 )
2007 tempax |= 0x40 ;
2008
2009 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x42 , tempax ) ;
2010 data = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x07);
2011 data &= 0xFF ;
2012 tempax = 0 ;
2013
2014 if ( tempbx & 0x04 )
2015 tempax |= 0x02 ;
2016
2017 XGINew_SetRegANDOR( pVBInfo->P3d4 ,0x0a , ~0x02 , tempax ) ;
2018 XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , temp ) ;
2019 }
2020
2021
2022 /* --------------------------------------------------------------------- */
2023 /* Function : XGI_GetResInfo */
2024 /* Input : */
2025 /* Output : */
2026 /* Description : */
2027 /* --------------------------------------------------------------------- */
2028 unsigned short XGI_GetResInfo(unsigned short ModeNo,
2029 unsigned short ModeIdIndex,
2030 struct vb_device_info *pVBInfo)
2031 {
2032 unsigned short resindex;
2033
2034 if ( ModeNo <= 0x13 )
2035 {
2036 resindex = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ; /* si+St_ResInfo */
2037 }
2038 else
2039 {
2040 resindex = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ; /* si+Ext_ResInfo */
2041 }
2042 return( resindex ) ;
2043 }
2044
2045
2046 /* --------------------------------------------------------------------- */
2047 /* Function : XGI_SetCRT1Offset */
2048 /* Input : */
2049 /* Output : */
2050 /* Description : */
2051 /* --------------------------------------------------------------------- */
2052 void XGI_SetCRT1Offset(unsigned short ModeNo,
2053 unsigned short ModeIdIndex,
2054 unsigned short RefreshRateTableIndex,
2055 struct xgi_hw_device_info *HwDeviceExtension,
2056 struct vb_device_info *pVBInfo)
2057 {
2058 unsigned short temp ,
2059 ah ,
2060 al ,
2061 temp2 ,
2062 i ,
2063 DisplayUnit ;
2064
2065 /* GetOffset */
2066 temp = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeInfo ;
2067 temp = temp >> 8 ;
2068 temp = pVBInfo->ScreenOffset[ temp ] ;
2069
2070 temp2 = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
2071 temp2 &= InterlaceMode ;
2072
2073 if ( temp2 )
2074 temp = temp << 1;
2075
2076 temp2 = pVBInfo->ModeType - ModeEGA ;
2077
2078 switch( temp2 )
2079 {
2080 case 0:
2081 temp2 = 1 ;
2082 break ;
2083 case 1:
2084 temp2 = 2 ;
2085 break ;
2086 case 2:
2087 temp2 = 4 ;
2088 break ;
2089 case 3:
2090 temp2 = 4 ;
2091 break ;
2092 case 4:
2093 temp2 = 6 ;
2094 break;
2095 case 5:
2096 temp2 = 8 ;
2097 break ;
2098 default:
2099 break ;
2100 }
2101
2102 if ( ( ModeNo >= 0x26 ) && ( ModeNo <= 0x28 ) )
2103 temp = temp * temp2 + temp2 / 2 ;
2104 else
2105 temp *= temp2 ;
2106
2107 /* SetOffset */
2108 DisplayUnit = temp ;
2109 temp2 = temp ;
2110 temp = temp >> 8 ; /* ah */
2111 temp &= 0x0F ;
2112 i = XGINew_GetReg1( pVBInfo->P3c4 , 0x0E ) ;
2113 i &= 0xF0 ;
2114 i |= temp ;
2115 XGINew_SetReg1( pVBInfo->P3c4 , 0x0E , i ) ;
2116
2117 temp = (unsigned char)temp2;
2118 temp &= 0xFF ; /* al */
2119 XGINew_SetReg1( pVBInfo->P3d4 , 0x13 , temp ) ;
2120
2121 /* SetDisplayUnit */
2122 temp2 = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
2123 temp2 &= InterlaceMode ;
2124 if ( temp2 )
2125 DisplayUnit >>= 1 ;
2126
2127 DisplayUnit = DisplayUnit << 5 ;
2128 ah = ( DisplayUnit & 0xff00 ) >> 8 ;
2129 al = DisplayUnit & 0x00ff ;
2130 if ( al == 0 )
2131 ah += 1 ;
2132 else
2133 ah += 2 ;
2134
2135 if ( HwDeviceExtension->jChipType >= XG20 )
2136 if ( ( ModeNo == 0x4A ) | (ModeNo == 0x49 ) )
2137 ah -= 1 ;
2138
2139 XGINew_SetReg1( pVBInfo->P3c4 , 0x10 , ah ) ;
2140 }
2141
2142
2143 /* --------------------------------------------------------------------- */
2144 /* Function : XGI_SetCRT1VCLK */
2145 /* Input : */
2146 /* Output : */
2147 /* Description : */
2148 /* --------------------------------------------------------------------- */
2149 void XGI_SetCRT1VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
2150 struct xgi_hw_device_info *HwDeviceExtension,
2151 unsigned short RefreshRateTableIndex,
2152 struct vb_device_info *pVBInfo)
2153 {
2154 unsigned char index, data;
2155 unsigned short vclkindex ;
2156
2157 if ( pVBInfo->IF_DEF_LVDS == 1 )
2158 {
2159 index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;
2160 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x31 ) & 0xCF ;
2161 XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , data ) ;
2162 XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ index ].SR2B ) ;
2163 XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ index ].SR2C ) ;
2164 XGINew_SetReg1( pVBInfo->P3c4 , 0x2D , 0x01 ) ;
2165 }
2166 else if ( ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) && ( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
2167 {
2168 vclkindex = XGI_GetVCLK2Ptr( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
2169 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x31 ) & 0xCF ;
2170 XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , data ) ;
2171 data = pVBInfo->VBVCLKData[ vclkindex ].Part4_A ;
2172 XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , data ) ;
2173 data = pVBInfo->VBVCLKData[ vclkindex ].Part4_B ;
2174 XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , data ) ;
2175 XGINew_SetReg1( pVBInfo->P3c4 , 0x2D , 0x01 ) ;
2176 }
2177 else
2178 {
2179 index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;
2180 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x31 ) & 0xCF ;
2181 XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , data ) ;
2182 XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->VCLKData[ index ].SR2B ) ;
2183 XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->VCLKData[ index ].SR2C ) ;
2184 XGINew_SetReg1( pVBInfo->P3c4 , 0x2D , 0x01 ) ;
2185 }
2186
2187 if ( HwDeviceExtension->jChipType >= XG20 )
2188 {
2189 if ( pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag & HalfDCLK )
2190 {
2191 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x2B ) ;
2192 XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , data ) ;
2193 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x2C ) ;
2194 index = data ;
2195 index &= 0xE0 ;
2196 data &= 0x1F ;
2197 data = data << 1 ;
2198 data += 1 ;
2199 data |= index ;
2200 XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , data ) ;
2201 }
2202 }
2203 }
2204
2205
2206 /* --------------------------------------------------------------------- */
2207 /* Function : XGI_SetCRT1FIFO */
2208 /* Input : */
2209 /* Output : */
2210 /* Description : */
2211 /* --------------------------------------------------------------------- */
2212 void XGI_SetCRT1FIFO(unsigned short ModeNo,
2213 struct xgi_hw_device_info *HwDeviceExtension,
2214 struct vb_device_info *pVBInfo)
2215 {
2216 unsigned short data ;
2217
2218 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x3D ) ;
2219 data &= 0xfe ;
2220 XGINew_SetReg1( pVBInfo->P3c4 , 0x3D , data ) ; /* diable auto-threshold */
2221
2222 if ( ModeNo > 0x13 )
2223 {
2224 XGINew_SetReg1( pVBInfo->P3c4 , 0x08 , 0x34 ) ;
2225 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x09 ) ;
2226 data &= 0xC0 ;
2227 XGINew_SetReg1( pVBInfo->P3c4 , 0x09 , data | 0x30) ;
2228 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x3D ) ;
2229 data |= 0x01 ;
2230 XGINew_SetReg1( pVBInfo->P3c4 , 0x3D , data ) ;
2231 }
2232 else
2233 {
2234 if (HwDeviceExtension->jChipType == XG27)
2235 {
2236 XGINew_SetReg1( pVBInfo->P3c4 , 0x08 , 0x0E ) ;
2237 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x09 ) ;
2238 data &= 0xC0 ;
2239 XGINew_SetReg1( pVBInfo->P3c4 , 0x09 , data | 0x20 ) ;
2240 }
2241 else
2242 {
2243 XGINew_SetReg1( pVBInfo->P3c4 , 0x08 , 0xAE ) ;
2244 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x09 ) ;
2245 data &= 0xF0 ;
2246 XGINew_SetReg1( pVBInfo->P3c4 , 0x09 , data ) ;
2247 }
2248 }
2249
2250 if (HwDeviceExtension->jChipType == XG21)
2251 {
2252 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
2253 }
2254 }
2255
2256
2257 /* --------------------------------------------------------------------- */
2258 /* Function : XGI_SetCRT1ModeRegs */
2259 /* Input : */
2260 /* Output : */
2261 /* Description : */
2262 /* --------------------------------------------------------------------- */
2263 void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
2264 unsigned short ModeNo, unsigned short ModeIdIndex,
2265 unsigned short RefreshRateTableIndex,
2266 struct vb_device_info *pVBInfo)
2267 {
2268 unsigned short data ,
2269 data2 ,
2270 data3 ,
2271 infoflag = 0 ,
2272 modeflag ,
2273 resindex ,
2274 xres ;
2275
2276 if ( ModeNo > 0x13 )
2277 {
2278 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
2279 infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
2280 }
2281 else
2282 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; /* si+St_ModeFlag */
2283
2284 if ( XGINew_GetReg1( pVBInfo->P3d4 , 0x31 ) & 0x01 )
2285 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x1F , 0x3F , 0x00 ) ;
2286
2287 if ( ModeNo > 0x13 )
2288 data = infoflag ;
2289 else
2290 data = 0 ;
2291
2292 data2 = 0 ;
2293
2294 if ( ModeNo > 0x13 )
2295 {
2296 if ( pVBInfo->ModeType > 0x02 )
2297 {
2298 data2 |= 0x02 ;
2299 data3 = pVBInfo->ModeType - ModeVGA ;
2300 data3 = data3 << 2 ;
2301 data2 |= data3 ;
2302 }
2303 }
2304
2305 data &= InterlaceMode ;
2306
2307 if ( data )
2308 data2 |= 0x20 ;
2309
2310 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x06 , ~0x3F , data2 ) ;
2311 /* XGINew_SetReg1(pVBInfo->P3c4,0x06,data2); */
2312 resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
2313 if ( ModeNo <= 0x13 )
2314 xres = pVBInfo->StResInfo[ resindex ].HTotal ;
2315 else
2316 xres = pVBInfo->ModeResInfo[ resindex ].HTotal ; /* xres->ax */
2317
2318 data = 0x0000 ;
2319 if ( infoflag & InterlaceMode )
2320 {
2321 if ( xres == 1024 )
2322 data = 0x0035 ;
2323 else if ( xres == 1280 )
2324 data = 0x0048 ;
2325 }
2326
2327 data2 = data & 0x00FF ;
2328 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x19 , 0xFF , data2 ) ;
2329 data2 = ( data & 0xFF00 ) >> 8 ;
2330 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x19 , 0xFC , data2 ) ;
2331
2332 if( modeflag & HalfDCLK )
2333 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xF7 , 0x08 ) ;
2334
2335 data2 = 0 ;
2336
2337 if ( modeflag & LineCompareOff )
2338 data2 |= 0x08 ;
2339
2340 if ( ModeNo > 0x13 )
2341 {
2342 if ( pVBInfo->ModeType == ModeEGA )
2343 data2 |= 0x40 ;
2344 }
2345
2346 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0F , ~0x48 , data2 ) ;
2347 data = 0x60 ;
2348 if ( pVBInfo->ModeType != ModeText )
2349 {
2350 data = data ^ 0x60 ;
2351 if ( pVBInfo->ModeType != ModeEGA )
2352 {
2353 data = data ^ 0xA0 ;
2354 }
2355 }
2356 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x21 , 0x1F , data ) ;
2357
2358 XGI_SetVCLKState( HwDeviceExtension , ModeNo , RefreshRateTableIndex, pVBInfo) ;
2359
2360 /* if(modeflag&HalfDCLK)//030305 fix lowresolution bug */
2361 /* if(XGINew_IF_DEF_NEW_LOWRES) */
2362 /* XGI_VesaLowResolution(ModeNo,ModeIdIndex);//030305 fix lowresolution bug */
2363
2364 data=XGINew_GetReg1( pVBInfo->P3d4 , 0x31 ) ;
2365
2366 if (HwDeviceExtension->jChipType == XG27 )
2367 {
2368 if ( data & 0x40 )
2369 data = 0x2c ;
2370 else
2371 data = 0x6c ;
2372 XGINew_SetReg1( pVBInfo->P3d4 , 0x52 , data ) ;
2373 XGINew_SetRegOR( pVBInfo->P3d4 , 0x51 , 0x10 ) ;
2374 }
2375 else
2376 if (HwDeviceExtension->jChipType >= XG20 )
2377 {
2378 if ( data & 0x40 )
2379 data = 0x33 ;
2380 else
2381 data = 0x73 ;
2382 XGINew_SetReg1( pVBInfo->P3d4 , 0x52 , data ) ;
2383 XGINew_SetReg1( pVBInfo->P3d4 , 0x51 , 0x02 ) ;
2384 }
2385 else
2386 {
2387 if ( data & 0x40 )
2388 data = 0x2c ;
2389 else
2390 data = 0x6c ;
2391 XGINew_SetReg1( pVBInfo->P3d4 , 0x52 , data ) ;
2392 }
2393
2394 }
2395
2396
2397 /* --------------------------------------------------------------------- */
2398 /* Function : XGI_SetVCLKState */
2399 /* Input : */
2400 /* Output : */
2401 /* Description : */
2402 /* --------------------------------------------------------------------- */
2403 void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
2404 unsigned short ModeNo,
2405 unsigned short RefreshRateTableIndex,
2406 struct vb_device_info *pVBInfo)
2407 {
2408 unsigned short data ,
2409 data2 = 0 ;
2410 short VCLK ;
2411
2412 unsigned char index;
2413
2414 if ( ModeNo <= 0x13 )
2415 VCLK = 0 ;
2416 else
2417 {
2418 index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;
2419 index &= IndexMask ;
2420 VCLK = pVBInfo->VCLKData[ index ].CLOCK ;
2421 }
2422
2423 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x32 ) ;
2424 data &= 0xf3 ;
2425 if ( VCLK >= 200 )
2426 data |= 0x0c ; /* VCLK > 200 */
2427
2428 if ( HwDeviceExtension->jChipType >= XG20 )
2429 data &= ~0x04 ; /* 2 pixel mode */
2430
2431 XGINew_SetReg1( pVBInfo->P3c4 , 0x32 , data ) ;
2432
2433 if ( HwDeviceExtension->jChipType < XG20 )
2434 {
2435 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x1F ) ;
2436 data &= 0xE7 ;
2437 if ( VCLK < 200 )
2438 data |= 0x10 ;
2439 XGINew_SetReg1( pVBInfo->P3c4 , 0x1F , data ) ;
2440 }
2441
2442 /* Jong for Adavantech LCD ripple issue
2443 if ( ( VCLK >= 0 ) && ( VCLK < 135 ) )
2444 data2 = 0x03 ;
2445 else if ( ( VCLK >= 135 ) && ( VCLK < 160 ) )
2446 data2 = 0x02 ;
2447 else if ( ( VCLK >= 160 ) && ( VCLK < 260 ) )
2448 data2 = 0x01 ;
2449 else if ( VCLK > 260 )
2450 data2 = 0x00 ;
2451 */
2452 data2 = 0x00 ;
2453
2454 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x07 , 0xFC , data2 ) ;
2455 if (HwDeviceExtension->jChipType >= XG27 )
2456 {
2457 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x40 , 0xFC , data2&0x03 ) ;
2458 }
2459
2460
2461 }
2462
2463
2464 /* --------------------------------------------------------------------- */
2465 /* Function : XGI_VesaLowResolution */
2466 /* Input : */
2467 /* Output : */
2468 /* Description : */
2469 /* --------------------------------------------------------------------- */
2470 /*void XGI_VesaLowResolution(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
2471 {
2472 unsigned short modeflag;
2473
2474 if ( ModeNo > 0x13 )
2475 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
2476 else
2477 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
2478
2479 if ( ModeNo > 0x13 )
2480 {
2481 if ( modeflag & DoubleScanMode )
2482 {
2483 if ( modeflag & HalfDCLK )
2484 {
2485 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
2486 {
2487 if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) )
2488 {
2489 if ( pVBInfo->VBInfo & SetInSlaveMode )
2490 {
2491 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xf7 , 0x00 ) ;
2492 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0x7f , 0x00 ) ;
2493 return ;
2494 }
2495 }
2496 }
2497 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0xff , 0x80 ) ;
2498 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xf7 , 0x00 ) ;
2499 return ;
2500 }
2501 }
2502 }
2503 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0f , 0x7f , 0x00 ) ;
2504 }
2505 */
2506
2507 /* --------------------------------------------------------------------- */
2508 /* Function : XGI_LoadDAC */
2509 /* Input : */
2510 /* Output : */
2511 /* Description : */
2512 /* --------------------------------------------------------------------- */
2513 void XGI_LoadDAC(unsigned short ModeNo,
2514 unsigned short ModeIdIndex,
2515 struct vb_device_info *pVBInfo)
2516 {
2517 unsigned short data , data2 , time ,
2518 i , j , k , m , n , o ,
2519 si , di , bx , dl , al , ah , dh ,
2520 *table = NULL ;
2521
2522 if ( ModeNo <= 0x13 )
2523 data = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
2524 else
2525 data = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
2526
2527 data &= DACInfoFlag ;
2528 time = 64 ;
2529
2530 if ( data == 0x00 )
2531 table = XGINew_MDA_DAC ;
2532 else if ( data == 0x08 )
2533 table = XGINew_CGA_DAC ;
2534 else if ( data == 0x10 )
2535 table = XGINew_EGA_DAC ;
2536 else if ( data == 0x18 )
2537 {
2538 time = 256 ;
2539 table = XGINew_VGA_DAC ;
2540 }
2541
2542 if ( time == 256 )
2543 j = 16 ;
2544 else
2545 j = time ;
2546
2547 XGINew_SetReg3( pVBInfo->P3c6 , 0xFF ) ;
2548 XGINew_SetReg3( pVBInfo->P3c8 , 0x00 ) ;
2549
2550 for( i = 0 ; i < j ; i++ )
2551 {
2552 data = table[ i ] ;
2553
2554 for( k = 0 ; k < 3 ; k++ )
2555 {
2556 data2 = 0 ;
2557
2558 if ( data & 0x01 )
2559 data2 = 0x2A ;
2560
2561 if ( data & 0x02 )
2562 data2 += 0x15 ;
2563
2564 XGINew_SetReg3( pVBInfo->P3c9 , data2 ) ;
2565 data = data >> 2 ;
2566 }
2567 }
2568
2569 if ( time == 256 )
2570 {
2571 for( i = 16 ; i < 32 ; i++ )
2572 {
2573 data = table[ i ] ;
2574
2575 for( k = 0 ; k < 3 ; k++ )
2576 XGINew_SetReg3( pVBInfo->P3c9 , data ) ;
2577 }
2578
2579 si = 32 ;
2580
2581 for( m = 0 ; m < 9 ; m++ )
2582 {
2583 di = si ;
2584 bx = si + 0x04 ;
2585 dl = 0 ;
2586
2587 for( n = 0 ; n < 3 ; n++ )
2588 {
2589 for( o = 0 ; o < 5 ; o++ )
2590 {
2591 dh = table[ si ] ;
2592 ah = table[ di ] ;
2593 al = table[ bx ] ;
2594 si++ ;
2595 XGI_WriteDAC( dl , ah , al , dh, pVBInfo ) ;
2596 }
2597
2598 si -= 2 ;
2599
2600 for( o = 0 ; o < 3 ; o++ )
2601 {
2602 dh = table[ bx ] ;
2603 ah = table[ di ] ;
2604 al = table[ si ] ;
2605 si-- ;
2606 XGI_WriteDAC( dl , ah , al , dh, pVBInfo ) ;
2607 }
2608
2609 dl++ ;
2610 }
2611
2612 si += 5 ;
2613 }
2614 }
2615 }
2616
2617
2618 /* --------------------------------------------------------------------- */
2619 /* Function : XGI_WriteDAC */
2620 /* Input : */
2621 /* Output : */
2622 /* Description : */
2623 /* --------------------------------------------------------------------- */
2624 void XGI_WriteDAC(unsigned short dl, unsigned short ah,
2625 unsigned short al, unsigned short dh,
2626 struct vb_device_info *pVBInfo)
2627 {
2628 unsigned short temp , bh , bl ;
2629
2630 bh = ah ;
2631 bl = al ;
2632
2633 if ( dl != 0 )
2634 {
2635 temp = bh ;
2636 bh = dh ;
2637 dh = temp ;
2638 if ( dl == 1 )
2639 {
2640 temp = bl ;
2641 bl = dh ;
2642 dh = temp ;
2643 }
2644 else
2645 {
2646 temp = bl ;
2647 bl = bh ;
2648 bh = temp ;
2649 }
2650 }
2651 XGINew_SetReg3(pVBInfo->P3c9, (unsigned short)dh);
2652 XGINew_SetReg3(pVBInfo->P3c9, (unsigned short)bh);
2653 XGINew_SetReg3(pVBInfo->P3c9, (unsigned short)bl);
2654 }
2655
2656 /* --------------------------------------------------------------------- */
2657 /* Function : XGI_SetLCDAGroup */
2658 /* Input : */
2659 /* Output : */
2660 /* Description : */
2661 /* --------------------------------------------------------------------- */
2662 void XGI_SetLCDAGroup(unsigned short ModeNo,
2663 unsigned short ModeIdIndex,
2664 struct xgi_hw_device_info *HwDeviceExtension,
2665 struct vb_device_info *pVBInfo)
2666 {
2667 unsigned short RefreshRateTableIndex ;
2668 /* unsigned short temp ; */
2669
2670 /* pVBInfo->SelectCRT2Rate = 0 ; */
2671
2672 pVBInfo->SetFlag |= ProgrammingCRT2 ;
2673 RefreshRateTableIndex = XGI_GetRatePtrCRT2( HwDeviceExtension, ModeNo , ModeIdIndex, pVBInfo ) ;
2674 XGI_GetLVDSResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
2675 XGI_GetLVDSData( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo);
2676 XGI_ModCRT1Regs( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
2677 XGI_SetLVDSRegs( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
2678 XGI_SetCRT2ECLK( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
2679 }
2680
2681
2682 /* --------------------------------------------------------------------- */
2683 /* Function : XGI_GetLVDSResInfo */
2684 /* Input : */
2685 /* Output : */
2686 /* Description : */
2687 /* --------------------------------------------------------------------- */
2688 void XGI_GetLVDSResInfo(unsigned short ModeNo,
2689 unsigned short ModeIdIndex,
2690 struct vb_device_info *pVBInfo)
2691 {
2692 unsigned short resindex , xres , yres , modeflag ;
2693
2694 if ( ModeNo <= 0x13 )
2695 {
2696 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ; /* si+St_ResInfo */
2697 }
2698 else
2699 {
2700 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ; /* si+Ext_ResInfo */
2701 }
2702
2703
2704 /* if ( ModeNo > 0x13 ) */
2705 /* modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; */
2706 /* else */
2707 /* modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; */
2708
2709 if ( ModeNo <= 0x13 )
2710 {
2711 resindex = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ; /* si+St_ResInfo */
2712 }
2713 else
2714 {
2715 resindex = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ; /* si+Ext_ResInfo */
2716 }
2717
2718 /* resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ; */
2719
2720 if ( ModeNo <= 0x13 )
2721 {
2722 xres = pVBInfo->StResInfo[ resindex ].HTotal ;
2723 yres = pVBInfo->StResInfo[ resindex ].VTotal ;
2724 }
2725 else
2726 {
2727 xres = pVBInfo->ModeResInfo[ resindex ].HTotal ;
2728 yres = pVBInfo->ModeResInfo[ resindex ].VTotal ;
2729 }
2730 if ( ModeNo > 0x13 )
2731 {
2732 if ( modeflag & HalfDCLK )
2733 xres = xres << 1 ;
2734
2735 if ( modeflag & DoubleScanMode )
2736 yres = yres << 1 ;
2737 }
2738 /* if ( modeflag & Charx8Dot ) */
2739 /* { */
2740
2741 if ( xres == 720 )
2742 xres = 640 ;
2743
2744 /* } */
2745 pVBInfo->VGAHDE = xres ;
2746 pVBInfo->HDE = xres ;
2747 pVBInfo->VGAVDE = yres ;
2748 pVBInfo->VDE = yres ;
2749 }
2750
2751
2752 /* --------------------------------------------------------------------- */
2753 /* Function : XGI_GetLVDSData */
2754 /* Input : */
2755 /* Output : */
2756 /* Description : */
2757 /* --------------------------------------------------------------------- */
2758 void XGI_GetLVDSData(unsigned short ModeNo,
2759 unsigned short ModeIdIndex,
2760 unsigned short RefreshRateTableIndex,
2761 struct vb_device_info *pVBInfo)
2762 {
2763 unsigned short tempbx ;
2764 struct XGI330_LVDSDataStruct *LCDPtr = NULL ;
2765 struct XGI330_CHTVDataStruct *TVPtr = NULL ;
2766
2767 tempbx = 2 ;
2768
2769 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
2770 {
2771 LCDPtr = (struct XGI330_LVDSDataStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
2772 pVBInfo->VGAHT = LCDPtr->VGAHT ;
2773 pVBInfo->VGAVT = LCDPtr->VGAVT ;
2774 pVBInfo->HT = LCDPtr->LCDHT ;
2775 pVBInfo->VT = LCDPtr->LCDVT ;
2776 }
2777 if ( pVBInfo->IF_DEF_CH7017 == 1 )
2778 {
2779 if ( pVBInfo->VBInfo & SetCRT2ToTV )
2780 {
2781 TVPtr = (struct XGI330_CHTVDataStruct *)XGI_GetTVPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
2782 pVBInfo->VGAHT = TVPtr->VGAHT ;
2783 pVBInfo->VGAVT = TVPtr->VGAVT ;
2784 pVBInfo->HT = TVPtr->LCDHT ;
2785 pVBInfo->VT = TVPtr->LCDVT ;
2786 }
2787 }
2788
2789 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
2790 {
2791 if ( !( pVBInfo->LCDInfo & ( SetLCDtoNonExpanding | EnableScalingLCD ) ) )
2792 {
2793 if ( ( pVBInfo->LCDResInfo == Panel1024x768 ) || ( pVBInfo->LCDResInfo == Panel1024x768x75 ) )
2794 {
2795 pVBInfo->HDE = 1024 ;
2796 pVBInfo->VDE = 768 ;
2797 }
2798 else if ( ( pVBInfo->LCDResInfo == Panel1280x1024 ) || ( pVBInfo->LCDResInfo == Panel1280x1024x75 ) )
2799 {
2800 pVBInfo->HDE = 1280 ;
2801 pVBInfo->VDE = 1024 ;
2802 }
2803 else if ( pVBInfo->LCDResInfo == Panel1400x1050 )
2804 {
2805 pVBInfo->HDE = 1400 ;
2806 pVBInfo->VDE = 1050 ;
2807 }
2808 else
2809 {
2810 pVBInfo->HDE = 1600 ;
2811 pVBInfo->VDE = 1200 ;
2812 }
2813 }
2814 }
2815 }
2816
2817
2818 /* --------------------------------------------------------------------- */
2819 /* Function : XGI_ModCRT1Regs */
2820 /* Input : */
2821 /* Output : */
2822 /* Description : */
2823 /* --------------------------------------------------------------------- */
2824 void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
2825 unsigned short RefreshRateTableIndex,
2826 struct xgi_hw_device_info *HwDeviceExtension,
2827 struct vb_device_info *pVBInfo)
2828 {
2829 unsigned char index;
2830 unsigned short tempbx , i ;
2831 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
2832 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
2833 /* struct XGI330_CHTVDataStruct *TVPtr = NULL ; */
2834 struct XGI_CH7007TV_TimingHStruct *CH7007TV_TimingHPtr = NULL;
2835 struct XGI_CH7007TV_TimingVStruct *CH7007TV_TimingVPtr = NULL;
2836
2837 if( ModeNo <= 0x13 )
2838 index = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
2839 else
2840 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
2841
2842 index= index & IndexMask ;
2843
2844 if ( ( pVBInfo->IF_DEF_ScaleLCD == 0 ) || ( ( pVBInfo->IF_DEF_ScaleLCD == 1 ) && ( !( pVBInfo->LCDInfo & EnableScalingLCD ) ) ) )
2845 {
2846 tempbx = 0 ;
2847
2848 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
2849 {
2850 LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
2851
2852 for( i = 0 ; i < 8 ; i++ )
2853 pVBInfo->TimingH[ 0 ].data[ i ] = LCDPtr[ 0 ].Reg[ i ] ;
2854 }
2855
2856 if ( pVBInfo->IF_DEF_CH7007 == 1 )
2857 {
2858 if ( pVBInfo->VBInfo & SetCRT2ToTV )
2859 {
2860 CH7007TV_TimingHPtr = (struct XGI_CH7007TV_TimingHStruct *)XGI_GetTVPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
2861
2862 for( i = 0 ; i < 8 ; i++ )
2863 pVBInfo->TimingH[ 0 ].data[ i ] = CH7007TV_TimingHPtr[ 0 ].data[ i ] ;
2864 }
2865 }
2866
2867 /* if ( pVBInfo->IF_DEF_CH7017 == 1 )
2868 {
2869 if ( pVBInfo->VBInfo & SetCRT2ToTV )
2870 TVPtr = ( struct XGI330_CHTVDataStruct *)XGI_GetTVPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
2871 } */
2872
2873 XGI_SetCRT1Timing_H(pVBInfo,HwDeviceExtension) ;
2874
2875 if ( pVBInfo->IF_DEF_CH7007 == 1 )
2876 {
2877 XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , CH7007TV_TimingHPtr[ 0 ].data[ 8 ] ) ;
2878 XGINew_SetReg1( pVBInfo->P3c4 , 0x2F , CH7007TV_TimingHPtr[ 0 ].data[ 9 ] ) ;
2879 }
2880
2881 tempbx = 1 ;
2882
2883 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
2884 {
2885 LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
2886 for( i = 0 ; i < 7 ; i++ )
2887 pVBInfo->TimingV[ 0 ].data[ i ] = LCDPtr1[ 0 ].Reg[ i ] ;
2888 }
2889
2890 if ( pVBInfo->IF_DEF_CH7007 == 1 )
2891 {
2892 if ( pVBInfo->VBInfo & SetCRT2ToTV )
2893 {
2894 CH7007TV_TimingVPtr = (struct XGI_CH7007TV_TimingVStruct *)XGI_GetTVPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
2895
2896 for( i = 0 ; i < 7 ; i++ )
2897 pVBInfo->TimingV[ 0 ].data[ i ] = CH7007TV_TimingVPtr[ 0 ].data[ i ] ;
2898 }
2899 }
2900 /* if ( pVBInfo->IF_DEF_CH7017 == 1 )
2901 {
2902 if ( pVBInfo->VBInfo & SetCRT2ToTV )
2903 TVPtr = ( struct XGI330_CHTVDataStruct *)XGI_GetTVPtr( tempbx , ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
2904 } */
2905
2906 XGI_SetCRT1Timing_V( ModeIdIndex , ModeNo , pVBInfo) ;
2907
2908 if ( pVBInfo->IF_DEF_CH7007 == 1 )
2909 {
2910 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x33 , ~0x01 , CH7007TV_TimingVPtr[ 0 ].data[ 7 ]&0x01 ) ;
2911 XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , CH7007TV_TimingVPtr[ 0 ].data[8 ] ) ;
2912 XGINew_SetReg1( pVBInfo->P3c4 , 0x3F , CH7007TV_TimingVPtr[ 0 ].data[9 ] ) ;
2913
2914 }
2915 }
2916 }
2917
2918
2919
2920 /* --------------------------------------------------------------------- */
2921 /* Function : XGI_SetLVDSRegs */
2922 /* Input : */
2923 /* Output : */
2924 /* Description : */
2925 /* --------------------------------------------------------------------- */
2926 void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
2927 unsigned short RefreshRateTableIndex,
2928 struct vb_device_info *pVBInfo)
2929 {
2930 unsigned short tempbx , tempax , tempcx , tempdx , push1 , push2 , modeflag ;
2931 unsigned long temp , temp1 , temp2 , temp3 , push3 ;
2932 struct XGI330_LCDDataDesStruct *LCDPtr = NULL ;
2933 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL ;
2934
2935 if ( ModeNo > 0x13 )
2936 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
2937 else
2938 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
2939
2940 if ( !( pVBInfo->SetFlag & Win9xDOSMode ) )
2941 {
2942 if ( ( pVBInfo->IF_DEF_CH7017 == 0 ) || ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) )
2943 {
2944 if ( pVBInfo->IF_DEF_OEMUtil == 1 )
2945 {
2946 tempbx = 8 ;
2947 LCDPtr = (struct XGI330_LCDDataDesStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
2948 }
2949
2950 if ( ( pVBInfo->IF_DEF_OEMUtil == 0 ) || ( LCDPtr == 0 ) )
2951 {
2952 tempbx = 3 ;
2953 if ( pVBInfo->LCDInfo & EnableScalingLCD )
2954 LCDPtr1 = (struct XGI330_LCDDataDesStruct2 *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
2955 else
2956 LCDPtr = (struct XGI330_LCDDataDesStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
2957 }
2958
2959 XGI_GetLCDSync( &tempax , &tempbx ,pVBInfo) ;
2960 push1 = tempbx ;
2961 push2 = tempax ;
2962
2963 /* GetLCDResInfo */
2964 if ( ( pVBInfo->LCDResInfo == Panel1024x768 ) || ( pVBInfo->LCDResInfo == Panel1024x768x75 ) )
2965 {
2966 tempax = 1024 ;
2967 tempbx = 768 ;
2968 }
2969 else if ( ( pVBInfo->LCDResInfo == Panel1280x1024 ) || ( pVBInfo->LCDResInfo == Panel1280x1024x75 ) )
2970 {
2971 tempax = 1280 ;
2972 tempbx = 1024 ;
2973 }
2974 else if ( pVBInfo->LCDResInfo == Panel1400x1050 )
2975 {
2976 tempax = 1400 ;
2977 tempbx = 1050 ;
2978 }
2979 else
2980 {
2981 tempax = 1600 ;
2982 tempbx = 1200 ;
2983 }
2984
2985 if ( pVBInfo->LCDInfo & SetLCDtoNonExpanding )
2986 {
2987 pVBInfo->HDE=tempax;
2988 pVBInfo->VDE=tempbx;
2989 pVBInfo->VGAHDE=tempax;
2990 pVBInfo->VGAVDE=tempbx;
2991 }
2992
2993 if ( ( pVBInfo->IF_DEF_ScaleLCD == 1 ) && ( pVBInfo->LCDInfo & EnableScalingLCD ) )
2994 {
2995 tempax=pVBInfo->HDE;
2996 tempbx=pVBInfo->VDE;
2997 }
2998
2999 tempax = pVBInfo->HT ;
3000
3001 if ( pVBInfo->LCDInfo & EnableScalingLCD )
3002 tempbx = LCDPtr1->LCDHDES ;
3003 else
3004 tempbx = LCDPtr->LCDHDES ;
3005
3006 tempcx = pVBInfo->HDE ;
3007 tempbx = tempbx & 0x0fff ;
3008 tempcx += tempbx ;
3009
3010 if ( tempcx >= tempax )
3011 tempcx -= tempax ;
3012
3013 XGINew_SetReg1( pVBInfo->Part1Port , 0x1A , tempbx & 0x07 ) ;
3014
3015 tempcx = tempcx >> 3 ;
3016 tempbx = tempbx >> 3 ;
3017
3018 XGINew_SetReg1(pVBInfo->Part1Port, 0x16, (unsigned short)(tempbx & 0xff));
3019 XGINew_SetReg1(pVBInfo->Part1Port, 0x17, (unsigned short)(tempcx & 0xff));
3020
3021 tempax = pVBInfo->HT ;
3022
3023 if ( pVBInfo->LCDInfo & EnableScalingLCD )
3024 tempbx = LCDPtr1->LCDHRS ;
3025 else
3026 tempbx = LCDPtr->LCDHRS ;
3027
3028 tempcx = push2 ;
3029
3030 if ( pVBInfo->LCDInfo & EnableScalingLCD )
3031 tempcx = LCDPtr1->LCDHSync ;
3032
3033 tempcx += tempbx ;
3034
3035 if ( tempcx >= tempax )
3036 tempcx -= tempax ;
3037
3038 tempax = tempbx & 0x07 ;
3039 tempax = tempax >> 5 ;
3040 tempcx = tempcx >> 3 ;
3041 tempbx = tempbx >> 3 ;
3042
3043 tempcx &= 0x1f ;
3044 tempax |= tempcx ;
3045
3046 XGINew_SetReg1( pVBInfo->Part1Port , 0x15 , tempax ) ;
3047 XGINew_SetReg1(pVBInfo->Part1Port, 0x14, (unsigned short)(tempbx & 0xff));
3048
3049 tempax = pVBInfo->VT ;
3050 if ( pVBInfo->LCDInfo & EnableScalingLCD )
3051 tempbx = LCDPtr1->LCDVDES ;
3052 else
3053 tempbx = LCDPtr->LCDVDES ;
3054 tempcx = pVBInfo->VDE ;
3055
3056 tempbx = tempbx & 0x0fff ;
3057 tempcx += tempbx ;
3058 if ( tempcx >= tempax )
3059 tempcx -= tempax ;
3060
3061 XGINew_SetReg1(pVBInfo->Part1Port, 0x1b, (unsigned short)(tempbx & 0xff));
3062 XGINew_SetReg1(pVBInfo->Part1Port, 0x1c, (unsigned short)(tempcx & 0xff));
3063
3064 tempbx = ( tempbx >> 8 ) & 0x07 ;
3065 tempcx = ( tempcx >> 8 ) & 0x07 ;
3066
3067 XGINew_SetReg1(pVBInfo->Part1Port, 0x1d, (unsigned short)((tempcx << 3) | tempbx));
3068
3069 tempax = pVBInfo->VT ;
3070 if ( pVBInfo->LCDInfo & EnableScalingLCD )
3071 tempbx = LCDPtr1->LCDVRS ;
3072 else
3073 tempbx = LCDPtr->LCDVRS ;
3074
3075 /* tempbx = tempbx >> 4 ; */
3076 tempcx = push1 ;
3077
3078 if ( pVBInfo->LCDInfo & EnableScalingLCD )
3079 tempcx = LCDPtr1->LCDVSync ;
3080
3081 tempcx += tempbx ;
3082 if ( tempcx >= tempax )
3083 tempcx -= tempax ;
3084
3085 XGINew_SetReg1(pVBInfo->Part1Port, 0x18, (unsigned short)(tempbx & 0xff));
3086 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x19, ~0x0f, (unsigned short)(tempcx & 0x0f));
3087
3088 tempax = ( ( tempbx >> 8 ) & 0x07 ) << 3 ;
3089
3090 tempbx = pVBInfo->VGAVDE ;
3091 if ( tempbx != pVBInfo->VDE )
3092 tempax |= 0x40 ;
3093
3094 if ( pVBInfo->LCDInfo & EnableLVDSDDA )
3095 tempax |= 0x40 ;
3096
3097 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x1a , 0x07 , tempax ) ;
3098
3099 tempcx = pVBInfo->VGAVT ;
3100 tempbx = pVBInfo->VDE ;
3101 tempax = pVBInfo->VGAVDE ;
3102 tempcx -= tempax ;
3103
3104 temp = tempax ; /* 0430 ylshieh */
3105 temp1 = ( temp << 18 ) / tempbx ;
3106
3107 tempdx = (unsigned short)((temp << 18) % tempbx);
3108
3109 if ( tempdx != 0 )
3110 temp1 += 1 ;
3111
3112 temp2 = temp1 ;
3113 push3 = temp2 ;
3114
3115 XGINew_SetReg1(pVBInfo->Part1Port, 0x37, (unsigned short)(temp2 & 0xff));
3116 XGINew_SetReg1(pVBInfo->Part1Port, 0x36, (unsigned short)((temp2 >> 8) & 0xff));
3117
3118 tempbx = (unsigned short)(temp2 >> 16);
3119 tempax = tempbx & 0x03 ;
3120
3121 tempbx = pVBInfo->VGAVDE ;
3122 if ( tempbx == pVBInfo->VDE )
3123 tempax |= 0x04 ;
3124
3125 XGINew_SetReg1( pVBInfo->Part1Port , 0x35 , tempax ) ;
3126
3127 if ( pVBInfo->VBType & VB_XGI301C )
3128 {
3129 temp2 = push3 ;
3130 XGINew_SetReg1(pVBInfo->Part4Port, 0x3c, (unsigned short)(temp2 & 0xff));
3131 XGINew_SetReg1(pVBInfo->Part4Port, 0x3b, (unsigned short)((temp2 >> 8) & 0xff));
3132 tempbx = (unsigned short)(temp2 >> 16);
3133 XGINew_SetRegANDOR(pVBInfo->Part4Port, 0x3a, ~0xc0, (unsigned short)((tempbx & 0xff) << 6));
3134
3135 tempcx = pVBInfo->VGAVDE ;
3136 if ( tempcx == pVBInfo->VDE )
3137 XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x30 , ~0x0c , 0x00 ) ;
3138 else
3139 XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x30 , ~0x0c , 0x08 ) ;
3140 }
3141
3142 tempcx = pVBInfo->VGAHDE ;
3143 tempbx = pVBInfo->HDE ;
3144
3145 temp1 = tempcx << 16 ;
3146
3147 tempax = (unsigned short)(temp1 / tempbx);
3148
3149 if ( ( tempbx & 0xffff ) == ( tempcx & 0xffff ) )
3150 tempax = 65535 ;
3151
3152 temp3 = tempax ;
3153 temp1 = pVBInfo->VGAHDE << 16 ;
3154
3155 temp1 /= temp3 ;
3156 temp3 = temp3 << 16 ;
3157 temp1 -= 1 ;
3158
3159 temp3 = ( temp3 & 0xffff0000 ) + ( temp1 & 0xffff ) ;
3160
3161 tempax = (unsigned short)(temp3 & 0xff);
3162 XGINew_SetReg1( pVBInfo->Part1Port , 0x1f , tempax ) ;
3163
3164 temp1 = pVBInfo->VGAVDE << 18 ;
3165 temp1 = temp1 / push3 ;
3166 tempbx = (unsigned short)(temp1 & 0xffff);
3167
3168 if ( pVBInfo->LCDResInfo == Panel1024x768 )
3169 tempbx -= 1 ;
3170
3171 tempax = ( ( tempbx >> 8 ) & 0xff ) << 3 ;
3172 tempax |= (unsigned short)((temp3 >> 8) & 0x07);
3173 XGINew_SetReg1(pVBInfo->Part1Port, 0x20, (unsigned short)(tempax & 0xff));
3174 XGINew_SetReg1(pVBInfo->Part1Port, 0x21, (unsigned short)(tempbx & 0xff));
3175
3176 temp3 = temp3 >> 16 ;
3177
3178 if ( modeflag & HalfDCLK )
3179 temp3 = temp3 >> 1 ;
3180
3181 XGINew_SetReg1(pVBInfo->Part1Port , 0x22, (unsigned short)((temp3 >> 8) & 0xff));
3182 XGINew_SetReg1(pVBInfo->Part1Port , 0x23, (unsigned short)(temp3 & 0xff));
3183 }
3184 }
3185 }
3186
3187
3188 /* --------------------------------------------------------------------- */
3189 /* Function : XGI_SetCRT2ECLK */
3190 /* Input : */
3191 /* Output : */
3192 /* Description : */
3193 /* --------------------------------------------------------------------- */
3194 void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo)
3195 {
3196 unsigned char di_0, di_1, tempal;
3197 int i ;
3198
3199 tempal = XGI_GetVCLKPtr( RefreshRateTableIndex , ModeNo , ModeIdIndex, pVBInfo ) ;
3200 XGI_GetVCLKLen( tempal , &di_0 , &di_1, pVBInfo ) ;
3201 XGI_GetLCDVCLKPtr( &di_0 , &di_1, pVBInfo ) ;
3202
3203 for( i = 0 ; i < 4 ; i++ )
3204 {
3205 XGINew_SetRegANDOR(pVBInfo->P3d4, 0x31, ~0x30, (unsigned short)(0x10 * i));
3206 if ( pVBInfo->IF_DEF_CH7007 == 1 )
3207 {
3208 XGINew_SetReg1( pVBInfo->P3c4 , 0x2b , di_0 ) ;
3209 XGINew_SetReg1( pVBInfo->P3c4 , 0x2c , di_1 ) ;
3210 }
3211 else if ( ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) ) && ( !( pVBInfo->VBInfo & SetInSlaveMode ) ) )
3212 {
3213 XGINew_SetReg1( pVBInfo->P3c4 , 0x2e , di_0 ) ;
3214 XGINew_SetReg1( pVBInfo->P3c4 , 0x2f , di_1 ) ;
3215 }
3216 else
3217 {
3218 XGINew_SetReg1( pVBInfo->P3c4 , 0x2b , di_0 ) ;
3219 XGINew_SetReg1( pVBInfo->P3c4 , 0x2c , di_1 ) ;
3220 }
3221 }
3222 }
3223
3224
3225 /* --------------------------------------------------------------------- */
3226 /* Function : XGI_UpdateModeInfo */
3227 /* Input : */
3228 /* Output : */
3229 /* Description : */
3230 /* --------------------------------------------------------------------- */
3231 void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
3232 {
3233 unsigned short tempcl ,
3234 tempch ,
3235 temp ,
3236 tempbl ,
3237 tempax ;
3238
3239 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
3240 {
3241 tempcl = 0 ;
3242 tempch = 0 ;
3243 temp = XGINew_GetReg1( pVBInfo->P3c4 , 0x01 ) ;
3244
3245 if ( !( temp & 0x20 ) )
3246 {
3247 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x17 ) ;
3248 if ( temp & 0x80 )
3249 {
3250 if ( ( HwDeviceExtension->jChipType >= XG20 ) || ( HwDeviceExtension->jChipType >= XG40 ) )
3251 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x53 ) ;
3252 else
3253 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x63 ) ;
3254
3255 if ( !( temp & 0x40 ) )
3256 tempcl |= ActiveCRT1 ;
3257 }
3258 }
3259
3260 temp = XGINew_GetReg1( pVBInfo->Part1Port , 0x2e ) ;
3261 temp &= 0x0f ;
3262
3263 if ( !( temp == 0x08 ) )
3264 {
3265 tempax = XGINew_GetReg1( pVBInfo->Part1Port , 0x13 ) ; /* Check ChannelA by Part1_13 [2003/10/03] */
3266 if ( tempax & 0x04 )
3267 tempcl = tempcl | ActiveLCD ;
3268
3269 temp &= 0x05 ;
3270
3271 if ( !( tempcl & ActiveLCD ) )
3272 if ( temp == 0x01 )
3273 tempcl |= ActiveCRT2 ;
3274
3275 if ( temp == 0x04 )
3276 tempcl |= ActiveLCD ;
3277
3278 if ( temp == 0x05 )
3279 {
3280 temp = XGINew_GetReg1( pVBInfo->Part2Port , 0x00 ) ;
3281
3282 if( !( temp & 0x08 ) )
3283 tempch |= ActiveAVideo ;
3284
3285 if ( !( temp & 0x04 ) )
3286 tempch |= ActiveSVideo ;
3287
3288 if ( temp & 0x02 )
3289 tempch |= ActiveSCART ;
3290
3291 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
3292 {
3293 if ( temp & 0x01 )
3294 tempch |= ActiveHiTV ;
3295 }
3296
3297 if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
3298 {
3299 temp = XGINew_GetReg1( pVBInfo->Part2Port , 0x4d ) ;
3300
3301 if ( temp & 0x10 )
3302 tempch |= ActiveYPbPr ;
3303 }
3304
3305 if ( tempch != 0 )
3306 tempcl |= ActiveTV ;
3307 }
3308 }
3309
3310 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x3d ) ;
3311 if ( tempcl & ActiveLCD )
3312 {
3313 if ( ( pVBInfo->SetFlag & ReserveTVOption ) )
3314 {
3315 if ( temp & ActiveTV )
3316 tempcl |= ActiveTV ;
3317 }
3318 }
3319 temp = tempcl ;
3320 tempbl = ~ModeSwitchStatus ;
3321 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x3d , tempbl , temp ) ;
3322
3323 if ( !( pVBInfo->SetFlag & ReserveTVOption ) )
3324 XGINew_SetReg1( pVBInfo->P3d4 , 0x3e , tempch ) ;
3325 }
3326 else
3327 {
3328 return ;
3329 }
3330 }
3331
3332
3333 /* --------------------------------------------------------------------- */
3334 /* Function : XGI_GetVGAType */
3335 /* Input : */
3336 /* Output : */
3337 /* Description : */
3338 /* --------------------------------------------------------------------- */
3339 void XGI_GetVGAType(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
3340 {
3341 /*
3342 if ( HwDeviceExtension->jChipType >= XG20 )
3343 {
3344 pVBInfo->Set_VGAType = XG20;
3345 }
3346 else if ( HwDeviceExtension->jChipType >= XG40 )
3347 {
3348 pVBInfo->Set_VGAType = VGA_XGI340 ;
3349 }
3350 */
3351 pVBInfo->Set_VGAType = HwDeviceExtension->jChipType;
3352 }
3353
3354
3355 /* --------------------------------------------------------------------- */
3356 /* Function : XGI_GetVBType */
3357 /* Input : */
3358 /* Output : */
3359 /* Description : */
3360 /* --------------------------------------------------------------------- */
3361 void XGI_GetVBType(struct vb_device_info *pVBInfo)
3362 {
3363 unsigned short flag , tempbx , tempah ;
3364
3365 if ( pVBInfo->IF_DEF_CH7007 == 1 )
3366 {
3367 pVBInfo->VBType = VB_CH7007 ;
3368 return;
3369 }
3370 if ( pVBInfo->IF_DEF_LVDS == 0 )
3371 {
3372 tempbx = VB_XGI302B ;
3373 flag = XGINew_GetReg1( pVBInfo->Part4Port , 0x00 ) ;
3374 if ( flag != 0x02 )
3375 {
3376 tempbx = VB_XGI301 ;
3377 flag = XGINew_GetReg1( pVBInfo->Part4Port , 0x01 ) ;
3378 if ( flag >= 0xB0 )
3379 {
3380 tempbx = VB_XGI301B ;
3381 if ( flag >= 0xC0 )
3382 {
3383 tempbx = VB_XGI301C ;
3384 if ( flag >= 0xD0 )
3385 {
3386 tempbx = VB_XGI301LV ;
3387 if ( flag >= 0xE0 )
3388 {
3389 tempbx = VB_XGI302LV ;
3390 tempah = XGINew_GetReg1( pVBInfo->Part4Port , 0x39 ) ;
3391 if ( tempah != 0xFF )
3392 tempbx = VB_XGI301C ;
3393 }
3394 }
3395 }
3396
3397 if ( tempbx & ( VB_XGI301B | VB_XGI302B ) )
3398 {
3399 flag = XGINew_GetReg1( pVBInfo->Part4Port , 0x23 ) ;
3400
3401 if ( !( flag & 0x02 ) )
3402 tempbx = tempbx | VB_NoLCD ;
3403 }
3404 }
3405 }
3406 pVBInfo->VBType = tempbx ;
3407 }
3408 /*
3409 else if ( pVBInfo->IF_DEF_CH7017 == 1 )
3410 pVBInfo->VBType = VB_CH7017 ;
3411 else //LVDS
3412 pVBInfo->VBType = VB_LVDS_NS ;
3413 */
3414
3415 }
3416
3417
3418 /* --------------------------------------------------------------------- */
3419 /* Function : XGI_GetVBInfo */
3420 /* Input : */
3421 /* Output : */
3422 /* Description : */
3423 /* --------------------------------------------------------------------- */
3424 void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
3425 {
3426 unsigned short tempax ,
3427 push ,
3428 tempbx ,
3429 temp ,
3430 modeflag ;
3431
3432 if ( ModeNo <= 0x13 )
3433 {
3434 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
3435 }
3436 else
3437 {
3438 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
3439 }
3440
3441 pVBInfo->SetFlag = 0 ;
3442 pVBInfo->ModeType = modeflag & ModeInfoFlag ;
3443 tempbx = 0 ;
3444
3445 if ( pVBInfo->VBType & 0xFFFF )
3446 {
3447 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x30 ) ; /* Check Display Device */
3448 tempbx = tempbx | temp ;
3449 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x31 ) ;
3450 push = temp ;
3451 push = push << 8 ;
3452 tempax = temp << 8 ;
3453 tempbx = tempbx | tempax ;
3454 temp = ( SetCRT2ToDualEdge | SetCRT2ToYPbPr | SetCRT2ToLCDA | SetInSlaveMode | DisableCRT2Display ) ;
3455 temp = 0xFFFF ^ temp ;
3456 tempbx &= temp ;
3457
3458 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ;
3459
3460 if ( pVBInfo->IF_DEF_LCDA == 1 )
3461 {
3462
3463 if ( ( pVBInfo->Set_VGAType >= XG20 ) || ( pVBInfo->Set_VGAType >= XG40 ))
3464 {
3465 if ( pVBInfo->IF_DEF_LVDS == 0 )
3466 {
3467 /* if ( ( pVBInfo->VBType & VB_XGI302B ) || ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) ) */
3468 if ( pVBInfo->VBType & ( VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
3469 {
3470 if ( temp & EnableDualEdge )
3471 {
3472 tempbx |= SetCRT2ToDualEdge ;
3473
3474 if ( temp & SetToLCDA )
3475 tempbx |= SetCRT2ToLCDA ;
3476 }
3477 }
3478 }
3479 else if ( pVBInfo->IF_DEF_CH7017 == 1 )
3480 {
3481 if ( pVBInfo->VBType & VB_CH7017 )
3482 {
3483 if ( temp & EnableDualEdge )
3484 {
3485 tempbx |= SetCRT2ToDualEdge ;
3486
3487 if ( temp & SetToLCDA )
3488 tempbx |= SetCRT2ToLCDA ;
3489 }
3490 }
3491 }
3492 }
3493 }
3494
3495 if ( pVBInfo->IF_DEF_YPbPr == 1 )
3496 {
3497 if ( ( ( pVBInfo->IF_DEF_LVDS == 0 ) && ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) ) )
3498 || ( ( pVBInfo->IF_DEF_CH7017 == 1 ) && ( pVBInfo->VBType&VB_CH7017 ) ) || ( (pVBInfo->IF_DEF_CH7007 == 1) && (pVBInfo->VBType&VB_CH7007) ) ) /* [Billy] 07/05/04 */
3499 {
3500 if ( temp & SetYPbPr ) /* temp = CR38 */
3501 {
3502 if ( pVBInfo->IF_DEF_HiVision == 1 )
3503 {
3504 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ; /* shampoo add for new scratch */
3505 temp &= YPbPrMode ;
3506 tempbx |= SetCRT2ToHiVisionTV ;
3507
3508 if ( temp != YPbPrMode1080i ) {
3509 tempbx &= ( ~SetCRT2ToHiVisionTV ) ;
3510 tempbx |= SetCRT2ToYPbPr ; }
3511 }
3512
3513 /* tempbx |= SetCRT2ToYPbPr ; */
3514 }
3515 }
3516 }
3517
3518 tempax = push ; /* restore CR31 */
3519
3520 if ( pVBInfo->IF_DEF_LVDS == 0 )
3521 {
3522 if ( pVBInfo->IF_DEF_YPbPr == 1 )
3523 {
3524 if ( pVBInfo->IF_DEF_HiVision == 1 )
3525 temp = 0x09FC ;
3526 else
3527 temp = 0x097C ;
3528 }
3529 else
3530 {
3531 if ( pVBInfo->IF_DEF_HiVision == 1 )
3532 temp = 0x01FC ;
3533 else
3534 temp = 0x017C ;
3535 }
3536 }
3537 else /* 3nd party chip */
3538 {
3539 if ( pVBInfo->IF_DEF_CH7017 == 1 )
3540 temp = ( SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA ) ;
3541 else if ( pVBInfo->IF_DEF_CH7007 == 1 ) /* [Billy] 07/05/03 */
3542 {
3543 temp = SetCRT2ToTV ;
3544 }
3545 else
3546 temp = SetCRT2ToLCD ;
3547 }
3548
3549 if ( !( tempbx & temp ) )
3550 {
3551 tempax |= DisableCRT2Display ;
3552 tempbx = 0 ;
3553 }
3554
3555 if ( pVBInfo->IF_DEF_LCDA == 1 ) /* Select Display Device */
3556 {
3557 if ( !( pVBInfo->VBType & VB_NoLCD ) )
3558 {
3559 if ( tempbx & SetCRT2ToLCDA )
3560 {
3561 if ( tempbx & SetSimuScanMode )
3562 tempbx &= ( ~( SetCRT2ToLCD | SetCRT2ToRAMDAC | SwitchToCRT2 ) ) ;
3563 else
3564 tempbx &= ( ~( SetCRT2ToLCD | SetCRT2ToRAMDAC | SetCRT2ToTV | SwitchToCRT2 ) ) ;
3565 }
3566 }
3567 }
3568
3569 /* shampoo add */
3570 if ( !( tempbx & ( SwitchToCRT2 | SetSimuScanMode ) ) ) /* for driver abnormal */
3571 {
3572 if ( pVBInfo->IF_DEF_CRT2Monitor == 1 )
3573 {
3574 if ( tempbx & SetCRT2ToRAMDAC )
3575 {
3576 tempbx &= ( 0xFF00 | SetCRT2ToRAMDAC | SwitchToCRT2 | SetSimuScanMode ) ;
3577 tempbx &= ( 0x00FF | ( ~SetCRT2ToYPbPr ) ) ;
3578 }
3579 }
3580 else
3581 tempbx &= ( ~( SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV ) ) ;
3582 }
3583
3584 if ( !( pVBInfo->VBType & VB_NoLCD ) )
3585 {
3586 if ( tempbx & SetCRT2ToLCD )
3587 {
3588 tempbx &= ( 0xFF00 | SetCRT2ToLCD | SwitchToCRT2 | SetSimuScanMode ) ;
3589 tempbx &= ( 0x00FF | ( ~SetCRT2ToYPbPr ) ) ;
3590 }
3591 }
3592
3593 if ( tempbx & SetCRT2ToSCART )
3594 {
3595 tempbx &= ( 0xFF00 | SetCRT2ToSCART | SwitchToCRT2 | SetSimuScanMode ) ;
3596 tempbx &= ( 0x00FF | ( ~SetCRT2ToYPbPr ) ) ;
3597 }
3598
3599 if ( pVBInfo->IF_DEF_YPbPr == 1 )
3600 {
3601 if ( tempbx & SetCRT2ToYPbPr )
3602 tempbx &= ( 0xFF00 | SwitchToCRT2 | SetSimuScanMode ) ;
3603 }
3604
3605 if ( pVBInfo->IF_DEF_HiVision == 1 )
3606 {
3607 if ( tempbx & SetCRT2ToHiVisionTV )
3608 tempbx &= ( 0xFF00 | SetCRT2ToHiVisionTV | SwitchToCRT2 | SetSimuScanMode ) ;
3609 }
3610
3611 if ( tempax & DisableCRT2Display ) /* Set Display Device Info */
3612 {
3613 if ( !( tempbx & ( SwitchToCRT2 | SetSimuScanMode ) ) )
3614 tempbx = DisableCRT2Display ;
3615 }
3616
3617 if ( !( tempbx & DisableCRT2Display ) )
3618 {
3619 if ( ( !( tempbx & DriverMode ) ) || ( !( modeflag & CRT2Mode ) ) )
3620 {
3621 if ( pVBInfo->IF_DEF_LCDA == 1 )
3622 {
3623 if ( !( tempbx & SetCRT2ToLCDA ) )
3624 tempbx |= ( SetInSlaveMode | SetSimuScanMode ) ;
3625 }
3626
3627 if ( pVBInfo->IF_DEF_VideoCapture == 1 )
3628 {
3629 if ( ( ( HwDeviceExtension->jChipType == XG40 ) && ( pVBInfo->Set_VGAType == XG40 ) )
3630 || ( ( HwDeviceExtension->jChipType == XG41 ) && ( pVBInfo->Set_VGAType == XG41 ) )
3631 || ( ( HwDeviceExtension->jChipType == XG42 ) && ( pVBInfo->Set_VGAType == XG42 ) )
3632 || ( ( HwDeviceExtension->jChipType == XG45 ) && ( pVBInfo->Set_VGAType == XG45 ) ) )
3633 {
3634 if ( ModeNo <= 13 )
3635 {
3636 if ( !( tempbx & SetCRT2ToRAMDAC ) ) /*CRT2 not need to support*/
3637 {
3638 tempbx &= ( 0x00FF | ( ~SetInSlaveMode ) ) ;
3639 pVBInfo->SetFlag |= EnableVCMode ;
3640 }
3641 }
3642 }
3643 }
3644 }
3645
3646 /*LCD+TV can't support in slave mode (Force LCDA+TV->LCDB)*/
3647 if ( ( tempbx & SetInSlaveMode ) && ( tempbx & SetCRT2ToLCDA ) )
3648 {
3649 tempbx ^= ( SetCRT2ToLCD | SetCRT2ToLCDA | SetCRT2ToDualEdge ) ;
3650 pVBInfo->SetFlag |= ReserveTVOption ;
3651 }
3652 }
3653 }
3654
3655 pVBInfo->VBInfo = tempbx ;
3656 }
3657
3658
3659 /* --------------------------------------------------------------------- */
3660 /* Function : XGI_GetTVInfo */
3661 /* Input : */
3662 /* Output : */
3663 /* Description : */
3664 /* --------------------------------------------------------------------- */
3665 void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
3666 {
3667 unsigned short temp ,
3668 tempbx = 0 ,
3669 resinfo = 0 ,
3670 modeflag ,
3671 index1 ;
3672
3673 tempbx = 0 ;
3674 resinfo = 0 ;
3675
3676 if ( pVBInfo->VBInfo & SetCRT2ToTV )
3677 {
3678 if ( ModeNo <= 0x13 )
3679 {
3680 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; /* si+St_ModeFlag */
3681 resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ; /* si+St_ResInfo */
3682 }
3683 else
3684 {
3685 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
3686 resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ; /* si+Ext_ResInfo */
3687 }
3688
3689 if ( pVBInfo->VBInfo & SetCRT2ToTV )
3690 {
3691 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;
3692 tempbx = temp;
3693 if ( tempbx & SetPALTV )
3694 {
3695 tempbx &= ( SetCHTVOverScan | SetPALMTV | SetPALNTV | SetPALTV ) ;
3696 if ( tempbx & SetPALMTV )
3697 tempbx &= ~SetPALTV ; /* set to NTSC if PAL-M */
3698 }
3699 else
3700 tempbx &= ( SetCHTVOverScan | SetNTSCJ | SetPALTV ) ;
3701 /*
3702 if ( pVBInfo->IF_DEF_LVDS == 0 )
3703 {
3704 index1 = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ; //PAL-M/PAL-N Info
3705 temp2 = ( index1 & 0xC0 ) >> 5 ; //00:PAL, 01:PAL-M, 10:PAL-N
3706 tempbx |= temp2 ;
3707 if ( temp2 & 0x02 ) //PAL-M
3708 tempbx &= ( ~SetPALTV ) ;
3709 }
3710 */
3711 }
3712
3713 if ( pVBInfo->IF_DEF_CH7017 == 1 )
3714 {
3715 tempbx = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;
3716
3717 if ( tempbx & TVOverScan )
3718 tempbx |= SetCHTVOverScan ;
3719 }
3720
3721 if ( pVBInfo->IF_DEF_CH7007 == 1 ) /* [Billy] 07/05/04 */
3722 {
3723 tempbx = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;
3724
3725 if ( tempbx & TVOverScan )
3726 {
3727 tempbx |= SetCHTVOverScan ;
3728 }
3729 }
3730
3731
3732 if ( pVBInfo->IF_DEF_LVDS == 0 )
3733 {
3734 if ( pVBInfo->VBInfo & SetCRT2ToSCART )
3735 tempbx |= SetPALTV ;
3736 }
3737
3738 if ( pVBInfo->IF_DEF_YPbPr == 1 )
3739 {
3740 if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
3741 {
3742 index1 = XGINew_GetReg1( pVBInfo->P3d4 , 0x35 ) ;
3743 index1 &= YPbPrMode ;
3744
3745 if ( index1 == YPbPrMode525i )
3746 tempbx |= SetYPbPrMode525i ;
3747
3748 if ( index1 == YPbPrMode525p )
3749 tempbx = tempbx | SetYPbPrMode525p;
3750 if ( index1 == YPbPrMode750p)
3751 tempbx = tempbx | SetYPbPrMode750p;
3752 }
3753 }
3754
3755 if ( pVBInfo->IF_DEF_HiVision == 1 )
3756 {
3757 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
3758 {
3759 tempbx = tempbx | SetYPbPrMode1080i | SetPALTV ;
3760 }
3761 }
3762
3763 if ( pVBInfo->IF_DEF_LVDS == 0 )
3764 { /* shampoo */
3765 if ( ( pVBInfo->VBInfo & SetInSlaveMode ) && ( !( pVBInfo->VBInfo & SetNotSimuMode ) ) )
3766 tempbx |= TVSimuMode ;
3767
3768 if ( !( tempbx & SetPALTV ) && ( modeflag > 13 ) && ( resinfo == 8 ) ) /* NTSC 1024x768, */
3769 tempbx |= NTSC1024x768 ;
3770
3771 tempbx |= RPLLDIV2XO ;
3772
3773 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
3774 {
3775 if ( pVBInfo->VBInfo & SetInSlaveMode )
3776 tempbx &=( ~RPLLDIV2XO ) ;
3777 }
3778 else
3779 {
3780 if ( tempbx & ( SetYPbPrMode525p | SetYPbPrMode750p ) )
3781 tempbx &= ( ~RPLLDIV2XO ) ;
3782 else if ( !( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) )
3783 {
3784 if ( tempbx & TVSimuMode )
3785 tempbx &= ( ~RPLLDIV2XO ) ;
3786 }
3787 }
3788 }
3789 }
3790 pVBInfo->TVInfo = tempbx ;
3791 }
3792
3793
3794 /* --------------------------------------------------------------------- */
3795 /* Function : XGI_GetLCDInfo */
3796 /* Input : */
3797 /* Output : */
3798 /* Description : */
3799 /* --------------------------------------------------------------------- */
3800 unsigned char XGI_GetLCDInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3801 struct vb_device_info *pVBInfo)
3802 {
3803 unsigned short temp ,
3804 tempax ,
3805 tempbx ,
3806 modeflag ,
3807 resinfo = 0 ,
3808 LCDIdIndex ;
3809
3810 pVBInfo->LCDResInfo = 0 ;
3811 pVBInfo->LCDTypeInfo = 0 ;
3812 pVBInfo->LCDInfo = 0 ;
3813
3814 if ( ModeNo <= 0x13 )
3815 {
3816 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; /* si+St_ModeFlag // */
3817 }
3818 else
3819 {
3820 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
3821 resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ; /* si+Ext_ResInfo// */
3822 }
3823
3824 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x36 ) ; /* Get LCD Res.Info */
3825 tempbx = temp & 0x0F ;
3826
3827 if ( tempbx == 0 )
3828 tempbx = Panel1024x768 ; /* default */
3829
3830 /* LCD75 [2003/8/22] Vicent */
3831 if ( ( tempbx == Panel1024x768 ) || ( tempbx == Panel1280x1024 ) )
3832 {
3833 if ( pVBInfo->VBInfo & DriverMode )
3834 {
3835 tempax = XGINew_GetReg1( pVBInfo->P3d4 , 0x33 ) ;
3836 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
3837 tempax &= 0x0F ;
3838 else
3839 tempax = tempax >> 4 ;
3840
3841 if ( ( resinfo == 6 ) || ( resinfo == 9 ) )
3842 {
3843 if ( tempax >= 3 )
3844 tempbx |= PanelRef75Hz ;
3845 }
3846 else if ( ( resinfo == 7 ) || ( resinfo == 8 ) )
3847 {
3848 if ( tempax >= 4 )
3849 tempbx |= PanelRef75Hz ;
3850 }
3851 }
3852 }
3853
3854 pVBInfo->LCDResInfo = tempbx ;
3855
3856 /* End of LCD75 */
3857
3858 if( pVBInfo->IF_DEF_OEMUtil == 1 )
3859 {
3860 pVBInfo->LCDTypeInfo = ( temp & 0xf0 ) >> 4 ;
3861 }
3862
3863 if ( !( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) )
3864 {
3865 return 0;
3866 }
3867
3868 tempbx = 0 ;
3869
3870 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ;
3871
3872 temp &= ( ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable ) ;
3873
3874 if ( ( pVBInfo->IF_DEF_ScaleLCD == 1 ) && ( temp & LCDNonExpanding ) )
3875 temp &= ~EnableScalingLCD ;
3876
3877 tempbx |= temp ;
3878
3879 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo) ;
3880
3881 tempax = pVBInfo->LCDCapList[ LCDIdIndex ].LCD_Capability ;
3882
3883 if ( pVBInfo->IF_DEF_LVDS == 0 ) /* shampoo */
3884 {
3885 if ( ( ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) ) && ( tempax & LCDDualLink ) )
3886 {
3887 tempbx |= SetLCDDualLink ;
3888 }
3889 }
3890
3891 if ( pVBInfo->IF_DEF_CH7017 == 1 )
3892 {
3893 if ( tempax & LCDDualLink )
3894 {
3895 tempbx |= SetLCDDualLink ;
3896 }
3897 }
3898
3899 if ( pVBInfo->IF_DEF_LVDS == 0 )
3900 {
3901 if ( ( pVBInfo->LCDResInfo == Panel1400x1050 ) && ( pVBInfo->VBInfo & SetCRT2ToLCD ) && ( ModeNo > 0x13 ) && ( resinfo == 9 ) && ( !( tempbx & EnableScalingLCD ) ) )
3902 tempbx |= SetLCDtoNonExpanding ; /* set to center in 1280x1024 LCDB for Panel1400x1050 */
3903 }
3904
3905 /*
3906 if ( tempax & LCDBToA )
3907 {
3908 tempbx |= SetLCDBToA ;
3909 }
3910 */
3911
3912 if ( pVBInfo->IF_DEF_ExpLink == 1 )
3913 {
3914 if ( modeflag & HalfDCLK )
3915 {
3916 /* if ( !( pVBInfo->LCDInfo&LCDNonExpanding ) ) */
3917 if ( !( tempbx & SetLCDtoNonExpanding ) )
3918 {
3919 tempbx |= EnableLVDSDDA ;
3920 }
3921 else
3922 {
3923 if ( ModeNo > 0x13 )
3924 {
3925 if ( pVBInfo->LCDResInfo == Panel1024x768 )
3926 {
3927 if ( resinfo == 4 )
3928 { /* 512x384 */
3929 tempbx |= EnableLVDSDDA ;
3930 }
3931 }
3932 }
3933 }
3934 }
3935 }
3936
3937 if ( pVBInfo->VBInfo & SetInSlaveMode )
3938 {
3939 if ( pVBInfo->VBInfo & SetNotSimuMode )
3940 {
3941 tempbx |= LCDVESATiming ;
3942 }
3943 }
3944 else
3945 {
3946 tempbx |= LCDVESATiming ;
3947 }
3948
3949 pVBInfo->LCDInfo = tempbx ;
3950
3951 if ( pVBInfo->IF_DEF_PWD == 1 )
3952 {
3953 if ( pVBInfo->LCDInfo & SetPWDEnable )
3954 {
3955 if ( ( pVBInfo->VBType & VB_XGI302LV ) || ( pVBInfo->VBType & VB_XGI301C ) )
3956 {
3957 if ( !( tempax & PWDEnable ) )
3958 {
3959 pVBInfo->LCDInfo &= ~SetPWDEnable ;
3960 }
3961 }
3962 }
3963 }
3964
3965 if ( pVBInfo->IF_DEF_LVDS == 0 )
3966 {
3967 if ( tempax & ( LockLCDBToA | StLCDBToA ) )
3968 {
3969 if ( pVBInfo->VBInfo & SetInSlaveMode )
3970 {
3971 if ( !( tempax & LockLCDBToA ) )
3972 {
3973 if ( ModeNo <= 0x13 )
3974 {
3975 pVBInfo->VBInfo &= ~( SetSimuScanMode | SetInSlaveMode | SetCRT2ToLCD ) ;
3976 pVBInfo->VBInfo |= SetCRT2ToLCDA | SetCRT2ToDualEdge ;
3977 }
3978 }
3979 }
3980 }
3981 }
3982
3983 /*
3984 if ( pVBInfo->IF_DEF_LVDS == 0 )
3985 {
3986 if ( tempax & ( LockLCDBToA | StLCDBToA ) )
3987 {
3988 if ( pVBInfo->VBInfo & SetInSlaveMode )
3989 {
3990 if ( !( ( !( tempax & LockLCDBToA ) ) && ( ModeNo > 0x13 ) ) )
3991 {
3992 pVBInfo->VBInfo&=~(SetSimuScanMode|SetInSlaveMode|SetCRT2ToLCD);
3993 pVBInfo->VBInfo|=SetCRT2ToLCDA|SetCRT2ToDualEdge;
3994 }
3995 }
3996 }
3997 }
3998 */
3999
4000 return( 1 ) ;
4001 }
4002
4003
4004 /* --------------------------------------------------------------------- */
4005 /* Function : XGI_SearchModeID */
4006 /* Input : */
4007 /* Output : */
4008 /* Description : */
4009 /* --------------------------------------------------------------------- */
4010 unsigned char XGI_SearchModeID(unsigned short ModeNo,
4011 unsigned short *ModeIdIndex,
4012 struct vb_device_info *pVBInfo)
4013 {
4014
4015
4016
4017 #ifdef LINUX /* chiawen for linux solution */
4018
4019 if ( ModeNo <= 5 )
4020 ModeNo |= 1 ;
4021 if ( ModeNo <= 0x13 )
4022 {
4023 /* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(pVBInfo->SModeIDTable)/sizeof(struct XGI_StStruct);(*ModeIdIndex)++) */
4024 for( *ModeIdIndex = 0 ; ; ( *ModeIdIndex )++ )
4025 {
4026 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID == ModeNo)
4027 break;
4028 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID == 0xFF)
4029 return 0;
4030 }
4031
4032 if ( ModeNo == 0x07 )
4033 ( *ModeIdIndex )++ ; /* 400 lines */
4034
4035 if ( ModeNo <= 3 )
4036 ( *ModeIdIndex ) += 2 ; /* 400 lines */
4037 /* else 350 lines */
4038 }
4039 else
4040 {
4041 /* for (*ModeIdIndex=0;*ModeIdIndex<sizeof(pVBInfo->EModeIDTable)/sizeof(struct XGI_ExtStruct);(*ModeIdIndex)++) */
4042 for( *ModeIdIndex = 0 ; ; ( *ModeIdIndex )++ )
4043 {
4044 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
4045 break;
4046 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
4047 return 0;
4048 }
4049 }
4050
4051 #endif
4052
4053 return 1;
4054 }
4055
4056
4057
4058
4059 /* win2000 MM adapter not support standard mode! */
4060
4061 /* --------------------------------------------------------------------- */
4062 /* Function : */
4063 /* Input : */
4064 /* Output : */
4065 /* Description : */
4066 /* --------------------------------------------------------------------- */
4067 unsigned char XGINew_CheckMemorySize(struct xgi_hw_device_info *HwDeviceExtension,
4068 unsigned short ModeNo,
4069 unsigned short ModeIdIndex,
4070 struct vb_device_info *pVBInfo)
4071 {
4072 unsigned short memorysize ,
4073 modeflag ,
4074 temp ,
4075 temp1 ,
4076 tmp ;
4077
4078 /* if ( ( HwDeviceExtension->jChipType == XGI_650 ) ||
4079 ( HwDeviceExtension->jChipType == XGI_650M ) )
4080 {
4081 return 1;
4082 } */
4083
4084 if ( ModeNo <= 0x13 )
4085 {
4086 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
4087 }
4088 else {
4089 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
4090 }
4091
4092 /* ModeType = modeflag&ModeInfoFlag ; // Get mode type */
4093
4094 memorysize = modeflag & MemoryInfoFlag ;
4095 memorysize = memorysize > MemorySizeShift ;
4096 memorysize++ ; /* Get memory size */
4097
4098 temp = XGINew_GetReg1( pVBInfo->P3c4 , 0x14 ) ; /* Get DRAM Size */
4099 tmp = temp ;
4100
4101 if ( HwDeviceExtension->jChipType == XG40 )
4102 {
4103 temp = 1 << ( ( temp & 0x0F0 ) >> 4 ) ; /* memory size per channel SR14[7:4] */
4104 if ( ( tmp & 0x0c ) == 0x0C ) /* Qual channels */
4105 {
4106 temp <<= 2 ;
4107 }
4108 else if ( ( tmp & 0x0c ) == 0x08 ) /* Dual channels */
4109 {
4110 temp <<= 1 ;
4111 }
4112 }
4113 else if ( HwDeviceExtension->jChipType == XG42 )
4114 {
4115 temp = 1 << ( ( temp & 0x0F0 ) >> 4 ) ; /* memory size per channel SR14[7:4] */
4116 if ( ( tmp & 0x04 ) == 0x04 ) /* Dual channels */
4117 {
4118 temp <<= 1 ;
4119 }
4120 }
4121 else if ( HwDeviceExtension->jChipType == XG45 )
4122 {
4123 temp = 1 << ( ( temp & 0x0F0 ) >> 4 ) ; /* memory size per channel SR14[7:4] */
4124 if ( ( tmp & 0x0c ) == 0x0C ) /* Qual channels */
4125 {
4126 temp <<= 2 ;
4127 }
4128 else if ( ( tmp & 0x0c ) == 0x08 ) /* triple channels */
4129 {
4130 temp1 = temp ;
4131 temp <<= 1 ;
4132 temp += temp1 ;
4133 }
4134 else if ( ( tmp & 0x0c ) == 0x04 ) /* Dual channels */
4135 {
4136 temp <<= 1 ;
4137 }
4138 }
4139 if (temp < memorysize)
4140 return 0;
4141 else
4142 return 1;
4143 }
4144
4145
4146 /* --------------------------------------------------------------------- */
4147 /* Function : XGINew_IsLowResolution */
4148 /* Input : */
4149 /* Output : */
4150 /* Description : */
4151 /* --------------------------------------------------------------------- */
4152 /*void XGINew_IsLowResolution(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned char XGINew_CheckMemorySize(struct xgi_hw_device_info *HwDeviceExtension, unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
4153 {
4154 unsigned short data ;
4155 unsigned short ModeFlag ;
4156
4157 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x0F ) ;
4158 data &= 0x7F ;
4159 XGINew_SetReg1( pVBInfo->P3c4 , 0x0F , data ) ;
4160
4161 if ( ModeNo > 0x13 )
4162 {
4163 ModeFlag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
4164 if ( ( ModeFlag & HalfDCLK ) && ( ModeFlag & DoubleScanMode ) )
4165 {
4166 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x0F ) ;
4167 data |= 0x80 ;
4168 XGINew_SetReg1( pVBInfo->P3c4 , 0x0F , data ) ;
4169 data = XGINew_GetReg1( pVBInfo->P3c4 , 0x01 ) ;
4170 data &= 0xF7 ;
4171 XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , data ) ;
4172 }
4173 }
4174 }
4175
4176 */
4177
4178 /* --------------------------------------------------------------------- */
4179 /* Function : XGI_DisplayOn */
4180 /* Input : */
4181 /* Output : */
4182 /* Description : */
4183 /* --------------------------------------------------------------------- */
4184 void XGI_DisplayOn(struct xgi_hw_device_info *pXGIHWDE, struct vb_device_info *pVBInfo)
4185 {
4186
4187 XGINew_SetRegANDOR(pVBInfo->P3c4,0x01,0xDF,0x00);
4188 if ( pXGIHWDE->jChipType == XG21 )
4189 {
4190 if ( pVBInfo->IF_DEF_LVDS == 1 )
4191 {
4192 if (!(XGI_XG21GetPSCValue( pVBInfo )&0x1))
4193 {
4194 XGI_XG21BLSignalVDD( 0x01 , 0x01, pVBInfo ) ; /* LVDS VDD on */
4195 XGI_XG21SetPanelDelay( 2,pVBInfo ) ;
4196 }
4197 if (!(XGI_XG21GetPSCValue( pVBInfo )&0x20))
4198 {
4199 XGI_XG21BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* LVDS signal on */
4200 }
4201 XGI_XG21SetPanelDelay( 3,pVBInfo ) ;
4202 XGI_XG21BLSignalVDD( 0x02 , 0x02, pVBInfo ) ; /* LVDS backlight on */
4203 }
4204 else
4205 {
4206 XGI_XG21BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* DVO/DVI signal on */
4207 }
4208
4209 }
4210
4211 if (pVBInfo->IF_DEF_CH7007 == 1) /* [Billy] 07/05/23 For CH7007 */
4212 {
4213
4214 }
4215
4216
4217 if ( pXGIHWDE->jChipType == XG27 )
4218 {
4219 if ( pVBInfo->IF_DEF_LVDS == 1 )
4220 {
4221 if (!(XGI_XG27GetPSCValue( pVBInfo )&0x1))
4222 {
4223 XGI_XG27BLSignalVDD( 0x01 , 0x01, pVBInfo ) ; /* LVDS VDD on */
4224 XGI_XG21SetPanelDelay( 2,pVBInfo ) ;
4225 }
4226 if (!(XGI_XG27GetPSCValue( pVBInfo )&0x20))
4227 {
4228 XGI_XG27BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* LVDS signal on */
4229 }
4230 XGI_XG21SetPanelDelay( 3,pVBInfo ) ;
4231 XGI_XG27BLSignalVDD( 0x02 , 0x02, pVBInfo ) ; /* LVDS backlight on */
4232 }
4233 else
4234 {
4235 XGI_XG27BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* DVO/DVI signal on */
4236 }
4237
4238 }
4239 }
4240
4241
4242 /* --------------------------------------------------------------------- */
4243 /* Function : XGI_DisplayOff */
4244 /* Input : */
4245 /* Output : */
4246 /* Description : */
4247 /* --------------------------------------------------------------------- */
4248 void XGI_DisplayOff(struct xgi_hw_device_info *pXGIHWDE, struct vb_device_info *pVBInfo)
4249 {
4250
4251 if ( pXGIHWDE->jChipType == XG21 )
4252 {
4253 if ( pVBInfo->IF_DEF_LVDS == 1 )
4254 {
4255 XGI_XG21BLSignalVDD( 0x02 , 0x00, pVBInfo ) ; /* LVDS backlight off */
4256 XGI_XG21SetPanelDelay( 3,pVBInfo ) ;
4257 }
4258 else
4259 {
4260 XGI_XG21BLSignalVDD( 0x20 , 0x00, pVBInfo ) ; /* DVO/DVI signal off */
4261 }
4262 }
4263
4264 if (pVBInfo->IF_DEF_CH7007 == 1) /*[Billy] 07/05/23 For CH7007 */
4265 {
4266 /* if( IsCH7007TVMode( pVBInfo ) == 0 ) */
4267 {
4268 }
4269 }
4270
4271
4272 if ( pXGIHWDE->jChipType == XG27 )
4273 {
4274 if ((XGI_XG27GetPSCValue( pVBInfo )&0x2))
4275 {
4276 XGI_XG27BLSignalVDD( 0x02 , 0x00, pVBInfo ) ; /* LVDS backlight off */
4277 XGI_XG21SetPanelDelay( 3,pVBInfo ) ;
4278 }
4279
4280 if ( pVBInfo->IF_DEF_LVDS == 0 )
4281 {
4282 XGI_XG27BLSignalVDD( 0x20 , 0x00, pVBInfo ) ; /* DVO/DVI signal off */
4283 }
4284 }
4285
4286 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xDF , 0x20 ) ;
4287 }
4288
4289
4290 /* --------------------------------------------------------------------- */
4291 /* Function : XGI_WaitDisply */
4292 /* Input : */
4293 /* Output : */
4294 /* Description : chiawen for sensecrt1 */
4295 /* --------------------------------------------------------------------- */
4296 void XGI_WaitDisply(struct vb_device_info *pVBInfo)
4297 {
4298 while( ( XGINew_GetReg2( pVBInfo->P3da ) & 0x01 ) )
4299 break ;
4300
4301 while( !( XGINew_GetReg2( pVBInfo->P3da ) & 0x01 ) )
4302 break ;
4303 }
4304
4305 /* --------------------------------------------------------------------- */
4306 /* Function : XGI_SenseCRT1 */
4307 /* Input : */
4308 /* Output : */
4309 /* Description : */
4310 /* --------------------------------------------------------------------- */
4311
4312 void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
4313 {
4314 unsigned char CRTCData[17] = {
4315 0x5F , 0x4F , 0x50 , 0x82 , 0x55 , 0x81 ,
4316 0x0B , 0x3E , 0xE9 , 0x0B , 0xDF , 0xE7 ,
4317 0x04 , 0x00 , 0x00 , 0x05 , 0x00 };
4318
4319 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
4320
4321 unsigned char CR17, CR63, SR31;
4322 unsigned short temp ;
4323 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F } ;
4324
4325 int i ;
4326 XGINew_SetReg1( pVBInfo->P3c4 , 0x05 , 0x86 ) ;
4327
4328 /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */
4329 XGINew_SetReg1( pVBInfo->P3d4 , 0x57 , 0x4A ) ;
4330 XGINew_SetReg1(pVBInfo->P3d4, 0x53, (unsigned char)(XGINew_GetReg1(pVBInfo->P3d4, 0x53) | 0x02));
4331
4332 SR31 = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x31);
4333 CR63 = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x63);
4334 SR01 = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x01);
4335
4336 XGINew_SetReg1(pVBInfo->P3c4, 0x01, (unsigned char)(SR01 & 0xDF));
4337 XGINew_SetReg1(pVBInfo->P3d4, 0x63, (unsigned char)(CR63 & 0xBF));
4338
4339 CR17 = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x17);
4340 XGINew_SetReg1(pVBInfo->P3d4, 0x17, (unsigned char)(CR17 | 0x80)) ;
4341
4342 SR1F = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x1F);
4343 XGINew_SetReg1(pVBInfo->P3c4, 0x1F, (unsigned char)(SR1F | 0x04));
4344
4345 SR07 = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x07);
4346 XGINew_SetReg1(pVBInfo->P3c4, 0x07, (unsigned char)(SR07 & 0xFB));
4347 SR06 = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x06);
4348 XGINew_SetReg1(pVBInfo->P3c4, 0x06, (unsigned char)(SR06 & 0xC3));
4349
4350 XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , 0x00 ) ;
4351
4352 for( i = 0 ; i < 8 ; i++ )
4353 XGINew_SetReg1(pVBInfo->P3d4, (unsigned short)i, CRTCData[i]);
4354
4355 for( i = 8 ; i < 11 ; i++ )
4356 XGINew_SetReg1(pVBInfo->P3d4, (unsigned short)(i + 8), CRTCData[i]);
4357
4358 for( i = 11 ; i < 13 ; i++ )
4359 XGINew_SetReg1(pVBInfo->P3d4, (unsigned short)(i + 4), CRTCData[i]);
4360
4361 for( i = 13 ; i < 16 ; i++ )
4362 XGINew_SetReg1(pVBInfo->P3c4, (unsigned short)(i - 3), CRTCData[i]);
4363
4364 XGINew_SetReg1(pVBInfo->P3c4, 0x0E, (unsigned char)(CRTCData[16] & 0xE0));
4365
4366 XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , 0x00 ) ;
4367 XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , 0x1B ) ;
4368 XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , 0xE1 ) ;
4369
4370 XGINew_SetReg3( pVBInfo->P3c8 , 0x00 ) ;
4371
4372 for( i = 0 ; i < 256 ; i++ )
4373 {
4374 XGINew_SetReg3((pVBInfo->P3c8 + 1), (unsigned char)DAC_TEST_PARMS[0]);
4375 XGINew_SetReg3((pVBInfo->P3c8 + 1), (unsigned char)DAC_TEST_PARMS[1]);
4376 XGINew_SetReg3((pVBInfo->P3c8 + 1), (unsigned char)DAC_TEST_PARMS[2]);
4377 }
4378
4379 XGI_VBLongWait( pVBInfo ) ;
4380 XGI_VBLongWait( pVBInfo ) ;
4381 XGI_VBLongWait( pVBInfo ) ;
4382
4383 XGINew_LCD_Wait_Time( 0x01 , pVBInfo ) ;
4384
4385 XGI_WaitDisply( pVBInfo ) ;
4386 temp = XGINew_GetReg2( pVBInfo->P3c2 ) ;
4387
4388 if( temp & 0x10 )
4389 {
4390 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x32 , 0xDF , 0x20 ) ;
4391 }
4392 else
4393 {
4394 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x32 , 0xDF , 0x00 ) ;
4395 }
4396
4397 /* alan, avoid display something, set BLACK DAC if not restore DAC */
4398 XGINew_SetReg3( pVBInfo->P3c8 , 0x00 ) ;
4399
4400 for( i = 0 ; i < 256 ; i++ )
4401 {
4402 XGINew_SetReg3( ( pVBInfo->P3c8 + 1 ) , 0 ) ;
4403 XGINew_SetReg3( ( pVBInfo->P3c8 + 1 ) , 0 ) ;
4404 XGINew_SetReg3( ( pVBInfo->P3c8 + 1 ) , 0 ) ;
4405 }
4406
4407 XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , SR01 ) ;
4408 XGINew_SetReg1( pVBInfo->P3d4 , 0x63 , CR63 ) ;
4409 XGINew_SetReg1( pVBInfo->P3c4 , 0x31 , SR31 ) ;
4410
4411 /* [2004/05/11] Vicent */
4412 XGINew_SetReg1(pVBInfo->P3d4, 0x53,
4413 (unsigned char)(XGINew_GetReg1(pVBInfo->P3d4, 0x53) & 0xFD));
4414 XGINew_SetReg1(pVBInfo->P3c4, 0x1F, (unsigned char)SR1F);
4415 }
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426 /* --------------------------------------------------------------------- */
4427 /* Function : XGI_WaitDisplay */
4428 /* Input : */
4429 /* Output : */
4430 /* Description : */
4431 /* --------------------------------------------------------------------- */
4432 void XGI_WaitDisplay(struct vb_device_info *pVBInfo)
4433 {
4434 while( !( XGINew_GetReg2( pVBInfo->P3da ) & 0x01 ) ) ;
4435
4436 while( XGINew_GetReg2( pVBInfo->P3da ) & 0x01 ) ;
4437 }
4438
4439
4440
4441
4442 /* --------------------------------------------------------------------- */
4443 /* Function : XGI_SetCRT2Group301 */
4444 /* Input : */
4445 /* Output : */
4446 /* Description : */
4447 /* --------------------------------------------------------------------- */
4448 unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
4449 struct xgi_hw_device_info *HwDeviceExtension,
4450 struct vb_device_info *pVBInfo)
4451 {
4452 unsigned short tempbx ,
4453 ModeIdIndex ,
4454 RefreshRateTableIndex ;
4455
4456 tempbx=pVBInfo->VBInfo ;
4457 pVBInfo->SetFlag |= ProgrammingCRT2 ;
4458 XGI_SearchModeID( ModeNo , &ModeIdIndex, pVBInfo ) ;
4459 pVBInfo->SelectCRT2Rate = 4 ;
4460 RefreshRateTableIndex = XGI_GetRatePtrCRT2( HwDeviceExtension, ModeNo , ModeIdIndex, pVBInfo ) ;
4461 XGI_SaveCRT2Info( ModeNo, pVBInfo ) ;
4462 XGI_GetCRT2ResInfo( ModeNo , ModeIdIndex, pVBInfo) ;
4463 XGI_GetCRT2Data( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
4464 XGI_PreSetGroup1( ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
4465 XGI_SetGroup1( ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
4466 XGI_SetLockRegs( ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
4467 XGI_SetGroup2( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
4468 XGI_SetLCDRegs(ModeNo , ModeIdIndex , HwDeviceExtension , RefreshRateTableIndex, pVBInfo ) ;
4469 XGI_SetTap4Regs(pVBInfo) ;
4470 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
4471 XGI_SetGroup4( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
4472 XGI_SetCRT2VCLK( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
4473 XGI_SetGroup5( ModeNo , ModeIdIndex, pVBInfo) ;
4474 XGI_AutoThreshold( pVBInfo) ;
4475 return 1 ;
4476 }
4477
4478
4479 /* --------------------------------------------------------------------- */
4480 /* Function : XGI_AutoThreshold */
4481 /* Input : */
4482 /* Output : */
4483 /* Description : */
4484 /* --------------------------------------------------------------------- */
4485 void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
4486 {
4487 if ( !( pVBInfo->SetFlag & Win9xDOSMode ) )
4488 XGINew_SetRegOR( pVBInfo->Part1Port , 0x01 , 0x40 ) ;
4489 }
4490
4491
4492 /* --------------------------------------------------------------------- */
4493 /* Function : XGI_SaveCRT2Info */
4494 /* Input : */
4495 /* Output : */
4496 /* Description : */
4497 /* --------------------------------------------------------------------- */
4498 void XGI_SaveCRT2Info(unsigned short ModeNo, struct vb_device_info *pVBInfo)
4499 {
4500 unsigned short temp1 ,
4501 temp2 ;
4502
4503 XGINew_SetReg1( pVBInfo->P3d4 , 0x34 , ModeNo ) ; /* reserve CR34 for CRT1 Mode No */
4504 temp1 = ( pVBInfo->VBInfo&SetInSlaveMode ) >> 8 ;
4505 temp2 = ~( SetInSlaveMode >> 8 ) ;
4506 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x31 , temp2 , temp1 ) ;
4507 }
4508
4509
4510 /* --------------------------------------------------------------------- */
4511 /* Function : XGI_GetCRT2ResInfo */
4512 /* Input : */
4513 /* Output : */
4514 /* Description : */
4515 /* --------------------------------------------------------------------- */
4516 void XGI_GetCRT2ResInfo(unsigned short ModeNo,
4517 unsigned short ModeIdIndex,
4518 struct vb_device_info *pVBInfo)
4519 {
4520 unsigned short xres ,
4521 yres ,
4522 modeflag ,
4523 resindex ;
4524
4525 resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo) ;
4526 if ( ModeNo <= 0x13 )
4527 {
4528 xres = pVBInfo->StResInfo[ resindex ].HTotal ;
4529 yres = pVBInfo->StResInfo[ resindex ].VTotal ;
4530 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; si+St_ResInfo */
4531 }
4532 else
4533 {
4534 xres = pVBInfo->ModeResInfo[ resindex ].HTotal ; /* xres->ax */
4535 yres = pVBInfo->ModeResInfo[ resindex ].VTotal ; /* yres->bx */
4536 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ; /* si+St_ModeFlag */
4537
4538 /* if ( pVBInfo->IF_DEF_FSTN )
4539 {
4540 xres *= 2 ;
4541 yres *= 2 ;
4542 }
4543 else
4544 {
4545 */
4546 if ( modeflag & HalfDCLK )
4547 xres *= 2;
4548
4549 if ( modeflag & DoubleScanMode )
4550 yres *= 2 ;
4551 /* } */
4552 }
4553
4554 if ( pVBInfo->VBInfo & SetCRT2ToLCD )
4555 {
4556 if ( pVBInfo->IF_DEF_LVDS == 0 )
4557 {
4558 if ( pVBInfo->LCDResInfo == Panel1600x1200 )
4559 {
4560 if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
4561 {
4562 if ( yres == 1024 )
4563 yres = 1056 ;
4564 }
4565 }
4566
4567 if ( pVBInfo->LCDResInfo == Panel1280x1024 )
4568 {
4569 if ( yres == 400 )
4570 yres = 405 ;
4571 else if ( yres == 350 )
4572 yres = 360 ;
4573
4574 if ( pVBInfo->LCDInfo & LCDVESATiming )
4575 {
4576 if ( yres == 360 )
4577 yres = 375 ;
4578 }
4579 }
4580
4581 if ( pVBInfo->LCDResInfo == Panel1024x768 )
4582 {
4583 if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
4584 {
4585 if ( !( pVBInfo->LCDInfo & LCDNonExpanding ) )
4586 {
4587 if ( yres == 350 )
4588 yres = 357 ;
4589 else if ( yres == 400 )
4590 yres = 420 ;
4591 else if ( yres == 480 )
4592 yres = 525 ;
4593 }
4594 }
4595 }
4596 }
4597
4598 if ( xres == 720 )
4599 xres = 640 ;
4600 }
4601
4602 pVBInfo->VGAHDE = xres ;
4603 pVBInfo->HDE = xres ;
4604 pVBInfo->VGAVDE = yres ;
4605 pVBInfo->VDE = yres ;
4606 }
4607
4608
4609 /* --------------------------------------------------------------------- */
4610 /* Function : XGI_IsLCDDualLink */
4611 /* Input : */
4612 /* Output : */
4613 /* Description : */
4614 /* --------------------------------------------------------------------- */
4615 unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
4616 {
4617
4618 if ( ( ( ( pVBInfo->VBInfo & SetCRT2ToLCD ) | SetCRT2ToLCDA ) ) && ( pVBInfo->LCDInfo & SetLCDDualLink ) ) /* shampoo0129 */
4619 return ( 1 ) ;
4620
4621 return( 0 ) ;
4622 }
4623
4624
4625 /* --------------------------------------------------------------------- */
4626 /* Function : XGI_GetCRT2Data */
4627 /* Input : */
4628 /* Output : */
4629 /* Description : */
4630 /* --------------------------------------------------------------------- */
4631 void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo)
4632 {
4633 unsigned short tempax = 0,
4634 tempbx ,
4635 modeflag ,
4636 resinfo ;
4637
4638 struct XGI_LCDDataStruct *LCDPtr = NULL ;
4639 struct XGI_TVDataStruct *TVPtr = NULL ;
4640
4641 if ( ModeNo <= 0x13 )
4642 {
4643 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; /* si+St_ResInfo */
4644 resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
4645 }
4646 else
4647 {
4648 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; /* si+Ext_ResInfo */
4649 resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
4650 }
4651
4652 pVBInfo->NewFlickerMode = 0 ;
4653 pVBInfo->RVBHRS = 50 ;
4654
4655 if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
4656 {
4657 XGI_GetRAMDAC2DATA( ModeNo , ModeIdIndex , RefreshRateTableIndex,pVBInfo ) ;
4658 return ;
4659 }
4660
4661 tempbx = 4 ;
4662
4663 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
4664 {
4665 LCDPtr = (struct XGI_LCDDataStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
4666
4667 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX ;
4668 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT ;
4669 pVBInfo->VGAHT = LCDPtr->VGAHT ;
4670 pVBInfo->VGAVT = LCDPtr->VGAVT ;
4671 pVBInfo->HT = LCDPtr->LCDHT ;
4672 pVBInfo->VT = LCDPtr->LCDVT ;
4673
4674 if ( pVBInfo->LCDResInfo == Panel1024x768 )
4675 {
4676 tempax = 1024 ;
4677 tempbx = 768 ;
4678
4679 if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
4680 {
4681 if ( pVBInfo->VGAVDE == 357 )
4682 tempbx = 527 ;
4683 else if ( pVBInfo->VGAVDE == 420 )
4684 tempbx = 620 ;
4685 else if ( pVBInfo->VGAVDE == 525 )
4686 tempbx = 775 ;
4687 else if ( pVBInfo->VGAVDE == 600 )
4688 tempbx = 775 ;
4689 /* else if(pVBInfo->VGAVDE==350) tempbx=560; */
4690 /* else if(pVBInfo->VGAVDE==400) tempbx=640; */
4691 else
4692 tempbx = 768 ;
4693 }
4694 else
4695 tempbx = 768 ;
4696 }
4697 else if ( pVBInfo->LCDResInfo == Panel1024x768x75 )
4698 {
4699 tempax = 1024 ;
4700 tempbx = 768 ;
4701 }
4702 else if ( pVBInfo->LCDResInfo == Panel1280x1024 )
4703 {
4704 tempax = 1280 ;
4705 if ( pVBInfo->VGAVDE == 360 )
4706 tempbx = 768 ;
4707 else if ( pVBInfo->VGAVDE == 375 )
4708 tempbx = 800 ;
4709 else if ( pVBInfo->VGAVDE == 405 )
4710 tempbx = 864 ;
4711 else
4712 tempbx = 1024 ;
4713 }
4714 else if ( pVBInfo->LCDResInfo == Panel1280x1024x75 )
4715 {
4716 tempax = 1280 ;
4717 tempbx = 1024 ;
4718 }
4719 else if ( pVBInfo->LCDResInfo == Panel1280x960 )
4720 {
4721 tempax = 1280 ;
4722 if ( pVBInfo->VGAVDE == 350 )
4723 tempbx = 700 ;
4724 else if ( pVBInfo->VGAVDE == 400 )
4725 tempbx = 800 ;
4726 else if ( pVBInfo->VGAVDE == 1024 )
4727 tempbx = 960 ;
4728 else
4729 tempbx = 960 ;
4730 }
4731 else if ( pVBInfo->LCDResInfo == Panel1400x1050 )
4732 {
4733 tempax = 1400 ;
4734 tempbx = 1050 ;
4735
4736 if ( pVBInfo->VGAVDE == 1024 )
4737 {
4738 tempax = 1280 ;
4739 tempbx = 1024 ;
4740 }
4741 }
4742 else if ( pVBInfo->LCDResInfo == Panel1600x1200 )
4743 {
4744 tempax = 1600 ;
4745 tempbx = 1200 ; /* alan 10/14/2003 */
4746 if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
4747 {
4748 if ( pVBInfo->VGAVDE == 350 )
4749 tempbx = 875 ;
4750 else if ( pVBInfo->VGAVDE == 400 )
4751 tempbx = 1000 ;
4752 }
4753 }
4754
4755 if ( pVBInfo->LCDInfo & LCDNonExpanding )
4756 {
4757 tempax = pVBInfo->VGAHDE ;
4758 tempbx = pVBInfo->VGAVDE ;
4759 }
4760
4761 pVBInfo->HDE = tempax ;
4762 pVBInfo->VDE = tempbx ;
4763 return ;
4764 }
4765
4766 if ( pVBInfo->VBInfo & ( SetCRT2ToTV ) )
4767 {
4768 tempbx = 4 ;
4769 TVPtr = (struct XGI_TVDataStruct *)XGI_GetTVPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
4770
4771 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX ;
4772 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT ;
4773 pVBInfo->VGAHT = TVPtr->VGAHT ;
4774 pVBInfo->VGAVT = TVPtr->VGAVT ;
4775 pVBInfo->HDE = TVPtr->TVHDE ;
4776 pVBInfo->VDE = TVPtr->TVVDE ;
4777 pVBInfo->RVBHRS = TVPtr->RVBHRS ;
4778 pVBInfo->NewFlickerMode = TVPtr->FlickerMode ;
4779
4780 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
4781 {
4782 if ( resinfo == 0x08 )
4783 pVBInfo->NewFlickerMode = 0x40 ;
4784 else if ( resinfo == 0x09 )
4785 pVBInfo->NewFlickerMode = 0x40 ;
4786 else if ( resinfo == 0x12 )
4787 pVBInfo->NewFlickerMode = 0x40 ;
4788
4789 if ( pVBInfo->VGAVDE == 350 )
4790 pVBInfo->TVInfo |= TVSimuMode ;
4791
4792 tempax = ExtHiTVHT ;
4793 tempbx = ExtHiTVVT ;
4794
4795 if ( pVBInfo->VBInfo & SetInSlaveMode )
4796 {
4797 if ( pVBInfo->TVInfo & TVSimuMode )
4798 {
4799 tempax = StHiTVHT ;
4800 tempbx = StHiTVVT ;
4801
4802 if ( !( modeflag & Charx8Dot ) )
4803 {
4804 tempax = StHiTextTVHT ;
4805 tempbx = StHiTextTVVT ;
4806 }
4807 }
4808 }
4809 }
4810 else if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
4811 {
4812 if ( pVBInfo->TVInfo & SetYPbPrMode750p )
4813 {
4814 tempax = YPbPrTV750pHT ; /* Ext750pTVHT */
4815 tempbx = YPbPrTV750pVT ; /* Ext750pTVVT */
4816 }
4817
4818 if ( pVBInfo->TVInfo & SetYPbPrMode525p )
4819 {
4820 tempax = YPbPrTV525pHT ; /* Ext525pTVHT */
4821 tempbx = YPbPrTV525pVT ; /* Ext525pTVVT */
4822 }
4823 else if ( pVBInfo->TVInfo & SetYPbPrMode525i )
4824 {
4825 tempax = YPbPrTV525iHT ; /* Ext525iTVHT */
4826 tempbx = YPbPrTV525iVT ; /* Ext525iTVVT */
4827 if ( pVBInfo->TVInfo & NTSC1024x768 )
4828 tempax = NTSC1024x768HT ;
4829 }
4830 }
4831 else
4832 {
4833 tempax = PALHT ;
4834 tempbx = PALVT ;
4835 if ( !( pVBInfo->TVInfo & SetPALTV ) )
4836 {
4837 tempax = NTSCHT ;
4838 tempbx = NTSCVT ;
4839 if ( pVBInfo->TVInfo & NTSC1024x768 )
4840 tempax = NTSC1024x768HT ;
4841 }
4842 }
4843
4844 pVBInfo->HT = tempax ;
4845 pVBInfo->VT = tempbx ;
4846 return ;
4847 }
4848 }
4849
4850
4851 /* --------------------------------------------------------------------- */
4852 /* Function : XGI_SetCRT2VCLK */
4853 /* Input : */
4854 /* Output : */
4855 /* Description : */
4856 /* --------------------------------------------------------------------- */
4857 void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo)
4858 {
4859 unsigned char di_0, di_1, tempal;
4860
4861 tempal = XGI_GetVCLKPtr( RefreshRateTableIndex , ModeNo , ModeIdIndex, pVBInfo ) ;
4862 XGI_GetVCLKLen( tempal, &di_0 , &di_1, pVBInfo ) ;
4863 XGI_GetLCDVCLKPtr( &di_0 , &di_1, pVBInfo ) ;
4864
4865 if ( pVBInfo->VBType & VB_XGI301 ) /* shampoo 0129 */
4866 { /* 301 */
4867 XGINew_SetReg1(pVBInfo->Part4Port , 0x0A , 0x10 ) ;
4868 XGINew_SetReg1(pVBInfo->Part4Port , 0x0B , di_1 ) ;
4869 XGINew_SetReg1(pVBInfo->Part4Port , 0x0A , di_0 ) ;
4870 }
4871 else
4872 { /* 301b/302b/301lv/302lv */
4873 XGINew_SetReg1( pVBInfo->Part4Port , 0x0A , di_0 ) ;
4874 XGINew_SetReg1( pVBInfo->Part4Port , 0x0B , di_1 ) ;
4875 }
4876
4877 XGINew_SetReg1( pVBInfo->Part4Port , 0x00 , 0x12 ) ;
4878
4879 if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
4880 XGINew_SetRegOR( pVBInfo->Part4Port , 0x12 , 0x28 ) ;
4881 else
4882 XGINew_SetRegOR( pVBInfo->Part4Port , 0x12 , 0x08 ) ;
4883 }
4884
4885
4886 /* --------------------------------------------------------------------- */
4887 /* Function : XGI_GETLCDVCLKPtr */
4888 /* Input : */
4889 /* Output : al -> VCLK Index */
4890 /* Description : */
4891 /* --------------------------------------------------------------------- */
4892 void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
4893 struct vb_device_info *pVBInfo)
4894 {
4895 unsigned short index ;
4896
4897 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
4898 {
4899 if ( pVBInfo->IF_DEF_ScaleLCD == 1 )
4900 {
4901 if ( pVBInfo->LCDInfo & EnableScalingLCD )
4902 return ;
4903 }
4904
4905 /* index = XGI_GetLCDCapPtr(pVBInfo) ; */
4906 index = XGI_GetLCDCapPtr1( pVBInfo) ;
4907
4908 if ( pVBInfo->VBInfo & SetCRT2ToLCD )
4909 { /* LCDB */
4910 *di_0 = pVBInfo->LCDCapList[ index ].LCUCHAR_VCLKData1 ;
4911 *di_1 = pVBInfo->LCDCapList[ index ].LCUCHAR_VCLKData2 ;
4912 }
4913 else
4914 { /* LCDA */
4915 *di_0 = pVBInfo->LCDCapList[ index ].LCDA_VCLKData1 ;
4916 *di_1 = pVBInfo->LCDCapList[ index ].LCDA_VCLKData2 ;
4917 }
4918 }
4919 return ;
4920 }
4921
4922
4923 /* --------------------------------------------------------------------- */
4924 /* Function : XGI_GetVCLKPtr */
4925 /* Input : */
4926 /* Output : */
4927 /* Description : */
4928 /* --------------------------------------------------------------------- */
4929 unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
4930 unsigned short ModeNo, unsigned short ModeIdIndex,
4931 struct vb_device_info *pVBInfo)
4932 {
4933
4934 unsigned short index ,
4935 modeflag ;
4936 unsigned short tempbx ;
4937 unsigned char tempal;
4938 unsigned char *CHTVVCLKPtr = NULL;
4939
4940 if ( ModeNo <= 0x13 )
4941 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; /* si+St_ResInfo */
4942 else
4943 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
4944
4945
4946 if ( ( pVBInfo->SetFlag & ProgrammingCRT2 ) && ( !( pVBInfo->LCDInfo & EnableScalingLCD ) ) )
4947 { /* {LCDA/LCDB} */
4948 index = XGI_GetLCDCapPtr(pVBInfo) ;
4949 tempal = pVBInfo->LCDCapList[ index ].LCD_VCLK ;
4950
4951 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
4952 return tempal ;
4953
4954 /* {TV} */
4955 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV| VB_XGI302LV| VB_XGI301C ) )
4956 {
4957 if(pVBInfo->VBInfo&SetCRT2ToHiVisionTV)
4958 {
4959 tempal = HiTVVCLKDIV2;
4960 if(!(pVBInfo->TVInfo & RPLLDIV2XO))
4961 tempal = HiTVVCLK;
4962 if(pVBInfo->TVInfo & TVSimuMode)
4963 {
4964 tempal = HiTVSimuVCLK;
4965 if(!(modeflag & Charx8Dot))
4966 tempal = HiTVTextVCLK;
4967
4968 }
4969 return tempal;
4970 }
4971
4972 if ( pVBInfo->TVInfo & SetYPbPrMode750p )
4973 {
4974 tempal = YPbPr750pVCLK ;
4975 return tempal ;
4976 }
4977
4978 if ( pVBInfo->TVInfo & SetYPbPrMode525p )
4979 {
4980 tempal = YPbPr525pVCLK ;
4981 return tempal ;
4982 }
4983
4984 tempal = NTSC1024VCLK ;
4985
4986 if ( !( pVBInfo->TVInfo & NTSC1024x768 ) )
4987 {
4988 tempal = TVVCLKDIV2 ;
4989 if ( !( pVBInfo->TVInfo & RPLLDIV2XO ) )
4990 tempal = TVVCLK ;
4991 }
4992
4993 if ( pVBInfo->VBInfo & SetCRT2ToTV )
4994 return tempal ;
4995 }
4996 /*else
4997 if((pVBInfo->IF_DEF_CH7017==1)&&(pVBInfo->VBType&VB_CH7017))
4998 {
4999 if(ModeNo<=0x13)
5000 *tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
5001 else
5002 *tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
5003 *tempal = *tempal & 0x1F;
5004
5005 tempbx = 0;
5006 if(pVBInfo->TVInfo & SetPALTV)
5007 tempbx = tempbx + 2;
5008 if(pVBInfo->TVInfo & SetCHTVOverScan)
5009 tempbx++;
5010 tempbx = tempbx << 1;
5011 } */
5012 } /* {End of VB} */
5013
5014 if((pVBInfo->IF_DEF_CH7007==1)&&(pVBInfo->VBType&VB_CH7007)) /* [Billy] 07/05/08 CH7007 */
5015 {
5016 /* VideoDebugPrint((0, "XGI_GetVCLKPtr: pVBInfo->IF_DEF_CH7007==1\n")); */
5017 if ( (pVBInfo->VBInfo & SetCRT2ToTV) )
5018 {
5019 if( ModeNo <= 0x13 )
5020 {
5021 tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
5022 }
5023 else
5024 {
5025 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
5026 }
5027
5028 tempal = tempal & 0x0F;
5029 tempbx = 0;
5030
5031 if(pVBInfo->TVInfo & SetPALTV)
5032 {
5033 tempbx = tempbx + 2;
5034 }
5035 if(pVBInfo->TVInfo & SetCHTVOverScan)
5036 {
5037 tempbx++;
5038 }
5039 /** tempbx = tempbx << 1; CH7007 ? **/
5040
5041 /*[Billy]07/05/29 CH7007*/
5042 if ( pVBInfo->IF_DEF_CH7007 == 1 )
5043 {
5044 switch( tempbx )
5045 {
5046 case 0:
5047 CHTVVCLKPtr = XGI7007_CHTVVCLKUNTSC ;
5048 break ;
5049 case 1:
5050 CHTVVCLKPtr = XGI7007_CHTVVCLKONTSC ;
5051 break ;
5052 case 2:
5053 CHTVVCLKPtr = XGI7007_CHTVVCLKUPAL ;
5054 break ;
5055 case 3:
5056 CHTVVCLKPtr = XGI7007_CHTVVCLKOPAL ;
5057 break ;
5058 default:
5059 break ;
5060
5061 }
5062 }
5063 /*else
5064 {
5065 switch( tempbx )
5066 {
5067 case 0:
5068 CHTVVCLKPtr = pVBInfo->CHTVVCLKUNTSC ;
5069 break ;
5070 case 1:
5071 CHTVVCLKPtr = pVBInfo->CHTVVCLKONTSC ;
5072 break ;
5073 case 2:
5074 CHTVVCLKPtr = pVBInfo->CHTVVCLKUPAL ;
5075 break ;
5076 case 3:
5077 CHTVVCLKPtr = pVBInfo->CHTVVCLKOPAL ;
5078 break ;
5079 default:
5080 break ;
5081 }
5082 }*/
5083
5084 tempal = CHTVVCLKPtr[ tempal ] ;
5085 return tempal ;
5086 }
5087
5088 }
5089
5090 tempal = (unsigned char)XGINew_GetReg2((pVBInfo->P3ca + 0x02));
5091 tempal = tempal >> 2 ;
5092 tempal &= 0x03 ;
5093
5094 if ( ( pVBInfo->LCDInfo & EnableScalingLCD ) && ( modeflag & Charx8Dot ) ) /* for Dot8 Scaling LCD */
5095 tempal = tempal ^ tempal ; /* ; set to VCLK25MHz always */
5096
5097 if ( ModeNo <= 0x13 )
5098 return tempal ;
5099
5100 tempal = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ;
5101 return tempal ;
5102 }
5103
5104
5105 /* --------------------------------------------------------------------- */
5106 /* Function : XGI_GetVCLKLen */
5107 /* Input : */
5108 /* Output : */
5109 /* Description : */
5110 /* --------------------------------------------------------------------- */
5111 void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
5112 unsigned char *di_1, struct vb_device_info *pVBInfo)
5113 {
5114 if ( pVBInfo->IF_DEF_CH7007 == 1 ) /* [Billy] 2007/05/16 */
5115 {
5116 /* VideoDebugPrint((0, "XGI_GetVCLKLen: pVBInfo->IF_DEF_CH7007==1\n")); */
5117 *di_0 = (unsigned char)XGI_CH7007VCLKData[tempal].SR2B;
5118 *di_1 = (unsigned char)XGI_CH7007VCLKData[tempal].SR2C;
5119 }
5120 else if ( pVBInfo->VBType & ( VB_XGI301 | VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
5121 {
5122 if ( ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) ) && ( pVBInfo->SetFlag & ProgrammingCRT2 ) )
5123 {
5124 *di_0 = (unsigned char)XGI_VBVCLKData[tempal].SR2B;
5125 *di_1 = XGI_VBVCLKData[ tempal ].SR2C ;
5126 }
5127 }
5128 else
5129 {
5130 *di_0 = XGI_VCLKData[ tempal ].SR2B ;
5131 *di_1 = XGI_VCLKData[ tempal ].SR2C ;
5132 }
5133 }
5134
5135
5136 /* --------------------------------------------------------------------- */
5137 /* Function : XGI_SetCRT2Offset */
5138 /* Input : */
5139 /* Output : */
5140 /* Description : */
5141 /* --------------------------------------------------------------------- */
5142 void XGI_SetCRT2Offset(unsigned short ModeNo,
5143 unsigned short ModeIdIndex,
5144 unsigned short RefreshRateTableIndex,
5145 struct xgi_hw_device_info *HwDeviceExtension,
5146 struct vb_device_info *pVBInfo)
5147 {
5148 unsigned short offset ;
5149 unsigned char temp;
5150
5151 if ( pVBInfo->VBInfo & SetInSlaveMode )
5152 {
5153 return ;
5154 }
5155
5156 offset = XGI_GetOffset( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
5157 temp = (unsigned char)(offset & 0xFF);
5158 XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , temp ) ;
5159 temp = (unsigned char)((offset & 0xFF00) >> 8);
5160 XGINew_SetReg1(pVBInfo->Part1Port , 0x09 , temp);
5161 temp = (unsigned char)(((offset >> 3) & 0xFF) + 1) ;
5162 XGINew_SetReg1(pVBInfo->Part1Port, 0x03, temp);
5163 }
5164
5165
5166 /* --------------------------------------------------------------------- */
5167 /* Function : XGI_GetOffset */
5168 /* Input : */
5169 /* Output : */
5170 /* Description : */
5171 /* --------------------------------------------------------------------- */
5172 unsigned short XGI_GetOffset(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
5173 {
5174 unsigned short temp ,
5175 colordepth ,
5176 modeinfo ,
5177 index ,
5178 infoflag ,
5179 ColorDepth[] = { 0x01 , 0x02 , 0x04 } ;
5180
5181 modeinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeInfo ;
5182 if ( ModeNo <= 0x14 )
5183 infoflag = 0 ;
5184 else
5185 infoflag = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_InfoFlag ;
5186
5187
5188 index = ( modeinfo >> 8 ) & 0xFF ;
5189
5190 temp = pVBInfo->ScreenOffset[ index ] ;
5191
5192 if ( infoflag & InterlaceMode )
5193 {
5194 temp = temp << 1 ;
5195 }
5196
5197 colordepth = XGI_GetColorDepth( ModeNo , ModeIdIndex, pVBInfo ) ;
5198
5199 if ( ( ModeNo >= 0x7C ) && ( ModeNo <= 0x7E ) )
5200 {
5201 temp = ModeNo - 0x7C ;
5202 colordepth = ColorDepth[ temp ] ;
5203 temp = 0x6B ;
5204 if ( infoflag & InterlaceMode )
5205 {
5206 temp = temp << 1 ;
5207 }
5208 return( temp * colordepth ) ;
5209 }
5210 else
5211 return( temp * colordepth ) ;
5212 }
5213
5214
5215 /* --------------------------------------------------------------------- */
5216 /* Function : XGI_SetCRT2FIFO */
5217 /* Input : */
5218 /* Output : */
5219 /* Description : */
5220 /* --------------------------------------------------------------------- */
5221 void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
5222 {
5223 XGINew_SetReg1( pVBInfo->Part1Port , 0x01 , 0x3B ) ; /* threshold high ,disable auto threshold */
5224 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x02 , ~( 0x3F ) , 0x04 ) ; /* threshold low default 04h */
5225 }
5226
5227
5228 /* --------------------------------------------------------------------- */
5229 /* Function : XGI_PreSetGroup1 */
5230 /* Input : */
5231 /* Output : */
5232 /* Description : */
5233 /* --------------------------------------------------------------------- */
5234 void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
5235 struct xgi_hw_device_info *HwDeviceExtension,
5236 unsigned short RefreshRateTableIndex,
5237 struct vb_device_info *pVBInfo)
5238 {
5239 unsigned short tempcx = 0 ,
5240 CRT1Index = 0 ,
5241 resinfo = 0 ;
5242
5243 if ( ModeNo > 0x13 )
5244 {
5245 CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
5246 CRT1Index &= IndexMask ;
5247 resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
5248 }
5249
5250 XGI_SetCRT2Offset( ModeNo , ModeIdIndex , RefreshRateTableIndex , HwDeviceExtension, pVBInfo ) ;
5251 XGI_SetCRT2FIFO(pVBInfo) ;
5252 /* XGI_SetCRT2Sync(ModeNo,RefreshRateTableIndex); */
5253
5254 for( tempcx = 4 ; tempcx < 7 ; tempcx++ )
5255 {
5256 XGINew_SetReg1( pVBInfo->Part1Port , tempcx , 0x0 ) ;
5257 }
5258
5259 XGINew_SetReg1( pVBInfo->Part1Port , 0x50 , 0x00 ) ;
5260 XGINew_SetReg1( pVBInfo->Part1Port , 0x02 , 0x44 ) ; /* temp 0206 */
5261 }
5262
5263
5264 /* --------------------------------------------------------------------- */
5265 /* Function : XGI_SetGroup1 */
5266 /* Input : */
5267 /* Output : */
5268 /* Description : */
5269 /* --------------------------------------------------------------------- */
5270 void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
5271 struct xgi_hw_device_info *HwDeviceExtension,
5272 unsigned short RefreshRateTableIndex,
5273 struct vb_device_info *pVBInfo)
5274 {
5275 unsigned short temp = 0 ,
5276 tempax = 0 ,
5277 tempbx = 0 ,
5278 tempcx = 0 ,
5279 pushbx = 0 ,
5280 CRT1Index = 0 ,
5281 modeflag ,
5282 resinfo = 0 ;
5283
5284 if ( ModeNo > 0x13 )
5285 {
5286 CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
5287 CRT1Index &= IndexMask ;
5288 resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
5289 }
5290
5291 if ( ModeNo <= 0x13 )
5292 {
5293 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
5294 }
5295 else
5296 {
5297 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
5298 }
5299
5300 /* bainy change table name */
5301 if ( modeflag & HalfDCLK )
5302 {
5303 temp = ( pVBInfo->VGAHT / 2 - 1 ) & 0x0FF ; /* BTVGA2HT 0x08,0x09 */
5304 XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , temp ) ;
5305 temp = ( ( ( pVBInfo->VGAHT / 2 - 1 ) & 0xFF00 ) >> 8 ) << 4 ;
5306 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x09 , ~0x0F0 , temp ) ;
5307 temp = ( pVBInfo->VGAHDE / 2 + 16 ) & 0x0FF ; /* BTVGA2HDEE 0x0A,0x0C */
5308 XGINew_SetReg1( pVBInfo->Part1Port , 0x0A , temp ) ;
5309 tempcx = ( ( pVBInfo->VGAHT - pVBInfo->VGAHDE ) / 2 ) >> 2 ;
5310 pushbx = pVBInfo->VGAHDE / 2 + 16 ;
5311 tempcx = tempcx >> 1 ;
5312 tempbx = pushbx + tempcx ; /* bx BTVGA@HRS 0x0B,0x0C */
5313 tempcx += tempbx ;
5314
5315 if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
5316 {
5317 tempbx = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 4 ] ;
5318 tempbx |= ( ( pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 14 ] & 0xC0 ) << 2 ) ;
5319 tempbx = ( tempbx - 3 ) << 3 ; /* (VGAHRS-3)*8 */
5320 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[ 5 ] ;
5321 tempcx &= 0x1F ;
5322 temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 15 ] ;
5323 temp = ( temp & 0x04 ) << ( 5 - 2 ) ; /* VGAHRE D[5] */
5324 tempcx = ( ( tempcx | temp ) - 3 ) << 3 ; /* (VGAHRE-3)*8 */
5325 }
5326
5327 tempbx += 4 ;
5328 tempcx += 4 ;
5329
5330 if ( tempcx > ( pVBInfo->VGAHT / 2 ) )
5331 tempcx = pVBInfo->VGAHT / 2 ;
5332
5333 temp = tempbx & 0x00FF ;
5334
5335 XGINew_SetReg1( pVBInfo->Part1Port , 0x0B , temp ) ;
5336 }
5337 else
5338 {
5339 temp = ( pVBInfo->VGAHT - 1 ) & 0x0FF ; /* BTVGA2HT 0x08,0x09 */
5340 XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , temp ) ;
5341 temp = ( ( ( pVBInfo->VGAHT - 1 ) & 0xFF00 ) >> 8 ) << 4 ;
5342 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x09 , ~0x0F0 , temp ) ;
5343 temp = ( pVBInfo->VGAHDE + 16 ) & 0x0FF ; /* BTVGA2HDEE 0x0A,0x0C */
5344 XGINew_SetReg1( pVBInfo->Part1Port , 0x0A , temp ) ;
5345 tempcx = ( pVBInfo->VGAHT - pVBInfo->VGAHDE ) >> 2 ; /* cx */
5346 pushbx = pVBInfo->VGAHDE + 16 ;
5347 tempcx = tempcx >> 1 ;
5348 tempbx = pushbx + tempcx ; /* bx BTVGA@HRS 0x0B,0x0C */
5349 tempcx += tempbx ;
5350
5351 if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
5352 {
5353 tempbx = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 3 ] ;
5354 tempbx |= ( ( pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 5 ] & 0xC0 ) << 2 ) ;
5355 tempbx = ( tempbx - 3 ) << 3 ; /* (VGAHRS-3)*8 */
5356 tempcx = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 4 ] ;
5357 tempcx &= 0x1F ;
5358 temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 6 ] ;
5359 temp = ( temp & 0x04 ) << ( 5 - 2 ) ; /* VGAHRE D[5] */
5360 tempcx = ( ( tempcx | temp ) - 3 ) << 3 ; /* (VGAHRE-3)*8 */
5361 tempbx += 16 ;
5362 tempcx += 16 ;
5363 }
5364
5365 if ( tempcx > pVBInfo->VGAHT )
5366 tempcx = pVBInfo->VGAHT ;
5367
5368 temp = tempbx & 0x00FF ;
5369 XGINew_SetReg1( pVBInfo->Part1Port , 0x0B , temp ) ;
5370 }
5371
5372 tempax = ( tempax & 0x00FF ) | ( tempbx & 0xFF00 ) ;
5373 tempbx = pushbx ;
5374 tempbx = ( tempbx & 0x00FF ) | ( ( tempbx & 0xFF00 ) << 4 ) ;
5375 tempax |= ( tempbx & 0xFF00 ) ;
5376 temp = ( tempax & 0xFF00 ) >> 8 ;
5377 XGINew_SetReg1( pVBInfo->Part1Port , 0x0C , temp ) ;
5378 temp = tempcx & 0x00FF ;
5379 XGINew_SetReg1( pVBInfo->Part1Port , 0x0D , temp ) ;
5380 tempcx = ( pVBInfo->VGAVT - 1 ) ;
5381 temp = tempcx & 0x00FF ;
5382
5383 if ( pVBInfo->IF_DEF_CH7005 == 1 )
5384 {
5385 if ( pVBInfo->VBInfo & 0x0C )
5386 {
5387 temp-- ;
5388 }
5389 }
5390
5391 XGINew_SetReg1( pVBInfo->Part1Port , 0x0E , temp ) ;
5392 tempbx = pVBInfo->VGAVDE - 1 ;
5393 temp = tempbx & 0x00FF ;
5394 XGINew_SetReg1( pVBInfo->Part1Port , 0x0F , temp ) ;
5395 temp = ( ( tempbx & 0xFF00 ) << 3 ) >> 8 ;
5396 temp |= ( ( tempcx & 0xFF00 ) >> 8 ) ;
5397 XGINew_SetReg1( pVBInfo->Part1Port , 0x12 , temp ) ;
5398
5399 tempax = pVBInfo->VGAVDE ;
5400 tempbx = pVBInfo->VGAVDE ;
5401 tempcx = pVBInfo->VGAVT ;
5402 tempbx = ( pVBInfo->VGAVT + pVBInfo->VGAVDE ) >> 1 ; /* BTVGA2VRS 0x10,0x11 */
5403 tempcx = ( ( pVBInfo->VGAVT - pVBInfo->VGAVDE ) >> 4 ) + tempbx + 1 ; /* BTVGA2VRE 0x11 */
5404
5405 if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
5406 {
5407 tempbx = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 10 ] ;
5408 temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 9 ] ;
5409
5410 if ( temp & 0x04 )
5411 tempbx |= 0x0100 ;
5412
5413 if ( temp & 0x080 )
5414 tempbx |= 0x0200 ;
5415
5416 temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 14 ] ;
5417
5418 if ( temp & 0x08 )
5419 tempbx |= 0x0400 ;
5420
5421 temp = pVBInfo->XGINEWUB_CRT1Table[ CRT1Index ].CR[ 11 ] ;
5422 tempcx = ( tempcx & 0xFF00 ) | ( temp & 0x00FF ) ;
5423 }
5424
5425 temp = tempbx & 0x00FF ;
5426 XGINew_SetReg1( pVBInfo->Part1Port , 0x10 , temp ) ;
5427 temp = ( ( tempbx & 0xFF00 ) >> 8 ) << 4 ;
5428 temp = ( ( tempcx & 0x000F ) | ( temp ) ) ;
5429 XGINew_SetReg1( pVBInfo->Part1Port , 0x11 , temp ) ;
5430 tempax = 0 ;
5431
5432 if ( modeflag & DoubleScanMode )
5433 tempax |= 0x80 ;
5434
5435 if ( modeflag & HalfDCLK )
5436 tempax |= 0x40 ;
5437
5438 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2C , ~0x0C0 , tempax ) ;
5439 }
5440
5441
5442 /* --------------------------------------------------------------------- */
5443 /* Function : XGI_SetLockRegs */
5444 /* Input : */
5445 /* Output : */
5446 /* Description : */
5447 /* --------------------------------------------------------------------- */
5448 void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
5449 struct xgi_hw_device_info *HwDeviceExtension,
5450 unsigned short RefreshRateTableIndex,
5451 struct vb_device_info *pVBInfo)
5452 {
5453 unsigned short push1 ,
5454 push2 ,
5455 tempax ,
5456 tempbx = 0 ,
5457 tempcx ,
5458 temp ,
5459 resinfo ,
5460 modeflag ,
5461 CRT1Index ;
5462
5463 if ( ModeNo <= 0x13 )
5464 {
5465 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; /* si+St_ResInfo */
5466 resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
5467 }
5468 else
5469 {
5470 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; /* si+Ext_ResInfo */
5471 resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
5472 CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
5473 CRT1Index &= IndexMask;
5474 }
5475
5476 if ( !( pVBInfo->VBInfo & SetInSlaveMode ) )
5477 {
5478 return ;
5479 }
5480
5481 temp = 0xFF ; /* set MAX HT */
5482 XGINew_SetReg1( pVBInfo->Part1Port , 0x03 , temp ) ;
5483 /* if ( modeflag & Charx8Dot ) tempcx = 0x08 ; */
5484 /* else */
5485 tempcx=0x08;
5486
5487 if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
5488 modeflag |= Charx8Dot ;
5489
5490 tempax = pVBInfo->VGAHDE ; /* 0x04 Horizontal Display End */
5491
5492 if ( modeflag & HalfDCLK )
5493 tempax = tempax >> 1 ;
5494
5495 tempax = ( tempax / tempcx ) - 1 ;
5496 tempbx |= ( ( tempax & 0x00FF ) << 8 ) ;
5497 temp = tempax & 0x00FF ;
5498 XGINew_SetReg1( pVBInfo->Part1Port , 0x04 , temp ) ;
5499
5500 temp = ( tempbx & 0xFF00 ) >> 8 ;
5501
5502 if ( pVBInfo->VBInfo & SetCRT2ToTV )
5503 {
5504 if ( !( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) )
5505 temp += 2 ;
5506
5507 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
5508 {
5509 if ( pVBInfo->VBType & VB_XGI301LV )
5510 {
5511 if ( pVBInfo->VBExtInfo == VB_YPbPr1080i )
5512 {
5513 if ( resinfo == 7 )
5514 temp -= 2 ;
5515 }
5516 }
5517 else
5518 if ( resinfo == 7 )
5519 temp -= 2 ;
5520 }
5521 }
5522
5523 XGINew_SetReg1( pVBInfo->Part1Port , 0x05 , temp ) ; /* 0x05 Horizontal Display Start */
5524 XGINew_SetReg1( pVBInfo->Part1Port , 0x06 , 0x03 ) ; /* 0x06 Horizontal Blank end */
5525
5526 if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
5527 { /* 030226 bainy */
5528 if ( pVBInfo->VBInfo & SetCRT2ToTV )
5529 tempax = pVBInfo->VGAHT ;
5530 else
5531 tempax = XGI_GetVGAHT2( pVBInfo) ;
5532 }
5533
5534 if ( tempax >= pVBInfo->VGAHT )
5535 {
5536 tempax = pVBInfo->VGAHT ;
5537 }
5538
5539 if ( modeflag & HalfDCLK )
5540 {
5541 tempax = tempax >> 1 ;
5542 }
5543
5544 tempax = ( tempax / tempcx ) - 5 ;
5545 tempcx = tempax ; /* 20030401 0x07 horizontal Retrace Start */
5546 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
5547 {
5548 temp = ( tempbx & 0x00FF ) - 1 ;
5549 if ( !( modeflag & HalfDCLK ) )
5550 {
5551 temp -= 6 ;
5552 if ( pVBInfo->TVInfo & TVSimuMode )
5553 {
5554 temp -= 4 ;
5555 if ( ModeNo > 0x13 )
5556 temp -= 10 ;
5557 }
5558 }
5559 }
5560 else
5561 {
5562 /* tempcx = tempbx & 0x00FF ; */
5563 tempbx = ( tempbx & 0xFF00 ) >> 8 ;
5564 tempcx = ( tempcx + tempbx ) >> 1 ;
5565 temp = ( tempcx & 0x00FF ) + 2 ;
5566
5567 if ( pVBInfo->VBInfo & SetCRT2ToTV )
5568 {
5569 temp -= 1 ;
5570 if ( !( modeflag & HalfDCLK ) )
5571 {
5572 if ( ( modeflag & Charx8Dot ) )
5573 {
5574 temp += 4 ;
5575 if ( pVBInfo->VGAHDE >= 800 )
5576 {
5577 temp -= 6 ;
5578 }
5579 }
5580 }
5581 }
5582 else
5583 {
5584 if ( !( modeflag & HalfDCLK ) )
5585 {
5586 temp -= 4 ;
5587 if ( pVBInfo->LCDResInfo != Panel1280x960 )
5588 {
5589 if( pVBInfo->VGAHDE >= 800 )
5590 {
5591 temp -= 7 ;
5592 if ( pVBInfo->ModeType == ModeEGA )
5593 {
5594 if ( pVBInfo->VGAVDE == 1024 )
5595 {
5596 temp += 15 ;
5597 if ( pVBInfo->LCDResInfo != Panel1280x1024 )
5598 {
5599 temp += 7 ;
5600 }
5601 }
5602 }
5603
5604 if ( pVBInfo->VGAHDE >= 1280 )
5605 {
5606 if ( pVBInfo->LCDResInfo != Panel1280x960 )
5607 {
5608 if ( pVBInfo->LCDInfo & LCDNonExpanding )
5609 {
5610 temp += 28 ;
5611 }
5612 }
5613 }
5614 }
5615 }
5616 }
5617 }
5618 }
5619
5620 XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , temp ) ; /* 0x07 Horizontal Retrace Start */
5621 XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0 ) ; /* 0x08 Horizontal Retrace End */
5622
5623 if ( pVBInfo->VBInfo & SetCRT2ToTV )
5624 {
5625 if ( pVBInfo->TVInfo & TVSimuMode )
5626 {
5627 if ( ( ModeNo == 0x06 ) || ( ModeNo == 0x10 ) || ( ModeNo == 0x11 ) || ( ModeNo == 0x13 ) || ( ModeNo == 0x0F ) )
5628 {
5629 XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x5b ) ;
5630 XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x03 ) ;
5631 }
5632
5633 if ( ( ModeNo == 0x00 ) || ( ModeNo == 0x01 ) )
5634 {
5635 if ( pVBInfo->TVInfo & SetNTSCTV )
5636 {
5637 XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x2A ) ;
5638 XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x61 ) ;
5639 }
5640 else
5641 {
5642 XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x2A ) ;
5643 XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x41 ) ;
5644 XGINew_SetReg1( pVBInfo->Part1Port , 0x0C , 0xF0 ) ;
5645 }
5646 }
5647
5648 if ( ( ModeNo == 0x02 ) || ( ModeNo == 0x03 ) || ( ModeNo == 0x07 ) )
5649 {
5650 if ( pVBInfo->TVInfo & SetNTSCTV )
5651 {
5652 XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x54 ) ;
5653 XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x00 ) ;
5654 }
5655 else
5656 {
5657 XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x55 ) ;
5658 XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x00 ) ;
5659 XGINew_SetReg1( pVBInfo->Part1Port , 0x0C , 0xF0 ) ;
5660 }
5661 }
5662
5663 if ( ( ModeNo == 0x04 ) || ( ModeNo == 0x05 ) || ( ModeNo == 0x0D ) || ( ModeNo == 0x50 ) )
5664 {
5665 if ( pVBInfo->TVInfo & SetNTSCTV )
5666 {
5667 XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x30 ) ;
5668 XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x03 ) ;
5669 }
5670 else
5671 {
5672 XGINew_SetReg1( pVBInfo->Part1Port , 0x07 , 0x2f ) ;
5673 XGINew_SetReg1( pVBInfo->Part1Port , 0x08 , 0x02 ) ;
5674 }
5675 }
5676 }
5677 }
5678
5679 XGINew_SetReg1( pVBInfo->Part1Port , 0x18 , 0x03 ) ; /* 0x18 SR0B */
5680 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x19 , 0xF0 , 0x00 ) ;
5681 XGINew_SetReg1( pVBInfo->Part1Port , 0x09 , 0xFF ) ; /* 0x09 Set Max VT */
5682
5683 tempbx = pVBInfo->VGAVT ;
5684 push1 = tempbx ;
5685 tempcx = 0x121 ;
5686 tempbx = pVBInfo->VGAVDE ; /* 0x0E Virtical Display End */
5687
5688 if ( tempbx == 357 )
5689 tempbx = 350 ;
5690 if ( tempbx == 360 )
5691 tempbx =350 ;
5692 if ( tempbx == 375 )
5693 tempbx = 350 ;
5694 if ( tempbx == 405 )
5695 tempbx = 400 ;
5696 if ( tempbx == 525 )
5697 tempbx = 480 ;
5698
5699 push2 = tempbx ;
5700
5701 if ( pVBInfo->VBInfo & SetCRT2ToLCD )
5702 {
5703 if ( pVBInfo->LCDResInfo == Panel1024x768 )
5704 {
5705 if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
5706 {
5707 if ( tempbx == 350 )
5708 tempbx += 5 ;
5709 if ( tempbx == 480 )
5710 tempbx += 5 ;
5711 }
5712 }
5713 }
5714 tempbx-- ;
5715 temp = tempbx & 0x00FF ;
5716 tempbx-- ;
5717 temp = tempbx & 0x00FF ;
5718 XGINew_SetReg1( pVBInfo->Part1Port , 0x10 ,temp ) ; /* 0x10 vertical Blank Start */
5719 tempbx = push2 ;
5720 tempbx-- ;
5721 temp = tempbx & 0x00FF ;
5722 XGINew_SetReg1( pVBInfo->Part1Port , 0x0E , temp ) ;
5723
5724 if ( tempbx & 0x0100 )
5725 {
5726 tempcx |= 0x0002 ;
5727 }
5728
5729 tempax = 0x000B ;
5730
5731 if ( modeflag & DoubleScanMode )
5732 {
5733 tempax |= 0x08000 ;
5734 }
5735
5736 if ( tempbx & 0x0200 )
5737 {
5738 tempcx |= 0x0040 ;
5739 }
5740
5741 temp = ( tempax & 0xFF00 ) >> 8 ;
5742 XGINew_SetReg1( pVBInfo->Part1Port , 0x0B , temp ) ;
5743
5744 if ( tempbx & 0x0400 )
5745 {
5746 tempcx |= 0x0600 ;
5747 }
5748
5749 XGINew_SetReg1( pVBInfo->Part1Port , 0x11 , 0x00 ) ; /* 0x11 Vertival Blank End */
5750
5751 tempax = push1 ;
5752 tempax -= tempbx ; /* 0x0C Vertical Retrace Start */
5753 tempax = tempax >> 2 ;
5754 push1 = tempax ; /* push ax */
5755
5756 if ( resinfo != 0x09 )
5757 {
5758 tempax = tempax << 1 ;
5759 tempbx += tempax ;
5760 }
5761
5762 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
5763 {
5764 if ( pVBInfo->VBType & VB_XGI301LV )
5765 {
5766 if ( pVBInfo->TVInfo & SetYPbPrMode1080i )
5767 tempbx -= 10 ;
5768 else
5769 {
5770 if ( pVBInfo->TVInfo & TVSimuMode )
5771 {
5772 if ( pVBInfo->TVInfo & SetPALTV )
5773 {
5774 if ( pVBInfo->VBType & VB_XGI301LV )
5775 {
5776 if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) )
5777 tempbx += 40 ;
5778 }
5779 else
5780 tempbx += 40 ;
5781 }
5782 }
5783 }
5784 }
5785 else
5786 tempbx -= 10 ;
5787 }
5788 else
5789 {
5790 if ( pVBInfo->TVInfo & TVSimuMode )
5791 {
5792 if ( pVBInfo->TVInfo & SetPALTV )
5793 {
5794 if ( pVBInfo->VBType & VB_XGI301LV )
5795 {
5796 if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) )
5797 tempbx += 40 ;
5798 }
5799 else
5800 tempbx += 40 ;
5801 }
5802 }
5803 }
5804 tempax = push1 ;
5805 tempax = tempax >> 2 ;
5806 tempax++ ;
5807 tempax += tempbx ;
5808 push1 = tempax ; /* push ax */
5809
5810 if ( ( pVBInfo->TVInfo & SetPALTV ) )
5811 {
5812 if ( tempbx <= 513 )
5813 {
5814 if ( tempax >= 513 )
5815 {
5816 tempbx = 513 ;
5817 }
5818 }
5819 }
5820
5821 temp = tempbx & 0x00FF ;
5822 XGINew_SetReg1( pVBInfo->Part1Port , 0x0C , temp ) ;
5823 tempbx-- ;
5824 temp = tempbx & 0x00FF ;
5825 XGINew_SetReg1( pVBInfo->Part1Port , 0x10 , temp ) ;
5826
5827 if ( tempbx & 0x0100 )
5828 {
5829 tempcx |= 0x0008 ;
5830 }
5831
5832 if ( tempbx & 0x0200 )
5833 {
5834 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x0B , 0x0FF , 0x20 ) ;
5835 }
5836
5837 tempbx++ ;
5838
5839 if ( tempbx & 0x0100 )
5840 {
5841 tempcx |= 0x0004 ;
5842 }
5843
5844 if ( tempbx & 0x0200 )
5845 {
5846 tempcx |= 0x0080 ;
5847 }
5848
5849 if ( tempbx & 0x0400 )
5850 {
5851 tempcx |= 0x0C00 ;
5852 }
5853
5854 tempbx = push1 ; /* pop ax */
5855 temp = tempbx & 0x00FF ;
5856 temp &= 0x0F ;
5857 XGINew_SetReg1( pVBInfo->Part1Port , 0x0D , temp ) ; /* 0x0D vertical Retrace End */
5858
5859 if ( tempbx & 0x0010 )
5860 {
5861 tempcx |= 0x2000 ;
5862 }
5863
5864 temp = tempcx & 0x00FF ;
5865 XGINew_SetReg1( pVBInfo->Part1Port , 0x0A , temp ) ; /* 0x0A CR07 */
5866 temp = ( tempcx & 0x0FF00 ) >> 8 ;
5867 XGINew_SetReg1( pVBInfo->Part1Port , 0x17 , temp ) ; /* 0x17 SR0A */
5868 tempax = modeflag ;
5869 temp = ( tempax & 0xFF00 ) >> 8 ;
5870
5871 temp = ( temp >> 1 ) & 0x09 ;
5872
5873 if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
5874 temp |= 0x01 ;
5875
5876 XGINew_SetReg1( pVBInfo->Part1Port , 0x16 , temp ) ; /* 0x16 SR01 */
5877 XGINew_SetReg1( pVBInfo->Part1Port , 0x0F , 0 ) ; /* 0x0F CR14 */
5878 XGINew_SetReg1( pVBInfo->Part1Port , 0x12 , 0 ) ; /* 0x12 CR17 */
5879
5880 if ( pVBInfo->LCDInfo & LCDRGB18Bit )
5881 temp = 0x80 ;
5882 else
5883 temp = 0x00 ;
5884
5885 XGINew_SetReg1( pVBInfo->Part1Port , 0x1A , temp ) ; /* 0x1A SR0E */
5886
5887 return ;
5888 }
5889
5890
5891 /* --------------------------------------------------------------------- */
5892 /* Function : XGI_SetGroup2 */
5893 /* Input : */
5894 /* Output : */
5895 /* Description : */
5896 /* --------------------------------------------------------------------- */
5897 void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex,
5898 struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
5899 {
5900 unsigned short i ,
5901 j ,
5902 tempax ,
5903 tempbx ,
5904 tempcx ,
5905 temp ,
5906 push1 ,
5907 push2 ,
5908 modeflag ,
5909 resinfo ,
5910 crt2crtc ;
5911 unsigned char *TimingPoint ;
5912
5913 unsigned long longtemp ,
5914 tempeax ,
5915 tempebx ,
5916 temp2 ,
5917 tempecx ;
5918
5919 if ( ModeNo <= 0x13 )
5920 {
5921 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; /* si+St_ResInfo */
5922 resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
5923 crt2crtc = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
5924 }
5925 else
5926 {
5927 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; /* si+Ext_ResInfo */
5928 resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
5929 crt2crtc = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
5930 }
5931
5932 tempax = 0 ;
5933
5934 if ( !( pVBInfo->VBInfo & SetCRT2ToAVIDEO ) )
5935 tempax |= 0x0800 ;
5936
5937 if ( !( pVBInfo->VBInfo & SetCRT2ToSVIDEO ) )
5938 tempax |= 0x0400 ;
5939
5940 if ( pVBInfo->VBInfo & SetCRT2ToSCART )
5941 tempax |= 0x0200 ;
5942
5943 if ( !( pVBInfo->TVInfo & SetPALTV ) )
5944 tempax |= 0x1000 ;
5945
5946 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
5947 tempax |= 0x0100 ;
5948
5949 if ( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) )
5950 tempax &= 0xfe00 ;
5951
5952 tempax = ( tempax & 0xff00 ) >> 8 ;
5953
5954 XGINew_SetReg1( pVBInfo->Part2Port , 0x0 , tempax ) ;
5955 TimingPoint = pVBInfo->NTSCTiming ;
5956
5957 if ( pVBInfo->TVInfo & SetPALTV )
5958 {
5959 TimingPoint = pVBInfo->PALTiming ;
5960 }
5961
5962 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
5963 {
5964 TimingPoint = pVBInfo->HiTVExtTiming ;
5965
5966 if ( pVBInfo->VBInfo & SetInSlaveMode )
5967 TimingPoint = pVBInfo->HiTVSt2Timing ;
5968
5969 if ( pVBInfo->SetFlag & TVSimuMode )
5970 TimingPoint = pVBInfo->HiTVSt1Timing ;
5971
5972 if ( !(modeflag & Charx8Dot) )
5973 TimingPoint = pVBInfo->HiTVTextTiming ;
5974 }
5975
5976 if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
5977 {
5978 if ( pVBInfo->TVInfo & SetYPbPrMode525i )
5979 TimingPoint = pVBInfo->YPbPr525iTiming ;
5980
5981 if ( pVBInfo->TVInfo & SetYPbPrMode525p )
5982 TimingPoint = pVBInfo->YPbPr525pTiming ;
5983
5984 if ( pVBInfo->TVInfo & SetYPbPrMode750p )
5985 TimingPoint = pVBInfo->YPbPr750pTiming ;
5986 }
5987
5988 for( i = 0x01 , j = 0 ; i <= 0x2D ; i++ , j++ )
5989 {
5990 XGINew_SetReg1( pVBInfo->Part2Port , i , TimingPoint[ j ] ) ;
5991 }
5992
5993 for( i = 0x39 ; i <= 0x45 ; i++ , j++ )
5994 {
5995 XGINew_SetReg1( pVBInfo->Part2Port , i , TimingPoint[ j ] ) ; /* di->temp2[j] */
5996 }
5997
5998 if ( pVBInfo->VBInfo & SetCRT2ToTV )
5999 {
6000 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x3A , 0x1F , 0x00 ) ;
6001 }
6002
6003 temp = pVBInfo->NewFlickerMode ;
6004 temp &= 0x80 ;
6005 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x0A , 0xFF , temp ) ;
6006
6007 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
6008 tempax = 950 ;
6009
6010 if ( pVBInfo->TVInfo & SetPALTV )
6011 tempax = 520 ;
6012 else
6013 tempax = 440 ;
6014
6015 if ( pVBInfo->VDE <= tempax )
6016 {
6017 tempax -= pVBInfo->VDE ;
6018 tempax = tempax >> 2 ;
6019 tempax = ( tempax & 0x00FF ) | ( ( tempax & 0x00FF ) << 8 ) ;
6020 push1 = tempax ;
6021 temp = ( tempax & 0xFF00 ) >> 8 ;
6022 temp += (unsigned short)TimingPoint[0];
6023
6024 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
6025 {
6026 if ( pVBInfo->VBInfo & ( SetCRT2ToAVIDEO | SetCRT2ToSVIDEO | SetCRT2ToSCART | SetCRT2ToYPbPr ) )
6027 {
6028 tempcx=pVBInfo->VGAHDE;
6029 if ( tempcx >= 1024 )
6030 {
6031 temp = 0x17 ; /* NTSC */
6032 if ( pVBInfo->TVInfo & SetPALTV )
6033 temp = 0x19 ; /* PAL */
6034 }
6035 }
6036 }
6037
6038 XGINew_SetReg1( pVBInfo->Part2Port , 0x01 , temp ) ;
6039 tempax = push1 ;
6040 temp = ( tempax & 0xFF00 ) >> 8 ;
6041 temp += TimingPoint[ 1 ] ;
6042
6043 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
6044 {
6045 if ( ( pVBInfo->VBInfo & ( SetCRT2ToAVIDEO | SetCRT2ToSVIDEO | SetCRT2ToSCART | SetCRT2ToYPbPr ) ) )
6046 {
6047 tempcx = pVBInfo->VGAHDE ;
6048 if ( tempcx >= 1024 )
6049 {
6050 temp = 0x1D ; /* NTSC */
6051 if ( pVBInfo->TVInfo & SetPALTV )
6052 temp = 0x52 ; /* PAL */
6053 }
6054 }
6055 }
6056 XGINew_SetReg1( pVBInfo->Part2Port , 0x02 , temp ) ;
6057 }
6058
6059 /* 301b */
6060 tempcx = pVBInfo->HT ;
6061
6062 if ( XGI_IsLCDDualLink( pVBInfo ) )
6063 tempcx = tempcx >> 1 ;
6064
6065 tempcx -= 2 ;
6066 temp = tempcx & 0x00FF ;
6067 XGINew_SetReg1( pVBInfo->Part2Port , 0x1B , temp ) ;
6068
6069 temp = ( tempcx & 0xFF00 ) >> 8 ;
6070 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x1D , ~0x0F , temp ) ;
6071
6072 tempcx = pVBInfo->HT >> 1 ;
6073 push1 = tempcx ; /* push cx */
6074 tempcx += 7 ;
6075
6076 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
6077 {
6078 tempcx -= 4 ;
6079 }
6080
6081 temp = tempcx & 0x00FF ;
6082 temp = temp << 4 ;
6083 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x22 , 0x0F , temp ) ;
6084
6085 tempbx = TimingPoint[ j ] | ( ( TimingPoint[ j + 1 ] ) << 8 ) ;
6086 tempbx += tempcx ;
6087 push2 = tempbx ;
6088 temp = tempbx & 0x00FF ;
6089 XGINew_SetReg1( pVBInfo->Part2Port , 0x24 , temp ) ;
6090 temp = ( tempbx & 0xFF00 ) >> 8 ;
6091 temp = temp << 4 ;
6092 XGINew_SetRegANDOR(pVBInfo->Part2Port,0x25,0x0F,temp);
6093
6094 tempbx=push2;
6095 tempbx=tempbx+8;
6096 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
6097 {
6098 tempbx=tempbx-4;
6099 tempcx=tempbx;
6100 }
6101
6102 temp = ( tempbx & 0x00FF ) << 4 ;
6103 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x29 , 0x0F , temp ) ;
6104
6105 j += 2 ;
6106 tempcx += ( TimingPoint[ j ] | ( ( TimingPoint[ j + 1 ] ) << 8 ) ) ;
6107 temp = tempcx & 0x00FF ;
6108 XGINew_SetReg1( pVBInfo->Part2Port , 0x27 , temp ) ;
6109 temp = ( ( tempcx & 0xFF00 ) >> 8 ) << 4 ;
6110 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x28 , 0x0F , temp ) ;
6111
6112 tempcx += 8 ;
6113 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
6114 {
6115 tempcx -= 4 ;
6116 }
6117
6118 temp = tempcx & 0xFF ;
6119 temp = temp << 4 ;
6120 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x2A , 0x0F , temp ) ;
6121
6122 tempcx = push1 ; /* pop cx */
6123 j += 2 ;
6124 temp = TimingPoint[ j ] | ( ( TimingPoint[ j + 1 ] ) << 8 ) ;
6125 tempcx -= temp ;
6126 temp = tempcx & 0x00FF ;
6127 temp = temp << 4 ;
6128 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x2D , 0x0F ,temp ) ;
6129
6130 tempcx -= 11 ;
6131
6132 if ( !( pVBInfo->VBInfo & SetCRT2ToTV ) )
6133 {
6134 tempax = XGI_GetVGAHT2( pVBInfo) ;
6135 tempcx = tempax - 1 ;
6136 }
6137 temp = tempcx & 0x00FF ;
6138 XGINew_SetReg1( pVBInfo->Part2Port , 0x2E , temp ) ;
6139
6140 tempbx = pVBInfo->VDE ;
6141
6142 if ( pVBInfo->VGAVDE == 360 )
6143 tempbx = 746 ;
6144 if ( pVBInfo->VGAVDE == 375 )
6145 tempbx = 746 ;
6146 if ( pVBInfo->VGAVDE == 405 )
6147 tempbx = 853 ;
6148
6149 if ( pVBInfo->VBInfo & SetCRT2ToTV )
6150 {
6151 if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
6152 {
6153 if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) )
6154 tempbx = tempbx >> 1 ;
6155 }
6156 else
6157 tempbx = tempbx >> 1 ;
6158 }
6159
6160 tempbx -= 2 ;
6161 temp = tempbx & 0x00FF ;
6162
6163 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
6164 {
6165 if ( pVBInfo->VBType & VB_XGI301LV )
6166 {
6167 if ( pVBInfo->TVInfo & SetYPbPrMode1080i )
6168 {
6169 if ( pVBInfo->VBInfo & SetInSlaveMode )
6170 {
6171 if ( ModeNo == 0x2f )
6172 temp += 1 ;
6173 }
6174 }
6175 }
6176 else
6177 {
6178 if ( pVBInfo->VBInfo & SetInSlaveMode )
6179 {
6180 if ( ModeNo == 0x2f )
6181 temp += 1 ;
6182 }
6183 }
6184 }
6185
6186 XGINew_SetReg1( pVBInfo->Part2Port , 0x2F , temp ) ;
6187
6188 temp = ( tempcx & 0xFF00 ) >> 8 ;
6189 temp |= ( ( tempbx & 0xFF00 ) >> 8 ) << 6 ;
6190
6191 if ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) )
6192 {
6193 if ( pVBInfo->VBType & VB_XGI301LV )
6194 {
6195 if ( pVBInfo->TVInfo & SetYPbPrMode1080i )
6196 {
6197 temp |= 0x10 ;
6198
6199 if ( !( pVBInfo->VBInfo & SetCRT2ToSVIDEO ) )
6200 temp |= 0x20 ;
6201 }
6202 }
6203 else
6204 {
6205 temp |= 0x10 ;
6206 if ( !( pVBInfo->VBInfo & SetCRT2ToSVIDEO ) )
6207 temp |= 0x20 ;
6208 }
6209 }
6210
6211 XGINew_SetReg1( pVBInfo->Part2Port , 0x30 , temp ) ;
6212
6213 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) ) /* TV gatingno */
6214 {
6215 tempbx = pVBInfo->VDE ;
6216 tempcx = tempbx - 2 ;
6217
6218 if ( pVBInfo->VBInfo & SetCRT2ToTV )
6219 {
6220 if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) )
6221 tempbx = tempbx >> 1 ;
6222 }
6223
6224 if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
6225 {
6226 temp=0;
6227 if( tempcx & 0x0400 )
6228 temp |= 0x20 ;
6229
6230 if ( tempbx & 0x0400 )
6231 temp |= 0x40 ;
6232
6233 XGINew_SetReg1( pVBInfo->Part4Port , 0x10 , temp ) ;
6234 }
6235
6236 temp = ( ( ( tempbx - 3 ) & 0x0300 ) >> 8 ) << 5 ;
6237 XGINew_SetReg1( pVBInfo->Part2Port , 0x46 , temp ) ;
6238 temp = ( tempbx - 3 ) & 0x00FF ;
6239 XGINew_SetReg1( pVBInfo->Part2Port , 0x47 , temp ) ;
6240 }
6241
6242 tempbx = tempbx & 0x00FF ;
6243
6244 if ( !( modeflag & HalfDCLK ) )
6245 {
6246 tempcx = pVBInfo->VGAHDE ;
6247 if ( tempcx >= pVBInfo->HDE )
6248 {
6249 tempbx |= 0x2000 ;
6250 tempax &= 0x00FF ;
6251 }
6252 }
6253
6254 tempcx = 0x0101 ;
6255
6256 if( pVBInfo->VBInfo & SetCRT2ToTV ) { /*301b*/
6257 if(pVBInfo->VGAHDE>=1024)
6258 {
6259 tempcx=0x1920;
6260 if(pVBInfo->VGAHDE>=1280)
6261 {
6262 tempcx=0x1420;
6263 tempbx=tempbx&0xDFFF;
6264 }
6265 }
6266 }
6267
6268 if ( !( tempbx & 0x2000 ) )
6269 {
6270 if ( modeflag & HalfDCLK )
6271 {
6272 tempcx = ( tempcx & 0xFF00 ) | ( ( tempcx & 0x00FF ) << 1 ) ;
6273 }
6274
6275 push1 = tempbx ;
6276 tempeax = pVBInfo->VGAHDE ;
6277 tempebx = ( tempcx & 0xFF00 ) >> 8 ;
6278 longtemp = tempeax * tempebx ;
6279 tempecx = tempcx & 0x00FF ;
6280 longtemp = longtemp / tempecx ;
6281
6282 /* 301b */
6283 tempecx = 8 * 1024 ;
6284
6285 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
6286 {
6287 tempecx = tempecx * 8 ;
6288 }
6289
6290 longtemp = longtemp * tempecx ;
6291 tempecx = pVBInfo->HDE ;
6292 temp2 = longtemp % tempecx ;
6293 tempeax = longtemp / tempecx ;
6294 if ( temp2 != 0 )
6295 {
6296 tempeax += 1 ;
6297 }
6298
6299 tempax = (unsigned short)tempeax;
6300
6301 /* 301b */
6302 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
6303 {
6304 tempcx = ( ( tempax & 0xFF00 ) >> 5 ) >> 8 ;
6305 }
6306 /* end 301b */
6307
6308 tempbx = push1 ;
6309 tempbx = (unsigned short)(((tempeax & 0x0000FF00) & 0x1F00) | (tempbx & 0x00FF));
6310 tempax = (unsigned short)(((tempeax & 0x000000FF) << 8) | (tempax & 0x00FF));
6311 temp = ( tempax & 0xFF00 ) >> 8 ;
6312 }
6313 else
6314 {
6315 temp = ( tempax & 0x00FF ) >> 8 ;
6316 }
6317
6318 XGINew_SetReg1( pVBInfo->Part2Port , 0x44 , temp ) ;
6319 temp = ( tempbx & 0xFF00 ) >> 8 ;
6320 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x45 , ~0x03F , temp ) ;
6321 temp = tempcx & 0x00FF ;
6322
6323 if ( tempbx & 0x2000 )
6324 temp = 0 ;
6325
6326 if ( !( pVBInfo->VBInfo & SetCRT2ToLCD ) )
6327 temp |= 0x18 ;
6328
6329 XGINew_SetRegANDOR(pVBInfo->Part2Port,0x46,~0x1F,temp);
6330 if ( pVBInfo->TVInfo & SetPALTV )
6331 {
6332 tempbx = 0x0382 ;
6333 tempcx = 0x007e ;
6334 }
6335 else
6336 {
6337 tempbx = 0x0369 ;
6338 tempcx = 0x0061 ;
6339 }
6340
6341 temp = tempbx & 0x00FF ;
6342 XGINew_SetReg1( pVBInfo->Part2Port , 0x4b , temp ) ;
6343 temp = tempcx & 0x00FF ;
6344 XGINew_SetReg1( pVBInfo->Part2Port , 0x4c , temp ) ;
6345
6346 temp = ( ( tempcx & 0xFF00 ) >> 8 ) & 0x03 ;
6347 temp = temp << 2 ;
6348 temp |= ( ( tempbx & 0xFF00 ) >> 8 ) & 0x03 ;
6349
6350 if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
6351 {
6352 temp |= 0x10 ;
6353
6354 if ( pVBInfo->TVInfo & SetYPbPrMode525p )
6355 temp |= 0x20 ;
6356
6357 if ( pVBInfo->TVInfo & SetYPbPrMode750p )
6358 temp |= 0x60 ;
6359 }
6360
6361 XGINew_SetReg1( pVBInfo->Part2Port , 0x4d , temp ) ;
6362 temp=XGINew_GetReg1( pVBInfo->Part2Port , 0x43 ) ; /* 301b change */
6363 XGINew_SetReg1( pVBInfo->Part2Port , 0x43, (unsigned short)( temp - 3 ) ) ;
6364
6365 if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) )
6366 {
6367 if ( pVBInfo->TVInfo & NTSC1024x768 )
6368 {
6369 TimingPoint = XGI_NTSC1024AdjTime ;
6370 for( i = 0x1c , j = 0 ; i <= 0x30 ; i++ , j++ )
6371 {
6372 XGINew_SetReg1( pVBInfo->Part2Port , i , TimingPoint[ j ] ) ;
6373 }
6374 XGINew_SetReg1( pVBInfo->Part2Port , 0x43 , 0x72 ) ;
6375 }
6376 }
6377
6378 /* [ycchen] 01/14/03 Modify for 301C PALM Support */
6379 if ( pVBInfo->VBType & VB_XGI301C )
6380 {
6381 if ( pVBInfo->TVInfo & SetPALMTV )
6382 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x4E , ~0x08 , 0x08 ) ; /* PALM Mode */
6383 }
6384
6385 if ( pVBInfo->TVInfo & SetPALMTV )
6386 {
6387 tempax = (unsigned char)XGINew_GetReg1(pVBInfo->Part2Port, 0x01);
6388 tempax-- ;
6389 XGINew_SetRegAND( pVBInfo->Part2Port , 0x01 , tempax ) ;
6390
6391 /* if ( !( pVBInfo->VBType & VB_XGI301C ) ) */
6392 XGINew_SetRegAND( pVBInfo->Part2Port , 0x00 , 0xEF ) ;
6393 }
6394
6395 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
6396 {
6397 if ( !( pVBInfo->VBInfo & SetInSlaveMode ) )
6398 {
6399 XGINew_SetReg1( pVBInfo->Part2Port , 0x0B , 0x00 ) ;
6400 }
6401 }
6402
6403 if ( pVBInfo->VBInfo & SetCRT2ToTV )
6404 {
6405 return ;
6406 }
6407 }
6408
6409
6410 /* --------------------------------------------------------------------- */
6411 /* Function : XGI_SetLCDRegs */
6412 /* Input : */
6413 /* Output : */
6414 /* Description : */
6415 /* --------------------------------------------------------------------- */
6416 void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex, struct xgi_hw_device_info *HwDeviceExtension, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo)
6417 {
6418 unsigned short push1 ,
6419 push2 ,
6420 pushbx ,
6421 tempax ,
6422 tempbx ,
6423 tempcx ,
6424 temp ,
6425 tempah ,
6426 tempbh ,
6427 tempch ,
6428 resinfo ,
6429 modeflag ,
6430 CRT1Index ;
6431
6432 struct XGI_LCDDesStruct *LCDBDesPtr = NULL ;
6433
6434
6435 if ( ModeNo <= 0x13 )
6436 {
6437 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; /* si+St_ResInfo */
6438 resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
6439 }
6440 else
6441 {
6442 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; /* si+Ext_ResInfo */
6443 resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
6444 CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
6445 CRT1Index &= IndexMask ;
6446 }
6447
6448 if ( !( pVBInfo->VBInfo & SetCRT2ToLCD ) )
6449 {
6450 return ;
6451 }
6452
6453 tempbx = pVBInfo->HDE ; /* RHACTE=HDE-1 */
6454
6455 if ( XGI_IsLCDDualLink( pVBInfo ) )
6456 tempbx = tempbx >> 1 ;
6457
6458 tempbx -= 1 ;
6459 temp = tempbx & 0x00FF ;
6460 XGINew_SetReg1( pVBInfo->Part2Port , 0x2C , temp ) ;
6461 temp = ( tempbx & 0xFF00 ) >> 8 ;
6462 temp = temp << 4 ;
6463 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x2B , 0x0F , temp ) ;
6464 temp = 0x01 ;
6465
6466 if ( pVBInfo->LCDResInfo == Panel1280x1024 )
6467 {
6468 if ( pVBInfo->ModeType == ModeEGA )
6469 {
6470 if ( pVBInfo->VGAHDE >= 1024 )
6471 {
6472 temp = 0x02 ;
6473 if ( pVBInfo->LCDInfo & LCDVESATiming )
6474 temp = 0x01 ;
6475 }
6476 }
6477 }
6478
6479 XGINew_SetReg1( pVBInfo->Part2Port , 0x0B , temp ) ;
6480 tempbx = pVBInfo->VDE ; /* RTVACTEO=(VDE-1)&0xFF */
6481 push1 = tempbx ;
6482 tempbx-- ;
6483 temp = tempbx & 0x00FF ;
6484 XGINew_SetReg1( pVBInfo->Part2Port , 0x03 , temp ) ;
6485 temp = ( ( tempbx & 0xFF00 ) >> 8 ) & 0x07 ;
6486 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x0C , ~0x07 , temp ) ;
6487
6488 tempcx = pVBInfo->VT - 1 ;
6489 push2 = tempcx + 1 ;
6490 temp = tempcx & 0x00FF ; /* RVTVT=VT-1 */
6491 XGINew_SetReg1( pVBInfo->Part2Port , 0x19 , temp ) ;
6492 temp = ( tempcx & 0xFF00 ) >> 8 ;
6493 temp = temp << 5 ;
6494 XGINew_SetReg1( pVBInfo->Part2Port , 0x1A , temp ) ;
6495 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x09 , 0xF0 , 0x00 ) ;
6496 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x0A , 0xF0 , 0x00 ) ;
6497 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x17 , 0xFB , 0x00 ) ;
6498 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x18 , 0xDF , 0x00 ) ;
6499
6500 /* Customized LCDB Des no add */
6501 tempbx = 5 ;
6502 LCDBDesPtr = (struct XGI_LCDDesStruct *)XGI_GetLcdPtr(tempbx, ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
6503 tempah = pVBInfo->LCDResInfo ;
6504 tempah &= PanelResInfo ;
6505
6506 if ( ( tempah == Panel1024x768 ) || ( tempah == Panel1024x768x75 ) )
6507 {
6508 tempbx = 1024 ;
6509 tempcx = 768 ;
6510 }
6511 else if ( ( tempah == Panel1280x1024 ) || ( tempah == Panel1280x1024x75 ) )
6512 {
6513 tempbx = 1280 ;
6514 tempcx = 1024 ;
6515 }
6516 else if ( tempah == Panel1400x1050 )
6517 {
6518 tempbx = 1400 ;
6519 tempcx = 1050 ;
6520 }
6521 else
6522 {
6523 tempbx = 1600 ;
6524 tempcx = 1200 ;
6525 }
6526
6527 if ( pVBInfo->LCDInfo & EnableScalingLCD )
6528 {
6529 tempbx = pVBInfo->HDE ;
6530 tempcx = pVBInfo->VDE ;
6531 }
6532
6533 pushbx = tempbx ;
6534 tempax = pVBInfo->VT ;
6535 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES ;
6536 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS ;
6537 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES ;
6538 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS ;
6539 tempbx = pVBInfo->LCDVDES ;
6540 tempcx += tempbx ;
6541
6542 if ( tempcx >= tempax )
6543 tempcx -= tempax ; /* lcdvdes */
6544
6545 temp = tempbx & 0x00FF ; /* RVEQ1EQ=lcdvdes */
6546 XGINew_SetReg1( pVBInfo->Part2Port , 0x05 , temp ) ;
6547 temp = tempcx & 0x00FF ;
6548 XGINew_SetReg1( pVBInfo->Part2Port , 0x06 , temp ) ;
6549 tempch = ( ( tempcx & 0xFF00 ) >> 8 ) & 0x07 ;
6550 tempbh = ( ( tempbx & 0xFF00 ) >> 8 ) & 0x07 ;
6551 tempah = tempch ;
6552 tempah = tempah << 3 ;
6553 tempah |= tempbh ;
6554 XGINew_SetReg1( pVBInfo->Part2Port , 0x02 , tempah ) ;
6555
6556 /* getlcdsync() */
6557 XGI_GetLCDSync( &tempax , &tempbx,pVBInfo ) ;
6558 tempcx = tempbx ;
6559 tempax = pVBInfo->VT ;
6560 tempbx = pVBInfo->LCDVRS ;
6561
6562 /* if ( SetLCD_Info & EnableScalingLCD ) */
6563 tempcx += tempbx ;
6564 if ( tempcx >= tempax )
6565 tempcx -= tempax ;
6566
6567 temp = tempbx & 0x00FF ; /* RTVACTEE=lcdvrs */
6568 XGINew_SetReg1( pVBInfo->Part2Port , 0x04 , temp ) ;
6569 temp = ( tempbx & 0xFF00 ) >> 8 ;
6570 temp = temp << 4 ;
6571 temp |= ( tempcx & 0x000F ) ;
6572 XGINew_SetReg1( pVBInfo->Part2Port , 0x01 , temp ) ;
6573 tempcx = pushbx ;
6574 tempax = pVBInfo->HT ;
6575 tempbx = pVBInfo->LCDHDES ;
6576 tempbx &= 0x0FFF ;
6577
6578 if ( XGI_IsLCDDualLink( pVBInfo ) )
6579 {
6580 tempax = tempax >> 1 ;
6581 tempbx = tempbx >> 1 ;
6582 tempcx = tempcx >> 1 ;
6583 }
6584
6585 if ( pVBInfo->VBType & VB_XGI302LV )
6586 tempbx += 1 ;
6587
6588 if ( pVBInfo->VBType & VB_XGI301C ) /* tap4 */
6589 tempbx += 1 ;
6590
6591 tempcx += tempbx ;
6592
6593 if ( tempcx >= tempax )
6594 tempcx -= tempax ;
6595
6596 temp = tempbx & 0x00FF ;
6597 XGINew_SetReg1( pVBInfo->Part2Port , 0x1F , temp ) ; /* RHBLKE=lcdhdes */
6598 temp = ( ( tempbx & 0xFF00 ) >> 8 ) << 4 ;
6599 XGINew_SetReg1( pVBInfo->Part2Port , 0x20 , temp ) ;
6600 temp = tempcx & 0x00FF ;
6601 XGINew_SetReg1( pVBInfo->Part2Port , 0x23 , temp ) ; /* RHEQPLE=lcdhdee */
6602 temp = ( tempcx & 0xFF00 ) >> 8 ;
6603 XGINew_SetReg1( pVBInfo->Part2Port , 0x25 , temp ) ;
6604
6605 /* getlcdsync() */
6606 XGI_GetLCDSync( &tempax , &tempbx ,pVBInfo) ;
6607 tempcx = tempax ;
6608 tempax = pVBInfo->HT ;
6609 tempbx = pVBInfo->LCDHRS ;
6610 /* if ( SetLCD_Info & EnableScalingLCD) */
6611 if ( XGI_IsLCDDualLink( pVBInfo) )
6612 {
6613 tempax = tempax >> 1 ;
6614 tempbx = tempbx >> 1 ;
6615 tempcx = tempcx >> 1 ;
6616 }
6617
6618 if ( pVBInfo->VBType & VB_XGI302LV )
6619 tempbx += 1 ;
6620
6621 tempcx += tempbx ;
6622
6623 if ( tempcx >= tempax )
6624 tempcx -= tempax ;
6625
6626 temp = tempbx & 0x00FF ; /* RHBURSTS=lcdhrs */
6627 XGINew_SetReg1( pVBInfo->Part2Port , 0x1C , temp ) ;
6628
6629 temp = ( tempbx & 0xFF00 ) >> 8 ;
6630 temp = temp << 4 ;
6631 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x1D , ~0x0F0 , temp ) ;
6632 temp = tempcx & 0x00FF ; /* RHSYEXP2S=lcdhre */
6633 XGINew_SetReg1( pVBInfo->Part2Port , 0x21 , temp ) ;
6634
6635 if ( !( pVBInfo->LCDInfo & LCDVESATiming ) )
6636 {
6637 if ( pVBInfo->VGAVDE == 525 )
6638 {
6639 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
6640 {
6641 temp = 0xC6 ;
6642 }
6643 else
6644 temp = 0xC4 ;
6645
6646 XGINew_SetReg1( pVBInfo->Part2Port , 0x2f , temp ) ;
6647 XGINew_SetReg1( pVBInfo->Part2Port , 0x30 , 0xB3 ) ;
6648 }
6649
6650 if ( pVBInfo->VGAVDE == 420 )
6651 {
6652 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
6653 {
6654 temp = 0x4F ;
6655 }
6656 else
6657 temp = 0x4E ;
6658 XGINew_SetReg1( pVBInfo->Part2Port , 0x2f , temp ) ;
6659 }
6660 }
6661 }
6662
6663
6664 /* --------------------------------------------------------------------- */
6665 /* Function : XGI_GetTap4Ptr */
6666 /* Input : */
6667 /* Output : di -> Tap4 Reg. Setting Pointer */
6668 /* Description : */
6669 /* --------------------------------------------------------------------- */
6670 struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
6671 struct vb_device_info *pVBInfo)
6672 {
6673 unsigned short tempax ,
6674 tempbx ,
6675 i ;
6676
6677 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr ;
6678
6679 if ( tempcx == 0 )
6680 {
6681 tempax = pVBInfo->VGAHDE ;
6682 tempbx = pVBInfo->HDE ;
6683 }
6684 else
6685 {
6686 tempax = pVBInfo->VGAVDE ;
6687 tempbx = pVBInfo->VDE ;
6688 }
6689
6690 if ( tempax < tempbx )
6691 return &EnlargeTap4Timing[ 0 ] ;
6692 else if( tempax == tempbx )
6693 return &NoScaleTap4Timing[ 0 ] ; /* 1:1 */
6694 else
6695 Tap4TimingPtr = NTSCTap4Timing ; /* NTSC */
6696
6697 if ( pVBInfo->TVInfo & SetPALTV )
6698 Tap4TimingPtr = PALTap4Timing ;
6699
6700
6701 if ( pVBInfo->VBInfo & SetCRT2ToYPbPr )
6702 {
6703 if ( pVBInfo->TVInfo & SetYPbPrMode525i )
6704 Tap4TimingPtr = YPbPr525iTap4Timing ;
6705 if ( pVBInfo->TVInfo & SetYPbPrMode525p )
6706 Tap4TimingPtr = YPbPr525pTap4Timing ;
6707 if ( pVBInfo->TVInfo & SetYPbPrMode750p )
6708 Tap4TimingPtr = YPbPr750pTap4Timing ;
6709 }
6710
6711 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
6712 Tap4TimingPtr = HiTVTap4Timing ;
6713
6714 i = 0 ;
6715 while( Tap4TimingPtr[ i ].DE != 0xFFFF )
6716 {
6717 if ( Tap4TimingPtr[ i ].DE == tempax )
6718 break ;
6719 i++ ;
6720 }
6721 return &Tap4TimingPtr[ i ] ;
6722 }
6723
6724
6725 /* --------------------------------------------------------------------- */
6726 /* Function : XGI_SetTap4Regs */
6727 /* Input : */
6728 /* Output : */
6729 /* Description : */
6730 /* --------------------------------------------------------------------- */
6731 void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
6732 {
6733 unsigned short i ,
6734 j ;
6735
6736 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr ;
6737
6738 if ( !( pVBInfo->VBType & VB_XGI301C ) )
6739 return ;
6740
6741 #ifndef Tap4
6742 XGINew_SetRegAND( pVBInfo->Part2Port , 0x4E , 0xEB ) ; /* Disable Tap4 */
6743 #else /* Tap4 Setting */
6744
6745 Tap4TimingPtr = XGI_GetTap4Ptr( 0 , pVBInfo) ; /* Set Horizontal Scaling */
6746 for( i = 0x80 , j = 0 ; i <= 0xBF ; i++ , j++ )
6747 XGINew_SetReg1( pVBInfo->Part2Port , i , Tap4TimingPtr->Reg[ j ] ) ;
6748
6749 if ( ( pVBInfo->VBInfo & SetCRT2ToTV ) && ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) ) )
6750 {
6751 Tap4TimingPtr = XGI_GetTap4Ptr( 1 , pVBInfo); /* Set Vertical Scaling */
6752 for( i = 0xC0 , j = 0 ; i < 0xFF ; i++ , j++ )
6753 XGINew_SetReg1( pVBInfo->Part2Port , i , Tap4TimingPtr->Reg[ j ] ) ;
6754 }
6755
6756 if ( ( pVBInfo->VBInfo & SetCRT2ToTV ) && ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) ) )
6757 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x4E , ~0x14 , 0x04 ) ; /* Enable V.Scaling */
6758 else
6759 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x4E , ~0x14 , 0x10 ) ; /* Enable H.Scaling */
6760 #endif
6761 }
6762
6763 /* --------------------------------------------------------------------- */
6764 /* Function : XGI_SetGroup3 */
6765 /* Input : */
6766 /* Output : */
6767 /* Description : */
6768 /* --------------------------------------------------------------------- */
6769 void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
6770 {
6771 unsigned short i;
6772 unsigned char *tempdi;
6773 unsigned short modeflag;
6774
6775 if(ModeNo<=0x13)
6776 {
6777 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
6778 }
6779 else
6780 {
6781 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; /* si+Ext_ResInfo */
6782 }
6783
6784
6785 XGINew_SetReg1(pVBInfo->Part3Port,0x00,0x00);
6786 if(pVBInfo->TVInfo&SetPALTV)
6787 {
6788 XGINew_SetReg1(pVBInfo->Part3Port,0x13,0xFA);
6789 XGINew_SetReg1(pVBInfo->Part3Port,0x14,0xC8);
6790 }
6791 else
6792 {
6793 XGINew_SetReg1(pVBInfo->Part3Port,0x13,0xF5);
6794 XGINew_SetReg1(pVBInfo->Part3Port,0x14,0xB7);
6795 }
6796
6797 if(!(pVBInfo->VBInfo&SetCRT2ToTV))
6798 {
6799 return;
6800 }
6801
6802 if(pVBInfo->TVInfo&SetPALMTV)
6803 {
6804 XGINew_SetReg1(pVBInfo->Part3Port,0x13,0xFA);
6805 XGINew_SetReg1(pVBInfo->Part3Port,0x14,0xC8);
6806 XGINew_SetReg1(pVBInfo->Part3Port,0x3D,0xA8);
6807 }
6808
6809 if((pVBInfo->VBInfo&SetCRT2ToHiVisionTV)|| (pVBInfo->VBInfo&SetCRT2ToYPbPr))
6810 {
6811 if(pVBInfo->TVInfo & SetYPbPrMode525i)
6812 {
6813 return;
6814 }
6815 tempdi=pVBInfo->HiTVGroup3Data;
6816 if(pVBInfo->SetFlag&TVSimuMode)
6817 {
6818 tempdi=pVBInfo->HiTVGroup3Simu;
6819 if(!(modeflag&Charx8Dot))
6820 {
6821 tempdi=pVBInfo->HiTVGroup3Text;
6822 }
6823 }
6824
6825 if(pVBInfo->TVInfo & SetYPbPrMode525p)
6826 {
6827 tempdi=pVBInfo->Ren525pGroup3;
6828 }
6829 if(pVBInfo->TVInfo & SetYPbPrMode750p)
6830 {
6831 tempdi=pVBInfo->Ren750pGroup3;
6832 }
6833
6834 for(i=0;i<=0x3E;i++)
6835 {
6836 XGINew_SetReg1(pVBInfo->Part3Port,i,tempdi[i]);
6837 }
6838 if(pVBInfo->VBType&VB_XGI301C) /* Marcovision */
6839 {
6840 if(pVBInfo->TVInfo & SetYPbPrMode525p)
6841 {
6842 XGINew_SetReg1(pVBInfo->Part3Port,0x28,0x3f);
6843 }
6844 }
6845 }
6846 return;
6847 } /* {end of XGI_SetGroup3} */
6848
6849
6850 /* --------------------------------------------------------------------- */
6851 /* Function : XGI_SetGroup4 */
6852 /* Input : */
6853 /* Output : */
6854 /* Description : */
6855 /* --------------------------------------------------------------------- */
6856 void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
6857 {
6858 unsigned short tempax ,
6859 tempcx ,
6860 tempbx ,
6861 modeflag ,
6862 temp ,
6863 temp2 ;
6864
6865 unsigned long tempebx ,
6866 tempeax ,
6867 templong ;
6868
6869
6870 if ( ModeNo <= 0x13 )
6871 {
6872 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; /* si+St_ResInfo */
6873 }
6874 else
6875 {
6876 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; /* si+Ext_ResInfo */
6877 }
6878
6879 temp = pVBInfo->RVBHCFACT ;
6880 XGINew_SetReg1( pVBInfo->Part4Port , 0x13 , temp ) ;
6881
6882 tempbx = pVBInfo->RVBHCMAX ;
6883 temp = tempbx & 0x00FF ;
6884 XGINew_SetReg1( pVBInfo->Part4Port , 0x14 , temp ) ;
6885 temp2 = ( ( tempbx & 0xFF00 ) >> 8 ) << 7 ;
6886 tempcx = pVBInfo->VGAHT - 1 ;
6887 temp = tempcx & 0x00FF ;
6888 XGINew_SetReg1( pVBInfo->Part4Port , 0x16 , temp ) ;
6889
6890 temp =( ( tempcx & 0xFF00 ) >> 8 ) << 3 ;
6891 temp2 |= temp ;
6892
6893 tempcx = pVBInfo->VGAVT - 1 ;
6894 if ( !( pVBInfo->VBInfo & SetCRT2ToTV ) )
6895 {
6896 tempcx -= 5 ;
6897 }
6898
6899 temp = tempcx & 0x00FF ;
6900 XGINew_SetReg1( pVBInfo->Part4Port , 0x17 , temp ) ;
6901 temp = temp2 | ( ( tempcx & 0xFF00 ) >> 8 ) ;
6902 XGINew_SetReg1( pVBInfo->Part4Port , 0x15 , temp ) ;
6903 XGINew_SetRegOR( pVBInfo->Part4Port , 0x0D , 0x08 ) ;
6904 tempcx = pVBInfo->VBInfo ;
6905 tempbx = pVBInfo->VGAHDE ;
6906
6907 if ( modeflag & HalfDCLK )
6908 {
6909 tempbx = tempbx >> 1 ;
6910 }
6911
6912 if ( XGI_IsLCDDualLink( pVBInfo ) )
6913 tempbx = tempbx >> 1 ;
6914
6915 if(tempcx&SetCRT2ToHiVisionTV)
6916 {
6917 temp=0;
6918 if(tempbx<=1024)
6919 temp=0xA0;
6920 if(tempbx == 1280)
6921 temp = 0xC0;
6922 }
6923 else if(tempcx&SetCRT2ToTV)
6924 {
6925 temp=0xA0;
6926 if(tempbx <= 800)
6927 temp=0x80;
6928 }
6929 else
6930 {
6931 temp=0x80;
6932 if(pVBInfo->VBInfo&SetCRT2ToLCD)
6933 {
6934 temp=0;
6935 if(tempbx>800)
6936 temp=0x60;
6937 }
6938 }
6939
6940 if ( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) )
6941 {
6942 temp = 0x00 ;
6943 if ( pVBInfo->VGAHDE == 1280 )
6944 temp = 0x40 ;
6945 if ( pVBInfo->VGAHDE == 1024 )
6946 temp = 0x20 ;
6947 }
6948 XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x0E , ~0xEF , temp ) ;
6949
6950 tempebx = pVBInfo->VDE ;
6951
6952 if ( tempcx & SetCRT2ToHiVisionTV )
6953 {
6954 if ( !( temp & 0xE000 ) )
6955 tempbx = tempbx >> 1 ;
6956 }
6957
6958 tempcx = pVBInfo->RVBHRS ;
6959 temp = tempcx & 0x00FF ;
6960 XGINew_SetReg1( pVBInfo->Part4Port , 0x18 , temp );
6961
6962 tempeax = pVBInfo->VGAVDE ;
6963 tempcx |= 0x04000 ;
6964
6965
6966 if ( tempeax <= tempebx )
6967 {
6968 tempcx=(tempcx&(~0x4000));
6969 tempeax = pVBInfo->VGAVDE ;
6970 }
6971 else
6972 {
6973 tempeax -= tempebx ;
6974 }
6975
6976
6977 templong = ( tempeax * 256 * 1024 ) % tempebx ;
6978 tempeax = ( tempeax * 256 * 1024 ) / tempebx ;
6979 tempebx = tempeax ;
6980
6981 if ( templong != 0 )
6982 {
6983 tempebx++ ;
6984 }
6985
6986
6987 temp = (unsigned short)(tempebx & 0x000000FF);
6988 XGINew_SetReg1( pVBInfo->Part4Port , 0x1B , temp ) ;
6989
6990 temp = (unsigned short)((tempebx & 0x0000FF00) >> 8);
6991 XGINew_SetReg1( pVBInfo->Part4Port , 0x1A , temp ) ;
6992 tempbx = (unsigned short)(tempebx >> 16);
6993 temp = tempbx & 0x00FF ;
6994 temp = temp << 4 ;
6995 temp |= ( ( tempcx & 0xFF00 ) >> 8 ) ;
6996 XGINew_SetReg1( pVBInfo->Part4Port , 0x19 , temp ) ;
6997
6998 /* 301b */
6999 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
7000 {
7001 temp = 0x0028 ;
7002 XGINew_SetReg1( pVBInfo->Part4Port , 0x1C , temp ) ;
7003 tempax = pVBInfo->VGAHDE ;
7004 if ( modeflag & HalfDCLK )
7005 {
7006 tempax = tempax >> 1 ;
7007 }
7008
7009 if ( XGI_IsLCDDualLink( pVBInfo ) )
7010 tempax = tempax >> 1 ;
7011
7012 /* if((pVBInfo->VBInfo&(SetCRT2ToLCD))||((pVBInfo->TVInfo&SetYPbPrMode525p)||(pVBInfo->TVInfo&SetYPbPrMode750p))) { */
7013 if ( pVBInfo->VBInfo & SetCRT2ToLCD )
7014 {
7015 if ( tempax > 800 )
7016 tempax -= 800 ;
7017 }
7018 else
7019 {
7020 if ( pVBInfo->VGAHDE > 800 )
7021 {
7022 if ( pVBInfo->VGAHDE == 1024 )
7023 tempax = ( tempax * 25 / 32 ) - 1 ;
7024 else
7025 tempax = ( tempax * 20 / 32 ) - 1 ;
7026 }
7027 }
7028 tempax -= 1 ;
7029
7030 /*
7031 if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToHiVisionTV ) )
7032 {
7033 if ( pVBInfo->VBType & VB_XGI301LV )
7034 {
7035 if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) )
7036 {
7037 if ( pVBInfo->VGAHDE > 800 )
7038 {
7039 if ( pVBInfo->VGAHDE == 1024 )
7040 tempax = ( tempax * 25 / 32 ) - 1 ;
7041 else
7042 tempax = ( tempax * 20 / 32 ) - 1 ;
7043 }
7044 }
7045 }
7046 else
7047 {
7048 if ( pVBInfo->VGAHDE > 800 )
7049 {
7050 if ( pVBInfo->VGAHDE == 1024 )
7051 tempax = ( tempax * 25 / 32 ) - 1 ;
7052 else
7053 tempax = ( tempax * 20 / 32 ) - 1 ;
7054 }
7055 }
7056 }
7057 */
7058
7059 temp = ( tempax & 0xFF00 ) >> 8 ;
7060 temp = ( ( temp & 0x0003 ) << 4 ) ;
7061 XGINew_SetReg1( pVBInfo->Part4Port , 0x1E , temp ) ;
7062 temp = ( tempax & 0x00FF ) ;
7063 XGINew_SetReg1( pVBInfo->Part4Port , 0x1D , temp ) ;
7064
7065 if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToHiVisionTV ) )
7066 {
7067 if ( pVBInfo->VGAHDE > 800 )
7068 {
7069 XGINew_SetRegOR( pVBInfo->Part4Port , 0x1E , 0x08 ) ;
7070 }
7071 }
7072 temp = 0x0036 ;
7073
7074 if ( pVBInfo->VBInfo & SetCRT2ToTV )
7075 {
7076 if ( !( pVBInfo->TVInfo & ( NTSC1024x768 | SetYPbPrMode525p | SetYPbPrMode750p | SetYPbPrMode1080i ) ) )
7077 {
7078 temp |= 0x0001 ;
7079 if ( ( pVBInfo->VBInfo & SetInSlaveMode ) && ( !( pVBInfo->TVInfo & TVSimuMode ) ) )
7080 temp &= ( ~0x0001 ) ;
7081 }
7082 }
7083
7084 XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x1F , 0x00C0 , temp ) ;
7085 tempbx = pVBInfo->HT ;
7086 if ( XGI_IsLCDDualLink( pVBInfo ) )
7087 tempbx = tempbx >> 1 ;
7088 tempbx = ( tempbx >> 1 ) - 2 ;
7089 temp = ( ( tempbx & 0x0700 ) >> 8 ) << 3 ;
7090 XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x21 , 0x00C0 , temp ) ;
7091 temp = tempbx & 0x00FF ;
7092 XGINew_SetReg1( pVBInfo->Part4Port , 0x22 , temp ) ;
7093 }
7094 /* end 301b */
7095
7096 if ( pVBInfo->ISXPDOS == 0 )
7097 XGI_SetCRT2VCLK( ModeNo , ModeIdIndex , RefreshRateTableIndex, pVBInfo ) ;
7098 }
7099
7100
7101 /* --------------------------------------------------------------------- */
7102 /* Function : XGI_SetGroup5 */
7103 /* Input : */
7104 /* Output : */
7105 /* Description : */
7106 /* --------------------------------------------------------------------- */
7107 void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
7108 {
7109 unsigned short Pindex ,
7110 Pdata ;
7111
7112 Pindex = pVBInfo->Part5Port ;
7113 Pdata = pVBInfo->Part5Port + 1 ;
7114 if ( pVBInfo->ModeType == ModeVGA )
7115 {
7116 if ( !( pVBInfo->VBInfo & ( SetInSlaveMode | LoadDACFlag | CRT2DisplayFlag ) ) )
7117 {
7118 XGINew_EnableCRT2(pVBInfo) ;
7119 /* LoadDAC2(pVBInfo->Part5Port,ModeNo,ModeIdIndex); */
7120 }
7121 }
7122 return ;
7123 }
7124
7125
7126 /* --------------------------------------------------------------------- */
7127 /* Function : XGI_GetLcdPtr */
7128 /* Input : */
7129 /* Output : */
7130 /* Description : */
7131 /* --------------------------------------------------------------------- */
7132 void *XGI_GetLcdPtr(unsigned short BX,
7133 unsigned short ModeNo,
7134 unsigned short ModeIdIndex,
7135 unsigned short RefreshRateTableIndex,
7136 struct vb_device_info *pVBInfo)
7137 {
7138 unsigned short i ,
7139 tempdx ,
7140 tempcx ,
7141 tempbx ,
7142 tempal ,
7143 modeflag ,
7144 table ;
7145
7146 struct XGI330_LCDDataTablStruct *tempdi = 0 ;
7147
7148
7149 tempbx = BX;
7150
7151 if ( ModeNo <= 0x13 )
7152 {
7153 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
7154 tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
7155 }
7156 else
7157 {
7158 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
7159 tempal = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
7160 }
7161
7162 tempal = tempal & 0x0f ;
7163
7164 if ( tempbx <= 1 ) /* ExpLink */
7165 {
7166 if ( ModeNo <= 0x13 )
7167 {
7168 tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ; /* find no Ext_CRT2CRTC2 */
7169 }
7170 else
7171 {
7172 tempal= pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
7173 }
7174
7175 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
7176 {
7177 if ( ModeNo <= 0x13 )
7178 tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC2 ;
7179 else
7180 tempal= pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC2 ;
7181 }
7182
7183 if ( tempbx & 0x01 )
7184 tempal = ( tempal >> 4 ) ;
7185
7186 tempal = ( tempal & 0x0f ) ;
7187 }
7188
7189 tempcx = LCDLenList[ tempbx ] ; /* mov cl,byte ptr cs:LCDLenList[bx] */
7190
7191 if ( pVBInfo->LCDInfo & EnableScalingLCD ) /* ScaleLCD */
7192 {
7193 if ( ( tempbx == 5 ) || ( tempbx ) == 7 )
7194 tempcx = LCDDesDataLen2 ;
7195 else if ( ( tempbx == 3 ) || ( tempbx == 8 ) )
7196 tempcx = LVDSDesDataLen2 ;
7197 }
7198 /* mov di, word ptr cs:LCDDataList[bx] */
7199 /* tempdi=pVideoMemory[LCDDataList+tempbx*2]|(pVideoMemory[LCDDataList+tempbx*2+1]<<8); */
7200
7201 switch( tempbx )
7202 {
7203 case 0:
7204 tempdi = XGI_EPLLCDCRT1Ptr_H ;
7205 break ;
7206 case 1:
7207 tempdi = XGI_EPLLCDCRT1Ptr_V ;
7208 break ;
7209 case 2:
7210 tempdi = XGI_EPLLCDDataPtr ;
7211 break ;
7212 case 3:
7213 tempdi = XGI_EPLLCDDesDataPtr ;
7214 break ;
7215 case 4:
7216 tempdi = XGI_LCDDataTable ;
7217 break ;
7218 case 5:
7219 tempdi = XGI_LCDDesDataTable ;
7220 break ;
7221 case 6:
7222 tempdi = XGI_EPLCHLCDRegPtr ;
7223 break ;
7224 case 7:
7225 case 8:
7226 case 9:
7227 tempdi = 0 ;
7228 break ;
7229 default:
7230 break ;
7231 }
7232
7233 if ( tempdi == 0x00 ) /* OEMUtil */
7234 return 0 ;
7235
7236 table = tempbx ;
7237 i = 0 ;
7238
7239 while( tempdi[ i ].PANELID != 0xff )
7240 {
7241 tempdx = pVBInfo->LCDResInfo ;
7242 if ( tempbx & 0x0080 ) /* OEMUtil */
7243 {
7244 tempbx &= ( ~0x0080 ) ;
7245 tempdx = pVBInfo->LCDTypeInfo ;
7246 }
7247
7248 if ( pVBInfo->LCDInfo & EnableScalingLCD )
7249 tempdx &= ( ~PanelResInfo ) ;
7250
7251 if ( tempdi[ i ].PANELID == tempdx )
7252 {
7253 tempbx = tempdi[ i ].MASK ;
7254 tempdx = pVBInfo->LCDInfo ;
7255
7256 if ( ModeNo <= 0x13 ) /* alan 09/10/2003 */
7257 tempdx |= SetLCDStdMode ;
7258
7259 if ( modeflag & HalfDCLK )
7260 tempdx |= SetLCDLowResolution ;
7261
7262 tempbx &= tempdx;
7263 if ( tempbx == tempdi[ i ].CAP )
7264 break ;
7265 }
7266 i++ ;
7267 }
7268
7269 if ( table == 0 )
7270 {
7271 switch( tempdi[ i ].DATAPTR )
7272 {
7273 case 0:
7274 return &XGI_LVDSCRT11024x768_1_H[ tempal ] ;
7275 break ;
7276 case 1:
7277 return &XGI_LVDSCRT11024x768_2_H[ tempal ] ;
7278 break ;
7279 case 2:
7280 return &XGI_LVDSCRT11280x1024_1_H[ tempal ] ;
7281 break ;
7282 case 3:
7283 return &XGI_LVDSCRT11280x1024_2_H[ tempal ] ;
7284 break ;
7285 case 4:
7286 return &XGI_LVDSCRT11400x1050_1_H[ tempal ] ;
7287 break ;
7288 case 5:
7289 return &XGI_LVDSCRT11400x1050_2_H[ tempal ] ;
7290 break ;
7291 case 6:
7292 return &XGI_LVDSCRT11600x1200_1_H[ tempal ] ;
7293 break ;
7294 case 7:
7295 return &XGI_LVDSCRT11024x768_1_Hx75[ tempal ] ;
7296 break ;
7297 case 8:
7298 return &XGI_LVDSCRT11024x768_2_Hx75[ tempal ] ;
7299 break ;
7300 case 9:
7301 return &XGI_LVDSCRT11280x1024_1_Hx75[ tempal ] ;
7302 break ;
7303 case 10:
7304 return &XGI_LVDSCRT11280x1024_2_Hx75[ tempal ] ;
7305 break ;
7306 default:
7307 break ;
7308 }
7309 }
7310 else if ( table == 1 )
7311 {
7312 switch( tempdi[ i ].DATAPTR )
7313 {
7314 case 0:
7315 return &XGI_LVDSCRT11024x768_1_V[ tempal ] ;
7316 break ;
7317 case 1:
7318 return &XGI_LVDSCRT11024x768_2_V[ tempal ] ;
7319 break ;
7320 case 2:
7321 return &XGI_LVDSCRT11280x1024_1_V[ tempal ] ;
7322 break ;
7323 case 3:
7324 return &XGI_LVDSCRT11280x1024_2_V[ tempal ] ;
7325 break ;
7326 case 4:
7327 return &XGI_LVDSCRT11400x1050_1_V[ tempal ] ;
7328 break ;
7329 case 5:
7330 return &XGI_LVDSCRT11400x1050_2_V[ tempal ] ;
7331 break ;
7332 case 6:
7333 return &XGI_LVDSCRT11600x1200_1_V[ tempal ] ;
7334 break ;
7335 case 7:
7336 return &XGI_LVDSCRT11024x768_1_Vx75[ tempal ] ;
7337 break ;
7338 case 8:
7339 return &XGI_LVDSCRT11024x768_2_Vx75[ tempal ] ;
7340 break ;
7341 case 9:
7342 return &XGI_LVDSCRT11280x1024_1_Vx75[ tempal ] ;
7343 break ;
7344 case 10:
7345 return &XGI_LVDSCRT11280x1024_2_Vx75[ tempal ] ;
7346 break ;
7347 default:
7348 break ;
7349 }
7350 }
7351 else if ( table == 2 )
7352 {
7353 switch( tempdi[ i ].DATAPTR )
7354 {
7355 case 0:
7356 return &XGI_LVDS1024x768Data_1[ tempal ] ;
7357 break ;
7358 case 1:
7359 return &XGI_LVDS1024x768Data_2[ tempal ] ;
7360 break ;
7361 case 2:
7362 return &XGI_LVDS1280x1024Data_1[ tempal ] ;
7363 break ;
7364 case 3:
7365 return &XGI_LVDS1280x1024Data_2[ tempal ] ;
7366 break ;
7367 case 4:
7368 return &XGI_LVDS1400x1050Data_1[ tempal ] ;
7369 break ;
7370 case 5:
7371 return &XGI_LVDS1400x1050Data_2[ tempal ] ;
7372 break ;
7373 case 6:
7374 return &XGI_LVDS1600x1200Data_1[ tempal ] ;
7375 break ;
7376 case 7:
7377 return &XGI_LVDSNoScalingData[ tempal ] ;
7378 break ;
7379 case 8:
7380 return &XGI_LVDS1024x768Data_1x75[ tempal ] ;
7381 break ;
7382 case 9:
7383 return &XGI_LVDS1024x768Data_2x75[ tempal ] ;
7384 break ;
7385 case 10:
7386 return &XGI_LVDS1280x1024Data_1x75[ tempal ] ;
7387 break ;
7388 case 11:
7389 return &XGI_LVDS1280x1024Data_2x75[ tempal ] ;
7390 break ;
7391 case 12:
7392 return &XGI_LVDSNoScalingDatax75[ tempal ] ;
7393 break ;
7394 default:
7395 break ;
7396 }
7397 }
7398 else if ( table == 3 )
7399 {
7400 switch( tempdi[ i ].DATAPTR )
7401 {
7402 case 0:
7403 return &XGI_LVDS1024x768Des_1[ tempal ] ;
7404 break ;
7405 case 1:
7406 return &XGI_LVDS1024x768Des_3[ tempal ] ;
7407 break ;
7408 case 2:
7409 return &XGI_LVDS1024x768Des_2[ tempal ] ;
7410 break ;
7411 case 3:
7412 return &XGI_LVDS1280x1024Des_1[ tempal ] ;
7413 break ;
7414 case 4:
7415 return &XGI_LVDS1280x1024Des_2[ tempal ] ;
7416 break ;
7417 case 5:
7418 return &XGI_LVDS1400x1050Des_1[ tempal ] ;
7419 break ;
7420 case 6:
7421 return &XGI_LVDS1400x1050Des_2[ tempal ] ;
7422 break ;
7423 case 7:
7424 return &XGI_LVDS1600x1200Des_1[ tempal ] ;
7425 break ;
7426 case 8:
7427 return &XGI_LVDSNoScalingDesData[ tempal ] ;
7428 break ;
7429 case 9:
7430 return &XGI_LVDS1024x768Des_1x75[ tempal ] ;
7431 break ;
7432 case 10:
7433 return &XGI_LVDS1024x768Des_3x75[ tempal ] ;
7434 break ;
7435 case 11:
7436 return &XGI_LVDS1024x768Des_2x75[ tempal ] ;
7437 break;
7438 case 12:
7439 return &XGI_LVDS1280x1024Des_1x75[ tempal ] ;
7440 break ;
7441 case 13:
7442 return &XGI_LVDS1280x1024Des_2x75[ tempal ] ;
7443 break ;
7444 case 14:
7445 return &XGI_LVDSNoScalingDesDatax75[ tempal ] ;
7446 break ;
7447 default:
7448 break ;
7449 }
7450 }
7451 else if ( table == 4 )
7452 {
7453 switch( tempdi[ i ].DATAPTR )
7454 {
7455 case 0:
7456 return &XGI_ExtLCD1024x768Data[ tempal ] ;
7457 break ;
7458 case 1:
7459 return &XGI_StLCD1024x768Data[ tempal ] ;
7460 break ;
7461 case 2:
7462 return &XGI_CetLCD1024x768Data[ tempal ] ;
7463 break ;
7464 case 3:
7465 return &XGI_ExtLCD1280x1024Data[ tempal ] ;
7466 break ;
7467 case 4:
7468 return &XGI_StLCD1280x1024Data[ tempal ] ;
7469 break ;
7470 case 5:
7471 return &XGI_CetLCD1280x1024Data[ tempal ] ;
7472 break ;
7473 case 6:
7474 return &XGI_ExtLCD1400x1050Data[ tempal ] ;
7475 break ;
7476 case 7:
7477 return &XGI_StLCD1400x1050Data[ tempal ] ;
7478 break ;
7479 case 8:
7480 return &XGI_CetLCD1400x1050Data[ tempal ] ;
7481 break ;
7482 case 9:
7483 return &XGI_ExtLCD1600x1200Data[ tempal ] ;
7484 break ;
7485 case 10:
7486 return &XGI_StLCD1600x1200Data[ tempal ] ;
7487 break ;
7488 case 11:
7489 return &XGI_NoScalingData[ tempal ] ;
7490 break ;
7491 case 12:
7492 return &XGI_ExtLCD1024x768x75Data[ tempal ] ;
7493 break ;
7494 case 13:
7495 return &XGI_ExtLCD1024x768x75Data[ tempal ] ;
7496 break ;
7497 case 14:
7498 return &XGI_CetLCD1024x768x75Data[ tempal ] ;
7499 break ;
7500 case 15:
7501 return &XGI_ExtLCD1280x1024x75Data[ tempal ] ;
7502 break ;
7503 case 16:
7504 return &XGI_StLCD1280x1024x75Data[ tempal ] ;
7505 break;
7506 case 17:
7507 return &XGI_CetLCD1280x1024x75Data[ tempal ] ;
7508 break;
7509 case 18:
7510 return &XGI_NoScalingDatax75[ tempal ] ;
7511 break ;
7512 default:
7513 break ;
7514 }
7515 }
7516 else if ( table == 5 )
7517 {
7518 switch( tempdi[ i ].DATAPTR )
7519 {
7520 case 0:
7521 return &XGI_ExtLCDDes1024x768Data[ tempal ] ;
7522 break ;
7523 case 1:
7524 return &XGI_StLCDDes1024x768Data[ tempal ] ;
7525 break ;
7526 case 2:
7527 return &XGI_CetLCDDes1024x768Data[ tempal ] ;
7528 break ;
7529 case 3:
7530 if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
7531 return &XGI_ExtLCDDLDes1280x1024Data[ tempal ] ;
7532 else
7533 return &XGI_ExtLCDDes1280x1024Data[ tempal ] ;
7534 break ;
7535 case 4:
7536 if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
7537 return &XGI_StLCDDLDes1280x1024Data[ tempal ] ;
7538 else
7539 return &XGI_StLCDDes1280x1024Data[ tempal ] ;
7540 break ;
7541 case 5:
7542 if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
7543 return &XGI_CetLCDDLDes1280x1024Data[ tempal ] ;
7544 else
7545 return &XGI_CetLCDDes1280x1024Data[ tempal ] ;
7546 break ;
7547 case 6:
7548 if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
7549 return &XGI_ExtLCDDLDes1400x1050Data[ tempal ] ;
7550 else
7551 return &XGI_ExtLCDDes1400x1050Data[ tempal ] ;
7552 break ;
7553 case 7:
7554 if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
7555 return &XGI_StLCDDLDes1400x1050Data[ tempal ] ;
7556 else
7557 return &XGI_StLCDDes1400x1050Data[ tempal ] ;
7558 break ;
7559 case 8:
7560 return &XGI_CetLCDDes1400x1050Data[ tempal ] ;
7561 break ;
7562 case 9:
7563 return &XGI_CetLCDDes1400x1050Data2[ tempal ] ;
7564 break ;
7565 case 10:
7566 if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
7567 return &XGI_ExtLCDDLDes1600x1200Data[ tempal ] ;
7568 else
7569 return &XGI_ExtLCDDes1600x1200Data[ tempal ] ;
7570 break ;
7571 case 11:
7572 if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
7573 return &XGI_StLCDDLDes1600x1200Data[ tempal ] ;
7574 else
7575 return &XGI_StLCDDes1600x1200Data[ tempal ] ;
7576 break ;
7577 case 12:
7578 return &XGI_NoScalingDesData[ tempal ] ;
7579 break;
7580 case 13:
7581 return &XGI_ExtLCDDes1024x768x75Data[ tempal ] ;
7582 break ;
7583 case 14:
7584 return &XGI_StLCDDes1024x768x75Data[ tempal ] ;
7585 break ;
7586 case 15:
7587 return &XGI_CetLCDDes1024x768x75Data[ tempal ] ;
7588 break ;
7589 case 16:
7590 if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
7591 return &XGI_ExtLCDDLDes1280x1024x75Data[ tempal ] ;
7592 else
7593 return &XGI_ExtLCDDes1280x1024x75Data[ tempal ] ;
7594 break ;
7595 case 17:
7596 if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
7597 return &XGI_StLCDDLDes1280x1024x75Data[ tempal ] ;
7598 else
7599 return &XGI_StLCDDes1280x1024x75Data[ tempal ] ;
7600 break ;
7601 case 18:
7602 if ( ( pVBInfo->VBType & VB_XGI301LV ) || ( pVBInfo->VBType & VB_XGI302LV ) )
7603 return &XGI_CetLCDDLDes1280x1024x75Data[ tempal ] ;
7604 else
7605 return &XGI_CetLCDDes1280x1024x75Data[ tempal ] ;
7606 break ;
7607 case 19:
7608 return &XGI_NoScalingDesDatax75[ tempal ] ;
7609 break ;
7610 default:
7611 break ;
7612 }
7613 }
7614 else if ( table == 6 )
7615 {
7616 switch( tempdi[ i ].DATAPTR )
7617 {
7618 case 0:
7619 return &XGI_CH7017LV1024x768[ tempal ] ;
7620 break ;
7621 case 1:
7622 return &XGI_CH7017LV1400x1050[ tempal ] ;
7623 break ;
7624 default:
7625 break ;
7626 }
7627 }
7628 return 0 ;
7629 }
7630
7631
7632 /* --------------------------------------------------------------------- */
7633 /* Function : XGI_GetTVPtr */
7634 /* Input : */
7635 /* Output : */
7636 /* Description : */
7637 /* --------------------------------------------------------------------- */
7638 void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo,
7639 unsigned short ModeIdIndex,
7640 unsigned short RefreshRateTableIndex,
7641 struct vb_device_info *pVBInfo)
7642 {
7643 unsigned short i , tempdx , tempbx , tempal , modeflag , table ;
7644 struct XGI330_TVDataTablStruct *tempdi = 0 ;
7645
7646 tempbx = BX ;
7647
7648 if ( ModeNo <= 0x13 )
7649 {
7650 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
7651 tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
7652 }
7653 else
7654 {
7655 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
7656 tempal = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
7657 }
7658
7659 tempal = tempal & 0x3f ;
7660 table = tempbx ;
7661
7662 switch( tempbx )
7663 {
7664 case 0:
7665 tempdi = 0 ; /*EPLCHTVCRT1Ptr_H;*/
7666 if ( pVBInfo->IF_DEF_CH7007 == 1 )
7667 {
7668 tempdi = XGI_EPLCHTVCRT1Ptr;
7669 }
7670 break ;
7671 case 1:
7672 tempdi = 0 ; /*EPLCHTVCRT1Ptr_V;*/
7673 if ( pVBInfo->IF_DEF_CH7007 == 1 )
7674 {
7675 tempdi = XGI_EPLCHTVCRT1Ptr;
7676 }
7677 break ;
7678 case 2:
7679 tempdi = XGI_EPLCHTVDataPtr ;
7680 break ;
7681 case 3:
7682 tempdi = 0 ;
7683 break ;
7684 case 4:
7685 tempdi = XGI_TVDataTable ;
7686 break ;
7687 case 5:
7688 tempdi = 0 ;
7689 break ;
7690 case 6:
7691 tempdi = XGI_EPLCHTVRegPtr ;
7692 break ;
7693 default:
7694 break ;
7695 }
7696
7697 if ( tempdi == 0x00 ) /* OEMUtil */
7698 return( 0 ) ;
7699
7700 tempdx = pVBInfo->TVInfo ;
7701
7702 if ( pVBInfo->VBInfo & SetInSlaveMode )
7703 tempdx = tempdx | SetTVLockMode ;
7704
7705 if ( modeflag & HalfDCLK )
7706 tempdx = tempdx | SetTVLowResolution ;
7707
7708 i = 0 ;
7709
7710 while( tempdi[ i ].MASK != 0xffff )
7711 {
7712 if ( ( tempdx & tempdi[ i ].MASK ) == tempdi[ i ].CAP )
7713 break ;
7714 i++ ;
7715 }
7716
7717 if ( table == 0x00 ) /* 07/05/22 */
7718 {
7719 }
7720 else if ( table == 0x01 )
7721 {
7722 }
7723 else if ( table == 0x04 )
7724 {
7725 switch( tempdi[ i ].DATAPTR )
7726 {
7727 case 0:
7728 return &XGI_ExtPALData[ tempal ] ;
7729 break ;
7730 case 1:
7731 return &XGI_ExtNTSCData[ tempal ] ;
7732 break ;
7733 case 2:
7734 return &XGI_StPALData[ tempal ] ;
7735 break ;
7736 case 3:
7737 return &XGI_StNTSCData[ tempal ] ;
7738 break ;
7739 case 4:
7740 return &XGI_ExtHiTVData[ tempal ] ;
7741 break ;
7742 case 5:
7743 return &XGI_St2HiTVData[ tempal ] ;
7744 break ;
7745 case 6:
7746 return &XGI_ExtYPbPr525iData[ tempal ] ;
7747 break ;
7748 case 7:
7749 return &XGI_ExtYPbPr525pData[ tempal ] ;
7750 break ;
7751 case 8:
7752 return &XGI_ExtYPbPr750pData[ tempal ] ;
7753 break ;
7754 case 9:
7755 return &XGI_StYPbPr525iData[ tempal ] ;
7756 break ;
7757 case 10:
7758 return &XGI_StYPbPr525pData[ tempal ] ;
7759 break ;
7760 case 11:
7761 return &XGI_StYPbPr750pData[ tempal ] ;
7762 break;
7763 case 12: /* avoid system hang */
7764 return &XGI_ExtNTSCData[ tempal ] ;
7765 break ;
7766 case 13:
7767 return &XGI_St1HiTVData[ tempal ] ;
7768 break ;
7769 default:
7770 break ;
7771 }
7772 }
7773 else if( table == 0x02 )
7774 {
7775 switch( tempdi[ i ].DATAPTR )
7776 {
7777 case 0:
7778 return &XGI_CHTVUNTSCData[ tempal ] ;
7779 break ;
7780 case 1:
7781 return &XGI_CHTVONTSCData[ tempal ] ;
7782 break ;
7783 case 2:
7784 return &XGI_CHTVUPALData[ tempal ] ;
7785 break ;
7786 case 3:
7787 return &XGI_CHTVOPALData[ tempal ] ;
7788 break ;
7789 default:
7790 break ;
7791 }
7792 }
7793 else if( table == 0x06 )
7794 {
7795 }
7796 return( 0 ) ;
7797 }
7798
7799
7800 /* --------------------------------------------------------------------- */
7801 /* Function : XGI_BacklightByDrv */
7802 /* Input : */
7803 /* Output : 1 -> Skip backlight control */
7804 /* Description : */
7805 /* --------------------------------------------------------------------- */
7806 unsigned char XGI_BacklightByDrv(struct vb_device_info *pVBInfo)
7807 {
7808 unsigned char tempah ;
7809
7810 tempah = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x3A) ;
7811 if (tempah & BacklightControlBit)
7812 return 1;
7813 else
7814 return 0;
7815 }
7816
7817
7818 /* --------------------------------------------------------------------- */
7819 /* Function : XGI_FirePWDDisable */
7820 /* Input : */
7821 /* Output : */
7822 /* Description : Turn off VDD & Backlight : Fire disable procedure */
7823 /* --------------------------------------------------------------------- */
7824 /*
7825 void XGI_FirePWDDisable(struct vb_device_info *pVBInfo)
7826 {
7827 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x26 , 0x00 , 0xFC ) ;
7828 }
7829 */
7830
7831 /* --------------------------------------------------------------------- */
7832 /* Function : XGI_FirePWDEnable */
7833 /* Input : */
7834 /* Output : */
7835 /* Description : Turn on VDD & Backlight : Fire enable procedure */
7836 /* --------------------------------------------------------------------- */
7837 void XGI_FirePWDEnable(struct vb_device_info *pVBInfo)
7838 {
7839 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x26 , 0x03 , 0xFC ) ;
7840 }
7841
7842
7843 /* --------------------------------------------------------------------- */
7844 /* Function : XGI_EnableGatingCRT */
7845 /* Input : */
7846 /* Output : */
7847 /* Description : */
7848 /* --------------------------------------------------------------------- */
7849 void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
7850 {
7851 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x63 , 0xBF , 0x40 ) ;
7852 }
7853
7854
7855 /* --------------------------------------------------------------------- */
7856 /* Function : XGI_DisableGatingCRT */
7857 /* Input : */
7858 /* Output : */
7859 /* Description : */
7860 /* --------------------------------------------------------------------- */
7861 void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
7862 {
7863
7864 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x63 , 0xBF , 0x00 ) ;
7865 }
7866
7867
7868 /* --------------------------------------------------------------------- */
7869 /* Function : XGI_SetPanelDelay */
7870 /* Input : */
7871 /* Output : */
7872 /* Description : */
7873 /* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
7874 /* : bl : 2 ; T2 : the duration signal on and Vdd on */
7875 /* : bl : 3 ; T3 : the duration between CPL off and signal off */
7876 /* : bl : 4 ; T4 : the duration signal off and Vdd off */
7877 /* --------------------------------------------------------------------- */
7878 void XGI_SetPanelDelay(unsigned short tempbl, struct vb_device_info *pVBInfo)
7879 {
7880 unsigned short index ;
7881
7882 index = XGI_GetLCDCapPtr(pVBInfo) ;
7883
7884 if ( tempbl == 1 )
7885 XGINew_LCD_Wait_Time( pVBInfo->LCDCapList[ index ].PSC_S1, pVBInfo ) ;
7886
7887 if ( tempbl == 2 )
7888 XGINew_LCD_Wait_Time( pVBInfo->LCDCapList[ index ].PSC_S2, pVBInfo ) ;
7889
7890 if ( tempbl == 3 )
7891 XGINew_LCD_Wait_Time( pVBInfo->LCDCapList[ index ].PSC_S3, pVBInfo ) ;
7892
7893 if ( tempbl == 4 )
7894 XGINew_LCD_Wait_Time( pVBInfo->LCDCapList[ index ].PSC_S4, pVBInfo ) ;
7895 }
7896
7897
7898 /* --------------------------------------------------------------------- */
7899 /* Function : XGI_SetPanelPower */
7900 /* Input : */
7901 /* Output : */
7902 /* Description : */
7903 /* I/O : ah = 0011b = 03h ; Backlight on, Power on */
7904 /* = 0111b = 07h ; Backlight on, Power off */
7905 /* = 1011b = 0Bh ; Backlight off, Power on */
7906 /* = 1111b = 0Fh ; Backlight off, Power off */
7907 /* --------------------------------------------------------------------- */
7908 void XGI_SetPanelPower(unsigned short tempah, unsigned short tempbl, struct vb_device_info *pVBInfo)
7909 {
7910 if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
7911 XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x26 , tempbl , tempah ) ;
7912 else
7913 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x11 , tempbl , tempah ) ;
7914 }
7915
7916 unsigned char XG21GPIODataTransfer(unsigned char ujDate)
7917 {
7918 unsigned char ujRet = 0;
7919 unsigned char i = 0;
7920
7921 for (i=0; i<8; i++)
7922 {
7923 ujRet = ujRet << 1;
7924 /* ujRet |= GETBITS(ujDate >> i, 0:0); */
7925 ujRet |= (ujDate >> i) & 1;
7926 }
7927
7928 return ujRet;
7929 }
7930
7931 /*----------------------------------------------------------------------------*/
7932 /* output */
7933 /* bl[5] : LVDS signal */
7934 /* bl[1] : LVDS backlight */
7935 /* bl[0] : LVDS VDD */
7936 /*----------------------------------------------------------------------------*/
7937 unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
7938 {
7939 unsigned char CR4A, temp;
7940
7941 CR4A = XGINew_GetReg1( pVBInfo->P3d4 , 0x4A ) ;
7942 XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x23 ) ; /* enable GPIO write */
7943
7944 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x48 ) ;
7945
7946 temp = XG21GPIODataTransfer(temp);
7947 temp &= 0x23;
7948 XGINew_SetReg1( pVBInfo->P3d4 , 0x4A , CR4A ) ;
7949 return temp;
7950 }
7951
7952 /*----------------------------------------------------------------------------*/
7953 /* output */
7954 /* bl[5] : LVDS signal */
7955 /* bl[1] : LVDS backlight */
7956 /* bl[0] : LVDS VDD */
7957 /*----------------------------------------------------------------------------*/
7958 unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
7959 {
7960 unsigned char CR4A, CRB4, temp;
7961
7962 CR4A = XGINew_GetReg1( pVBInfo->P3d4 , 0x4A ) ;
7963 XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x0C ) ; /* enable GPIO write */
7964
7965 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x48 ) ;
7966
7967 temp &= 0x0C;
7968 temp >>= 2;
7969 XGINew_SetReg1( pVBInfo->P3d4 , 0x4A , CR4A ) ;
7970 CRB4 = XGINew_GetReg1( pVBInfo->P3d4 , 0xB4 ) ;
7971 temp |= ((CRB4&0x04)<<3);
7972 return temp;
7973 }
7974 /*----------------------------------------------------------------------------*/
7975 /* input */
7976 /* bl[5] : 1;LVDS signal on */
7977 /* bl[1] : 1;LVDS backlight on */
7978 /* bl[0] : 1:LVDS VDD on */
7979 /* bh: 100000b : clear bit 5, to set bit5 */
7980 /* 000010b : clear bit 1, to set bit1 */
7981 /* 000001b : clear bit 0, to set bit0 */
7982 /*----------------------------------------------------------------------------*/
7983 void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl, struct vb_device_info *pVBInfo)
7984 {
7985 unsigned char CR4A, temp;
7986
7987 CR4A = XGINew_GetReg1( pVBInfo->P3d4 , 0x4A ) ;
7988 tempbh &= 0x23;
7989 tempbl &= 0x23;
7990 XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~tempbh ) ; /* enable GPIO write */
7991
7992 if (tempbh&0x20)
7993 {
7994 temp = (tempbl>>4)&0x02;
7995
7996 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0xB4 , ~0x02 , temp) ; /* CR B4[1] */
7997
7998 }
7999
8000 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x48 ) ;
8001
8002 temp = XG21GPIODataTransfer(temp);
8003 temp &= ~tempbh;
8004 temp |= tempbl;
8005 XGINew_SetReg1( pVBInfo->P3d4 , 0x48 , temp ) ;
8006 }
8007
8008 void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl, struct vb_device_info *pVBInfo)
8009 {
8010 unsigned char CR4A, temp;
8011 unsigned short tempbh0, tempbl0;
8012
8013 tempbh0 = tempbh;
8014 tempbl0 = tempbl;
8015 tempbh0 &= 0x20;
8016 tempbl0 &= 0x20;
8017 tempbh0 >>= 3;
8018 tempbl0 >>= 3;
8019
8020 if (tempbh&0x20)
8021 {
8022 temp = (tempbl>>4)&0x02;
8023
8024 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0xB4 , ~0x02 , temp) ; /* CR B4[1] */
8025
8026 }
8027 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0xB4 , ~tempbh0 , tempbl0 ) ;
8028
8029 CR4A = XGINew_GetReg1( pVBInfo->P3d4 , 0x4A ) ;
8030 tempbh &= 0x03;
8031 tempbl &= 0x03;
8032 tempbh <<= 2;
8033 tempbl <<= 2; /* GPIOC,GPIOD */
8034 XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~tempbh ) ; /* enable GPIO write */
8035 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x48 , ~tempbh , tempbl ) ;
8036 }
8037
8038 /* --------------------------------------------------------------------- */
8039 unsigned short XGI_GetLVDSOEMTableIndex(struct vb_device_info *pVBInfo)
8040 {
8041 unsigned short index ;
8042
8043 index = XGINew_GetReg1( pVBInfo->P3d4 , 0x36 ) ;
8044 if (index < sizeof(XGI21_LCDCapList)/sizeof(struct XGI21_LVDSCapStruct))
8045 return index;
8046 return 0;
8047 }
8048
8049 /* --------------------------------------------------------------------- */
8050 /* Function : XGI_XG21SetPanelDelay */
8051 /* Input : */
8052 /* Output : */
8053 /* Description : */
8054 /* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
8055 /* : bl : 2 ; T2 : the duration signal on and Vdd on */
8056 /* : bl : 3 ; T3 : the duration between CPL off and signal off */
8057 /* : bl : 4 ; T4 : the duration signal off and Vdd off */
8058 /* --------------------------------------------------------------------- */
8059 void XGI_XG21SetPanelDelay(unsigned short tempbl, struct vb_device_info *pVBInfo)
8060 {
8061 unsigned short index ;
8062
8063 index = XGI_GetLVDSOEMTableIndex( pVBInfo );
8064 if ( tempbl == 1 )
8065 XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S1, pVBInfo ) ;
8066
8067 if ( tempbl == 2 )
8068 XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S2, pVBInfo ) ;
8069
8070 if ( tempbl == 3 )
8071 XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S3, pVBInfo ) ;
8072
8073 if ( tempbl == 4 )
8074 XGINew_LCD_Wait_Time( pVBInfo->XG21_LVDSCapList[ index ].PSC_S4, pVBInfo ) ;
8075 }
8076
8077 unsigned char XGI_XG21CheckLVDSMode(unsigned short ModeNo,
8078 unsigned short ModeIdIndex,
8079 struct vb_device_info *pVBInfo)
8080 {
8081 unsigned short xres ,
8082 yres ,
8083 colordepth ,
8084 modeflag ,
8085 resindex ,
8086 lvdstableindex;
8087
8088 resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
8089 if ( ModeNo <= 0x13 )
8090 {
8091 xres = pVBInfo->StResInfo[ resindex ].HTotal ;
8092 yres = pVBInfo->StResInfo[ resindex ].VTotal ;
8093 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
8094 }
8095 else
8096 {
8097 xres = pVBInfo->ModeResInfo[ resindex ].HTotal ; /* xres->ax */
8098 yres = pVBInfo->ModeResInfo[ resindex ].VTotal ; /* yres->bx */
8099 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ; /* si+St_ModeFlag */
8100 }
8101
8102 if ( !( modeflag & Charx8Dot ) )
8103 {
8104 xres /= 9;
8105 xres *= 8;
8106 }
8107
8108 if ( ModeNo > 0x13 )
8109 {
8110 if ( ( ModeNo>0x13 ) && ( modeflag & HalfDCLK ) )
8111 {
8112 xres *= 2 ;
8113 }
8114 if ( ( ModeNo>0x13 ) && ( modeflag & DoubleScanMode ) )
8115 {
8116 yres *= 2 ;
8117 }
8118 }
8119
8120 lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo );
8121 if ( xres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE) )
8122 return 0;
8123
8124 if ( yres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE) )
8125 return 0;
8126
8127 if ( ModeNo > 0x13 )
8128 {
8129 if ( ( xres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE) ) ||
8130 ( yres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE)) )
8131 {
8132 colordepth = XGI_GetColorDepth( ModeNo , ModeIdIndex, pVBInfo ) ;
8133 if (colordepth > 2)
8134 return 0;
8135
8136 }
8137 }
8138 return 1;
8139 }
8140
8141 void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
8142 {
8143 unsigned char temp;
8144
8145 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ; /* D[0] 1: 18bit */
8146 temp = ( temp & 1 ) << 6;
8147 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x06 , ~0x40 , temp ) ; /* SR06[6] 18bit Dither */
8148 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x09 , ~0xc0 , temp | 0x80 ) ; /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
8149
8150 }
8151
8152 void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
8153 {
8154 unsigned char temp;
8155
8156 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ; /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
8157 temp = ( temp & 3 ) << 6;
8158 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x06 , ~0xc0 , temp & 0x80 ) ; /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
8159 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x09 , ~0xc0 , temp | 0x80 ) ; /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
8160
8161 }
8162
8163 void XGI_SetXG21LVDSPara(unsigned short ModeNo, unsigned short ModeIdIndex,
8164 struct vb_device_info *pVBInfo)
8165 {
8166 unsigned char temp, Miscdata;
8167 unsigned short xres ,
8168 yres ,
8169 modeflag ,
8170 resindex ,
8171 lvdstableindex ;
8172 unsigned short LVDSHT,LVDSHBS,LVDSHRS,LVDSHRE,LVDSHBE;
8173 unsigned short LVDSVT,LVDSVBS,LVDSVRS,LVDSVRE,LVDSVBE;
8174 unsigned short value;
8175
8176 lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo );
8177
8178 temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & (LCDPolarity << 8)) >> 8);
8179 temp &= LCDPolarity;
8180 Miscdata = (unsigned char) XGINew_GetReg2(pVBInfo->P3cc) ;
8181
8182 XGINew_SetReg3( pVBInfo->P3c2 , (Miscdata & 0x3F) | temp ) ;
8183
8184 temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & LCDPolarity) ;
8185 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x80 , temp&0x80 ) ; /* SR35[7] FP VSync polarity */
8186 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , ~0x20 , (temp&0x40)>>1 ) ; /* SR30[5] FP HSync polarity */
8187
8188 XGI_SetXG21FPBits(pVBInfo);
8189 resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
8190 if ( ModeNo <= 0x13 )
8191 {
8192 xres = pVBInfo->StResInfo[ resindex ].HTotal ;
8193 yres = pVBInfo->StResInfo[ resindex ].VTotal ;
8194 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
8195 }
8196 else
8197 {
8198 xres = pVBInfo->ModeResInfo[ resindex ].HTotal ; /* xres->ax */
8199 yres = pVBInfo->ModeResInfo[ resindex ].VTotal ; /* yres->bx */
8200 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ; /* si+St_ModeFlag */
8201 }
8202
8203 if (!( modeflag & Charx8Dot ))
8204 xres = xres * 8 / 9;
8205
8206 LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;
8207
8208 LVDSHBS = xres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE - xres ) / 2 ;
8209 if ( ( ModeNo<=0x13 ) && ( modeflag & HalfDCLK ) )
8210 {
8211 LVDSHBS -= xres/4 ;
8212 }
8213 if (LVDSHBS > LVDSHT) LVDSHBS -= LVDSHT ;
8214
8215 LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP ;
8216 if (LVDSHRS > LVDSHT) LVDSHRS -= LVDSHT ;
8217
8218 LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC ;
8219 if (LVDSHRE > LVDSHT) LVDSHRE -= LVDSHT ;
8220
8221 LVDSHBE = LVDSHBS + LVDSHT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE ;
8222
8223 LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;
8224
8225 LVDSVBS = yres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE - yres ) / 2 ;
8226 if ( ( ModeNo>0x13 ) && ( modeflag & DoubleScanMode ) )
8227 {
8228 LVDSVBS += yres/2 ;
8229 }
8230 if (LVDSVBS > LVDSVT) LVDSVBS -= LVDSVT ;
8231
8232 LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP ;
8233 if (LVDSVRS > LVDSVT) LVDSVRS -= LVDSVT ;
8234
8235 LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC ;
8236 if (LVDSVRE > LVDSVT) LVDSVRE -= LVDSVT ;
8237
8238 LVDSVBE = LVDSVBS + LVDSVT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE ;
8239
8240 temp = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11) ;
8241 XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , temp & 0x7f ) ; /* Unlock CRTC */
8242
8243 if (!( modeflag & Charx8Dot ))
8244 {
8245 XGINew_SetRegOR( pVBInfo->P3c4 , 0x1 , 0x1 ) ;
8246 }
8247
8248 /* HT SR0B[1:0] CR00 */
8249 value = ( LVDSHT >> 3 ) - 5;
8250 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0x03 , ( value & 0x300 ) >> 8 ) ;
8251 XGINew_SetReg1( pVBInfo->P3d4 , 0x0 , (value & 0xFF) ) ;
8252
8253 /* HBS SR0B[5:4] CR02 */
8254 value = ( LVDSHBS >> 3 ) - 1;
8255 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0x30 , ( value & 0x300 ) >> 4 ) ;
8256 XGINew_SetReg1( pVBInfo->P3d4 , 0x2 , (value & 0xFF) ) ;
8257
8258 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
8259 value = ( LVDSHBE >> 3 ) - 1;
8260 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0C , ~0x03 , ( value & 0xC0 ) >> 6 ) ;
8261 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x05 , ~0x80 , ( value & 0x20 ) << 2 ) ;
8262 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x03 , ~0x1F , value & 0x1F ) ;
8263
8264 /* HRS SR0B[7:6] CR04 */
8265 value = ( LVDSHRS >> 3 ) + 2;
8266 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0xC0 , ( value & 0x300 ) >> 2 ) ;
8267 XGINew_SetReg1( pVBInfo->P3d4 , 0x4 , (value & 0xFF) ) ;
8268
8269 /* Panel HRS SR2F[1:0] SR2E[7:0] */
8270 value--;
8271 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x2F , ~0x03 , ( value & 0x300 ) >> 8 ) ;
8272 XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , (value & 0xFF) ) ;
8273
8274 /* HRE SR0C[2] CR05[4:0] */
8275 value = ( LVDSHRE >> 3 ) + 2;
8276 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0C , ~0x04 , ( value & 0x20 ) >> 3 ) ;
8277 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x05 , ~0x1F , value & 0x1F ) ;
8278
8279 /* Panel HRE SR2F[7:2] */
8280 value--;
8281 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x2F , ~0xFC , value << 2 ) ;
8282
8283 /* VT SR0A[0] CR07[5][0] CR06 */
8284 value = LVDSVT - 2 ;
8285 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x01 , ( value & 0x400 ) >> 10 ) ;
8286 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x20 , ( value & 0x200 ) >> 4 ) ;
8287 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x01 , ( value & 0x100 ) >> 8 ) ;
8288 XGINew_SetReg1( pVBInfo->P3d4 , 0x06 , (value & 0xFF) ) ;
8289
8290 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
8291 value = LVDSVBS - 1 ;
8292 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x04 , ( value & 0x400 ) >> 8 ) ;
8293 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x09 , ~0x20 , ( value & 0x200 ) >> 4 ) ;
8294 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x08 , ( value & 0x100 ) >> 5 ) ;
8295 XGINew_SetReg1( pVBInfo->P3d4 , 0x15 , (value & 0xFF) ) ;
8296
8297 /* VBE SR0A[4] CR16 */
8298 value = LVDSVBE - 1;
8299 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x10 , ( value & 0x100 ) >> 4 ) ;
8300 XGINew_SetReg1( pVBInfo->P3d4 , 0x16 , (value & 0xFF) ) ;
8301
8302 /* VRS SR0A[3] CR7[7][2] CR10 */
8303 value = LVDSVRS - 1 ;
8304 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x08 , ( value & 0x400 ) >> 7 ) ;
8305 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x80 , ( value & 0x200 ) >> 2 ) ;
8306 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x04 , ( value & 0x100 ) >> 6 ) ;
8307 XGINew_SetReg1( pVBInfo->P3d4 , 0x10 , (value & 0xFF) ) ;
8308
8309 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
8310 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0x03 , ( value & 0x600 ) >> 9 ) ;
8311 XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , (value >> 1) & 0xFF ) ;
8312 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x33 , ~0x01 , value & 0x01 ) ;
8313
8314 /* VRE SR0A[5] CR11[3:0] */
8315 value = LVDSVRE - 1;
8316 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x20 , ( value & 0x10 ) << 1 ) ;
8317 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x11 , ~0x0F , value & 0x0F ) ;
8318
8319 /* Panel VRE SR3F[7:2] */ /* SR3F[7] has to be 0, h/w bug */
8320 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC , ( value << 2 ) & 0x7C ) ;
8321
8322 for ( temp=0, value = 0; temp < 3; temp++)
8323 {
8324
8325 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , value ) ;
8326 XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData1) ;
8327 XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData2) ;
8328 value += 0x10;
8329 }
8330
8331 if (!( modeflag & Charx8Dot ))
8332 {
8333 XGINew_GetReg2( pVBInfo->P3da ) ; /* reset 3da */
8334 XGINew_SetReg3( pVBInfo->P3c0 , 0x13 ) ; /* set index */
8335 XGINew_SetReg3( pVBInfo->P3c0 , 0x00 ) ; /* set data, panning = 0, shift left 1 dot*/
8336
8337 XGINew_GetReg2( pVBInfo->P3da ) ; /* Enable Attribute */
8338 XGINew_SetReg3( pVBInfo->P3c0 , 0x20 ) ;
8339
8340 XGINew_GetReg2( pVBInfo->P3da ) ; /* reset 3da */
8341 }
8342
8343
8344 }
8345
8346 /* no shadow case */
8347 void XGI_SetXG27LVDSPara(unsigned short ModeNo, unsigned short ModeIdIndex,
8348 struct vb_device_info *pVBInfo)
8349 {
8350 unsigned char temp, Miscdata;
8351 unsigned short xres ,
8352 yres ,
8353 modeflag ,
8354 resindex ,
8355 lvdstableindex ;
8356 unsigned short LVDSHT,LVDSHBS,LVDSHRS,LVDSHRE,LVDSHBE;
8357 unsigned short LVDSVT,LVDSVBS,LVDSVRS,LVDSVRE,LVDSVBE;
8358 unsigned short value;
8359
8360 lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo );
8361 temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & (LCDPolarity << 8)) >> 8);
8362 temp &= LCDPolarity;
8363 Miscdata = (unsigned char) XGINew_GetReg2(pVBInfo->P3cc);
8364
8365 XGINew_SetReg3( pVBInfo->P3c2 , (Miscdata & 0x3F) | temp ) ;
8366
8367 temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability & LCDPolarity) ;
8368 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x80 , temp&0x80 ) ; /* SR35[7] FP VSync polarity */
8369 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x30 , ~0x20 , (temp&0x40)>>1 ) ; /* SR30[5] FP HSync polarity */
8370
8371 XGI_SetXG27FPBits(pVBInfo);
8372 resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ;
8373 if ( ModeNo <= 0x13 )
8374 {
8375 xres = pVBInfo->StResInfo[ resindex ].HTotal ;
8376 yres = pVBInfo->StResInfo[ resindex ].VTotal ;
8377 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; /* si+St_ResInfo */
8378 }
8379 else
8380 {
8381 xres = pVBInfo->ModeResInfo[ resindex ].HTotal ; /* xres->ax */
8382 yres = pVBInfo->ModeResInfo[ resindex ].VTotal ; /* yres->bx */
8383 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex].Ext_ModeFlag ; /* si+St_ModeFlag */
8384 }
8385
8386 if (!( modeflag & Charx8Dot ))
8387 xres = xres * 8 / 9;
8388
8389 LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;
8390
8391 LVDSHBS = xres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE - xres ) / 2 ;
8392 if ( ( ModeNo<=0x13 ) && ( modeflag & HalfDCLK ) )
8393 {
8394 LVDSHBS -= xres/4 ;
8395 }
8396 if (LVDSHBS > LVDSHT) LVDSHBS -= LVDSHT ;
8397
8398 LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP ;
8399 if (LVDSHRS > LVDSHT) LVDSHRS -= LVDSHT ;
8400
8401 LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC ;
8402 if (LVDSHRE > LVDSHT) LVDSHRE -= LVDSHT ;
8403
8404 LVDSHBE = LVDSHBS + LVDSHT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE ;
8405
8406 LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;
8407
8408 LVDSVBS = yres + ( pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE - yres ) / 2 ;
8409 if ( ( ModeNo>0x13 ) && ( modeflag & DoubleScanMode ) )
8410 {
8411 LVDSVBS += yres/2 ;
8412 }
8413 if (LVDSVBS > LVDSVT) LVDSVBS -= LVDSVT ;
8414
8415 LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP ;
8416 if (LVDSVRS > LVDSVT) LVDSVRS -= LVDSVT ;
8417
8418 LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC ;
8419 if (LVDSVRE > LVDSVT) LVDSVRE -= LVDSVT ;
8420
8421 LVDSVBE = LVDSVBS + LVDSVT - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE ;
8422
8423 temp = (unsigned char)XGINew_GetReg1(pVBInfo->P3d4, 0x11) ;
8424 XGINew_SetReg1( pVBInfo->P3d4 , 0x11 , temp & 0x7f ) ; /* Unlock CRTC */
8425
8426 if (!( modeflag & Charx8Dot ))
8427 {
8428 XGINew_SetRegOR( pVBInfo->P3c4 , 0x1 , 0x1 ) ;
8429 }
8430
8431 /* HT SR0B[1:0] CR00 */
8432 value = ( LVDSHT >> 3 ) - 5;
8433 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0x03 , ( value & 0x300 ) >> 8 ) ;
8434 XGINew_SetReg1( pVBInfo->P3d4 , 0x0 , (value & 0xFF) ) ;
8435
8436 /* HBS SR0B[5:4] CR02 */
8437 value = ( LVDSHBS >> 3 ) - 1;
8438 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0x30 , ( value & 0x300 ) >> 4 ) ;
8439 XGINew_SetReg1( pVBInfo->P3d4 , 0x2 , (value & 0xFF) ) ;
8440
8441 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
8442 value = ( LVDSHBE >> 3 ) - 1;
8443 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0C , ~0x03 , ( value & 0xC0 ) >> 6 ) ;
8444 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x05 , ~0x80 , ( value & 0x20 ) << 2 ) ;
8445 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x03 , ~0x1F , value & 0x1F ) ;
8446
8447 /* HRS SR0B[7:6] CR04 */
8448 value = ( LVDSHRS >> 3 ) + 2;
8449 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0B , ~0xC0 , ( value & 0x300 ) >> 2 ) ;
8450 XGINew_SetReg1( pVBInfo->P3d4 , 0x4 , (value & 0xFF) ) ;
8451
8452 /* Panel HRS SR2F[1:0] SR2E[7:0] */
8453 value--;
8454 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x2F , ~0x03 , ( value & 0x300 ) >> 8 ) ;
8455 XGINew_SetReg1( pVBInfo->P3c4 , 0x2E , (value & 0xFF) ) ;
8456
8457 /* HRE SR0C[2] CR05[4:0] */
8458 value = ( LVDSHRE >> 3 ) + 2;
8459 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0C , ~0x04 , ( value & 0x20 ) >> 3 ) ;
8460 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x05 , ~0x1F , value & 0x1F ) ;
8461
8462 /* Panel HRE SR2F[7:2] */
8463 value--;
8464 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x2F , ~0xFC , value << 2 ) ;
8465
8466 /* VT SR0A[0] CR07[5][0] CR06 */
8467 value = LVDSVT - 2 ;
8468 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x01 , ( value & 0x400 ) >> 10 ) ;
8469 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x20 , ( value & 0x200 ) >> 4 ) ;
8470 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x01 , ( value & 0x100 ) >> 8 ) ;
8471 XGINew_SetReg1( pVBInfo->P3d4 , 0x06 , (value & 0xFF) ) ;
8472
8473 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
8474 value = LVDSVBS - 1 ;
8475 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x04 , ( value & 0x400 ) >> 8 ) ;
8476 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x09 , ~0x20 , ( value & 0x200 ) >> 4 ) ;
8477 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x08 , ( value & 0x100 ) >> 5 ) ;
8478 XGINew_SetReg1( pVBInfo->P3d4 , 0x15 , (value & 0xFF) ) ;
8479
8480 /* VBE SR0A[4] CR16 */
8481 value = LVDSVBE - 1;
8482 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x10 , ( value & 0x100 ) >> 4 ) ;
8483 XGINew_SetReg1( pVBInfo->P3d4 , 0x16 , (value & 0xFF) ) ;
8484
8485 /* VRS SR0A[3] CR7[7][2] CR10 */
8486 value = LVDSVRS - 1 ;
8487 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x08 , ( value & 0x400 ) >> 7 ) ;
8488 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x80 , ( value & 0x200 ) >> 2 ) ;
8489 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x07 , ~0x04 , ( value & 0x100 ) >> 6 ) ;
8490 XGINew_SetReg1( pVBInfo->P3d4 , 0x10 , (value & 0xFF) ) ;
8491
8492 /* Panel VRS SR35[2:0] SR34[7:0] */
8493 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x35 , ~0x07 , ( value & 0x700 ) >> 8 ) ;
8494 XGINew_SetReg1( pVBInfo->P3c4 , 0x34 , value & 0xFF ) ;
8495
8496 /* VRE SR0A[5] CR11[3:0] */
8497 value = LVDSVRE - 1;
8498 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x0A , ~0x20 , ( value & 0x10 ) << 1 ) ;
8499 XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x11 , ~0x0F , value & 0x0F ) ;
8500
8501 /* Panel VRE SR3F[7:2] */
8502 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x3F , ~0xFC , ( value << 2 ) & 0xFC ) ;
8503
8504 for ( temp=0, value = 0; temp < 3; temp++)
8505 {
8506
8507 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x31 , ~0x30 , value ) ;
8508 XGINew_SetReg1( pVBInfo->P3c4 , 0x2B , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData1) ;
8509 XGINew_SetReg1( pVBInfo->P3c4 , 0x2C , pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData2) ;
8510 value += 0x10;
8511 }
8512
8513 if (!( modeflag & Charx8Dot ))
8514 {
8515 XGINew_GetReg2( pVBInfo->P3da ) ; /* reset 3da */
8516 XGINew_SetReg3( pVBInfo->P3c0 , 0x13 ) ; /* set index */
8517 XGINew_SetReg3( pVBInfo->P3c0 , 0x00 ) ; /* set data, panning = 0, shift left 1 dot*/
8518
8519 XGINew_GetReg2( pVBInfo->P3da ) ; /* Enable Attribute */
8520 XGINew_SetReg3( pVBInfo->P3c0 , 0x20 ) ;
8521
8522 XGINew_GetReg2( pVBInfo->P3da ) ; /* reset 3da */
8523 }
8524
8525
8526 }
8527
8528 /* --------------------------------------------------------------------- */
8529 /* Function : XGI_IsLCDON */
8530 /* Input : */
8531 /* Output : 0 : Skip PSC Control */
8532 /* 1: Disable PSC */
8533 /* Description : */
8534 /* --------------------------------------------------------------------- */
8535 unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
8536 {
8537 unsigned short tempax ;
8538
8539 tempax = pVBInfo->VBInfo ;
8540 if ( tempax & SetCRT2ToDualEdge )
8541 return 0;
8542 else if ( tempax & ( DisableCRT2Display | SwitchToCRT2 | SetSimuScanMode ) )
8543 return 1;
8544
8545 return 0;
8546 }
8547
8548
8549 /* --------------------------------------------------------------------- */
8550 /* Function : XGI_EnablePWD */
8551 /* Input : */
8552 /* Output : */
8553 /* Description : */
8554 /* --------------------------------------------------------------------- */
8555 void XGI_EnablePWD(struct vb_device_info *pVBInfo)
8556 {
8557 unsigned short index ,
8558 temp ;
8559
8560 index = XGI_GetLCDCapPtr(pVBInfo) ;
8561 temp = pVBInfo->LCDCapList[ index ].PWD_2B ;
8562 XGINew_SetReg1( pVBInfo->Part4Port , 0x2B , temp ) ;
8563 XGINew_SetReg1( pVBInfo->Part4Port , 0x2C , pVBInfo->LCDCapList[ index ].PWD_2C ) ;
8564 XGINew_SetReg1( pVBInfo->Part4Port , 0x2D , pVBInfo->LCDCapList[ index ].PWD_2D ) ;
8565 XGINew_SetReg1( pVBInfo->Part4Port , 0x2E , pVBInfo->LCDCapList[ index ].PWD_2E ) ;
8566 XGINew_SetReg1( pVBInfo->Part4Port , 0x2F , pVBInfo->LCDCapList[ index ].PWD_2F ) ;
8567 XGINew_SetRegOR( pVBInfo->Part4Port , 0x27 , 0x80 ) ; /* enable PWD */
8568 }
8569
8570
8571 /* --------------------------------------------------------------------- */
8572 /* Function : XGI_DisablePWD */
8573 /* Input : */
8574 /* Output : */
8575 /* Description : */
8576 /* --------------------------------------------------------------------- */
8577 void XGI_DisablePWD(struct vb_device_info *pVBInfo)
8578 {
8579 XGINew_SetRegAND( pVBInfo->Part4Port , 0x27 , 0x7F ) ; /* disable PWD */
8580 }
8581
8582
8583 /* --------------------------------------------------------------------- */
8584 /* Function : XGI_DisableChISLCD */
8585 /* Input : */
8586 /* Output : 0 -> Not LCD Mode */
8587 /* Description : */
8588 /* --------------------------------------------------------------------- */
8589 unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
8590 {
8591 unsigned short tempbx ,
8592 tempah ;
8593
8594 tempbx = pVBInfo->SetFlag & ( DisableChA | DisableChB ) ;
8595 tempah = ~((unsigned short) XGINew_GetReg1(pVBInfo->Part1Port, 0x2E));
8596
8597 if ( tempbx & ( EnableChA | DisableChA ) )
8598 {
8599 if ( !( tempah & 0x08 ) ) /* Chk LCDA Mode */
8600 return 0 ;
8601 }
8602
8603 if ( !( tempbx & ( EnableChB | DisableChB ) ) )
8604 return 0;
8605
8606 if ( tempah & 0x01 ) /* Chk LCDB Mode */
8607 return 1;
8608
8609 return 0;
8610 }
8611
8612
8613 /* --------------------------------------------------------------------- */
8614 /* Function : XGI_EnableChISLCD */
8615 /* Input : */
8616 /* Output : 0 -> Not LCD mode */
8617 /* Description : */
8618 /* --------------------------------------------------------------------- */
8619 unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
8620 {
8621 unsigned short tempbx ,
8622 tempah ;
8623
8624
8625 tempbx = pVBInfo->SetFlag & ( EnableChA | EnableChB ) ;
8626 tempah = ~( (unsigned short)XGINew_GetReg1( pVBInfo->Part1Port , 0x2E ) ) ;
8627
8628 if ( tempbx & ( EnableChA | DisableChA ) )
8629 {
8630 if ( !( tempah & 0x08 ) ) /* Chk LCDA Mode */
8631 return 0;
8632 }
8633
8634 if ( !( tempbx & ( EnableChB | DisableChB ) ) )
8635 return 0;
8636
8637 if ( tempah & 0x01 ) /* Chk LCDB Mode */
8638 return 1;
8639
8640 return 0;
8641 }
8642
8643
8644 /* --------------------------------------------------------------------- */
8645 /* Function : XGI_GetLCDCapPtr */
8646 /* Input : */
8647 /* Output : */
8648 /* Description : */
8649 /* --------------------------------------------------------------------- */
8650 unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
8651 {
8652 unsigned char tempal ,
8653 tempah ,
8654 tempbl ,
8655 i ;
8656
8657 tempah = XGINew_GetReg1( pVBInfo->P3d4 , 0x36 ) ;
8658 tempal = tempah & 0x0F ;
8659 tempah = tempah & 0xF0 ;
8660 i = 0 ;
8661 tempbl = pVBInfo->LCDCapList[ i ].LCD_ID ;
8662
8663 while( tempbl != 0xFF )
8664 {
8665 if ( tempbl & 0x80 ) /* OEMUtil */
8666 {
8667 tempal = tempah ;
8668 tempbl = tempbl & ~( 0x80 ) ;
8669 }
8670
8671 if ( tempal == tempbl )
8672 break ;
8673
8674 i++ ;
8675
8676 tempbl = pVBInfo->LCDCapList[ i ].LCD_ID ;
8677 }
8678
8679 return i ;
8680 }
8681
8682
8683 /* --------------------------------------------------------------------- */
8684 /* Function : XGI_GetLCDCapPtr1 */
8685 /* Input : */
8686 /* Output : */
8687 /* Description : */
8688 /* --------------------------------------------------------------------- */
8689 unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
8690 {
8691 unsigned short tempah ,
8692 tempal ,
8693 tempbl ,
8694 i ;
8695
8696 tempal = pVBInfo->LCDResInfo ;
8697 tempah = pVBInfo->LCDTypeInfo ;
8698
8699 i = 0 ;
8700 tempbl = pVBInfo->LCDCapList[ i ].LCD_ID;
8701
8702 while( tempbl != 0xFF )
8703 {
8704 if ( ( tempbl & 0x80 ) && ( tempbl != 0x80 ) )
8705 {
8706 tempal = tempah ;
8707 tempbl &= ~0x80 ;
8708 }
8709
8710 if ( tempal == tempbl )
8711 break ;
8712
8713 i++ ;
8714 tempbl = pVBInfo->LCDCapList[ i ].LCD_ID ;
8715 }
8716
8717 if ( tempbl == 0xFF )
8718 {
8719 pVBInfo->LCDResInfo = Panel1024x768 ;
8720 pVBInfo->LCDTypeInfo = 0 ;
8721 i = 0 ;
8722 }
8723
8724 return i ;
8725 }
8726
8727
8728 /* --------------------------------------------------------------------- */
8729 /* Function : XGI_GetLCDSync */
8730 /* Input : */
8731 /* Output : */
8732 /* Description : */
8733 /* --------------------------------------------------------------------- */
8734 void XGI_GetLCDSync(unsigned short *HSyncWidth , unsigned short *VSyncWidth,
8735 struct vb_device_info *pVBInfo)
8736 {
8737 unsigned short Index ;
8738
8739 Index = XGI_GetLCDCapPtr(pVBInfo) ;
8740 *HSyncWidth = pVBInfo->LCDCapList[ Index ].LCD_HSyncWidth ;
8741 *VSyncWidth = pVBInfo->LCDCapList[ Index ].LCD_VSyncWidth ;
8742
8743 return ;
8744 }
8745
8746
8747
8748 /* --------------------------------------------------------------------- */
8749 /* Function : XGI_EnableBridge */
8750 /* Input : */
8751 /* Output : */
8752 /* Description : */
8753 /* --------------------------------------------------------------------- */
8754 void XGI_EnableBridge(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
8755 {
8756 unsigned short tempbl ,
8757 tempah ;
8758
8759 if ( pVBInfo->SetFlag == Win9xDOSMode )
8760 {
8761 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
8762 {
8763 XGI_DisplayOn( HwDeviceExtension, pVBInfo) ;
8764 return ;
8765 }
8766 else /* LVDS or CH7017 */
8767 return ;
8768 }
8769
8770
8771 if ( HwDeviceExtension->jChipType < XG40 )
8772 {
8773 if ( !XGI_DisableChISLCD(pVBInfo) )
8774 {
8775 if ( ( XGI_EnableChISLCD(pVBInfo) ) || ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) )
8776 {
8777 if ( pVBInfo->LCDInfo & SetPWDEnable )
8778 {
8779 XGI_EnablePWD( pVBInfo);
8780 }
8781 else
8782 {
8783 pVBInfo->LCDInfo &= ( ~SetPWDEnable ) ;
8784 if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
8785 {
8786 tempbl = 0xFD ;
8787 tempah = 0x02 ;
8788 }
8789 else
8790 {
8791 tempbl = 0xFB ;
8792 tempah = 0x00 ;
8793 }
8794
8795 XGI_SetPanelPower( tempah , tempbl, pVBInfo ) ;
8796 XGI_SetPanelDelay( 1,pVBInfo ) ;
8797 }
8798 }
8799 }
8800 } /* Not 340 */
8801
8802
8803
8804 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
8805 {
8806 if ( !( pVBInfo->SetFlag & DisableChA ) )
8807 {
8808 if ( pVBInfo->SetFlag & EnableChA )
8809 {
8810 XGINew_SetReg1( pVBInfo->Part1Port , 0x1E , 0x20 ) ; /* Power on */
8811 }
8812 else
8813 {
8814 if ( pVBInfo->VBInfo & SetCRT2ToDualEdge ) /* SetCRT2ToLCDA ) */
8815 {
8816 XGINew_SetReg1(pVBInfo->Part1Port,0x1E,0x20); /* Power on */
8817 }
8818 }
8819 }
8820
8821 if ( !( pVBInfo->SetFlag & DisableChB ) )
8822 {
8823 if ( ( pVBInfo->SetFlag & EnableChB ) || ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToTV | SetCRT2ToRAMDAC ) ) )
8824 {
8825 tempah = (unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x32);
8826 tempah &= 0xDF;
8827 if ( pVBInfo->VBInfo & SetInSlaveMode )
8828 {
8829 if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) )
8830 tempah |= 0x20 ;
8831 }
8832 XGINew_SetReg1( pVBInfo->P3c4 , 0x32 , tempah ) ;
8833 XGINew_SetRegOR( pVBInfo->P3c4 , 0x1E , 0x20 ) ;
8834
8835 tempah = (unsigned char)XGINew_GetReg1(pVBInfo->Part1Port, 0x2E);
8836
8837 if ( !( tempah & 0x80 ) )
8838 XGINew_SetRegOR( pVBInfo->Part1Port , 0x2E , 0x80 ) ; /* BVBDOENABLE = 1 */
8839
8840 XGINew_SetRegAND( pVBInfo->Part1Port , 0x00 , 0x7F ) ; /* BScreenOFF = 0 */
8841 }
8842 }
8843
8844 if ( ( pVBInfo->SetFlag & ( EnableChA | EnableChB ) ) || ( !( pVBInfo->VBInfo & DisableCRT2Display ) ) )
8845 {
8846 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x00 , ~0xE0 , 0x20 ) ; /* shampoo 0129 */
8847 if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
8848 {
8849 if ( !XGI_DisableChISLCD(pVBInfo) )
8850 {
8851 if ( XGI_EnableChISLCD( pVBInfo) || ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) )
8852 XGINew_SetRegAND( pVBInfo->Part4Port ,0x2A , 0x7F ) ; /* LVDS PLL power on */
8853 }
8854 XGINew_SetRegAND( pVBInfo->Part4Port , 0x30 , 0x7F ) ; /* LVDS Driver power on */
8855 }
8856 }
8857
8858 tempah = 0x00 ;
8859
8860 if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
8861 {
8862 tempah = 0xc0 ;
8863
8864 if ( !( pVBInfo->VBInfo & SetSimuScanMode ) )
8865 {
8866 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
8867 {
8868 if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
8869 {
8870 tempah = tempah & 0x40;
8871 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
8872 tempah = tempah ^ 0xC0 ;
8873
8874 if ( pVBInfo->SetFlag & DisableChB )
8875 tempah &= 0xBF ;
8876
8877 if ( pVBInfo->SetFlag & DisableChA )
8878 tempah &= 0x7F ;
8879
8880 if ( pVBInfo->SetFlag & EnableChB )
8881 tempah |= 0x40 ;
8882
8883 if ( pVBInfo->SetFlag & EnableChA )
8884 tempah |= 0x80 ;
8885 }
8886 }
8887 }
8888 }
8889
8890 XGINew_SetRegOR( pVBInfo->Part4Port , 0x1F , tempah ) ; /* EnablePart4_1F */
8891
8892 if ( pVBInfo->SetFlag & Win9xDOSMode )
8893 {
8894 XGI_DisplayOn( HwDeviceExtension, pVBInfo) ;
8895 return ;
8896 }
8897
8898 if ( !( pVBInfo->SetFlag & DisableChA ) )
8899 {
8900 XGI_VBLongWait( pVBInfo) ;
8901 if ( !( pVBInfo->SetFlag & GatingCRT ) )
8902 {
8903 XGI_DisableGatingCRT( HwDeviceExtension, pVBInfo ) ;
8904 XGI_DisplayOn( HwDeviceExtension, pVBInfo) ;
8905 XGI_VBLongWait( pVBInfo) ;
8906 }
8907 }
8908 } /* 301 */
8909 else /* LVDS */
8910 {
8911 if ( pVBInfo->VBInfo & ( SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA ) )
8912 XGINew_SetRegOR( pVBInfo->Part1Port , 0x1E , 0x20 ) ; /* enable CRT2 */
8913
8914
8915
8916 tempah = (unsigned char)XGINew_GetReg1(pVBInfo->Part1Port, 0x2E);
8917 if ( !( tempah & 0x80 ) )
8918 XGINew_SetRegOR( pVBInfo->Part1Port , 0x2E , 0x80 ) ; /* BVBDOENABLE = 1 */
8919
8920 XGINew_SetRegAND(pVBInfo->Part1Port,0x00,0x7F);
8921 XGI_DisplayOn( HwDeviceExtension, pVBInfo);
8922 } /* End of VB */
8923
8924
8925 if ( HwDeviceExtension->jChipType < XG40 )
8926 {
8927 if ( !XGI_EnableChISLCD(pVBInfo) )
8928 {
8929 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
8930 {
8931 if ( XGI_BacklightByDrv(pVBInfo) )
8932 return ;
8933 }
8934 else
8935 return ;
8936 }
8937
8938 if ( pVBInfo->LCDInfo & SetPWDEnable )
8939 {
8940 XGI_FirePWDEnable(pVBInfo) ;
8941 return ;
8942 }
8943
8944 XGI_SetPanelDelay( 2,pVBInfo ) ;
8945
8946 if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
8947 {
8948 tempah = 0x01 ;
8949 tempbl = 0xFE ; /* turn on backlght */
8950 }
8951 else
8952 {
8953 tempbl = 0xF7 ;
8954 tempah = 0x00 ;
8955 }
8956 XGI_SetPanelPower( tempah , tempbl , pVBInfo) ;
8957 }
8958 }
8959
8960
8961 /* --------------------------------------------------------------------- */
8962 /* Function : XGI_DisableBridge */
8963 /* Input : */
8964 /* Output : */
8965 /* Description : */
8966 /* --------------------------------------------------------------------- */
8967 void XGI_DisableBridge(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
8968 {
8969 unsigned short tempax ,
8970 tempbx ,
8971 tempah = 0 ,
8972 tempbl = 0 ;
8973
8974 if ( pVBInfo->SetFlag == Win9xDOSMode )
8975 return ;
8976
8977
8978 if ( HwDeviceExtension->jChipType < XG40 )
8979 {
8980 if ( ( !( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) ) || ( XGI_DisableChISLCD(pVBInfo) ) )
8981 {
8982 if ( !XGI_IsLCDON(pVBInfo) )
8983 {
8984 if ( pVBInfo->LCDInfo & SetPWDEnable )
8985 XGI_EnablePWD( pVBInfo) ;
8986 else
8987 {
8988 pVBInfo->LCDInfo &= ~SetPWDEnable ;
8989 XGI_DisablePWD(pVBInfo) ;
8990 if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
8991 {
8992 tempbx = 0xFE ; /* not 01h */
8993 tempax = 0 ;
8994 }
8995 else
8996 {
8997 tempbx = 0xF7 ; /* not 08h */
8998 tempax = 0x08 ;
8999 }
9000 XGI_SetPanelPower( tempax , tempbx , pVBInfo) ;
9001 XGI_SetPanelDelay( 3,pVBInfo ) ;
9002 }
9003 } /* end if(!XGI_IsLCDON(pVBInfo)) */
9004 }
9005 }
9006
9007 /* if ( CH7017 )
9008 {
9009 if ( !( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2toLCDA ) ) || ( XGI_DisableChISLCD(pVBInfo) ) )
9010 {
9011 if ( !XGI_IsLCDON(pVBInfo) )
9012 {
9013 if ( DISCHARGE )
9014 {
9015 tempbx = XGINew_GetCH7005( 0x61 ) ;
9016 if ( tempbx < 0x01 ) //first time we power up
9017 XGINew_SetCH7005( 0x0066 ) ; //and disable power sequence
9018 else
9019 XGINew_SetCH7005( 0x5f66 ) ; //leave VDD on - disable power
9020 }
9021 }
9022 }
9023 } */
9024
9025 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B| VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
9026 {
9027 tempah = 0x3F ;
9028 if ( !( pVBInfo->VBInfo & ( DisableCRT2Display | SetSimuScanMode ) ) )
9029 {
9030 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
9031 {
9032 if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
9033 {
9034 tempah = 0x7F; /* Disable Channel A */
9035 if ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
9036 tempah = 0xBF ; /* Disable Channel B */
9037
9038 if ( pVBInfo->SetFlag & DisableChB )
9039 tempah &= 0xBF ; /* force to disable Cahnnel */
9040
9041 if ( pVBInfo->SetFlag & DisableChA )
9042 tempah &= 0x7F ; /* Force to disable Channel B */
9043 }
9044 }
9045 }
9046
9047 XGINew_SetRegAND( pVBInfo->Part4Port , 0x1F , tempah ) ; /* disable part4_1f */
9048
9049 if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
9050 {
9051 if ( ( ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) ) || ( XGI_DisableChISLCD(pVBInfo) ) || ( XGI_IsLCDON(pVBInfo) ) )
9052 XGINew_SetRegOR( pVBInfo->Part4Port , 0x30 , 0x80 ) ; /* LVDS Driver power down */
9053 }
9054
9055 if ( ( pVBInfo->SetFlag & DisableChA ) || ( pVBInfo->VBInfo & ( DisableCRT2Display | SetCRT2ToLCDA | SetSimuScanMode ) ) )
9056 {
9057 if ( pVBInfo->SetFlag & GatingCRT )
9058 XGI_EnableGatingCRT( HwDeviceExtension, pVBInfo ) ;
9059 XGI_DisplayOff( HwDeviceExtension, pVBInfo) ;
9060 }
9061
9062 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
9063 {
9064 if ( ( pVBInfo->SetFlag & DisableChA ) || ( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
9065 XGINew_SetRegAND( pVBInfo->Part1Port , 0x1e , 0xdf ) ; /* Power down */
9066 }
9067
9068 XGINew_SetRegAND( pVBInfo->P3c4 , 0x32 , 0xdf ) ; /* disable TV as primary VGA swap */
9069
9070 if ( ( pVBInfo->VBInfo & ( SetSimuScanMode | SetCRT2ToDualEdge ) ) )
9071 XGINew_SetRegAND(pVBInfo->Part2Port,0x00,0xdf);
9072
9073 if ( ( pVBInfo->SetFlag & DisableChB ) || ( pVBInfo->VBInfo & ( DisableCRT2Display | SetSimuScanMode ) )
9074 || ( ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) ) && ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV ) ) ) )
9075 XGINew_SetRegOR( pVBInfo->Part1Port , 0x00 , 0x80 ) ; /* BScreenOff=1 */
9076
9077 if ( ( pVBInfo->SetFlag & DisableChB ) || ( pVBInfo->VBInfo & ( DisableCRT2Display | SetSimuScanMode ) )
9078 || ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) ) || ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV ) ) )
9079 {
9080 tempah= XGINew_GetReg1( pVBInfo->Part1Port , 0x00 ) ; /* save Part1 index 0 */
9081 XGINew_SetRegOR( pVBInfo->Part1Port , 0x00 , 0x10 ) ; /* BTDAC = 1, avoid VB reset */
9082 XGINew_SetRegAND( pVBInfo->Part1Port , 0x1E , 0xDF ) ; /* disable CRT2 */
9083 XGINew_SetReg1( pVBInfo->Part1Port , 0x00 , tempah ) ; /* restore Part1 index 0 */
9084 }
9085 }
9086 else /* {301} */
9087 {
9088 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToTV ) )
9089 {
9090 XGINew_SetRegOR( pVBInfo->Part1Port , 0x00 , 0x80 ) ; /* BScreenOff=1 */
9091 XGINew_SetRegAND( pVBInfo->Part1Port , 0x1E , 0xDF ) ; /* Disable CRT2 */
9092 XGINew_SetRegAND( pVBInfo->P3c4 , 0x32 , 0xDF ) ; /* Disable TV asPrimary VGA swap */
9093 }
9094
9095 if ( pVBInfo->VBInfo & ( DisableCRT2Display | SetCRT2ToLCDA | SetSimuScanMode ) )
9096 XGI_DisplayOff( HwDeviceExtension, pVBInfo) ;
9097 }
9098
9099
9100
9101
9102 if ( HwDeviceExtension->jChipType < XG40 )
9103 {
9104 if ( !( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) ) || ( XGI_DisableChISLCD(pVBInfo) ) || ( XGI_IsLCDON(pVBInfo) ) )
9105 {
9106 if ( pVBInfo->LCDInfo & SetPWDEnable )
9107 {
9108 if ( pVBInfo->LCDInfo & SetPWDEnable )
9109 XGI_BacklightByDrv(pVBInfo) ;
9110 else
9111 {
9112 XGI_SetPanelDelay( 4 ,pVBInfo) ;
9113 if ( pVBInfo->VBType & VB_XGI301LV )
9114 {
9115 tempbl = 0xFD ;
9116 tempah = 0x00 ;
9117 }
9118 else
9119 {
9120 tempbl = 0xFB ;
9121 tempah = 0x04 ;
9122 }
9123 }
9124 }
9125 XGI_SetPanelPower( tempah , tempbl , pVBInfo) ;
9126 }
9127 }
9128 }
9129
9130
9131 /* --------------------------------------------------------------------- */
9132 /* Function : XGI_GetTVPtrIndex */
9133 /* Input : */
9134 /* Output : */
9135 /* Description : bx 0 : ExtNTSC */
9136 /* 1 : StNTSC */
9137 /* 2 : ExtPAL */
9138 /* 3 : StPAL */
9139 /* 4 : ExtHiTV */
9140 /* 5 : StHiTV */
9141 /* 6 : Ext525i */
9142 /* 7 : St525i */
9143 /* 8 : Ext525p */
9144 /* 9 : St525p */
9145 /* A : Ext750p */
9146 /* B : St750p */
9147 /* --------------------------------------------------------------------- */
9148 unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
9149 {
9150 unsigned short tempbx = 0 ;
9151
9152 if ( pVBInfo->TVInfo & SetPALTV )
9153 tempbx = 2 ;
9154 if ( pVBInfo->TVInfo & SetYPbPrMode1080i )
9155 tempbx = 4 ;
9156 if ( pVBInfo->TVInfo & SetYPbPrMode525i )
9157 tempbx = 6 ;
9158 if ( pVBInfo->TVInfo & SetYPbPrMode525p )
9159 tempbx = 8 ;
9160 if ( pVBInfo->TVInfo & SetYPbPrMode750p )
9161 tempbx = 10 ;
9162 if ( pVBInfo->TVInfo & TVSimuMode )
9163 tempbx++ ;
9164
9165 return tempbx ;
9166 }
9167
9168
9169 /* --------------------------------------------------------------------- */
9170 /* Function : XGI_OEM310Setting */
9171 /* Input : */
9172 /* Output : */
9173 /* Description : Customized Param. for 301 */
9174 /* --------------------------------------------------------------------- */
9175 void XGI_OEM310Setting(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
9176 {
9177 if ( pVBInfo->SetFlag & Win9xDOSMode )
9178 return ;
9179
9180 /* GetPart1IO(); */
9181 XGI_SetDelayComp(pVBInfo) ;
9182
9183 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
9184 XGI_SetLCDCap(pVBInfo) ;
9185
9186 if ( pVBInfo->VBInfo & SetCRT2ToTV )
9187 {
9188 /* GetPart2IO() */
9189 XGI_SetPhaseIncr(pVBInfo) ;
9190 XGI_SetYFilter( ModeNo , ModeIdIndex,pVBInfo ) ;
9191 XGI_SetAntiFlicker( ModeNo , ModeIdIndex,pVBInfo ) ;
9192
9193 if ( pVBInfo->VBType&VB_XGI301)
9194 XGI_SetEdgeEnhance( ModeNo , ModeIdIndex ,pVBInfo) ;
9195 }
9196 }
9197
9198
9199 /* --------------------------------------------------------------------- */
9200 /* Function : XGI_SetDelayComp */
9201 /* Input : */
9202 /* Output : */
9203 /* Description : */
9204 /* --------------------------------------------------------------------- */
9205 void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
9206 {
9207 unsigned short index ;
9208
9209 unsigned char tempah ,
9210 tempbl ,
9211 tempbh ;
9212
9213 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
9214 {
9215 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA | SetCRT2ToTV | SetCRT2ToRAMDAC ) )
9216 {
9217 tempbl = 0;
9218 tempbh = 0;
9219
9220 index = XGI_GetTVPtrIndex(pVBInfo ) ; /* Get TV Delay */
9221 tempbl = pVBInfo->XGI_TVDelayList[ index ] ;
9222
9223 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
9224 tempbl = pVBInfo->XGI_TVDelayList2[ index ] ;
9225
9226 if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
9227 tempbl = tempbl >> 4 ;
9228 /*
9229 if ( pVBInfo->VBInfo & SetCRT2ToRAMDAC )
9230 tempbl = CRT2Delay1 ; // Get CRT2 Delay
9231
9232 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
9233 tempbl = CRT2Delay2 ;
9234 */
9235 if ( pVBInfo->VBInfo & ( SetCRT2ToLCD | SetCRT2ToLCDA ) )
9236 {
9237 index = XGI_GetLCDCapPtr(pVBInfo) ; /* Get LCD Delay */
9238 tempbh=pVBInfo->LCDCapList[ index ].LCD_DelayCompensation ;
9239
9240 if ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
9241 tempbl = tempbh ;
9242 }
9243
9244 tempbl &= 0x0F ;
9245 tempbh &= 0xF0 ;
9246 tempah = XGINew_GetReg1( pVBInfo->Part1Port , 0x2D ) ;
9247
9248 if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV ) ) /* Channel B */
9249 {
9250 tempah &= 0xF0 ;
9251 tempah |= tempbl ;
9252 }
9253
9254 if ( pVBInfo->VBInfo & SetCRT2ToLCDA ) /* Channel A */
9255 {
9256 tempah &= 0x0F ;
9257 tempah |= tempbh ;
9258 }
9259 XGINew_SetReg1(pVBInfo->Part1Port,0x2D,tempah);
9260 }
9261 }
9262 else if ( pVBInfo->IF_DEF_LVDS == 1 )
9263 {
9264 tempbl = 0;
9265 tempbh = 0;
9266 if ( pVBInfo->VBInfo & SetCRT2ToLCD )
9267 {
9268 tempah = pVBInfo->LCDCapList[ XGI_GetLCDCapPtr(pVBInfo) ].LCD_DelayCompensation ; /* / Get LCD Delay */
9269 tempah &= 0x0f ;
9270 tempah = tempah << 4 ;
9271 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2D , 0x0f , tempah ) ;
9272 }
9273 }
9274 }
9275
9276
9277 /* --------------------------------------------------------------------- */
9278 /* Function : XGI_SetLCDCap */
9279 /* Input : */
9280 /* Output : */
9281 /* Description : */
9282 /* --------------------------------------------------------------------- */
9283 void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
9284 {
9285 unsigned short tempcx ;
9286
9287 tempcx = pVBInfo->LCDCapList[ XGI_GetLCDCapPtr(pVBInfo) ].LCD_Capability ;
9288
9289 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
9290 {
9291 if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
9292 { /* 301LV/302LV only */
9293 /* Set 301LV Capability */
9294 XGINew_SetReg1(pVBInfo->Part4Port, 0x24, (unsigned char)(tempcx & 0x1F));
9295 }
9296 /* VB Driving */
9297 XGINew_SetRegANDOR(pVBInfo->Part4Port, 0x0D,
9298 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
9299 (unsigned short)((tempcx & (EnableVBCLKDRVLOW | EnablePLLSPLOW)) >> 8));
9300 }
9301
9302 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
9303 {
9304 if ( pVBInfo->VBInfo & SetCRT2ToLCD )
9305 XGI_SetLCDCap_B( tempcx,pVBInfo ) ;
9306 else if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
9307 XGI_SetLCDCap_A( tempcx,pVBInfo ) ;
9308
9309 if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
9310 {
9311 if ( tempcx & EnableSpectrum )
9312 SetSpectrum( pVBInfo) ;
9313 }
9314 }
9315 else /* LVDS,CH7017 */
9316 XGI_SetLCDCap_A( tempcx, pVBInfo ) ;
9317 }
9318
9319
9320 /* --------------------------------------------------------------------- */
9321 /* Function : XGI_SetLCDCap_A */
9322 /* Input : */
9323 /* Output : */
9324 /* Description : */
9325 /* --------------------------------------------------------------------- */
9326 void XGI_SetLCDCap_A(unsigned short tempcx, struct vb_device_info *pVBInfo)
9327 {
9328 unsigned short temp ;
9329
9330 temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x37 ) ;
9331
9332 if ( temp & LCDRGB18Bit )
9333 {
9334 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x19, 0x0F,
9335 (unsigned short)(0x20 | (tempcx & 0x00C0))); /* Enable Dither */
9336 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x1A , 0x7F , 0x80 ) ;
9337 }
9338 else
9339 {
9340 XGINew_SetRegANDOR(pVBInfo->Part1Port, 0x19, 0x0F,
9341 (unsigned short)(0x30 | (tempcx & 0x00C0)));
9342 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x1A , 0x7F , 0x00 ) ;
9343 }
9344
9345 /*
9346 if ( tempcx & EnableLCD24bpp ) // 24bits
9347 {
9348 XGINew_SetRegANDOR(pVBInfo->Part1Port,0x19, 0x0F,(unsigned short)(0x30|(tempcx&0x00C0)) );
9349 XGINew_SetRegANDOR(pVBInfo->Part1Port,0x1A,0x7F,0x00);
9350 }
9351 else
9352 {
9353 XGINew_SetRegANDOR(pVBInfo->Part1Port,0x19, 0x0F,(unsigned short)(0x20|(tempcx&0x00C0)) ); // Enable Dither
9354 XGINew_SetRegANDOR(pVBInfo->Part1Port,0x1A,0x7F,0x80);
9355 }
9356 */
9357 }
9358
9359
9360 /* --------------------------------------------------------------------- */
9361 /* Function : XGI_SetLCDCap_B */
9362 /* Input : cx -> LCD Capability */
9363 /* Output : */
9364 /* Description : */
9365 /* --------------------------------------------------------------------- */
9366 void XGI_SetLCDCap_B(unsigned short tempcx, struct vb_device_info *pVBInfo)
9367 {
9368 if ( tempcx & EnableLCD24bpp ) /* 24bits */
9369 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x1A, 0xE0,
9370 (unsigned short)(((tempcx & 0x00ff) >> 6) | 0x0c));
9371 else
9372 XGINew_SetRegANDOR(pVBInfo->Part2Port, 0x1A, 0xE0,
9373 (unsigned short)(((tempcx & 0x00ff) >> 6) | 0x18)); /* Enable Dither */
9374 }
9375
9376
9377 /* --------------------------------------------------------------------- */
9378 /* Function : SetSpectrum */
9379 /* Input : */
9380 /* Output : */
9381 /* Description : */
9382 /* --------------------------------------------------------------------- */
9383 void SetSpectrum(struct vb_device_info *pVBInfo)
9384 {
9385 unsigned short index ;
9386
9387 index = XGI_GetLCDCapPtr(pVBInfo) ;
9388
9389 XGINew_SetRegAND( pVBInfo->Part4Port , 0x30 , 0x8F ) ; /* disable down spectrum D[4] */
9390 XGI_LongWait(pVBInfo) ;
9391 XGINew_SetRegOR( pVBInfo->Part4Port , 0x30 , 0x20 ) ; /* reset spectrum */
9392 XGI_LongWait(pVBInfo) ;
9393
9394 XGINew_SetReg1( pVBInfo->Part4Port , 0x31 , pVBInfo->LCDCapList[ index ].Spectrum_31 ) ;
9395 XGINew_SetReg1( pVBInfo->Part4Port , 0x32 , pVBInfo->LCDCapList[ index ].Spectrum_32 ) ;
9396 XGINew_SetReg1( pVBInfo->Part4Port , 0x33 , pVBInfo->LCDCapList[ index ].Spectrum_33 ) ;
9397 XGINew_SetReg1( pVBInfo->Part4Port , 0x34 , pVBInfo->LCDCapList[ index ].Spectrum_34 ) ;
9398 XGI_LongWait(pVBInfo) ;
9399 XGINew_SetRegOR( pVBInfo->Part4Port , 0x30 , 0x40 ) ; /* enable spectrum */
9400 }
9401
9402
9403 /* --------------------------------------------------------------------- */
9404 /* Function : XGI_SetAntiFlicker */
9405 /* Input : */
9406 /* Output : */
9407 /* Description : Set TV Customized Param. */
9408 /* --------------------------------------------------------------------- */
9409 void XGI_SetAntiFlicker(unsigned short ModeNo, unsigned short ModeIdIndex,
9410 struct vb_device_info *pVBInfo)
9411 {
9412 unsigned short tempbx ,
9413 index ;
9414
9415 unsigned char tempah ;
9416
9417 if (pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) )
9418 return ;
9419
9420 tempbx = XGI_GetTVPtrIndex(pVBInfo ) ;
9421 tempbx &= 0xFE ;
9422
9423 if ( ModeNo <= 0x13 )
9424 {
9425 index = pVBInfo->SModeIDTable[ ModeIdIndex ].VB_StTVFlickerIndex ;
9426 }
9427 else
9428 {
9429 index = pVBInfo->EModeIDTable[ ModeIdIndex ].VB_ExtTVFlickerIndex ;
9430 }
9431
9432 tempbx += index ;
9433 tempah = TVAntiFlickList[ tempbx ] ;
9434 tempah = tempah << 4 ;
9435
9436 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x0A , 0x8F , tempah ) ;
9437 }
9438
9439
9440 /* --------------------------------------------------------------------- */
9441 /* Function : XGI_SetEdgeEnhance */
9442 /* Input : */
9443 /* Output : */
9444 /* Description : */
9445 /* --------------------------------------------------------------------- */
9446 void XGI_SetEdgeEnhance(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
9447 {
9448 unsigned short tempbx ,
9449 index ;
9450
9451 unsigned char tempah ;
9452
9453
9454 tempbx = XGI_GetTVPtrIndex(pVBInfo ) ;
9455 tempbx &= 0xFE ;
9456
9457 if ( ModeNo <= 0x13 )
9458 {
9459 index = pVBInfo->SModeIDTable[ ModeIdIndex ].VB_StTVEdgeIndex ;
9460 }
9461 else
9462 {
9463 index = pVBInfo->EModeIDTable[ ModeIdIndex ].VB_ExtTVEdgeIndex ;
9464 }
9465
9466 tempbx += index ;
9467 tempah = TVEdgeList[ tempbx ] ;
9468 tempah = tempah << 5 ;
9469
9470 XGINew_SetRegANDOR( pVBInfo->Part2Port , 0x3A , 0x1F , tempah ) ;
9471 }
9472
9473
9474 /* --------------------------------------------------------------------- */
9475 /* Function : XGI_SetPhaseIncr */
9476 /* Input : */
9477 /* Output : */
9478 /* Description : */
9479 /* --------------------------------------------------------------------- */
9480 void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
9481 {
9482 unsigned short tempbx ;
9483
9484 unsigned char tempcl ,
9485 tempch ;
9486
9487 unsigned long tempData ;
9488
9489 XGI_GetTVPtrIndex2( &tempbx , &tempcl , &tempch, pVBInfo ) ; /* bx, cl, ch */
9490 tempData = TVPhaseList[ tempbx ] ;
9491
9492 XGINew_SetReg1(pVBInfo->Part2Port, 0x31,
9493 (unsigned short)(tempData & 0x000000FF));
9494 XGINew_SetReg1(pVBInfo->Part2Port, 0x32,
9495 (unsigned short)((tempData & 0x0000FF00) >> 8));
9496 XGINew_SetReg1(pVBInfo->Part2Port, 0x33,
9497 (unsigned short)((tempData & 0x00FF0000) >> 16));
9498 XGINew_SetReg1(pVBInfo->Part2Port, 0x34,
9499 (unsigned short)((tempData & 0xFF000000) >> 24));
9500 }
9501
9502
9503 /* --------------------------------------------------------------------- */
9504 /* Function : XGI_SetYFilter */
9505 /* Input : */
9506 /* Output : */
9507 /* Description : */
9508 /* --------------------------------------------------------------------- */
9509 void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
9510 struct vb_device_info *pVBInfo)
9511 {
9512 unsigned short tempbx ,
9513 index ;
9514
9515 unsigned char tempcl ,
9516 tempch ,
9517 tempal ,
9518 *filterPtr ;
9519
9520 XGI_GetTVPtrIndex2( &tempbx , &tempcl , &tempch, pVBInfo ) ; /* bx, cl, ch */
9521
9522 switch( tempbx )
9523 {
9524 case 0x00:
9525 case 0x04:
9526 filterPtr = NTSCYFilter1 ;
9527 break ;
9528
9529 case 0x01:
9530 filterPtr = PALYFilter1 ;
9531 break ;
9532
9533 case 0x02:
9534 case 0x05:
9535 case 0x0D:
9536 filterPtr = PALMYFilter1 ;
9537 break ;
9538
9539 case 0x03:
9540 filterPtr = PALNYFilter1 ;
9541 break ;
9542
9543 case 0x08:
9544 case 0x0C:
9545 filterPtr = NTSCYFilter2 ;
9546 break ;
9547
9548 case 0x0A:
9549 filterPtr = PALMYFilter2 ;
9550 break ;
9551
9552 case 0x0B:
9553 filterPtr = PALNYFilter2 ;
9554 break ;
9555
9556 case 0x09:
9557 filterPtr = PALYFilter2 ;
9558 break ;
9559
9560 default:
9561 return ;
9562 }
9563
9564 if ( ModeNo <= 0x13 )
9565 tempal = pVBInfo->SModeIDTable[ ModeIdIndex ].VB_StTVYFilterIndex ;
9566 else
9567 tempal = pVBInfo->EModeIDTable[ ModeIdIndex ].VB_ExtTVYFilterIndex ;
9568
9569 if ( tempcl == 0 )
9570 index = tempal * 4;
9571 else
9572 index = tempal * 7;
9573
9574 if ( ( tempcl == 0 ) && ( tempch == 1 ) )
9575 {
9576 XGINew_SetReg1( pVBInfo->Part2Port , 0x35 , 0 ) ;
9577 XGINew_SetReg1( pVBInfo->Part2Port , 0x36 , 0 ) ;
9578 XGINew_SetReg1( pVBInfo->Part2Port , 0x37 , 0 ) ;
9579 XGINew_SetReg1( pVBInfo->Part2Port , 0x38 , filterPtr[ index++ ] ) ;
9580 }
9581 else
9582 {
9583 XGINew_SetReg1( pVBInfo->Part2Port , 0x35 , filterPtr[ index++ ] ) ;
9584 XGINew_SetReg1( pVBInfo->Part2Port , 0x36 , filterPtr[ index++ ] ) ;
9585 XGINew_SetReg1( pVBInfo->Part2Port , 0x37 , filterPtr[ index++ ] ) ;
9586 XGINew_SetReg1( pVBInfo->Part2Port , 0x38 , filterPtr[ index++ ] ) ;
9587 }
9588
9589 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
9590 {
9591 XGINew_SetReg1( pVBInfo->Part2Port , 0x48 , filterPtr[ index++ ] ) ;
9592 XGINew_SetReg1( pVBInfo->Part2Port , 0x49 , filterPtr[ index++ ] ) ;
9593 XGINew_SetReg1( pVBInfo->Part2Port , 0x4A , filterPtr[ index++ ] ) ;
9594 }
9595 }
9596
9597
9598 /* --------------------------------------------------------------------- */
9599 /* Function : XGI_GetTVPtrIndex2 */
9600 /* Input : */
9601 /* Output : bx 0 : NTSC */
9602 /* 1 : PAL */
9603 /* 2 : PALM */
9604 /* 3 : PALN */
9605 /* 4 : NTSC1024x768 */
9606 /* 5 : PAL-M 1024x768 */
9607 /* 6-7: reserved */
9608 /* cl 0 : YFilter1 */
9609 /* 1 : YFilter2 */
9610 /* ch 0 : 301A */
9611 /* 1 : 301B/302B/301LV/302LV */
9612 /* Description : */
9613 /* --------------------------------------------------------------------- */
9614 void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
9615 unsigned char *tempch, struct vb_device_info *pVBInfo)
9616 {
9617 *tempbx = 0 ;
9618 *tempcl = 0 ;
9619 *tempch = 0 ;
9620
9621 if ( pVBInfo->TVInfo & SetPALTV )
9622 *tempbx = 1 ;
9623
9624 if ( pVBInfo->TVInfo & SetPALMTV )
9625 *tempbx = 2 ;
9626
9627 if ( pVBInfo->TVInfo & SetPALNTV )
9628 *tempbx = 3 ;
9629
9630 if ( pVBInfo->TVInfo & NTSC1024x768 )
9631 {
9632 *tempbx = 4 ;
9633 if ( pVBInfo->TVInfo & SetPALMTV )
9634 *tempbx = 5 ;
9635 }
9636
9637 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
9638 {
9639 if ( ( !( pVBInfo->VBInfo & SetInSlaveMode ) ) || ( pVBInfo->TVInfo & TVSimuMode ) )
9640 {
9641 *tempbx += 8 ;
9642 *tempcl += 1 ;
9643 }
9644 }
9645
9646 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
9647 (*tempch)++ ;
9648 }
9649
9650
9651 /* --------------------------------------------------------------------- */
9652 /* Function : XGI_SetCRT2ModeRegs */
9653 /* Input : */
9654 /* Output : */
9655 /* Description : Origin code for crt2group */
9656 /* --------------------------------------------------------------------- */
9657 void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
9658 struct xgi_hw_device_info *HwDeviceExtension,
9659 struct vb_device_info *pVBInfo)
9660 {
9661 unsigned short tempbl ;
9662 short tempcl ;
9663
9664 unsigned char tempah ;
9665
9666 /* XGINew_SetReg1( pVBInfo->Part1Port , 0x03 , 0x00 ) ; // fix write part1 index 0 BTDRAM bit Bug */
9667 tempah=0;
9668 if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
9669 {
9670 tempah=XGINew_GetReg1( pVBInfo->Part1Port , 0x00 ) ;
9671 tempah &= ~0x10 ; /* BTRAMDAC */
9672 tempah |= 0x40 ; /* BTRAM */
9673
9674 if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD ) )
9675 {
9676 tempah=0x40; /* BTDRAM */
9677 if ( ModeNo > 0x13 )
9678 {
9679 tempcl = pVBInfo->ModeType ;
9680 tempcl -= ModeVGA ;
9681 if ( tempcl >= 0 )
9682 {
9683 tempah = ( 0x008 >> tempcl ) ; /* BT Color */
9684 if ( tempah == 0 )
9685 tempah = 1 ;
9686 tempah |= 0x040 ;
9687 }
9688 }
9689 if ( pVBInfo->VBInfo & SetInSlaveMode )
9690 tempah ^= 0x50 ; /* BTDAC */
9691 }
9692 }
9693
9694 /* 0210 shampoo
9695 if ( pVBInfo->VBInfo & DisableCRT2Display )
9696 {
9697 tempah = 0 ;
9698 }
9699
9700 XGINew_SetReg1( pVBInfo->Part1Port , 0x00 , tempah ) ;
9701 if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD ) )
9702 {
9703 tempcl = pVBInfo->ModeType ;
9704 if ( ModeNo > 0x13 )
9705 {
9706 tempcl -= ModeVGA ;
9707 if ( ( tempcl > 0 ) || ( tempcl == 0 ) )
9708 {
9709 tempah=(0x008>>tempcl) ;
9710 if ( tempah == 0 )
9711 tempah = 1 ;
9712 tempah |= 0x040;
9713 }
9714 }
9715 else
9716 {
9717 tempah = 0x040 ;
9718 }
9719
9720 if ( pVBInfo->VBInfo & SetInSlaveMode )
9721 {
9722 tempah = ( tempah ^ 0x050 ) ;
9723 }
9724 }
9725 */
9726
9727 XGINew_SetReg1( pVBInfo->Part1Port , 0x00 , tempah ) ;
9728 tempah = 0x08 ;
9729 tempbl = 0xf0 ;
9730
9731 if ( pVBInfo->VBInfo & DisableCRT2Display )
9732 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
9733 else
9734 {
9735 tempah = 0x00 ;
9736 tempbl = 0xff ;
9737
9738 if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA ) )
9739 {
9740 if ( ( pVBInfo->VBInfo & SetCRT2ToLCDA ) && ( !( pVBInfo->VBInfo & SetSimuScanMode ) ) )
9741 {
9742 tempbl &= 0xf7 ;
9743 tempah |= 0x01 ;
9744 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
9745 }
9746 else
9747 {
9748 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
9749 {
9750 tempbl &= 0xf7 ;
9751 tempah |= 0x01 ;
9752 }
9753
9754 if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD ) )
9755 {
9756 tempbl &= 0xf8 ;
9757 tempah = 0x01 ;
9758
9759 if ( !( pVBInfo->VBInfo & SetInSlaveMode ) )
9760 tempah |= 0x02 ;
9761
9762 if ( !( pVBInfo->VBInfo & SetCRT2ToRAMDAC ) )
9763 {
9764 tempah = tempah ^ 0x05 ;
9765 if ( !( pVBInfo->VBInfo & SetCRT2ToLCD ) )
9766 tempah = tempah ^ 0x01 ;
9767 }
9768
9769 if ( !( pVBInfo->VBInfo & SetCRT2ToDualEdge ) )
9770 tempah |= 0x08 ;
9771 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
9772 }
9773 else
9774 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
9775 }
9776 }
9777 else
9778 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2e , tempbl , tempah ) ;
9779 }
9780
9781 if ( pVBInfo->VBInfo & ( SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD | SetCRT2ToLCDA ) )
9782 {
9783 tempah &= ( ~0x08 ) ;
9784 if ( ( pVBInfo->ModeType == ModeVGA ) && ( !( pVBInfo->VBInfo & SetInSlaveMode ) ) )
9785 {
9786 tempah |= 0x010 ;
9787 }
9788 tempah |= 0x080 ;
9789
9790 if ( pVBInfo->VBInfo & SetCRT2ToTV )
9791 {
9792 /* if ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) ) */
9793 /* { */
9794 tempah |= 0x020 ;
9795 if ( ModeNo > 0x13 )
9796 {
9797 if ( pVBInfo->VBInfo & DriverMode )
9798 tempah = tempah ^ 0x20 ;
9799 }
9800 /* } */
9801 }
9802
9803 XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x0D , ~0x0BF , tempah ) ;
9804 tempah = 0 ;
9805
9806 if ( pVBInfo->LCDInfo & SetLCDDualLink )
9807 tempah |= 0x40 ;
9808
9809 if ( pVBInfo->VBInfo & SetCRT2ToTV )
9810 {
9811 /* if ( ( !( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) ) && ( !( pVBInfo->TVInfo & ( SetYPbPrMode525p | SetYPbPrMode750p ) ) ) ) */
9812 /* { */
9813 if ( pVBInfo->TVInfo & RPLLDIV2XO )
9814 tempah |= 0x40 ;
9815 /* } */
9816 }
9817
9818 if ( ( pVBInfo->LCDResInfo == Panel1280x1024 ) || ( pVBInfo->LCDResInfo == Panel1280x1024x75 ) )
9819 tempah |= 0x80 ;
9820
9821 if ( pVBInfo->LCDResInfo == Panel1280x960 )
9822 tempah |= 0x80 ;
9823
9824 XGINew_SetReg1( pVBInfo->Part4Port , 0x0C , tempah ) ;
9825 }
9826
9827 if ( pVBInfo->VBType & ( VB_XGI301B | VB_XGI302B | VB_XGI301LV | VB_XGI302LV | VB_XGI301C ) )
9828 {
9829 tempah = 0 ;
9830 tempbl = 0xfb ;
9831
9832 if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
9833 {
9834 tempbl=0xff;
9835 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
9836 tempah |= 0x04 ; /* shampoo 0129 */
9837 }
9838
9839 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x13 , tempbl , tempah ) ;
9840 tempah = 0x00 ;
9841 tempbl = 0xcf ;
9842 if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
9843 {
9844 if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
9845 tempah |= 0x30 ;
9846 }
9847
9848 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2c , tempbl , tempah ) ;
9849 tempah = 0 ;
9850 tempbl = 0x3f ;
9851
9852 if ( !( pVBInfo->VBInfo & DisableCRT2Display ) )
9853 {
9854 if ( pVBInfo->VBInfo & SetCRT2ToDualEdge )
9855 tempah |= 0xc0 ;
9856 }
9857 XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x21 , tempbl , tempah ) ;
9858 }
9859
9860 tempah = 0 ;
9861 tempbl = 0x7f ;
9862 if ( !( pVBInfo->VBInfo & SetCRT2ToLCDA ) )
9863 {
9864 tempbl = 0xff ;
9865 if ( !( pVBInfo->VBInfo & SetCRT2ToDualEdge ) )
9866 tempah |= 0x80 ;
9867 }
9868
9869 XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x23 , tempbl , tempah ) ;
9870
9871 if ( pVBInfo->VBType & ( VB_XGI302LV | VB_XGI301C ) )
9872 {
9873 if ( pVBInfo->LCDInfo & SetLCDDualLink )
9874 {
9875 XGINew_SetRegOR( pVBInfo->Part4Port , 0x27 , 0x20 ) ;
9876 XGINew_SetRegOR( pVBInfo->Part4Port , 0x34 , 0x10 ) ;
9877 }
9878 }
9879 }
9880
9881
9882 /* --------------------------------------------------------------------- */
9883 /* Function : XGI_CloseCRTC */
9884 /* Input : */
9885 /* Output : */
9886 /* Description : */
9887 /* --------------------------------------------------------------------- */
9888 void XGI_CloseCRTC(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
9889 {
9890 unsigned short tempbx ;
9891
9892 tempbx = 0 ;
9893
9894 if ( pVBInfo->VBInfo & SetCRT2ToLCDA )
9895 tempbx = 0x08A0 ;
9896
9897
9898 }
9899
9900
9901 /* --------------------------------------------------------------------- */
9902 /* Function : XGI_OpenCRTC */
9903 /* Input : */
9904 /* Output : */
9905 /* Description : */
9906 /* --------------------------------------------------------------------- */
9907 void XGI_OpenCRTC(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
9908 {
9909 unsigned short tempbx ;
9910
9911 tempbx = 0 ;
9912
9913
9914 }
9915
9916
9917 /* --------------------------------------------------------------------- */
9918 /* Function : XGI_GetRAMDAC2DATA */
9919 /* Input : */
9920 /* Output : */
9921 /* Description : */
9922 /* --------------------------------------------------------------------- */
9923 void XGI_GetRAMDAC2DATA(unsigned short ModeNo, unsigned short ModeIdIndex, unsigned short RefreshRateTableIndex, struct vb_device_info *pVBInfo)
9924 {
9925 unsigned short tempax ,
9926 tempbx ,
9927 temp1 ,
9928 temp2 ,
9929 modeflag = 0 ,
9930 tempcx ,
9931 StandTableIndex ,
9932 CRT1Index ;
9933
9934 pVBInfo->RVBHCMAX = 1 ;
9935 pVBInfo->RVBHCFACT = 1 ;
9936
9937 if ( ModeNo <= 0x13 )
9938 {
9939 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
9940 StandTableIndex = XGI_GetModePtr( ModeNo , ModeIdIndex, pVBInfo ) ;
9941 tempax = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 0 ] ;
9942 tempbx = pVBInfo->StandTable[StandTableIndex ].CRTC[ 6 ] ;
9943 temp1 = pVBInfo->StandTable[ StandTableIndex ].CRTC[ 7 ] ;
9944 }
9945 else
9946 {
9947 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
9948 CRT1Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT1CRTC ;
9949 CRT1Index &= IndexMask ;
9950 temp1 = (unsigned short)pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[0];
9951 temp2 = (unsigned short)pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
9952 tempax = ( temp1 & 0xFF ) | ( ( temp2 & 0x03 ) << 8 ) ;
9953 tempbx = (unsigned short)pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[8];
9954 tempcx = (unsigned short)pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
9955 tempcx &= 0x0100 ;
9956 tempcx = tempcx << 2 ;
9957 tempbx |= tempcx;
9958 temp1 = (unsigned short)pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
9959 }
9960
9961 if ( temp1 & 0x01 )
9962 tempbx |= 0x0100 ;
9963
9964 if ( temp1 & 0x20 )
9965 tempbx |= 0x0200 ;
9966 tempax += 5 ;
9967
9968 if ( modeflag & Charx8Dot )
9969 tempax *= 8 ;
9970 else
9971 tempax *= 9 ;
9972
9973 pVBInfo->VGAHT = tempax ;
9974 pVBInfo->HT = tempax ;
9975 tempbx++ ;
9976 pVBInfo->VGAVT = tempbx ;
9977 pVBInfo->VT = tempbx ;
9978 }
9979
9980
9981
9982 /* --------------------------------------------------------------------- */
9983 /* Function : XGI_GetColorDepth */
9984 /* Input : */
9985 /* Output : */
9986 /* Description : */
9987 /* --------------------------------------------------------------------- */
9988 unsigned short XGI_GetColorDepth(unsigned short ModeNo, unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
9989 {
9990 unsigned short ColorDepth[ 6 ] = { 1 , 2 , 4 , 4 , 6 , 8 } ;
9991 short index ;
9992 unsigned short modeflag ;
9993
9994 if ( ModeNo <= 0x13 )
9995 {
9996 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ;
9997 }
9998 else
9999 {
10000 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ;
10001 }
10002
10003 index=(modeflag&ModeInfoFlag)-ModeEGA;
10004
10005 if ( index < 0 )
10006 index = 0 ;
10007
10008 return( ColorDepth[ index ] ) ;
10009 }
10010
10011
10012
10013 /* --------------------------------------------------------------------- */
10014 /* Function : XGI_UnLockCRT2 */
10015 /* Input : */
10016 /* Output : */
10017 /* Description : */
10018 /* --------------------------------------------------------------------- */
10019 void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
10020 {
10021
10022 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2f , 0xFF , 0x01 ) ;
10023
10024 }
10025
10026
10027 /* --------------------------------------------------------------------- */
10028 /* Function : XGI_LockCRT2 */
10029 /* Input : */
10030 /* Output : */
10031 /* Description : */
10032 /* --------------------------------------------------------------------- */
10033 void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo)
10034 {
10035
10036 XGINew_SetRegANDOR( pVBInfo->Part1Port , 0x2F , 0xFE , 0x00 ) ;
10037
10038
10039 }
10040
10041
10042 /* --------------------------------------------------------------------- */
10043 /* Function : XGINew_EnableCRT2 */
10044 /* Input : */
10045 /* Output : */
10046 /* Description : */
10047 /* --------------------------------------------------------------------- */
10048 void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
10049 {
10050 XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x1E , 0xFF , 0x20 ) ;
10051 }
10052
10053
10054
10055 /* --------------------------------------------------------------------- */
10056 /* Function : */
10057 /* Input : */
10058 /* Output : */
10059 /* Description : */
10060 /* --------------------------------------------------------------------- */
10061 void XGINew_LCD_Wait_Time(unsigned char DelayTime, struct vb_device_info *pVBInfo)
10062 {
10063 unsigned short i ,
10064 j ;
10065
10066 unsigned long temp ,
10067 flag ;
10068
10069 flag = 0 ;
10070 //printk("XGINew_LCD_Wait_Time");
10071 //return;
10072 for( i = 0 ; i < DelayTime ; i++ )
10073 {
10074 for( j = 0 ; j < 66 ; j++ )
10075 {
10076
10077 temp = XGINew_GetReg3( 0x61 ) ;
10078
10079 //temp &= 0x10000000;
10080 temp &= 0x10;
10081 if ( temp == flag )
10082 continue ;
10083
10084 flag = temp ;
10085 }
10086 }
10087 }
10088
10089
10090
10091
10092 /* --------------------------------------------------------------------- */
10093 /* Function : XGI_BridgeIsOn */
10094 /* Input : */
10095 /* Output : */
10096 /* Description : */
10097 /* --------------------------------------------------------------------- */
10098 unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
10099 {
10100 unsigned short flag ;
10101
10102 if ( pVBInfo->IF_DEF_LVDS == 1 )
10103 {
10104 return( 1 ) ;
10105 }
10106 else
10107 {
10108 flag = XGINew_GetReg1( pVBInfo->Part4Port , 0x00 ) ;
10109 if ( ( flag == 1 ) || ( flag == 2 ) )
10110 return( 1 ) ; /* 301b */
10111 else
10112 return( 0 ) ;
10113 }
10114 }
10115
10116
10117
10118 /* --------------------------------------------------------------------- */
10119 /* Function : XGI_LongWait */
10120 /* Input : */
10121 /* Output : */
10122 /* Description : */
10123 /* --------------------------------------------------------------------- */
10124 void XGI_LongWait(struct vb_device_info *pVBInfo)
10125 {
10126 unsigned short i ;
10127
10128 i = XGINew_GetReg1( pVBInfo->P3c4 , 0x1F ) ;
10129
10130 if ( !( i & 0xC0 ) )
10131 {
10132 for( i = 0 ; i < 0xFFFF ; i++ )
10133 {
10134 if ( !( XGINew_GetReg2( pVBInfo->P3da ) & 0x08 ) )
10135 break ;
10136 }
10137
10138 for( i = 0 ; i < 0xFFFF ; i++ )
10139 {
10140 if ( ( XGINew_GetReg2( pVBInfo->P3da ) & 0x08 ) )
10141 break ;
10142 }
10143 }
10144 }
10145
10146
10147 /* --------------------------------------------------------------------- */
10148 /* Function : XGI_VBLongWait */
10149 /* Input : */
10150 /* Output : */
10151 /* Description : */
10152 /* --------------------------------------------------------------------- */
10153 void XGI_VBLongWait(struct vb_device_info *pVBInfo)
10154 {
10155 unsigned short tempal ,
10156 temp ,
10157 i ,
10158 j ;
10159 return ;
10160 if ( !( pVBInfo->VBInfo & SetCRT2ToTV ) )
10161 {
10162 temp = 0 ;
10163 for( i = 0 ; i < 3 ; i++ )
10164 {
10165 for( j = 0 ; j < 100 ; j++ )
10166 {
10167 tempal = XGINew_GetReg2( pVBInfo->P3da ) ;
10168 if ( temp & 0x01 )
10169 { /* VBWaitMode2 */
10170 if ( ( tempal & 0x08 ) )
10171 {
10172 continue ;
10173 }
10174
10175 if ( !( tempal & 0x08 ) )
10176 {
10177 break ;
10178 }
10179 }
10180 else
10181 { /* VBWaitMode1 */
10182 if ( !( tempal & 0x08 ) )
10183 {
10184 continue ;
10185 }
10186
10187 if ( ( tempal & 0x08 ) )
10188 {
10189 break ;
10190 }
10191 }
10192 }
10193 temp = temp ^ 0x01 ;
10194 }
10195 }
10196 else
10197 {
10198 XGI_LongWait(pVBInfo) ;
10199 }
10200 return ;
10201 }
10202
10203
10204
10205
10206 /* --------------------------------------------------------------------- */
10207 /* Function : XGI_GetVGAHT2 */
10208 /* Input : */
10209 /* Output : */
10210 /* Description : */
10211 /* --------------------------------------------------------------------- */
10212 unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
10213 {
10214 unsigned long tempax ,
10215 tempbx ;
10216
10217 tempbx = ( ( pVBInfo->VGAVT - pVBInfo->VGAVDE ) * pVBInfo->RVBHCMAX ) & 0xFFFF ;
10218 tempax = ( pVBInfo->VT - pVBInfo->VDE ) * pVBInfo->RVBHCFACT ;
10219 tempax = ( tempax * pVBInfo->HT ) /tempbx ;
10220
10221 return( (unsigned short)tempax ) ;
10222 }
10223
10224
10225 /* --------------------------------------------------------------------- */
10226 /* Function : XGI_GetVCLK2Ptr */
10227 /* Input : */
10228 /* Output : */
10229 /* Description : */
10230 /* --------------------------------------------------------------------- */
10231 unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
10232 unsigned short ModeIdIndex,
10233 unsigned short RefreshRateTableIndex,
10234 struct xgi_hw_device_info *HwDeviceExtension,
10235 struct vb_device_info *pVBInfo)
10236 {
10237 unsigned short tempbx ;
10238
10239 unsigned short LCDXlat1VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ;
10240 unsigned short LCDXlat2VCLK[ 4 ] = { VCLK108_2 + 5 , VCLK108_2 + 5 , VCLK108_2 + 5 , VCLK108_2 + 5 } ;
10241 unsigned short LVDSXlat1VCLK[ 4 ] = { VCLK40 , VCLK40 , VCLK40 , VCLK40 } ;
10242 unsigned short LVDSXlat2VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ;
10243 unsigned short LVDSXlat3VCLK[ 4 ] = { VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 , VCLK65 + 2 } ;
10244
10245 unsigned short CRT2Index , VCLKIndex ;
10246 unsigned short modeflag , resinfo ;
10247 unsigned char *CHTVVCLKPtr = NULL ;
10248
10249 if ( ModeNo <= 0x13 )
10250 {
10251 modeflag = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ModeFlag ; /* si+St_ResInfo */
10252 resinfo = pVBInfo->SModeIDTable[ ModeIdIndex ].St_ResInfo ;
10253 CRT2Index = pVBInfo->SModeIDTable[ ModeIdIndex ].St_CRT2CRTC ;
10254 }
10255 else
10256 {
10257 modeflag = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeFlag ; /* si+Ext_ResInfo */
10258 resinfo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_RESINFO ;
10259 CRT2Index = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRT2CRTC ;
10260 }
10261
10262 if ( pVBInfo->IF_DEF_LVDS == 0 )
10263 {
10264 CRT2Index = CRT2Index >> 6 ; /* for LCD */
10265 if ( ( ( pVBInfo->VBInfo & SetCRT2ToLCD ) | SetCRT2ToLCDA ) ) /*301b*/
10266 {
10267 if ( pVBInfo->LCDResInfo != Panel1024x768 )
10268 {
10269 VCLKIndex = LCDXlat2VCLK[ CRT2Index ] ;
10270 }
10271 else
10272 {
10273 VCLKIndex = LCDXlat1VCLK[ CRT2Index ] ;
10274 }
10275 }
10276 else /* for TV */
10277 {
10278 if ( pVBInfo->VBInfo & SetCRT2ToTV )
10279 {
10280 if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV )
10281 {
10282 if ( pVBInfo->SetFlag & RPLLDIV2XO )
10283 {
10284 VCLKIndex = HiTVVCLKDIV2 ;
10285
10286
10287 VCLKIndex += 25 ;
10288
10289 }
10290 else
10291 {
10292 VCLKIndex = HiTVVCLK ;
10293
10294
10295 VCLKIndex += 25 ;
10296
10297 }
10298
10299 if ( pVBInfo->SetFlag & TVSimuMode )
10300 {
10301 if( modeflag & Charx8Dot )
10302 {
10303 VCLKIndex = HiTVSimuVCLK ;
10304
10305
10306 VCLKIndex += 25 ;
10307
10308 }
10309 else
10310 {
10311 VCLKIndex = HiTVTextVCLK ;
10312
10313
10314 VCLKIndex += 25 ;
10315
10316 }
10317 }
10318
10319 if ( pVBInfo->VBType & VB_XGI301LV ) /* 301lv */
10320 {
10321 if ( !( pVBInfo->VBExtInfo == VB_YPbPr1080i ) )
10322 {
10323 VCLKIndex = YPbPr750pVCLK ;
10324 if ( !( pVBInfo->VBExtInfo == VB_YPbPr750p ) )
10325 {
10326 VCLKIndex = YPbPr525pVCLK ;
10327 if ( !( pVBInfo->VBExtInfo == VB_YPbPr525p ) )
10328 {
10329 VCLKIndex = YPbPr525iVCLK_2 ;
10330 if ( !( pVBInfo->SetFlag & RPLLDIV2XO ) )
10331 VCLKIndex = YPbPr525iVCLK ;
10332 }
10333 }
10334 }
10335 }
10336 }
10337 else
10338 {
10339 if ( pVBInfo->VBInfo & SetCRT2ToTV )
10340 {
10341 if ( pVBInfo->SetFlag & RPLLDIV2XO )
10342 {
10343 VCLKIndex = TVVCLKDIV2 ;
10344
10345
10346 VCLKIndex += 25 ;
10347
10348 }
10349 else
10350 {
10351 VCLKIndex = TVVCLK ;
10352
10353
10354 VCLKIndex += 25 ;
10355
10356 }
10357 }
10358 }
10359 }
10360 else
10361 { /* for CRT2 */
10362 VCLKIndex = (unsigned char)XGINew_GetReg2((pVBInfo->P3ca + 0x02)); /* Port 3cch */
10363 VCLKIndex = ( ( VCLKIndex >> 2 ) & 0x03 ) ;
10364 if ( ModeNo > 0x13 )
10365 {
10366 VCLKIndex = pVBInfo->RefIndex[ RefreshRateTableIndex ].Ext_CRTVCLK ; /* di+Ext_CRTVCLK */
10367 VCLKIndex &= IndexMask ;
10368 }
10369 }
10370 }
10371 }
10372 else
10373 { /* LVDS */
10374 if ( ModeNo <= 0x13 )
10375 VCLKIndex = CRT2Index ;
10376 else
10377 VCLKIndex = CRT2Index ;
10378
10379 if ( pVBInfo->IF_DEF_CH7005 == 1 )
10380 {
10381 if ( !( pVBInfo->VBInfo & SetCRT2ToLCD ) )
10382 {
10383 VCLKIndex &= 0x1f ;
10384 tempbx = 0 ;
10385
10386 if ( pVBInfo->VBInfo & SetPALTV )
10387 tempbx += 2 ;
10388
10389 if ( pVBInfo->VBInfo & SetCHTVOverScan )
10390 tempbx += 1 ;
10391
10392 switch( tempbx )
10393 {
10394 case 0:
10395 CHTVVCLKPtr = pVBInfo->CHTVVCLKUNTSC ;
10396 break ;
10397 case 1:
10398 CHTVVCLKPtr = pVBInfo->CHTVVCLKONTSC ;
10399 break;
10400 case 2:
10401 CHTVVCLKPtr = pVBInfo->CHTVVCLKUPAL ;
10402 break ;
10403 case 3:
10404 CHTVVCLKPtr = pVBInfo->CHTVVCLKOPAL ;
10405 break ;
10406 default:
10407 break ;
10408 }
10409
10410 VCLKIndex = CHTVVCLKPtr[ VCLKIndex ] ;
10411 }
10412 }
10413 else
10414 {
10415 VCLKIndex = VCLKIndex >> 6 ;
10416 if ( ( pVBInfo->LCDResInfo == Panel800x600 ) || ( pVBInfo->LCDResInfo == Panel320x480 ) )
10417 VCLKIndex = LVDSXlat1VCLK[ VCLKIndex ] ;
10418 else if ( ( pVBInfo->LCDResInfo == Panel1024x768 ) || ( pVBInfo->LCDResInfo == Panel1024x768x75 ) )
10419 VCLKIndex = LVDSXlat2VCLK[ VCLKIndex ] ;
10420 else
10421 VCLKIndex = LVDSXlat3VCLK[ VCLKIndex ] ;
10422 }
10423 }
10424 /* VCLKIndex = VCLKIndex&IndexMask ; */
10425
10426
10427
10428 return( VCLKIndex ) ;
10429 }
10430