9 #include "xf86PciInfo.h"
15 #include <linux/version.h>
17 #include <linux/types.h>
25 #include "vb_struct.h"
27 #include "vb_setmode.h"
29 extern UCHAR XGI330_SoftSetting
;
30 extern UCHAR XGI330_OutputSelect
;
31 extern USHORT XGI330_RGBSenseData2
;
32 extern USHORT XGI330_YCSenseData2
;
33 extern USHORT XGI330_VideoSenseData2
;
34 void XGI_GetSenseStatus( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
);
35 BOOLEAN
XGINew_GetPanelID(PVB_DEVICE_INFO pVBInfo
);
36 USHORT
XGINew_SenseLCD(PXGI_HW_DEVICE_INFO
,PVB_DEVICE_INFO pVBInfo
);
37 BOOLEAN
XGINew_GetLCDDDCInfo(PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
);
38 void XGISetDPMS( PXGI_HW_DEVICE_INFO pXGIHWDE
, ULONG VESA_POWER_STATE
) ;
39 BOOLEAN
XGINew_BridgeIsEnable(PXGI_HW_DEVICE_INFO
,PVB_DEVICE_INFO pVBInfo
);
40 BOOLEAN
XGINew_Sense(USHORT tempbx
,USHORT tempcx
, PVB_DEVICE_INFO pVBInfo
);
41 BOOLEAN
XGINew_SenseHiTV( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
) ;
43 /**************************************************************
45 *************************************************************/
47 void XGI_WaitDisplay(void);
48 BOOLEAN
XGI_Is301C(PVB_DEVICE_INFO
);
49 BOOLEAN
XGI_Is301LV(PVB_DEVICE_INFO
);
53 /* --------------------------------------------------------------------- */
54 /* Function : XGINew_Is301B */
58 /* --------------------------------------------------------------------- */
59 BOOLEAN
XGINew_Is301B( PVB_DEVICE_INFO pVBInfo
)
63 flag
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x01 ) ;
66 return( 0 ) ; /* 301b */
71 /* --------------------------------------------------------------------- */
72 /* Function : XGI_Is301C */
76 /* --------------------------------------------------------------------- */
77 BOOLEAN
XGI_Is301C( PVB_DEVICE_INFO pVBInfo
)
79 if ( ( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x01 ) & 0xF0 ) == 0xC0 )
82 if ( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x01 ) >= 0xD0 )
84 if ( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x39 ) == 0xE0 )
92 /* --------------------------------------------------------------------- */
93 /* Function : XGI_Is301LV */
97 /* --------------------------------------------------------------------- */
98 BOOLEAN
XGI_Is301LV( PVB_DEVICE_INFO pVBInfo
)
100 if ( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x01 ) >= 0xD0 )
102 if ( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x39 ) == 0xFF )
111 /* --------------------------------------------------------------------- */
112 /* Function : XGINew_Sense */
116 /* --------------------------------------------------------------------- */
117 BOOLEAN
XGINew_Sense( USHORT tempbx
, USHORT tempcx
, PVB_DEVICE_INFO pVBInfo
)
119 USHORT temp
, i
, tempch
;
121 temp
= tempbx
& 0xFF ;
122 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x11 , temp
) ;
123 temp
= ( tempbx
& 0xFF00 ) >> 8 ;
124 temp
|= ( tempcx
& 0x00FF ) ;
125 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x10 , ~0x1F , temp
) ;
127 for( i
= 0 ; i
< 10 ; i
++ )
128 XGI_LongWait( pVBInfo
) ;
130 tempch
= ( tempcx
& 0x7F00 ) >> 8 ;
131 temp
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x03 ) ;
132 temp
= temp
^ ( 0x0E ) ;
142 /* --------------------------------------------------------------------- */
143 /* Function : XGISetDPMS */
147 /* --------------------------------------------------------------------- */
148 VOID
XGISetDPMS( PXGI_HW_DEVICE_INFO pXGIHWDE
, ULONG VESA_POWER_STATE
)
150 USHORT ModeNo
, ModeIdIndex
;
152 VB_DEVICE_INFO VBINF
;
153 PVB_DEVICE_INFO pVBInfo
= &VBINF
;
154 pVBInfo
->BaseAddr
= (ULONG
)pXGIHWDE
->pjIOAddress
;
155 pVBInfo
->ROMAddr
= pXGIHWDE
->pjVirtualRomBase
;
158 pVBInfo
->IF_DEF_LVDS
= 0 ;
159 pVBInfo
->IF_DEF_CH7005
= 0 ;
160 pVBInfo
->IF_DEF_HiVision
= 1 ;
161 pVBInfo
->IF_DEF_LCDA
= 1 ;
162 pVBInfo
->IF_DEF_CH7017
= 0 ;
163 pVBInfo
->IF_DEF_YPbPr
= 1 ;
164 pVBInfo
->IF_DEF_CRT2Monitor
= 0 ;
165 pVBInfo
->IF_DEF_VideoCapture
= 0 ;
166 pVBInfo
->IF_DEF_ScaleLCD
= 0 ;
167 pVBInfo
->IF_DEF_OEMUtil
= 0 ;
168 pVBInfo
->IF_DEF_PWD
= 0 ;
170 InitTo330Pointer( pXGIHWDE
->jChipType
, pVBInfo
) ;
171 ReadVBIOSTablData( pXGIHWDE
->jChipType
, pVBInfo
) ;
173 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
174 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
175 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
176 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
177 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
178 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
179 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
180 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
181 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
182 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
183 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
184 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
185 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
186 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
187 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
188 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
189 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
191 if ( pXGIHWDE
->jChipType
== XG27
)
193 if ( ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) & 0xE0 ) == 0xC0 )
195 if ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x30 ) & 0x20 )
197 pVBInfo
->IF_DEF_LVDS
= 1 ;
202 if ( pVBInfo
->IF_DEF_CH7007
== 0 )
204 XGINew_SetModeScratch ( pXGIHWDE
, pVBInfo
) ;
206 XGINew_SetReg1( pVBInfo
->P3c4
, 0x05 , 0x86 ) ; /* 1.Openkey */
207 XGI_UnLockCRT2( pXGIHWDE
, pVBInfo
) ;
208 ModeNo
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x34 ) ;
209 XGI_SearchModeID( ModeNo
, &ModeIdIndex
, pVBInfo
) ;
210 XGI_GetVGAType( pXGIHWDE
, pVBInfo
) ;
212 if ( ( pXGIHWDE
->ujVBChipID
== VB_CHIP_301
) || ( pXGIHWDE
->ujVBChipID
== VB_CHIP_302
) || ( pVBInfo
->IF_DEF_CH7007
== 1 ))
214 XGI_GetVBType( pVBInfo
) ;
215 XGI_GetVBInfo( ModeNo
, ModeIdIndex
, pXGIHWDE
, pVBInfo
) ;
216 XGI_GetTVInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
217 XGI_GetLCDInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
220 if ( VESA_POWER_STATE
== 0x00000400 )
221 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x31 , ( UCHAR
)( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x31 ) & 0xFE ) ) ;
223 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x31 , ( UCHAR
)( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x31 ) | 0x01 ) ) ;
225 temp
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x1f ) ;
227 switch ( VESA_POWER_STATE
)
229 case 0x00000000: /* on */
230 if ( ( pXGIHWDE
->ujVBChipID
== VB_CHIP_301
) || ( pXGIHWDE
->ujVBChipID
== VB_CHIP_302
) )
232 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1f , ( UCHAR
)( temp
| 0x00 ) ) ;
233 XGI_EnableBridge( pXGIHWDE
, pVBInfo
) ;
237 if ( pXGIHWDE
->jChipType
== XG21
)
239 if ( pVBInfo
->IF_DEF_LVDS
== 1 )
241 XGI_XG21BLSignalVDD( 0x01 , 0x01, pVBInfo
) ; /* LVDS VDD on */
242 XGI_XG21SetPanelDelay( 2,pVBInfo
) ;
245 if ( pXGIHWDE
->jChipType
== XG27
)
247 if ( pVBInfo
->IF_DEF_LVDS
== 1 )
249 XGI_XG27BLSignalVDD( 0x01 , 0x01, pVBInfo
) ; /* LVDS VDD on */
250 XGI_XG21SetPanelDelay( 2,pVBInfo
) ;
253 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x1F , ~0xC0 , 0x00 ) ;
254 XGINew_SetRegAND( pVBInfo
->P3c4
, 0x01 , ~0x20 ) ; /* CRT on */
256 if ( pXGIHWDE
->jChipType
== XG21
)
258 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
261 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x09 , ~0x80 , 0x80 ) ; /* DVO ON */
262 XGI_SetXG21FPBits( pVBInfo
);
263 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x4A , ~0x20 ) ; /* Enable write GPIOF */
264 /*XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x48 , ~0x20 , 0x20 ) ;*/ /* LCD Display ON */
266 XGI_XG21BLSignalVDD( 0x20 , 0x20, pVBInfo
) ; /* LVDS signal on */
267 XGI_DisplayOn( pXGIHWDE
, pVBInfo
);
269 if ( pXGIHWDE
->jChipType
== XG27
)
271 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
274 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x09 , ~0x80 , 0x80 ) ; /* DVO ON */
275 XGI_SetXG27FPBits( pVBInfo
);
276 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x4A , ~0x20 ) ; /* Enable write GPIOF */
277 /*XGINew_SetRegANDOR( pVBInfo->P3d4 , 0x48 , ~0x20 , 0x20 ) ;*/ /* LCD Display ON */
279 XGI_XG27BLSignalVDD( 0x20 , 0x20, pVBInfo
) ; /* LVDS signal on */
280 XGI_DisplayOn( pXGIHWDE
, pVBInfo
);
284 case 0x00000100: /* standby */
285 if ( pXGIHWDE
->jChipType
>= XG21
)
287 XGI_DisplayOff( pXGIHWDE
, pVBInfo
);
290 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1f , ( UCHAR
)( temp
| 0x40 ) ) ;
292 case 0x00000200: /* suspend */
293 if ( pXGIHWDE
->jChipType
== XG21
)
295 XGI_DisplayOff( pXGIHWDE
, pVBInfo
);
296 XGI_XG21BLSignalVDD( 0x20 , 0x00, pVBInfo
) ; /* LVDS signal off */
298 if ( pXGIHWDE
->jChipType
== XG27
)
300 XGI_DisplayOff( pXGIHWDE
, pVBInfo
);
301 XGI_XG27BLSignalVDD( 0x20 , 0x00, pVBInfo
) ; /* LVDS signal off */
303 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1f , ( UCHAR
)( temp
| 0x80 ) ) ;
305 case 0x00000400: /* off */
306 if ( (pXGIHWDE
->ujVBChipID
== VB_CHIP_301
) || ( pXGIHWDE
->ujVBChipID
== VB_CHIP_302
) )
308 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1f , ( UCHAR
)( temp
| 0xc0 ) ) ;
309 XGI_DisableBridge( pXGIHWDE
, pVBInfo
) ;
313 if ( pXGIHWDE
->jChipType
== XG21
)
315 XGI_DisplayOff( pXGIHWDE
, pVBInfo
);
317 XGI_XG21BLSignalVDD( 0x20 , 0x00, pVBInfo
) ; /* LVDS signal off */
319 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
322 XGINew_SetRegAND( pVBInfo
->P3c4
, 0x09 , ~0x80 ) ; /* DVO Off */
323 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x4A , ~0x20 ) ; /* Enable write GPIOF */
324 /*XGINew_SetRegAND( pVBInfo->P3d4 , 0x48 , ~0x20 ) ;*/ /* LCD Display OFF */
327 if ( pXGIHWDE
->jChipType
== XG27
)
329 XGI_DisplayOff( pXGIHWDE
, pVBInfo
);
331 XGI_XG27BLSignalVDD( 0x20 , 0x00, pVBInfo
) ; /* LVDS signal off */
333 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
336 XGINew_SetRegAND( pVBInfo
->P3c4
, 0x09 , ~0x80 ) ; /* DVO Off */
339 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x1F , ~0xC0 , 0xC0 ) ;
340 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x01 , 0x20 ) ; /* CRT Off */
342 if ( ( pXGIHWDE
->jChipType
== XG21
) && ( pVBInfo
->IF_DEF_LVDS
== 1 ) )
344 XGI_XG21SetPanelDelay( 4,pVBInfo
) ;
345 XGI_XG21BLSignalVDD( 0x01 , 0x00, pVBInfo
) ; /* LVDS VDD off */
346 XGI_XG21SetPanelDelay( 5,pVBInfo
) ;
348 if ( ( pXGIHWDE
->jChipType
== XG27
) && ( pVBInfo
->IF_DEF_LVDS
== 1 ) )
350 XGI_XG21SetPanelDelay( 4,pVBInfo
) ;
351 XGI_XG27BLSignalVDD( 0x01 , 0x00, pVBInfo
) ; /* LVDS VDD off */
352 XGI_XG21SetPanelDelay( 5,pVBInfo
) ;
360 XGI_LockCRT2( pXGIHWDE
, pVBInfo
) ;
365 /* --------------------------------------------------------------------- */
366 /* Function : XGI_GetSenseStatus */
370 /* --------------------------------------------------------------------- */
371 void XGI_GetSenseStatus( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
373 USHORT tempax
= 0 , tempbx
, tempcx
, temp
,
374 P2reg0
= 0 , SenseModeNo
= 0 , OutputSelect
= *pVBInfo
->pOutputSelect
,
376 pVBInfo
->BaseAddr
= (ULONG
)HwDeviceExtension
->pjIOAddress
;
378 if ( pVBInfo
->IF_DEF_LVDS
== 1 )
380 tempax
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x1A ) ; /* ynlai 02/27/2002 */
381 tempbx
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x1B ) ;
382 tempax
= ( ( tempax
& 0xFE ) >> 1 ) | ( tempbx
<< 8 ) ;
383 if ( tempax
== 0x00 )
384 { /* Get Panel id from DDC */
385 temp
= XGINew_GetLCDDDCInfo( HwDeviceExtension
, pVBInfo
) ;
388 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x39 , 0xFF , 0x01 ) ; /* set CR39 bit0="1" */
389 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x37 , 0xEF , 0x00 ) ; /* clean CR37 bit4="0" */
393 { /* LCD don't connect */
399 XGINew_GetPanelID(pVBInfo
) ;
403 tempbx
= ~( LCDSense
| AVIDEOSense
| SVIDEOSense
) ;
404 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , tempbx
, temp
) ;
408 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
410 tempax
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x38 ) ;
411 temp
= tempax
& 0x01 ;
412 tempax
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3A ) ;
413 temp
= temp
| ( tempax
& 0x02 ) ;
414 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , 0xA0 , temp
) ;
418 if ( XGI_BridgeIsOn( pVBInfo
) )
420 P2reg0
= XGINew_GetReg1( pVBInfo
->Part2Port
, 0x00 ) ;
421 if ( !XGINew_BridgeIsEnable( HwDeviceExtension
, pVBInfo
) )
424 /* XGINew_SetReg1( pVBInfo->P3d4 , 0x30 , 0x41 ) ; */
425 /* XGISetModeNew( HwDeviceExtension , 0x2e ) ; // ynlai InitMode */
427 temp
= XGI_SearchModeID( SenseModeNo
, &ModeIdIndex
, pVBInfo
) ;
428 XGI_GetVGAType( HwDeviceExtension
, pVBInfo
) ;
429 XGI_GetVBType( pVBInfo
) ;
430 pVBInfo
->SetFlag
= 0x00 ;
431 pVBInfo
->ModeType
= ModeVGA
;
432 pVBInfo
->VBInfo
= SetCRT2ToRAMDAC
| LoadDACFlag
| SetInSlaveMode
;
433 XGI_GetLCDInfo( 0x2e , ModeIdIndex
, pVBInfo
) ;
434 XGI_GetTVInfo( 0x2e , ModeIdIndex
, pVBInfo
) ;
435 XGI_EnableBridge( HwDeviceExtension
, pVBInfo
) ;
436 XGI_SetCRT2Group301( SenseModeNo
, HwDeviceExtension
, pVBInfo
) ;
437 XGI_SetCRT2ModeRegs( 0x2e , HwDeviceExtension
, pVBInfo
) ;
438 /* XGI_DisableBridge( HwDeviceExtension, pVBInfo ) ; */
439 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x01 , 0xDF , 0x20 ) ; /* Display Off 0212 */
440 for( i
= 0 ; i
< 20 ; i
++ )
442 XGI_LongWait(pVBInfo
) ;
445 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x00 , 0x1c ) ;
447 tempbx
= *pVBInfo
->pRGBSenseData
;
449 if ( !( XGINew_Is301B( pVBInfo
) ) )
451 tempbx
= *pVBInfo
->pRGBSenseData2
;
455 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
457 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
459 tempax
|= Monitor2Sense
;
463 if ( pVBInfo
->VBType
& VB_XGI301C
)
465 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x0d , 0x04 ) ;
468 if ( XGINew_SenseHiTV( HwDeviceExtension
, pVBInfo
) ) /* add by kuku for Multi-adapter sense HiTV */
470 tempax
|= HiTVSense
;
471 if ( ( pVBInfo
->VBType
& VB_XGI301C
) )
473 tempax
^= ( HiTVSense
| YPbPrSense
) ;
477 if ( !( tempax
& ( HiTVSense
| YPbPrSense
) ) ) /* start */
480 tempbx
= *pVBInfo
->pYCSenseData
;
482 if ( !( XGINew_Is301B( pVBInfo
) ) )
484 tempbx
=*pVBInfo
->pYCSenseData2
;
488 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
490 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
492 tempax
|= SVIDEOSense
;
496 if ( OutputSelect
& BoardTVType
)
498 tempbx
= *pVBInfo
->pVideoSenseData
;
500 if ( !( XGINew_Is301B( pVBInfo
) ) )
502 tempbx
= *pVBInfo
->pVideoSenseData2
;
506 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
508 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
510 tempax
|= AVIDEOSense
;
516 if ( !( tempax
& SVIDEOSense
) )
518 tempbx
= *pVBInfo
->pVideoSenseData
;
520 if ( !( XGINew_Is301B( pVBInfo
) ) )
522 tempbx
=*pVBInfo
->pVideoSenseData2
;
526 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
528 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
530 tempax
|= AVIDEOSense
;
537 if ( !( tempax
& Monitor2Sense
) )
539 if ( XGINew_SenseLCD( HwDeviceExtension
, pVBInfo
) )
546 XGINew_Sense(tempbx
, tempcx
, pVBInfo
) ;
548 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , ~0xDF , tempax
) ;
549 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x00 , P2reg0
) ;
551 if ( !( P2reg0
& 0x20 ) )
553 pVBInfo
->VBInfo
= DisableCRT2Display
;
554 /* XGI_SetCRT2Group301( SenseModeNo , HwDeviceExtension, pVBInfo ) ; */
558 XGI_DisableBridge( HwDeviceExtension
, pVBInfo
) ; /* shampoo 0226 */
564 /* --------------------------------------------------------------------- */
565 /* Function : XGINew_SenseLCD */
569 /* --------------------------------------------------------------------- */
570 USHORT
XGINew_SenseLCD( PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
)
572 /* USHORT SoftSetting ; */
575 if ( ( HwDeviceExtension
->jChipType
>= XG20
) || ( HwDeviceExtension
->jChipType
>= XG40
) )
578 temp
=XGINew_GetPanelID(pVBInfo
) ;
581 temp
= XGINew_GetLCDDDCInfo( HwDeviceExtension
, pVBInfo
) ;
587 /* --------------------------------------------------------------------- */
588 /* Function : XGINew_GetLCDDDCInfo */
592 /* --------------------------------------------------------------------- */
593 BOOLEAN
XGINew_GetLCDDDCInfo( PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
)
598 if ( HwDeviceExtension
->ulCRT2LCDType
== LCD_UNKNOWN
)
604 temp
= ( USHORT
)HwDeviceExtension
->ulCRT2LCDType
;
605 switch( HwDeviceExtension
->ulCRT2LCDType
)
634 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x36 , 0xF0 , temp
) ;
640 /* --------------------------------------------------------------------- */
645 /* --------------------------------------------------------------------- */
646 BOOLEAN
XGINew_GetPanelID(PVB_DEVICE_INFO pVBInfo
)
648 USHORT PanelTypeTable
[ 16 ] = { SyncNN
| PanelRGB18Bit
| Panel800x600
| _PanelType00
,
649 SyncNN
| PanelRGB18Bit
| Panel1024x768
| _PanelType01
,
650 SyncNN
| PanelRGB18Bit
| Panel800x600
| _PanelType02
,
651 SyncNN
| PanelRGB18Bit
| Panel640x480
| _PanelType03
,
652 SyncNN
| PanelRGB18Bit
| Panel1024x768
| _PanelType04
,
653 SyncNN
| PanelRGB18Bit
| Panel1024x768
| _PanelType05
,
654 SyncNN
| PanelRGB18Bit
| Panel1024x768
| _PanelType06
,
655 SyncNN
| PanelRGB24Bit
| Panel1024x768
| _PanelType07
,
656 SyncNN
| PanelRGB18Bit
| Panel800x600
| _PanelType08
,
657 SyncNN
| PanelRGB18Bit
| Panel1024x768
| _PanelType09
,
658 SyncNN
| PanelRGB18Bit
| Panel800x600
| _PanelType0A
,
659 SyncNN
| PanelRGB18Bit
| Panel1024x768
| _PanelType0B
,
660 SyncNN
| PanelRGB18Bit
| Panel1024x768
| _PanelType0C
,
661 SyncNN
| PanelRGB24Bit
| Panel1024x768
| _PanelType0D
,
662 SyncNN
| PanelRGB18Bit
| Panel1024x768
| _PanelType0E
,
663 SyncNN
| PanelRGB18Bit
| Panel1024x768
| _PanelType0F
} ;
664 USHORT tempax
, tempbx
, temp
;
665 /* USHORT return_flag ; */
667 tempax
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x1A ) ;
668 tempbx
= tempax
& 0x1E ;
675 if ( !( tempax & 0x10 ) )
677 if ( pVBInfo->IF_DEF_LVDS == 1 )
680 temp = XGINew_GetReg1( pVBInfo->P3c4 , 0x38 ) ;
688 temp = XGINew_GetReg1( pVBInfo->P3c4 , 0x39 ) ;
699 tempbx
= tempbx
>> 1 ;
700 temp
= tempbx
& 0x00F ;
701 XGINew_SetReg1( pVBInfo
->P3d4
, 0x36 , temp
) ;
703 tempbx
= PanelTypeTable
[ tempbx
] ;
705 temp
= ( tempbx
& 0xFF00 ) >> 8 ;
706 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x37 , ~( LCDSyncBit
| LCDRGB18Bit
) , temp
) ;
712 /* --------------------------------------------------------------------- */
713 /* Function : XGINew_BridgeIsEnable */
717 /* --------------------------------------------------------------------- */
718 BOOLEAN
XGINew_BridgeIsEnable( PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
)
722 if ( XGI_BridgeIsOn( pVBInfo
) == 0 )
724 flag
= XGINew_GetReg1( pVBInfo
->Part1Port
, 0x0 ) ;
739 /* ------------------------------------------------------ */
740 /* Function : XGINew_SenseHiTV */
744 /* ------------------------------------------------------ */
745 BOOLEAN
XGINew_SenseHiTV( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
747 USHORT tempbx
, tempcx
, temp
, i
, tempch
;
749 tempbx
= *pVBInfo
->pYCSenseData2
;
753 temp
= tempbx
& 0xFF ;
754 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x11 , temp
) ;
755 temp
= ( tempbx
& 0xFF00 ) >> 8 ;
756 temp
|= ( tempcx
& 0x00FF ) ;
757 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x10 , ~0x1F , temp
) ;
759 for( i
= 0 ; i
< 10 ; i
++ )
760 XGI_LongWait(pVBInfo
) ;
762 tempch
= ( tempcx
& 0xFF00 ) >> 8;
763 temp
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x03 ) ;
764 temp
= temp
^ ( 0x0E ) ;
767 if ( temp
!= tempch
)
770 tempbx
= *pVBInfo
->pVideoSenseData2
;
773 temp
= tempbx
& 0xFF ;
774 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x11 , temp
) ;
775 temp
= ( tempbx
& 0xFF00 ) >> 8 ;
776 temp
|= ( tempcx
& 0x00FF ) ;
777 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x10 , ~0x1F , temp
) ;
779 for( i
= 0 ; i
< 10 ; i
++ )
780 XGI_LongWait(pVBInfo
) ;
782 tempch
= ( tempcx
& 0xFF00 ) >> 8;
783 temp
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x03 ) ;
784 temp
= temp
^ ( 0x0E ) ;
787 if ( temp
!= tempch
)
793 temp
= tempbx
& 0xFF ;
794 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x11 , temp
) ;
795 temp
= ( tempbx
& 0xFF00 ) >> 8 ;
796 temp
|= ( tempcx
& 0x00FF ) ;
797 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x10 , ~0x1F , temp
) ;
799 for( i
= 0 ; i
< 10 ; i
++ )
800 XGI_LongWait(pVBInfo
) ;
802 tempch
= ( tempcx
& 0xFF00 ) >> 8;
803 temp
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x03 ) ;
804 temp
= temp
^ ( 0x0E ) ;
807 if ( temp
!= tempch
)
817 ;-----------------------------------------------------------------------------
818 ; Description: Get Panel support
820 ; BL: Panel ID=81h for no scaler LVDS
821 ; BH: Panel enhanced Mode Count
822 ; CX: Panel H. resolution
823 ; DX: PAnel V. resolution
824 ;-----------------------------------------------------------------------------
826 void XGI_XG21Fun14Sub70( PVB_DEVICE_INFO pVBInfo
, PX86_REGS pBiosArguments
)
833 USHORT lvdstableindex
;
835 lvdstableindex
= XGI_GetLVDSOEMTableIndex( pVBInfo
);
836 pBiosArguments
->h
.bl
= 0x81;
837 pBiosArguments
->x
.cx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHDE
;
838 pBiosArguments
->x
.dx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVDE
;
841 pBiosArguments
->x
.ax
= 0x0014;
842 for( ModeIdIndex
= 0 ; ; ModeIdIndex
++ )
844 ModeNo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeID
;
845 if ( pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeID
== 0xFF )
847 pBiosArguments
->h
.bh
= (UCHAR
) EModeCount
;
850 if ( !XGI_XG21CheckLVDSMode( ModeNo
, ModeIdIndex
, pVBInfo
) )
858 ;-----------------------------------------------------------------------------
860 ; Description: Get Panel mode ID for enhanced mode
861 ; I/P : BH: EModeIndex ( which < Panel enhanced Mode Count )
864 ; CX: H. resolution of the assigned by the index
865 ; DX: V. resolution of the assigned by the index
867 ;-----------------------------------------------------------------------------
869 void XGI_XG21Fun14Sub71( PVB_DEVICE_INFO pVBInfo
, PX86_REGS pBiosArguments
)
873 USHORT ModeIdIndex
,resindex
;
875 USHORT EModeIndex
= pBiosArguments
->h
.bh
;
878 for( ModeIdIndex
= 0 ; ; ModeIdIndex
++ )
880 ModeNo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeID
;
881 if ( pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeID
== 0xFF )
883 pBiosArguments
->x
.ax
= 0x0114;
886 if ( !XGI_XG21CheckLVDSMode( ModeNo
, ModeIdIndex
, pVBInfo
) )
890 if (EModeCount
== EModeIndex
)
892 resindex
= XGI_GetResInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
893 pBiosArguments
->h
.bl
= (UCHAR
) ModeNo
;
894 pBiosArguments
->x
.cx
= pVBInfo
->ModeResInfo
[ resindex
].HTotal
; /* xres->ax */
895 pBiosArguments
->x
.dx
= pVBInfo
->ModeResInfo
[ resindex
].VTotal
; /* yres->bx */
896 pBiosArguments
->x
.ax
= 0x0014;
904 ;-----------------------------------------------------------------------------
906 ; Description: Validate Panel modes ID support
910 ; CX: H. resolution of the assigned by the index
911 ; DX: V. resolution of the assigned by the index
913 ;-----------------------------------------------------------------------------
915 void XGI_XG21Fun14Sub72( PVB_DEVICE_INFO pVBInfo
, PX86_REGS pBiosArguments
)
917 USHORT ModeIdIndex
,resindex
;
921 ModeNo
= pBiosArguments
->h
.bl
;
922 XGI_SearchModeID( ModeNo
, &ModeIdIndex
, pVBInfo
);
923 if ( !XGI_XG21CheckLVDSMode( ModeNo
, ModeIdIndex
, pVBInfo
) )
925 pBiosArguments
->x
.cx
= 0;
926 pBiosArguments
->x
.dx
= 0;
927 pBiosArguments
->x
.ax
= 0x0114;
930 resindex
= XGI_GetResInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
931 if ( ModeNo
<= 0x13 )
933 pBiosArguments
->x
.cx
= pVBInfo
->StResInfo
[ resindex
].HTotal
;
934 pBiosArguments
->x
.dx
= pVBInfo
->StResInfo
[ resindex
].VTotal
;
938 pBiosArguments
->x
.cx
= pVBInfo
->ModeResInfo
[ resindex
].HTotal
; /* xres->ax */
939 pBiosArguments
->x
.dx
= pVBInfo
->ModeResInfo
[ resindex
].VTotal
; /* yres->bx */
942 pBiosArguments
->x
.ax
= 0x0014;
947 ;-----------------------------------------------------------------------------
948 ; Description: Get Customized Panel misc. information support
950 ; to get panel horizontal timing
951 ; to get panel vertical timing
952 ; to get channel clock parameter
953 ; to get panel misc information
956 ; BL: for input Select = 0 ;
957 ; BX: *Value1 = Horizontal total
958 ; CX: *Value2 = Horizontal front porch
959 ; DX: *Value2 = Horizontal sync width
960 ; BL: for input Select = 1 ;
961 ; BX: *Value1 = Vertical total
962 ; CX: *Value2 = Vertical front porch
963 ; DX: *Value2 = Vertical sync width
964 ; BL: for input Select = 2 ;
965 ; BX: Value1 = The first CLK parameter
966 ; CX: Value2 = The second CLK parameter
967 ; BL: for input Select = 4 ;
968 ; BX[15]: *Value1 D[15] VESA V. Polarity
969 ; BX[14]: *Value1 D[14] VESA H. Polarity
970 ; BX[7]: *Value1 D[7] Panel V. Polarity
971 ; BX[6]: *Value1 D[6] Panel H. Polarity
972 ;-----------------------------------------------------------------------------
974 void XGI_XG21Fun14Sub73( PVB_DEVICE_INFO pVBInfo
, PX86_REGS pBiosArguments
)
978 USHORT lvdstableindex
;
980 lvdstableindex
= XGI_GetLVDSOEMTableIndex( pVBInfo
);
981 Select
= pBiosArguments
->h
.bl
;
986 pBiosArguments
->x
.bx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHT
;
987 pBiosArguments
->x
.cx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHFP
;
988 pBiosArguments
->x
.dx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHSYNC
;
991 pBiosArguments
->x
.bx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVT
;
992 pBiosArguments
->x
.cx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVFP
;
993 pBiosArguments
->x
.dx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVSYNC
;
996 pBiosArguments
->x
.bx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].VCLKData1
;
997 pBiosArguments
->x
.cx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].VCLKData2
;
1000 pBiosArguments
->x
.bx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDS_Capability
;
1004 pBiosArguments
->x
.ax
= 0x0014;
1008 void XGI_XG21Fun14( PXGI_HW_DEVICE_INFO pXGIHWDE
, PX86_REGS pBiosArguments
)
1010 VB_DEVICE_INFO VBINF
;
1011 PVB_DEVICE_INFO pVBInfo
= &VBINF
;
1013 pVBInfo
->IF_DEF_LVDS
= 0 ;
1014 pVBInfo
->IF_DEF_CH7005
= 0 ;
1015 pVBInfo
->IF_DEF_HiVision
= 1 ;
1016 pVBInfo
->IF_DEF_LCDA
= 1 ;
1017 pVBInfo
->IF_DEF_CH7017
= 0 ;
1018 pVBInfo
->IF_DEF_YPbPr
= 1 ;
1019 pVBInfo
->IF_DEF_CRT2Monitor
= 0 ;
1020 pVBInfo
->IF_DEF_VideoCapture
= 0 ;
1021 pVBInfo
->IF_DEF_ScaleLCD
= 0 ;
1022 pVBInfo
->IF_DEF_OEMUtil
= 0 ;
1023 pVBInfo
->IF_DEF_PWD
= 0 ;
1025 InitTo330Pointer( pXGIHWDE
->jChipType
, pVBInfo
) ;
1026 ReadVBIOSTablData( pXGIHWDE
->jChipType
, pVBInfo
) ;
1028 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
1029 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
1030 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
1031 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
1032 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
1033 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
1034 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
1035 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
1036 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
1037 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
1038 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
1039 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
1040 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
1041 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
1042 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
1043 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
1044 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
1046 switch(pBiosArguments
->x
.ax
)
1049 XGI_XG21Fun14Sub70( pVBInfo
, pBiosArguments
) ;
1052 XGI_XG21Fun14Sub71( pVBInfo
, pBiosArguments
) ;
1055 XGI_XG21Fun14Sub72( pVBInfo
, pBiosArguments
) ;
1058 XGI_XG21Fun14Sub73( pVBInfo
, pBiosArguments
) ;