Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus
[sfrench/cifs-2.6.git] / drivers / staging / xgifb / vb_ext.c
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 }