diff options
Diffstat (limited to 'drivers/staging/xgifb/vb_ext.c')
-rw-r--r-- | drivers/staging/xgifb/vb_ext.c | 1370 |
1 files changed, 1370 insertions, 0 deletions
diff --git a/drivers/staging/xgifb/vb_ext.c b/drivers/staging/xgifb/vb_ext.c new file mode 100644 index 00000000000..49b39ee93a8 --- /dev/null +++ b/drivers/staging/xgifb/vb_ext.c | |||
@@ -0,0 +1,1370 @@ | |||
1 | #include "osdef.h" | ||
2 | |||
3 | |||
4 | |||
5 | |||
6 | #ifdef WIN2000 | ||
7 | |||
8 | #include <dderror.h> | ||
9 | #include <devioctl.h> | ||
10 | #include <miniport.h> | ||
11 | #include <ntddvdeo.h> | ||
12 | #include <video.h> | ||
13 | #include "xgiv.h" | ||
14 | #include "dd_i2c.h" | ||
15 | #include "tools.h" | ||
16 | #endif /* WIN2000 */ | ||
17 | |||
18 | #ifdef LINUX_XF86 | ||
19 | #include "xf86.h" | ||
20 | #include "xf86PciInfo.h" | ||
21 | #include "xgi.h" | ||
22 | #include "xgi_regs.h" | ||
23 | #endif | ||
24 | |||
25 | #ifdef LINUX_KERNEL | ||
26 | #include <linux/version.h> | ||
27 | #include <asm/io.h> | ||
28 | #include <linux/types.h> | ||
29 | #include "XGIfb.h" | ||
30 | /*#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) | ||
31 | #include <video/XGIfb.h> | ||
32 | #else | ||
33 | #include <linux/XGIfb.h> | ||
34 | #endif*/ | ||
35 | #endif | ||
36 | |||
37 | |||
38 | |||
39 | #include "vb_def.h" | ||
40 | #include "vgatypes.h" | ||
41 | #include "vb_struct.h" | ||
42 | #include "vb_util.h" | ||
43 | #include "vb_setmode.h" | ||
44 | #include "vb_ext.h" | ||
45 | extern UCHAR XGI330_SoftSetting; | ||
46 | extern UCHAR XGI330_OutputSelect; | ||
47 | extern USHORT XGI330_RGBSenseData2; | ||
48 | extern USHORT XGI330_YCSenseData2; | ||
49 | extern USHORT XGI330_VideoSenseData2; | ||
50 | #ifdef WIN2000 | ||
51 | extern UCHAR SenseCHTV(PHW_DEVICE_EXTENSION pHWDE); /* 2007/05/17 Billy */ | ||
52 | #endif | ||
53 | void XGI_GetSenseStatus( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo ); | ||
54 | BOOLEAN XGINew_GetPanelID(PVB_DEVICE_INFO pVBInfo); | ||
55 | USHORT XGINew_SenseLCD(PXGI_HW_DEVICE_INFO,PVB_DEVICE_INFO pVBInfo); | ||
56 | BOOLEAN XGINew_GetLCDDDCInfo(PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo); | ||
57 | void XGISetDPMS( PXGI_HW_DEVICE_INFO pXGIHWDE , ULONG VESA_POWER_STATE ) ; | ||
58 | BOOLEAN XGINew_BridgeIsEnable(PXGI_HW_DEVICE_INFO,PVB_DEVICE_INFO pVBInfo ); | ||
59 | BOOLEAN XGINew_Sense(USHORT tempbx,USHORT tempcx, PVB_DEVICE_INFO pVBInfo); | ||
60 | BOOLEAN XGINew_SenseHiTV( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo ) ; | ||
61 | |||
62 | /************************************************************** | ||
63 | Dynamic Sense | ||
64 | *************************************************************/ | ||
65 | |||
66 | void XGI_WaitDisplay(void); | ||
67 | BOOLEAN XGI_Is301C(PVB_DEVICE_INFO); | ||
68 | BOOLEAN XGI_Is301LV(PVB_DEVICE_INFO); | ||
69 | |||
70 | #ifdef WIN2000 | ||
71 | UCHAR XGI_SenseLCD(PHW_DEVICE_EXTENSION, PVB_DEVICE_INFO); | ||
72 | UCHAR XGI_GetLCDDDCInfo(PHW_DEVICE_EXTENSION,PVB_DEVICE_INFO); | ||
73 | |||
74 | extern BOOL bGetDdcInfo( | ||
75 | PHW_DEVICE_EXTENSION pHWDE, | ||
76 | ULONG ulWhichOne, | ||
77 | PUCHAR pjQueryBuffer, | ||
78 | ULONG ulBufferSize | ||
79 | ); | ||
80 | |||
81 | #endif | ||
82 | |||
83 | |||
84 | /* --------------------------------------------------------------------- */ | ||
85 | /* Function : XGINew_Is301B */ | ||
86 | /* Input : */ | ||
87 | /* Output : */ | ||
88 | /* Description : */ | ||
89 | /* --------------------------------------------------------------------- */ | ||
90 | BOOLEAN XGINew_Is301B( PVB_DEVICE_INFO pVBInfo ) | ||
91 | { | ||
92 | USHORT flag ; | ||
93 | |||
94 | flag = XGINew_GetReg1( pVBInfo->Part4Port , 0x01 ) ; | ||
95 | |||
96 | if ( flag > 0x0B0 ) | ||
97 | return( 0 ) ; /* 301b */ | ||
98 | else | ||
99 | return( 1 ) ; | ||
100 | } | ||
101 | |||
102 | /* --------------------------------------------------------------------- */ | ||
103 | /* Function : XGI_Is301C */ | ||
104 | /* Input : */ | ||
105 | /* Output : */ | ||
106 | /* Description : */ | ||
107 | /* --------------------------------------------------------------------- */ | ||
108 | BOOLEAN XGI_Is301C( PVB_DEVICE_INFO pVBInfo ) | ||
109 | { | ||
110 | if ( ( XGINew_GetReg1( pVBInfo->Part4Port , 0x01 ) & 0xF0 ) == 0xC0 ) | ||
111 | return( 1 ) ; | ||
112 | |||
113 | if ( XGINew_GetReg1( pVBInfo->Part4Port , 0x01 ) >= 0xD0 ) | ||
114 | { | ||
115 | if ( XGINew_GetReg1( pVBInfo->Part4Port , 0x39 ) == 0xE0 ) | ||
116 | return( 1 ) ; | ||
117 | } | ||
118 | |||
119 | return( 0 ) ; | ||
120 | } | ||
121 | |||
122 | |||
123 | /* --------------------------------------------------------------------- */ | ||
124 | /* Function : XGI_Is301LV */ | ||
125 | /* Input : */ | ||
126 | /* Output : */ | ||
127 | /* Description : */ | ||
128 | /* --------------------------------------------------------------------- */ | ||
129 | BOOLEAN XGI_Is301LV( PVB_DEVICE_INFO pVBInfo ) | ||
130 | { | ||
131 | if ( XGINew_GetReg1( pVBInfo->Part4Port , 0x01 ) >= 0xD0 ) | ||
132 | { | ||
133 | if ( XGINew_GetReg1( pVBInfo->Part4Port , 0x39 ) == 0xFF ) | ||
134 | { | ||
135 | return( 1 ) ; | ||
136 | } | ||
137 | } | ||
138 | return( 0 ) ; | ||
139 | } | ||
140 | |||
141 | |||
142 | /* --------------------------------------------------------------------- */ | ||
143 | /* Function : XGINew_Sense */ | ||
144 | /* Input : */ | ||
145 | /* Output : */ | ||
146 | /* Description : */ | ||
147 | /* --------------------------------------------------------------------- */ | ||
148 | BOOLEAN XGINew_Sense( USHORT tempbx , USHORT tempcx, PVB_DEVICE_INFO pVBInfo ) | ||
149 | { | ||
150 | USHORT temp , i , tempch ; | ||
151 | |||
152 | temp = tempbx & 0xFF ; | ||
153 | XGINew_SetReg1( pVBInfo->Part4Port , 0x11 , temp ) ; | ||
154 | temp = ( tempbx & 0xFF00 ) >> 8 ; | ||
155 | temp |= ( tempcx & 0x00FF ) ; | ||
156 | XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x10 , ~0x1F , temp ) ; | ||
157 | |||
158 | for( i = 0 ; i < 10 ; i++ ) | ||
159 | XGI_LongWait( pVBInfo) ; | ||
160 | |||
161 | tempch = ( tempcx & 0x7F00 ) >> 8 ; | ||
162 | temp = XGINew_GetReg1( pVBInfo->Part4Port , 0x03 ) ; | ||
163 | temp = temp ^ ( 0x0E ) ; | ||
164 | temp &= tempch ; | ||
165 | |||
166 | if ( temp > 0 ) | ||
167 | return( 1 ) ; | ||
168 | else | ||
169 | return( 0 ) ; | ||
170 | } | ||
171 | |||
172 | #ifdef WIN2000 | ||
173 | /* --------------------------------------------------------------------- */ | ||
174 | /* Function : XGI_SenseLCD */ | ||
175 | /* Input : */ | ||
176 | /* Output : */ | ||
177 | /* Description : */ | ||
178 | /* --------------------------------------------------------------------- */ | ||
179 | UCHAR XGI_SenseLCD( PHW_DEVICE_EXTENSION pHWDE, PVB_DEVICE_INFO pVBInfo) | ||
180 | { | ||
181 | USHORT tempax , tempbx , tempcx ; | ||
182 | UCHAR SoftSetting = XGI330_SoftSetting ; | ||
183 | |||
184 | if ( pVBInfo->VBType & ( VB_XGI301LV | VB_XGI302LV ) ) | ||
185 | return( 1 ) ; | ||
186 | |||
187 | |||
188 | if ( SoftSetting & HotPlugFunction ) /* Hot Plug Detection */ | ||
189 | { | ||
190 | XGINew_SetRegAND( pVBInfo->Part4Port , 0x0F , 0x3F ) ; | ||
191 | tempbx = 0 ; | ||
192 | tempcx = 0x9010 ; | ||
193 | if ( XGINew_Sense( tempbx , tempcx, pVBInfo ) ) | ||
194 | return( 1 ) ; | ||
195 | |||
196 | return( 0 ) ; | ||
197 | } | ||
198 | else /* Get LCD Info from EDID */ | ||
199 | return(XGI_GetLCDDDCInfo(pHWDE, pVBInfo)); | ||
200 | } | ||
201 | |||
202 | |||
203 | /* --------------------------------------------------------------------- */ | ||
204 | /* Function : XGI_GetLCDDDCInfo */ | ||
205 | /* Input : */ | ||
206 | /* Output : */ | ||
207 | /* Description : */ | ||
208 | /* --------------------------------------------------------------------- */ | ||
209 | UCHAR XGI_GetLCDDDCInfo( PHW_DEVICE_EXTENSION pHWDE , PVB_DEVICE_INFO pVBInfo) | ||
210 | { | ||
211 | UCHAR tempah , tempbl , tempbh ; | ||
212 | USHORT tempbx , temp ; | ||
213 | UCHAR pjEDIDBuf[ 256 ] ; | ||
214 | ULONG ulBufferSize = 256 ; | ||
215 | UCHAR bMASK_OUTPUTSTATE_CRT2LCD = 2 ; /* 0423 shampoo */ | ||
216 | |||
217 | bGetDdcInfo( pHWDE , MASK_OUTPUTSTATE_CRT2LCD , pjEDIDBuf , ulBufferSize ) ; | ||
218 | if ( ( *( ( PULONG )pjEDIDBuf ) == 0xFFFFFF00 ) && ( *( ( PULONG )( pjEDIDBuf + 4 ) ) == 0x00FFFFFF ) ) | ||
219 | { | ||
220 | tempah = Panel1024x768 ; | ||
221 | tempbl=( *( pjEDIDBuf + 0x3A ) ) & 0xf0 ; | ||
222 | |||
223 | if ( tempbl != 0x40 ) | ||
224 | { | ||
225 | tempah = Panel1600x1200 ; | ||
226 | if ( tempbl != 0x60 ) | ||
227 | { | ||
228 | tempah = Panel1280x1024 ; | ||
229 | tempbh = ( *( pjEDIDBuf + 0x3B ) ) ; | ||
230 | if ( tempbh != 0x00 ) | ||
231 | { | ||
232 | tempah = Panel1280x960 ; | ||
233 | if ( tempbh != 0x0C0 ) | ||
234 | { | ||
235 | tempbx = ( ( *( pjEDIDBuf + 0x24 ) ) << 8 ) | ( *( pjEDIDBuf + 0x23 ) ) ; | ||
236 | tempah = Panel1280x1024 ; | ||
237 | if ( !( tempbx & 0x0100 ) ) | ||
238 | { | ||
239 | tempah = Panel1024x768 ; | ||
240 | if ( !( tempbx & 0x0E00 ) ) | ||
241 | { | ||
242 | tempah = Panel1280x1024 ; | ||
243 | } | ||
244 | } | ||
245 | } | ||
246 | |||
247 | if ( tempbx & 0x00FF ) | ||
248 | { | ||
249 | temp = ScalingLCD ; | ||
250 | XGINew_SetRegOR( pVBInfo->P3d4 , 0x37 , temp ) ; | ||
251 | } | ||
252 | } | ||
253 | } | ||
254 | } | ||
255 | XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x36 , ( ~0x07 ) , tempah ) ; | ||
256 | tempah = ( ( *( pjEDIDBuf + 0x47 ) ) & 0x06 ) ; /* Polarity */ | ||
257 | tempah = ( tempah ^ 0x06 ) << 4 ; | ||
258 | tempah |= LCDSync ; | ||
259 | XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x37 , ( ~LCDSyncBit ) , tempah ) ; | ||
260 | tempbh= XGINew_GetReg1( pVBInfo->P3d4 , 0x36 ) ; | ||
261 | tempbh &= 0x07 ; | ||
262 | if ( tempbh == Panel1280x960 ) | ||
263 | XGINew_SetRegAND( pVBInfo->P3d4 , 0x37 , 0x0E ) ; | ||
264 | } | ||
265 | else if ( *pjEDIDBuf == 0x20 ) | ||
266 | { | ||
267 | tempah = Panel1024x768 ; | ||
268 | XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x36 , ( ~0x07 ) , tempah ) ; | ||
269 | } | ||
270 | else | ||
271 | { | ||
272 | return( 0 ) ; | ||
273 | } | ||
274 | |||
275 | return( 1 ) ; | ||
276 | } | ||
277 | |||
278 | |||
279 | /* --------------------------------------------------------------------- */ | ||
280 | /* Function : XGI_DySense */ | ||
281 | /* Input : */ | ||
282 | /* Output : */ | ||
283 | /* Description : */ | ||
284 | /* --------------------------------------------------------------------- */ | ||
285 | BOOLEAN XGI_DySense( PHW_DEVICE_EXTENSION pHWDE , PUCHAR ujConnectStatus) | ||
286 | { | ||
287 | UCHAR pre_CRD,pre_SR1E , pre_Part2_0 , pre_Part4_D ; | ||
288 | USHORT tempax , tempbx , tempcx , pushax , temp ; | ||
289 | VB_DEVICE_INFO VBINF; | ||
290 | PVB_DEVICE_INFO pVBInfo = &VBINF; | ||
291 | UCHAR OutputSelect = XGI330_OutputSelect ; | ||
292 | PXGI_HW_DEVICE_INFO HwDeviceExtension= pHWDE->pXGIHWDE ; | ||
293 | UCHAR bConnectStatus = 0 ; | ||
294 | pVBInfo->BaseAddr = HwDeviceExtension->pjIOAddress ; | ||
295 | pVBInfo->ROMAddr = pHWDE->pjVirtualRomBase ; | ||
296 | |||
297 | pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12 ; | ||
298 | pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14 ; | ||
299 | pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24 ; | ||
300 | pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10 ; | ||
301 | pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 ; | ||
302 | pushax = XGINew_GetReg1( pVBInfo->P3d4 , 0x17 ) ; /* 0512 Fix Dysense hanged */ | ||
303 | temp = ( pushax & 0x00FF ) | 0x80 ; | ||
304 | XGINew_SetRegOR( pVBInfo->P3d4 , 0x17 , temp ) ; | ||
305 | XGINew_SetReg1( pVBInfo->P3c4 , 0x05 , 0x86 ) ; | ||
306 | /* beginning of dynamic sense CRT1 */ | ||
307 | |||
308 | pVBInfo->IF_DEF_CH7007 = 0; | ||
309 | if (pHWDE->bCH7007) | ||
310 | { | ||
311 | InitTo330Pointer( pHWDE->pXGIHWDE->jChipType, pVBInfo ) ; | ||
312 | HwDeviceExtension->pDevice = (PVOID)pHWDE; | ||
313 | pVBInfo->IF_DEF_CH7007 = 1; | ||
314 | /* [Billy] 2007/05/14 For CH7007 */ | ||
315 | if ( pVBInfo->IF_DEF_CH7007 == 1 ) | ||
316 | { | ||
317 | bConnectStatus = SenseCHTV(HwDeviceExtension->pDevice) ; /* 07/05/28 */ | ||
318 | XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x32 , ~0x03 , (UCHAR)bConnectStatus ) ; | ||
319 | } | ||
320 | } | ||
321 | if(( pHWDE->jChipID >= XG40 ) || ( pHWDE->jChipID >= XG20 )) | ||
322 | { | ||
323 | |||
324 | if ( pHWDE->jChipID >= XG40 ) | ||
325 | XGINew_SetReg1( pVBInfo->P3d4 , 0x57 , 0x4A ) ; /* write sense pattern 30->4a */ | ||
326 | else | ||
327 | XGINew_SetReg1( pVBInfo->P3d4 , 0x57 , 0x5F ) ; /* write sense pattern */ | ||
328 | |||
329 | XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x53 , 0xFF , 0x02 ) ; /* enable sense DAC */ | ||
330 | XGI_WaitDisply(pVBInfo) ; | ||
331 | |||
332 | if(XGINew_GetReg2( pVBInfo->P3c2 ) & 0x10 ) | ||
333 | bConnectStatus |= Monitor1Sense ; | ||
334 | |||
335 | XGINew_SetRegAND( pVBInfo->P3d4 , 0x53 , 0xFD ) ; /* disable sense DAC */ | ||
336 | XGINew_SetRegAND( pVBInfo->P3d4 , 0x57 , 0x00 ) ; /* clear sense pattern */ | ||
337 | |||
338 | |||
339 | /* ---------- End of dynamic sense CRT1 ----------- */ | ||
340 | |||
341 | /* ---------- beginning of dynamic sense VB ------------ */ | ||
342 | pre_SR1E = XGINew_GetReg1( pVBInfo->P3c4 , 0x1E ) ; | ||
343 | XGINew_SetRegOR( pVBInfo->P3c4 , 0x1E , 0x20 ) ; /* Enable CRT2,work-a-round for 301B/301LV/302LV */ | ||
344 | pre_Part2_0 = XGINew_GetReg1( pVBInfo->Part2Port , 0x00 ) ; | ||
345 | pre_Part4_D = XGINew_GetReg1( pVBInfo->Part4Port , 0x0D ) ; | ||
346 | |||
347 | if ( XGI_Is301C( pVBInfo ) ) /* 301C only */ | ||
348 | XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x0D , ~0x07 , 0x01 ) ; /* Set Part4 0x0D D[2:0] to 001b */ | ||
349 | |||
350 | /* tempax = 0 ; */ | ||
351 | if ( !XGI_Is301LV( pVBInfo ) ) | ||
352 | { | ||
353 | tempbx = XGI330_RGBSenseData2 ; | ||
354 | tempcx = 0x0E08 ; | ||
355 | if(XGINew_Sense( tempbx , tempcx, pVBInfo ) ) | ||
356 | { | ||
357 | bConnectStatus |= Monitor2Sense ; | ||
358 | if ( OutputSelect & SetSCARTOutput ) | ||
359 | { | ||
360 | bConnectStatus ^= ( Monitor2Sense | SCARTSense ) ; | ||
361 | } | ||
362 | } | ||
363 | } | ||
364 | if ( XGI_Is301C( pVBInfo ) ) /* 301C only */ | ||
365 | XGINew_SetRegOR( pVBInfo->Part4Port , 0x0D , 0x04 ) ; /* Set Part4 0x0D D[2]=1 for dynamic sense */ | ||
366 | |||
367 | if ( ( XGINew_Is301B( pVBInfo ) ) ) | ||
368 | XGINew_SetRegOR( pVBInfo->Part2Port , 0x00 , 0x0C ) ; /* ????????? */ | ||
369 | |||
370 | if ( XGINew_SenseHiTV( HwDeviceExtension , pVBInfo) ) /* add by kuku for Dysense HiTV //start */ | ||
371 | { | ||
372 | bConnectStatus|= YPbPrSense ; | ||
373 | } | ||
374 | else | ||
375 | { | ||
376 | tempbx = XGI330_YCSenseData2 ; /* Y/C Sense Data Ptr */ | ||
377 | tempcx = 0x0604 ; | ||
378 | if ( XGINew_Sense( tempbx , tempcx , pVBInfo) ) | ||
379 | bConnectStatus |= SVIDEOSense ; | ||
380 | |||
381 | if ( OutputSelect & BoardTVType ) | ||
382 | { | ||
383 | tempbx = XGI330_VideoSenseData2 ; | ||
384 | tempcx = 0x0804 ; | ||
385 | if ( XGINew_Sense(tempbx , tempcx, pVBInfo) ) | ||
386 | bConnectStatus|= AVIDEOSense ; | ||
387 | } | ||
388 | else | ||
389 | { | ||
390 | if ( !( bConnectStatus & SVIDEOSense ) ) | ||
391 | { | ||
392 | tempbx = XGI330_VideoSenseData2 ; | ||
393 | tempcx = 0x0804 ; | ||
394 | if ( XGINew_Sense( tempbx , tempcx, pVBInfo ) ) | ||
395 | bConnectStatus |= AVIDEOSense ; | ||
396 | } | ||
397 | } | ||
398 | } /* end */ | ||
399 | /* DySenseVBCnt */ | ||
400 | |||
401 | tempbx = 0 ; | ||
402 | tempcx = 0 ; | ||
403 | XGINew_Sense(tempbx , tempcx, pVBInfo ) ; | ||
404 | |||
405 | if ( !( bConnectStatus & Monitor2Sense ) ) | ||
406 | { | ||
407 | if ( XGI_SenseLCD( pHWDE , pVBInfo ) ) | ||
408 | bConnectStatus |= LCDSense ; | ||
409 | } | ||
410 | |||
411 | XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x32 , ~( AVIDEOSense | SVIDEOSense | LCDSense | Monitor2Sense | Monitor1Sense ) , bConnectStatus ) ; | ||
412 | |||
413 | XGINew_SetReg1( pVBInfo->Part4Port , 0x0D , pre_Part4_D ) ; | ||
414 | XGINew_SetReg1( pVBInfo->Part2Port , 0x00 , pre_Part2_0 ) ; | ||
415 | XGINew_SetReg1( pVBInfo->P3c4 , 0x1E , pre_SR1E ) ; | ||
416 | |||
417 | if ( XGI_Is301C( pVBInfo ) ) /* 301C only */ | ||
418 | { | ||
419 | tempax = XGINew_GetReg1( pVBInfo->Part2Port , 0x00 ) ; | ||
420 | if ( tempax & 0x20 ) | ||
421 | { | ||
422 | /* Reset VBPro */ | ||
423 | for( tempcx = 2 ; tempcx > 0 ; tempcx-- ) | ||
424 | { | ||
425 | tempax ^= 0x20 ; | ||
426 | XGINew_SetReg1( pVBInfo->Part2Port , 0x00 , tempax ) ; | ||
427 | } | ||
428 | } | ||
429 | } | ||
430 | /* End of dynamic sense VB */ | ||
431 | } | ||
432 | else | ||
433 | { | ||
434 | XGI_SenseCRT1(pVBInfo) ; | ||
435 | XGI_GetSenseStatus( HwDeviceExtension, pVBInfo ) ; /* sense CRT2 */ | ||
436 | bConnectStatus = XGINew_GetReg1( pVBInfo->P3d4 , 0x32 ) ; | ||
437 | } | ||
438 | temp = pushax & 0x00FF ; /* 0512 Fix Dysense hanged */ | ||
439 | XGINew_SetReg1( pVBInfo->P3d4 , 0x17 , temp ) ; | ||
440 | if ( bConnectStatus ) | ||
441 | { | ||
442 | *ujConnectStatus = bConnectStatus ; | ||
443 | return( 1 ) ; | ||
444 | } | ||
445 | else | ||
446 | return( 0 ) ; | ||
447 | } | ||
448 | |||
449 | #endif /* WIN2000 */ | ||
450 | |||
451 | /* --------------------------------------------------------------------- */ | ||
452 | /* Function : XGISetDPMS */ | ||
453 | /* Input : */ | ||
454 | /* Output : */ | ||
455 | /* Description : */ | ||
456 | /* --------------------------------------------------------------------- */ | ||
457 | VOID XGISetDPMS( PXGI_HW_DEVICE_INFO pXGIHWDE , ULONG VESA_POWER_STATE ) | ||
458 | { | ||
459 | USHORT ModeNo, ModeIdIndex ; | ||
460 | UCHAR temp ; | ||
461 | VB_DEVICE_INFO VBINF; | ||
462 | PVB_DEVICE_INFO pVBInfo = &VBINF; | ||
463 | pVBInfo->BaseAddr = (ULONG)pXGIHWDE->pjIOAddress ; | ||
464 | pVBInfo->ROMAddr = pXGIHWDE->pjVirtualRomBase ; | ||
465 | |||
466 | |||
467 | pVBInfo->IF_DEF_LVDS = 0 ; | ||
468 | pVBInfo->IF_DEF_CH7005 = 0 ; | ||
469 | pVBInfo->IF_DEF_HiVision = 1 ; | ||
470 | pVBInfo->IF_DEF_LCDA = 1 ; | ||
471 | pVBInfo->IF_DEF_CH7017 = 0 ; | ||
472 | pVBInfo->IF_DEF_YPbPr = 1 ; | ||
473 | pVBInfo->IF_DEF_CRT2Monitor = 0 ; | ||
474 | pVBInfo->IF_DEF_VideoCapture = 0 ; | ||
475 | pVBInfo->IF_DEF_ScaleLCD = 0 ; | ||
476 | pVBInfo->IF_DEF_OEMUtil = 0 ; | ||
477 | pVBInfo->IF_DEF_PWD = 0 ; | ||
478 | |||
479 | InitTo330Pointer( pXGIHWDE->jChipType, pVBInfo ) ; | ||
480 | ReadVBIOSTablData( pXGIHWDE->jChipType , pVBInfo) ; | ||
481 | |||
482 | pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14 ; | ||
483 | pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24 ; | ||
484 | pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10 ; | ||
485 | pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e ; | ||
486 | pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12 ; | ||
487 | pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a ; | ||
488 | pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16 ; | ||
489 | pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17 ; | ||
490 | pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18 ; | ||
491 | pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19 ; | ||
492 | pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A ; | ||
493 | pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00 ; | ||
494 | pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04 ; | ||
495 | pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10 ; | ||
496 | pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12 ; | ||
497 | pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 ; | ||
498 | pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2 ; | ||
499 | |||
500 | if ( pXGIHWDE->jChipType == XG27 ) | ||
501 | { | ||
502 | if ( ( XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) & 0xE0 ) == 0xC0 ) | ||
503 | { | ||
504 | if ( XGINew_GetReg1( pVBInfo->P3d4 , 0x30 ) & 0x20 ) | ||
505 | { | ||
506 | pVBInfo->IF_DEF_LVDS = 1 ; | ||
507 | } | ||
508 | } | ||
509 | } | ||
510 | |||
511 | if ( pVBInfo->IF_DEF_CH7007 == 0 ) | ||
512 | { | ||
513 | XGINew_SetModeScratch ( pXGIHWDE , pVBInfo ) ; | ||
514 | } | ||
515 | XGINew_SetReg1( pVBInfo->P3c4 , 0x05 , 0x86 ) ; /* 1.Openkey */ | ||
516 | XGI_UnLockCRT2( pXGIHWDE , pVBInfo) ; | ||
517 | ModeNo = XGINew_GetReg1( pVBInfo->P3d4 , 0x34 ) ; | ||
518 | XGI_SearchModeID( ModeNo , &ModeIdIndex, pVBInfo ) ; | ||
519 | XGI_GetVGAType( pXGIHWDE , pVBInfo ) ; | ||
520 | |||
521 | if ( ( pXGIHWDE->ujVBChipID == VB_CHIP_301 ) || ( pXGIHWDE->ujVBChipID == VB_CHIP_302 ) || ( pVBInfo->IF_DEF_CH7007 == 1 )) | ||
522 | { | ||
523 | XGI_GetVBType( pVBInfo ) ; | ||
524 | XGI_GetVBInfo( ModeNo , ModeIdIndex , pXGIHWDE, pVBInfo ) ; | ||
525 | XGI_GetTVInfo( ModeNo , ModeIdIndex, pVBInfo ) ; | ||
526 | XGI_GetLCDInfo( ModeNo , ModeIdIndex, pVBInfo ) ; | ||
527 | } | ||
528 | |||
529 | if ( VESA_POWER_STATE == 0x00000400 ) | ||
530 | XGINew_SetReg1( pVBInfo->Part4Port , 0x31 , ( UCHAR )( XGINew_GetReg1( pVBInfo->Part4Port , 0x31 ) & 0xFE ) ) ; | ||
531 | else | ||
532 | XGINew_SetReg1( pVBInfo->Part4Port , 0x31 , ( UCHAR )( XGINew_GetReg1( pVBInfo->Part4Port , 0x31 ) | 0x01 ) ) ; | ||
533 | |||
534 | temp = ( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x1f ) ; | ||
535 | temp &= 0x3f ; | ||
536 | switch ( VESA_POWER_STATE ) | ||
537 | { | ||
538 | case 0x00000000: /* on */ | ||
539 | if ( ( pXGIHWDE->ujVBChipID == VB_CHIP_301 ) || ( pXGIHWDE->ujVBChipID == VB_CHIP_302 ) ) | ||
540 | { | ||
541 | XGINew_SetReg1( pVBInfo->P3c4 , 0x1f , ( UCHAR )( temp | 0x00 ) ) ; | ||
542 | XGI_EnableBridge( pXGIHWDE, pVBInfo ) ; | ||
543 | } | ||
544 | else | ||
545 | { | ||
546 | if ( pXGIHWDE->jChipType == XG21 ) | ||
547 | { | ||
548 | if ( pVBInfo->IF_DEF_LVDS == 1 ) | ||
549 | { | ||
550 | XGI_XG21BLSignalVDD( 0x01 , 0x01, pVBInfo ) ; /* LVDS VDD on */ | ||
551 | XGI_XG21SetPanelDelay( 2,pVBInfo ) ; | ||
552 | } | ||
553 | } | ||
554 | if ( pXGIHWDE->jChipType == XG27 ) | ||
555 | { | ||
556 | if ( pVBInfo->IF_DEF_LVDS == 1 ) | ||
557 | { | ||
558 | XGI_XG27BLSignalVDD( 0x01 , 0x01, pVBInfo ) ; /* LVDS VDD on */ | ||
559 | XGI_XG21SetPanelDelay( 2,pVBInfo ) ; | ||
560 | } | ||
561 | } | ||
562 | XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x1F , ~0xC0 , 0x00 ) ; | ||
563 | XGINew_SetRegAND( pVBInfo->P3c4 , 0x01 , ~0x20 ) ; /* CRT on */ | ||
564 | |||
565 | if ( pXGIHWDE->jChipType == XG21 ) | ||
566 | { | ||
567 | temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ; | ||
568 | if ( temp & 0xE0 ) | ||
569 | { | ||
570 | XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x09 , ~0x80 , 0x80 ) ; /* DVO ON */ | ||
571 | XGI_SetXG21FPBits( pVBInfo ); | ||
572 | XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x20 ) ; /* Enable write GPIOF */ | ||
573 | /*XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x48 , ~0x20 , 0x20 ) ;*/ /* LCD Display ON */ | ||
574 | } | ||
575 | XGI_XG21BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* LVDS signal on */ | ||
576 | XGI_DisplayOn( pXGIHWDE, pVBInfo ); | ||
577 | } | ||
578 | if ( pXGIHWDE->jChipType == XG27 ) | ||
579 | { | ||
580 | temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ; | ||
581 | if ( temp & 0xE0 ) | ||
582 | { | ||
583 | XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x09 , ~0x80 , 0x80 ) ; /* DVO ON */ | ||
584 | XGI_SetXG27FPBits( pVBInfo ); | ||
585 | XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x20 ) ; /* Enable write GPIOF */ | ||
586 | /*XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x48 , ~0x20 , 0x20 ) ;*/ /* LCD Display ON */ | ||
587 | } | ||
588 | XGI_XG27BLSignalVDD( 0x20 , 0x20, pVBInfo ) ; /* LVDS signal on */ | ||
589 | XGI_DisplayOn( pXGIHWDE, pVBInfo ); | ||
590 | } | ||
591 | } | ||
592 | break ; | ||
593 | case 0x00000100: /* standby */ | ||
594 | if ( pXGIHWDE->jChipType >= XG21 ) | ||
595 | { | ||
596 | XGI_DisplayOff( pXGIHWDE, pVBInfo ); | ||
597 | } | ||
598 | |||
599 | XGINew_SetReg1( pVBInfo->P3c4 , 0x1f , ( UCHAR )( temp | 0x40 ) ) ; | ||
600 | break ; | ||
601 | case 0x00000200: /* suspend */ | ||
602 | if ( pXGIHWDE->jChipType == XG21 ) | ||
603 | { | ||
604 | XGI_DisplayOff( pXGIHWDE, pVBInfo ); | ||
605 | XGI_XG21BLSignalVDD( 0x20 , 0x00, pVBInfo ) ; /* LVDS signal off */ | ||
606 | } | ||
607 | if ( pXGIHWDE->jChipType == XG27 ) | ||
608 | { | ||
609 | XGI_DisplayOff( pXGIHWDE, pVBInfo ); | ||
610 | XGI_XG27BLSignalVDD( 0x20 , 0x00, pVBInfo ) ; /* LVDS signal off */ | ||
611 | } | ||
612 | XGINew_SetReg1( pVBInfo->P3c4 , 0x1f , ( UCHAR )( temp | 0x80 ) ) ; | ||
613 | break ; | ||
614 | case 0x00000400: /* off */ | ||
615 | if ( (pXGIHWDE->ujVBChipID == VB_CHIP_301 ) || ( pXGIHWDE->ujVBChipID == VB_CHIP_302 ) ) | ||
616 | { | ||
617 | XGINew_SetReg1( pVBInfo->P3c4 , 0x1f , ( UCHAR )( temp | 0xc0 ) ) ; | ||
618 | XGI_DisableBridge( pXGIHWDE, pVBInfo ) ; | ||
619 | } | ||
620 | else | ||
621 | { | ||
622 | if ( pXGIHWDE->jChipType == XG21 ) | ||
623 | { | ||
624 | XGI_DisplayOff( pXGIHWDE, pVBInfo ); | ||
625 | |||
626 | XGI_XG21BLSignalVDD( 0x20 , 0x00, pVBInfo ) ; /* LVDS signal off */ | ||
627 | |||
628 | temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ; | ||
629 | if ( temp & 0xE0 ) | ||
630 | { | ||
631 | XGINew_SetRegAND( pVBInfo->P3c4 , 0x09 , ~0x80 ) ; /* DVO Off */ | ||
632 | XGINew_SetRegAND( pVBInfo->P3d4 , 0x4A , ~0x20 ) ; /* Enable write GPIOF */ | ||
633 | /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x48 , ~0x20 ) ;*/ /* LCD Display OFF */ | ||
634 | } | ||
635 | } | ||
636 | if ( pXGIHWDE->jChipType == XG27 ) | ||
637 | { | ||
638 | XGI_DisplayOff( pXGIHWDE, pVBInfo ); | ||
639 | |||
640 | XGI_XG27BLSignalVDD( 0x20 , 0x00, pVBInfo ) ; /* LVDS signal off */ | ||
641 | |||
642 | temp = XGINew_GetReg1( pVBInfo->P3d4 , 0x38 ) ; | ||
643 | if ( temp & 0xE0 ) | ||
644 | { | ||
645 | XGINew_SetRegAND( pVBInfo->P3c4 , 0x09 , ~0x80 ) ; /* DVO Off */ | ||
646 | } | ||
647 | } | ||
648 | XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x1F , ~0xC0 , 0xC0 ) ; | ||
649 | XGINew_SetRegOR( pVBInfo->P3c4 , 0x01 , 0x20 ) ; /* CRT Off */ | ||
650 | |||
651 | if ( ( pXGIHWDE->jChipType == XG21 ) && ( pVBInfo->IF_DEF_LVDS == 1 ) ) | ||
652 | { | ||
653 | XGI_XG21SetPanelDelay( 4,pVBInfo ) ; | ||
654 | XGI_XG21BLSignalVDD( 0x01 , 0x00, pVBInfo ) ; /* LVDS VDD off */ | ||
655 | XGI_XG21SetPanelDelay( 5,pVBInfo ) ; | ||
656 | } | ||
657 | if ( ( pXGIHWDE->jChipType == XG27 ) && ( pVBInfo->IF_DEF_LVDS == 1 ) ) | ||
658 | { | ||
659 | XGI_XG21SetPanelDelay( 4,pVBInfo ) ; | ||
660 | XGI_XG27BLSignalVDD( 0x01 , 0x00, pVBInfo ) ; /* LVDS VDD off */ | ||
661 | XGI_XG21SetPanelDelay( 5,pVBInfo ) ; | ||
662 | } | ||
663 | } | ||
664 | break ; | ||
665 | |||
666 | default: | ||
667 | break ; | ||
668 | } | ||
669 | XGI_LockCRT2( pXGIHWDE , pVBInfo ) ; | ||
670 | } | ||
671 | |||
672 | |||
673 | |||
674 | /* --------------------------------------------------------------------- */ | ||
675 | /* Function : XGI_GetSenseStatus */ | ||
676 | /* Input : */ | ||
677 | /* Output : */ | ||
678 | /* Description : */ | ||
679 | /* --------------------------------------------------------------------- */ | ||
680 | void XGI_GetSenseStatus( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo) | ||
681 | { | ||
682 | USHORT tempax = 0 , tempbx , tempcx , temp , | ||
683 | P2reg0 = 0 , SenseModeNo = 0 , OutputSelect = *pVBInfo->pOutputSelect , | ||
684 | ModeIdIndex , i ; | ||
685 | pVBInfo->BaseAddr = (ULONG)HwDeviceExtension->pjIOAddress ; | ||
686 | |||
687 | if ( pVBInfo->IF_DEF_LVDS == 1 ) | ||
688 | { | ||
689 | tempax = XGINew_GetReg1( pVBInfo->P3c4 , 0x1A ) ; /* ynlai 02/27/2002 */ | ||
690 | tempbx = XGINew_GetReg1( pVBInfo->P3c4 , 0x1B ) ; | ||
691 | tempax = ( ( tempax & 0xFE ) >> 1 ) | ( tempbx << 8 ) ; | ||
692 | if ( tempax == 0x00 ) | ||
693 | { /* Get Panel id from DDC */ | ||
694 | temp = XGINew_GetLCDDDCInfo( HwDeviceExtension, pVBInfo ) ; | ||
695 | if ( temp == 1 ) | ||
696 | { /* LCD connect */ | ||
697 | XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x39 , 0xFF , 0x01 ) ; /* set CR39 bit0="1" */ | ||
698 | XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x37 , 0xEF , 0x00 ) ; /* clean CR37 bit4="0" */ | ||
699 | temp = LCDSense ; | ||
700 | } | ||
701 | else | ||
702 | { /* LCD don't connect */ | ||
703 | temp = 0 ; | ||
704 | } | ||
705 | } | ||
706 | else | ||
707 | { | ||
708 | XGINew_GetPanelID(pVBInfo) ; | ||
709 | temp = LCDSense ; | ||
710 | } | ||
711 | |||
712 | tempbx = ~( LCDSense | AVIDEOSense | SVIDEOSense ) ; | ||
713 | XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x32 , tempbx , temp ) ; | ||
714 | } | ||
715 | else | ||
716 | { /* for 301 */ | ||
717 | if ( pVBInfo->VBInfo & SetCRT2ToHiVisionTV ) | ||
718 | { /* for HiVision */ | ||
719 | tempax = XGINew_GetReg1( pVBInfo->P3c4 , 0x38 ) ; | ||
720 | temp = tempax & 0x01 ; | ||
721 | tempax = XGINew_GetReg1( pVBInfo->P3c4 , 0x3A ) ; | ||
722 | temp = temp | ( tempax & 0x02 ) ; | ||
723 | XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x32 , 0xA0 , temp ) ; | ||
724 | } | ||
725 | else | ||
726 | { | ||
727 | if ( XGI_BridgeIsOn( pVBInfo ) ) | ||
728 | { | ||
729 | P2reg0 = XGINew_GetReg1( pVBInfo->Part2Port , 0x00 ) ; | ||
730 | if ( !XGINew_BridgeIsEnable( HwDeviceExtension, pVBInfo ) ) | ||
731 | { | ||
732 | SenseModeNo = 0x2e ; | ||
733 | /* XGINew_SetReg1( pVBInfo->P3d4 , 0x30 , 0x41 ) ; */ | ||
734 | /* XGISetModeNew( HwDeviceExtension , 0x2e ) ; // ynlai InitMode */ | ||
735 | |||
736 | temp = XGI_SearchModeID( SenseModeNo , &ModeIdIndex, pVBInfo ) ; | ||
737 | XGI_GetVGAType( HwDeviceExtension , pVBInfo) ; | ||
738 | XGI_GetVBType( pVBInfo ) ; | ||
739 | pVBInfo->SetFlag = 0x00 ; | ||
740 | pVBInfo->ModeType = ModeVGA ; | ||
741 | pVBInfo->VBInfo = SetCRT2ToRAMDAC | LoadDACFlag | SetInSlaveMode ; | ||
742 | XGI_GetLCDInfo( 0x2e , ModeIdIndex, pVBInfo ) ; | ||
743 | XGI_GetTVInfo( 0x2e , ModeIdIndex, pVBInfo ) ; | ||
744 | XGI_EnableBridge( HwDeviceExtension, pVBInfo ) ; | ||
745 | XGI_SetCRT2Group301( SenseModeNo , HwDeviceExtension, pVBInfo ) ; | ||
746 | XGI_SetCRT2ModeRegs( 0x2e , HwDeviceExtension, pVBInfo ) ; | ||
747 | /* XGI_DisableBridge( HwDeviceExtension, pVBInfo ) ; */ | ||
748 | XGINew_SetRegANDOR( pVBInfo->P3c4 , 0x01 , 0xDF , 0x20 ) ; /* Display Off 0212 */ | ||
749 | for( i = 0 ; i < 20 ; i++ ) | ||
750 | { | ||
751 | XGI_LongWait(pVBInfo) ; | ||
752 | } | ||
753 | } | ||
754 | XGINew_SetReg1( pVBInfo->Part2Port , 0x00 , 0x1c ) ; | ||
755 | tempax = 0 ; | ||
756 | tempbx = *pVBInfo->pRGBSenseData ; | ||
757 | |||
758 | if ( !( XGINew_Is301B( pVBInfo ) ) ) | ||
759 | { | ||
760 | tempbx = *pVBInfo->pRGBSenseData2 ; | ||
761 | } | ||
762 | |||
763 | tempcx = 0x0E08 ; | ||
764 | if ( XGINew_Sense(tempbx , tempcx, pVBInfo ) ) | ||
765 | { | ||
766 | if ( XGINew_Sense(tempbx , tempcx, pVBInfo ) ) | ||
767 | { | ||
768 | tempax |= Monitor2Sense ; | ||
769 | } | ||
770 | } | ||
771 | |||
772 | if ( pVBInfo->VBType & VB_XGI301C) | ||
773 | { | ||
774 | XGINew_SetRegOR( pVBInfo->Part4Port , 0x0d , 0x04 ) ; | ||
775 | } | ||
776 | |||
777 | if ( XGINew_SenseHiTV( HwDeviceExtension , pVBInfo) ) /* add by kuku for Multi-adapter sense HiTV */ | ||
778 | { | ||
779 | tempax |= HiTVSense ; | ||
780 | if ( ( pVBInfo->VBType & VB_XGI301C ) ) | ||
781 | { | ||
782 | tempax ^= ( HiTVSense | YPbPrSense ) ; | ||
783 | } | ||
784 | } | ||
785 | |||
786 | if ( !( tempax & ( HiTVSense | YPbPrSense ) ) ) /* start */ | ||
787 | { | ||
788 | |||
789 | tempbx = *pVBInfo->pYCSenseData ; | ||
790 | |||
791 | if ( !( XGINew_Is301B( pVBInfo ) ) ) | ||
792 | { | ||
793 | tempbx=*pVBInfo->pYCSenseData2; | ||
794 | } | ||
795 | |||
796 | tempcx = 0x0604 ; | ||
797 | if ( XGINew_Sense(tempbx , tempcx, pVBInfo ) ) | ||
798 | { | ||
799 | if ( XGINew_Sense(tempbx , tempcx, pVBInfo ) ) | ||
800 | { | ||
801 | tempax |= SVIDEOSense ; | ||
802 | } | ||
803 | } | ||
804 | |||
805 | if ( OutputSelect & BoardTVType ) | ||
806 | { | ||
807 | tempbx = *pVBInfo->pVideoSenseData ; | ||
808 | |||
809 | if ( !( XGINew_Is301B( pVBInfo ) ) ) | ||
810 | { | ||
811 | tempbx = *pVBInfo->pVideoSenseData2 ; | ||
812 | } | ||
813 | |||
814 | tempcx = 0x0804 ; | ||
815 | if ( XGINew_Sense(tempbx , tempcx, pVBInfo ) ) | ||
816 | { | ||
817 | if ( XGINew_Sense(tempbx , tempcx, pVBInfo ) ) | ||
818 | { | ||
819 | tempax |= AVIDEOSense ; | ||
820 | } | ||
821 | } | ||
822 | } | ||
823 | else | ||
824 | { | ||
825 | if ( !( tempax & SVIDEOSense ) ) | ||
826 | { | ||
827 | tempbx = *pVBInfo->pVideoSenseData ; | ||
828 | |||
829 | if ( !( XGINew_Is301B( pVBInfo ) ) ) | ||
830 | { | ||
831 | tempbx=*pVBInfo->pVideoSenseData2; | ||
832 | } | ||
833 | |||
834 | tempcx = 0x0804 ; | ||
835 | if ( XGINew_Sense(tempbx , tempcx, pVBInfo ) ) | ||
836 | { | ||
837 | if ( XGINew_Sense(tempbx , tempcx, pVBInfo ) ) | ||
838 | { | ||
839 | tempax |= AVIDEOSense ; | ||
840 | } | ||
841 | } | ||
842 | } | ||
843 | } | ||
844 | } | ||
845 | } /* end */ | ||
846 | if ( !( tempax & Monitor2Sense ) ) | ||
847 | { | ||
848 | if ( XGINew_SenseLCD( HwDeviceExtension, pVBInfo ) ) | ||
849 | { | ||
850 | tempax |= LCDSense ; | ||
851 | } | ||
852 | } | ||
853 | tempbx = 0 ; | ||
854 | tempcx = 0 ; | ||
855 | XGINew_Sense(tempbx , tempcx, pVBInfo ) ; | ||
856 | |||
857 | XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x32 , ~0xDF , tempax ) ; | ||
858 | XGINew_SetReg1( pVBInfo->Part2Port , 0x00 , P2reg0 ) ; | ||
859 | |||
860 | if ( !( P2reg0 & 0x20 ) ) | ||
861 | { | ||
862 | pVBInfo->VBInfo = DisableCRT2Display ; | ||
863 | /* XGI_SetCRT2Group301( SenseModeNo , HwDeviceExtension, pVBInfo ) ; */ | ||
864 | } | ||
865 | } | ||
866 | } | ||
867 | XGI_DisableBridge( HwDeviceExtension, pVBInfo ) ; /* shampoo 0226 */ | ||
868 | |||
869 | } | ||
870 | |||
871 | |||
872 | |||
873 | /* --------------------------------------------------------------------- */ | ||
874 | /* Function : XGINew_SenseLCD */ | ||
875 | /* Input : */ | ||
876 | /* Output : */ | ||
877 | /* Description : */ | ||
878 | /* --------------------------------------------------------------------- */ | ||
879 | USHORT XGINew_SenseLCD( PXGI_HW_DEVICE_INFO HwDeviceExtension ,PVB_DEVICE_INFO pVBInfo) | ||
880 | { | ||
881 | /* USHORT SoftSetting ; */ | ||
882 | USHORT temp ; | ||
883 | |||
884 | if ( ( HwDeviceExtension->jChipType >= XG20 ) || ( HwDeviceExtension->jChipType >= XG40 ) ) | ||
885 | temp = 0 ; | ||
886 | else | ||
887 | temp=XGINew_GetPanelID(pVBInfo) ; | ||
888 | |||
889 | if( !temp ) | ||
890 | temp = XGINew_GetLCDDDCInfo( HwDeviceExtension, pVBInfo ) ; | ||
891 | |||
892 | return( temp ) ; | ||
893 | } | ||
894 | |||
895 | |||
896 | /* --------------------------------------------------------------------- */ | ||
897 | /* Function : XGINew_GetLCDDDCInfo */ | ||
898 | /* Input : */ | ||
899 | /* Output : */ | ||
900 | /* Description : */ | ||
901 | /* --------------------------------------------------------------------- */ | ||
902 | BOOLEAN XGINew_GetLCDDDCInfo( PXGI_HW_DEVICE_INFO HwDeviceExtension,PVB_DEVICE_INFO pVBInfo) | ||
903 | { | ||
904 | USHORT temp ; | ||
905 | |||
906 | /* add lcd sense */ | ||
907 | if ( HwDeviceExtension->ulCRT2LCDType == LCD_UNKNOWN ) | ||
908 | { | ||
909 | return( 0 ) ; | ||
910 | } | ||
911 | else | ||
912 | { | ||
913 | temp = ( USHORT )HwDeviceExtension->ulCRT2LCDType ; | ||
914 | switch( HwDeviceExtension->ulCRT2LCDType ) | ||
915 | { | ||
916 | case LCD_INVALID: | ||
917 | case LCD_800x600: | ||
918 | case LCD_1024x768: | ||
919 | case LCD_1280x1024: | ||
920 | break ; | ||
921 | |||
922 | case LCD_640x480: | ||
923 | case LCD_1024x600: | ||
924 | case LCD_1152x864: | ||
925 | case LCD_1280x960: | ||
926 | case LCD_1152x768: | ||
927 | temp = 0 ; | ||
928 | break ; | ||
929 | |||
930 | case LCD_1400x1050: | ||
931 | case LCD_1280x768: | ||
932 | case LCD_1600x1200: | ||
933 | break ; | ||
934 | |||
935 | case LCD_1920x1440: | ||
936 | case LCD_2048x1536: | ||
937 | temp = 0 ; | ||
938 | break ; | ||
939 | |||
940 | default: | ||
941 | break ; | ||
942 | } | ||
943 | XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x36 , 0xF0 , temp ) ; | ||
944 | return( 1 ) ; | ||
945 | } | ||
946 | } | ||
947 | |||
948 | |||
949 | /* --------------------------------------------------------------------- */ | ||
950 | /* Function : */ | ||
951 | /* Input : */ | ||
952 | /* Output : */ | ||
953 | /* Description : */ | ||
954 | /* --------------------------------------------------------------------- */ | ||
955 | BOOLEAN XGINew_GetPanelID(PVB_DEVICE_INFO pVBInfo ) | ||
956 | { | ||
957 | USHORT PanelTypeTable[ 16 ] = { SyncNN | PanelRGB18Bit | Panel800x600 | _PanelType00 , | ||
958 | SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType01 , | ||
959 | SyncNN | PanelRGB18Bit | Panel800x600 | _PanelType02 , | ||
960 | SyncNN | PanelRGB18Bit | Panel640x480 | _PanelType03 , | ||
961 | SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType04 , | ||
962 | SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType05 , | ||
963 | SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType06 , | ||
964 | SyncNN | PanelRGB24Bit | Panel1024x768 | _PanelType07 , | ||
965 | SyncNN | PanelRGB18Bit | Panel800x600 | _PanelType08 , | ||
966 | SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType09 , | ||
967 | SyncNN | PanelRGB18Bit | Panel800x600 | _PanelType0A , | ||
968 | SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType0B , | ||
969 | SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType0C , | ||
970 | SyncNN | PanelRGB24Bit | Panel1024x768 | _PanelType0D , | ||
971 | SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType0E , | ||
972 | SyncNN | PanelRGB18Bit | Panel1024x768 | _PanelType0F } ; | ||
973 | USHORT tempax , tempbx , temp ; | ||
974 | /* USHORT return_flag ; */ | ||
975 | |||
976 | tempax = XGINew_GetReg1( pVBInfo->P3c4 , 0x1A ) ; | ||
977 | tempbx = tempax & 0x1E ; | ||
978 | |||
979 | if ( tempax == 0 ) | ||
980 | return( 0 ) ; | ||
981 | else | ||
982 | { | ||
983 | /* | ||
984 | if ( !( tempax & 0x10 ) ) | ||
985 | { | ||
986 | if ( pVBInfo->IF_DEF_LVDS == 1 ) | ||
987 | { | ||
988 | tempbx = 0 ; | ||
989 | temp = XGINew_GetReg1( pVBInfo->P3c4 , 0x38 ) ; | ||
990 | if ( temp & 0x40 ) | ||
991 | tempbx |= 0x08 ; | ||
992 | if ( temp & 0x20 ) | ||
993 | tempbx |= 0x02 ; | ||
994 | if ( temp & 0x01 ) | ||
995 | tempbx |= 0x01 ; | ||
996 | |||
997 | temp = XGINew_GetReg1( pVBInfo->P3c4 , 0x39 ) ; | ||
998 | if ( temp & 0x80 ) | ||
999 | tempbx |= 0x04 ; | ||
1000 | } | ||
1001 | else | ||
1002 | { | ||
1003 | return( 0 ) ; | ||
1004 | } | ||
1005 | } | ||
1006 | */ | ||
1007 | |||
1008 | tempbx = tempbx >> 1 ; | ||
1009 | temp = tempbx & 0x00F ; | ||
1010 | XGINew_SetReg1( pVBInfo->P3d4 , 0x36 , temp ) ; | ||
1011 | tempbx-- ; | ||
1012 | tempbx = PanelTypeTable[ tempbx ] ; | ||
1013 | |||
1014 | temp = ( tempbx & 0xFF00 ) >> 8 ; | ||
1015 | XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x37 , ~( LCDSyncBit | LCDRGB18Bit ) , temp ) ; | ||
1016 | return( 1 ) ; | ||
1017 | } | ||
1018 | } | ||
1019 | |||
1020 | |||
1021 | /* --------------------------------------------------------------------- */ | ||
1022 | /* Function : XGINew_BridgeIsEnable */ | ||
1023 | /* Input : */ | ||
1024 | /* Output : */ | ||
1025 | /* Description : */ | ||
1026 | /* --------------------------------------------------------------------- */ | ||
1027 | BOOLEAN XGINew_BridgeIsEnable( PXGI_HW_DEVICE_INFO HwDeviceExtension ,PVB_DEVICE_INFO pVBInfo) | ||
1028 | { | ||
1029 | USHORT flag ; | ||
1030 | |||
1031 | if ( XGI_BridgeIsOn( pVBInfo ) == 0 ) | ||
1032 | { | ||
1033 | flag = XGINew_GetReg1( pVBInfo->Part1Port , 0x0 ) ; | ||
1034 | |||
1035 | if ( flag & 0x050 ) | ||
1036 | { | ||
1037 | return( 1 ) ; | ||
1038 | } | ||
1039 | else | ||
1040 | { | ||
1041 | return( 0 ) ; | ||
1042 | } | ||
1043 | |||
1044 | } | ||
1045 | return( 0 ) ; | ||
1046 | } | ||
1047 | |||
1048 | /* ------------------------------------------------------ */ | ||
1049 | /* Function : XGINew_SenseHiTV */ | ||
1050 | /* Input : */ | ||
1051 | /* Output : */ | ||
1052 | /* Description : */ | ||
1053 | /* ------------------------------------------------------ */ | ||
1054 | BOOLEAN XGINew_SenseHiTV( PXGI_HW_DEVICE_INFO HwDeviceExtension , PVB_DEVICE_INFO pVBInfo ) | ||
1055 | { | ||
1056 | USHORT tempbx , tempcx , temp , i , tempch; | ||
1057 | |||
1058 | tempbx = *pVBInfo->pYCSenseData2 ; | ||
1059 | |||
1060 | tempcx = 0x0604 ; | ||
1061 | |||
1062 | temp = tempbx & 0xFF ; | ||
1063 | XGINew_SetReg1( pVBInfo->Part4Port , 0x11 , temp ) ; | ||
1064 | temp = ( tempbx & 0xFF00 ) >> 8 ; | ||
1065 | temp |= ( tempcx & 0x00FF ) ; | ||
1066 | XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x10 , ~0x1F , temp ) ; | ||
1067 | |||
1068 | for( i = 0 ; i < 10 ; i++ ) | ||
1069 | XGI_LongWait(pVBInfo) ; | ||
1070 | |||
1071 | tempch = ( tempcx & 0xFF00 ) >> 8; | ||
1072 | temp = XGINew_GetReg1( pVBInfo->Part4Port , 0x03 ) ; | ||
1073 | temp = temp ^ ( 0x0E ) ; | ||
1074 | temp &= tempch ; | ||
1075 | |||
1076 | if ( temp != tempch ) | ||
1077 | return( 0 ) ; | ||
1078 | |||
1079 | tempbx = *pVBInfo->pVideoSenseData2 ; | ||
1080 | |||
1081 | tempcx = 0x0804 ; | ||
1082 | temp = tempbx & 0xFF ; | ||
1083 | XGINew_SetReg1( pVBInfo->Part4Port , 0x11 , temp ) ; | ||
1084 | temp = ( tempbx & 0xFF00 ) >> 8 ; | ||
1085 | temp |= ( tempcx & 0x00FF ) ; | ||
1086 | XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x10 , ~0x1F , temp ) ; | ||
1087 | |||
1088 | for( i = 0 ; i < 10 ; i++ ) | ||
1089 | XGI_LongWait(pVBInfo) ; | ||
1090 | |||
1091 | tempch = ( tempcx & 0xFF00 ) >> 8; | ||
1092 | temp = XGINew_GetReg1( pVBInfo->Part4Port , 0x03 ) ; | ||
1093 | temp = temp ^ ( 0x0E ) ; | ||
1094 | temp &= tempch ; | ||
1095 | |||
1096 | if ( temp != tempch ) | ||
1097 | return( 0 ) ; | ||
1098 | else | ||
1099 | { | ||
1100 | tempbx = 0x3FF ; | ||
1101 | tempcx = 0x0804 ; | ||
1102 | temp = tempbx & 0xFF ; | ||
1103 | XGINew_SetReg1( pVBInfo->Part4Port , 0x11 , temp ) ; | ||
1104 | temp = ( tempbx & 0xFF00 ) >> 8 ; | ||
1105 | temp |= ( tempcx & 0x00FF ) ; | ||
1106 | XGINew_SetRegANDOR( pVBInfo->Part4Port , 0x10 , ~0x1F , temp ) ; | ||
1107 | |||
1108 | for( i = 0 ; i < 10 ; i++ ) | ||
1109 | XGI_LongWait(pVBInfo) ; | ||
1110 | |||
1111 | tempch = ( tempcx & 0xFF00 ) >> 8; | ||
1112 | temp = XGINew_GetReg1( pVBInfo->Part4Port , 0x03 ) ; | ||
1113 | temp = temp ^ ( 0x0E ) ; | ||
1114 | temp &= tempch ; | ||
1115 | |||
1116 | if ( temp != tempch ) | ||
1117 | return( 1 ) ; | ||
1118 | else | ||
1119 | return( 0 ) ; | ||
1120 | } | ||
1121 | } | ||
1122 | |||
1123 | |||
1124 | |||
1125 | /* | ||
1126 | ;----------------------------------------------------------------------------- | ||
1127 | ; Description: Get Panel support | ||
1128 | ; O/P : | ||
1129 | ; BL: Panel ID=81h for no scaler LVDS | ||
1130 | ; BH: Panel enhanced Mode Count | ||
1131 | ; CX: Panel H. resolution | ||
1132 | ; DX: PAnel V. resolution | ||
1133 | ;----------------------------------------------------------------------------- | ||
1134 | */ | ||
1135 | void XGI_XG21Fun14Sub70( PVB_DEVICE_INFO pVBInfo , PX86_REGS pBiosArguments ) | ||
1136 | { | ||
1137 | |||
1138 | USHORT ModeIdIndex; | ||
1139 | USHORT ModeNo; | ||
1140 | |||
1141 | USHORT EModeCount; | ||
1142 | USHORT lvdstableindex; | ||
1143 | |||
1144 | lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo ); | ||
1145 | pBiosArguments->h.bl = 0x81; | ||
1146 | pBiosArguments->x.cx = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE; | ||
1147 | pBiosArguments->x.dx = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE; | ||
1148 | EModeCount = 0; | ||
1149 | |||
1150 | pBiosArguments->x.ax = 0x0014; | ||
1151 | for( ModeIdIndex = 0 ; ; ModeIdIndex ++ ) | ||
1152 | { | ||
1153 | ModeNo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeID; | ||
1154 | if ( pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeID == 0xFF ) | ||
1155 | { | ||
1156 | pBiosArguments->h.bh = (UCHAR) EModeCount; | ||
1157 | return; | ||
1158 | } | ||
1159 | if ( !XGI_XG21CheckLVDSMode( ModeNo , ModeIdIndex, pVBInfo) ) | ||
1160 | { | ||
1161 | continue; | ||
1162 | } | ||
1163 | EModeCount++ ; | ||
1164 | } | ||
1165 | } | ||
1166 | /*( | ||
1167 | ;----------------------------------------------------------------------------- | ||
1168 | ; | ||
1169 | ; Description: Get Panel mode ID for enhanced mode | ||
1170 | ; I/P : BH: EModeIndex ( which < Panel enhanced Mode Count ) | ||
1171 | ; O/P : | ||
1172 | ; BL: Mode ID | ||
1173 | ; CX: H. resolution of the assigned by the index | ||
1174 | ; DX: V. resolution of the assigned by the index | ||
1175 | ; | ||
1176 | ;----------------------------------------------------------------------------- | ||
1177 | */ | ||
1178 | void XGI_XG21Fun14Sub71( PVB_DEVICE_INFO pVBInfo , PX86_REGS pBiosArguments ) | ||
1179 | { | ||
1180 | |||
1181 | USHORT EModeCount; | ||
1182 | USHORT ModeIdIndex,resindex; | ||
1183 | USHORT ModeNo; | ||
1184 | USHORT EModeIndex = pBiosArguments->h.bh; | ||
1185 | |||
1186 | EModeCount = 0; | ||
1187 | for( ModeIdIndex = 0 ; ; ModeIdIndex ++ ) | ||
1188 | { | ||
1189 | ModeNo = pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeID; | ||
1190 | if ( pVBInfo->EModeIDTable[ ModeIdIndex ].Ext_ModeID == 0xFF ) | ||
1191 | { | ||
1192 | pBiosArguments->x.ax = 0x0114; | ||
1193 | return; | ||
1194 | } | ||
1195 | if ( !XGI_XG21CheckLVDSMode( ModeNo , ModeIdIndex, pVBInfo) ) | ||
1196 | { | ||
1197 | continue; | ||
1198 | } | ||
1199 | if (EModeCount == EModeIndex) | ||
1200 | { | ||
1201 | resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ; | ||
1202 | pBiosArguments->h.bl = (UCHAR) ModeNo; | ||
1203 | pBiosArguments->x.cx = pVBInfo->ModeResInfo[ resindex ].HTotal ; /* xres->ax */ | ||
1204 | pBiosArguments->x.dx = pVBInfo->ModeResInfo[ resindex ].VTotal ; /* yres->bx */ | ||
1205 | pBiosArguments->x.ax = 0x0014; | ||
1206 | } | ||
1207 | EModeCount++ ; | ||
1208 | |||
1209 | } | ||
1210 | |||
1211 | } | ||
1212 | /* | ||
1213 | ;----------------------------------------------------------------------------- | ||
1214 | ; | ||
1215 | ; Description: Validate Panel modes ID support | ||
1216 | ; I/P : | ||
1217 | ; BL: ModeID | ||
1218 | ; O/P : | ||
1219 | ; CX: H. resolution of the assigned by the index | ||
1220 | ; DX: V. resolution of the assigned by the index | ||
1221 | ; | ||
1222 | ;----------------------------------------------------------------------------- | ||
1223 | */ | ||
1224 | void XGI_XG21Fun14Sub72( PVB_DEVICE_INFO pVBInfo , PX86_REGS pBiosArguments ) | ||
1225 | { | ||
1226 | USHORT ModeIdIndex,resindex; | ||
1227 | USHORT ModeNo; | ||
1228 | |||
1229 | |||
1230 | ModeNo = pBiosArguments->h.bl ; | ||
1231 | XGI_SearchModeID( ModeNo, &ModeIdIndex, pVBInfo); | ||
1232 | if ( !XGI_XG21CheckLVDSMode( ModeNo , ModeIdIndex, pVBInfo) ) | ||
1233 | { | ||
1234 | pBiosArguments->x.cx = 0; | ||
1235 | pBiosArguments->x.dx = 0; | ||
1236 | pBiosArguments->x.ax = 0x0114; | ||
1237 | return; | ||
1238 | } | ||
1239 | resindex = XGI_GetResInfo( ModeNo , ModeIdIndex, pVBInfo ) ; | ||
1240 | if ( ModeNo <= 0x13 ) | ||
1241 | { | ||
1242 | pBiosArguments->x.cx = pVBInfo->StResInfo[ resindex ].HTotal ; | ||
1243 | pBiosArguments->x.dx = pVBInfo->StResInfo[ resindex ].VTotal ; | ||
1244 | } | ||
1245 | else | ||
1246 | { | ||
1247 | pBiosArguments->x.cx = pVBInfo->ModeResInfo[ resindex ].HTotal ; /* xres->ax */ | ||
1248 | pBiosArguments->x.dx = pVBInfo->ModeResInfo[ resindex ].VTotal ; /* yres->bx */ | ||
1249 | } | ||
1250 | |||
1251 | pBiosArguments->x.ax = 0x0014; | ||
1252 | |||
1253 | } | ||
1254 | |||
1255 | /* | ||
1256 | ;----------------------------------------------------------------------------- | ||
1257 | ; Description: Get Customized Panel misc. information support | ||
1258 | ; I/P : Select | ||
1259 | ; to get panel horizontal timing | ||
1260 | ; to get panel vertical timing | ||
1261 | ; to get channel clock parameter | ||
1262 | ; to get panel misc information | ||
1263 | ; | ||
1264 | ; O/P : | ||
1265 | ; BL: for input Select = 0 ; | ||
1266 | ; BX: *Value1 = Horizontal total | ||
1267 | ; CX: *Value2 = Horizontal front porch | ||
1268 | ; DX: *Value2 = Horizontal sync width | ||
1269 | ; BL: for input Select = 1 ; | ||
1270 | ; BX: *Value1 = Vertical total | ||
1271 | ; CX: *Value2 = Vertical front porch | ||
1272 | ; DX: *Value2 = Vertical sync width | ||
1273 | ; BL: for input Select = 2 ; | ||
1274 | ; BX: Value1 = The first CLK parameter | ||
1275 | ; CX: Value2 = The second CLK parameter | ||
1276 | ; BL: for input Select = 4 ; | ||
1277 | ; BX[15]: *Value1 D[15] VESA V. Polarity | ||
1278 | ; BX[14]: *Value1 D[14] VESA H. Polarity | ||
1279 | ; BX[7]: *Value1 D[7] Panel V. Polarity | ||
1280 | ; BX[6]: *Value1 D[6] Panel H. Polarity | ||
1281 | ;----------------------------------------------------------------------------- | ||
1282 | */ | ||
1283 | void XGI_XG21Fun14Sub73( PVB_DEVICE_INFO pVBInfo , PX86_REGS pBiosArguments ) | ||
1284 | { | ||
1285 | UCHAR Select; | ||
1286 | |||
1287 | USHORT lvdstableindex; | ||
1288 | |||
1289 | lvdstableindex = XGI_GetLVDSOEMTableIndex( pVBInfo ); | ||
1290 | Select = pBiosArguments->h.bl; | ||
1291 | |||
1292 | switch (Select) | ||
1293 | { | ||
1294 | case 0: | ||
1295 | pBiosArguments->x.bx = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT; | ||
1296 | pBiosArguments->x.cx = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP; | ||
1297 | pBiosArguments->x.dx = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC; | ||
1298 | break; | ||
1299 | case 1: | ||
1300 | pBiosArguments->x.bx = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT; | ||
1301 | pBiosArguments->x.cx = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP; | ||
1302 | pBiosArguments->x.dx = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC; | ||
1303 | break; | ||
1304 | case 2: | ||
1305 | pBiosArguments->x.bx = pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData1; | ||
1306 | pBiosArguments->x.cx = pVBInfo->XG21_LVDSCapList[lvdstableindex].VCLKData2; | ||
1307 | break; | ||
1308 | case 4: | ||
1309 | pBiosArguments->x.bx = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDS_Capability; | ||
1310 | break; | ||
1311 | } | ||
1312 | |||
1313 | pBiosArguments->x.ax = 0x0014; | ||
1314 | } | ||
1315 | |||
1316 | |||
1317 | void XGI_XG21Fun14( PXGI_HW_DEVICE_INFO pXGIHWDE, PX86_REGS pBiosArguments) | ||
1318 | { | ||
1319 | VB_DEVICE_INFO VBINF; | ||
1320 | PVB_DEVICE_INFO pVBInfo = &VBINF; | ||
1321 | |||
1322 | pVBInfo->IF_DEF_LVDS = 0 ; | ||
1323 | pVBInfo->IF_DEF_CH7005 = 0 ; | ||
1324 | pVBInfo->IF_DEF_HiVision = 1 ; | ||
1325 | pVBInfo->IF_DEF_LCDA = 1 ; | ||
1326 | pVBInfo->IF_DEF_CH7017 = 0 ; | ||
1327 | pVBInfo->IF_DEF_YPbPr = 1 ; | ||
1328 | pVBInfo->IF_DEF_CRT2Monitor = 0 ; | ||
1329 | pVBInfo->IF_DEF_VideoCapture = 0 ; | ||
1330 | pVBInfo->IF_DEF_ScaleLCD = 0 ; | ||
1331 | pVBInfo->IF_DEF_OEMUtil = 0 ; | ||
1332 | pVBInfo->IF_DEF_PWD = 0 ; | ||
1333 | |||
1334 | InitTo330Pointer( pXGIHWDE->jChipType, pVBInfo ) ; | ||
1335 | ReadVBIOSTablData( pXGIHWDE->jChipType , pVBInfo) ; | ||
1336 | |||
1337 | pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14 ; | ||
1338 | pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24 ; | ||
1339 | pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10 ; | ||
1340 | pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e ; | ||
1341 | pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12 ; | ||
1342 | pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a ; | ||
1343 | pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16 ; | ||
1344 | pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17 ; | ||
1345 | pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18 ; | ||
1346 | pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19 ; | ||
1347 | pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A ; | ||
1348 | pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00 ; | ||
1349 | pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04 ; | ||
1350 | pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10 ; | ||
1351 | pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12 ; | ||
1352 | pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 ; | ||
1353 | pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2 ; | ||
1354 | |||
1355 | switch(pBiosArguments->x.ax) | ||
1356 | { | ||
1357 | case 0x1470: | ||
1358 | XGI_XG21Fun14Sub70( pVBInfo , pBiosArguments ) ; | ||
1359 | break; | ||
1360 | case 0x1471: | ||
1361 | XGI_XG21Fun14Sub71( pVBInfo , pBiosArguments ) ; | ||
1362 | break; | ||
1363 | case 0x1472: | ||
1364 | XGI_XG21Fun14Sub72( pVBInfo , pBiosArguments ) ; | ||
1365 | break; | ||
1366 | case 0x1473: | ||
1367 | XGI_XG21Fun14Sub73( pVBInfo , pBiosArguments ) ; | ||
1368 | break; | ||
1369 | } | ||
1370 | } | ||