1 #include <linux/delay.h>
7 #include "vb_setmode.h"
10 #define TVCLKBASE_315_25 (TVCLKBASE_315 + 25)
12 static const unsigned short XGINew_VGA_DAC[] = {
13 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
14 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
15 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
16 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
17 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
18 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
19 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
20 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
21 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
22 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
24 void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
26 pVBInfo->MCLKData = XGI340New_MCLKData;
28 pVBInfo->LCDResInfo = 0;
29 pVBInfo->LCDTypeInfo = 0;
34 pVBInfo->SR15 = XGI340_SR13;
35 pVBInfo->CR40 = XGI340_cr41;
37 /* 310 customization related */
38 if ((pVBInfo->VBType & VB_SIS301LV) || (pVBInfo->VBType & VB_SIS302LV))
39 pVBInfo->LCDCapList = XGI_LCDDLCapList;
41 pVBInfo->LCDCapList = XGI_LCDCapList;
44 pVBInfo->XGINew_CR97 = 0x10;
46 if (ChipType == XG27) {
48 pVBInfo->MCLKData = XGI27New_MCLKData;
49 pVBInfo->CR40 = XGI27_cr41;
50 pVBInfo->XGINew_CR97 = 0xc1;
51 pVBInfo->SR15 = XG27_SR13;
54 temp = xgifb_reg_get(pVBInfo->P3c4, 0x3B);
55 /* SR3B[7][3]MAA15 MAA11 (Power on Trapping) */
56 if (((temp & 0x88) == 0x80) || ((temp & 0x88) == 0x08))
57 pVBInfo->XGINew_CR97 = 0x80;
62 static void XGI_SetSeqRegs(unsigned short ModeNo,
63 unsigned short ModeIdIndex,
64 struct vb_device_info *pVBInfo)
66 unsigned char tempah, SRdata;
67 unsigned short i, modeflag;
69 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
71 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
72 tempah = XGI330_StandTable.SR[0];
74 i = XGI_SetCRT2ToLCDA;
75 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
77 } else if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
78 if (pVBInfo->VBInfo & SetInSlaveMode)
82 tempah |= 0x20; /* screen off */
83 xgifb_reg_set(pVBInfo->P3c4, 0x01, tempah); /* Set SR1 */
85 for (i = 02; i <= 04; i++) {
86 /* Get SR2,3,4 from file */
87 SRdata = XGI330_StandTable.SR[i - 1];
88 xgifb_reg_set(pVBInfo->P3c4, i, SRdata); /* Set SR2 3 4 */
92 static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
93 struct vb_device_info *pVBInfo)
95 unsigned char CRTCdata;
98 CRTCdata = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
100 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
102 for (i = 0; i <= 0x18; i++) {
103 /* Get CRTC from file */
104 CRTCdata = XGI330_StandTable.CRTC[i];
105 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
109 static void XGI_SetATTRegs(unsigned short ModeNo,
110 unsigned short ModeIdIndex,
111 struct vb_device_info *pVBInfo)
113 unsigned char ARdata;
114 unsigned short i, modeflag;
116 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
118 for (i = 0; i <= 0x13; i++) {
119 ARdata = XGI330_StandTable.ATTR[i];
121 if ((modeflag & Charx8Dot) && i == 0x13) { /* ifndef Dot9 */
122 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
124 } else if ((pVBInfo->VBInfo &
125 (SetCRT2ToTV | SetCRT2ToLCD)) &&
126 (pVBInfo->VBInfo & SetInSlaveMode)) {
131 inb(pVBInfo->P3da); /* reset 3da */
132 outb(i, pVBInfo->P3c0); /* set index */
133 outb(ARdata, pVBInfo->P3c0); /* set data */
136 inb(pVBInfo->P3da); /* reset 3da */
137 outb(0x14, pVBInfo->P3c0); /* set index */
138 outb(0x00, pVBInfo->P3c0); /* set data */
139 inb(pVBInfo->P3da); /* Enable Attribute */
140 outb(0x20, pVBInfo->P3c0);
143 static void XGI_SetGRCRegs(struct vb_device_info *pVBInfo)
145 unsigned char GRdata;
148 for (i = 0; i <= 0x08; i++) {
149 /* Get GR from file */
150 GRdata = XGI330_StandTable.GRC[i];
151 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
154 if (pVBInfo->ModeType > ModeVGA) {
155 GRdata = (unsigned char) xgifb_reg_get(pVBInfo->P3ce, 0x05);
156 GRdata &= 0xBF; /* 256 color disable */
157 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
161 static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
165 for (i = 0x0A; i <= 0x0E; i++)
166 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
169 static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
172 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
173 xgifb_reg_set(pVBInfo->P3c4, 0x2B, XGI_VCLKData[0].SR2B);
174 xgifb_reg_set(pVBInfo->P3c4, 0x2C, XGI_VCLKData[0].SR2C);
176 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
177 xgifb_reg_set(pVBInfo->P3c4, 0x2B, XGI_VCLKData[1].SR2B);
178 xgifb_reg_set(pVBInfo->P3c4, 0x2C, XGI_VCLKData[1].SR2C);
180 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
184 static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
185 unsigned short ModeIdIndex,
186 unsigned short RefreshRateTableIndex, unsigned short *i,
187 struct vb_device_info *pVBInfo)
189 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
191 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
192 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
193 tempbx = XGI330_RefIndex[RefreshRateTableIndex + (*i)].ModeID;
196 if (pVBInfo->IF_DEF_LVDS == 0) {
197 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
198 tempax |= SupportRAMDAC2;
200 if (pVBInfo->VBType & VB_XGI301C)
201 tempax |= SupportCRT2in301C;
205 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
206 tempax |= SupportLCD;
208 if (pVBInfo->LCDResInfo != Panel_1280x1024 &&
209 pVBInfo->LCDResInfo != Panel_1280x960 &&
210 (pVBInfo->LCDInfo & LCDNonExpanding) &&
215 if (pVBInfo->VBInfo & SetCRT2ToHiVision) { /* for HiTV */
216 tempax |= SupportHiVision;
217 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
220 (pVBInfo->SetFlag & TVSimuMode)) ||
223 } else if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
226 SetCRT2ToYPbPr525750 |
227 SetCRT2ToHiVision)) {
230 if (pVBInfo->VBType & (VB_SIS301B |
235 tempax |= SupportTV1024;
237 if (!(pVBInfo->VBInfo & TVSetPAL) &&
238 (modeflag & NoSupportSimuTV) &&
239 (pVBInfo->VBInfo & SetInSlaveMode) &&
240 (!(pVBInfo->VBInfo & SetNotSimuMode)))
243 } else if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* for LVDS */
244 tempax |= SupportLCD;
247 return 0; /* 1024x768 */
249 if (pVBInfo->LCDResInfo < Panel_1024x768) {
251 return 0; /* 800x600 */
254 return 0; /* 512x384 */
258 for (; XGI330_RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
260 infoflag = XGI330_RefIndex[RefreshRateTableIndex + (*i)].
262 if (infoflag & tempax)
269 for ((*i) = 0;; (*i)++) {
270 infoflag = XGI330_RefIndex[RefreshRateTableIndex + (*i)].
272 if (XGI330_RefIndex[RefreshRateTableIndex + (*i)].ModeID
277 if (infoflag & tempax)
283 static void XGI_SetSync(unsigned short RefreshRateTableIndex,
284 struct vb_device_info *pVBInfo)
286 unsigned short sync, temp;
289 sync = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
293 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
296 static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
297 struct xgi_hw_device_info *HwDeviceExtension)
299 unsigned char data, data1, pushax;
303 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
305 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
307 data = pVBInfo->TimingH.data[0];
308 xgifb_reg_set(pVBInfo->P3d4, 0, data);
310 for (i = 0x01; i <= 0x04; i++) {
311 data = pVBInfo->TimingH.data[i];
312 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
315 for (i = 0x05; i <= 0x06; i++) {
316 data = pVBInfo->TimingH.data[i];
317 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
320 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
322 data = pVBInfo->TimingH.data[7];
325 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
327 if (HwDeviceExtension->jChipType >= XG20) {
328 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
330 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
331 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
337 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
340 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
345 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
346 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
352 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
356 static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
357 unsigned short ModeNo,
358 struct vb_device_info *pVBInfo)
363 for (i = 0x00; i <= 0x01; i++) {
364 data = pVBInfo->TimingV.data[i];
365 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
368 for (i = 0x02; i <= 0x03; i++) {
369 data = pVBInfo->TimingV.data[i];
370 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
373 for (i = 0x04; i <= 0x05; i++) {
374 data = pVBInfo->TimingV.data[i];
375 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
378 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
380 data = pVBInfo->TimingV.data[6];
383 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
385 data = pVBInfo->TimingV.data[6];
389 i = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
394 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
397 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
400 static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
401 unsigned short RefreshRateTableIndex,
402 struct vb_device_info *pVBInfo,
403 struct xgi_hw_device_info *HwDeviceExtension)
405 unsigned char index, data;
409 index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
410 index = index & IndexMask;
412 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
414 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
416 for (i = 0; i < 8; i++)
417 pVBInfo->TimingH.data[i]
418 = XGI_CRT1Table[index].CR[i];
420 for (i = 0; i < 7; i++)
421 pVBInfo->TimingV.data[i]
422 = XGI_CRT1Table[index].CR[i + 8];
424 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
426 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
428 if (pVBInfo->ModeType > 0x03)
429 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
432 /* --------------------------------------------------------------------- */
433 /* Function : XGI_SetXG21CRTC */
434 /* Input : Stand or enhance CRTC table */
435 /* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
436 /* Description : Set LCD timing */
437 /* --------------------------------------------------------------------- */
438 static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
439 unsigned short RefreshRateTableIndex,
440 struct vb_device_info *pVBInfo)
442 unsigned char index, Tempax, Tempbx, Tempcx, Tempdx;
443 unsigned short Temp1, Temp2, Temp3;
445 index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
446 /* Tempax: CR4 HRS */
447 Tempax = XGI_CRT1Table[index].CR[3];
448 Tempcx = Tempax; /* Tempcx: HRS */
450 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
452 Tempdx = XGI_CRT1Table[index].CR[5]; /* SRB */
453 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
454 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
455 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
456 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
458 Tempax = XGI_CRT1Table[index].CR[4]; /* CR5 HRE */
459 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
461 Tempbx = XGI_CRT1Table[index].CR[6]; /* SRC */
462 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
463 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
464 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
466 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
467 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
469 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
470 if (Tempax < Tempcx) /* HRE < HRS */
471 Temp2 |= 0x40; /* Temp2 + 0x40 */
474 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
475 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
476 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
477 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
478 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
479 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
480 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
483 Tempax = XGI_CRT1Table[index].CR[10];
484 Tempbx = Tempax; /* Tempbx: VRS */
485 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
486 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
488 Tempax = XGI_CRT1Table[index].CR[9];
489 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
490 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
491 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
492 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
493 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
495 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
496 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
497 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
499 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
500 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
502 Tempax = XGI_CRT1Table[index].CR[14];
503 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
505 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
506 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
508 /* Tempax: CR11 VRE */
509 Tempax = XGI_CRT1Table[index].CR[11];
510 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
512 Tempbx = XGI_CRT1Table[index].CR[14];
513 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
514 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
515 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
516 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
517 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
519 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
520 if (Tempax < Temp3) /* VRE < VRS */
521 Temp2 |= 0x20; /* VRE + 0x20 */
524 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
525 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
526 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
527 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
528 Tempbx = (unsigned char) Temp1;
529 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
531 /* SR3F D[7:2]->VRE D[1:0]->VRS */
532 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
535 static void XGI_SetXG27CRTC(unsigned short ModeNo,
536 unsigned short ModeIdIndex,
537 unsigned short RefreshRateTableIndex,
538 struct vb_device_info *pVBInfo)
540 unsigned short index, Tempax, Tempbx, Tempcx;
542 index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
543 /* Tempax: CR4 HRS */
544 Tempax = XGI_CRT1Table[index].CR[3];
545 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
547 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
550 Tempax = XGI_CRT1Table[index].CR[5];
551 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
552 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
554 Tempax = XGI_CRT1Table[index].CR[4]; /* CR5 HRE */
555 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
556 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
558 Tempax = XGI_CRT1Table[index].CR[6]; /* SRC */
559 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
560 Tempax <<= 3; /* Tempax[5]: HRE[5] */
561 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
563 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
564 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
566 /* Tempax: CR4 HRS */
567 Tempax = XGI_CRT1Table[index].CR[3];
568 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
569 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
570 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
572 Tempax = XGI_CRT1Table[index].CR[5]; /* SR0B */
573 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
574 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
575 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
576 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
577 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
578 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
581 Tempax = XGI_CRT1Table[index].CR[10];
582 /* SR34[7:0]->VRS[7:0] */
583 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
585 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
586 /* CR7[7][2] VRS[9][8] */
587 Tempax = XGI_CRT1Table[index].CR[9];
588 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
589 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
590 Tempax >>= 2; /* Tempax[0]: VRS[8] */
591 /* SR35[0]: VRS[8] */
592 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
593 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
594 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
596 Tempax = XGI_CRT1Table[index].CR[14];
597 Tempax &= 0x08; /* SR0A[3] VRS[10] */
598 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
600 /* Tempax: CR11 VRE */
601 Tempax = XGI_CRT1Table[index].CR[11];
602 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
604 Tempbx = XGI_CRT1Table[index].CR[14];
605 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
606 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
607 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
608 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
609 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
610 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
612 if (Tempbx <= Tempcx) /* VRE <= VRS */
613 Tempbx |= 0x20; /* VRE + 0x20 */
615 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
616 Tempax = (Tempbx << 2) & 0xFF;
617 /* SR3F[7:2]:VRE[5:0] */
618 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
619 Tempax = Tempcx >> 8;
620 /* SR35[2:0]:VRS[10:8] */
621 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
624 static void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
628 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
629 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
630 temp = (temp & 3) << 6;
631 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
632 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
633 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
634 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
638 static void xgifb_set_lcd(int chip_id,
639 struct vb_device_info *pVBInfo,
640 unsigned short RefreshRateTableIndex,
641 unsigned short ModeNo)
643 unsigned short Data, Temp;
644 unsigned short XGI_P3cc;
646 XGI_P3cc = pVBInfo->P3cc;
648 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
649 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
650 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
651 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
653 if (chip_id == XG27) {
654 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
655 if ((Temp & 0x03) == 0) { /* dual 12 */
656 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
657 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
661 if (chip_id == XG27) {
662 XGI_SetXG27FPBits(pVBInfo);
664 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
667 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40);
668 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
672 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
674 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
675 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
677 Data = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
680 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
683 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
686 /* --------------------------------------------------------------------- */
687 /* Function : XGI_UpdateXG21CRTC */
689 /* Output : CRT1 CRTC */
690 /* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
691 /* --------------------------------------------------------------------- */
692 static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
693 struct vb_device_info *pVBInfo,
694 unsigned short RefreshRateTableIndex)
698 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
699 if (ModeNo == 0x2E &&
700 (XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
703 else if (ModeNo == 0x2E && (XGI330_RefIndex[RefreshRateTableIndex].
704 Ext_CRT1CRTC == RES640x480x72))
706 else if (ModeNo == 0x2F)
708 else if (ModeNo == 0x50)
710 else if (ModeNo == 0x59)
714 xgifb_reg_set(pVBInfo->P3d4, 0x02,
715 XGI_UpdateCRT1Table[index].CR02);
716 xgifb_reg_set(pVBInfo->P3d4, 0x03,
717 XGI_UpdateCRT1Table[index].CR03);
718 xgifb_reg_set(pVBInfo->P3d4, 0x15,
719 XGI_UpdateCRT1Table[index].CR15);
720 xgifb_reg_set(pVBInfo->P3d4, 0x16,
721 XGI_UpdateCRT1Table[index].CR16);
725 static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
726 unsigned short ModeNo, unsigned short ModeIdIndex,
727 unsigned short RefreshRateTableIndex,
728 struct vb_device_info *pVBInfo)
730 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
734 resindex = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
736 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
737 tempax = XGI330_ModeResInfo[resindex].HTotal;
738 tempbx = XGI330_ModeResInfo[resindex].VTotal;
740 if (modeflag & HalfDCLK)
741 tempax = tempax >> 1;
743 if (modeflag & HalfDCLK)
744 tempax = tempax << 1;
746 temp = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
748 if (temp & InterlaceMode)
749 tempbx = tempbx >> 1;
751 if (modeflag & DoubleScanMode)
752 tempbx = tempbx << 1;
760 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
761 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
763 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
764 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
765 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
766 (unsigned short) ((tempcx & 0x0ff00) >> 10));
767 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
769 tempbx = tempbx >> 8;
777 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
778 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
785 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
786 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
789 static void XGI_SetCRT1Offset(unsigned short ModeNo,
790 unsigned short ModeIdIndex,
791 unsigned short RefreshRateTableIndex,
792 struct xgi_hw_device_info *HwDeviceExtension,
793 struct vb_device_info *pVBInfo)
795 unsigned short temp, ah, al, temp2, i, DisplayUnit;
798 temp = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeInfo;
800 temp = XGI330_ScreenOffset[temp];
802 temp2 = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
803 temp2 &= InterlaceMode;
808 temp2 = pVBInfo->ModeType - ModeEGA;
833 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
834 temp = temp * temp2 + temp2 / 2;
841 temp = temp >> 8; /* ah */
843 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
846 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
848 temp = (unsigned char) temp2;
849 temp &= 0xFF; /* al */
850 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
853 temp2 = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
854 temp2 &= InterlaceMode;
858 DisplayUnit = DisplayUnit << 5;
859 ah = (DisplayUnit & 0xff00) >> 8;
860 al = DisplayUnit & 0x00ff;
866 if (HwDeviceExtension->jChipType >= XG20)
867 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
870 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
873 static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
874 unsigned short ModeIdIndex,
875 unsigned short RefreshRateTableIndex,
876 struct xgi_hw_device_info *HwDeviceExtension,
877 struct vb_device_info *pVBInfo)
879 unsigned short CRT2Index, VCLKIndex;
880 unsigned short modeflag, resinfo;
883 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
884 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
885 CRT2Index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
887 if (pVBInfo->IF_DEF_LVDS == 0) {
888 CRT2Index = CRT2Index >> 6; /* for LCD */
889 if (pVBInfo->VBInfo &
890 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) { /*301b*/
891 if (pVBInfo->LCDResInfo != Panel_1024x768)
893 VCLKIndex = VCLK108_2_315 + 5;
895 VCLKIndex = VCLK65_315 + 2; /* LCDXlat1VCLK */
896 } else if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
897 if (pVBInfo->SetFlag & RPLLDIV2XO)
898 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLKDIV2;
900 VCLKIndex = TVCLKBASE_315_25 + HiTVVCLK;
902 if (pVBInfo->SetFlag & TVSimuMode) {
903 if (modeflag & Charx8Dot) {
904 VCLKIndex = TVCLKBASE_315_25 +
907 VCLKIndex = TVCLKBASE_315_25 +
913 if (pVBInfo->VBType & VB_SIS301LV) {
914 if (pVBInfo->SetFlag & RPLLDIV2XO)
915 VCLKIndex = YPbPr525iVCLK_2;
917 VCLKIndex = YPbPr525iVCLK;
919 } else if (pVBInfo->VBInfo & SetCRT2ToTV) {
920 if (pVBInfo->SetFlag & RPLLDIV2XO)
921 VCLKIndex = TVCLKBASE_315_25 + TVVCLKDIV2;
923 VCLKIndex = TVCLKBASE_315_25 + TVVCLK;
924 } else { /* for CRT2 */
926 VCLKIndex = XGI330_RefIndex[RefreshRateTableIndex].
928 VCLKIndex &= IndexMask;
930 } else if ((pVBInfo->LCDResInfo == Panel_800x600) ||
931 (pVBInfo->LCDResInfo == Panel_320x480)) { /* LVDS */
932 VCLKIndex = VCLK40; /* LVDSXlat1VCLK */
934 VCLKIndex = VCLK65_315 + 2; /* LVDSXlat2VCLK, LVDSXlat3VCLK */
940 static void XGI_SetCRT1VCLK(unsigned short ModeNo,
941 unsigned short ModeIdIndex,
942 struct xgi_hw_device_info *HwDeviceExtension,
943 unsigned short RefreshRateTableIndex,
944 struct vb_device_info *pVBInfo)
946 unsigned char index, data;
947 unsigned short vclkindex;
949 if (pVBInfo->IF_DEF_LVDS == 1) {
950 index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
951 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
952 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
953 xgifb_reg_set(pVBInfo->P3c4, 0x2B, XGI_VCLKData[index].SR2B);
954 xgifb_reg_set(pVBInfo->P3c4, 0x2C, XGI_VCLKData[index].SR2C);
955 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
956 } else if ((pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
957 | VB_SIS302LV | VB_XGI301C)) && (pVBInfo->VBInfo
958 & XGI_SetCRT2ToLCDA)) {
959 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
960 RefreshRateTableIndex, HwDeviceExtension,
962 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
963 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
964 data = XGI_VBVCLKData[vclkindex].Part4_A;
965 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
966 data = XGI_VBVCLKData[vclkindex].Part4_B;
967 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
968 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
970 index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
971 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
972 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
973 xgifb_reg_set(pVBInfo->P3c4, 0x2B, XGI_VCLKData[index].SR2B);
974 xgifb_reg_set(pVBInfo->P3c4, 0x2C, XGI_VCLKData[index].SR2C);
975 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
978 if (HwDeviceExtension->jChipType >= XG20) {
979 if (XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag &
981 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
982 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
983 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
990 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
995 static void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
999 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
1000 temp = (temp & 1) << 6;
1001 /* SR06[6] 18bit Dither */
1002 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
1003 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
1004 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
1008 static void XGI_SetCRT1FIFO(unsigned short ModeNo,
1009 struct xgi_hw_device_info *HwDeviceExtension,
1010 struct vb_device_info *pVBInfo)
1012 unsigned short data;
1014 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
1016 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
1018 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
1019 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
1021 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
1022 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
1024 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
1026 if (HwDeviceExtension->jChipType == XG21)
1027 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
1030 static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1031 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1032 struct vb_device_info *pVBInfo)
1034 unsigned short data, data2 = 0;
1037 unsigned char index;
1039 index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1041 VCLK = XGI_VCLKData[index].CLOCK;
1043 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
1046 data |= 0x0c; /* VCLK > 200 */
1048 if (HwDeviceExtension->jChipType >= XG20)
1049 data &= ~0x04; /* 2 pixel mode */
1051 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
1053 if (HwDeviceExtension->jChipType < XG20) {
1054 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
1058 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
1063 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
1064 if (HwDeviceExtension->jChipType >= XG27)
1065 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
1069 static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
1070 unsigned short ModeNo, unsigned short ModeIdIndex,
1071 unsigned short RefreshRateTableIndex,
1072 struct vb_device_info *pVBInfo)
1074 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1077 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1078 infoflag = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1080 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
1081 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
1086 data3 = pVBInfo->ModeType - ModeVGA;
1089 data &= InterlaceMode;
1094 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
1095 resindex = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
1096 xres = XGI330_ModeResInfo[resindex].HTotal; /* xres->ax */
1099 if (infoflag & InterlaceMode) {
1102 else if (xres == 1280)
1106 data2 = data & 0x00FF;
1107 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
1108 data2 = (data & 0xFF00) >> 8;
1109 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
1111 if (modeflag & HalfDCLK)
1112 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
1116 if (modeflag & LineCompareOff)
1119 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
1123 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
1125 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1128 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
1130 if (HwDeviceExtension->jChipType == XG27) {
1135 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1136 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
1137 } else if (HwDeviceExtension->jChipType >= XG20) {
1142 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1143 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
1149 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1154 static void XGI_WriteDAC(unsigned short dl,
1158 struct vb_device_info *pVBInfo)
1160 unsigned short temp, bh, bl;
1179 outb((unsigned short) dh, pVBInfo->P3c9);
1180 outb((unsigned short) bh, pVBInfo->P3c9);
1181 outb((unsigned short) bl, pVBInfo->P3c9);
1184 static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
1185 struct vb_device_info *pVBInfo)
1187 unsigned short data, data2, i, k, m, n, o, si, di, bx, dl, al, ah, dh;
1188 const unsigned short *table = XGINew_VGA_DAC;
1190 outb(0xFF, pVBInfo->P3c6);
1191 outb(0x00, pVBInfo->P3c8);
1193 for (i = 0; i < 16; i++) {
1196 for (k = 0; k < 3; k++) {
1205 outb(data2, pVBInfo->P3c9);
1210 for (i = 16; i < 32; i++) {
1213 for (k = 0; k < 3; k++)
1214 outb(data, pVBInfo->P3c9);
1219 for (m = 0; m < 9; m++) {
1224 for (n = 0; n < 3; n++) {
1225 for (o = 0; o < 5; o++) {
1230 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1235 for (o = 0; o < 3; o++) {
1240 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1250 static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1251 unsigned short ModeIdIndex,
1252 struct vb_device_info *pVBInfo)
1254 unsigned short resindex, xres, yres, modeflag;
1256 /* si+Ext_ResInfo */
1257 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
1259 /* si+Ext_ResInfo */
1260 resindex = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
1262 xres = XGI330_ModeResInfo[resindex].HTotal;
1263 yres = XGI330_ModeResInfo[resindex].VTotal;
1265 if (modeflag & HalfDCLK)
1268 if (modeflag & DoubleScanMode)
1274 pVBInfo->VGAHDE = xres;
1275 pVBInfo->HDE = xres;
1276 pVBInfo->VGAVDE = yres;
1277 pVBInfo->VDE = yres;
1280 static void const *XGI_GetLcdPtr(struct XGI330_LCDDataTablStruct const *table,
1281 unsigned short ModeNo,
1282 unsigned short ModeIdIndex,
1283 unsigned short RefreshRateTableIndex,
1284 struct vb_device_info *pVBInfo)
1286 unsigned short i, tempdx, tempbx, modeflag;
1290 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1294 while (table[i].PANELID != 0xff) {
1295 tempdx = pVBInfo->LCDResInfo;
1296 if (tempbx & 0x0080) { /* OEMUtil */
1297 tempbx &= (~0x0080);
1298 tempdx = pVBInfo->LCDTypeInfo;
1301 if (pVBInfo->LCDInfo & EnableScalingLCD)
1302 tempdx &= (~PanelResInfo);
1304 if (table[i].PANELID == tempdx) {
1305 tempbx = table[i].MASK;
1306 tempdx = pVBInfo->LCDInfo;
1308 if (modeflag & HalfDCLK)
1309 tempdx |= SetLCDLowResolution;
1312 if (tempbx == table[i].CAP)
1318 return table[i].DATAPTR;
1321 static struct SiS_TVData const *XGI_GetTVPtr(unsigned short ModeNo,
1322 unsigned short ModeIdIndex,
1323 unsigned short RefreshRateTableIndex,
1324 struct vb_device_info *pVBInfo)
1326 unsigned short i, tempdx, tempal, modeflag;
1328 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1329 tempal = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
1330 tempal = tempal & 0x3f;
1331 tempdx = pVBInfo->TVInfo;
1333 if (pVBInfo->VBInfo & SetInSlaveMode)
1334 tempdx = tempdx | SetTVLockMode;
1336 if (modeflag & HalfDCLK)
1337 tempdx = tempdx | SetTVLowResolution;
1341 while (XGI_TVDataTable[i].MASK != 0xffff) {
1342 if ((tempdx & XGI_TVDataTable[i].MASK) ==
1343 XGI_TVDataTable[i].CAP)
1348 return &XGI_TVDataTable[i].DATAPTR[tempal];
1351 static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
1352 unsigned short RefreshRateTableIndex,
1353 struct vb_device_info *pVBInfo)
1355 struct SiS_LVDSData const *LCDPtr;
1357 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
1360 LCDPtr = XGI_GetLcdPtr(XGI_EPLLCDDataPtr, ModeNo, ModeIdIndex,
1361 RefreshRateTableIndex, pVBInfo);
1362 pVBInfo->VGAHT = LCDPtr->VGAHT;
1363 pVBInfo->VGAVT = LCDPtr->VGAVT;
1364 pVBInfo->HT = LCDPtr->LCDHT;
1365 pVBInfo->VT = LCDPtr->LCDVT;
1367 if (pVBInfo->LCDInfo & (SetLCDtoNonExpanding | EnableScalingLCD))
1370 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1371 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
1372 pVBInfo->HDE = 1024;
1374 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
1375 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
1376 pVBInfo->HDE = 1280;
1377 pVBInfo->VDE = 1024;
1378 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
1379 pVBInfo->HDE = 1400;
1380 pVBInfo->VDE = 1050;
1382 pVBInfo->HDE = 1600;
1383 pVBInfo->VDE = 1200;
1387 static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
1388 unsigned short RefreshRateTableIndex,
1389 struct xgi_hw_device_info *HwDeviceExtension,
1390 struct vb_device_info *pVBInfo)
1392 unsigned char index;
1394 struct XGI_LVDSCRT1HDataStruct const *LCDPtr = NULL;
1395 struct XGI_LVDSCRT1VDataStruct const *LCDPtr1 = NULL;
1397 index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
1398 index = index & IndexMask;
1400 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
1401 LCDPtr = XGI_GetLcdPtr(xgifb_epllcd_crt1_h, ModeNo, ModeIdIndex,
1402 RefreshRateTableIndex, pVBInfo);
1404 for (i = 0; i < 8; i++)
1405 pVBInfo->TimingH.data[i] = LCDPtr[0].Reg[i];
1408 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
1410 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
1411 LCDPtr1 = XGI_GetLcdPtr(xgifb_epllcd_crt1_v, ModeNo,
1412 ModeIdIndex, RefreshRateTableIndex,
1414 for (i = 0; i < 7; i++)
1415 pVBInfo->TimingV.data[i] = LCDPtr1[0].Reg[i];
1418 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
1421 static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
1423 unsigned char tempal, tempah, tempbl, i;
1425 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
1426 tempal = tempah & 0x0F;
1427 tempah = tempah & 0xF0;
1429 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1431 while (tempbl != 0xFF) {
1432 if (tempbl & 0x80) { /* OEMUtil */
1434 tempbl = tempbl & ~(0x80);
1437 if (tempal == tempbl)
1442 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1448 static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
1450 unsigned short tempah, tempal, tempbl, i;
1452 tempal = pVBInfo->LCDResInfo;
1453 tempah = pVBInfo->LCDTypeInfo;
1456 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1458 while (tempbl != 0xFF) {
1459 if ((tempbl & 0x80) && (tempbl != 0x80)) {
1464 if (tempal == tempbl)
1468 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
1471 if (tempbl == 0xFF) {
1472 pVBInfo->LCDResInfo = Panel_1024x768;
1473 pVBInfo->LCDTypeInfo = 0;
1480 static void XGI_GetLCDSync(unsigned short *HSyncWidth,
1481 unsigned short *VSyncWidth,
1482 struct vb_device_info *pVBInfo)
1484 unsigned short Index;
1486 Index = XGI_GetLCDCapPtr(pVBInfo);
1487 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
1488 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
1493 static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
1494 unsigned short RefreshRateTableIndex,
1495 struct vb_device_info *pVBInfo)
1497 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
1498 unsigned long temp, temp1, temp2, temp3, push3;
1499 struct XGI_LCDDesStruct const *LCDPtr = NULL;
1500 struct XGI330_LCDDataDesStruct2 const *LCDPtr1 = NULL;
1502 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1503 if (pVBInfo->LCDInfo & EnableScalingLCD)
1504 LCDPtr1 = XGI_GetLcdPtr(XGI_EPLLCDDesDataPtr, ModeNo,
1505 ModeIdIndex, RefreshRateTableIndex,
1508 LCDPtr = XGI_GetLcdPtr(XGI_EPLLCDDesDataPtr, ModeNo,
1509 ModeIdIndex, RefreshRateTableIndex,
1512 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
1517 if ((pVBInfo->LCDResInfo == Panel_1024x768) ||
1518 (pVBInfo->LCDResInfo == Panel_1024x768x75)) {
1521 } else if ((pVBInfo->LCDResInfo == Panel_1280x1024) ||
1522 (pVBInfo->LCDResInfo == Panel_1280x1024x75)) {
1525 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
1533 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
1534 pVBInfo->HDE = tempax;
1535 pVBInfo->VDE = tempbx;
1536 pVBInfo->VGAHDE = tempax;
1537 pVBInfo->VGAVDE = tempbx;
1540 tempax = pVBInfo->HT;
1542 if (pVBInfo->LCDInfo & EnableScalingLCD)
1543 tempbx = LCDPtr1->LCDHDES;
1545 tempbx = LCDPtr->LCDHDES;
1547 tempcx = pVBInfo->HDE;
1548 tempbx = tempbx & 0x0fff;
1551 if (tempcx >= tempax)
1554 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
1556 tempcx = tempcx >> 3;
1557 tempbx = tempbx >> 3;
1559 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
1560 (unsigned short) (tempbx & 0xff));
1561 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
1562 (unsigned short) (tempcx & 0xff));
1564 tempax = pVBInfo->HT;
1566 if (pVBInfo->LCDInfo & EnableScalingLCD)
1567 tempbx = LCDPtr1->LCDHRS;
1569 tempbx = LCDPtr->LCDHRS;
1573 if (pVBInfo->LCDInfo & EnableScalingLCD)
1574 tempcx = LCDPtr1->LCDHSync;
1578 if (tempcx >= tempax)
1581 tempax = tempbx & 0x07;
1582 tempax = tempax >> 5;
1583 tempcx = tempcx >> 3;
1584 tempbx = tempbx >> 3;
1589 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
1590 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
1591 (unsigned short) (tempbx & 0xff));
1593 tempax = pVBInfo->VT;
1594 if (pVBInfo->LCDInfo & EnableScalingLCD)
1595 tempbx = LCDPtr1->LCDVDES;
1597 tempbx = LCDPtr->LCDVDES;
1598 tempcx = pVBInfo->VDE;
1600 tempbx = tempbx & 0x0fff;
1602 if (tempcx >= tempax)
1605 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
1606 (unsigned short) (tempbx & 0xff));
1607 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
1608 (unsigned short) (tempcx & 0xff));
1610 tempbx = (tempbx >> 8) & 0x07;
1611 tempcx = (tempcx >> 8) & 0x07;
1613 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
1614 (unsigned short) ((tempcx << 3)
1617 tempax = pVBInfo->VT;
1618 if (pVBInfo->LCDInfo & EnableScalingLCD)
1619 tempbx = LCDPtr1->LCDVRS;
1621 tempbx = LCDPtr->LCDVRS;
1625 if (pVBInfo->LCDInfo & EnableScalingLCD)
1626 tempcx = LCDPtr1->LCDVSync;
1629 if (tempcx >= tempax)
1632 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
1633 (unsigned short) (tempbx & 0xff));
1634 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
1635 (unsigned short) (tempcx & 0x0f));
1637 tempax = ((tempbx >> 8) & 0x07) << 3;
1639 tempbx = pVBInfo->VGAVDE;
1640 if (tempbx != pVBInfo->VDE)
1643 if (pVBInfo->LCDInfo & XGI_EnableLVDSDDA)
1646 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
1649 tempcx = pVBInfo->VGAVT;
1650 tempbx = pVBInfo->VDE;
1651 tempax = pVBInfo->VGAVDE;
1654 temp = tempax; /* 0430 ylshieh */
1655 temp1 = (temp << 18) / tempbx;
1657 tempdx = (unsigned short) ((temp << 18) % tempbx);
1665 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
1666 (unsigned short) (temp2 & 0xff));
1667 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
1668 (unsigned short) ((temp2 >> 8) & 0xff));
1670 tempbx = (unsigned short) (temp2 >> 16);
1671 tempax = tempbx & 0x03;
1673 tempbx = pVBInfo->VGAVDE;
1674 if (tempbx == pVBInfo->VDE)
1677 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
1679 if (pVBInfo->VBType & VB_XGI301C) {
1681 xgifb_reg_set(pVBInfo->Part4Port,
1683 (unsigned short) (temp2 & 0xff));
1684 xgifb_reg_set(pVBInfo->Part4Port,
1686 (unsigned short) ((temp2 >> 8) &
1688 tempbx = (unsigned short) (temp2 >> 16);
1689 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
1691 (unsigned short) ((tempbx &
1694 tempcx = pVBInfo->VGAVDE;
1695 if (tempcx == pVBInfo->VDE)
1696 xgifb_reg_and_or(pVBInfo->Part4Port,
1699 xgifb_reg_and_or(pVBInfo->Part4Port,
1703 tempcx = pVBInfo->VGAHDE;
1704 tempbx = pVBInfo->HDE;
1706 temp1 = tempcx << 16;
1708 tempax = (unsigned short) (temp1 / tempbx);
1710 if ((tempbx & 0xffff) == (tempcx & 0xffff))
1714 temp1 = pVBInfo->VGAHDE << 16;
1717 temp3 = temp3 << 16;
1720 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
1722 tempax = (unsigned short) (temp3 & 0xff);
1723 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
1725 temp1 = pVBInfo->VGAVDE << 18;
1726 temp1 = temp1 / push3;
1727 tempbx = (unsigned short) (temp1 & 0xffff);
1729 if (pVBInfo->LCDResInfo == Panel_1024x768)
1732 tempax = ((tempbx >> 8) & 0xff) << 3;
1733 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
1734 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
1735 (unsigned short) (tempax & 0xff));
1736 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
1737 (unsigned short) (tempbx & 0xff));
1739 temp3 = temp3 >> 16;
1741 if (modeflag & HalfDCLK)
1744 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
1745 (unsigned short) ((temp3 >> 8) & 0xff));
1746 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
1747 (unsigned short) (temp3 & 0xff));
1750 /* --------------------------------------------------------------------- */
1751 /* Function : XGI_GETLCDVCLKPtr */
1753 /* Output : al -> VCLK Index */
1755 /* --------------------------------------------------------------------- */
1756 static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
1757 struct vb_device_info *pVBInfo)
1759 unsigned short index;
1761 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
1762 index = XGI_GetLCDCapPtr1(pVBInfo);
1764 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
1765 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
1766 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
1768 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
1769 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
1775 static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
1776 unsigned short ModeNo, unsigned short ModeIdIndex,
1777 struct vb_device_info *pVBInfo)
1780 unsigned short index, modeflag;
1781 unsigned char tempal;
1783 /* si+Ext_ResInfo */
1784 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1786 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
1787 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
1788 index = XGI_GetLCDCapPtr(pVBInfo);
1789 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
1791 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
1795 if (pVBInfo->VBType &
1801 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
1802 tempal = TVCLKBASE_315 + HiTVVCLKDIV2;
1803 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
1804 tempal = TVCLKBASE_315 + HiTVVCLK;
1805 if (pVBInfo->TVInfo & TVSimuMode) {
1806 tempal = TVCLKBASE_315 + HiTVSimuVCLK;
1807 if (!(modeflag & Charx8Dot))
1808 tempal = TVCLKBASE_315 +
1815 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
1816 tempal = XGI_YPbPr750pVCLK;
1820 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
1821 tempal = YPbPr525pVCLK;
1825 tempal = NTSC1024VCLK;
1827 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
1828 tempal = TVCLKBASE_315 + TVVCLKDIV2;
1829 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
1830 tempal = TVCLKBASE_315 + TVVCLK;
1833 if (pVBInfo->VBInfo & SetCRT2ToTV)
1838 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
1839 tempal = tempal >> 2;
1842 /* for Dot8 Scaling LCD */
1843 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
1844 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
1846 tempal = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1850 static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
1851 unsigned char *di_1, struct vb_device_info *pVBInfo)
1853 if (pVBInfo->VBType & (VB_SIS301 | VB_SIS301B | VB_SIS302B
1854 | VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
1855 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
1856 (pVBInfo->SetFlag & ProgrammingCRT2)) {
1857 *di_0 = XGI_VBVCLKData[tempal].Part4_A;
1858 *di_1 = XGI_VBVCLKData[tempal].Part4_B;
1861 *di_0 = XGI_VCLKData[tempal].SR2B;
1862 *di_1 = XGI_VCLKData[tempal].SR2C;
1866 static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
1867 unsigned short RefreshRateTableIndex,
1868 struct vb_device_info *pVBInfo)
1870 unsigned char di_0, di_1, tempal;
1873 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
1875 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
1876 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
1878 for (i = 0; i < 4; i++) {
1879 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
1880 (unsigned short) (0x10 * i));
1881 if ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
1882 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
1883 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
1884 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
1886 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
1887 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
1892 static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
1893 struct vb_device_info *pVBInfo)
1895 unsigned short tempcl, tempch, temp, tempbl, tempax;
1897 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
1898 | VB_SIS302LV | VB_XGI301C)) {
1901 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
1903 if (!(temp & 0x20)) {
1904 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
1906 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
1908 tempcl |= ActiveCRT1;
1912 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
1915 if (!(temp == 0x08)) {
1916 /* Check ChannelA */
1917 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
1919 tempcl = tempcl | ActiveLCD;
1923 if (!(tempcl & ActiveLCD))
1925 tempcl |= ActiveCRT2;
1928 tempcl |= ActiveLCD;
1931 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
1934 tempch |= ActiveAVideo;
1937 tempch |= ActiveSVideo;
1940 tempch |= ActiveSCART;
1942 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
1944 tempch |= ActiveHiTV;
1947 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
1948 temp = xgifb_reg_get(
1953 tempch |= ActiveYPbPr;
1961 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
1962 if (tempcl & ActiveLCD) {
1963 if ((pVBInfo->SetFlag & ReserveTVOption)) {
1964 if (temp & ActiveTV)
1969 tempbl = ~XGI_ModeSwitchStatus;
1970 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
1972 if (!(pVBInfo->SetFlag & ReserveTVOption))
1973 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
1979 void XGI_GetVBType(struct vb_device_info *pVBInfo)
1981 unsigned short flag, tempbx, tempah;
1983 if (pVBInfo->IF_DEF_LVDS != 0)
1986 tempbx = VB_SIS302B;
1987 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
1992 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
1996 tempbx = VB_SIS301B;
1998 goto bigger_than_0xB0;
2000 tempbx = VB_XGI301C;
2002 goto bigger_than_0xB0;
2004 tempbx = VB_SIS301LV;
2006 goto bigger_than_0xB0;
2008 tempbx = VB_SIS302LV;
2009 tempah = xgifb_reg_get(pVBInfo->Part4Port, 0x39);
2011 tempbx = VB_XGI301C;
2014 if (tempbx & (VB_SIS301B | VB_SIS302B)) {
2015 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x23);
2017 tempbx = tempbx | VB_NoLCD;
2021 pVBInfo->VBType = tempbx;
2024 static void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
2025 struct xgi_hw_device_info *HwDeviceExtension,
2026 struct vb_device_info *pVBInfo)
2028 unsigned short tempax, push, tempbx, temp, modeflag;
2030 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2031 pVBInfo->SetFlag = 0;
2032 pVBInfo->ModeType = modeflag & ModeTypeMask;
2035 if (!(pVBInfo->VBType & 0xFFFF))
2038 /* Check Display Device */
2039 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
2040 tempbx = tempbx | temp;
2041 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
2045 tempbx = tempbx | tempax;
2046 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr525750 | XGI_SetCRT2ToLCDA
2047 | SetInSlaveMode | DisableCRT2Display);
2048 temp = 0xFFFF ^ temp;
2051 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
2053 if (pVBInfo->IF_DEF_LVDS == 0) {
2054 if (pVBInfo->VBType &
2059 if (temp & EnableDualEdge) {
2060 tempbx |= SetCRT2ToDualEdge;
2061 if (temp & SetToLCDA)
2062 tempbx |= XGI_SetCRT2ToLCDA;
2067 if (pVBInfo->IF_DEF_YPbPr == 1) {
2068 if (((pVBInfo->IF_DEF_LVDS == 0) &&
2069 ((pVBInfo->VBType & VB_SIS301LV) ||
2070 (pVBInfo->VBType & VB_SIS302LV) ||
2071 (pVBInfo->VBType & VB_XGI301C)))) {
2072 if (temp & SetYPbPr) {
2073 if (pVBInfo->IF_DEF_HiVision == 1) {
2074 /* shampoo add for new
2076 temp = xgifb_reg_get(
2080 tempbx |= SetCRT2ToHiVision;
2082 if (temp != YPbPrMode1080i) {
2084 (~SetCRT2ToHiVision);
2086 SetCRT2ToYPbPr525750;
2093 tempax = push; /* restore CR31 */
2095 if (pVBInfo->IF_DEF_LVDS == 0) {
2096 if (pVBInfo->IF_DEF_YPbPr == 1) {
2097 if (pVBInfo->IF_DEF_HiVision == 1)
2101 } else if (pVBInfo->IF_DEF_HiVision == 1) {
2106 } else { /* 3rd party chip */
2107 temp = SetCRT2ToLCD;
2110 if (!(tempbx & temp)) {
2111 tempax |= DisableCRT2Display;
2115 if (!(pVBInfo->VBType & VB_NoLCD)) {
2116 if (tempbx & XGI_SetCRT2ToLCDA) {
2117 if (tempbx & SetSimuScanMode)
2118 tempbx &= (~(SetCRT2ToLCD |
2122 tempbx &= (~(SetCRT2ToLCD |
2130 /* for driver abnormal */
2131 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode))) {
2132 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
2133 if (tempbx & SetCRT2ToRAMDAC) {
2138 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
2141 tempbx &= (~(SetCRT2ToRAMDAC |
2147 if (!(pVBInfo->VBType & VB_NoLCD)) {
2148 if (tempbx & SetCRT2ToLCD) {
2153 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
2157 if (tempbx & SetCRT2ToSCART) {
2162 tempbx &= (0x00FF | (~SetCRT2ToYPbPr525750));
2165 if (pVBInfo->IF_DEF_YPbPr == 1) {
2166 if (tempbx & SetCRT2ToYPbPr525750)
2172 if (pVBInfo->IF_DEF_HiVision == 1) {
2173 if (tempbx & SetCRT2ToHiVision)
2180 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
2181 if (!(tempbx & (SwitchCRT2 | SetSimuScanMode)))
2182 tempbx = DisableCRT2Display;
2185 if (!(tempbx & DisableCRT2Display)) {
2186 if ((!(tempbx & DriverMode)) ||
2187 (!(modeflag & CRT2Mode))) {
2188 if (!(tempbx & XGI_SetCRT2ToLCDA))
2189 tempbx |= (SetInSlaveMode |
2193 /* LCD+TV can't support in slave mode
2194 * (Force LCDA+TV->LCDB) */
2195 if ((tempbx & SetInSlaveMode) &&
2196 (tempbx & XGI_SetCRT2ToLCDA)) {
2197 tempbx ^= (SetCRT2ToLCD |
2200 pVBInfo->SetFlag |= ReserveTVOption;
2204 pVBInfo->VBInfo = tempbx;
2207 static void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
2208 struct vb_device_info *pVBInfo)
2210 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
2215 if (pVBInfo->VBInfo & SetCRT2ToTV) {
2216 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2217 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
2219 if (pVBInfo->VBInfo & SetCRT2ToTV) {
2220 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
2222 if (tempbx & TVSetPAL) {
2223 tempbx &= (SetCHTVOverScan |
2227 if (tempbx & TVSetPALM)
2228 /* set to NTSC if PAL-M */
2229 tempbx &= ~TVSetPAL;
2231 tempbx &= (SetCHTVOverScan |
2236 if (pVBInfo->IF_DEF_LVDS == 0) {
2237 if (pVBInfo->VBInfo & SetCRT2ToSCART)
2241 if (pVBInfo->IF_DEF_YPbPr == 1) {
2242 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
2243 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
2244 index1 &= YPbPrMode;
2246 if (index1 == YPbPrMode525i)
2247 tempbx |= TVSetYPbPr525i;
2249 if (index1 == YPbPrMode525p)
2250 tempbx = tempbx | TVSetYPbPr525p;
2251 if (index1 == YPbPrMode750p)
2252 tempbx = tempbx | TVSetYPbPr750p;
2256 if (pVBInfo->IF_DEF_HiVision == 1) {
2257 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
2258 tempbx = tempbx | TVSetHiVision | TVSetPAL;
2261 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
2262 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
2263 (!(pVBInfo->VBInfo & SetNotSimuMode)))
2264 tempbx |= TVSimuMode;
2266 if (!(tempbx & TVSetPAL) &&
2268 (resinfo == 8)) /* NTSC 1024x768, */
2269 tempbx |= NTSC1024x768;
2271 tempbx |= RPLLDIV2XO;
2273 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
2274 if (pVBInfo->VBInfo & SetInSlaveMode)
2275 tempbx &= (~RPLLDIV2XO);
2277 (TVSetYPbPr525p | TVSetYPbPr750p)) {
2278 tempbx &= (~RPLLDIV2XO);
2279 } else if (!(pVBInfo->VBType &
2285 if (tempbx & TVSimuMode)
2286 tempbx &= (~RPLLDIV2XO);
2290 pVBInfo->TVInfo = tempbx;
2293 static unsigned char XGI_GetLCDInfo(unsigned short ModeNo,
2294 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
2296 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
2298 pVBInfo->LCDResInfo = 0;
2299 pVBInfo->LCDTypeInfo = 0;
2300 pVBInfo->LCDInfo = 0;
2302 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2303 /* si+Ext_ResInfo // */
2304 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
2305 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
2306 tempbx = temp & 0x0F;
2309 tempbx = Panel_1024x768; /* default */
2312 if ((tempbx == Panel_1024x768) || (tempbx == Panel_1280x1024)) {
2313 if (pVBInfo->VBInfo & DriverMode) {
2314 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
2315 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
2318 tempax = tempax >> 4;
2320 if ((resinfo == 6) || (resinfo == 9)) {
2322 tempbx |= PanelRef75Hz;
2323 } else if ((resinfo == 7) || (resinfo == 8)) {
2325 tempbx |= PanelRef75Hz;
2330 pVBInfo->LCDResInfo = tempbx;
2334 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
2339 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
2341 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
2345 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
2347 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
2349 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
2350 if (((pVBInfo->VBType & VB_SIS302LV) || (pVBInfo->VBType
2351 & VB_XGI301C)) && (tempax & XGI_LCDDualLink)) {
2352 tempbx |= SetLCDDualLink;
2356 if (pVBInfo->IF_DEF_LVDS == 0) {
2357 if ((pVBInfo->LCDResInfo == Panel_1400x1050) && (pVBInfo->VBInfo
2358 & SetCRT2ToLCD) && (resinfo == 9) &&
2359 (!(tempbx & EnableScalingLCD)))
2361 * set to center in 1280x1024 LCDB
2362 * for Panel_1400x1050
2364 tempbx |= SetLCDtoNonExpanding;
2367 if (pVBInfo->VBInfo & SetInSlaveMode) {
2368 if (pVBInfo->VBInfo & SetNotSimuMode)
2369 tempbx |= XGI_LCDVESATiming;
2371 tempbx |= XGI_LCDVESATiming;
2374 pVBInfo->LCDInfo = tempbx;
2379 unsigned char XGI_SearchModeID(unsigned short ModeNo,
2380 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
2382 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
2383 if (XGI330_EModeIDTable[*ModeIdIndex].Ext_ModeID == ModeNo)
2385 if (XGI330_EModeIDTable[*ModeIdIndex].Ext_ModeID == 0xFF)
2392 static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
2394 unsigned char ujRet = 0;
2395 unsigned char i = 0;
2397 for (i = 0; i < 8; i++) {
2399 ujRet |= (ujDate >> i) & 1;
2405 /*----------------------------------------------------------------------------*/
2407 /* bl[5] : LVDS signal */
2408 /* bl[1] : LVDS backlight */
2409 /* bl[0] : LVDS VDD */
2410 /*----------------------------------------------------------------------------*/
2411 static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
2413 unsigned char CR4A, temp;
2415 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2416 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
2418 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
2420 temp = XG21GPIODataTransfer(temp);
2422 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
2426 /*----------------------------------------------------------------------------*/
2428 /* bl[5] : LVDS signal */
2429 /* bl[1] : LVDS backlight */
2430 /* bl[0] : LVDS VDD */
2431 /*----------------------------------------------------------------------------*/
2432 static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
2434 unsigned char CR4A, CRB4, temp;
2436 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2437 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
2439 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
2443 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
2444 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
2445 temp |= ((CRB4 & 0x04) << 3);
2449 /*----------------------------------------------------------------------------*/
2451 /* bl[5] : 1;LVDS signal on */
2452 /* bl[1] : 1;LVDS backlight on */
2453 /* bl[0] : 1:LVDS VDD on */
2454 /* bh: 100000b : clear bit 5, to set bit5 */
2455 /* 000010b : clear bit 1, to set bit1 */
2456 /* 000001b : clear bit 0, to set bit0 */
2457 /*----------------------------------------------------------------------------*/
2458 static void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
2459 struct vb_device_info *pVBInfo)
2461 unsigned char CR4A, temp;
2463 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2466 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
2468 if (tempbh & 0x20) {
2469 temp = (tempbl >> 4) & 0x02;
2472 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
2476 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
2478 temp = XG21GPIODataTransfer(temp);
2481 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
2484 static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
2485 struct vb_device_info *pVBInfo)
2487 unsigned char CR4A, temp;
2488 unsigned short tempbh0, tempbl0;
2497 if (tempbh & 0x20) {
2498 temp = (tempbl >> 4) & 0x02;
2501 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
2504 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
2506 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
2510 tempbl <<= 2; /* GPIOC,GPIOD */
2511 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
2512 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
2515 static void XGI_DisplayOn(struct xgifb_video_info *xgifb_info,
2516 struct xgi_hw_device_info *pXGIHWDE,
2517 struct vb_device_info *pVBInfo)
2520 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
2521 if (pXGIHWDE->jChipType == XG21) {
2522 if (pVBInfo->IF_DEF_LVDS == 1) {
2523 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
2525 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
2526 mdelay(xgifb_info->lvds_data.PSC_S2);
2528 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
2529 /* LVDS signal on */
2530 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
2531 mdelay(xgifb_info->lvds_data.PSC_S3);
2532 /* LVDS backlight on */
2533 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
2535 /* DVO/DVI signal on */
2536 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
2541 if (pXGIHWDE->jChipType == XG27) {
2542 if (pVBInfo->IF_DEF_LVDS == 1) {
2543 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
2545 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
2546 mdelay(xgifb_info->lvds_data.PSC_S2);
2548 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
2549 /* LVDS signal on */
2550 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
2551 mdelay(xgifb_info->lvds_data.PSC_S3);
2552 /* LVDS backlight on */
2553 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
2555 /* DVO/DVI signal on */
2556 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
2562 void XGI_DisplayOff(struct xgifb_video_info *xgifb_info,
2563 struct xgi_hw_device_info *pXGIHWDE,
2564 struct vb_device_info *pVBInfo)
2567 if (pXGIHWDE->jChipType == XG21) {
2568 if (pVBInfo->IF_DEF_LVDS == 1) {
2569 /* LVDS backlight off */
2570 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
2571 mdelay(xgifb_info->lvds_data.PSC_S3);
2573 /* DVO/DVI signal off */
2574 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
2578 if (pXGIHWDE->jChipType == XG27) {
2579 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
2580 /* LVDS backlight off */
2581 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
2582 mdelay(xgifb_info->lvds_data.PSC_S3);
2585 if (pVBInfo->IF_DEF_LVDS == 0)
2586 /* DVO/DVI signal off */
2587 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
2590 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
2593 static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
2595 while ((inb(pVBInfo->P3da) & 0x01))
2598 while (!(inb(pVBInfo->P3da) & 0x01))
2602 static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
2604 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
2607 static void XGI_SaveCRT2Info(unsigned short ModeNo,
2608 struct vb_device_info *pVBInfo)
2610 unsigned short temp1, temp2;
2612 /* reserve CR34 for CRT1 Mode No */
2613 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
2614 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
2615 temp2 = ~(SetInSlaveMode >> 8);
2616 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
2619 static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
2620 unsigned short ModeIdIndex,
2621 struct vb_device_info *pVBInfo)
2623 unsigned short xres, yres, modeflag, resindex;
2625 resindex = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
2626 xres = XGI330_ModeResInfo[resindex].HTotal; /* xres->ax */
2627 yres = XGI330_ModeResInfo[resindex].VTotal; /* yres->bx */
2628 /* si+St_ModeFlag */
2629 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2631 if (modeflag & HalfDCLK)
2634 if (modeflag & DoubleScanMode)
2637 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
2640 if (pVBInfo->IF_DEF_LVDS == 0) {
2641 if (pVBInfo->LCDResInfo == Panel_1600x1200) {
2642 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
2648 if (pVBInfo->LCDResInfo == Panel_1280x1024) {
2651 else if (yres == 350)
2654 if (pVBInfo->LCDInfo & XGI_LCDVESATiming) {
2660 if (pVBInfo->LCDResInfo == Panel_1024x768) {
2661 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
2662 if (!(pVBInfo->LCDInfo & LCDNonExpanding)) {
2665 else if (yres == 400)
2667 else if (yres == 480)
2678 pVBInfo->VGAHDE = xres;
2679 pVBInfo->HDE = xres;
2680 pVBInfo->VGAVDE = yres;
2681 pVBInfo->VDE = yres;
2684 static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
2687 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) &&
2688 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
2694 static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
2695 unsigned short ModeIdIndex,
2696 unsigned short RefreshRateTableIndex,
2697 struct vb_device_info *pVBInfo)
2699 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
2702 pVBInfo->RVBHCMAX = 1;
2703 pVBInfo->RVBHCFACT = 1;
2704 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2705 CRT1Index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
2706 CRT1Index &= IndexMask;
2707 temp1 = (unsigned short) XGI_CRT1Table[CRT1Index].CR[0];
2708 temp2 = (unsigned short) XGI_CRT1Table[CRT1Index].CR[5];
2709 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
2710 tempbx = (unsigned short) XGI_CRT1Table[CRT1Index].CR[8];
2711 tempcx = (unsigned short)
2712 XGI_CRT1Table[CRT1Index].CR[14] << 8;
2714 tempcx = tempcx << 2;
2716 temp1 = (unsigned short) XGI_CRT1Table[CRT1Index].CR[9];
2725 if (modeflag & Charx8Dot)
2730 pVBInfo->VGAHT = tempax;
2731 pVBInfo->HT = tempax;
2733 pVBInfo->VGAVT = tempbx;
2734 pVBInfo->VT = tempbx;
2737 static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
2738 unsigned short RefreshRateTableIndex,
2739 struct vb_device_info *pVBInfo)
2741 unsigned short tempax = 0, tempbx = 0, modeflag, resinfo;
2743 struct SiS_LCDData const *LCDPtr = NULL;
2745 /* si+Ext_ResInfo */
2746 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2747 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
2748 pVBInfo->NewFlickerMode = 0;
2749 pVBInfo->RVBHRS = 50;
2751 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
2752 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
2757 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
2758 LCDPtr = XGI_GetLcdPtr(XGI_LCDDataTable, ModeNo, ModeIdIndex,
2759 RefreshRateTableIndex, pVBInfo);
2761 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
2762 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
2763 pVBInfo->VGAHT = LCDPtr->VGAHT;
2764 pVBInfo->VGAVT = LCDPtr->VGAVT;
2765 pVBInfo->HT = LCDPtr->LCDHT;
2766 pVBInfo->VT = LCDPtr->LCDVT;
2768 if (pVBInfo->LCDResInfo == Panel_1024x768) {
2772 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
2773 if (pVBInfo->VGAVDE == 357)
2775 else if (pVBInfo->VGAVDE == 420)
2777 else if (pVBInfo->VGAVDE == 525)
2779 else if (pVBInfo->VGAVDE == 600)
2785 } else if (pVBInfo->LCDResInfo == Panel_1024x768x75) {
2788 } else if (pVBInfo->LCDResInfo == Panel_1280x1024) {
2790 if (pVBInfo->VGAVDE == 360)
2792 else if (pVBInfo->VGAVDE == 375)
2794 else if (pVBInfo->VGAVDE == 405)
2798 } else if (pVBInfo->LCDResInfo == Panel_1280x1024x75) {
2801 } else if (pVBInfo->LCDResInfo == Panel_1280x960) {
2803 if (pVBInfo->VGAVDE == 350)
2805 else if (pVBInfo->VGAVDE == 400)
2807 else if (pVBInfo->VGAVDE == 1024)
2811 } else if (pVBInfo->LCDResInfo == Panel_1400x1050) {
2815 if (pVBInfo->VGAVDE == 1024) {
2819 } else if (pVBInfo->LCDResInfo == Panel_1600x1200) {
2821 tempbx = 1200; /* alan 10/14/2003 */
2822 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
2823 if (pVBInfo->VGAVDE == 350)
2825 else if (pVBInfo->VGAVDE == 400)
2830 if (pVBInfo->LCDInfo & LCDNonExpanding) {
2831 tempax = pVBInfo->VGAHDE;
2832 tempbx = pVBInfo->VGAVDE;
2835 pVBInfo->HDE = tempax;
2836 pVBInfo->VDE = tempbx;
2840 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
2841 struct SiS_TVData const *TVPtr;
2843 TVPtr = XGI_GetTVPtr(ModeNo, ModeIdIndex, RefreshRateTableIndex,
2846 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
2847 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
2848 pVBInfo->VGAHT = TVPtr->VGAHT;
2849 pVBInfo->VGAVT = TVPtr->VGAVT;
2850 pVBInfo->HDE = TVPtr->TVHDE;
2851 pVBInfo->VDE = TVPtr->TVVDE;
2852 pVBInfo->RVBHRS = TVPtr->RVBHRS;
2853 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
2855 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
2856 if (resinfo == 0x08)
2857 pVBInfo->NewFlickerMode = 0x40;
2858 else if (resinfo == 0x09)
2859 pVBInfo->NewFlickerMode = 0x40;
2860 else if (resinfo == 0x12)
2861 pVBInfo->NewFlickerMode = 0x40;
2863 if (pVBInfo->VGAVDE == 350)
2864 pVBInfo->TVInfo |= TVSimuMode;
2869 if (pVBInfo->VBInfo & SetInSlaveMode) {
2870 if (pVBInfo->TVInfo & TVSimuMode) {
2874 if (!(modeflag & Charx8Dot)) {
2875 tempax = StHiTextTVHT;
2876 tempbx = StHiTextTVVT;
2880 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
2881 if (pVBInfo->TVInfo & TVSetYPbPr750p) {
2882 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
2883 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
2886 if (pVBInfo->TVInfo & TVSetYPbPr525p) {
2887 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
2888 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
2889 } else if (pVBInfo->TVInfo & TVSetYPbPr525i) {
2890 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
2891 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
2892 if (pVBInfo->TVInfo & NTSC1024x768)
2893 tempax = NTSC1024x768HT;
2898 if (!(pVBInfo->TVInfo & TVSetPAL)) {
2901 if (pVBInfo->TVInfo & NTSC1024x768)
2902 tempax = NTSC1024x768HT;
2906 pVBInfo->HT = tempax;
2907 pVBInfo->VT = tempbx;
2912 static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
2913 unsigned short RefreshRateTableIndex,
2914 struct vb_device_info *pVBInfo)
2916 unsigned char di_0, di_1, tempal;
2918 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
2920 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
2921 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
2923 if (pVBInfo->VBType & VB_SIS301) { /* shampoo 0129 */
2925 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
2926 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
2927 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
2928 } else { /* 301b/302b/301lv/302lv */
2929 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
2930 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
2933 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
2935 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
2936 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
2938 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
2941 static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
2942 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
2944 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
2946 unsigned short modeflag;
2948 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2949 index = (modeflag & ModeTypeMask) - ModeEGA;
2954 return ColorDepth[index];
2957 static unsigned short XGI_GetOffset(unsigned short ModeNo,
2958 unsigned short ModeIdIndex,
2959 unsigned short RefreshRateTableIndex,
2960 struct xgi_hw_device_info *HwDeviceExtension,
2961 struct vb_device_info *pVBInfo)
2963 unsigned short temp, colordepth, modeinfo, index, infoflag,
2964 ColorDepth[] = { 0x01, 0x02, 0x04 };
2966 modeinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeInfo;
2967 infoflag = XGI330_RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
2969 index = (modeinfo >> 8) & 0xFF;
2971 temp = XGI330_ScreenOffset[index];
2973 if (infoflag & InterlaceMode)
2976 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
2978 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
2979 temp = ModeNo - 0x7C;
2980 colordepth = ColorDepth[temp];
2982 if (infoflag & InterlaceMode)
2984 return temp * colordepth;
2986 return temp * colordepth;
2990 static void XGI_SetCRT2Offset(unsigned short ModeNo,
2991 unsigned short ModeIdIndex,
2992 unsigned short RefreshRateTableIndex,
2993 struct xgi_hw_device_info *HwDeviceExtension,
2994 struct vb_device_info *pVBInfo)
2996 unsigned short offset;
2999 if (pVBInfo->VBInfo & SetInSlaveMode)
3002 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3003 HwDeviceExtension, pVBInfo);
3004 temp = (unsigned char) (offset & 0xFF);
3005 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
3006 temp = (unsigned char) ((offset & 0xFF00) >> 8);
3007 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
3008 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
3009 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
3012 static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
3014 /* threshold high ,disable auto threshold */
3015 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
3016 /* threshold low default 04h */
3017 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
3020 static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
3021 struct xgi_hw_device_info *HwDeviceExtension,
3022 unsigned short RefreshRateTableIndex,
3023 struct vb_device_info *pVBInfo)
3025 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
3027 CRT1Index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3028 CRT1Index &= IndexMask;
3029 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
3031 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
3032 HwDeviceExtension, pVBInfo);
3033 XGI_SetCRT2FIFO(pVBInfo);
3035 for (tempcx = 4; tempcx < 7; tempcx++)
3036 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
3038 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
3039 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
3042 static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
3043 struct xgi_hw_device_info *HwDeviceExtension,
3044 unsigned short RefreshRateTableIndex,
3045 struct vb_device_info *pVBInfo)
3047 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
3048 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
3050 CRT1Index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3051 CRT1Index &= IndexMask;
3052 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
3053 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3055 /* bainy change table name */
3056 if (modeflag & HalfDCLK) {
3057 /* BTVGA2HT 0x08,0x09 */
3058 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
3059 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
3060 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
3061 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
3062 /* BTVGA2HDEE 0x0A,0x0C */
3063 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
3064 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
3065 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
3066 pushbx = pVBInfo->VGAHDE / 2 + 16;
3067 tempcx = tempcx >> 1;
3068 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3071 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3072 tempbx = XGI_CRT1Table[CRT1Index].CR[4];
3073 tempbx |= ((XGI_CRT1Table[CRT1Index].CR[14] &
3075 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3076 tempcx = XGI_CRT1Table[CRT1Index].CR[5];
3078 temp = XGI_CRT1Table[CRT1Index].CR[15];
3079 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3080 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3086 if (tempcx > (pVBInfo->VGAHT / 2))
3087 tempcx = pVBInfo->VGAHT / 2;
3089 temp = tempbx & 0x00FF;
3091 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
3093 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
3094 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
3095 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
3096 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
3097 /* BTVGA2HDEE 0x0A,0x0C */
3098 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
3099 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
3100 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
3101 pushbx = pVBInfo->VGAHDE + 16;
3102 tempcx = tempcx >> 1;
3103 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
3106 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3107 tempbx = XGI_CRT1Table[CRT1Index].CR[3];
3108 tempbx |= ((XGI_CRT1Table[CRT1Index].CR[5] &
3110 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
3111 tempcx = XGI_CRT1Table[CRT1Index].CR[4];
3113 temp = XGI_CRT1Table[CRT1Index].CR[6];
3114 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
3115 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
3120 if (tempcx > pVBInfo->VGAHT)
3121 tempcx = pVBInfo->VGAHT;
3123 temp = tempbx & 0x00FF;
3124 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
3127 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
3129 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
3130 tempax |= (tempbx & 0xFF00);
3131 temp = (tempax & 0xFF00) >> 8;
3132 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
3133 temp = tempcx & 0x00FF;
3134 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
3135 tempcx = (pVBInfo->VGAVT - 1);
3136 temp = tempcx & 0x00FF;
3138 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
3139 tempbx = pVBInfo->VGAVDE - 1;
3140 temp = tempbx & 0x00FF;
3141 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
3142 temp = ((tempbx & 0xFF00) << 3) >> 8;
3143 temp |= ((tempcx & 0xFF00) >> 8);
3144 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
3146 tempax = pVBInfo->VGAVDE;
3147 tempbx = pVBInfo->VGAVDE;
3148 tempcx = pVBInfo->VGAVT;
3149 /* BTVGA2VRS 0x10,0x11 */
3150 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
3151 /* BTVGA2VRE 0x11 */
3152 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
3154 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
3155 tempbx = XGI_CRT1Table[CRT1Index].CR[10];
3156 temp = XGI_CRT1Table[CRT1Index].CR[9];
3164 temp = XGI_CRT1Table[CRT1Index].CR[14];
3169 temp = XGI_CRT1Table[CRT1Index].CR[11];
3170 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
3173 temp = tempbx & 0x00FF;
3174 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
3175 temp = ((tempbx & 0xFF00) >> 8) << 4;
3176 temp = ((tempcx & 0x000F) | (temp));
3177 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
3180 if (modeflag & DoubleScanMode)
3183 if (modeflag & HalfDCLK)
3186 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
3189 static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
3191 unsigned long tempax, tempbx;
3193 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
3195 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
3196 tempax = (tempax * pVBInfo->HT) / tempbx;
3198 return (unsigned short) tempax;
3201 static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
3202 struct xgi_hw_device_info *HwDeviceExtension,
3203 unsigned short RefreshRateTableIndex,
3204 struct vb_device_info *pVBInfo)
3206 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
3207 modeflag, CRT1Index;
3209 /* si+Ext_ResInfo */
3210 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3211 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
3212 CRT1Index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3213 CRT1Index &= IndexMask;
3215 if (!(pVBInfo->VBInfo & SetInSlaveMode))
3218 temp = 0xFF; /* set MAX HT */
3219 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
3222 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
3223 modeflag |= Charx8Dot;
3225 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
3227 if (modeflag & HalfDCLK)
3228 tempax = tempax >> 1;
3230 tempax = (tempax / tempcx) - 1;
3231 tempbx |= ((tempax & 0x00FF) << 8);
3232 temp = tempax & 0x00FF;
3233 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
3235 temp = (tempbx & 0xFF00) >> 8;
3237 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3238 if (!(pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3239 | VB_SIS302LV | VB_XGI301C)))
3242 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) &&
3243 !(pVBInfo->VBType & VB_SIS301LV) && (resinfo == 7))
3247 /* 0x05 Horizontal Display Start */
3248 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
3249 /* 0x06 Horizontal Blank end */
3250 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
3252 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
3253 if (pVBInfo->VBInfo & SetCRT2ToTV)
3254 tempax = pVBInfo->VGAHT;
3256 tempax = XGI_GetVGAHT2(pVBInfo);
3259 if (tempax >= pVBInfo->VGAHT)
3260 tempax = pVBInfo->VGAHT;
3262 if (modeflag & HalfDCLK)
3263 tempax = tempax >> 1;
3265 tempax = (tempax / tempcx) - 5;
3266 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
3267 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
3268 temp = (tempbx & 0x00FF) - 1;
3269 if (!(modeflag & HalfDCLK)) {
3271 if (pVBInfo->TVInfo & TVSimuMode) {
3277 tempbx = (tempbx & 0xFF00) >> 8;
3278 tempcx = (tempcx + tempbx) >> 1;
3279 temp = (tempcx & 0x00FF) + 2;
3281 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3283 if (!(modeflag & HalfDCLK)) {
3284 if ((modeflag & Charx8Dot)) {
3286 if (pVBInfo->VGAHDE >= 800)
3290 } else if (!(modeflag & HalfDCLK)) {
3292 if (pVBInfo->LCDResInfo != Panel_1280x960 &&
3293 pVBInfo->VGAHDE >= 800) {
3295 if (pVBInfo->VGAHDE >= 1280 &&
3296 pVBInfo->LCDResInfo != Panel_1280x960 &&
3297 (pVBInfo->LCDInfo & LCDNonExpanding))
3303 /* 0x07 Horizontal Retrace Start */
3304 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
3305 /* 0x08 Horizontal Retrace End */
3306 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
3308 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3309 if (pVBInfo->TVInfo & TVSimuMode) {
3310 if (ModeNo == 0x50) {
3311 if (pVBInfo->TVInfo & SetNTSCTV) {
3312 xgifb_reg_set(pVBInfo->Part1Port,
3314 xgifb_reg_set(pVBInfo->Part1Port,
3317 xgifb_reg_set(pVBInfo->Part1Port,
3319 xgifb_reg_set(pVBInfo->Part1Port,
3326 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
3327 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
3328 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
3330 tempbx = pVBInfo->VGAVT;
3333 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
3348 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
3349 if (pVBInfo->LCDResInfo == Panel_1024x768) {
3350 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
3359 temp = tempbx & 0x00FF;
3361 temp = tempbx & 0x00FF;
3362 /* 0x10 vertical Blank Start */
3363 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
3366 temp = tempbx & 0x00FF;
3367 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
3369 if (tempbx & 0x0100)
3374 if (modeflag & DoubleScanMode)
3377 if (tempbx & 0x0200)
3380 temp = (tempax & 0xFF00) >> 8;
3381 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
3383 if (tempbx & 0x0400)
3386 /* 0x11 Vertival Blank End */
3387 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
3390 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
3391 tempax = tempax >> 2;
3392 push1 = tempax; /* push ax */
3394 if (resinfo != 0x09) {
3395 tempax = tempax << 1;
3399 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
3400 if ((pVBInfo->VBType & VB_SIS301LV) &&
3401 !(pVBInfo->TVInfo & TVSetHiVision)) {
3402 if ((pVBInfo->TVInfo & TVSimuMode) &&
3403 (pVBInfo->TVInfo & TVSetPAL)) {
3404 if (!(pVBInfo->VBType & VB_SIS301LV) ||
3414 } else if (pVBInfo->TVInfo & TVSimuMode) {
3415 if (pVBInfo->TVInfo & TVSetPAL) {
3416 if (pVBInfo->VBType & VB_SIS301LV) {
3417 if (!(pVBInfo->TVInfo &
3428 tempax = tempax >> 2;
3431 push1 = tempax; /* push ax */
3433 if ((pVBInfo->TVInfo & TVSetPAL)) {
3434 if (tempbx <= 513) {
3440 temp = tempbx & 0x00FF;
3441 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
3443 temp = tempbx & 0x00FF;
3444 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
3446 if (tempbx & 0x0100)
3449 if (tempbx & 0x0200)
3450 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
3454 if (tempbx & 0x0100)
3457 if (tempbx & 0x0200)
3460 if (tempbx & 0x0400)
3463 tempbx = push1; /* pop ax */
3464 temp = tempbx & 0x00FF;
3466 /* 0x0D vertical Retrace End */
3467 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
3469 if (tempbx & 0x0010)
3472 temp = tempcx & 0x00FF;
3473 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
3474 temp = (tempcx & 0x0FF00) >> 8;
3475 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
3477 temp = (tempax & 0xFF00) >> 8;
3479 temp = (temp >> 1) & 0x09;
3481 if (pVBInfo->VBType & (VB_SIS301LV | VB_SIS302LV | VB_XGI301C))
3484 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
3485 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
3486 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
3488 if (pVBInfo->LCDInfo & LCDRGB18Bit)
3493 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
3498 static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
3499 unsigned short RefreshRateTableIndex,
3500 struct xgi_hw_device_info *HwDeviceExtension,
3501 struct vb_device_info *pVBInfo)
3503 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
3504 modeflag, resinfo, crt2crtc;
3505 unsigned char const *TimingPoint;
3507 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
3509 /* si+Ext_ResInfo */
3510 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3511 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
3512 crt2crtc = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
3516 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
3519 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3522 if (pVBInfo->VBInfo & SetCRT2ToSCART)
3525 if (!(pVBInfo->TVInfo & TVSetPAL))
3528 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
3531 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
3534 tempax = (tempax & 0xff00) >> 8;
3536 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
3537 TimingPoint = XGI330_NTSCTiming;
3539 if (pVBInfo->TVInfo & TVSetPAL)
3540 TimingPoint = XGI330_PALTiming;
3542 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
3543 TimingPoint = XGI330_HiTVExtTiming;
3545 if (pVBInfo->VBInfo & SetInSlaveMode)
3546 TimingPoint = XGI330_HiTVSt2Timing;
3548 if (pVBInfo->SetFlag & TVSimuMode)
3549 TimingPoint = XGI330_HiTVSt1Timing;
3551 if (!(modeflag & Charx8Dot))
3552 TimingPoint = XGI330_HiTVTextTiming;
3555 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3556 if (pVBInfo->TVInfo & TVSetYPbPr525i)
3557 TimingPoint = XGI330_YPbPr525iTiming;
3559 if (pVBInfo->TVInfo & TVSetYPbPr525p)
3560 TimingPoint = XGI330_YPbPr525pTiming;
3562 if (pVBInfo->TVInfo & TVSetYPbPr750p)
3563 TimingPoint = XGI330_YPbPr750pTiming;
3566 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
3567 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
3569 for (i = 0x39; i <= 0x45; i++, j++)
3571 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
3573 if (pVBInfo->VBInfo & SetCRT2ToTV)
3574 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
3576 temp = pVBInfo->NewFlickerMode;
3578 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
3580 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
3583 if (pVBInfo->TVInfo & TVSetPAL)
3588 if (pVBInfo->VDE <= tempax) {
3589 tempax -= pVBInfo->VDE;
3590 tempax = tempax >> 2;
3591 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
3593 temp = (tempax & 0xFF00) >> 8;
3594 temp += (unsigned short) TimingPoint[0];
3596 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3597 | VB_SIS302LV | VB_XGI301C)) {
3598 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
3599 | SetCRT2ToSVIDEO | SetCRT2ToSCART
3600 | SetCRT2ToYPbPr525750)) {
3601 tempcx = pVBInfo->VGAHDE;
3602 if (tempcx >= 1024) {
3603 temp = 0x17; /* NTSC */
3604 if (pVBInfo->TVInfo & TVSetPAL)
3605 temp = 0x19; /* PAL */
3610 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
3612 temp = (tempax & 0xFF00) >> 8;
3613 temp += TimingPoint[1];
3615 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3616 | VB_SIS302LV | VB_XGI301C)) {
3617 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
3618 | SetCRT2ToSVIDEO | SetCRT2ToSCART
3619 | SetCRT2ToYPbPr525750))) {
3620 tempcx = pVBInfo->VGAHDE;
3621 if (tempcx >= 1024) {
3622 temp = 0x1D; /* NTSC */
3623 if (pVBInfo->TVInfo & TVSetPAL)
3624 temp = 0x52; /* PAL */
3628 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
3632 tempcx = pVBInfo->HT;
3634 if (XGI_IsLCDDualLink(pVBInfo))
3635 tempcx = tempcx >> 1;
3638 temp = tempcx & 0x00FF;
3639 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
3641 temp = (tempcx & 0xFF00) >> 8;
3642 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
3644 tempcx = pVBInfo->HT >> 1;
3645 push1 = tempcx; /* push cx */
3648 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
3651 temp = tempcx & 0x00FF;
3653 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
3655 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
3658 temp = tempbx & 0x00FF;
3659 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
3660 temp = (tempbx & 0xFF00) >> 8;
3662 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
3665 tempbx = tempbx + 8;
3666 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
3667 tempbx = tempbx - 4;
3671 temp = (tempbx & 0x00FF) << 4;
3672 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
3675 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
3676 temp = tempcx & 0x00FF;
3677 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
3678 temp = ((tempcx & 0xFF00) >> 8) << 4;
3679 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
3682 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
3685 temp = tempcx & 0xFF;
3687 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
3689 tempcx = push1; /* pop cx */
3691 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
3693 temp = tempcx & 0x00FF;
3695 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
3699 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
3700 tempax = XGI_GetVGAHT2(pVBInfo);
3701 tempcx = tempax - 1;
3703 temp = tempcx & 0x00FF;
3704 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
3706 tempbx = pVBInfo->VDE;
3708 if (pVBInfo->VGAVDE == 360)
3710 if (pVBInfo->VGAVDE == 375)
3712 if (pVBInfo->VGAVDE == 405)
3715 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3716 if (pVBInfo->VBType &
3717 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
3718 if (!(pVBInfo->TVInfo &
3719 (TVSetYPbPr525p | TVSetYPbPr750p)))
3720 tempbx = tempbx >> 1;
3722 tempbx = tempbx >> 1;
3726 temp = tempbx & 0x00FF;
3728 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
3729 if (pVBInfo->VBType & VB_SIS301LV) {
3730 if (pVBInfo->TVInfo & TVSetHiVision) {
3731 if (pVBInfo->VBInfo & SetInSlaveMode) {
3736 } else if (pVBInfo->VBInfo & SetInSlaveMode) {
3742 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
3744 temp = (tempcx & 0xFF00) >> 8;
3745 temp |= ((tempbx & 0xFF00) >> 8) << 6;
3747 if (!(pVBInfo->VBInfo & SetCRT2ToHiVision)) {
3748 if (pVBInfo->VBType & VB_SIS301LV) {
3749 if (pVBInfo->TVInfo & TVSetHiVision) {
3752 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3757 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
3762 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
3764 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3765 | VB_SIS302LV | VB_XGI301C)) { /* TV gatingno */
3766 tempbx = pVBInfo->VDE;
3767 tempcx = tempbx - 2;
3769 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3770 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p
3772 tempbx = tempbx >> 1;
3775 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
3777 if (tempcx & 0x0400)
3780 if (tempbx & 0x0400)
3783 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
3786 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
3787 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
3788 temp = (tempbx - 3) & 0x00FF;
3789 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
3792 tempbx = tempbx & 0x00FF;
3794 if (!(modeflag & HalfDCLK)) {
3795 tempcx = pVBInfo->VGAHDE;
3796 if (tempcx >= pVBInfo->HDE) {
3804 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
3805 if (pVBInfo->VGAHDE >= 1024) {
3807 if (pVBInfo->VGAHDE >= 1280) {
3809 tempbx = tempbx & 0xDFFF;
3814 if (!(tempbx & 0x2000)) {
3815 if (modeflag & HalfDCLK)
3816 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
3819 tempeax = pVBInfo->VGAHDE;
3820 tempebx = (tempcx & 0xFF00) >> 8;
3821 longtemp = tempeax * tempebx;
3822 tempecx = tempcx & 0x00FF;
3823 longtemp = longtemp / tempecx;
3828 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3829 | VB_SIS302LV | VB_XGI301C)) {
3830 tempecx = tempecx * 8;
3833 longtemp = longtemp * tempecx;
3834 tempecx = pVBInfo->HDE;
3835 temp2 = longtemp % tempecx;
3836 tempeax = longtemp / tempecx;
3840 tempax = (unsigned short) tempeax;
3843 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
3844 | VB_SIS302LV | VB_XGI301C)) {
3845 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
3850 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
3851 | (tempbx & 0x00FF));
3852 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
3853 | (tempax & 0x00FF));
3854 temp = (tempax & 0xFF00) >> 8;
3856 temp = (tempax & 0x00FF) >> 8;
3859 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
3860 temp = (tempbx & 0xFF00) >> 8;
3861 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
3862 temp = tempcx & 0x00FF;
3864 if (tempbx & 0x2000)
3867 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
3870 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
3871 if (pVBInfo->TVInfo & TVSetPAL) {
3879 temp = tempbx & 0x00FF;
3880 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
3881 temp = tempcx & 0x00FF;
3882 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
3884 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
3886 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
3888 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
3891 if (pVBInfo->TVInfo & TVSetYPbPr525p)
3894 if (pVBInfo->TVInfo & TVSetYPbPr750p)
3898 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
3899 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
3900 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
3902 if (!(pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))) {
3903 if (pVBInfo->TVInfo & NTSC1024x768) {
3904 TimingPoint = XGI_NTSC1024AdjTime;
3905 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
3906 xgifb_reg_set(pVBInfo->Part2Port, i,
3909 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
3913 /* Modify for 301C PALM Support */
3914 if (pVBInfo->VBType & VB_XGI301C) {
3915 if (pVBInfo->TVInfo & TVSetPALM)
3916 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
3917 0x08); /* PALM Mode */
3920 if (pVBInfo->TVInfo & TVSetPALM) {
3921 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
3924 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
3926 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
3929 if (pVBInfo->VBInfo & SetCRT2ToHiVision) {
3930 if (!(pVBInfo->VBInfo & SetInSlaveMode))
3931 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
3934 if (pVBInfo->VBInfo & SetCRT2ToTV)
3938 static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
3939 struct xgi_hw_device_info *HwDeviceExtension,
3940 unsigned short RefreshRateTableIndex,
3941 struct vb_device_info *pVBInfo)
3943 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
3944 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
3946 struct XGI_LCDDesStruct const *LCDBDesPtr = NULL;
3948 /* si+Ext_ResInfo */
3949 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3950 resinfo = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
3951 CRT1Index = XGI330_RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
3952 CRT1Index &= IndexMask;
3954 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
3957 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
3959 if (XGI_IsLCDDualLink(pVBInfo))
3960 tempbx = tempbx >> 1;
3963 temp = tempbx & 0x00FF;
3964 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
3965 temp = (tempbx & 0xFF00) >> 8;
3967 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
3970 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
3971 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
3974 temp = tempbx & 0x00FF;
3975 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
3976 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
3977 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
3979 tempcx = pVBInfo->VT - 1;
3981 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
3982 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
3983 temp = (tempcx & 0xFF00) >> 8;
3985 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
3986 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
3987 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
3988 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
3989 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
3991 /* Customized LCDB Does not add */
3992 if ((pVBInfo->VBType & VB_SIS301LV) || (pVBInfo->VBType & VB_SIS302LV))
3993 LCDBDesPtr = XGI_GetLcdPtr(xgifb_lcddldes, ModeNo, ModeIdIndex,
3994 RefreshRateTableIndex, pVBInfo);
3996 LCDBDesPtr = XGI_GetLcdPtr(XGI_LCDDesDataTable, ModeNo,
3997 ModeIdIndex, RefreshRateTableIndex,
4000 tempah = pVBInfo->LCDResInfo;
4001 tempah &= PanelResInfo;
4003 if ((tempah == Panel_1024x768) || (tempah == Panel_1024x768x75)) {
4006 } else if ((tempah == Panel_1280x1024) ||
4007 (tempah == Panel_1280x1024x75)) {
4010 } else if (tempah == Panel_1400x1050) {
4018 if (pVBInfo->LCDInfo & EnableScalingLCD) {
4019 tempbx = pVBInfo->HDE;
4020 tempcx = pVBInfo->VDE;
4024 tempax = pVBInfo->VT;
4025 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
4026 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
4027 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
4028 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
4029 tempbx = pVBInfo->LCDVDES;
4032 if (tempcx >= tempax)
4033 tempcx -= tempax; /* lcdvdes */
4035 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
4036 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
4037 temp = tempcx & 0x00FF;
4038 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
4039 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
4040 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
4042 tempah = tempah << 3;
4044 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
4047 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4049 tempax = pVBInfo->VT;
4050 tempbx = pVBInfo->LCDVRS;
4053 if (tempcx >= tempax)
4056 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
4057 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
4058 temp = (tempbx & 0xFF00) >> 8;
4060 temp |= (tempcx & 0x000F);
4061 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
4063 tempax = pVBInfo->HT;
4064 tempbx = pVBInfo->LCDHDES;
4067 if (XGI_IsLCDDualLink(pVBInfo)) {
4068 tempax = tempax >> 1;
4069 tempbx = tempbx >> 1;
4070 tempcx = tempcx >> 1;
4073 if (pVBInfo->VBType & VB_SIS302LV)
4076 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
4081 if (tempcx >= tempax)
4084 temp = tempbx & 0x00FF;
4085 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
4086 temp = ((tempbx & 0xFF00) >> 8) << 4;
4087 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
4088 temp = tempcx & 0x00FF;
4089 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
4090 temp = (tempcx & 0xFF00) >> 8;
4091 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
4093 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
4095 tempax = pVBInfo->HT;
4096 tempbx = pVBInfo->LCDHRS;
4097 if (XGI_IsLCDDualLink(pVBInfo)) {
4098 tempax = tempax >> 1;
4099 tempbx = tempbx >> 1;
4100 tempcx = tempcx >> 1;
4103 if (pVBInfo->VBType & VB_SIS302LV)
4108 if (tempcx >= tempax)
4111 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
4112 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
4114 temp = (tempbx & 0xFF00) >> 8;
4116 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
4117 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
4118 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
4120 if (!(pVBInfo->LCDInfo & XGI_LCDVESATiming)) {
4121 if (pVBInfo->VGAVDE == 525) {
4122 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4123 | VB_SIS301LV | VB_SIS302LV
4129 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
4130 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
4133 if (pVBInfo->VGAVDE == 420) {
4134 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
4135 | VB_SIS301LV | VB_SIS302LV
4140 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
4145 /* --------------------------------------------------------------------- */
4146 /* Function : XGI_GetTap4Ptr */
4148 /* Output : di -> Tap4 Reg. Setting Pointer */
4150 /* --------------------------------------------------------------------- */
4151 static struct XGI301C_Tap4TimingStruct const
4152 *XGI_GetTap4Ptr(unsigned short tempcx, struct vb_device_info *pVBInfo)
4154 unsigned short tempax, tempbx, i;
4155 struct XGI301C_Tap4TimingStruct const *Tap4TimingPtr;
4158 tempax = pVBInfo->VGAHDE;
4159 tempbx = pVBInfo->HDE;
4161 tempax = pVBInfo->VGAVDE;
4162 tempbx = pVBInfo->VDE;
4165 if (tempax <= tempbx)
4166 return &xgifb_tap4_timing[0];
4168 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing; /* NTSC */
4170 if (pVBInfo->TVInfo & TVSetPAL)
4171 Tap4TimingPtr = PALTap4Timing;
4173 if (pVBInfo->VBInfo & SetCRT2ToYPbPr525750) {
4174 if ((pVBInfo->TVInfo & TVSetYPbPr525i) ||
4175 (pVBInfo->TVInfo & TVSetYPbPr525p))
4176 Tap4TimingPtr = xgifb_ntsc_525_tap4_timing;
4177 if (pVBInfo->TVInfo & TVSetYPbPr750p)
4178 Tap4TimingPtr = YPbPr750pTap4Timing;
4181 if (pVBInfo->VBInfo & SetCRT2ToHiVision)
4182 Tap4TimingPtr = xgifb_tap4_timing;
4185 while (Tap4TimingPtr[i].DE != 0xFFFF) {
4186 if (Tap4TimingPtr[i].DE == tempax)
4190 return &Tap4TimingPtr[i];
4193 static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
4195 unsigned short i, j;
4196 struct XGI301C_Tap4TimingStruct const *Tap4TimingPtr;
4198 if (!(pVBInfo->VBType & VB_XGI301C))
4201 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
4202 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
4203 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
4205 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
4206 (!(pVBInfo->VBInfo & SetCRT2ToHiVision))) {
4207 /* Set Vertical Scaling */
4208 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
4209 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
4210 xgifb_reg_set(pVBInfo->Part2Port,
4212 Tap4TimingPtr->Reg[j]);
4215 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
4216 (!(pVBInfo->VBInfo & SetCRT2ToHiVision)))
4217 /* Enable V.Scaling */
4218 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
4220 /* Enable H.Scaling */
4221 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
4224 static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
4225 struct vb_device_info *pVBInfo)
4228 unsigned char const *tempdi;
4229 unsigned short modeflag;
4231 /* si+Ext_ResInfo */
4232 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4234 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
4235 if (pVBInfo->TVInfo & TVSetPAL) {
4236 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4237 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
4239 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
4240 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
4243 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4246 if (pVBInfo->TVInfo & TVSetPALM) {
4247 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
4248 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
4249 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
4252 if ((pVBInfo->VBInfo & SetCRT2ToHiVision) || (pVBInfo->VBInfo
4253 & SetCRT2ToYPbPr525750)) {
4254 if (pVBInfo->TVInfo & TVSetYPbPr525i)
4257 tempdi = XGI330_HiTVGroup3Data;
4258 if (pVBInfo->SetFlag & TVSimuMode) {
4259 tempdi = XGI330_HiTVGroup3Simu;
4260 if (!(modeflag & Charx8Dot))
4261 tempdi = XGI330_HiTVGroup3Text;
4264 if (pVBInfo->TVInfo & TVSetYPbPr525p)
4265 tempdi = XGI330_Ren525pGroup3;
4267 if (pVBInfo->TVInfo & TVSetYPbPr750p)
4268 tempdi = XGI330_Ren750pGroup3;
4270 for (i = 0; i <= 0x3E; i++)
4271 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
4273 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
4274 if (pVBInfo->TVInfo & TVSetYPbPr525p)
4275 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
4279 } /* {end of XGI_SetGroup3} */
4281 static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
4282 unsigned short RefreshRateTableIndex,
4283 struct xgi_hw_device_info *HwDeviceExtension,
4284 struct vb_device_info *pVBInfo)
4286 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
4288 unsigned long tempebx, tempeax, templong;
4290 /* si+Ext_ResInfo */
4291 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4292 temp = pVBInfo->RVBHCFACT;
4293 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
4295 tempbx = pVBInfo->RVBHCMAX;
4296 temp = tempbx & 0x00FF;
4297 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
4298 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
4299 tempcx = pVBInfo->VGAHT - 1;
4300 temp = tempcx & 0x00FF;
4301 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
4303 temp = ((tempcx & 0xFF00) >> 8) << 3;
4306 tempcx = pVBInfo->VGAVT - 1;
4307 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
4310 temp = tempcx & 0x00FF;
4311 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
4312 temp = temp2 | ((tempcx & 0xFF00) >> 8);
4313 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
4314 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
4315 tempcx = pVBInfo->VBInfo;
4316 tempbx = pVBInfo->VGAHDE;
4318 if (modeflag & HalfDCLK)
4319 tempbx = tempbx >> 1;
4321 if (XGI_IsLCDDualLink(pVBInfo))
4322 tempbx = tempbx >> 1;
4324 if (tempcx & SetCRT2ToHiVision) {
4330 } else if (tempcx & SetCRT2ToTV) {
4336 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4343 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p)) {
4345 if (pVBInfo->VGAHDE == 1280)
4347 if (pVBInfo->VGAHDE == 1024)
4350 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
4352 tempebx = pVBInfo->VDE;
4354 if (tempcx & SetCRT2ToHiVision) {
4355 if (!(temp & 0xE000))
4356 tempbx = tempbx >> 1;
4359 tempcx = pVBInfo->RVBHRS;
4360 temp = tempcx & 0x00FF;
4361 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
4363 tempeax = pVBInfo->VGAVDE;
4366 if (tempeax <= tempebx) {
4367 tempcx = (tempcx & (~0x4000));
4368 tempeax = pVBInfo->VGAVDE;
4373 templong = (tempeax * 256 * 1024) % tempebx;
4374 tempeax = (tempeax * 256 * 1024) / tempebx;
4380 temp = (unsigned short) (tempebx & 0x000000FF);
4381 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
4383 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
4384 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
4385 tempbx = (unsigned short) (tempebx >> 16);
4386 temp = tempbx & 0x00FF;
4388 temp |= ((tempcx & 0xFF00) >> 8);
4389 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
4392 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4393 | VB_SIS302LV | VB_XGI301C)) {
4395 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
4396 tempax = pVBInfo->VGAHDE;
4397 if (modeflag & HalfDCLK)
4398 tempax = tempax >> 1;
4400 if (XGI_IsLCDDualLink(pVBInfo))
4401 tempax = tempax >> 1;
4403 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4406 } else if (pVBInfo->VGAHDE > 800) {
4407 if (pVBInfo->VGAHDE == 1024)
4408 tempax = (tempax * 25 / 32) - 1;
4410 tempax = (tempax * 20 / 32) - 1;
4414 temp = (tempax & 0xFF00) >> 8;
4415 temp = ((temp & 0x0003) << 4);
4416 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
4417 temp = (tempax & 0x00FF);
4418 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
4420 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVision)) {
4421 if (pVBInfo->VGAHDE > 800)
4422 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
4427 if (pVBInfo->VBInfo & SetCRT2ToTV) {
4428 if (!(pVBInfo->TVInfo & (NTSC1024x768
4429 | TVSetYPbPr525p | TVSetYPbPr750p
4430 | TVSetHiVision))) {
4432 if ((pVBInfo->VBInfo & SetInSlaveMode)
4433 && (!(pVBInfo->TVInfo
4439 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
4440 tempbx = pVBInfo->HT;
4441 if (XGI_IsLCDDualLink(pVBInfo))
4442 tempbx = tempbx >> 1;
4443 tempbx = (tempbx >> 1) - 2;
4444 temp = ((tempbx & 0x0700) >> 8) << 3;
4445 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
4446 temp = tempbx & 0x00FF;
4447 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
4451 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
4454 static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
4456 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
4459 static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
4460 struct vb_device_info *pVBInfo)
4462 unsigned short Pindex, Pdata;
4464 Pindex = pVBInfo->Part5Port;
4465 Pdata = pVBInfo->Part5Port + 1;
4466 if (pVBInfo->ModeType == ModeVGA) {
4467 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
4468 | DisableCRT2Display))) {
4469 XGINew_EnableCRT2(pVBInfo);
4475 static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
4476 struct vb_device_info *pVBInfo)
4478 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
4481 static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
4482 struct vb_device_info *pVBInfo)
4485 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
4488 static unsigned char XGI_XG21CheckLVDSMode(struct xgifb_video_info *xgifb_info,
4489 unsigned short ModeNo, unsigned short ModeIdIndex,
4490 struct vb_device_info *pVBInfo)
4492 unsigned short xres, yres, colordepth, modeflag, resindex;
4494 resindex = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
4495 xres = XGI330_ModeResInfo[resindex].HTotal; /* xres->ax */
4496 yres = XGI330_ModeResInfo[resindex].VTotal; /* yres->bx */
4497 /* si+St_ModeFlag */
4498 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4500 if (!(modeflag & Charx8Dot)) {
4505 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
4508 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
4511 if (xres > xgifb_info->lvds_data.LVDSHDE)
4514 if (yres > xgifb_info->lvds_data.LVDSVDE)
4517 if (xres != xgifb_info->lvds_data.LVDSHDE ||
4518 yres != xgifb_info->lvds_data.LVDSVDE) {
4519 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
4526 static void xgifb_set_lvds(struct xgifb_video_info *xgifb_info,
4528 unsigned short ModeNo,
4529 unsigned short ModeIdIndex,
4530 struct vb_device_info *pVBInfo)
4532 unsigned char temp, Miscdata;
4533 unsigned short xres, yres, modeflag, resindex;
4534 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
4535 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
4536 unsigned short value;
4538 temp = (unsigned char) ((xgifb_info->lvds_data.LVDS_Capability &
4539 (LCDPolarity << 8)) >> 8);
4540 temp &= LCDPolarity;
4541 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
4543 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
4545 temp = xgifb_info->lvds_data.LVDS_Capability & LCDPolarity;
4546 /* SR35[7] FP VSync polarity */
4547 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
4548 /* SR30[5] FP HSync polarity */
4549 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
4551 if (chip_id == XG27)
4552 XGI_SetXG27FPBits(pVBInfo);
4554 XGI_SetXG21FPBits(pVBInfo);
4556 resindex = XGI330_EModeIDTable[ModeIdIndex].Ext_RESINFO;
4557 xres = XGI330_ModeResInfo[resindex].HTotal; /* xres->ax */
4558 yres = XGI330_ModeResInfo[resindex].VTotal; /* yres->bx */
4559 /* si+St_ModeFlag */
4560 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4562 if (!(modeflag & Charx8Dot))
4563 xres = xres * 8 / 9;
4565 LVDSHT = xgifb_info->lvds_data.LVDSHT;
4567 LVDSHBS = xres + (xgifb_info->lvds_data.LVDSHDE - xres) / 2;
4569 if (LVDSHBS > LVDSHT)
4572 LVDSHRS = LVDSHBS + xgifb_info->lvds_data.LVDSHFP;
4573 if (LVDSHRS > LVDSHT)
4576 LVDSHRE = LVDSHRS + xgifb_info->lvds_data.LVDSHSYNC;
4577 if (LVDSHRE > LVDSHT)
4580 LVDSHBE = LVDSHBS + LVDSHT - xgifb_info->lvds_data.LVDSHDE;
4582 LVDSVT = xgifb_info->lvds_data.LVDSVT;
4584 LVDSVBS = yres + (xgifb_info->lvds_data.LVDSVDE - yres) / 2;
4585 if (modeflag & DoubleScanMode)
4586 LVDSVBS += yres / 2;
4588 if (LVDSVBS > LVDSVT)
4591 LVDSVRS = LVDSVBS + xgifb_info->lvds_data.LVDSVFP;
4592 if (LVDSVRS > LVDSVT)
4595 LVDSVRE = LVDSVRS + xgifb_info->lvds_data.LVDSVSYNC;
4596 if (LVDSVRE > LVDSVT)
4599 LVDSVBE = LVDSVBS + LVDSVT - xgifb_info->lvds_data.LVDSVDE;
4601 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
4602 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
4604 if (!(modeflag & Charx8Dot))
4605 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
4607 /* HT SR0B[1:0] CR00 */
4608 value = (LVDSHT >> 3) - 5;
4609 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
4610 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
4612 /* HBS SR0B[5:4] CR02 */
4613 value = (LVDSHBS >> 3) - 1;
4614 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
4615 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
4617 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
4618 value = (LVDSHBE >> 3) - 1;
4619 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
4620 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
4621 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
4623 /* HRS SR0B[7:6] CR04 */
4624 value = (LVDSHRS >> 3) + 2;
4625 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
4626 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
4628 /* Panel HRS SR2F[1:0] SR2E[7:0] */
4630 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
4631 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
4633 /* HRE SR0C[2] CR05[4:0] */
4634 value = (LVDSHRE >> 3) + 2;
4635 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
4636 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
4638 /* Panel HRE SR2F[7:2] */
4640 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
4642 /* VT SR0A[0] CR07[5][0] CR06 */
4644 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
4645 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
4646 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
4647 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
4649 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
4650 value = LVDSVBS - 1;
4651 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
4652 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
4653 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
4654 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
4656 /* VBE SR0A[4] CR16 */
4657 value = LVDSVBE - 1;
4658 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
4659 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
4661 /* VRS SR0A[3] CR7[7][2] CR10 */
4662 value = LVDSVRS - 1;
4663 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
4664 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
4665 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
4666 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
4668 if (chip_id == XG27) {
4669 /* Panel VRS SR35[2:0] SR34[7:0] */
4670 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
4671 (value & 0x700) >> 8);
4672 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
4674 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
4675 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
4676 (value & 0x600) >> 9);
4677 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
4678 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
4681 /* VRE SR0A[5] CR11[3:0] */
4682 value = LVDSVRE - 1;
4683 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
4684 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
4686 /* Panel VRE SR3F[7:2] */
4687 if (chip_id == XG27)
4688 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
4689 (value << 2) & 0xFC);
4691 /* SR3F[7] has to be 0, h/w bug */
4692 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
4693 (value << 2) & 0x7C);
4695 for (temp = 0, value = 0; temp < 3; temp++) {
4697 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
4698 xgifb_reg_set(pVBInfo->P3c4,
4699 0x2B, xgifb_info->lvds_data.VCLKData1);
4700 xgifb_reg_set(pVBInfo->P3c4,
4701 0x2C, xgifb_info->lvds_data.VCLKData2);
4705 if (!(modeflag & Charx8Dot)) {
4706 inb(pVBInfo->P3da); /* reset 3da */
4707 outb(0x13, pVBInfo->P3c0); /* set index */
4708 /* set data, panning = 0, shift left 1 dot*/
4709 outb(0x00, pVBInfo->P3c0);
4711 inb(pVBInfo->P3da); /* Enable Attribute */
4712 outb(0x20, pVBInfo->P3c0);
4714 inb(pVBInfo->P3da); /* reset 3da */
4719 /* --------------------------------------------------------------------- */
4720 /* Function : XGI_IsLCDON */
4722 /* Output : 0 : Skip PSC Control */
4723 /* 1: Disable PSC */
4725 /* --------------------------------------------------------------------- */
4726 static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
4728 unsigned short tempax;
4730 tempax = pVBInfo->VBInfo;
4731 if (tempax & SetCRT2ToDualEdge)
4733 else if (tempax & (DisableCRT2Display | SwitchCRT2 | SetSimuScanMode))
4739 /* --------------------------------------------------------------------- */
4740 /* Function : XGI_DisableChISLCD */
4742 /* Output : 0 -> Not LCD Mode */
4744 /* --------------------------------------------------------------------- */
4745 static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
4747 unsigned short tempbx, tempah;
4749 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
4750 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
4752 if (tempbx & (EnableChA | DisableChA)) {
4753 if (!(tempah & 0x08)) /* Chk LCDA Mode */
4757 if (!(tempbx & (EnableChB | DisableChB)))
4760 if (tempah & 0x01) /* Chk LCDB Mode */
4766 /* --------------------------------------------------------------------- */
4767 /* Function : XGI_EnableChISLCD */
4769 /* Output : 0 -> Not LCD mode */
4771 /* --------------------------------------------------------------------- */
4772 static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
4774 unsigned short tempbx, tempah;
4776 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
4777 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
4779 if (tempbx & (EnableChA | DisableChA)) {
4780 if (!(tempah & 0x08)) /* Chk LCDA Mode */
4784 if (!(tempbx & (EnableChB | DisableChB)))
4787 if (tempah & 0x01) /* Chk LCDB Mode */
4793 static void XGI_DisableBridge(struct xgifb_video_info *xgifb_info,
4794 struct xgi_hw_device_info *HwDeviceExtension,
4795 struct vb_device_info *pVBInfo)
4797 unsigned short tempah = 0;
4799 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4800 | VB_SIS302LV | VB_XGI301C)) {
4802 if (!(pVBInfo->VBInfo &
4803 (DisableCRT2Display | SetSimuScanMode))) {
4804 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
4805 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
4806 tempah = 0x7F; /* Disable Channel A */
4807 if (!(pVBInfo->VBInfo &
4809 /* Disable Channel B */
4812 if (pVBInfo->SetFlag & DisableChB)
4813 /* force to disable Cahnnel */
4816 if (pVBInfo->SetFlag & DisableChA)
4817 /* Force to disable Channel B */
4823 /* disable part4_1f */
4824 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
4826 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
4827 if (((pVBInfo->VBInfo &
4828 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
4829 || (XGI_DisableChISLCD(pVBInfo))
4830 || (XGI_IsLCDON(pVBInfo)))
4831 /* LVDS Driver power down */
4832 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
4835 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
4836 & (DisableCRT2Display | XGI_SetCRT2ToLCDA
4837 | SetSimuScanMode))) {
4838 if (pVBInfo->SetFlag & GatingCRT)
4839 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
4840 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
4843 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
4844 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
4845 & XGI_SetCRT2ToLCDA))
4847 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
4850 /* disable TV as primary VGA swap */
4851 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
4853 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
4854 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
4856 if ((pVBInfo->SetFlag & DisableChB) ||
4858 (DisableCRT2Display | SetSimuScanMode)) ||
4859 ((!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) &&
4861 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
4862 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
4864 if ((pVBInfo->SetFlag & DisableChB) ||
4866 (DisableCRT2Display | SetSimuScanMode)) ||
4867 (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) ||
4869 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
4870 /* save Part1 index 0 */
4871 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
4872 /* BTDAC = 1, avoid VB reset */
4873 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
4875 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
4876 /* restore Part1 index 0 */
4877 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
4879 } else { /* {301} */
4880 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
4881 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
4883 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
4884 /* Disable TV asPrimary VGA swap */
4885 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
4888 if (pVBInfo->VBInfo & (DisableCRT2Display | XGI_SetCRT2ToLCDA
4890 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
4894 /* --------------------------------------------------------------------- */
4895 /* Function : XGI_GetTVPtrIndex */
4898 /* Description : bx 0 : ExtNTSC */
4910 /* --------------------------------------------------------------------- */
4911 static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
4913 unsigned short tempbx = 0;
4915 if (pVBInfo->TVInfo & TVSetPAL)
4917 if (pVBInfo->TVInfo & TVSetHiVision)
4919 if (pVBInfo->TVInfo & TVSetYPbPr525i)
4921 if (pVBInfo->TVInfo & TVSetYPbPr525p)
4923 if (pVBInfo->TVInfo & TVSetYPbPr750p)
4925 if (pVBInfo->TVInfo & TVSimuMode)
4931 /* --------------------------------------------------------------------- */
4932 /* Function : XGI_GetTVPtrIndex2 */
4934 /* Output : bx 0 : NTSC */
4938 /* 4 : NTSC1024x768 */
4939 /* 5 : PAL-M 1024x768 */
4941 /* cl 0 : YFilter1 */
4944 /* 1 : 301B/302B/301LV/302LV */
4946 /* --------------------------------------------------------------------- */
4947 static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
4948 unsigned char *tempch, struct vb_device_info *pVBInfo)
4954 if (pVBInfo->TVInfo & TVSetPAL)
4957 if (pVBInfo->TVInfo & TVSetPALM)
4960 if (pVBInfo->TVInfo & TVSetPALN)
4963 if (pVBInfo->TVInfo & NTSC1024x768) {
4965 if (pVBInfo->TVInfo & TVSetPALM)
4969 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4970 | VB_SIS302LV | VB_XGI301C)) {
4971 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
4978 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4979 | VB_SIS302LV | VB_XGI301C))
4983 static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
4985 unsigned char tempah, tempbl, tempbh;
4987 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
4988 | VB_SIS302LV | VB_XGI301C)) {
4989 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA
4990 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
4992 tempbl = XGI301TVDelay;
4994 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
4995 tempbl = tempbl >> 4;
4996 if (pVBInfo->VBInfo &
4997 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
4998 tempbh = XGI301LCDDelay;
5000 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA))
5006 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
5008 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
5009 | SetCRT2ToTV)) { /* Channel B */
5014 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5019 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
5021 } else if (pVBInfo->IF_DEF_LVDS == 1) {
5024 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5025 tempah = XGI301LCDDelay;
5027 tempah = tempah << 4;
5028 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
5034 static void XGI_SetLCDCap_A(unsigned short tempcx,
5035 struct vb_device_info *pVBInfo)
5037 unsigned short temp;
5039 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
5041 if (temp & LCDRGB18Bit) {
5042 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
5044 (unsigned short) (0x20 | (tempcx & 0x00C0)));
5045 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
5047 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
5048 (unsigned short) (0x30 | (tempcx & 0x00C0)));
5049 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
5053 /* --------------------------------------------------------------------- */
5054 /* Function : XGI_SetLCDCap_B */
5055 /* Input : cx -> LCD Capability */
5058 /* --------------------------------------------------------------------- */
5059 static void XGI_SetLCDCap_B(unsigned short tempcx,
5060 struct vb_device_info *pVBInfo)
5062 if (tempcx & EnableLCD24bpp) /* 24bits */
5063 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
5064 (unsigned short) (((tempcx & 0x00ff) >> 6)
5067 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
5068 (unsigned short) (((tempcx & 0x00ff) >> 6)
5069 | 0x18)); /* Enable Dither */
5072 static void XGI_LongWait(struct vb_device_info *pVBInfo)
5076 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
5079 for (i = 0; i < 0xFFFF; i++) {
5080 if (!(inb(pVBInfo->P3da) & 0x08))
5084 for (i = 0; i < 0xFFFF; i++) {
5085 if ((inb(pVBInfo->P3da) & 0x08))
5091 static void SetSpectrum(struct vb_device_info *pVBInfo)
5093 unsigned short index;
5095 index = XGI_GetLCDCapPtr(pVBInfo);
5097 /* disable down spectrum D[4] */
5098 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
5099 XGI_LongWait(pVBInfo);
5100 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
5101 XGI_LongWait(pVBInfo);
5103 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
5104 pVBInfo->LCDCapList[index].Spectrum_31);
5105 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
5106 pVBInfo->LCDCapList[index].Spectrum_32);
5107 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
5108 pVBInfo->LCDCapList[index].Spectrum_33);
5109 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
5110 pVBInfo->LCDCapList[index].Spectrum_34);
5111 XGI_LongWait(pVBInfo);
5112 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
5115 static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
5117 unsigned short tempcx;
5119 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
5121 if (pVBInfo->VBType &
5126 VB_XGI301C)) { /* 301LV/302LV only */
5127 if (pVBInfo->VBType &
5128 (VB_SIS301LV | VB_SIS302LV | VB_XGI301C)) {
5129 /* Set 301LV Capability */
5130 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
5131 (unsigned char) (tempcx & 0x1F));
5134 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
5135 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
5136 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
5137 | EnablePLLSPLOW)) >> 8));
5140 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5141 | VB_SIS302LV | VB_XGI301C)) {
5142 if (pVBInfo->VBInfo & SetCRT2ToLCD)
5143 XGI_SetLCDCap_B(tempcx, pVBInfo);
5144 else if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
5145 XGI_SetLCDCap_A(tempcx, pVBInfo);
5147 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
5148 if (tempcx & EnableSpectrum)
5149 SetSpectrum(pVBInfo);
5153 XGI_SetLCDCap_A(tempcx, pVBInfo);
5157 /* --------------------------------------------------------------------- */
5158 /* Function : XGI_SetAntiFlicker */
5161 /* Description : Set TV Customized Param. */
5162 /* --------------------------------------------------------------------- */
5163 static void XGI_SetAntiFlicker(unsigned short ModeNo,
5164 unsigned short ModeIdIndex,
5165 struct vb_device_info *pVBInfo)
5167 unsigned short tempbx;
5169 unsigned char tempah;
5171 if (pVBInfo->TVInfo & (TVSetYPbPr525p | TVSetYPbPr750p))
5174 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5176 tempah = TVAntiFlickList[tempbx];
5177 tempah = tempah << 4;
5179 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
5182 static void XGI_SetEdgeEnhance(unsigned short ModeNo,
5183 unsigned short ModeIdIndex,
5184 struct vb_device_info *pVBInfo)
5186 unsigned short tempbx;
5188 unsigned char tempah;
5190 tempbx = XGI_GetTVPtrIndex(pVBInfo);
5192 tempah = TVEdgeList[tempbx];
5193 tempah = tempah << 5;
5195 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
5198 static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
5200 unsigned short tempbx;
5202 unsigned char tempcl, tempch;
5204 unsigned long tempData;
5206 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
5207 tempData = TVPhaseList[tempbx];
5209 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
5211 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
5212 & 0x0000FF00) >> 8));
5213 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
5214 & 0x00FF0000) >> 16));
5215 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
5216 & 0xFF000000) >> 24));
5219 static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
5220 struct vb_device_info *pVBInfo)
5222 unsigned short tempbx, index;
5223 unsigned char const *filterPtr;
5224 unsigned char tempcl, tempch, tempal;
5226 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
5231 filterPtr = NTSCYFilter1;
5235 filterPtr = PALYFilter1;
5242 filterPtr = xgifb_palmn_yfilter1;
5250 filterPtr = xgifb_yfilter2;
5257 tempal = XGI330_EModeIDTable[ModeIdIndex].VB_ExtTVYFilterIndex;
5263 if ((tempcl == 0) && (tempch == 1)) {
5264 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
5265 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
5266 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
5267 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
5269 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
5270 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
5271 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
5272 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
5275 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5276 | VB_SIS302LV | VB_XGI301C)) {
5277 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
5278 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
5279 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
5283 /* --------------------------------------------------------------------- */
5284 /* Function : XGI_OEM310Setting */
5287 /* Description : Customized Param. for 301 */
5288 /* --------------------------------------------------------------------- */
5289 static void XGI_OEM310Setting(unsigned short ModeNo,
5290 unsigned short ModeIdIndex,
5291 struct vb_device_info *pVBInfo)
5293 XGI_SetDelayComp(pVBInfo);
5295 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA))
5296 XGI_SetLCDCap(pVBInfo);
5298 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5299 XGI_SetPhaseIncr(pVBInfo);
5300 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
5301 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
5303 if (pVBInfo->VBType & VB_SIS301)
5304 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
5308 /* --------------------------------------------------------------------- */
5309 /* Function : XGI_SetCRT2ModeRegs */
5312 /* Description : Origin code for crt2group */
5313 /* --------------------------------------------------------------------- */
5314 static void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
5315 struct xgi_hw_device_info *HwDeviceExtension,
5316 struct vb_device_info *pVBInfo)
5318 unsigned short tempbl;
5321 unsigned char tempah;
5324 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5325 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
5326 tempah &= ~0x10; /* BTRAMDAC */
5327 tempah |= 0x40; /* BTRAM */
5329 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
5331 tempah = 0x40; /* BTDRAM */
5332 tempcl = pVBInfo->ModeType;
5336 tempah = (0x008 >> tempcl);
5341 if (pVBInfo->VBInfo & SetInSlaveMode)
5342 tempah ^= 0x50; /* BTDAC */
5346 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
5350 if (pVBInfo->VBInfo & DisableCRT2Display)
5356 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV |
5357 SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5360 if ((pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
5361 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
5367 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
5372 if (!(pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)))
5378 if (!(pVBInfo->VBInfo & SetInSlaveMode))
5381 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
5382 tempah = tempah ^ 0x05;
5383 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5384 tempah = tempah ^ 0x01;
5387 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5391 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
5393 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
5394 | XGI_SetCRT2ToLCDA)) {
5396 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
5397 & SetInSlaveMode))) {
5402 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5404 if (pVBInfo->VBInfo & DriverMode)
5405 tempah = tempah ^ 0x20;
5408 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
5411 if (pVBInfo->LCDInfo & SetLCDDualLink)
5414 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5415 if (pVBInfo->TVInfo & RPLLDIV2XO)
5419 if ((pVBInfo->LCDResInfo == Panel_1280x1024)
5420 || (pVBInfo->LCDResInfo == Panel_1280x1024x75))
5423 if (pVBInfo->LCDResInfo == Panel_1280x960)
5426 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
5429 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5430 | VB_SIS302LV | VB_XGI301C)) {
5434 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5436 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
5437 tempah |= 0x04; /* shampoo 0129 */
5440 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
5443 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5444 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5448 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
5452 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5453 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
5456 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
5461 if (!(pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)) {
5463 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
5467 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
5469 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
5470 if (pVBInfo->LCDInfo & SetLCDDualLink) {
5471 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
5472 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
5478 void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
5479 struct vb_device_info *pVBInfo)
5482 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
5486 void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
5487 struct vb_device_info *pVBInfo)
5490 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
5494 unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
5496 unsigned short flag;
5498 if (pVBInfo->IF_DEF_LVDS == 1) {
5501 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
5502 if ((flag == 1) || (flag == 2))
5503 return 1; /* 301b */
5509 unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
5510 unsigned short ModeNo, unsigned short ModeIdIndex,
5511 struct vb_device_info *pVBInfo)
5513 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
5514 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
5517 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
5519 modeflag = XGI330_EModeIDTable[ModeIdIndex].Ext_ModeFlag;
5521 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
5522 index = index >> pVBInfo->SelectCRT2Rate;
5525 if (pVBInfo->LCDInfo & LCDNonExpanding)
5531 if (pVBInfo->SetFlag & ProgrammingCRT2) {
5532 if (pVBInfo->VBInfo & (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)) {
5533 if (pVBInfo->IF_DEF_LVDS == 0) {
5534 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B
5535 | VB_SIS301LV | VB_SIS302LV
5538 temp = LCDARefreshIndex[
5539 pVBInfo->LCDResInfo & 0x0F];
5541 temp = LCDRefreshIndex[
5542 pVBInfo->LCDResInfo & 0x0F];
5552 RefreshRateTableIndex = XGI330_EModeIDTable[ModeIdIndex].REFindex;
5553 ModeNo = XGI330_RefIndex[RefreshRateTableIndex].ModeID;
5554 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
5555 if ((XGI330_RefIndex[RefreshRateTableIndex].XRes == 800) &&
5556 (XGI330_RefIndex[RefreshRateTableIndex].YRes == 600)) {
5559 /* do the similar adjustment like XGISearchCRT1Rate() */
5560 if ((XGI330_RefIndex[RefreshRateTableIndex].XRes == 1024) &&
5561 (XGI330_RefIndex[RefreshRateTableIndex].YRes == 768)) {
5564 if ((XGI330_RefIndex[RefreshRateTableIndex].XRes == 1280) &&
5565 (XGI330_RefIndex[RefreshRateTableIndex].YRes == 1024)) {
5572 if (XGI330_RefIndex[RefreshRateTableIndex + i].
5575 temp = XGI330_RefIndex[RefreshRateTableIndex + i].Ext_InfoFlag;
5576 temp &= ModeTypeMask;
5577 if (temp < pVBInfo->ModeType)
5582 } while (index != 0xFFFF);
5583 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
5584 if (pVBInfo->VBInfo & SetInSlaveMode) {
5585 temp = XGI330_RefIndex[RefreshRateTableIndex + i - 1].
5587 if (temp & InterlaceMode)
5592 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
5593 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
5594 RefreshRateTableIndex, &i, pVBInfo);
5596 return RefreshRateTableIndex + i;
5599 static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
5600 struct xgi_hw_device_info *HwDeviceExtension,
5601 struct vb_device_info *pVBInfo)
5603 unsigned short RefreshRateTableIndex;
5605 pVBInfo->SetFlag |= ProgrammingCRT2;
5606 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
5607 ModeIdIndex, pVBInfo);
5608 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
5609 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5610 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5611 HwDeviceExtension, pVBInfo);
5612 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5613 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5616 static unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
5617 struct xgi_hw_device_info *HwDeviceExtension,
5618 struct vb_device_info *pVBInfo)
5620 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
5622 tempbx = pVBInfo->VBInfo;
5623 pVBInfo->SetFlag |= ProgrammingCRT2;
5624 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
5625 pVBInfo->SelectCRT2Rate = 4;
5626 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
5627 ModeIdIndex, pVBInfo);
5628 XGI_SaveCRT2Info(ModeNo, pVBInfo);
5629 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
5630 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5631 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
5632 RefreshRateTableIndex, pVBInfo);
5633 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
5634 RefreshRateTableIndex, pVBInfo);
5635 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
5636 RefreshRateTableIndex, pVBInfo);
5637 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5638 HwDeviceExtension, pVBInfo);
5639 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
5640 RefreshRateTableIndex, pVBInfo);
5641 XGI_SetTap4Regs(pVBInfo);
5642 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
5643 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5644 HwDeviceExtension, pVBInfo);
5645 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5646 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
5647 XGI_AutoThreshold(pVBInfo);
5651 void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
5653 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
5654 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
5657 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
5659 unsigned char CR17, CR63, SR31;
5660 unsigned short temp;
5661 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
5664 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
5666 /* to fix XG42 single LCD sense to CRT+LCD */
5667 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
5668 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
5669 pVBInfo->P3d4, 0x53) | 0x02));
5671 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
5672 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
5673 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
5675 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
5676 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
5678 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
5679 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
5681 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
5682 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
5684 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
5685 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
5686 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
5687 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
5689 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
5691 for (i = 0; i < 8; i++)
5692 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
5694 for (i = 8; i < 11; i++)
5695 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
5698 for (i = 11; i < 13; i++)
5699 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
5702 for (i = 13; i < 16; i++)
5703 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
5706 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
5709 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
5710 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
5711 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
5713 outb(0x00, pVBInfo->P3c8);
5715 for (i = 0; i < 256; i++) {
5716 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
5717 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
5718 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
5723 XGI_WaitDisply(pVBInfo);
5724 temp = inb(pVBInfo->P3c2);
5727 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
5729 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
5731 /* avoid display something, set BLACK DAC if not restore DAC */
5732 outb(0x00, pVBInfo->P3c8);
5734 for (i = 0; i < 256; i++) {
5735 outb(0, (pVBInfo->P3c8 + 1));
5736 outb(0, (pVBInfo->P3c8 + 1));
5737 outb(0, (pVBInfo->P3c8 + 1));
5740 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
5741 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
5742 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
5744 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
5745 pVBInfo->P3d4, 0x53) & 0xFD));
5746 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
5749 static void XGI_EnableBridge(struct xgifb_video_info *xgifb_info,
5750 struct xgi_hw_device_info *HwDeviceExtension,
5751 struct vb_device_info *pVBInfo)
5753 unsigned short tempah;
5755 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5756 | VB_SIS302LV | VB_XGI301C)) {
5757 if (!(pVBInfo->SetFlag & DisableChA)) {
5758 if (pVBInfo->SetFlag & EnableChA) {
5760 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
5761 } else if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
5763 xgifb_reg_set(pVBInfo->Part1Port,
5768 if (!(pVBInfo->SetFlag & DisableChB)) {
5769 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
5770 & (SetCRT2ToLCD | SetCRT2ToTV
5771 | SetCRT2ToRAMDAC))) {
5772 tempah = (unsigned char) xgifb_reg_get(
5773 pVBInfo->P3c4, 0x32);
5775 if (pVBInfo->VBInfo & SetInSlaveMode) {
5776 if (!(pVBInfo->VBInfo &
5780 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
5781 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
5783 tempah = (unsigned char) xgifb_reg_get(
5784 pVBInfo->Part1Port, 0x2E);
5786 if (!(tempah & 0x80))
5787 xgifb_reg_or(pVBInfo->Part1Port,
5789 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
5793 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
5794 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
5795 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
5796 0x20); /* shampoo 0129 */
5797 if (pVBInfo->VBType & (VB_SIS302LV | VB_XGI301C)) {
5798 if (!XGI_DisableChISLCD(pVBInfo)) {
5799 if (XGI_EnableChISLCD(pVBInfo) ||
5801 (SetCRT2ToLCD | XGI_SetCRT2ToLCDA)))
5802 /* LVDS PLL power on */
5808 /* LVDS Driver power on */
5809 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
5815 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
5818 if (!(pVBInfo->VBInfo & SetSimuScanMode) &&
5819 (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) &&
5820 (pVBInfo->VBInfo & SetCRT2ToDualEdge)) {
5821 tempah = tempah & 0x40;
5822 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA)
5823 tempah = tempah ^ 0xC0;
5825 if (pVBInfo->SetFlag & DisableChB)
5828 if (pVBInfo->SetFlag & DisableChA)
5831 if (pVBInfo->SetFlag & EnableChB)
5834 if (pVBInfo->SetFlag & EnableChA)
5839 /* EnablePart4_1F */
5840 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
5842 if (!(pVBInfo->SetFlag & DisableChA)) {
5843 if (!(pVBInfo->SetFlag & GatingCRT)) {
5844 XGI_DisableGatingCRT(HwDeviceExtension,
5846 XGI_DisplayOn(xgifb_info, HwDeviceExtension,
5852 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
5853 | XGI_SetCRT2ToLCDA))
5855 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
5857 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
5859 if (!(tempah & 0x80))
5860 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
5862 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
5863 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
5867 static void XGI_SetCRT1Group(struct xgifb_video_info *xgifb_info,
5868 struct xgi_hw_device_info *HwDeviceExtension,
5869 unsigned short ModeNo, unsigned short ModeIdIndex,
5870 struct vb_device_info *pVBInfo)
5872 unsigned short RefreshRateTableIndex, temp;
5874 XGI_SetSeqRegs(ModeNo, ModeIdIndex, pVBInfo);
5875 outb(XGI330_StandTable.MISC, pVBInfo->P3c2);
5876 XGI_SetCRTCRegs(HwDeviceExtension, pVBInfo);
5877 XGI_SetATTRegs(ModeNo, ModeIdIndex, pVBInfo);
5878 XGI_SetGRCRegs(pVBInfo);
5879 XGI_ClearExt1Regs(pVBInfo);
5881 if (HwDeviceExtension->jChipType == XG27) {
5882 if (pVBInfo->IF_DEF_LVDS == 0)
5883 XGI_SetDefaultVCLK(pVBInfo);
5886 temp = ~ProgrammingCRT2;
5887 pVBInfo->SetFlag &= temp;
5888 pVBInfo->SelectCRT2Rate = 0;
5890 if (pVBInfo->VBType & (VB_SIS301B | VB_SIS302B | VB_SIS301LV
5891 | VB_SIS302LV | VB_XGI301C)) {
5892 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA
5893 | SetInSlaveMode)) {
5894 pVBInfo->SetFlag |= ProgrammingCRT2;
5898 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
5899 ModeIdIndex, pVBInfo);
5900 if (RefreshRateTableIndex != 0xFFFF) {
5901 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
5902 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5903 pVBInfo, HwDeviceExtension);
5904 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
5905 RefreshRateTableIndex, pVBInfo);
5906 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
5907 HwDeviceExtension, pVBInfo);
5908 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
5909 RefreshRateTableIndex, pVBInfo);
5912 if (HwDeviceExtension->jChipType >= XG21) {
5913 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
5916 if (HwDeviceExtension->jChipType == XG27)
5917 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
5918 RefreshRateTableIndex, pVBInfo);
5920 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
5921 RefreshRateTableIndex, pVBInfo);
5923 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
5924 RefreshRateTableIndex);
5926 xgifb_set_lcd(HwDeviceExtension->jChipType,
5927 pVBInfo, RefreshRateTableIndex, ModeNo);
5929 if (pVBInfo->IF_DEF_LVDS == 1)
5930 xgifb_set_lvds(xgifb_info,
5931 HwDeviceExtension->jChipType,
5932 ModeNo, ModeIdIndex, pVBInfo);
5936 pVBInfo->SetFlag &= (~ProgrammingCRT2);
5937 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
5938 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
5939 RefreshRateTableIndex, pVBInfo);
5940 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
5943 unsigned char XGISetModeNew(struct xgifb_video_info *xgifb_info,
5944 struct xgi_hw_device_info *HwDeviceExtension,
5945 unsigned short ModeNo)
5947 unsigned short ModeIdIndex;
5948 struct vb_device_info VBINF;
5949 struct vb_device_info *pVBInfo = &VBINF;
5950 pVBInfo->BaseAddr = xgifb_info->vga_base;
5951 pVBInfo->IF_DEF_LVDS = 0;
5953 if (HwDeviceExtension->jChipType >= XG20) {
5954 pVBInfo->IF_DEF_YPbPr = 0;
5955 pVBInfo->IF_DEF_HiVision = 0;
5956 pVBInfo->IF_DEF_CRT2Monitor = 0;
5957 pVBInfo->VBType = 0; /*set VBType default 0*/
5959 pVBInfo->IF_DEF_YPbPr = 1;
5960 pVBInfo->IF_DEF_HiVision = 1;
5961 pVBInfo->IF_DEF_CRT2Monitor = 1;
5964 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
5965 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
5966 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
5967 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
5968 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
5969 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
5970 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
5971 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
5972 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
5973 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
5974 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
5975 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
5976 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
5977 pVBInfo->Part1Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_04;
5978 pVBInfo->Part2Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_10;
5979 pVBInfo->Part3Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_12;
5980 pVBInfo->Part4Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14;
5981 pVBInfo->Part5Port = pVBInfo->BaseAddr + SIS_CRT2_PORT_14 + 2;
5983 /* for x86 Linux, XG21 LVDS */
5984 if (HwDeviceExtension->jChipType == XG21) {
5985 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
5986 pVBInfo->IF_DEF_LVDS = 1;
5988 if (HwDeviceExtension->jChipType == XG27) {
5989 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
5990 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
5991 pVBInfo->IF_DEF_LVDS = 1;
5995 if (HwDeviceExtension->jChipType < XG20)
5996 XGI_GetVBType(pVBInfo);
5998 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
6000 ModeNo = ModeNo & 0x7F;
6001 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
6003 if (HwDeviceExtension->jChipType < XG20)
6004 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
6006 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
6008 if (HwDeviceExtension->jChipType < XG20) {
6009 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
6010 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
6011 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
6012 XGI_DisableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
6014 if (pVBInfo->VBInfo & (SetSimuScanMode | XGI_SetCRT2ToLCDA)) {
6015 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
6016 ModeIdIndex, pVBInfo);
6018 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
6019 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6020 HwDeviceExtension, pVBInfo);
6022 } else if (!(pVBInfo->VBInfo & SwitchCRT2)) {
6023 XGI_SetCRT1Group(xgifb_info,
6024 HwDeviceExtension, ModeNo,
6025 ModeIdIndex, pVBInfo);
6026 if (pVBInfo->VBInfo & XGI_SetCRT2ToLCDA) {
6027 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
6033 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchCRT2)) {
6034 switch (HwDeviceExtension->ujVBChipID) {
6036 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6037 pVBInfo); /*add for CRT2 */
6041 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
6042 pVBInfo); /*add for CRT2 */
6050 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
6051 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
6052 XGI_EnableBridge(xgifb_info, HwDeviceExtension, pVBInfo);
6055 if (pVBInfo->IF_DEF_LVDS == 1)
6056 if (!XGI_XG21CheckLVDSMode(xgifb_info, ModeNo,
6061 pVBInfo->ModeType = XGI330_EModeIDTable[ModeIdIndex].
6062 Ext_ModeFlag & ModeTypeMask;
6064 pVBInfo->SetFlag = 0;
6065 pVBInfo->VBInfo = DisableCRT2Display;
6067 XGI_DisplayOff(xgifb_info, HwDeviceExtension, pVBInfo);
6069 XGI_SetCRT1Group(xgifb_info, HwDeviceExtension, ModeNo,
6070 ModeIdIndex, pVBInfo);
6072 XGI_DisplayOn(xgifb_info, HwDeviceExtension, pVBInfo);
6075 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
6077 if (HwDeviceExtension->jChipType < XG20)
6078 XGI_LockCRT2(HwDeviceExtension, pVBInfo);