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>
29 #include "vb_struct.h"
31 #include "vb_setmode.h"
37 #include "xf86PciInfo.h"
49 UCHAR XGINew_ChannelAB
,XGINew_DataBusWidth
;
51 USHORT XGINew_DRAMType
[17][5]={{0x0C,0x0A,0x02,0x40,0x39},{0x0D,0x0A,0x01,0x40,0x48},
52 {0x0C,0x09,0x02,0x20,0x35},{0x0D,0x09,0x01,0x20,0x44},
53 {0x0C,0x08,0x02,0x10,0x31},{0x0D,0x08,0x01,0x10,0x40},
54 {0x0C,0x0A,0x01,0x20,0x34},{0x0C,0x09,0x01,0x08,0x32},
55 {0x0B,0x08,0x02,0x08,0x21},{0x0C,0x08,0x01,0x08,0x30},
56 {0x0A,0x08,0x02,0x04,0x11},{0x0B,0x0A,0x01,0x10,0x28},
57 {0x09,0x08,0x02,0x02,0x01},{0x0B,0x09,0x01,0x08,0x24},
58 {0x0B,0x08,0x01,0x04,0x20},{0x0A,0x08,0x01,0x02,0x10},
59 {0x09,0x08,0x01,0x01,0x00}};
61 USHORT XGINew_SDRDRAM_TYPE
[13][5]=
78 USHORT XGINew_DDRDRAM_TYPE
[4][5]=
85 USHORT XGINew_DDRDRAM_TYPE340
[4][5]=
92 USHORT XGINew_DDRDRAM_TYPE20
[12][5]=
108 void XGINew_SetDRAMSize_340(PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO
);
109 void XGINew_SetDRAMSize_310(PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO
);
110 void XGINew_SetMemoryClock(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO
);
111 void XGINew_SetDRAMModeRegister(PVB_DEVICE_INFO
);
112 void XGINew_SetDRAMModeRegister340( PXGI_HW_DEVICE_INFO HwDeviceExtension
);
113 void XGINew_SetDRAMDefaultRegister340(PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG
, PVB_DEVICE_INFO
);
114 UCHAR
XGINew_GetXG20DRAMType( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
);
115 BOOLEAN
XGIInitNew( PXGI_HW_DEVICE_INFO HwDeviceExtension
) ;
117 int XGINew_DDRSizing340( PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO
);
118 void XGINew_DisableRefresh( PXGI_HW_DEVICE_INFO
,PVB_DEVICE_INFO
) ;
119 void XGINew_CheckBusWidth_310( PVB_DEVICE_INFO
) ;
120 int XGINew_SDRSizing(PVB_DEVICE_INFO
);
121 int XGINew_DDRSizing( PVB_DEVICE_INFO
);
122 void XGINew_EnableRefresh( PXGI_HW_DEVICE_INFO
, PVB_DEVICE_INFO
);
123 int XGINew_RAMType
; /*int ModeIDOffset,StandTable,CRT1Table,ScreenOffset,REFIndex;*/
124 ULONG UNIROM
; /* UNIROM */
125 BOOLEAN
ChkLFB( PVB_DEVICE_INFO
);
126 void XGINew_Delay15us(ULONG
);
127 void SetPowerConsume (PXGI_HW_DEVICE_INFO HwDeviceExtension
,ULONG XGI_P3d4Port
);
128 void ReadVBIOSTablData( UCHAR ChipType
, PVB_DEVICE_INFO pVBInfo
);
129 void XGINew_DDR1x_MRS_XG20( ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
);
130 void XGINew_SetDRAMModeRegister_XG20( PXGI_HW_DEVICE_INFO HwDeviceExtension
);
131 void XGINew_SetDRAMModeRegister_XG27( PXGI_HW_DEVICE_INFO HwDeviceExtension
);
132 void XGINew_ChkSenseStatus ( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
) ;
133 void XGINew_SetModeScratch ( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
) ;
134 void XGINew_GetXG21Sense(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
) ;
135 UCHAR
GetXG21FPBits(PVB_DEVICE_INFO pVBInfo
);
136 void XGINew_GetXG27Sense(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
) ;
137 UCHAR
GetXG27FPBits(PVB_DEVICE_INFO pVBInfo
);
140 /* [Billy] 2007/05/20 For CH7007 */
141 extern UCHAR CH7007TVReg_UNTSC
[][8],CH7007TVReg_ONTSC
[][8],CH7007TVReg_UPAL
[][8],CH7007TVReg_OPAL
[][8];
142 extern UCHAR XGI7007_CHTVVCLKUNTSC
[],XGI7007_CHTVVCLKONTSC
[],XGI7007_CHTVVCLKUPAL
[],XGI7007_CHTVVCLKOPAL
[];
146 void DelayUS(ULONG MicroSeconds
)
148 udelay(MicroSeconds
);
152 /* --------------------------------------------------------------------- */
153 /* Function : XGIInitNew */
157 /* --------------------------------------------------------------------- */
158 BOOLEAN
XGIInitNew( PXGI_HW_DEVICE_INFO HwDeviceExtension
)
161 VB_DEVICE_INFO VBINF
;
162 PVB_DEVICE_INFO pVBInfo
= &VBINF
;
163 UCHAR i
, temp
= 0 , temp1
;
164 // VBIOSVersion[ 5 ] ;
165 PUCHAR
volatile pVideoMemory
;
173 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
175 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
177 pVBInfo
->BaseAddr
= (ULONG
)HwDeviceExtension
->pjIOAddress
;
179 pVideoMemory
= ( PUCHAR
)pVBInfo
->ROMAddr
;
182 // Newdebugcode( 0x99 ) ;
185 /* if ( pVBInfo->ROMAddr == 0 ) */
186 /* return( FALSE ) ; */
188 if ( pVBInfo
->FBAddr
== 0 )
190 printk("\n pVBInfo->FBAddr == 0 ");
194 if ( pVBInfo
->BaseAddr
== 0 )
196 printk("\npVBInfo->BaseAddr == 0 ");
201 XGINew_SetReg3( ( pVBInfo
->BaseAddr
+ 0x12 ) , 0x67 ) ; /* 3c2 <- 67 ,ynlai */
203 pVBInfo
->ISXPDOS
= 0 ;
206 if ( !HwDeviceExtension
->bIntegratedMMEnabled
)
208 return( FALSE
) ; /* alan */
212 // XGI_MemoryCopy( VBIOSVersion , HwDeviceExtension->szVBIOSVer , 4 ) ;
214 // VBIOSVersion[ 4 ] = 0x0 ;
216 /* 09/07/99 modify by domao */
218 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
219 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
220 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
221 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
222 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
223 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
224 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
225 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
226 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
227 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
228 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
229 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
230 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
231 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
232 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
233 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
234 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
237 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
238 XGI_GetVBType( pVBInfo
) ; /* Run XGI_GetVBType before InitTo330Pointer */
240 InitTo330Pointer( HwDeviceExtension
->jChipType
, pVBInfo
) ;
243 ReadVBIOSTablData( HwDeviceExtension
->jChipType
, pVBInfo
) ;
246 XGINew_SetReg1( pVBInfo
->P3c4
, 0x05 , 0x86 ) ;
249 /* GetXG21Sense (GPIO) */
250 if ( HwDeviceExtension
->jChipType
== XG21
)
252 XGINew_GetXG21Sense(HwDeviceExtension
, pVBInfo
) ;
254 if ( HwDeviceExtension
->jChipType
== XG27
)
256 XGINew_GetXG27Sense(HwDeviceExtension
, pVBInfo
) ;
260 /* 2.Reset Extended register */
262 for( i
= 0x06 ; i
< 0x20 ; i
++ )
263 XGINew_SetReg1( pVBInfo
->P3c4
, i
, 0 ) ;
265 for( i
= 0x21 ; i
<= 0x27 ; i
++ )
266 XGINew_SetReg1( pVBInfo
->P3c4
, i
, 0 ) ;
268 /* for( i = 0x06 ; i <= 0x27 ; i++ ) */
269 /* XGINew_SetReg1( pVBInfo->P3c4 , i , 0 ) ; */
273 if(( HwDeviceExtension
->jChipType
>= XG20
) || ( HwDeviceExtension
->jChipType
>= XG40
))
275 for( i
= 0x31 ; i
<= 0x3B ; i
++ )
276 XGINew_SetReg1( pVBInfo
->P3c4
, i
, 0 ) ;
280 for( i
= 0x31 ; i
<= 0x3D ; i
++ )
281 XGINew_SetReg1( pVBInfo
->P3c4
, i
, 0 ) ;
285 if ( HwDeviceExtension
->jChipType
== XG42
) /* [Hsuan] 2004/08/20 Auto over driver for XG42 */
286 XGINew_SetReg1( pVBInfo
->P3c4
, 0x3B , 0xC0 ) ;
288 /* for( i = 0x30 ; i <= 0x3F ; i++ ) */
289 /* XGINew_SetReg1( pVBInfo->P3d4 , i , 0 ) ; */
291 for( i
= 0x79 ; i
<= 0x7C ; i
++ )
292 XGINew_SetReg1( pVBInfo
->P3d4
, i
, 0 ) ; /* shampoo 0208 */
296 if ( HwDeviceExtension
->jChipType
>= XG20
)
297 XGINew_SetReg1( pVBInfo
->P3d4
, 0x97 , *pVBInfo
->pXGINew_CR97
) ;
301 if ( HwDeviceExtension->jChipType >= XG40 )
302 XGINew_RAMType = ( int )XGINew_GetXG20DRAMType( HwDeviceExtension , pVBInfo) ;
304 if ( HwDeviceExtension->jChipType < XG40 )
305 XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; */
309 /* 4.SetDefExt1Regs begin */
310 XGINew_SetReg1( pVBInfo
->P3c4
, 0x07 , *pVBInfo
->pSR07
) ;
311 if ( HwDeviceExtension
->jChipType
== XG27
)
313 XGINew_SetReg1( pVBInfo
->P3c4
, 0x40 , *pVBInfo
->pSR40
) ;
314 XGINew_SetReg1( pVBInfo
->P3c4
, 0x41 , *pVBInfo
->pSR41
) ;
316 XGINew_SetReg1( pVBInfo
->P3c4
, 0x11 , 0x0F ) ;
317 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1F , *pVBInfo
->pSR1F
) ;
318 /* XGINew_SetReg1( pVBInfo->P3c4 , 0x20 , 0x20 ) ; */
319 XGINew_SetReg1( pVBInfo
->P3c4
, 0x20 , 0xA0 ) ; /* alan, 2001/6/26 Frame buffer can read/write SR20 */
320 XGINew_SetReg1( pVBInfo
->P3c4
, 0x36 , 0x70 ) ; /* Hsuan, 2006/01/01 H/W request for slow corner chip */
321 if ( HwDeviceExtension
->jChipType
== XG27
) /* Alan 12/07/2006 */
322 XGINew_SetReg1( pVBInfo
->P3c4
, 0x36 , *pVBInfo
->pSR36
) ;
325 /* XGINew_SetReg1( pVBInfo->P3c4 , 0x11 , SR11 ) ; */
329 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
331 // /* Set AGP Rate */
332 // temp1 = XGINew_GetReg1( pVBInfo->P3c4 , 0x3B ) ;
334 // if ( temp1 == 0x02 )
336 // XGINew_SetReg4( 0xcf8 , 0x80000000 ) ;
337 // ChipsetID = XGINew_GetReg3( 0x0cfc ) ;
338 // XGINew_SetReg4( 0xcf8 , 0x8000002C ) ;
339 // VendorID = XGINew_GetReg3( 0x0cfc ) ;
340 // VendorID &= 0x0000FFFF ;
341 // XGINew_SetReg4( 0xcf8 , 0x8001002C ) ;
342 // GraphicVendorID = XGINew_GetReg3( 0x0cfc ) ;
343 // GraphicVendorID &= 0x0000FFFF;
345 // if ( ChipsetID == 0x7301039 )
346 /// XGINew_SetReg1( pVBInfo->P3d4 , 0x5F , 0x09 ) ;
348 // ChipsetID &= 0x0000FFFF ;
350 // if ( ( ChipsetID == 0x700E ) || ( ChipsetID == 0x1022 ) || ( ChipsetID == 0x1106 ) || ( ChipsetID == 0x10DE ) )
352 // if ( ChipsetID == 0x1106 )
354 // if ( ( VendorID == 0x1019 ) && ( GraphicVendorID == 0x1019 ) )
355 // XGINew_SetReg1( pVBInfo->P3d4 , 0x5F , 0x0D ) ;
357 // XGINew_SetReg1( pVBInfo->P3d4 , 0x5F , 0x0B ) ;
360 // XGINew_SetReg1( pVBInfo->P3d4 , 0x5F , 0x0B ) ;
366 if ( HwDeviceExtension
->jChipType
>= XG40
)
368 /* Set AGP customize registers (in SetDefAGPRegs) Start */
369 for( i
= 0x47 ; i
<= 0x4C ; i
++ )
370 XGINew_SetReg1( pVBInfo
->P3d4
, i
, pVBInfo
->AGPReg
[ i
- 0x47 ] ) ;
372 for( i
= 0x70 ; i
<= 0x71 ; i
++ )
373 XGINew_SetReg1( pVBInfo
->P3d4
, i
, pVBInfo
->AGPReg
[ 6 + i
- 0x70 ] ) ;
375 for( i
= 0x74 ; i
<= 0x77 ; i
++ )
376 XGINew_SetReg1( pVBInfo
->P3d4
, i
, pVBInfo
->AGPReg
[ 8 + i
- 0x74 ] ) ;
377 /* Set AGP customize registers (in SetDefAGPRegs) End */
378 /*[Hsuan]2004/12/14 AGP Input Delay Adjustment on 850 */
379 // XGINew_SetReg4( 0xcf8 , 0x80000000 ) ;
380 // ChipsetID = XGINew_GetReg3( 0x0cfc ) ;
381 // if ( ChipsetID == 0x25308086 )
382 // XGINew_SetReg1( pVBInfo->P3d4 , 0x77 , 0xF0 ) ;
384 HwDeviceExtension
->pQueryVGAConfigSpace( HwDeviceExtension
, 0x50 , 0 , &Temp
) ; /* Get */
389 XGINew_SetReg1( pVBInfo
->P3d4
, 0x48 , 0x20 ) ; /* CR48 */
393 if ( HwDeviceExtension
->jChipType
< XG40
)
394 XGINew_SetReg1( pVBInfo
->P3d4
, 0x49 , pVBInfo
->CR49
[ 0 ] ) ;
398 XGINew_SetReg1( pVBInfo
->P3c4
, 0x23 , *pVBInfo
->pSR23
) ;
399 XGINew_SetReg1( pVBInfo
->P3c4
, 0x24 , *pVBInfo
->pSR24
) ;
400 XGINew_SetReg1( pVBInfo
->P3c4
, 0x25 , pVBInfo
->SR25
[ 0 ] ) ;
403 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
406 XGI_UnLockCRT2( HwDeviceExtension
, pVBInfo
) ;
407 XGINew_SetRegANDOR( pVBInfo
->Part0Port
, 0x3F , 0xEF , 0x00 ) ; /* alan, disable VideoCapture */
408 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x00 , 0x00 ) ;
409 temp1
= ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3d4
, 0x7B ) ; /* chk if BCLK>=100MHz */
410 temp
= ( UCHAR
)( ( temp1
>> 4 ) & 0x0F ) ;
413 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x02 , ( *pVBInfo
->pCRT2Data_1_2
) ) ;
417 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x2E , 0x08 ) ; /* use VB */
421 XGINew_SetReg1( pVBInfo
->P3c4
, 0x27 , 0x1F ) ;
423 if ( ( HwDeviceExtension
->jChipType
== XG42
) && XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) != 0 ) /* Not DDR */
425 XGINew_SetReg1( pVBInfo
->P3c4
, 0x31 , ( *pVBInfo
->pSR31
& 0x3F ) | 0x40 ) ;
426 XGINew_SetReg1( pVBInfo
->P3c4
, 0x32 , ( *pVBInfo
->pSR32
& 0xFC ) | 0x01 ) ;
430 XGINew_SetReg1( pVBInfo
->P3c4
, 0x31 , *pVBInfo
->pSR31
) ;
431 XGINew_SetReg1( pVBInfo
->P3c4
, 0x32 , *pVBInfo
->pSR32
) ;
433 XGINew_SetReg1( pVBInfo
->P3c4
, 0x33 , *pVBInfo
->pSR33
) ;
437 if ( HwDeviceExtension->jChipType >= XG40 )
438 SetPowerConsume ( HwDeviceExtension , pVBInfo->P3c4); */
440 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
442 if ( XGI_BridgeIsOn( pVBInfo
) == 1 )
444 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
446 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x00 , 0x1C ) ;
447 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x0D , *pVBInfo
->pCRT2Data_4_D
) ;
448 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x0E , *pVBInfo
->pCRT2Data_4_E
) ;
449 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x10 , *pVBInfo
->pCRT2Data_4_10
) ;
450 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x0F , 0x3F ) ;
453 XGI_LockCRT2( HwDeviceExtension
, pVBInfo
) ;
458 if ( HwDeviceExtension
->jChipType
< XG40
)
459 XGINew_SetReg1( pVBInfo
->P3d4
, 0x83 , 0x00 ) ;
462 if ( HwDeviceExtension
->bSkipSense
== FALSE
)
466 XGI_SenseCRT1(pVBInfo
) ;
469 /* XGINew_DetectMonitor( HwDeviceExtension ) ; */
470 pVBInfo
->IF_DEF_CH7007
= 0;
471 if ( ( HwDeviceExtension
->jChipType
== XG21
) && (pVBInfo
->IF_DEF_CH7007
) )
474 XGI_GetSenseStatus( HwDeviceExtension
, pVBInfo
) ; /* sense CRT2 */
478 if ( HwDeviceExtension
->jChipType
== XG21
)
482 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , ~Monitor1Sense
, Monitor1Sense
) ; /* Z9 default has CRT */
483 temp
= GetXG21FPBits( pVBInfo
) ;
484 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x37 , ~0x01, temp
) ;
488 if ( HwDeviceExtension
->jChipType
== XG27
)
490 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , ~Monitor1Sense
, Monitor1Sense
) ; /* Z9 default has CRT */
491 temp
= GetXG27FPBits( pVBInfo
) ;
492 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x37 , ~0x03, temp
) ;
497 if ( HwDeviceExtension
->jChipType
>= XG40
)
499 if ( HwDeviceExtension
->jChipType
>= XG40
)
501 XGINew_RAMType
= ( int )XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
504 XGINew_SetDRAMDefaultRegister340( HwDeviceExtension
, pVBInfo
->P3d4
, pVBInfo
) ;
506 if ( HwDeviceExtension
->bSkipDramSizing
== TRUE
)
508 pSR
= HwDeviceExtension
->pSR
;
511 while( pSR
->jIdx
!= 0xFF )
513 XGINew_SetReg1( pVBInfo
->P3c4
, pSR
->jIdx
, pSR
->jVal
) ;
517 /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */
518 } /* SkipDramSizing */
522 if ( HwDeviceExtension
->jChipType
== XG20
)
524 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , pVBInfo
->SR15
[0][XGINew_RAMType
] ) ;
525 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , pVBInfo
->SR15
[1][XGINew_RAMType
] ) ;
526 XGINew_SetReg1( pVBInfo
->P3c4
, 0x20 , 0x20 ) ;
533 XGINew_SetDRAMSize_340( HwDeviceExtension
, pVBInfo
) ;
543 /* SetDefExt2Regs begin */
546 temp =( UCHAR )XGINew_GetReg1( pVBInfo->P3c4 , 0x3A ) ;
552 *pVBInfo->pSR21 &= 0xEF ;
554 XGINew_SetReg1( pVBInfo->P3c4 , 0x21 , *pVBInfo->pSR21 ) ;
556 *pVBInfo->pSR22 &= 0x20 ;
557 XGINew_SetReg1( pVBInfo->P3c4 , 0x22 , *pVBInfo->pSR22 ) ;
560 // base = 0x80000000 ;
561 // OutPortLong( 0xcf8 , base ) ;
562 // Temp = ( InPortLong( 0xcfc ) & 0xFFFF ) ;
563 // if ( Temp == 0x1039 )
565 XGINew_SetReg1( pVBInfo
->P3c4
, 0x22 , ( UCHAR
)( ( *pVBInfo
->pSR22
) & 0xFE ) ) ;
569 // XGINew_SetReg1( pVBInfo->P3c4 , 0x22 , *pVBInfo->pSR22 ) ;
572 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , *pVBInfo
->pSR21
) ;
577 XGINew_ChkSenseStatus ( HwDeviceExtension
, pVBInfo
) ;
578 XGINew_SetModeScratch ( HwDeviceExtension
, pVBInfo
) ;
583 XGINew_SetReg1( pVBInfo
->P3d4
, 0x8c , 0x87);
584 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x31);
594 /* ============== alan ====================== */
596 /* --------------------------------------------------------------------- */
597 /* Function : XGINew_GetXG20DRAMType */
601 /* --------------------------------------------------------------------- */
602 UCHAR
XGINew_GetXG20DRAMType( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
606 if ( HwDeviceExtension
->jChipType
< XG20
)
608 if ( *pVBInfo
->pSoftSetting
& SoftDRAMType
)
610 data
= *pVBInfo
->pSoftSetting
& 0x07 ;
615 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x39 ) & 0x02 ;
618 data
= ( XGINew_GetReg1( pVBInfo
->P3c4
, 0x3A ) & 0x02 ) >> 1 ;
623 else if ( HwDeviceExtension
->jChipType
== XG27
)
625 if ( *pVBInfo
->pSoftSetting
& SoftDRAMType
)
627 data
= *pVBInfo
->pSoftSetting
& 0x07 ;
630 temp
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3B ) ;
632 if (( temp
& 0x88 )==0x80) /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
638 else if ( HwDeviceExtension
->jChipType
== XG21
)
640 XGINew_SetRegAND( pVBInfo
->P3d4
, 0xB4 , ~0x02 ) ; /* Independent GPIO control */
642 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x4A , 0x80 ) ; /* Enable GPIOH read */
643 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) ; /* GPIOF 0:DVI 1:DVO */
645 // for current XG20 & XG21, GPIOH is floating, driver will fix DDR temporarily
646 if ( temp
& 0x01 ) /* DVI read GPIOH */
651 XGINew_SetRegOR( pVBInfo
->P3d4
, 0xB4 , 0x02 ) ;
656 data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x97 ) & 0x01 ;
666 /* --------------------------------------------------------------------- */
667 /* Function : XGINew_Get310DRAMType */
671 /* --------------------------------------------------------------------- */
672 UCHAR
XGINew_Get310DRAMType(PVB_DEVICE_INFO pVBInfo
)
676 /* index = XGINew_GetReg1( pVBInfo->P3c4 , 0x1A ) ; */
679 if ( *pVBInfo
->pSoftSetting
& SoftDRAMType
)
680 data
= *pVBInfo
->pSoftSetting
& 0x03 ;
682 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3a ) & 0x03 ;
689 /* --------------------------------------------------------------------- */
690 /* Function : XGINew_Delay15us */
694 /* --------------------------------------------------------------------- */
696 void XGINew_Delay15us(ULONG ulMicrsoSec)
702 /* --------------------------------------------------------------------- */
703 /* Function : XGINew_SDR_MRS */
707 /* --------------------------------------------------------------------- */
708 void XGINew_SDR_MRS( PVB_DEVICE_INFO pVBInfo
)
712 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x16 ) ;
713 data
&= 0x3F ; /* SR16 D7=0,D6=0 */
714 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ; /* enable mode register set(MRS) low */
715 /* XGINew_Delay15us( 0x100 ) ; */
716 data
|= 0x80 ; /* SR16 D7=1,D6=0 */
717 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ; /* enable mode register set(MRS) high */
718 /* XGINew_Delay15us( 0x100 ) ; */
722 /* --------------------------------------------------------------------- */
723 /* Function : XGINew_DDR1x_MRS_340 */
727 /* --------------------------------------------------------------------- */
728 void XGINew_DDR1x_MRS_340( ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
)
730 XGINew_SetReg1( P3c4
, 0x18 , 0x01 ) ;
731 XGINew_SetReg1( P3c4
, 0x19 , 0x20 ) ;
732 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
733 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
735 if ( *pVBInfo
->pXGINew_DRAMTypeDefinition
!= 0x0C ) /* Samsung F Die */
737 DelayUS( 3000 ) ; /* Delay 67 x 3 Delay15us */
738 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ;
739 XGINew_SetReg1( P3c4
, 0x19 , 0x20 ) ;
740 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
741 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
745 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
746 XGINew_SetReg1( P3c4
, 0x19 , 0x01 ) ;
747 XGINew_SetReg1( P3c4
, 0x16 , pVBInfo
->SR16
[ 0 ] ) ;
748 XGINew_SetReg1( P3c4
, 0x16 , pVBInfo
->SR16
[ 1 ] ) ;
750 XGINew_SetReg1( P3c4
, 0x1B , 0x03 ) ;
752 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
753 XGINew_SetReg1( P3c4
, 0x19 , 0x00 ) ;
754 XGINew_SetReg1( P3c4
, 0x16 , pVBInfo
->SR16
[ 2 ] ) ;
755 XGINew_SetReg1( P3c4
, 0x16 , pVBInfo
->SR16
[ 3 ] ) ;
756 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ;
760 /* --------------------------------------------------------------------- */
761 /* Function : XGINew_DDR2x_MRS_340 */
765 /* --------------------------------------------------------------------- */
766 void XGINew_DDR2x_MRS_340( ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
)
768 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ;
769 XGINew_SetReg1( P3c4
, 0x19 , 0x20 ) ;
770 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
771 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
773 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
774 /* XGINew_SetReg1( P3c4 , 0x18 , 0x31 ) ; */
775 XGINew_SetReg1( P3c4
, 0x19 , 0x01 ) ;
776 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
777 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
779 XGINew_SetReg1( P3c4
, 0x1B , 0x03 ) ;
781 /* XGINew_SetReg1( P3c4 , 0x18 , 0x31 ) ; */
782 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
783 XGINew_SetReg1( P3c4
, 0x19 , 0x00 ) ;
784 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
785 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
786 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ;
789 /* --------------------------------------------------------------------- */
790 /* Function : XGINew_DDRII_Bootup_XG27 */
794 /* --------------------------------------------------------------------- */
795 void XGINew_DDRII_Bootup_XG27( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
)
797 ULONG P3d4
= P3c4
+ 0x10 ;
798 XGINew_RAMType
= ( int )XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
799 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
801 /* Set Double Frequency */
802 /* XGINew_SetReg1( P3d4 , 0x97 , 0x11 ) ; */ /* CR97 */
803 XGINew_SetReg1( P3d4
, 0x97 , *pVBInfo
->pXGINew_CR97
) ; /* CR97 */
807 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* Set SR18 */ //EMRS2
808 XGINew_SetReg1( P3c4
, 0x19 , 0x80 ) ; /* Set SR19 */
809 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
811 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
814 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* Set SR18 */ //EMRS3
815 XGINew_SetReg1( P3c4
, 0x19 , 0xC0 ) ; /* Set SR19 */
816 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
818 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
821 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* Set SR18 */ //EMRS1
822 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ; /* Set SR19 */
823 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
825 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
828 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* Set SR18 */ //MRS, DLL Enable
829 XGINew_SetReg1( P3c4
, 0x19 , 0x0A ) ; /* Set SR19 */
830 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ; /* Set SR16 */
832 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ; /* Set SR16 */
833 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ; /* Set SR16 */
834 /* DelayUS( 15 ) ; */
836 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* Set SR1B */
838 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ; /* Set SR1B */
840 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* Set SR18 */ //MRS, DLL Reset
841 XGINew_SetReg1( P3c4
, 0x19 , 0x08 ) ; /* Set SR19 */
842 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ; /* Set SR16 */
845 XGINew_SetReg1( P3c4
, 0x16 , 0x83 ) ; /* Set SR16 */
848 XGINew_SetReg1( P3c4
, 0x18 , 0x80 ) ; /* Set SR18 */ //MRS, ODT
849 XGINew_SetReg1( P3c4
, 0x19 , 0x46 ) ; /* Set SR19 */
850 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
852 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
855 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* Set SR18 */ //EMRS
856 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ; /* Set SR19 */
857 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
859 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
862 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* Set SR1B refresh control 000:close; 010:open */
867 /* --------------------------------------------------------------------- */
868 /* Function : XGINew_DDR2_MRS_XG20 */
872 /* --------------------------------------------------------------------- */
873 void XGINew_DDR2_MRS_XG20( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
)
875 ULONG P3d4
= P3c4
+ 0x10 ;
877 XGINew_RAMType
= ( int )XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
878 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
880 XGINew_SetReg1( P3d4
, 0x97 , 0x11 ) ; /* CR97 */
883 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS2 */
884 XGINew_SetReg1( P3c4
, 0x19 , 0x80 ) ;
885 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
886 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
888 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS3 */
889 XGINew_SetReg1( P3c4
, 0x19 , 0xC0 ) ;
890 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
891 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
893 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS1 */
894 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ;
895 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
896 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
898 // XGINew_SetReg1( P3c4 , 0x18 , 0x52 ) ; /* MRS1 */
899 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* MRS1 */
900 XGINew_SetReg1( P3c4
, 0x19 , 0x02 ) ;
901 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
902 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
905 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* SR1B */
907 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ; /* SR1B */
910 //XGINew_SetReg1( P3c4 , 0x18 , 0x52 ) ; /* MRS2 */
911 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* MRS1 */
912 XGINew_SetReg1( P3c4
, 0x19 , 0x00 ) ;
913 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
914 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
919 /* --------------------------------------------------------------------- */
920 /* Function : XGINew_DDR2_MRS_XG20 */
924 /* --------------------------------------------------------------------- */
925 void XGINew_DDR2_MRS_XG27( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
)
927 ULONG P3d4
= P3c4
+ 0x10 ;
929 XGINew_RAMType
= ( int )XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
930 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
932 XGINew_SetReg1( P3d4
, 0x97 , 0x11 ) ; /* CR97 */
934 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS2 */
935 XGINew_SetReg1( P3c4
, 0x19 , 0x80 ) ;
937 XGINew_SetReg1( P3c4
, 0x16 , 0x10 ) ;
938 DelayUS( 15 ) ; ////06/11/23 XG27 A0 for CKE enable
939 XGINew_SetReg1( P3c4
, 0x16 , 0x90 ) ;
941 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS3 */
942 XGINew_SetReg1( P3c4
, 0x19 , 0xC0 ) ;
944 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
945 DelayUS( 15 ) ; ////06/11/22 XG27 A0
946 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
949 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS1 */
950 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ;
952 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
953 DelayUS( 15 ) ; ////06/11/22 XG27 A0
954 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
956 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* MRS1 */
957 XGINew_SetReg1( P3c4
, 0x19 , 0x06 ) ; ////[Billy]06/11/22 DLL Reset for XG27 Hynix DRAM
959 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
960 DelayUS( 15 ) ; ////06/11/23 XG27 A0
961 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
963 DelayUS( 30 ) ; ////06/11/23 XG27 A0 Start Auto-PreCharge
964 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* SR1B */
966 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ; /* SR1B */
969 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* MRS1 */
970 XGINew_SetReg1( P3c4
, 0x19 , 0x04 ) ; //// DLL without Reset for XG27 Hynix DRAM
972 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
974 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
976 XGINew_SetReg1( P3c4
, 0x18 , 0x80 ); ////XG27 OCD ON
977 XGINew_SetReg1( P3c4
, 0x19 , 0x46 );
979 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
981 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
983 XGINew_SetReg1( P3c4
, 0x18 , 0x00 );
984 XGINew_SetReg1( P3c4
, 0x19 , 0x40 );
986 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
988 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
990 DelayUS( 15 ) ; ////Start Auto-PreCharge
991 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* SR1B */
993 XGINew_SetReg1( P3c4
, 0x1B , 0x03 ) ; /* SR1B */
997 /* --------------------------------------------------------------------- */
998 /* Function : XGINew_DDR1x_DefaultRegister */
1002 /* --------------------------------------------------------------------- */
1003 void XGINew_DDR1x_DefaultRegister( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG Port
, PVB_DEVICE_INFO pVBInfo
)
1006 P3c4
= Port
- 0x10 ;
1008 if ( HwDeviceExtension
->jChipType
>= XG20
)
1010 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
1011 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1012 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
1013 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ; /* CR86 */
1015 XGINew_SetReg1( P3d4
, 0x98 , 0x01 ) ;
1016 XGINew_SetReg1( P3d4
, 0x9A , 0x02 ) ;
1018 XGINew_DDR1x_MRS_XG20( P3c4
, pVBInfo
) ;
1022 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
1024 switch( HwDeviceExtension
->jChipType
)
1028 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1029 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
1030 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ; /* CR86 */
1033 XGINew_SetReg1( P3d4
, 0x82 , 0x88 ) ;
1034 XGINew_SetReg1( P3d4
, 0x86 , 0x00 ) ;
1035 XGINew_GetReg1( P3d4
, 0x86 ) ; /* Insert read command for delay */
1036 XGINew_SetReg1( P3d4
, 0x86 , 0x88 ) ;
1037 XGINew_GetReg1( P3d4
, 0x86 ) ;
1038 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ;
1039 XGINew_SetReg1( P3d4
, 0x82 , 0x77 ) ;
1040 XGINew_SetReg1( P3d4
, 0x85 , 0x00 ) ;
1041 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1042 XGINew_SetReg1( P3d4
, 0x85 , 0x88 ) ;
1043 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1044 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
1045 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1049 XGINew_SetReg1( P3d4
, 0x97 , 0x00 ) ;
1050 XGINew_SetReg1( P3d4
, 0x98 , 0x01 ) ;
1051 XGINew_SetReg1( P3d4
, 0x9A , 0x02 ) ;
1052 XGINew_DDR1x_MRS_340( P3c4
, pVBInfo
) ;
1057 /* --------------------------------------------------------------------- */
1058 /* Function : XGINew_DDR2x_DefaultRegister */
1062 /* --------------------------------------------------------------------- */
1063 void XGINew_DDR2x_DefaultRegister( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG Port
,PVB_DEVICE_INFO pVBInfo
)
1066 P3c4
= Port
- 0x10 ;
1068 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
1070 /* 20040906 Hsuan modify CR82, CR85, CR86 for XG42 */
1071 switch( HwDeviceExtension
->jChipType
)
1075 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1076 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
1077 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ; /* CR86 */
1080 /* keep following setting sequence, each setting in the same reg insert idle */
1081 XGINew_SetReg1( P3d4
, 0x82 , 0x88 ) ;
1082 XGINew_SetReg1( P3d4
, 0x86 , 0x00 ) ;
1083 XGINew_GetReg1( P3d4
, 0x86 ) ; /* Insert read command for delay */
1084 XGINew_SetReg1( P3d4
, 0x86 , 0x88 ) ;
1085 XGINew_SetReg1( P3d4
, 0x82 , 0x77 ) ;
1086 XGINew_SetReg1( P3d4
, 0x85 , 0x00 ) ;
1087 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1088 XGINew_SetReg1( P3d4
, 0x85 , 0x88 ) ;
1089 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1090 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
1091 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1093 XGINew_SetReg1( P3d4
, 0x97 , 0x11 ) ;
1094 if ( HwDeviceExtension
->jChipType
== XG42
)
1096 XGINew_SetReg1( P3d4
, 0x98 , 0x01 ) ;
1100 XGINew_SetReg1( P3d4
, 0x98 , 0x03 ) ;
1102 XGINew_SetReg1( P3d4
, 0x9A , 0x02 ) ;
1104 XGINew_DDR2x_MRS_340( P3c4
, pVBInfo
) ;
1108 /* --------------------------------------------------------------------- */
1109 /* Function : XGINew_DDR2_DefaultRegister */
1113 /* --------------------------------------------------------------------- */
1114 void XGINew_DDR2_DefaultRegister( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG Port
, PVB_DEVICE_INFO pVBInfo
)
1117 P3c4
= Port
- 0x10 ;
1119 /* keep following setting sequence, each setting in the same reg insert idle */
1120 XGINew_SetReg1( P3d4
, 0x82 , 0x77 ) ;
1121 XGINew_SetReg1( P3d4
, 0x86 , 0x00 ) ;
1122 XGINew_GetReg1( P3d4
, 0x86 ) ; /* Insert read command for delay */
1123 XGINew_SetReg1( P3d4
, 0x86 , 0x88 ) ;
1124 XGINew_GetReg1( P3d4
, 0x86 ) ; /* Insert read command for delay */
1125 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ; /* CR86 */
1126 XGINew_SetReg1( P3d4
, 0x82 , 0x77 ) ;
1127 XGINew_SetReg1( P3d4
, 0x85 , 0x00 ) ;
1128 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1129 XGINew_SetReg1( P3d4
, 0x85 , 0x88 ) ;
1130 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1131 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
1132 if ( HwDeviceExtension
->jChipType
== XG27
)
1133 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1135 XGINew_SetReg1( P3d4
, 0x82 , 0xA8 ) ; /* CR82 */
1137 XGINew_SetReg1( P3d4
, 0x98 , 0x01 ) ;
1138 XGINew_SetReg1( P3d4
, 0x9A , 0x02 ) ;
1139 if ( HwDeviceExtension
->jChipType
== XG27
)
1140 XGINew_DDRII_Bootup_XG27( HwDeviceExtension
, P3c4
, pVBInfo
) ;
1142 XGINew_DDR2_MRS_XG20( HwDeviceExtension
, P3c4
, pVBInfo
) ;
1146 /* --------------------------------------------------------------------- */
1147 /* Function : XGINew_SetDRAMDefaultRegister340 */
1151 /* --------------------------------------------------------------------- */
1152 void XGINew_SetDRAMDefaultRegister340( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG Port
, PVB_DEVICE_INFO pVBInfo
)
1154 UCHAR temp
, temp1
, temp2
, temp3
,
1158 P3c4
= Port
- 0x10 ;
1160 XGINew_SetReg1( P3d4
, 0x6D , pVBInfo
->CR40
[ 8 ][ XGINew_RAMType
] ) ;
1161 XGINew_SetReg1( P3d4
, 0x68 , pVBInfo
->CR40
[ 5 ][ XGINew_RAMType
] ) ;
1162 XGINew_SetReg1( P3d4
, 0x69 , pVBInfo
->CR40
[ 6 ][ XGINew_RAMType
] ) ;
1163 XGINew_SetReg1( P3d4
, 0x6A , pVBInfo
->CR40
[ 7 ][ XGINew_RAMType
] ) ;
1166 for( i
= 0 ; i
< 4 ; i
++ )
1168 temp
= pVBInfo
->CR6B
[ XGINew_RAMType
][ i
] ; /* CR6B DQS fine tune delay */
1169 for( j
= 0 ; j
< 4 ; j
++ )
1171 temp1
= ( ( temp
>> ( 2 * j
) ) & 0x03 ) << 2 ;
1173 XGINew_SetReg1( P3d4
, 0x6B , temp2
) ;
1174 XGINew_GetReg1( P3d4
, 0x6B ) ; /* Insert read command for delay */
1181 for( i
= 0 ; i
< 4 ; i
++ )
1183 temp
= pVBInfo
->CR6E
[ XGINew_RAMType
][ i
] ; /* CR6E DQM fine tune delay */
1184 for( j
= 0 ; j
< 4 ; j
++ )
1186 temp1
= ( ( temp
>> ( 2 * j
) ) & 0x03 ) << 2 ;
1188 XGINew_SetReg1( P3d4
, 0x6E , temp2
) ;
1189 XGINew_GetReg1( P3d4
, 0x6E ) ; /* Insert read command for delay */
1196 for( k
= 0 ; k
< 4 ; k
++ )
1198 XGINew_SetRegANDOR( P3d4
, 0x6E , 0xFC , temp3
) ; /* CR6E_D[1:0] select channel */
1200 for( i
= 0 ; i
< 8 ; i
++ )
1202 temp
= pVBInfo
->CR6F
[ XGINew_RAMType
][ 8 * k
+ i
] ; /* CR6F DQ fine tune delay */
1203 for( j
= 0 ; j
< 4 ; j
++ )
1205 temp1
= ( temp
>> ( 2 * j
) ) & 0x03 ;
1207 XGINew_SetReg1( P3d4
, 0x6F , temp2
) ;
1208 XGINew_GetReg1( P3d4
, 0x6F ) ; /* Insert read command for delay */
1216 XGINew_SetReg1( P3d4
, 0x80 , pVBInfo
->CR40
[ 9 ][ XGINew_RAMType
] ) ; /* CR80 */
1217 XGINew_SetReg1( P3d4
, 0x81 , pVBInfo
->CR40
[ 10 ][ XGINew_RAMType
] ) ; /* CR81 */
1220 temp
= pVBInfo
->CR89
[ XGINew_RAMType
][ 0 ] ; /* CR89 terminator type select */
1221 for( j
= 0 ; j
< 4 ; j
++ )
1223 temp1
= ( temp
>> ( 2 * j
) ) & 0x03 ;
1225 XGINew_SetReg1( P3d4
, 0x89 , temp2
) ;
1226 XGINew_GetReg1( P3d4
, 0x89 ) ; /* Insert read command for delay */
1231 temp
= pVBInfo
->CR89
[ XGINew_RAMType
][ 1 ] ;
1232 temp1
= temp
& 0x03 ;
1234 XGINew_SetReg1( P3d4
, 0x89 , temp2
) ;
1236 temp
= pVBInfo
->CR40
[ 3 ][ XGINew_RAMType
] ;
1237 temp1
= temp
& 0x0F ;
1238 temp2
= ( temp
>> 4 ) & 0x07 ;
1239 temp3
= temp
& 0x80 ;
1240 XGINew_SetReg1( P3d4
, 0x45 , temp1
) ; /* CR45 */
1241 XGINew_SetReg1( P3d4
, 0x99 , temp2
) ; /* CR99 */
1242 XGINew_SetRegOR( P3d4
, 0x40 , temp3
) ; /* CR40_D[7] */
1243 XGINew_SetReg1( P3d4
, 0x41 , pVBInfo
->CR40
[ 0 ][ XGINew_RAMType
] ) ; /* CR41 */
1245 if ( HwDeviceExtension
->jChipType
== XG27
)
1246 XGINew_SetReg1( P3d4
, 0x8F , *pVBInfo
->pCR8F
) ; /* CR8F */
1248 for( j
= 0 ; j
<= 6 ; j
++ )
1249 XGINew_SetReg1( P3d4
, ( 0x90 + j
) , pVBInfo
->CR40
[ 14 + j
][ XGINew_RAMType
] ) ; /* CR90 - CR96 */
1251 for( j
= 0 ; j
<= 2 ; j
++ )
1252 XGINew_SetReg1( P3d4
, ( 0xC3 + j
) , pVBInfo
->CR40
[ 21 + j
][ XGINew_RAMType
] ) ; /* CRC3 - CRC5 */
1254 for( j
= 0 ; j
< 2 ; j
++ )
1255 XGINew_SetReg1( P3d4
, ( 0x8A + j
) , pVBInfo
->CR40
[ 1 + j
][ XGINew_RAMType
] ) ; /* CR8A - CR8B */
1257 if ( ( HwDeviceExtension
->jChipType
== XG41
) || ( HwDeviceExtension
->jChipType
== XG42
) )
1258 XGINew_SetReg1( P3d4
, 0x8C , 0x87 ) ;
1260 XGINew_SetReg1( P3d4
, 0x59 , pVBInfo
->CR40
[ 4 ][ XGINew_RAMType
] ) ; /* CR59 */
1262 XGINew_SetReg1( P3d4
, 0x83 , 0x09 ) ; /* CR83 */
1263 XGINew_SetReg1( P3d4
, 0x87 , 0x00 ) ; /* CR87 */
1264 XGINew_SetReg1( P3d4
, 0xCF , *pVBInfo
->pCRCF
) ; /* CRCF */
1265 if ( XGINew_RAMType
)
1267 //XGINew_SetReg1( P3c4 , 0x17 , 0xC0 ) ; /* SR17 DDRII */
1268 XGINew_SetReg1( P3c4
, 0x17 , 0x80 ) ; /* SR17 DDRII */
1269 if ( HwDeviceExtension
->jChipType
== XG27
)
1270 XGINew_SetReg1( P3c4
, 0x17 , 0x02 ) ; /* SR17 DDRII */
1274 XGINew_SetReg1( P3c4
, 0x17 , 0x00 ) ; /* SR17 DDR */
1275 XGINew_SetReg1( P3c4
, 0x1A , 0x87 ) ; /* SR1A */
1277 temp
= XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
1279 XGINew_DDR1x_DefaultRegister( HwDeviceExtension
, P3d4
, pVBInfo
) ;
1282 XGINew_SetReg1( P3d4
, 0xB0 , 0x80 ) ; /* DDRII Dual frequency mode */
1283 XGINew_DDR2_DefaultRegister( HwDeviceExtension
, P3d4
, pVBInfo
) ;
1285 XGINew_SetReg1( P3c4
, 0x1B , pVBInfo
->SR15
[ 3 ][ XGINew_RAMType
] ) ; /* SR1B */
1289 /* --------------------------------------------------------------------- */
1290 /* Function : XGINew_DDR_MRS */
1294 /* --------------------------------------------------------------------- */
1295 void XGINew_DDR_MRS(PVB_DEVICE_INFO pVBInfo
)
1299 PUCHAR
volatile pVideoMemory
= ( PUCHAR
)pVBInfo
->ROMAddr
;
1301 /* SR16 <- 1F,DF,2F,AF */
1302 /* yriver modified SR16 <- 0F,DF,0F,AF */
1303 /* enable DLL of DDR SD/SGRAM , SR16 D4=1 */
1304 data
= pVideoMemory
[ 0xFB ] ;
1305 /* data = XGINew_GetReg1( pVBInfo->P3c4 , 0x16 ) ; */
1308 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1310 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1312 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1314 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1316 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1318 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1320 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1322 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1327 XGINew_SetReg1(pVBInfo->P3c4,0x16,data);
1329 if (!(pVBInfo->SR15[1][XGINew_RAMType] & 0x10))
1335 XGINew_SetReg1(pVBInfo->P3c4,0x16,data);
1340 XGINew_SetReg1(pVBInfo->P3c4,0x16,data);
1341 if (!(pVBInfo->SR15[1][XGINew_RAMType] & 0x10))
1347 XGINew_SetReg1(pVBInfo->P3c4,0x16,data);
1353 /* check if read cache pointer is correct */
1357 /* --------------------------------------------------------------------- */
1358 /* Function : XGINew_VerifyMclk */
1362 /* --------------------------------------------------------------------- */
1363 void XGINew_VerifyMclk( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
1365 PUCHAR pVideoMemory
= pVBInfo
->FBAddr
;
1367 USHORT Temp
, SR21
;
1369 pVideoMemory
[ 0 ] = 0xaa ; /* alan */
1370 pVideoMemory
[ 16 ] = 0x55 ; /* note: PCI read cache is off */
1372 if ( ( pVideoMemory
[ 0 ] != 0xaa ) || ( pVideoMemory
[ 16 ] != 0x55 ) )
1374 for( i
= 0 , j
= 16 ; i
< 2 ; i
++ , j
+= 16 )
1376 SR21
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x21 ) ;
1377 Temp
= SR21
& 0xFB ; /* disable PCI post write buffer empty gating */
1378 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , Temp
) ;
1380 Temp
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3C ) ;
1381 Temp
|= 0x01 ; /* MCLK reset */
1384 Temp
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3C ) ;
1385 Temp
&= 0xFE ; /* MCLK normal operation */
1387 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , SR21
) ;
1389 pVideoMemory
[ 16 + j
] = j
;
1390 if ( pVideoMemory
[ 16 + j
] == j
)
1392 pVideoMemory
[ j
] = j
;
1403 /* --------------------------------------------------------------------- */
1404 /* Function : XGINew_SetDRAMSize_340 */
1408 /* --------------------------------------------------------------------- */
1409 void XGINew_SetDRAMSize_340( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
1413 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
1414 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
1416 XGISetModeNew( HwDeviceExtension
, 0x2e ) ;
1419 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x21 ) ;
1420 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , ( USHORT
)( data
& 0xDF ) ) ; /* disable read cache */
1421 XGI_DisplayOff( HwDeviceExtension
, pVBInfo
);
1423 /*data = XGINew_GetReg1( pVBInfo->P3c4 , 0x1 ) ;*/
1425 /*XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , data ) ;*/ /* Turn OFF Display */
1426 XGINew_DDRSizing340( HwDeviceExtension
, pVBInfo
) ;
1427 data
=XGINew_GetReg1( pVBInfo
->P3c4
, 0x21 ) ;
1428 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , ( USHORT
)( data
| 0x20 ) ) ; /* enable read cache */
1433 /* --------------------------------------------------------------------- */
1438 /* --------------------------------------------------------------------- */
1439 void XGINew_SetDRAMSize_310( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
1442 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
,
1443 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
1445 /* XGINew_SetReg1( pVBInfo->P3d4 , 0x30 , 0x40 ) ; */
1448 #ifdef XGI302 /* alan,should change value */
1449 XGINew_SetReg1( pVBInfo
->P3d4
, 0x30 , 0x4D ) ;
1450 XGINew_SetReg1( pVBInfo
->P3d4
, 0x31 , 0xc0 ) ;
1451 XGINew_SetReg1( pVBInfo
->P3d4
, 0x34 , 0x3F ) ;
1454 XGISetModeNew( HwDeviceExtension
, 0x2e ) ;
1456 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x21 ) ;
1457 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , ( USHORT
)( data
& 0xDF ) ) ; /* disable read cache */
1459 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x1 ) ;
1461 XGINew_SetReg1( pVBInfo
->P3c4
, 0x01 , data
) ; /* Turn OFF Display */
1463 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x16 ) ;
1466 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , ( USHORT
)( data
| 0x0F ) ) ; /* assume lowest speed DRAM */
1468 XGINew_SetDRAMModeRegister( pVBInfo
) ;
1469 XGINew_DisableRefresh( HwDeviceExtension
, pVBInfo
) ;
1470 XGINew_CheckBusWidth_310( pVBInfo
) ;
1471 XGINew_VerifyMclk( HwDeviceExtension
, pVBInfo
) ; /* alan 2000/7/3 */
1475 if ( XGINew_Get310DRAMType( pVBInfo
) < 2 )
1477 XGINew_SDRSizing( pVBInfo
) ;
1481 XGINew_DDRSizing( pVBInfo
) ;
1487 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , pVBInfo
->SR15
[ 1 ][ XGINew_RAMType
] ) ; /* restore SR16 */
1489 XGINew_EnableRefresh( HwDeviceExtension
, pVBInfo
) ;
1490 data
=XGINew_GetReg1( pVBInfo
->P3c4
,0x21 ) ;
1491 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , ( USHORT
)( data
| 0x20 ) ) ; /* enable read cache */
1496 /* --------------------------------------------------------------------- */
1497 /* Function : XGINew_SetDRAMModeRegister340 */
1501 /* --------------------------------------------------------------------- */
1503 void XGINew_SetDRAMModeRegister340( PXGI_HW_DEVICE_INFO HwDeviceExtension
)
1506 VB_DEVICE_INFO VBINF
;
1507 PVB_DEVICE_INFO pVBInfo
= &VBINF
;
1508 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
1509 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
1510 pVBInfo
->BaseAddr
= (ULONG
)HwDeviceExtension
->pjIOAddress
;
1511 pVBInfo
->ISXPDOS
= 0 ;
1513 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
1514 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
1515 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
1516 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
1517 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
1518 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
1519 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
1520 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
1521 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
1522 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
1523 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
1524 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
1525 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
1526 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
1527 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
1528 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
1529 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
1530 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
1531 XGI_GetVBType( pVBInfo
) ; /* Run XGI_GetVBType before InitTo330Pointer */
1533 InitTo330Pointer(HwDeviceExtension
->jChipType
,pVBInfo
);
1535 ReadVBIOSTablData( HwDeviceExtension
->jChipType
, pVBInfo
) ;
1537 if ( XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) == 0 )
1539 data
= ( XGINew_GetReg1( pVBInfo
->P3c4
, 0x39 ) & 0x02 ) >> 1 ;
1541 XGINew_DDR2x_MRS_340( pVBInfo
->P3c4
, pVBInfo
) ;
1543 XGINew_DDR1x_MRS_340( pVBInfo
->P3c4
, pVBInfo
) ;
1546 XGINew_DDR2_MRS_XG20( HwDeviceExtension
, pVBInfo
->P3c4
, pVBInfo
);
1548 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , 0x03 ) ;
1551 /* --------------------------------------------------------------------- */
1552 /* Function : XGINew_SetDRAMModeRegister */
1556 /* --------------------------------------------------------------------- */
1557 void XGINew_SetDRAMModeRegister( PVB_DEVICE_INFO pVBInfo
)
1559 if ( XGINew_Get310DRAMType( pVBInfo
) < 2 )
1561 XGINew_SDR_MRS(pVBInfo
) ;
1565 /* SR16 <- 0F,CF,0F,8F */
1566 XGINew_DDR_MRS( pVBInfo
) ;
1571 /* --------------------------------------------------------------------- */
1572 /* Function : XGINew_DisableRefresh */
1576 /* --------------------------------------------------------------------- */
1577 void XGINew_DisableRefresh( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
1582 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x1B ) ;
1584 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , data
) ;
1589 /* --------------------------------------------------------------------- */
1590 /* Function : XGINew_EnableRefresh */
1594 /* --------------------------------------------------------------------- */
1595 void XGINew_EnableRefresh( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
1598 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , pVBInfo
->SR15
[ 3 ][ XGINew_RAMType
] ) ; /* SR1B */
1604 /* --------------------------------------------------------------------- */
1605 /* Function : XGINew_DisableChannelInterleaving */
1609 /* --------------------------------------------------------------------- */
1610 void XGINew_DisableChannelInterleaving( int index
, USHORT XGINew_DDRDRAM_TYPE
[][ 5 ] , PVB_DEVICE_INFO pVBInfo
)
1614 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x15 ) ;
1617 switch( XGINew_DDRDRAM_TYPE
[ index
][ 3 ] )
1634 XGINew_SetReg1( pVBInfo
->P3c4
, 0x15 , data
) ;
1638 /* --------------------------------------------------------------------- */
1639 /* Function : XGINew_SetDRAMSizingType */
1643 /* --------------------------------------------------------------------- */
1644 void XGINew_SetDRAMSizingType( int index
, USHORT DRAMTYPE_TABLE
[][ 5 ] ,PVB_DEVICE_INFO pVBInfo
)
1648 data
= DRAMTYPE_TABLE
[ index
][ 4 ] ;
1649 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x13 , 0x80 , data
) ;
1651 /* should delay 50 ns */
1655 /* --------------------------------------------------------------------- */
1656 /* Function : XGINew_CheckBusWidth_310 */
1660 /* --------------------------------------------------------------------- */
1661 void XGINew_CheckBusWidth_310( PVB_DEVICE_INFO pVBInfo
)
1664 PULONG
volatile pVideoMemory
;
1666 pVideoMemory
= (PULONG
) pVBInfo
->FBAddr
;
1668 if ( XGINew_Get310DRAMType( pVBInfo
) < 2 )
1670 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x00 ) ;
1671 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x12 ) ;
1673 XGINew_SDR_MRS( pVBInfo
) ;
1675 XGINew_ChannelAB
= 0 ;
1676 XGINew_DataBusWidth
= 128 ;
1677 pVideoMemory
[ 0 ] = 0x01234567L
;
1678 pVideoMemory
[ 1 ] = 0x456789ABL
;
1679 pVideoMemory
[ 2 ] = 0x89ABCDEFL
;
1680 pVideoMemory
[ 3 ] = 0xCDEF0123L
;
1681 pVideoMemory
[ 4 ] = 0x55555555L
;
1682 pVideoMemory
[ 5 ] = 0x55555555L
;
1683 pVideoMemory
[ 6 ] = 0xFFFFFFFFL
;
1684 pVideoMemory
[ 7 ] = 0xFFFFFFFFL
;
1686 if ( ( pVideoMemory
[ 3 ] != 0xCDEF0123L
) || ( pVideoMemory
[ 2 ] != 0x89ABCDEFL
) )
1689 XGINew_DataBusWidth
= 64 ;
1690 XGINew_ChannelAB
= 0 ;
1691 data
=XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) ;
1692 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , ( USHORT
)( data
& 0xFD ) ) ;
1695 if ( ( pVideoMemory
[ 1 ] != 0x456789ABL
) || ( pVideoMemory
[ 0 ] != 0x01234567L
) )
1698 XGINew_DataBusWidth
= 64 ;
1699 XGINew_ChannelAB
= 1 ;
1700 data
=XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) ;
1701 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , ( USHORT
)( ( data
& 0xFD ) | 0x01 ) ) ;
1708 /* DDR Dual channel */
1709 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x00 ) ;
1710 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x02 ) ; /* Channel A, 64bit */
1712 XGINew_DDR_MRS( pVBInfo
) ;
1714 XGINew_ChannelAB
= 0 ;
1715 XGINew_DataBusWidth
= 64 ;
1716 pVideoMemory
[ 0 ] = 0x01234567L
;
1717 pVideoMemory
[ 1 ] = 0x456789ABL
;
1718 pVideoMemory
[ 2 ] = 0x89ABCDEFL
;
1719 pVideoMemory
[ 3 ] = 0xCDEF0123L
;
1720 pVideoMemory
[ 4 ] = 0x55555555L
;
1721 pVideoMemory
[ 5 ] = 0x55555555L
;
1722 pVideoMemory
[ 6 ] = 0xAAAAAAAAL
;
1723 pVideoMemory
[ 7 ] = 0xAAAAAAAAL
;
1725 if ( pVideoMemory
[ 1 ] == 0x456789ABL
)
1727 if ( pVideoMemory
[ 0 ] == 0x01234567L
)
1729 /* Channel A 64bit */
1735 if ( pVideoMemory
[ 0 ] == 0x01234567L
)
1737 /* Channel A 32bit */
1738 XGINew_DataBusWidth
= 32 ;
1739 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x00 ) ;
1744 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x03 ) ; /* Channel B, 64bit */
1745 XGINew_DDR_MRS( pVBInfo
);
1747 XGINew_ChannelAB
= 1 ;
1748 XGINew_DataBusWidth
= 64 ;
1749 pVideoMemory
[ 0 ] = 0x01234567L
;
1750 pVideoMemory
[ 1 ] = 0x456789ABL
;
1751 pVideoMemory
[ 2 ] = 0x89ABCDEFL
;
1752 pVideoMemory
[ 3 ] = 0xCDEF0123L
;
1753 pVideoMemory
[ 4 ] = 0x55555555L
;
1754 pVideoMemory
[ 5 ] = 0x55555555L
;
1755 pVideoMemory
[ 6 ] = 0xAAAAAAAAL
;
1756 pVideoMemory
[ 7 ] = 0xAAAAAAAAL
;
1758 if ( pVideoMemory
[ 1 ] == 0x456789ABL
)
1761 if ( pVideoMemory
[ 0 ] == 0x01234567L
)
1763 /* Channel B 64bit */
1773 if ( pVideoMemory
[ 0 ] == 0x01234567L
)
1776 XGINew_DataBusWidth
= 32 ;
1777 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x01 ) ;
1788 /* --------------------------------------------------------------------- */
1789 /* Function : XGINew_SetRank */
1793 /* --------------------------------------------------------------------- */
1794 int XGINew_SetRank( int index
, UCHAR RankNo
, UCHAR XGINew_ChannelAB
, USHORT DRAMTYPE_TABLE
[][ 5 ] , PVB_DEVICE_INFO pVBInfo
)
1799 if ( ( RankNo
== 2 ) && ( DRAMTYPE_TABLE
[ index
][ 0 ] == 2 ) )
1802 RankSize
= DRAMTYPE_TABLE
[ index
][ 3 ] / 2 * XGINew_DataBusWidth
/ 32 ;
1804 if ( ( RankNo
* RankSize
) <= 128 )
1808 while( ( RankSize
>>= 1 ) > 0 )
1812 data
|= ( RankNo
- 1 ) << 2 ;
1813 data
|= ( XGINew_DataBusWidth
/ 64 ) & 2 ;
1814 data
|= XGINew_ChannelAB
;
1815 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , data
) ;
1817 XGINew_SDR_MRS( pVBInfo
) ;
1825 /* --------------------------------------------------------------------- */
1826 /* Function : XGINew_SetDDRChannel */
1830 /* --------------------------------------------------------------------- */
1831 int XGINew_SetDDRChannel( int index
, UCHAR ChannelNo
, UCHAR XGINew_ChannelAB
, USHORT DRAMTYPE_TABLE
[][ 5 ] , PVB_DEVICE_INFO pVBInfo
)
1836 RankSize
= DRAMTYPE_TABLE
[index
][3]/2 * XGINew_DataBusWidth
/32;
1837 /* RankSize = DRAMTYPE_TABLE[ index ][ 3 ] ; */
1838 if ( ChannelNo
* RankSize
<= 128 )
1841 while( ( RankSize
>>= 1 ) > 0 )
1846 if ( ChannelNo
== 2 )
1849 data
|= ( XGINew_DataBusWidth
/ 32 ) & 2 ;
1850 data
|= XGINew_ChannelAB
;
1851 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , data
) ;
1853 XGINew_DDR_MRS( pVBInfo
) ;
1861 /* --------------------------------------------------------------------- */
1862 /* Function : XGINew_CheckColumn */
1866 /* --------------------------------------------------------------------- */
1867 int XGINew_CheckColumn( int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
1870 ULONG Increment
, Position
;
1872 /* Increment = 1 << ( DRAMTYPE_TABLE[ index ][ 2 ] + XGINew_DataBusWidth / 64 + 1 ) ; */
1873 Increment
= 1 << ( 10 + XGINew_DataBusWidth
/ 64 ) ;
1875 for( i
= 0 , Position
= 0 ; i
< 2 ; i
++ )
1877 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) = Position
;
1878 Position
+= Increment
;
1881 #ifdef WIN2000 /* chiawen for linux solution */
1885 for( i
= 0 , Position
= 0 ; i
< 2 ; i
++ )
1887 /* if ( pVBInfo->FBAddr[ Position ] != Position ) */
1888 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) != Position
)
1890 Position
+= Increment
;
1896 /* --------------------------------------------------------------------- */
1897 /* Function : XGINew_CheckBanks */
1901 /* --------------------------------------------------------------------- */
1902 int XGINew_CheckBanks( int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
1905 ULONG Increment
, Position
;
1907 Increment
= 1 << ( DRAMTYPE_TABLE
[ index
][ 2 ] + XGINew_DataBusWidth
/ 64 + 2 ) ;
1909 for( i
= 0 , Position
= 0 ; i
< 4 ; i
++ )
1911 /* pVBInfo->FBAddr[ Position ] = Position ; */
1912 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) = Position
;
1913 Position
+= Increment
;
1916 for( i
= 0 , Position
= 0 ; i
< 4 ; i
++ )
1918 /* if (pVBInfo->FBAddr[ Position ] != Position ) */
1919 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) != Position
)
1921 Position
+= Increment
;
1927 /* --------------------------------------------------------------------- */
1928 /* Function : XGINew_CheckRank */
1932 /* --------------------------------------------------------------------- */
1933 int XGINew_CheckRank( int RankNo
, int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
1936 ULONG Increment
, Position
;
1938 Increment
= 1 << ( DRAMTYPE_TABLE
[ index
][ 2 ] + DRAMTYPE_TABLE
[ index
][ 1 ] +
1939 DRAMTYPE_TABLE
[ index
][ 0 ] + XGINew_DataBusWidth
/ 64 + RankNo
) ;
1941 for( i
= 0 , Position
= 0 ; i
< 2 ; i
++ )
1943 /* pVBInfo->FBAddr[ Position ] = Position ; */
1944 /* *( ( PULONG )( pVBInfo->FBAddr ) ) = Position ; */
1945 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) = Position
;
1946 Position
+= Increment
;
1949 for( i
= 0 , Position
= 0 ; i
< 2 ; i
++ )
1951 /* if ( pVBInfo->FBAddr[ Position ] != Position ) */
1952 /* if ( ( *( PULONG )( pVBInfo->FBAddr ) ) != Position ) */
1953 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) != Position
)
1955 Position
+= Increment
;
1961 /* --------------------------------------------------------------------- */
1962 /* Function : XGINew_CheckDDRRank */
1966 /* --------------------------------------------------------------------- */
1967 int XGINew_CheckDDRRank( int RankNo
, int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
1969 ULONG Increment
, Position
;
1972 Increment
= 1 << ( DRAMTYPE_TABLE
[ index
][ 2 ] + DRAMTYPE_TABLE
[ index
][ 1 ] +
1973 DRAMTYPE_TABLE
[ index
][ 0 ] + XGINew_DataBusWidth
/ 64 + RankNo
) ;
1975 Increment
+= Increment
/ 2 ;
1978 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
+ 0 ) ) = 0x01234567 ;
1979 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
+ 1 ) ) = 0x456789AB ;
1980 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
+ 2 ) ) = 0x55555555 ;
1981 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
+ 3 ) ) = 0x55555555 ;
1982 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
+ 4 ) ) = 0xAAAAAAAA ;
1983 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
+ 5 ) ) = 0xAAAAAAAA ;
1985 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ 1 ) ) == 0x456789AB )
1988 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ 0 ) ) == 0x01234567 )
1991 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) ;
1994 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , data
) ;
1995 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x15 ) ;
1997 XGINew_SetReg1( pVBInfo
->P3c4
, 0x15 , data
) ;
2003 /* --------------------------------------------------------------------- */
2004 /* Function : XGINew_CheckRanks */
2008 /* --------------------------------------------------------------------- */
2009 int XGINew_CheckRanks( int RankNo
, int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
2013 for( r
= RankNo
; r
>= 1 ; r
-- )
2015 if ( !XGINew_CheckRank( r
, index
, DRAMTYPE_TABLE
, pVBInfo
) )
2019 if ( !XGINew_CheckBanks( index
, DRAMTYPE_TABLE
, pVBInfo
) )
2022 if ( !XGINew_CheckColumn( index
, DRAMTYPE_TABLE
, pVBInfo
) )
2029 /* --------------------------------------------------------------------- */
2030 /* Function : XGINew_CheckDDRRanks */
2034 /* --------------------------------------------------------------------- */
2035 int XGINew_CheckDDRRanks( int RankNo
, int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
2039 for( r
= RankNo
; r
>= 1 ; r
-- )
2041 if ( !XGINew_CheckDDRRank( r
, index
, DRAMTYPE_TABLE
, pVBInfo
) )
2045 if ( !XGINew_CheckBanks( index
, DRAMTYPE_TABLE
, pVBInfo
) )
2048 if ( !XGINew_CheckColumn( index
, DRAMTYPE_TABLE
, pVBInfo
) )
2055 /* --------------------------------------------------------------------- */
2060 /* --------------------------------------------------------------------- */
2061 int XGINew_SDRSizing(PVB_DEVICE_INFO pVBInfo
)
2066 for( i
= 0 ; i
< 13 ; i
++ )
2068 XGINew_SetDRAMSizingType( i
, XGINew_SDRDRAM_TYPE
, pVBInfo
) ;
2070 for( j
= 2 ; j
> 0 ; j
-- )
2072 if ( !XGINew_SetRank( i
, ( UCHAR
)j
, XGINew_ChannelAB
, XGINew_SDRDRAM_TYPE
, pVBInfo
) )
2076 if ( XGINew_CheckRanks( j
, i
, XGINew_SDRDRAM_TYPE
, pVBInfo
) )
2085 /* --------------------------------------------------------------------- */
2086 /* Function : XGINew_SetDRAMSizeReg */
2090 /* --------------------------------------------------------------------- */
2091 USHORT
XGINew_SetDRAMSizeReg( int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
2093 USHORT data
= 0 , memsize
= 0 ;
2097 RankSize
= DRAMTYPE_TABLE
[ index
][ 3 ] * XGINew_DataBusWidth
/ 32 ;
2098 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x13 ) ;
2106 if( XGINew_ChannelAB
== 3 )
2109 ChannelNo
= XGINew_ChannelAB
;
2111 if ( ChannelNo
* RankSize
<= 256 )
2113 while( ( RankSize
>>= 1 ) > 0 )
2118 memsize
= data
>> 4 ;
2120 /* [2004/03/25] Vicent, Fix DRAM Sizing Error */
2121 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , ( XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) & 0x0F ) | ( data
& 0xF0 ) ) ;
2123 /* data |= XGINew_ChannelAB << 2 ; */
2124 /* data |= ( XGINew_DataBusWidth / 64 ) << 1 ; */
2125 /* XGINew_SetReg1( pVBInfo->P3c4 , 0x14 , data ) ; */
2128 /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */
2134 /* --------------------------------------------------------------------- */
2135 /* Function : XGINew_SetDRAMSize20Reg */
2139 /* --------------------------------------------------------------------- */
2140 USHORT
XGINew_SetDRAMSize20Reg( int index
, USHORT DRAMTYPE_TABLE
[][ 5 ], PVB_DEVICE_INFO pVBInfo
)
2142 USHORT data
= 0 , memsize
= 0 ;
2146 RankSize
= DRAMTYPE_TABLE
[ index
][ 3 ] * XGINew_DataBusWidth
/ 8 ;
2147 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x13 ) ;
2155 if( XGINew_ChannelAB
== 3 )
2158 ChannelNo
= XGINew_ChannelAB
;
2160 if ( ChannelNo
* RankSize
<= 256 )
2162 while( ( RankSize
>>= 1 ) > 0 )
2167 memsize
= data
>> 4 ;
2169 /* [2004/03/25] Vicent, Fix DRAM Sizing Error */
2170 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , ( XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) & 0x0F ) | ( data
& 0xF0 ) ) ;
2173 /* data |= XGINew_ChannelAB << 2 ; */
2174 /* data |= ( XGINew_DataBusWidth / 64 ) << 1 ; */
2175 /* XGINew_SetReg1( pVBInfo->P3c4 , 0x14 , data ) ; */
2178 /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */
2184 /* --------------------------------------------------------------------- */
2185 /* Function : XGINew_ReadWriteRest */
2189 /* --------------------------------------------------------------------- */
2190 int XGINew_ReadWriteRest( USHORT StopAddr
, USHORT StartAddr
, PVB_DEVICE_INFO pVBInfo
)
2193 ULONG Position
= 0 ;
2195 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) = Position
;
2197 for( i
= StartAddr
; i
<= StopAddr
; i
++ )
2200 *( ( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) = Position
;
2203 DelayUS( 500 ) ; /* [Vicent] 2004/04/16. Fix #1759 Memory Size error in Multi-Adapter. */
2207 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) != Position
)
2210 for( i
= StartAddr
; i
<= StopAddr
; i
++ )
2213 if ( ( *( PULONG
)( pVBInfo
->FBAddr
+ Position
) ) != Position
)
2220 /* --------------------------------------------------------------------- */
2221 /* Function : XGINew_CheckFrequence */
2225 /* --------------------------------------------------------------------- */
2226 UCHAR
XGINew_CheckFrequence( PVB_DEVICE_INFO pVBInfo
)
2230 data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x97 ) ;
2232 if ( ( data
& 0x10 ) == 0 )
2234 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x39 ) ;
2235 data
= ( data
& 0x02 ) >> 1 ;
2239 return( data
& 0x01 ) ;
2243 /* --------------------------------------------------------------------- */
2244 /* Function : XGINew_CheckChannel */
2248 /* --------------------------------------------------------------------- */
2249 void XGINew_CheckChannel( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
2253 switch( HwDeviceExtension
->jChipType
)
2257 data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x97 ) ;
2259 XGINew_ChannelAB
= 1 ; /* XG20 "JUST" one channel */
2261 if ( data
== 0 ) /* Single_32_16 */
2264 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x1000000)
2267 XGINew_DataBusWidth
= 32 ; /* 32 bits */
2268 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xB1 ) ; /* 22bit + 2 rank + 32bit */
2269 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x52 ) ;
2272 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2275 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x800000)
2277 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x31 ) ; /* 22bit + 1 rank + 32bit */
2278 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x42 ) ;
2281 if ( XGINew_ReadWriteRest( 23 , 23 , pVBInfo
) == 1 )
2286 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x800000)
2288 XGINew_DataBusWidth
= 16 ; /* 16 bits */
2289 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xB1 ) ; /* 22bit + 2 rank + 16bit */
2290 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x41 ) ;
2293 if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo
) == 1 )
2296 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x31 ) ;
2301 else /* Dual_16_8 */
2303 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x800000)
2306 XGINew_DataBusWidth
= 16 ; /* 16 bits */
2307 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xB1 ) ; /* (0x31:12x8x2) 22bit + 2 rank */
2308 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x41 ) ; /* 0x41:16Mx16 bit*/
2311 if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo
) == 1 )
2314 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x400000)
2316 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x31 ) ; /* (0x31:12x8x2) 22bit + 1 rank */
2317 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x31 ) ; /* 0x31:8Mx16 bit*/
2320 if ( XGINew_ReadWriteRest( 22 , 22 , pVBInfo
) == 1 )
2326 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x400000)
2328 XGINew_DataBusWidth
= 8 ; /* 8 bits */
2329 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xB1 ) ; /* (0x31:12x8x2) 22bit + 2 rank */
2330 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x30 ) ; /* 0x30:8Mx8 bit*/
2333 if ( XGINew_ReadWriteRest( 22 , 21 , pVBInfo
) == 1 )
2336 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x31 ) ; /* (0x31:12x8x2) 22bit + 1 rank */
2343 XGINew_DataBusWidth
= 16 ; /* 16 bits */
2344 XGINew_ChannelAB
= 1 ; /* Single channel */
2345 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x51 ) ; /* 32Mx16 bit*/
2348 if ( XGINew_CheckFrequence(pVBInfo
) == 1 )
2350 XGINew_DataBusWidth
= 32 ; /* 32 bits */
2351 XGINew_ChannelAB
= 3 ; /* Quad Channel */
2352 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2353 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x4C ) ;
2355 if ( XGINew_ReadWriteRest( 25 , 23 , pVBInfo
) == 1 )
2358 XGINew_ChannelAB
= 2 ; /* Dual channels */
2359 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x48 ) ;
2361 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2364 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x49 ) ;
2366 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2369 XGINew_ChannelAB
= 3 ;
2370 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2371 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x3C ) ;
2373 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2376 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x38 ) ;
2378 if ( XGINew_ReadWriteRest( 8 , 4 , pVBInfo
) == 1 )
2381 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x39 ) ;
2385 XGINew_DataBusWidth
= 64 ; /* 64 bits */
2386 XGINew_ChannelAB
= 2 ; /* Dual channels */
2387 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2388 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x5A ) ;
2390 if ( XGINew_ReadWriteRest( 25 , 24 , pVBInfo
) == 1 )
2393 XGINew_ChannelAB
= 1 ; /* Single channels */
2394 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x52 ) ;
2396 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2399 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x53 ) ;
2401 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2404 XGINew_ChannelAB
= 2 ; /* Dual channels */
2405 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2406 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x4A ) ;
2408 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2411 XGINew_ChannelAB
= 1 ; /* Single channels */
2412 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x42 ) ;
2414 if ( XGINew_ReadWriteRest( 8 , 4 , pVBInfo
) == 1 )
2417 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x43 ) ;
2424 XG42 SR14 D[3] Reserve
2425 D[2] = 1, Dual Channel
2428 It's Different from Other XG40 Series.
2430 if ( XGINew_CheckFrequence(pVBInfo
) == 1 ) /* DDRII, DDR2x */
2432 XGINew_DataBusWidth
= 32 ; /* 32 bits */
2433 XGINew_ChannelAB
= 2 ; /* 2 Channel */
2434 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2435 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x44 ) ;
2437 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2440 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2441 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x34 ) ;
2442 if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo
) == 1 )
2445 XGINew_ChannelAB
= 1 ; /* Single Channel */
2446 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2447 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x40 ) ;
2449 if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo
) == 1 )
2453 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2454 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x30 ) ;
2459 XGINew_DataBusWidth
= 64 ; /* 64 bits */
2460 XGINew_ChannelAB
= 1 ; /* 1 channels */
2461 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2462 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x52 ) ;
2464 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2468 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2469 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x42 ) ;
2477 if ( XGINew_CheckFrequence(pVBInfo
) == 1 ) /* DDRII */
2479 XGINew_DataBusWidth
= 32 ; /* 32 bits */
2480 XGINew_ChannelAB
= 3 ;
2481 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2482 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x4C ) ;
2484 if ( XGINew_ReadWriteRest( 25 , 23 , pVBInfo
) == 1 )
2487 XGINew_ChannelAB
= 2 ; /* 2 channels */
2488 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x48 ) ;
2490 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2493 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2494 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x3C ) ;
2496 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2497 XGINew_ChannelAB
= 3 ; /* 4 channels */
2500 XGINew_ChannelAB
= 2 ; /* 2 channels */
2501 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x38 ) ;
2506 XGINew_DataBusWidth
= 64 ; /* 64 bits */
2507 XGINew_ChannelAB
= 2 ; /* 2 channels */
2508 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2509 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x5A ) ;
2511 if ( XGINew_ReadWriteRest( 25 , 24 , pVBInfo
) == 1 )
2515 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2516 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x4A ) ;
2524 /* --------------------------------------------------------------------- */
2525 /* Function : XGINew_DDRSizing340 */
2529 /* --------------------------------------------------------------------- */
2530 int XGINew_DDRSizing340( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
2533 USHORT memsize
, addr
;
2535 XGINew_SetReg1( pVBInfo
->P3c4
, 0x15 , 0x00 ) ; /* noninterleaving */
2536 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1C , 0x00 ) ; /* nontiling */
2537 XGINew_CheckChannel( HwDeviceExtension
, pVBInfo
) ;
2540 if ( HwDeviceExtension
->jChipType
>= XG20
)
2542 for( i
= 0 ; i
< 12 ; i
++ )
2544 XGINew_SetDRAMSizingType( i
, XGINew_DDRDRAM_TYPE20
, pVBInfo
) ;
2545 memsize
= XGINew_SetDRAMSize20Reg( i
, XGINew_DDRDRAM_TYPE20
, pVBInfo
) ;
2549 addr
= memsize
+ ( XGINew_ChannelAB
- 2 ) + 20 ;
2550 if ( ( HwDeviceExtension
->ulVideoMemorySize
- 1 ) < ( ULONG
)( 1 << addr
) )
2553 if ( XGINew_ReadWriteRest( addr
, 5, pVBInfo
) == 1 )
2559 for( i
= 0 ; i
< 4 ; i
++ )
2561 XGINew_SetDRAMSizingType( i
, XGINew_DDRDRAM_TYPE340
, pVBInfo
) ;
2562 memsize
= XGINew_SetDRAMSizeReg( i
, XGINew_DDRDRAM_TYPE340
, pVBInfo
) ;
2567 addr
= memsize
+ ( XGINew_ChannelAB
- 2 ) + 20 ;
2568 if ( ( HwDeviceExtension
->ulVideoMemorySize
- 1 ) < ( ULONG
)( 1 << addr
) )
2571 if ( XGINew_ReadWriteRest( addr
, 9, pVBInfo
) == 1 )
2579 /* --------------------------------------------------------------------- */
2580 /* Function : XGINew_DDRSizing */
2584 /* --------------------------------------------------------------------- */
2585 int XGINew_DDRSizing(PVB_DEVICE_INFO pVBInfo
)
2590 for( i
= 0 ; i
< 4 ; i
++ )
2592 XGINew_SetDRAMSizingType( i
, XGINew_DDRDRAM_TYPE
, pVBInfo
) ;
2593 XGINew_DisableChannelInterleaving( i
, XGINew_DDRDRAM_TYPE
, pVBInfo
) ;
2594 for( j
= 2 ; j
> 0 ; j
-- )
2596 XGINew_SetDDRChannel( i
, j
, XGINew_ChannelAB
, XGINew_DDRDRAM_TYPE
, pVBInfo
) ;
2597 if ( !XGINew_SetRank( i
, ( UCHAR
)j
, XGINew_ChannelAB
, XGINew_DDRDRAM_TYPE
, pVBInfo
) )
2601 if ( XGINew_CheckDDRRanks( j
, i
, XGINew_DDRDRAM_TYPE
, pVBInfo
) )
2609 /* --------------------------------------------------------------------- */
2610 /* Function : XGINew_SetMemoryClock */
2614 /* --------------------------------------------------------------------- */
2615 void XGINew_SetMemoryClock( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
2619 XGINew_SetReg1( pVBInfo
->P3c4
, 0x28 , pVBInfo
->MCLKData
[ XGINew_RAMType
].SR28
) ;
2620 XGINew_SetReg1( pVBInfo
->P3c4
, 0x29 , pVBInfo
->MCLKData
[ XGINew_RAMType
].SR29
) ;
2621 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2A , pVBInfo
->MCLKData
[ XGINew_RAMType
].SR2A
) ;
2625 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2E , pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2E
) ;
2626 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2F , pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2F
) ;
2627 XGINew_SetReg1( pVBInfo
->P3c4
, 0x30 , pVBInfo
->ECLKData
[ XGINew_RAMType
].SR30
) ;
2629 /* [Vicent] 2004/07/07, When XG42 ECLK = MCLK = 207MHz, Set SR32 D[1:0] = 10b */
2630 /* [Hsuan] 2004/08/20, Modify SR32 value, when MCLK=207MHZ, ELCK=250MHz, Set SR32 D[1:0] = 10b */
2631 if ( HwDeviceExtension
->jChipType
== XG42
)
2633 if ( ( pVBInfo
->MCLKData
[ XGINew_RAMType
].SR28
== 0x1C ) && ( pVBInfo
->MCLKData
[ XGINew_RAMType
].SR29
== 0x01 )
2634 && ( ( ( pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2E
== 0x1C ) && ( pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2F
== 0x01 ) )
2635 || ( ( pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2E
== 0x22 ) && ( pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2F
== 0x01 ) ) ) )
2637 XGINew_SetReg1( pVBInfo
->P3c4
, 0x32 , ( ( UCHAR
)XGINew_GetReg1( pVBInfo
->P3c4
, 0x32 ) & 0xFC ) | 0x02 ) ;
2643 /* --------------------------------------------------------------------- */
2644 /* Function : ChkLFB */
2648 /* --------------------------------------------------------------------- */
2649 BOOLEAN
ChkLFB( PVB_DEVICE_INFO pVBInfo
)
2651 if ( LFBDRAMTrap
& XGINew_GetReg1( pVBInfo
->P3d4
, 0x78 ) )
2658 /* --------------------------------------------------------------------- */
2659 /* input : dx ,valid value : CR or second chip's CR */
2661 /* SetPowerConsume : */
2662 /* Description: reduce 40/43 power consumption in first chip or */
2663 /* in second chip, assume CR A1 D[6]="1" in this case */
2665 /* --------------------------------------------------------------------- */
2666 void SetPowerConsume ( PXGI_HW_DEVICE_INFO HwDeviceExtension
, ULONG XGI_P3d4Port
)
2671 HwDeviceExtension
->pQueryVGAConfigSpace( HwDeviceExtension
, 0x08 , 0 , &lTemp
) ; /* Get */
2672 if ((lTemp
&0xFF)==0)
2674 /* set CR58 D[5]=0 D[3]=0 */
2675 XGINew_SetRegAND( XGI_P3d4Port
, 0x58 , 0xD7 ) ;
2676 bTemp
= (UCHAR
) XGINew_GetReg1( XGI_P3d4Port
, 0xCB ) ;
2681 XGINew_SetRegANDOR( XGI_P3d4Port
, 0x58 , 0xD7 , 0x20 ) ; /* CR58 D[5]=1 D[3]=0 */
2685 XGINew_SetRegANDOR( XGI_P3d4Port
, 0x58 , 0xD7 , 0x08 ) ; /* CR58 D[5]=0 D[3]=1 */
2695 #if defined(LINUX_XF86)||defined(LINUX_KERNEL)
2696 void XGINew_InitVBIOSData(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
2699 /* ULONG ROMAddr = (ULONG)HwDeviceExtension->pjVirtualRomBase; */
2700 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
2701 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
2702 pVBInfo
->BaseAddr
= (ULONG
)HwDeviceExtension
->pjIOAddress
;
2703 pVBInfo
->ISXPDOS
= 0 ;
2705 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
2706 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
2707 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
2708 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
2709 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
2710 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
2711 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
2712 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
2713 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
2714 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
2715 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
2716 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
2717 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
2718 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
2719 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
2720 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
2721 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
2722 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
2723 XGI_GetVBType( pVBInfo
) ; /* Run XGI_GetVBType before InitTo330Pointer */
2725 switch(HwDeviceExtension
->jChipType
)
2733 InitTo330Pointer(HwDeviceExtension
->jChipType
,pVBInfo
);
2738 #endif /* For Linux */
2740 /* --------------------------------------------------------------------- */
2741 /* Function : ReadVBIOSTablData */
2745 /* --------------------------------------------------------------------- */
2746 void ReadVBIOSTablData( UCHAR ChipType
, PVB_DEVICE_INFO pVBInfo
)
2748 PUCHAR
volatile pVideoMemory
= ( PUCHAR
)pVBInfo
->ROMAddr
;
2753 i
= pVideoMemory
[ 0x1CF ] | ( pVideoMemory
[ 0x1D0 ] << 8 ) ; /* UniROM */
2758 for( jj
= 0x00 ; jj
< 0x08 ; jj
++ )
2760 pVBInfo
->MCLKData
[ jj
].SR28
= pVideoMemory
[ ii
] ;
2761 pVBInfo
->MCLKData
[ jj
].SR29
= pVideoMemory
[ ii
+ 1] ;
2762 pVBInfo
->MCLKData
[ jj
].SR2A
= pVideoMemory
[ ii
+ 2] ;
2763 pVBInfo
->MCLKData
[ jj
].CLOCK
= pVideoMemory
[ ii
+ 3 ] | ( pVideoMemory
[ ii
+ 4 ] << 8 ) ;
2768 for( jj
= 0x00 ; jj
< 0x08 ; jj
++ )
2770 pVBInfo
->ECLKData
[ jj
].SR2E
= pVideoMemory
[ ii
] ;
2771 pVBInfo
->ECLKData
[ jj
].SR2F
=pVideoMemory
[ ii
+ 1 ] ;
2772 pVBInfo
->ECLKData
[ jj
].SR30
= pVideoMemory
[ ii
+ 2 ] ;
2773 pVBInfo
->ECLKData
[ jj
].CLOCK
= pVideoMemory
[ ii
+ 3 ] | ( pVideoMemory
[ ii
+ 4 ] << 8 ) ;
2777 /* Volari customize data area start */
2778 /* if ( ChipType == XG40 ) */
2779 if ( ChipType
>= XG40
)
2782 for( jj
= 0x00 ; jj
< 0x03 ; jj
++ )
2784 pVBInfo
->SR15
[ jj
][ 0 ] = pVideoMemory
[ ii
] ; /* SR13, SR14, and SR18 */
2785 pVBInfo
->SR15
[ jj
][ 1 ] = pVideoMemory
[ ii
+ 1 ] ;
2786 pVBInfo
->SR15
[ jj
][ 2 ] = pVideoMemory
[ ii
+ 2 ] ;
2787 pVBInfo
->SR15
[ jj
][ 3 ] = pVideoMemory
[ ii
+ 3 ] ;
2788 pVBInfo
->SR15
[ jj
][ 4 ] = pVideoMemory
[ ii
+ 4 ] ;
2789 pVBInfo
->SR15
[ jj
][ 5 ] = pVideoMemory
[ ii
+ 5 ] ;
2790 pVBInfo
->SR15
[ jj
][ 6 ] = pVideoMemory
[ ii
+ 6 ] ;
2791 pVBInfo
->SR15
[ jj
][ 7 ] = pVideoMemory
[ ii
+ 7 ] ;
2796 pVBInfo
->SR15
[ jj
][ 0 ] = pVideoMemory
[ ii
] ; /* SR1B */
2797 pVBInfo
->SR15
[ jj
][ 1 ] = pVideoMemory
[ ii
+ 1 ] ;
2798 pVBInfo
->SR15
[ jj
][ 2 ] = pVideoMemory
[ ii
+ 2 ] ;
2799 pVBInfo
->SR15
[ jj
][ 3 ] = pVideoMemory
[ ii
+ 3 ] ;
2800 pVBInfo
->SR15
[ jj
][ 4 ] = pVideoMemory
[ ii
+ 4 ] ;
2801 pVBInfo
->SR15
[ jj
][ 5 ] = pVideoMemory
[ ii
+ 5 ] ;
2802 pVBInfo
->SR15
[ jj
][ 6 ] = pVideoMemory
[ ii
+ 6 ] ;
2803 pVBInfo
->SR15
[ jj
][ 7 ] = pVideoMemory
[ ii
+ 7 ] ;
2805 *pVBInfo
->pSR07
= pVideoMemory
[ 0x74 ] ;
2806 *pVBInfo
->pSR1F
= pVideoMemory
[ 0x75 ] ;
2807 *pVBInfo
->pSR21
= pVideoMemory
[ 0x76 ] ;
2808 *pVBInfo
->pSR22
= pVideoMemory
[ 0x77 ] ;
2809 *pVBInfo
->pSR23
= pVideoMemory
[ 0x78 ] ;
2810 *pVBInfo
->pSR24
= pVideoMemory
[ 0x79 ] ;
2811 pVBInfo
->SR25
[ 0 ] = pVideoMemory
[ 0x7A ] ;
2812 *pVBInfo
->pSR31
= pVideoMemory
[ 0x7B ] ;
2813 *pVBInfo
->pSR32
= pVideoMemory
[ 0x7C ] ;
2814 *pVBInfo
->pSR33
= pVideoMemory
[ 0x7D ] ;
2817 for( jj
= 0 ; jj
< 3 ; jj
++ )
2819 pVBInfo
->CR40
[ jj
][ 0 ] = pVideoMemory
[ ii
] ;
2820 pVBInfo
->CR40
[ jj
][ 1 ] = pVideoMemory
[ ii
+ 1 ] ;
2821 pVBInfo
->CR40
[ jj
][ 2 ] = pVideoMemory
[ ii
+ 2 ] ;
2822 pVBInfo
->CR40
[ jj
][ 3 ] = pVideoMemory
[ ii
+ 3 ] ;
2823 pVBInfo
->CR40
[ jj
][ 4 ] = pVideoMemory
[ ii
+ 4 ] ;
2824 pVBInfo
->CR40
[ jj
][ 5 ] = pVideoMemory
[ ii
+ 5 ] ;
2825 pVBInfo
->CR40
[ jj
][ 6 ] = pVideoMemory
[ ii
+ 6 ] ;
2826 pVBInfo
->CR40
[ jj
][ 7 ] = pVideoMemory
[ ii
+ 7 ] ;
2831 for( j
= 3 ; j
< 24 ; j
++ )
2833 pVBInfo
->CR40
[ j
][ 0 ] = pVideoMemory
[ ii
] ;
2834 pVBInfo
->CR40
[ j
][ 1 ] = pVideoMemory
[ ii
+ 1 ] ;
2835 pVBInfo
->CR40
[ j
][ 2 ] = pVideoMemory
[ ii
+ 2 ] ;
2836 pVBInfo
->CR40
[ j
][ 3 ] = pVideoMemory
[ ii
+ 3 ] ;
2837 pVBInfo
->CR40
[ j
][ 4 ] = pVideoMemory
[ ii
+ 4 ] ;
2838 pVBInfo
->CR40
[ j
][ 5 ] = pVideoMemory
[ ii
+ 5 ] ;
2839 pVBInfo
->CR40
[ j
][ 6 ] = pVideoMemory
[ ii
+ 6 ] ;
2840 pVBInfo
->CR40
[ j
][ 7 ] = pVideoMemory
[ ii
+ 7 ] ;
2844 i
= pVideoMemory
[ 0x1C0 ] | ( pVideoMemory
[ 0x1C1 ] << 8 ) ;
2846 for( j
= 0 ; j
< 8 ; j
++ )
2848 for( k
= 0 ; k
< 4 ; k
++ )
2849 pVBInfo
->CR6B
[ j
][ k
] = pVideoMemory
[ i
+ 4 * j
+ k
] ;
2852 i
= pVideoMemory
[ 0x1C2 ] | ( pVideoMemory
[ 0x1C3 ] << 8 ) ;
2854 for( j
= 0 ; j
< 8 ; j
++ )
2856 for( k
= 0 ; k
< 4 ; k
++ )
2857 pVBInfo
->CR6E
[ j
][ k
] = pVideoMemory
[ i
+ 4 * j
+ k
] ;
2860 i
= pVideoMemory
[ 0x1C4 ] | ( pVideoMemory
[ 0x1C5 ] << 8 ) ;
2861 for( j
= 0 ; j
< 8 ; j
++ )
2863 for( k
= 0 ; k
< 32 ; k
++ )
2864 pVBInfo
->CR6F
[ j
][ k
] = pVideoMemory
[ i
+ 32 * j
+ k
] ;
2867 i
= pVideoMemory
[ 0x1C6 ] | ( pVideoMemory
[ 0x1C7 ] << 8 ) ;
2869 for( j
= 0 ; j
< 8 ; j
++ )
2871 for( k
= 0 ; k
< 2 ; k
++ )
2872 pVBInfo
->CR89
[ j
][ k
] = pVideoMemory
[ i
+ 2 * j
+ k
] ;
2875 i
= pVideoMemory
[ 0x1C8 ] | ( pVideoMemory
[ 0x1C9 ] << 8 ) ;
2876 for( j
= 0 ; j
< 12 ; j
++ )
2877 pVBInfo
->AGPReg
[ j
] = pVideoMemory
[ i
+ j
] ;
2879 i
= pVideoMemory
[ 0x1CF ] | ( pVideoMemory
[ 0x1D0 ] << 8 ) ;
2880 for( j
= 0 ; j
< 4 ; j
++ )
2881 pVBInfo
->SR16
[ j
] = pVideoMemory
[ i
+ j
] ;
2883 if ( ChipType
== XG21
)
2885 if (pVideoMemory
[ 0x67 ] & 0x80)
2887 *pVBInfo
->pDVOSetting
= pVideoMemory
[ 0x67 ];
2889 if ( (pVideoMemory
[ 0x67 ] & 0xC0) == 0xC0 )
2891 *pVBInfo
->pCR2E
= pVideoMemory
[ i
+ 4 ] ;
2892 *pVBInfo
->pCR2F
= pVideoMemory
[ i
+ 5 ] ;
2893 *pVBInfo
->pCR46
= pVideoMemory
[ i
+ 6 ] ;
2894 *pVBInfo
->pCR47
= pVideoMemory
[ i
+ 7 ] ;
2898 if ( ChipType
== XG27
)
2901 for( i
= 0 ; i
<= 0xB ; i
++,jj
++ )
2902 pVBInfo
->pCRD0
[i
] = pVideoMemory
[ jj
] ;
2903 for( i
= 0x0 ; i
<= 0x1 ; i
++,jj
++ )
2904 pVBInfo
->pCRDE
[i
] = pVideoMemory
[ jj
] ;
2906 *pVBInfo
->pSR40
= pVideoMemory
[ jj
] ;
2908 *pVBInfo
->pSR41
= pVideoMemory
[ jj
] ;
2910 if (pVideoMemory
[ 0x67 ] & 0x80)
2912 *pVBInfo
->pDVOSetting
= pVideoMemory
[ 0x67 ];
2914 if ( (pVideoMemory
[ 0x67 ] & 0xC0) == 0xC0 )
2917 *pVBInfo
->pCR2E
= pVideoMemory
[ jj
] ;
2918 *pVBInfo
->pCR2F
= pVideoMemory
[ jj
+ 1 ] ;
2919 *pVBInfo
->pCR46
= pVideoMemory
[ jj
+ 2 ] ;
2920 *pVBInfo
->pCR47
= pVideoMemory
[ jj
+ 3 ] ;
2925 *pVBInfo
->pCRCF
= pVideoMemory
[ 0x1CA ] ;
2926 *pVBInfo
->pXGINew_DRAMTypeDefinition
= pVideoMemory
[ 0x1CB ] ;
2927 *pVBInfo
->pXGINew_I2CDefinition
= pVideoMemory
[ 0x1D1 ] ;
2928 if ( ChipType
>= XG20
)
2930 *pVBInfo
->pXGINew_CR97
= pVideoMemory
[ 0x1D2 ] ;
2931 if ( ChipType
== XG27
)
2933 *pVBInfo
->pSR36
= pVideoMemory
[ 0x1D3 ] ;
2934 *pVBInfo
->pCR8F
= pVideoMemory
[ 0x1D5 ] ;
2940 /* Volari customize data area end */
2942 if ( ChipType
== XG21
)
2944 pVBInfo
->IF_DEF_LVDS
= 0 ;
2945 if (pVideoMemory
[ 0x65 ] & 0x1)
2947 pVBInfo
->IF_DEF_LVDS
= 1 ;
2948 i
= pVideoMemory
[ 0x316 ] | ( pVideoMemory
[ 0x317 ] << 8 );
2949 j
= pVideoMemory
[ i
-1 ] ;
2955 pVBInfo
->XG21_LVDSCapList
[k
].LVDS_Capability
= pVideoMemory
[ i
] | ( pVideoMemory
[ i
+ 1 ] << 8 );
2956 pVBInfo
->XG21_LVDSCapList
[k
].LVDSHT
= pVideoMemory
[ i
+ 2 ] | ( pVideoMemory
[ i
+ 3 ] << 8 ) ;
2957 pVBInfo
->XG21_LVDSCapList
[k
].LVDSVT
= pVideoMemory
[ i
+ 4 ] | ( pVideoMemory
[ i
+ 5 ] << 8 );
2958 pVBInfo
->XG21_LVDSCapList
[k
].LVDSHDE
= pVideoMemory
[ i
+ 6 ] | ( pVideoMemory
[ i
+ 7 ] << 8 );
2959 pVBInfo
->XG21_LVDSCapList
[k
].LVDSVDE
= pVideoMemory
[ i
+ 8 ] | ( pVideoMemory
[ i
+ 9 ] << 8 );
2960 pVBInfo
->XG21_LVDSCapList
[k
].LVDSHFP
= pVideoMemory
[ i
+ 10 ] | ( pVideoMemory
[ i
+ 11 ] << 8 );
2961 pVBInfo
->XG21_LVDSCapList
[k
].LVDSVFP
= pVideoMemory
[ i
+ 12 ] | ( pVideoMemory
[ i
+ 13 ] << 8 );
2962 pVBInfo
->XG21_LVDSCapList
[k
].LVDSHSYNC
= pVideoMemory
[ i
+ 14 ] | ( pVideoMemory
[ i
+ 15 ] << 8 );
2963 pVBInfo
->XG21_LVDSCapList
[k
].LVDSVSYNC
= pVideoMemory
[ i
+ 16 ] | ( pVideoMemory
[ i
+ 17 ] << 8 );
2964 pVBInfo
->XG21_LVDSCapList
[k
].VCLKData1
= pVideoMemory
[ i
+ 18 ] ;
2965 pVBInfo
->XG21_LVDSCapList
[k
].VCLKData2
= pVideoMemory
[ i
+ 19 ] ;
2966 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S1
= pVideoMemory
[ i
+ 20 ] ;
2967 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S2
= pVideoMemory
[ i
+ 21 ] ;
2968 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S3
= pVideoMemory
[ i
+ 22 ] ;
2969 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S4
= pVideoMemory
[ i
+ 23 ] ;
2970 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S5
= pVideoMemory
[ i
+ 24 ] ;
2974 } while ( (j
>0) && ( k
< (sizeof(XGI21_LCDCapList
)/sizeof(XGI21_LVDSCapStruct
)) ) );
2978 pVBInfo
->XG21_LVDSCapList
[0].LVDS_Capability
= pVideoMemory
[ i
] | ( pVideoMemory
[ i
+ 1 ] << 8 );
2979 pVBInfo
->XG21_LVDSCapList
[0].LVDSHT
= pVideoMemory
[ i
+ 2 ] | ( pVideoMemory
[ i
+ 3 ] << 8 ) ;
2980 pVBInfo
->XG21_LVDSCapList
[0].LVDSVT
= pVideoMemory
[ i
+ 4 ] | ( pVideoMemory
[ i
+ 5 ] << 8 );
2981 pVBInfo
->XG21_LVDSCapList
[0].LVDSHDE
= pVideoMemory
[ i
+ 6 ] | ( pVideoMemory
[ i
+ 7 ] << 8 );
2982 pVBInfo
->XG21_LVDSCapList
[0].LVDSVDE
= pVideoMemory
[ i
+ 8 ] | ( pVideoMemory
[ i
+ 9 ] << 8 );
2983 pVBInfo
->XG21_LVDSCapList
[0].LVDSHFP
= pVideoMemory
[ i
+ 10 ] | ( pVideoMemory
[ i
+ 11 ] << 8 );
2984 pVBInfo
->XG21_LVDSCapList
[0].LVDSVFP
= pVideoMemory
[ i
+ 12 ] | ( pVideoMemory
[ i
+ 13 ] << 8 );
2985 pVBInfo
->XG21_LVDSCapList
[0].LVDSHSYNC
= pVideoMemory
[ i
+ 14 ] | ( pVideoMemory
[ i
+ 15 ] << 8 );
2986 pVBInfo
->XG21_LVDSCapList
[0].LVDSVSYNC
= pVideoMemory
[ i
+ 16 ] | ( pVideoMemory
[ i
+ 17 ] << 8 );
2987 pVBInfo
->XG21_LVDSCapList
[0].VCLKData1
= pVideoMemory
[ i
+ 18 ] ;
2988 pVBInfo
->XG21_LVDSCapList
[0].VCLKData2
= pVideoMemory
[ i
+ 19 ] ;
2989 pVBInfo
->XG21_LVDSCapList
[0].PSC_S1
= pVideoMemory
[ i
+ 20 ] ;
2990 pVBInfo
->XG21_LVDSCapList
[0].PSC_S2
= pVideoMemory
[ i
+ 21 ] ;
2991 pVBInfo
->XG21_LVDSCapList
[0].PSC_S3
= pVideoMemory
[ i
+ 22 ] ;
2992 pVBInfo
->XG21_LVDSCapList
[0].PSC_S4
= pVideoMemory
[ i
+ 23 ] ;
2993 pVBInfo
->XG21_LVDSCapList
[0].PSC_S5
= pVideoMemory
[ i
+ 24 ] ;
2999 /* --------------------------------------------------------------------- */
3000 /* Function : XGINew_DDR1x_MRS_XG20 */
3004 /* --------------------------------------------------------------------- */
3005 void XGINew_DDR1x_MRS_XG20( ULONG P3c4
, PVB_DEVICE_INFO pVBInfo
)
3008 XGINew_SetReg1( P3c4
, 0x18 , 0x01 ) ;
3009 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ;
3010 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
3011 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
3014 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ;
3015 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ;
3016 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
3017 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
3019 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
3020 /* XGINew_SetReg1( P3c4 , 0x18 , 0x31 ) ; */
3021 XGINew_SetReg1( P3c4
, 0x19 , 0x01 ) ;
3022 XGINew_SetReg1( P3c4
, 0x16 , 0x03 ) ;
3023 XGINew_SetReg1( P3c4
, 0x16 , 0x83 ) ;
3025 XGINew_SetReg1( P3c4
, 0x1B , 0x03 ) ;
3027 /* XGINew_SetReg1( P3c4 , 0x18 , 0x31 ) ; */
3028 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
3029 XGINew_SetReg1( P3c4
, 0x19 , 0x00 ) ;
3030 XGINew_SetReg1( P3c4
, 0x16 , 0x03 ) ;
3031 XGINew_SetReg1( P3c4
, 0x16 , 0x83 ) ;
3032 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ;
3035 /* --------------------------------------------------------------------- */
3036 /* Function : XGINew_SetDRAMModeRegister_XG20 */
3040 /* --------------------------------------------------------------------- */
3041 void XGINew_SetDRAMModeRegister_XG20( PXGI_HW_DEVICE_INFO HwDeviceExtension
)
3043 VB_DEVICE_INFO VBINF
;
3044 PVB_DEVICE_INFO pVBInfo
= &VBINF
;
3045 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
3046 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
3047 pVBInfo
->BaseAddr
= (ULONG
)HwDeviceExtension
->pjIOAddress
;
3048 pVBInfo
->ISXPDOS
= 0 ;
3050 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
3051 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
3052 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
3053 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
3054 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
3055 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
3056 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
3057 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
3058 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
3059 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
3060 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
3061 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
3062 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
3063 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
3064 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
3065 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
3066 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
3068 InitTo330Pointer(HwDeviceExtension
->jChipType
,pVBInfo
);
3070 ReadVBIOSTablData( HwDeviceExtension
->jChipType
, pVBInfo
) ;
3072 if ( XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) == 0 )
3073 XGINew_DDR1x_MRS_XG20( pVBInfo
->P3c4
, pVBInfo
) ;
3075 XGINew_DDR2_MRS_XG20( HwDeviceExtension
, pVBInfo
->P3c4
, pVBInfo
) ;
3077 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , 0x03 ) ;
3080 void XGINew_SetDRAMModeRegister_XG27( PXGI_HW_DEVICE_INFO HwDeviceExtension
)
3082 VB_DEVICE_INFO VBINF
;
3083 PVB_DEVICE_INFO pVBInfo
= &VBINF
;
3084 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
3085 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
3086 pVBInfo
->BaseAddr
= (ULONG
)HwDeviceExtension
->pjIOAddress
;
3087 pVBInfo
->ISXPDOS
= 0 ;
3089 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
3090 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
3091 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
3092 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
3093 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
3094 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
3095 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
3096 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
3097 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
3098 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
3099 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
3100 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
3101 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
3102 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
3103 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
3104 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
3105 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
3107 InitTo330Pointer(HwDeviceExtension
->jChipType
,pVBInfo
);
3109 ReadVBIOSTablData( HwDeviceExtension
->jChipType
, pVBInfo
) ;
3111 if ( XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) == 0 )
3112 XGINew_DDR1x_MRS_XG20( pVBInfo
->P3c4
, pVBInfo
) ;
3114 //XGINew_DDR2_MRS_XG27( HwDeviceExtension , pVBInfo->P3c4 , pVBInfo ) ;
3115 XGINew_DDRII_Bootup_XG27( HwDeviceExtension
, pVBInfo
->P3c4
, pVBInfo
) ;
3117 //XGINew_SetReg1( pVBInfo->P3c4 , 0x1B , 0x03 ) ;
3118 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , pVBInfo
->SR15
[ 3 ][ XGINew_RAMType
] ) ; /* SR1B */
3122 void XGINew_SetDRAMModeRegister_XG27( PXGI_HW_DEVICE_INFO HwDeviceExtension )
3127 VB_DEVICE_INFO VBINF;
3128 PVB_DEVICE_INFO pVBInfo = &VBINF;
3129 pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ;
3130 pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ;
3131 pVBInfo->BaseAddr = HwDeviceExtension->pjIOAddress ;
3132 pVBInfo->ISXPDOS = 0 ;
3134 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14 ;
3135 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24 ;
3136 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10 ;
3137 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e ;
3138 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12 ;
3139 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a ;
3140 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16 ;
3141 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17 ;
3142 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18 ;
3143 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19 ;
3144 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A ;
3145 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00 ;
3146 pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04 ;
3147 pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10 ;
3148 pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12 ;
3149 pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 ;
3150 pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2 ;
3152 InitTo330Pointer(HwDeviceExtension->jChipType,pVBInfo);
3154 ReadVBIOSTablData( HwDeviceExtension->jChipType , pVBInfo) ;
3156 if ( XGINew_GetXG20DRAMType( HwDeviceExtension, pVBInfo) == 0 )
3157 XGINew_DDR1x_MRS_XG20( pVBInfo->P3c4, pVBInfo ) ;
3159 XGINew_DDR2_MRS_XG27( HwDeviceExtension , pVBInfo->P3c4 , pVBInfo ) ;
3161 XGINew_SetReg1( pVBInfo->P3c4 , 0x1B , 0x03 ) ;
3164 /* -------------------------------------------------------- */
3165 /* Function : XGINew_ChkSenseStatus */
3169 /* -------------------------------------------------------- */
3170 void XGINew_ChkSenseStatus ( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
3172 USHORT tempbx
=0 , temp
, tempcx
, CR3CData
;
3174 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x32 ) ;
3176 if ( temp
& Monitor1Sense
)
3177 tempbx
|= ActiveCRT1
;
3178 if ( temp
& LCDSense
)
3179 tempbx
|= ActiveLCD
;
3180 if ( temp
& Monitor2Sense
)
3181 tempbx
|= ActiveCRT2
;
3182 if ( temp
& TVSense
)
3184 tempbx
|= ActiveTV
;
3185 if ( temp
& AVIDEOSense
)
3186 tempbx
|= ( ActiveAVideo
<< 8 );
3187 if ( temp
& SVIDEOSense
)
3188 tempbx
|= ( ActiveSVideo
<< 8 );
3189 if ( temp
& SCARTSense
)
3190 tempbx
|= ( ActiveSCART
<< 8 );
3191 if ( temp
& HiTVSense
)
3192 tempbx
|= ( ActiveHiTV
<< 8 );
3193 if ( temp
& YPbPrSense
)
3194 tempbx
|= ( ActiveYPbPr
<< 8 );
3197 tempcx
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x3d ) ;
3198 tempcx
|= ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x3e ) << 8 ) ;
3200 if ( tempbx
& tempcx
)
3202 CR3CData
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x3c ) ;
3203 if ( !( CR3CData
& DisplayDeviceFromCMOS
) )
3206 if ( *pVBInfo
->pSoftSetting
& ModeSoftSetting
)
3215 if ( *pVBInfo
->pSoftSetting
& ModeSoftSetting
)
3222 XGINew_SetReg1( pVBInfo
->P3d4
, 0x3d , ( tempbx
& 0x00FF ) ) ;
3223 XGINew_SetReg1( pVBInfo
->P3d4
, 0x3e , ( ( tempbx
& 0xFF00 ) >> 8 )) ;
3225 /* -------------------------------------------------------- */
3226 /* Function : XGINew_SetModeScratch */
3230 /* -------------------------------------------------------- */
3231 void XGINew_SetModeScratch ( PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
3233 USHORT temp
, tempcl
= 0 , tempch
= 0 , CR31Data
, CR38Data
;
3235 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x3d ) ;
3236 temp
|= XGINew_GetReg1( pVBInfo
->P3d4
, 0x3e ) << 8 ;
3237 temp
|= ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x31 ) & ( DriverMode
>> 8) ) << 8 ;
3239 if ( pVBInfo
->IF_DEF_CRT2Monitor
== 1)
3241 if ( temp
& ActiveCRT2
)
3242 tempcl
= SetCRT2ToRAMDAC
;
3245 if ( temp
& ActiveLCD
)
3247 tempcl
|= SetCRT2ToLCD
;
3248 if ( temp
& DriverMode
)
3250 if ( temp
& ActiveTV
)
3252 tempch
= SetToLCDA
| EnableDualEdge
;
3253 temp
^= SetCRT2ToLCD
;
3255 if ( ( temp
>> 8 ) & ActiveAVideo
)
3256 tempcl
|= SetCRT2ToAVIDEO
;
3257 if ( ( temp
>> 8 ) & ActiveSVideo
)
3258 tempcl
|= SetCRT2ToSVIDEO
;
3259 if ( ( temp
>> 8 ) & ActiveSCART
)
3260 tempcl
|= SetCRT2ToSCART
;
3262 if ( pVBInfo
->IF_DEF_HiVision
== 1 )
3264 if ( ( temp
>> 8 ) & ActiveHiTV
)
3265 tempcl
|= SetCRT2ToHiVisionTV
;
3268 if ( pVBInfo
->IF_DEF_YPbPr
== 1 )
3270 if ( ( temp
>> 8 ) & ActiveYPbPr
)
3271 tempch
|= SetYPbPr
;
3278 if ( ( temp
>> 8 ) & ActiveAVideo
)
3279 tempcl
|= SetCRT2ToAVIDEO
;
3280 if ( ( temp
>> 8 ) & ActiveSVideo
)
3281 tempcl
|= SetCRT2ToSVIDEO
;
3282 if ( ( temp
>> 8 ) & ActiveSCART
)
3283 tempcl
|= SetCRT2ToSCART
;
3285 if ( pVBInfo
->IF_DEF_HiVision
== 1 )
3287 if ( ( temp
>> 8 ) & ActiveHiTV
)
3288 tempcl
|= SetCRT2ToHiVisionTV
;
3291 if ( pVBInfo
->IF_DEF_YPbPr
== 1 )
3293 if ( ( temp
>> 8 ) & ActiveYPbPr
)
3294 tempch
|= SetYPbPr
;
3299 tempcl
|= SetSimuScanMode
;
3300 if ( (!( temp
& ActiveCRT1
)) && ( ( temp
& ActiveLCD
) || ( temp
& ActiveTV
) || ( temp
& ActiveCRT2
) ) )
3301 tempcl
^= ( SetSimuScanMode
| SwitchToCRT2
) ;
3302 if ( ( temp
& ActiveLCD
) && ( temp
& ActiveTV
) )
3303 tempcl
^= ( SetSimuScanMode
| SwitchToCRT2
) ;
3304 XGINew_SetReg1( pVBInfo
->P3d4
, 0x30 , tempcl
) ;
3306 CR31Data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x31 ) ;
3307 CR31Data
&= ~( SetNotSimuMode
>> 8 ) ;
3308 if ( !( temp
& ActiveCRT1
) )
3309 CR31Data
|= ( SetNotSimuMode
>> 8 ) ;
3310 CR31Data
&= ~( DisableCRT2Display
>> 8 ) ;
3311 if (!( ( temp
& ActiveLCD
) || ( temp
& ActiveTV
) || ( temp
& ActiveCRT2
) ) )
3312 CR31Data
|= ( DisableCRT2Display
>> 8 ) ;
3313 XGINew_SetReg1( pVBInfo
->P3d4
, 0x31 , CR31Data
) ;
3315 CR38Data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
3316 CR38Data
&= ~SetYPbPr
;
3317 CR38Data
|= tempch
;
3318 XGINew_SetReg1( pVBInfo
->P3d4
, 0x38 , CR38Data
) ;
3322 /* -------------------------------------------------------- */
3323 /* Function : XGINew_GetXG21Sense */
3327 /* -------------------------------------------------------- */
3328 void XGINew_GetXG21Sense(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
3331 PUCHAR
volatile pVideoMemory
= ( PUCHAR
)pVBInfo
->ROMAddr
;
3333 pVBInfo
->IF_DEF_LVDS
= 0 ;
3336 pVBInfo
->IF_DEF_CH7007
= 0 ;
3337 if ( ( pVideoMemory
[ 0x65 ] & 0x02 ) ) /* For XG21 CH7007 */
3339 /* VideoDebugPrint((0, "ReadVBIOSTablData: pVideoMemory[ 0x65 ] =%x\n",pVideoMemory[ 0x65 ])); */
3340 pVBInfo
->IF_DEF_CH7007
= 1 ; /* [Billy] 07/05/03 */
3341 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0x60 ) ; /* CH7007 on chip */
3346 if (( pVideoMemory
[ 0x65 ] & 0x01 ) ) /* For XG21 LVDS */
3348 pVBInfo
->IF_DEF_LVDS
= 1 ;
3349 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x32 , LCDSense
) ;
3350 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0xC0 ) ; /* LVDS on chip */
3355 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x03 , 0x03 ) ; /* Enable GPIOA/B read */
3356 Temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) & 0xC0;
3358 { /* DVI & DVO GPIOA/B pull high */
3359 XGINew_SenseLCD( HwDeviceExtension
, pVBInfo
) ;
3360 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x32 , LCDSense
) ;
3361 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x20 , 0x20 ) ; /* Enable read GPIOF */
3362 Temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) & 0x04 ;
3364 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0x80 ) ; /* TMDS on chip */
3366 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0xA0 ) ; /* Only DVO on chip */
3367 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x4A , ~0x20 ) ; /* Disable read GPIOF */
3374 /* -------------------------------------------------------- */
3375 /* Function : XGINew_GetXG27Sense */
3379 /* -------------------------------------------------------- */
3380 void XGINew_GetXG27Sense(PXGI_HW_DEVICE_INFO HwDeviceExtension
, PVB_DEVICE_INFO pVBInfo
)
3384 pVBInfo
->IF_DEF_LVDS
= 0 ;
3385 bCR4A
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x4A ) ;
3386 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x07 , 0x07 ) ; /* Enable GPIOA/B/C read */
3387 Temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) & 0x07;
3388 XGINew_SetReg1( pVBInfo
->P3d4
, 0x4A , bCR4A
) ;
3392 pVBInfo
->IF_DEF_LVDS
= 1 ;
3393 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0xC0 ) ; /* LVDS setting */
3394 XGINew_SetReg1( pVBInfo
->P3d4
, 0x30 , 0x21 ) ;
3398 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0xA0 ) ; /* TMDS/DVO setting */
3400 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x32 , LCDSense
) ;
3404 UCHAR
GetXG21FPBits(PVB_DEVICE_INFO pVBInfo
)
3406 UCHAR CR38
,CR4A
,temp
;
3408 CR4A
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x4A ) ;
3409 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x10 , 0x10 ) ; /* enable GPIOE read */
3410 CR38
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
3412 if ( ( CR38
& 0xE0 ) > 0x80 )
3414 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) ;
3419 XGINew_SetReg1( pVBInfo
->P3d4
, 0x4A , CR4A
) ;
3424 UCHAR
GetXG27FPBits(PVB_DEVICE_INFO pVBInfo
)
3428 CR4A
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x4A ) ;
3429 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x03 , 0x03 ) ; /* enable GPIOA/B/C read */
3430 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) ;
3437 temp
= ((temp
&0x04)>>1) || ((~temp
)&0x01);
3439 XGINew_SetReg1( pVBInfo
->P3d4
, 0x4A , CR4A
) ;