3 #include <linux/version.h>
4 #include <linux/types.h>
5 #include <linux/delay.h> /* udelay */
11 #include "vb_setmode.h"
21 unsigned char XGINew_ChannelAB
, XGINew_DataBusWidth
;
23 unsigned short XGINew_DRAMType
[17][5] = {
24 {0x0C, 0x0A, 0x02, 0x40, 0x39}, {0x0D, 0x0A, 0x01, 0x40, 0x48},
25 {0x0C, 0x09, 0x02, 0x20, 0x35}, {0x0D, 0x09, 0x01, 0x20, 0x44},
26 {0x0C, 0x08, 0x02, 0x10, 0x31}, {0x0D, 0x08, 0x01, 0x10, 0x40},
27 {0x0C, 0x0A, 0x01, 0x20, 0x34}, {0x0C, 0x09, 0x01, 0x08, 0x32},
28 {0x0B, 0x08, 0x02, 0x08, 0x21}, {0x0C, 0x08, 0x01, 0x08, 0x30},
29 {0x0A, 0x08, 0x02, 0x04, 0x11}, {0x0B, 0x0A, 0x01, 0x10, 0x28},
30 {0x09, 0x08, 0x02, 0x02, 0x01}, {0x0B, 0x09, 0x01, 0x08, 0x24},
31 {0x0B, 0x08, 0x01, 0x04, 0x20}, {0x0A, 0x08, 0x01, 0x02, 0x10},
32 {0x09, 0x08, 0x01, 0x01, 0x00} };
34 unsigned short XGINew_SDRDRAM_TYPE
[13][5] = {
35 { 2, 12, 9, 64, 0x35},
36 { 1, 13, 9, 64, 0x44},
37 { 2, 12, 8, 32, 0x31},
38 { 2, 11, 9, 32, 0x25},
39 { 1, 12, 9, 32, 0x34},
40 { 1, 13, 8, 32, 0x40},
41 { 2, 11, 8, 16, 0x21},
42 { 1, 12, 8, 16, 0x30},
43 { 1, 11, 9, 16, 0x24},
47 { 1, 9, 8, 2, 0x00} };
49 unsigned short XGINew_DDRDRAM_TYPE
[4][5] = {
50 { 2, 12, 9, 64, 0x35},
51 { 2, 12, 8, 32, 0x31},
52 { 2, 11, 8, 16, 0x21},
53 { 2, 9, 8, 4, 0x01} };
55 unsigned short XGINew_DDRDRAM_TYPE340
[4][5] = {
56 { 2, 13, 9, 64, 0x45},
57 { 2, 12, 9, 32, 0x35},
58 { 2, 12, 8, 16, 0x31},
59 { 2, 11, 8, 8, 0x21} };
61 unsigned short XGINew_DDRDRAM_TYPE20
[12][5] = {
62 { 2, 14, 11, 128, 0x5D},
63 { 2, 14, 10, 64, 0x59},
64 { 2, 13, 11, 64, 0x4D},
65 { 2, 14, 9, 32, 0x55},
66 { 2, 13, 10, 32, 0x49},
67 { 2, 12, 11, 32, 0x3D},
68 { 2, 14, 8, 16, 0x51},
69 { 2, 13, 9, 16, 0x45},
70 { 2, 12, 10, 16, 0x39},
73 { 2, 12, 8, 4, 0x31} };
75 void XGINew_SetDRAMSize_340(struct xgi_hw_device_info
*, struct vb_device_info
*);
76 void XGINew_SetDRAMSize_310(struct xgi_hw_device_info
*, struct vb_device_info
*);
77 void XGINew_SetMemoryClock(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*);
78 void XGINew_SetDRAMModeRegister(struct vb_device_info
*);
79 void XGINew_SetDRAMModeRegister340(struct xgi_hw_device_info
*HwDeviceExtension
);
80 void XGINew_SetDRAMDefaultRegister340(struct xgi_hw_device_info
*HwDeviceExtension
,
81 unsigned long, struct vb_device_info
*);
82 unsigned char XGINew_GetXG20DRAMType(struct xgi_hw_device_info
*HwDeviceExtension
,
83 struct vb_device_info
*pVBInfo
);
84 unsigned char XGIInitNew(struct xgi_hw_device_info
*HwDeviceExtension
);
86 int XGINew_DDRSizing340(struct xgi_hw_device_info
*, struct vb_device_info
*);
87 void XGINew_DisableRefresh(struct xgi_hw_device_info
*, struct vb_device_info
*) ;
88 void XGINew_CheckBusWidth_310(struct vb_device_info
*) ;
89 int XGINew_SDRSizing(struct vb_device_info
*);
90 int XGINew_DDRSizing(struct vb_device_info
*);
91 void XGINew_EnableRefresh(struct xgi_hw_device_info
*, struct vb_device_info
*);
92 int XGINew_RAMType
; /*int ModeIDOffset,StandTable,CRT1Table,ScreenOffset,REFIndex;*/
93 unsigned long UNIROM
; /* UNIROM */
94 unsigned char ChkLFB(struct vb_device_info
*);
95 void XGINew_Delay15us(unsigned long);
96 void SetPowerConsume(struct xgi_hw_device_info
*HwDeviceExtension
,
97 unsigned long XGI_P3d4Port
);
98 void ReadVBIOSTablData(unsigned char ChipType
, struct vb_device_info
*pVBInfo
);
99 void XGINew_DDR1x_MRS_XG20(unsigned long P3c4
, struct vb_device_info
*pVBInfo
);
100 void XGINew_SetDRAMModeRegister_XG20(struct xgi_hw_device_info
*HwDeviceExtension
);
101 void XGINew_SetDRAMModeRegister_XG27(struct xgi_hw_device_info
*HwDeviceExtension
);
102 void XGINew_ChkSenseStatus(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
) ;
103 void XGINew_SetModeScratch(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
) ;
104 void XGINew_GetXG21Sense(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
) ;
105 unsigned char GetXG21FPBits(struct vb_device_info
*pVBInfo
);
106 void XGINew_GetXG27Sense(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
) ;
107 unsigned char GetXG27FPBits(struct vb_device_info
*pVBInfo
);
109 void DelayUS(unsigned long MicroSeconds
)
111 udelay(MicroSeconds
);
115 /* --------------------------------------------------------------------- */
116 /* Function : XGIInitNew */
120 /* --------------------------------------------------------------------- */
121 unsigned char XGIInitNew(struct xgi_hw_device_info
*HwDeviceExtension
)
124 struct vb_device_info VBINF
;
125 struct vb_device_info
*pVBInfo
= &VBINF
;
126 unsigned char i
, temp
= 0, temp1
;
127 // VBIOSVersion[ 5 ] ;
128 volatile unsigned char *pVideoMemory
;
130 /* unsigned long j, k ; */
132 struct XGI_DSReg
*pSR
;
136 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
138 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
140 pVBInfo
->BaseAddr
= (unsigned long)HwDeviceExtension
->pjIOAddress
;
142 pVideoMemory
= (unsigned char *)pVBInfo
->ROMAddr
;
145 // Newdebugcode( 0x99 ) ;
148 /* if ( pVBInfo->ROMAddr == 0 ) */
151 if (pVBInfo
->FBAddr
== 0) {
152 printk("\n pVBInfo->FBAddr == 0 ");
156 if (pVBInfo
->BaseAddr
== 0) {
157 printk("\npVBInfo->BaseAddr == 0 ");
162 XGINew_SetReg3( ( pVBInfo
->BaseAddr
+ 0x12 ) , 0x67 ) ; /* 3c2 <- 67 ,ynlai */
164 pVBInfo
->ISXPDOS
= 0 ;
167 if ( !HwDeviceExtension
->bIntegratedMMEnabled
)
172 // VBIOSVersion[ 4 ] = 0x0 ;
174 /* 09/07/99 modify by domao */
176 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
177 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
178 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
179 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
180 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
181 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
182 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
183 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
184 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
185 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
186 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
187 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
188 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
189 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
190 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
191 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
192 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
195 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
196 XGI_GetVBType( pVBInfo
) ; /* Run XGI_GetVBType before InitTo330Pointer */
198 InitTo330Pointer( HwDeviceExtension
->jChipType
, pVBInfo
) ;
201 ReadVBIOSTablData( HwDeviceExtension
->jChipType
, pVBInfo
) ;
204 XGINew_SetReg1( pVBInfo
->P3c4
, 0x05 , 0x86 ) ;
207 /* GetXG21Sense (GPIO) */
208 if ( HwDeviceExtension
->jChipType
== XG21
)
210 XGINew_GetXG21Sense(HwDeviceExtension
, pVBInfo
) ;
212 if ( HwDeviceExtension
->jChipType
== XG27
)
214 XGINew_GetXG27Sense(HwDeviceExtension
, pVBInfo
) ;
218 /* 2.Reset Extended register */
220 for( i
= 0x06 ; i
< 0x20 ; i
++ )
221 XGINew_SetReg1( pVBInfo
->P3c4
, i
, 0 ) ;
223 for( i
= 0x21 ; i
<= 0x27 ; i
++ )
224 XGINew_SetReg1( pVBInfo
->P3c4
, i
, 0 ) ;
226 /* for( i = 0x06 ; i <= 0x27 ; i++ ) */
227 /* XGINew_SetReg1( pVBInfo->P3c4 , i , 0 ) ; */
231 if(( HwDeviceExtension
->jChipType
>= XG20
) || ( HwDeviceExtension
->jChipType
>= XG40
))
233 for( i
= 0x31 ; i
<= 0x3B ; i
++ )
234 XGINew_SetReg1( pVBInfo
->P3c4
, i
, 0 ) ;
238 for( i
= 0x31 ; i
<= 0x3D ; i
++ )
239 XGINew_SetReg1( pVBInfo
->P3c4
, i
, 0 ) ;
243 if ( HwDeviceExtension
->jChipType
== XG42
) /* [Hsuan] 2004/08/20 Auto over driver for XG42 */
244 XGINew_SetReg1( pVBInfo
->P3c4
, 0x3B , 0xC0 ) ;
246 /* for( i = 0x30 ; i <= 0x3F ; i++ ) */
247 /* XGINew_SetReg1( pVBInfo->P3d4 , i , 0 ) ; */
249 for( i
= 0x79 ; i
<= 0x7C ; i
++ )
250 XGINew_SetReg1( pVBInfo
->P3d4
, i
, 0 ) ; /* shampoo 0208 */
254 if ( HwDeviceExtension
->jChipType
>= XG20
)
255 XGINew_SetReg1( pVBInfo
->P3d4
, 0x97 , *pVBInfo
->pXGINew_CR97
) ;
259 if ( HwDeviceExtension->jChipType >= XG40 )
260 XGINew_RAMType = ( int )XGINew_GetXG20DRAMType( HwDeviceExtension , pVBInfo) ;
262 if ( HwDeviceExtension->jChipType < XG40 )
263 XGINew_SetMemoryClock( HwDeviceExtension , pVBInfo ) ; */
267 /* 4.SetDefExt1Regs begin */
268 XGINew_SetReg1( pVBInfo
->P3c4
, 0x07 , *pVBInfo
->pSR07
) ;
269 if ( HwDeviceExtension
->jChipType
== XG27
)
271 XGINew_SetReg1( pVBInfo
->P3c4
, 0x40 , *pVBInfo
->pSR40
) ;
272 XGINew_SetReg1( pVBInfo
->P3c4
, 0x41 , *pVBInfo
->pSR41
) ;
274 XGINew_SetReg1( pVBInfo
->P3c4
, 0x11 , 0x0F ) ;
275 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1F , *pVBInfo
->pSR1F
) ;
276 /* XGINew_SetReg1( pVBInfo->P3c4 , 0x20 , 0x20 ) ; */
277 XGINew_SetReg1( pVBInfo
->P3c4
, 0x20 , 0xA0 ) ; /* alan, 2001/6/26 Frame buffer can read/write SR20 */
278 XGINew_SetReg1( pVBInfo
->P3c4
, 0x36 , 0x70 ) ; /* Hsuan, 2006/01/01 H/W request for slow corner chip */
279 if ( HwDeviceExtension
->jChipType
== XG27
) /* Alan 12/07/2006 */
280 XGINew_SetReg1( pVBInfo
->P3c4
, 0x36 , *pVBInfo
->pSR36
) ;
283 /* XGINew_SetReg1( pVBInfo->P3c4 , 0x11 , SR11 ) ; */
287 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
289 // /* Set AGP Rate */
290 // temp1 = XGINew_GetReg1( pVBInfo->P3c4 , 0x3B ) ;
292 // if ( temp1 == 0x02 )
294 // XGINew_SetReg4( 0xcf8 , 0x80000000 ) ;
295 // ChipsetID = XGINew_GetReg3( 0x0cfc ) ;
296 // XGINew_SetReg4( 0xcf8 , 0x8000002C ) ;
297 // VendorID = XGINew_GetReg3( 0x0cfc ) ;
298 // VendorID &= 0x0000FFFF ;
299 // XGINew_SetReg4( 0xcf8 , 0x8001002C ) ;
300 // GraphicVendorID = XGINew_GetReg3( 0x0cfc ) ;
301 // GraphicVendorID &= 0x0000FFFF;
303 // if ( ChipsetID == 0x7301039 )
304 /// XGINew_SetReg1( pVBInfo->P3d4 , 0x5F , 0x09 ) ;
306 // ChipsetID &= 0x0000FFFF ;
308 // if ( ( ChipsetID == 0x700E ) || ( ChipsetID == 0x1022 ) || ( ChipsetID == 0x1106 ) || ( ChipsetID == 0x10DE ) )
310 // if ( ChipsetID == 0x1106 )
312 // if ( ( VendorID == 0x1019 ) && ( GraphicVendorID == 0x1019 ) )
313 // XGINew_SetReg1( pVBInfo->P3d4 , 0x5F , 0x0D ) ;
315 // XGINew_SetReg1( pVBInfo->P3d4 , 0x5F , 0x0B ) ;
318 // XGINew_SetReg1( pVBInfo->P3d4 , 0x5F , 0x0B ) ;
324 if ( HwDeviceExtension
->jChipType
>= XG40
)
326 /* Set AGP customize registers (in SetDefAGPRegs) Start */
327 for( i
= 0x47 ; i
<= 0x4C ; i
++ )
328 XGINew_SetReg1( pVBInfo
->P3d4
, i
, pVBInfo
->AGPReg
[ i
- 0x47 ] ) ;
330 for( i
= 0x70 ; i
<= 0x71 ; i
++ )
331 XGINew_SetReg1( pVBInfo
->P3d4
, i
, pVBInfo
->AGPReg
[ 6 + i
- 0x70 ] ) ;
333 for( i
= 0x74 ; i
<= 0x77 ; i
++ )
334 XGINew_SetReg1( pVBInfo
->P3d4
, i
, pVBInfo
->AGPReg
[ 8 + i
- 0x74 ] ) ;
335 /* Set AGP customize registers (in SetDefAGPRegs) End */
336 /*[Hsuan]2004/12/14 AGP Input Delay Adjustment on 850 */
337 // XGINew_SetReg4( 0xcf8 , 0x80000000 ) ;
338 // ChipsetID = XGINew_GetReg3( 0x0cfc ) ;
339 // if ( ChipsetID == 0x25308086 )
340 // XGINew_SetReg1( pVBInfo->P3d4 , 0x77 , 0xF0 ) ;
342 HwDeviceExtension
->pQueryVGAConfigSpace( HwDeviceExtension
, 0x50 , 0 , &Temp
) ; /* Get */
347 XGINew_SetReg1( pVBInfo
->P3d4
, 0x48 , 0x20 ) ; /* CR48 */
351 if ( HwDeviceExtension
->jChipType
< XG40
)
352 XGINew_SetReg1( pVBInfo
->P3d4
, 0x49 , pVBInfo
->CR49
[ 0 ] ) ;
356 XGINew_SetReg1( pVBInfo
->P3c4
, 0x23 , *pVBInfo
->pSR23
) ;
357 XGINew_SetReg1( pVBInfo
->P3c4
, 0x24 , *pVBInfo
->pSR24
) ;
358 XGINew_SetReg1( pVBInfo
->P3c4
, 0x25 , pVBInfo
->SR25
[ 0 ] ) ;
361 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
364 XGI_UnLockCRT2( HwDeviceExtension
, pVBInfo
) ;
365 XGINew_SetRegANDOR( pVBInfo
->Part0Port
, 0x3F , 0xEF , 0x00 ) ; /* alan, disable VideoCapture */
366 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x00 , 0x00 ) ;
367 temp1
= (unsigned char)XGINew_GetReg1(pVBInfo
->P3d4
, 0x7B); /* chk if BCLK>=100MHz */
368 temp
= (unsigned char)((temp1
>> 4) & 0x0F);
371 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x02 , ( *pVBInfo
->pCRT2Data_1_2
) ) ;
375 XGINew_SetReg1( pVBInfo
->Part1Port
, 0x2E , 0x08 ) ; /* use VB */
379 XGINew_SetReg1( pVBInfo
->P3c4
, 0x27 , 0x1F ) ;
381 if ( ( HwDeviceExtension
->jChipType
== XG42
) && XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) != 0 ) /* Not DDR */
383 XGINew_SetReg1( pVBInfo
->P3c4
, 0x31 , ( *pVBInfo
->pSR31
& 0x3F ) | 0x40 ) ;
384 XGINew_SetReg1( pVBInfo
->P3c4
, 0x32 , ( *pVBInfo
->pSR32
& 0xFC ) | 0x01 ) ;
388 XGINew_SetReg1( pVBInfo
->P3c4
, 0x31 , *pVBInfo
->pSR31
) ;
389 XGINew_SetReg1( pVBInfo
->P3c4
, 0x32 , *pVBInfo
->pSR32
) ;
391 XGINew_SetReg1( pVBInfo
->P3c4
, 0x33 , *pVBInfo
->pSR33
) ;
395 if ( HwDeviceExtension->jChipType >= XG40 )
396 SetPowerConsume ( HwDeviceExtension , pVBInfo->P3c4); */
398 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
400 if ( XGI_BridgeIsOn( pVBInfo
) == 1 )
402 if ( pVBInfo
->IF_DEF_LVDS
== 0 )
404 XGINew_SetReg1( pVBInfo
->Part2Port
, 0x00 , 0x1C ) ;
405 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x0D , *pVBInfo
->pCRT2Data_4_D
) ;
406 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x0E , *pVBInfo
->pCRT2Data_4_E
) ;
407 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x10 , *pVBInfo
->pCRT2Data_4_10
) ;
408 XGINew_SetReg1( pVBInfo
->Part4Port
, 0x0F , 0x3F ) ;
411 XGI_LockCRT2( HwDeviceExtension
, pVBInfo
) ;
416 if ( HwDeviceExtension
->jChipType
< XG40
)
417 XGINew_SetReg1( pVBInfo
->P3d4
, 0x83 , 0x00 ) ;
420 if (HwDeviceExtension
->bSkipSense
== 0) {
423 XGI_SenseCRT1(pVBInfo
) ;
426 /* XGINew_DetectMonitor( HwDeviceExtension ) ; */
427 pVBInfo
->IF_DEF_CH7007
= 0;
428 if ( ( HwDeviceExtension
->jChipType
== XG21
) && (pVBInfo
->IF_DEF_CH7007
) )
431 XGI_GetSenseStatus( HwDeviceExtension
, pVBInfo
) ; /* sense CRT2 */
435 if ( HwDeviceExtension
->jChipType
== XG21
)
439 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , ~Monitor1Sense
, Monitor1Sense
) ; /* Z9 default has CRT */
440 temp
= GetXG21FPBits( pVBInfo
) ;
441 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x37 , ~0x01, temp
) ;
445 if ( HwDeviceExtension
->jChipType
== XG27
)
447 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x32 , ~Monitor1Sense
, Monitor1Sense
) ; /* Z9 default has CRT */
448 temp
= GetXG27FPBits( pVBInfo
) ;
449 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x37 , ~0x03, temp
) ;
454 if ( HwDeviceExtension
->jChipType
>= XG40
)
456 if ( HwDeviceExtension
->jChipType
>= XG40
)
458 XGINew_RAMType
= ( int )XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
461 XGINew_SetDRAMDefaultRegister340( HwDeviceExtension
, pVBInfo
->P3d4
, pVBInfo
) ;
463 if (HwDeviceExtension
->bSkipDramSizing
== 1) {
464 pSR
= HwDeviceExtension
->pSR
;
467 while( pSR
->jIdx
!= 0xFF )
469 XGINew_SetReg1( pVBInfo
->P3c4
, pSR
->jIdx
, pSR
->jVal
) ;
473 /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */
474 } /* SkipDramSizing */
480 XGINew_SetDRAMSize_340( HwDeviceExtension
, pVBInfo
) ;
490 /* SetDefExt2Regs begin */
493 temp =(unsigned char)XGINew_GetReg1(pVBInfo->P3c4, 0x3A) ;
499 *pVBInfo->pSR21 &= 0xEF ;
501 XGINew_SetReg1( pVBInfo->P3c4 , 0x21 , *pVBInfo->pSR21 ) ;
503 *pVBInfo->pSR22 &= 0x20 ;
504 XGINew_SetReg1( pVBInfo->P3c4 , 0x22 , *pVBInfo->pSR22 ) ;
507 // base = 0x80000000 ;
508 // OutPortLong( 0xcf8 , base ) ;
509 // Temp = ( InPortLong( 0xcfc ) & 0xFFFF ) ;
510 // if ( Temp == 0x1039 )
512 XGINew_SetReg1(pVBInfo
->P3c4
, 0x22, (unsigned char)((*pVBInfo
->pSR22
) & 0xFE));
516 // XGINew_SetReg1( pVBInfo->P3c4 , 0x22 , *pVBInfo->pSR22 ) ;
519 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , *pVBInfo
->pSR21
) ;
524 XGINew_ChkSenseStatus ( HwDeviceExtension
, pVBInfo
) ;
525 XGINew_SetModeScratch ( HwDeviceExtension
, pVBInfo
) ;
530 XGINew_SetReg1( pVBInfo
->P3d4
, 0x8c , 0x87);
531 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x31);
541 /* ============== alan ====================== */
543 /* --------------------------------------------------------------------- */
544 /* Function : XGINew_GetXG20DRAMType */
548 /* --------------------------------------------------------------------- */
549 unsigned char XGINew_GetXG20DRAMType(struct xgi_hw_device_info
*HwDeviceExtension
,
550 struct vb_device_info
*pVBInfo
)
552 unsigned char data
, temp
;
554 if ( HwDeviceExtension
->jChipType
< XG20
)
556 if ( *pVBInfo
->pSoftSetting
& SoftDRAMType
)
558 data
= *pVBInfo
->pSoftSetting
& 0x07 ;
563 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x39 ) & 0x02 ;
566 data
= ( XGINew_GetReg1( pVBInfo
->P3c4
, 0x3A ) & 0x02 ) >> 1 ;
571 else if ( HwDeviceExtension
->jChipType
== XG27
)
573 if ( *pVBInfo
->pSoftSetting
& SoftDRAMType
)
575 data
= *pVBInfo
->pSoftSetting
& 0x07 ;
578 temp
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3B ) ;
580 if (( temp
& 0x88 )==0x80) /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
586 else if ( HwDeviceExtension
->jChipType
== XG21
)
588 XGINew_SetRegAND( pVBInfo
->P3d4
, 0xB4 , ~0x02 ) ; /* Independent GPIO control */
590 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x4A , 0x80 ) ; /* Enable GPIOH read */
591 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) ; /* GPIOF 0:DVI 1:DVO */
593 // for current XG20 & XG21, GPIOH is floating, driver will fix DDR temporarily
594 if ( temp
& 0x01 ) /* DVI read GPIOH */
599 XGINew_SetRegOR( pVBInfo
->P3d4
, 0xB4 , 0x02 ) ;
604 data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x97 ) & 0x01 ;
614 /* --------------------------------------------------------------------- */
615 /* Function : XGINew_Get310DRAMType */
619 /* --------------------------------------------------------------------- */
620 unsigned char XGINew_Get310DRAMType(struct vb_device_info
*pVBInfo
)
624 /* index = XGINew_GetReg1( pVBInfo->P3c4 , 0x1A ) ; */
627 if ( *pVBInfo
->pSoftSetting
& SoftDRAMType
)
628 data
= *pVBInfo
->pSoftSetting
& 0x03 ;
630 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3a ) & 0x03 ;
637 /* --------------------------------------------------------------------- */
638 /* Function : XGINew_Delay15us */
642 /* --------------------------------------------------------------------- */
644 void XGINew_Delay15us(unsigned long ulMicrsoSec)
650 /* --------------------------------------------------------------------- */
651 /* Function : XGINew_SDR_MRS */
655 /* --------------------------------------------------------------------- */
656 void XGINew_SDR_MRS(struct vb_device_info
*pVBInfo
)
658 unsigned short data
;
660 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x16 ) ;
661 data
&= 0x3F ; /* SR16 D7=0,D6=0 */
662 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ; /* enable mode register set(MRS) low */
663 /* XGINew_Delay15us( 0x100 ) ; */
664 data
|= 0x80 ; /* SR16 D7=1,D6=0 */
665 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ; /* enable mode register set(MRS) high */
666 /* XGINew_Delay15us( 0x100 ) ; */
670 /* --------------------------------------------------------------------- */
671 /* Function : XGINew_DDR1x_MRS_340 */
675 /* --------------------------------------------------------------------- */
676 void XGINew_DDR1x_MRS_340(unsigned long P3c4
, struct vb_device_info
*pVBInfo
)
678 XGINew_SetReg1( P3c4
, 0x18 , 0x01 ) ;
679 XGINew_SetReg1( P3c4
, 0x19 , 0x20 ) ;
680 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
681 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
683 if ( *pVBInfo
->pXGINew_DRAMTypeDefinition
!= 0x0C ) /* Samsung F Die */
685 DelayUS( 3000 ) ; /* Delay 67 x 3 Delay15us */
686 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ;
687 XGINew_SetReg1( P3c4
, 0x19 , 0x20 ) ;
688 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
689 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
693 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
694 XGINew_SetReg1( P3c4
, 0x19 , 0x01 ) ;
695 XGINew_SetReg1( P3c4
, 0x16 , pVBInfo
->SR16
[ 0 ] ) ;
696 XGINew_SetReg1( P3c4
, 0x16 , pVBInfo
->SR16
[ 1 ] ) ;
698 XGINew_SetReg1( P3c4
, 0x1B , 0x03 ) ;
700 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
701 XGINew_SetReg1( P3c4
, 0x19 , 0x00 ) ;
702 XGINew_SetReg1( P3c4
, 0x16 , pVBInfo
->SR16
[ 2 ] ) ;
703 XGINew_SetReg1( P3c4
, 0x16 , pVBInfo
->SR16
[ 3 ] ) ;
704 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ;
708 /* --------------------------------------------------------------------- */
709 /* Function : XGINew_DDR2x_MRS_340 */
713 /* --------------------------------------------------------------------- */
714 void XGINew_DDR2x_MRS_340(unsigned long P3c4
, struct vb_device_info
*pVBInfo
)
716 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ;
717 XGINew_SetReg1( P3c4
, 0x19 , 0x20 ) ;
718 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
719 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
721 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
722 /* XGINew_SetReg1( P3c4 , 0x18 , 0x31 ) ; */
723 XGINew_SetReg1( P3c4
, 0x19 , 0x01 ) ;
724 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
725 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
727 XGINew_SetReg1( P3c4
, 0x1B , 0x03 ) ;
729 /* XGINew_SetReg1( P3c4 , 0x18 , 0x31 ) ; */
730 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
731 XGINew_SetReg1( P3c4
, 0x19 , 0x00 ) ;
732 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
733 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
734 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ;
737 /* --------------------------------------------------------------------- */
738 /* Function : XGINew_DDRII_Bootup_XG27 */
742 /* --------------------------------------------------------------------- */
743 void XGINew_DDRII_Bootup_XG27(struct xgi_hw_device_info
*HwDeviceExtension
,
744 unsigned long P3c4
, struct vb_device_info
*pVBInfo
)
746 unsigned long P3d4
= P3c4
+ 0x10 ;
747 XGINew_RAMType
= ( int )XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
748 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
750 /* Set Double Frequency */
751 /* XGINew_SetReg1( P3d4 , 0x97 , 0x11 ) ; */ /* CR97 */
752 XGINew_SetReg1( P3d4
, 0x97 , *pVBInfo
->pXGINew_CR97
) ; /* CR97 */
756 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* Set SR18 */ //EMRS2
757 XGINew_SetReg1( P3c4
, 0x19 , 0x80 ) ; /* Set SR19 */
758 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
760 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
763 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* Set SR18 */ //EMRS3
764 XGINew_SetReg1( P3c4
, 0x19 , 0xC0 ) ; /* Set SR19 */
765 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
767 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
770 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* Set SR18 */ //EMRS1
771 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ; /* Set SR19 */
772 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
774 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
777 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* Set SR18 */ //MRS, DLL Enable
778 XGINew_SetReg1( P3c4
, 0x19 , 0x0A ) ; /* Set SR19 */
779 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ; /* Set SR16 */
781 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ; /* Set SR16 */
782 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ; /* Set SR16 */
783 /* DelayUS( 15 ) ; */
785 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* Set SR1B */
787 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ; /* Set SR1B */
789 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* Set SR18 */ //MRS, DLL Reset
790 XGINew_SetReg1( P3c4
, 0x19 , 0x08 ) ; /* Set SR19 */
791 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ; /* Set SR16 */
794 XGINew_SetReg1( P3c4
, 0x16 , 0x83 ) ; /* Set SR16 */
797 XGINew_SetReg1( P3c4
, 0x18 , 0x80 ) ; /* Set SR18 */ //MRS, ODT
798 XGINew_SetReg1( P3c4
, 0x19 , 0x46 ) ; /* Set SR19 */
799 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
801 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
804 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* Set SR18 */ //EMRS
805 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ; /* Set SR19 */
806 XGINew_SetReg1( P3c4
, 0x16 , 0x20 ) ; /* Set SR16 */
808 XGINew_SetReg1( P3c4
, 0x16 , 0xA0 ) ; /* Set SR16 */
811 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* Set SR1B refresh control 000:close; 010:open */
816 /* --------------------------------------------------------------------- */
817 /* Function : XGINew_DDR2_MRS_XG20 */
821 /* --------------------------------------------------------------------- */
822 void XGINew_DDR2_MRS_XG20(struct xgi_hw_device_info
*HwDeviceExtension
,
823 unsigned long P3c4
, struct vb_device_info
*pVBInfo
)
825 unsigned long P3d4
= P3c4
+ 0x10 ;
827 XGINew_RAMType
= ( int )XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
828 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
830 XGINew_SetReg1( P3d4
, 0x97 , 0x11 ) ; /* CR97 */
833 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS2 */
834 XGINew_SetReg1( P3c4
, 0x19 , 0x80 ) ;
835 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
836 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
838 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS3 */
839 XGINew_SetReg1( P3c4
, 0x19 , 0xC0 ) ;
840 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
841 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
843 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS1 */
844 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ;
845 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
846 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
848 // XGINew_SetReg1( P3c4 , 0x18 , 0x52 ) ; /* MRS1 */
849 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* MRS1 */
850 XGINew_SetReg1( P3c4
, 0x19 , 0x02 ) ;
851 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
852 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
855 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* SR1B */
857 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ; /* SR1B */
860 //XGINew_SetReg1( P3c4 , 0x18 , 0x52 ) ; /* MRS2 */
861 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* MRS1 */
862 XGINew_SetReg1( P3c4
, 0x19 , 0x00 ) ;
863 XGINew_SetReg1( P3c4
, 0x16 , 0x05 ) ;
864 XGINew_SetReg1( P3c4
, 0x16 , 0x85 ) ;
869 /* --------------------------------------------------------------------- */
870 /* Function : XGINew_DDR2_MRS_XG20 */
874 /* --------------------------------------------------------------------- */
875 void XGINew_DDR2_MRS_XG27(struct xgi_hw_device_info
*HwDeviceExtension
,
876 unsigned long P3c4
, struct vb_device_info
*pVBInfo
)
878 unsigned long P3d4
= P3c4
+ 0x10 ;
880 XGINew_RAMType
= ( int )XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
881 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
883 XGINew_SetReg1( P3d4
, 0x97 , 0x11 ) ; /* CR97 */
885 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS2 */
886 XGINew_SetReg1( P3c4
, 0x19 , 0x80 ) ;
888 XGINew_SetReg1( P3c4
, 0x16 , 0x10 ) ;
889 DelayUS( 15 ) ; ////06/11/23 XG27 A0 for CKE enable
890 XGINew_SetReg1( P3c4
, 0x16 , 0x90 ) ;
892 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS3 */
893 XGINew_SetReg1( P3c4
, 0x19 , 0xC0 ) ;
895 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
896 DelayUS( 15 ) ; ////06/11/22 XG27 A0
897 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
900 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ; /* EMRS1 */
901 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ;
903 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
904 DelayUS( 15 ) ; ////06/11/22 XG27 A0
905 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
907 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* MRS1 */
908 XGINew_SetReg1( P3c4
, 0x19 , 0x06 ) ; ////[Billy]06/11/22 DLL Reset for XG27 Hynix DRAM
910 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
911 DelayUS( 15 ) ; ////06/11/23 XG27 A0
912 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
914 DelayUS( 30 ) ; ////06/11/23 XG27 A0 Start Auto-PreCharge
915 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* SR1B */
917 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ; /* SR1B */
920 XGINew_SetReg1( P3c4
, 0x18 , 0x42 ) ; /* MRS1 */
921 XGINew_SetReg1( P3c4
, 0x19 , 0x04 ) ; //// DLL without Reset for XG27 Hynix DRAM
923 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
925 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
927 XGINew_SetReg1( P3c4
, 0x18 , 0x80 ); ////XG27 OCD ON
928 XGINew_SetReg1( P3c4
, 0x19 , 0x46 );
930 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
932 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
934 XGINew_SetReg1( P3c4
, 0x18 , 0x00 );
935 XGINew_SetReg1( P3c4
, 0x19 , 0x40 );
937 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
939 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
941 DelayUS( 15 ) ; ////Start Auto-PreCharge
942 XGINew_SetReg1( P3c4
, 0x1B , 0x04 ) ; /* SR1B */
944 XGINew_SetReg1( P3c4
, 0x1B , 0x03 ) ; /* SR1B */
948 /* --------------------------------------------------------------------- */
949 /* Function : XGINew_DDR1x_DefaultRegister */
953 /* --------------------------------------------------------------------- */
954 void XGINew_DDR1x_DefaultRegister(struct xgi_hw_device_info
*HwDeviceExtension
,
955 unsigned long Port
, struct vb_device_info
*pVBInfo
)
957 unsigned long P3d4
= Port
,
960 if ( HwDeviceExtension
->jChipType
>= XG20
)
962 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
963 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
964 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
965 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ; /* CR86 */
967 XGINew_SetReg1( P3d4
, 0x98 , 0x01 ) ;
968 XGINew_SetReg1( P3d4
, 0x9A , 0x02 ) ;
970 XGINew_DDR1x_MRS_XG20( P3c4
, pVBInfo
) ;
974 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
976 switch( HwDeviceExtension
->jChipType
)
980 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
981 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
982 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ; /* CR86 */
985 XGINew_SetReg1( P3d4
, 0x82 , 0x88 ) ;
986 XGINew_SetReg1( P3d4
, 0x86 , 0x00 ) ;
987 XGINew_GetReg1( P3d4
, 0x86 ) ; /* Insert read command for delay */
988 XGINew_SetReg1( P3d4
, 0x86 , 0x88 ) ;
989 XGINew_GetReg1( P3d4
, 0x86 ) ;
990 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ;
991 XGINew_SetReg1( P3d4
, 0x82 , 0x77 ) ;
992 XGINew_SetReg1( P3d4
, 0x85 , 0x00 ) ;
993 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
994 XGINew_SetReg1( P3d4
, 0x85 , 0x88 ) ;
995 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
996 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
997 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1001 XGINew_SetReg1( P3d4
, 0x97 , 0x00 ) ;
1002 XGINew_SetReg1( P3d4
, 0x98 , 0x01 ) ;
1003 XGINew_SetReg1( P3d4
, 0x9A , 0x02 ) ;
1004 XGINew_DDR1x_MRS_340( P3c4
, pVBInfo
) ;
1009 /* --------------------------------------------------------------------- */
1010 /* Function : XGINew_DDR2x_DefaultRegister */
1014 /* --------------------------------------------------------------------- */
1015 void XGINew_DDR2x_DefaultRegister(struct xgi_hw_device_info
*HwDeviceExtension
,
1016 unsigned long Port
, struct vb_device_info
*pVBInfo
)
1018 unsigned long P3d4
= Port
,
1019 P3c4
= Port
- 0x10 ;
1021 XGINew_SetMemoryClock( HwDeviceExtension
, pVBInfo
) ;
1023 /* 20040906 Hsuan modify CR82, CR85, CR86 for XG42 */
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 /* keep following setting sequence, each setting in the same reg insert idle */
1034 XGINew_SetReg1( P3d4
, 0x82 , 0x88 ) ;
1035 XGINew_SetReg1( P3d4
, 0x86 , 0x00 ) ;
1036 XGINew_GetReg1( P3d4
, 0x86 ) ; /* Insert read command for delay */
1037 XGINew_SetReg1( P3d4
, 0x86 , 0x88 ) ;
1038 XGINew_SetReg1( P3d4
, 0x82 , 0x77 ) ;
1039 XGINew_SetReg1( P3d4
, 0x85 , 0x00 ) ;
1040 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1041 XGINew_SetReg1( P3d4
, 0x85 , 0x88 ) ;
1042 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1043 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
1044 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1046 XGINew_SetReg1( P3d4
, 0x97 , 0x11 ) ;
1047 if ( HwDeviceExtension
->jChipType
== XG42
)
1049 XGINew_SetReg1( P3d4
, 0x98 , 0x01 ) ;
1053 XGINew_SetReg1( P3d4
, 0x98 , 0x03 ) ;
1055 XGINew_SetReg1( P3d4
, 0x9A , 0x02 ) ;
1057 XGINew_DDR2x_MRS_340( P3c4
, pVBInfo
) ;
1061 /* --------------------------------------------------------------------- */
1062 /* Function : XGINew_DDR2_DefaultRegister */
1066 /* --------------------------------------------------------------------- */
1067 void XGINew_DDR2_DefaultRegister(struct xgi_hw_device_info
*HwDeviceExtension
,
1068 unsigned long Port
, struct vb_device_info
*pVBInfo
)
1070 unsigned long P3d4
= Port
,
1071 P3c4
= Port
- 0x10 ;
1073 /* keep following setting sequence, each setting in the same reg insert idle */
1074 XGINew_SetReg1( P3d4
, 0x82 , 0x77 ) ;
1075 XGINew_SetReg1( P3d4
, 0x86 , 0x00 ) ;
1076 XGINew_GetReg1( P3d4
, 0x86 ) ; /* Insert read command for delay */
1077 XGINew_SetReg1( P3d4
, 0x86 , 0x88 ) ;
1078 XGINew_GetReg1( P3d4
, 0x86 ) ; /* Insert read command for delay */
1079 XGINew_SetReg1( P3d4
, 0x86 , pVBInfo
->CR40
[ 13 ][ XGINew_RAMType
] ) ; /* CR86 */
1080 XGINew_SetReg1( P3d4
, 0x82 , 0x77 ) ;
1081 XGINew_SetReg1( P3d4
, 0x85 , 0x00 ) ;
1082 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1083 XGINew_SetReg1( P3d4
, 0x85 , 0x88 ) ;
1084 XGINew_GetReg1( P3d4
, 0x85 ) ; /* Insert read command for delay */
1085 XGINew_SetReg1( P3d4
, 0x85 , pVBInfo
->CR40
[ 12 ][ XGINew_RAMType
] ) ; /* CR85 */
1086 if ( HwDeviceExtension
->jChipType
== XG27
)
1087 XGINew_SetReg1( P3d4
, 0x82 , pVBInfo
->CR40
[ 11 ][ XGINew_RAMType
] ) ; /* CR82 */
1089 XGINew_SetReg1( P3d4
, 0x82 , 0xA8 ) ; /* CR82 */
1091 XGINew_SetReg1( P3d4
, 0x98 , 0x01 ) ;
1092 XGINew_SetReg1( P3d4
, 0x9A , 0x02 ) ;
1093 if ( HwDeviceExtension
->jChipType
== XG27
)
1094 XGINew_DDRII_Bootup_XG27( HwDeviceExtension
, P3c4
, pVBInfo
) ;
1096 XGINew_DDR2_MRS_XG20( HwDeviceExtension
, P3c4
, pVBInfo
) ;
1100 /* --------------------------------------------------------------------- */
1101 /* Function : XGINew_SetDRAMDefaultRegister340 */
1105 /* --------------------------------------------------------------------- */
1106 void XGINew_SetDRAMDefaultRegister340(struct xgi_hw_device_info
*HwDeviceExtension
,
1107 unsigned long Port
, struct vb_device_info
*pVBInfo
)
1109 unsigned char temp
, temp1
, temp2
, temp3
,
1112 unsigned long P3d4
= Port
,
1113 P3c4
= Port
- 0x10 ;
1115 XGINew_SetReg1( P3d4
, 0x6D , pVBInfo
->CR40
[ 8 ][ XGINew_RAMType
] ) ;
1116 XGINew_SetReg1( P3d4
, 0x68 , pVBInfo
->CR40
[ 5 ][ XGINew_RAMType
] ) ;
1117 XGINew_SetReg1( P3d4
, 0x69 , pVBInfo
->CR40
[ 6 ][ XGINew_RAMType
] ) ;
1118 XGINew_SetReg1( P3d4
, 0x6A , pVBInfo
->CR40
[ 7 ][ XGINew_RAMType
] ) ;
1121 for( i
= 0 ; i
< 4 ; i
++ )
1123 temp
= pVBInfo
->CR6B
[ XGINew_RAMType
][ i
] ; /* CR6B DQS fine tune delay */
1124 for( j
= 0 ; j
< 4 ; j
++ )
1126 temp1
= ( ( temp
>> ( 2 * j
) ) & 0x03 ) << 2 ;
1128 XGINew_SetReg1( P3d4
, 0x6B , temp2
) ;
1129 XGINew_GetReg1( P3d4
, 0x6B ) ; /* Insert read command for delay */
1136 for( i
= 0 ; i
< 4 ; i
++ )
1138 temp
= pVBInfo
->CR6E
[ XGINew_RAMType
][ i
] ; /* CR6E DQM fine tune delay */
1139 for( j
= 0 ; j
< 4 ; j
++ )
1141 temp1
= ( ( temp
>> ( 2 * j
) ) & 0x03 ) << 2 ;
1143 XGINew_SetReg1( P3d4
, 0x6E , temp2
) ;
1144 XGINew_GetReg1( P3d4
, 0x6E ) ; /* Insert read command for delay */
1151 for( k
= 0 ; k
< 4 ; k
++ )
1153 XGINew_SetRegANDOR( P3d4
, 0x6E , 0xFC , temp3
) ; /* CR6E_D[1:0] select channel */
1155 for( i
= 0 ; i
< 8 ; i
++ )
1157 temp
= pVBInfo
->CR6F
[ XGINew_RAMType
][ 8 * k
+ i
] ; /* CR6F DQ fine tune delay */
1158 for( j
= 0 ; j
< 4 ; j
++ )
1160 temp1
= ( temp
>> ( 2 * j
) ) & 0x03 ;
1162 XGINew_SetReg1( P3d4
, 0x6F , temp2
) ;
1163 XGINew_GetReg1( P3d4
, 0x6F ) ; /* Insert read command for delay */
1171 XGINew_SetReg1( P3d4
, 0x80 , pVBInfo
->CR40
[ 9 ][ XGINew_RAMType
] ) ; /* CR80 */
1172 XGINew_SetReg1( P3d4
, 0x81 , pVBInfo
->CR40
[ 10 ][ XGINew_RAMType
] ) ; /* CR81 */
1175 temp
= pVBInfo
->CR89
[ XGINew_RAMType
][ 0 ] ; /* CR89 terminator type select */
1176 for( j
= 0 ; j
< 4 ; j
++ )
1178 temp1
= ( temp
>> ( 2 * j
) ) & 0x03 ;
1180 XGINew_SetReg1( P3d4
, 0x89 , temp2
) ;
1181 XGINew_GetReg1( P3d4
, 0x89 ) ; /* Insert read command for delay */
1186 temp
= pVBInfo
->CR89
[ XGINew_RAMType
][ 1 ] ;
1187 temp1
= temp
& 0x03 ;
1189 XGINew_SetReg1( P3d4
, 0x89 , temp2
) ;
1191 temp
= pVBInfo
->CR40
[ 3 ][ XGINew_RAMType
] ;
1192 temp1
= temp
& 0x0F ;
1193 temp2
= ( temp
>> 4 ) & 0x07 ;
1194 temp3
= temp
& 0x80 ;
1195 XGINew_SetReg1( P3d4
, 0x45 , temp1
) ; /* CR45 */
1196 XGINew_SetReg1( P3d4
, 0x99 , temp2
) ; /* CR99 */
1197 XGINew_SetRegOR( P3d4
, 0x40 , temp3
) ; /* CR40_D[7] */
1198 XGINew_SetReg1( P3d4
, 0x41 , pVBInfo
->CR40
[ 0 ][ XGINew_RAMType
] ) ; /* CR41 */
1200 if ( HwDeviceExtension
->jChipType
== XG27
)
1201 XGINew_SetReg1( P3d4
, 0x8F , *pVBInfo
->pCR8F
) ; /* CR8F */
1203 for( j
= 0 ; j
<= 6 ; j
++ )
1204 XGINew_SetReg1( P3d4
, ( 0x90 + j
) , pVBInfo
->CR40
[ 14 + j
][ XGINew_RAMType
] ) ; /* CR90 - CR96 */
1206 for( j
= 0 ; j
<= 2 ; j
++ )
1207 XGINew_SetReg1( P3d4
, ( 0xC3 + j
) , pVBInfo
->CR40
[ 21 + j
][ XGINew_RAMType
] ) ; /* CRC3 - CRC5 */
1209 for( j
= 0 ; j
< 2 ; j
++ )
1210 XGINew_SetReg1( P3d4
, ( 0x8A + j
) , pVBInfo
->CR40
[ 1 + j
][ XGINew_RAMType
] ) ; /* CR8A - CR8B */
1212 if ( ( HwDeviceExtension
->jChipType
== XG41
) || ( HwDeviceExtension
->jChipType
== XG42
) )
1213 XGINew_SetReg1( P3d4
, 0x8C , 0x87 ) ;
1215 XGINew_SetReg1( P3d4
, 0x59 , pVBInfo
->CR40
[ 4 ][ XGINew_RAMType
] ) ; /* CR59 */
1217 XGINew_SetReg1( P3d4
, 0x83 , 0x09 ) ; /* CR83 */
1218 XGINew_SetReg1( P3d4
, 0x87 , 0x00 ) ; /* CR87 */
1219 XGINew_SetReg1( P3d4
, 0xCF , *pVBInfo
->pCRCF
) ; /* CRCF */
1220 if ( XGINew_RAMType
)
1222 //XGINew_SetReg1( P3c4 , 0x17 , 0xC0 ) ; /* SR17 DDRII */
1223 XGINew_SetReg1( P3c4
, 0x17 , 0x80 ) ; /* SR17 DDRII */
1224 if ( HwDeviceExtension
->jChipType
== XG27
)
1225 XGINew_SetReg1( P3c4
, 0x17 , 0x02 ) ; /* SR17 DDRII */
1229 XGINew_SetReg1( P3c4
, 0x17 , 0x00 ) ; /* SR17 DDR */
1230 XGINew_SetReg1( P3c4
, 0x1A , 0x87 ) ; /* SR1A */
1232 temp
= XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) ;
1234 XGINew_DDR1x_DefaultRegister( HwDeviceExtension
, P3d4
, pVBInfo
) ;
1237 XGINew_SetReg1( P3d4
, 0xB0 , 0x80 ) ; /* DDRII Dual frequency mode */
1238 XGINew_DDR2_DefaultRegister( HwDeviceExtension
, P3d4
, pVBInfo
) ;
1240 XGINew_SetReg1( P3c4
, 0x1B , pVBInfo
->SR15
[ 3 ][ XGINew_RAMType
] ) ; /* SR1B */
1244 /* --------------------------------------------------------------------- */
1245 /* Function : XGINew_DDR_MRS */
1249 /* --------------------------------------------------------------------- */
1250 void XGINew_DDR_MRS(struct vb_device_info
*pVBInfo
)
1252 unsigned short data
;
1254 volatile unsigned char *pVideoMemory
= (unsigned char *)pVBInfo
->ROMAddr
;
1256 /* SR16 <- 1F,DF,2F,AF */
1257 /* yriver modified SR16 <- 0F,DF,0F,AF */
1258 /* enable DLL of DDR SD/SGRAM , SR16 D4=1 */
1259 data
= pVideoMemory
[ 0xFB ] ;
1260 /* data = XGINew_GetReg1( pVBInfo->P3c4 , 0x16 ) ; */
1263 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1265 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1267 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1269 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1271 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1273 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1275 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1277 XGINew_SetReg1( pVBInfo
->P3c4
, 0x16 , data
) ;
1282 XGINew_SetReg1(pVBInfo->P3c4,0x16,data);
1284 if (!(pVBInfo->SR15[1][XGINew_RAMType] & 0x10))
1290 XGINew_SetReg1(pVBInfo->P3c4,0x16,data);
1295 XGINew_SetReg1(pVBInfo->P3c4,0x16,data);
1296 if (!(pVBInfo->SR15[1][XGINew_RAMType] & 0x10))
1302 XGINew_SetReg1(pVBInfo->P3c4,0x16,data);
1308 /* check if read cache pointer is correct */
1312 /* --------------------------------------------------------------------- */
1313 /* Function : XGINew_VerifyMclk */
1317 /* --------------------------------------------------------------------- */
1318 void XGINew_VerifyMclk(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
1320 unsigned char *pVideoMemory
= pVBInfo
->FBAddr
;
1321 unsigned char i
, j
;
1322 unsigned short Temp
, SR21
;
1324 pVideoMemory
[ 0 ] = 0xaa ; /* alan */
1325 pVideoMemory
[ 16 ] = 0x55 ; /* note: PCI read cache is off */
1327 if ( ( pVideoMemory
[ 0 ] != 0xaa ) || ( pVideoMemory
[ 16 ] != 0x55 ) )
1329 for( i
= 0 , j
= 16 ; i
< 2 ; i
++ , j
+= 16 )
1331 SR21
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x21 ) ;
1332 Temp
= SR21
& 0xFB ; /* disable PCI post write buffer empty gating */
1333 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , Temp
) ;
1335 Temp
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3C ) ;
1336 Temp
|= 0x01 ; /* MCLK reset */
1339 Temp
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x3C ) ;
1340 Temp
&= 0xFE ; /* MCLK normal operation */
1342 XGINew_SetReg1( pVBInfo
->P3c4
, 0x21 , SR21
) ;
1344 pVideoMemory
[ 16 + j
] = j
;
1345 if ( pVideoMemory
[ 16 + j
] == j
)
1347 pVideoMemory
[ j
] = j
;
1358 /* --------------------------------------------------------------------- */
1359 /* Function : XGINew_SetDRAMSize_340 */
1363 /* --------------------------------------------------------------------- */
1364 void XGINew_SetDRAMSize_340(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
1366 unsigned short data
;
1368 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
1369 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
1371 XGISetModeNew( HwDeviceExtension
, 0x2e ) ;
1374 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x21 ) ;
1375 XGINew_SetReg1(pVBInfo
->P3c4
, 0x21, (unsigned short)(data
& 0xDF)); /* disable read cache */
1376 XGI_DisplayOff( HwDeviceExtension
, pVBInfo
);
1378 /*data = XGINew_GetReg1( pVBInfo->P3c4 , 0x1 ) ;*/
1380 /*XGINew_SetReg1( pVBInfo->P3c4 , 0x01 , data ) ;*/ /* Turn OFF Display */
1381 XGINew_DDRSizing340( HwDeviceExtension
, pVBInfo
) ;
1382 data
=XGINew_GetReg1( pVBInfo
->P3c4
, 0x21 ) ;
1383 XGINew_SetReg1(pVBInfo
->P3c4
, 0x21, (unsigned short)(data
| 0x20)); /* enable read cache */
1387 /* --------------------------------------------------------------------- */
1392 /* --------------------------------------------------------------------- */
1393 void XGINew_SetDRAMSize_310(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
1395 unsigned short data
;
1396 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
,
1397 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
1399 /* XGINew_SetReg1( pVBInfo->P3d4 , 0x30 , 0x40 ) ; */
1402 #ifdef XGI302 /* alan,should change value */
1403 XGINew_SetReg1( pVBInfo
->P3d4
, 0x30 , 0x4D ) ;
1404 XGINew_SetReg1( pVBInfo
->P3d4
, 0x31 , 0xc0 ) ;
1405 XGINew_SetReg1( pVBInfo
->P3d4
, 0x34 , 0x3F ) ;
1408 XGISetModeNew( HwDeviceExtension
, 0x2e ) ;
1410 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x21 ) ;
1411 XGINew_SetReg1(pVBInfo
->P3c4
, 0x21, (unsigned short)(data
& 0xDF)); /* disable read cache */
1413 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x1 ) ;
1415 XGINew_SetReg1( pVBInfo
->P3c4
, 0x01 , data
) ; /* Turn OFF Display */
1417 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x16 ) ;
1420 XGINew_SetReg1(pVBInfo
->P3c4
, 0x16, (unsigned short)(data
| 0x0F)); /* assume lowest speed DRAM */
1422 XGINew_SetDRAMModeRegister( pVBInfo
) ;
1423 XGINew_DisableRefresh( HwDeviceExtension
, pVBInfo
) ;
1424 XGINew_CheckBusWidth_310( pVBInfo
) ;
1425 XGINew_VerifyMclk( HwDeviceExtension
, pVBInfo
) ; /* alan 2000/7/3 */
1429 if ( XGINew_Get310DRAMType( pVBInfo
) < 2 )
1431 XGINew_SDRSizing( pVBInfo
) ;
1435 XGINew_DDRSizing( pVBInfo
) ;
1441 XGINew_SetReg1(pVBInfo
->P3c4
, 0x16, pVBInfo
->SR15
[1][XGINew_RAMType
]); /* restore SR16 */
1443 XGINew_EnableRefresh( HwDeviceExtension
, pVBInfo
) ;
1444 data
=XGINew_GetReg1( pVBInfo
->P3c4
,0x21 ) ;
1445 XGINew_SetReg1(pVBInfo
->P3c4
, 0x21, (unsigned short)(data
| 0x20)); /* enable read cache */
1450 /* --------------------------------------------------------------------- */
1451 /* Function : XGINew_SetDRAMModeRegister340 */
1455 /* --------------------------------------------------------------------- */
1457 void XGINew_SetDRAMModeRegister340(struct xgi_hw_device_info
*HwDeviceExtension
)
1459 unsigned char data
;
1460 struct vb_device_info VBINF
;
1461 struct vb_device_info
*pVBInfo
= &VBINF
;
1462 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
1463 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
1464 pVBInfo
->BaseAddr
= (unsigned long)HwDeviceExtension
->pjIOAddress
;
1465 pVBInfo
->ISXPDOS
= 0 ;
1467 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
1468 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
1469 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
1470 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
1471 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
1472 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
1473 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
1474 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
1475 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
1476 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
1477 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
1478 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
1479 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
1480 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
1481 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
1482 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
1483 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
1484 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
1485 XGI_GetVBType( pVBInfo
) ; /* Run XGI_GetVBType before InitTo330Pointer */
1487 InitTo330Pointer(HwDeviceExtension
->jChipType
,pVBInfo
);
1489 ReadVBIOSTablData( HwDeviceExtension
->jChipType
, pVBInfo
) ;
1491 if ( XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) == 0 )
1493 data
= ( XGINew_GetReg1( pVBInfo
->P3c4
, 0x39 ) & 0x02 ) >> 1 ;
1495 XGINew_DDR2x_MRS_340( pVBInfo
->P3c4
, pVBInfo
) ;
1497 XGINew_DDR1x_MRS_340( pVBInfo
->P3c4
, pVBInfo
) ;
1500 XGINew_DDR2_MRS_XG20( HwDeviceExtension
, pVBInfo
->P3c4
, pVBInfo
);
1502 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , 0x03 ) ;
1505 /* --------------------------------------------------------------------- */
1506 /* Function : XGINew_SetDRAMModeRegister */
1510 /* --------------------------------------------------------------------- */
1511 void XGINew_SetDRAMModeRegister(struct vb_device_info
*pVBInfo
)
1513 if ( XGINew_Get310DRAMType( pVBInfo
) < 2 )
1515 XGINew_SDR_MRS(pVBInfo
) ;
1519 /* SR16 <- 0F,CF,0F,8F */
1520 XGINew_DDR_MRS( pVBInfo
) ;
1525 /* --------------------------------------------------------------------- */
1526 /* Function : XGINew_DisableRefresh */
1530 /* --------------------------------------------------------------------- */
1531 void XGINew_DisableRefresh(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
1533 unsigned short data
;
1536 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x1B ) ;
1538 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , data
) ;
1543 /* --------------------------------------------------------------------- */
1544 /* Function : XGINew_EnableRefresh */
1548 /* --------------------------------------------------------------------- */
1549 void XGINew_EnableRefresh(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
1552 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , pVBInfo
->SR15
[ 3 ][ XGINew_RAMType
] ) ; /* SR1B */
1558 /* --------------------------------------------------------------------- */
1559 /* Function : XGINew_DisableChannelInterleaving */
1563 /* --------------------------------------------------------------------- */
1564 void XGINew_DisableChannelInterleaving(int index
,
1565 unsigned short XGINew_DDRDRAM_TYPE
[][5],
1566 struct vb_device_info
*pVBInfo
)
1568 unsigned short data
;
1570 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x15 ) ;
1573 switch( XGINew_DDRDRAM_TYPE
[ index
][ 3 ] )
1590 XGINew_SetReg1( pVBInfo
->P3c4
, 0x15 , data
) ;
1594 /* --------------------------------------------------------------------- */
1595 /* Function : XGINew_SetDRAMSizingType */
1599 /* --------------------------------------------------------------------- */
1600 void XGINew_SetDRAMSizingType(int index
,
1601 unsigned short DRAMTYPE_TABLE
[][5],
1602 struct vb_device_info
*pVBInfo
)
1604 unsigned short data
;
1606 data
= DRAMTYPE_TABLE
[ index
][ 4 ] ;
1607 XGINew_SetRegANDOR( pVBInfo
->P3c4
, 0x13 , 0x80 , data
) ;
1609 /* should delay 50 ns */
1613 /* --------------------------------------------------------------------- */
1614 /* Function : XGINew_CheckBusWidth_310 */
1618 /* --------------------------------------------------------------------- */
1619 void XGINew_CheckBusWidth_310(struct vb_device_info
*pVBInfo
)
1621 unsigned short data
;
1622 volatile unsigned long *pVideoMemory
;
1624 pVideoMemory
= (unsigned long *) pVBInfo
->FBAddr
;
1626 if ( XGINew_Get310DRAMType( pVBInfo
) < 2 )
1628 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x00 ) ;
1629 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x12 ) ;
1631 XGINew_SDR_MRS( pVBInfo
) ;
1633 XGINew_ChannelAB
= 0 ;
1634 XGINew_DataBusWidth
= 128 ;
1635 pVideoMemory
[ 0 ] = 0x01234567L
;
1636 pVideoMemory
[ 1 ] = 0x456789ABL
;
1637 pVideoMemory
[ 2 ] = 0x89ABCDEFL
;
1638 pVideoMemory
[ 3 ] = 0xCDEF0123L
;
1639 pVideoMemory
[ 4 ] = 0x55555555L
;
1640 pVideoMemory
[ 5 ] = 0x55555555L
;
1641 pVideoMemory
[ 6 ] = 0xFFFFFFFFL
;
1642 pVideoMemory
[ 7 ] = 0xFFFFFFFFL
;
1644 if ( ( pVideoMemory
[ 3 ] != 0xCDEF0123L
) || ( pVideoMemory
[ 2 ] != 0x89ABCDEFL
) )
1647 XGINew_DataBusWidth
= 64 ;
1648 XGINew_ChannelAB
= 0 ;
1649 data
=XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) ;
1650 XGINew_SetReg1(pVBInfo
->P3c4
, 0x14, (unsigned short)(data
& 0xFD));
1653 if ( ( pVideoMemory
[ 1 ] != 0x456789ABL
) || ( pVideoMemory
[ 0 ] != 0x01234567L
) )
1656 XGINew_DataBusWidth
= 64 ;
1657 XGINew_ChannelAB
= 1 ;
1658 data
=XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) ;
1659 XGINew_SetReg1(pVBInfo
->P3c4
, 0x14,
1660 (unsigned short)((data
& 0xFD) | 0x01));
1667 /* DDR Dual channel */
1668 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x00 ) ;
1669 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x02 ) ; /* Channel A, 64bit */
1671 XGINew_DDR_MRS( pVBInfo
) ;
1673 XGINew_ChannelAB
= 0 ;
1674 XGINew_DataBusWidth
= 64 ;
1675 pVideoMemory
[ 0 ] = 0x01234567L
;
1676 pVideoMemory
[ 1 ] = 0x456789ABL
;
1677 pVideoMemory
[ 2 ] = 0x89ABCDEFL
;
1678 pVideoMemory
[ 3 ] = 0xCDEF0123L
;
1679 pVideoMemory
[ 4 ] = 0x55555555L
;
1680 pVideoMemory
[ 5 ] = 0x55555555L
;
1681 pVideoMemory
[ 6 ] = 0xAAAAAAAAL
;
1682 pVideoMemory
[ 7 ] = 0xAAAAAAAAL
;
1684 if ( pVideoMemory
[ 1 ] == 0x456789ABL
)
1686 if ( pVideoMemory
[ 0 ] == 0x01234567L
)
1688 /* Channel A 64bit */
1694 if ( pVideoMemory
[ 0 ] == 0x01234567L
)
1696 /* Channel A 32bit */
1697 XGINew_DataBusWidth
= 32 ;
1698 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x00 ) ;
1703 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x03 ) ; /* Channel B, 64bit */
1704 XGINew_DDR_MRS( pVBInfo
);
1706 XGINew_ChannelAB
= 1 ;
1707 XGINew_DataBusWidth
= 64 ;
1708 pVideoMemory
[ 0 ] = 0x01234567L
;
1709 pVideoMemory
[ 1 ] = 0x456789ABL
;
1710 pVideoMemory
[ 2 ] = 0x89ABCDEFL
;
1711 pVideoMemory
[ 3 ] = 0xCDEF0123L
;
1712 pVideoMemory
[ 4 ] = 0x55555555L
;
1713 pVideoMemory
[ 5 ] = 0x55555555L
;
1714 pVideoMemory
[ 6 ] = 0xAAAAAAAAL
;
1715 pVideoMemory
[ 7 ] = 0xAAAAAAAAL
;
1717 if ( pVideoMemory
[ 1 ] == 0x456789ABL
)
1720 if ( pVideoMemory
[ 0 ] == 0x01234567L
)
1722 /* Channel B 64bit */
1732 if ( pVideoMemory
[ 0 ] == 0x01234567L
)
1735 XGINew_DataBusWidth
= 32 ;
1736 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x01 ) ;
1747 /* --------------------------------------------------------------------- */
1748 /* Function : XGINew_SetRank */
1752 /* --------------------------------------------------------------------- */
1753 int XGINew_SetRank(int index
,
1754 unsigned char RankNo
,
1755 unsigned char XGINew_ChannelAB
,
1756 unsigned short DRAMTYPE_TABLE
[][5],
1757 struct vb_device_info
*pVBInfo
)
1759 unsigned short data
;
1762 if ( ( RankNo
== 2 ) && ( DRAMTYPE_TABLE
[ index
][ 0 ] == 2 ) )
1765 RankSize
= DRAMTYPE_TABLE
[ index
][ 3 ] / 2 * XGINew_DataBusWidth
/ 32 ;
1767 if ( ( RankNo
* RankSize
) <= 128 )
1771 while( ( RankSize
>>= 1 ) > 0 )
1775 data
|= ( RankNo
- 1 ) << 2 ;
1776 data
|= ( XGINew_DataBusWidth
/ 64 ) & 2 ;
1777 data
|= XGINew_ChannelAB
;
1778 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , data
) ;
1780 XGINew_SDR_MRS( pVBInfo
) ;
1788 /* --------------------------------------------------------------------- */
1789 /* Function : XGINew_SetDDRChannel */
1793 /* --------------------------------------------------------------------- */
1794 int XGINew_SetDDRChannel(int index
,
1795 unsigned char ChannelNo
,
1796 unsigned char XGINew_ChannelAB
,
1797 unsigned short DRAMTYPE_TABLE
[][5],
1798 struct vb_device_info
*pVBInfo
)
1800 unsigned short data
;
1803 RankSize
= DRAMTYPE_TABLE
[index
][3]/2 * XGINew_DataBusWidth
/32;
1804 /* RankSize = DRAMTYPE_TABLE[ index ][ 3 ] ; */
1805 if ( ChannelNo
* RankSize
<= 128 )
1808 while( ( RankSize
>>= 1 ) > 0 )
1813 if ( ChannelNo
== 2 )
1816 data
|= ( XGINew_DataBusWidth
/ 32 ) & 2 ;
1817 data
|= XGINew_ChannelAB
;
1818 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , data
) ;
1820 XGINew_DDR_MRS( pVBInfo
) ;
1828 /* --------------------------------------------------------------------- */
1829 /* Function : XGINew_CheckColumn */
1833 /* --------------------------------------------------------------------- */
1834 int XGINew_CheckColumn(int index
,
1835 unsigned short DRAMTYPE_TABLE
[][5],
1836 struct vb_device_info
*pVBInfo
)
1839 unsigned long Increment
, Position
;
1841 /* Increment = 1 << ( DRAMTYPE_TABLE[ index ][ 2 ] + XGINew_DataBusWidth / 64 + 1 ) ; */
1842 Increment
= 1 << ( 10 + XGINew_DataBusWidth
/ 64 ) ;
1844 for( i
= 0 , Position
= 0 ; i
< 2 ; i
++ )
1846 *((unsigned long *)(pVBInfo
->FBAddr
+ Position
)) = Position
;
1847 Position
+= Increment
;
1851 for( i
= 0 , Position
= 0 ; i
< 2 ; i
++ )
1853 /* if ( pVBInfo->FBAddr[ Position ] != Position ) */
1854 if ((*(unsigned long *)(pVBInfo
->FBAddr
+ Position
)) != Position
)
1856 Position
+= Increment
;
1862 /* --------------------------------------------------------------------- */
1863 /* Function : XGINew_CheckBanks */
1867 /* --------------------------------------------------------------------- */
1868 int XGINew_CheckBanks(int index
,
1869 unsigned short DRAMTYPE_TABLE
[][5],
1870 struct vb_device_info
*pVBInfo
)
1873 unsigned long Increment
, Position
;
1875 Increment
= 1 << ( DRAMTYPE_TABLE
[ index
][ 2 ] + XGINew_DataBusWidth
/ 64 + 2 ) ;
1877 for( i
= 0 , Position
= 0 ; i
< 4 ; i
++ )
1879 /* pVBInfo->FBAddr[ Position ] = Position ; */
1880 *((unsigned long *)(pVBInfo
->FBAddr
+ Position
)) = Position
;
1881 Position
+= Increment
;
1884 for( i
= 0 , Position
= 0 ; i
< 4 ; i
++ )
1886 /* if (pVBInfo->FBAddr[ Position ] != Position ) */
1887 if ((*(unsigned long *)(pVBInfo
->FBAddr
+ Position
)) != Position
)
1889 Position
+= Increment
;
1895 /* --------------------------------------------------------------------- */
1896 /* Function : XGINew_CheckRank */
1900 /* --------------------------------------------------------------------- */
1901 int XGINew_CheckRank(int RankNo
, int index
,
1902 unsigned short DRAMTYPE_TABLE
[][5],
1903 struct vb_device_info
*pVBInfo
)
1906 unsigned long Increment
, Position
;
1908 Increment
= 1 << ( DRAMTYPE_TABLE
[ index
][ 2 ] + DRAMTYPE_TABLE
[ index
][ 1 ] +
1909 DRAMTYPE_TABLE
[ index
][ 0 ] + XGINew_DataBusWidth
/ 64 + RankNo
) ;
1911 for( i
= 0 , Position
= 0 ; i
< 2 ; i
++ )
1913 /* pVBInfo->FBAddr[ Position ] = Position ; */
1914 /* *( (unsigned long *)( pVBInfo->FBAddr ) ) = Position ; */
1915 *((unsigned long *)(pVBInfo
->FBAddr
+ Position
)) = Position
;
1916 Position
+= Increment
;
1919 for( i
= 0 , Position
= 0 ; i
< 2 ; i
++ )
1921 /* if ( pVBInfo->FBAddr[ Position ] != Position ) */
1922 /* if ( ( *(unsigned long *)( pVBInfo->FBAddr ) ) != Position ) */
1923 if ((*(unsigned long *)(pVBInfo
->FBAddr
+ Position
)) != Position
)
1925 Position
+= Increment
;
1931 /* --------------------------------------------------------------------- */
1932 /* Function : XGINew_CheckDDRRank */
1936 /* --------------------------------------------------------------------- */
1937 int XGINew_CheckDDRRank(int RankNo
, int index
,
1938 unsigned short DRAMTYPE_TABLE
[][5],
1939 struct vb_device_info
*pVBInfo
)
1941 unsigned long Increment
, Position
;
1942 unsigned short data
;
1944 Increment
= 1 << ( DRAMTYPE_TABLE
[ index
][ 2 ] + DRAMTYPE_TABLE
[ index
][ 1 ] +
1945 DRAMTYPE_TABLE
[ index
][ 0 ] + XGINew_DataBusWidth
/ 64 + RankNo
) ;
1947 Increment
+= Increment
/ 2 ;
1950 *((unsigned long *)(pVBInfo
->FBAddr
+ Position
+ 0)) = 0x01234567;
1951 *((unsigned long *)(pVBInfo
->FBAddr
+ Position
+ 1)) = 0x456789AB;
1952 *((unsigned long *)(pVBInfo
->FBAddr
+ Position
+ 2)) = 0x55555555;
1953 *((unsigned long *)(pVBInfo
->FBAddr
+ Position
+ 3)) = 0x55555555;
1954 *((unsigned long *)(pVBInfo
->FBAddr
+ Position
+ 4)) = 0xAAAAAAAA;
1955 *((unsigned long *)(pVBInfo
->FBAddr
+ Position
+ 5)) = 0xAAAAAAAA;
1957 if ((*(unsigned long *)(pVBInfo
->FBAddr
+ 1)) == 0x456789AB)
1960 if ((*(unsigned long *)(pVBInfo
->FBAddr
+ 0)) == 0x01234567)
1963 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) ;
1966 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , data
) ;
1967 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x15 ) ;
1969 XGINew_SetReg1( pVBInfo
->P3c4
, 0x15 , data
) ;
1975 /* --------------------------------------------------------------------- */
1976 /* Function : XGINew_CheckRanks */
1980 /* --------------------------------------------------------------------- */
1981 int XGINew_CheckRanks(int RankNo
, int index
,
1982 unsigned short DRAMTYPE_TABLE
[][5],
1983 struct vb_device_info
*pVBInfo
)
1987 for( r
= RankNo
; r
>= 1 ; r
-- )
1989 if ( !XGINew_CheckRank( r
, index
, DRAMTYPE_TABLE
, pVBInfo
) )
1993 if ( !XGINew_CheckBanks( index
, DRAMTYPE_TABLE
, pVBInfo
) )
1996 if ( !XGINew_CheckColumn( index
, DRAMTYPE_TABLE
, pVBInfo
) )
2003 /* --------------------------------------------------------------------- */
2004 /* Function : XGINew_CheckDDRRanks */
2008 /* --------------------------------------------------------------------- */
2009 int XGINew_CheckDDRRanks(int RankNo
, int index
,
2010 unsigned short DRAMTYPE_TABLE
[][5],
2011 struct vb_device_info
*pVBInfo
)
2015 for( r
= RankNo
; r
>= 1 ; r
-- )
2017 if ( !XGINew_CheckDDRRank( r
, index
, DRAMTYPE_TABLE
, pVBInfo
) )
2021 if ( !XGINew_CheckBanks( index
, DRAMTYPE_TABLE
, pVBInfo
) )
2024 if ( !XGINew_CheckColumn( index
, DRAMTYPE_TABLE
, pVBInfo
) )
2031 /* --------------------------------------------------------------------- */
2036 /* --------------------------------------------------------------------- */
2037 int XGINew_SDRSizing(struct vb_device_info
*pVBInfo
)
2042 for( i
= 0 ; i
< 13 ; i
++ )
2044 XGINew_SetDRAMSizingType( i
, XGINew_SDRDRAM_TYPE
, pVBInfo
) ;
2046 for( j
= 2 ; j
> 0 ; j
-- )
2048 if (!XGINew_SetRank(i
, (unsigned char)j
, XGINew_ChannelAB
,
2049 XGINew_SDRDRAM_TYPE
, pVBInfo
))
2053 if ( XGINew_CheckRanks( j
, i
, XGINew_SDRDRAM_TYPE
, pVBInfo
) )
2062 /* --------------------------------------------------------------------- */
2063 /* Function : XGINew_SetDRAMSizeReg */
2067 /* --------------------------------------------------------------------- */
2068 unsigned short XGINew_SetDRAMSizeReg(int index
,
2069 unsigned short DRAMTYPE_TABLE
[][5],
2070 struct vb_device_info
*pVBInfo
)
2072 unsigned short data
= 0 , memsize
= 0;
2074 unsigned char ChannelNo
;
2076 RankSize
= DRAMTYPE_TABLE
[ index
][ 3 ] * XGINew_DataBusWidth
/ 32 ;
2077 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x13 ) ;
2085 if( XGINew_ChannelAB
== 3 )
2088 ChannelNo
= XGINew_ChannelAB
;
2090 if ( ChannelNo
* RankSize
<= 256 )
2092 while( ( RankSize
>>= 1 ) > 0 )
2097 memsize
= data
>> 4 ;
2099 /* [2004/03/25] Vicent, Fix DRAM Sizing Error */
2100 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , ( XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) & 0x0F ) | ( data
& 0xF0 ) ) ;
2102 /* data |= XGINew_ChannelAB << 2 ; */
2103 /* data |= ( XGINew_DataBusWidth / 64 ) << 1 ; */
2104 /* XGINew_SetReg1( pVBInfo->P3c4 , 0x14 , data ) ; */
2107 /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */
2113 /* --------------------------------------------------------------------- */
2114 /* Function : XGINew_SetDRAMSize20Reg */
2118 /* --------------------------------------------------------------------- */
2119 unsigned short XGINew_SetDRAMSize20Reg(int index
,
2120 unsigned short DRAMTYPE_TABLE
[][5],
2121 struct vb_device_info
*pVBInfo
)
2123 unsigned short data
= 0 , memsize
= 0;
2125 unsigned char ChannelNo
;
2127 RankSize
= DRAMTYPE_TABLE
[ index
][ 3 ] * XGINew_DataBusWidth
/ 8 ;
2128 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x13 ) ;
2136 if( XGINew_ChannelAB
== 3 )
2139 ChannelNo
= XGINew_ChannelAB
;
2141 if ( ChannelNo
* RankSize
<= 256 )
2143 while( ( RankSize
>>= 1 ) > 0 )
2148 memsize
= data
>> 4 ;
2150 /* [2004/03/25] Vicent, Fix DRAM Sizing Error */
2151 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , ( XGINew_GetReg1( pVBInfo
->P3c4
, 0x14 ) & 0x0F ) | ( data
& 0xF0 ) ) ;
2154 /* data |= XGINew_ChannelAB << 2 ; */
2155 /* data |= ( XGINew_DataBusWidth / 64 ) << 1 ; */
2156 /* XGINew_SetReg1( pVBInfo->P3c4 , 0x14 , data ) ; */
2159 /* XGINew_SetDRAMModeRegister340( pVBInfo ) ; */
2165 /* --------------------------------------------------------------------- */
2166 /* Function : XGINew_ReadWriteRest */
2170 /* --------------------------------------------------------------------- */
2171 int XGINew_ReadWriteRest(unsigned short StopAddr
, unsigned short StartAddr
,
2172 struct vb_device_info
*pVBInfo
)
2175 unsigned long Position
= 0 ;
2177 *((unsigned long *)(pVBInfo
->FBAddr
+ Position
)) = Position
;
2179 for( i
= StartAddr
; i
<= StopAddr
; i
++ )
2182 *((unsigned long *)(pVBInfo
->FBAddr
+ Position
)) = Position
;
2185 DelayUS( 500 ) ; /* [Vicent] 2004/04/16. Fix #1759 Memory Size error in Multi-Adapter. */
2189 if ((*(unsigned long *)(pVBInfo
->FBAddr
+ Position
)) != Position
)
2192 for( i
= StartAddr
; i
<= StopAddr
; i
++ )
2195 if ((*(unsigned long *)(pVBInfo
->FBAddr
+ Position
)) != Position
)
2202 /* --------------------------------------------------------------------- */
2203 /* Function : XGINew_CheckFrequence */
2207 /* --------------------------------------------------------------------- */
2208 unsigned char XGINew_CheckFrequence(struct vb_device_info
*pVBInfo
)
2210 unsigned char data
;
2212 data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x97 ) ;
2214 if ( ( data
& 0x10 ) == 0 )
2216 data
= XGINew_GetReg1( pVBInfo
->P3c4
, 0x39 ) ;
2217 data
= ( data
& 0x02 ) >> 1 ;
2221 return( data
& 0x01 ) ;
2225 /* --------------------------------------------------------------------- */
2226 /* Function : XGINew_CheckChannel */
2230 /* --------------------------------------------------------------------- */
2231 void XGINew_CheckChannel(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
2235 switch( HwDeviceExtension
->jChipType
)
2239 data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x97 ) ;
2241 XGINew_ChannelAB
= 1 ; /* XG20 "JUST" one channel */
2243 if ( data
== 0 ) /* Single_32_16 */
2246 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x1000000)
2249 XGINew_DataBusWidth
= 32 ; /* 32 bits */
2250 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xB1 ) ; /* 22bit + 2 rank + 32bit */
2251 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x52 ) ;
2254 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2257 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x800000)
2259 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x31 ) ; /* 22bit + 1 rank + 32bit */
2260 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x42 ) ;
2263 if ( XGINew_ReadWriteRest( 23 , 23 , pVBInfo
) == 1 )
2268 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x800000)
2270 XGINew_DataBusWidth
= 16 ; /* 16 bits */
2271 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xB1 ) ; /* 22bit + 2 rank + 16bit */
2272 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x41 ) ;
2275 if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo
) == 1 )
2278 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x31 ) ;
2283 else /* Dual_16_8 */
2285 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x800000)
2288 XGINew_DataBusWidth
= 16 ; /* 16 bits */
2289 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xB1 ) ; /* (0x31:12x8x2) 22bit + 2 rank */
2290 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x41 ) ; /* 0x41:16Mx16 bit*/
2293 if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo
) == 1 )
2296 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x400000)
2298 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x31 ) ; /* (0x31:12x8x2) 22bit + 1 rank */
2299 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x31 ) ; /* 0x31:8Mx16 bit*/
2302 if ( XGINew_ReadWriteRest( 22 , 22 , pVBInfo
) == 1 )
2308 if (( HwDeviceExtension
->ulVideoMemorySize
- 1 ) > 0x400000)
2310 XGINew_DataBusWidth
= 8 ; /* 8 bits */
2311 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xB1 ) ; /* (0x31:12x8x2) 22bit + 2 rank */
2312 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x30 ) ; /* 0x30:8Mx8 bit*/
2315 if ( XGINew_ReadWriteRest( 22 , 21 , pVBInfo
) == 1 )
2318 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x31 ) ; /* (0x31:12x8x2) 22bit + 1 rank */
2325 XGINew_DataBusWidth
= 16 ; /* 16 bits */
2326 XGINew_ChannelAB
= 1 ; /* Single channel */
2327 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x51 ) ; /* 32Mx16 bit*/
2330 if ( XGINew_CheckFrequence(pVBInfo
) == 1 )
2332 XGINew_DataBusWidth
= 32 ; /* 32 bits */
2333 XGINew_ChannelAB
= 3 ; /* Quad Channel */
2334 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2335 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x4C ) ;
2337 if ( XGINew_ReadWriteRest( 25 , 23 , pVBInfo
) == 1 )
2340 XGINew_ChannelAB
= 2 ; /* Dual channels */
2341 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x48 ) ;
2343 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2346 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x49 ) ;
2348 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2351 XGINew_ChannelAB
= 3 ;
2352 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2353 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x3C ) ;
2355 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2358 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x38 ) ;
2360 if ( XGINew_ReadWriteRest( 8 , 4 , pVBInfo
) == 1 )
2363 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x39 ) ;
2367 XGINew_DataBusWidth
= 64 ; /* 64 bits */
2368 XGINew_ChannelAB
= 2 ; /* Dual channels */
2369 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2370 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x5A ) ;
2372 if ( XGINew_ReadWriteRest( 25 , 24 , pVBInfo
) == 1 )
2375 XGINew_ChannelAB
= 1 ; /* Single channels */
2376 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x52 ) ;
2378 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2381 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x53 ) ;
2383 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2386 XGINew_ChannelAB
= 2 ; /* Dual channels */
2387 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2388 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x4A ) ;
2390 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2393 XGINew_ChannelAB
= 1 ; /* Single channels */
2394 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x42 ) ;
2396 if ( XGINew_ReadWriteRest( 8 , 4 , pVBInfo
) == 1 )
2399 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x43 ) ;
2406 XG42 SR14 D[3] Reserve
2407 D[2] = 1, Dual Channel
2410 It's Different from Other XG40 Series.
2412 if ( XGINew_CheckFrequence(pVBInfo
) == 1 ) /* DDRII, DDR2x */
2414 XGINew_DataBusWidth
= 32 ; /* 32 bits */
2415 XGINew_ChannelAB
= 2 ; /* 2 Channel */
2416 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2417 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x44 ) ;
2419 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2422 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2423 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x34 ) ;
2424 if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo
) == 1 )
2427 XGINew_ChannelAB
= 1 ; /* Single Channel */
2428 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2429 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x40 ) ;
2431 if ( XGINew_ReadWriteRest( 23 , 22 , pVBInfo
) == 1 )
2435 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2436 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x30 ) ;
2441 XGINew_DataBusWidth
= 64 ; /* 64 bits */
2442 XGINew_ChannelAB
= 1 ; /* 1 channels */
2443 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2444 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x52 ) ;
2446 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2450 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2451 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x42 ) ;
2459 if ( XGINew_CheckFrequence(pVBInfo
) == 1 ) /* DDRII */
2461 XGINew_DataBusWidth
= 32 ; /* 32 bits */
2462 XGINew_ChannelAB
= 3 ;
2463 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2464 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x4C ) ;
2466 if ( XGINew_ReadWriteRest( 25 , 23 , pVBInfo
) == 1 )
2469 XGINew_ChannelAB
= 2 ; /* 2 channels */
2470 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x48 ) ;
2472 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2475 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2476 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x3C ) ;
2478 if ( XGINew_ReadWriteRest( 24 , 23 , pVBInfo
) == 1 )
2479 XGINew_ChannelAB
= 3 ; /* 4 channels */
2482 XGINew_ChannelAB
= 2 ; /* 2 channels */
2483 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x38 ) ;
2488 XGINew_DataBusWidth
= 64 ; /* 64 bits */
2489 XGINew_ChannelAB
= 2 ; /* 2 channels */
2490 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0xA1 ) ;
2491 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x5A ) ;
2493 if ( XGINew_ReadWriteRest( 25 , 24 , pVBInfo
) == 1 )
2497 XGINew_SetReg1( pVBInfo
->P3c4
, 0x13 , 0x21 ) ;
2498 XGINew_SetReg1( pVBInfo
->P3c4
, 0x14 , 0x4A ) ;
2506 /* --------------------------------------------------------------------- */
2507 /* Function : XGINew_DDRSizing340 */
2511 /* --------------------------------------------------------------------- */
2512 int XGINew_DDRSizing340(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
2515 unsigned short memsize
, addr
;
2517 XGINew_SetReg1( pVBInfo
->P3c4
, 0x15 , 0x00 ) ; /* noninterleaving */
2518 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1C , 0x00 ) ; /* nontiling */
2519 XGINew_CheckChannel( HwDeviceExtension
, pVBInfo
) ;
2522 if ( HwDeviceExtension
->jChipType
>= XG20
)
2524 for( i
= 0 ; i
< 12 ; i
++ )
2526 XGINew_SetDRAMSizingType( i
, XGINew_DDRDRAM_TYPE20
, pVBInfo
) ;
2527 memsize
= XGINew_SetDRAMSize20Reg( i
, XGINew_DDRDRAM_TYPE20
, pVBInfo
) ;
2531 addr
= memsize
+ ( XGINew_ChannelAB
- 2 ) + 20 ;
2532 if ((HwDeviceExtension
->ulVideoMemorySize
- 1) < (unsigned long)(1 << addr
))
2535 if ( XGINew_ReadWriteRest( addr
, 5, pVBInfo
) == 1 )
2541 for( i
= 0 ; i
< 4 ; i
++ )
2543 XGINew_SetDRAMSizingType( i
, XGINew_DDRDRAM_TYPE340
, pVBInfo
) ;
2544 memsize
= XGINew_SetDRAMSizeReg( i
, XGINew_DDRDRAM_TYPE340
, pVBInfo
) ;
2549 addr
= memsize
+ ( XGINew_ChannelAB
- 2 ) + 20 ;
2550 if ((HwDeviceExtension
->ulVideoMemorySize
- 1) < (unsigned long)(1 << addr
))
2553 if ( XGINew_ReadWriteRest( addr
, 9, pVBInfo
) == 1 )
2561 /* --------------------------------------------------------------------- */
2562 /* Function : XGINew_DDRSizing */
2566 /* --------------------------------------------------------------------- */
2567 int XGINew_DDRSizing(struct vb_device_info
*pVBInfo
)
2572 for( i
= 0 ; i
< 4 ; i
++ )
2574 XGINew_SetDRAMSizingType( i
, XGINew_DDRDRAM_TYPE
, pVBInfo
) ;
2575 XGINew_DisableChannelInterleaving( i
, XGINew_DDRDRAM_TYPE
, pVBInfo
) ;
2576 for( j
= 2 ; j
> 0 ; j
-- )
2578 XGINew_SetDDRChannel( i
, j
, XGINew_ChannelAB
, XGINew_DDRDRAM_TYPE
, pVBInfo
) ;
2579 if (!XGINew_SetRank(i
, (unsigned char)j
, XGINew_ChannelAB
,
2580 XGINew_DDRDRAM_TYPE
, pVBInfo
))
2584 if ( XGINew_CheckDDRRanks( j
, i
, XGINew_DDRDRAM_TYPE
, pVBInfo
) )
2592 /* --------------------------------------------------------------------- */
2593 /* Function : XGINew_SetMemoryClock */
2597 /* --------------------------------------------------------------------- */
2598 void XGINew_SetMemoryClock(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
2602 XGINew_SetReg1( pVBInfo
->P3c4
, 0x28 , pVBInfo
->MCLKData
[ XGINew_RAMType
].SR28
) ;
2603 XGINew_SetReg1( pVBInfo
->P3c4
, 0x29 , pVBInfo
->MCLKData
[ XGINew_RAMType
].SR29
) ;
2604 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2A , pVBInfo
->MCLKData
[ XGINew_RAMType
].SR2A
) ;
2608 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2E , pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2E
) ;
2609 XGINew_SetReg1( pVBInfo
->P3c4
, 0x2F , pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2F
) ;
2610 XGINew_SetReg1( pVBInfo
->P3c4
, 0x30 , pVBInfo
->ECLKData
[ XGINew_RAMType
].SR30
) ;
2612 /* [Vicent] 2004/07/07, When XG42 ECLK = MCLK = 207MHz, Set SR32 D[1:0] = 10b */
2613 /* [Hsuan] 2004/08/20, Modify SR32 value, when MCLK=207MHZ, ELCK=250MHz, Set SR32 D[1:0] = 10b */
2614 if ( HwDeviceExtension
->jChipType
== XG42
)
2616 if ( ( pVBInfo
->MCLKData
[ XGINew_RAMType
].SR28
== 0x1C ) && ( pVBInfo
->MCLKData
[ XGINew_RAMType
].SR29
== 0x01 )
2617 && ( ( ( pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2E
== 0x1C ) && ( pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2F
== 0x01 ) )
2618 || ( ( pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2E
== 0x22 ) && ( pVBInfo
->ECLKData
[ XGINew_RAMType
].SR2F
== 0x01 ) ) ) )
2619 XGINew_SetReg1(pVBInfo
->P3c4
, 0x32, ((unsigned char)XGINew_GetReg1(pVBInfo
->P3c4
, 0x32) & 0xFC) | 0x02);
2624 /* --------------------------------------------------------------------- */
2625 /* Function : ChkLFB */
2629 /* --------------------------------------------------------------------- */
2630 unsigned char ChkLFB(struct vb_device_info
*pVBInfo
)
2632 if (LFBDRAMTrap
& XGINew_GetReg1(pVBInfo
->P3d4
, 0x78))
2639 /* --------------------------------------------------------------------- */
2640 /* input : dx ,valid value : CR or second chip's CR */
2642 /* SetPowerConsume : */
2643 /* Description: reduce 40/43 power consumption in first chip or */
2644 /* in second chip, assume CR A1 D[6]="1" in this case */
2646 /* --------------------------------------------------------------------- */
2647 void SetPowerConsume(struct xgi_hw_device_info
*HwDeviceExtension
,
2648 unsigned long XGI_P3d4Port
)
2650 unsigned long lTemp
;
2651 unsigned char bTemp
;
2653 HwDeviceExtension
->pQueryVGAConfigSpace( HwDeviceExtension
, 0x08 , 0 , &lTemp
) ; /* Get */
2654 if ((lTemp
&0xFF)==0)
2656 /* set CR58 D[5]=0 D[3]=0 */
2657 XGINew_SetRegAND( XGI_P3d4Port
, 0x58 , 0xD7 ) ;
2658 bTemp
= (unsigned char) XGINew_GetReg1(XGI_P3d4Port
, 0xCB);
2663 XGINew_SetRegANDOR( XGI_P3d4Port
, 0x58 , 0xD7 , 0x20 ) ; /* CR58 D[5]=1 D[3]=0 */
2667 XGINew_SetRegANDOR( XGI_P3d4Port
, 0x58 , 0xD7 , 0x08 ) ; /* CR58 D[5]=0 D[3]=1 */
2676 void XGINew_InitVBIOSData(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
2679 /* unsigned long ROMAddr = (unsigned long)HwDeviceExtension->pjVirtualRomBase; */
2680 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
2681 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
2682 pVBInfo
->BaseAddr
= (unsigned long)HwDeviceExtension
->pjIOAddress
;
2683 pVBInfo
->ISXPDOS
= 0 ;
2685 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
2686 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
2687 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
2688 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
2689 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
2690 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
2691 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
2692 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
2693 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
2694 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
2695 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
2696 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
2697 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
2698 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
2699 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
2700 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
2701 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
2702 if ( HwDeviceExtension
->jChipType
< XG20
) /* kuku 2004/06/25 */
2703 XGI_GetVBType( pVBInfo
) ; /* Run XGI_GetVBType before InitTo330Pointer */
2705 switch(HwDeviceExtension
->jChipType
)
2713 InitTo330Pointer(HwDeviceExtension
->jChipType
,pVBInfo
);
2719 /* --------------------------------------------------------------------- */
2720 /* Function : ReadVBIOSTablData */
2724 /* --------------------------------------------------------------------- */
2725 void ReadVBIOSTablData(unsigned char ChipType
, struct vb_device_info
*pVBInfo
)
2727 volatile unsigned char *pVideoMemory
= (unsigned char *)pVBInfo
->ROMAddr
;
2729 unsigned char j
, k
;
2730 /* Volari customize data area end */
2732 if ( ChipType
== XG21
)
2734 pVBInfo
->IF_DEF_LVDS
= 0 ;
2735 if (pVideoMemory
[ 0x65 ] & 0x1)
2737 pVBInfo
->IF_DEF_LVDS
= 1 ;
2738 i
= pVideoMemory
[ 0x316 ] | ( pVideoMemory
[ 0x317 ] << 8 );
2739 j
= pVideoMemory
[ i
-1 ] ;
2745 pVBInfo
->XG21_LVDSCapList
[k
].LVDS_Capability
= pVideoMemory
[ i
] | ( pVideoMemory
[ i
+ 1 ] << 8 );
2746 pVBInfo
->XG21_LVDSCapList
[k
].LVDSHT
= pVideoMemory
[ i
+ 2 ] | ( pVideoMemory
[ i
+ 3 ] << 8 ) ;
2747 pVBInfo
->XG21_LVDSCapList
[k
].LVDSVT
= pVideoMemory
[ i
+ 4 ] | ( pVideoMemory
[ i
+ 5 ] << 8 );
2748 pVBInfo
->XG21_LVDSCapList
[k
].LVDSHDE
= pVideoMemory
[ i
+ 6 ] | ( pVideoMemory
[ i
+ 7 ] << 8 );
2749 pVBInfo
->XG21_LVDSCapList
[k
].LVDSVDE
= pVideoMemory
[ i
+ 8 ] | ( pVideoMemory
[ i
+ 9 ] << 8 );
2750 pVBInfo
->XG21_LVDSCapList
[k
].LVDSHFP
= pVideoMemory
[ i
+ 10 ] | ( pVideoMemory
[ i
+ 11 ] << 8 );
2751 pVBInfo
->XG21_LVDSCapList
[k
].LVDSVFP
= pVideoMemory
[ i
+ 12 ] | ( pVideoMemory
[ i
+ 13 ] << 8 );
2752 pVBInfo
->XG21_LVDSCapList
[k
].LVDSHSYNC
= pVideoMemory
[ i
+ 14 ] | ( pVideoMemory
[ i
+ 15 ] << 8 );
2753 pVBInfo
->XG21_LVDSCapList
[k
].LVDSVSYNC
= pVideoMemory
[ i
+ 16 ] | ( pVideoMemory
[ i
+ 17 ] << 8 );
2754 pVBInfo
->XG21_LVDSCapList
[k
].VCLKData1
= pVideoMemory
[ i
+ 18 ] ;
2755 pVBInfo
->XG21_LVDSCapList
[k
].VCLKData2
= pVideoMemory
[ i
+ 19 ] ;
2756 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S1
= pVideoMemory
[ i
+ 20 ] ;
2757 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S2
= pVideoMemory
[ i
+ 21 ] ;
2758 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S3
= pVideoMemory
[ i
+ 22 ] ;
2759 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S4
= pVideoMemory
[ i
+ 23 ] ;
2760 pVBInfo
->XG21_LVDSCapList
[k
].PSC_S5
= pVideoMemory
[ i
+ 24 ] ;
2765 (k
< (sizeof(XGI21_LCDCapList
)/sizeof(struct XGI21_LVDSCapStruct
))));
2769 pVBInfo
->XG21_LVDSCapList
[0].LVDS_Capability
= pVideoMemory
[ i
] | ( pVideoMemory
[ i
+ 1 ] << 8 );
2770 pVBInfo
->XG21_LVDSCapList
[0].LVDSHT
= pVideoMemory
[ i
+ 2 ] | ( pVideoMemory
[ i
+ 3 ] << 8 ) ;
2771 pVBInfo
->XG21_LVDSCapList
[0].LVDSVT
= pVideoMemory
[ i
+ 4 ] | ( pVideoMemory
[ i
+ 5 ] << 8 );
2772 pVBInfo
->XG21_LVDSCapList
[0].LVDSHDE
= pVideoMemory
[ i
+ 6 ] | ( pVideoMemory
[ i
+ 7 ] << 8 );
2773 pVBInfo
->XG21_LVDSCapList
[0].LVDSVDE
= pVideoMemory
[ i
+ 8 ] | ( pVideoMemory
[ i
+ 9 ] << 8 );
2774 pVBInfo
->XG21_LVDSCapList
[0].LVDSHFP
= pVideoMemory
[ i
+ 10 ] | ( pVideoMemory
[ i
+ 11 ] << 8 );
2775 pVBInfo
->XG21_LVDSCapList
[0].LVDSVFP
= pVideoMemory
[ i
+ 12 ] | ( pVideoMemory
[ i
+ 13 ] << 8 );
2776 pVBInfo
->XG21_LVDSCapList
[0].LVDSHSYNC
= pVideoMemory
[ i
+ 14 ] | ( pVideoMemory
[ i
+ 15 ] << 8 );
2777 pVBInfo
->XG21_LVDSCapList
[0].LVDSVSYNC
= pVideoMemory
[ i
+ 16 ] | ( pVideoMemory
[ i
+ 17 ] << 8 );
2778 pVBInfo
->XG21_LVDSCapList
[0].VCLKData1
= pVideoMemory
[ i
+ 18 ] ;
2779 pVBInfo
->XG21_LVDSCapList
[0].VCLKData2
= pVideoMemory
[ i
+ 19 ] ;
2780 pVBInfo
->XG21_LVDSCapList
[0].PSC_S1
= pVideoMemory
[ i
+ 20 ] ;
2781 pVBInfo
->XG21_LVDSCapList
[0].PSC_S2
= pVideoMemory
[ i
+ 21 ] ;
2782 pVBInfo
->XG21_LVDSCapList
[0].PSC_S3
= pVideoMemory
[ i
+ 22 ] ;
2783 pVBInfo
->XG21_LVDSCapList
[0].PSC_S4
= pVideoMemory
[ i
+ 23 ] ;
2784 pVBInfo
->XG21_LVDSCapList
[0].PSC_S5
= pVideoMemory
[ i
+ 24 ] ;
2790 /* --------------------------------------------------------------------- */
2791 /* Function : XGINew_DDR1x_MRS_XG20 */
2795 /* --------------------------------------------------------------------- */
2796 void XGINew_DDR1x_MRS_XG20(unsigned long P3c4
, struct vb_device_info
*pVBInfo
)
2799 XGINew_SetReg1( P3c4
, 0x18 , 0x01 ) ;
2800 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ;
2801 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
2802 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
2805 XGINew_SetReg1( P3c4
, 0x18 , 0x00 ) ;
2806 XGINew_SetReg1( P3c4
, 0x19 , 0x40 ) ;
2807 XGINew_SetReg1( P3c4
, 0x16 , 0x00 ) ;
2808 XGINew_SetReg1( P3c4
, 0x16 , 0x80 ) ;
2810 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
2811 /* XGINew_SetReg1( P3c4 , 0x18 , 0x31 ) ; */
2812 XGINew_SetReg1( P3c4
, 0x19 , 0x01 ) ;
2813 XGINew_SetReg1( P3c4
, 0x16 , 0x03 ) ;
2814 XGINew_SetReg1( P3c4
, 0x16 , 0x83 ) ;
2816 XGINew_SetReg1( P3c4
, 0x1B , 0x03 ) ;
2818 /* XGINew_SetReg1( P3c4 , 0x18 , 0x31 ) ; */
2819 XGINew_SetReg1( P3c4
, 0x18 , pVBInfo
->SR15
[ 2 ][ XGINew_RAMType
] ) ; /* SR18 */
2820 XGINew_SetReg1( P3c4
, 0x19 , 0x00 ) ;
2821 XGINew_SetReg1( P3c4
, 0x16 , 0x03 ) ;
2822 XGINew_SetReg1( P3c4
, 0x16 , 0x83 ) ;
2823 XGINew_SetReg1( P3c4
, 0x1B , 0x00 ) ;
2826 /* --------------------------------------------------------------------- */
2827 /* Function : XGINew_SetDRAMModeRegister_XG20 */
2831 /* --------------------------------------------------------------------- */
2832 void XGINew_SetDRAMModeRegister_XG20(struct xgi_hw_device_info
*HwDeviceExtension
)
2834 struct vb_device_info VBINF
;
2835 struct vb_device_info
*pVBInfo
= &VBINF
;
2836 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
2837 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
2838 pVBInfo
->BaseAddr
= (unsigned long)HwDeviceExtension
->pjIOAddress
;
2839 pVBInfo
->ISXPDOS
= 0 ;
2841 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
2842 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
2843 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
2844 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
2845 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
2846 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
2847 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
2848 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
2849 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
2850 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
2851 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
2852 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
2853 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
2854 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
2855 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
2856 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
2857 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
2859 InitTo330Pointer(HwDeviceExtension
->jChipType
,pVBInfo
);
2861 ReadVBIOSTablData( HwDeviceExtension
->jChipType
, pVBInfo
) ;
2863 if ( XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) == 0 )
2864 XGINew_DDR1x_MRS_XG20( pVBInfo
->P3c4
, pVBInfo
) ;
2866 XGINew_DDR2_MRS_XG20( HwDeviceExtension
, pVBInfo
->P3c4
, pVBInfo
) ;
2868 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , 0x03 ) ;
2871 void XGINew_SetDRAMModeRegister_XG27(struct xgi_hw_device_info
*HwDeviceExtension
)
2873 struct vb_device_info VBINF
;
2874 struct vb_device_info
*pVBInfo
= &VBINF
;
2875 pVBInfo
->ROMAddr
= HwDeviceExtension
->pjVirtualRomBase
;
2876 pVBInfo
->FBAddr
= HwDeviceExtension
->pjVideoMemoryAddress
;
2877 pVBInfo
->BaseAddr
= (unsigned long)HwDeviceExtension
->pjIOAddress
;
2878 pVBInfo
->ISXPDOS
= 0 ;
2880 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14 ;
2881 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24 ;
2882 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10 ;
2883 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e ;
2884 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12 ;
2885 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a ;
2886 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16 ;
2887 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17 ;
2888 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18 ;
2889 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19 ;
2890 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A ;
2891 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
2892 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
2893 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
2894 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
2895 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
2896 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2 ;
2898 InitTo330Pointer(HwDeviceExtension
->jChipType
,pVBInfo
);
2900 ReadVBIOSTablData( HwDeviceExtension
->jChipType
, pVBInfo
) ;
2902 if ( XGINew_GetXG20DRAMType( HwDeviceExtension
, pVBInfo
) == 0 )
2903 XGINew_DDR1x_MRS_XG20( pVBInfo
->P3c4
, pVBInfo
) ;
2905 //XGINew_DDR2_MRS_XG27( HwDeviceExtension , pVBInfo->P3c4 , pVBInfo ) ;
2906 XGINew_DDRII_Bootup_XG27( HwDeviceExtension
, pVBInfo
->P3c4
, pVBInfo
) ;
2908 //XGINew_SetReg1( pVBInfo->P3c4 , 0x1B , 0x03 ) ;
2909 XGINew_SetReg1( pVBInfo
->P3c4
, 0x1B , pVBInfo
->SR15
[ 3 ][ XGINew_RAMType
] ) ; /* SR1B */
2913 void XGINew_SetDRAMModeRegister_XG27(struct xgi_hw_device_info *HwDeviceExtension)
2916 unsigned char data ;
2917 struct vb_device_info VBINF;
2918 struct vb_device_info *pVBInfo = &VBINF;
2919 pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase ;
2920 pVBInfo->FBAddr = HwDeviceExtension->pjVideoMemoryAddress ;
2921 pVBInfo->BaseAddr = HwDeviceExtension->pjIOAddress ;
2922 pVBInfo->ISXPDOS = 0 ;
2924 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14 ;
2925 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24 ;
2926 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10 ;
2927 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e ;
2928 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12 ;
2929 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a ;
2930 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16 ;
2931 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17 ;
2932 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18 ;
2933 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19 ;
2934 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A ;
2935 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00 ;
2936 pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04 ;
2937 pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10 ;
2938 pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12 ;
2939 pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 ;
2940 pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2 ;
2942 InitTo330Pointer(HwDeviceExtension->jChipType,pVBInfo);
2944 ReadVBIOSTablData( HwDeviceExtension->jChipType , pVBInfo) ;
2946 if ( XGINew_GetXG20DRAMType( HwDeviceExtension, pVBInfo) == 0 )
2947 XGINew_DDR1x_MRS_XG20( pVBInfo->P3c4, pVBInfo ) ;
2949 XGINew_DDR2_MRS_XG27( HwDeviceExtension , pVBInfo->P3c4 , pVBInfo ) ;
2951 XGINew_SetReg1( pVBInfo->P3c4 , 0x1B , 0x03 ) ;
2954 /* -------------------------------------------------------- */
2955 /* Function : XGINew_ChkSenseStatus */
2959 /* -------------------------------------------------------- */
2960 void XGINew_ChkSenseStatus(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
2962 unsigned short tempbx
= 0, temp
, tempcx
, CR3CData
;
2964 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x32 ) ;
2966 if ( temp
& Monitor1Sense
)
2967 tempbx
|= ActiveCRT1
;
2968 if ( temp
& LCDSense
)
2969 tempbx
|= ActiveLCD
;
2970 if ( temp
& Monitor2Sense
)
2971 tempbx
|= ActiveCRT2
;
2972 if ( temp
& TVSense
)
2974 tempbx
|= ActiveTV
;
2975 if ( temp
& AVIDEOSense
)
2976 tempbx
|= ( ActiveAVideo
<< 8 );
2977 if ( temp
& SVIDEOSense
)
2978 tempbx
|= ( ActiveSVideo
<< 8 );
2979 if ( temp
& SCARTSense
)
2980 tempbx
|= ( ActiveSCART
<< 8 );
2981 if ( temp
& HiTVSense
)
2982 tempbx
|= ( ActiveHiTV
<< 8 );
2983 if ( temp
& YPbPrSense
)
2984 tempbx
|= ( ActiveYPbPr
<< 8 );
2987 tempcx
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x3d ) ;
2988 tempcx
|= ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x3e ) << 8 ) ;
2990 if ( tempbx
& tempcx
)
2992 CR3CData
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x3c ) ;
2993 if ( !( CR3CData
& DisplayDeviceFromCMOS
) )
2996 if ( *pVBInfo
->pSoftSetting
& ModeSoftSetting
)
3005 if ( *pVBInfo
->pSoftSetting
& ModeSoftSetting
)
3012 XGINew_SetReg1( pVBInfo
->P3d4
, 0x3d , ( tempbx
& 0x00FF ) ) ;
3013 XGINew_SetReg1( pVBInfo
->P3d4
, 0x3e , ( ( tempbx
& 0xFF00 ) >> 8 )) ;
3015 /* -------------------------------------------------------- */
3016 /* Function : XGINew_SetModeScratch */
3020 /* -------------------------------------------------------- */
3021 void XGINew_SetModeScratch(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
3023 unsigned short temp
, tempcl
= 0 , tempch
= 0 , CR31Data
, CR38Data
;
3025 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x3d ) ;
3026 temp
|= XGINew_GetReg1( pVBInfo
->P3d4
, 0x3e ) << 8 ;
3027 temp
|= ( XGINew_GetReg1( pVBInfo
->P3d4
, 0x31 ) & ( DriverMode
>> 8) ) << 8 ;
3029 if ( pVBInfo
->IF_DEF_CRT2Monitor
== 1)
3031 if ( temp
& ActiveCRT2
)
3032 tempcl
= SetCRT2ToRAMDAC
;
3035 if ( temp
& ActiveLCD
)
3037 tempcl
|= SetCRT2ToLCD
;
3038 if ( temp
& DriverMode
)
3040 if ( temp
& ActiveTV
)
3042 tempch
= SetToLCDA
| EnableDualEdge
;
3043 temp
^= SetCRT2ToLCD
;
3045 if ( ( temp
>> 8 ) & ActiveAVideo
)
3046 tempcl
|= SetCRT2ToAVIDEO
;
3047 if ( ( temp
>> 8 ) & ActiveSVideo
)
3048 tempcl
|= SetCRT2ToSVIDEO
;
3049 if ( ( temp
>> 8 ) & ActiveSCART
)
3050 tempcl
|= SetCRT2ToSCART
;
3052 if ( pVBInfo
->IF_DEF_HiVision
== 1 )
3054 if ( ( temp
>> 8 ) & ActiveHiTV
)
3055 tempcl
|= SetCRT2ToHiVisionTV
;
3058 if ( pVBInfo
->IF_DEF_YPbPr
== 1 )
3060 if ( ( temp
>> 8 ) & ActiveYPbPr
)
3061 tempch
|= SetYPbPr
;
3068 if ( ( temp
>> 8 ) & ActiveAVideo
)
3069 tempcl
|= SetCRT2ToAVIDEO
;
3070 if ( ( temp
>> 8 ) & ActiveSVideo
)
3071 tempcl
|= SetCRT2ToSVIDEO
;
3072 if ( ( temp
>> 8 ) & ActiveSCART
)
3073 tempcl
|= SetCRT2ToSCART
;
3075 if ( pVBInfo
->IF_DEF_HiVision
== 1 )
3077 if ( ( temp
>> 8 ) & ActiveHiTV
)
3078 tempcl
|= SetCRT2ToHiVisionTV
;
3081 if ( pVBInfo
->IF_DEF_YPbPr
== 1 )
3083 if ( ( temp
>> 8 ) & ActiveYPbPr
)
3084 tempch
|= SetYPbPr
;
3089 tempcl
|= SetSimuScanMode
;
3090 if ( (!( temp
& ActiveCRT1
)) && ( ( temp
& ActiveLCD
) || ( temp
& ActiveTV
) || ( temp
& ActiveCRT2
) ) )
3091 tempcl
^= ( SetSimuScanMode
| SwitchToCRT2
) ;
3092 if ( ( temp
& ActiveLCD
) && ( temp
& ActiveTV
) )
3093 tempcl
^= ( SetSimuScanMode
| SwitchToCRT2
) ;
3094 XGINew_SetReg1( pVBInfo
->P3d4
, 0x30 , tempcl
) ;
3096 CR31Data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x31 ) ;
3097 CR31Data
&= ~( SetNotSimuMode
>> 8 ) ;
3098 if ( !( temp
& ActiveCRT1
) )
3099 CR31Data
|= ( SetNotSimuMode
>> 8 ) ;
3100 CR31Data
&= ~( DisableCRT2Display
>> 8 ) ;
3101 if (!( ( temp
& ActiveLCD
) || ( temp
& ActiveTV
) || ( temp
& ActiveCRT2
) ) )
3102 CR31Data
|= ( DisableCRT2Display
>> 8 ) ;
3103 XGINew_SetReg1( pVBInfo
->P3d4
, 0x31 , CR31Data
) ;
3105 CR38Data
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
3106 CR38Data
&= ~SetYPbPr
;
3107 CR38Data
|= tempch
;
3108 XGINew_SetReg1( pVBInfo
->P3d4
, 0x38 , CR38Data
) ;
3112 /* -------------------------------------------------------- */
3113 /* Function : XGINew_GetXG21Sense */
3117 /* -------------------------------------------------------- */
3118 void XGINew_GetXG21Sense(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
3121 volatile unsigned char *pVideoMemory
= (unsigned char *)pVBInfo
->ROMAddr
;
3123 pVBInfo
->IF_DEF_LVDS
= 0 ;
3126 if (( pVideoMemory
[ 0x65 ] & 0x01 ) ) /* For XG21 LVDS */
3128 pVBInfo
->IF_DEF_LVDS
= 1 ;
3129 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x32 , LCDSense
) ;
3130 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0xC0 ) ; /* LVDS on chip */
3135 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x03 , 0x03 ) ; /* Enable GPIOA/B read */
3136 Temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) & 0xC0;
3138 { /* DVI & DVO GPIOA/B pull high */
3139 XGINew_SenseLCD( HwDeviceExtension
, pVBInfo
) ;
3140 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x32 , LCDSense
) ;
3141 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x20 , 0x20 ) ; /* Enable read GPIOF */
3142 Temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) & 0x04 ;
3144 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0x80 ) ; /* TMDS on chip */
3146 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0xA0 ) ; /* Only DVO on chip */
3147 XGINew_SetRegAND( pVBInfo
->P3d4
, 0x4A , ~0x20 ) ; /* Disable read GPIOF */
3154 /* -------------------------------------------------------- */
3155 /* Function : XGINew_GetXG27Sense */
3159 /* -------------------------------------------------------- */
3160 void XGINew_GetXG27Sense(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
3162 unsigned char Temp
, bCR4A
;
3164 pVBInfo
->IF_DEF_LVDS
= 0 ;
3165 bCR4A
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x4A ) ;
3166 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x07 , 0x07 ) ; /* Enable GPIOA/B/C read */
3167 Temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) & 0x07;
3168 XGINew_SetReg1( pVBInfo
->P3d4
, 0x4A , bCR4A
) ;
3172 pVBInfo
->IF_DEF_LVDS
= 1 ;
3173 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0xC0 ) ; /* LVDS setting */
3174 XGINew_SetReg1( pVBInfo
->P3d4
, 0x30 , 0x21 ) ;
3178 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x38 , ~0xE0 , 0xA0 ) ; /* TMDS/DVO setting */
3180 XGINew_SetRegOR( pVBInfo
->P3d4
, 0x32 , LCDSense
) ;
3184 unsigned char GetXG21FPBits(struct vb_device_info
*pVBInfo
)
3186 unsigned char CR38
, CR4A
, temp
;
3188 CR4A
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x4A ) ;
3189 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x10 , 0x10 ) ; /* enable GPIOE read */
3190 CR38
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x38 ) ;
3192 if ( ( CR38
& 0xE0 ) > 0x80 )
3194 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) ;
3199 XGINew_SetReg1( pVBInfo
->P3d4
, 0x4A , CR4A
) ;
3204 unsigned char GetXG27FPBits(struct vb_device_info
*pVBInfo
)
3206 unsigned char CR4A
, temp
;
3208 CR4A
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x4A ) ;
3209 XGINew_SetRegANDOR( pVBInfo
->P3d4
, 0x4A , ~0x03 , 0x03 ) ; /* enable GPIOA/B/C read */
3210 temp
= XGINew_GetReg1( pVBInfo
->P3d4
, 0x48 ) ;
3217 temp
= ((temp
&0x04)>>1) || ((~temp
)&0x01);
3219 XGINew_SetReg1( pVBInfo
->P3d4
, 0x4A , CR4A
) ;