6 #include <linux/version.h>
7 #include <linux/types.h>
8 #include <linux/delay.h> /* udelay */
10 /*#if LINUX_VERSxION_CODE >= KERNEL_VERSION(2,5,0)
11 #include <video/XGIfb.h>
13 #include <linux/XGIfb.h>
19 #include "vb_struct.h"
21 #include "vb_setmode.h"
27 #include "xf86PciInfo.h"
39 UCHAR XGINew_ChannelAB
,XGINew_DataBusWidth
;
41 USHORT XGINew_DRAMType
[17][5]={{0x0C,0x0A,0x02,0x40,0x39},{0x0D,0x0A,0x01,0x40,0x48},
42 {0x0C,0x09,0x02,0x20,0x35},{0x0D,0x09,0x01,0x20,0x44},
43 {0x0C,0x08,0x02,0x10,0x31},{0x0D,0x08,0x01,0x10,0x40},
44 {0x0C,0x0A,0x01,0x20,0x34},{0x0C,0x09,0x01,0x08,0x32},
45 {0x0B,0x08,0x02,0x08,0x21},{0x0C,0x08,0x01,0x08,0x30},
46 {0x0A,0x08,0x02,0x04,0x11},{0x0B,0x0A,0x01,0x10,0x28},
47 {0x09,0x08,0x02,0x02,0x01},{0x0B,0x09,0x01,0x08,0x24},
48 {0x0B,0x08,0x01,0x04,0x20},{0x0A,0x08,0x01,0x02,0x10},
49 {0x09,0x08,0x01,0x01,0x00}};
51 USHORT XGINew_SDRDRAM_TYPE
[13][5]=
68 USHORT XGINew_DDRDRAM_TYPE
[4][5]=
75 USHORT XGINew_DDRDRAM_TYPE340
[4][5]=
82 USHORT XGINew_DDRDRAM_TYPE20
[12][5]=
98 void XGINew_SetDRAMSize_340(PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO
);
99 void XGINew_SetDRAMSize_310(PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO
);
100 void XGINew_SetMemoryClock(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO
);
101 void XGINew_SetDRAMModeRegister(PVB_DEVICE_INFO
);
102 void XGINew_SetDRAMModeRegister340( PXGI_HW_DEVICE_INFO HwDeviceExtension
);
103 void XGINew_SetDRAMDefaultRegister340(PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG
, PVB_DEVICE_INFO
);
104 UCHAR
XGINew_GetXG20DRAMType( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
);
105 BOOLEAN
XGIInitNew( PXGI_HW_DEVICE_INFO HwDeviceExtension
) ;
107 int XGINew_DDRSizing340( PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO
);
108 void XGINew_DisableRefresh( PXGI_HW_DEVICE_INFO
,PVB_DEVICE_INFO
) ;
109 void XGINew_CheckBusWidth_310( PVB_DEVICE_INFO
) ;
110 int XGINew_SDRSizing(PVB_DEVICE_INFO
);
111 int XGINew_DDRSizing( PVB_DEVICE_INFO
);
112 void XGINew_EnableRefresh( PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO
);
113 int XGINew_RAMType
; /*int ModeIDOffset,StandTable,CRT1Table,ScreenOffset,REFIndex;*/
114 ULONG UNIROM
; /* UNIROM */
115 BOOLEAN
ChkLFB( PVB_DEVICE_INFO
);
116 void XGINew_Delay15us(ULONG
);
117 void SetPowerConsume (PXGI_HW_DEVICE_INFO HwDeviceExtension
,ULONG XGI_P3d4Port
);
118 void ReadVBIOSTablData( UCHAR ChipType
, PVB_DEVICE_INFO pVBInfo
);
119 void XGINew_DDR1x_MRS_XG20( ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
);
120 void XGINew_SetDRAMModeRegister_XG20( PXGI_HW_DEVICE_INFO HwDeviceExtension
);
121 void XGINew_SetDRAMModeRegister_XG27( PXGI_HW_DEVICE_INFO HwDeviceExtension
);
122 void XGINew_ChkSenseStatus ( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
) ;
123 void XGINew_SetModeScratch ( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
) ;
124 void XGINew_GetXG21Sense(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
) ;
125 UCHAR
GetXG21FPBits(PVB_DEVICE_INFO pVBInfo
);
126 void XGINew_GetXG27Sense(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
) ;
127 UCHAR
GetXG27FPBits(PVB_DEVICE_INFO pVBInfo
);
131 void DelayUS(ULONG MicroSeconds
)
133 udelay(MicroSeconds
);
137 /* --------------------------------------------------------------------- */
138 /* Function : XGIInitNew */
142 /* --------------------------------------------------------------------- */
143 BOOLEAN
XGIInitNew( PXGI_HW_DEVICE_INFO HwDeviceExtension
)
146 VB_DEVICE_INFO VBINF
;
147 PVB_DEVICE_INFO pVBInfo
= &VBINF
;
148 UCHAR i
, temp
= 0 , temp1
;
149 // VBIOSVersion[ 5 ] ;
150 PUCHAR
volatile pVideoMemory
;
158 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
160 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
162 pVBInfo
->BaseAddr
= (ULONG
)HwDeviceExtension
->pjIOAddress
;
164 pVideoMemory
= ( PUCHAR
)pVBInfo
->ROMAddr
;
167 // Newdebugcode( 0x99 ) ;
170 /* if ( pVBInfo->ROMAddr == 0 ) */
171 /* return( FALSE ) ; */
173 if ( pVBInfo
->FBAddr
== 0 )
175 printk("\n pVBInfo->FBAddr == 0 ");
179 if ( pVBInfo
->BaseAddr
== 0 )
181 printk("\npVBInfo->BaseAddr == 0 ");
186 XGINew_SetReg3( ( pVBInfo
->BaseAddr
+ 0x12 ) , 0x67 ) ; /* 3c2 <- 67 ,ynlai */
188 pVBInfo
->ISXPDOS
= 0 ;
191 if ( !HwDeviceExtension
->bIntegratedMMEnabled
)
193 return( FALSE
) ; /* alan */
197 // XGI_MemoryCopy( VBIOSVersion , HwDeviceExtension->szVBIOSVer , 4 ) ;
199 // VBIOSVersion[ 4 ] = 0x0 ;
201 /* 09/07/99 modify by domao */
203 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
204 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
205 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
206 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
207 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
208 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
209 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
210 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
211 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
212 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
213 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
214 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
215 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
216 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
217 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
218 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
219 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
222 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
223 XGI_GetVBType( pVBInfo
) ; /* Run XGI_GetVBType before InitTo330Pointer */
225 InitTo330Pointer( HwDeviceExtension
->jChipType
, pVBInfo
) ;
228 ReadVBIOSTablData( HwDeviceExtension
->jChipType
, pVBInfo
) ;
231 XGINew_SetReg1( pVBInfo
->P3c4
, 0x05 , 0x86 ) ;
234 /* GetXG21Sense (GPIO) */
235 if ( HwDeviceExtension
->jChipType
== XG21
)
237 XGINew_GetXG21Sense(HwDeviceExtension
, pVBInfo
) ;
239 if ( HwDeviceExtension
->jChipType
== XG27
)
241 XGINew_GetXG27Sense(HwDeviceExtension
, pVBInfo
) ;
245 /* 2.Reset Extended register */
247 for( i
= 0x06 ; i
< 0x20 ; i
++ )
248 XGINew_SetReg1( pVBInfo
->P3c4
, i
, 0 ) ;
250 for( i
= 0x21 ; i
<= 0x27 ; i
++ )
251 XGINew_SetReg1( pVBInfo
->P3c4
, i
, 0 ) ;
253 /* for( i = 0x06 ; i <= 0x27 ; i++ ) */
254 /* XGINew_SetReg1( pVBInfo->P3c4 , i , 0 ) ; */
258 if(( HwDeviceExtension
->jChipType
>= XG20
) || ( HwDeviceExtension
->jChipType
>= XG40
))
260 for( i
= 0x31 ; i
<= 0x3B ; i
++ )
261 XGINew_SetReg1( pVBInfo
->P3c4
, i
, 0 ) ;
265 for( i
= 0x31 ; i
<= 0x3D ; i
++ )
266 XGINew_SetReg1( pVBInfo
->P3c4
, i
, 0 ) ;
270 if ( HwDeviceExtension
->jChipType
== XG42
) /* [Hsuan] 2004/08/20 Auto over driver for XG42 */
271 XGINew_SetReg1( pVBInfo
->P3c4
, 0x3B , 0xC0 ) ;
273 /* for( i = 0x30 ; i <= 0x3F ; i++ ) */
274 /* XGINew_SetReg1( pVBInfo->P3d4 , i , 0 ) ; */
276 for( i
= 0x79 ; i
<= 0x7C ; i
++ )
277 XGINew_SetReg1( pVBInfo
->P3d4
, i
, 0 ) ; /* shampoo 0208 */
281 if ( HwDeviceExtension
->jChipType
>= XG20
)
282 XGINew_SetReg1( pVBInfo
->P3d4
, 0x97 , *pVBInfo
->pXGINew_CR97
) ;
286 if ( HwDeviceExtension->jChipType >= XG40 )
287 XGINew_RAMType = ( int )XGINew_GetXG20DRAMType( HwDeviceExtension , pVBInfo) ;
289 if ( HwDeviceExtension->jChipType < XG40 )
290 XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; */
294 /* 4.SetDefExt1Regs begin */
295 XGINew_SetReg1( pVBInfo
->P3c4
, 0x07 , *pVBInfo
->pSR07
) ;
296 if ( HwDeviceExtension
->jChipType
== XG27
)
298 XGINew_SetReg1( pVBInfo
->P3c4
, 0x40 , *pVBInfo
->pSR40
) ;
299 XGINew_SetReg1( pVBInfo
->P3c4
, 0x41 , *pVBInfo
->pSR41
) ;
301 XGINew_SetReg1( pVBInfo
->P3c4
, 0x11 , 0x0F ) ;
302 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1F , *pVBInfo
->pSR1F
) ;
303 /* XGINew_SetReg1( pVBInfo->P3c4 , 0x20 , 0x20 ) ; */
304 XGINew_SetReg1( pVBInfo
->P3c4
, 0x20 , 0xA0 ) ; /* alan, 2001/6/26 Frame buffer can read/write SR20 */
305 XGINew_SetReg1( pVBInfo
->P3c4
, 0x36 , 0x70 ) ; /* Hsuan, 2006/01/01 H/W request for slow corner chip */
306 if ( HwDeviceExtension
->jChipType
== XG27
) /* Alan 12/07/2006 */
307 XGINew_SetReg1( pVBInfo
->P3c4
, 0x36 , *pVBInfo
->pSR36
) ;
310 /* XGINew_SetReg1( pVBInfo->P3c4 , 0x11 , SR11 ) ; */
314 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
316 // /* Set AGP Rate */
317 // temp1 = XGINew_GetReg1( pVBInfo->P3c4 , 0x3B ) ;
319 // if ( temp1 == 0x02 )
321 // XGINew_SetReg4( 0xcf8 , 0x80000000 ) ;
322 // ChipsetID = XGINew_GetReg3( 0x0cfc ) ;
323 // XGINew_SetReg4( 0xcf8 , 0x8000002C ) ;
324 // VendorID = XGINew_GetReg3( 0x0cfc ) ;
325 // VendorID &= 0x0000FFFF ;
326 // XGINew_SetReg4( 0xcf8 , 0x8001002C ) ;
327 // GraphicVendorID = XGINew_GetReg3( 0x0cfc ) ;
328 // GraphicVendorID &= 0x0000FFFF;
330 // if ( ChipsetID == 0x7301039 )
331 /// XGINew_SetReg1( pVBInfo->P3d4 , 0x5F , 0x09 ) ;
333 // ChipsetID &= 0x0000FFFF ;
335 // if ( ( ChipsetID == 0x700E ) || ( ChipsetID == 0x1022 ) || ( ChipsetID == 0x1106 ) || ( ChipsetID == 0x10DE ) )
337 // if ( ChipsetID == 0x1106 )
339 // if ( ( VendorID == 0x1019 ) && ( GraphicVendorID == 0x1019 ) )
340 // XGINew_SetReg1( pVBInfo->P3d4 , 0x5F , 0x0D ) ;
342 // XGINew_SetReg1( pVBInfo->P3d4 , 0x5F , 0x0B ) ;
345 // XGINew_SetReg1( pVBInfo->P3d4 , 0x5F , 0x0B ) ;
351 if ( HwDeviceExtension
->jChipType
>= XG40
)
353 /* Set AGP customize registers (in SetDefAGPRegs) Start */
354 for( i
= 0x47 ; i
<= 0x4C ; i
++ )
355 XGINew_SetReg1( pVBInfo
->P3d4
, i
, pVBInfo
->AGPReg
[ i
- 0x47 ] ) ;
357 for( i
= 0x70 ; i
<= 0x71 ; i
++ )
358 XGINew_SetReg1( pVBInfo
->P3d4
, i
, pVBInfo
->AGPReg
[ 6 + i
- 0x70 ] ) ;
360 for( i
= 0x74 ; i
<= 0x77 ; i
++ )
361 XGINew_SetReg1( pVBInfo
->P3d4
, i
, pVBInfo
->AGPReg
[ 8 + i
- 0x74 ] ) ;
362 /* Set AGP customize registers (in SetDefAGPRegs) End */
363 /*[Hsuan]2004/12/14 AGP Input Delay Adjustment on 850 */
364 // XGINew_SetReg4( 0xcf8 , 0x80000000 ) ;
365 // ChipsetID = XGINew_GetReg3( 0x0cfc ) ;
366 // if ( ChipsetID == 0x25308086 )
367 // XGINew_SetReg1( pVBInfo->P3d4 , 0x77 , 0xF0 ) ;
369 HwDeviceExtension
->pQueryVGAConfigSpace( HwDeviceExtension
, 0x50 , 0 , &Temp
) ; /* Get */
374 XGINew_SetReg1( pVBInfo
->P3d4
, 0x48 , 0x20 ) ; /* CR48 */
378 if ( HwDeviceExtension
->jChipType
< XG40
)
379 XGINew_SetReg1( pVBInfo
->P3d4
, 0x49 , pVBInfo
->CR49
[ 0 ] ) ;
383 XGINew_SetReg1( pVBInfo
->P3c4
, 0x23 , *pVBInfo
->pSR23
) ;
384 XGINew_SetReg1( pVBInfo
->P3c4
, 0x24 , *pVBInfo
->pSR24
) ;
385 XGINew_SetReg1( pVBInfo
->P3c4
, 0x25 , pVBInfo
->SR25
[ 0 ] ) ;
388 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
391 XGI_UnLockCRT2( HwDeviceExtension
, pVBInfo
) ;
392 XGINew_SetRegANDOR( pVBInfo
->Part0Port
, 0x3F , 0xEF , 0x00 ) ; /* alan, disable VideoCapture */
393 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x00 , 0x00 ) ;
394 temp1
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x7B ) ; /* chk if BCLK>=100MHz */
395 temp
= ( UCHAR
)( ( temp1
>> 4 ) & 0x0F ) ;
398 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x02 , ( *pVBInfo
->pCRT2Data_1_2
) ) ;
402 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x2E , 0x08 ) ; /* use VB */
406 XGINew_SetReg1( pVBInfo
->P3c4
, 0x27 , 0x1F ) ;
408 if ( ( HwDeviceExtension
->jChipType
== XG42
) && XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) != 0 ) /* Not DDR */
410 XGINew_SetReg1( pVBInfo
->P3c4
, 0x31 , ( *pVBInfo
->pSR31
& 0x3F ) | 0x40 ) ;
411 XGINew_SetReg1( pVBInfo
->P3c4
, 0x32 , ( *pVBInfo
->pSR32
& 0xFC ) | 0x01 ) ;
415 XGINew_SetReg1( pVBInfo
->P3c4
, 0x31 , *pVBInfo
->pSR31
) ;
416 XGINew_SetReg1( pVBInfo
->P3c4
, 0x32 , *pVBInfo
->pSR32
) ;
418 XGINew_SetReg1( pVBInfo
->P3c4
, 0x33 , *pVBInfo
->pSR33
) ;
422 if ( HwDeviceExtension->jChipType >= XG40 )
423 SetPowerConsume ( HwDeviceExtension , pVBInfo->P3c4); */
425 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
427 if ( XGI_BridgeIsOn( pVBInfo
) == 1 )
429 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
431 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x00 , 0x1C ) ;
432 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x0D , *pVBInfo
->pCRT2Data_4_D
) ;
433 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x0E , *pVBInfo
->pCRT2Data_4_E
) ;
434 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x10 , *pVBInfo
->pCRT2Data_4_10
) ;
435 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x0F , 0x3F ) ;
438 XGI_LockCRT2( HwDeviceExtension
, pVBInfo
) ;
443 if ( HwDeviceExtension
->jChipType
< XG40
)
444 XGINew_SetReg1( pVBInfo
->P3d4
, 0x83 , 0x00 ) ;
447 if ( HwDeviceExtension
->bSkipSense
== FALSE
)
451 XGI_SenseCRT1(pVBInfo
) ;
454 /* XGINew_DetectMonitor( HwDeviceExtension ) ; */
455 pVBInfo
->IF_DEF_CH7007
= 0;
456 if ( ( HwDeviceExtension
->jChipType
== XG21
) && (pVBInfo
->IF_DEF_CH7007
) )
459 XGI_GetSenseStatus( HwDeviceExtension
, pVBInfo
) ; /* sense CRT2 */
463 if ( HwDeviceExtension
->jChipType
== XG21
)
467 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , ~Monitor1Sense
, Monitor1Sense
) ; /* Z9 default has CRT */
468 temp
= GetXG21FPBits( pVBInfo
) ;
469 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x37 , ~0x01, temp
) ;
473 if ( HwDeviceExtension
->jChipType
== XG27
)
475 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , ~Monitor1Sense
, Monitor1Sense
) ; /* Z9 default has CRT */
476 temp
= GetXG27FPBits( pVBInfo
) ;
477 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x37 , ~0x03, temp
) ;
482 if ( HwDeviceExtension
->jChipType
>= XG40
)
484 if ( HwDeviceExtension
->jChipType
>= XG40
)
486 XGINew_RAMType
= ( int )XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
489 XGINew_SetDRAMDefaultRegister340( HwDeviceExtension
, pVBInfo
->P3d4
, pVBInfo
) ;
491 if ( HwDeviceExtension
->bSkipDramSizing
== TRUE
)
493 pSR
= HwDeviceExtension
->pSR
;
496 while( pSR
->jIdx
!= 0xFF )
498 XGINew_SetReg1( pVBInfo
->P3c4
, pSR
->jIdx
, pSR
->jVal
) ;
502 /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */
503 } /* SkipDramSizing */
507 if ( HwDeviceExtension
->jChipType
== XG20
)
509 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , pVBInfo
->SR15
[0][XGINew_RAMType
] ) ;
510 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , pVBInfo
->SR15
[1][XGINew_RAMType
] ) ;
511 XGINew_SetReg1( pVBInfo
->P3c4
, 0x20 , 0x20 ) ;
518 XGINew_SetDRAMSize_340( HwDeviceExtension
, pVBInfo
) ;
528 /* SetDefExt2Regs begin */
531 temp =( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x3A ) ;
537 *pVBInfo->pSR21 &= 0xEF ;
539 XGINew_SetReg1( pVBInfo->P3c4 , 0x21 , *pVBInfo->pSR21 ) ;
541 *pVBInfo->pSR22 &= 0x20 ;
542 XGINew_SetReg1( pVBInfo->P3c4 , 0x22 , *pVBInfo->pSR22 ) ;
545 // base = 0x80000000 ;
546 // OutPortLong( 0xcf8 , base ) ;
547 // Temp = ( InPortLong( 0xcfc ) & 0xFFFF ) ;
548 // if ( Temp == 0x1039 )
550 XGINew_SetReg1( pVBInfo
->P3c4
, 0x22 , ( UCHAR
)( ( *pVBInfo
->pSR22
) & 0xFE ) ) ;
554 // XGINew_SetReg1( pVBInfo->P3c4 , 0x22 , *pVBInfo->pSR22 ) ;
557 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , *pVBInfo
->pSR21
) ;
562 XGINew_ChkSenseStatus ( HwDeviceExtension
, pVBInfo
) ;
563 XGINew_SetModeScratch ( HwDeviceExtension
, pVBInfo
) ;
568 XGINew_SetReg1( pVBInfo
->P3d4
, 0x8c , 0x87);
569 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x31);
579 /* ============== alan ====================== */
581 /* --------------------------------------------------------------------- */
582 /* Function : XGINew_GetXG20DRAMType */
586 /* --------------------------------------------------------------------- */
587 UCHAR
XGINew_GetXG20DRAMType( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
591 if ( HwDeviceExtension
->jChipType
< XG20
)
593 if ( *pVBInfo
->pSoftSetting
& SoftDRAMType
)
595 data
= *pVBInfo
->pSoftSetting
& 0x07 ;
600 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x39 ) & 0x02 ;
603 data
= ( XGINew_GetReg1( pVBInfo
->P3c4
, 0x3A ) & 0x02 ) >> 1 ;
608 else if ( HwDeviceExtension
->jChipType
== XG27
)
610 if ( *pVBInfo
->pSoftSetting
& SoftDRAMType
)
612 data
= *pVBInfo
->pSoftSetting
& 0x07 ;
615 temp
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3B ) ;
617 if (( temp
& 0x88 )==0x80) /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
623 else if ( HwDeviceExtension
->jChipType
== XG21
)
625 XGINew_SetRegAND( pVBInfo
->P3d4
, 0xB4 , ~0x02 ) ; /* Independent GPIO control */
627 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x4A , 0x80 ) ; /* Enable GPIOH read */
628 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) ; /* GPIOF 0:DVI 1:DVO */
630 // for current XG20 & XG21, GPIOH is floating, driver will fix DDR temporarily
631 if ( temp
& 0x01 ) /* DVI read GPIOH */
636 XGINew_SetRegOR( pVBInfo
->P3d4
, 0xB4 , 0x02 ) ;
641 data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x97 ) & 0x01 ;
651 /* --------------------------------------------------------------------- */
652 /* Function : XGINew_Get310DRAMType */
656 /* --------------------------------------------------------------------- */
657 UCHAR
XGINew_Get310DRAMType(PVB_DEVICE_INFO pVBInfo
)
661 /* index = XGINew_GetReg1( pVBInfo->P3c4 , 0x1A ) ; */
664 if ( *pVBInfo
->pSoftSetting
& SoftDRAMType
)
665 data
= *pVBInfo
->pSoftSetting
& 0x03 ;
667 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3a ) & 0x03 ;
674 /* --------------------------------------------------------------------- */
675 /* Function : XGINew_Delay15us */
679 /* --------------------------------------------------------------------- */
681 void XGINew_Delay15us(ULONG ulMicrsoSec)
687 /* --------------------------------------------------------------------- */
688 /* Function : XGINew_SDR_MRS */
692 /* --------------------------------------------------------------------- */
693 void XGINew_SDR_MRS( PVB_DEVICE_INFO pVBInfo
)
697 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x16 ) ;
698 data
&= 0x3F ; /* SR16 D7=0,D6=0 */
699 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ; /* enable mode register set(MRS) low */
700 /* XGINew_Delay15us( 0x100 ) ; */
701 data
|= 0x80 ; /* SR16 D7=1,D6=0 */
702 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ; /* enable mode register set(MRS) high */
703 /* XGINew_Delay15us( 0x100 ) ; */
707 /* --------------------------------------------------------------------- */
708 /* Function : XGINew_DDR1x_MRS_340 */
712 /* --------------------------------------------------------------------- */
713 void XGINew_DDR1x_MRS_340( ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
)
715 XGINew_SetReg1( P3c4
, 0x18 , 0x01 ) ;
716 XGINew_SetReg1( P3c4
, 0x19 , 0x20 ) ;
717 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
718 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
720 if ( *pVBInfo
->pXGINew_DRAMTypeDefinition
!= 0x0C ) /* Samsung F Die */
722 DelayUS( 3000 ) ; /* Delay 67 x 3 Delay15us */
723 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ;
724 XGINew_SetReg1( P3c4
, 0x19 , 0x20 ) ;
725 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
726 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
730 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
731 XGINew_SetReg1( P3c4
, 0x19 , 0x01 ) ;
732 XGINew_SetReg1( P3c4
, 0x16 , pVBInfo
->SR16
[ 0 ] ) ;
733 XGINew_SetReg1( P3c4
, 0x16 , pVBInfo
->SR16
[ 1 ] ) ;
735 XGINew_SetReg1( P3c4
, 0x1B , 0x03 ) ;
737 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
738 XGINew_SetReg1( P3c4
, 0x19 , 0x00 ) ;
739 XGINew_SetReg1( P3c4
, 0x16 , pVBInfo
->SR16
[ 2 ] ) ;
740 XGINew_SetReg1( P3c4
, 0x16 , pVBInfo
->SR16
[ 3 ] ) ;
741 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ;
745 /* --------------------------------------------------------------------- */
746 /* Function : XGINew_DDR2x_MRS_340 */
750 /* --------------------------------------------------------------------- */
751 void XGINew_DDR2x_MRS_340( ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
)
753 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ;
754 XGINew_SetReg1( P3c4
, 0x19 , 0x20 ) ;
755 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
756 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
758 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
759 /* XGINew_SetReg1( P3c4 , 0x18 , 0x31 ) ; */
760 XGINew_SetReg1( P3c4
, 0x19 , 0x01 ) ;
761 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
762 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
764 XGINew_SetReg1( P3c4
, 0x1B , 0x03 ) ;
766 /* XGINew_SetReg1( P3c4 , 0x18 , 0x31 ) ; */
767 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
768 XGINew_SetReg1( P3c4
, 0x19 , 0x00 ) ;
769 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
770 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
771 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ;
774 /* --------------------------------------------------------------------- */
775 /* Function : XGINew_DDRII_Bootup_XG27 */
779 /* --------------------------------------------------------------------- */
780 void XGINew_DDRII_Bootup_XG27( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
)
782 ULONG P3d4
= P3c4
+ 0x10 ;
783 XGINew_RAMType
= ( int )XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
784 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
786 /* Set Double Frequency */
787 /* XGINew_SetReg1( P3d4 , 0x97 , 0x11 ) ; */ /* CR97 */
788 XGINew_SetReg1( P3d4
, 0x97 , *pVBInfo
->pXGINew_CR97
) ; /* CR97 */
792 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* Set SR18 */ //EMRS2
793 XGINew_SetReg1( P3c4
, 0x19 , 0x80 ) ; /* Set SR19 */
794 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
796 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
799 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* Set SR18 */ //EMRS3
800 XGINew_SetReg1( P3c4
, 0x19 , 0xC0 ) ; /* Set SR19 */
801 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
803 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
806 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* Set SR18 */ //EMRS1
807 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ; /* Set SR19 */
808 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
810 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
813 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* Set SR18 */ //MRS, DLL Enable
814 XGINew_SetReg1( P3c4
, 0x19 , 0x0A ) ; /* Set SR19 */
815 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ; /* Set SR16 */
817 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ; /* Set SR16 */
818 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ; /* Set SR16 */
819 /* DelayUS( 15 ) ; */
821 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* Set SR1B */
823 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ; /* Set SR1B */
825 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* Set SR18 */ //MRS, DLL Reset
826 XGINew_SetReg1( P3c4
, 0x19 , 0x08 ) ; /* Set SR19 */
827 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ; /* Set SR16 */
830 XGINew_SetReg1( P3c4
, 0x16 , 0x83 ) ; /* Set SR16 */
833 XGINew_SetReg1( P3c4
, 0x18 , 0x80 ) ; /* Set SR18 */ //MRS, ODT
834 XGINew_SetReg1( P3c4
, 0x19 , 0x46 ) ; /* Set SR19 */
835 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
837 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
840 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* Set SR18 */ //EMRS
841 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ; /* Set SR19 */
842 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
844 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
847 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* Set SR1B refresh control 000:close; 010:open */
852 /* --------------------------------------------------------------------- */
853 /* Function : XGINew_DDR2_MRS_XG20 */
857 /* --------------------------------------------------------------------- */
858 void XGINew_DDR2_MRS_XG20( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
)
860 ULONG P3d4
= P3c4
+ 0x10 ;
862 XGINew_RAMType
= ( int )XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
863 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
865 XGINew_SetReg1( P3d4
, 0x97 , 0x11 ) ; /* CR97 */
868 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS2 */
869 XGINew_SetReg1( P3c4
, 0x19 , 0x80 ) ;
870 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
871 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
873 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS3 */
874 XGINew_SetReg1( P3c4
, 0x19 , 0xC0 ) ;
875 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
876 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
878 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS1 */
879 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ;
880 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
881 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
883 // XGINew_SetReg1( P3c4 , 0x18 , 0x52 ) ; /* MRS1 */
884 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* MRS1 */
885 XGINew_SetReg1( P3c4
, 0x19 , 0x02 ) ;
886 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
887 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
890 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* SR1B */
892 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ; /* SR1B */
895 //XGINew_SetReg1( P3c4 , 0x18 , 0x52 ) ; /* MRS2 */
896 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* MRS1 */
897 XGINew_SetReg1( P3c4
, 0x19 , 0x00 ) ;
898 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
899 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
904 /* --------------------------------------------------------------------- */
905 /* Function : XGINew_DDR2_MRS_XG20 */
909 /* --------------------------------------------------------------------- */
910 void XGINew_DDR2_MRS_XG27( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
)
912 ULONG P3d4
= P3c4
+ 0x10 ;
914 XGINew_RAMType
= ( int )XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
915 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
917 XGINew_SetReg1( P3d4
, 0x97 , 0x11 ) ; /* CR97 */
919 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS2 */
920 XGINew_SetReg1( P3c4
, 0x19 , 0x80 ) ;
922 XGINew_SetReg1( P3c4
, 0x16 , 0x10 ) ;
923 DelayUS( 15 ) ; ////06/11/23 XG27 A0 for CKE enable
924 XGINew_SetReg1( P3c4
, 0x16 , 0x90 ) ;
926 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS3 */
927 XGINew_SetReg1( P3c4
, 0x19 , 0xC0 ) ;
929 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
930 DelayUS( 15 ) ; ////06/11/22 XG27 A0
931 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
934 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS1 */
935 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ;
937 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
938 DelayUS( 15 ) ; ////06/11/22 XG27 A0
939 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
941 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* MRS1 */
942 XGINew_SetReg1( P3c4
, 0x19 , 0x06 ) ; ////[Billy]06/11/22 DLL Reset for XG27 Hynix DRAM
944 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
945 DelayUS( 15 ) ; ////06/11/23 XG27 A0
946 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
948 DelayUS( 30 ) ; ////06/11/23 XG27 A0 Start Auto-PreCharge
949 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* SR1B */
951 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ; /* SR1B */
954 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* MRS1 */
955 XGINew_SetReg1( P3c4
, 0x19 , 0x04 ) ; //// DLL without Reset for XG27 Hynix DRAM
957 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
959 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
961 XGINew_SetReg1( P3c4
, 0x18 , 0x80 ); ////XG27 OCD ON
962 XGINew_SetReg1( P3c4
, 0x19 , 0x46 );
964 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
966 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
968 XGINew_SetReg1( P3c4
, 0x18 , 0x00 );
969 XGINew_SetReg1( P3c4
, 0x19 , 0x40 );
971 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
973 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
975 DelayUS( 15 ) ; ////Start Auto-PreCharge
976 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* SR1B */
978 XGINew_SetReg1( P3c4
, 0x1B , 0x03 ) ; /* SR1B */
982 /* --------------------------------------------------------------------- */
983 /* Function : XGINew_DDR1x_DefaultRegister */
987 /* --------------------------------------------------------------------- */
988 void XGINew_DDR1x_DefaultRegister( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG Port
, PVB_DEVICE_INFO pVBInfo
)
993 if ( HwDeviceExtension
->jChipType
>= XG20
)
995 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
996 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
997 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
998 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ; /* CR86 */
1000 XGINew_SetReg1( P3d4
, 0x98 , 0x01 ) ;
1001 XGINew_SetReg1( P3d4
, 0x9A , 0x02 ) ;
1003 XGINew_DDR1x_MRS_XG20( P3c4
, pVBInfo
) ;
1007 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
1009 switch( HwDeviceExtension
->jChipType
)
1013 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1014 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
1015 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ; /* CR86 */
1018 XGINew_SetReg1( P3d4
, 0x82 , 0x88 ) ;
1019 XGINew_SetReg1( P3d4
, 0x86 , 0x00 ) ;
1020 XGINew_GetReg1( P3d4
, 0x86 ) ; /* Insert read command for delay */
1021 XGINew_SetReg1( P3d4
, 0x86 , 0x88 ) ;
1022 XGINew_GetReg1( P3d4
, 0x86 ) ;
1023 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ;
1024 XGINew_SetReg1( P3d4
, 0x82 , 0x77 ) ;
1025 XGINew_SetReg1( P3d4
, 0x85 , 0x00 ) ;
1026 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1027 XGINew_SetReg1( P3d4
, 0x85 , 0x88 ) ;
1028 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1029 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
1030 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1034 XGINew_SetReg1( P3d4
, 0x97 , 0x00 ) ;
1035 XGINew_SetReg1( P3d4
, 0x98 , 0x01 ) ;
1036 XGINew_SetReg1( P3d4
, 0x9A , 0x02 ) ;
1037 XGINew_DDR1x_MRS_340( P3c4
, pVBInfo
) ;
1042 /* --------------------------------------------------------------------- */
1043 /* Function : XGINew_DDR2x_DefaultRegister */
1047 /* --------------------------------------------------------------------- */
1048 void XGINew_DDR2x_DefaultRegister( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG Port
,PVB_DEVICE_INFO pVBInfo
)
1051 P3c4
= Port
- 0x10 ;
1053 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
1055 /* 20040906 Hsuan modify CR82, CR85, CR86 for XG42 */
1056 switch( HwDeviceExtension
->jChipType
)
1060 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1061 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
1062 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ; /* CR86 */
1065 /* keep following setting sequence, each setting in the same reg insert idle */
1066 XGINew_SetReg1( P3d4
, 0x82 , 0x88 ) ;
1067 XGINew_SetReg1( P3d4
, 0x86 , 0x00 ) ;
1068 XGINew_GetReg1( P3d4
, 0x86 ) ; /* Insert read command for delay */
1069 XGINew_SetReg1( P3d4
, 0x86 , 0x88 ) ;
1070 XGINew_SetReg1( P3d4
, 0x82 , 0x77 ) ;
1071 XGINew_SetReg1( P3d4
, 0x85 , 0x00 ) ;
1072 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1073 XGINew_SetReg1( P3d4
, 0x85 , 0x88 ) ;
1074 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1075 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
1076 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1078 XGINew_SetReg1( P3d4
, 0x97 , 0x11 ) ;
1079 if ( HwDeviceExtension
->jChipType
== XG42
)
1081 XGINew_SetReg1( P3d4
, 0x98 , 0x01 ) ;
1085 XGINew_SetReg1( P3d4
, 0x98 , 0x03 ) ;
1087 XGINew_SetReg1( P3d4
, 0x9A , 0x02 ) ;
1089 XGINew_DDR2x_MRS_340( P3c4
, pVBInfo
) ;
1093 /* --------------------------------------------------------------------- */
1094 /* Function : XGINew_DDR2_DefaultRegister */
1098 /* --------------------------------------------------------------------- */
1099 void XGINew_DDR2_DefaultRegister( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG Port
, PVB_DEVICE_INFO pVBInfo
)
1102 P3c4
= Port
- 0x10 ;
1104 /* keep following setting sequence, each setting in the same reg insert idle */
1105 XGINew_SetReg1( P3d4
, 0x82 , 0x77 ) ;
1106 XGINew_SetReg1( P3d4
, 0x86 , 0x00 ) ;
1107 XGINew_GetReg1( P3d4
, 0x86 ) ; /* Insert read command for delay */
1108 XGINew_SetReg1( P3d4
, 0x86 , 0x88 ) ;
1109 XGINew_GetReg1( P3d4
, 0x86 ) ; /* Insert read command for delay */
1110 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ; /* CR86 */
1111 XGINew_SetReg1( P3d4
, 0x82 , 0x77 ) ;
1112 XGINew_SetReg1( P3d4
, 0x85 , 0x00 ) ;
1113 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1114 XGINew_SetReg1( P3d4
, 0x85 , 0x88 ) ;
1115 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1116 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
1117 if ( HwDeviceExtension
->jChipType
== XG27
)
1118 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1120 XGINew_SetReg1( P3d4
, 0x82 , 0xA8 ) ; /* CR82 */
1122 XGINew_SetReg1( P3d4
, 0x98 , 0x01 ) ;
1123 XGINew_SetReg1( P3d4
, 0x9A , 0x02 ) ;
1124 if ( HwDeviceExtension
->jChipType
== XG27
)
1125 XGINew_DDRII_Bootup_XG27( HwDeviceExtension
, P3c4
, pVBInfo
) ;
1127 XGINew_DDR2_MRS_XG20( HwDeviceExtension
, P3c4
, pVBInfo
) ;
1131 /* --------------------------------------------------------------------- */
1132 /* Function : XGINew_SetDRAMDefaultRegister340 */
1136 /* --------------------------------------------------------------------- */
1137 void XGINew_SetDRAMDefaultRegister340( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG Port
, PVB_DEVICE_INFO pVBInfo
)
1139 UCHAR temp
, temp1
, temp2
, temp3
,
1143 P3c4
= Port
- 0x10 ;
1145 XGINew_SetReg1( P3d4
, 0x6D , pVBInfo
->CR40
[ 8 ][ XGINew_RAMType
] ) ;
1146 XGINew_SetReg1( P3d4
, 0x68 , pVBInfo
->CR40
[ 5 ][ XGINew_RAMType
] ) ;
1147 XGINew_SetReg1( P3d4
, 0x69 , pVBInfo
->CR40
[ 6 ][ XGINew_RAMType
] ) ;
1148 XGINew_SetReg1( P3d4
, 0x6A , pVBInfo
->CR40
[ 7 ][ XGINew_RAMType
] ) ;
1151 for( i
= 0 ; i
< 4 ; i
++ )
1153 temp
= pVBInfo
->CR6B
[ XGINew_RAMType
][ i
] ; /* CR6B DQS fine tune delay */
1154 for( j
= 0 ; j
< 4 ; j
++ )
1156 temp1
= ( ( temp
>> ( 2 * j
) ) & 0x03 ) << 2 ;
1158 XGINew_SetReg1( P3d4
, 0x6B , temp2
) ;
1159 XGINew_GetReg1( P3d4
, 0x6B ) ; /* Insert read command for delay */
1166 for( i
= 0 ; i
< 4 ; i
++ )
1168 temp
= pVBInfo
->CR6E
[ XGINew_RAMType
][ i
] ; /* CR6E DQM fine tune delay */
1169 for( j
= 0 ; j
< 4 ; j
++ )
1171 temp1
= ( ( temp
>> ( 2 * j
) ) & 0x03 ) << 2 ;
1173 XGINew_SetReg1( P3d4
, 0x6E , temp2
) ;
1174 XGINew_GetReg1( P3d4
, 0x6E ) ; /* Insert read command for delay */
1181 for( k
= 0 ; k
< 4 ; k
++ )
1183 XGINew_SetRegANDOR( P3d4
, 0x6E , 0xFC , temp3
) ; /* CR6E_D[1:0] select channel */
1185 for( i
= 0 ; i
< 8 ; i
++ )
1187 temp
= pVBInfo
->CR6F
[ XGINew_RAMType
][ 8 * k
+ i
] ; /* CR6F DQ fine tune delay */
1188 for( j
= 0 ; j
< 4 ; j
++ )
1190 temp1
= ( temp
>> ( 2 * j
) ) & 0x03 ;
1192 XGINew_SetReg1( P3d4
, 0x6F , temp2
) ;
1193 XGINew_GetReg1( P3d4
, 0x6F ) ; /* Insert read command for delay */
1201 XGINew_SetReg1( P3d4
, 0x80 , pVBInfo
->CR40
[ 9 ][ XGINew_RAMType
] ) ; /* CR80 */
1202 XGINew_SetReg1( P3d4
, 0x81 , pVBInfo
->CR40
[ 10 ][ XGINew_RAMType
] ) ; /* CR81 */
1205 temp
= pVBInfo
->CR89
[ XGINew_RAMType
][ 0 ] ; /* CR89 terminator type select */
1206 for( j
= 0 ; j
< 4 ; j
++ )
1208 temp1
= ( temp
>> ( 2 * j
) ) & 0x03 ;
1210 XGINew_SetReg1( P3d4
, 0x89 , temp2
) ;
1211 XGINew_GetReg1( P3d4
, 0x89 ) ; /* Insert read command for delay */
1216 temp
= pVBInfo
->CR89
[ XGINew_RAMType
][ 1 ] ;
1217 temp1
= temp
& 0x03 ;
1219 XGINew_SetReg1( P3d4
, 0x89 , temp2
) ;
1221 temp
= pVBInfo
->CR40
[ 3 ][ XGINew_RAMType
] ;
1222 temp1
= temp
& 0x0F ;
1223 temp2
= ( temp
>> 4 ) & 0x07 ;
1224 temp3
= temp
& 0x80 ;
1225 XGINew_SetReg1( P3d4
, 0x45 , temp1
) ; /* CR45 */
1226 XGINew_SetReg1( P3d4
, 0x99 , temp2
) ; /* CR99 */
1227 XGINew_SetRegOR( P3d4
, 0x40 , temp3
) ; /* CR40_D[7] */
1228 XGINew_SetReg1( P3d4
, 0x41 , pVBInfo
->CR40
[ 0 ][ XGINew_RAMType
] ) ; /* CR41 */
1230 if ( HwDeviceExtension
->jChipType
== XG27
)
1231 XGINew_SetReg1( P3d4
, 0x8F , *pVBInfo
->pCR8F
) ; /* CR8F */
1233 for( j
= 0 ; j
<= 6 ; j
++ )
1234 XGINew_SetReg1( P3d4
, ( 0x90 + j
) , pVBInfo
->CR40
[ 14 + j
][ XGINew_RAMType
] ) ; /* CR90 - CR96 */
1236 for( j
= 0 ; j
<= 2 ; j
++ )
1237 XGINew_SetReg1( P3d4
, ( 0xC3 + j
) , pVBInfo
->CR40
[ 21 + j
][ XGINew_RAMType
] ) ; /* CRC3 - CRC5 */
1239 for( j
= 0 ; j
< 2 ; j
++ )
1240 XGINew_SetReg1( P3d4
, ( 0x8A + j
) , pVBInfo
->CR40
[ 1 + j
][ XGINew_RAMType
] ) ; /* CR8A - CR8B */
1242 if ( ( HwDeviceExtension
->jChipType
== XG41
) || ( HwDeviceExtension
->jChipType
== XG42
) )
1243 XGINew_SetReg1( P3d4
, 0x8C , 0x87 ) ;
1245 XGINew_SetReg1( P3d4
, 0x59 , pVBInfo
->CR40
[ 4 ][ XGINew_RAMType
] ) ; /* CR59 */
1247 XGINew_SetReg1( P3d4
, 0x83 , 0x09 ) ; /* CR83 */
1248 XGINew_SetReg1( P3d4
, 0x87 , 0x00 ) ; /* CR87 */
1249 XGINew_SetReg1( P3d4
, 0xCF , *pVBInfo
->pCRCF
) ; /* CRCF */
1250 if ( XGINew_RAMType
)
1252 //XGINew_SetReg1( P3c4 , 0x17 , 0xC0 ) ; /* SR17 DDRII */
1253 XGINew_SetReg1( P3c4
, 0x17 , 0x80 ) ; /* SR17 DDRII */
1254 if ( HwDeviceExtension
->jChipType
== XG27
)
1255 XGINew_SetReg1( P3c4
, 0x17 , 0x02 ) ; /* SR17 DDRII */
1259 XGINew_SetReg1( P3c4
, 0x17 , 0x00 ) ; /* SR17 DDR */
1260 XGINew_SetReg1( P3c4
, 0x1A , 0x87 ) ; /* SR1A */
1262 temp
= XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
1264 XGINew_DDR1x_DefaultRegister( HwDeviceExtension
, P3d4
, pVBInfo
) ;
1267 XGINew_SetReg1( P3d4
, 0xB0 , 0x80 ) ; /* DDRII Dual frequency mode */
1268 XGINew_DDR2_DefaultRegister( HwDeviceExtension
, P3d4
, pVBInfo
) ;
1270 XGINew_SetReg1( P3c4
, 0x1B , pVBInfo
->SR15
[ 3 ][ XGINew_RAMType
] ) ; /* SR1B */
1274 /* --------------------------------------------------------------------- */
1275 /* Function : XGINew_DDR_MRS */
1279 /* --------------------------------------------------------------------- */
1280 void XGINew_DDR_MRS(PVB_DEVICE_INFO pVBInfo
)
1284 PUCHAR
volatile pVideoMemory
= ( PUCHAR
)pVBInfo
->ROMAddr
;
1286 /* SR16 <- 1F,DF,2F,AF */
1287 /* yriver modified SR16 <- 0F,DF,0F,AF */
1288 /* enable DLL of DDR SD/SGRAM , SR16 D4=1 */
1289 data
= pVideoMemory
[ 0xFB ] ;
1290 /* data = XGINew_GetReg1( pVBInfo->P3c4 , 0x16 ) ; */
1293 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1295 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1297 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1299 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1301 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1303 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1305 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1307 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1312 XGINew_SetReg1(pVBInfo->P3c4,0x16,data);
1314 if (!(pVBInfo->SR15[1][XGINew_RAMType] & 0x10))
1320 XGINew_SetReg1(pVBInfo->P3c4,0x16,data);
1325 XGINew_SetReg1(pVBInfo->P3c4,0x16,data);
1326 if (!(pVBInfo->SR15[1][XGINew_RAMType] & 0x10))
1332 XGINew_SetReg1(pVBInfo->P3c4,0x16,data);
1338 /* check if read cache pointer is correct */
1342 /* --------------------------------------------------------------------- */
1343 /* Function : XGINew_VerifyMclk */
1347 /* --------------------------------------------------------------------- */
1348 void XGINew_VerifyMclk( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
1350 PUCHAR pVideoMemory
= pVBInfo
->FBAddr
;
1352 USHORT Temp
, SR21
;
1354 pVideoMemory
[ 0 ] = 0xaa ; /* alan */
1355 pVideoMemory
[ 16 ] = 0x55 ; /* note: PCI read cache is off */
1357 if ( ( pVideoMemory
[ 0 ] != 0xaa ) || ( pVideoMemory
[ 16 ] != 0x55 ) )
1359 for( i
= 0 , j
= 16 ; i
< 2 ; i
++ , j
+= 16 )
1361 SR21
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x21 ) ;
1362 Temp
= SR21
& 0xFB ; /* disable PCI post write buffer empty gating */
1363 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , Temp
) ;
1365 Temp
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3C ) ;
1366 Temp
|= 0x01 ; /* MCLK reset */
1369 Temp
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3C ) ;
1370 Temp
&= 0xFE ; /* MCLK normal operation */
1372 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , SR21
) ;
1374 pVideoMemory
[ 16 + j
] = j
;
1375 if ( pVideoMemory
[ 16 + j
] == j
)
1377 pVideoMemory
[ j
] = j
;
1388 /* --------------------------------------------------------------------- */
1389 /* Function : XGINew_SetDRAMSize_340 */
1393 /* --------------------------------------------------------------------- */
1394 void XGINew_SetDRAMSize_340( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
1398 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
1399 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
1401 XGISetModeNew( HwDeviceExtension
, 0x2e ) ;
1404 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x21 ) ;
1405 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , ( USHORT
)( data
& 0xDF ) ) ; /* disable read cache */
1406 XGI_DisplayOff( HwDeviceExtension
, pVBInfo
);
1408 /*data = XGINew_GetReg1( pVBInfo->P3c4 , 0x1 ) ;*/
1410 /*XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , data ) ;*/ /* Turn OFF Display */
1411 XGINew_DDRSizing340( HwDeviceExtension
, pVBInfo
) ;
1412 data
=XGINew_GetReg1( pVBInfo
->P3c4
, 0x21 ) ;
1413 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , ( USHORT
)( data
| 0x20 ) ) ; /* enable read cache */
1418 /* --------------------------------------------------------------------- */
1423 /* --------------------------------------------------------------------- */
1424 void XGINew_SetDRAMSize_310( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
1427 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
,
1428 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
1430 /* XGINew_SetReg1( pVBInfo->P3d4 , 0x30 , 0x40 ) ; */
1433 #ifdef XGI302 /* alan,should change value */
1434 XGINew_SetReg1( pVBInfo
->P3d4
, 0x30 , 0x4D ) ;
1435 XGINew_SetReg1( pVBInfo
->P3d4
, 0x31 , 0xc0 ) ;
1436 XGINew_SetReg1( pVBInfo
->P3d4
, 0x34 , 0x3F ) ;
1439 XGISetModeNew( HwDeviceExtension
, 0x2e ) ;
1441 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x21 ) ;
1442 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , ( USHORT
)( data
& 0xDF ) ) ; /* disable read cache */
1444 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x1 ) ;
1446 XGINew_SetReg1( pVBInfo
->P3c4
, 0x01 , data
) ; /* Turn OFF Display */
1448 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x16 ) ;
1451 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , ( USHORT
)( data
| 0x0F ) ) ; /* assume lowest speed DRAM */
1453 XGINew_SetDRAMModeRegister( pVBInfo
) ;
1454 XGINew_DisableRefresh( HwDeviceExtension
, pVBInfo
) ;
1455 XGINew_CheckBusWidth_310( pVBInfo
) ;
1456 XGINew_VerifyMclk( HwDeviceExtension
, pVBInfo
) ; /* alan 2000/7/3 */
1460 if ( XGINew_Get310DRAMType( pVBInfo
) < 2 )
1462 XGINew_SDRSizing( pVBInfo
) ;
1466 XGINew_DDRSizing( pVBInfo
) ;
1472 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , pVBInfo
->SR15
[ 1 ][ XGINew_RAMType
] ) ; /* restore SR16 */
1474 XGINew_EnableRefresh( HwDeviceExtension
, pVBInfo
) ;
1475 data
=XGINew_GetReg1( pVBInfo
->P3c4
,0x21 ) ;
1476 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , ( USHORT
)( data
| 0x20 ) ) ; /* enable read cache */
1481 /* --------------------------------------------------------------------- */
1482 /* Function : XGINew_SetDRAMModeRegister340 */
1486 /* --------------------------------------------------------------------- */
1488 void XGINew_SetDRAMModeRegister340( PXGI_HW_DEVICE_INFO HwDeviceExtension
)
1491 VB_DEVICE_INFO VBINF
;
1492 PVB_DEVICE_INFO pVBInfo
= &VBINF
;
1493 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
1494 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
1495 pVBInfo
->BaseAddr
= (ULONG
)HwDeviceExtension
->pjIOAddress
;
1496 pVBInfo
->ISXPDOS
= 0 ;
1498 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
1499 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
1500 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
1501 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
1502 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
1503 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
1504 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
1505 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
1506 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
1507 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
1508 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
1509 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
1510 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
1511 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
1512 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
1513 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
1514 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
1515 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
1516 XGI_GetVBType( pVBInfo
) ; /* Run XGI_GetVBType before InitTo330Pointer */
1518 InitTo330Pointer(HwDeviceExtension
->jChipType
,pVBInfo
);
1520 ReadVBIOSTablData( HwDeviceExtension
->jChipType
, pVBInfo
) ;
1522 if ( XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) == 0 )
1524 data
= ( XGINew_GetReg1( pVBInfo
->P3c4
, 0x39 ) & 0x02 ) >> 1 ;
1526 XGINew_DDR2x_MRS_340( pVBInfo
->P3c4
, pVBInfo
) ;
1528 XGINew_DDR1x_MRS_340( pVBInfo
->P3c4
, pVBInfo
) ;
1531 XGINew_DDR2_MRS_XG20( HwDeviceExtension
, pVBInfo
->P3c4
, pVBInfo
);
1533 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , 0x03 ) ;
1536 /* --------------------------------------------------------------------- */
1537 /* Function : XGINew_SetDRAMModeRegister */
1541 /* --------------------------------------------------------------------- */
1542 void XGINew_SetDRAMModeRegister( PVB_DEVICE_INFO pVBInfo
)
1544 if ( XGINew_Get310DRAMType( pVBInfo
) < 2 )
1546 XGINew_SDR_MRS(pVBInfo
) ;
1550 /* SR16 <- 0F,CF,0F,8F */
1551 XGINew_DDR_MRS( pVBInfo
) ;
1556 /* --------------------------------------------------------------------- */
1557 /* Function : XGINew_DisableRefresh */
1561 /* --------------------------------------------------------------------- */
1562 void XGINew_DisableRefresh( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
1567 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x1B ) ;
1569 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , data
) ;
1574 /* --------------------------------------------------------------------- */
1575 /* Function : XGINew_EnableRefresh */
1579 /* --------------------------------------------------------------------- */
1580 void XGINew_EnableRefresh( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
1583 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , pVBInfo
->SR15
[ 3 ][ XGINew_RAMType
] ) ; /* SR1B */
1589 /* --------------------------------------------------------------------- */
1590 /* Function : XGINew_DisableChannelInterleaving */
1594 /* --------------------------------------------------------------------- */
1595 void XGINew_DisableChannelInterleaving( int index
, USHORT XGINew_DDRDRAM_TYPE
[][ 5 ] , PVB_DEVICE_INFO pVBInfo
)
1599 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x15 ) ;
1602 switch( XGINew_DDRDRAM_TYPE
[ index
][ 3 ] )
1619 XGINew_SetReg1( pVBInfo
->P3c4
, 0x15 , data
) ;
1623 /* --------------------------------------------------------------------- */
1624 /* Function : XGINew_SetDRAMSizingType */
1628 /* --------------------------------------------------------------------- */
1629 void XGINew_SetDRAMSizingType( int index
, USHORT DRAMTYPE_TABLE
[][ 5 ] ,PVB_DEVICE_INFO pVBInfo
)
1633 data
= DRAMTYPE_TABLE
[ index
][ 4 ] ;
1634 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x13 , 0x80 , data
) ;
1636 /* should delay 50 ns */
1640 /* --------------------------------------------------------------------- */
1641 /* Function : XGINew_CheckBusWidth_310 */
1645 /* --------------------------------------------------------------------- */
1646 void XGINew_CheckBusWidth_310( PVB_DEVICE_INFO pVBInfo
)
1649 PULONG
volatile pVideoMemory
;
1651 pVideoMemory
= (PULONG
) pVBInfo
->FBAddr
;
1653 if ( XGINew_Get310DRAMType( pVBInfo
) < 2 )
1655 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x00 ) ;
1656 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x12 ) ;
1658 XGINew_SDR_MRS( pVBInfo
) ;
1660 XGINew_ChannelAB
= 0 ;
1661 XGINew_DataBusWidth
= 128 ;
1662 pVideoMemory
[ 0 ] = 0x01234567L
;
1663 pVideoMemory
[ 1 ] = 0x456789ABL
;
1664 pVideoMemory
[ 2 ] = 0x89ABCDEFL
;
1665 pVideoMemory
[ 3 ] = 0xCDEF0123L
;
1666 pVideoMemory
[ 4 ] = 0x55555555L
;
1667 pVideoMemory
[ 5 ] = 0x55555555L
;
1668 pVideoMemory
[ 6 ] = 0xFFFFFFFFL
;
1669 pVideoMemory
[ 7 ] = 0xFFFFFFFFL
;
1671 if ( ( pVideoMemory
[ 3 ] != 0xCDEF0123L
) || ( pVideoMemory
[ 2 ] != 0x89ABCDEFL
) )
1674 XGINew_DataBusWidth
= 64 ;
1675 XGINew_ChannelAB
= 0 ;
1676 data
=XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) ;
1677 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , ( USHORT
)( data
& 0xFD ) ) ;
1680 if ( ( pVideoMemory
[ 1 ] != 0x456789ABL
) || ( pVideoMemory
[ 0 ] != 0x01234567L
) )
1683 XGINew_DataBusWidth
= 64 ;
1684 XGINew_ChannelAB
= 1 ;
1685 data
=XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) ;
1686 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , ( USHORT
)( ( data
& 0xFD ) | 0x01 ) ) ;
1693 /* DDR Dual channel */
1694 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x00 ) ;
1695 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x02 ) ; /* Channel A, 64bit */
1697 XGINew_DDR_MRS( pVBInfo
) ;
1699 XGINew_ChannelAB
= 0 ;
1700 XGINew_DataBusWidth
= 64 ;
1701 pVideoMemory
[ 0 ] = 0x01234567L
;
1702 pVideoMemory
[ 1 ] = 0x456789ABL
;
1703 pVideoMemory
[ 2 ] = 0x89ABCDEFL
;
1704 pVideoMemory
[ 3 ] = 0xCDEF0123L
;
1705 pVideoMemory
[ 4 ] = 0x55555555L
;
1706 pVideoMemory
[ 5 ] = 0x55555555L
;
1707 pVideoMemory
[ 6 ] = 0xAAAAAAAAL
;
1708 pVideoMemory
[ 7 ] = 0xAAAAAAAAL
;
1710 if ( pVideoMemory
[ 1 ] == 0x456789ABL
)
1712 if ( pVideoMemory
[ 0 ] == 0x01234567L
)
1714 /* Channel A 64bit */
1720 if ( pVideoMemory
[ 0 ] == 0x01234567L
)
1722 /* Channel A 32bit */
1723 XGINew_DataBusWidth
= 32 ;
1724 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x00 ) ;
1729 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x03 ) ; /* Channel B, 64bit */
1730 XGINew_DDR_MRS( pVBInfo
);
1732 XGINew_ChannelAB
= 1 ;
1733 XGINew_DataBusWidth
= 64 ;
1734 pVideoMemory
[ 0 ] = 0x01234567L
;
1735 pVideoMemory
[ 1 ] = 0x456789ABL
;
1736 pVideoMemory
[ 2 ] = 0x89ABCDEFL
;
1737 pVideoMemory
[ 3 ] = 0xCDEF0123L
;
1738 pVideoMemory
[ 4 ] = 0x55555555L
;
1739 pVideoMemory
[ 5 ] = 0x55555555L
;
1740 pVideoMemory
[ 6 ] = 0xAAAAAAAAL
;
1741 pVideoMemory
[ 7 ] = 0xAAAAAAAAL
;
1743 if ( pVideoMemory
[ 1 ] == 0x456789ABL
)
1746 if ( pVideoMemory
[ 0 ] == 0x01234567L
)
1748 /* Channel B 64bit */
1758 if ( pVideoMemory
[ 0 ] == 0x01234567L
)
1761 XGINew_DataBusWidth
= 32 ;
1762 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x01 ) ;
1773 /* --------------------------------------------------------------------- */
1774 /* Function : XGINew_SetRank */
1778 /* --------------------------------------------------------------------- */
1779 int XGINew_SetRank( int index
, UCHAR RankNo
, UCHAR XGINew_ChannelAB
, USHORT DRAMTYPE_TABLE
[][ 5 ] , PVB_DEVICE_INFO pVBInfo
)
1784 if ( ( RankNo
== 2 ) && ( DRAMTYPE_TABLE
[ index
][ 0 ] == 2 ) )
1787 RankSize
= DRAMTYPE_TABLE
[ index
][ 3 ] / 2 * XGINew_DataBusWidth
/ 32 ;
1789 if ( ( RankNo
* RankSize
) <= 128 )
1793 while( ( RankSize
>>= 1 ) > 0 )
1797 data
|= ( RankNo
- 1 ) << 2 ;
1798 data
|= ( XGINew_DataBusWidth
/ 64 ) & 2 ;
1799 data
|= XGINew_ChannelAB
;
1800 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , data
) ;
1802 XGINew_SDR_MRS( pVBInfo
) ;
1810 /* --------------------------------------------------------------------- */
1811 /* Function : XGINew_SetDDRChannel */
1815 /* --------------------------------------------------------------------- */
1816 int XGINew_SetDDRChannel( int index
, UCHAR ChannelNo
, UCHAR XGINew_ChannelAB
, USHORT DRAMTYPE_TABLE
[][ 5 ] , PVB_DEVICE_INFO pVBInfo
)
1821 RankSize
= DRAMTYPE_TABLE
[index
][3]/2 * XGINew_DataBusWidth
/32;
1822 /* RankSize = DRAMTYPE_TABLE[ index ][ 3 ] ; */
1823 if ( ChannelNo
* RankSize
<= 128 )
1826 while( ( RankSize
>>= 1 ) > 0 )
1831 if ( ChannelNo
== 2 )
1834 data
|= ( XGINew_DataBusWidth
/ 32 ) & 2 ;
1835 data
|= XGINew_ChannelAB
;
1836 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , data
) ;
1838 XGINew_DDR_MRS( pVBInfo
) ;
1846 /* --------------------------------------------------------------------- */
1847 /* Function : XGINew_CheckColumn */
1851 /* --------------------------------------------------------------------- */
1852 int XGINew_CheckColumn( int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
1855 ULONG Increment
, Position
;
1857 /* Increment = 1 << ( DRAMTYPE_TABLE[ index ][ 2 ] + XGINew_DataBusWidth / 64 + 1 ) ; */
1858 Increment
= 1 << ( 10 + XGINew_DataBusWidth
/ 64 ) ;
1860 for( i
= 0 , Position
= 0 ; i
< 2 ; i
++ )
1862 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) = Position
;
1863 Position
+= Increment
;
1867 for( i
= 0 , Position
= 0 ; i
< 2 ; i
++ )
1869 /* if ( pVBInfo->FBAddr[ Position ] != Position ) */
1870 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) != Position
)
1872 Position
+= Increment
;
1878 /* --------------------------------------------------------------------- */
1879 /* Function : XGINew_CheckBanks */
1883 /* --------------------------------------------------------------------- */
1884 int XGINew_CheckBanks( int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
1887 ULONG Increment
, Position
;
1889 Increment
= 1 << ( DRAMTYPE_TABLE
[ index
][ 2 ] + XGINew_DataBusWidth
/ 64 + 2 ) ;
1891 for( i
= 0 , Position
= 0 ; i
< 4 ; i
++ )
1893 /* pVBInfo->FBAddr[ Position ] = Position ; */
1894 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) = Position
;
1895 Position
+= Increment
;
1898 for( i
= 0 , Position
= 0 ; i
< 4 ; i
++ )
1900 /* if (pVBInfo->FBAddr[ Position ] != Position ) */
1901 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) != Position
)
1903 Position
+= Increment
;
1909 /* --------------------------------------------------------------------- */
1910 /* Function : XGINew_CheckRank */
1914 /* --------------------------------------------------------------------- */
1915 int XGINew_CheckRank( int RankNo
, int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
1918 ULONG Increment
, Position
;
1920 Increment
= 1 << ( DRAMTYPE_TABLE
[ index
][ 2 ] + DRAMTYPE_TABLE
[ index
][ 1 ] +
1921 DRAMTYPE_TABLE
[ index
][ 0 ] + XGINew_DataBusWidth
/ 64 + RankNo
) ;
1923 for( i
= 0 , Position
= 0 ; i
< 2 ; i
++ )
1925 /* pVBInfo->FBAddr[ Position ] = Position ; */
1926 /* *( ( PULONG )( pVBInfo->FBAddr ) ) = Position ; */
1927 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) = Position
;
1928 Position
+= Increment
;
1931 for( i
= 0 , Position
= 0 ; i
< 2 ; i
++ )
1933 /* if ( pVBInfo->FBAddr[ Position ] != Position ) */
1934 /* if ( ( *( PULONG )( pVBInfo->FBAddr ) ) != Position ) */
1935 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) != Position
)
1937 Position
+= Increment
;
1943 /* --------------------------------------------------------------------- */
1944 /* Function : XGINew_CheckDDRRank */
1948 /* --------------------------------------------------------------------- */
1949 int XGINew_CheckDDRRank( int RankNo
, int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
1951 ULONG Increment
, Position
;
1954 Increment
= 1 << ( DRAMTYPE_TABLE
[ index
][ 2 ] + DRAMTYPE_TABLE
[ index
][ 1 ] +
1955 DRAMTYPE_TABLE
[ index
][ 0 ] + XGINew_DataBusWidth
/ 64 + RankNo
) ;
1957 Increment
+= Increment
/ 2 ;
1960 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
+ 0 ) ) = 0x01234567 ;
1961 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
+ 1 ) ) = 0x456789AB ;
1962 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
+ 2 ) ) = 0x55555555 ;
1963 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
+ 3 ) ) = 0x55555555 ;
1964 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
+ 4 ) ) = 0xAAAAAAAA ;
1965 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
+ 5 ) ) = 0xAAAAAAAA ;
1967 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ 1 ) ) == 0x456789AB )
1970 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ 0 ) ) == 0x01234567 )
1973 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) ;
1976 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , data
) ;
1977 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x15 ) ;
1979 XGINew_SetReg1( pVBInfo
->P3c4
, 0x15 , data
) ;
1985 /* --------------------------------------------------------------------- */
1986 /* Function : XGINew_CheckRanks */
1990 /* --------------------------------------------------------------------- */
1991 int XGINew_CheckRanks( int RankNo
, int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
1995 for( r
= RankNo
; r
>= 1 ; r
-- )
1997 if ( !XGINew_CheckRank( r
, index
, DRAMTYPE_TABLE
, pVBInfo
) )
2001 if ( !XGINew_CheckBanks( index
, DRAMTYPE_TABLE
, pVBInfo
) )
2004 if ( !XGINew_CheckColumn( index
, DRAMTYPE_TABLE
, pVBInfo
) )
2011 /* --------------------------------------------------------------------- */
2012 /* Function : XGINew_CheckDDRRanks */
2016 /* --------------------------------------------------------------------- */
2017 int XGINew_CheckDDRRanks( int RankNo
, int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
2021 for( r
= RankNo
; r
>= 1 ; r
-- )
2023 if ( !XGINew_CheckDDRRank( r
, index
, DRAMTYPE_TABLE
, pVBInfo
) )
2027 if ( !XGINew_CheckBanks( index
, DRAMTYPE_TABLE
, pVBInfo
) )
2030 if ( !XGINew_CheckColumn( index
, DRAMTYPE_TABLE
, pVBInfo
) )
2037 /* --------------------------------------------------------------------- */
2042 /* --------------------------------------------------------------------- */
2043 int XGINew_SDRSizing(PVB_DEVICE_INFO pVBInfo
)
2048 for( i
= 0 ; i
< 13 ; i
++ )
2050 XGINew_SetDRAMSizingType( i
, XGINew_SDRDRAM_TYPE
, pVBInfo
) ;
2052 for( j
= 2 ; j
> 0 ; j
-- )
2054 if ( !XGINew_SetRank( i
, ( UCHAR
)j
, XGINew_ChannelAB
, XGINew_SDRDRAM_TYPE
, pVBInfo
) )
2058 if ( XGINew_CheckRanks( j
, i
, XGINew_SDRDRAM_TYPE
, pVBInfo
) )
2067 /* --------------------------------------------------------------------- */
2068 /* Function : XGINew_SetDRAMSizeReg */
2072 /* --------------------------------------------------------------------- */
2073 USHORT
XGINew_SetDRAMSizeReg( int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
2075 USHORT data
= 0 , memsize
= 0 ;
2079 RankSize
= DRAMTYPE_TABLE
[ index
][ 3 ] * XGINew_DataBusWidth
/ 32 ;
2080 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x13 ) ;
2088 if( XGINew_ChannelAB
== 3 )
2091 ChannelNo
= XGINew_ChannelAB
;
2093 if ( ChannelNo
* RankSize
<= 256 )
2095 while( ( RankSize
>>= 1 ) > 0 )
2100 memsize
= data
>> 4 ;
2102 /* [2004/03/25] Vicent, Fix DRAM Sizing Error */
2103 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , ( XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) & 0x0F ) | ( data
& 0xF0 ) ) ;
2105 /* data |= XGINew_ChannelAB << 2 ; */
2106 /* data |= ( XGINew_DataBusWidth / 64 ) << 1 ; */
2107 /* XGINew_SetReg1( pVBInfo->P3c4 , 0x14 , data ) ; */
2110 /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */
2116 /* --------------------------------------------------------------------- */
2117 /* Function : XGINew_SetDRAMSize20Reg */
2121 /* --------------------------------------------------------------------- */
2122 USHORT
XGINew_SetDRAMSize20Reg( int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
2124 USHORT data
= 0 , memsize
= 0 ;
2128 RankSize
= DRAMTYPE_TABLE
[ index
][ 3 ] * XGINew_DataBusWidth
/ 8 ;
2129 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x13 ) ;
2137 if( XGINew_ChannelAB
== 3 )
2140 ChannelNo
= XGINew_ChannelAB
;
2142 if ( ChannelNo
* RankSize
<= 256 )
2144 while( ( RankSize
>>= 1 ) > 0 )
2149 memsize
= data
>> 4 ;
2151 /* [2004/03/25] Vicent, Fix DRAM Sizing Error */
2152 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , ( XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) & 0x0F ) | ( data
& 0xF0 ) ) ;
2155 /* data |= XGINew_ChannelAB << 2 ; */
2156 /* data |= ( XGINew_DataBusWidth / 64 ) << 1 ; */
2157 /* XGINew_SetReg1( pVBInfo->P3c4 , 0x14 , data ) ; */
2160 /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */
2166 /* --------------------------------------------------------------------- */
2167 /* Function : XGINew_ReadWriteRest */
2171 /* --------------------------------------------------------------------- */
2172 int XGINew_ReadWriteRest( USHORT StopAddr
, USHORT StartAddr
, PVB_DEVICE_INFO pVBInfo
)
2175 ULONG Position
= 0 ;
2177 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) = Position
;
2179 for( i
= StartAddr
; i
<= StopAddr
; i
++ )
2182 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) = Position
;
2185 DelayUS( 500 ) ; /* [Vicent] 2004/04/16. Fix #1759 Memory Size error in Multi-Adapter. */
2189 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) != Position
)
2192 for( i
= StartAddr
; i
<= StopAddr
; i
++ )
2195 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) != Position
)
2202 /* --------------------------------------------------------------------- */
2203 /* Function : XGINew_CheckFrequence */
2207 /* --------------------------------------------------------------------- */
2208 UCHAR
XGINew_CheckFrequence( PVB_DEVICE_INFO pVBInfo
)
2212 data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x97 ) ;
2214 if ( ( data
& 0x10 ) == 0 )
2216 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x39 ) ;
2217 data
= ( data
& 0x02 ) >> 1 ;
2221 return( data
& 0x01 ) ;
2225 /* --------------------------------------------------------------------- */
2226 /* Function : XGINew_CheckChannel */
2230 /* --------------------------------------------------------------------- */
2231 void XGINew_CheckChannel( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
2235 switch( HwDeviceExtension
->jChipType
)
2239 data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x97 ) ;
2241 XGINew_ChannelAB
= 1 ; /* XG20 "JUST" one channel */
2243 if ( data
== 0 ) /* Single_32_16 */
2246 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x1000000)
2249 XGINew_DataBusWidth
= 32 ; /* 32 bits */
2250 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xB1 ) ; /* 22bit + 2 rank + 32bit */
2251 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x52 ) ;
2254 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2257 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x800000)
2259 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x31 ) ; /* 22bit + 1 rank + 32bit */
2260 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x42 ) ;
2263 if ( XGINew_ReadWriteRest( 23 , 23 , pVBInfo
) == 1 )
2268 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x800000)
2270 XGINew_DataBusWidth
= 16 ; /* 16 bits */
2271 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xB1 ) ; /* 22bit + 2 rank + 16bit */
2272 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x41 ) ;
2275 if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo
) == 1 )
2278 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x31 ) ;
2283 else /* Dual_16_8 */
2285 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x800000)
2288 XGINew_DataBusWidth
= 16 ; /* 16 bits */
2289 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xB1 ) ; /* (0x31:12x8x2) 22bit + 2 rank */
2290 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x41 ) ; /* 0x41:16Mx16 bit*/
2293 if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo
) == 1 )
2296 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x400000)
2298 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x31 ) ; /* (0x31:12x8x2) 22bit + 1 rank */
2299 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x31 ) ; /* 0x31:8Mx16 bit*/
2302 if ( XGINew_ReadWriteRest( 22 , 22 , pVBInfo
) == 1 )
2308 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x400000)
2310 XGINew_DataBusWidth
= 8 ; /* 8 bits */
2311 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xB1 ) ; /* (0x31:12x8x2) 22bit + 2 rank */
2312 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x30 ) ; /* 0x30:8Mx8 bit*/
2315 if ( XGINew_ReadWriteRest( 22 , 21 , pVBInfo
) == 1 )
2318 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x31 ) ; /* (0x31:12x8x2) 22bit + 1 rank */
2325 XGINew_DataBusWidth
= 16 ; /* 16 bits */
2326 XGINew_ChannelAB
= 1 ; /* Single channel */
2327 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x51 ) ; /* 32Mx16 bit*/
2330 if ( XGINew_CheckFrequence(pVBInfo
) == 1 )
2332 XGINew_DataBusWidth
= 32 ; /* 32 bits */
2333 XGINew_ChannelAB
= 3 ; /* Quad Channel */
2334 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2335 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x4C ) ;
2337 if ( XGINew_ReadWriteRest( 25 , 23 , pVBInfo
) == 1 )
2340 XGINew_ChannelAB
= 2 ; /* Dual channels */
2341 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x48 ) ;
2343 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2346 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x49 ) ;
2348 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2351 XGINew_ChannelAB
= 3 ;
2352 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2353 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x3C ) ;
2355 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2358 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x38 ) ;
2360 if ( XGINew_ReadWriteRest( 8 , 4 , pVBInfo
) == 1 )
2363 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x39 ) ;
2367 XGINew_DataBusWidth
= 64 ; /* 64 bits */
2368 XGINew_ChannelAB
= 2 ; /* Dual channels */
2369 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2370 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x5A ) ;
2372 if ( XGINew_ReadWriteRest( 25 , 24 , pVBInfo
) == 1 )
2375 XGINew_ChannelAB
= 1 ; /* Single channels */
2376 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x52 ) ;
2378 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2381 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x53 ) ;
2383 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2386 XGINew_ChannelAB
= 2 ; /* Dual channels */
2387 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2388 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x4A ) ;
2390 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2393 XGINew_ChannelAB
= 1 ; /* Single channels */
2394 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x42 ) ;
2396 if ( XGINew_ReadWriteRest( 8 , 4 , pVBInfo
) == 1 )
2399 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x43 ) ;
2406 XG42 SR14 D[3] Reserve
2407 D[2] = 1, Dual Channel
2410 It's Different from Other XG40 Series.
2412 if ( XGINew_CheckFrequence(pVBInfo
) == 1 ) /* DDRII, DDR2x */
2414 XGINew_DataBusWidth
= 32 ; /* 32 bits */
2415 XGINew_ChannelAB
= 2 ; /* 2 Channel */
2416 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2417 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x44 ) ;
2419 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2422 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2423 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x34 ) ;
2424 if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo
) == 1 )
2427 XGINew_ChannelAB
= 1 ; /* Single Channel */
2428 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2429 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x40 ) ;
2431 if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo
) == 1 )
2435 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2436 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x30 ) ;
2441 XGINew_DataBusWidth
= 64 ; /* 64 bits */
2442 XGINew_ChannelAB
= 1 ; /* 1 channels */
2443 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2444 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x52 ) ;
2446 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2450 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2451 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x42 ) ;
2459 if ( XGINew_CheckFrequence(pVBInfo
) == 1 ) /* DDRII */
2461 XGINew_DataBusWidth
= 32 ; /* 32 bits */
2462 XGINew_ChannelAB
= 3 ;
2463 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2464 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x4C ) ;
2466 if ( XGINew_ReadWriteRest( 25 , 23 , pVBInfo
) == 1 )
2469 XGINew_ChannelAB
= 2 ; /* 2 channels */
2470 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x48 ) ;
2472 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2475 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2476 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x3C ) ;
2478 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2479 XGINew_ChannelAB
= 3 ; /* 4 channels */
2482 XGINew_ChannelAB
= 2 ; /* 2 channels */
2483 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x38 ) ;
2488 XGINew_DataBusWidth
= 64 ; /* 64 bits */
2489 XGINew_ChannelAB
= 2 ; /* 2 channels */
2490 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2491 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x5A ) ;
2493 if ( XGINew_ReadWriteRest( 25 , 24 , pVBInfo
) == 1 )
2497 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2498 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x4A ) ;
2506 /* --------------------------------------------------------------------- */
2507 /* Function : XGINew_DDRSizing340 */
2511 /* --------------------------------------------------------------------- */
2512 int XGINew_DDRSizing340( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
2515 USHORT memsize
, addr
;
2517 XGINew_SetReg1( pVBInfo
->P3c4
, 0x15 , 0x00 ) ; /* noninterleaving */
2518 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1C , 0x00 ) ; /* nontiling */
2519 XGINew_CheckChannel( HwDeviceExtension
, pVBInfo
) ;
2522 if ( HwDeviceExtension
->jChipType
>= XG20
)
2524 for( i
= 0 ; i
< 12 ; i
++ )
2526 XGINew_SetDRAMSizingType( i
, XGINew_DDRDRAM_TYPE20
, pVBInfo
) ;
2527 memsize
= XGINew_SetDRAMSize20Reg( i
, XGINew_DDRDRAM_TYPE20
, pVBInfo
) ;
2531 addr
= memsize
+ ( XGINew_ChannelAB
- 2 ) + 20 ;
2532 if ( ( HwDeviceExtension
->ulVideoMemorySize
- 1 ) < ( ULONG
)( 1 << addr
) )
2535 if ( XGINew_ReadWriteRest( addr
, 5, pVBInfo
) == 1 )
2541 for( i
= 0 ; i
< 4 ; i
++ )
2543 XGINew_SetDRAMSizingType( i
, XGINew_DDRDRAM_TYPE340
, pVBInfo
) ;
2544 memsize
= XGINew_SetDRAMSizeReg( i
, XGINew_DDRDRAM_TYPE340
, pVBInfo
) ;
2549 addr
= memsize
+ ( XGINew_ChannelAB
- 2 ) + 20 ;
2550 if ( ( HwDeviceExtension
->ulVideoMemorySize
- 1 ) < ( ULONG
)( 1 << addr
) )
2553 if ( XGINew_ReadWriteRest( addr
, 9, pVBInfo
) == 1 )
2561 /* --------------------------------------------------------------------- */
2562 /* Function : XGINew_DDRSizing */
2566 /* --------------------------------------------------------------------- */
2567 int XGINew_DDRSizing(PVB_DEVICE_INFO pVBInfo
)
2572 for( i
= 0 ; i
< 4 ; i
++ )
2574 XGINew_SetDRAMSizingType( i
, XGINew_DDRDRAM_TYPE
, pVBInfo
) ;
2575 XGINew_DisableChannelInterleaving( i
, XGINew_DDRDRAM_TYPE
, pVBInfo
) ;
2576 for( j
= 2 ; j
> 0 ; j
-- )
2578 XGINew_SetDDRChannel( i
, j
, XGINew_ChannelAB
, XGINew_DDRDRAM_TYPE
, pVBInfo
) ;
2579 if ( !XGINew_SetRank( i
, ( UCHAR
)j
, XGINew_ChannelAB
, XGINew_DDRDRAM_TYPE
, pVBInfo
) )
2583 if ( XGINew_CheckDDRRanks( j
, i
, XGINew_DDRDRAM_TYPE
, pVBInfo
) )
2591 /* --------------------------------------------------------------------- */
2592 /* Function : XGINew_SetMemoryClock */
2596 /* --------------------------------------------------------------------- */
2597 void XGINew_SetMemoryClock( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
2601 XGINew_SetReg1( pVBInfo
->P3c4
, 0x28 , pVBInfo
->MCLKData
[ XGINew_RAMType
].SR28
) ;
2602 XGINew_SetReg1( pVBInfo
->P3c4
, 0x29 , pVBInfo
->MCLKData
[ XGINew_RAMType
].SR29
) ;
2603 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2A , pVBInfo
->MCLKData
[ XGINew_RAMType
].SR2A
) ;
2607 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2E , pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2E
) ;
2608 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2F , pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2F
) ;
2609 XGINew_SetReg1( pVBInfo
->P3c4
, 0x30 , pVBInfo
->ECLKData
[ XGINew_RAMType
].SR30
) ;
2611 /* [Vicent] 2004/07/07, When XG42 ECLK = MCLK = 207MHz, Set SR32 D[1:0] = 10b */
2612 /* [Hsuan] 2004/08/20, Modify SR32 value, when MCLK=207MHZ, ELCK=250MHz, Set SR32 D[1:0] = 10b */
2613 if ( HwDeviceExtension
->jChipType
== XG42
)
2615 if ( ( pVBInfo
->MCLKData
[ XGINew_RAMType
].SR28
== 0x1C ) && ( pVBInfo
->MCLKData
[ XGINew_RAMType
].SR29
== 0x01 )
2616 && ( ( ( pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2E
== 0x1C ) && ( pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2F
== 0x01 ) )
2617 || ( ( pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2E
== 0x22 ) && ( pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2F
== 0x01 ) ) ) )
2619 XGINew_SetReg1( pVBInfo
->P3c4
, 0x32 , ( ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x32 ) & 0xFC ) | 0x02 ) ;
2625 /* --------------------------------------------------------------------- */
2626 /* Function : ChkLFB */
2630 /* --------------------------------------------------------------------- */
2631 BOOLEAN
ChkLFB( PVB_DEVICE_INFO pVBInfo
)
2633 if ( LFBDRAMTrap
& XGINew_GetReg1( pVBInfo
->P3d4
, 0x78 ) )
2640 /* --------------------------------------------------------------------- */
2641 /* input : dx ,valid value : CR or second chip's CR */
2643 /* SetPowerConsume : */
2644 /* Description: reduce 40/43 power consumption in first chip or */
2645 /* in second chip, assume CR A1 D[6]="1" in this case */
2647 /* --------------------------------------------------------------------- */
2648 void SetPowerConsume ( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG XGI_P3d4Port
)
2653 HwDeviceExtension
->pQueryVGAConfigSpace( HwDeviceExtension
, 0x08 , 0 , &lTemp
) ; /* Get */
2654 if ((lTemp
&0xFF)==0)
2656 /* set CR58 D[5]=0 D[3]=0 */
2657 XGINew_SetRegAND( XGI_P3d4Port
, 0x58 , 0xD7 ) ;
2658 bTemp
= (UCHAR
) XGINew_GetReg1( XGI_P3d4Port
, 0xCB ) ;
2663 XGINew_SetRegANDOR( XGI_P3d4Port
, 0x58 , 0xD7 , 0x20 ) ; /* CR58 D[5]=1 D[3]=0 */
2667 XGINew_SetRegANDOR( XGI_P3d4Port
, 0x58 , 0xD7 , 0x08 ) ; /* CR58 D[5]=0 D[3]=1 */
2677 #if defined(LINUX_XF86)||defined(LINUX_KERNEL)
2678 void XGINew_InitVBIOSData(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
2681 /* ULONG ROMAddr = (ULONG)HwDeviceExtension->pjVirtualRomBase; */
2682 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
2683 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
2684 pVBInfo
->BaseAddr
= (ULONG
)HwDeviceExtension
->pjIOAddress
;
2685 pVBInfo
->ISXPDOS
= 0 ;
2687 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
2688 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
2689 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
2690 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
2691 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
2692 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
2693 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
2694 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
2695 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
2696 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
2697 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
2698 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
2699 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
2700 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
2701 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
2702 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
2703 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
2704 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
2705 XGI_GetVBType( pVBInfo
) ; /* Run XGI_GetVBType before InitTo330Pointer */
2707 switch(HwDeviceExtension
->jChipType
)
2715 InitTo330Pointer(HwDeviceExtension
->jChipType
,pVBInfo
);
2720 #endif /* For Linux */
2722 /* --------------------------------------------------------------------- */
2723 /* Function : ReadVBIOSTablData */
2727 /* --------------------------------------------------------------------- */
2728 void ReadVBIOSTablData( UCHAR ChipType
, PVB_DEVICE_INFO pVBInfo
)
2730 PUCHAR
volatile pVideoMemory
= ( PUCHAR
)pVBInfo
->ROMAddr
;
2735 i
= pVideoMemory
[ 0x1CF ] | ( pVideoMemory
[ 0x1D0 ] << 8 ) ; /* UniROM */
2740 for( jj
= 0x00 ; jj
< 0x08 ; jj
++ )
2742 pVBInfo
->MCLKData
[ jj
].SR28
= pVideoMemory
[ ii
] ;
2743 pVBInfo
->MCLKData
[ jj
].SR29
= pVideoMemory
[ ii
+ 1] ;
2744 pVBInfo
->MCLKData
[ jj
].SR2A
= pVideoMemory
[ ii
+ 2] ;
2745 pVBInfo
->MCLKData
[ jj
].CLOCK
= pVideoMemory
[ ii
+ 3 ] | ( pVideoMemory
[ ii
+ 4 ] << 8 ) ;
2750 for( jj
= 0x00 ; jj
< 0x08 ; jj
++ )
2752 pVBInfo
->ECLKData
[ jj
].SR2E
= pVideoMemory
[ ii
] ;
2753 pVBInfo
->ECLKData
[ jj
].SR2F
=pVideoMemory
[ ii
+ 1 ] ;
2754 pVBInfo
->ECLKData
[ jj
].SR30
= pVideoMemory
[ ii
+ 2 ] ;
2755 pVBInfo
->ECLKData
[ jj
].CLOCK
= pVideoMemory
[ ii
+ 3 ] | ( pVideoMemory
[ ii
+ 4 ] << 8 ) ;
2759 /* Volari customize data area start */
2760 /* if ( ChipType == XG40 ) */
2761 if ( ChipType
>= XG40
)
2764 for( jj
= 0x00 ; jj
< 0x03 ; jj
++ )
2766 pVBInfo
->SR15
[ jj
][ 0 ] = pVideoMemory
[ ii
] ; /* SR13, SR14, and SR18 */
2767 pVBInfo
->SR15
[ jj
][ 1 ] = pVideoMemory
[ ii
+ 1 ] ;
2768 pVBInfo
->SR15
[ jj
][ 2 ] = pVideoMemory
[ ii
+ 2 ] ;
2769 pVBInfo
->SR15
[ jj
][ 3 ] = pVideoMemory
[ ii
+ 3 ] ;
2770 pVBInfo
->SR15
[ jj
][ 4 ] = pVideoMemory
[ ii
+ 4 ] ;
2771 pVBInfo
->SR15
[ jj
][ 5 ] = pVideoMemory
[ ii
+ 5 ] ;
2772 pVBInfo
->SR15
[ jj
][ 6 ] = pVideoMemory
[ ii
+ 6 ] ;
2773 pVBInfo
->SR15
[ jj
][ 7 ] = pVideoMemory
[ ii
+ 7 ] ;
2778 pVBInfo
->SR15
[ jj
][ 0 ] = pVideoMemory
[ ii
] ; /* SR1B */
2779 pVBInfo
->SR15
[ jj
][ 1 ] = pVideoMemory
[ ii
+ 1 ] ;
2780 pVBInfo
->SR15
[ jj
][ 2 ] = pVideoMemory
[ ii
+ 2 ] ;
2781 pVBInfo
->SR15
[ jj
][ 3 ] = pVideoMemory
[ ii
+ 3 ] ;
2782 pVBInfo
->SR15
[ jj
][ 4 ] = pVideoMemory
[ ii
+ 4 ] ;
2783 pVBInfo
->SR15
[ jj
][ 5 ] = pVideoMemory
[ ii
+ 5 ] ;
2784 pVBInfo
->SR15
[ jj
][ 6 ] = pVideoMemory
[ ii
+ 6 ] ;
2785 pVBInfo
->SR15
[ jj
][ 7 ] = pVideoMemory
[ ii
+ 7 ] ;
2787 *pVBInfo
->pSR07
= pVideoMemory
[ 0x74 ] ;
2788 *pVBInfo
->pSR1F
= pVideoMemory
[ 0x75 ] ;
2789 *pVBInfo
->pSR21
= pVideoMemory
[ 0x76 ] ;
2790 *pVBInfo
->pSR22
= pVideoMemory
[ 0x77 ] ;
2791 *pVBInfo
->pSR23
= pVideoMemory
[ 0x78 ] ;
2792 *pVBInfo
->pSR24
= pVideoMemory
[ 0x79 ] ;
2793 pVBInfo
->SR25
[ 0 ] = pVideoMemory
[ 0x7A ] ;
2794 *pVBInfo
->pSR31
= pVideoMemory
[ 0x7B ] ;
2795 *pVBInfo
->pSR32
= pVideoMemory
[ 0x7C ] ;
2796 *pVBInfo
->pSR33
= pVideoMemory
[ 0x7D ] ;
2799 for( jj
= 0 ; jj
< 3 ; jj
++ )
2801 pVBInfo
->CR40
[ jj
][ 0 ] = pVideoMemory
[ ii
] ;
2802 pVBInfo
->CR40
[ jj
][ 1 ] = pVideoMemory
[ ii
+ 1 ] ;
2803 pVBInfo
->CR40
[ jj
][ 2 ] = pVideoMemory
[ ii
+ 2 ] ;
2804 pVBInfo
->CR40
[ jj
][ 3 ] = pVideoMemory
[ ii
+ 3 ] ;
2805 pVBInfo
->CR40
[ jj
][ 4 ] = pVideoMemory
[ ii
+ 4 ] ;
2806 pVBInfo
->CR40
[ jj
][ 5 ] = pVideoMemory
[ ii
+ 5 ] ;
2807 pVBInfo
->CR40
[ jj
][ 6 ] = pVideoMemory
[ ii
+ 6 ] ;
2808 pVBInfo
->CR40
[ jj
][ 7 ] = pVideoMemory
[ ii
+ 7 ] ;
2813 for( j
= 3 ; j
< 24 ; j
++ )
2815 pVBInfo
->CR40
[ j
][ 0 ] = pVideoMemory
[ ii
] ;
2816 pVBInfo
->CR40
[ j
][ 1 ] = pVideoMemory
[ ii
+ 1 ] ;
2817 pVBInfo
->CR40
[ j
][ 2 ] = pVideoMemory
[ ii
+ 2 ] ;
2818 pVBInfo
->CR40
[ j
][ 3 ] = pVideoMemory
[ ii
+ 3 ] ;
2819 pVBInfo
->CR40
[ j
][ 4 ] = pVideoMemory
[ ii
+ 4 ] ;
2820 pVBInfo
->CR40
[ j
][ 5 ] = pVideoMemory
[ ii
+ 5 ] ;
2821 pVBInfo
->CR40
[ j
][ 6 ] = pVideoMemory
[ ii
+ 6 ] ;
2822 pVBInfo
->CR40
[ j
][ 7 ] = pVideoMemory
[ ii
+ 7 ] ;
2826 i
= pVideoMemory
[ 0x1C0 ] | ( pVideoMemory
[ 0x1C1 ] << 8 ) ;
2828 for( j
= 0 ; j
< 8 ; j
++ )
2830 for( k
= 0 ; k
< 4 ; k
++ )
2831 pVBInfo
->CR6B
[ j
][ k
] = pVideoMemory
[ i
+ 4 * j
+ k
] ;
2834 i
= pVideoMemory
[ 0x1C2 ] | ( pVideoMemory
[ 0x1C3 ] << 8 ) ;
2836 for( j
= 0 ; j
< 8 ; j
++ )
2838 for( k
= 0 ; k
< 4 ; k
++ )
2839 pVBInfo
->CR6E
[ j
][ k
] = pVideoMemory
[ i
+ 4 * j
+ k
] ;
2842 i
= pVideoMemory
[ 0x1C4 ] | ( pVideoMemory
[ 0x1C5 ] << 8 ) ;
2843 for( j
= 0 ; j
< 8 ; j
++ )
2845 for( k
= 0 ; k
< 32 ; k
++ )
2846 pVBInfo
->CR6F
[ j
][ k
] = pVideoMemory
[ i
+ 32 * j
+ k
] ;
2849 i
= pVideoMemory
[ 0x1C6 ] | ( pVideoMemory
[ 0x1C7 ] << 8 ) ;
2851 for( j
= 0 ; j
< 8 ; j
++ )
2853 for( k
= 0 ; k
< 2 ; k
++ )
2854 pVBInfo
->CR89
[ j
][ k
] = pVideoMemory
[ i
+ 2 * j
+ k
] ;
2857 i
= pVideoMemory
[ 0x1C8 ] | ( pVideoMemory
[ 0x1C9 ] << 8 ) ;
2858 for( j
= 0 ; j
< 12 ; j
++ )
2859 pVBInfo
->AGPReg
[ j
] = pVideoMemory
[ i
+ j
] ;
2861 i
= pVideoMemory
[ 0x1CF ] | ( pVideoMemory
[ 0x1D0 ] << 8 ) ;
2862 for( j
= 0 ; j
< 4 ; j
++ )
2863 pVBInfo
->SR16
[ j
] = pVideoMemory
[ i
+ j
] ;
2865 if ( ChipType
== XG21
)
2867 if (pVideoMemory
[ 0x67 ] & 0x80)
2869 *pVBInfo
->pDVOSetting
= pVideoMemory
[ 0x67 ];
2871 if ( (pVideoMemory
[ 0x67 ] & 0xC0) == 0xC0 )
2873 *pVBInfo
->pCR2E
= pVideoMemory
[ i
+ 4 ] ;
2874 *pVBInfo
->pCR2F
= pVideoMemory
[ i
+ 5 ] ;
2875 *pVBInfo
->pCR46
= pVideoMemory
[ i
+ 6 ] ;
2876 *pVBInfo
->pCR47
= pVideoMemory
[ i
+ 7 ] ;
2880 if ( ChipType
== XG27
)
2883 for( i
= 0 ; i
<= 0xB ; i
++,jj
++ )
2884 pVBInfo
->pCRD0
[i
] = pVideoMemory
[ jj
] ;
2885 for( i
= 0x0 ; i
<= 0x1 ; i
++,jj
++ )
2886 pVBInfo
->pCRDE
[i
] = pVideoMemory
[ jj
] ;
2888 *pVBInfo
->pSR40
= pVideoMemory
[ jj
] ;
2890 *pVBInfo
->pSR41
= pVideoMemory
[ jj
] ;
2892 if (pVideoMemory
[ 0x67 ] & 0x80)
2894 *pVBInfo
->pDVOSetting
= pVideoMemory
[ 0x67 ];
2896 if ( (pVideoMemory
[ 0x67 ] & 0xC0) == 0xC0 )
2899 *pVBInfo
->pCR2E
= pVideoMemory
[ jj
] ;
2900 *pVBInfo
->pCR2F
= pVideoMemory
[ jj
+ 1 ] ;
2901 *pVBInfo
->pCR46
= pVideoMemory
[ jj
+ 2 ] ;
2902 *pVBInfo
->pCR47
= pVideoMemory
[ jj
+ 3 ] ;
2907 *pVBInfo
->pCRCF
= pVideoMemory
[ 0x1CA ] ;
2908 *pVBInfo
->pXGINew_DRAMTypeDefinition
= pVideoMemory
[ 0x1CB ] ;
2909 *pVBInfo
->pXGINew_I2CDefinition
= pVideoMemory
[ 0x1D1 ] ;
2910 if ( ChipType
>= XG20
)
2912 *pVBInfo
->pXGINew_CR97
= pVideoMemory
[ 0x1D2 ] ;
2913 if ( ChipType
== XG27
)
2915 *pVBInfo
->pSR36
= pVideoMemory
[ 0x1D3 ] ;
2916 *pVBInfo
->pCR8F
= pVideoMemory
[ 0x1D5 ] ;
2922 /* Volari customize data area end */
2924 if ( ChipType
== XG21
)
2926 pVBInfo
->IF_DEF_LVDS
= 0 ;
2927 if (pVideoMemory
[ 0x65 ] & 0x1)
2929 pVBInfo
->IF_DEF_LVDS
= 1 ;
2930 i
= pVideoMemory
[ 0x316 ] | ( pVideoMemory
[ 0x317 ] << 8 );
2931 j
= pVideoMemory
[ i
-1 ] ;
2937 pVBInfo
->XG21_LVDSCapList
[k
].LVDS_Capability
= pVideoMemory
[ i
] | ( pVideoMemory
[ i
+ 1 ] << 8 );
2938 pVBInfo
->XG21_LVDSCapList
[k
].LVDSHT
= pVideoMemory
[ i
+ 2 ] | ( pVideoMemory
[ i
+ 3 ] << 8 ) ;
2939 pVBInfo
->XG21_LVDSCapList
[k
].LVDSVT
= pVideoMemory
[ i
+ 4 ] | ( pVideoMemory
[ i
+ 5 ] << 8 );
2940 pVBInfo
->XG21_LVDSCapList
[k
].LVDSHDE
= pVideoMemory
[ i
+ 6 ] | ( pVideoMemory
[ i
+ 7 ] << 8 );
2941 pVBInfo
->XG21_LVDSCapList
[k
].LVDSVDE
= pVideoMemory
[ i
+ 8 ] | ( pVideoMemory
[ i
+ 9 ] << 8 );
2942 pVBInfo
->XG21_LVDSCapList
[k
].LVDSHFP
= pVideoMemory
[ i
+ 10 ] | ( pVideoMemory
[ i
+ 11 ] << 8 );
2943 pVBInfo
->XG21_LVDSCapList
[k
].LVDSVFP
= pVideoMemory
[ i
+ 12 ] | ( pVideoMemory
[ i
+ 13 ] << 8 );
2944 pVBInfo
->XG21_LVDSCapList
[k
].LVDSHSYNC
= pVideoMemory
[ i
+ 14 ] | ( pVideoMemory
[ i
+ 15 ] << 8 );
2945 pVBInfo
->XG21_LVDSCapList
[k
].LVDSVSYNC
= pVideoMemory
[ i
+ 16 ] | ( pVideoMemory
[ i
+ 17 ] << 8 );
2946 pVBInfo
->XG21_LVDSCapList
[k
].VCLKData1
= pVideoMemory
[ i
+ 18 ] ;
2947 pVBInfo
->XG21_LVDSCapList
[k
].VCLKData2
= pVideoMemory
[ i
+ 19 ] ;
2948 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S1
= pVideoMemory
[ i
+ 20 ] ;
2949 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S2
= pVideoMemory
[ i
+ 21 ] ;
2950 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S3
= pVideoMemory
[ i
+ 22 ] ;
2951 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S4
= pVideoMemory
[ i
+ 23 ] ;
2952 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S5
= pVideoMemory
[ i
+ 24 ] ;
2956 } while ( (j
>0) && ( k
< (sizeof(XGI21_LCDCapList
)/sizeof(XGI21_LVDSCapStruct
)) ) );
2960 pVBInfo
->XG21_LVDSCapList
[0].LVDS_Capability
= pVideoMemory
[ i
] | ( pVideoMemory
[ i
+ 1 ] << 8 );
2961 pVBInfo
->XG21_LVDSCapList
[0].LVDSHT
= pVideoMemory
[ i
+ 2 ] | ( pVideoMemory
[ i
+ 3 ] << 8 ) ;
2962 pVBInfo
->XG21_LVDSCapList
[0].LVDSVT
= pVideoMemory
[ i
+ 4 ] | ( pVideoMemory
[ i
+ 5 ] << 8 );
2963 pVBInfo
->XG21_LVDSCapList
[0].LVDSHDE
= pVideoMemory
[ i
+ 6 ] | ( pVideoMemory
[ i
+ 7 ] << 8 );
2964 pVBInfo
->XG21_LVDSCapList
[0].LVDSVDE
= pVideoMemory
[ i
+ 8 ] | ( pVideoMemory
[ i
+ 9 ] << 8 );
2965 pVBInfo
->XG21_LVDSCapList
[0].LVDSHFP
= pVideoMemory
[ i
+ 10 ] | ( pVideoMemory
[ i
+ 11 ] << 8 );
2966 pVBInfo
->XG21_LVDSCapList
[0].LVDSVFP
= pVideoMemory
[ i
+ 12 ] | ( pVideoMemory
[ i
+ 13 ] << 8 );
2967 pVBInfo
->XG21_LVDSCapList
[0].LVDSHSYNC
= pVideoMemory
[ i
+ 14 ] | ( pVideoMemory
[ i
+ 15 ] << 8 );
2968 pVBInfo
->XG21_LVDSCapList
[0].LVDSVSYNC
= pVideoMemory
[ i
+ 16 ] | ( pVideoMemory
[ i
+ 17 ] << 8 );
2969 pVBInfo
->XG21_LVDSCapList
[0].VCLKData1
= pVideoMemory
[ i
+ 18 ] ;
2970 pVBInfo
->XG21_LVDSCapList
[0].VCLKData2
= pVideoMemory
[ i
+ 19 ] ;
2971 pVBInfo
->XG21_LVDSCapList
[0].PSC_S1
= pVideoMemory
[ i
+ 20 ] ;
2972 pVBInfo
->XG21_LVDSCapList
[0].PSC_S2
= pVideoMemory
[ i
+ 21 ] ;
2973 pVBInfo
->XG21_LVDSCapList
[0].PSC_S3
= pVideoMemory
[ i
+ 22 ] ;
2974 pVBInfo
->XG21_LVDSCapList
[0].PSC_S4
= pVideoMemory
[ i
+ 23 ] ;
2975 pVBInfo
->XG21_LVDSCapList
[0].PSC_S5
= pVideoMemory
[ i
+ 24 ] ;
2981 /* --------------------------------------------------------------------- */
2982 /* Function : XGINew_DDR1x_MRS_XG20 */
2986 /* --------------------------------------------------------------------- */
2987 void XGINew_DDR1x_MRS_XG20( ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
)
2990 XGINew_SetReg1( P3c4
, 0x18 , 0x01 ) ;
2991 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ;
2992 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
2993 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
2996 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ;
2997 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ;
2998 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
2999 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
3001 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
3002 /* XGINew_SetReg1( P3c4 , 0x18 , 0x31 ) ; */
3003 XGINew_SetReg1( P3c4
, 0x19 , 0x01 ) ;
3004 XGINew_SetReg1( P3c4
, 0x16 , 0x03 ) ;
3005 XGINew_SetReg1( P3c4
, 0x16 , 0x83 ) ;
3007 XGINew_SetReg1( P3c4
, 0x1B , 0x03 ) ;
3009 /* XGINew_SetReg1( P3c4 , 0x18 , 0x31 ) ; */
3010 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
3011 XGINew_SetReg1( P3c4
, 0x19 , 0x00 ) ;
3012 XGINew_SetReg1( P3c4
, 0x16 , 0x03 ) ;
3013 XGINew_SetReg1( P3c4
, 0x16 , 0x83 ) ;
3014 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ;
3017 /* --------------------------------------------------------------------- */
3018 /* Function : XGINew_SetDRAMModeRegister_XG20 */
3022 /* --------------------------------------------------------------------- */
3023 void XGINew_SetDRAMModeRegister_XG20( PXGI_HW_DEVICE_INFO HwDeviceExtension
)
3025 VB_DEVICE_INFO VBINF
;
3026 PVB_DEVICE_INFO pVBInfo
= &VBINF
;
3027 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
3028 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
3029 pVBInfo
->BaseAddr
= (ULONG
)HwDeviceExtension
->pjIOAddress
;
3030 pVBInfo
->ISXPDOS
= 0 ;
3032 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
3033 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
3034 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
3035 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
3036 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
3037 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
3038 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
3039 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
3040 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
3041 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
3042 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
3043 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
3044 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
3045 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
3046 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
3047 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
3048 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
3050 InitTo330Pointer(HwDeviceExtension
->jChipType
,pVBInfo
);
3052 ReadVBIOSTablData( HwDeviceExtension
->jChipType
, pVBInfo
) ;
3054 if ( XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) == 0 )
3055 XGINew_DDR1x_MRS_XG20( pVBInfo
->P3c4
, pVBInfo
) ;
3057 XGINew_DDR2_MRS_XG20( HwDeviceExtension
, pVBInfo
->P3c4
, pVBInfo
) ;
3059 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , 0x03 ) ;
3062 void XGINew_SetDRAMModeRegister_XG27( PXGI_HW_DEVICE_INFO HwDeviceExtension
)
3064 VB_DEVICE_INFO VBINF
;
3065 PVB_DEVICE_INFO pVBInfo
= &VBINF
;
3066 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
3067 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
3068 pVBInfo
->BaseAddr
= (ULONG
)HwDeviceExtension
->pjIOAddress
;
3069 pVBInfo
->ISXPDOS
= 0 ;
3071 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
3072 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
3073 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
3074 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
3075 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
3076 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
3077 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
3078 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
3079 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
3080 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
3081 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
3082 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
3083 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
3084 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
3085 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
3086 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
3087 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
3089 InitTo330Pointer(HwDeviceExtension
->jChipType
,pVBInfo
);
3091 ReadVBIOSTablData( HwDeviceExtension
->jChipType
, pVBInfo
) ;
3093 if ( XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) == 0 )
3094 XGINew_DDR1x_MRS_XG20( pVBInfo
->P3c4
, pVBInfo
) ;
3096 //XGINew_DDR2_MRS_XG27( HwDeviceExtension , pVBInfo->P3c4 , pVBInfo ) ;
3097 XGINew_DDRII_Bootup_XG27( HwDeviceExtension
, pVBInfo
->P3c4
, pVBInfo
) ;
3099 //XGINew_SetReg1( pVBInfo->P3c4 , 0x1B , 0x03 ) ;
3100 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , pVBInfo
->SR15
[ 3 ][ XGINew_RAMType
] ) ; /* SR1B */
3104 void XGINew_SetDRAMModeRegister_XG27( PXGI_HW_DEVICE_INFO HwDeviceExtension )
3109 VB_DEVICE_INFO VBINF;
3110 PVB_DEVICE_INFO pVBInfo = &VBINF;
3111 pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ;
3112 pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ;
3113 pVBInfo->BaseAddr = HwDeviceExtension->pjIOAddress ;
3114 pVBInfo->ISXPDOS = 0 ;
3116 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14 ;
3117 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24 ;
3118 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10 ;
3119 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e ;
3120 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12 ;
3121 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a ;
3122 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16 ;
3123 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17 ;
3124 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18 ;
3125 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19 ;
3126 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A ;
3127 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00 ;
3128 pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04 ;
3129 pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10 ;
3130 pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12 ;
3131 pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 ;
3132 pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2 ;
3134 InitTo330Pointer(HwDeviceExtension->jChipType,pVBInfo);
3136 ReadVBIOSTablData( HwDeviceExtension->jChipType , pVBInfo) ;
3138 if ( XGINew_GetXG20DRAMType( HwDeviceExtension, pVBInfo) == 0 )
3139 XGINew_DDR1x_MRS_XG20( pVBInfo->P3c4, pVBInfo ) ;
3141 XGINew_DDR2_MRS_XG27( HwDeviceExtension , pVBInfo->P3c4 , pVBInfo ) ;
3143 XGINew_SetReg1( pVBInfo->P3c4 , 0x1B , 0x03 ) ;
3146 /* -------------------------------------------------------- */
3147 /* Function : XGINew_ChkSenseStatus */
3151 /* -------------------------------------------------------- */
3152 void XGINew_ChkSenseStatus ( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
3154 USHORT tempbx
=0 , temp
, tempcx
, CR3CData
;
3156 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x32 ) ;
3158 if ( temp
& Monitor1Sense
)
3159 tempbx
|= ActiveCRT1
;
3160 if ( temp
& LCDSense
)
3161 tempbx
|= ActiveLCD
;
3162 if ( temp
& Monitor2Sense
)
3163 tempbx
|= ActiveCRT2
;
3164 if ( temp
& TVSense
)
3166 tempbx
|= ActiveTV
;
3167 if ( temp
& AVIDEOSense
)
3168 tempbx
|= ( ActiveAVideo
<< 8 );
3169 if ( temp
& SVIDEOSense
)
3170 tempbx
|= ( ActiveSVideo
<< 8 );
3171 if ( temp
& SCARTSense
)
3172 tempbx
|= ( ActiveSCART
<< 8 );
3173 if ( temp
& HiTVSense
)
3174 tempbx
|= ( ActiveHiTV
<< 8 );
3175 if ( temp
& YPbPrSense
)
3176 tempbx
|= ( ActiveYPbPr
<< 8 );
3179 tempcx
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x3d ) ;
3180 tempcx
|= ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x3e ) << 8 ) ;
3182 if ( tempbx
& tempcx
)
3184 CR3CData
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x3c ) ;
3185 if ( !( CR3CData
& DisplayDeviceFromCMOS
) )
3188 if ( *pVBInfo
->pSoftSetting
& ModeSoftSetting
)
3197 if ( *pVBInfo
->pSoftSetting
& ModeSoftSetting
)
3204 XGINew_SetReg1( pVBInfo
->P3d4
, 0x3d , ( tempbx
& 0x00FF ) ) ;
3205 XGINew_SetReg1( pVBInfo
->P3d4
, 0x3e , ( ( tempbx
& 0xFF00 ) >> 8 )) ;
3207 /* -------------------------------------------------------- */
3208 /* Function : XGINew_SetModeScratch */
3212 /* -------------------------------------------------------- */
3213 void XGINew_SetModeScratch ( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
3215 USHORT temp
, tempcl
= 0 , tempch
= 0 , CR31Data
, CR38Data
;
3217 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x3d ) ;
3218 temp
|= XGINew_GetReg1( pVBInfo
->P3d4
, 0x3e ) << 8 ;
3219 temp
|= ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x31 ) & ( DriverMode
>> 8) ) << 8 ;
3221 if ( pVBInfo
->IF_DEF_CRT2Monitor
== 1)
3223 if ( temp
& ActiveCRT2
)
3224 tempcl
= SetCRT2ToRAMDAC
;
3227 if ( temp
& ActiveLCD
)
3229 tempcl
|= SetCRT2ToLCD
;
3230 if ( temp
& DriverMode
)
3232 if ( temp
& ActiveTV
)
3234 tempch
= SetToLCDA
| EnableDualEdge
;
3235 temp
^= SetCRT2ToLCD
;
3237 if ( ( temp
>> 8 ) & ActiveAVideo
)
3238 tempcl
|= SetCRT2ToAVIDEO
;
3239 if ( ( temp
>> 8 ) & ActiveSVideo
)
3240 tempcl
|= SetCRT2ToSVIDEO
;
3241 if ( ( temp
>> 8 ) & ActiveSCART
)
3242 tempcl
|= SetCRT2ToSCART
;
3244 if ( pVBInfo
->IF_DEF_HiVision
== 1 )
3246 if ( ( temp
>> 8 ) & ActiveHiTV
)
3247 tempcl
|= SetCRT2ToHiVisionTV
;
3250 if ( pVBInfo
->IF_DEF_YPbPr
== 1 )
3252 if ( ( temp
>> 8 ) & ActiveYPbPr
)
3253 tempch
|= SetYPbPr
;
3260 if ( ( temp
>> 8 ) & ActiveAVideo
)
3261 tempcl
|= SetCRT2ToAVIDEO
;
3262 if ( ( temp
>> 8 ) & ActiveSVideo
)
3263 tempcl
|= SetCRT2ToSVIDEO
;
3264 if ( ( temp
>> 8 ) & ActiveSCART
)
3265 tempcl
|= SetCRT2ToSCART
;
3267 if ( pVBInfo
->IF_DEF_HiVision
== 1 )
3269 if ( ( temp
>> 8 ) & ActiveHiTV
)
3270 tempcl
|= SetCRT2ToHiVisionTV
;
3273 if ( pVBInfo
->IF_DEF_YPbPr
== 1 )
3275 if ( ( temp
>> 8 ) & ActiveYPbPr
)
3276 tempch
|= SetYPbPr
;
3281 tempcl
|= SetSimuScanMode
;
3282 if ( (!( temp
& ActiveCRT1
)) && ( ( temp
& ActiveLCD
) || ( temp
& ActiveTV
) || ( temp
& ActiveCRT2
) ) )
3283 tempcl
^= ( SetSimuScanMode
| SwitchToCRT2
) ;
3284 if ( ( temp
& ActiveLCD
) && ( temp
& ActiveTV
) )
3285 tempcl
^= ( SetSimuScanMode
| SwitchToCRT2
) ;
3286 XGINew_SetReg1( pVBInfo
->P3d4
, 0x30 , tempcl
) ;
3288 CR31Data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x31 ) ;
3289 CR31Data
&= ~( SetNotSimuMode
>> 8 ) ;
3290 if ( !( temp
& ActiveCRT1
) )
3291 CR31Data
|= ( SetNotSimuMode
>> 8 ) ;
3292 CR31Data
&= ~( DisableCRT2Display
>> 8 ) ;
3293 if (!( ( temp
& ActiveLCD
) || ( temp
& ActiveTV
) || ( temp
& ActiveCRT2
) ) )
3294 CR31Data
|= ( DisableCRT2Display
>> 8 ) ;
3295 XGINew_SetReg1( pVBInfo
->P3d4
, 0x31 , CR31Data
) ;
3297 CR38Data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
3298 CR38Data
&= ~SetYPbPr
;
3299 CR38Data
|= tempch
;
3300 XGINew_SetReg1( pVBInfo
->P3d4
, 0x38 , CR38Data
) ;
3304 /* -------------------------------------------------------- */
3305 /* Function : XGINew_GetXG21Sense */
3309 /* -------------------------------------------------------- */
3310 void XGINew_GetXG21Sense(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
3313 PUCHAR
volatile pVideoMemory
= ( PUCHAR
)pVBInfo
->ROMAddr
;
3315 pVBInfo
->IF_DEF_LVDS
= 0 ;
3318 if (( pVideoMemory
[ 0x65 ] & 0x01 ) ) /* For XG21 LVDS */
3320 pVBInfo
->IF_DEF_LVDS
= 1 ;
3321 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x32 , LCDSense
) ;
3322 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0xC0 ) ; /* LVDS on chip */
3327 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x03 , 0x03 ) ; /* Enable GPIOA/B read */
3328 Temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) & 0xC0;
3330 { /* DVI & DVO GPIOA/B pull high */
3331 XGINew_SenseLCD( HwDeviceExtension
, pVBInfo
) ;
3332 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x32 , LCDSense
) ;
3333 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x20 , 0x20 ) ; /* Enable read GPIOF */
3334 Temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) & 0x04 ;
3336 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0x80 ) ; /* TMDS on chip */
3338 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0xA0 ) ; /* Only DVO on chip */
3339 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x4A , ~0x20 ) ; /* Disable read GPIOF */
3346 /* -------------------------------------------------------- */
3347 /* Function : XGINew_GetXG27Sense */
3351 /* -------------------------------------------------------- */
3352 void XGINew_GetXG27Sense(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
3356 pVBInfo
->IF_DEF_LVDS
= 0 ;
3357 bCR4A
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x4A ) ;
3358 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x07 , 0x07 ) ; /* Enable GPIOA/B/C read */
3359 Temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) & 0x07;
3360 XGINew_SetReg1( pVBInfo
->P3d4
, 0x4A , bCR4A
) ;
3364 pVBInfo
->IF_DEF_LVDS
= 1 ;
3365 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0xC0 ) ; /* LVDS setting */
3366 XGINew_SetReg1( pVBInfo
->P3d4
, 0x30 , 0x21 ) ;
3370 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0xA0 ) ; /* TMDS/DVO setting */
3372 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x32 , LCDSense
) ;
3376 UCHAR
GetXG21FPBits(PVB_DEVICE_INFO pVBInfo
)
3378 UCHAR CR38
,CR4A
,temp
;
3380 CR4A
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x4A ) ;
3381 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x10 , 0x10 ) ; /* enable GPIOE read */
3382 CR38
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
3384 if ( ( CR38
& 0xE0 ) > 0x80 )
3386 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) ;
3391 XGINew_SetReg1( pVBInfo
->P3d4
, 0x4A , CR4A
) ;
3396 UCHAR
GetXG27FPBits(PVB_DEVICE_INFO pVBInfo
)
3400 CR4A
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x4A ) ;
3401 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x03 , 0x03 ) ; /* enable GPIOA/B/C read */
3402 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) ;
3409 temp
= ((temp
&0x04)>>1) || ((~temp
)&0x01);
3411 XGINew_SetReg1( pVBInfo
->P3d4
, 0x4A , CR4A
) ;