3 #include <linux/delay.h>
4 #include <linux/types.h>
10 #include "vb_struct.h"
13 #include "vb_setmode.h"
16 #define IndexMask 0xff
18 static unsigned short XGINew_MDA_DAC[] = {
19 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
21 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
22 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
23 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
24 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
25 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15,
26 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F};
28 static unsigned short XGINew_CGA_DAC[] = {
29 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
30 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
31 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
32 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
33 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
34 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
35 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
36 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
38 static unsigned short XGINew_EGA_DAC[] = {
39 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x05, 0x15,
40 0x20, 0x30, 0x24, 0x34, 0x21, 0x31, 0x25, 0x35,
41 0x08, 0x18, 0x0C, 0x1C, 0x09, 0x19, 0x0D, 0x1D,
42 0x28, 0x38, 0x2C, 0x3C, 0x29, 0x39, 0x2D, 0x3D,
43 0x02, 0x12, 0x06, 0x16, 0x03, 0x13, 0x07, 0x17,
44 0x22, 0x32, 0x26, 0x36, 0x23, 0x33, 0x27, 0x37,
45 0x0A, 0x1A, 0x0E, 0x1E, 0x0B, 0x1B, 0x0F, 0x1F,
46 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F};
48 static unsigned short XGINew_VGA_DAC[] = {
49 0x00, 0x10, 0x04, 0x14, 0x01, 0x11, 0x09, 0x15,
50 0x2A, 0x3A, 0x2E, 0x3E, 0x2B, 0x3B, 0x2F, 0x3F,
51 0x00, 0x05, 0x08, 0x0B, 0x0E, 0x11, 0x14, 0x18,
52 0x1C, 0x20, 0x24, 0x28, 0x2D, 0x32, 0x38, 0x3F,
53 0x00, 0x10, 0x1F, 0x2F, 0x3F, 0x1F, 0x27, 0x2F,
54 0x37, 0x3F, 0x2D, 0x31, 0x36, 0x3A, 0x3F, 0x00,
55 0x07, 0x0E, 0x15, 0x1C, 0x0E, 0x11, 0x15, 0x18,
56 0x1C, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x04,
57 0x08, 0x0C, 0x10, 0x08, 0x0A, 0x0C, 0x0E, 0x10,
58 0x0B, 0x0C, 0x0D, 0x0F, 0x10};
60 void InitTo330Pointer(unsigned char ChipType, struct vb_device_info *pVBInfo)
62 pVBInfo->SModeIDTable = (struct XGI_StStruct *) XGI330_SModeIDTable;
63 pVBInfo->StandTable = (struct XGI_StandTableStruct *) XGI330_StandTable;
64 pVBInfo->EModeIDTable = (struct XGI_ExtStruct *) XGI330_EModeIDTable;
65 pVBInfo->RefIndex = (struct XGI_Ext2Struct *) XGI330_RefIndex;
66 pVBInfo->XGINEWUB_CRT1Table
67 = (struct XGI_CRT1TableStruct *) XGI_CRT1Table;
69 /* add for new UNIVGABIOS */
70 /* XGINew_UBLCDDataTable =
71 * (struct XGI_LCDDataTablStruct *) XGI_LCDDataTable; */
72 /* XGINew_UBTVDataTable = (XGI_TVDataTablStruct *) XGI_TVDataTable; */
74 pVBInfo->MCLKData = (struct XGI_MCLKDataStruct *) XGI340New_MCLKData;
75 pVBInfo->ECLKData = (struct XGI_ECLKDataStruct *) XGI340_ECLKData;
76 pVBInfo->VCLKData = (struct XGI_VCLKDataStruct *) XGI_VCLKData;
77 pVBInfo->VBVCLKData = (struct XGI_VBVCLKDataStruct *) XGI_VBVCLKData;
78 pVBInfo->ScreenOffset = XGI330_ScreenOffset;
79 pVBInfo->StResInfo = (struct XGI_StResInfoStruct *) XGI330_StResInfo;
81 = (struct XGI_ModeResInfoStruct *) XGI330_ModeResInfo;
83 pVBInfo->pOutputSelect = &XGI330_OutputSelect;
84 pVBInfo->pSoftSetting = &XGI330_SoftSetting;
85 pVBInfo->pSR07 = &XGI330_SR07;
86 pVBInfo->LCDResInfo = 0;
87 pVBInfo->LCDTypeInfo = 0;
92 pVBInfo->SR15 = XGI340_SR13;
93 pVBInfo->CR40 = XGI340_cr41;
94 pVBInfo->SR25 = XGI330_sr25;
95 pVBInfo->pSR31 = &XGI330_sr31;
96 pVBInfo->pSR32 = &XGI330_sr32;
97 pVBInfo->CR6B = XGI340_CR6B;
98 pVBInfo->CR6E = XGI340_CR6E;
99 pVBInfo->CR6F = XGI340_CR6F;
100 pVBInfo->CR89 = XGI340_CR89;
101 pVBInfo->AGPReg = XGI340_AGPReg;
102 pVBInfo->SR16 = XGI340_SR16;
103 pVBInfo->pCRCF = &XG40_CRCF;
104 pVBInfo->pXGINew_DRAMTypeDefinition = &XG40_DRAMTypeDefinition;
106 pVBInfo->CR49 = XGI330_CR49;
107 pVBInfo->pSR1F = &XGI330_SR1F;
108 pVBInfo->pSR21 = &XGI330_SR21;
109 pVBInfo->pSR22 = &XGI330_SR22;
110 pVBInfo->pSR23 = &XGI330_SR23;
111 pVBInfo->pSR24 = &XGI330_SR24;
112 pVBInfo->pSR33 = &XGI330_SR33;
114 pVBInfo->pCRT2Data_1_2 = &XGI330_CRT2Data_1_2;
115 pVBInfo->pCRT2Data_4_D = &XGI330_CRT2Data_4_D;
116 pVBInfo->pCRT2Data_4_E = &XGI330_CRT2Data_4_E;
117 pVBInfo->pCRT2Data_4_10 = &XGI330_CRT2Data_4_10;
118 pVBInfo->pRGBSenseData = &XGI330_RGBSenseData;
119 pVBInfo->pVideoSenseData = &XGI330_VideoSenseData;
120 pVBInfo->pYCSenseData = &XGI330_YCSenseData;
121 pVBInfo->pRGBSenseData2 = &XGI330_RGBSenseData2;
122 pVBInfo->pVideoSenseData2 = &XGI330_VideoSenseData2;
123 pVBInfo->pYCSenseData2 = &XGI330_YCSenseData2;
125 pVBInfo->NTSCTiming = XGI330_NTSCTiming;
126 pVBInfo->PALTiming = XGI330_PALTiming;
127 pVBInfo->HiTVExtTiming = XGI330_HiTVExtTiming;
128 pVBInfo->HiTVSt1Timing = XGI330_HiTVSt1Timing;
129 pVBInfo->HiTVSt2Timing = XGI330_HiTVSt2Timing;
130 pVBInfo->HiTVTextTiming = XGI330_HiTVTextTiming;
131 pVBInfo->YPbPr750pTiming = XGI330_YPbPr750pTiming;
132 pVBInfo->YPbPr525pTiming = XGI330_YPbPr525pTiming;
133 pVBInfo->YPbPr525iTiming = XGI330_YPbPr525iTiming;
134 pVBInfo->HiTVGroup3Data = XGI330_HiTVGroup3Data;
135 pVBInfo->HiTVGroup3Simu = XGI330_HiTVGroup3Simu;
136 pVBInfo->HiTVGroup3Text = XGI330_HiTVGroup3Text;
137 pVBInfo->Ren525pGroup3 = XGI330_Ren525pGroup3;
138 pVBInfo->Ren750pGroup3 = XGI330_Ren750pGroup3;
140 pVBInfo->TimingH = (struct XGI_TimingHStruct *) XGI_TimingH;
141 pVBInfo->TimingV = (struct XGI_TimingVStruct *) XGI_TimingV;
142 pVBInfo->UpdateCRT1 = (struct XGI_XG21CRT1Struct *) XGI_UpdateCRT1Table;
144 pVBInfo->CHTVVCLKUNTSC = XGI330_CHTVVCLKUNTSC;
145 pVBInfo->CHTVVCLKONTSC = XGI330_CHTVVCLKONTSC;
146 pVBInfo->CHTVVCLKUPAL = XGI330_CHTVVCLKUPAL;
147 pVBInfo->CHTVVCLKOPAL = XGI330_CHTVVCLKOPAL;
149 /* 310 customization related */
150 if ((pVBInfo->VBType & VB_XGI301LV) || (pVBInfo->VBType & VB_XGI302LV))
151 pVBInfo->LCDCapList = XGI_LCDDLCapList;
153 pVBInfo->LCDCapList = XGI_LCDCapList;
155 if ((ChipType == XG21) || (ChipType == XG27))
156 pVBInfo->XG21_LVDSCapList = XGI21_LCDCapList;
158 pVBInfo->XGI_TVDelayList = XGI301TVDelayList;
159 pVBInfo->XGI_TVDelayList2 = XGI301TVDelayList2;
161 pVBInfo->pXGINew_I2CDefinition = &XG40_I2CDefinition;
163 if (ChipType >= XG20)
164 pVBInfo->pXGINew_CR97 = &XG20_CR97;
166 if (ChipType == XG27) {
168 = (struct XGI_MCLKDataStruct *) XGI27New_MCLKData;
169 pVBInfo->CR40 = XGI27_cr41;
170 pVBInfo->pXGINew_CR97 = &XG27_CR97;
171 pVBInfo->pSR36 = &XG27_SR36;
172 pVBInfo->pCR8F = &XG27_CR8F;
173 pVBInfo->pCRD0 = XG27_CRD0;
174 pVBInfo->pCRDE = XG27_CRDE;
175 pVBInfo->pSR40 = &XG27_SR40;
176 pVBInfo->pSR41 = &XG27_SR41;
180 if (ChipType >= XG20) {
181 pVBInfo->pDVOSetting = &XG21_DVOSetting;
182 pVBInfo->pCR2E = &XG21_CR2E;
183 pVBInfo->pCR2F = &XG21_CR2F;
184 pVBInfo->pCR46 = &XG21_CR46;
185 pVBInfo->pCR47 = &XG21_CR47;
190 static unsigned char XGI_GetModePtr(unsigned short ModeNo,
191 unsigned short ModeIdIndex,
192 struct vb_device_info *pVBInfo)
197 index = pVBInfo->SModeIDTable[ModeIdIndex].St_StTableIndex;
199 if (pVBInfo->ModeType <= 0x02)
200 index = 0x1B; /* 02 -> ModeEGA */
204 return index; /* Get pVBInfo->StandTable index */
208 unsigned char XGI_SetBIOSData(unsigned short ModeNo,
209 unsigned short ModeIdIndex) {
214 /* unsigned char XGI_ClearBankRegs(unsigned short ModeNo,
215 unsigned short ModeIdIndex) {
220 static void XGI_SetSeqRegs(unsigned short ModeNo,
221 unsigned short StandTableIndex,
222 unsigned short ModeIdIndex,
223 struct vb_device_info *pVBInfo)
225 unsigned char tempah, SRdata;
226 unsigned short i, modeflag;
229 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
231 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
233 xgifb_reg_set(pVBInfo->P3c4, 0x00, 0x03); /* Set SR0 */
234 tempah = pVBInfo->StandTable[StandTableIndex].SR[0];
237 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
240 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD)) {
241 if (pVBInfo->VBInfo & SetInSlaveMode)
246 tempah |= 0x20; /* screen off */
247 xgifb_reg_set(pVBInfo->P3c4, 0x01, tempah); /* Set SR1 */
249 for (i = 02; i <= 04; i++) {
250 /* Get SR2,3,4 from file */
251 SRdata = pVBInfo->StandTable[StandTableIndex].SR[i - 1];
252 xgifb_reg_set(pVBInfo->P3c4, i, SRdata); /* Set SR2 3 4 */
256 static void XGI_SetMiscRegs(unsigned short StandTableIndex,
257 struct vb_device_info *pVBInfo)
259 unsigned char Miscdata;
261 /* Get Misc from file */
262 Miscdata = pVBInfo->StandTable[StandTableIndex].MISC;
264 if (pVBInfo->VBType & (VB_XGI301B |
269 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
275 outb(Miscdata, pVBInfo->P3c2); /* Set Misc(3c2) */
278 static void XGI_SetCRTCRegs(struct xgi_hw_device_info *HwDeviceExtension,
279 unsigned short StandTableIndex,
280 struct vb_device_info *pVBInfo)
282 unsigned char CRTCdata;
285 CRTCdata = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
287 xgifb_reg_set(pVBInfo->P3d4, 0x11, CRTCdata); /* Unlock CRTC */
289 for (i = 0; i <= 0x18; i++) {
290 /* Get CRTC from file */
291 CRTCdata = pVBInfo->StandTable[StandTableIndex].CRTC[i];
292 xgifb_reg_set(pVBInfo->P3d4, i, CRTCdata); /* Set CRTC(3d4) */
295 if ((HwDeviceExtension->jChipType == XGI_630) &&
296 (HwDeviceExtension->jChipRevision == 0x30)) {
297 if (pVBInfo->VBInfo & SetInSlaveMode) {
298 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
299 xgifb_reg_set(pVBInfo->P3d4, 0x18, 0xFE);
306 static void XGI_SetATTRegs(unsigned short ModeNo,
307 unsigned short StandTableIndex,
308 unsigned short ModeIdIndex,
309 struct vb_device_info *pVBInfo)
311 unsigned char ARdata;
312 unsigned short i, modeflag;
315 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
317 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
319 for (i = 0; i <= 0x13; i++) {
320 ARdata = pVBInfo->StandTable[StandTableIndex].ATTR[i];
321 if (modeflag & Charx8Dot) { /* ifndef Dot9 */
323 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
326 if (pVBInfo->VBInfo & (SetCRT2ToTV
328 if (pVBInfo->VBInfo &
336 inb(pVBInfo->P3da); /* reset 3da */
337 outb(i, pVBInfo->P3c0); /* set index */
338 outb(ARdata, pVBInfo->P3c0); /* set data */
341 inb(pVBInfo->P3da); /* reset 3da */
342 outb(0x14, pVBInfo->P3c0); /* set index */
343 outb(0x00, pVBInfo->P3c0); /* set data */
344 inb(pVBInfo->P3da); /* Enable Attribute */
345 outb(0x20, pVBInfo->P3c0);
348 static void XGI_SetGRCRegs(unsigned short StandTableIndex,
349 struct vb_device_info *pVBInfo)
351 unsigned char GRdata;
354 for (i = 0; i <= 0x08; i++) {
355 /* Get GR from file */
356 GRdata = pVBInfo->StandTable[StandTableIndex].GRC[i];
357 xgifb_reg_set(pVBInfo->P3ce, i, GRdata); /* Set GR(3ce) */
360 if (pVBInfo->ModeType > ModeVGA) {
361 GRdata = (unsigned char) xgifb_reg_get(pVBInfo->P3ce, 0x05);
362 GRdata &= 0xBF; /* 256 color disable */
363 xgifb_reg_set(pVBInfo->P3ce, 0x05, GRdata);
367 static void XGI_ClearExt1Regs(struct vb_device_info *pVBInfo)
371 for (i = 0x0A; i <= 0x0E; i++)
372 xgifb_reg_set(pVBInfo->P3c4, i, 0x00); /* Clear SR0A-SR0E */
375 static unsigned char XGI_SetDefaultVCLK(struct vb_device_info *pVBInfo)
378 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x20);
379 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[0].SR2B);
380 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[0].SR2C);
382 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, 0x10);
383 xgifb_reg_set(pVBInfo->P3c4, 0x2B, pVBInfo->VCLKData[1].SR2B);
384 xgifb_reg_set(pVBInfo->P3c4, 0x2C, pVBInfo->VCLKData[1].SR2C);
386 xgifb_reg_and(pVBInfo->P3c4, 0x31, ~0x30);
390 static unsigned char XGI_AjustCRT2Rate(unsigned short ModeNo,
391 unsigned short ModeIdIndex,
392 unsigned short RefreshRateTableIndex, unsigned short *i,
393 struct vb_device_info *pVBInfo)
395 unsigned short tempax, tempbx, resinfo, modeflag, infoflag;
399 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
401 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
403 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
404 tempbx = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID;
407 if (pVBInfo->IF_DEF_LVDS == 0) {
408 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
409 tempax |= SupportRAMDAC2;
411 if (pVBInfo->VBType & VB_XGI301C)
412 tempax |= SupportCRT2in301C;
416 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
417 tempax |= SupportLCD;
419 if (pVBInfo->LCDResInfo != Panel1280x1024) {
420 if (pVBInfo->LCDResInfo != Panel1280x960) {
421 if (pVBInfo->LCDInfo &
432 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { /* for HiTV */
433 if ((pVBInfo->VBType & VB_XGI301LV) &&
434 (pVBInfo->VBExtInfo == VB_YPbPr1080i)) {
435 tempax |= SupportYPbPr;
436 if (pVBInfo->VBInfo & SetInSlaveMode) {
447 tempax |= SupportHiVisionTV;
448 if (pVBInfo->VBInfo & SetInSlaveMode) {
463 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO |
467 SetCRT2ToHiVisionTV)) {
470 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
471 | VB_XGI301LV | VB_XGI302LV
473 tempax |= SupportTV1024;
476 if (!(pVBInfo->VBInfo & SetPALTV)) {
477 if (modeflag & NoSupportSimuTV) {
478 if (pVBInfo->VBInfo &
480 if (!(pVBInfo->VBInfo &
489 } else { /* for LVDS */
490 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
491 tempax |= SupportLCD;
494 return 0; /* 1024x768 */
496 if (pVBInfo->LCDResInfo < Panel1024x768) {
498 return 0; /* 800x600 */
501 return 0; /* 512x384 */
506 for (; pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID ==
508 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
510 if (infoflag & tempax)
517 for ((*i) = 0;; (*i)++) {
518 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].
520 if (pVBInfo->RefIndex[RefreshRateTableIndex + (*i)].ModeID
525 if (infoflag & tempax)
531 static void XGI_SetSync(unsigned short RefreshRateTableIndex,
532 struct vb_device_info *pVBInfo)
534 unsigned short sync, temp;
537 sync = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag >> 8;
541 outb(temp, pVBInfo->P3c2); /* Set Misc(3c2) */
544 static void XGI_SetCRT1Timing_H(struct vb_device_info *pVBInfo,
545 struct xgi_hw_device_info *HwDeviceExtension)
547 unsigned char data, data1, pushax;
550 /* xgifb_reg_set(pVBInfo->P3d4, 0x51, 0); */
551 /* xgifb_reg_set(pVBInfo->P3d4, 0x56, 0); */
552 /* xgifb_reg_and_or(pVBInfo->P3d4, 0x11, 0x7f, 0x00); */
555 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
557 xgifb_reg_set(pVBInfo->P3d4, 0x11, data);
559 data = pVBInfo->TimingH[0].data[0];
560 xgifb_reg_set(pVBInfo->P3d4, 0, data);
562 for (i = 0x01; i <= 0x04; i++) {
563 data = pVBInfo->TimingH[0].data[i];
564 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 1), data);
567 for (i = 0x05; i <= 0x06; i++) {
568 data = pVBInfo->TimingH[0].data[i];
569 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i + 6), data);
572 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
574 data = pVBInfo->TimingH[0].data[7];
577 xgifb_reg_set(pVBInfo->P3c4, 0x0e, data);
579 if (HwDeviceExtension->jChipType >= XG20) {
580 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x04);
582 xgifb_reg_set(pVBInfo->P3d4, 0x04, data);
583 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x05);
589 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4,
592 xgifb_reg_set(pVBInfo->P3c4, 0x0c, data);
597 xgifb_reg_set(pVBInfo->P3d4, 0x05, data);
598 data = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0e);
604 xgifb_reg_and_or(pVBInfo->P3c4, 0x0e, ~0xE0, data);
608 static void XGI_SetCRT1Timing_V(unsigned short ModeIdIndex,
609 unsigned short ModeNo,
610 struct vb_device_info *pVBInfo)
615 /* xgifb_reg_set(pVBInfo->P3d4, 0x51, 0); */
616 /* xgifb_reg_set(pVBInfo->P3d4, 0x56, 0); */
617 /* xgifb_reg_and_or(pVBInfo->P3d4, 0x11, 0x7f, 0x00); */
619 for (i = 0x00; i <= 0x01; i++) {
620 data = pVBInfo->TimingV[0].data[i];
621 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 6), data);
624 for (i = 0x02; i <= 0x03; i++) {
625 data = pVBInfo->TimingV[0].data[i];
626 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x0e), data);
629 for (i = 0x04; i <= 0x05; i++) {
630 data = pVBInfo->TimingV[0].data[i];
631 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 0x11), data);
634 j = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x0a);
636 data = pVBInfo->TimingV[0].data[6];
639 xgifb_reg_set(pVBInfo->P3c4, 0x0a, data);
641 data = pVBInfo->TimingV[0].data[6];
646 i = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
648 i = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
654 j = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x09);
657 xgifb_reg_set(pVBInfo->P3d4, 0x09, data);
660 static void XGI_SetCRT1CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
661 unsigned short RefreshRateTableIndex,
662 struct vb_device_info *pVBInfo,
663 struct xgi_hw_device_info *HwDeviceExtension)
665 unsigned char index, data;
669 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
670 index = index & IndexMask;
672 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
674 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
676 for (i = 0; i < 8; i++)
677 pVBInfo->TimingH[0].data[i]
678 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i];
680 for (i = 0; i < 7; i++)
681 pVBInfo->TimingV[0].data[i]
682 = pVBInfo->XGINEWUB_CRT1Table[index].CR[i + 8];
684 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
686 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
688 if (pVBInfo->ModeType > 0x03)
689 xgifb_reg_set(pVBInfo->P3d4, 0x14, 0x4F);
692 /* --------------------------------------------------------------------- */
693 /* Function : XGI_SetXG21CRTC */
694 /* Input : Stand or enhance CRTC table */
695 /* Output : Fill CRT Hsync/Vsync to SR2E/SR2F/SR30/SR33/SR34/SR3F */
696 /* Description : Set LCD timing */
697 /* --------------------------------------------------------------------- */
698 static void XGI_SetXG21CRTC(unsigned short ModeNo, unsigned short ModeIdIndex,
699 unsigned short RefreshRateTableIndex,
700 struct vb_device_info *pVBInfo)
702 unsigned char StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
703 unsigned short Temp1, Temp2, Temp3;
705 if (ModeNo <= 0x13) {
706 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
708 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
709 /* SR2E [7:0]->HRS */
710 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
711 /* Tempbx: CR05 HRE */
712 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
713 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
715 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
716 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
717 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
718 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
719 Tempdx <<= 2; /* Tempdx << 2 */
720 /* SR2F [7:2]->HRE */
721 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
722 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
724 /* Tempax: CR16 VRS */
725 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
726 Tempbx = Tempax; /* Tempbx=Tempax */
727 Tempax &= 0x01; /* Tempax: VRS[0] */
728 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS */
730 /* Tempax: CR7 VRS */
731 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
732 Tempdx = Tempbx >> 1; /* Tempdx: VRS[7:1] */
733 Tempcx = Tempax & 0x04; /* Tempcx: CR7[2] */
734 Tempcx <<= 5; /* Tempcx[7]: VRS[8] */
735 Tempdx |= Tempcx; /* Tempdx: VRS[8:1] */
736 /* SR34[7:0]: VRS[8:1] */
737 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempdx);
739 /* Temp1[8]: VRS[8] unsigned char -> unsigned short */
741 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
742 Tempax &= 0x80; /* Tempax[7]: CR7[7] */
743 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
744 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
747 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
748 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
749 Temp2 = Temp1 & 0x3F0; /* Temp2[9:4]: VRS[9:4] */
750 Temp2 |= Tempax; /* Temp2[9:0]: VRE[9:0] */
751 Temp3 = Temp1 & 0x0F; /* Temp3[3:0]: VRS[3:0] */
752 if (Tempax < Temp3) /* VRE[3:0]<VRS[3:0] */
753 Temp2 |= 0x10; /* Temp2: VRE + 0x10 */
754 Temp2 &= 0xFF; /* Temp2[7:0]: VRE[7:0] */
755 Tempax = (unsigned char) Temp2; /* Tempax[7:0]: VRE[7:0] */
756 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
757 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
758 Temp1 >>= 9; /* [10:9]->[1:0] */
759 Tempbx = (unsigned char) Temp1; /* Tempbx[1:0]: VRS[10:9] */
760 Tempax |= Tempbx; /* VRE[5:0]VRS[10:9] */
762 /* SR3F D[7:2]->VRE D[1:0]->VRS */
763 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
765 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
766 /* Tempax: CR4 HRS */
767 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
768 Tempcx = Tempax; /* Tempcx: HRS */
770 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
772 Tempdx = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SRB */
773 Tempdx &= 0xC0; /* Tempdx[7:6]: SRB[7:6] */
774 Temp1 = Tempdx; /* Temp1[7:6]: HRS[9:8] */
775 Temp1 <<= 2; /* Temp1[9:8]: HRS[9:8] */
776 Temp1 |= Tempax; /* Temp1[9:0]: HRS[9:0] */
778 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
779 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
781 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
782 Tempbx &= 0x04; /* Tempbx[2]: HRE[5] */
783 Tempbx <<= 3; /* Tempbx[5]: HRE[5] */
784 Tempax |= Tempbx; /* Tempax[5:0]: HRE[5:0] */
786 Temp2 = Temp1 & 0x3C0; /* Temp2[9:6]: HRS[9:6] */
787 Temp2 |= Tempax; /* Temp2[9:0]: HRE[9:0] */
789 Tempcx &= 0x3F; /* Tempcx[5:0]: HRS[5:0] */
790 if (Tempax < Tempcx) /* HRE < HRS */
791 Temp2 |= 0x40; /* Temp2 + 0x40 */
794 Tempax = (unsigned char) Temp2; /* Tempax: HRE[7:0] */
795 Tempax <<= 2; /* Tempax[7:2]: HRE[5:0] */
796 Tempdx >>= 6; /* Tempdx[7:6]->[1:0] HRS[9:8] */
797 Tempax |= Tempdx; /* HRE[5:0]HRS[9:8] */
798 /* SR2F D[7:2]->HRE, D[1:0]->HRS */
799 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
800 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
803 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
804 Tempbx = Tempax; /* Tempbx: VRS */
805 Tempax &= 0x01; /* Tempax[0]: VRS[0] */
806 xgifb_reg_or(pVBInfo->P3c4, 0x33, Tempax); /* SR33[0]->VRS[0] */
808 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
809 Tempcx = Tempbx >> 1; /* Tempcx[6:0]: VRS[7:1] */
810 Tempdx = Tempax & 0x04; /* Tempdx[2]: CR7[2] */
811 Tempdx <<= 5; /* Tempdx[7]: VRS[8] */
812 Tempcx |= Tempdx; /* Tempcx[7:0]: VRS[8:1] */
813 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempcx); /* SR34[8:1]->VRS */
815 Temp1 = Tempdx; /* Temp1[7]: Tempdx[7] */
816 Temp1 <<= 1; /* Temp1[8]: VRS[8] */
817 Temp1 |= Tempbx; /* Temp1[8:0]: VRS[8:0] */
819 Temp2 = Tempax << 2; /* Temp2[9]: VRS[9] */
820 Temp1 |= Temp2; /* Temp1[9:0]: VRS[9:0] */
822 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
823 Tempax &= 0x08; /* Tempax[3]: VRS[3] */
825 Temp2 <<= 7; /* Temp2[10]: VRS[10] */
826 Temp1 |= Temp2; /* Temp1[10:0]: VRS[10:0] */
828 /* Tempax: CR11 VRE */
829 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
830 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
832 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
833 Tempbx &= 0x20; /* Tempbx[5]: VRE[5] */
834 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
835 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
836 Temp2 = Temp1 & 0x7E0; /* Temp2[10:5]: VRS[10:5] */
837 Temp2 |= Tempax; /* Temp2[10:5]: VRE[10:5] */
839 Temp3 = Temp1 & 0x1F; /* Temp3[4:0]: VRS[4:0] */
840 if (Tempax < Temp3) /* VRE < VRS */
841 Temp2 |= 0x20; /* VRE + 0x20 */
844 Tempax = (unsigned char) Temp2; /* Tempax: VRE[7:0] */
845 Tempax <<= 2; /* Tempax[7:0]; VRE[5:0]00 */
846 Temp1 &= 0x600; /* Temp1[10:9]: VRS[10:9] */
847 Temp1 >>= 9; /* Temp1[1:0]: VRS[10:9] */
848 Tempbx = (unsigned char) Temp1;
849 Tempax |= Tempbx; /* Tempax[7:0]: VRE[5:0]VRS[10:9] */
851 /* SR3F D[7:2]->VRE D[1:0]->VRS */
852 xgifb_reg_set(pVBInfo->P3c4, 0x3F, Tempax);
856 static void XGI_SetXG27CRTC(unsigned short ModeNo,
857 unsigned short ModeIdIndex,
858 unsigned short RefreshRateTableIndex,
859 struct vb_device_info *pVBInfo)
861 unsigned short StandTableIndex, index, Tempax, Tempbx, Tempcx, Tempdx;
863 if (ModeNo <= 0x13) {
864 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
866 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[4];
867 /* SR2E [7:0]->HRS */
868 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
869 /* Tempbx: CR05 HRE */
870 Tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[5];
871 Tempbx &= 0x1F; /* Tempbx: HRE[4:0] */
873 Tempcx &= 0xE0; /* Tempcx: HRS[7:5] */
874 Tempdx = Tempcx | Tempbx; /* Tempdx(HRE): HRS[7:5]HRE[4:0] */
875 if (Tempbx < (Tempax & 0x1F)) /* IF HRE < HRS */
876 Tempdx |= 0x20; /* Tempdx: HRE = HRE + 0x20 */
877 Tempdx <<= 2; /* Tempdx << 2 */
878 /* SR2F [7:2]->HRE */
879 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempdx);
880 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
882 /* Tempax: CR10 VRS */
883 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[16];
884 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax); /* SR34[7:0]->VRS */
885 Tempcx = Tempax; /* Tempcx=Tempax=VRS[7:0] */
886 /* Tempax[7][2]: CR7[7][2] VRS[9][8] */
887 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[7];
888 Tempbx = Tempax; /* Tempbx=CR07 */
889 Tempax &= 0x04; /* Tempax[2]: CR07[2] VRS[8] */
891 /* SR35 D[0]->VRS D[8] */
892 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
893 Tempcx |= (Tempax << 8); /* Tempcx[8] |= VRS[8] */
894 Tempcx |= (Tempbx & 0x80) << 2; /* Tempcx[9] |= VRS[9] */
897 Tempax = pVBInfo->StandTable[StandTableIndex].CRTC[17];
898 Tempax &= 0x0F; /* Tempax: VRE[3:0] */
899 Tempbx = Tempcx; /* Tempbx=Tempcx=VRS[9:0] */
900 Tempbx &= 0x3F0; /* Tempbx[9:4]: VRS[9:4] */
901 Tempbx |= Tempax; /* Tempbx[9:0]: VRE[9:0] */
902 if (Tempax <= (Tempcx & 0x0F)) /* VRE[3:0]<=VRS[3:0] */
903 Tempbx |= 0x10; /* Tempbx: VRE + 0x10 */
904 /* Tempax[7:0]: VRE[7:0] */
905 Tempax = (unsigned char) Tempbx & 0xFF;
906 Tempax <<= 2; /* Tempax << 2: VRE[5:0] */
907 Tempcx = (Tempcx & 0x600) >> 8; /* Tempcx VRS[10:9] */
908 /* SR3F D[7:2]->VRE D[5:0] */
909 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
910 /* SR35 D[2:1]->VRS[10:9] */
911 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x06, Tempcx);
913 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
914 /* Tempax: CR4 HRS */
915 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
916 Tempbx = Tempax; /* Tempbx: HRS[7:0] */
918 xgifb_reg_set(pVBInfo->P3c4, 0x2E, Tempax);
921 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5];
922 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
923 Tempbx |= (Tempax << 2); /* Tempbx: HRS[9:0] */
925 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[4]; /* CR5 HRE */
926 Tempax &= 0x1F; /* Tempax[4:0]: HRE[4:0] */
927 Tempcx = Tempax; /* Tempcx: HRE[4:0] */
929 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[6]; /* SRC */
930 Tempax &= 0x04; /* Tempax[2]: HRE[5] */
931 Tempax <<= 3; /* Tempax[5]: HRE[5] */
932 Tempcx |= Tempax; /* Tempcx[5:0]: HRE[5:0] */
934 Tempbx = Tempbx & 0x3C0; /* Tempbx[9:6]: HRS[9:6] */
935 Tempbx |= Tempcx; /* Tempbx: HRS[9:6]HRE[5:0] */
937 /* Tempax: CR4 HRS */
938 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[3];
939 Tempax &= 0x3F; /* Tempax: HRS[5:0] */
940 if (Tempcx <= Tempax) /* HRE[5:0] < HRS[5:0] */
941 Tempbx += 0x40; /* Tempbx= Tempbx + 0x40 : HRE[9:0]*/
943 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[5]; /* SR0B */
944 Tempax &= 0xC0; /* Tempax[7:6]: SR0B[7:6]: HRS[9:8]*/
945 Tempax >>= 6; /* Tempax[1:0]: HRS[9:8]*/
946 Tempax |= ((Tempbx << 2) & 0xFF); /* Tempax[7:2]: HRE[5:0] */
947 /* SR2F [7:2][1:0]: HRE[5:0]HRS[9:8] */
948 xgifb_reg_set(pVBInfo->P3c4, 0x2F, Tempax);
949 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, 0xE3, 00);
952 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[10];
953 /* SR34[7:0]->VRS[7:0] */
954 xgifb_reg_set(pVBInfo->P3c4, 0x34, Tempax);
956 Tempcx = Tempax; /* Tempcx <= VRS[7:0] */
957 /* CR7[7][2] VRS[9][8] */
958 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[9];
959 Tempbx = Tempax; /* Tempbx <= CR07[7:0] */
960 Tempax = Tempax & 0x04; /* Tempax[2]: CR7[2]: VRS[8] */
961 Tempax >>= 2; /* Tempax[0]: VRS[8] */
962 /* SR35[0]: VRS[8] */
963 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x01, Tempax);
964 Tempcx |= (Tempax << 8); /* Tempcx <= VRS[8:0] */
965 Tempcx |= ((Tempbx & 0x80) << 2); /* Tempcx <= VRS[9:0] */
967 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
968 Tempax &= 0x08; /* SR0A[3] VRS[10] */
969 Tempcx |= (Tempax << 7); /* Tempcx <= VRS[10:0] */
971 /* Tempax: CR11 VRE */
972 Tempax = pVBInfo->XGINEWUB_CRT1Table[index].CR[11];
973 Tempax &= 0x0F; /* Tempax[3:0]: VRE[3:0] */
975 Tempbx = pVBInfo->XGINEWUB_CRT1Table[index].CR[14];
976 Tempbx &= 0x20; /* Tempbx[5]: SR0A[5]: VRE[4] */
977 Tempbx >>= 1; /* Tempbx[4]: VRE[4] */
978 Tempax |= Tempbx; /* Tempax[4:0]: VRE[4:0] */
979 Tempbx = Tempcx; /* Tempbx: VRS[10:0] */
980 Tempbx &= 0x7E0; /* Tempbx[10:5]: VRS[10:5] */
981 Tempbx |= Tempax; /* Tempbx: VRS[10:5]VRE[4:0] */
983 if (Tempbx <= Tempcx) /* VRE <= VRS */
984 Tempbx |= 0x20; /* VRE + 0x20 */
986 /* Tempax: Tempax[7:0]; VRE[5:0]00 */
987 Tempax = (Tempbx << 2) & 0xFF;
988 /* SR3F[7:2]:VRE[5:0] */
989 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, Tempax);
990 Tempax = Tempcx >> 8;
991 /* SR35[2:0]:VRS[10:8] */
992 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, Tempax);
996 /* --------------------------------------------------------------------- */
997 /* Function : XGI_SetXG21LCD */
999 /* Output : FCLK duty cycle, FCLK delay compensation */
1000 /* Description : All values set zero */
1001 /* --------------------------------------------------------------------- */
1002 static void XGI_SetXG21LCD(struct vb_device_info *pVBInfo,
1003 unsigned short RefreshRateTableIndex, unsigned short ModeNo)
1005 unsigned short Data, Temp, b3CC;
1006 unsigned short XGI_P3cc;
1008 XGI_P3cc = pVBInfo->P3cc;
1010 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
1011 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
1012 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
1013 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
1014 if (((*pVBInfo->pDVOSetting) & 0xC0) == 0xC0) {
1015 xgifb_reg_set(pVBInfo->P3d4, 0x2E, *pVBInfo->pCR2E);
1016 xgifb_reg_set(pVBInfo->P3d4, 0x2F, *pVBInfo->pCR2F);
1017 xgifb_reg_set(pVBInfo->P3d4, 0x46, *pVBInfo->pCR46);
1018 xgifb_reg_set(pVBInfo->P3d4, 0x47, *pVBInfo->pCR47);
1021 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
1024 xgifb_reg_or(pVBInfo->P3c4, 0x06, 0x40); /* 18 bits FP */
1025 xgifb_reg_or(pVBInfo->P3c4, 0x09, 0x40);
1028 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
1030 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20);
1031 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80);
1033 if (ModeNo <= 0x13) {
1034 b3CC = (unsigned char) inb(XGI_P3cc);
1036 /* Hsync polarity */
1037 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
1039 /* Vsync polarity */
1040 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
1042 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1044 /* Hsync polarity */
1045 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
1047 /* Vsync polarity */
1048 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
1052 static void XGI_SetXG27LCD(struct vb_device_info *pVBInfo,
1053 unsigned short RefreshRateTableIndex,
1054 unsigned short ModeNo)
1056 unsigned short Data, Temp, b3CC;
1057 unsigned short XGI_P3cc;
1059 XGI_P3cc = pVBInfo->P3cc;
1061 xgifb_reg_set(pVBInfo->P3d4, 0x2E, 0x00);
1062 xgifb_reg_set(pVBInfo->P3d4, 0x2F, 0x00);
1063 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x00);
1064 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x00);
1066 Temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
1067 if ((Temp & 0x03) == 0) { /* dual 12 */
1068 xgifb_reg_set(pVBInfo->P3d4, 0x46, 0x13);
1069 xgifb_reg_set(pVBInfo->P3d4, 0x47, 0x13);
1072 if (((*pVBInfo->pDVOSetting) & 0xC0) == 0xC0) {
1073 xgifb_reg_set(pVBInfo->P3d4, 0x2E, *pVBInfo->pCR2E);
1074 xgifb_reg_set(pVBInfo->P3d4, 0x2F, *pVBInfo->pCR2F);
1075 xgifb_reg_set(pVBInfo->P3d4, 0x46, *pVBInfo->pCR46);
1076 xgifb_reg_set(pVBInfo->P3d4, 0x47, *pVBInfo->pCR47);
1079 XGI_SetXG27FPBits(pVBInfo);
1081 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x01); /* Negative blank polarity */
1083 xgifb_reg_and(pVBInfo->P3c4, 0x30, ~0x20); /* Hsync polarity */
1084 xgifb_reg_and(pVBInfo->P3c4, 0x35, ~0x80); /* Vsync polarity */
1086 if (ModeNo <= 0x13) {
1087 b3CC = (unsigned char) inb(XGI_P3cc);
1089 /* Hsync polarity */
1090 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
1092 /* Vsync polarity */
1093 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
1095 Data = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1097 /* Hsync polarity */
1098 xgifb_reg_or(pVBInfo->P3c4, 0x30, 0x20);
1100 /* Vsync polarity */
1101 xgifb_reg_or(pVBInfo->P3c4, 0x35, 0x80);
1105 /* --------------------------------------------------------------------- */
1106 /* Function : XGI_UpdateXG21CRTC */
1108 /* Output : CRT1 CRTC */
1109 /* Description : Modify CRT1 Hsync/Vsync to fix LCD mode timing */
1110 /* --------------------------------------------------------------------- */
1111 static void XGI_UpdateXG21CRTC(unsigned short ModeNo,
1112 struct vb_device_info *pVBInfo,
1113 unsigned short RefreshRateTableIndex)
1117 xgifb_reg_and(pVBInfo->P3d4, 0x11, 0x7F); /* Unlock CR0~7 */
1118 if (ModeNo <= 0x13) {
1119 for (i = 0; i < 12; i++) {
1120 if (ModeNo == pVBInfo->UpdateCRT1[i].ModeID)
1124 if (ModeNo == 0x2E &&
1125 (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC ==
1128 else if (ModeNo == 0x2E &&
1129 (pVBInfo->RefIndex[RefreshRateTableIndex].
1130 Ext_CRT1CRTC == RES640x480x72))
1132 else if (ModeNo == 0x2F)
1134 else if (ModeNo == 0x50)
1136 else if (ModeNo == 0x59)
1141 xgifb_reg_set(pVBInfo->P3d4, 0x02,
1142 pVBInfo->UpdateCRT1[index].CR02);
1143 xgifb_reg_set(pVBInfo->P3d4, 0x03,
1144 pVBInfo->UpdateCRT1[index].CR03);
1145 xgifb_reg_set(pVBInfo->P3d4, 0x15,
1146 pVBInfo->UpdateCRT1[index].CR15);
1147 xgifb_reg_set(pVBInfo->P3d4, 0x16,
1148 pVBInfo->UpdateCRT1[index].CR16);
1152 static void XGI_SetCRT1DE(struct xgi_hw_device_info *HwDeviceExtension,
1153 unsigned short ModeNo, unsigned short ModeIdIndex,
1154 unsigned short RefreshRateTableIndex,
1155 struct vb_device_info *pVBInfo)
1157 unsigned short resindex, tempax, tempbx, tempcx, temp, modeflag;
1161 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
1163 if (ModeNo <= 0x13) {
1164 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1165 tempax = pVBInfo->StResInfo[resindex].HTotal;
1166 tempbx = pVBInfo->StResInfo[resindex].VTotal;
1168 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1169 tempax = pVBInfo->ModeResInfo[resindex].HTotal;
1170 tempbx = pVBInfo->ModeResInfo[resindex].VTotal;
1173 if (modeflag & HalfDCLK)
1174 tempax = tempax >> 1;
1176 if (ModeNo > 0x13) {
1177 if (modeflag & HalfDCLK)
1178 tempax = tempax << 1;
1180 temp = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1182 if (temp & InterlaceMode)
1183 tempbx = tempbx >> 1;
1185 if (modeflag & DoubleScanMode)
1186 tempbx = tempbx << 1;
1191 /* if (!(modeflag & Charx8Dot)) */
1198 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
1199 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
1201 xgifb_reg_set(pVBInfo->P3d4, 0x11, data); /* Unlock CRTC */
1202 xgifb_reg_set(pVBInfo->P3d4, 0x01, (unsigned short) (tempcx & 0xff));
1203 xgifb_reg_and_or(pVBInfo->P3d4, 0x0b, ~0x0c,
1204 (unsigned short) ((tempcx & 0x0ff00) >> 10));
1205 xgifb_reg_set(pVBInfo->P3d4, 0x12, (unsigned short) (tempbx & 0xff));
1207 tempbx = tempbx >> 8;
1215 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x42, tempax);
1216 data = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x07);
1223 xgifb_reg_and_or(pVBInfo->P3d4, 0x0a, ~0x02, tempax);
1224 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp);
1227 unsigned short XGI_GetResInfo(unsigned short ModeNo,
1228 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
1230 unsigned short resindex;
1234 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1236 /* si+Ext_ResInfo */
1237 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
1241 static void XGI_SetCRT1Offset(unsigned short ModeNo,
1242 unsigned short ModeIdIndex,
1243 unsigned short RefreshRateTableIndex,
1244 struct xgi_hw_device_info *HwDeviceExtension,
1245 struct vb_device_info *pVBInfo)
1247 unsigned short temp, ah, al, temp2, i, DisplayUnit;
1250 temp = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
1252 temp = pVBInfo->ScreenOffset[temp];
1254 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1255 temp2 &= InterlaceMode;
1260 temp2 = pVBInfo->ModeType - ModeEGA;
1285 if ((ModeNo >= 0x26) && (ModeNo <= 0x28))
1286 temp = temp * temp2 + temp2 / 2;
1293 temp = temp >> 8; /* ah */
1295 i = xgifb_reg_get(pVBInfo->P3c4, 0x0E);
1298 xgifb_reg_set(pVBInfo->P3c4, 0x0E, i);
1300 temp = (unsigned char) temp2;
1301 temp &= 0xFF; /* al */
1302 xgifb_reg_set(pVBInfo->P3d4, 0x13, temp);
1304 /* SetDisplayUnit */
1305 temp2 = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
1306 temp2 &= InterlaceMode;
1310 DisplayUnit = DisplayUnit << 5;
1311 ah = (DisplayUnit & 0xff00) >> 8;
1312 al = DisplayUnit & 0x00ff;
1318 if (HwDeviceExtension->jChipType >= XG20)
1319 if ((ModeNo == 0x4A) | (ModeNo == 0x49))
1322 xgifb_reg_set(pVBInfo->P3c4, 0x10, ah);
1325 static unsigned short XGI_GetVCLK2Ptr(unsigned short ModeNo,
1326 unsigned short ModeIdIndex,
1327 unsigned short RefreshRateTableIndex,
1328 struct xgi_hw_device_info *HwDeviceExtension,
1329 struct vb_device_info *pVBInfo)
1331 unsigned short LCDXlat1VCLK[4] = { VCLK65 + 2,
1335 unsigned short LCDXlat2VCLK[4] = { VCLK108_2 + 5,
1339 unsigned short LVDSXlat1VCLK[4] = { VCLK40, VCLK40, VCLK40, VCLK40 };
1340 unsigned short LVDSXlat2VCLK[4] = { VCLK65 + 2,
1344 unsigned short LVDSXlat3VCLK[4] = { VCLK65 + 2,
1349 unsigned short CRT2Index, VCLKIndex;
1350 unsigned short modeflag, resinfo;
1352 if (ModeNo <= 0x13) {
1354 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1355 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1356 CRT2Index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1358 /* si+Ext_ResInfo */
1359 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1360 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
1361 CRT2Index = pVBInfo->RefIndex[RefreshRateTableIndex].
1365 if (pVBInfo->IF_DEF_LVDS == 0) {
1366 CRT2Index = CRT2Index >> 6; /* for LCD */
1367 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) { /*301b*/
1368 if (pVBInfo->LCDResInfo != Panel1024x768)
1369 VCLKIndex = LCDXlat2VCLK[CRT2Index];
1371 VCLKIndex = LCDXlat1VCLK[CRT2Index];
1372 } else { /* for TV */
1373 if (pVBInfo->VBInfo & SetCRT2ToTV) {
1374 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
1375 if (pVBInfo->SetFlag & RPLLDIV2XO) {
1376 VCLKIndex = HiTVVCLKDIV2;
1379 VCLKIndex = HiTVVCLK;
1383 if (pVBInfo->SetFlag & TVSimuMode) {
1384 if (modeflag & Charx8Dot) {
1396 if (pVBInfo->VBType & VB_XGI301LV) {
1397 if (!(pVBInfo->VBExtInfo ==
1401 if (!(pVBInfo->VBExtInfo
1406 if (!(pVBInfo->VBExtInfo
1410 if (!(pVBInfo->SetFlag
1419 if (pVBInfo->VBInfo & SetCRT2ToTV) {
1420 if (pVBInfo->SetFlag &
1422 VCLKIndex = TVVCLKDIV2;
1430 } else { /* for CRT2 */
1432 VCLKIndex = (unsigned char) inb(
1433 (pVBInfo->P3ca + 0x02));
1434 VCLKIndex = ((VCLKIndex >> 2) & 0x03);
1435 if (ModeNo > 0x13) {
1436 /* di+Ext_CRTVCLK */
1439 RefreshRateTableIndex].
1441 VCLKIndex &= IndexMask;
1447 VCLKIndex = CRT2Index;
1449 VCLKIndex = CRT2Index;
1451 VCLKIndex = VCLKIndex >> 6;
1452 if ((pVBInfo->LCDResInfo == Panel800x600) ||
1453 (pVBInfo->LCDResInfo == Panel320x480))
1454 VCLKIndex = LVDSXlat1VCLK[VCLKIndex];
1455 else if ((pVBInfo->LCDResInfo == Panel1024x768) ||
1456 (pVBInfo->LCDResInfo == Panel1024x768x75))
1457 VCLKIndex = LVDSXlat2VCLK[VCLKIndex];
1459 VCLKIndex = LVDSXlat3VCLK[VCLKIndex];
1461 /* VCLKIndex = VCLKIndex&IndexMask; */
1466 static void XGI_SetCRT1VCLK(unsigned short ModeNo,
1467 unsigned short ModeIdIndex,
1468 struct xgi_hw_device_info *HwDeviceExtension,
1469 unsigned short RefreshRateTableIndex,
1470 struct vb_device_info *pVBInfo)
1472 unsigned char index, data;
1473 unsigned short vclkindex;
1475 if (pVBInfo->IF_DEF_LVDS == 1) {
1476 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1477 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
1478 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1479 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
1480 pVBInfo->VCLKData[index].SR2B);
1481 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
1482 pVBInfo->VCLKData[index].SR2C);
1483 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
1484 } else if ((pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
1485 | VB_XGI302LV | VB_XGI301C)) && (pVBInfo->VBInfo
1487 vclkindex = XGI_GetVCLK2Ptr(ModeNo, ModeIdIndex,
1488 RefreshRateTableIndex, HwDeviceExtension,
1490 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
1491 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1492 data = pVBInfo->VBVCLKData[vclkindex].Part4_A;
1493 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
1494 data = pVBInfo->VBVCLKData[vclkindex].Part4_B;
1495 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
1496 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
1498 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1499 data = xgifb_reg_get(pVBInfo->P3c4, 0x31) & 0xCF;
1500 xgifb_reg_set(pVBInfo->P3c4, 0x31, data);
1501 xgifb_reg_set(pVBInfo->P3c4, 0x2B,
1502 pVBInfo->VCLKData[index].SR2B);
1503 xgifb_reg_set(pVBInfo->P3c4, 0x2C,
1504 pVBInfo->VCLKData[index].SR2C);
1505 xgifb_reg_set(pVBInfo->P3c4, 0x2D, 0x01);
1508 if (HwDeviceExtension->jChipType >= XG20) {
1509 if (pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag &
1511 data = xgifb_reg_get(pVBInfo->P3c4, 0x2B);
1512 xgifb_reg_set(pVBInfo->P3c4, 0x2B, data);
1513 data = xgifb_reg_get(pVBInfo->P3c4, 0x2C);
1520 xgifb_reg_set(pVBInfo->P3c4, 0x2C, data);
1525 static void XGI_SetCRT1FIFO(unsigned short ModeNo,
1526 struct xgi_hw_device_info *HwDeviceExtension,
1527 struct vb_device_info *pVBInfo)
1529 unsigned short data;
1531 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
1533 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data); /* diable auto-threshold */
1535 if (ModeNo > 0x13) {
1536 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x34);
1537 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
1539 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x30);
1540 data = xgifb_reg_get(pVBInfo->P3c4, 0x3D);
1542 xgifb_reg_set(pVBInfo->P3c4, 0x3D, data);
1544 if (HwDeviceExtension->jChipType == XG27) {
1545 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0x0E);
1546 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
1548 xgifb_reg_set(pVBInfo->P3c4, 0x09, data | 0x20);
1550 xgifb_reg_set(pVBInfo->P3c4, 0x08, 0xAE);
1551 data = xgifb_reg_get(pVBInfo->P3c4, 0x09);
1553 xgifb_reg_set(pVBInfo->P3c4, 0x09, data);
1557 if (HwDeviceExtension->jChipType == XG21)
1558 XGI_SetXG21FPBits(pVBInfo); /* Fix SR9[7:6] can't read back */
1561 static void XGI_SetVCLKState(struct xgi_hw_device_info *HwDeviceExtension,
1562 unsigned short ModeNo, unsigned short RefreshRateTableIndex,
1563 struct vb_device_info *pVBInfo)
1565 unsigned short data, data2 = 0;
1568 unsigned char index;
1573 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
1575 VCLK = pVBInfo->VCLKData[index].CLOCK;
1578 data = xgifb_reg_get(pVBInfo->P3c4, 0x32);
1581 data |= 0x0c; /* VCLK > 200 */
1583 if (HwDeviceExtension->jChipType >= XG20)
1584 data &= ~0x04; /* 2 pixel mode */
1586 xgifb_reg_set(pVBInfo->P3c4, 0x32, data);
1588 if (HwDeviceExtension->jChipType < XG20) {
1589 data = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
1593 xgifb_reg_set(pVBInfo->P3c4, 0x1F, data);
1596 /* Jong for Adavantech LCD ripple issue
1597 if ((VCLK >= 0) && (VCLK < 135))
1599 else if ((VCLK >= 135) && (VCLK < 160))
1601 else if ((VCLK >= 160) && (VCLK < 260))
1603 else if (VCLK > 260)
1608 xgifb_reg_and_or(pVBInfo->P3c4, 0x07, 0xFC, data2);
1609 if (HwDeviceExtension->jChipType >= XG27)
1610 xgifb_reg_and_or(pVBInfo->P3c4, 0x40, 0xFC, data2 & 0x03);
1614 static void XGI_SetCRT1ModeRegs(struct xgi_hw_device_info *HwDeviceExtension,
1615 unsigned short ModeNo, unsigned short ModeIdIndex,
1616 unsigned short RefreshRateTableIndex,
1617 struct vb_device_info *pVBInfo)
1619 unsigned short data, data2, data3, infoflag = 0, modeflag, resindex,
1622 if (ModeNo > 0x13) {
1623 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1624 infoflag = pVBInfo->RefIndex[RefreshRateTableIndex].
1627 /* si+St_ModeFlag */
1628 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1630 if (xgifb_reg_get(pVBInfo->P3d4, 0x31) & 0x01)
1631 xgifb_reg_and_or(pVBInfo->P3c4, 0x1F, 0x3F, 0x00);
1640 if (ModeNo > 0x13) {
1641 if (pVBInfo->ModeType > 0x02) {
1643 data3 = pVBInfo->ModeType - ModeVGA;
1649 data &= InterlaceMode;
1654 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x3F, data2);
1655 /* xgifb_reg_set(pVBInfo->P3c4,0x06,data2); */
1656 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
1658 xres = pVBInfo->StResInfo[resindex].HTotal;
1660 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
1663 if (infoflag & InterlaceMode) {
1666 else if (xres == 1280)
1670 data2 = data & 0x00FF;
1671 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFF, data2);
1672 data2 = (data & 0xFF00) >> 8;
1673 xgifb_reg_and_or(pVBInfo->P3d4, 0x19, 0xFC, data2);
1675 if (modeflag & HalfDCLK)
1676 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xF7, 0x08);
1680 if (modeflag & LineCompareOff)
1683 if (ModeNo > 0x13) {
1684 if (pVBInfo->ModeType == ModeEGA)
1688 xgifb_reg_and_or(pVBInfo->P3c4, 0x0F, ~0x48, data2);
1690 if (pVBInfo->ModeType != ModeText) {
1692 if (pVBInfo->ModeType != ModeEGA)
1695 xgifb_reg_and_or(pVBInfo->P3c4, 0x21, 0x1F, data);
1697 XGI_SetVCLKState(HwDeviceExtension, ModeNo, RefreshRateTableIndex,
1700 /* if (modeflag&HalfDCLK) //030305 fix lowresolution bug */
1701 /* if (XGINew_IF_DEF_NEW_LOWRES) */
1702 /* XGI_VesaLowResolution(ModeNo, ModeIdIndex);
1703 * //030305 fix lowresolution bug */
1705 data = xgifb_reg_get(pVBInfo->P3d4, 0x31);
1707 if (HwDeviceExtension->jChipType == XG27) {
1712 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1713 xgifb_reg_or(pVBInfo->P3d4, 0x51, 0x10);
1714 } else if (HwDeviceExtension->jChipType >= XG20) {
1719 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1720 xgifb_reg_set(pVBInfo->P3d4, 0x51, 0x02);
1726 xgifb_reg_set(pVBInfo->P3d4, 0x52, data);
1732 void XGI_VesaLowResolution(unsigned short ModeNo,
1733 unsigned short ModeIdIndex,
1734 struct vb_device_info *pVBInfo)
1736 unsigned short modeflag;
1739 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1741 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1743 if (ModeNo > 0x13) {
1744 if (modeflag & DoubleScanMode) {
1745 if (modeflag & HalfDCLK) {
1746 if (pVBInfo->VBType & VB_XGI301B |
1751 if (!(pVBInfo->VBInfo &
1753 if (pVBInfo->VBInfo &
1769 xgifb_reg_and_or(pVBInfo->P3c4,
1773 xgifb_reg_and_or(pVBInfo->P3c4,
1781 xgifb_reg_and_or(pVBInfo->P3c4, 0x0f, 0x7f, 0x00);
1785 static void XGI_WriteDAC(unsigned short dl,
1789 struct vb_device_info *pVBInfo)
1791 unsigned short temp, bh, bl;
1810 outb((unsigned short) dh, pVBInfo->P3c9);
1811 outb((unsigned short) bh, pVBInfo->P3c9);
1812 outb((unsigned short) bl, pVBInfo->P3c9);
1815 static void XGI_LoadDAC(unsigned short ModeNo, unsigned short ModeIdIndex,
1816 struct vb_device_info *pVBInfo)
1818 unsigned short data, data2, time, i, j, k, m, n, o, si, di, bx, dl, al,
1819 ah, dh, *table = NULL;
1822 data = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1824 data = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1826 data &= DACInfoFlag;
1830 table = XGINew_MDA_DAC;
1831 else if (data == 0x08)
1832 table = XGINew_CGA_DAC;
1833 else if (data == 0x10)
1834 table = XGINew_EGA_DAC;
1835 else if (data == 0x18) {
1837 table = XGINew_VGA_DAC;
1845 outb(0xFF, pVBInfo->P3c6);
1846 outb(0x00, pVBInfo->P3c8);
1848 for (i = 0; i < j; i++) {
1851 for (k = 0; k < 3; k++) {
1860 outb(data2, pVBInfo->P3c9);
1866 for (i = 16; i < 32; i++) {
1869 for (k = 0; k < 3; k++)
1870 outb(data, pVBInfo->P3c9);
1875 for (m = 0; m < 9; m++) {
1880 for (n = 0; n < 3; n++) {
1881 for (o = 0; o < 5; o++) {
1886 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1891 for (o = 0; o < 3; o++) {
1896 XGI_WriteDAC(dl, ah, al, dh, pVBInfo);
1907 static void XGI_GetLVDSResInfo(unsigned short ModeNo,
1908 unsigned short ModeIdIndex,
1909 struct vb_device_info *pVBInfo)
1911 unsigned short resindex, xres, yres, modeflag;
1915 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1917 /* si+Ext_ResInfo */
1918 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
1920 /* if (ModeNo > 0x13) */
1921 /* modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag; */
1923 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag; */
1927 resindex = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
1929 /* si+Ext_ResInfo */
1930 resindex = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
1932 /* resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo); */
1934 if (ModeNo <= 0x13) {
1935 xres = pVBInfo->StResInfo[resindex].HTotal;
1936 yres = pVBInfo->StResInfo[resindex].VTotal;
1938 xres = pVBInfo->ModeResInfo[resindex].HTotal;
1939 yres = pVBInfo->ModeResInfo[resindex].VTotal;
1941 if (ModeNo > 0x13) {
1942 if (modeflag & HalfDCLK)
1945 if (modeflag & DoubleScanMode)
1948 /* if (modeflag & Charx8Dot) */
1955 pVBInfo->VGAHDE = xres;
1956 pVBInfo->HDE = xres;
1957 pVBInfo->VGAVDE = yres;
1958 pVBInfo->VDE = yres;
1961 static void *XGI_GetLcdPtr(unsigned short BX, unsigned short ModeNo,
1962 unsigned short ModeIdIndex,
1963 unsigned short RefreshRateTableIndex,
1964 struct vb_device_info *pVBInfo)
1966 unsigned short i, tempdx, tempcx, tempbx, tempal, modeflag, table;
1968 struct XGI330_LCDDataTablStruct *tempdi = NULL;
1972 if (ModeNo <= 0x13) {
1973 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
1974 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1976 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
1977 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
1980 tempal = tempal & 0x0f;
1982 if (tempbx <= 1) { /* ExpLink */
1983 if (ModeNo <= 0x13) {
1984 /* find no Ext_CRT2CRTC2 */
1985 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
1987 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].
1991 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
1993 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
1996 tempal = pVBInfo->RefIndex[
1997 RefreshRateTableIndex].
2002 tempal = (tempal >> 4);
2004 tempal = (tempal & 0x0f);
2007 tempcx = LCDLenList[tempbx]; /* mov cl,byte ptr cs:LCDLenList[bx] */
2009 if (pVBInfo->LCDInfo & EnableScalingLCD) { /* ScaleLCD */
2010 if ((tempbx == 5) || (tempbx) == 7)
2011 tempcx = LCDDesDataLen2;
2012 else if ((tempbx == 3) || (tempbx == 8))
2013 tempcx = LVDSDesDataLen2;
2015 /* mov di, word ptr cs:LCDDataList[bx] */
2016 /* tempdi = pVideoMemory[LCDDataList + tempbx * 2] |
2017 (pVideoMemory[LCDDataList + tempbx * 2 + 1] << 8); */
2021 tempdi = XGI_EPLLCDCRT1Ptr_H;
2024 tempdi = XGI_EPLLCDCRT1Ptr_V;
2027 tempdi = XGI_EPLLCDDataPtr;
2030 tempdi = XGI_EPLLCDDesDataPtr;
2033 tempdi = XGI_LCDDataTable;
2036 tempdi = XGI_LCDDesDataTable;
2039 tempdi = XGI_EPLCHLCDRegPtr;
2050 if (tempdi == NULL) /* OEMUtil */
2056 while (tempdi[i].PANELID != 0xff) {
2057 tempdx = pVBInfo->LCDResInfo;
2058 if (tempbx & 0x0080) { /* OEMUtil */
2059 tempbx &= (~0x0080);
2060 tempdx = pVBInfo->LCDTypeInfo;
2063 if (pVBInfo->LCDInfo & EnableScalingLCD)
2064 tempdx &= (~PanelResInfo);
2066 if (tempdi[i].PANELID == tempdx) {
2067 tempbx = tempdi[i].MASK;
2068 tempdx = pVBInfo->LCDInfo;
2070 if (ModeNo <= 0x13) /* alan 09/10/2003 */
2071 tempdx |= SetLCDStdMode;
2073 if (modeflag & HalfDCLK)
2074 tempdx |= SetLCDLowResolution;
2077 if (tempbx == tempdi[i].CAP)
2084 switch (tempdi[i].DATAPTR) {
2086 return &XGI_LVDSCRT11024x768_1_H[tempal];
2089 return &XGI_LVDSCRT11024x768_2_H[tempal];
2092 return &XGI_LVDSCRT11280x1024_1_H[tempal];
2095 return &XGI_LVDSCRT11280x1024_2_H[tempal];
2098 return &XGI_LVDSCRT11400x1050_1_H[tempal];
2101 return &XGI_LVDSCRT11400x1050_2_H[tempal];
2104 return &XGI_LVDSCRT11600x1200_1_H[tempal];
2107 return &XGI_LVDSCRT11024x768_1_Hx75[tempal];
2110 return &XGI_LVDSCRT11024x768_2_Hx75[tempal];
2113 return &XGI_LVDSCRT11280x1024_1_Hx75[tempal];
2116 return &XGI_LVDSCRT11280x1024_2_Hx75[tempal];
2121 } else if (table == 1) {
2122 switch (tempdi[i].DATAPTR) {
2124 return &XGI_LVDSCRT11024x768_1_V[tempal];
2127 return &XGI_LVDSCRT11024x768_2_V[tempal];
2130 return &XGI_LVDSCRT11280x1024_1_V[tempal];
2133 return &XGI_LVDSCRT11280x1024_2_V[tempal];
2136 return &XGI_LVDSCRT11400x1050_1_V[tempal];
2139 return &XGI_LVDSCRT11400x1050_2_V[tempal];
2142 return &XGI_LVDSCRT11600x1200_1_V[tempal];
2145 return &XGI_LVDSCRT11024x768_1_Vx75[tempal];
2148 return &XGI_LVDSCRT11024x768_2_Vx75[tempal];
2151 return &XGI_LVDSCRT11280x1024_1_Vx75[tempal];
2154 return &XGI_LVDSCRT11280x1024_2_Vx75[tempal];
2159 } else if (table == 2) {
2160 switch (tempdi[i].DATAPTR) {
2162 return &XGI_LVDS1024x768Data_1[tempal];
2165 return &XGI_LVDS1024x768Data_2[tempal];
2168 return &XGI_LVDS1280x1024Data_1[tempal];
2171 return &XGI_LVDS1280x1024Data_2[tempal];
2174 return &XGI_LVDS1400x1050Data_1[tempal];
2177 return &XGI_LVDS1400x1050Data_2[tempal];
2180 return &XGI_LVDS1600x1200Data_1[tempal];
2183 return &XGI_LVDSNoScalingData[tempal];
2186 return &XGI_LVDS1024x768Data_1x75[tempal];
2189 return &XGI_LVDS1024x768Data_2x75[tempal];
2192 return &XGI_LVDS1280x1024Data_1x75[tempal];
2195 return &XGI_LVDS1280x1024Data_2x75[tempal];
2198 return &XGI_LVDSNoScalingDatax75[tempal];
2203 } else if (table == 3) {
2204 switch (tempdi[i].DATAPTR) {
2206 return &XGI_LVDS1024x768Des_1[tempal];
2209 return &XGI_LVDS1024x768Des_3[tempal];
2212 return &XGI_LVDS1024x768Des_2[tempal];
2215 return &XGI_LVDS1280x1024Des_1[tempal];
2218 return &XGI_LVDS1280x1024Des_2[tempal];
2221 return &XGI_LVDS1400x1050Des_1[tempal];
2224 return &XGI_LVDS1400x1050Des_2[tempal];
2227 return &XGI_LVDS1600x1200Des_1[tempal];
2230 return &XGI_LVDSNoScalingDesData[tempal];
2233 return &XGI_LVDS1024x768Des_1x75[tempal];
2236 return &XGI_LVDS1024x768Des_3x75[tempal];
2239 return &XGI_LVDS1024x768Des_2x75[tempal];
2242 return &XGI_LVDS1280x1024Des_1x75[tempal];
2245 return &XGI_LVDS1280x1024Des_2x75[tempal];
2248 return &XGI_LVDSNoScalingDesDatax75[tempal];
2253 } else if (table == 4) {
2254 switch (tempdi[i].DATAPTR) {
2256 return &XGI_ExtLCD1024x768Data[tempal];
2259 return &XGI_StLCD1024x768Data[tempal];
2262 return &XGI_CetLCD1024x768Data[tempal];
2265 return &XGI_ExtLCD1280x1024Data[tempal];
2268 return &XGI_StLCD1280x1024Data[tempal];
2271 return &XGI_CetLCD1280x1024Data[tempal];
2274 return &XGI_ExtLCD1400x1050Data[tempal];
2277 return &XGI_StLCD1400x1050Data[tempal];
2280 return &XGI_CetLCD1400x1050Data[tempal];
2283 return &XGI_ExtLCD1600x1200Data[tempal];
2286 return &XGI_StLCD1600x1200Data[tempal];
2289 return &XGI_NoScalingData[tempal];
2292 return &XGI_ExtLCD1024x768x75Data[tempal];
2295 return &XGI_ExtLCD1024x768x75Data[tempal];
2298 return &XGI_CetLCD1024x768x75Data[tempal];
2301 return &XGI_ExtLCD1280x1024x75Data[tempal];
2304 return &XGI_StLCD1280x1024x75Data[tempal];
2307 return &XGI_CetLCD1280x1024x75Data[tempal];
2310 return &XGI_NoScalingDatax75[tempal];
2315 } else if (table == 5) {
2316 switch (tempdi[i].DATAPTR) {
2318 return &XGI_ExtLCDDes1024x768Data[tempal];
2321 return &XGI_StLCDDes1024x768Data[tempal];
2324 return &XGI_CetLCDDes1024x768Data[tempal];
2327 if ((pVBInfo->VBType & VB_XGI301LV) ||
2328 (pVBInfo->VBType & VB_XGI302LV))
2329 return &XGI_ExtLCDDLDes1280x1024Data[tempal];
2331 return &XGI_ExtLCDDes1280x1024Data[tempal];
2334 if ((pVBInfo->VBType & VB_XGI301LV) ||
2335 (pVBInfo->VBType & VB_XGI302LV))
2336 return &XGI_StLCDDLDes1280x1024Data[tempal];
2338 return &XGI_StLCDDes1280x1024Data[tempal];
2341 if ((pVBInfo->VBType & VB_XGI301LV) ||
2342 (pVBInfo->VBType & VB_XGI302LV))
2343 return &XGI_CetLCDDLDes1280x1024Data[tempal];
2345 return &XGI_CetLCDDes1280x1024Data[tempal];
2348 if ((pVBInfo->VBType & VB_XGI301LV) ||
2349 (pVBInfo->VBType & VB_XGI302LV))
2350 return &XGI_ExtLCDDLDes1400x1050Data[tempal];
2352 return &XGI_ExtLCDDes1400x1050Data[tempal];
2355 if ((pVBInfo->VBType & VB_XGI301LV) ||
2356 (pVBInfo->VBType & VB_XGI302LV))
2357 return &XGI_StLCDDLDes1400x1050Data[tempal];
2359 return &XGI_StLCDDes1400x1050Data[tempal];
2362 return &XGI_CetLCDDes1400x1050Data[tempal];
2365 return &XGI_CetLCDDes1400x1050Data2[tempal];
2368 if ((pVBInfo->VBType & VB_XGI301LV) ||
2369 (pVBInfo->VBType & VB_XGI302LV))
2370 return &XGI_ExtLCDDLDes1600x1200Data[tempal];
2372 return &XGI_ExtLCDDes1600x1200Data[tempal];
2375 if ((pVBInfo->VBType & VB_XGI301LV) ||
2376 (pVBInfo->VBType & VB_XGI302LV))
2377 return &XGI_StLCDDLDes1600x1200Data[tempal];
2379 return &XGI_StLCDDes1600x1200Data[tempal];
2382 return &XGI_NoScalingDesData[tempal];
2385 return &XGI_ExtLCDDes1024x768x75Data[tempal];
2388 return &XGI_StLCDDes1024x768x75Data[tempal];
2391 return &XGI_CetLCDDes1024x768x75Data[tempal];
2394 if ((pVBInfo->VBType & VB_XGI301LV) ||
2395 (pVBInfo->VBType & VB_XGI302LV))
2396 return &XGI_ExtLCDDLDes1280x1024x75Data[tempal];
2398 return &XGI_ExtLCDDes1280x1024x75Data[tempal];
2401 if ((pVBInfo->VBType & VB_XGI301LV) ||
2402 (pVBInfo->VBType & VB_XGI302LV))
2403 return &XGI_StLCDDLDes1280x1024x75Data[tempal];
2405 return &XGI_StLCDDes1280x1024x75Data[tempal];
2408 if ((pVBInfo->VBType & VB_XGI301LV) ||
2409 (pVBInfo->VBType & VB_XGI302LV))
2410 return &XGI_CetLCDDLDes1280x1024x75Data[tempal];
2412 return &XGI_CetLCDDes1280x1024x75Data[tempal];
2415 return &XGI_NoScalingDesDatax75[tempal];
2420 } else if (table == 6) {
2421 switch (tempdi[i].DATAPTR) {
2423 return &XGI_CH7017LV1024x768[tempal];
2426 return &XGI_CH7017LV1400x1050[tempal];
2435 static void *XGI_GetTVPtr(unsigned short BX, unsigned short ModeNo,
2436 unsigned short ModeIdIndex,
2437 unsigned short RefreshRateTableIndex,
2438 struct vb_device_info *pVBInfo)
2440 unsigned short i, tempdx, tempbx, tempal, modeflag, table;
2441 struct XGI330_TVDataTablStruct *tempdi = NULL;
2445 if (ModeNo <= 0x13) {
2446 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
2447 tempal = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2449 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2450 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
2453 tempal = tempal & 0x3f;
2458 tempdi = NULL; /*EPLCHTVCRT1Ptr_H;*/
2459 if (pVBInfo->IF_DEF_CH7007 == 1)
2460 tempdi = XGI_EPLCHTVCRT1Ptr;
2464 tempdi = NULL; /*EPLCHTVCRT1Ptr_V;*/
2465 if (pVBInfo->IF_DEF_CH7007 == 1)
2466 tempdi = XGI_EPLCHTVCRT1Ptr;
2470 tempdi = XGI_EPLCHTVDataPtr;
2476 tempdi = XGI_TVDataTable;
2482 tempdi = XGI_EPLCHTVRegPtr;
2488 if (tempdi == NULL) /* OEMUtil */
2491 tempdx = pVBInfo->TVInfo;
2493 if (pVBInfo->VBInfo & SetInSlaveMode)
2494 tempdx = tempdx | SetTVLockMode;
2496 if (modeflag & HalfDCLK)
2497 tempdx = tempdx | SetTVLowResolution;
2501 while (tempdi[i].MASK != 0xffff) {
2502 if ((tempdx & tempdi[i].MASK) == tempdi[i].CAP)
2508 if (table == 0x00) {
2509 } else if (table == 0x01) {
2510 } else if (table == 0x04) {
2511 switch (tempdi[i].DATAPTR) {
2513 return &XGI_ExtPALData[tempal];
2516 return &XGI_ExtNTSCData[tempal];
2519 return &XGI_StPALData[tempal];
2522 return &XGI_StNTSCData[tempal];
2525 return &XGI_ExtHiTVData[tempal];
2528 return &XGI_St2HiTVData[tempal];
2531 return &XGI_ExtYPbPr525iData[tempal];
2534 return &XGI_ExtYPbPr525pData[tempal];
2537 return &XGI_ExtYPbPr750pData[tempal];
2540 return &XGI_StYPbPr525iData[tempal];
2543 return &XGI_StYPbPr525pData[tempal];
2546 return &XGI_StYPbPr750pData[tempal];
2548 case 12: /* avoid system hang */
2549 return &XGI_ExtNTSCData[tempal];
2552 return &XGI_St1HiTVData[tempal];
2557 } else if (table == 0x02) {
2558 switch (tempdi[i].DATAPTR) {
2560 return &XGI_CHTVUNTSCData[tempal];
2563 return &XGI_CHTVONTSCData[tempal];
2566 return &XGI_CHTVUPALData[tempal];
2569 return &XGI_CHTVOPALData[tempal];
2574 } else if (table == 0x06) {
2579 static void XGI_GetLVDSData(unsigned short ModeNo, unsigned short ModeIdIndex,
2580 unsigned short RefreshRateTableIndex,
2581 struct vb_device_info *pVBInfo)
2583 unsigned short tempbx;
2584 struct XGI330_LVDSDataStruct *LCDPtr = NULL;
2588 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2589 LCDPtr = (struct XGI330_LVDSDataStruct *) XGI_GetLcdPtr(tempbx,
2590 ModeNo, ModeIdIndex, RefreshRateTableIndex,
2592 pVBInfo->VGAHT = LCDPtr->VGAHT;
2593 pVBInfo->VGAVT = LCDPtr->VGAVT;
2594 pVBInfo->HT = LCDPtr->LCDHT;
2595 pVBInfo->VT = LCDPtr->LCDVT;
2598 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2599 if (!(pVBInfo->LCDInfo & (SetLCDtoNonExpanding
2600 | EnableScalingLCD))) {
2601 if ((pVBInfo->LCDResInfo == Panel1024x768) ||
2602 (pVBInfo->LCDResInfo == Panel1024x768x75)) {
2603 pVBInfo->HDE = 1024;
2605 } else if ((pVBInfo->LCDResInfo == Panel1280x1024) ||
2606 (pVBInfo->LCDResInfo == Panel1280x1024x75)) {
2607 pVBInfo->HDE = 1280;
2608 pVBInfo->VDE = 1024;
2609 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
2610 pVBInfo->HDE = 1400;
2611 pVBInfo->VDE = 1050;
2613 pVBInfo->HDE = 1600;
2614 pVBInfo->VDE = 1200;
2620 static void XGI_ModCRT1Regs(unsigned short ModeNo, unsigned short ModeIdIndex,
2621 unsigned short RefreshRateTableIndex,
2622 struct xgi_hw_device_info *HwDeviceExtension,
2623 struct vb_device_info *pVBInfo)
2625 unsigned char index;
2626 unsigned short tempbx, i;
2627 struct XGI_LVDSCRT1HDataStruct *LCDPtr = NULL;
2628 struct XGI_LVDSCRT1VDataStruct *LCDPtr1 = NULL;
2629 /* struct XGI330_CHTVDataStruct *TVPtr = NULL; */
2630 struct XGI_CH7007TV_TimingHStruct *CH7007TV_TimingHPtr = NULL;
2631 struct XGI_CH7007TV_TimingVStruct *CH7007TV_TimingVPtr = NULL;
2634 index = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
2636 index = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRT2CRTC;
2638 index = index & IndexMask;
2640 if ((pVBInfo->IF_DEF_ScaleLCD == 0) ||
2641 ((pVBInfo->IF_DEF_ScaleLCD == 1) &&
2642 (!(pVBInfo->LCDInfo & EnableScalingLCD)))) {
2645 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2646 LCDPtr = (struct XGI_LVDSCRT1HDataStruct *)
2647 XGI_GetLcdPtr(tempbx, ModeNo,
2649 RefreshRateTableIndex,
2652 for (i = 0; i < 8; i++)
2653 pVBInfo->TimingH[0].data[i] = LCDPtr[0].Reg[i];
2656 if (pVBInfo->IF_DEF_CH7007 == 1) {
2657 if (pVBInfo->VBInfo & SetCRT2ToTV) {
2658 CH7007TV_TimingHPtr =
2659 (struct XGI_CH7007TV_TimingHStruct *)
2664 RefreshRateTableIndex,
2667 for (i = 0; i < 8; i++)
2668 pVBInfo->TimingH[0].data[i] =
2669 CH7007TV_TimingHPtr[0].data[i];
2673 XGI_SetCRT1Timing_H(pVBInfo, HwDeviceExtension);
2675 if (pVBInfo->IF_DEF_CH7007 == 1) {
2676 xgifb_reg_set(pVBInfo->P3c4, 0x2E,
2677 CH7007TV_TimingHPtr[0].data[8]);
2678 xgifb_reg_set(pVBInfo->P3c4, 0x2F,
2679 CH7007TV_TimingHPtr[0].data[9]);
2684 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
2685 LCDPtr1 = (struct XGI_LVDSCRT1VDataStruct *)
2690 RefreshRateTableIndex,
2692 for (i = 0; i < 7; i++)
2693 pVBInfo->TimingV[0].data[i] = LCDPtr1[0].Reg[i];
2696 if (pVBInfo->IF_DEF_CH7007 == 1) {
2697 if (pVBInfo->VBInfo & SetCRT2ToTV) {
2698 CH7007TV_TimingVPtr =
2699 (struct XGI_CH7007TV_TimingVStruct *)
2704 RefreshRateTableIndex,
2707 for (i = 0; i < 7; i++)
2708 pVBInfo->TimingV[0].data[i] =
2709 CH7007TV_TimingVPtr[0].data[i];
2713 XGI_SetCRT1Timing_V(ModeIdIndex, ModeNo, pVBInfo);
2715 if (pVBInfo->IF_DEF_CH7007 == 1) {
2716 xgifb_reg_and_or(pVBInfo->P3c4, 0x33, ~0x01,
2717 CH7007TV_TimingVPtr[0].data[7] & 0x01);
2718 xgifb_reg_set(pVBInfo->P3c4, 0x34,
2719 CH7007TV_TimingVPtr[0].data[8]);
2720 xgifb_reg_set(pVBInfo->P3c4, 0x3F,
2721 CH7007TV_TimingVPtr[0].data[9]);
2727 static unsigned short XGI_GetLCDCapPtr(struct vb_device_info *pVBInfo)
2729 unsigned char tempal, tempah, tempbl, i;
2731 tempah = xgifb_reg_get(pVBInfo->P3d4, 0x36);
2732 tempal = tempah & 0x0F;
2733 tempah = tempah & 0xF0;
2735 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2737 while (tempbl != 0xFF) {
2738 if (tempbl & 0x80) { /* OEMUtil */
2740 tempbl = tempbl & ~(0x80);
2743 if (tempal == tempbl)
2748 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2754 static unsigned short XGI_GetLCDCapPtr1(struct vb_device_info *pVBInfo)
2756 unsigned short tempah, tempal, tempbl, i;
2758 tempal = pVBInfo->LCDResInfo;
2759 tempah = pVBInfo->LCDTypeInfo;
2762 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2764 while (tempbl != 0xFF) {
2765 if ((tempbl & 0x80) && (tempbl != 0x80)) {
2770 if (tempal == tempbl)
2774 tempbl = pVBInfo->LCDCapList[i].LCD_ID;
2777 if (tempbl == 0xFF) {
2778 pVBInfo->LCDResInfo = Panel1024x768;
2779 pVBInfo->LCDTypeInfo = 0;
2786 static void XGI_GetLCDSync(unsigned short *HSyncWidth,
2787 unsigned short *VSyncWidth,
2788 struct vb_device_info *pVBInfo)
2790 unsigned short Index;
2792 Index = XGI_GetLCDCapPtr(pVBInfo);
2793 *HSyncWidth = pVBInfo->LCDCapList[Index].LCD_HSyncWidth;
2794 *VSyncWidth = pVBInfo->LCDCapList[Index].LCD_VSyncWidth;
2799 static void XGI_SetLVDSRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
2800 unsigned short RefreshRateTableIndex,
2801 struct vb_device_info *pVBInfo)
2803 unsigned short tempbx, tempax, tempcx, tempdx, push1, push2, modeflag;
2804 unsigned long temp, temp1, temp2, temp3, push3;
2805 struct XGI330_LCDDataDesStruct *LCDPtr = NULL;
2806 struct XGI330_LCDDataDesStruct2 *LCDPtr1 = NULL;
2809 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
2811 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
2813 if (!(pVBInfo->SetFlag & Win9xDOSMode)) {
2814 if (pVBInfo->IF_DEF_OEMUtil == 1) {
2816 LCDPtr = (struct XGI330_LCDDataDesStruct *)
2817 XGI_GetLcdPtr(tempbx,
2820 RefreshRateTableIndex,
2824 if ((pVBInfo->IF_DEF_OEMUtil == 0) ||
2827 if (pVBInfo->LCDInfo & EnableScalingLCD)
2829 (struct XGI330_LCDDataDesStruct2 *)
2834 RefreshRateTableIndex,
2838 (struct XGI330_LCDDataDesStruct *)
2843 RefreshRateTableIndex,
2847 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
2852 if ((pVBInfo->LCDResInfo == Panel1024x768) ||
2853 (pVBInfo->LCDResInfo == Panel1024x768x75)) {
2856 } else if ((pVBInfo->LCDResInfo == Panel1280x1024) ||
2857 (pVBInfo->LCDResInfo == Panel1280x1024x75)) {
2860 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
2868 if (pVBInfo->LCDInfo & SetLCDtoNonExpanding) {
2869 pVBInfo->HDE = tempax;
2870 pVBInfo->VDE = tempbx;
2871 pVBInfo->VGAHDE = tempax;
2872 pVBInfo->VGAVDE = tempbx;
2875 if ((pVBInfo->IF_DEF_ScaleLCD == 1) &&
2876 (pVBInfo->LCDInfo & EnableScalingLCD)) {
2877 tempax = pVBInfo->HDE;
2878 tempbx = pVBInfo->VDE;
2881 tempax = pVBInfo->HT;
2883 if (pVBInfo->LCDInfo & EnableScalingLCD)
2884 tempbx = LCDPtr1->LCDHDES;
2886 tempbx = LCDPtr->LCDHDES;
2888 tempcx = pVBInfo->HDE;
2889 tempbx = tempbx & 0x0fff;
2892 if (tempcx >= tempax)
2895 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, tempbx & 0x07);
2897 tempcx = tempcx >> 3;
2898 tempbx = tempbx >> 3;
2900 xgifb_reg_set(pVBInfo->Part1Port, 0x16,
2901 (unsigned short) (tempbx & 0xff));
2902 xgifb_reg_set(pVBInfo->Part1Port, 0x17,
2903 (unsigned short) (tempcx & 0xff));
2905 tempax = pVBInfo->HT;
2907 if (pVBInfo->LCDInfo & EnableScalingLCD)
2908 tempbx = LCDPtr1->LCDHRS;
2910 tempbx = LCDPtr->LCDHRS;
2914 if (pVBInfo->LCDInfo & EnableScalingLCD)
2915 tempcx = LCDPtr1->LCDHSync;
2919 if (tempcx >= tempax)
2922 tempax = tempbx & 0x07;
2923 tempax = tempax >> 5;
2924 tempcx = tempcx >> 3;
2925 tempbx = tempbx >> 3;
2930 xgifb_reg_set(pVBInfo->Part1Port, 0x15, tempax);
2931 xgifb_reg_set(pVBInfo->Part1Port, 0x14,
2932 (unsigned short) (tempbx & 0xff));
2934 tempax = pVBInfo->VT;
2935 if (pVBInfo->LCDInfo & EnableScalingLCD)
2936 tempbx = LCDPtr1->LCDVDES;
2938 tempbx = LCDPtr->LCDVDES;
2939 tempcx = pVBInfo->VDE;
2941 tempbx = tempbx & 0x0fff;
2943 if (tempcx >= tempax)
2946 xgifb_reg_set(pVBInfo->Part1Port, 0x1b,
2947 (unsigned short) (tempbx & 0xff));
2948 xgifb_reg_set(pVBInfo->Part1Port, 0x1c,
2949 (unsigned short) (tempcx & 0xff));
2951 tempbx = (tempbx >> 8) & 0x07;
2952 tempcx = (tempcx >> 8) & 0x07;
2954 xgifb_reg_set(pVBInfo->Part1Port, 0x1d,
2955 (unsigned short) ((tempcx << 3)
2958 tempax = pVBInfo->VT;
2959 if (pVBInfo->LCDInfo & EnableScalingLCD)
2960 tempbx = LCDPtr1->LCDVRS;
2962 tempbx = LCDPtr->LCDVRS;
2964 /* tempbx = tempbx >> 4; */
2967 if (pVBInfo->LCDInfo & EnableScalingLCD)
2968 tempcx = LCDPtr1->LCDVSync;
2971 if (tempcx >= tempax)
2974 xgifb_reg_set(pVBInfo->Part1Port, 0x18,
2975 (unsigned short) (tempbx & 0xff));
2976 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, ~0x0f,
2977 (unsigned short) (tempcx & 0x0f));
2979 tempax = ((tempbx >> 8) & 0x07) << 3;
2981 tempbx = pVBInfo->VGAVDE;
2982 if (tempbx != pVBInfo->VDE)
2985 if (pVBInfo->LCDInfo & EnableLVDSDDA)
2988 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1a, 0x07,
2991 tempcx = pVBInfo->VGAVT;
2992 tempbx = pVBInfo->VDE;
2993 tempax = pVBInfo->VGAVDE;
2996 temp = tempax; /* 0430 ylshieh */
2997 temp1 = (temp << 18) / tempbx;
2999 tempdx = (unsigned short) ((temp << 18) % tempbx);
3007 xgifb_reg_set(pVBInfo->Part1Port, 0x37,
3008 (unsigned short) (temp2 & 0xff));
3009 xgifb_reg_set(pVBInfo->Part1Port, 0x36,
3010 (unsigned short) ((temp2 >> 8) & 0xff));
3012 tempbx = (unsigned short) (temp2 >> 16);
3013 tempax = tempbx & 0x03;
3015 tempbx = pVBInfo->VGAVDE;
3016 if (tempbx == pVBInfo->VDE)
3019 xgifb_reg_set(pVBInfo->Part1Port, 0x35, tempax);
3021 if (pVBInfo->VBType & VB_XGI301C) {
3023 xgifb_reg_set(pVBInfo->Part4Port,
3025 (unsigned short) (temp2 & 0xff));
3026 xgifb_reg_set(pVBInfo->Part4Port,
3028 (unsigned short) ((temp2 >> 8) &
3030 tempbx = (unsigned short) (temp2 >> 16);
3031 xgifb_reg_and_or(pVBInfo->Part4Port, 0x3a,
3033 (unsigned short) ((tempbx &
3036 tempcx = pVBInfo->VGAVDE;
3037 if (tempcx == pVBInfo->VDE)
3038 xgifb_reg_and_or(pVBInfo->Part4Port,
3041 xgifb_reg_and_or(pVBInfo->Part4Port,
3045 tempcx = pVBInfo->VGAHDE;
3046 tempbx = pVBInfo->HDE;
3048 temp1 = tempcx << 16;
3050 tempax = (unsigned short) (temp1 / tempbx);
3052 if ((tempbx & 0xffff) == (tempcx & 0xffff))
3056 temp1 = pVBInfo->VGAHDE << 16;
3059 temp3 = temp3 << 16;
3062 temp3 = (temp3 & 0xffff0000) + (temp1 & 0xffff);
3064 tempax = (unsigned short) (temp3 & 0xff);
3065 xgifb_reg_set(pVBInfo->Part1Port, 0x1f, tempax);
3067 temp1 = pVBInfo->VGAVDE << 18;
3068 temp1 = temp1 / push3;
3069 tempbx = (unsigned short) (temp1 & 0xffff);
3071 if (pVBInfo->LCDResInfo == Panel1024x768)
3074 tempax = ((tempbx >> 8) & 0xff) << 3;
3075 tempax |= (unsigned short) ((temp3 >> 8) & 0x07);
3076 xgifb_reg_set(pVBInfo->Part1Port, 0x20,
3077 (unsigned short) (tempax & 0xff));
3078 xgifb_reg_set(pVBInfo->Part1Port, 0x21,
3079 (unsigned short) (tempbx & 0xff));
3081 temp3 = temp3 >> 16;
3083 if (modeflag & HalfDCLK)
3086 xgifb_reg_set(pVBInfo->Part1Port, 0x22,
3087 (unsigned short) ((temp3 >> 8) & 0xff));
3088 xgifb_reg_set(pVBInfo->Part1Port, 0x23,
3089 (unsigned short) (temp3 & 0xff));
3093 /* --------------------------------------------------------------------- */
3094 /* Function : XGI_GETLCDVCLKPtr */
3096 /* Output : al -> VCLK Index */
3098 /* --------------------------------------------------------------------- */
3099 static void XGI_GetLCDVCLKPtr(unsigned char *di_0, unsigned char *di_1,
3100 struct vb_device_info *pVBInfo)
3102 unsigned short index;
3104 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
3105 if (pVBInfo->IF_DEF_ScaleLCD == 1) {
3106 if (pVBInfo->LCDInfo & EnableScalingLCD)
3110 /* index = XGI_GetLCDCapPtr(pVBInfo); */
3111 index = XGI_GetLCDCapPtr1(pVBInfo);
3113 if (pVBInfo->VBInfo & SetCRT2ToLCD) { /* LCDB */
3114 *di_0 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData1;
3115 *di_1 = pVBInfo->LCDCapList[index].LCUCHAR_VCLKData2;
3117 *di_0 = pVBInfo->LCDCapList[index].LCDA_VCLKData1;
3118 *di_1 = pVBInfo->LCDCapList[index].LCDA_VCLKData2;
3124 static unsigned char XGI_GetVCLKPtr(unsigned short RefreshRateTableIndex,
3125 unsigned short ModeNo, unsigned short ModeIdIndex,
3126 struct vb_device_info *pVBInfo)
3129 unsigned short index, modeflag;
3130 unsigned short tempbx;
3131 unsigned char tempal;
3132 unsigned char *CHTVVCLKPtr = NULL;
3136 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3138 /* si+Ext_ResInfo */
3139 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3141 if ((pVBInfo->SetFlag & ProgrammingCRT2) &&
3142 (!(pVBInfo->LCDInfo & EnableScalingLCD))) { /* {LCDA/LCDB} */
3143 index = XGI_GetLCDCapPtr(pVBInfo);
3144 tempal = pVBInfo->LCDCapList[index].LCD_VCLK;
3146 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))
3150 if (pVBInfo->VBType &
3156 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3157 tempal = HiTVVCLKDIV2;
3158 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
3160 if (pVBInfo->TVInfo & TVSimuMode) {
3161 tempal = HiTVSimuVCLK;
3162 if (!(modeflag & Charx8Dot))
3163 tempal = HiTVTextVCLK;
3169 if (pVBInfo->TVInfo & SetYPbPrMode750p) {
3170 tempal = YPbPr750pVCLK;
3174 if (pVBInfo->TVInfo & SetYPbPrMode525p) {
3175 tempal = YPbPr525pVCLK;
3179 tempal = NTSC1024VCLK;
3181 if (!(pVBInfo->TVInfo & NTSC1024x768)) {
3182 tempal = TVVCLKDIV2;
3183 if (!(pVBInfo->TVInfo & RPLLDIV2XO))
3187 if (pVBInfo->VBInfo & SetCRT2ToTV)
3192 if ((pVBInfo->IF_DEF_CH7007 == 1) &&
3193 (pVBInfo->VBType & VB_CH7007)) { /* [Billy] 07/05/08 CH7007 */
3194 /* VideoDebugPrint((
3196 "XGI_GetVCLKPtr: pVBInfo->IF_DEF_CH7007==1\n")); */
3197 if ((pVBInfo->VBInfo & SetCRT2ToTV)) {
3198 if (ModeNo <= 0x13) {
3199 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
3202 tempal = pVBInfo->RefIndex[
3203 RefreshRateTableIndex].Ext_CRT2CRTC;
3206 tempal = tempal & 0x0F;
3209 if (pVBInfo->TVInfo & SetPALTV)
3210 tempbx = tempbx + 2;
3212 if (pVBInfo->TVInfo & SetCHTVOverScan)
3215 /** tempbx = tempbx << 1; CH7007 ? **/
3217 /* [Billy]07/05/29 CH7007 */
3218 if (pVBInfo->IF_DEF_CH7007 == 1) {
3221 CHTVVCLKPtr = XGI7007_CHTVVCLKUNTSC;
3224 CHTVVCLKPtr = XGI7007_CHTVVCLKONTSC;
3227 CHTVVCLKPtr = XGI7007_CHTVVCLKUPAL;
3230 CHTVVCLKPtr = XGI7007_CHTVVCLKOPAL;
3240 CHTVVCLKPtr = pVBInfo->CHTVVCLKUNTSC;
3243 CHTVVCLKPtr = pVBInfo->CHTVVCLKONTSC;
3246 CHTVVCLKPtr = pVBInfo->CHTVVCLKUPAL;
3249 CHTVVCLKPtr = pVBInfo->CHTVVCLKOPAL;
3257 tempal = CHTVVCLKPtr[tempal];
3263 tempal = (unsigned char) inb((pVBInfo->P3ca + 0x02));
3264 tempal = tempal >> 2;
3267 /* for Dot8 Scaling LCD */
3268 if ((pVBInfo->LCDInfo & EnableScalingLCD) && (modeflag & Charx8Dot))
3269 tempal = tempal ^ tempal; /* ; set to VCLK25MHz always */
3274 tempal = pVBInfo->RefIndex[RefreshRateTableIndex].Ext_CRTVCLK;
3278 static void XGI_GetVCLKLen(unsigned char tempal, unsigned char *di_0,
3279 unsigned char *di_1, struct vb_device_info *pVBInfo)
3281 if (pVBInfo->IF_DEF_CH7007 == 1) { /* [Billy] 2007/05/16 */
3282 /* VideoDebugPrint((
3284 "XGI_GetVCLKLen: pVBInfo->IF_DEF_CH7007==1\n")); */
3285 *di_0 = (unsigned char) XGI_CH7007VCLKData[tempal].SR2B;
3286 *di_1 = (unsigned char) XGI_CH7007VCLKData[tempal].SR2C;
3287 } else if (pVBInfo->VBType & (VB_XGI301 | VB_XGI301B | VB_XGI302B
3288 | VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
3289 if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) && (pVBInfo->SetFlag
3290 & ProgrammingCRT2)) {
3291 *di_0 = (unsigned char) XGI_VBVCLKData[tempal].SR2B;
3292 *di_1 = XGI_VBVCLKData[tempal].SR2C;
3295 *di_0 = XGI_VCLKData[tempal].SR2B;
3296 *di_1 = XGI_VCLKData[tempal].SR2C;
3300 static void XGI_SetCRT2ECLK(unsigned short ModeNo, unsigned short ModeIdIndex,
3301 unsigned short RefreshRateTableIndex,
3302 struct vb_device_info *pVBInfo)
3304 unsigned char di_0, di_1, tempal;
3307 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
3309 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
3310 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
3312 for (i = 0; i < 4; i++) {
3313 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, ~0x30,
3314 (unsigned short) (0x10 * i));
3315 if (pVBInfo->IF_DEF_CH7007 == 1) {
3316 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
3317 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
3318 } else if ((!(pVBInfo->VBInfo & SetCRT2ToLCDA))
3319 && (!(pVBInfo->VBInfo & SetInSlaveMode))) {
3320 xgifb_reg_set(pVBInfo->P3c4, 0x2e, di_0);
3321 xgifb_reg_set(pVBInfo->P3c4, 0x2f, di_1);
3323 xgifb_reg_set(pVBInfo->P3c4, 0x2b, di_0);
3324 xgifb_reg_set(pVBInfo->P3c4, 0x2c, di_1);
3329 static void XGI_UpdateModeInfo(struct xgi_hw_device_info *HwDeviceExtension,
3330 struct vb_device_info *pVBInfo)
3332 unsigned short tempcl, tempch, temp, tempbl, tempax;
3334 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
3335 | VB_XGI302LV | VB_XGI301C)) {
3338 temp = xgifb_reg_get(pVBInfo->P3c4, 0x01);
3340 if (!(temp & 0x20)) {
3341 temp = xgifb_reg_get(pVBInfo->P3d4, 0x17);
3343 temp = xgifb_reg_get(pVBInfo->P3d4, 0x53);
3345 tempcl |= ActiveCRT1;
3349 temp = xgifb_reg_get(pVBInfo->Part1Port, 0x2e);
3352 if (!(temp == 0x08)) {
3353 /* Check ChannelA by Part1_13 [2003/10/03] */
3354 tempax = xgifb_reg_get(pVBInfo->Part1Port, 0x13);
3356 tempcl = tempcl | ActiveLCD;
3360 if (!(tempcl & ActiveLCD))
3362 tempcl |= ActiveCRT2;
3365 tempcl |= ActiveLCD;
3368 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x00);
3371 tempch |= ActiveAVideo;
3374 tempch |= ActiveSVideo;
3377 tempch |= ActiveSCART;
3379 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3381 tempch |= ActiveHiTV;
3384 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
3385 temp = xgifb_reg_get(
3390 tempch |= ActiveYPbPr;
3398 temp = xgifb_reg_get(pVBInfo->P3d4, 0x3d);
3399 if (tempcl & ActiveLCD) {
3400 if ((pVBInfo->SetFlag & ReserveTVOption)) {
3401 if (temp & ActiveTV)
3406 tempbl = ~ModeSwitchStatus;
3407 xgifb_reg_and_or(pVBInfo->P3d4, 0x3d, tempbl, temp);
3409 if (!(pVBInfo->SetFlag & ReserveTVOption))
3410 xgifb_reg_set(pVBInfo->P3d4, 0x3e, tempch);
3416 void XGI_GetVGAType(struct xgi_hw_device_info *HwDeviceExtension,
3417 struct vb_device_info *pVBInfo)
3420 if ( HwDeviceExtension->jChipType >= XG20 ) {
3421 pVBInfo->Set_VGAType = XG20;
3423 pVBInfo->Set_VGAType = VGA_XGI340;
3426 pVBInfo->Set_VGAType = HwDeviceExtension->jChipType;
3429 void XGI_GetVBType(struct vb_device_info *pVBInfo)
3431 unsigned short flag, tempbx, tempah;
3433 if (pVBInfo->IF_DEF_CH7007 == 1) {
3434 pVBInfo->VBType = VB_CH7007;
3437 if (pVBInfo->IF_DEF_LVDS == 0) {
3438 tempbx = VB_XGI302B;
3439 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
3442 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
3444 tempbx = VB_XGI301B;
3446 tempbx = VB_XGI301C;
3448 tempbx = VB_XGI301LV;
3450 tempbx = VB_XGI302LV;
3451 tempah = xgifb_reg_get(
3461 if (tempbx & (VB_XGI301B | VB_XGI302B)) {
3462 flag = xgifb_reg_get(
3467 tempbx = tempbx | VB_NoLCD;
3471 pVBInfo->VBType = tempbx;
3475 void XGI_GetVBInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3476 struct xgi_hw_device_info *HwDeviceExtension,
3477 struct vb_device_info *pVBInfo)
3479 unsigned short tempax, push, tempbx, temp, modeflag;
3482 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3484 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3486 pVBInfo->SetFlag = 0;
3487 pVBInfo->ModeType = modeflag & ModeInfoFlag;
3490 if (pVBInfo->VBType & 0xFFFF) {
3491 /* Check Display Device */
3492 temp = xgifb_reg_get(pVBInfo->P3d4, 0x30);
3493 tempbx = tempbx | temp;
3494 temp = xgifb_reg_get(pVBInfo->P3d4, 0x31);
3498 tempbx = tempbx | tempax;
3499 temp = (SetCRT2ToDualEdge | SetCRT2ToYPbPr | SetCRT2ToLCDA
3500 | SetInSlaveMode | DisableCRT2Display);
3501 temp = 0xFFFF ^ temp;
3504 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
3506 if (pVBInfo->IF_DEF_LCDA == 1) {
3508 if ((pVBInfo->Set_VGAType >= XG20)
3509 || (pVBInfo->Set_VGAType >= XG40)) {
3510 if (pVBInfo->IF_DEF_LVDS == 0) {
3511 /* if ((pVBInfo->VBType & VB_XGI302B)
3512 || (pVBInfo->VBType & VB_XGI301LV)
3513 || (pVBInfo->VBType & VB_XGI302LV)
3514 || (pVBInfo->VBType & VB_XGI301C))
3516 if (pVBInfo->VBType &
3521 if (temp & EnableDualEdge) {
3525 if (temp & SetToLCDA)
3534 if (pVBInfo->IF_DEF_YPbPr == 1) {
3535 /* [Billy] 07/05/04 */
3536 if (((pVBInfo->IF_DEF_LVDS == 0) &&
3537 ((pVBInfo->VBType & VB_XGI301LV) ||
3538 (pVBInfo->VBType & VB_XGI302LV) ||
3539 (pVBInfo->VBType & VB_XGI301C))) ||
3540 ((pVBInfo->IF_DEF_CH7007 == 1) &&
3541 (pVBInfo->VBType & VB_CH7007))) {
3542 if (temp & SetYPbPr) { /* temp = CR38 */
3543 if (pVBInfo->IF_DEF_HiVision == 1) {
3544 /* shampoo add for new
3546 temp = xgifb_reg_get(
3550 tempbx |= SetCRT2ToHiVisionTV;
3552 if (temp != YPbPrMode1080i) {
3554 (~SetCRT2ToHiVisionTV);
3560 /* tempbx |= SetCRT2ToYPbPr; */
3565 tempax = push; /* restore CR31 */
3567 if (pVBInfo->IF_DEF_LVDS == 0) {
3568 if (pVBInfo->IF_DEF_YPbPr == 1) {
3569 if (pVBInfo->IF_DEF_HiVision == 1)
3574 if (pVBInfo->IF_DEF_HiVision == 1)
3579 } else { /* 3nd party chip */
3580 /* [Billy] 07/05/03 */
3581 if (pVBInfo->IF_DEF_CH7007 == 1)
3584 temp = SetCRT2ToLCD;
3587 if (!(tempbx & temp)) {
3588 tempax |= DisableCRT2Display;
3592 if (pVBInfo->IF_DEF_LCDA == 1) { /* Select Display Device */
3593 if (!(pVBInfo->VBType & VB_NoLCD)) {
3594 if (tempbx & SetCRT2ToLCDA) {
3595 if (tempbx & SetSimuScanMode)
3596 tempbx &= (~(SetCRT2ToLCD |
3600 tempbx &= (~(SetCRT2ToLCD |
3609 /* for driver abnormal */
3610 if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode))) {
3611 if (pVBInfo->IF_DEF_CRT2Monitor == 1) {
3612 if (tempbx & SetCRT2ToRAMDAC) {
3617 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3620 tempbx &= (~(SetCRT2ToRAMDAC |
3626 if (!(pVBInfo->VBType & VB_NoLCD)) {
3627 if (tempbx & SetCRT2ToLCD) {
3632 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3636 if (tempbx & SetCRT2ToSCART) {
3641 tempbx &= (0x00FF | (~SetCRT2ToYPbPr));
3644 if (pVBInfo->IF_DEF_YPbPr == 1) {
3645 if (tempbx & SetCRT2ToYPbPr)
3651 if (pVBInfo->IF_DEF_HiVision == 1) {
3652 if (tempbx & SetCRT2ToHiVisionTV)
3654 SetCRT2ToHiVisionTV |
3659 if (tempax & DisableCRT2Display) { /* Set Display Device Info */
3660 if (!(tempbx & (SwitchToCRT2 | SetSimuScanMode)))
3661 tempbx = DisableCRT2Display;
3664 if (!(tempbx & DisableCRT2Display)) {
3665 if ((!(tempbx & DriverMode)) ||
3666 (!(modeflag & CRT2Mode))) {
3667 if (pVBInfo->IF_DEF_LCDA == 1) {
3668 if (!(tempbx & SetCRT2ToLCDA))
3669 tempbx |= (SetInSlaveMode |
3673 if (pVBInfo->IF_DEF_VideoCapture == 1) {
3674 if (((HwDeviceExtension->jChipType ==
3676 (pVBInfo->Set_VGAType == XG40)) ||
3677 ((HwDeviceExtension->jChipType ==
3679 (pVBInfo->Set_VGAType == XG41)) ||
3680 ((HwDeviceExtension->jChipType ==
3682 (pVBInfo->Set_VGAType == XG42)) ||
3683 ((HwDeviceExtension->jChipType ==
3685 (pVBInfo->Set_VGAType == XG45))) {
3702 /* LCD+TV can't support in slave mode
3703 * (Force LCDA+TV->LCDB) */
3704 if ((tempbx & SetInSlaveMode) &&
3705 (tempbx & SetCRT2ToLCDA)) {
3706 tempbx ^= (SetCRT2ToLCD |
3709 pVBInfo->SetFlag |= ReserveTVOption;
3714 pVBInfo->VBInfo = tempbx;
3717 void XGI_GetTVInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3718 struct vb_device_info *pVBInfo)
3720 unsigned short temp, tempbx = 0, resinfo = 0, modeflag, index1;
3725 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3726 if (ModeNo <= 0x13) {
3727 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].
3728 St_ModeFlag; /* si+St_ModeFlag */
3729 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].
3730 St_ResInfo; /* si+St_ResInfo */
3732 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].
3734 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].
3735 Ext_RESINFO; /* si+Ext_ResInfo */
3738 if (pVBInfo->VBInfo & SetCRT2ToTV) {
3739 temp = xgifb_reg_get(pVBInfo->P3d4, 0x35);
3741 if (tempbx & SetPALTV) {
3742 tempbx &= (SetCHTVOverScan |
3746 if (tempbx & SetPALMTV)
3747 /* set to NTSC if PAL-M */
3748 tempbx &= ~SetPALTV;
3750 tempbx &= (SetCHTVOverScan |
3754 if (pVBInfo->IF_DEF_LVDS == 0) {
3756 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x38);
3757 //00:PAL, 01:PAL-M, 10:PAL-N
3758 temp2 = (index1 & 0xC0) >> 5;
3760 if (temp2 & 0x02) //PAL-M
3761 tempbx &= (~SetPALTV);
3766 if (pVBInfo->IF_DEF_CH7007 == 1) { /* [Billy] 07/05/04 */
3767 tempbx = xgifb_reg_get(pVBInfo->P3d4, 0x35);
3769 if (tempbx & TVOverScan)
3770 tempbx |= SetCHTVOverScan;
3773 if (pVBInfo->IF_DEF_LVDS == 0) {
3774 if (pVBInfo->VBInfo & SetCRT2ToSCART)
3778 if (pVBInfo->IF_DEF_YPbPr == 1) {
3779 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
3780 index1 = xgifb_reg_get(pVBInfo->P3d4, 0x35);
3781 index1 &= YPbPrMode;
3783 if (index1 == YPbPrMode525i)
3784 tempbx |= SetYPbPrMode525i;
3786 if (index1 == YPbPrMode525p)
3787 tempbx = tempbx | SetYPbPrMode525p;
3788 if (index1 == YPbPrMode750p)
3789 tempbx = tempbx | SetYPbPrMode750p;
3793 if (pVBInfo->IF_DEF_HiVision == 1) {
3794 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
3795 tempbx = tempbx | SetYPbPrMode1080i | SetPALTV;
3798 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
3799 if ((pVBInfo->VBInfo & SetInSlaveMode) &&
3800 (!(pVBInfo->VBInfo & SetNotSimuMode)))
3801 tempbx |= TVSimuMode;
3803 if (!(tempbx & SetPALTV) &&
3805 (resinfo == 8)) /* NTSC 1024x768, */
3806 tempbx |= NTSC1024x768;
3808 tempbx |= RPLLDIV2XO;
3810 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
3811 if (pVBInfo->VBInfo & SetInSlaveMode)
3812 tempbx &= (~RPLLDIV2XO);
3815 (SetYPbPrMode525p | SetYPbPrMode750p))
3816 tempbx &= (~RPLLDIV2XO);
3817 else if (!(pVBInfo->VBType &
3823 if (tempbx & TVSimuMode)
3824 tempbx &= (~RPLLDIV2XO);
3829 pVBInfo->TVInfo = tempbx;
3832 unsigned char XGI_GetLCDInfo(unsigned short ModeNo, unsigned short ModeIdIndex,
3833 struct vb_device_info *pVBInfo)
3835 unsigned short temp, tempax, tempbx, modeflag, resinfo = 0, LCDIdIndex;
3837 pVBInfo->LCDResInfo = 0;
3838 pVBInfo->LCDTypeInfo = 0;
3839 pVBInfo->LCDInfo = 0;
3841 if (ModeNo <= 0x13) {
3842 /* si+St_ModeFlag // */
3843 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
3845 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
3846 /* si+Ext_ResInfo // */
3847 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
3850 temp = xgifb_reg_get(pVBInfo->P3d4, 0x36); /* Get LCD Res.Info */
3851 tempbx = temp & 0x0F;
3854 tempbx = Panel1024x768; /* default */
3856 /* LCD75 [2003/8/22] Vicent */
3857 if ((tempbx == Panel1024x768) || (tempbx == Panel1280x1024)) {
3858 if (pVBInfo->VBInfo & DriverMode) {
3859 tempax = xgifb_reg_get(pVBInfo->P3d4, 0x33);
3860 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
3863 tempax = tempax >> 4;
3865 if ((resinfo == 6) || (resinfo == 9)) {
3867 tempbx |= PanelRef75Hz;
3868 } else if ((resinfo == 7) || (resinfo == 8)) {
3870 tempbx |= PanelRef75Hz;
3875 pVBInfo->LCDResInfo = tempbx;
3879 if (pVBInfo->IF_DEF_OEMUtil == 1)
3880 pVBInfo->LCDTypeInfo = (temp & 0xf0) >> 4;
3882 if (!(pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)))
3887 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
3889 temp &= (ScalingLCD | LCDNonExpanding | LCDSyncBit | SetPWDEnable);
3891 if ((pVBInfo->IF_DEF_ScaleLCD == 1) && (temp & LCDNonExpanding))
3892 temp &= ~EnableScalingLCD;
3896 LCDIdIndex = XGI_GetLCDCapPtr1(pVBInfo);
3898 tempax = pVBInfo->LCDCapList[LCDIdIndex].LCD_Capability;
3900 if (pVBInfo->IF_DEF_LVDS == 0) { /* shampoo */
3901 if (((pVBInfo->VBType & VB_XGI302LV) || (pVBInfo->VBType
3902 & VB_XGI301C)) && (tempax & LCDDualLink)) {
3903 tempbx |= SetLCDDualLink;
3907 if (pVBInfo->IF_DEF_LVDS == 0) {
3908 if ((pVBInfo->LCDResInfo == Panel1400x1050) && (pVBInfo->VBInfo
3909 & SetCRT2ToLCD) && (ModeNo > 0x13) && (resinfo
3910 == 9) && (!(tempbx & EnableScalingLCD)))
3911 /* set to center in 1280x1024 LCDB for Panel1400x1050 */
3912 tempbx |= SetLCDtoNonExpanding;
3916 if (tempax & LCDBToA) {
3917 tempbx |= SetLCDBToA;
3921 if (pVBInfo->IF_DEF_ExpLink == 1) {
3922 if (modeflag & HalfDCLK) {
3923 /* if (!(pVBInfo->LCDInfo&LCDNonExpanding)) */
3924 if (!(tempbx & SetLCDtoNonExpanding)) {
3925 tempbx |= EnableLVDSDDA;
3927 if (ModeNo > 0x13) {
3928 if (pVBInfo->LCDResInfo
3930 if (resinfo == 4) {/* 512x384 */
3931 tempbx |= EnableLVDSDDA;
3939 if (pVBInfo->VBInfo & SetInSlaveMode) {
3940 if (pVBInfo->VBInfo & SetNotSimuMode)
3941 tempbx |= LCDVESATiming;
3943 tempbx |= LCDVESATiming;
3946 pVBInfo->LCDInfo = tempbx;
3948 if (pVBInfo->IF_DEF_PWD == 1) {
3949 if (pVBInfo->LCDInfo & SetPWDEnable) {
3950 if ((pVBInfo->VBType & VB_XGI302LV) ||
3951 (pVBInfo->VBType & VB_XGI301C)) {
3952 if (!(tempax & PWDEnable))
3953 pVBInfo->LCDInfo &= ~SetPWDEnable;
3958 if (pVBInfo->IF_DEF_LVDS == 0) {
3959 if (tempax & (LockLCDBToA | StLCDBToA)) {
3960 if (pVBInfo->VBInfo & SetInSlaveMode) {
3961 if (!(tempax & LockLCDBToA)) {
3962 if (ModeNo <= 0x13) {
3977 if (pVBInfo->IF_DEF_LVDS == 0) {
3978 if (tempax & (LockLCDBToA | StLCDBToA)) {
3979 if (pVBInfo->VBInfo & SetInSlaveMode) {
3980 if (!((!(tempax & LockLCDBToA)) &&
3998 unsigned char XGI_SearchModeID(unsigned short ModeNo,
3999 unsigned short *ModeIdIndex, struct vb_device_info *pVBInfo)
4003 if (ModeNo <= 0x13) {
4004 /* for (*ModeIdIndex=0;
4005 *ModeIdIndex < sizeof(pVBInfo->SModeIDTable)
4006 / sizeof(struct XGI_StStruct);
4007 (*ModeIdIndex)++) */
4008 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
4009 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
4012 if (pVBInfo->SModeIDTable[*ModeIdIndex].St_ModeID ==
4018 (*ModeIdIndex)++; /* 400 lines */
4020 (*ModeIdIndex) += 2; /* 400 lines */
4021 /* else 350 lines */
4023 /* for (*ModeIdIndex=0;
4024 *ModeIdIndex < sizeof(pVBInfo->EModeIDTable)
4025 / sizeof(struct XGI_ExtStruct);
4026 (*ModeIdIndex)++) */
4027 for (*ModeIdIndex = 0;; (*ModeIdIndex)++) {
4028 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
4031 if (pVBInfo->EModeIDTable[*ModeIdIndex].Ext_ModeID ==
4040 /* win2000 MM adapter not support standard mode! */
4043 static unsigned char XGINew_CheckMemorySize(
4044 struct xgi_hw_device_info *HwDeviceExtension,
4045 unsigned short ModeNo,
4046 unsigned short ModeIdIndex,
4047 struct vb_device_info *pVBInfo)
4049 unsigned short memorysize, modeflag, temp, temp1, tmp;
4052 if ((HwDeviceExtension->jChipType == XGI_650) ||
4053 (HwDeviceExtension->jChipType == XGI_650M)) {
4059 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4061 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4063 /* ModeType = modeflag&ModeInfoFlag; // Get mode type */
4065 memorysize = modeflag & MemoryInfoFlag;
4066 memorysize = memorysize > MemorySizeShift;
4067 memorysize++; /* Get memory size */
4069 temp = xgifb_reg_get(pVBInfo->P3c4, 0x14); /* Get DRAM Size */
4072 if (HwDeviceExtension->jChipType == XG40) {
4073 /* memory size per channel SR14[7:4] */
4074 temp = 1 << ((temp & 0x0F0) >> 4);
4075 if ((tmp & 0x0c) == 0x0C) { /* Qual channels */
4077 } else if ((tmp & 0x0c) == 0x08) { /* Dual channels */
4080 } else if (HwDeviceExtension->jChipType == XG42) {
4081 /* memory size per channel SR14[7:4] */
4082 temp = 1 << ((temp & 0x0F0) >> 4);
4083 if ((tmp & 0x04) == 0x04) { /* Dual channels */
4086 } else if (HwDeviceExtension->jChipType == XG45) {
4087 /* memory size per channel SR14[7:4] */
4088 temp = 1 << ((temp & 0x0F0) >> 4);
4089 if ((tmp & 0x0c) == 0x0C) { /* Qual channels */
4091 } else if ((tmp & 0x0c) == 0x08) { /* triple channels */
4095 } else if ((tmp & 0x0c) == 0x04) { /* Dual channels */
4099 if (temp < memorysize)
4107 void XGINew_IsLowResolution(unsigned short ModeNo,
4108 unsigned short ModeIdIndex,
4109 unsigned char XGINew_CheckMemorySize(
4110 struct xgi_hw_device_info *HwDeviceExtension,
4111 unsigned short ModeNo,
4112 unsigned short ModeIdIndex,
4113 struct vb_device_info *pVBInfo)
4115 unsigned short data ;
4116 unsigned short ModeFlag ;
4118 data = xgifb_reg_get(pVBInfo->P3c4, 0x0F);
4120 xgifb_reg_set(pVBInfo->P3c4, 0x0F, data);
4122 if (ModeNo > 0x13) {
4123 ModeFlag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4124 if ((ModeFlag & HalfDCLK) && (ModeFlag & DoubleScanMode)) {
4125 data = xgifb_reg_get(pVBInfo->P3c4, 0x0F);
4127 xgifb_reg_set(pVBInfo->P3c4, 0x0F, data);
4128 data = xgifb_reg_get(pVBInfo->P3c4, 0x01);
4130 xgifb_reg_set(pVBInfo->P3c4, 0x01, data);
4136 static unsigned char XG21GPIODataTransfer(unsigned char ujDate)
4138 unsigned char ujRet = 0;
4139 unsigned char i = 0;
4141 for (i = 0; i < 8; i++) {
4143 /* ujRet |= GETBITS(ujDate >> i, 0:0); */
4144 ujRet |= (ujDate >> i) & 1;
4150 /*----------------------------------------------------------------------------*/
4152 /* bl[5] : LVDS signal */
4153 /* bl[1] : LVDS backlight */
4154 /* bl[0] : LVDS VDD */
4155 /*----------------------------------------------------------------------------*/
4156 static unsigned char XGI_XG21GetPSCValue(struct vb_device_info *pVBInfo)
4158 unsigned char CR4A, temp;
4160 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
4161 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x23); /* enable GPIO write */
4163 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
4165 temp = XG21GPIODataTransfer(temp);
4167 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
4171 /*----------------------------------------------------------------------------*/
4173 /* bl[5] : LVDS signal */
4174 /* bl[1] : LVDS backlight */
4175 /* bl[0] : LVDS VDD */
4176 /*----------------------------------------------------------------------------*/
4177 static unsigned char XGI_XG27GetPSCValue(struct vb_device_info *pVBInfo)
4179 unsigned char CR4A, CRB4, temp;
4181 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
4182 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x0C); /* enable GPIO write */
4184 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
4188 xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A);
4189 CRB4 = xgifb_reg_get(pVBInfo->P3d4, 0xB4);
4190 temp |= ((CRB4 & 0x04) << 3);
4194 void XGI_DisplayOn(struct xgi_hw_device_info *pXGIHWDE,
4195 struct vb_device_info *pVBInfo)
4198 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x00);
4199 if (pXGIHWDE->jChipType == XG21) {
4200 if (pVBInfo->IF_DEF_LVDS == 1) {
4201 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x1)) {
4203 XGI_XG21BLSignalVDD(0x01, 0x01, pVBInfo);
4204 XGI_XG21SetPanelDelay(2, pVBInfo);
4206 if (!(XGI_XG21GetPSCValue(pVBInfo) & 0x20))
4207 /* LVDS signal on */
4208 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
4209 XGI_XG21SetPanelDelay(3, pVBInfo);
4210 /* LVDS backlight on */
4211 XGI_XG21BLSignalVDD(0x02, 0x02, pVBInfo);
4213 /* DVO/DVI signal on */
4214 XGI_XG21BLSignalVDD(0x20, 0x20, pVBInfo);
4219 /* [Billy] 07/05/23 For CH7007 */
4220 if (pVBInfo->IF_DEF_CH7007 == 1) {
4223 if (pXGIHWDE->jChipType == XG27) {
4224 if (pVBInfo->IF_DEF_LVDS == 1) {
4225 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x1)) {
4227 XGI_XG27BLSignalVDD(0x01, 0x01, pVBInfo);
4228 XGI_XG21SetPanelDelay(2, pVBInfo);
4230 if (!(XGI_XG27GetPSCValue(pVBInfo) & 0x20))
4231 /* LVDS signal on */
4232 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
4233 XGI_XG21SetPanelDelay(3, pVBInfo);
4234 /* LVDS backlight on */
4235 XGI_XG27BLSignalVDD(0x02, 0x02, pVBInfo);
4237 /* DVO/DVI signal on */
4238 XGI_XG27BLSignalVDD(0x20, 0x20, pVBInfo);
4244 void XGI_DisplayOff(struct xgi_hw_device_info *pXGIHWDE,
4245 struct vb_device_info *pVBInfo)
4248 if (pXGIHWDE->jChipType == XG21) {
4249 if (pVBInfo->IF_DEF_LVDS == 1) {
4250 /* LVDS backlight off */
4251 XGI_XG21BLSignalVDD(0x02, 0x00, pVBInfo);
4252 XGI_XG21SetPanelDelay(3, pVBInfo);
4254 /* DVO/DVI signal off */
4255 XGI_XG21BLSignalVDD(0x20, 0x00, pVBInfo);
4259 if (pVBInfo->IF_DEF_CH7007 == 1) { /* [Billy] 07/05/23 For CH7007 */
4260 /* if (IsCH7007TVMode(pVBInfo) == 0) */
4265 if (pXGIHWDE->jChipType == XG27) {
4266 if ((XGI_XG27GetPSCValue(pVBInfo) & 0x2)) {
4267 /* LVDS backlight off */
4268 XGI_XG27BLSignalVDD(0x02, 0x00, pVBInfo);
4269 XGI_XG21SetPanelDelay(3, pVBInfo);
4272 if (pVBInfo->IF_DEF_LVDS == 0)
4273 /* DVO/DVI signal off */
4274 XGI_XG27BLSignalVDD(0x20, 0x00, pVBInfo);
4277 xgifb_reg_and_or(pVBInfo->P3c4, 0x01, 0xDF, 0x20);
4280 static void XGI_WaitDisply(struct vb_device_info *pVBInfo)
4282 while ((inb(pVBInfo->P3da) & 0x01))
4285 while (!(inb(pVBInfo->P3da) & 0x01))
4290 static void XGI_WaitDisplay(struct vb_device_info *pVBInfo)
4292 while (!(inb(pVBInfo->P3da) & 0x01))
4294 while (inb(pVBInfo->P3da) & 0x01)
4299 static void XGI_AutoThreshold(struct vb_device_info *pVBInfo)
4301 if (!(pVBInfo->SetFlag & Win9xDOSMode))
4302 xgifb_reg_or(pVBInfo->Part1Port, 0x01, 0x40);
4305 static void XGI_SaveCRT2Info(unsigned short ModeNo,
4306 struct vb_device_info *pVBInfo)
4308 unsigned short temp1, temp2;
4310 /* reserve CR34 for CRT1 Mode No */
4311 xgifb_reg_set(pVBInfo->P3d4, 0x34, ModeNo);
4312 temp1 = (pVBInfo->VBInfo & SetInSlaveMode) >> 8;
4313 temp2 = ~(SetInSlaveMode >> 8);
4314 xgifb_reg_and_or(pVBInfo->P3d4, 0x31, temp2, temp1);
4317 static void XGI_GetCRT2ResInfo(unsigned short ModeNo,
4318 unsigned short ModeIdIndex,
4319 struct vb_device_info *pVBInfo)
4321 unsigned short xres, yres, modeflag, resindex;
4323 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
4324 if (ModeNo <= 0x13) {
4325 xres = pVBInfo->StResInfo[resindex].HTotal;
4326 yres = pVBInfo->StResInfo[resindex].VTotal;
4328 /* modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;*/
4330 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
4331 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
4332 /* si+St_ModeFlag */
4333 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4336 if (pVBInfo->IF_DEF_FSTN) {
4341 if (modeflag & HalfDCLK)
4344 if (modeflag & DoubleScanMode)
4349 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
4350 if (pVBInfo->IF_DEF_LVDS == 0) {
4351 if (pVBInfo->LCDResInfo == Panel1600x1200) {
4352 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4358 if (pVBInfo->LCDResInfo == Panel1280x1024) {
4361 else if (yres == 350)
4364 if (pVBInfo->LCDInfo & LCDVESATiming) {
4370 if (pVBInfo->LCDResInfo == Panel1024x768) {
4371 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4372 if (!(pVBInfo->LCDInfo
4373 & LCDNonExpanding)) {
4376 else if (yres == 400)
4378 else if (yres == 480)
4389 pVBInfo->VGAHDE = xres;
4390 pVBInfo->HDE = xres;
4391 pVBInfo->VGAVDE = yres;
4392 pVBInfo->VDE = yres;
4395 static unsigned char XGI_IsLCDDualLink(struct vb_device_info *pVBInfo)
4398 if ((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) &&
4399 (pVBInfo->LCDInfo & SetLCDDualLink)) /* shampoo0129 */
4405 static void XGI_GetRAMDAC2DATA(unsigned short ModeNo,
4406 unsigned short ModeIdIndex,
4407 unsigned short RefreshRateTableIndex,
4408 struct vb_device_info *pVBInfo)
4410 unsigned short tempax, tempbx, temp1, temp2, modeflag = 0, tempcx,
4411 StandTableIndex, CRT1Index;
4413 pVBInfo->RVBHCMAX = 1;
4414 pVBInfo->RVBHCFACT = 1;
4416 if (ModeNo <= 0x13) {
4417 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4418 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
4419 tempax = pVBInfo->StandTable[StandTableIndex].CRTC[0];
4420 tempbx = pVBInfo->StandTable[StandTableIndex].CRTC[6];
4421 temp1 = pVBInfo->StandTable[StandTableIndex].CRTC[7];
4423 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4424 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
4426 CRT1Index &= IndexMask;
4427 temp1 = (unsigned short) pVBInfo->
4428 XGINEWUB_CRT1Table[CRT1Index].CR[0];
4429 temp2 = (unsigned short) pVBInfo->
4430 XGINEWUB_CRT1Table[CRT1Index].CR[5];
4431 tempax = (temp1 & 0xFF) | ((temp2 & 0x03) << 8);
4432 tempbx = (unsigned short) pVBInfo->
4433 XGINEWUB_CRT1Table[CRT1Index].CR[8];
4434 tempcx = (unsigned short) pVBInfo->
4435 XGINEWUB_CRT1Table[CRT1Index].CR[14] << 8;
4437 tempcx = tempcx << 2;
4439 temp1 = (unsigned short) pVBInfo->
4440 XGINEWUB_CRT1Table[CRT1Index].CR[9];
4450 if (modeflag & Charx8Dot)
4455 pVBInfo->VGAHT = tempax;
4456 pVBInfo->HT = tempax;
4458 pVBInfo->VGAVT = tempbx;
4459 pVBInfo->VT = tempbx;
4462 static void XGI_GetCRT2Data(unsigned short ModeNo, unsigned short ModeIdIndex,
4463 unsigned short RefreshRateTableIndex,
4464 struct vb_device_info *pVBInfo)
4466 unsigned short tempax = 0, tempbx, modeflag, resinfo;
4468 struct XGI_LCDDataStruct *LCDPtr = NULL;
4469 struct XGI_TVDataStruct *TVPtr = NULL;
4471 if (ModeNo <= 0x13) {
4473 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4474 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4476 /* si+Ext_ResInfo */
4477 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4478 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4481 pVBInfo->NewFlickerMode = 0;
4482 pVBInfo->RVBHRS = 50;
4484 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4485 XGI_GetRAMDAC2DATA(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4492 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
4493 LCDPtr = (struct XGI_LCDDataStruct *) XGI_GetLcdPtr(tempbx,
4494 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4497 pVBInfo->RVBHCMAX = LCDPtr->RVBHCMAX;
4498 pVBInfo->RVBHCFACT = LCDPtr->RVBHCFACT;
4499 pVBInfo->VGAHT = LCDPtr->VGAHT;
4500 pVBInfo->VGAVT = LCDPtr->VGAVT;
4501 pVBInfo->HT = LCDPtr->LCDHT;
4502 pVBInfo->VT = LCDPtr->LCDVT;
4504 if (pVBInfo->LCDResInfo == Panel1024x768) {
4508 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4509 if (pVBInfo->VGAVDE == 357)
4511 else if (pVBInfo->VGAVDE == 420)
4513 else if (pVBInfo->VGAVDE == 525)
4515 else if (pVBInfo->VGAVDE == 600)
4517 /* else if (pVBInfo->VGAVDE==350) tempbx=560; */
4518 /* else if (pVBInfo->VGAVDE==400) tempbx=640; */
4523 } else if (pVBInfo->LCDResInfo == Panel1024x768x75) {
4526 } else if (pVBInfo->LCDResInfo == Panel1280x1024) {
4528 if (pVBInfo->VGAVDE == 360)
4530 else if (pVBInfo->VGAVDE == 375)
4532 else if (pVBInfo->VGAVDE == 405)
4536 } else if (pVBInfo->LCDResInfo == Panel1280x1024x75) {
4539 } else if (pVBInfo->LCDResInfo == Panel1280x960) {
4541 if (pVBInfo->VGAVDE == 350)
4543 else if (pVBInfo->VGAVDE == 400)
4545 else if (pVBInfo->VGAVDE == 1024)
4549 } else if (pVBInfo->LCDResInfo == Panel1400x1050) {
4553 if (pVBInfo->VGAVDE == 1024) {
4557 } else if (pVBInfo->LCDResInfo == Panel1600x1200) {
4559 tempbx = 1200; /* alan 10/14/2003 */
4560 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
4561 if (pVBInfo->VGAVDE == 350)
4563 else if (pVBInfo->VGAVDE == 400)
4568 if (pVBInfo->LCDInfo & LCDNonExpanding) {
4569 tempax = pVBInfo->VGAHDE;
4570 tempbx = pVBInfo->VGAVDE;
4573 pVBInfo->HDE = tempax;
4574 pVBInfo->VDE = tempbx;
4578 if (pVBInfo->VBInfo & (SetCRT2ToTV)) {
4580 TVPtr = (struct XGI_TVDataStruct *) XGI_GetTVPtr(tempbx,
4581 ModeNo, ModeIdIndex, RefreshRateTableIndex,
4584 pVBInfo->RVBHCMAX = TVPtr->RVBHCMAX;
4585 pVBInfo->RVBHCFACT = TVPtr->RVBHCFACT;
4586 pVBInfo->VGAHT = TVPtr->VGAHT;
4587 pVBInfo->VGAVT = TVPtr->VGAVT;
4588 pVBInfo->HDE = TVPtr->TVHDE;
4589 pVBInfo->VDE = TVPtr->TVVDE;
4590 pVBInfo->RVBHRS = TVPtr->RVBHRS;
4591 pVBInfo->NewFlickerMode = TVPtr->FlickerMode;
4593 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
4594 if (resinfo == 0x08)
4595 pVBInfo->NewFlickerMode = 0x40;
4596 else if (resinfo == 0x09)
4597 pVBInfo->NewFlickerMode = 0x40;
4598 else if (resinfo == 0x12)
4599 pVBInfo->NewFlickerMode = 0x40;
4601 if (pVBInfo->VGAVDE == 350)
4602 pVBInfo->TVInfo |= TVSimuMode;
4607 if (pVBInfo->VBInfo & SetInSlaveMode) {
4608 if (pVBInfo->TVInfo & TVSimuMode) {
4612 if (!(modeflag & Charx8Dot)) {
4613 tempax = StHiTextTVHT;
4614 tempbx = StHiTextTVVT;
4618 } else if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
4619 if (pVBInfo->TVInfo & SetYPbPrMode750p) {
4620 tempax = YPbPrTV750pHT; /* Ext750pTVHT */
4621 tempbx = YPbPrTV750pVT; /* Ext750pTVVT */
4624 if (pVBInfo->TVInfo & SetYPbPrMode525p) {
4625 tempax = YPbPrTV525pHT; /* Ext525pTVHT */
4626 tempbx = YPbPrTV525pVT; /* Ext525pTVVT */
4627 } else if (pVBInfo->TVInfo & SetYPbPrMode525i) {
4628 tempax = YPbPrTV525iHT; /* Ext525iTVHT */
4629 tempbx = YPbPrTV525iVT; /* Ext525iTVVT */
4630 if (pVBInfo->TVInfo & NTSC1024x768)
4631 tempax = NTSC1024x768HT;
4636 if (!(pVBInfo->TVInfo & SetPALTV)) {
4639 if (pVBInfo->TVInfo & NTSC1024x768)
4640 tempax = NTSC1024x768HT;
4644 pVBInfo->HT = tempax;
4645 pVBInfo->VT = tempbx;
4650 static void XGI_SetCRT2VCLK(unsigned short ModeNo, unsigned short ModeIdIndex,
4651 unsigned short RefreshRateTableIndex,
4652 struct vb_device_info *pVBInfo)
4654 unsigned char di_0, di_1, tempal;
4656 tempal = XGI_GetVCLKPtr(RefreshRateTableIndex, ModeNo, ModeIdIndex,
4658 XGI_GetVCLKLen(tempal, &di_0, &di_1, pVBInfo);
4659 XGI_GetLCDVCLKPtr(&di_0, &di_1, pVBInfo);
4661 if (pVBInfo->VBType & VB_XGI301) { /* shampoo 0129 */
4663 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, 0x10);
4664 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
4665 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
4666 } else { /* 301b/302b/301lv/302lv */
4667 xgifb_reg_set(pVBInfo->Part4Port, 0x0A, di_0);
4668 xgifb_reg_set(pVBInfo->Part4Port, 0x0B, di_1);
4671 xgifb_reg_set(pVBInfo->Part4Port, 0x00, 0x12);
4673 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
4674 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x28);
4676 xgifb_reg_or(pVBInfo->Part4Port, 0x12, 0x08);
4679 static unsigned short XGI_GetColorDepth(unsigned short ModeNo,
4680 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
4682 unsigned short ColorDepth[6] = { 1, 2, 4, 4, 6, 8 };
4684 unsigned short modeflag;
4687 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4689 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4691 index = (modeflag & ModeInfoFlag) - ModeEGA;
4696 return ColorDepth[index];
4699 static unsigned short XGI_GetOffset(unsigned short ModeNo,
4700 unsigned short ModeIdIndex,
4701 unsigned short RefreshRateTableIndex,
4702 struct xgi_hw_device_info *HwDeviceExtension,
4703 struct vb_device_info *pVBInfo)
4705 unsigned short temp, colordepth, modeinfo, index, infoflag,
4706 ColorDepth[] = { 0x01, 0x02, 0x04 };
4708 modeinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeInfo;
4712 infoflag = pVBInfo->
4713 RefIndex[RefreshRateTableIndex].Ext_InfoFlag;
4715 index = (modeinfo >> 8) & 0xFF;
4717 temp = pVBInfo->ScreenOffset[index];
4719 if (infoflag & InterlaceMode)
4722 colordepth = XGI_GetColorDepth(ModeNo, ModeIdIndex, pVBInfo);
4724 if ((ModeNo >= 0x7C) && (ModeNo <= 0x7E)) {
4725 temp = ModeNo - 0x7C;
4726 colordepth = ColorDepth[temp];
4728 if (infoflag & InterlaceMode)
4730 return temp * colordepth;
4732 return temp * colordepth;
4736 static void XGI_SetCRT2Offset(unsigned short ModeNo,
4737 unsigned short ModeIdIndex,
4738 unsigned short RefreshRateTableIndex,
4739 struct xgi_hw_device_info *HwDeviceExtension,
4740 struct vb_device_info *pVBInfo)
4742 unsigned short offset;
4745 if (pVBInfo->VBInfo & SetInSlaveMode)
4748 offset = XGI_GetOffset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4749 HwDeviceExtension, pVBInfo);
4750 temp = (unsigned char) (offset & 0xFF);
4751 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
4752 temp = (unsigned char) ((offset & 0xFF00) >> 8);
4753 xgifb_reg_set(pVBInfo->Part1Port, 0x09, temp);
4754 temp = (unsigned char) (((offset >> 3) & 0xFF) + 1);
4755 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
4758 static void XGI_SetCRT2FIFO(struct vb_device_info *pVBInfo)
4760 /* threshold high ,disable auto threshold */
4761 xgifb_reg_set(pVBInfo->Part1Port, 0x01, 0x3B);
4762 /* threshold low default 04h */
4763 xgifb_reg_and_or(pVBInfo->Part1Port, 0x02, ~(0x3F), 0x04);
4766 static void XGI_PreSetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
4767 struct xgi_hw_device_info *HwDeviceExtension,
4768 unsigned short RefreshRateTableIndex,
4769 struct vb_device_info *pVBInfo)
4771 unsigned short tempcx = 0, CRT1Index = 0, resinfo = 0;
4773 if (ModeNo > 0x13) {
4774 CRT1Index = pVBInfo->
4775 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4776 CRT1Index &= IndexMask;
4777 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4780 XGI_SetCRT2Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
4781 HwDeviceExtension, pVBInfo);
4782 XGI_SetCRT2FIFO(pVBInfo);
4783 /* XGI_SetCRT2Sync(ModeNo,RefreshRateTableIndex); */
4785 for (tempcx = 4; tempcx < 7; tempcx++)
4786 xgifb_reg_set(pVBInfo->Part1Port, tempcx, 0x0);
4788 xgifb_reg_set(pVBInfo->Part1Port, 0x50, 0x00);
4789 xgifb_reg_set(pVBInfo->Part1Port, 0x02, 0x44); /* temp 0206 */
4792 static void XGI_SetGroup1(unsigned short ModeNo, unsigned short ModeIdIndex,
4793 struct xgi_hw_device_info *HwDeviceExtension,
4794 unsigned short RefreshRateTableIndex,
4795 struct vb_device_info *pVBInfo)
4797 unsigned short temp = 0, tempax = 0, tempbx = 0, tempcx = 0,
4798 pushbx = 0, CRT1Index = 0, modeflag, resinfo = 0;
4800 if (ModeNo > 0x13) {
4801 CRT1Index = pVBInfo->
4802 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4803 CRT1Index &= IndexMask;
4804 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4808 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4810 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4812 /* bainy change table name */
4813 if (modeflag & HalfDCLK) {
4814 /* BTVGA2HT 0x08,0x09 */
4815 temp = (pVBInfo->VGAHT / 2 - 1) & 0x0FF;
4816 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
4817 temp = (((pVBInfo->VGAHT / 2 - 1) & 0xFF00) >> 8) << 4;
4818 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
4819 /* BTVGA2HDEE 0x0A,0x0C */
4820 temp = (pVBInfo->VGAHDE / 2 + 16) & 0x0FF;
4821 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
4822 tempcx = ((pVBInfo->VGAHT - pVBInfo->VGAHDE) / 2) >> 2;
4823 pushbx = pVBInfo->VGAHDE / 2 + 16;
4824 tempcx = tempcx >> 1;
4825 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4828 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4829 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
4830 tempbx |= ((pVBInfo->
4831 XGINEWUB_CRT1Table[CRT1Index].CR[14] &
4833 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4834 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[5];
4836 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[15];
4837 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4838 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4844 if (tempcx > (pVBInfo->VGAHT / 2))
4845 tempcx = pVBInfo->VGAHT / 2;
4847 temp = tempbx & 0x00FF;
4849 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
4851 temp = (pVBInfo->VGAHT - 1) & 0x0FF; /* BTVGA2HT 0x08,0x09 */
4852 xgifb_reg_set(pVBInfo->Part1Port, 0x08, temp);
4853 temp = (((pVBInfo->VGAHT - 1) & 0xFF00) >> 8) << 4;
4854 xgifb_reg_and_or(pVBInfo->Part1Port, 0x09, ~0x0F0, temp);
4855 /* BTVGA2HDEE 0x0A,0x0C */
4856 temp = (pVBInfo->VGAHDE + 16) & 0x0FF;
4857 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp);
4858 tempcx = (pVBInfo->VGAHT - pVBInfo->VGAHDE) >> 2; /* cx */
4859 pushbx = pVBInfo->VGAHDE + 16;
4860 tempcx = tempcx >> 1;
4861 tempbx = pushbx + tempcx; /* bx BTVGA@HRS 0x0B,0x0C */
4864 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4865 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[3];
4866 tempbx |= ((pVBInfo->
4867 XGINEWUB_CRT1Table[CRT1Index].CR[5] &
4869 tempbx = (tempbx - 3) << 3; /* (VGAHRS-3)*8 */
4870 tempcx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[4];
4872 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[6];
4873 temp = (temp & 0x04) << (5 - 2); /* VGAHRE D[5] */
4874 tempcx = ((tempcx | temp) - 3) << 3; /* (VGAHRE-3)*8 */
4879 if (tempcx > pVBInfo->VGAHT)
4880 tempcx = pVBInfo->VGAHT;
4882 temp = tempbx & 0x00FF;
4883 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
4886 tempax = (tempax & 0x00FF) | (tempbx & 0xFF00);
4888 tempbx = (tempbx & 0x00FF) | ((tempbx & 0xFF00) << 4);
4889 tempax |= (tempbx & 0xFF00);
4890 temp = (tempax & 0xFF00) >> 8;
4891 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
4892 temp = tempcx & 0x00FF;
4893 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
4894 tempcx = (pVBInfo->VGAVT - 1);
4895 temp = tempcx & 0x00FF;
4897 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
4898 tempbx = pVBInfo->VGAVDE - 1;
4899 temp = tempbx & 0x00FF;
4900 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, temp);
4901 temp = ((tempbx & 0xFF00) << 3) >> 8;
4902 temp |= ((tempcx & 0xFF00) >> 8);
4903 xgifb_reg_set(pVBInfo->Part1Port, 0x12, temp);
4905 tempax = pVBInfo->VGAVDE;
4906 tempbx = pVBInfo->VGAVDE;
4907 tempcx = pVBInfo->VGAVT;
4908 /* BTVGA2VRS 0x10,0x11 */
4909 tempbx = (pVBInfo->VGAVT + pVBInfo->VGAVDE) >> 1;
4910 /* BTVGA2VRE 0x11 */
4911 tempcx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) >> 4) + tempbx + 1;
4913 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC) {
4914 tempbx = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[10];
4915 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[9];
4923 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[14];
4928 temp = pVBInfo->XGINEWUB_CRT1Table[CRT1Index].CR[11];
4929 tempcx = (tempcx & 0xFF00) | (temp & 0x00FF);
4932 temp = tempbx & 0x00FF;
4933 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
4934 temp = ((tempbx & 0xFF00) >> 8) << 4;
4935 temp = ((tempcx & 0x000F) | (temp));
4936 xgifb_reg_set(pVBInfo->Part1Port, 0x11, temp);
4939 if (modeflag & DoubleScanMode)
4942 if (modeflag & HalfDCLK)
4945 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2C, ~0x0C0, tempax);
4948 static unsigned short XGI_GetVGAHT2(struct vb_device_info *pVBInfo)
4950 unsigned long tempax, tempbx;
4952 tempbx = ((pVBInfo->VGAVT - pVBInfo->VGAVDE) * pVBInfo->RVBHCMAX)
4954 tempax = (pVBInfo->VT - pVBInfo->VDE) * pVBInfo->RVBHCFACT;
4955 tempax = (tempax * pVBInfo->HT) / tempbx;
4957 return (unsigned short) tempax;
4960 static void XGI_SetLockRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
4961 struct xgi_hw_device_info *HwDeviceExtension,
4962 unsigned short RefreshRateTableIndex,
4963 struct vb_device_info *pVBInfo)
4965 unsigned short push1, push2, tempax, tempbx = 0, tempcx, temp, resinfo,
4966 modeflag, CRT1Index;
4968 if (ModeNo <= 0x13) {
4970 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
4971 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
4973 /* si+Ext_ResInfo */
4974 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
4975 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
4976 CRT1Index = pVBInfo->
4977 RefIndex[RefreshRateTableIndex].Ext_CRT1CRTC;
4978 CRT1Index &= IndexMask;
4981 if (!(pVBInfo->VBInfo & SetInSlaveMode))
4984 temp = 0xFF; /* set MAX HT */
4985 xgifb_reg_set(pVBInfo->Part1Port, 0x03, temp);
4986 /* if (modeflag & Charx8Dot) */
4987 /* tempcx = 0x08; */
4991 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C))
4992 modeflag |= Charx8Dot;
4994 tempax = pVBInfo->VGAHDE; /* 0x04 Horizontal Display End */
4996 if (modeflag & HalfDCLK)
4997 tempax = tempax >> 1;
4999 tempax = (tempax / tempcx) - 1;
5000 tempbx |= ((tempax & 0x00FF) << 8);
5001 temp = tempax & 0x00FF;
5002 xgifb_reg_set(pVBInfo->Part1Port, 0x04, temp);
5004 temp = (tempbx & 0xFF00) >> 8;
5006 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5007 if (!(pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5008 | VB_XGI302LV | VB_XGI301C)))
5011 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5012 if (pVBInfo->VBType & VB_XGI301LV) {
5013 if (pVBInfo->VBExtInfo == VB_YPbPr1080i) {
5017 } else if (resinfo == 7) {
5023 /* 0x05 Horizontal Display Start */
5024 xgifb_reg_set(pVBInfo->Part1Port, 0x05, temp);
5025 /* 0x06 Horizontal Blank end */
5026 xgifb_reg_set(pVBInfo->Part1Port, 0x06, 0x03);
5028 if (!(pVBInfo->VBInfo & DisableCRT2Display)) { /* 030226 bainy */
5029 if (pVBInfo->VBInfo & SetCRT2ToTV)
5030 tempax = pVBInfo->VGAHT;
5032 tempax = XGI_GetVGAHT2(pVBInfo);
5035 if (tempax >= pVBInfo->VGAHT)
5036 tempax = pVBInfo->VGAHT;
5038 if (modeflag & HalfDCLK)
5039 tempax = tempax >> 1;
5041 tempax = (tempax / tempcx) - 5;
5042 tempcx = tempax; /* 20030401 0x07 horizontal Retrace Start */
5043 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5044 temp = (tempbx & 0x00FF) - 1;
5045 if (!(modeflag & HalfDCLK)) {
5047 if (pVBInfo->TVInfo & TVSimuMode) {
5054 /* tempcx = tempbx & 0x00FF ; */
5055 tempbx = (tempbx & 0xFF00) >> 8;
5056 tempcx = (tempcx + tempbx) >> 1;
5057 temp = (tempcx & 0x00FF) + 2;
5059 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5061 if (!(modeflag & HalfDCLK)) {
5062 if ((modeflag & Charx8Dot)) {
5064 if (pVBInfo->VGAHDE >= 800)
5069 if (!(modeflag & HalfDCLK)) {
5071 if (pVBInfo->LCDResInfo != Panel1280x960) {
5072 if (pVBInfo->VGAHDE >= 800) {
5074 if (pVBInfo->ModeType ==
5076 if (pVBInfo->VGAVDE ==
5079 if (pVBInfo->LCDResInfo != Panel1280x1024) {
5086 if (pVBInfo->VGAHDE >= 1280) {
5087 if (pVBInfo->LCDResInfo
5089 if (pVBInfo->LCDInfo
5090 & LCDNonExpanding) {
5102 /* 0x07 Horizontal Retrace Start */
5103 xgifb_reg_set(pVBInfo->Part1Port, 0x07, temp);
5104 /* 0x08 Horizontal Retrace End */
5105 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0);
5107 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5108 if (pVBInfo->TVInfo & TVSimuMode) {
5109 if ((ModeNo == 0x06) || (ModeNo == 0x10) || (ModeNo
5110 == 0x11) || (ModeNo == 0x13) || (ModeNo
5112 xgifb_reg_set(pVBInfo->Part1Port, 0x07, 0x5b);
5113 xgifb_reg_set(pVBInfo->Part1Port, 0x08, 0x03);
5116 if ((ModeNo == 0x00) || (ModeNo == 0x01)) {
5117 if (pVBInfo->TVInfo & SetNTSCTV) {
5118 xgifb_reg_set(pVBInfo->Part1Port,
5120 xgifb_reg_set(pVBInfo->Part1Port,
5123 xgifb_reg_set(pVBInfo->Part1Port,
5125 xgifb_reg_set(pVBInfo->Part1Port,
5127 xgifb_reg_set(pVBInfo->Part1Port,
5132 if ((ModeNo == 0x02) || (ModeNo == 0x03) || (ModeNo
5134 if (pVBInfo->TVInfo & SetNTSCTV) {
5135 xgifb_reg_set(pVBInfo->Part1Port,
5137 xgifb_reg_set(pVBInfo->Part1Port,
5140 xgifb_reg_set(pVBInfo->Part1Port,
5142 xgifb_reg_set(pVBInfo->Part1Port,
5144 xgifb_reg_set(pVBInfo->Part1Port,
5149 if ((ModeNo == 0x04) || (ModeNo == 0x05) || (ModeNo
5150 == 0x0D) || (ModeNo == 0x50)) {
5151 if (pVBInfo->TVInfo & SetNTSCTV) {
5152 xgifb_reg_set(pVBInfo->Part1Port,
5154 xgifb_reg_set(pVBInfo->Part1Port,
5157 xgifb_reg_set(pVBInfo->Part1Port,
5159 xgifb_reg_set(pVBInfo->Part1Port,
5166 xgifb_reg_set(pVBInfo->Part1Port, 0x18, 0x03); /* 0x18 SR0B */
5167 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0xF0, 0x00);
5168 xgifb_reg_set(pVBInfo->Part1Port, 0x09, 0xFF); /* 0x09 Set Max VT */
5170 tempbx = pVBInfo->VGAVT;
5173 tempbx = pVBInfo->VGAVDE; /* 0x0E Virtical Display End */
5188 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
5189 if (pVBInfo->LCDResInfo == Panel1024x768) {
5190 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
5199 temp = tempbx & 0x00FF;
5201 temp = tempbx & 0x00FF;
5202 /* 0x10 vertical Blank Start */
5203 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
5206 temp = tempbx & 0x00FF;
5207 xgifb_reg_set(pVBInfo->Part1Port, 0x0E, temp);
5209 if (tempbx & 0x0100)
5214 if (modeflag & DoubleScanMode)
5217 if (tempbx & 0x0200)
5220 temp = (tempax & 0xFF00) >> 8;
5221 xgifb_reg_set(pVBInfo->Part1Port, 0x0B, temp);
5223 if (tempbx & 0x0400)
5226 /* 0x11 Vertival Blank End */
5227 xgifb_reg_set(pVBInfo->Part1Port, 0x11, 0x00);
5230 tempax -= tempbx; /* 0x0C Vertical Retrace Start */
5231 tempax = tempax >> 2;
5232 push1 = tempax; /* push ax */
5234 if (resinfo != 0x09) {
5235 tempax = tempax << 1;
5239 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5240 if (pVBInfo->VBType & VB_XGI301LV) {
5241 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5244 if (pVBInfo->TVInfo & TVSimuMode) {
5245 if (pVBInfo->TVInfo & SetPALTV) {
5246 if (pVBInfo->VBType &
5248 if (!(pVBInfo->TVInfo &
5251 SetYPbPrMode1080i)))
5263 if (pVBInfo->TVInfo & TVSimuMode) {
5264 if (pVBInfo->TVInfo & SetPALTV) {
5265 if (pVBInfo->VBType & VB_XGI301LV) {
5266 if (!(pVBInfo->TVInfo &
5269 SetYPbPrMode1080i)))
5278 tempax = tempax >> 2;
5281 push1 = tempax; /* push ax */
5283 if ((pVBInfo->TVInfo & SetPALTV)) {
5284 if (tempbx <= 513) {
5290 temp = tempbx & 0x00FF;
5291 xgifb_reg_set(pVBInfo->Part1Port, 0x0C, temp);
5293 temp = tempbx & 0x00FF;
5294 xgifb_reg_set(pVBInfo->Part1Port, 0x10, temp);
5296 if (tempbx & 0x0100)
5299 if (tempbx & 0x0200)
5300 xgifb_reg_and_or(pVBInfo->Part1Port, 0x0B, 0x0FF, 0x20);
5304 if (tempbx & 0x0100)
5307 if (tempbx & 0x0200)
5310 if (tempbx & 0x0400)
5313 tempbx = push1; /* pop ax */
5314 temp = tempbx & 0x00FF;
5316 /* 0x0D vertical Retrace End */
5317 xgifb_reg_set(pVBInfo->Part1Port, 0x0D, temp);
5319 if (tempbx & 0x0010)
5322 temp = tempcx & 0x00FF;
5323 xgifb_reg_set(pVBInfo->Part1Port, 0x0A, temp); /* 0x0A CR07 */
5324 temp = (tempcx & 0x0FF00) >> 8;
5325 xgifb_reg_set(pVBInfo->Part1Port, 0x17, temp); /* 0x17 SR0A */
5327 temp = (tempax & 0xFF00) >> 8;
5329 temp = (temp >> 1) & 0x09;
5331 if (pVBInfo->VBType & (VB_XGI301LV | VB_XGI302LV | VB_XGI301C))
5334 xgifb_reg_set(pVBInfo->Part1Port, 0x16, temp); /* 0x16 SR01 */
5335 xgifb_reg_set(pVBInfo->Part1Port, 0x0F, 0); /* 0x0F CR14 */
5336 xgifb_reg_set(pVBInfo->Part1Port, 0x12, 0); /* 0x12 CR17 */
5338 if (pVBInfo->LCDInfo & LCDRGB18Bit)
5343 xgifb_reg_set(pVBInfo->Part1Port, 0x1A, temp); /* 0x1A SR0E */
5348 static void XGI_SetGroup2(unsigned short ModeNo, unsigned short ModeIdIndex,
5349 unsigned short RefreshRateTableIndex,
5350 struct xgi_hw_device_info *HwDeviceExtension,
5351 struct vb_device_info *pVBInfo)
5353 unsigned short i, j, tempax, tempbx, tempcx, temp, push1, push2,
5354 modeflag, resinfo, crt2crtc;
5355 unsigned char *TimingPoint;
5357 unsigned long longtemp, tempeax, tempebx, temp2, tempecx;
5359 if (ModeNo <= 0x13) {
5361 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
5362 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
5363 crt2crtc = pVBInfo->SModeIDTable[ModeIdIndex].St_CRT2CRTC;
5365 /* si+Ext_ResInfo */
5366 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
5367 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
5368 crt2crtc = pVBInfo->RefIndex[RefreshRateTableIndex].
5374 if (!(pVBInfo->VBInfo & SetCRT2ToAVIDEO))
5377 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5380 if (pVBInfo->VBInfo & SetCRT2ToSCART)
5383 if (!(pVBInfo->TVInfo & SetPALTV))
5386 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5389 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))
5392 tempax = (tempax & 0xff00) >> 8;
5394 xgifb_reg_set(pVBInfo->Part2Port, 0x0, tempax);
5395 TimingPoint = pVBInfo->NTSCTiming;
5397 if (pVBInfo->TVInfo & SetPALTV)
5398 TimingPoint = pVBInfo->PALTiming;
5400 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5401 TimingPoint = pVBInfo->HiTVExtTiming;
5403 if (pVBInfo->VBInfo & SetInSlaveMode)
5404 TimingPoint = pVBInfo->HiTVSt2Timing;
5406 if (pVBInfo->SetFlag & TVSimuMode)
5407 TimingPoint = pVBInfo->HiTVSt1Timing;
5409 if (!(modeflag & Charx8Dot))
5410 TimingPoint = pVBInfo->HiTVTextTiming;
5413 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
5414 if (pVBInfo->TVInfo & SetYPbPrMode525i)
5415 TimingPoint = pVBInfo->YPbPr525iTiming;
5417 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5418 TimingPoint = pVBInfo->YPbPr525pTiming;
5420 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5421 TimingPoint = pVBInfo->YPbPr750pTiming;
5424 for (i = 0x01, j = 0; i <= 0x2D; i++, j++)
5425 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
5427 for (i = 0x39; i <= 0x45; i++, j++)
5429 xgifb_reg_set(pVBInfo->Part2Port, i, TimingPoint[j]);
5431 if (pVBInfo->VBInfo & SetCRT2ToTV)
5432 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, 0x00);
5434 temp = pVBInfo->NewFlickerMode;
5436 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xFF, temp);
5438 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5441 if (pVBInfo->TVInfo & SetPALTV)
5446 if (pVBInfo->VDE <= tempax) {
5447 tempax -= pVBInfo->VDE;
5448 tempax = tempax >> 2;
5449 tempax = (tempax & 0x00FF) | ((tempax & 0x00FF) << 8);
5451 temp = (tempax & 0xFF00) >> 8;
5452 temp += (unsigned short) TimingPoint[0];
5454 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5455 | VB_XGI302LV | VB_XGI301C)) {
5456 if (pVBInfo->VBInfo & (SetCRT2ToAVIDEO
5457 | SetCRT2ToSVIDEO | SetCRT2ToSCART
5458 | SetCRT2ToYPbPr)) {
5459 tempcx = pVBInfo->VGAHDE;
5460 if (tempcx >= 1024) {
5461 temp = 0x17; /* NTSC */
5462 if (pVBInfo->TVInfo & SetPALTV)
5463 temp = 0x19; /* PAL */
5468 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
5470 temp = (tempax & 0xFF00) >> 8;
5471 temp += TimingPoint[1];
5473 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5474 | VB_XGI302LV | VB_XGI301C)) {
5475 if ((pVBInfo->VBInfo & (SetCRT2ToAVIDEO
5476 | SetCRT2ToSVIDEO | SetCRT2ToSCART
5477 | SetCRT2ToYPbPr))) {
5478 tempcx = pVBInfo->VGAHDE;
5479 if (tempcx >= 1024) {
5480 temp = 0x1D; /* NTSC */
5481 if (pVBInfo->TVInfo & SetPALTV)
5482 temp = 0x52; /* PAL */
5486 xgifb_reg_set(pVBInfo->Part2Port, 0x02, temp);
5490 tempcx = pVBInfo->HT;
5492 if (XGI_IsLCDDualLink(pVBInfo))
5493 tempcx = tempcx >> 1;
5496 temp = tempcx & 0x00FF;
5497 xgifb_reg_set(pVBInfo->Part2Port, 0x1B, temp);
5499 temp = (tempcx & 0xFF00) >> 8;
5500 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F, temp);
5502 tempcx = pVBInfo->HT >> 1;
5503 push1 = tempcx; /* push cx */
5506 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5509 temp = tempcx & 0x00FF;
5511 xgifb_reg_and_or(pVBInfo->Part2Port, 0x22, 0x0F, temp);
5513 tempbx = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
5516 temp = tempbx & 0x00FF;
5517 xgifb_reg_set(pVBInfo->Part2Port, 0x24, temp);
5518 temp = (tempbx & 0xFF00) >> 8;
5520 xgifb_reg_and_or(pVBInfo->Part2Port, 0x25, 0x0F, temp);
5523 tempbx = tempbx + 8;
5524 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5525 tempbx = tempbx - 4;
5529 temp = (tempbx & 0x00FF) << 4;
5530 xgifb_reg_and_or(pVBInfo->Part2Port, 0x29, 0x0F, temp);
5533 tempcx += (TimingPoint[j] | ((TimingPoint[j + 1]) << 8));
5534 temp = tempcx & 0x00FF;
5535 xgifb_reg_set(pVBInfo->Part2Port, 0x27, temp);
5536 temp = ((tempcx & 0xFF00) >> 8) << 4;
5537 xgifb_reg_and_or(pVBInfo->Part2Port, 0x28, 0x0F, temp);
5540 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
5543 temp = tempcx & 0xFF;
5545 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2A, 0x0F, temp);
5547 tempcx = push1; /* pop cx */
5549 temp = TimingPoint[j] | ((TimingPoint[j + 1]) << 8);
5551 temp = tempcx & 0x00FF;
5553 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2D, 0x0F, temp);
5557 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
5558 tempax = XGI_GetVGAHT2(pVBInfo);
5559 tempcx = tempax - 1;
5561 temp = tempcx & 0x00FF;
5562 xgifb_reg_set(pVBInfo->Part2Port, 0x2E, temp);
5564 tempbx = pVBInfo->VDE;
5566 if (pVBInfo->VGAVDE == 360)
5568 if (pVBInfo->VGAVDE == 375)
5570 if (pVBInfo->VGAVDE == 405)
5573 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5574 if (pVBInfo->VBType &
5575 (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
5576 if (!(pVBInfo->TVInfo &
5577 (SetYPbPrMode525p | SetYPbPrMode750p)))
5578 tempbx = tempbx >> 1;
5580 tempbx = tempbx >> 1;
5584 temp = tempbx & 0x00FF;
5586 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5587 if (pVBInfo->VBType & VB_XGI301LV) {
5588 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5589 if (pVBInfo->VBInfo & SetInSlaveMode) {
5595 if (pVBInfo->VBInfo & SetInSlaveMode) {
5602 xgifb_reg_set(pVBInfo->Part2Port, 0x2F, temp);
5604 temp = (tempcx & 0xFF00) >> 8;
5605 temp |= ((tempbx & 0xFF00) >> 8) << 6;
5607 if (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)) {
5608 if (pVBInfo->VBType & VB_XGI301LV) {
5609 if (pVBInfo->TVInfo & SetYPbPrMode1080i) {
5612 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5617 if (!(pVBInfo->VBInfo & SetCRT2ToSVIDEO))
5622 xgifb_reg_set(pVBInfo->Part2Port, 0x30, temp);
5624 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5625 | VB_XGI302LV | VB_XGI301C)) { /* TV gatingno */
5626 tempbx = pVBInfo->VDE;
5627 tempcx = tempbx - 2;
5629 if (pVBInfo->VBInfo & SetCRT2ToTV) {
5630 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p
5631 | SetYPbPrMode750p)))
5632 tempbx = tempbx >> 1;
5635 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
5637 if (tempcx & 0x0400)
5640 if (tempbx & 0x0400)
5643 xgifb_reg_set(pVBInfo->Part4Port, 0x10, temp);
5646 temp = (((tempbx - 3) & 0x0300) >> 8) << 5;
5647 xgifb_reg_set(pVBInfo->Part2Port, 0x46, temp);
5648 temp = (tempbx - 3) & 0x00FF;
5649 xgifb_reg_set(pVBInfo->Part2Port, 0x47, temp);
5652 tempbx = tempbx & 0x00FF;
5654 if (!(modeflag & HalfDCLK)) {
5655 tempcx = pVBInfo->VGAHDE;
5656 if (tempcx >= pVBInfo->HDE) {
5664 if (pVBInfo->VBInfo & SetCRT2ToTV) { /*301b*/
5665 if (pVBInfo->VGAHDE >= 1024) {
5667 if (pVBInfo->VGAHDE >= 1280) {
5669 tempbx = tempbx & 0xDFFF;
5674 if (!(tempbx & 0x2000)) {
5675 if (modeflag & HalfDCLK)
5676 tempcx = (tempcx & 0xFF00) | ((tempcx & 0x00FF) << 1);
5679 tempeax = pVBInfo->VGAHDE;
5680 tempebx = (tempcx & 0xFF00) >> 8;
5681 longtemp = tempeax * tempebx;
5682 tempecx = tempcx & 0x00FF;
5683 longtemp = longtemp / tempecx;
5688 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5689 | VB_XGI302LV | VB_XGI301C)) {
5690 tempecx = tempecx * 8;
5693 longtemp = longtemp * tempecx;
5694 tempecx = pVBInfo->HDE;
5695 temp2 = longtemp % tempecx;
5696 tempeax = longtemp / tempecx;
5700 tempax = (unsigned short) tempeax;
5703 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
5704 | VB_XGI302LV | VB_XGI301C)) {
5705 tempcx = ((tempax & 0xFF00) >> 5) >> 8;
5710 tempbx = (unsigned short) (((tempeax & 0x0000FF00) & 0x1F00)
5711 | (tempbx & 0x00FF));
5712 tempax = (unsigned short) (((tempeax & 0x000000FF) << 8)
5713 | (tempax & 0x00FF));
5714 temp = (tempax & 0xFF00) >> 8;
5716 temp = (tempax & 0x00FF) >> 8;
5719 xgifb_reg_set(pVBInfo->Part2Port, 0x44, temp);
5720 temp = (tempbx & 0xFF00) >> 8;
5721 xgifb_reg_and_or(pVBInfo->Part2Port, 0x45, ~0x03F, temp);
5722 temp = tempcx & 0x00FF;
5724 if (tempbx & 0x2000)
5727 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5730 xgifb_reg_and_or(pVBInfo->Part2Port, 0x46, ~0x1F, temp);
5731 if (pVBInfo->TVInfo & SetPALTV) {
5739 temp = tempbx & 0x00FF;
5740 xgifb_reg_set(pVBInfo->Part2Port, 0x4b, temp);
5741 temp = tempcx & 0x00FF;
5742 xgifb_reg_set(pVBInfo->Part2Port, 0x4c, temp);
5744 temp = ((tempcx & 0xFF00) >> 8) & 0x03;
5746 temp |= ((tempbx & 0xFF00) >> 8) & 0x03;
5748 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
5751 if (pVBInfo->TVInfo & SetYPbPrMode525p)
5754 if (pVBInfo->TVInfo & SetYPbPrMode750p)
5758 xgifb_reg_set(pVBInfo->Part2Port, 0x4d, temp);
5759 temp = xgifb_reg_get(pVBInfo->Part2Port, 0x43); /* 301b change */
5760 xgifb_reg_set(pVBInfo->Part2Port, 0x43, (unsigned short) (temp - 3));
5762 if (!(pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))) {
5763 if (pVBInfo->TVInfo & NTSC1024x768) {
5764 TimingPoint = XGI_NTSC1024AdjTime;
5765 for (i = 0x1c, j = 0; i <= 0x30; i++, j++) {
5766 xgifb_reg_set(pVBInfo->Part2Port, i,
5769 xgifb_reg_set(pVBInfo->Part2Port, 0x43, 0x72);
5773 /* [ycchen] 01/14/03 Modify for 301C PALM Support */
5774 if (pVBInfo->VBType & VB_XGI301C) {
5775 if (pVBInfo->TVInfo & SetPALMTV)
5776 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x08,
5777 0x08); /* PALM Mode */
5780 if (pVBInfo->TVInfo & SetPALMTV) {
5781 tempax = (unsigned char) xgifb_reg_get(pVBInfo->Part2Port,
5784 xgifb_reg_and(pVBInfo->Part2Port, 0x01, tempax);
5786 /* if ( !( pVBInfo->VBType & VB_XGI301C ) ) */
5787 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xEF);
5790 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) {
5791 if (!(pVBInfo->VBInfo & SetInSlaveMode))
5792 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, 0x00);
5795 if (pVBInfo->VBInfo & SetCRT2ToTV)
5799 static void XGI_SetLCDRegs(unsigned short ModeNo, unsigned short ModeIdIndex,
5800 struct xgi_hw_device_info *HwDeviceExtension,
5801 unsigned short RefreshRateTableIndex,
5802 struct vb_device_info *pVBInfo)
5804 unsigned short push1, push2, pushbx, tempax, tempbx, tempcx, temp,
5805 tempah, tempbh, tempch, resinfo, modeflag, CRT1Index;
5807 struct XGI_LCDDesStruct *LCDBDesPtr = NULL;
5809 if (ModeNo <= 0x13) {
5811 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
5812 resinfo = pVBInfo->SModeIDTable[ModeIdIndex].St_ResInfo;
5814 /* si+Ext_ResInfo */
5815 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
5816 resinfo = pVBInfo->EModeIDTable[ModeIdIndex].Ext_RESINFO;
5817 CRT1Index = pVBInfo->RefIndex[RefreshRateTableIndex].
5819 CRT1Index &= IndexMask;
5822 if (!(pVBInfo->VBInfo & SetCRT2ToLCD))
5825 tempbx = pVBInfo->HDE; /* RHACTE=HDE-1 */
5827 if (XGI_IsLCDDualLink(pVBInfo))
5828 tempbx = tempbx >> 1;
5831 temp = tempbx & 0x00FF;
5832 xgifb_reg_set(pVBInfo->Part2Port, 0x2C, temp);
5833 temp = (tempbx & 0xFF00) >> 8;
5835 xgifb_reg_and_or(pVBInfo->Part2Port, 0x2B, 0x0F, temp);
5838 if (pVBInfo->LCDResInfo == Panel1280x1024) {
5839 if (pVBInfo->ModeType == ModeEGA) {
5840 if (pVBInfo->VGAHDE >= 1024) {
5842 if (pVBInfo->LCDInfo & LCDVESATiming)
5848 xgifb_reg_set(pVBInfo->Part2Port, 0x0B, temp);
5849 tempbx = pVBInfo->VDE; /* RTVACTEO=(VDE-1)&0xFF */
5852 temp = tempbx & 0x00FF;
5853 xgifb_reg_set(pVBInfo->Part2Port, 0x03, temp);
5854 temp = ((tempbx & 0xFF00) >> 8) & 0x07;
5855 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0C, ~0x07, temp);
5857 tempcx = pVBInfo->VT - 1;
5859 temp = tempcx & 0x00FF; /* RVTVT=VT-1 */
5860 xgifb_reg_set(pVBInfo->Part2Port, 0x19, temp);
5861 temp = (tempcx & 0xFF00) >> 8;
5863 xgifb_reg_set(pVBInfo->Part2Port, 0x1A, temp);
5864 xgifb_reg_and_or(pVBInfo->Part2Port, 0x09, 0xF0, 0x00);
5865 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0xF0, 0x00);
5866 xgifb_reg_and_or(pVBInfo->Part2Port, 0x17, 0xFB, 0x00);
5867 xgifb_reg_and_or(pVBInfo->Part2Port, 0x18, 0xDF, 0x00);
5869 /* Customized LCDB Des no add */
5871 LCDBDesPtr = (struct XGI_LCDDesStruct *) XGI_GetLcdPtr(tempbx, ModeNo,
5872 ModeIdIndex, RefreshRateTableIndex, pVBInfo);
5873 tempah = pVBInfo->LCDResInfo;
5874 tempah &= PanelResInfo;
5876 if ((tempah == Panel1024x768) || (tempah == Panel1024x768x75)) {
5879 } else if ((tempah == Panel1280x1024) ||
5880 (tempah == Panel1280x1024x75)) {
5883 } else if (tempah == Panel1400x1050) {
5891 if (pVBInfo->LCDInfo & EnableScalingLCD) {
5892 tempbx = pVBInfo->HDE;
5893 tempcx = pVBInfo->VDE;
5897 tempax = pVBInfo->VT;
5898 pVBInfo->LCDHDES = LCDBDesPtr->LCDHDES;
5899 pVBInfo->LCDHRS = LCDBDesPtr->LCDHRS;
5900 pVBInfo->LCDVDES = LCDBDesPtr->LCDVDES;
5901 pVBInfo->LCDVRS = LCDBDesPtr->LCDVRS;
5902 tempbx = pVBInfo->LCDVDES;
5905 if (tempcx >= tempax)
5906 tempcx -= tempax; /* lcdvdes */
5908 temp = tempbx & 0x00FF; /* RVEQ1EQ=lcdvdes */
5909 xgifb_reg_set(pVBInfo->Part2Port, 0x05, temp);
5910 temp = tempcx & 0x00FF;
5911 xgifb_reg_set(pVBInfo->Part2Port, 0x06, temp);
5912 tempch = ((tempcx & 0xFF00) >> 8) & 0x07;
5913 tempbh = ((tempbx & 0xFF00) >> 8) & 0x07;
5915 tempah = tempah << 3;
5917 xgifb_reg_set(pVBInfo->Part2Port, 0x02, tempah);
5920 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5922 tempax = pVBInfo->VT;
5923 tempbx = pVBInfo->LCDVRS;
5925 /* if (SetLCD_Info & EnableScalingLCD) */
5927 if (tempcx >= tempax)
5930 temp = tempbx & 0x00FF; /* RTVACTEE=lcdvrs */
5931 xgifb_reg_set(pVBInfo->Part2Port, 0x04, temp);
5932 temp = (tempbx & 0xFF00) >> 8;
5934 temp |= (tempcx & 0x000F);
5935 xgifb_reg_set(pVBInfo->Part2Port, 0x01, temp);
5937 tempax = pVBInfo->HT;
5938 tempbx = pVBInfo->LCDHDES;
5941 if (XGI_IsLCDDualLink(pVBInfo)) {
5942 tempax = tempax >> 1;
5943 tempbx = tempbx >> 1;
5944 tempcx = tempcx >> 1;
5947 if (pVBInfo->VBType & VB_XGI302LV)
5950 if (pVBInfo->VBType & VB_XGI301C) /* tap4 */
5955 if (tempcx >= tempax)
5958 temp = tempbx & 0x00FF;
5959 xgifb_reg_set(pVBInfo->Part2Port, 0x1F, temp); /* RHBLKE=lcdhdes */
5960 temp = ((tempbx & 0xFF00) >> 8) << 4;
5961 xgifb_reg_set(pVBInfo->Part2Port, 0x20, temp);
5962 temp = tempcx & 0x00FF;
5963 xgifb_reg_set(pVBInfo->Part2Port, 0x23, temp); /* RHEQPLE=lcdhdee */
5964 temp = (tempcx & 0xFF00) >> 8;
5965 xgifb_reg_set(pVBInfo->Part2Port, 0x25, temp);
5968 XGI_GetLCDSync(&tempax, &tempbx, pVBInfo);
5970 tempax = pVBInfo->HT;
5971 tempbx = pVBInfo->LCDHRS;
5972 /* if ( SetLCD_Info & EnableScalingLCD) */
5973 if (XGI_IsLCDDualLink(pVBInfo)) {
5974 tempax = tempax >> 1;
5975 tempbx = tempbx >> 1;
5976 tempcx = tempcx >> 1;
5979 if (pVBInfo->VBType & VB_XGI302LV)
5984 if (tempcx >= tempax)
5987 temp = tempbx & 0x00FF; /* RHBURSTS=lcdhrs */
5988 xgifb_reg_set(pVBInfo->Part2Port, 0x1C, temp);
5990 temp = (tempbx & 0xFF00) >> 8;
5992 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1D, ~0x0F0, temp);
5993 temp = tempcx & 0x00FF; /* RHSYEXP2S=lcdhre */
5994 xgifb_reg_set(pVBInfo->Part2Port, 0x21, temp);
5996 if (!(pVBInfo->LCDInfo & LCDVESATiming)) {
5997 if (pVBInfo->VGAVDE == 525) {
5998 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
5999 | VB_XGI301LV | VB_XGI302LV
6005 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
6006 xgifb_reg_set(pVBInfo->Part2Port, 0x30, 0xB3);
6009 if (pVBInfo->VGAVDE == 420) {
6010 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
6011 | VB_XGI301LV | VB_XGI302LV
6016 xgifb_reg_set(pVBInfo->Part2Port, 0x2f, temp);
6021 /* --------------------------------------------------------------------- */
6022 /* Function : XGI_GetTap4Ptr */
6024 /* Output : di -> Tap4 Reg. Setting Pointer */
6026 /* --------------------------------------------------------------------- */
6027 static struct XGI301C_Tap4TimingStruct *XGI_GetTap4Ptr(unsigned short tempcx,
6028 struct vb_device_info *pVBInfo)
6030 unsigned short tempax, tempbx, i;
6032 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
6035 tempax = pVBInfo->VGAHDE;
6036 tempbx = pVBInfo->HDE;
6038 tempax = pVBInfo->VGAVDE;
6039 tempbx = pVBInfo->VDE;
6042 if (tempax < tempbx)
6043 return &EnlargeTap4Timing[0];
6044 else if (tempax == tempbx)
6045 return &NoScaleTap4Timing[0]; /* 1:1 */
6047 Tap4TimingPtr = NTSCTap4Timing; /* NTSC */
6049 if (pVBInfo->TVInfo & SetPALTV)
6050 Tap4TimingPtr = PALTap4Timing;
6052 if (pVBInfo->VBInfo & SetCRT2ToYPbPr) {
6053 if (pVBInfo->TVInfo & SetYPbPrMode525i)
6054 Tap4TimingPtr = YPbPr525iTap4Timing;
6055 if (pVBInfo->TVInfo & SetYPbPrMode525p)
6056 Tap4TimingPtr = YPbPr525pTap4Timing;
6057 if (pVBInfo->TVInfo & SetYPbPrMode750p)
6058 Tap4TimingPtr = YPbPr750pTap4Timing;
6061 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV)
6062 Tap4TimingPtr = HiTVTap4Timing;
6065 while (Tap4TimingPtr[i].DE != 0xFFFF) {
6066 if (Tap4TimingPtr[i].DE == tempax)
6070 return &Tap4TimingPtr[i];
6073 static void XGI_SetTap4Regs(struct vb_device_info *pVBInfo)
6075 unsigned short i, j;
6077 struct XGI301C_Tap4TimingStruct *Tap4TimingPtr;
6079 if (!(pVBInfo->VBType & VB_XGI301C))
6083 xgifb_reg_and(pVBInfo->Part2Port, 0x4E, 0xEB); /* Disable Tap4 */
6084 #else /* Tap4 Setting */
6086 Tap4TimingPtr = XGI_GetTap4Ptr(0, pVBInfo); /* Set Horizontal Scaling */
6087 for (i = 0x80, j = 0; i <= 0xBF; i++, j++)
6088 xgifb_reg_set(pVBInfo->Part2Port, i, Tap4TimingPtr->Reg[j]);
6090 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
6091 (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV))) {
6092 /* Set Vertical Scaling */
6093 Tap4TimingPtr = XGI_GetTap4Ptr(1, pVBInfo);
6094 for (i = 0xC0, j = 0; i < 0xFF; i++, j++)
6095 xgifb_reg_set(pVBInfo->Part2Port,
6097 Tap4TimingPtr->Reg[j]);
6100 if ((pVBInfo->VBInfo & SetCRT2ToTV) &&
6101 (!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)))
6102 /* Enable V.Scaling */
6103 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x04);
6105 /* Enable H.Scaling */
6106 xgifb_reg_and_or(pVBInfo->Part2Port, 0x4E, ~0x14, 0x10);
6110 static void XGI_SetGroup3(unsigned short ModeNo, unsigned short ModeIdIndex,
6111 struct vb_device_info *pVBInfo)
6114 unsigned char *tempdi;
6115 unsigned short modeflag;
6119 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
6121 /* si+Ext_ResInfo */
6122 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
6124 xgifb_reg_set(pVBInfo->Part3Port, 0x00, 0x00);
6125 if (pVBInfo->TVInfo & SetPALTV) {
6126 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
6127 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
6129 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xF5);
6130 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xB7);
6133 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
6136 if (pVBInfo->TVInfo & SetPALMTV) {
6137 xgifb_reg_set(pVBInfo->Part3Port, 0x13, 0xFA);
6138 xgifb_reg_set(pVBInfo->Part3Port, 0x14, 0xC8);
6139 xgifb_reg_set(pVBInfo->Part3Port, 0x3D, 0xA8);
6142 if ((pVBInfo->VBInfo & SetCRT2ToHiVisionTV) || (pVBInfo->VBInfo
6143 & SetCRT2ToYPbPr)) {
6144 if (pVBInfo->TVInfo & SetYPbPrMode525i)
6147 tempdi = pVBInfo->HiTVGroup3Data;
6148 if (pVBInfo->SetFlag & TVSimuMode) {
6149 tempdi = pVBInfo->HiTVGroup3Simu;
6150 if (!(modeflag & Charx8Dot))
6151 tempdi = pVBInfo->HiTVGroup3Text;
6154 if (pVBInfo->TVInfo & SetYPbPrMode525p)
6155 tempdi = pVBInfo->Ren525pGroup3;
6157 if (pVBInfo->TVInfo & SetYPbPrMode750p)
6158 tempdi = pVBInfo->Ren750pGroup3;
6160 for (i = 0; i <= 0x3E; i++)
6161 xgifb_reg_set(pVBInfo->Part3Port, i, tempdi[i]);
6163 if (pVBInfo->VBType & VB_XGI301C) { /* Marcovision */
6164 if (pVBInfo->TVInfo & SetYPbPrMode525p)
6165 xgifb_reg_set(pVBInfo->Part3Port, 0x28, 0x3f);
6169 } /* {end of XGI_SetGroup3} */
6171 static void XGI_SetGroup4(unsigned short ModeNo, unsigned short ModeIdIndex,
6172 unsigned short RefreshRateTableIndex,
6173 struct xgi_hw_device_info *HwDeviceExtension,
6174 struct vb_device_info *pVBInfo)
6176 unsigned short tempax, tempcx, tempbx, modeflag, temp, temp2;
6178 unsigned long tempebx, tempeax, templong;
6182 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
6184 /* si+Ext_ResInfo */
6185 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
6187 temp = pVBInfo->RVBHCFACT;
6188 xgifb_reg_set(pVBInfo->Part4Port, 0x13, temp);
6190 tempbx = pVBInfo->RVBHCMAX;
6191 temp = tempbx & 0x00FF;
6192 xgifb_reg_set(pVBInfo->Part4Port, 0x14, temp);
6193 temp2 = ((tempbx & 0xFF00) >> 8) << 7;
6194 tempcx = pVBInfo->VGAHT - 1;
6195 temp = tempcx & 0x00FF;
6196 xgifb_reg_set(pVBInfo->Part4Port, 0x16, temp);
6198 temp = ((tempcx & 0xFF00) >> 8) << 3;
6201 tempcx = pVBInfo->VGAVT - 1;
6202 if (!(pVBInfo->VBInfo & SetCRT2ToTV))
6205 temp = tempcx & 0x00FF;
6206 xgifb_reg_set(pVBInfo->Part4Port, 0x17, temp);
6207 temp = temp2 | ((tempcx & 0xFF00) >> 8);
6208 xgifb_reg_set(pVBInfo->Part4Port, 0x15, temp);
6209 xgifb_reg_or(pVBInfo->Part4Port, 0x0D, 0x08);
6210 tempcx = pVBInfo->VBInfo;
6211 tempbx = pVBInfo->VGAHDE;
6213 if (modeflag & HalfDCLK)
6214 tempbx = tempbx >> 1;
6216 if (XGI_IsLCDDualLink(pVBInfo))
6217 tempbx = tempbx >> 1;
6219 if (tempcx & SetCRT2ToHiVisionTV) {
6225 } else if (tempcx & SetCRT2ToTV) {
6231 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
6238 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p)) {
6240 if (pVBInfo->VGAHDE == 1280)
6242 if (pVBInfo->VGAHDE == 1024)
6245 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0E, ~0xEF, temp);
6247 tempebx = pVBInfo->VDE;
6249 if (tempcx & SetCRT2ToHiVisionTV) {
6250 if (!(temp & 0xE000))
6251 tempbx = tempbx >> 1;
6254 tempcx = pVBInfo->RVBHRS;
6255 temp = tempcx & 0x00FF;
6256 xgifb_reg_set(pVBInfo->Part4Port, 0x18, temp);
6258 tempeax = pVBInfo->VGAVDE;
6261 if (tempeax <= tempebx) {
6262 tempcx = (tempcx & (~0x4000));
6263 tempeax = pVBInfo->VGAVDE;
6268 templong = (tempeax * 256 * 1024) % tempebx;
6269 tempeax = (tempeax * 256 * 1024) / tempebx;
6275 temp = (unsigned short) (tempebx & 0x000000FF);
6276 xgifb_reg_set(pVBInfo->Part4Port, 0x1B, temp);
6278 temp = (unsigned short) ((tempebx & 0x0000FF00) >> 8);
6279 xgifb_reg_set(pVBInfo->Part4Port, 0x1A, temp);
6280 tempbx = (unsigned short) (tempebx >> 16);
6281 temp = tempbx & 0x00FF;
6283 temp |= ((tempcx & 0xFF00) >> 8);
6284 xgifb_reg_set(pVBInfo->Part4Port, 0x19, temp);
6287 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
6288 | VB_XGI302LV | VB_XGI301C)) {
6290 xgifb_reg_set(pVBInfo->Part4Port, 0x1C, temp);
6291 tempax = pVBInfo->VGAHDE;
6292 if (modeflag & HalfDCLK)
6293 tempax = tempax >> 1;
6295 if (XGI_IsLCDDualLink(pVBInfo))
6296 tempax = tempax >> 1;
6298 /* if((pVBInfo->VBInfo&(SetCRT2ToLCD)) ||
6299 ((pVBInfo->TVInfo&SetYPbPrMode525p) ||
6300 (pVBInfo->TVInfo&SetYPbPrMode750p))) { */
6301 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
6305 if (pVBInfo->VGAHDE > 800) {
6306 if (pVBInfo->VGAHDE == 1024)
6307 tempax = (tempax * 25 / 32) - 1;
6309 tempax = (tempax * 20 / 32) - 1;
6315 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
6316 if (pVBInfo->VBType & VB_XGI301LV) {
6317 if (!(pVBInfo->TVInfo &
6320 SetYPbPrMode1080i))) {
6321 if (pVBInfo->VGAHDE > 800) {
6322 if (pVBInfo->VGAHDE == 1024)
6323 tempax =(tempax * 25 /
6326 tempax = (tempax * 20 /
6331 if (pVBInfo->VGAHDE > 800) {
6332 if (pVBInfo->VGAHDE == 1024)
6333 tempax = (tempax * 25 / 32) - 1;
6335 tempax = (tempax * 20 / 32) - 1;
6341 temp = (tempax & 0xFF00) >> 8;
6342 temp = ((temp & 0x0003) << 4);
6343 xgifb_reg_set(pVBInfo->Part4Port, 0x1E, temp);
6344 temp = (tempax & 0x00FF);
6345 xgifb_reg_set(pVBInfo->Part4Port, 0x1D, temp);
6347 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToHiVisionTV)) {
6348 if (pVBInfo->VGAHDE > 800)
6349 xgifb_reg_or(pVBInfo->Part4Port, 0x1E, 0x08);
6354 if (pVBInfo->VBInfo & SetCRT2ToTV) {
6355 if (!(pVBInfo->TVInfo & (NTSC1024x768
6356 | SetYPbPrMode525p | SetYPbPrMode750p
6357 | SetYPbPrMode1080i))) {
6359 if ((pVBInfo->VBInfo & SetInSlaveMode)
6360 && (!(pVBInfo->TVInfo
6366 xgifb_reg_and_or(pVBInfo->Part4Port, 0x1F, 0x00C0, temp);
6367 tempbx = pVBInfo->HT;
6368 if (XGI_IsLCDDualLink(pVBInfo))
6369 tempbx = tempbx >> 1;
6370 tempbx = (tempbx >> 1) - 2;
6371 temp = ((tempbx & 0x0700) >> 8) << 3;
6372 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, 0x00C0, temp);
6373 temp = tempbx & 0x00FF;
6374 xgifb_reg_set(pVBInfo->Part4Port, 0x22, temp);
6378 if (pVBInfo->ISXPDOS == 0)
6379 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex,
6383 static void XGINew_EnableCRT2(struct vb_device_info *pVBInfo)
6385 xgifb_reg_and_or(pVBInfo->P3c4, 0x1E, 0xFF, 0x20);
6388 static void XGI_SetGroup5(unsigned short ModeNo, unsigned short ModeIdIndex,
6389 struct vb_device_info *pVBInfo)
6391 unsigned short Pindex, Pdata;
6393 Pindex = pVBInfo->Part5Port;
6394 Pdata = pVBInfo->Part5Port + 1;
6395 if (pVBInfo->ModeType == ModeVGA) {
6396 if (!(pVBInfo->VBInfo & (SetInSlaveMode | LoadDACFlag
6397 | CRT2DisplayFlag))) {
6398 XGINew_EnableCRT2(pVBInfo);
6399 /* LoadDAC2(pVBInfo->Part5Port, ModeNo, ModeIdIndex); */
6405 static void XGI_EnableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
6406 struct vb_device_info *pVBInfo)
6408 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x40);
6411 static void XGI_DisableGatingCRT(struct xgi_hw_device_info *HwDeviceExtension,
6412 struct vb_device_info *pVBInfo)
6415 xgifb_reg_and_or(pVBInfo->P3d4, 0x63, 0xBF, 0x00);
6418 /*----------------------------------------------------------------------------*/
6420 /* bl[5] : 1;LVDS signal on */
6421 /* bl[1] : 1;LVDS backlight on */
6422 /* bl[0] : 1:LVDS VDD on */
6423 /* bh: 100000b : clear bit 5, to set bit5 */
6424 /* 000010b : clear bit 1, to set bit1 */
6425 /* 000001b : clear bit 0, to set bit0 */
6426 /*----------------------------------------------------------------------------*/
6427 void XGI_XG21BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
6428 struct vb_device_info *pVBInfo)
6430 unsigned char CR4A, temp;
6432 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
6435 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
6437 if (tempbh & 0x20) {
6438 temp = (tempbl >> 4) & 0x02;
6441 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
6445 temp = xgifb_reg_get(pVBInfo->P3d4, 0x48);
6447 temp = XG21GPIODataTransfer(temp);
6450 xgifb_reg_set(pVBInfo->P3d4, 0x48, temp);
6453 void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
6454 struct vb_device_info *pVBInfo)
6456 unsigned char CR4A, temp;
6457 unsigned short tempbh0, tempbl0;
6466 if (tempbh & 0x20) {
6467 temp = (tempbl >> 4) & 0x02;
6470 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~0x02, temp);
6473 xgifb_reg_and_or(pVBInfo->P3d4, 0xB4, ~tempbh0, tempbl0);
6475 CR4A = xgifb_reg_get(pVBInfo->P3d4, 0x4A);
6479 tempbl <<= 2; /* GPIOC,GPIOD */
6480 xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~tempbh); /* enable GPIO write */
6481 xgifb_reg_and_or(pVBInfo->P3d4, 0x48, ~tempbh, tempbl);
6484 /* --------------------------------------------------------------------- */
6485 unsigned short XGI_GetLVDSOEMTableIndex(struct vb_device_info *pVBInfo)
6487 unsigned short index;
6489 index = xgifb_reg_get(pVBInfo->P3d4, 0x36);
6490 if (index < sizeof(XGI21_LCDCapList)
6491 / sizeof(struct XGI21_LVDSCapStruct))
6496 /* --------------------------------------------------------------------- */
6497 /* Function : XGI_XG21SetPanelDelay */
6501 /* I/P : bl : 1 ; T1 : the duration between CPL on and signal on */
6502 /* : bl : 2 ; T2 : the duration signal on and Vdd on */
6503 /* : bl : 3 ; T3 : the duration between CPL off and signal off */
6504 /* : bl : 4 ; T4 : the duration signal off and Vdd off */
6505 /* --------------------------------------------------------------------- */
6506 void XGI_XG21SetPanelDelay(unsigned short tempbl,
6507 struct vb_device_info *pVBInfo)
6509 unsigned short index;
6511 index = XGI_GetLVDSOEMTableIndex(pVBInfo);
6513 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S1);
6516 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S2);
6519 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S3);
6522 mdelay(pVBInfo->XG21_LVDSCapList[index].PSC_S4);
6525 unsigned char XGI_XG21CheckLVDSMode(unsigned short ModeNo,
6526 unsigned short ModeIdIndex, struct vb_device_info *pVBInfo)
6528 unsigned short xres, yres, colordepth, modeflag, resindex,
6531 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6532 if (ModeNo <= 0x13) {
6533 xres = pVBInfo->StResInfo[resindex].HTotal;
6534 yres = pVBInfo->StResInfo[resindex].VTotal;
6536 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
6538 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6539 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
6540 /* si+St_ModeFlag */
6541 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
6544 if (!(modeflag & Charx8Dot)) {
6549 if (ModeNo > 0x13) {
6550 if ((ModeNo > 0x13) && (modeflag & HalfDCLK))
6553 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6558 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
6559 if (xres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE))
6562 if (yres > (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE))
6565 if (ModeNo > 0x13) {
6566 if ((xres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6568 (yres != (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6570 colordepth = XGI_GetColorDepth(ModeNo,
6581 void XGI_SetXG21FPBits(struct vb_device_info *pVBInfo)
6585 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37); /* D[0] 1: 18bit */
6586 temp = (temp & 1) << 6;
6587 /* SR06[6] 18bit Dither */
6588 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0x40, temp);
6589 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: dual 12bits */
6590 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
6594 void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
6598 /* D[1:0] 01: 18bit, 00: dual 12, 10: single 24 */
6599 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
6600 temp = (temp & 3) << 6;
6601 /* SR06[7]0: dual 12/1: single 24 [6] 18bit Dither <= 0 h/w recommend */
6602 xgifb_reg_and_or(pVBInfo->P3c4, 0x06, ~0xc0, temp & 0x80);
6603 /* SR09[7] enable FP output, SR09[6] 1: sigle 18bits, 0: 24bits */
6604 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0xc0, temp | 0x80);
6608 static void XGI_SetXG21LVDSPara(unsigned short ModeNo,
6609 unsigned short ModeIdIndex,
6610 struct vb_device_info *pVBInfo)
6612 unsigned char temp, Miscdata;
6613 unsigned short xres, yres, modeflag, resindex, lvdstableindex;
6614 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
6615 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
6616 unsigned short value;
6618 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
6620 temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].
6622 (LCDPolarity << 8)) >> 8);
6623 temp &= LCDPolarity;
6624 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
6626 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
6628 temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6629 LVDS_Capability & LCDPolarity);
6630 /* SR35[7] FP VSync polarity */
6631 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
6632 /* SR30[5] FP HSync polarity */
6633 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
6635 XGI_SetXG21FPBits(pVBInfo);
6636 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6637 if (ModeNo <= 0x13) {
6638 xres = pVBInfo->StResInfo[resindex].HTotal;
6639 yres = pVBInfo->StResInfo[resindex].VTotal;
6641 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
6643 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6644 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
6645 /* si+St_ModeFlag */
6646 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
6649 if (!(modeflag & Charx8Dot))
6650 xres = xres * 8 / 9;
6652 LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;
6654 LVDSHBS = xres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE
6656 if ((ModeNo <= 0x13) && (modeflag & HalfDCLK))
6657 LVDSHBS -= xres / 4;
6659 if (LVDSHBS > LVDSHT)
6662 LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP;
6663 if (LVDSHRS > LVDSHT)
6666 LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC;
6667 if (LVDSHRE > LVDSHT)
6670 LVDSHBE = LVDSHBS + LVDSHT
6671 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE;
6673 LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;
6675 LVDSVBS = yres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE
6677 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6678 LVDSVBS += yres / 2;
6680 if (LVDSVBS > LVDSVT)
6683 LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP;
6684 if (LVDSVRS > LVDSVT)
6687 LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC;
6688 if (LVDSVRE > LVDSVT)
6691 LVDSVBE = LVDSVBS + LVDSVT
6692 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE;
6694 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
6695 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
6697 if (!(modeflag & Charx8Dot))
6698 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
6700 /* HT SR0B[1:0] CR00 */
6701 value = (LVDSHT >> 3) - 5;
6702 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
6703 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
6705 /* HBS SR0B[5:4] CR02 */
6706 value = (LVDSHBS >> 3) - 1;
6707 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
6708 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
6710 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
6711 value = (LVDSHBE >> 3) - 1;
6712 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
6713 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
6714 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
6716 /* HRS SR0B[7:6] CR04 */
6717 value = (LVDSHRS >> 3) + 2;
6718 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
6719 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
6721 /* Panel HRS SR2F[1:0] SR2E[7:0] */
6723 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
6724 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
6726 /* HRE SR0C[2] CR05[4:0] */
6727 value = (LVDSHRE >> 3) + 2;
6728 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
6729 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
6731 /* Panel HRE SR2F[7:2] */
6733 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
6735 /* VT SR0A[0] CR07[5][0] CR06 */
6737 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
6738 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
6739 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
6740 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
6742 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
6743 value = LVDSVBS - 1;
6744 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
6745 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
6746 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
6747 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
6749 /* VBE SR0A[4] CR16 */
6750 value = LVDSVBE - 1;
6751 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
6752 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
6754 /* VRS SR0A[3] CR7[7][2] CR10 */
6755 value = LVDSVRS - 1;
6756 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
6757 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
6758 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
6759 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
6761 /* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
6762 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03, (value & 0x600) >> 9);
6763 xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
6764 xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
6766 /* VRE SR0A[5] CR11[3:0] */
6767 value = LVDSVRE - 1;
6768 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
6769 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
6771 /* Panel VRE SR3F[7:2] *//* SR3F[7] has to be 0, h/w bug */
6772 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, (value << 2) & 0x7C);
6774 for (temp = 0, value = 0; temp < 3; temp++) {
6776 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
6777 xgifb_reg_set(pVBInfo->P3c4,
6779 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6781 xgifb_reg_set(pVBInfo->P3c4,
6783 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6788 if (!(modeflag & Charx8Dot)) {
6789 inb(pVBInfo->P3da); /* reset 3da */
6790 outb(0x13, pVBInfo->P3c0); /* set index */
6791 /* set data, panning = 0, shift left 1 dot*/
6792 outb(0x00, pVBInfo->P3c0);
6794 inb(pVBInfo->P3da); /* Enable Attribute */
6795 outb(0x20, pVBInfo->P3c0);
6797 inb(pVBInfo->P3da); /* reset 3da */
6802 /* no shadow case */
6803 static void XGI_SetXG27LVDSPara(unsigned short ModeNo,
6804 unsigned short ModeIdIndex,
6805 struct vb_device_info *pVBInfo)
6807 unsigned char temp, Miscdata;
6808 unsigned short xres, yres, modeflag, resindex, lvdstableindex;
6809 unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
6810 unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
6811 unsigned short value;
6813 lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
6814 temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].
6816 (LCDPolarity << 8)) >> 8);
6817 temp &= LCDPolarity;
6818 Miscdata = (unsigned char) inb(pVBInfo->P3cc);
6820 outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);
6822 temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].
6823 LVDS_Capability & LCDPolarity);
6824 /* SR35[7] FP VSync polarity */
6825 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
6826 /* SR30[5] FP HSync polarity */
6827 xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
6829 XGI_SetXG27FPBits(pVBInfo);
6830 resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
6831 if (ModeNo <= 0x13) {
6832 xres = pVBInfo->StResInfo[resindex].HTotal;
6833 yres = pVBInfo->StResInfo[resindex].VTotal;
6835 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
6837 xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
6838 yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
6839 /* si+St_ModeFlag */
6840 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
6843 if (!(modeflag & Charx8Dot))
6844 xres = xres * 8 / 9;
6846 LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;
6848 LVDSHBS = xres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE
6850 if ((ModeNo <= 0x13) && (modeflag & HalfDCLK))
6851 LVDSHBS -= xres / 4;
6853 if (LVDSHBS > LVDSHT)
6856 LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP;
6857 if (LVDSHRS > LVDSHT)
6860 LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC;
6861 if (LVDSHRE > LVDSHT)
6864 LVDSHBE = LVDSHBS + LVDSHT
6865 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE;
6867 LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;
6869 LVDSVBS = yres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE
6871 if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
6872 LVDSVBS += yres / 2;
6874 if (LVDSVBS > LVDSVT)
6877 LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP;
6878 if (LVDSVRS > LVDSVT)
6881 LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].
6883 if (LVDSVRE > LVDSVT)
6886 LVDSVBE = LVDSVBS + LVDSVT
6887 - pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE;
6889 temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
6890 xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */
6892 if (!(modeflag & Charx8Dot))
6893 xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);
6895 /* HT SR0B[1:0] CR00 */
6896 value = (LVDSHT >> 3) - 5;
6897 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
6898 xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));
6900 /* HBS SR0B[5:4] CR02 */
6901 value = (LVDSHBS >> 3) - 1;
6902 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
6903 xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));
6905 /* HBE SR0C[1:0] CR05[7] CR03[4:0] */
6906 value = (LVDSHBE >> 3) - 1;
6907 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
6908 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
6909 xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);
6911 /* HRS SR0B[7:6] CR04 */
6912 value = (LVDSHRS >> 3) + 2;
6913 xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
6914 xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));
6916 /* Panel HRS SR2F[1:0] SR2E[7:0] */
6918 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
6919 xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));
6921 /* HRE SR0C[2] CR05[4:0] */
6922 value = (LVDSHRE >> 3) + 2;
6923 xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
6924 xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);
6926 /* Panel HRE SR2F[7:2] */
6928 xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);
6930 /* VT SR0A[0] CR07[5][0] CR06 */
6932 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
6933 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
6934 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
6935 xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));
6937 /* VBS SR0A[2] CR09[5] CR07[3] CR15 */
6938 value = LVDSVBS - 1;
6939 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
6940 xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
6941 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
6942 xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));
6944 /* VBE SR0A[4] CR16 */
6945 value = LVDSVBE - 1;
6946 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
6947 xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));
6949 /* VRS SR0A[3] CR7[7][2] CR10 */
6950 value = LVDSVRS - 1;
6951 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
6952 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
6953 xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
6954 xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
6956 /* Panel VRS SR35[2:0] SR34[7:0] */
6957 xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, (value & 0x700) >> 8);
6958 xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
6960 /* VRE SR0A[5] CR11[3:0] */
6961 value = LVDSVRE - 1;
6962 xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
6963 xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
6965 /* Panel VRE SR3F[7:2] */
6966 xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, (value << 2) & 0xFC);
6968 for (temp = 0, value = 0; temp < 3; temp++) {
6970 xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
6971 xgifb_reg_set(pVBInfo->P3c4,
6973 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6975 xgifb_reg_set(pVBInfo->P3c4,
6977 pVBInfo->XG21_LVDSCapList[lvdstableindex].
6982 if (!(modeflag & Charx8Dot)) {
6983 inb(pVBInfo->P3da); /* reset 3da */
6984 outb(0x13, pVBInfo->P3c0); /* set index */
6985 /* set data, panning = 0, shift left 1 dot*/
6986 outb(0x00, pVBInfo->P3c0);
6988 inb(pVBInfo->P3da); /* Enable Attribute */
6989 outb(0x20, pVBInfo->P3c0);
6991 inb(pVBInfo->P3da); /* reset 3da */
6996 /* --------------------------------------------------------------------- */
6997 /* Function : XGI_IsLCDON */
6999 /* Output : 0 : Skip PSC Control */
7000 /* 1: Disable PSC */
7002 /* --------------------------------------------------------------------- */
7003 static unsigned char XGI_IsLCDON(struct vb_device_info *pVBInfo)
7005 unsigned short tempax;
7007 tempax = pVBInfo->VBInfo;
7008 if (tempax & SetCRT2ToDualEdge)
7010 else if (tempax & (DisableCRT2Display | SwitchToCRT2 | SetSimuScanMode))
7016 /* --------------------------------------------------------------------- */
7017 /* Function : XGI_DisableChISLCD */
7019 /* Output : 0 -> Not LCD Mode */
7021 /* --------------------------------------------------------------------- */
7022 static unsigned char XGI_DisableChISLCD(struct vb_device_info *pVBInfo)
7024 unsigned short tempbx, tempah;
7026 tempbx = pVBInfo->SetFlag & (DisableChA | DisableChB);
7027 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
7029 if (tempbx & (EnableChA | DisableChA)) {
7030 if (!(tempah & 0x08)) /* Chk LCDA Mode */
7034 if (!(tempbx & (EnableChB | DisableChB)))
7037 if (tempah & 0x01) /* Chk LCDB Mode */
7043 /* --------------------------------------------------------------------- */
7044 /* Function : XGI_EnableChISLCD */
7046 /* Output : 0 -> Not LCD mode */
7048 /* --------------------------------------------------------------------- */
7049 static unsigned char XGI_EnableChISLCD(struct vb_device_info *pVBInfo)
7051 unsigned short tempbx, tempah;
7053 tempbx = pVBInfo->SetFlag & (EnableChA | EnableChB);
7054 tempah = ~((unsigned short) xgifb_reg_get(pVBInfo->Part1Port, 0x2E));
7056 if (tempbx & (EnableChA | DisableChA)) {
7057 if (!(tempah & 0x08)) /* Chk LCDA Mode */
7061 if (!(tempbx & (EnableChB | DisableChB)))
7064 if (tempah & 0x01) /* Chk LCDB Mode */
7070 void XGI_DisableBridge(struct xgi_hw_device_info *HwDeviceExtension,
7071 struct vb_device_info *pVBInfo)
7073 unsigned short tempah = 0;
7075 if (pVBInfo->SetFlag == Win9xDOSMode)
7078 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7079 | VB_XGI302LV | VB_XGI301C)) {
7081 if (!(pVBInfo->VBInfo &
7082 (DisableCRT2Display | SetSimuScanMode))) {
7083 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7084 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
7085 tempah = 0x7F; /* Disable Channel A */
7086 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA))
7087 /* Disable Channel B */
7090 if (pVBInfo->SetFlag & DisableChB)
7091 /* force to disable Cahnnel */
7094 if (pVBInfo->SetFlag & DisableChA)
7095 /* Force to disable Channel B */
7101 /* disable part4_1f */
7102 xgifb_reg_and(pVBInfo->Part4Port, 0x1F, tempah);
7104 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
7105 if (((pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)))
7106 || (XGI_DisableChISLCD(pVBInfo))
7107 || (XGI_IsLCDON(pVBInfo)))
7108 /* LVDS Driver power down */
7109 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x80);
7112 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
7113 & (DisableCRT2Display | SetCRT2ToLCDA
7114 | SetSimuScanMode))) {
7115 if (pVBInfo->SetFlag & GatingCRT)
7116 XGI_EnableGatingCRT(HwDeviceExtension, pVBInfo);
7117 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
7120 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7121 if ((pVBInfo->SetFlag & DisableChA) || (pVBInfo->VBInfo
7124 xgifb_reg_and(pVBInfo->Part1Port, 0x1e, 0xdf);
7127 /* disable TV as primary VGA swap */
7128 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xdf);
7130 if ((pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToDualEdge)))
7131 xgifb_reg_and(pVBInfo->Part2Port, 0x00, 0xdf);
7133 if ((pVBInfo->SetFlag & DisableChB) ||
7135 (DisableCRT2Display | SetSimuScanMode)) ||
7136 ((!(pVBInfo->VBInfo & SetCRT2ToLCDA)) &&
7138 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))))
7140 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
7142 if ((pVBInfo->SetFlag & DisableChB) ||
7144 (DisableCRT2Display | SetSimuScanMode)) ||
7145 (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) ||
7147 (SetCRT2ToRAMDAC | SetCRT2ToLCD | SetCRT2ToTV))) {
7148 /* save Part1 index 0 */
7149 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
7150 /* BTDAC = 1, avoid VB reset */
7151 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x10);
7153 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
7154 /* restore Part1 index 0 */
7155 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
7157 } else { /* {301} */
7158 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToTV)) {
7160 xgifb_reg_or(pVBInfo->Part1Port, 0x00, 0x80);
7162 xgifb_reg_and(pVBInfo->Part1Port, 0x1E, 0xDF);
7163 /* Disable TV asPrimary VGA swap */
7164 xgifb_reg_and(pVBInfo->P3c4, 0x32, 0xDF);
7167 if (pVBInfo->VBInfo & (DisableCRT2Display | SetCRT2ToLCDA
7169 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
7173 /* --------------------------------------------------------------------- */
7174 /* Function : XGI_GetTVPtrIndex */
7177 /* Description : bx 0 : ExtNTSC */
7189 /* --------------------------------------------------------------------- */
7190 static unsigned short XGI_GetTVPtrIndex(struct vb_device_info *pVBInfo)
7192 unsigned short tempbx = 0;
7194 if (pVBInfo->TVInfo & SetPALTV)
7196 if (pVBInfo->TVInfo & SetYPbPrMode1080i)
7198 if (pVBInfo->TVInfo & SetYPbPrMode525i)
7200 if (pVBInfo->TVInfo & SetYPbPrMode525p)
7202 if (pVBInfo->TVInfo & SetYPbPrMode750p)
7204 if (pVBInfo->TVInfo & TVSimuMode)
7210 /* --------------------------------------------------------------------- */
7211 /* Function : XGI_GetTVPtrIndex2 */
7213 /* Output : bx 0 : NTSC */
7217 /* 4 : NTSC1024x768 */
7218 /* 5 : PAL-M 1024x768 */
7220 /* cl 0 : YFilter1 */
7223 /* 1 : 301B/302B/301LV/302LV */
7225 /* --------------------------------------------------------------------- */
7226 static void XGI_GetTVPtrIndex2(unsigned short *tempbx, unsigned char *tempcl,
7227 unsigned char *tempch, struct vb_device_info *pVBInfo)
7233 if (pVBInfo->TVInfo & SetPALTV)
7236 if (pVBInfo->TVInfo & SetPALMTV)
7239 if (pVBInfo->TVInfo & SetPALNTV)
7242 if (pVBInfo->TVInfo & NTSC1024x768) {
7244 if (pVBInfo->TVInfo & SetPALMTV)
7248 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7249 | VB_XGI302LV | VB_XGI301C)) {
7250 if ((!(pVBInfo->VBInfo & SetInSlaveMode)) || (pVBInfo->TVInfo
7257 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7258 | VB_XGI302LV | VB_XGI301C))
7262 static void XGI_SetDelayComp(struct vb_device_info *pVBInfo)
7264 unsigned short index;
7266 unsigned char tempah, tempbl, tempbh;
7268 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7269 | VB_XGI302LV | VB_XGI301C)) {
7270 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA
7271 | SetCRT2ToTV | SetCRT2ToRAMDAC)) {
7275 index = XGI_GetTVPtrIndex(pVBInfo); /* Get TV Delay */
7276 tempbl = pVBInfo->XGI_TVDelayList[index];
7278 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
7279 | VB_XGI301LV | VB_XGI302LV
7281 tempbl = pVBInfo->XGI_TVDelayList2[index];
7283 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7284 tempbl = tempbl >> 4;
7286 if (pVBInfo->VBInfo & SetCRT2ToRAMDAC)
7287 tempbl = CRT2Delay1; // Get CRT2 Delay
7288 if (pVBInfo->VBType &
7294 tempbl = CRT2Delay2;
7296 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
7298 index = XGI_GetLCDCapPtr(pVBInfo);
7299 tempbh = pVBInfo->LCDCapList[index].
7300 LCD_DelayCompensation;
7302 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA))
7308 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x2D);
7310 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToLCD
7311 | SetCRT2ToTV)) { /* Channel B */
7316 if (pVBInfo->VBInfo & SetCRT2ToLCDA) { /* Channel A */
7320 xgifb_reg_set(pVBInfo->Part1Port, 0x2D, tempah);
7322 } else if (pVBInfo->IF_DEF_LVDS == 1) {
7325 if (pVBInfo->VBInfo & SetCRT2ToLCD) {
7326 /* / Get LCD Delay */
7327 tempah = pVBInfo->LCDCapList[
7328 XGI_GetLCDCapPtr(pVBInfo)].
7329 LCD_DelayCompensation;
7331 tempah = tempah << 4;
7332 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2D, 0x0f,
7338 static void XGI_SetLCDCap_A(unsigned short tempcx,
7339 struct vb_device_info *pVBInfo)
7341 unsigned short temp;
7343 temp = xgifb_reg_get(pVBInfo->P3d4, 0x37);
7345 if (temp & LCDRGB18Bit) {
7346 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
7348 (unsigned short) (0x20 | (tempcx & 0x00C0)));
7349 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
7351 xgifb_reg_and_or(pVBInfo->Part1Port, 0x19, 0x0F,
7352 (unsigned short) (0x30 | (tempcx & 0x00C0)));
7353 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
7357 if (tempcx & EnableLCD24bpp) { // 24bits
7358 xgifb_reg_and_or(pVBInfo->Part1Port,
7361 (unsigned short)(0x30 | (tempcx&0x00C0)));
7362 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x00);
7364 xgifb_reg_and_or(pVBInfo->Part1Port,
7368 (unsigned short)(0x20 | (tempcx&0x00C0)));
7369 xgifb_reg_and_or(pVBInfo->Part1Port, 0x1A, 0x7F, 0x80);
7374 /* --------------------------------------------------------------------- */
7375 /* Function : XGI_SetLCDCap_B */
7376 /* Input : cx -> LCD Capability */
7379 /* --------------------------------------------------------------------- */
7380 static void XGI_SetLCDCap_B(unsigned short tempcx,
7381 struct vb_device_info *pVBInfo)
7383 if (tempcx & EnableLCD24bpp) /* 24bits */
7384 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
7385 (unsigned short) (((tempcx & 0x00ff) >> 6)
7388 xgifb_reg_and_or(pVBInfo->Part2Port, 0x1A, 0xE0,
7389 (unsigned short) (((tempcx & 0x00ff) >> 6)
7390 | 0x18)); /* Enable Dither */
7393 static void SetSpectrum(struct vb_device_info *pVBInfo)
7395 unsigned short index;
7397 index = XGI_GetLCDCapPtr(pVBInfo);
7399 /* disable down spectrum D[4] */
7400 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x8F);
7401 XGI_LongWait(pVBInfo);
7402 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x20); /* reset spectrum */
7403 XGI_LongWait(pVBInfo);
7405 xgifb_reg_set(pVBInfo->Part4Port, 0x31,
7406 pVBInfo->LCDCapList[index].Spectrum_31);
7407 xgifb_reg_set(pVBInfo->Part4Port, 0x32,
7408 pVBInfo->LCDCapList[index].Spectrum_32);
7409 xgifb_reg_set(pVBInfo->Part4Port, 0x33,
7410 pVBInfo->LCDCapList[index].Spectrum_33);
7411 xgifb_reg_set(pVBInfo->Part4Port, 0x34,
7412 pVBInfo->LCDCapList[index].Spectrum_34);
7413 XGI_LongWait(pVBInfo);
7414 xgifb_reg_or(pVBInfo->Part4Port, 0x30, 0x40); /* enable spectrum */
7417 static void XGI_SetLCDCap(struct vb_device_info *pVBInfo)
7419 unsigned short tempcx;
7421 tempcx = pVBInfo->LCDCapList[XGI_GetLCDCapPtr(pVBInfo)].LCD_Capability;
7423 if (pVBInfo->VBType &
7428 VB_XGI301C)) { /* 301LV/302LV only */
7429 if (pVBInfo->VBType &
7430 (VB_XGI301LV | VB_XGI302LV | VB_XGI301C)) {
7431 /* Set 301LV Capability */
7432 xgifb_reg_set(pVBInfo->Part4Port, 0x24,
7433 (unsigned char) (tempcx & 0x1F));
7436 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D,
7437 ~((EnableVBCLKDRVLOW | EnablePLLSPLOW) >> 8),
7438 (unsigned short) ((tempcx & (EnableVBCLKDRVLOW
7439 | EnablePLLSPLOW)) >> 8));
7442 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7443 | VB_XGI302LV | VB_XGI301C)) {
7444 if (pVBInfo->VBInfo & SetCRT2ToLCD)
7445 XGI_SetLCDCap_B(tempcx, pVBInfo);
7446 else if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7447 XGI_SetLCDCap_A(tempcx, pVBInfo);
7449 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
7450 if (tempcx & EnableSpectrum)
7451 SetSpectrum(pVBInfo);
7455 XGI_SetLCDCap_A(tempcx, pVBInfo);
7459 /* --------------------------------------------------------------------- */
7460 /* Function : XGI_SetAntiFlicker */
7463 /* Description : Set TV Customized Param. */
7464 /* --------------------------------------------------------------------- */
7465 static void XGI_SetAntiFlicker(unsigned short ModeNo,
7466 unsigned short ModeIdIndex,
7467 struct vb_device_info *pVBInfo)
7469 unsigned short tempbx, index;
7471 unsigned char tempah;
7473 if (pVBInfo->TVInfo & (SetYPbPrMode525p | SetYPbPrMode750p))
7476 tempbx = XGI_GetTVPtrIndex(pVBInfo);
7480 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVFlickerIndex;
7482 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVFlickerIndex;
7485 tempah = TVAntiFlickList[tempbx];
7486 tempah = tempah << 4;
7488 xgifb_reg_and_or(pVBInfo->Part2Port, 0x0A, 0x8F, tempah);
7491 static void XGI_SetEdgeEnhance(unsigned short ModeNo,
7492 unsigned short ModeIdIndex,
7493 struct vb_device_info *pVBInfo)
7495 unsigned short tempbx, index;
7497 unsigned char tempah;
7499 tempbx = XGI_GetTVPtrIndex(pVBInfo);
7503 index = pVBInfo->SModeIDTable[ModeIdIndex].VB_StTVEdgeIndex;
7505 index = pVBInfo->EModeIDTable[ModeIdIndex].VB_ExtTVEdgeIndex;
7508 tempah = TVEdgeList[tempbx];
7509 tempah = tempah << 5;
7511 xgifb_reg_and_or(pVBInfo->Part2Port, 0x3A, 0x1F, tempah);
7514 static void XGI_SetPhaseIncr(struct vb_device_info *pVBInfo)
7516 unsigned short tempbx;
7518 unsigned char tempcl, tempch;
7520 unsigned long tempData;
7522 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
7523 tempData = TVPhaseList[tempbx];
7525 xgifb_reg_set(pVBInfo->Part2Port, 0x31, (unsigned short) (tempData
7527 xgifb_reg_set(pVBInfo->Part2Port, 0x32, (unsigned short) ((tempData
7528 & 0x0000FF00) >> 8));
7529 xgifb_reg_set(pVBInfo->Part2Port, 0x33, (unsigned short) ((tempData
7530 & 0x00FF0000) >> 16));
7531 xgifb_reg_set(pVBInfo->Part2Port, 0x34, (unsigned short) ((tempData
7532 & 0xFF000000) >> 24));
7535 static void XGI_SetYFilter(unsigned short ModeNo, unsigned short ModeIdIndex,
7536 struct vb_device_info *pVBInfo)
7538 unsigned short tempbx, index;
7540 unsigned char tempcl, tempch, tempal, *filterPtr;
7542 XGI_GetTVPtrIndex2(&tempbx, &tempcl, &tempch, pVBInfo); /* bx, cl, ch */
7547 filterPtr = NTSCYFilter1;
7551 filterPtr = PALYFilter1;
7557 filterPtr = PALMYFilter1;
7561 filterPtr = PALNYFilter1;
7566 filterPtr = NTSCYFilter2;
7570 filterPtr = PALMYFilter2;
7574 filterPtr = PALNYFilter2;
7578 filterPtr = PALYFilter2;
7586 tempal = pVBInfo->SModeIDTable[ModeIdIndex].
7587 VB_StTVYFilterIndex;
7589 tempal = pVBInfo->EModeIDTable[ModeIdIndex].
7590 VB_ExtTVYFilterIndex;
7597 if ((tempcl == 0) && (tempch == 1)) {
7598 xgifb_reg_set(pVBInfo->Part2Port, 0x35, 0);
7599 xgifb_reg_set(pVBInfo->Part2Port, 0x36, 0);
7600 xgifb_reg_set(pVBInfo->Part2Port, 0x37, 0);
7601 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
7603 xgifb_reg_set(pVBInfo->Part2Port, 0x35, filterPtr[index++]);
7604 xgifb_reg_set(pVBInfo->Part2Port, 0x36, filterPtr[index++]);
7605 xgifb_reg_set(pVBInfo->Part2Port, 0x37, filterPtr[index++]);
7606 xgifb_reg_set(pVBInfo->Part2Port, 0x38, filterPtr[index++]);
7609 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7610 | VB_XGI302LV | VB_XGI301C)) {
7611 xgifb_reg_set(pVBInfo->Part2Port, 0x48, filterPtr[index++]);
7612 xgifb_reg_set(pVBInfo->Part2Port, 0x49, filterPtr[index++]);
7613 xgifb_reg_set(pVBInfo->Part2Port, 0x4A, filterPtr[index++]);
7617 /* --------------------------------------------------------------------- */
7618 /* Function : XGI_OEM310Setting */
7621 /* Description : Customized Param. for 301 */
7622 /* --------------------------------------------------------------------- */
7623 static void XGI_OEM310Setting(unsigned short ModeNo,
7624 unsigned short ModeIdIndex,
7625 struct vb_device_info *pVBInfo)
7627 if (pVBInfo->SetFlag & Win9xDOSMode)
7631 XGI_SetDelayComp(pVBInfo);
7633 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA))
7634 XGI_SetLCDCap(pVBInfo);
7636 if (pVBInfo->VBInfo & SetCRT2ToTV) {
7638 XGI_SetPhaseIncr(pVBInfo);
7639 XGI_SetYFilter(ModeNo, ModeIdIndex, pVBInfo);
7640 XGI_SetAntiFlicker(ModeNo, ModeIdIndex, pVBInfo);
7642 if (pVBInfo->VBType & VB_XGI301)
7643 XGI_SetEdgeEnhance(ModeNo, ModeIdIndex, pVBInfo);
7647 /* --------------------------------------------------------------------- */
7648 /* Function : XGI_SetCRT2ModeRegs */
7651 /* Description : Origin code for crt2group */
7652 /* --------------------------------------------------------------------- */
7653 void XGI_SetCRT2ModeRegs(unsigned short ModeNo,
7654 struct xgi_hw_device_info *HwDeviceExtension,
7655 struct vb_device_info *pVBInfo)
7657 unsigned short tempbl;
7660 unsigned char tempah;
7662 /* // fix write part1 index 0 BTDRAM bit Bug
7663 * xgifb_reg_set(pVBInfo->Part1Port, 0x03, 0x00); */
7665 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7666 tempah = xgifb_reg_get(pVBInfo->Part1Port, 0x00);
7667 tempah &= ~0x10; /* BTRAMDAC */
7668 tempah |= 0x40; /* BTRAM */
7670 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
7672 tempah = 0x40; /* BTDRAM */
7673 if (ModeNo > 0x13) {
7674 tempcl = pVBInfo->ModeType;
7678 tempah = (0x008 >> tempcl);
7684 if (pVBInfo->VBInfo & SetInSlaveMode)
7685 tempah ^= 0x50; /* BTDAC */
7690 if (pVBInfo->VBInfo & DisableCRT2Display) {
7694 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
7695 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD)) {
7696 tempcl = pVBInfo->ModeType;
7697 if (ModeNo > 0x13) {
7699 if ((tempcl > 0) || (tempcl == 0)) {
7700 tempah=(0x008>>tempcl) ;
7709 if (pVBInfo->VBInfo & SetInSlaveMode) {
7710 tempah = (tempah ^ 0x050);
7715 xgifb_reg_set(pVBInfo->Part1Port, 0x00, tempah);
7719 if (pVBInfo->VBInfo & DisableCRT2Display) {
7720 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl, tempah);
7725 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV
7726 | SetCRT2ToLCD | SetCRT2ToLCDA)) {
7727 if ((pVBInfo->VBInfo & SetCRT2ToLCDA) &&
7728 (!(pVBInfo->VBInfo & SetSimuScanMode))) {
7731 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e,
7734 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
7739 if (pVBInfo->VBInfo &
7746 if (!(pVBInfo->VBInfo & SetInSlaveMode))
7749 if (!(pVBInfo->VBInfo &
7751 tempah = tempah ^ 0x05;
7752 if (!(pVBInfo->VBInfo &
7754 tempah = tempah ^ 0x01;
7757 if (!(pVBInfo->VBInfo &
7760 xgifb_reg_and_or(pVBInfo->Part1Port,
7761 0x2e, tempbl, tempah);
7763 xgifb_reg_and_or(pVBInfo->Part1Port,
7764 0x2e, tempbl, tempah);
7768 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2e, tempbl,
7773 if (pVBInfo->VBInfo & (SetCRT2ToRAMDAC | SetCRT2ToTV | SetCRT2ToLCD
7776 if ((pVBInfo->ModeType == ModeVGA) && (!(pVBInfo->VBInfo
7777 & SetInSlaveMode))) {
7782 if (pVBInfo->VBInfo & SetCRT2ToTV) {
7783 /* if (!(pVBInfo->TVInfo &
7784 (SetYPbPrMode525p | SetYPbPrMode750p))) { */
7786 if (ModeNo > 0x13) {
7787 if (pVBInfo->VBInfo & DriverMode)
7788 tempah = tempah ^ 0x20;
7793 xgifb_reg_and_or(pVBInfo->Part4Port, 0x0D, ~0x0BF, tempah);
7796 if (pVBInfo->LCDInfo & SetLCDDualLink)
7799 if (pVBInfo->VBInfo & SetCRT2ToTV) {
7800 /* if ((!(pVBInfo->VBInfo & SetCRT2ToHiVisionTV)) &&
7801 (!(pVBInfo->TVInfo &
7802 (SetYPbPrMode525p | SetYPbPrMode750p)))) { */
7803 if (pVBInfo->TVInfo & RPLLDIV2XO)
7808 if ((pVBInfo->LCDResInfo == Panel1280x1024)
7809 || (pVBInfo->LCDResInfo == Panel1280x1024x75))
7812 if (pVBInfo->LCDResInfo == Panel1280x960)
7815 xgifb_reg_set(pVBInfo->Part4Port, 0x0C, tempah);
7818 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
7819 | VB_XGI302LV | VB_XGI301C)) {
7823 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
7825 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7826 tempah |= 0x04; /* shampoo 0129 */
7829 xgifb_reg_and_or(pVBInfo->Part1Port, 0x13, tempbl, tempah);
7832 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7833 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7837 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2c, tempbl, tempah);
7841 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
7842 if (pVBInfo->VBInfo & SetCRT2ToDualEdge)
7845 xgifb_reg_and_or(pVBInfo->Part4Port, 0x21, tempbl, tempah);
7850 if (!(pVBInfo->VBInfo & SetCRT2ToLCDA)) {
7852 if (!(pVBInfo->VBInfo & SetCRT2ToDualEdge))
7856 xgifb_reg_and_or(pVBInfo->Part4Port, 0x23, tempbl, tempah);
7858 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
7859 if (pVBInfo->LCDInfo & SetLCDDualLink) {
7860 xgifb_reg_or(pVBInfo->Part4Port, 0x27, 0x20);
7861 xgifb_reg_or(pVBInfo->Part4Port, 0x34, 0x10);
7866 static void XGI_CloseCRTC(struct xgi_hw_device_info *HwDeviceExtension,
7867 struct vb_device_info *pVBInfo)
7869 unsigned short tempbx;
7873 if (pVBInfo->VBInfo & SetCRT2ToLCDA)
7878 void XGI_UnLockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
7879 struct vb_device_info *pVBInfo)
7882 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2f, 0xFF, 0x01);
7886 void XGI_LockCRT2(struct xgi_hw_device_info *HwDeviceExtension,
7887 struct vb_device_info *pVBInfo)
7890 xgifb_reg_and_or(pVBInfo->Part1Port, 0x2F, 0xFE, 0x00);
7894 unsigned char XGI_BridgeIsOn(struct vb_device_info *pVBInfo)
7896 unsigned short flag;
7898 if (pVBInfo->IF_DEF_LVDS == 1) {
7901 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x00);
7902 if ((flag == 1) || (flag == 2))
7903 return 1; /* 301b */
7909 void XGI_LongWait(struct vb_device_info *pVBInfo)
7913 i = xgifb_reg_get(pVBInfo->P3c4, 0x1F);
7916 for (i = 0; i < 0xFFFF; i++) {
7917 if (!(inb(pVBInfo->P3da) & 0x08))
7921 for (i = 0; i < 0xFFFF; i++) {
7922 if ((inb(pVBInfo->P3da) & 0x08))
7928 static void XGI_VBLongWait(struct vb_device_info *pVBInfo)
7930 unsigned short tempal, temp, i, j;
7932 if (!(pVBInfo->VBInfo & SetCRT2ToTV)) {
7934 for (i = 0; i < 3; i++) {
7935 for (j = 0; j < 100; j++) {
7936 tempal = inb(pVBInfo->P3da);
7937 if (temp & 0x01) { /* VBWaitMode2 */
7938 if ((tempal & 0x08))
7941 if (!(tempal & 0x08))
7944 } else { /* VBWaitMode1 */
7945 if (!(tempal & 0x08))
7948 if ((tempal & 0x08))
7955 XGI_LongWait(pVBInfo);
7960 unsigned short XGI_GetRatePtrCRT2(struct xgi_hw_device_info *pXGIHWDE,
7961 unsigned short ModeNo, unsigned short ModeIdIndex,
7962 struct vb_device_info *pVBInfo)
7964 short LCDRefreshIndex[] = { 0x00, 0x00, 0x03, 0x01 },
7965 LCDARefreshIndex[] = { 0x00, 0x00, 0x03, 0x01, 0x01,
7968 unsigned short RefreshRateTableIndex, i, modeflag, index, temp;
7971 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
7973 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
7978 index = xgifb_reg_get(pVBInfo->P3d4, 0x33);
7979 index = index >> pVBInfo->SelectCRT2Rate;
7982 if (pVBInfo->LCDInfo & LCDNonExpanding)
7988 if (pVBInfo->SetFlag & ProgrammingCRT2) {
7989 if (pVBInfo->VBInfo & (SetCRT2ToLCD | SetCRT2ToLCDA)) {
7990 if (pVBInfo->IF_DEF_LVDS == 0) {
7991 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B
7992 | VB_XGI301LV | VB_XGI302LV
7995 temp = LCDARefreshIndex[
7996 pVBInfo->LCDResInfo & 0x0F];
7998 temp = LCDRefreshIndex[
7999 pVBInfo->LCDResInfo & 0x0F];
8009 RefreshRateTableIndex = pVBInfo->EModeIDTable[ModeIdIndex].REFindex;
8010 ModeNo = pVBInfo->RefIndex[RefreshRateTableIndex].ModeID;
8011 if (pXGIHWDE->jChipType >= XG20) { /* for XG20, XG21, XG27 */
8013 if (pVBInfo->RefIndex[RefreshRateTableIndex].Ext_InfoFlag &
8018 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 800) &&
8019 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 600)) {
8023 * do the similar adjustment like XGISearchCRT1Rate() */
8024 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1024) &&
8025 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 768)) {
8028 if ((pVBInfo->RefIndex[RefreshRateTableIndex].XRes == 1280) &&
8029 (pVBInfo->RefIndex[RefreshRateTableIndex].YRes == 1024)) {
8036 if (pVBInfo->RefIndex[RefreshRateTableIndex + i].
8039 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i].
8041 temp &= ModeInfoFlag;
8042 if (temp < pVBInfo->ModeType)
8047 } while (index != 0xFFFF);
8048 if (!(pVBInfo->VBInfo & SetCRT2ToRAMDAC)) {
8049 if (pVBInfo->VBInfo & SetInSlaveMode) {
8050 temp = pVBInfo->RefIndex[RefreshRateTableIndex + i - 1].
8052 if (temp & InterlaceMode)
8057 if ((pVBInfo->SetFlag & ProgrammingCRT2)) {
8058 temp = XGI_AjustCRT2Rate(ModeNo, ModeIdIndex,
8059 RefreshRateTableIndex, &i, pVBInfo);
8061 return RefreshRateTableIndex + i; /* return (0x01 | (temp1<<1)); */
8064 static void XGI_SetLCDAGroup(unsigned short ModeNo, unsigned short ModeIdIndex,
8065 struct xgi_hw_device_info *HwDeviceExtension,
8066 struct vb_device_info *pVBInfo)
8068 unsigned short RefreshRateTableIndex;
8069 /* unsigned short temp ; */
8071 /* pVBInfo->SelectCRT2Rate = 0; */
8073 pVBInfo->SetFlag |= ProgrammingCRT2;
8074 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
8075 ModeIdIndex, pVBInfo);
8076 XGI_GetLVDSResInfo(ModeNo, ModeIdIndex, pVBInfo);
8077 XGI_GetLVDSData(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
8078 XGI_ModCRT1Regs(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8079 HwDeviceExtension, pVBInfo);
8080 XGI_SetLVDSRegs(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
8081 XGI_SetCRT2ECLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
8084 unsigned char XGI_SetCRT2Group301(unsigned short ModeNo,
8085 struct xgi_hw_device_info *HwDeviceExtension,
8086 struct vb_device_info *pVBInfo)
8088 unsigned short tempbx, ModeIdIndex, RefreshRateTableIndex;
8090 tempbx = pVBInfo->VBInfo;
8091 pVBInfo->SetFlag |= ProgrammingCRT2;
8092 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
8093 pVBInfo->SelectCRT2Rate = 4;
8094 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
8095 ModeIdIndex, pVBInfo);
8096 XGI_SaveCRT2Info(ModeNo, pVBInfo);
8097 XGI_GetCRT2ResInfo(ModeNo, ModeIdIndex, pVBInfo);
8098 XGI_GetCRT2Data(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
8099 XGI_PreSetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
8100 RefreshRateTableIndex, pVBInfo);
8101 XGI_SetGroup1(ModeNo, ModeIdIndex, HwDeviceExtension,
8102 RefreshRateTableIndex, pVBInfo);
8103 XGI_SetLockRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
8104 RefreshRateTableIndex, pVBInfo);
8105 XGI_SetGroup2(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8106 HwDeviceExtension, pVBInfo);
8107 XGI_SetLCDRegs(ModeNo, ModeIdIndex, HwDeviceExtension,
8108 RefreshRateTableIndex, pVBInfo);
8109 XGI_SetTap4Regs(pVBInfo);
8110 XGI_SetGroup3(ModeNo, ModeIdIndex, pVBInfo);
8111 XGI_SetGroup4(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8112 HwDeviceExtension, pVBInfo);
8113 XGI_SetCRT2VCLK(ModeNo, ModeIdIndex, RefreshRateTableIndex, pVBInfo);
8114 XGI_SetGroup5(ModeNo, ModeIdIndex, pVBInfo);
8115 XGI_AutoThreshold(pVBInfo);
8119 void XGI_SenseCRT1(struct vb_device_info *pVBInfo)
8121 unsigned char CRTCData[17] = { 0x5F, 0x4F, 0x50, 0x82, 0x55, 0x81,
8122 0x0B, 0x3E, 0xE9, 0x0B, 0xDF, 0xE7, 0x04, 0x00, 0x00,
8125 unsigned char SR01 = 0, SR1F = 0, SR07 = 0, SR06 = 0;
8127 unsigned char CR17, CR63, SR31;
8128 unsigned short temp;
8129 unsigned char DAC_TEST_PARMS[3] = { 0x0F, 0x0F, 0x0F };
8132 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
8134 /* [2004/05/06] Vicent to fix XG42 single LCD sense to CRT+LCD */
8135 xgifb_reg_set(pVBInfo->P3d4, 0x57, 0x4A);
8136 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
8137 pVBInfo->P3d4, 0x53) | 0x02));
8139 SR31 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x31);
8140 CR63 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x63);
8141 SR01 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x01);
8143 xgifb_reg_set(pVBInfo->P3c4, 0x01, (unsigned char) (SR01 & 0xDF));
8144 xgifb_reg_set(pVBInfo->P3d4, 0x63, (unsigned char) (CR63 & 0xBF));
8146 CR17 = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x17);
8147 xgifb_reg_set(pVBInfo->P3d4, 0x17, (unsigned char) (CR17 | 0x80));
8149 SR1F = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x1F);
8150 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) (SR1F | 0x04));
8152 SR07 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x07);
8153 xgifb_reg_set(pVBInfo->P3c4, 0x07, (unsigned char) (SR07 & 0xFB));
8154 SR06 = (unsigned char) xgifb_reg_get(pVBInfo->P3c4, 0x06);
8155 xgifb_reg_set(pVBInfo->P3c4, 0x06, (unsigned char) (SR06 & 0xC3));
8157 xgifb_reg_set(pVBInfo->P3d4, 0x11, 0x00);
8159 for (i = 0; i < 8; i++)
8160 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) i, CRTCData[i]);
8162 for (i = 8; i < 11; i++)
8163 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 8),
8166 for (i = 11; i < 13; i++)
8167 xgifb_reg_set(pVBInfo->P3d4, (unsigned short) (i + 4),
8170 for (i = 13; i < 16; i++)
8171 xgifb_reg_set(pVBInfo->P3c4, (unsigned short) (i - 3),
8174 xgifb_reg_set(pVBInfo->P3c4, 0x0E, (unsigned char) (CRTCData[16]
8177 xgifb_reg_set(pVBInfo->P3c4, 0x31, 0x00);
8178 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
8179 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE1);
8181 outb(0x00, pVBInfo->P3c8);
8183 for (i = 0; i < 256; i++) {
8184 outb((unsigned char) DAC_TEST_PARMS[0], (pVBInfo->P3c8 + 1));
8185 outb((unsigned char) DAC_TEST_PARMS[1], (pVBInfo->P3c8 + 1));
8186 outb((unsigned char) DAC_TEST_PARMS[2], (pVBInfo->P3c8 + 1));
8189 XGI_VBLongWait(pVBInfo);
8190 XGI_VBLongWait(pVBInfo);
8191 XGI_VBLongWait(pVBInfo);
8195 XGI_WaitDisply(pVBInfo);
8196 temp = inb(pVBInfo->P3c2);
8199 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x20);
8201 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xDF, 0x00);
8203 /* alan, avoid display something, set BLACK DAC if not restore DAC */
8204 outb(0x00, pVBInfo->P3c8);
8206 for (i = 0; i < 256; i++) {
8207 outb(0, (pVBInfo->P3c8 + 1));
8208 outb(0, (pVBInfo->P3c8 + 1));
8209 outb(0, (pVBInfo->P3c8 + 1));
8212 xgifb_reg_set(pVBInfo->P3c4, 0x01, SR01);
8213 xgifb_reg_set(pVBInfo->P3d4, 0x63, CR63);
8214 xgifb_reg_set(pVBInfo->P3c4, 0x31, SR31);
8216 /* [2004/05/11] Vicent */
8217 xgifb_reg_set(pVBInfo->P3d4, 0x53, (unsigned char) (xgifb_reg_get(
8218 pVBInfo->P3d4, 0x53) & 0xFD));
8219 xgifb_reg_set(pVBInfo->P3c4, 0x1F, (unsigned char) SR1F);
8222 void XGI_EnableBridge(struct xgi_hw_device_info *HwDeviceExtension,
8223 struct vb_device_info *pVBInfo)
8225 unsigned short tempah;
8227 if (pVBInfo->SetFlag == Win9xDOSMode) {
8228 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
8229 | VB_XGI302LV | VB_XGI301C)) {
8230 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8233 /* LVDS or CH7017 */
8237 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
8238 | VB_XGI302LV | VB_XGI301C)) {
8239 if (!(pVBInfo->SetFlag & DisableChA)) {
8240 if (pVBInfo->SetFlag & EnableChA) {
8242 xgifb_reg_set(pVBInfo->Part1Port, 0x1E, 0x20);
8244 /* SetCRT2ToLCDA ) */
8245 if (pVBInfo->VBInfo & SetCRT2ToDualEdge) {
8247 xgifb_reg_set(pVBInfo->Part1Port,
8253 if (!(pVBInfo->SetFlag & DisableChB)) {
8254 if ((pVBInfo->SetFlag & EnableChB) || (pVBInfo->VBInfo
8255 & (SetCRT2ToLCD | SetCRT2ToTV
8256 | SetCRT2ToRAMDAC))) {
8257 tempah = (unsigned char) xgifb_reg_get(
8258 pVBInfo->P3c4, 0x32);
8260 if (pVBInfo->VBInfo & SetInSlaveMode) {
8261 if (!(pVBInfo->VBInfo &
8265 xgifb_reg_set(pVBInfo->P3c4, 0x32, tempah);
8266 xgifb_reg_or(pVBInfo->P3c4, 0x1E, 0x20);
8268 tempah = (unsigned char) xgifb_reg_get(
8269 pVBInfo->Part1Port, 0x2E);
8271 if (!(tempah & 0x80))
8272 /* BVBDOENABLE = 1 */
8273 xgifb_reg_or(pVBInfo->Part1Port,
8275 /* BScreenOFF = 0 */
8276 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
8280 if ((pVBInfo->SetFlag & (EnableChA | EnableChB))
8281 || (!(pVBInfo->VBInfo & DisableCRT2Display))) {
8282 xgifb_reg_and_or(pVBInfo->Part2Port, 0x00, ~0xE0,
8283 0x20); /* shampoo 0129 */
8284 if (pVBInfo->VBType & (VB_XGI302LV | VB_XGI301C)) {
8285 if (!XGI_DisableChISLCD(pVBInfo)) {
8286 if (XGI_EnableChISLCD(pVBInfo) ||
8288 (SetCRT2ToLCD | SetCRT2ToLCDA)))
8289 /* LVDS PLL power on */
8295 /* LVDS Driver power on */
8296 xgifb_reg_and(pVBInfo->Part4Port, 0x30, 0x7F);
8302 if (!(pVBInfo->VBInfo & DisableCRT2Display)) {
8305 if (!(pVBInfo->VBInfo & SetSimuScanMode)) {
8306 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
8307 if (pVBInfo->VBInfo &
8308 SetCRT2ToDualEdge) {
8309 tempah = tempah & 0x40;
8310 if (pVBInfo->VBInfo &
8312 tempah = tempah ^ 0xC0;
8314 if (pVBInfo->SetFlag &
8318 if (pVBInfo->SetFlag &
8322 if (pVBInfo->SetFlag &
8326 if (pVBInfo->SetFlag &
8334 /* EnablePart4_1F */
8335 xgifb_reg_or(pVBInfo->Part4Port, 0x1F, tempah);
8337 if (pVBInfo->SetFlag & Win9xDOSMode) {
8338 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8342 if (!(pVBInfo->SetFlag & DisableChA)) {
8343 XGI_VBLongWait(pVBInfo);
8344 if (!(pVBInfo->SetFlag & GatingCRT)) {
8345 XGI_DisableGatingCRT(HwDeviceExtension,
8347 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8348 XGI_VBLongWait(pVBInfo);
8353 if (pVBInfo->VBInfo & (SetCRT2ToTV | SetCRT2ToLCD
8356 xgifb_reg_or(pVBInfo->Part1Port, 0x1E, 0x20);
8358 tempah = (unsigned char) xgifb_reg_get(pVBInfo->Part1Port,
8360 if (!(tempah & 0x80))
8361 /* BVBDOENABLE = 1 */
8362 xgifb_reg_or(pVBInfo->Part1Port, 0x2E, 0x80);
8364 xgifb_reg_and(pVBInfo->Part1Port, 0x00, 0x7F);
8365 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8369 static void XGI_SetCRT1Group(struct xgi_hw_device_info *HwDeviceExtension,
8370 unsigned short ModeNo, unsigned short ModeIdIndex,
8371 struct vb_device_info *pVBInfo)
8373 unsigned short StandTableIndex, RefreshRateTableIndex, b3CC, temp;
8375 unsigned short XGINew_P3cc = pVBInfo->P3cc;
8377 /* XGINew_CRT1Mode = ModeNo; // SaveModeID */
8378 StandTableIndex = XGI_GetModePtr(ModeNo, ModeIdIndex, pVBInfo);
8379 /* XGI_SetBIOSData(ModeNo, ModeIdIndex); */
8380 /* XGI_ClearBankRegs(ModeNo, ModeIdIndex); */
8381 XGI_SetSeqRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
8382 XGI_SetMiscRegs(StandTableIndex, pVBInfo);
8383 XGI_SetCRTCRegs(HwDeviceExtension, StandTableIndex, pVBInfo);
8384 XGI_SetATTRegs(ModeNo, StandTableIndex, ModeIdIndex, pVBInfo);
8385 XGI_SetGRCRegs(StandTableIndex, pVBInfo);
8386 XGI_ClearExt1Regs(pVBInfo);
8388 /* if (pVBInfo->IF_DEF_ExpLink) */
8389 if (HwDeviceExtension->jChipType == XG27) {
8390 if (pVBInfo->IF_DEF_LVDS == 0)
8391 XGI_SetDefaultVCLK(pVBInfo);
8394 temp = ~ProgrammingCRT2;
8395 pVBInfo->SetFlag &= temp;
8396 pVBInfo->SelectCRT2Rate = 0;
8398 if (pVBInfo->VBType & (VB_XGI301B | VB_XGI302B | VB_XGI301LV
8399 | VB_XGI302LV | VB_XGI301C)) {
8400 if (pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToLCDA
8401 | SetInSlaveMode)) {
8402 pVBInfo->SetFlag |= ProgrammingCRT2;
8406 RefreshRateTableIndex = XGI_GetRatePtrCRT2(HwDeviceExtension, ModeNo,
8407 ModeIdIndex, pVBInfo);
8408 if (RefreshRateTableIndex != 0xFFFF) {
8409 XGI_SetSync(RefreshRateTableIndex, pVBInfo);
8410 XGI_SetCRT1CRTC(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8411 pVBInfo, HwDeviceExtension);
8412 XGI_SetCRT1DE(HwDeviceExtension, ModeNo, ModeIdIndex,
8413 RefreshRateTableIndex, pVBInfo);
8414 XGI_SetCRT1Offset(ModeNo, ModeIdIndex, RefreshRateTableIndex,
8415 HwDeviceExtension, pVBInfo);
8416 XGI_SetCRT1VCLK(ModeNo, ModeIdIndex, HwDeviceExtension,
8417 RefreshRateTableIndex, pVBInfo);
8420 if ((HwDeviceExtension->jChipType >= XG20) &&
8421 (HwDeviceExtension->jChipType < XG27)) { /* fix H/W DCLK/2 bug */
8422 if ((ModeNo == 0x00) | (ModeNo == 0x01)) {
8423 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x4E);
8424 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE9);
8425 b3CC = (unsigned char) inb(XGINew_P3cc);
8426 outb((b3CC |= 0x0C), XGINew_P3cc);
8427 } else if ((ModeNo == 0x04) | (ModeNo == 0x05) | (ModeNo
8429 xgifb_reg_set(pVBInfo->P3c4, 0x2B, 0x1B);
8430 xgifb_reg_set(pVBInfo->P3c4, 0x2C, 0xE3);
8431 b3CC = (unsigned char) inb(XGINew_P3cc);
8432 outb((b3CC |= 0x0C), XGINew_P3cc);
8436 if (HwDeviceExtension->jChipType >= XG21) {
8437 temp = xgifb_reg_get(pVBInfo->P3d4, 0x38);
8440 /* Enable write GPIOF */
8441 /* xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x20); */
8443 /* xgifb_reg_and(pVBInfo->P3d4, 0x48, ~0x20); */
8444 /* XG21 CRT1 Timing */
8445 if (HwDeviceExtension->jChipType == XG27)
8446 XGI_SetXG27CRTC(ModeNo, ModeIdIndex,
8447 RefreshRateTableIndex, pVBInfo);
8449 XGI_SetXG21CRTC(ModeNo, ModeIdIndex,
8450 RefreshRateTableIndex, pVBInfo);
8452 XGI_UpdateXG21CRTC(ModeNo, pVBInfo,
8453 RefreshRateTableIndex);
8455 if (HwDeviceExtension->jChipType == XG27)
8456 XGI_SetXG27LCD(pVBInfo, RefreshRateTableIndex,
8459 XGI_SetXG21LCD(pVBInfo, RefreshRateTableIndex,
8462 if (pVBInfo->IF_DEF_LVDS == 1) {
8463 if (HwDeviceExtension->jChipType == XG27)
8464 XGI_SetXG27LVDSPara(ModeNo,
8465 ModeIdIndex, pVBInfo);
8467 XGI_SetXG21LVDSPara(ModeNo,
8468 ModeIdIndex, pVBInfo);
8471 /* xgifb_reg_or(pVBInfo->P3d4, 0x48, 0x20); */
8475 pVBInfo->SetFlag &= (~ProgrammingCRT2);
8476 XGI_SetCRT1FIFO(ModeNo, HwDeviceExtension, pVBInfo);
8477 XGI_SetCRT1ModeRegs(HwDeviceExtension, ModeNo, ModeIdIndex,
8478 RefreshRateTableIndex, pVBInfo);
8480 /* XGI_LoadCharacter(); //dif ifdef TVFont */
8482 XGI_LoadDAC(ModeNo, ModeIdIndex, pVBInfo);
8483 /* XGI_ClearBuffer(HwDeviceExtension, ModeNo, pVBInfo); */
8486 unsigned char XGISetModeNew(struct xgi_hw_device_info *HwDeviceExtension,
8487 unsigned short ModeNo)
8489 unsigned short ModeIdIndex;
8490 /* unsigned char *pVBInfo->FBAddr =
8491 HwDeviceExtension->pjVideoMemoryAddress; */
8492 struct vb_device_info VBINF;
8493 struct vb_device_info *pVBInfo = &VBINF;
8494 pVBInfo->ROMAddr = HwDeviceExtension->pjVirtualRomBase;
8495 pVBInfo->BaseAddr = (unsigned long) HwDeviceExtension->pjIOAddress;
8496 pVBInfo->IF_DEF_LVDS = 0;
8497 pVBInfo->IF_DEF_LCDA = 1;
8498 pVBInfo->IF_DEF_CH7007 = 0; /* [Billy] 2007/05/14 */
8499 pVBInfo->IF_DEF_VideoCapture = 0;
8500 pVBInfo->IF_DEF_ScaleLCD = 0;
8501 pVBInfo->IF_DEF_OEMUtil = 0;
8502 pVBInfo->IF_DEF_PWD = 0;
8504 if (HwDeviceExtension->jChipType >= XG20) { /* kuku 2004/06/25 */
8505 pVBInfo->IF_DEF_YPbPr = 0;
8506 pVBInfo->IF_DEF_HiVision = 0;
8507 pVBInfo->IF_DEF_CRT2Monitor = 0;
8508 pVBInfo->VBType = 0; /*set VBType default 0*/
8510 pVBInfo->IF_DEF_YPbPr = 1;
8511 pVBInfo->IF_DEF_HiVision = 1;
8512 pVBInfo->IF_DEF_CRT2Monitor = 1;
8515 pVBInfo->P3c4 = pVBInfo->BaseAddr + 0x14;
8516 pVBInfo->P3d4 = pVBInfo->BaseAddr + 0x24;
8517 pVBInfo->P3c0 = pVBInfo->BaseAddr + 0x10;
8518 pVBInfo->P3ce = pVBInfo->BaseAddr + 0x1e;
8519 pVBInfo->P3c2 = pVBInfo->BaseAddr + 0x12;
8520 pVBInfo->P3cc = pVBInfo->BaseAddr + 0x1C;
8521 pVBInfo->P3ca = pVBInfo->BaseAddr + 0x1a;
8522 pVBInfo->P3c6 = pVBInfo->BaseAddr + 0x16;
8523 pVBInfo->P3c7 = pVBInfo->BaseAddr + 0x17;
8524 pVBInfo->P3c8 = pVBInfo->BaseAddr + 0x18;
8525 pVBInfo->P3c9 = pVBInfo->BaseAddr + 0x19;
8526 pVBInfo->P3da = pVBInfo->BaseAddr + 0x2A;
8527 pVBInfo->Part0Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_00;
8528 pVBInfo->Part1Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_04;
8529 pVBInfo->Part2Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_10;
8530 pVBInfo->Part3Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_12;
8531 pVBInfo->Part4Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14;
8532 pVBInfo->Part5Port = pVBInfo->BaseAddr + XGI_CRT2_PORT_14 + 2;
8534 /* for x86 Linux, XG21 LVDS */
8535 if (HwDeviceExtension->jChipType == XG21) {
8536 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0)
8537 pVBInfo->IF_DEF_LVDS = 1;
8539 if (HwDeviceExtension->jChipType == XG27) {
8540 if ((xgifb_reg_get(pVBInfo->P3d4, 0x38) & 0xE0) == 0xC0) {
8541 if (xgifb_reg_get(pVBInfo->P3d4, 0x30) & 0x20)
8542 pVBInfo->IF_DEF_LVDS = 1;
8546 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 */
8547 XGI_GetVBType(pVBInfo);
8549 InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo);
8550 if (ModeNo & 0x80) {
8551 ModeNo = ModeNo & 0x7F;
8552 /* XGINew_flag_clearbuffer = 0; */
8555 XGINew_flag_clearbuffer = 1;
8558 xgifb_reg_set(pVBInfo->P3c4, 0x05, 0x86);
8560 if (HwDeviceExtension->jChipType < XG20) /* kuku 2004/06/25 1.Openkey */
8561 XGI_UnLockCRT2(HwDeviceExtension, pVBInfo);
8563 XGI_SearchModeID(ModeNo, &ModeIdIndex, pVBInfo);
8565 XGI_GetVGAType(HwDeviceExtension, pVBInfo);
8567 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
8568 XGI_GetVBInfo(ModeNo, ModeIdIndex, HwDeviceExtension, pVBInfo);
8569 XGI_GetTVInfo(ModeNo, ModeIdIndex, pVBInfo);
8570 XGI_GetLCDInfo(ModeNo, ModeIdIndex, pVBInfo);
8571 XGI_DisableBridge(HwDeviceExtension, pVBInfo);
8573 if (pVBInfo->VBInfo & (SetSimuScanMode | SetCRT2ToLCDA)) {
8574 XGI_SetCRT1Group(HwDeviceExtension, ModeNo,
8575 ModeIdIndex, pVBInfo);
8577 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
8578 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
8579 HwDeviceExtension, pVBInfo);
8582 if (!(pVBInfo->VBInfo & SwitchToCRT2)) {
8583 XGI_SetCRT1Group(HwDeviceExtension, ModeNo,
8584 ModeIdIndex, pVBInfo);
8585 if (pVBInfo->VBInfo & SetCRT2ToLCDA) {
8586 XGI_SetLCDAGroup(ModeNo, ModeIdIndex,
8593 if (pVBInfo->VBInfo & (SetSimuScanMode | SwitchToCRT2)) {
8594 switch (HwDeviceExtension->ujVBChipID) {
8596 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
8597 pVBInfo); /*add for CRT2 */
8601 XGI_SetCRT2Group301(ModeNo, HwDeviceExtension,
8602 pVBInfo); /*add for CRT2 */
8610 XGI_SetCRT2ModeRegs(ModeNo, HwDeviceExtension, pVBInfo);
8611 XGI_OEM310Setting(ModeNo, ModeIdIndex, pVBInfo); /*0212*/
8612 XGI_CloseCRTC(HwDeviceExtension, pVBInfo);
8613 XGI_EnableBridge(HwDeviceExtension, pVBInfo);
8616 if (pVBInfo->IF_DEF_LVDS == 1)
8617 if (!XGI_XG21CheckLVDSMode(ModeNo,
8622 if (ModeNo <= 0x13) {
8623 pVBInfo->ModeType = pVBInfo->SModeIDTable[ModeIdIndex].
8624 St_ModeFlag & ModeInfoFlag;
8626 pVBInfo->ModeType = pVBInfo->EModeIDTable[ModeIdIndex].
8627 Ext_ModeFlag & ModeInfoFlag;
8630 pVBInfo->SetFlag = 0;
8631 if (pVBInfo->IF_DEF_CH7007 != 1)
8632 pVBInfo->VBInfo = DisableCRT2Display;
8634 XGI_DisplayOff(HwDeviceExtension, pVBInfo);
8636 XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex,
8639 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8641 if (HwDeviceExtension->jChipType == XG21)
8642 xgifb_reg_and_or(pVBInfo->P3c4, 0x09, ~0x80, 0x80);
8647 if (ModeNo <= 0x13) {
8648 modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
8650 modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
8652 pVBInfo->ModeType = modeflag&ModeInfoFlag;
8653 pVBInfo->SetFlag = 0x00;
8654 pVBInfo->VBInfo = DisableCRT2Display;
8655 temp = XGINew_CheckMemorySize(HwDeviceExtension,
8663 XGI_DisplayOff(HwDeviceExtension, pVBInfo) ;
8664 XGI_SetCRT1Group(HwDeviceExtension, ModeNo, ModeIdIndex, pVBInfo);
8665 XGI_DisplayOn(HwDeviceExtension, pVBInfo);
8668 XGI_UpdateModeInfo(HwDeviceExtension, pVBInfo);
8670 if (HwDeviceExtension->jChipType < XG20) { /* kuku 2004/06/25 */
8671 XGI_LockCRT2(HwDeviceExtension, pVBInfo);