1 #include <linux/version.h>
3 #include <linux/types.h>
10 #include "vb_setmode.h"
12 extern unsigned char XGI330_SoftSetting
;
13 extern unsigned char XGI330_OutputSelect
;
14 extern unsigned short XGI330_RGBSenseData2
;
15 extern unsigned short XGI330_YCSenseData2
;
16 extern unsigned short XGI330_VideoSenseData2
;
17 void XGI_GetSenseStatus(struct xgi_hw_device_info
*HwDeviceExtension
,
18 struct vb_device_info
*pVBInfo
);
19 unsigned char XGINew_GetPanelID(struct vb_device_info
*pVBInfo
);
20 unsigned short XGINew_SenseLCD(struct xgi_hw_device_info
*,
21 struct vb_device_info
*pVBInfo
);
22 unsigned char XGINew_GetLCDDDCInfo(
23 struct xgi_hw_device_info
*HwDeviceExtension
,
24 struct vb_device_info
*pVBInfo
);
25 void XGISetDPMS(struct xgi_hw_device_info
*pXGIHWDE
,
26 unsigned long VESA_POWER_STATE
);
27 unsigned char XGINew_BridgeIsEnable(struct xgi_hw_device_info
*,
28 struct vb_device_info
*pVBInfo
);
29 unsigned char XGINew_Sense(unsigned short tempbx
, unsigned short tempcx
,
30 struct vb_device_info
*pVBInfo
);
31 unsigned char XGINew_SenseHiTV(struct xgi_hw_device_info
*HwDeviceExtension
,
32 struct vb_device_info
*pVBInfo
);
34 /**************************************************************
35 *********************** Dynamic Sense ************************
36 *************************************************************/
38 void XGI_WaitDisplay(void);
39 unsigned char XGI_Is301C(struct vb_device_info
*);
40 unsigned char XGI_Is301LV(struct vb_device_info
*);
42 static unsigned char XGINew_Is301B(struct vb_device_info
*pVBInfo
)
46 flag
= XGINew_GetReg1(pVBInfo
->Part4Port
, 0x01);
54 unsigned char XGI_Is301C(struct vb_device_info
*pVBInfo
)
56 if ((XGINew_GetReg1(pVBInfo
->Part4Port
, 0x01) & 0xF0) == 0xC0)
59 if (XGINew_GetReg1(pVBInfo
->Part4Port
, 0x01) >= 0xD0) {
60 if (XGINew_GetReg1(pVBInfo
->Part4Port
, 0x39) == 0xE0)
67 unsigned char XGI_Is301LV(struct vb_device_info
*pVBInfo
)
69 if (XGINew_GetReg1(pVBInfo
->Part4Port
, 0x01) >= 0xD0) {
70 if (XGINew_GetReg1(pVBInfo
->Part4Port
, 0x39) == 0xFF)
76 unsigned char XGINew_Sense(unsigned short tempbx
, unsigned short tempcx
, struct vb_device_info
*pVBInfo
)
78 unsigned short temp
, i
, tempch
;
81 XGINew_SetReg1(pVBInfo
->Part4Port
, 0x11, temp
);
82 temp
= (tempbx
& 0xFF00) >> 8;
83 temp
|= (tempcx
& 0x00FF);
84 XGINew_SetRegANDOR(pVBInfo
->Part4Port
, 0x10, ~0x1F, temp
);
86 for (i
= 0; i
< 10; i
++)
87 XGI_LongWait(pVBInfo
);
89 tempch
= (tempcx
& 0x7F00) >> 8;
90 temp
= XGINew_GetReg1(pVBInfo
->Part4Port
, 0x03);
100 void XGISetDPMS(struct xgi_hw_device_info
*pXGIHWDE
, unsigned long VESA_POWER_STATE
)
102 unsigned short ModeNo
, ModeIdIndex
;
104 struct vb_device_info VBINF
;
105 struct vb_device_info
*pVBInfo
= &VBINF
;
106 pVBInfo
->BaseAddr
= (unsigned long) pXGIHWDE
->pjIOAddress
;
107 pVBInfo
->ROMAddr
= pXGIHWDE
->pjVirtualRomBase
;
109 pVBInfo
->IF_DEF_LVDS
= 0;
110 pVBInfo
->IF_DEF_CH7005
= 0;
111 pVBInfo
->IF_DEF_HiVision
= 1;
112 pVBInfo
->IF_DEF_LCDA
= 1;
113 pVBInfo
->IF_DEF_CH7017
= 0;
114 pVBInfo
->IF_DEF_YPbPr
= 1;
115 pVBInfo
->IF_DEF_CRT2Monitor
= 0;
116 pVBInfo
->IF_DEF_VideoCapture
= 0;
117 pVBInfo
->IF_DEF_ScaleLCD
= 0;
118 pVBInfo
->IF_DEF_OEMUtil
= 0;
119 pVBInfo
->IF_DEF_PWD
= 0;
121 InitTo330Pointer(pXGIHWDE
->jChipType
, pVBInfo
);
122 ReadVBIOSTablData(pXGIHWDE
->jChipType
, pVBInfo
);
124 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14;
125 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24;
126 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10;
127 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e;
128 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12;
129 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a;
130 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16;
131 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17;
132 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18;
133 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19;
134 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A;
135 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
136 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
137 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
138 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
139 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
140 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2;
142 if (pXGIHWDE
->jChipType
== XG27
) {
143 if ((XGINew_GetReg1(pVBInfo
->P3d4
, 0x38) & 0xE0) == 0xC0) {
144 if (XGINew_GetReg1(pVBInfo
->P3d4
, 0x30) & 0x20)
145 pVBInfo
->IF_DEF_LVDS
= 1;
149 if (pVBInfo
->IF_DEF_CH7007
== 0)
150 XGINew_SetModeScratch(pXGIHWDE
, pVBInfo
);
152 XGINew_SetReg1(pVBInfo
->P3c4
, 0x05, 0x86); /* 1.Openkey */
153 XGI_UnLockCRT2(pXGIHWDE
, pVBInfo
);
154 ModeNo
= XGINew_GetReg1(pVBInfo
->P3d4
, 0x34);
155 XGI_SearchModeID(ModeNo
, &ModeIdIndex
, pVBInfo
);
156 XGI_GetVGAType(pXGIHWDE
, pVBInfo
);
158 if ((pXGIHWDE
->ujVBChipID
== VB_CHIP_301
) || (pXGIHWDE
->ujVBChipID
== VB_CHIP_302
) || (pVBInfo
->IF_DEF_CH7007
== 1)) {
159 XGI_GetVBType(pVBInfo
);
160 XGI_GetVBInfo(ModeNo
, ModeIdIndex
, pXGIHWDE
, pVBInfo
);
161 XGI_GetTVInfo(ModeNo
, ModeIdIndex
, pVBInfo
);
162 XGI_GetLCDInfo(ModeNo
, ModeIdIndex
, pVBInfo
);
165 if (VESA_POWER_STATE
== 0x00000400)
166 XGINew_SetReg1(pVBInfo
->Part4Port
, 0x31, (unsigned char) (XGINew_GetReg1(pVBInfo
->Part4Port
, 0x31) & 0xFE));
168 XGINew_SetReg1(pVBInfo
->Part4Port
, 0x31, (unsigned char) (XGINew_GetReg1(pVBInfo
->Part4Port
, 0x31) | 0x01));
170 temp
= (unsigned char) XGINew_GetReg1(pVBInfo
->P3c4
, 0x1f);
172 switch (VESA_POWER_STATE
) {
173 case 0x00000000: /* on */
174 if ((pXGIHWDE
->ujVBChipID
== VB_CHIP_301
) || (pXGIHWDE
->ujVBChipID
== VB_CHIP_302
)) {
175 XGINew_SetReg1(pVBInfo
->P3c4
, 0x1f, (unsigned char) (temp
| 0x00));
176 XGI_EnableBridge(pXGIHWDE
, pVBInfo
);
178 if (pXGIHWDE
->jChipType
== XG21
) {
179 if (pVBInfo
->IF_DEF_LVDS
== 1) {
180 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo
); /* LVDS VDD on */
181 XGI_XG21SetPanelDelay(2, pVBInfo
);
184 if (pXGIHWDE
->jChipType
== XG27
) {
185 if (pVBInfo
->IF_DEF_LVDS
== 1) {
186 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo
); /* LVDS VDD on */
187 XGI_XG21SetPanelDelay(2, pVBInfo
);
190 XGINew_SetRegANDOR(pVBInfo
->P3c4
, 0x1F, ~0xC0, 0x00);
191 XGINew_SetRegAND(pVBInfo
->P3c4
, 0x01, ~0x20); /* CRT on */
193 if (pXGIHWDE
->jChipType
== XG21
) {
194 temp
= XGINew_GetReg1(pVBInfo
->P3d4
, 0x38);
196 XGINew_SetRegANDOR(pVBInfo
->P3c4
, 0x09, ~0x80, 0x80); /* DVO ON */
197 XGI_SetXG21FPBits(pVBInfo
);
198 XGINew_SetRegAND(pVBInfo
->P3d4
, 0x4A, ~0x20); /* Enable write GPIOF */
199 /* XGINew_SetRegANDOR(pVBInfo->P3d4, 0x48, ~0x20, 0x20); *//* LCD Display ON */
201 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo
); /* LVDS signal on */
202 XGI_DisplayOn(pXGIHWDE
, pVBInfo
);
204 if (pXGIHWDE
->jChipType
== XG27
) {
205 temp
= XGINew_GetReg1(pVBInfo
->P3d4
, 0x38);
207 XGINew_SetRegANDOR(pVBInfo
->P3c4
, 0x09, ~0x80, 0x80); /* DVO ON */
208 XGI_SetXG27FPBits(pVBInfo
);
209 XGINew_SetRegAND(pVBInfo
->P3d4
, 0x4A, ~0x20); /* Enable write GPIOF */
210 /* XGINew_SetRegANDOR(pVBInfo->P3d4, 0x48, ~0x20, 0x20); *//* LCD Display ON */
212 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo
); /* LVDS signal on */
213 XGI_DisplayOn(pXGIHWDE
, pVBInfo
);
218 case 0x00000100: /* standby */
219 if (pXGIHWDE
->jChipType
>= XG21
)
220 XGI_DisplayOff(pXGIHWDE
, pVBInfo
);
221 XGINew_SetReg1(pVBInfo
->P3c4
, 0x1f, (unsigned char) (temp
| 0x40));
224 case 0x00000200: /* suspend */
225 if (pXGIHWDE
->jChipType
== XG21
) {
226 XGI_DisplayOff(pXGIHWDE
, pVBInfo
);
227 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo
); /* LVDS signal off */
229 if (pXGIHWDE
->jChipType
== XG27
) {
230 XGI_DisplayOff(pXGIHWDE
, pVBInfo
);
231 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo
); /* LVDS signal off */
233 XGINew_SetReg1(pVBInfo
->P3c4
, 0x1f, (unsigned char) (temp
| 0x80));
236 case 0x00000400: /* off */
237 if ((pXGIHWDE
->ujVBChipID
== VB_CHIP_301
) || (pXGIHWDE
->ujVBChipID
== VB_CHIP_302
)) {
238 XGINew_SetReg1(pVBInfo
->P3c4
, 0x1f, (unsigned char) (temp
| 0xc0));
239 XGI_DisableBridge(pXGIHWDE
, pVBInfo
);
241 if (pXGIHWDE
->jChipType
== XG21
) {
242 XGI_DisplayOff(pXGIHWDE
, pVBInfo
);
244 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo
); /* LVDS signal off */
246 temp
= XGINew_GetReg1(pVBInfo
->P3d4
, 0x38);
248 XGINew_SetRegAND(pVBInfo
->P3c4
, 0x09, ~0x80); /* DVO Off */
249 XGINew_SetRegAND(pVBInfo
->P3d4
, 0x4A, ~0x20); /* Enable write GPIOF */
250 /* XGINew_SetRegAND(pVBInfo->P3d4, 0x48, ~0x20); *//* LCD Display OFF */
253 if (pXGIHWDE
->jChipType
== XG27
) {
254 XGI_DisplayOff(pXGIHWDE
, pVBInfo
);
256 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo
); /* LVDS signal off */
258 temp
= XGINew_GetReg1(pVBInfo
->P3d4
, 0x38);
260 XGINew_SetRegAND(pVBInfo
->P3c4
, 0x09, ~0x80); /* DVO Off */
262 XGINew_SetRegANDOR(pVBInfo
->P3c4
, 0x1F, ~0xC0, 0xC0);
263 XGINew_SetRegOR(pVBInfo
->P3c4
, 0x01, 0x20); /* CRT Off */
265 if ((pXGIHWDE
->jChipType
== XG21
) && (pVBInfo
->IF_DEF_LVDS
== 1)) {
266 XGI_XG21SetPanelDelay(4, pVBInfo
);
267 XGI_XG21BLSignalVDD(0x01, 0x00, pVBInfo
); /* LVDS VDD off */
268 XGI_XG21SetPanelDelay(5, pVBInfo
);
270 if ((pXGIHWDE
->jChipType
== XG27
) && (pVBInfo
->IF_DEF_LVDS
== 1)) {
271 XGI_XG21SetPanelDelay(4, pVBInfo
);
272 XGI_XG27BLSignalVDD(0x01, 0x00, pVBInfo
); /* LVDS VDD off */
273 XGI_XG21SetPanelDelay(5, pVBInfo
);
281 XGI_LockCRT2(pXGIHWDE
, pVBInfo
);
284 void XGI_GetSenseStatus(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
286 unsigned short tempax
= 0, tempbx
, tempcx
, temp
, P2reg0
= 0, SenseModeNo
= 0,
287 OutputSelect
= *pVBInfo
->pOutputSelect
, ModeIdIndex
, i
;
288 pVBInfo
->BaseAddr
= (unsigned long) HwDeviceExtension
->pjIOAddress
;
290 if (pVBInfo
->IF_DEF_LVDS
== 1) {
291 tempax
= XGINew_GetReg1(pVBInfo
->P3c4
, 0x1A); /* ynlai 02/27/2002 */
292 tempbx
= XGINew_GetReg1(pVBInfo
->P3c4
, 0x1B);
293 tempax
= ((tempax
& 0xFE) >> 1) | (tempbx
<< 8);
294 if (tempax
== 0x00) { /* Get Panel id from DDC */
295 temp
= XGINew_GetLCDDDCInfo(HwDeviceExtension
, pVBInfo
);
296 if (temp
== 1) { /* LCD connect */
297 XGINew_SetRegANDOR(pVBInfo
->P3d4
, 0x39, 0xFF, 0x01); /* set CR39 bit0="1" */
298 XGINew_SetRegANDOR(pVBInfo
->P3d4
, 0x37, 0xEF, 0x00); /* clean CR37 bit4="0" */
300 } else { /* LCD don't connect */
304 XGINew_GetPanelID(pVBInfo
);
308 tempbx
= ~(LCDSense
| AVIDEOSense
| SVIDEOSense
);
309 XGINew_SetRegANDOR(pVBInfo
->P3d4
, 0x32, tempbx
, temp
);
310 } else { /* for 301 */
311 if (pVBInfo
->VBInfo
& SetCRT2ToHiVisionTV
) { /* for HiVision */
312 tempax
= XGINew_GetReg1(pVBInfo
->P3c4
, 0x38);
313 temp
= tempax
& 0x01;
314 tempax
= XGINew_GetReg1(pVBInfo
->P3c4
, 0x3A);
315 temp
= temp
| (tempax
& 0x02);
316 XGINew_SetRegANDOR(pVBInfo
->P3d4
, 0x32, 0xA0, temp
);
318 if (XGI_BridgeIsOn(pVBInfo
)) {
319 P2reg0
= XGINew_GetReg1(pVBInfo
->Part2Port
, 0x00);
320 if (!XGINew_BridgeIsEnable(HwDeviceExtension
, pVBInfo
)) {
322 /* XGINew_SetReg1(pVBInfo->P3d4, 0x30, 0x41); */
323 /* XGISetModeNew(HwDeviceExtension, 0x2e); // ynlai InitMode */
325 temp
= XGI_SearchModeID(SenseModeNo
, &ModeIdIndex
, pVBInfo
);
326 XGI_GetVGAType(HwDeviceExtension
, pVBInfo
);
327 XGI_GetVBType(pVBInfo
);
328 pVBInfo
->SetFlag
= 0x00;
329 pVBInfo
->ModeType
= ModeVGA
;
330 pVBInfo
->VBInfo
= SetCRT2ToRAMDAC
| LoadDACFlag
| SetInSlaveMode
;
331 XGI_GetLCDInfo(0x2e, ModeIdIndex
, pVBInfo
);
332 XGI_GetTVInfo(0x2e, ModeIdIndex
, pVBInfo
);
333 XGI_EnableBridge(HwDeviceExtension
, pVBInfo
);
334 XGI_SetCRT2Group301(SenseModeNo
, HwDeviceExtension
, pVBInfo
);
335 XGI_SetCRT2ModeRegs(0x2e, HwDeviceExtension
, pVBInfo
);
336 /* XGI_DisableBridge( HwDeviceExtension, pVBInfo ) ; */
337 XGINew_SetRegANDOR(pVBInfo
->P3c4
, 0x01, 0xDF, 0x20); /* Display Off 0212 */
338 for (i
= 0; i
< 20; i
++)
339 XGI_LongWait(pVBInfo
);
341 XGINew_SetReg1(pVBInfo
->Part2Port
, 0x00, 0x1c);
343 tempbx
= *pVBInfo
->pRGBSenseData
;
345 if (!(XGINew_Is301B(pVBInfo
)))
346 tempbx
= *pVBInfo
->pRGBSenseData2
;
349 if (XGINew_Sense(tempbx
, tempcx
, pVBInfo
)) {
350 if (XGINew_Sense(tempbx
, tempcx
, pVBInfo
))
351 tempax
|= Monitor2Sense
;
354 if (pVBInfo
->VBType
& VB_XGI301C
)
355 XGINew_SetRegOR(pVBInfo
->Part4Port
, 0x0d, 0x04);
357 if (XGINew_SenseHiTV(HwDeviceExtension
, pVBInfo
)) { /* add by kuku for Multi-adapter sense HiTV */
359 if ((pVBInfo
->VBType
& VB_XGI301C
))
360 tempax
^= (HiTVSense
| YPbPrSense
);
363 if (!(tempax
& (HiTVSense
| YPbPrSense
))) { /* start */
365 tempbx
= *pVBInfo
->pYCSenseData
;
367 if (!(XGINew_Is301B(pVBInfo
)))
368 tempbx
= *pVBInfo
->pYCSenseData2
;
371 if (XGINew_Sense(tempbx
, tempcx
, pVBInfo
)) {
372 if (XGINew_Sense(tempbx
, tempcx
, pVBInfo
))
373 tempax
|= SVIDEOSense
;
376 if (OutputSelect
& BoardTVType
) {
377 tempbx
= *pVBInfo
->pVideoSenseData
;
379 if (!(XGINew_Is301B(pVBInfo
)))
380 tempbx
= *pVBInfo
->pVideoSenseData2
;
383 if (XGINew_Sense(tempbx
, tempcx
, pVBInfo
)) {
384 if (XGINew_Sense(tempbx
, tempcx
, pVBInfo
))
385 tempax
|= AVIDEOSense
;
388 if (!(tempax
& SVIDEOSense
)) {
389 tempbx
= *pVBInfo
->pVideoSenseData
;
391 if (!(XGINew_Is301B(pVBInfo
)))
392 tempbx
= *pVBInfo
->pVideoSenseData2
;
395 if (XGINew_Sense(tempbx
, tempcx
, pVBInfo
)) {
396 if (XGINew_Sense(tempbx
, tempcx
, pVBInfo
))
397 tempax
|= AVIDEOSense
;
403 if (!(tempax
& Monitor2Sense
)) {
404 if (XGINew_SenseLCD(HwDeviceExtension
, pVBInfo
))
409 XGINew_Sense(tempbx
, tempcx
, pVBInfo
);
411 XGINew_SetRegANDOR(pVBInfo
->P3d4
, 0x32, ~0xDF, tempax
);
412 XGINew_SetReg1(pVBInfo
->Part2Port
, 0x00, P2reg0
);
414 if (!(P2reg0
& 0x20)) {
415 pVBInfo
->VBInfo
= DisableCRT2Display
;
416 /* XGI_SetCRT2Group301(SenseModeNo, HwDeviceExtension, pVBInfo); */
420 XGI_DisableBridge(HwDeviceExtension
, pVBInfo
); /* shampoo 0226 */
424 unsigned short XGINew_SenseLCD(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
426 /* unsigned short SoftSetting ; */
429 if ((HwDeviceExtension
->jChipType
>= XG20
) || (HwDeviceExtension
->jChipType
>= XG40
))
432 temp
= XGINew_GetPanelID(pVBInfo
);
435 temp
= XGINew_GetLCDDDCInfo(HwDeviceExtension
, pVBInfo
);
440 unsigned char XGINew_GetLCDDDCInfo(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
445 if (HwDeviceExtension
->ulCRT2LCDType
== LCD_UNKNOWN
) {
448 temp
= (unsigned short) HwDeviceExtension
->ulCRT2LCDType
;
449 switch (HwDeviceExtension
->ulCRT2LCDType
) {
477 XGINew_SetRegANDOR(pVBInfo
->P3d4
, 0x36, 0xF0, temp
);
482 unsigned char XGINew_GetPanelID(struct vb_device_info
*pVBInfo
)
484 unsigned short PanelTypeTable
[16] = { SyncNN
| PanelRGB18Bit
485 | Panel800x600
| _PanelType00
, SyncNN
| PanelRGB18Bit
486 | Panel1024x768
| _PanelType01
, SyncNN
| PanelRGB18Bit
487 | Panel800x600
| _PanelType02
, SyncNN
| PanelRGB18Bit
488 | Panel640x480
| _PanelType03
, SyncNN
| PanelRGB18Bit
489 | Panel1024x768
| _PanelType04
, SyncNN
| PanelRGB18Bit
490 | Panel1024x768
| _PanelType05
, SyncNN
| PanelRGB18Bit
491 | Panel1024x768
| _PanelType06
, SyncNN
| PanelRGB24Bit
492 | Panel1024x768
| _PanelType07
, SyncNN
| PanelRGB18Bit
493 | Panel800x600
| _PanelType08
, SyncNN
| PanelRGB18Bit
494 | Panel1024x768
| _PanelType09
, SyncNN
| PanelRGB18Bit
495 | Panel800x600
| _PanelType0A
, SyncNN
| PanelRGB18Bit
496 | Panel1024x768
| _PanelType0B
, SyncNN
| PanelRGB18Bit
497 | Panel1024x768
| _PanelType0C
, SyncNN
| PanelRGB24Bit
498 | Panel1024x768
| _PanelType0D
, SyncNN
| PanelRGB18Bit
499 | Panel1024x768
| _PanelType0E
, SyncNN
| PanelRGB18Bit
500 | Panel1024x768
| _PanelType0F
};
501 unsigned short tempax
, tempbx
, temp
;
502 /* unsigned short return_flag; */
504 tempax
= XGINew_GetReg1(pVBInfo
->P3c4
, 0x1A);
505 tempbx
= tempax
& 0x1E;
511 if (!(tempax & 0x10)) {
512 if (pVBInfo->IF_DEF_LVDS == 1) {
514 temp = XGINew_GetReg1(pVBInfo->P3c4, 0x38);
522 temp = XGINew_GetReg1(pVBInfo->P3c4, 0x39);
531 tempbx
= tempbx
>> 1;
532 temp
= tempbx
& 0x00F;
533 XGINew_SetReg1(pVBInfo
->P3d4
, 0x36, temp
);
535 tempbx
= PanelTypeTable
[tempbx
];
537 temp
= (tempbx
& 0xFF00) >> 8;
538 XGINew_SetRegANDOR(pVBInfo
->P3d4
, 0x37, ~(LCDSyncBit
539 | LCDRGB18Bit
), temp
);
544 unsigned char XGINew_BridgeIsEnable(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
548 if (XGI_BridgeIsOn(pVBInfo
) == 0) {
549 flag
= XGINew_GetReg1(pVBInfo
->Part1Port
, 0x0);
560 unsigned char XGINew_SenseHiTV(struct xgi_hw_device_info
*HwDeviceExtension
, struct vb_device_info
*pVBInfo
)
562 unsigned short tempbx
, tempcx
, temp
, i
, tempch
;
564 tempbx
= *pVBInfo
->pYCSenseData2
;
568 temp
= tempbx
& 0xFF;
569 XGINew_SetReg1(pVBInfo
->Part4Port
, 0x11, temp
);
570 temp
= (tempbx
& 0xFF00) >> 8;
571 temp
|= (tempcx
& 0x00FF);
572 XGINew_SetRegANDOR(pVBInfo
->Part4Port
, 0x10, ~0x1F, temp
);
574 for (i
= 0; i
< 10; i
++)
575 XGI_LongWait(pVBInfo
);
577 tempch
= (tempcx
& 0xFF00) >> 8;
578 temp
= XGINew_GetReg1(pVBInfo
->Part4Port
, 0x03);
579 temp
= temp
^ (0x0E);
585 tempbx
= *pVBInfo
->pVideoSenseData2
;
588 temp
= tempbx
& 0xFF;
589 XGINew_SetReg1(pVBInfo
->Part4Port
, 0x11, temp
);
590 temp
= (tempbx
& 0xFF00) >> 8;
591 temp
|= (tempcx
& 0x00FF);
592 XGINew_SetRegANDOR(pVBInfo
->Part4Port
, 0x10, ~0x1F, temp
);
594 for (i
= 0; i
< 10; i
++)
595 XGI_LongWait(pVBInfo
);
597 tempch
= (tempcx
& 0xFF00) >> 8;
598 temp
= XGINew_GetReg1(pVBInfo
->Part4Port
, 0x03);
599 temp
= temp
^ (0x0E);
602 if (temp
!= tempch
) {
607 temp
= tempbx
& 0xFF;
608 XGINew_SetReg1(pVBInfo
->Part4Port
, 0x11, temp
);
609 temp
= (tempbx
& 0xFF00) >> 8;
610 temp
|= (tempcx
& 0x00FF);
611 XGINew_SetRegANDOR(pVBInfo
->Part4Port
, 0x10, ~0x1F, temp
);
613 for (i
= 0; i
< 10; i
++)
614 XGI_LongWait(pVBInfo
);
616 tempch
= (tempcx
& 0xFF00) >> 8;
617 temp
= XGINew_GetReg1(pVBInfo
->Part4Port
, 0x03);
618 temp
= temp
^ (0x0E);
628 /* ----------------------------------------------------------------------------
629 * Description: Get Panel support
631 * BL: Panel ID=81h for no scaler LVDS
632 * BH: Panel enhanced Mode Count
633 * CX: Panel H. resolution
634 * DX: PAnel V. resolution
635 * ----------------------------------------------------------------------------
637 static void XGI_XG21Fun14Sub70(struct vb_device_info
*pVBInfo
, PX86_REGS pBiosArguments
)
639 unsigned short ModeIdIndex
;
640 unsigned short ModeNo
;
642 unsigned short EModeCount
;
643 unsigned short lvdstableindex
;
645 lvdstableindex
= XGI_GetLVDSOEMTableIndex(pVBInfo
);
646 pBiosArguments
->h
.bl
= 0x81;
647 pBiosArguments
->x
.cx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHDE
;
648 pBiosArguments
->x
.dx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVDE
;
651 pBiosArguments
->x
.ax
= 0x0014;
652 for (ModeIdIndex
= 0;; ModeIdIndex
++) {
653 ModeNo
= pVBInfo
->EModeIDTable
[ModeIdIndex
].Ext_ModeID
;
654 if (pVBInfo
->EModeIDTable
[ModeIdIndex
].Ext_ModeID
== 0xFF) {
655 pBiosArguments
->h
.bh
= (unsigned char) EModeCount
;
658 if (!XGI_XG21CheckLVDSMode(ModeNo
, ModeIdIndex
, pVBInfo
))
665 /* ----------------------------------------------------------------------------
667 * Description: Get Panel mode ID for enhanced mode
668 * I/P : BH: EModeIndex ( which < Panel enhanced Mode Count )
671 * CX: H. resolution of the assigned by the index
672 * DX: V. resolution of the assigned by the index
674 * ----------------------------------------------------------------------------
677 static void XGI_XG21Fun14Sub71(struct vb_device_info
*pVBInfo
, PX86_REGS pBiosArguments
)
680 unsigned short EModeCount
;
681 unsigned short ModeIdIndex
, resindex
;
682 unsigned short ModeNo
;
683 unsigned short EModeIndex
= pBiosArguments
->h
.bh
;
686 for (ModeIdIndex
= 0;; ModeIdIndex
++) {
687 ModeNo
= pVBInfo
->EModeIDTable
[ModeIdIndex
].Ext_ModeID
;
688 if (pVBInfo
->EModeIDTable
[ModeIdIndex
].Ext_ModeID
== 0xFF) {
689 pBiosArguments
->x
.ax
= 0x0114;
692 if (!XGI_XG21CheckLVDSMode(ModeNo
, ModeIdIndex
, pVBInfo
))
695 if (EModeCount
== EModeIndex
) {
696 resindex
= XGI_GetResInfo(ModeNo
, ModeIdIndex
, pVBInfo
);
697 pBiosArguments
->h
.bl
= (unsigned char) ModeNo
;
698 pBiosArguments
->x
.cx
= pVBInfo
->ModeResInfo
[resindex
].HTotal
; /* xres->ax */
699 pBiosArguments
->x
.dx
= pVBInfo
->ModeResInfo
[resindex
].VTotal
; /* yres->bx */
700 pBiosArguments
->x
.ax
= 0x0014;
708 /* ----------------------------------------------------------------------------
710 * Description: Validate Panel modes ID support
714 * CX: H. resolution of the assigned by the index
715 * DX: V. resolution of the assigned by the index
717 * ----------------------------------------------------------------------------
719 static void XGI_XG21Fun14Sub72(struct vb_device_info
*pVBInfo
, PX86_REGS pBiosArguments
)
721 unsigned short ModeIdIndex
, resindex
;
722 unsigned short ModeNo
;
724 ModeNo
= pBiosArguments
->h
.bl
;
725 XGI_SearchModeID(ModeNo
, &ModeIdIndex
, pVBInfo
);
726 if (!XGI_XG21CheckLVDSMode(ModeNo
, ModeIdIndex
, pVBInfo
)) {
727 pBiosArguments
->x
.cx
= 0;
728 pBiosArguments
->x
.dx
= 0;
729 pBiosArguments
->x
.ax
= 0x0114;
732 resindex
= XGI_GetResInfo(ModeNo
, ModeIdIndex
, pVBInfo
);
733 if (ModeNo
<= 0x13) {
734 pBiosArguments
->x
.cx
= pVBInfo
->StResInfo
[resindex
].HTotal
;
735 pBiosArguments
->x
.dx
= pVBInfo
->StResInfo
[resindex
].VTotal
;
737 pBiosArguments
->x
.cx
= pVBInfo
->ModeResInfo
[resindex
].HTotal
; /* xres->ax */
738 pBiosArguments
->x
.dx
= pVBInfo
->ModeResInfo
[resindex
].VTotal
; /* yres->bx */
741 pBiosArguments
->x
.ax
= 0x0014;
745 /* ----------------------------------------------------------------------------
747 * Description: Get Customized Panel misc. information support
749 * to get panel horizontal timing
750 * to get panel vertical timing
751 * to get channel clock parameter
752 * to get panel misc information
755 * BL: for input Select = 0 ;
756 * BX: *Value1 = Horizontal total
757 * CX: *Value2 = Horizontal front porch
758 * DX: *Value2 = Horizontal sync width
759 * BL: for input Select = 1 ;
760 * BX: *Value1 = Vertical total
761 * CX: *Value2 = Vertical front porch
762 * DX: *Value2 = Vertical sync width
763 * BL: for input Select = 2 ;
764 * BX: Value1 = The first CLK parameter
765 * CX: Value2 = The second CLK parameter
766 * BL: for input Select = 4 ;
767 * BX[15]: *Value1 D[15] VESA V. Polarity
768 * BX[14]: *Value1 D[14] VESA H. Polarity
769 * BX[7]: *Value1 D[7] Panel V. Polarity
770 * BX[6]: *Value1 D[6] Panel H. Polarity
771 * ----------------------------------------------------------------------------
773 static void XGI_XG21Fun14Sub73(struct vb_device_info
*pVBInfo
, PX86_REGS pBiosArguments
)
775 unsigned char Select
;
777 unsigned short lvdstableindex
;
779 lvdstableindex
= XGI_GetLVDSOEMTableIndex(pVBInfo
);
780 Select
= pBiosArguments
->h
.bl
;
784 pBiosArguments
->x
.bx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHT
;
785 pBiosArguments
->x
.cx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHFP
;
786 pBiosArguments
->x
.dx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSHSYNC
;
789 pBiosArguments
->x
.bx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVT
;
790 pBiosArguments
->x
.cx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVFP
;
791 pBiosArguments
->x
.dx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDSVSYNC
;
794 pBiosArguments
->x
.bx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].VCLKData1
;
795 pBiosArguments
->x
.cx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].VCLKData2
;
798 pBiosArguments
->x
.bx
= pVBInfo
->XG21_LVDSCapList
[lvdstableindex
].LVDS_Capability
;
802 pBiosArguments
->x
.ax
= 0x0014;
805 void XGI_XG21Fun14(struct xgi_hw_device_info
*pXGIHWDE
, PX86_REGS pBiosArguments
)
807 struct vb_device_info VBINF
;
808 struct vb_device_info
*pVBInfo
= &VBINF
;
810 pVBInfo
->IF_DEF_LVDS
= 0;
811 pVBInfo
->IF_DEF_CH7005
= 0;
812 pVBInfo
->IF_DEF_HiVision
= 1;
813 pVBInfo
->IF_DEF_LCDA
= 1;
814 pVBInfo
->IF_DEF_CH7017
= 0;
815 pVBInfo
->IF_DEF_YPbPr
= 1;
816 pVBInfo
->IF_DEF_CRT2Monitor
= 0;
817 pVBInfo
->IF_DEF_VideoCapture
= 0;
818 pVBInfo
->IF_DEF_ScaleLCD
= 0;
819 pVBInfo
->IF_DEF_OEMUtil
= 0;
820 pVBInfo
->IF_DEF_PWD
= 0;
822 InitTo330Pointer(pXGIHWDE
->jChipType
, pVBInfo
);
823 ReadVBIOSTablData(pXGIHWDE
->jChipType
, pVBInfo
);
825 pVBInfo
->P3c4
= pVBInfo
->BaseAddr
+ 0x14;
826 pVBInfo
->P3d4
= pVBInfo
->BaseAddr
+ 0x24;
827 pVBInfo
->P3c0
= pVBInfo
->BaseAddr
+ 0x10;
828 pVBInfo
->P3ce
= pVBInfo
->BaseAddr
+ 0x1e;
829 pVBInfo
->P3c2
= pVBInfo
->BaseAddr
+ 0x12;
830 pVBInfo
->P3ca
= pVBInfo
->BaseAddr
+ 0x1a;
831 pVBInfo
->P3c6
= pVBInfo
->BaseAddr
+ 0x16;
832 pVBInfo
->P3c7
= pVBInfo
->BaseAddr
+ 0x17;
833 pVBInfo
->P3c8
= pVBInfo
->BaseAddr
+ 0x18;
834 pVBInfo
->P3c9
= pVBInfo
->BaseAddr
+ 0x19;
835 pVBInfo
->P3da
= pVBInfo
->BaseAddr
+ 0x2A;
836 pVBInfo
->Part0Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_00
;
837 pVBInfo
->Part1Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_04
;
838 pVBInfo
->Part2Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_10
;
839 pVBInfo
->Part3Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_12
;
840 pVBInfo
->Part4Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
;
841 pVBInfo
->Part5Port
= pVBInfo
->BaseAddr
+ XGI_CRT2_PORT_14
+ 2;
843 switch (pBiosArguments
->x
.ax
) {
845 XGI_XG21Fun14Sub70(pVBInfo
, pBiosArguments
);
848 XGI_XG21Fun14Sub71(pVBInfo
, pBiosArguments
);
851 XGI_XG21Fun14Sub72(pVBInfo
, pBiosArguments
);
854 XGI_XG21Fun14Sub73(pVBInfo
, pBiosArguments
);