20 #include "xf86PciInfo.h"
26 #include <linux/version.h>
28 #include <linux/types.h>
30 /*#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
31 #include <video/XGIfb.h>
33 #include <linux/XGIfb.h>
41 #include "vb_struct.h"
43 #include "vb_setmode.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
;
51 extern UCHAR
SenseCHTV(PHW_DEVICE_EXTENSION pHWDE
); /* 2007/05/17 Billy */
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
) ;
62 /**************************************************************
64 *************************************************************/
66 void XGI_WaitDisplay(void);
67 BOOLEAN
XGI_Is301C(PVB_DEVICE_INFO
);
68 BOOLEAN
XGI_Is301LV(PVB_DEVICE_INFO
);
71 UCHAR
XGI_SenseLCD(PHW_DEVICE_EXTENSION
, PVB_DEVICE_INFO
);
72 UCHAR
XGI_GetLCDDDCInfo(PHW_DEVICE_EXTENSION
,PVB_DEVICE_INFO
);
74 extern BOOL
bGetDdcInfo(
75 PHW_DEVICE_EXTENSION pHWDE
,
84 /* --------------------------------------------------------------------- */
85 /* Function : XGINew_Is301B */
89 /* --------------------------------------------------------------------- */
90 BOOLEAN
XGINew_Is301B( PVB_DEVICE_INFO pVBInfo
)
94 flag
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x01 ) ;
97 return( 0 ) ; /* 301b */
102 /* --------------------------------------------------------------------- */
103 /* Function : XGI_Is301C */
107 /* --------------------------------------------------------------------- */
108 BOOLEAN
XGI_Is301C( PVB_DEVICE_INFO pVBInfo
)
110 if ( ( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x01 ) & 0xF0 ) == 0xC0 )
113 if ( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x01 ) >= 0xD0 )
115 if ( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x39 ) == 0xE0 )
123 /* --------------------------------------------------------------------- */
124 /* Function : XGI_Is301LV */
128 /* --------------------------------------------------------------------- */
129 BOOLEAN
XGI_Is301LV( PVB_DEVICE_INFO pVBInfo
)
131 if ( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x01 ) >= 0xD0 )
133 if ( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x39 ) == 0xFF )
142 /* --------------------------------------------------------------------- */
143 /* Function : XGINew_Sense */
147 /* --------------------------------------------------------------------- */
148 BOOLEAN
XGINew_Sense( USHORT tempbx
, USHORT tempcx
, PVB_DEVICE_INFO pVBInfo
)
150 USHORT temp
, i
, tempch
;
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
) ;
158 for( i
= 0 ; i
< 10 ; i
++ )
159 XGI_LongWait( pVBInfo
) ;
161 tempch
= ( tempcx
& 0x7F00 ) >> 8 ;
162 temp
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x03 ) ;
163 temp
= temp
^ ( 0x0E ) ;
173 /* --------------------------------------------------------------------- */
174 /* Function : XGI_SenseLCD */
178 /* --------------------------------------------------------------------- */
179 UCHAR
XGI_SenseLCD( PHW_DEVICE_EXTENSION pHWDE
, PVB_DEVICE_INFO pVBInfo
)
181 USHORT tempax
, tempbx
, tempcx
;
182 UCHAR SoftSetting
= XGI330_SoftSetting
;
184 if ( pVBInfo
->VBType
& ( VB_XGI301LV
| VB_XGI302LV
) )
188 if ( SoftSetting
& HotPlugFunction
) /* Hot Plug Detection */
190 XGINew_SetRegAND( pVBInfo
->Part4Port
, 0x0F , 0x3F ) ;
193 if ( XGINew_Sense( tempbx
, tempcx
, pVBInfo
) )
198 else /* Get LCD Info from EDID */
199 return(XGI_GetLCDDDCInfo(pHWDE
, pVBInfo
));
203 /* --------------------------------------------------------------------- */
204 /* Function : XGI_GetLCDDDCInfo */
208 /* --------------------------------------------------------------------- */
209 UCHAR
XGI_GetLCDDDCInfo( PHW_DEVICE_EXTENSION pHWDE
, PVB_DEVICE_INFO pVBInfo
)
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 */
217 bGetDdcInfo( pHWDE
, MASK_OUTPUTSTATE_CRT2LCD
, pjEDIDBuf
, ulBufferSize
) ;
218 if ( ( *( ( PULONG
)pjEDIDBuf
) == 0xFFFFFF00 ) && ( *( ( PULONG
)( pjEDIDBuf
+ 4 ) ) == 0x00FFFFFF ) )
220 tempah
= Panel1024x768
;
221 tempbl
=( *( pjEDIDBuf
+ 0x3A ) ) & 0xf0 ;
223 if ( tempbl
!= 0x40 )
225 tempah
= Panel1600x1200
;
226 if ( tempbl
!= 0x60 )
228 tempah
= Panel1280x1024
;
229 tempbh
= ( *( pjEDIDBuf
+ 0x3B ) ) ;
230 if ( tempbh
!= 0x00 )
232 tempah
= Panel1280x960
;
233 if ( tempbh
!= 0x0C0 )
235 tempbx
= ( ( *( pjEDIDBuf
+ 0x24 ) ) << 8 ) | ( *( pjEDIDBuf
+ 0x23 ) ) ;
236 tempah
= Panel1280x1024
;
237 if ( !( tempbx
& 0x0100 ) )
239 tempah
= Panel1024x768
;
240 if ( !( tempbx
& 0x0E00 ) )
242 tempah
= Panel1280x1024
;
247 if ( tempbx
& 0x00FF )
250 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x37 , temp
) ;
255 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x36 , ( ~0x07 ) , tempah
) ;
256 tempah
= ( ( *( pjEDIDBuf
+ 0x47 ) ) & 0x06 ) ; /* Polarity */
257 tempah
= ( tempah
^ 0x06 ) << 4 ;
259 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x37 , ( ~LCDSyncBit
) , tempah
) ;
260 tempbh
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x36 ) ;
262 if ( tempbh
== Panel1280x960
)
263 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x37 , 0x0E ) ;
265 else if ( *pjEDIDBuf
== 0x20 )
267 tempah
= Panel1024x768
;
268 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x36 , ( ~0x07 ) , tempah
) ;
279 /* --------------------------------------------------------------------- */
280 /* Function : XGI_DySense */
284 /* --------------------------------------------------------------------- */
285 BOOLEAN
XGI_DySense( PHW_DEVICE_EXTENSION pHWDE
, PUCHAR ujConnectStatus
)
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
;
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 */
308 pVBInfo
->IF_DEF_CH7007
= 0;
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 )
317 bConnectStatus
= SenseCHTV(HwDeviceExtension
->pDevice
) ; /* 07/05/28 */
318 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , ~0x03 , (UCHAR
)bConnectStatus
) ;
321 if(( pHWDE
->jChipID
>= XG40
) || ( pHWDE
->jChipID
>= XG20
))
324 if ( pHWDE
->jChipID
>= XG40
)
325 XGINew_SetReg1( pVBInfo
->P3d4
, 0x57 , 0x4A ) ; /* write sense pattern 30->4a */
327 XGINew_SetReg1( pVBInfo
->P3d4
, 0x57 , 0x5F ) ; /* write sense pattern */
329 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x53 , 0xFF , 0x02 ) ; /* enable sense DAC */
330 XGI_WaitDisply(pVBInfo
) ;
332 if(XGINew_GetReg2( pVBInfo
->P3c2
) & 0x10 )
333 bConnectStatus
|= Monitor1Sense
;
335 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x53 , 0xFD ) ; /* disable sense DAC */
336 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x57 , 0x00 ) ; /* clear sense pattern */
339 /* ---------- End of dynamic sense CRT1 ----------- */
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 ) ;
347 if ( XGI_Is301C( pVBInfo
) ) /* 301C only */
348 XGINew_SetRegANDOR( pVBInfo
->Part4Port
, 0x0D , ~0x07 , 0x01 ) ; /* Set Part4 0x0D D[2:0] to 001b */
351 if ( !XGI_Is301LV( pVBInfo
) )
353 tempbx
= XGI330_RGBSenseData2
;
355 if(XGINew_Sense( tempbx
, tempcx
, pVBInfo
) )
357 bConnectStatus
|= Monitor2Sense
;
358 if ( OutputSelect
& SetSCARTOutput
)
360 bConnectStatus
^= ( Monitor2Sense
| SCARTSense
) ;
364 if ( XGI_Is301C( pVBInfo
) ) /* 301C only */
365 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x0D , 0x04 ) ; /* Set Part4 0x0D D[2]=1 for dynamic sense */
367 if ( ( XGINew_Is301B( pVBInfo
) ) )
368 XGINew_SetRegOR( pVBInfo
->Part2Port
, 0x00 , 0x0C ) ; /* ????????? */
370 if ( XGINew_SenseHiTV( HwDeviceExtension
, pVBInfo
) ) /* add by kuku for Dysense HiTV //start */
372 bConnectStatus
|= YPbPrSense
;
376 tempbx
= XGI330_YCSenseData2
; /* Y/C Sense Data Ptr */
378 if ( XGINew_Sense( tempbx
, tempcx
, pVBInfo
) )
379 bConnectStatus
|= SVIDEOSense
;
381 if ( OutputSelect
& BoardTVType
)
383 tempbx
= XGI330_VideoSenseData2
;
385 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
386 bConnectStatus
|= AVIDEOSense
;
390 if ( !( bConnectStatus
& SVIDEOSense
) )
392 tempbx
= XGI330_VideoSenseData2
;
394 if ( XGINew_Sense( tempbx
, tempcx
, pVBInfo
) )
395 bConnectStatus
|= AVIDEOSense
;
403 XGINew_Sense(tempbx
, tempcx
, pVBInfo
) ;
405 if ( !( bConnectStatus
& Monitor2Sense
) )
407 if ( XGI_SenseLCD( pHWDE
, pVBInfo
) )
408 bConnectStatus
|= LCDSense
;
411 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , ~( AVIDEOSense
| SVIDEOSense
| LCDSense
| Monitor2Sense
| Monitor1Sense
) , bConnectStatus
) ;
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
) ;
417 if ( XGI_Is301C( pVBInfo
) ) /* 301C only */
419 tempax
= XGINew_GetReg1( pVBInfo
->Part2Port
, 0x00 ) ;
423 for( tempcx
= 2 ; tempcx
> 0 ; tempcx
-- )
426 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x00 , tempax
) ;
430 /* End of dynamic sense VB */
434 XGI_SenseCRT1(pVBInfo
) ;
435 XGI_GetSenseStatus( HwDeviceExtension
, pVBInfo
) ; /* sense CRT2 */
436 bConnectStatus
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x32 ) ;
438 temp
= pushax
& 0x00FF ; /* 0512 Fix Dysense hanged */
439 XGINew_SetReg1( pVBInfo
->P3d4
, 0x17 , temp
) ;
440 if ( bConnectStatus
)
442 *ujConnectStatus
= bConnectStatus
;
451 /* --------------------------------------------------------------------- */
452 /* Function : XGISetDPMS */
456 /* --------------------------------------------------------------------- */
457 VOID
XGISetDPMS( PXGI_HW_DEVICE_INFO pXGIHWDE
, ULONG VESA_POWER_STATE
)
459 USHORT ModeNo
, ModeIdIndex
;
461 VB_DEVICE_INFO VBINF
;
462 PVB_DEVICE_INFO pVBInfo
= &VBINF
;
463 pVBInfo
->BaseAddr
= (ULONG
)pXGIHWDE
->pjIOAddress
;
464 pVBInfo
->ROMAddr
= pXGIHWDE
->pjVirtualRomBase
;
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 ;
479 InitTo330Pointer( pXGIHWDE
->jChipType
, pVBInfo
) ;
480 ReadVBIOSTablData( pXGIHWDE
->jChipType
, pVBInfo
) ;
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 ;
500 if ( pXGIHWDE
->jChipType
== XG27
)
502 if ( ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) & 0xE0 ) == 0xC0 )
504 if ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x30 ) & 0x20 )
506 pVBInfo
->IF_DEF_LVDS
= 1 ;
511 if ( pVBInfo
->IF_DEF_CH7007
== 0 )
513 XGINew_SetModeScratch ( pXGIHWDE
, pVBInfo
) ;
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
) ;
521 if ( ( pXGIHWDE
->ujVBChipID
== VB_CHIP_301
) || ( pXGIHWDE
->ujVBChipID
== VB_CHIP_302
) || ( pVBInfo
->IF_DEF_CH7007
== 1 ))
523 XGI_GetVBType( pVBInfo
) ;
524 XGI_GetVBInfo( ModeNo
, ModeIdIndex
, pXGIHWDE
, pVBInfo
) ;
525 XGI_GetTVInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
526 XGI_GetLCDInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
529 if ( VESA_POWER_STATE
== 0x00000400 )
530 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x31 , ( UCHAR
)( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x31 ) & 0xFE ) ) ;
532 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x31 , ( UCHAR
)( XGINew_GetReg1( pVBInfo
->Part4Port
, 0x31 ) | 0x01 ) ) ;
534 temp
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x1f ) ;
536 switch ( VESA_POWER_STATE
)
538 case 0x00000000: /* on */
539 if ( ( pXGIHWDE
->ujVBChipID
== VB_CHIP_301
) || ( pXGIHWDE
->ujVBChipID
== VB_CHIP_302
) )
541 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1f , ( UCHAR
)( temp
| 0x00 ) ) ;
542 XGI_EnableBridge( pXGIHWDE
, pVBInfo
) ;
546 if ( pXGIHWDE
->jChipType
== XG21
)
548 if ( pVBInfo
->IF_DEF_LVDS
== 1 )
550 XGI_XG21BLSignalVDD( 0x01 , 0x01, pVBInfo
) ; /* LVDS VDD on */
551 XGI_XG21SetPanelDelay( 2,pVBInfo
) ;
554 if ( pXGIHWDE
->jChipType
== XG27
)
556 if ( pVBInfo
->IF_DEF_LVDS
== 1 )
558 XGI_XG27BLSignalVDD( 0x01 , 0x01, pVBInfo
) ; /* LVDS VDD on */
559 XGI_XG21SetPanelDelay( 2,pVBInfo
) ;
562 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x1F , ~0xC0 , 0x00 ) ;
563 XGINew_SetRegAND( pVBInfo
->P3c4
, 0x01 , ~0x20 ) ; /* CRT on */
565 if ( pXGIHWDE
->jChipType
== XG21
)
567 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
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 */
575 XGI_XG21BLSignalVDD( 0x20 , 0x20, pVBInfo
) ; /* LVDS signal on */
576 XGI_DisplayOn( pXGIHWDE
, pVBInfo
);
578 if ( pXGIHWDE
->jChipType
== XG27
)
580 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
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 */
588 XGI_XG27BLSignalVDD( 0x20 , 0x20, pVBInfo
) ; /* LVDS signal on */
589 XGI_DisplayOn( pXGIHWDE
, pVBInfo
);
593 case 0x00000100: /* standby */
594 if ( pXGIHWDE
->jChipType
>= XG21
)
596 XGI_DisplayOff( pXGIHWDE
, pVBInfo
);
599 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1f , ( UCHAR
)( temp
| 0x40 ) ) ;
601 case 0x00000200: /* suspend */
602 if ( pXGIHWDE
->jChipType
== XG21
)
604 XGI_DisplayOff( pXGIHWDE
, pVBInfo
);
605 XGI_XG21BLSignalVDD( 0x20 , 0x00, pVBInfo
) ; /* LVDS signal off */
607 if ( pXGIHWDE
->jChipType
== XG27
)
609 XGI_DisplayOff( pXGIHWDE
, pVBInfo
);
610 XGI_XG27BLSignalVDD( 0x20 , 0x00, pVBInfo
) ; /* LVDS signal off */
612 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1f , ( UCHAR
)( temp
| 0x80 ) ) ;
614 case 0x00000400: /* off */
615 if ( (pXGIHWDE
->ujVBChipID
== VB_CHIP_301
) || ( pXGIHWDE
->ujVBChipID
== VB_CHIP_302
) )
617 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1f , ( UCHAR
)( temp
| 0xc0 ) ) ;
618 XGI_DisableBridge( pXGIHWDE
, pVBInfo
) ;
622 if ( pXGIHWDE
->jChipType
== XG21
)
624 XGI_DisplayOff( pXGIHWDE
, pVBInfo
);
626 XGI_XG21BLSignalVDD( 0x20 , 0x00, pVBInfo
) ; /* LVDS signal off */
628 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
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 */
636 if ( pXGIHWDE
->jChipType
== XG27
)
638 XGI_DisplayOff( pXGIHWDE
, pVBInfo
);
640 XGI_XG27BLSignalVDD( 0x20 , 0x00, pVBInfo
) ; /* LVDS signal off */
642 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
645 XGINew_SetRegAND( pVBInfo
->P3c4
, 0x09 , ~0x80 ) ; /* DVO Off */
648 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x1F , ~0xC0 , 0xC0 ) ;
649 XGINew_SetRegOR( pVBInfo
->P3c4
, 0x01 , 0x20 ) ; /* CRT Off */
651 if ( ( pXGIHWDE
->jChipType
== XG21
) && ( pVBInfo
->IF_DEF_LVDS
== 1 ) )
653 XGI_XG21SetPanelDelay( 4,pVBInfo
) ;
654 XGI_XG21BLSignalVDD( 0x01 , 0x00, pVBInfo
) ; /* LVDS VDD off */
655 XGI_XG21SetPanelDelay( 5,pVBInfo
) ;
657 if ( ( pXGIHWDE
->jChipType
== XG27
) && ( pVBInfo
->IF_DEF_LVDS
== 1 ) )
659 XGI_XG21SetPanelDelay( 4,pVBInfo
) ;
660 XGI_XG27BLSignalVDD( 0x01 , 0x00, pVBInfo
) ; /* LVDS VDD off */
661 XGI_XG21SetPanelDelay( 5,pVBInfo
) ;
669 XGI_LockCRT2( pXGIHWDE
, pVBInfo
) ;
674 /* --------------------------------------------------------------------- */
675 /* Function : XGI_GetSenseStatus */
679 /* --------------------------------------------------------------------- */
680 void XGI_GetSenseStatus( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
682 USHORT tempax
= 0 , tempbx
, tempcx
, temp
,
683 P2reg0
= 0 , SenseModeNo
= 0 , OutputSelect
= *pVBInfo
->pOutputSelect
,
685 pVBInfo
->BaseAddr
= (ULONG
)HwDeviceExtension
->pjIOAddress
;
687 if ( pVBInfo
->IF_DEF_LVDS
== 1 )
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
) ;
697 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x39 , 0xFF , 0x01 ) ; /* set CR39 bit0="1" */
698 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x37 , 0xEF , 0x00 ) ; /* clean CR37 bit4="0" */
702 { /* LCD don't connect */
708 XGINew_GetPanelID(pVBInfo
) ;
712 tempbx
= ~( LCDSense
| AVIDEOSense
| SVIDEOSense
) ;
713 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , tempbx
, temp
) ;
717 if ( pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
)
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
) ;
727 if ( XGI_BridgeIsOn( pVBInfo
) )
729 P2reg0
= XGINew_GetReg1( pVBInfo
->Part2Port
, 0x00 ) ;
730 if ( !XGINew_BridgeIsEnable( HwDeviceExtension
, pVBInfo
) )
733 /* XGINew_SetReg1( pVBInfo->P3d4 , 0x30 , 0x41 ) ; */
734 /* XGISetModeNew( HwDeviceExtension , 0x2e ) ; // ynlai InitMode */
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
++ )
751 XGI_LongWait(pVBInfo
) ;
754 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x00 , 0x1c ) ;
756 tempbx
= *pVBInfo
->pRGBSenseData
;
758 if ( !( XGINew_Is301B( pVBInfo
) ) )
760 tempbx
= *pVBInfo
->pRGBSenseData2
;
764 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
766 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
768 tempax
|= Monitor2Sense
;
772 if ( pVBInfo
->VBType
& VB_XGI301C
)
774 XGINew_SetRegOR( pVBInfo
->Part4Port
, 0x0d , 0x04 ) ;
777 if ( XGINew_SenseHiTV( HwDeviceExtension
, pVBInfo
) ) /* add by kuku for Multi-adapter sense HiTV */
779 tempax
|= HiTVSense
;
780 if ( ( pVBInfo
->VBType
& VB_XGI301C
) )
782 tempax
^= ( HiTVSense
| YPbPrSense
) ;
786 if ( !( tempax
& ( HiTVSense
| YPbPrSense
) ) ) /* start */
789 tempbx
= *pVBInfo
->pYCSenseData
;
791 if ( !( XGINew_Is301B( pVBInfo
) ) )
793 tempbx
=*pVBInfo
->pYCSenseData2
;
797 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
799 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
801 tempax
|= SVIDEOSense
;
805 if ( OutputSelect
& BoardTVType
)
807 tempbx
= *pVBInfo
->pVideoSenseData
;
809 if ( !( XGINew_Is301B( pVBInfo
) ) )
811 tempbx
= *pVBInfo
->pVideoSenseData2
;
815 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
817 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
819 tempax
|= AVIDEOSense
;
825 if ( !( tempax
& SVIDEOSense
) )
827 tempbx
= *pVBInfo
->pVideoSenseData
;
829 if ( !( XGINew_Is301B( pVBInfo
) ) )
831 tempbx
=*pVBInfo
->pVideoSenseData2
;
835 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
837 if ( XGINew_Sense(tempbx
, tempcx
, pVBInfo
) )
839 tempax
|= AVIDEOSense
;
846 if ( !( tempax
& Monitor2Sense
) )
848 if ( XGINew_SenseLCD( HwDeviceExtension
, pVBInfo
) )
855 XGINew_Sense(tempbx
, tempcx
, pVBInfo
) ;
857 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , ~0xDF , tempax
) ;
858 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x00 , P2reg0
) ;
860 if ( !( P2reg0
& 0x20 ) )
862 pVBInfo
->VBInfo
= DisableCRT2Display
;
863 /* XGI_SetCRT2Group301( SenseModeNo , HwDeviceExtension, pVBInfo ) ; */
867 XGI_DisableBridge( HwDeviceExtension
, pVBInfo
) ; /* shampoo 0226 */
873 /* --------------------------------------------------------------------- */
874 /* Function : XGINew_SenseLCD */
878 /* --------------------------------------------------------------------- */
879 USHORT
XGINew_SenseLCD( PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
)
881 /* USHORT SoftSetting ; */
884 if ( ( HwDeviceExtension
->jChipType
>= XG20
) || ( HwDeviceExtension
->jChipType
>= XG40
) )
887 temp
=XGINew_GetPanelID(pVBInfo
) ;
890 temp
= XGINew_GetLCDDDCInfo( HwDeviceExtension
, pVBInfo
) ;
896 /* --------------------------------------------------------------------- */
897 /* Function : XGINew_GetLCDDDCInfo */
901 /* --------------------------------------------------------------------- */
902 BOOLEAN
XGINew_GetLCDDDCInfo( PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
)
907 if ( HwDeviceExtension
->ulCRT2LCDType
== LCD_UNKNOWN
)
913 temp
= ( USHORT
)HwDeviceExtension
->ulCRT2LCDType
;
914 switch( HwDeviceExtension
->ulCRT2LCDType
)
943 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x36 , 0xF0 , temp
) ;
949 /* --------------------------------------------------------------------- */
954 /* --------------------------------------------------------------------- */
955 BOOLEAN
XGINew_GetPanelID(PVB_DEVICE_INFO pVBInfo
)
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 ; */
976 tempax
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x1A ) ;
977 tempbx
= tempax
& 0x1E ;
984 if ( !( tempax & 0x10 ) )
986 if ( pVBInfo->IF_DEF_LVDS == 1 )
989 temp = XGINew_GetReg1( pVBInfo->P3c4 , 0x38 ) ;
997 temp = XGINew_GetReg1( pVBInfo->P3c4 , 0x39 ) ;
1008 tempbx
= tempbx
>> 1 ;
1009 temp
= tempbx
& 0x00F ;
1010 XGINew_SetReg1( pVBInfo
->P3d4
, 0x36 , temp
) ;
1012 tempbx
= PanelTypeTable
[ tempbx
] ;
1014 temp
= ( tempbx
& 0xFF00 ) >> 8 ;
1015 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x37 , ~( LCDSyncBit
| LCDRGB18Bit
) , temp
) ;
1021 /* --------------------------------------------------------------------- */
1022 /* Function : XGINew_BridgeIsEnable */
1026 /* --------------------------------------------------------------------- */
1027 BOOLEAN
XGINew_BridgeIsEnable( PXGI_HW_DEVICE_INFO HwDeviceExtension
,PVB_DEVICE_INFO pVBInfo
)
1031 if ( XGI_BridgeIsOn( pVBInfo
) == 0 )
1033 flag
= XGINew_GetReg1( pVBInfo
->Part1Port
, 0x0 ) ;
1048 /* ------------------------------------------------------ */
1049 /* Function : XGINew_SenseHiTV */
1053 /* ------------------------------------------------------ */
1054 BOOLEAN
XGINew_SenseHiTV( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
1056 USHORT tempbx
, tempcx
, temp
, i
, tempch
;
1058 tempbx
= *pVBInfo
->pYCSenseData2
;
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
) ;
1068 for( i
= 0 ; i
< 10 ; i
++ )
1069 XGI_LongWait(pVBInfo
) ;
1071 tempch
= ( tempcx
& 0xFF00 ) >> 8;
1072 temp
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x03 ) ;
1073 temp
= temp
^ ( 0x0E ) ;
1076 if ( temp
!= tempch
)
1079 tempbx
= *pVBInfo
->pVideoSenseData2
;
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
) ;
1088 for( i
= 0 ; i
< 10 ; i
++ )
1089 XGI_LongWait(pVBInfo
) ;
1091 tempch
= ( tempcx
& 0xFF00 ) >> 8;
1092 temp
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x03 ) ;
1093 temp
= temp
^ ( 0x0E ) ;
1096 if ( temp
!= tempch
)
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
) ;
1108 for( i
= 0 ; i
< 10 ; i
++ )
1109 XGI_LongWait(pVBInfo
) ;
1111 tempch
= ( tempcx
& 0xFF00 ) >> 8;
1112 temp
= XGINew_GetReg1( pVBInfo
->Part4Port
, 0x03 ) ;
1113 temp
= temp
^ ( 0x0E ) ;
1116 if ( temp
!= tempch
)
1126 ;-----------------------------------------------------------------------------
1127 ; Description: Get Panel support
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 ;-----------------------------------------------------------------------------
1135 void XGI_XG21Fun14Sub70( PVB_DEVICE_INFO pVBInfo
, PX86_REGS pBiosArguments
)
1142 USHORT lvdstableindex
;
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
;
1150 pBiosArguments
->x
.ax
= 0x0014;
1151 for( ModeIdIndex
= 0 ; ; ModeIdIndex
++ )
1153 ModeNo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeID
;
1154 if ( pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeID
== 0xFF )
1156 pBiosArguments
->h
.bh
= (UCHAR
) EModeCount
;
1159 if ( !XGI_XG21CheckLVDSMode( ModeNo
, ModeIdIndex
, pVBInfo
) )
1167 ;-----------------------------------------------------------------------------
1169 ; Description: Get Panel mode ID for enhanced mode
1170 ; I/P : BH: EModeIndex ( which < Panel enhanced Mode Count )
1173 ; CX: H. resolution of the assigned by the index
1174 ; DX: V. resolution of the assigned by the index
1176 ;-----------------------------------------------------------------------------
1178 void XGI_XG21Fun14Sub71( PVB_DEVICE_INFO pVBInfo
, PX86_REGS pBiosArguments
)
1182 USHORT ModeIdIndex
,resindex
;
1184 USHORT EModeIndex
= pBiosArguments
->h
.bh
;
1187 for( ModeIdIndex
= 0 ; ; ModeIdIndex
++ )
1189 ModeNo
= pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeID
;
1190 if ( pVBInfo
->EModeIDTable
[ ModeIdIndex
].Ext_ModeID
== 0xFF )
1192 pBiosArguments
->x
.ax
= 0x0114;
1195 if ( !XGI_XG21CheckLVDSMode( ModeNo
, ModeIdIndex
, pVBInfo
) )
1199 if (EModeCount
== EModeIndex
)
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;
1213 ;-----------------------------------------------------------------------------
1215 ; Description: Validate Panel modes ID support
1219 ; CX: H. resolution of the assigned by the index
1220 ; DX: V. resolution of the assigned by the index
1222 ;-----------------------------------------------------------------------------
1224 void XGI_XG21Fun14Sub72( PVB_DEVICE_INFO pVBInfo
, PX86_REGS pBiosArguments
)
1226 USHORT ModeIdIndex
,resindex
;
1230 ModeNo
= pBiosArguments
->h
.bl
;
1231 XGI_SearchModeID( ModeNo
, &ModeIdIndex
, pVBInfo
);
1232 if ( !XGI_XG21CheckLVDSMode( ModeNo
, ModeIdIndex
, pVBInfo
) )
1234 pBiosArguments
->x
.cx
= 0;
1235 pBiosArguments
->x
.dx
= 0;
1236 pBiosArguments
->x
.ax
= 0x0114;
1239 resindex
= XGI_GetResInfo( ModeNo
, ModeIdIndex
, pVBInfo
) ;
1240 if ( ModeNo
<= 0x13 )
1242 pBiosArguments
->x
.cx
= pVBInfo
->StResInfo
[ resindex
].HTotal
;
1243 pBiosArguments
->x
.dx
= pVBInfo
->StResInfo
[ resindex
].VTotal
;
1247 pBiosArguments
->x
.cx
= pVBInfo
->ModeResInfo
[ resindex
].HTotal
; /* xres->ax */
1248 pBiosArguments
->x
.dx
= pVBInfo
->ModeResInfo
[ resindex
].VTotal
; /* yres->bx */
1251 pBiosArguments
->x
.ax
= 0x0014;
1256 ;-----------------------------------------------------------------------------
1257 ; Description: Get Customized Panel misc. information support
1259 ; to get panel horizontal timing
1260 ; to get panel vertical timing
1261 ; to get channel clock parameter
1262 ; to get panel misc information
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 ;-----------------------------------------------------------------------------
1283 void XGI_XG21Fun14Sub73( PVB_DEVICE_INFO pVBInfo
, PX86_REGS pBiosArguments
)
1287 USHORT lvdstableindex
;
1289 lvdstableindex
= XGI_GetLVDSOEMTableIndex( pVBInfo
);
1290 Select
= pBiosArguments
->h
.bl
;
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
;
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
;
1305 pBiosArguments
->x
.bx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].VCLKData1
;
1306 pBiosArguments
->x
.cx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].VCLKData2
;
1309 pBiosArguments
->x
.bx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDS_Capability
;
1313 pBiosArguments
->x
.ax
= 0x0014;
1317 void XGI_XG21Fun14( PXGI_HW_DEVICE_INFO pXGIHWDE
, PX86_REGS pBiosArguments
)
1319 VB_DEVICE_INFO VBINF
;
1320 PVB_DEVICE_INFO pVBInfo
= &VBINF
;
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 ;
1334 InitTo330Pointer( pXGIHWDE
->jChipType
, pVBInfo
) ;
1335 ReadVBIOSTablData( pXGIHWDE
->jChipType
, pVBInfo
) ;
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 ;
1355 switch(pBiosArguments
->x
.ax
)
1358 XGI_XG21Fun14Sub70( pVBInfo
, pBiosArguments
) ;
1361 XGI_XG21Fun14Sub71( pVBInfo
, pBiosArguments
) ;
1364 XGI_XG21Fun14Sub72( pVBInfo
, pBiosArguments
) ;
1367 XGI_XG21Fun14Sub73( pVBInfo
, pBiosArguments
) ;